From a69d9775fc776874359e641fd90ad8f2f1dbe33e Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Wed, 22 Sep 2010 09:26:03 +0000 Subject: [PATCH] cplus-dem.c (ada_demangle): Add comments. 2010-09-22 Tristan Gingold * cplus-dem.c (ada_demangle): Add comments. Handle stream and controlled type operations. Decoding of some uppercase letters moved before separators. * testsuite/demangle-expected: Add tests. From-SVN: r164518 --- libiberty/ChangeLog | 33 ++---- libiberty/cplus-dem.c | 200 +++++++++++++++++++++++----------- libiberty/testsuite/demangle-expected | 30 +++++ 3 files changed, 174 insertions(+), 89 deletions(-) diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 7004f86..77f7fe3 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,10 @@ +2010-09-22 Tristan Gingold + + * cplus-dem.c (ada_demangle): Add comments. + Handle stream and controlled type operations. + Decoding of some uppercase letters moved before separators. + * testsuite/demangle-expected: Add tests. + 2010-09-10 James Lyon http://sourceware.org/bugzilla/show_bug.cgi?id=11572 @@ -5,32 +12,6 @@ DEMANGLE_COMPONENT_LAMBDA. * testsuite/demangle-expected: Add regression test. -diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c -index d2d15e9..39c8cc0 100644 ---- a/libiberty/cp-demangle.c -+++ b/libiberty/cp-demangle.c -@@ -3480,6 +3480,7 @@ d_find_pack (struct d_print_info *dpi, - case DEMANGLE_COMPONENT_PACK_EXPANSION: - return NULL; - -+ case DEMANGLE_COMPONENT_LAMBDA: - case DEMANGLE_COMPONENT_NAME: - case DEMANGLE_COMPONENT_OPERATOR: - case DEMANGLE_COMPONENT_BUILTIN_TYPE: -diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected -index 15a0fe7..0085564 100644 ---- a/libiberty/testsuite/demangle-expected -+++ b/libiberty/testsuite/demangle-expected -@@ -4052,3 +4052,8 @@ prot.lock.update - --format=gnu-v3 - DFA - DFA -+# -+# http://sourceware.org/bugzilla/show_bug.cgi?id=11572 -+--format=auto -+_ZN3Psi7VariantIIcPKcEE5visitIIRZN11VariantTest9TestVisit11test_methodEvEUlS2_E0_RZNS6_11test_methodEvEUlcE1_RZNS6_11test_methodEvEUlNS_4NoneEE_EEENS_13VariantDetail19SelectVisitorResultIIDpT_EE4typeEDpOSG_ -+Psi::VariantDetail::SelectVisitorResult::type Psi::Variant::visit((VariantTest::TestVisit::test_method()::{lambda(Psi::None)#1}&&&)...) - 2010-09-08 Tristan Gingold PR 44001 diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c index f20a5ef..0d812d5 100644 --- a/libiberty/cplus-dem.c +++ b/libiberty/cplus-dem.c @@ -895,18 +895,20 @@ ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) /* Most of the demangling will trivially remove chars. Operator names may add one char but because they are always preceeded by '__' which is - replaced by '.', they eventually never expand the size. '___elabs' and - '___elabb' add only 2 chars, but they occur only once. */ - len0 = strlen (mangled) + 2 + 1; + replaced by '.', they eventually never expand the size. + A few special names such as '___elabs' add a few chars (at most 7), but + they occur only once. */ + len0 = strlen (mangled) + 7 + 1; demangled = XNEWVEC (char, len0); d = demangled; p = mangled; while (1) { - /* Convert name, which is always lower-case. */ + /* An entity names is expected. */ if (ISLOWER (*p)) { + /* An identifier, which is always lower case. */ do *d++ = *p++; while (ISLOWER(*p) || ISDIGIT (*p) @@ -914,6 +916,7 @@ ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) } else if (p[0] == 'O') { + /* An operator name. */ static const char * const operators[][2] = {{"Oabs", "abs"}, {"Oand", "and"}, {"Omod", "mod"}, {"Onot", "not"}, {"Oor", "or"}, {"Orem", "rem"}, @@ -924,22 +927,22 @@ ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) {"Oexpon", "**"}, {NULL, NULL}}; int k; - for (k = 0; operators[k][0]; k++) + for (k = 0; operators[k][0] != NULL; k++) { - int l = strlen (operators[k][0]); - if (!strncmp (p, operators[k][0], l)) + size_t slen = strlen (operators[k][0]); + if (strncmp (p, operators[k][0], slen) == 0) { - p += l; - l = strlen (operators[k][1]); + p += slen; + slen = strlen (operators[k][1]); *d++ = '"'; - memcpy (d, operators[k][1], l); - d += l; + memcpy (d, operators[k][1], slen); + d += slen; *d++ = '"'; break; } } /* Operator not found. */ - if (!operators[k][0]) + if (operators[k][0] == NULL) goto unknown; } else @@ -948,6 +951,92 @@ ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) goto unknown; } + /* The name can be directly followed by some uppercase letters. */ + if (p[0] == 'T' && p[1] == 'K') + { + /* Task stuff. */ + if (p[2] == 'B' && p[3] == 0) + { + /* Subprogram for task body. */ + break; + } + else if (p[2] == '_' && p[3] == '_') + { + /* Inner declarations in a task. */ + p += 4; + *d++ = '.'; + continue; + } + else + goto unknown; + } + if (p[0] == 'E' && p[1] == 0) + { + /* Exception name. */ + goto unknown; + } + if ((p[0] == 'P' || p[0] == 'N') && p[1] == 0) + { + /* Protected type subprogram. */ + break; + } + if ((*p == 'N' || *p == 'S') && p[1] == 0) + { + /* Enumerated type name table. */ + goto unknown; + } + if (p[0] == 'X') + { + /* Body nested. */ + p++; + while (p[0] == 'n' || p[0] == 'b') + p++; + } + if (p[0] == 'S' && p[1] != 0 && (p[2] == '_' || p[2] == 0)) + { + /* Stream operations. */ + const char *name; + switch (p[1]) + { + case 'R': + name = "'Read"; + break; + case 'W': + name = "'Write"; + break; + case 'I': + name = "'Input"; + break; + case 'O': + name = "'Output"; + break; + default: + goto unknown; + } + p += 2; + strcpy (d, name); + d += strlen (name); + } + else if (p[0] == 'D') + { + /* Controlled type operation. */ + const char *name; + switch (p[1]) + { + case 'F': + name = ".Finalize"; + break; + case 'A': + name = ".Adjust"; + break; + default: + goto unknown; + } + strcpy (d, name); + d += strlen (name); + break; + } + if (p[0] == '_') { /* Separator. */ @@ -955,24 +1044,49 @@ ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) { /* Standard separator. Handled first. */ p += 2; + if (ISDIGIT (*p)) { - /* Overloading. */ + /* Overloading number. */ do p++; while (ISDIGIT (*p) || (p[0] == '_' && ISDIGIT (p[1]))); + if (*p == 'X') + { + p++; + while (p[0] == 'n' || p[0] == 'b') + p++; + } } - else if (*p == '_' && !strcmp (p + 1, "elabb")) - { - memcpy (d, "'Elab_Body", 10); - d += 10; - break; - } - else if (*p == '_' && !strcmp (p + 1, "elabs")) + else if (p[0] == '_' && p[1] != '_') { - memcpy (d, "'Elab_Spec", 10); - d += 10; - break; + /* Special names. */ + static const char * const special[][2] = { + { "_elabb", "'Elab_Body" }, + { "_elabs", "'Elab_Spec" }, + { "_size", "'Size" }, + { "_alignment", "'Alignment" }, + { "_assign", ".\":=\"" }, + { NULL, NULL } + }; + int k; + + for (k = 0; special[k][0] != NULL; k++) + { + size_t slen = strlen (special[k][0]); + if (strncmp (p, special[k][0], slen) == 0) + { + p += slen; + slen = strlen (special[k][1]); + memcpy (d, special[k][1], slen); + d += slen; + break; + } + } + if (special[k][0] != NULL) + break; + else + goto unknown; } else { @@ -995,46 +1109,6 @@ ada_demangle (const char *mangled, int option ATTRIBUTE_UNUSED) goto unknown; } - if (p[0] == 'T' && p[1] == 'K') - { - if (p[2] == 'B' && p[3] == 0) - { - /* Subprogram for task body. */ - break; - } - else if (p[2] == '_' && p[3] == '_') - { - /* Inner declarations in a task. */ - p += 4; - *d++ = '.'; - continue; - } - else - goto unknown; - } - if ((p[0] == 'P' || p[0] == 'N') && p[1] == 0) - { - /* Protected type subprogram. */ - break; - } - if (p[0] == 'E' && p[1] == 0) - { - /* Exception name. */ - goto unknown; - } - if (*p == 'N' || *p == 'S') - { - /* Enumerated type name table. */ - goto unknown; - } - if (p[0] == 'X') - { - /* Body nested. */ - if (p[1] == 'n' || p[1] == 'b') - p += 2; - else if (p[1] == 0) - p++; - } if (p[0] == '.' && ISDIGIT (p[1])) { /* Nested subprogram. */ diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index 0085564..0507ce8 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -4047,6 +4047,36 @@ prot.lock.update --format=gnat prot__lock__update_E6s prot.lock.update +# Controlled types +--format=gnat +gnat__sockets__sockets_library_controllerDF__2 +gnat.sockets.sockets_library_controller.Finalize +--format=gnat +system__partition_interface__racw_stub_typeDA +system.partition_interface.racw_stub_type.Adjust +# Stream operations +--format=gnat +gnat__wide_wide_string_split__slice_setSR__2 +gnat.wide_wide_string_split.slice_set'Read +--format=gnat +ada__real_time__timing_events__events__listSW__2Xnn +ada.real_time.timing_events.events.list'Write +--format=gnat +system__finalization_root__root_controlledSI +system.finalization_root.root_controlled'Input +--format=gnat +ada__finalization__limited_controlledSO__2 +ada.finalization.limited_controlled'Output +# Tagged types +--format=gnat +ada__synchronous_task_control___size__2 +ada.synchronous_task_control'Size +--format=gnat +ada__real_time__timing_events__events___alignment__2Xnn +ada.real_time.timing_events.events'Alignment +--format=gnat +system__finalization_root___assign__2 +system.finalization_root.":=" # # Used to crash the demangler. --format=gnu-v3 -- 2.7.4