2008-01-23 David Daney <ddaney@avtrex.com>
authordaney <daney@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 Jan 2008 23:00:39 +0000 (23:00 +0000)
committerdaney <daney@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 Jan 2008 23:00:39 +0000 (23:00 +0000)
* class.c (hide)  Rename to...
(java_hide_decl) ... this throughout, and make public.
* resource.c (Jr_count): Remove.
(compile_resource_data): Call java_mangle_resource_name to generate
decl name.  Make resource decl public and hidden.
* mangle.c (java_mangle_resource_name): New function.
* java-tree.h (java_hide_decl, java_mangle_resource_name): Declare
functions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131767 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/java/ChangeLog
gcc/java/class.c
gcc/java/java-tree.h
gcc/java/mangle.c
gcc/java/resource.c

index 3d87017..d93dd3d 100644 (file)
@@ -1,3 +1,14 @@
+2008-01-23  David Daney  <ddaney@avtrex.com>
+
+       * class.c (hide)  Rename to...
+       (java_hide_decl) ... this throughout, and make public.
+       * resource.c (Jr_count): Remove.
+       (compile_resource_data): Call java_mangle_resource_name to generate
+       decl name.  Make resource decl public and hidden.
+       * mangle.c (java_mangle_resource_name): New function.
+       * java-tree.h (java_hide_decl, java_mangle_resource_name): Declare
+       functions.
+
 2008-01-04  Andrew Haley  <aph@redhat.com>
 
        PR java/17779
index 029d9ac..2aec3a5 100644 (file)
@@ -742,8 +742,8 @@ build_java_method_type (tree fntype, tree this_class, int access_flags)
   return fntype;
 }
 
-static void
-hide (tree decl ATTRIBUTE_UNUSED)
+void
+java_hide_decl (tree decl ATTRIBUTE_UNUSED)
 {
 #ifdef HAVE_GAS_HIDDEN
   DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
@@ -872,7 +872,7 @@ add_field (tree class, tree name, tree field_type, int flags)
       /* Hide everything that shouldn't be visible outside a DSO.  */
       if (flag_indirect_classes
          || (FIELD_PRIVATE (field)))
-       hide (field);
+       java_hide_decl (field);
       /* Considered external unless we are compiling it into this
         object file.  */
       DECL_EXTERNAL (field) = (is_compiled_class (class) != 2);
@@ -1031,7 +1031,7 @@ build_static_class_ref (tree type)
        {
          TREE_PUBLIC (decl) = 1;
          if (CLASS_PRIVATE (TYPE_NAME (type)))
-           hide (decl);
+           java_hide_decl (decl);
        }
       DECL_IGNORED_P (decl) = 1;
       DECL_ARTIFICIAL (decl) = 1;
@@ -1071,7 +1071,7 @@ build_classdollar_field (tree type)
       TREE_CONSTANT (decl) = 1;
       TREE_READONLY (decl) = 1;
       TREE_PUBLIC (decl) = 1;
-      hide (decl);
+      java_hide_decl (decl);
       DECL_IGNORED_P (decl) = 1;
       DECL_ARTIFICIAL (decl) = 1;
       MAYBE_CREATE_VAR_LANG_DECL_SPECIFIC (decl);
@@ -1760,7 +1760,7 @@ make_class_data (tree type)
       /* The only dispatch table exported from a DSO is the dispatch
         table for java.lang.Class.  */
       if (DECL_NAME (type_decl) != id_class)
-       hide (dtable_decl);
+       java_hide_decl (dtable_decl);
       if (! flag_indirect_classes)
        rest_of_decl_compilation (dtable_decl, 1, 0);
       /* Maybe we're compiling Class as the first class.  If so, set
@@ -2613,7 +2613,7 @@ layout_class_method (tree this_class, tree super_class,
       || (METHOD_PRIVATE (method_decl) && METHOD_STATIC (method_decl)
          && ! METHOD_NATIVE (method_decl)
          && ! special_method_p (method_decl)))
-    hide (method_decl);
+    java_hide_decl (method_decl);
 
   /* Considered external unless it is being compiled into this object
      file, or it was already flagged as external.  */
index 75ccdca..a19d400 100644 (file)
@@ -1026,6 +1026,7 @@ extern tree parse_signature (struct JCF *jcf, int sig_index);
 extern tree add_field (tree, tree, tree, int);
 extern tree add_method (tree, int, tree, tree);
 extern tree add_method_1 (tree, int, tree, tree);
+extern void java_hide_decl (tree);
 extern tree make_class (void);
 extern tree push_class (tree, tree);
 extern tree unmangle_classname (const char *name, int name_length);
@@ -1205,6 +1206,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 c7624d5..c92be1c 100644 (file)
@@ -796,6 +796,59 @@ compression_table_add (tree type)
   TREE_VEC_ELT (compression_table, compression_next++) = type;
 }
 
+/* Mangle an embedded resource file name.  "_ZGr" is the prefix.  A
+   '_' is prepended to the name so that names starting with a digit
+   can be demangled.  The length and then the resulting name itself
+   are appended while escaping '$', '.', and '/' to: "$$", "$_", and
+   "$S".  */
+
+tree
+java_mangle_resource_name (const char *name)
+{
+  int len = strlen (name);
+  char *buf = (char *) alloca (2 * len + 1);
+  char *pos;
+  const unsigned char *w1 = (const unsigned char *) name;
+  const unsigned char *w2;
+  const unsigned char *limit = w1 + len;
+
+  pos = buf;
+
+  init_mangling ();
+  MANGLE_RAW_STRING ("Gr");
+
+  *pos++ = '_';
+  while (w1 < limit)
+    {
+      int ch;
+      w2 = w1;
+      ch = UTF8_GET (w1, limit);
+      gcc_assert (ch > 0);
+      switch (ch)
+       {
+       case '$':
+         *pos++ = '$';
+         *pos++ = '$';
+         break;
+       case '.':
+         *pos++ = '$';
+         *pos++ = '_';
+         break;
+       case '/':
+         *pos++ = '$';
+         *pos++ = 'S';
+         break;
+       default:
+         memcpy (pos, w2, w1 - w2);
+         pos += w1 - w2;
+         break;
+       }
+    }
+  append_gpp_mangled_name (buf, pos - buf);
+
+  return finish_mangling ();
+}
+
 /* Mangling initialization routine.  */
 
 static void
index b5cbd2e..e0a403e 100644 (file)
@@ -51,14 +51,10 @@ The Free Software Foundation is independent of Sun Microsystems, Inc.  */
 /* 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,10 @@ compile_resource_data (const char *name, const char *buffer, int length)
   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;
+  java_hide_decl (decl);
   DECL_ARTIFICIAL (decl) = 1;
   DECL_IGNORED_P (decl) = 1;
   TREE_READONLY (decl) = 1;