mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-27 01:28:46 +00:00
Demangler: Fix constructor names with ABI tags
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. 2015-08-15 Ian Lance Taylor <iant@google.com> * cp-demangle.c (d_abi_tags): Preserve di->last_name across any ABI tags.
This commit is contained in:
committed by
Pedro Alves
parent
fde0a3e549
commit
99eda040d8
@@ -1,3 +1,8 @@
|
||||
2015-11-28 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* cp-demangle.c (d_abi_tags): Preserve di->last_name across any
|
||||
ABI tags.
|
||||
|
||||
2015-11-28 Mikhail Maltsev <maltsevm@gmail.com>
|
||||
|
||||
* cp-demangle.c (d_dump): Fix syntax error.
|
||||
|
||||
@@ -1306,7 +1306,12 @@ d_encoding (struct d_info *di, int top_level)
|
||||
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 demangle_component *dc)
|
||||
tag = d_source_name (di);
|
||||
dc = d_make_comp (di, DEMANGLE_COMPONENT_TAGGED_NAME, dc, tag);
|
||||
}
|
||||
|
||||
di->last_name = hold_last_name;
|
||||
|
||||
return dc;
|
||||
}
|
||||
|
||||
|
||||
@@ -4389,3 +4389,9 @@ f(std::string[abi:foo], std::string[abi:foo])
|
||||
--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
|
||||
|
||||
Reference in New Issue
Block a user