From patchwork Tue May 31 16:09:42 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Fix PR debug/49130 Date: Tue, 31 May 2011 06:09:42 -0000 From: Dodji Seketeli X-Patchwork-Id: 98055 Message-Id: To: Jason Merrill Cc: Tom Tromey , GCC Patches Hello, In this PR an integer constant which type is a typedef based on an integer might be pretty-printed differently from the way the mangler would have represented it. As a result, the DW_AT_name representing the constant might be gratuitously be different from the linkage name. In the example accompanying the patch: The DW_AT_name of S is "S<2048u>", whereas the name of S.f (as demangled from the linkage name) is S<2048ul>::f(unsigned long), rightfully implying that the name of S should be "2048ul" instead of "2048u". The reason of this is that pp_c_integer_constant compares the type to pretty print with a set of integer constant types, using pointer comparison. When the type to pretty print is actually a typedef, that pointer comparison can fail even if the types are otherwise equivalent. Thus the patch considers the canonical type of the type to pretty-print, when it is present. Tested on x86_64-unknown-linux-gnu against trunk. gcc/c-family/ * c-pretty-print.c (pp_c_integer_constant): Consider the canonical type when using pointer comparison to compare types. gcc/testsuite/ * g++.dg/debug/dwarf2/integer-typedef.C: New test. --- gcc/c-family/c-pretty-print.c | 7 ++++- .../g++.dg/debug/dwarf2/integer-typedef.C | 28 ++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletions(-) create mode 100644 gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C diff --git a/gcc/c-family/c-pretty-print.c b/gcc/c-family/c-pretty-print.c index e418903..518b373 100644 --- a/gcc/c-family/c-pretty-print.c +++ b/gcc/c-family/c-pretty-print.c @@ -901,7 +901,12 @@ pp_c_string_literal (c_pretty_printer *pp, tree s) static void pp_c_integer_constant (c_pretty_printer *pp, tree i) { - tree type = TREE_TYPE (i); + /* We are going to compare the type of I to other types using + pointer comparison so we need to use its canonical type. */ + tree type = + TYPE_CANONICAL (TREE_TYPE (i)) + ? TYPE_CANONICAL (TREE_TYPE (i)) + : TREE_TYPE (i); if (TREE_INT_CST_HIGH (i) == 0) pp_wide_integer (pp, TREE_INT_CST_LOW (i)); diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C b/gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C new file mode 100644 index 0000000..42b3c99 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C @@ -0,0 +1,28 @@ +// Origin: PR debug/49130 +// { dg-options "-g -dA" } + +typedef long unsigned int size_t; +static const size_t foo = 2048; + +template +struct S +{ + void f(size_t); +}; + +template +inline void +S::f(size_t) +{ + size_t i = size; +} + +int +main() +{ + S s1; + s1.f(10); +} + +// { dg-final {scan-assembler-times "\[^\n\r\]*DW_AT_name: \"S<2048ul>\"" 1 } } +// { dg-final {scan-assembler-times "\[^\n\r\]*DW_AT_MIPS_linkage_name: \"_ZN1SILm2048EE1fEm\"" 1 } }