From patchwork Sat Aug 7 08:57:52 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Hookize TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA From: Anatoly Sokolov X-Patchwork-Id: 61172 Message-Id: <653112981.20100807125752@post.ru> To: gcc-patches@gcc.gnu.org Date: Sat, 7 Aug 2010 12:57:52 +0400 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. 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