diff options
author | Hans Wennborg <hans@hanshq.net> | 2017-11-21 17:30:34 +0000 |
---|---|---|
committer | Hans Wennborg <hans@hanshq.net> | 2017-11-21 17:30:34 +0000 |
commit | 14e8a5a32d8f34b5154f24072fb7a8803ea52ae3 (patch) | |
tree | c666d8392421acf372a32515befa73481d57c6d9 /clang/lib | |
parent | d97c0f785576b78aa8c5771841a505f4aef79ad9 (diff) | |
download | bcm5719-llvm-14e8a5a32d8f34b5154f24072fb7a8803ea52ae3.tar.gz bcm5719-llvm-14e8a5a32d8f34b5154f24072fb7a8803ea52ae3.zip |
Add -finstrument-function-entry-bare flag
This is an instrumentation flag that's similar to
-finstrument-functions, but it only inserts calls on function entry, the
calls are inserted post-inlining, and they don't take any arugments.
This is intended for users who want to instrument function entry with
minimal overhead.
(-pg would be another alternative, but forces frame pointer emission and
affects link flags, so is probably best left alone to be used for
generating gcov data.)
Differential revision: https://reviews.llvm.org/D40276
llvm-svn: 318785
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 24 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains/Clang.cpp | 7 | ||||
-rw-r--r-- | clang/lib/Frontend/CompilerInvocation.cpp | 2 |
3 files changed, 22 insertions, 11 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index 8544da3da7f..6b8359141be 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -355,10 +355,11 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) { llvm::DebugLoc Loc = EmitReturnBlock(); if (ShouldInstrumentFunction()) { - CurFn->addFnAttr(!CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining - ? "instrument-function-exit" - : "instrument-function-exit-inlined", - "__cyg_profile_func_exit"); + if (CGM.getCodeGenOpts().InstrumentFunctions) + CurFn->addFnAttr("instrument-function-exit", "__cyg_profile_func_exit"); + if (CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining) + CurFn->addFnAttr("instrument-function-exit-inlined", + "__cyg_profile_func_exit"); } // Emit debug descriptor for function end. @@ -443,7 +444,8 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) { /// instrumented with __cyg_profile_func_* calls bool CodeGenFunction::ShouldInstrumentFunction() { if (!CGM.getCodeGenOpts().InstrumentFunctions && - !CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining) + !CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining && + !CGM.getCodeGenOpts().InstrumentFunctionEntryBare) return false; if (!CurFuncDecl || CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>()) return false; @@ -982,10 +984,14 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, } if (ShouldInstrumentFunction()) { - Fn->addFnAttr(!CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining - ? "instrument-function-entry" - : "instrument-function-entry-inlined", - "__cyg_profile_func_enter"); + if (CGM.getCodeGenOpts().InstrumentFunctions) + CurFn->addFnAttr("instrument-function-entry", "__cyg_profile_func_enter"); + if (CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining) + CurFn->addFnAttr("instrument-function-entry-inlined", + "__cyg_profile_func_enter"); + if (CGM.getCodeGenOpts().InstrumentFunctionEntryBare) + CurFn->addFnAttr("instrument-function-entry-inlined", + "__cyg_profile_func_enter_bare"); } // Since emitting the mcount call here impacts optimizations such as function diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 2f1fa4af807..3ab28d471be 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3554,8 +3554,11 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, options::OPT_fno_unique_section_names, true)) CmdArgs.push_back("-fno-unique-section-names"); - Args.AddLastArg(CmdArgs, options::OPT_finstrument_functions, - options::OPT_finstrument_functions_after_inlining); + if (auto *A = Args.getLastArg( + options::OPT_finstrument_functions, + options::OPT_finstrument_functions_after_inlining, + options::OPT_finstrument_function_entry_bare)) + A->render(Args, CmdArgs); addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs); diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 384124bee2b..3d484170f82 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -782,6 +782,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK, Opts.InstrumentFunctions = Args.hasArg(OPT_finstrument_functions); Opts.InstrumentFunctionsAfterInlining = Args.hasArg(OPT_finstrument_functions_after_inlining); + Opts.InstrumentFunctionEntryBare = + Args.hasArg(OPT_finstrument_function_entry_bare); Opts.XRayInstrumentFunctions = Args.hasArg(OPT_fxray_instrument); Opts.XRayInstructionThreshold = getLastArgIntValue(Args, OPT_fxray_instruction_threshold_EQ, 200, Diags); |