From 42bc3520017ef04b19bee9a6ae4fc35d55cd2537 Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Wed, 26 Nov 2014 10:10:27 +0000 Subject: 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 --- gcc/ChangeLog | 5 +++++ gcc/dwarf2out.c | 3 +++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/debug/dwarf2/noreturn-function.C | 16 ++++++++++++++++ .../gcc.dg/debug/dwarf2/noreturn-function-attribute.c | 11 +++++++++++ .../gcc.dg/debug/dwarf2/noreturn-function-keyword.c | 13 +++++++++++++ include/ChangeLog | 4 ++++ include/dwarf2.def | 2 ++ 8 files changed, 60 insertions(+) create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/noreturn-function.C create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/noreturn-function-attribute.c create mode 100644 gcc/testsuite/gcc.dg/debug/dwarf2/noreturn-function-keyword.c 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 + + * dwarf2out.c (gen_subprogram_die): Add DW_AT_noreturn when the + function decl has TREE_THIS_VOLATILE. + 2014-11-26 Richard Biener 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 + + * 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 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 + + * dwarf2.def (DW_AT_noreturn): New DWARF5 attribute. + 2014-11-14 Shinichiro Hamaji * 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. */ -- cgit v1.1