Author: hans Date: Tue Nov 21 09:30:34 2017 New Revision: 318785 URL: http://llvm.org/viewvc/llvm-project?rev=318785&view=rev Log: 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 Modified: cfe/trunk/include/clang/Driver/Options.td cfe/trunk/include/clang/Frontend/CodeGenOptions.def cfe/trunk/lib/CodeGen/CodeGenFunction.cpp cfe/trunk/lib/Driver/ToolChains/Clang.cpp cfe/trunk/lib/Frontend/CompilerInvocation.cpp cfe/trunk/test/CodeGen/instrument-functions.c Modified: cfe/trunk/include/clang/Driver/Options.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=318785&r1=318784&r2=318785&view=diff ============================================================================== --- cfe/trunk/include/clang/Driver/Options.td (original) +++ cfe/trunk/include/clang/Driver/Options.td Tue Nov 21 09:30:34 2017 @@ -1030,6 +1030,8 @@ def finstrument_functions : Flag<["-"], HelpText<"Generate calls to instrument function entry and exit">; def finstrument_functions_after_inlining : Flag<["-"], "finstrument-functions-after-inlining">, Group<f_Group>, Flags<[CC1Option]>, HelpText<"Like -finstrument-functions, but insert the calls after inlining">; +def finstrument_function_entry_bare : Flag<["-"], "finstrument-function-entry-bare">, Group<f_Group>, Flags<[CC1Option]>, + HelpText<"Instrument function entry only, after inlining, without arguments to the instrumentation call">; def fxray_instrument : Flag<["-"], "fxray-instrument">, Group<f_Group>, Flags<[CC1Option]>, Modified: cfe/trunk/include/clang/Frontend/CodeGenOptions.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenOptions.def?rev=318785&r1=318784&r2=318785&view=diff ============================================================================== --- cfe/trunk/include/clang/Frontend/CodeGenOptions.def (original) +++ cfe/trunk/include/clang/Frontend/CodeGenOptions.def Tue Nov 21 09:30:34 2017 @@ -78,6 +78,8 @@ CODEGENOPT(InstrumentFunctions , 1, 0) / ///< enabled. CODEGENOPT(InstrumentFunctionsAfterInlining , 1, 0) ///< Set when ///< -finstrument-functions-after-inlining is enabled. +CODEGENOPT(InstrumentFunctionEntryBare , 1, 0) ///< Set when + ///< -finstrument-function-entry-bare is enabled. CODEGENOPT(XRayInstrumentFunctions , 1, 0) ///< Set when -fxray-instrument is ///< enabled. Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=318785&r1=318784&r2=318785&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original) +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Tue Nov 21 09:30:34 2017 @@ -355,10 +355,11 @@ void CodeGenFunction::FinishFunction(Sou 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(Sou /// 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(Glob } 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 Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=318785&r1=318784&r2=318785&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Tue Nov 21 09:30:34 2017 @@ -3554,8 +3554,11 @@ void Clang::ConstructJob(Compilation &C, 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); Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=318785&r1=318784&r2=318785&view=diff ============================================================================== --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Tue Nov 21 09:30:34 2017 @@ -782,6 +782,8 @@ static bool ParseCodeGenArgs(CodeGenOpti 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); Modified: cfe/trunk/test/CodeGen/instrument-functions.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/instrument-functions.c?rev=318785&r1=318784&r2=318785&view=diff ============================================================================== --- cfe/trunk/test/CodeGen/instrument-functions.c (original) +++ cfe/trunk/test/CodeGen/instrument-functions.c Tue Nov 21 09:30:34 2017 @@ -1,8 +1,12 @@ // RUN: %clang_cc1 -S -debug-info-kind=standalone -emit-llvm -o - %s -finstrument-functions -disable-llvm-passes | FileCheck %s +// RUN: %clang_cc1 -S -debug-info-kind=standalone -emit-llvm -o - %s -finstrument-function-entry-bare -disable-llvm-passes | FileCheck -check-prefix=BARE %s int test1(int x) { // CHECK: @test1(i32 {{.*}}%x) #[[ATTR1:[0-9]+]] // CHECK: ret + +// BARE: @test1(i32 {{.*}}%x) #[[ATTR1:[0-9]+]] +// BARE: ret return x; } @@ -10,6 +14,9 @@ int test2(int) __attribute__((no_instrum int test2(int x) { // CHECK: @test2(i32 {{.*}}%x) #[[ATTR2:[0-9]+]] // CHECK: ret + +// BARE: @test2(i32 {{.*}}%x) #[[ATTR2:[0-9]+]] +// BARE: ret return x; } @@ -17,5 +24,11 @@ int test2(int x) { // CHECK-SAME: "instrument-function-entry"="__cyg_profile_func_enter" // CHECK-SAME: "instrument-function-exit"="__cyg_profile_func_exit" +// BARE: attributes #[[ATTR1]] = +// BARE-SAME: "instrument-function-entry-inlined"="__cyg_profile_func_enter_bare" + // CHECK: attributes #[[ATTR2]] = // CHECK-NOT: "instrument-function-entry" + +// BARE: attributes #[[ATTR2]] = +// BARE-NOT: "instrument-function-entry" _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits