This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
Re: [PATCH] Fix PR java/17265
- From: Bryce McKinlay <mckinlay at redhat dot com>
- To: Bryce McKinlay <mckinlay at redhat dot com>
- Cc: Eric Botcazou <ebotcazou at libertysurf dot fr>, gcc-patches at gcc dot gnu dot org, java-patches at gcc dot gnu dot org
- Date: Fri, 22 Oct 2004 14:37:22 -0400
- Subject: Re: [PATCH] Fix PR java/17265
- References: <200410221234.26719.ebotcazou@libertysurf.fr> <417952CB.7050807@redhat.com>
Bryce McKinlay wrote:
Eric Botcazou wrote:
Hi,
This patch reverts
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.
which breaks the GCJ compiler with non-GNU assemblers. The problem
is that it instructs the compiler to create local aliases of external
functions.
Eric,
Could you try this version of the patch and see if it fixes 17265 for
you? This one will not try to emit an alias for an external function
(which I agree is useless). Making an alias for a local function
however is not useless - we need this for accurate stack traces and
security checks, so I'd like to get this patch back in.
Bryce
The patch...
2004-10-22 Bryce McKinlay <mckinlay@redhat.com>
PR java/17265
* class.c: Reinstate 2004-08-18 patch.
(make_local_function_alias): Don't create an alias for extern (native)
functions.
Index: class.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/java/class.c,v
retrieving revision 1.212
diff -u -r1.212 class.c
--- class.c 22 Oct 2004 14:30:37 -0000 1.212
+++ class.c 22 Oct 2004 18:28:41 -0000
@@ -1198,6 +1198,53 @@
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)
+{
+#ifdef ASM_OUTPUT_DEF
+ tree alias;
+
+ const char *method_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (method));
+ char *name = alloca (strlen (method_name) + 2);
+ char *buf = alloca (strlen (method_name) + 128);
+
+ /* Only create aliases for local functions. */
+ if (DECL_EXTERNAL (method))
+ return method;
+
+ /* Prefix method_name with 'L' for the alias label. */
+ *name = 'L';
+ strcpy (name + 1, method_name);
+
+ ASM_GENERATE_INTERNAL_LABEL (buf, 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;
+#else
+ return method;
+#endif
+}
+
/** Make reflection data (_Jv_Field) for field FDECL. */
static tree
@@ -1269,7 +1316,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) ?