From 187ef33d1d9eeb5f5f1ba2c0477251d5ec4c2767 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 16 Nov 2010 17:58:26 +0000 Subject: Properly demangle a global constructor symbol. 2010-11-16 H.J. Lu PR other/42670 PR binutils/11137 * cp-demangle.c (d_make_demangle_mangled_name): New. (d_demangle_callback): Use it on DCT_GLOBAL_XTORS. * testsuite/demangle-expected: Updated. --- libiberty/ChangeLog | 9 +++++++++ libiberty/cp-demangle.c | 16 +++++++++++++++- libiberty/testsuite/demangle-expected | 4 ++-- 3 files changed, 26 insertions(+), 3 deletions(-) (limited to 'libiberty') diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 4bd5b209bf3..488fd2d094c 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,12 @@ +2010-11-16 H.J. Lu + + PR other/42670 + PR binutils/11137 + * cp-demangle.c (d_make_demangle_mangled_name): New. + (d_demangle_callback): Use it on DCT_GLOBAL_XTORS. + + * testsuite/demangle-expected: Updated. + 2010-11-14 Kai Tietz * simple-object-coff.c (simple_object_coff_read_strtab): Fix reading diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index 8b0b825099e..7e951cc7842 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -321,6 +321,9 @@ d_make_comp (struct d_info *, enum demangle_component_type, static struct demangle_component * d_make_name (struct d_info *, const char *, int); +static struct demangle_component * +d_make_demangle_mangled_name (struct d_info *, const char *); + static struct demangle_component * d_make_builtin_type (struct d_info *, const struct demangle_builtin_type_info *); @@ -869,6 +872,17 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, return p; } +/* Add a new demangle mangled name component. */ + +static struct demangle_component * +d_make_demangle_mangled_name (struct d_info *di, const char *s) +{ + if (d_peek_char (di) != '_' || d_peek_next_char (di) != 'Z') + return d_make_name (di, s, strlen (s)); + d_advance (di, 2); + return d_encoding (di, 0); +} + /* Add a new name component. */ static struct demangle_component * @@ -4823,7 +4837,7 @@ d_demangle_callback (const char *mangled, int options, (type == DCT_GLOBAL_CTORS ? DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS : DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS), - d_make_name (&di, d_str (&di), strlen (d_str (&di))), + d_make_demangle_mangled_name (&di, d_str (&di)), NULL); d_advance (&di, strlen (d_str (&di))); break; diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index 5b154455a01..5ce0377b13b 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -3610,8 +3610,8 @@ std::_Alloc_traits, libcw: # --format=gnu-v3 --no-params _GLOBAL__I__Z2fnv -global constructors keyed to _Z2fnv -global constructors keyed to _Z2fnv +global constructors keyed to fn() +global constructors keyed to fn() # --format=gnu-v3 --no-params _Z1rM1GFivEMS_KFivES_M1HFivES1_4whatIKS_E5what2IS8_ES3_ -- cgit v1.2.1