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. 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? 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.)
/* 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.