/* Functions related to mangling class names for the GNU compiler
for the Java(TM) language.
- Copyright (C) 1998, 1999, 2001, 2002, 2003
+ Copyright (C) 1998, 1999, 2001, 2002, 2003, 2006, 2007, 2008
Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
+the Free Software Foundation; either version 3, or (at your option)
any later version.
GCC is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.
+along with GCC; see the file COPYING3. If not see
+<http://www.gnu.org/licenses/>.
Java and all Java-based marks are trademarks or registered trademarks
of Sun Microsystems, Inc. in the United States and other countries.
{
if (DECL_CLASS_FIELD_P (decl))
{
- mangle_class_field (DECL_CONTEXT (decl));
+ mangle_class_field (decl);
break;
}
else if (DECL_VTABLE_P (decl))
/* Beginning of the helper functions */
static void
-mangle_class_field (tree type)
+mangle_class_field (tree decl)
{
+ tree type = DECL_CONTEXT (decl);
mangle_record_type (type, /* for_pointer = */ 0);
- MANGLE_RAW_STRING ("6class$");
+ if (TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE)
+ MANGLE_RAW_STRING ("6class$");
+ else
+ MANGLE_RAW_STRING ("7class$$");
obstack_1grow (mangle_obstack, 'E');
}
if (TREE_CODE (TREE_TYPE (mdecl)) == METHOD_TYPE)
arglist = TREE_CHAIN (arglist);
+ /* Output literal 'J' and mangle the return type IF not a
+ constructor. */
+ if (!ID_INIT_P (method_name))
+ {
+ obstack_1grow (mangle_obstack, 'J');
+ mangle_type(TREE_TYPE(TREE_TYPE(mdecl)));
+ }
+
/* No arguments is easy. We shortcut it. */
if (arglist == end_params_node)
obstack_1grow (mangle_obstack, 'v');
{
append_gpp_mangled_name (IDENTIFIER_POINTER (name),
IDENTIFIER_LENGTH (name));
-
- /* If NAME happens to be a C++ keyword, add `$'. */
- if (cxx_keyword_p (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name)))
- obstack_1grow (mangle_obstack, '$');
}
/* Append the mangled name of TYPE onto OBSTACK. */
{
char code;
case BOOLEAN_TYPE: code = 'b'; goto primitive;
- case CHAR_TYPE: code = 'w'; goto primitive;
case VOID_TYPE: code = 'v'; goto primitive;
case INTEGER_TYPE:
+ if (type == char_type_node || type == promoted_char_type_node)
+ {
+ code = 'w';
+ goto primitive;
+ }
/* Get the original type instead of the arguments promoted type.
Avoid symbol name clashes. Should call a function to do that.
FIXME. */
break;
bad_type:
default:
- abort ();
+ gcc_unreachable ();
}
}
#define ADD_N() \
do { obstack_1grow (mangle_obstack, 'N'); nadded_p = 1; } while (0)
- if (TREE_CODE (type) != RECORD_TYPE)
- abort ();
+ gcc_assert (TREE_CODE (type) == RECORD_TYPE);
if (!TYPE_PACKAGE_LIST (type))
set_type_package_list (type);
/* This didn't work. We start by mangling the pointed-to type */
pointer_type = type;
type = TREE_TYPE (type);
- if (TREE_CODE (type) != RECORD_TYPE)
- abort ();
+ gcc_assert (TREE_CODE (type) == RECORD_TYPE);
obstack_1grow (mangle_obstack, 'P');
if (mangle_record_type (type, /* for_pointer = */ 1))
int match;
type = TREE_TYPE (p_type);
- if (!type)
- abort ();
+ gcc_assert (type);
elt_type = TYPE_ARRAY_ELEMENT (type);
{
int i;
const char *type_string = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type)));
- char *ptr;
+ const char *ptr;
int qualifications;
tree list = NULL_TREE, elt;
- for (ptr = (char *)type_string, qualifications = 0; *ptr; ptr++)
+ for (ptr = type_string, qualifications = 0; *ptr; ptr++)
if (*ptr == '.')
qualifications += 1;
- for (ptr = (char *)type_string, i = 0; i < qualifications; ptr++)
+ for (ptr = type_string, i = 0; i < qualifications; ptr++)
{
if (ptr [0] == '.')
{
- char c;
- tree identifier;
-
- /* Can't use an obstack, we're already using it to
- accumulate the mangling. */
- c = ptr [0];
- ptr [0] = '\0';
- identifier = get_identifier (type_string);
- ptr [0] = c;
+ tree const identifier
+ = get_identifier_with_length (type_string, ptr - type_string);
+
elt = build_tree_list (identifier, identifier);
TREE_CHAIN (elt) = list;
list = elt;
{
if (compression_next == TREE_VEC_LENGTH (compression_table))
{
- tree new = make_tree_vec (2*compression_next);
+ tree new_table = make_tree_vec (2*compression_next);
int i;
for (i = 0; i < compression_next; i++)
- TREE_VEC_ELT (new, i) = TREE_VEC_ELT (compression_table, i);
+ TREE_VEC_ELT (new_table, i) = TREE_VEC_ELT (compression_table, i);
- compression_table = new;
+ compression_table = new_table;
}
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