jvspec.c (jvgenmain_spec): Added `-fdollars-in-identifiers'.

* jvspec.c (jvgenmain_spec): Added `-fdollars-in-identifiers'.
	* jvgenmain.c (class_mangling_prefix): Removed.
	(class_mangling_suffix): New global.
	(main): Use it.
	* gjavah.c (cxx_keyword_subst): Mangle C++ keywords by appending
	`$'.
	(print_method_info): Handle overrides for static and final
	methods.
	(process_file): Generate declaration for class object field.
	* class.c (cxx_keywords): New array.
	(utf8_cmp): New function.
	(cxx_keyword_p): New function.
	(layout_class_method): Mangle C++ keywords by appending `$'.
	(mangle_field): New function.
	(mangle_class_field): Use mangle_field.  Mangle class name as
	`class$'.
	(mangle_static_field): Use mangle_field.

From-SVN: r36738
This commit is contained in:
Tom Tromey 2000-10-06 01:45:47 +00:00
parent d1a458c4ed
commit e0a0c416a0
5 changed files with 166 additions and 48 deletions

View File

@ -1,3 +1,23 @@
2000-10-05 Tom Tromey <tromey@cygnus.com>
* jvspec.c (jvgenmain_spec): Added `-fdollars-in-identifiers'.
* jvgenmain.c (class_mangling_prefix): Removed.
(class_mangling_suffix): New global.
(main): Use it.
* gjavah.c (cxx_keyword_subst): Mangle C++ keywords by appending
`$'.
(print_method_info): Handle overrides for static and final
methods.
(process_file): Generate declaration for class object field.
* class.c (cxx_keywords): New array.
(utf8_cmp): New function.
(cxx_keyword_p): New function.
(layout_class_method): Mangle C++ keywords by appending `$'.
(mangle_field): New function.
(mangle_class_field): Use mangle_field. Mangle class name as
`class$'.
(mangle_static_field): Use mangle_field.
Tue Oct 3 13:44:37 2000 Alexandre Petit-Bianco <apbianco@cygnus.com>
* decl.c (find_local_variable): Removed uncessary type check and
@ -127,6 +147,7 @@ Wed Sep 13 11:50:35 2000 Alexandre Petit-Bianco <apbianco@cygnus.com>
(argument_types_convertible): Likewise.
(patch_cast): Rename wfl_op parameter to avoid macro conflicts.
>>>>>>> 1.531
2000-09-14 Tom Tromey <tromey@cygnus.com>
* lex.h: Use HAVE_ICONV_H, not HAVE_ICONV.

View File

@ -52,6 +52,9 @@ static int assume_compiled PARAMS ((const char *));
static struct hash_entry *init_test_hash_newfunc PARAMS ((struct hash_entry *,
struct hash_table *,
hash_table_key));
static int utf8_cmp PARAMS ((const unsigned char *, int, const char *));
static int cxx_keyword_p PARAMS ((const char *, int));
static tree mangle_field PARAMS ((tree, tree));
static rtx registerClass_libfunc;
@ -1626,29 +1629,13 @@ append_gpp_mangled_type (obstack, type)
}
}
/* Build the mangled name of the `class' field. */
/* Build the mangled name of a field, given the class name and the
field name. */
static tree
mangle_class_field (class)
tree class;
mangle_field (class, name)
tree class, name;
{
tree name;
obstack_grow (&temporary_obstack, "_CL_", 4);
append_gpp_mangled_type (&temporary_obstack, class);
obstack_1grow (&temporary_obstack, '\0');
name = get_identifier (obstack_base (&temporary_obstack));
obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
return name;
}
/* Build the mangled (assembly-level) name of the static field FIELD. */
static tree
mangle_static_field (field)
tree field;
{
tree class = DECL_CONTEXT (field);
tree name = DECL_NAME (field);
int encoded_len;
#if ! defined (NO_DOLLAR_IN_LABEL) || ! defined (NO_DOT_IN_LABEL)
obstack_1grow (&temporary_obstack, '_');
@ -1683,12 +1670,39 @@ mangle_static_field (field)
IDENTIFIER_POINTER (name),
IDENTIFIER_LENGTH (name));
}
/* Mangle C++ keywords by appending a `$'. */
/* FIXME: NO_DOLLAR_IN_LABEL */
if (cxx_keyword_p (IDENTIFIER_POINTER (name), IDENTIFIER_LENGTH (name)))
obstack_grow (&temporary_obstack, "$", 1);
obstack_1grow (&temporary_obstack, '\0');
name = get_identifier (obstack_base (&temporary_obstack));
obstack_free (&temporary_obstack, obstack_base (&temporary_obstack));
return name;
}
/* Build the mangled name of the `class' field. */
static tree
mangle_class_field (class)
tree class;
{
/* We know that we can use `class$' to mangle the class object,
because `class' is a reserved word in Java and thus can't appear
as a field or method name. */
return mangle_field (class, get_identifier ("class$"));
}
/* Build the mangled (assembly-level) name of the static field FIELD. */
static tree
mangle_static_field (field)
tree field;
{
return mangle_field (DECL_CONTEXT (field), DECL_NAME (field));
}
/* Build a VAR_DECL for the dispatch table (vtable) for class TYPE. */
tree
@ -1880,7 +1894,7 @@ layout_class_methods (this_class)
}
else
dtable_count = integer_zero_node;
TYPE_METHODS (handle_type) = nreverse (TYPE_METHODS (handle_type));
for (method_decl = TYPE_METHODS (handle_type);
@ -1896,6 +1910,93 @@ layout_class_methods (this_class)
pop_obstacks ();
}
/* A sorted list of all C++ keywords. */
static const char *cxx_keywords[] =
{
"asm",
"auto",
"bool",
"const_cast",
"delete",
"dynamic_cast",
"enum",
"explicit",
"extern",
"friend",
"inline",
"mutable",
"namespace",
"overload",
"register",
"reinterpret_cast",
"signed",
"sizeof",
"static_cast",
"struct",
"template",
"typedef",
"typeid",
"typename",
"typenameopt",
"union",
"unsigned",
"using",
"virtual",
"volatile",
"wchar_t"
};
/* Return 0 if NAME is equal to STR, -1 if STR is "less" than NAME,
and 1 if STR is "greater" than NAME. */
static int
utf8_cmp (str, length, name)
const unsigned char *str;
int length;
const char *name;
{
const unsigned char *limit = str + length;
int i;
for (i = 0; name[i]; ++i)
{
int ch = UTF8_GET (str, limit);
if (ch != name[i])
return ch - name[i];
}
return str == limit ? 0 : 1;
}
/* Return true if NAME is a C++ keyword. */
static int
cxx_keyword_p (name, length)
const char *name;
int length;
{
int last = ARRAY_SIZE (cxx_keywords);
int first = 0;
int mid = (last + first) / 2;
int old = -1;
for (mid = (last + first) / 2;
mid != old;
old = mid, mid = (last + first) / 2)
{
int r = utf8_cmp (name, length, cxx_keywords[mid]);
if (r == 0)
return 1;
else if (r < 0)
last = mid;
else
first = mid;
}
return 0;
}
/* Lay METHOD_DECL out, returning a possibly new value of
DTABLE_COUNT. */
@ -1931,8 +2032,14 @@ layout_class_method (this_class, super_class, method_decl, dtable_count)
IDENTIFIER_POINTER (method_name),
IDENTIFIER_LENGTH (method_name));
}
/* Mangle C++ keywords by appending a `$'. */
/* FIXME: NO_DOLLAR_IN_LABEL */
if (cxx_keyword_p (IDENTIFIER_POINTER (method_name),
IDENTIFIER_LENGTH (method_name)))
obstack_grow (&temporary_obstack, "$", 1);
}
obstack_grow (&temporary_obstack, "__", 2);
if (ID_FINIT_P (method_name))
obstack_grow (&temporary_obstack, "finit", 5);

