This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Re: Java: Local function pointer aliases for method metadata
- From: Bryce McKinlay <mckinlay at redhat dot com>
- To: Richard Henderson <rth at redhat dot com>
- Cc: java-patches at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Wed, 18 Aug 2004 11:31:19 -0400
- Subject: Re: Java: Local function pointer aliases for method metadata
- References: <4122B238.30508@redhat.com> <20040818084812.GB25345@redhat.com>
Richard Henderson wrote:
On Tue, Aug 17, 2004 at 09:34:48PM -0400, Bryce McKinlay wrote:
+ const char *alias_id = "LALIAS_";
+ int name_len;
+
+ /* Make the alias name by prepending alias_id. */
+ name_len = IDENTIFIER_LENGTH (DECL_ASSEMBLER_NAME (method));
+ ptr = buf = alloca (strlen (alias_id) + name_len + 1);
+ strcpy (ptr, alias_id);
+ ptr += strlen (alias_id);
+ strcpy (ptr, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method)));
+ ptr += name_len;
+ *ptr = '\0';
You want to use ASM_GENERATE_INTERNAL_LABEL so that the symbol
is of a form that is interpreted by the assembler as a temporary.
This way the symbol isn't retained in the .o file, or copied to
the executable.
This isn't actively wrong, but you can save a bit o space.
Thanks - is it ok to use the target method's full asm name for the
"prefix" argument to ASM_GENERATE_INTERNAL_LABEL, or should this really
be a short prefix? Using the full name makes reading/debugging the asm a
little easier.
Bryce
2004-08-18 Bryce McKinlay <mckinlay@redhat.com>
* class.c (make_local_function_alias): New function. Create local
alias for public method DECL.
(make_method_value): Use make_local_function_alias.
* parse.y (craft_constructor): Don't special-case anonymous classes.
Always set ctor_name to init_identifier_node.
(lookup_method_invoke): Call layout_class_method when creating
anonymous class constructor.
Index: class.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/class.c,v
retrieving revision 1.202
diff -u -r1.202 class.c
--- class.c 15 Aug 2004 15:45:29 -0000 1.202
+++ class.c 18 Aug 2004 15:27:50 -0000
@@ -1198,6 +1198,41 @@
abort ();
}
+static GTY (()) int alias_labelno = 0;
+
+/* Create a private alias for METHOD. Using this alias instead of the method
+decl ensures that ncode entries in the method table point to the real function
+at runtime, not a PLT entry. */
+
+static tree
+make_local_function_alias (tree method)
+{
+ tree alias;
+ const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
+ char *buf = alloca (strlen (method_name) + 128);
+
+ ASM_GENERATE_INTERNAL_LABEL (buf, method_name, alias_labelno++);
+ alias = build_decl (FUNCTION_DECL, get_identifier (buf),
+ TREE_TYPE (method));
+ DECL_CONTEXT (alias) = NULL;
+ TREE_READONLY (alias) = TREE_READONLY (method);
+ TREE_THIS_VOLATILE (alias) = TREE_THIS_VOLATILE (method);
+ TREE_PUBLIC (alias) = 0;
+ DECL_EXTERNAL (alias) = 0;
+ DECL_ARTIFICIAL (alias) = 1;
+ DECL_INLINE (alias) = 0;
+ DECL_INITIAL (alias) = error_mark_node;
+ TREE_ADDRESSABLE (alias) = 1;
+ TREE_USED (alias) = 1;
+ SET_DECL_ASSEMBLER_NAME (alias, DECL_NAME (alias));
+ TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (alias)) = 1;
+ if (!flag_syntax_only)
+ assemble_alias (alias, DECL_ASSEMBLER_NAME (method));
+ return alias;
+}
+
+/** Make reflection data (_Jv_Field) for field FDECL. */
+
static tree
make_field_value (tree fdecl)
{
@@ -1242,6 +1277,8 @@
return finit;
}
+/** Make reflection data (_Jv_Method) for method MDECL. */
+
static tree
make_method_value (tree mdecl)
{
@@ -1265,7 +1302,8 @@
code = null_pointer_node;
if (DECL_RTL_SET_P (mdecl))
- code = build1 (ADDR_EXPR, nativecode_ptr_type_node, mdecl);
+ code = build1 (ADDR_EXPR, nativecode_ptr_type_node,
+ make_local_function_alias (mdecl));
START_RECORD_CONSTRUCTOR (minit, method_type_node);
PUSH_FIELD_VALUE (minit, "name",
build_utf8_ref (DECL_CONSTRUCTOR_P (mdecl) ?
Index: parse.y
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/parse.y,v
retrieving revision 1.502
diff -u -r1.502 parse.y
--- parse.y 17 Aug 2004 12:51:01 -0000 1.502
+++ parse.y 18 Aug 2004 15:27:53 -0000
@@ -5422,13 +5422,7 @@
tree decl, ctor_name;
char buffer [80];
- /* The constructor name is <init> unless we're dealing with an
- anonymous class, in which case the name will be fixed after having
- be expanded. */
- if (ANONYMOUS_CLASS_P (class_type))
- ctor_name = DECL_NAME (class_decl);
- else
- ctor_name = init_identifier_node;
+ ctor_name = init_identifier_node;
/* If we're dealing with an inner class constructor, we hide the
this$<n> decl in the name field of its parameter declaration. */
@@ -10930,12 +10924,10 @@
if (lc && ANONYMOUS_CLASS_P (class))
{
- tree saved_current_class;
tree mdecl = craft_constructor (TYPE_NAME (class), atl);
- saved_current_class = current_class;
- current_class = class;
- fix_constructors (mdecl);
- current_class = saved_current_class;
+ /* The anonymous class may have already been laid out, so make sure
+ the new constructor is laid out here. */
+ layout_class_method (class, CLASSTYPE_SUPER (class), mdecl, NULL_TREE);
}
/* Find all candidates and then refine the list, searching for the