summaryrefslogtreecommitdiff
path: root/libiberty
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2010-11-16 17:58:26 +0000
committerH.J. Lu <hjl.tools@gmail.com>2010-11-16 17:58:26 +0000
commit187ef33d1d9eeb5f5f1ba2c0477251d5ec4c2767 (patch)
treeef133ae71e590971e42da4f2c8349f564b0e01a2 /libiberty
parent8e903e74ea8b8a39cb8f99dd784a95619bdb0ae6 (diff)
downloadgdb-187ef33d1d9eeb5f5f1ba2c0477251d5ec4c2767.tar.gz
Properly demangle a global constructor symbol.
2010-11-16 H.J. Lu <hongjiu.lu@intel.com> 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.
Diffstat (limited to 'libiberty')
-rw-r--r--libiberty/ChangeLog9
-rw-r--r--libiberty/cp-demangle.c16
-rw-r--r--libiberty/testsuite/demangle-expected4
3 files changed, 26 insertions, 3 deletions
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 <hongjiu.lu@intel.com>
+
+ 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 <kai.tietz@onevision.com>
* 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
@@ -322,6 +322,9 @@ 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<std::basic_string<char, std::string_char_traits<char>, 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_