在 2015/10/22 18:16, Szabolcs Nagy 写道: > On 22/10/15 10:23, libin wrote: >> From: Jiangjiji <jiangj...@huawei.com> >> Date: Sat, 10 Oct 2015 15:29:57 +0800 >> Subject: [PATCH] * gcc/config/aarch64/aarch64.opt: Add a new option. >> * gcc/config/aarch64/aarch64.c: Add some new functions and Macros. >> * gcc/config/aarch64/aarch64.h: Modify PROFILE_HOOK and FUNCTION_PROFILER. >> > > this patch might be worth submitting to gcc-patches. >
Ok, i will submit it to gcc-patches :) > i assume this is not redundant with respect to the > nop-padding work. > >> Signed-off-by: Jiangjiji <jiangj...@huawei.com> >> Signed-off-by: Li Bin <huawei.li...@huawei.com> >> --- >> gcc/config/aarch64/aarch64.c | 23 +++++++++++++++++++++++ >> gcc/config/aarch64/aarch64.h | 13 ++++++++----- >> gcc/config/aarch64/aarch64.opt | 4 ++++ >> 3 files changed, 35 insertions(+), 5 deletions(-) >> >> diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c >> index 752df4e..c70b161 100644 >> --- a/gcc/config/aarch64/aarch64.c >> +++ b/gcc/config/aarch64/aarch64.c >> @@ -440,6 +440,17 @@ aarch64_is_long_call_p (rtx sym) >> return aarch64_decl_is_long_call_p (SYMBOL_REF_DECL (sym)); >> } >> >> +void >> +aarch64_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED) >> +{ >> + if (flag_fentry) >> + { >> + fprintf (file, "\tmov\tx9, x30\n"); >> + fprintf (file, "\tbl\t__fentry__\n"); >> + fprintf (file, "\tmov\tx30, x9\n"); >> + } >> +} >> + > > you can even omit the mov x30,x9 at the call site if > __fentry__ does > > stp x9,x30,[sp,#-16]! > //... profiling > ldp x30,x9,[sp],#16 > ret x9 > > is there a problem with this? > __fentry__ is responsible to protect all registers. > i think the rest of the patch means that -pg retains > the old behaviour and -pg -mfentry emits this new entry. > > note that -pg rejects -fomit-frame-pointer (for no good > reason), that should be fixed separately (it seems the > kernel now relies on frame pointers on aarch64, but the > mcount abi does not require this and e.g. the glibc > mcount does not use it.) > Yes, kernel configuration CONFIG_FRAME_POINTER is forced on arm64, that the kernel is compiled without -fomit-frame-pointer. Thanks, Li Bin >> /* Return true if the offsets to a zero/sign-extract operation >> represent an expression that matches an extend operation. The >> operands represent the paramters from >> @@ -7414,6 +7425,15 @@ aarch64_emit_unlikely_jump (rtx insn) >> add_int_reg_note (insn, REG_BR_PROB, very_unlikely); >> } >> >> +/* Return true, if profiling code should be emitted before >> + * prologue. Otherwise it returns false. >> + * Note: For x86 with "hotfix" it is sorried. */ >> +static bool >> +aarch64_profile_before_prologue (void) >> +{ >> + return flag_fentry != 0; >> +} >> + >> /* Expand a compare and swap pattern. */ >> >> void >> @@ -8454,6 +8474,9 @@ aarch64_cannot_change_mode_class (enum machine_mode >> from, >> #undef TARGET_ASM_ALIGNED_SI_OP >> #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t" >> >> +#undef TARGET_PROFILE_BEFORE_PROLOGUE >> +#define TARGET_PROFILE_BEFORE_PROLOGUE aarch64_profile_before_prologue >> + >> #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK >> #define TARGET_ASM_CAN_OUTPUT_MI_THUNK \ >> hook_bool_const_tree_hwi_hwi_const_tree_true >> diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h >> index 77b2bb9..65e34fc 100644 >> --- a/gcc/config/aarch64/aarch64.h >> +++ b/gcc/config/aarch64/aarch64.h >> @@ -804,13 +804,16 @@ do { \ >> #define PROFILE_HOOK(LABEL) \ >> { \ >> rtx fun, lr; \ >> - lr = get_hard_reg_initial_val (Pmode, LR_REGNUM); \ >> - fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_NAME); \ >> - emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lr, Pmode); \ >> + if (!flag_fentry) >> + { >> + lr = get_hard_reg_initial_val (Pmode, LR_REGNUM); \ >> + fun = gen_rtx_SYMBOL_REF (Pmode, MCOUNT_NAME); \ >> + emit_library_call (fun, LCT_NORMAL, VOIDmode, 1, lr, Pmode); \ >> + } >> } >> >> -/* All the work done in PROFILE_HOOK, but still required. */ >> -#define FUNCTION_PROFILER(STREAM, LABELNO) do { } while (0) >> +#define FUNCTION_PROFILER(STREAM, LABELNO) >> + aarch64_function_profiler(STREAM, LABELNO) >> >> /* For some reason, the Linux headers think they know how to define >> these macros. They don't!!! */ >> diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt >> index 266d873..9e4b408 100644 >> --- a/gcc/config/aarch64/aarch64.opt >> +++ b/gcc/config/aarch64/aarch64.opt >> @@ -124,3 +124,7 @@ Enum(aarch64_abi) String(ilp32) Value(AARCH64_ABI_ILP32) >> >> EnumValue >> Enum(aarch64_abi) String(lp64) Value(AARCH64_ABI_LP64) >> + >> +mfentry >> +Target Report Var(flag_fentry) Init(0) >> +Emit profiling counter call at function entry immediately after prologue. >> > > > . >