dwarf2out.c (gen_subprogram_die): Add DW_AT_reference or DW_AT_rvalue_reference attri...
authorJakub Jelinek <jakub@redhat.com>
Mon, 24 Oct 2016 18:44:30 +0000 (20:44 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 24 Oct 2016 18:44:30 +0000 (20:44 +0200)
* dwarf2out.c (gen_subprogram_die): Add DW_AT_reference or
DW_AT_rvalue_reference attributes.

* cp-objcp-common.c (cp_decl_dwarf_attribute): Handle DW_AT_reference
and DW_AT_rvalue_reference.

* g++.dg/debug/dwarf2/ref-2.C: New test.

From-SVN: r241492

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/cp-objcp-common.c
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/debug/dwarf2/ref-2.C [new file with mode: 0644]

index 1f6712e6144aa674086f9a64c842c0f3a3beb5a5..88bace4ea16b5c7ece1a433f95dadf825e641c01 100644 (file)
@@ -1,3 +1,8 @@
+2016-10-24  Jakub Jelinek  <jakub@redhat.com>
+
+       * dwarf2out.c (gen_subprogram_die): Add DW_AT_reference or
+       DW_AT_rvalue_reference attributes.
+
 2016-10-24  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * doc/invoke.text (Wint-in-bool-context): Update documentation.
index 0c5da96c3d37fb0001685e2ddcf79c41701c6317..744eb5288a2949b7b4c2c9936e0bc207236c887b 100644 (file)
@@ -1,5 +1,8 @@
 2016-10-24  Jakub Jelinek  <jakub@redhat.com>
 
+       * cp-objcp-common.c (cp_decl_dwarf_attribute): Handle DW_AT_reference
+       and DW_AT_rvalue_reference.
+
        * cxx-pretty-print.c (pp_cxx_check_constraint): Use VAR_P (x)
        instead of TREE_CODE (x) == VAR_DECL.
        * constraint.cc (get_concept_definition): Likewise.
index 50ac07f07905858649edf8b39f92af8f08042416..070b64c5d826022fcb43c6e3146cd7ceb814d663 100644 (file)
@@ -173,6 +173,32 @@ cp_decl_dwarf_attribute (const_tree decl, int attr)
        return 1;
       break;
 
+    case DW_AT_reference:
+      if (TREE_CODE (decl) == FUNCTION_DECL
+         && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
+         && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl))
+         && !FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl)))
+       return 1;
+      if ((TREE_CODE (decl) == FUNCTION_TYPE
+          || TREE_CODE (decl) == METHOD_TYPE)
+         && FUNCTION_REF_QUALIFIED (decl)
+         && !FUNCTION_RVALUE_QUALIFIED (decl))
+       return 1;
+      break;
+
+    case DW_AT_rvalue_reference:
+      if (TREE_CODE (decl) == FUNCTION_DECL
+         && DECL_NONSTATIC_MEMBER_FUNCTION_P (decl)
+         && FUNCTION_REF_QUALIFIED (TREE_TYPE (decl))
+         && FUNCTION_RVALUE_QUALIFIED (TREE_TYPE (decl)))
+       return 1;
+      if ((TREE_CODE (decl) == FUNCTION_TYPE
+          || TREE_CODE (decl) == METHOD_TYPE)
+         && FUNCTION_REF_QUALIFIED (decl)
+         && FUNCTION_RVALUE_QUALIFIED (decl))
+       return 1;
+      break;
+
     default:
       break;
     }
index b059ed2a3ee32143675a6cf82e3ee3e2c76dd647..515ee6e4261e4a2b5e866cfd561e802d513c546b 100644 (file)
@@ -20662,6 +20662,21 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
              if (defaulted != -1)
                add_AT_unsigned (subr_die, DW_AT_defaulted, defaulted);
            }
+
+         /* If this is a C++11 non-static member function with & ref-qualifier
+            then generate a DW_AT_reference attribute.  */
+         if ((dwarf_version >= 5 || !dwarf_strict)
+             && lang_hooks.decls.decl_dwarf_attribute (decl,
+                                                       DW_AT_reference) == 1)
+           add_AT_flag (subr_die, DW_AT_reference, 1);
+
+         /* If this is a C++11 non-static member function with &&
+            ref-qualifier then generate a DW_AT_reference attribute.  */
+         if ((dwarf_version >= 5 || !dwarf_strict)
+             && lang_hooks.decls.decl_dwarf_attribute (decl,
+                                                       DW_AT_rvalue_reference)
+                == 1)
+           add_AT_flag (subr_die, DW_AT_rvalue_reference, 1);
        }
     }
   /* Tag abstract instances with DW_AT_inline.  */
index 5b83f4de12523e86ee8dc46690bd6509f93d79e2..dc5f13ee3918b7b3c392b779a6372a960c1b56b6 100644 (file)
@@ -1,3 +1,7 @@
+2016-10-24  Jakub Jelinek  <jakub@redhat.com>
+
+       * g++.dg/debug/dwarf2/ref-2.C: New test.
+
 2016-10-24  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * c-c++-common/Wint-in-bool-context-3.c: New test.
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/ref-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/ref-2.C
new file mode 100644 (file)
index 0000000..dd1f457
--- /dev/null
@@ -0,0 +1,20 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-g -gno-strict-dwarf -dA" }
+// { dg-final { scan-assembler-times " DW_AT_reference" 1 } }
+// { dg-final { scan-assembler-times " DW_AT_rvalue_reference" 1 } }
+
+struct S
+{
+  void foo ();
+  void bar () &;
+  void baz () &&;
+};
+
+void
+test ()
+{
+  S s;
+  s.foo ();
+  s.bar ();
+  S ().baz ();
+}