Patchwork RFA: Fix PR middle-end/46314

login
register
mail settings
Submitter Joern Rennecke
Date Nov. 5, 2010, 6:19 p.m.
Message ID <20101105141941.thrlgs15sk0sggw4-nzlynne@webmail.spamcop.net>
Download mbox | patch
Permalink /patch/70276/
State New
Headers show

Comments

Joern Rennecke - Nov. 5, 2010, 6:19 p.m.
This instroduces a new target hook as a wrapper around
ASM_GENERATE_INTERNAL_LABEL, and makes the C++ and java
front ends use it.

bootstrapped / regtested on i686-pc-linux-gnu.
2010-11-05  Joern Rennecke  <amylaar@spamcop.net>

	PR middle-end/46314
gcc:
	* target.def (generate_internal_label): New asm_out hook.
	* output.h (default_generate_internal_label): Declare.
	* varasm.c (default_generate_internal_label): Define.
gcc/cp:
	* method.c (make_alias_for_thunk):
	Use targetm.asm_out.generate_internal_label.
gcc/java:
	* class.c: Include target.h.
	(make_local_function_alias):
	Use targetm.asm_out.generate_internal_label.
	* expr.c (lookup_label, generate_name): Likewise.
Richard Guenther - Nov. 6, 2010, 2:31 p.m.
On Fri, Nov 5, 2010 at 7:19 PM, Joern Rennecke <amylaar@spamcop.net> wrote:
> This instroduces a new target hook as a wrapper around
> ASM_GENERATE_INTERNAL_LABEL, and makes the C++ and java
> front ends use it.
>
> bootstrapped / regtested on i686-pc-linux-gnu.

Ok.

Thanks,
Richard.

