Patchwork Hookize TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA

login
register
mail settings
Submitter Anatoly Sokolov
Date Aug. 7, 2010, 8:57 a.m.
Message ID <653112981.20100807125752@post.ru>
Download mbox | patch
Permalink /patch/61172/
State New
Headers show

Comments

Anatoly Sokolov - Aug. 7, 2010, 8:57 a.m.
Hello.

  This patch turns TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA macro into a hook.

  The patch has been bootstrapped on and regression tested on
x86_64-unknown-linux-gnu for c and c++.

  This patch is pre-approved and should be committed within a week if no
objections.

        * target.def (output_addr_const_extra): New hook.
        * doc/tm.texi.in (TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA): Document.
        * doc/tm.texi: Regenerate.
        * targhooks.c (default_asm_output_addr_const_extra): New function.
        * targhooks.h (default_asm_output_addr_const_extra): Declare.
        * final.c: (output_addr_const): Change second argument to const_rtx.
        Use TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA  target hook.
        * output.h (output_addr_const): Update signature.
        * varasm.c (simplify_subtraction): Change argument to const_rtx.
        * rtl.h (simplify_subtraction): Update signature.

        * config/i386/i386.h (OUTPUT_ADDR_CONST_EXTRA): Remove.
        * config/i386/i386-protos.h (output_addr_const_extra): Remove.
        * config/i386/i386.h (output_addr_const_extra): Rename to...
        (i386_asm_output_addr_const_extra): ...this. Make static. Change
        second argument to const_rtx.
        (TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA): Define




 Anatoly.
Richard Henderson - Aug. 10, 2010, 3:35 p.m.
On 08/07/2010 01:57 AM, Anatoly Sokolov wrote:
>         * target.def (output_addr_const_extra): New hook.
>         * doc/tm.texi.in (TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA): Document.
>         * doc/tm.texi: Regenerate.

Ok, modulo since this is new documentation (OUTPUT_ADDR_CONST_EXTRA
was undocumented), the body of the documentation should be placed
in the target.def string.


r~

Patch

Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi     (revision 162975)
+++ gcc/doc/tm.texi     (working copy)
@@ -7410,6 +7410,18 @@ 
 when the relevant string is @code{NULL}.
 @end deftypefn
 
+@deftypefn {Target Hook} bool TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA (FILE *@var{file}, const_rtx @var{x})
+A target hook to recognize @var{rtx} patterns that @code{output_addr_const}
+can't deal with, and output assembly code to @var{file} corresponding to
+the pattern @var{x}.  This may be used to allow machine-dependent
+@code{UNSPEC}s to appear within constants.
+
+If target hook fails to recognize a pattern, it must return @code{false},
+so that a standard error message is printed.  If it prints an error message
+itself, by calling, for example, @code{output_operand_lossage}, it may just
+return @code{true}.
+@end deftypefn
+
 @defmac OUTPUT_ADDR_CONST_EXTRA (@var{stream}, @var{x}, @var{fail})
 A C statement to recognize @var{rtx} patterns that
 @code{output_addr_const} can't deal with, and output assembly code to
Index: gcc/doc/tm.texi.in
===================================================================
--- gcc/doc/tm.texi.in  (revision 162975)
+++ gcc/doc/tm.texi.in  (working copy)
@@ -7401,6 +7401,18 @@ 
 when the relevant string is @code{NULL}.
 @end deftypefn
 
+@hook TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
+A target hook to recognize @var{rtx} patterns that @code{output_addr_const}
+can't deal with, and output assembly code to @var{file} corresponding to
+the pattern @var{x}.  This may be used to allow machine-dependent
+@code{UNSPEC}s to appear within constants.
+
+If target hook fails to recognize a pattern, it must return @code{false},
+so that a standard error message is printed.  If it prints an error message
+itself, by calling, for example, @code{output_operand_lossage}, it may just
+return @code{true}.
+@end deftypefn
+
 @defmac OUTPUT_ADDR_CONST_EXTRA (@var{stream}, @var{x}, @var{fail})
 A C statement to recognize @var{rtx} patterns that
 @code{output_addr_const} can't deal with, and output assembly code to
Index: gcc/targhooks.c
===================================================================
--- gcc/targhooks.c     (revision 162975)
+++ gcc/targhooks.c     (working copy)
@@ -356,6 +356,21 @@ 
 #endif
 }
 
+/* The default implementation of TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA.  */
+
+bool
+default_asm_output_addr_const_extra (FILE *file ATTRIBUTE_UNUSED,
+                                    const_rtx x ATTRIBUTE_UNUSED)
+{
+#ifdef OUTPUT_ADDR_CONST_EXTRA
+  OUTPUT_ADDR_CONST_EXTRA (file, CONST_CAST_RTX (x), fail);
+  return true;
+
+fail:
+#endif
+  return false;
+}
+
 /* True if MODE is valid for the target.  By "valid", we mean able to
    be manipulated in non-trivial ways.  In particular, this means all
    the arithmetic is supported.
Index: gcc/targhooks.h
===================================================================
--- gcc/targhooks.h     (revision 162975)
+++ gcc/targhooks.h     (working copy)
@@ -65,6 +65,7 @@ 
 extern void default_print_operand (FILE *, rtx, int);
 extern void default_print_operand_address (FILE *, rtx);
 extern bool default_print_operand_punct_valid_p (unsigned char);
+extern bool default_asm_output_addr_const_extra (FILE *, const_rtx);
 
 extern bool default_scalar_mode_supported_p (enum machine_mode);
 extern bool default_decimal_float_supported_p (void);
Index: gcc/target.def
===================================================================
--- gcc/target.def      (revision 162975)
+++ gcc/target.def      (working copy)
@@ -415,6 +415,12 @@ 
  void ,(FILE *file, const char *name),
  default_asm_output_source_filename)
 
+DEFHOOK
+(output_addr_const_extra,
+ "",
+ bool, (FILE *file, const_rtx x),
+ default_asm_output_addr_const_extra)
+
 /* ??? The TARGET_PRINT_OPERAND* hooks are part of the asm_out struct,
    even though that is not reflected in the macro name to override their
    initializers.  */
