This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC 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]

[PATCH] Make java compiled resources public.


This patch makes java compiled resources public symbols.  This is needed
so that when statically linking to libgcj, the resource files in
libgcj.a can be linked by passing -u to the linker.  In 4.2 we could
statically link java.util.Currency, but in 4.3 this class now depends on
an compiled core:/ resource file.  Without this patch it is impossible
(or at least very awkward) to force the resource file to be linked.

There are two changes:  The first is to generate a name for the resource
that is a mangled version of the resource name.  Second, make the
resource names public.  This allows us to force the resource to be
linked by referring to the symbol from either the linker command line or
some other object that is being linked.

The mangling is as follows:

The resource name is broken into path components by '/' characters. Each
component then has an '_' prepended and all '.' -> "$_" and '$' ->
"$$".  The length of each component is then prepended to this and all
are concatenated together and preceeded by "_ZGr".  "Gr" being an unused
special-name designator that could be thought of as representing
GNU-resource.  For example:

"java/util/iso4217.properties" mangles as:
"_ZGr5_java5_util20_iso4217$_properties"

These symbols seem to pass through the demangler unaffected (GNU nm
2.17.50.0.6-5.fc6 20061020 from FC6).

If the patch is accepted, I will follow up with a demangler patch that
handles this new mangling.

Tested on x86_64-pc-linux-gnu with bootstrap and make check in libjava
with no FAILures.

OK to commit?

2007-12-20  David Daney  <ddaney@avtrex.com>

    * resource.c (Jr_count): Remove.
    (compile_resource_data): Call java_mangle_resource_name to generate
    decl name.  Make resource decl public.
    * mangle.c (append_resource_name_hunk): New function.
    (java_mangle_resource_name): Same.
    * java-tree.h (java_mangle_resource_name): Declare new function.

Index: resource.c
===================================================================
--- resource.c	(revision 131051)
+++ resource.c	(working copy)
@@ -51,14 +51,10 @@ The Free Software Foundation is independ
 /* A list of all the resources files.  */
 static GTY(()) tree resources = NULL;
 
-/* Count of all the resources compiled in this invocation.  */
-static int Jr_count = 0;
-
 void
 compile_resource_data (const char *name, const char *buffer, int length)
 {
   tree rtype, field = NULL_TREE, data_type, rinit, data, decl;
-  char buf[60];
 
   data_type = build_prim_array_type (unsigned_byte_type_node,
 				     strlen (name) + length);
@@ -79,11 +75,9 @@ compile_resource_data (const char *name,
   TREE_CONSTANT (rinit) = 1;
   TREE_INVARIANT (rinit) = 1;
 
-  /* Generate a unique-enough identifier.  */
-  sprintf (buf, "_Jr%d", ++Jr_count);
-
-  decl = build_decl (VAR_DECL, get_identifier (buf), rtype);
+  decl = build_decl (VAR_DECL, java_mangle_resource_name (name), rtype);
   TREE_STATIC (decl) = 1;
+  TREE_PUBLIC (decl) = 1;
   DECL_ARTIFICIAL (decl) = 1;
   DECL_IGNORED_P (decl) = 1;
   TREE_READONLY (decl) = 1;
Index: mangle.c
===================================================================
--- mangle.c	(revision 131051)
+++ mangle.c	(working copy)
@@ -796,6 +796,86 @@ compression_table_add (tree type)
   TREE_VEC_ELT (compression_table, compression_next++) = type;
 }
 
+/* Prepend '_' so leading digits are encoded properly.  Also replace
+   '.' with "$_" and '$' with "$$".  */
+
+static void
+append_resource_name_hunk(const unsigned char *hunk, int len)
+{
+  /* We need twice the length if all characters are escaped.  */
+  unsigned char *n = (unsigned char *)alloca (2 * len + 1);
+  unsigned char *d;
+  const unsigned char *w1;
+  const unsigned char *w2;
+  const unsigned char *limit;
+
+  d = n;
+
+  *d++ = '_';
+  memcpy (n + 1, hunk, len);
+
+  w1 = hunk;
+  limit = hunk + len;
+  while (w1 < limit)
+    {
+      int ch;
+      w2 = w1;
+      ch = UTF8_GET(w1, limit);
+      gcc_assert (ch > 0);
+      if (ch == '.')
+	{
+	  *d++ = '$';
+	  *d++ = '_';
+	}
+      else if (ch == '$')
+	{
+	  *d++ = '$';
+	  *d++ = '$';
+	}
+      else
+	{
+	  memcpy (d, w2, w1 - w2);
+	  d += w1 - w2;
+	}
+    }
+  append_gpp_mangled_name ((char *)n, d - n);
+}
+
+/** Mangle an embedded resource file name.  Each path component has an
+    '_' prepended and '.' replaced by '$' and is then encoded with
+    append_gpp_mangled_name.  */
+
+tree
+java_mangle_resource_name (const char *name)
+{
+  const unsigned char *ptr;
+  const unsigned char *start_of_hunk;
+  const unsigned char *end_of_hunk;
+  const unsigned char *limit = (const unsigned char *)name + strlen(name);
+
+  init_mangling ();
+  MANGLE_RAW_STRING ("Gr");
+
+  ptr = (const unsigned char *)name;
+
+  while (ptr < limit)
+    {
+      start_of_hunk = ptr;
+      end_of_hunk = ptr;
+      while (ptr < limit)
+	{
+	  int ch;
+	  ch = UTF8_GET(ptr, limit);
+	  if (ch == '/')
+	    break;
+	  end_of_hunk = ptr;
+	}
+      append_resource_name_hunk (start_of_hunk, end_of_hunk - start_of_hunk);
+    }
+
+  return finish_mangling ();
+}
+
 /* Mangling initialization routine.  */
 
 static void
Index: java-tree.h
===================================================================
--- java-tree.h	(revision 131051)
+++ java-tree.h	(working copy)
@@ -1205,6 +1205,7 @@ extern void java_check_methods (tree);
 extern void java_mangle_decl (tree);
 extern tree java_mangle_class_field (struct obstack *, tree);
 extern tree java_mangle_vtable (struct obstack *, tree);
+extern tree java_mangle_resource_name (const char *);
 extern void append_gpp_mangled_name (const char *, int);
 
 extern void add_predefined_file (tree);

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