diff mbox

Demangler patch committed: Fix constructor names with ABI tags

Message ID CAOyqgcUcZU1XYXttFV=jQc8GzZEKLzUYATAYpqjD4XG0c24neg@mail.gmail.com
State New
Headers show

Commit Message

Ian Lance Taylor Aug. 15, 2015, 1:23 p.m. UTC
The symbol _ZNSt8ios_base7failureB5cxx11C1EPKcRKSt10error_code, which
appears in libstdc++, was being demangled as

std::ios_base::failure[abi:cxx11]::cxx11(char const*, std::error_code const&)

That is clearly incorrect: std::ios_base::failure does not have a
method cxx11, and anyhow if you look closely at the mangled name you
will see that it is supposed to be a constructor.  This patch fixes
the demangler to generate the correct demangling, namely

std::ios_base::failure[abi:cxx11]::failure(char const*, std::error_code const&)

Bootstrapped and ran libiberty and libstdc++-v3 tests on
x86_64-unknown-linux-gnu.  Committed to mainline.

Ian

2015-08-15  Ian Lance Taylor  <iant@google.com>

* cp-demangle.c (d_abi_tags): Preserve di->last_name across any
ABI tags.

Comments

Paolo Carlini Aug. 15, 2015, 3:15 p.m. UTC | #1
Hi Ian,

On 08/15/2015 03:23 PM, Ian Lance Taylor wrote:
> The symbol _ZNSt8ios_base7failureB5cxx11C1EPKcRKSt10error_code, which
> appears in libstdc++, was being demangled as
>
> std::ios_base::failure[abi:cxx11]::cxx11(char const*, std::error_code const&)
>
> That is clearly incorrect: std::ios_base::failure does not have a
> method cxx11, and anyhow if you look closely at the mangled name you
> will see that it is supposed to be a constructor.  This patch fixes
> the demangler to generate the correct demangling, namely
>
> std::ios_base::failure[abi:cxx11]::failure(char const*, std::error_code const&)
>
> Bootstrapped and ran libiberty and libstdc++-v3 tests on
> x86_64-unknown-linux-gnu.  Committed to mainline.
At the moment I can't really further investigate myself (sorry about 
that) but I suspect this issue may be related to c++/63887. Can you 
double check?

Thanks,
Paolo.
diff mbox

Patch

Index: cp-demangle.c
===================================================================
--- cp-demangle.c	(revision 226846)
+++ cp-demangle.c	(working copy)
@@ -1306,7 +1306,12 @@  d_encoding (struct d_info *di, int top_l
 static struct demangle_component *
 d_abi_tags (struct d_info *di, struct demangle_component *dc)
 {
+  struct demangle_component *hold_last_name;
   char peek;
+
+  /* Preserve the last name, so the ABI tag doesn't clobber it.  */
+  hold_last_name = di->last_name;
+
   while (peek = d_peek_char (di),
 	 peek == 'B')
     {
@@ -1315,6 +1320,9 @@  d_abi_tags (struct d_info *di, struct de
       tag = d_source_name (di);
       dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
     }
+
+  di->last_name = hold_last_name;
+
   return dc;
 }
 
Index: testsuite/demangle-expected
===================================================================
--- testsuite/demangle-expected	(revision 226846)
+++ testsuite/demangle-expected	(working copy)
@@ -4389,3 +4389,9 @@  f(std::string[abi:foo], std::string[abi:
 --format=gnu-v3
 _Z18IndirectExternCallIPU7stdcallU7regparmILi3EEFviiEiEvT_T0_S3_
 void IndirectExternCall<void ( regparm<3> stdcall*)(int, int), int>(void ( regparm<3> stdcall*)(int, int), int, void ( regparm<3> stdcall*)(int, int))
+# 
+# ABI tags used to confuse the constructor name calculation.
+--format=gnu-v3 --no-params
+_ZNSt8ios_base7failureB5cxx11C1EPKcRKSt10error_code
+std::ios_base::failure[abi:cxx11]::failure(char const*, std::error_code const&)
+std::ios_base::failure[abi:cxx11]::failure