diff options
author | Kai Tietz <kai.tietz@onevision.com> | 2010-07-28 18:00:09 +0000 |
---|---|---|
committer | Kai Tietz <ktietz@gcc.gnu.org> | 2010-07-28 20:00:09 +0200 |
commit | 3c5273a96ba8dbf98c40bc6d9d0a1587b4cfedb2 (patch) | |
tree | e9456c08db3a11dbe46b002ed8ff55b4f9ebee25 /gcc | |
parent | c9d75a48c4ea63ab27ccdb40f993236289b243f2 (diff) | |
download | gcc-3c5273a96ba8dbf98c40bc6d9d0a1587b4cfedb2.zip gcc-3c5273a96ba8dbf98c40bc6d9d0a1587b4cfedb2.tar.gz gcc-3c5273a96ba8dbf98c40bc6d9d0a1587b4cfedb2.tar.bz2 |
i386.h (MCOUNT_NAME_BEFORE_PROLOGUE): New.
2010-07-28 Kai Tietz <kai.tietz@onevision.com>
* config/i386/i386.h (MCOUNT_NAME_BEFORE_PROLOGUE): New.
* config/i386/i386.c (ix86_profile_before_prologue): New.
(override_options): Add special handling for -mfentry.
(ix86_function_regparm): Likewise.
(ix86_function_sseregparm): Likewise.
(ix86_frame_pointer_required): Likewise.
(ix86_expand_prologue): Check for ms_hook_prologue.
(x86_function_profiler): Adjust mcount output.
(TARGET_PROFILE_BEFORE_PROLOGUE): Define hook.
* config/i386/i386.opt (mfentry): New.
* doc/invoke.texi (mfentry): Add documentation.
* doc/tm.texi: Regenerated..
* doc/tm.texi.in (TARGET_PROFILE_BEFORE_PROLOGUE): New.
* final.c (final_start_function): Replace macro
PROFILE_BEFORE_PROLOGUE by target hook.
* function.c (thread_prologue_and_epilogue_insns): Likewise.
* target.def (profile_before_prologue): New hook.
* targhooks.c (default_profile_before_prologue): New.
* targhooks.h (default_profile_before_prologue): New.
From-SVN: r162651
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 22 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 55 | ||||
-rw-r--r-- | gcc/config/i386/i386.h | 2 | ||||
-rw-r--r-- | gcc/config/i386/i386.opt | 4 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 10 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 7 | ||||
-rw-r--r-- | gcc/doc/tm.texi.in | 2 | ||||
-rw-r--r-- | gcc/final.c | 8 | ||||
-rw-r--r-- | gcc/function.c | 4 | ||||
-rw-r--r-- | gcc/target.def | 9 | ||||
-rw-r--r-- | gcc/targhooks.c | 10 | ||||
-rw-r--r-- | gcc/targhooks.h | 1 |
12 files changed, 115 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a4491cb..d5f931d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,25 @@ +2010-07-28 Kai Tietz <kai.tietz@onevision.com> + + * config/i386/i386.h (MCOUNT_NAME_BEFORE_PROLOGUE): New. + * config/i386/i386.c (ix86_profile_before_prologue): New. + (override_options): Add special handling for -mfentry. + (ix86_function_regparm): Likewise. + (ix86_function_sseregparm): Likewise. + (ix86_frame_pointer_required): Likewise. + (ix86_expand_prologue): Check for ms_hook_prologue. + (x86_function_profiler): Adjust mcount output. + (TARGET_PROFILE_BEFORE_PROLOGUE): Define hook. + * config/i386/i386.opt (mfentry): New. + * doc/invoke.texi (mfentry): Add documentation. + * doc/tm.texi: Regenerated.. + * doc/tm.texi.in (TARGET_PROFILE_BEFORE_PROLOGUE): New. + * final.c (final_start_function): Replace macro + PROFILE_BEFORE_PROLOGUE by target hook. + * function.c (thread_prologue_and_epilogue_insns): Likewise. + * target.def (profile_before_prologue): New hook. + * targhooks.c (default_profile_before_prologue): New. + * targhooks.h (default_profile_before_prologue): New. + 2010-07-28 Jakub Jelinek <jakub@redhat.com> PR debug/45105 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index bd0de27..ff6f4b8 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -2768,6 +2768,15 @@ software_prefetching_beneficial_p (void) } } +/* Return true, if profiling code should be emitted before + prologue. Otherwise it returns false. + Note: For x86 with "hotfix" it is sorried. */ +static bool +ix86_profile_before_prologue (void) +{ + return flag_fentry != 0; +} + /* Function that is callable from the debugger to print the current options. */ void @@ -3671,6 +3680,21 @@ override_options (bool main_args_p) target_flags |= MASK_CLD & ~target_flags_explicit; #endif + if (!TARGET_64BIT && flag_pic) + { + if (flag_fentry > 0) + sorry ("-mfentry isn't supported for 32-bit in combination with -fpic"); + flag_fentry = 0; + } + if (flag_fentry < 0) + { +#if defined(PROFILE_BEFORE_PROLOGUE) + flag_fentry = 1; +#else + flag_fentry = 0; +#endif + } + /* Save the initial options in case the user does function specific options */ if (main_args_p) target_option_default_node = target_option_current_node @@ -4832,7 +4856,7 @@ ix86_function_regparm (const_tree type, const_tree decl) if (decl && TREE_CODE (decl) == FUNCTION_DECL && optimize - && !profile_flag) + && !(profile_flag && !flag_fentry)) { /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified. */ struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE (decl)); @@ -4904,7 +4928,8 @@ ix86_function_sseregparm (const_tree type, const_tree decl, bool warn) /* For local functions, pass up to SSE_REGPARM_MAX SFmode (and DFmode for SSE2) arguments in SSE registers. */ - if (decl && TARGET_SSE_MATH && optimize && !profile_flag) + if (decl && TARGET_SSE_MATH && optimize + && !(profile_flag && !flag_fentry)) { /* FIXME: remove this CONST_CAST when cgraph.[ch] is constified. */ struct cgraph_local_info *i = cgraph_local_info (CONST_CAST_TREE(decl)); @@ -7874,7 +7899,7 @@ ix86_frame_pointer_required (void) || ix86_current_function_calls_tls_descriptor)) return true; - if (crtl->profile) + if (crtl->profile && !flag_fentry) return true; return false; @@ -8142,7 +8167,8 @@ gen_push (rtx arg) static unsigned int ix86_select_alt_pic_regnum (void) { - if (current_function_is_leaf && !crtl->profile + if (current_function_is_leaf + && !crtl->profile && !ix86_current_function_calls_tls_descriptor) { int i, drap; @@ -9190,6 +9216,11 @@ ix86_expand_prologue (void) { rtx push, mov; + /* Check if profiling is active and we shall use profiling before + prologue variant. If so sorry. */ + if (crtl->profile && flag_fentry != 0) + sorry ("ms_hook_prologue attribute isn't compatible with -mfentry for 32-bit"); + /* Make sure the function starts with 8b ff movl.s %edi,%edi (emited by ix86_asm_output_function_label) 55 push %ebp @@ -9479,7 +9510,7 @@ ix86_expand_prologue (void) when mcount needs it. Blockage to avoid call movement across mcount call is emitted in generic code after the NOTE_INSN_PROLOGUE_END note. */ - if (crtl->profile && pic_reg_used) + if (crtl->profile && !flag_fentry && pic_reg_used) emit_insn (gen_prologue_use (pic_offset_table_rtx)); if (crtl->drap_reg && !crtl->stack_realign_needed) @@ -27287,6 +27318,9 @@ x86_field_alignment (tree field, int computed) void x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED) { + const char *mcount_name = (flag_fentry ? MCOUNT_NAME_BEFORE_PROLOGUE + : MCOUNT_NAME); + if (TARGET_64BIT) { #ifndef NO_PROFILE_COUNTERS @@ -27294,9 +27328,9 @@ x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED) #endif if (DEFAULT_ABI == SYSV_ABI && flag_pic) - fputs ("\tcall\t*" MCOUNT_NAME "@GOTPCREL(%rip)\n", file); + fprintf (file, "\tcall\t*%s@GOTPCREL(%%rip)\n", mcount_name); else - fputs ("\tcall\t" MCOUNT_NAME "\n", file); + fprintf (file, "\tcall\t%s\n", mcount_name); } else if (flag_pic) { @@ -27304,7 +27338,7 @@ x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED) fprintf (file, "\tleal\t%sP%d@GOTOFF(%%ebx),%%" PROFILE_COUNT_REGISTER "\n", LPREFIX, labelno); #endif - fputs ("\tcall\t*" MCOUNT_NAME "@GOT(%ebx)\n", file); + fprintf (file, "\tcall\t*%s@GOT(%%ebx)\n", mcount_name); } else { @@ -27312,7 +27346,7 @@ x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED) fprintf (file, "\tmovl\t$%sP%d,%%" PROFILE_COUNT_REGISTER "\n", LPREFIX, labelno); #endif - fputs ("\tcall\t" MCOUNT_NAME "\n", file); + fprintf (file, "\tcall\t%s\n", mcount_name); } } @@ -31360,6 +31394,9 @@ ix86_enum_va_list (int idx, const char **pname, tree *ptree) #define TARGET_ASM_ALIGNED_DI_OP ASM_QUAD #endif +#undef TARGET_PROFILE_BEFORE_PROLOGUE +#define TARGET_PROFILE_BEFORE_PROLOGUE ix86_profile_before_prologue + #undef TARGET_ASM_UNALIGNED_HI_OP #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP #undef TARGET_ASM_UNALIGNED_SI_OP diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index e153920..fe093cf 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -1607,6 +1607,8 @@ typedef struct ix86_args { #define MCOUNT_NAME "_mcount" +#define MCOUNT_NAME_BEFORE_PROLOGUE "__fentry__" + #define PROFILE_COUNT_REGISTER "edx" /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function, diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt index f264c42..236082d 100644 --- a/gcc/config/i386/i386.opt +++ b/gcc/config/i386/i386.opt @@ -375,3 +375,7 @@ Support RDRND built-in functions and code generation mf16c Target Report Mask(ISA_F16C) Var(ix86_isa_flags) VarExists Save Support F16C built-in functions and code generation + +mfentry +Target Report Var(flag_fentry) Init(-1) +Emit profiling counter call at function entry before prologue. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 78f81e2..c9f7664 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -601,7 +601,7 @@ Objective-C and Objective-C++ Dialects}. -momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs @gol -mcmodel=@var{code-model} -mabi=@var{name} @gol -m32 -m64 -mlarge-data-threshold=@var{num} @gol --msse2avx} +-msse2avx -mfentry} @emph{IA-64 Options} @gccoptlist{-mbig-endian -mlittle-endian -mgnu-as -mgnu-ld -mno-pic @gol @@ -12492,6 +12492,14 @@ For systems that use GNU libc, the default is on. @opindex msse2avx Specify that the assembler should encode SSE instructions with VEX prefix. The option @option{-mavx} turns this on by default. + +@item -mfentry +@itemx -mno-fentry +@opindex mfentry +If profiling is active @option{-pg} put the profiling +counter call before prologue. +Note: On x86 architectures the attribute @code{ms_hook_prologue} +isn't possible at the moment for @option{-mfentry} and @option{-pg}. @end table These @samp{-m} switches are supported in addition to the above diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index e94fdf6..d59c55f 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -7076,6 +7076,13 @@ Contains the value true if the target places read-only ``small data'' into a separate section. The default value is false. @end deftypevr +@deftypefn {Target Hook} bool TARGET_PROFILE_BEFORE_PROLOGUE (void) +It returns true if target wants profile code emitted before prologue. + +The default version of this hook use the target macro +@code{PROFILE_BEFORE_PROLOGUE}. +@end deftypefn + @deftypefn {Target Hook} bool TARGET_BINDS_LOCAL_P (const_tree @var{exp}) Returns true if @var{exp} names an object for which name resolution rules must resolve to the current ``module'' (dynamic shared library diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index caa0115..1b00ebc 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -7076,6 +7076,8 @@ Contains the value true if the target places read-only ``small data'' into a separate section. The default value is false. @end deftypevr +@hook TARGET_PROFILE_BEFORE_PROLOGUE + @hook TARGET_BINDS_LOCAL_P Returns true if @var{exp} names an object for which name resolution rules must resolve to the current ``module'' (dynamic shared library diff --git a/gcc/final.c b/gcc/final.c index fd597ac..c35ed7b 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -1546,10 +1546,8 @@ final_start_function (rtx first ATTRIBUTE_UNUSED, FILE *file, /* The Sun386i and perhaps other machines don't work right if the profiling code comes after the prologue. */ -#ifdef PROFILE_BEFORE_PROLOGUE - if (crtl->profile) + if (targetm.profile_before_prologue () && crtl->profile) profile_function (file); -#endif /* PROFILE_BEFORE_PROLOGUE */ #if defined (DWARF2_UNWIND_INFO) && defined (HAVE_prologue) if (dwarf2out_do_frame ()) @@ -1591,10 +1589,8 @@ final_start_function (rtx first ATTRIBUTE_UNUSED, FILE *file, static void profile_after_prologue (FILE *file ATTRIBUTE_UNUSED) { -#ifndef PROFILE_BEFORE_PROLOGUE - if (crtl->profile) + if (!targetm.profile_before_prologue () && crtl->profile) profile_function (file); -#endif /* not PROFILE_BEFORE_PROLOGUE */ } static void diff --git a/gcc/function.c b/gcc/function.c index 5a308f4..e89a5c9 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -5183,13 +5183,11 @@ thread_prologue_and_epilogue_insns (void) record_insns (seq, NULL, &prologue_insn_hash); emit_note (NOTE_INSN_PROLOGUE_END); -#ifndef PROFILE_BEFORE_PROLOGUE /* Ensure that instructions are not moved into the prologue when profiling is on. The call to the profiling routine can be emitted within the live range of a call-clobbered register. */ - if (crtl->profile) + if (!targetm.profile_before_prologue () && crtl->profile) emit_insn (gen_blockage ()); -#endif seq = get_insns (); end_sequence (); diff --git a/gcc/target.def b/gcc/target.def index 01ab478..10013e6 100644 --- a/gcc/target.def +++ b/gcc/target.def @@ -1229,6 +1229,15 @@ DEFHOOK bool, (const_tree exp), default_binds_local_p) +/* Check if profiling code is before or after prologue. */ +DEFHOOK +(profile_before_prologue, + "It returns true if target wants profile code emitted before prologue.\n\n\ +The default version of this hook use the target macro\n\ +@code{PROFILE_BEFORE_PROLOGUE}.", + bool, (void), + default_profile_before_prologue) + /* Modify and return the identifier of a DECL's external name, originally identified by ID, as required by the target, (eg, append @nn to windows32 stdcall function names). diff --git a/gcc/targhooks.c b/gcc/targhooks.c index 22077f8..553d0bc 100644 --- a/gcc/targhooks.c +++ b/gcc/targhooks.c @@ -1197,4 +1197,14 @@ default_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED, #endif } +bool +default_profile_before_prologue (void) +{ +#ifdef PROFILE_BEFORE_PROLOGUE + return true; +#else + return false; +#endif +} + #include "gt-targhooks.h" diff --git a/gcc/targhooks.h b/gcc/targhooks.h index 23393b4..198bcc7 100644 --- a/gcc/targhooks.h +++ b/gcc/targhooks.h @@ -150,3 +150,4 @@ extern int default_memory_move_cost (enum machine_mode, reg_class_t, bool); extern int default_register_move_cost (enum machine_mode, reg_class_t, reg_class_t); +extern bool default_profile_before_prologue (void); |