View File

@ -440,9 +440,9 @@ cxx_keyword_subst (str, length)
if (r == 0)
{
char *str = xmalloc (9 + strlen (cxx_keywords[mid]));
strcpy (str, "__dummy_");
strcat (str, cxx_keywords[mid]);
char *str = xmalloc (2 + strlen (cxx_keywords[mid]));
strcpy (str, cxx_keywords[mid]);
strcat (str, "$");
return str;
}
else if (r < 0)
@ -759,18 +759,6 @@ DEFUN(print_method_info, (stream, jcf, name_index, sig_index, flags, synth),
(not only for calls to this function for for other functions
after it in the vtbl). So we give it a dummy name instead. */
override = cxx_keyword_subst (str, length);
if (override)
{
/* If the method is static or final, we can safely skip it.
If we don't skip it then we'll have problems since the
mangling will be wrong. FIXME. */
if (METHOD_IS_FINAL (jcf->access_flags, flags)
|| (flags & ACC_STATIC))
{
free (override);
return;
}
}
}
if (! stubs && ! flag_jni)
@ -1844,9 +1832,9 @@ DEFUN(process_file, (jcf, out),
{
if (flag_jni)
{
fprintf (out, "\n#ifdef __cplusplus\n");
fprintf (out, "}\n");
fprintf (out, "#endif\n");
fprintf (out, "\n#ifdef __cplusplus\n");
fprintf (out, "}\n");
fprintf (out, "#endif\n");
}
else
{
@ -1860,8 +1848,11 @@ DEFUN(process_file, (jcf, out),
for (i = 0; i < add_count; ++i)
fprintf (out, " %s\n", add_specs[i]);
if (! stubs)
fputs ("};\n", out);
/* Generate an entry for the class object. */
generate_access (out, ACC_PUBLIC);
fprintf (out, "\n static ::java::lang::Class class$;\n");
fputs ("};\n", out);
if (append_count > 0)
fputc ('\n', out);

View File

@ -34,7 +34,7 @@ The Free Software Foundation is independent of Sun Microsystems, Inc. */
const char main_method_prefix[] = "main__";
const char main_method_suffix[] = "Pt6JArray1ZPQ34java4lang6String";
const char class_mangling_prefix[] = "_CL_";
const char class_mangling_suffix[] = ".class$";
struct obstack name_obstack;
@ -155,13 +155,12 @@ main (int argc, const char **argv)
}
fprintf (stream, " 0\n};\n\n");
fprintf (stream, "extern struct Class %s%s;\n",
class_mangling_prefix, mangled_classname);
fprintf (stream, "extern int class __attribute__ ((alias (\"_%s%s\")));\n",
mangled_classname, class_mangling_suffix);
fprintf (stream, "int main (int argc, const char **argv)\n");
fprintf (stream, "{\n");
fprintf (stream, " _Jv_Compiler_Properties = props;\n");
fprintf (stream, " JvRunMain (&%s%s, argc, argv);\n",
class_mangling_prefix, mangled_classname);
fprintf (stream, " JvRunMain (&class, argc, argv);\n");
fprintf (stream, "}\n");
if (stream != stdout && fclose (stream) != 0)
{

View File

@ -61,7 +61,7 @@ const char jvgenmain_spec[] =
%{<fuse-boehm-gc} %{<fhash-synchronization} %{<fjni}\
%{<fclasspath*} %{<fCLASSPATH*} %{<foutput-class-dir}\
%{<fuse-divide-subroutine} %{<fno-use-divide-subroutine}\
%{f*}\
%{f*} -fdollars-in-identifiers\
%{aux-info*}\
%{pg:%{fomit-frame-pointer:%e-pg and -fomit-frame-pointer are incompatible}}\
%{S:%W{o*}%{!o*:-o %b.s}}%{!S:-o %{|!pipe:%Umain.s}} |\n\