Index: gcc/final.c
===================================================================
--- gcc/final.c	(revision 162975)
+++ gcc/final.c	(working copy)
@@ -3504,7 +3504,7 @@ 
    that may appear in these expressions.  */
 
 void
-output_addr_const (FILE *file, rtx x)
+output_addr_const (FILE *file, const_rtx x)
 {
   char buf[256];
 
@@ -3620,12 +3620,9 @@ 
       break;
 
     default:
-#ifdef OUTPUT_ADDR_CONST_EXTRA
-      OUTPUT_ADDR_CONST_EXTRA (file, x, fail);
-      break;
+      if (targetm.asm_out.output_addr_const_extra (file, x))
+       break;
 
-    fail:
-#endif
       output_operand_lossage ("invalid expression as operand");
     }
 }
Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c        (revision 162975)
+++ gcc/varasm.c        (working copy)
@@ -3358,8 +3358,8 @@ 
 /* Given a MINUS expression, simplify it if both sides
    include the same symbol.  */
 
-rtx
-simplify_subtraction (rtx x)
+const_rtx
+simplify_subtraction (const_rtx x)
 {
   rtx r = simplify_rtx (x);
   return r ? r : x;
Index: gcc/rtl.h
===================================================================
--- gcc/rtl.h   (revision 162975)
+++ gcc/rtl.h   (working copy)
@@ -1628,7 +1628,7 @@ 
 extern rtx get_pool_constant (rtx);
 extern rtx get_pool_constant_mark (rtx, bool *);
 extern enum machine_mode get_pool_mode (const_rtx);
-extern rtx simplify_subtraction (rtx);
+extern const_rtx simplify_subtraction (const_rtx);
 
 /* In function.c  */
 extern rtx assign_stack_local (enum machine_mode, HOST_WIDE_INT, int);
Index: gcc/output.h
===================================================================
--- gcc/output.h        (revision 162975)
+++ gcc/output.h        (working copy)
@@ -115,7 +115,7 @@ 
 /* Print an integer constant expression in assembler syntax.
    Addition and subtraction are the only arithmetic
    that may appear in these expressions.  */
-extern void output_addr_const (FILE *, rtx);
+extern void output_addr_const (FILE *, const_rtx);
 
 /* Output a string of assembler code, substituting numbers, strings
    and fixed syntactic prefixes.  */
Index: gcc/config/i386/i386.h
===================================================================
--- gcc/config/i386/i386.h      (revision 162975)
+++ gcc/config/i386/i386.h      (working copy)
@@ -2117,12 +2117,6 @@ 
        "call " CRT_MKSTR(__USER_LABEL_PREFIX__) #FUNC "\n"     \
        TEXT_SECTION_ASM_OP);
 
-#define OUTPUT_ADDR_CONST_EXTRA(FILE, X, FAIL)	\
-do {                                           \
-  if (! output_addr_const_extra (FILE, (X)))   \
-    goto FAIL;                                 \
-} while (0);
-
 /* Which processor to schedule for. The cpu attribute defines a list that
    mirrors this list, so changes to i386.md must be made at the same time.  */
 
Index: gcc/config/i386/i386-protos.h
===================================================================
--- gcc/config/i386/i386-protos.h       (revision 162975)
+++ gcc/config/i386/i386-protos.h       (working copy)
@@ -62,7 +62,6 @@ 
 
 extern void print_reg (rtx, int, FILE*);
 extern void ix86_print_operand (FILE *, rtx, int);
-extern bool output_addr_const_extra (FILE*, rtx);
 
 extern void split_di (rtx[], int, rtx[], rtx[]);
 extern void split_ti (rtx[], int, rtx[], rtx[]);
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c      (revision 162975)
+++ gcc/config/i386/i386.c      (working copy)
@@ -13125,8 +13125,10 @@ 
     }
 }
 
-bool
-output_addr_const_extra (FILE *file, rtx x)
+/* Implementation of TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA.  */
+
+static bool
+i386_asm_output_addr_const_extra (FILE *file, const_rtx x)
 {
   rtx op;
 
@@ -31540,6 +31542,8 @@ 
 #define TARGET_PRINT_OPERAND_ADDRESS ix86_print_operand_address
 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P ix86_print_operand_punct_valid_p
+#undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
+#define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA i386_asm_output_addr_const_extra 
 
 #undef TARGET_SCHED_ADJUST_COST
 #define TARGET_SCHED_ADJUST_COST ix86_adjust_cost