aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2014-11-26 10:10:27 +0000
committerMark Wielaard <mark@gcc.gnu.org>2014-11-26 10:10:27 +0000
commit42bc3520017ef04b19bee9a6ae4fc35d55cd2537 (patch)
tree0da2d62552111f8cf417b00f86b89e8a9353c9cb
parent7ec44c3d10c41dabcb64efc4b3225d5a1bb4d7f9 (diff)
downloadgcc-42bc3520017ef04b19bee9a6ae4fc35d55cd2537.zip
gcc-42bc3520017ef04b19bee9a6ae4fc35d55cd2537.tar.gz
gcc-42bc3520017ef04b19bee9a6ae4fc35d55cd2537.tar.bz2
DWARF add DW_AT_noreturn on noreturn function subprogram.
This implements the DWARFv5 noreturn proposal: http://dwarfstd.org/ShowIssue.php?issue=140331.1 TREE_THIS_VOLATILE on a FUNCTION_DECL node means the function does not return normally. This catches the traditional noreturn GNU attribute, the C11 _Noreturn keyword and the C++11 [[noreturn]] attribute. This relies on the DW_AT_noreturn constant defined in the DWARFv5 DRAFT: http://www.dwarfstd.org/doc/dwarf5.20141029.pdf gcc/ChangeLog * dwarf2out.c (gen_subprogram_die): Add DW_AT_noreturn when the function decl has TREE_THIS_VOLATILE. gcc/testsuite/ChangeLog * g++.dg/debug/dwarf2/noreturn-function.C: New test. * gcc.dg/debug/dwarf2/noreturn-function-attribute.c: Likewise. * gcc.dg/debug/dwarf2/noreturn-function-keyword.c: Likewise. include/ChangeLog * dwarf2.def (DW_AT_noreturn): New DWARF5 attribute. From-SVN: r218075
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/dwarf2out.c3
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/noreturn-function.C16
-rw-r--r--gcc/testsuite/gcc.dg/debug/dwarf2/noreturn-function-attribute.c11
-rw-r--r--gcc/testsuite/gcc.dg/debug/dwarf2/noreturn-function-keyword.c13
-rw-r--r--include/ChangeLog4
-rw-r--r--include/dwarf2.def2
8 files changed, 60 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 14fc5b9..e7845c7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-11-25 Mark Wielaard <mjw@redhat.com>
+
+ * dwarf2out.c (gen_subprogram_die): Add DW_AT_noreturn when the
+ function decl has TREE_THIS_VOLATILE.
+
2014-11-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/62238
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 3d50ac9..25307d2 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -18336,6 +18336,9 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
if (DECL_ARTIFICIAL (decl))
add_AT_flag (subr_die, DW_AT_artificial, 1);
+ if (TREE_THIS_VOLATILE (decl) && (dwarf_version >= 5 || !dwarf_strict))
+ add_AT_flag (subr_die, DW_AT_noreturn, 1);
+
add_accessibility_attribute (subr_die, decl);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index adc868f..429885c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2014-11-24 Mark Wielaard <mjw@redhat.com>
+
+ * g++.dg/debug/dwarf2/noreturn-function.C: New test.
+ * gcc.dg/debug/dwarf2/noreturn-function-attribute.c: Likewise.
+ * gcc.dg/debug/dwarf2/noreturn-function-keyword.c: Likewise.
+
2014-11-26 Richard Biener <rguenther@suse.de>
PR tree-optimization/62238
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/noreturn-function.C b/gcc/testsuite/g++.dg/debug/dwarf2/noreturn-function.C
new file mode 100644
index 0000000..73a0af4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/noreturn-function.C
@@ -0,0 +1,16 @@
+// { dg-do compile }
+// { dg-options "-O -std=c++11 -g -dA -gno-strict-dwarf" }
+// Expect DW_AT_noreturn once in .debug_info and once in .debug_abbrev
+// { dg-final { scan-assembler-times "DW_AT_noreturn" 2 } }
+
+class Foo
+{
+ int i;
+ void bar [[noreturn]] (int j);
+};
+
+void
+Foo::bar (int j)
+{
+ while (1) { ; }
+}
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/noreturn-function-attribute.c b/gcc/testsuite/gcc.dg/debug/dwarf2/noreturn-function-attribute.c
new file mode 100644
index 0000000..7c8924a
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/dwarf2/noreturn-function-attribute.c
@@ -0,0 +1,11 @@
+// { dg-do compile }
+// { dg-options "-O -std=c99 -g -dA -gno-strict-dwarf" }
+// Expect DW_AT_noreturn once in .debug_info and once in .debug_abbrev
+// { dg-final { scan-assembler-times "DW_AT_noreturn" 2 } }
+
+void __attribute__ ((noreturn))
+baz (void)
+{
+ while (1) { ; }
+}
+
diff --git a/gcc/testsuite/gcc.dg/debug/dwarf2/noreturn-function-keyword.c b/gcc/testsuite/gcc.dg/debug/dwarf2/noreturn-function-keyword.c
new file mode 100644
index 0000000..ced96d1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/debug/dwarf2/noreturn-function-keyword.c
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-O -std=c11 -g -dA -gno-strict-dwarf" }
+// Expect DW_AT_noreturn once in .debug_info and once in .debug_abbrev
+// { dg-final { scan-assembler-times "DW_AT_noreturn" 2 } }
+
+_Noreturn void exit (int);
+
+void exit (int i)
+{
+ while (i < 0 || i == 0 || i > 0)
+ ;
+}
+
diff --git a/include/ChangeLog b/include/ChangeLog
index ea7fba6..e73a9a8 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,7 @@
+2014-11-25 Mark Wielaard <mjw@redhat.com>
+
+ * dwarf2.def (DW_AT_noreturn): New DWARF5 attribute.
+
2014-11-14 Shinichiro Hamaji <shinichiro.hamaji@gmail.com>
* dwarf2.def (DW_AT_APPLE_optimized, DW_AT_APPLE_flags)
diff --git a/include/dwarf2.def b/include/dwarf2.def
index 8ca143c..8533a3e 100644
--- a/include/dwarf2.def
+++ b/include/dwarf2.def
@@ -308,6 +308,8 @@ DW_AT (DW_AT_data_bit_offset, 0x6b)
DW_AT (DW_AT_const_expr, 0x6c)
DW_AT (DW_AT_enum_class, 0x6d)
DW_AT (DW_AT_linkage_name, 0x6e)
+/* DWARF 5. */
+DW_AT (DW_AT_noreturn, 0x87)
DW_AT_DUP (DW_AT_lo_user, 0x2000) /* Implementation-defined range start. */
DW_AT_DUP (DW_AT_hi_user, 0x3fff) /* Implementation-defined range end. */