This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [Patch 1/2] Add demangling for java resource files to libiberty
- From: David Daney <ddaney at avtrex dot com>
- To: Ian Lance Taylor <iant at google dot com>
- Cc: gcc-patches <gcc-patches at gcc dot gnu dot org>, binutils at sourceware dot org, Java Patch List <java-patches at gcc dot gnu dot org>
- Date: Fri, 25 Jan 2008 14:09:28 -0800
- Subject: Re: [Patch 1/2] Add demangling for java resource files to libiberty
- References: <478C061B.1040003@avtrex.com> <m3fxwuhq8d.fsf@localhost.localdomain>
Ian Lance Taylor wrote:
> David Daney <ddaney@avtrex.com> writes:
>
>
>> 2008-01-14 David Daney <ddaney@avtrex.com>
>>
>> * 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-14 David Daney <ddaney@avtrex.com>
>>
>> * 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_part): Same.
>> (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.
>>
>
>
> This patch is OK. It is OK for gcc 4.3 if the other part of the patch
> (to libjava) is committed to gcc 4.3. Otherwise please wait until
> after the 4.3 release branch is made.
>
>
A slightly different mangling scheme was committed based on IRC discussions:
http://gcc.gnu.org/ml/java-patches/2008-q1/msg00026.html
This is the corresponding demangler patch.
Tested on x86_64-pc-linux-gnu.
OK to commit to 4.3? Or should it wait for the branch?
include/
2008-01-14 David Daney <ddaney@avtrex.com>
* 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-25 David Daney <ddaney@avtrex.com>
* 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.
Index: include/demangle.h
===================================================================
RCS file: /cvs/src/src/include/demangle.h,v
retrieving revision 1.25
diff -u -p -r1.25 demangle.h
--- include/demangle.h 31 Aug 2007 20:20:44 -0000 1.25
+++ include/demangle.h 25 Jan 2008 21:51:32 -0000
@@ -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
{
Index: libiberty/cp-demangle.c
===================================================================
RCS file: /cvs/src/src/libiberty/cp-demangle.c,v
retrieving revision 1.69
diff -u -p -r1.69 cp-demangle.c
--- libiberty/cp-demangle.c 31 Aug 2007 20:20:49 -0000 1.69
+++ libiberty/cp-demangle.c 25 Jan 2008 21:51:35 -0000
@@ -650,6 +650,15 @@ d_dump (struct demangle_component *dc, i
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 dem
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 dem
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;
+}
+
/* <special-name> ::= TV <type>
::= TT <type>
::= TI <type>
@@ -1514,6 +1621,7 @@ d_operator_name (struct d_info *di)
::= TJ <type>
::= GR <name>
::= GA <encoding>
+ ::= Gr <resource name>
*/
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;
Index: libiberty/testsuite/demangle-expected
===================================================================
RCS file: /cvs/src/src/libiberty/testsuite/demangle-expected,v
retrieving revision 1.37
diff -u -p -r1.37 demangle-expected
--- libiberty/testsuite/demangle-expected 6 May 2007 00:25:11 -0000 1.37
+++ libiberty/testsuite/demangle-expected 25 Jan 2008 21:51:38 -0000
@@ -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