This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch 1/2] Add demangling for java resource files to libiberty


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]