From e5df4fb1faba7689ee50e4b08c0dc9bbeb45bde2 Mon Sep 17 00:00:00 2001 From: David Daney Date: Sun, 27 Jan 2008 06:01:00 +0000 Subject: [PATCH] demangle.h (demangle_component_type): Add DEMANGLE_COMPONENT_JAVA_RESOURCE... include/ 2008-01-26 David Daney * demangle.h (demangle_component_type): Add DEMANGLE_COMPONENT_JAVA_RESOURCE, DEMANGLE_COMPONENT_COMPOUND_NAME, and DEMANGLE_COMPONENT_CHARACTER as new enum values. (demangle_component): Add struct s_character to union u. libiberty/ 2008-01-26 David Daney * cp-demangle.c (d_dump): Handle DEMANGLE_COMPONENT_JAVA_RESOURCE, DEMANGLE_COMPONENT_COMPOUND_NAME, and DEMANGLE_COMPONENT_CHARACTER cases. (d_make_comp): Handle DEMANGLE_COMPONENT_COMPOUND_NAME and DEMANGLE_COMPONENT_JAVA_RESOURCE cases. (d_make_character): New function. (d_java_resource): Same. (d_special_name): Handle "Gr" case. (d_print_comp): Handle DEMANGLE_COMPONENT_JAVA_RESOURCE, DEMANGLE_COMPONENT_COMPOUND_NAME, and DEMANGLE_COMPONENT_CHARACTER cases. * testsuite/demangle-expected: Add test for java resource name mangling. From-SVN: r131883 --- include/ChangeLog | 8 ++ include/demangle.h | 16 +++- libiberty/ChangeLog | 16 ++++ libiberty/cp-demangle.c | 125 ++++++++++++++++++++++++++ libiberty/testsuite/demangle-expected | 4 + 5 files changed, 168 insertions(+), 1 deletion(-) diff --git a/include/ChangeLog b/include/ChangeLog index 7ea34d2d9c1..de8c03285aa 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,11 @@ +2008-01-26 David Daney + + * demangle.h (demangle_component_type): Add + DEMANGLE_COMPONENT_JAVA_RESOURCE, + DEMANGLE_COMPONENT_COMPOUND_NAME, and + DEMANGLE_COMPONENT_CHARACTER as new enum values. + (demangle_component): Add struct s_character to union u. + 2007-11-07 Joseph Myers Daniel Jacobowitz diff --git a/include/demangle.h b/include/demangle.h index b55226d8590..78e022dffe8 100644 --- a/include/demangle.h +++ b/include/demangle.h @@ -362,7 +362,15 @@ enum demangle_component_type using 'n' instead of '-', we want a way to indicate a negative number which involves neither modifying the mangled string nor allocating a new copy of the literal in memory. */ - DEMANGLE_COMPONENT_LITERAL_NEG + DEMANGLE_COMPONENT_LITERAL_NEG, + /* A libgcj compiled resource. The left subtree is the name of the + resource. */ + DEMANGLE_COMPONENT_JAVA_RESOURCE, + /* A name formed by the concatenation of two parts. The left + subtree is the first part and the right subtree the second. */ + DEMANGLE_COMPONENT_COMPOUND_NAME, + /* A name formed by a single character. */ + DEMANGLE_COMPONENT_CHARACTER }; /* Types which are only used internally. */ @@ -448,6 +456,12 @@ struct demangle_component long number; } s_number; + /* For DEMANGLE_COMPONENT_CHARACTER. */ + struct + { + int character; + } s_character; + /* For other types. */ struct { diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 5b085c32a17..f533060f975 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,19 @@ +2008-01-26 David Daney + + * cp-demangle.c (d_dump): Handle DEMANGLE_COMPONENT_JAVA_RESOURCE, + DEMANGLE_COMPONENT_COMPOUND_NAME, and + DEMANGLE_COMPONENT_CHARACTER cases. + (d_make_comp): Handle DEMANGLE_COMPONENT_COMPOUND_NAME and + DEMANGLE_COMPONENT_JAVA_RESOURCE cases. + (d_make_character): New function. + (d_java_resource): Same. + (d_special_name): Handle "Gr" case. + (d_print_comp): Handle DEMANGLE_COMPONENT_JAVA_RESOURCE, + DEMANGLE_COMPONENT_COMPOUND_NAME, and + DEMANGLE_COMPONENT_CHARACTER cases. + * testsuite/demangle-expected: Add test for java resource name + mangling. + 2008-01-23 Thiago Jung Bauermann * cplus-dem.c (demangle_function_name): Changed to return value diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index 3fc6a2197a3..edcfedca7a5 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -650,6 +650,15 @@ d_dump (struct demangle_component *dc, int indent) case DEMANGLE_COMPONENT_LITERAL_NEG: printf ("negative literal\n"); break; + case DEMANGLE_COMPONENT_JAVA_RESOURCE: + printf ("java resource\n"); + break; + case DEMANGLE_COMPONENT_COMPOUND_NAME: + printf ("compound name\n"); + break; + case DEMANGLE_COMPONENT_CHARACTER: + printf ("character '%c'\n", dc->u.s_character.character); + return; } d_dump (d_left (dc), indent + 2); @@ -769,6 +778,7 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, case DEMANGLE_COMPONENT_TRINARY_ARG2: case DEMANGLE_COMPONENT_LITERAL: case DEMANGLE_COMPONENT_LITERAL_NEG: + case DEMANGLE_COMPONENT_COMPOUND_NAME: if (left == NULL || right == NULL) return NULL; break; @@ -795,6 +805,7 @@ d_make_comp (struct d_info *di, enum demangle_component_type type, case DEMANGLE_COMPONENT_ARGLIST: case DEMANGLE_COMPONENT_TEMPLATE_ARGLIST: case DEMANGLE_COMPONENT_CAST: + case DEMANGLE_COMPONENT_JAVA_RESOURCE: if (left == NULL) return NULL; break; @@ -1501,6 +1512,102 @@ d_operator_name (struct d_info *di) } } +static struct demangle_component * +d_make_character (struct d_info *di, int c) +{ + struct demangle_component *p; + p = d_make_empty (di); + if (p != NULL) + { + p->type = DEMANGLE_COMPONENT_CHARACTER; + p->u.s_character.character = c; + } + return p; +} + +static struct demangle_component * +d_java_resource (struct d_info *di) +{ + struct demangle_component *p = NULL; + struct demangle_component *next = NULL; + long len, i; + char c; + const char *str; + + len = d_number (di); + if (len <= 1) + return NULL; + + /* Eat the leading '_'. */ + if (d_next_char (di) != '_') + return NULL; + len--; + + str = d_str (di); + i = 0; + + while (len > 0) + { + c = str[i]; + if (!c) + return NULL; + + /* Each chunk is either a '$' escape... */ + if (c == '$') + { + i++; + switch (str[i++]) + { + case 'S': + c = '/'; + break; + case '_': + c = '.'; + break; + case '$': + c = '$'; + break; + default: + return NULL; + } + next = d_make_character (di, c); + d_advance (di, i); + str = d_str (di); + len -= i; + i = 0; + if (next == NULL) + return NULL; + } + /* ... or a sequence of characters. */ + else + { + while (i < len && str[i] && str[i] != '$') + i++; + + next = d_make_name (di, str, i); + d_advance (di, i); + str = d_str (di); + len -= i; + i = 0; + if (next == NULL) + return NULL; + } + + if (p == NULL) + p = next; + else + { + p = d_make_comp (di, DEMANGLE_COMPONENT_COMPOUND_NAME, p, next); + if (p == NULL) + return NULL; + } + } + + p = d_make_comp (di, DEMANGLE_COMPONENT_JAVA_RESOURCE, p, NULL); + + return p; +} + /* ::= TV ::= TT ::= TI @@ -1514,6 +1621,7 @@ d_operator_name (struct d_info *di) ::= TJ ::= GR ::= GA + ::= Gr */ static struct demangle_component * @@ -1605,6 +1713,9 @@ d_special_name (struct d_info *di) return d_make_comp (di, DEMANGLE_COMPONENT_HIDDEN_ALIAS, d_encoding (di, 0), NULL); + case 'r': + return d_java_resource (di); + default: return NULL; } @@ -3552,6 +3663,20 @@ d_print_comp (struct d_print_info *dpi, } return; + case DEMANGLE_COMPONENT_JAVA_RESOURCE: + d_append_string (dpi, "java resource "); + d_print_comp (dpi, d_left (dc)); + return; + + case DEMANGLE_COMPONENT_COMPOUND_NAME: + d_print_comp (dpi, d_left (dc)); + d_print_comp (dpi, d_right (dc)); + return; + + case DEMANGLE_COMPONENT_CHARACTER: + d_append_char (dpi, dc->u.s_character.character); + return; + default: d_print_error (dpi); return; diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index f1afc45c8c9..7f9bc61f7b4 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -3858,3 +3858,7 @@ foo()::var1 --format=gnu-v3 _ZZN7myspaceL3foo_1EvEN11localstruct1fEZNS_3fooEvE16otherlocalstruct myspace::foo()::localstruct::f(myspace::foo()::otherlocalstruct) +# Java resource name +--format=gnu-v3 +_ZGr32_java$Sutil$Siso4217$_properties +java resource java/util/iso4217.properties