>
> 2010-11-05  Joern Rennecke  <amylaar@spamcop.net>
>
>        PR middle-end/46314
> gcc:
>        * target.def (generate_internal_label): New asm_out hook.
>        * output.h (default_generate_internal_label): Declare.
>        * varasm.c (default_generate_internal_label): Define.
> gcc/cp:
>        * method.c (make_alias_for_thunk):
>        Use targetm.asm_out.generate_internal_label.
> gcc/java:
>        * class.c: Include target.h.
>        (make_local_function_alias):
>        Use targetm.asm_out.generate_internal_label.
>        * expr.c (lookup_label, generate_name): Likewise.
>
> Index: target.def
> ===================================================================
> --- target.def  (revision 166360)
> +++ target.def  (working copy)
> @@ -200,6 +200,14 @@ DEFHOOKPOD
>  be called afterward.",
>  bool, true)
>
> +/* Generate an internal label.
> +   For now this is just a wrapper for ASM_GENERATE_INTERNAL_LABEL.  */
> +DEFHOOK_UNDOC
> +(generate_internal_label,
> + "",
> + void, (char *buf, const char *prefix, unsigned long labelno),
> + default_generate_internal_label)
> +
>  /* Output an internal label.  */
>  DEFHOOK
>  (internal_label,
> Index: output.h
> ===================================================================
> --- output.h    (revision 166360)
> +++ output.h    (working copy)
> @@ -627,6 +627,8 @@ extern void default_globalize_label (FIL
>  extern void default_globalize_decl_name (FILE *, tree);
>  extern void default_emit_unwind_label (FILE *, tree, int, int);
>  extern void default_emit_except_table_label (FILE *);
> +extern void default_generate_internal_label (char *, const char *,
> +                                            unsigned long);
>  extern void default_internal_label (FILE *, const char *, unsigned long);
>  extern void default_asm_declare_constant_name (FILE *, const char *,
>                                               const_tree, HOST_WIDE_INT);
> Index: varasm.c
> ===================================================================
> --- varasm.c    (revision 166360)
> +++ varasm.c    (working copy)
> @@ -6611,6 +6611,16 @@ default_emit_except_table_label (FILE *
>    the class of label and LABELNO is the number within the class.  */
>
>  void
> +default_generate_internal_label (char *buf, const char *prefix,
> +                                unsigned long labelno)
> +{
> +  ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
> +}
> +
> +/* This is how to output an internal numbered label where PREFIX is
> +   the class of label and LABELNO is the number within the class.  */
> +
> +void
>  default_internal_label (FILE *stream, const char *prefix,
>                        unsigned long labelno)
>  {
> Index: cp/method.c
> ===================================================================
> --- cp/method.c (revision 166360)
> +++ cp/method.c (working copy)
> @@ -252,7 +252,7 @@ make_alias_for_thunk (tree function)
>   tree alias;
>   char buf[256];
>
> -  ASM_GENERATE_INTERNAL_LABEL (buf, "LTHUNK", thunk_labelno);
> +  targetm.asm_out.generate_internal_label (buf, "LTHUNK", thunk_labelno);
>   thunk_labelno++;
>
>   alias = make_alias_for (function, get_identifier (buf));
> Index: java/class.c
> ===================================================================
> --- java/class.c        (revision 166360)
> +++ java/class.c        (working copy)
> @@ -43,6 +43,7 @@ The Free Software Foundation is independ
>  #include "tree-iterator.h"
>  #include "vecprim.h"
>  #include "tm.h"         /* FIXME: For gcc_obstack_init from defaults.h.  */
> +#include "target.h"
>
>  /* DOS brain-damage */
>  #ifndef O_BINARY
> @@ -1399,7 +1400,7 @@ make_local_function_alias (tree method)
>   *name = 'L';
>   strcpy (name + 1, method_name);
>
> -  ASM_GENERATE_INTERNAL_LABEL (buf, name, alias_labelno++);
> +  targetm.asm_out.generate_internal_label (buf, name, alias_labelno++);
>   alias = build_decl (input_location,
>                      FUNCTION_DECL, get_identifier (buf),
>                      TREE_TYPE (method));
> Index: java/expr.c
> ===================================================================
> --- java/expr.c (revision 166360)
> +++ java/expr.c (working copy)
> @@ -1763,7 +1763,8 @@ lookup_label (int pc)
>   char buf[32];
>   if (pc > highest_label_pc_this_method)
>     highest_label_pc_this_method = pc;
> -  ASM_GENERATE_INTERNAL_LABEL(buf, "LJpc=", start_label_pc_this_method +
> pc);
> +  targetm.asm_out.generate_internal_label (buf, "LJpc=",
> +                                          start_label_pc_this_method + pc);
>   name = get_identifier (buf);
>   if (IDENTIFIER_LOCAL_VALUE (name))
>     return IDENTIFIER_LOCAL_VALUE (name);
> @@ -1783,7 +1784,7 @@ generate_name (void)
>  {
>   static int l_number = 0;
>   char buff [32];
> -  ASM_GENERATE_INTERNAL_LABEL(buff, "LJv", l_number);
> +  targetm.asm_out.generate_internal_label (buff, "LJv", l_number);
>   l_number++;
>   return get_identifier (buff);
>  }
>
>

Patch

Index: target.def
===================================================================
--- target.def	(revision 166360)
+++ target.def	(working copy)
@@ -200,6 +200,14 @@  DEFHOOKPOD
  be called afterward.",
  bool, true)
 
+/* Generate an internal label.
+   For now this is just a wrapper for ASM_GENERATE_INTERNAL_LABEL.  */
+DEFHOOK_UNDOC
+(generate_internal_label,
+ "",
+ void, (char *buf, const char *prefix, unsigned long labelno),
+ default_generate_internal_label)
+
 /* Output an internal label.  */
 DEFHOOK
 (internal_label,
Index: output.h
===================================================================
--- output.h	(revision 166360)
+++ output.h	(working copy)
@@ -627,6 +627,8 @@  extern void default_globalize_label (FIL
 extern void default_globalize_decl_name (FILE *, tree);
 extern void default_emit_unwind_label (FILE *, tree, int, int);
 extern void default_emit_except_table_label (FILE *);
+extern void default_generate_internal_label (char *, const char *,
+					     unsigned long);
 extern void default_internal_label (FILE *, const char *, unsigned long);
 extern void default_asm_declare_constant_name (FILE *, const char *,
 					       const_tree, HOST_WIDE_INT);
Index: varasm.c
===================================================================
--- varasm.c	(revision 166360)
+++ varasm.c	(working copy)
@@ -6611,6 +6611,16 @@  default_emit_except_table_label (FILE * 
    the class of label and LABELNO is the number within the class.  */
 
 void
+default_generate_internal_label (char *buf, const char *prefix,
+				 unsigned long labelno)
+{
+  ASM_GENERATE_INTERNAL_LABEL (buf, prefix, labelno);
+}
+
+/* This is how to output an internal numbered label where PREFIX is
+   the class of label and LABELNO is the number within the class.  */
+
+void
 default_internal_label (FILE *stream, const char *prefix,
 			unsigned long labelno)
 {
Index: cp/method.c
===================================================================
--- cp/method.c	(revision 166360)
+++ cp/method.c	(working copy)
@@ -252,7 +252,7 @@  make_alias_for_thunk (tree function)
   tree alias;
   char buf[256];
 
-  ASM_GENERATE_INTERNAL_LABEL (buf, "LTHUNK", thunk_labelno);
+  targetm.asm_out.generate_internal_label (buf, "LTHUNK", thunk_labelno);
   thunk_labelno++;
 
   alias = make_alias_for (function, get_identifier (buf));
Index: java/class.c
===================================================================
--- java/class.c	(revision 166360)
+++ java/class.c	(working copy)
@@ -43,6 +43,7 @@  The Free Software Foundation is independ
 #include "tree-iterator.h"
 #include "vecprim.h"
 #include "tm.h"         /* FIXME: For gcc_obstack_init from defaults.h.  */
+#include "target.h"
 
 /* DOS brain-damage */
 #ifndef O_BINARY
@@ -1399,7 +1400,7 @@  make_local_function_alias (tree method)
   *name = 'L';
   strcpy (name + 1, method_name);
 
-  ASM_GENERATE_INTERNAL_LABEL (buf, name, alias_labelno++);  
+  targetm.asm_out.generate_internal_label (buf, name, alias_labelno++);  
   alias = build_decl (input_location,
 		      FUNCTION_DECL, get_identifier (buf),
 		      TREE_TYPE (method));
Index: java/expr.c
===================================================================
--- java/expr.c	(revision 166360)
+++ java/expr.c	(working copy)
@@ -1763,7 +1763,8 @@  lookup_label (int pc)
   char buf[32];
   if (pc > highest_label_pc_this_method)
     highest_label_pc_this_method = pc;
-  ASM_GENERATE_INTERNAL_LABEL(buf, "LJpc=", start_label_pc_this_method + pc);
+  targetm.asm_out.generate_internal_label (buf, "LJpc=",
+					   start_label_pc_this_method + pc);
   name = get_identifier (buf);
   if (IDENTIFIER_LOCAL_VALUE (name))
     return IDENTIFIER_LOCAL_VALUE (name);
@@ -1783,7 +1784,7 @@  generate_name (void)
 {
   static int l_number = 0;
   char buff [32];
-  ASM_GENERATE_INTERNAL_LABEL(buff, "LJv", l_number);
+  targetm.asm_out.generate_internal_label (buff, "LJv", l_number);
   l_number++;
   return get_identifier (buff);
 }