forked from OSchip/llvm-project
Switch -mcount and -finstrument-functions to emit EnterExitInstrumenter attributes
This updates -mcount to use the new attribute names (LLVM r318195), and switches over -finstrument-functions to also use these attributes rather than inserting instrumentation in the frontend. It also adds a new flag, -finstrument-functions-after-inlining, which makes the cygprofile instrumentation get inserted after inlining rather than before. Differential Revision: https://reviews.llvm.org/D39331 llvm-svn: 318199
This commit is contained in:
parent
e1ecd61b98
commit
76c26c1dca
|
@ -1028,6 +1028,8 @@ def finput_charset_EQ : Joined<["-"], "finput-charset=">, Group<f_Group>;
|
|||
def fexec_charset_EQ : Joined<["-"], "fexec-charset=">, Group<f_Group>;
|
||||
def finstrument_functions : Flag<["-"], "finstrument-functions">, Group<f_Group>, Flags<[CC1Option]>,
|
||||
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 fxray_instrument : Flag<["-"], "fxray-instrument">, Group<f_Group>,
|
||||
Flags<[CC1Option]>,
|
||||
|
|
|
@ -76,6 +76,8 @@ CODEGENOPT(ForbidGuardVariables , 1, 0) ///< Issue errors if C++ guard variables
|
|||
CODEGENOPT(FunctionSections , 1, 0) ///< Set when -ffunction-sections is enabled.
|
||||
CODEGENOPT(InstrumentFunctions , 1, 0) ///< Set when -finstrument-functions is
|
||||
///< enabled.
|
||||
CODEGENOPT(InstrumentFunctionsAfterInlining , 1, 0) ///< Set when
|
||||
///< -finstrument-functions-after-inlining is enabled.
|
||||
|
||||
CODEGENOPT(XRayInstrumentFunctions , 1, 0) ///< Set when -fxray-instrument is
|
||||
///< enabled.
|
||||
|
|
|
@ -354,8 +354,12 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
|
|||
// Emit function epilog (to return).
|
||||
llvm::DebugLoc Loc = EmitReturnBlock();
|
||||
|
||||
if (ShouldInstrumentFunction())
|
||||
EmitFunctionInstrumentation("__cyg_profile_func_exit");
|
||||
if (ShouldInstrumentFunction()) {
|
||||
CurFn->addFnAttr(!CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining
|
||||
? "instrument-function-exit"
|
||||
: "instrument-function-exit-inlined",
|
||||
"__cyg_profile_func_exit");
|
||||
}
|
||||
|
||||
// Emit debug descriptor for function end.
|
||||
if (CGDebugInfo *DI = getDebugInfo())
|
||||
|
@ -438,7 +442,8 @@ void CodeGenFunction::FinishFunction(SourceLocation EndLoc) {
|
|||
/// ShouldInstrumentFunction - Return true if the current function should be
|
||||
/// instrumented with __cyg_profile_func_* calls
|
||||
bool CodeGenFunction::ShouldInstrumentFunction() {
|
||||
if (!CGM.getCodeGenOpts().InstrumentFunctions)
|
||||
if (!CGM.getCodeGenOpts().InstrumentFunctions &&
|
||||
!CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining)
|
||||
return false;
|
||||
if (!CurFuncDecl || CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>())
|
||||
return false;
|
||||
|
@ -488,31 +493,6 @@ CodeGenFunction::DecodeAddrUsedInPrologue(llvm::Value *F,
|
|||
"decoded_addr");
|
||||
}
|
||||
|
||||
/// EmitFunctionInstrumentation - Emit LLVM code to call the specified
|
||||
/// instrumentation function with the current function and the call site, if
|
||||
/// function instrumentation is enabled.
|
||||
void CodeGenFunction::EmitFunctionInstrumentation(const char *Fn) {
|
||||
auto NL = ApplyDebugLocation::CreateArtificial(*this);
|
||||
// void __cyg_profile_func_{enter,exit} (void *this_fn, void *call_site);
|
||||
llvm::PointerType *PointerTy = Int8PtrTy;
|
||||
llvm::Type *ProfileFuncArgs[] = { PointerTy, PointerTy };
|
||||
llvm::FunctionType *FunctionTy =
|
||||
llvm::FunctionType::get(VoidTy, ProfileFuncArgs, false);
|
||||
|
||||
llvm::Constant *F = CGM.CreateRuntimeFunction(FunctionTy, Fn);
|
||||
llvm::CallInst *CallSite = Builder.CreateCall(
|
||||
CGM.getIntrinsic(llvm::Intrinsic::returnaddress),
|
||||
llvm::ConstantInt::get(Int32Ty, 0),
|
||||
"callsite");
|
||||
|
||||
llvm::Value *args[] = {
|
||||
llvm::ConstantExpr::getBitCast(CurFn, PointerTy),
|
||||
CallSite
|
||||
};
|
||||
|
||||
EmitNounwindRuntimeCall(F, args);
|
||||
}
|
||||
|
||||
static void removeImageAccessQualifier(std::string& TyName) {
|
||||
std::string ReadOnlyQual("__read_only");
|
||||
std::string::size_type ReadOnlyPos = TyName.find(ReadOnlyQual);
|
||||
|
@ -1001,8 +981,12 @@ void CodeGenFunction::StartFunction(GlobalDecl GD,
|
|||
DI->EmitFunctionStart(GD, Loc, StartLoc, FnType, CurFn, Builder);
|
||||
}
|
||||
|
||||
if (ShouldInstrumentFunction())
|
||||
EmitFunctionInstrumentation("__cyg_profile_func_enter");
|
||||
if (ShouldInstrumentFunction()) {
|
||||
Fn->addFnAttr(!CGM.getCodeGenOpts().InstrumentFunctionsAfterInlining
|
||||
? "instrument-function-entry"
|
||||
: "instrument-function-entry-inlined",
|
||||
"__cyg_profile_func_enter");
|
||||
}
|
||||
|
||||
// Since emitting the mcount call here impacts optimizations such as function
|
||||
// inlining, we just add an attribute to insert a mcount call in backend.
|
||||
|
@ -1012,8 +996,10 @@ void CodeGenFunction::StartFunction(GlobalDecl GD,
|
|||
if (CGM.getCodeGenOpts().CallFEntry)
|
||||
Fn->addFnAttr("fentry-call", "true");
|
||||
else {
|
||||
if (!CurFuncDecl || !CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>())
|
||||
Fn->addFnAttr("counting-function", getTarget().getMCountName());
|
||||
if (!CurFuncDecl || !CurFuncDecl->hasAttr<NoInstrumentFunctionAttr>()) {
|
||||
Fn->addFnAttr("instrument-function-entry-inlined",
|
||||
getTarget().getMCountName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1784,11 +1784,6 @@ public:
|
|||
/// instrumented with XRay nop sleds.
|
||||
bool ShouldXRayInstrumentFunction() const;
|
||||
|
||||
/// EmitFunctionInstrumentation - Emit LLVM code to call the specified
|
||||
/// instrumentation function with the current function and the call site, if
|
||||
/// function instrumentation is enabled.
|
||||
void EmitFunctionInstrumentation(const char *Fn);
|
||||
|
||||
/// Encode an address into a form suitable for use in a function prologue.
|
||||
llvm::Constant *EncodeAddrForUseInPrologue(llvm::Function *F,
|
||||
llvm::Constant *Addr);
|
||||
|
|
|
@ -3545,7 +3545,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
options::OPT_fno_unique_section_names, true))
|
||||
CmdArgs.push_back("-fno-unique-section-names");
|
||||
|
||||
Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
|
||||
Args.AddLastArg(CmdArgs, options::OPT_finstrument_functions,
|
||||
options::OPT_finstrument_functions_after_inlining);
|
||||
|
||||
addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
|
||||
|
||||
|
|
|
@ -777,6 +777,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||
|
||||
Opts.PreserveVec3Type = Args.hasArg(OPT_fpreserve_vec3_type);
|
||||
Opts.InstrumentFunctions = Args.hasArg(OPT_finstrument_functions);
|
||||
Opts.InstrumentFunctionsAfterInlining =
|
||||
Args.hasArg(OPT_finstrument_functions_after_inlining);
|
||||
Opts.XRayInstrumentFunctions = Args.hasArg(OPT_fxray_instrument);
|
||||
Opts.XRayInstructionThreshold =
|
||||
getLastArgIntValue(Args, OPT_fxray_instruction_threshold_EQ, 200, Diags);
|
||||
|
|
|
@ -1,18 +1,21 @@
|
|||
// RUN: %clang_cc1 -S -debug-info-kind=standalone -emit-llvm -o - %s -finstrument-functions | FileCheck %s
|
||||
// RUN: %clang_cc1 -S -debug-info-kind=standalone -emit-llvm -o - %s -finstrument-functions -disable-llvm-passes | FileCheck %s
|
||||
|
||||
// CHECK: @test1
|
||||
int test1(int x) {
|
||||
// CHECK: call void @__cyg_profile_func_enter({{.*}}, !dbg
|
||||
// CHECK: call void @__cyg_profile_func_exit({{.*}}, !dbg
|
||||
// CHECK: define i32 @test1(i32 %x) #[[ATTR1:[0-9]+]]
|
||||
// CHECK: ret
|
||||
return x;
|
||||
}
|
||||
|
||||
// CHECK: @test2
|
||||
int test2(int) __attribute__((no_instrument_function));
|
||||
int test2(int x) {
|
||||
// CHECK-NOT: __cyg_profile_func_enter
|
||||
// CHECK-NOT: __cyg_profile_func_exit
|
||||
// CHECK: define i32 @test2(i32 %x) #[[ATTR2:[0-9]+]]
|
||||
// CHECK: ret
|
||||
return x;
|
||||
}
|
||||
|
||||
// CHECK: attributes #[[ATTR1]] =
|
||||
// CHECK-SAME: "instrument-function-entry"="__cyg_profile_func_enter"
|
||||
// CHECK-SAME: "instrument-function-exit"="__cyg_profile_func_exit"
|
||||
|
||||
// CHECK: attributes #[[ATTR2]] =
|
||||
// CHECK-NOT: "instrument-function-entry"
|
||||
|
|
|
@ -35,9 +35,9 @@ int main(void) {
|
|||
return no_instrument();
|
||||
}
|
||||
|
||||
// CHECK: attributes #0 = { {{.*}}"counting-function"="mcount"{{.*}} }
|
||||
// CHECK: attributes #0 = { {{.*}}"instrument-function-entry-inlined"="mcount"{{.*}} }
|
||||
// CHECK: attributes #1 = { {{.*}} }
|
||||
// CHECK-PREFIXED: attributes #0 = { {{.*}}"counting-function"="_mcount"{{.*}} }
|
||||
// CHECK-PREFIXED: attributes #0 = { {{.*}}"instrument-function-entry-inlined"="_mcount"{{.*}} }
|
||||
// CHECK-PREFIXED: attributes #1 = { {{.*}} }
|
||||
// NO-MCOUNT-NOT: attributes #{{[0-9]}} = { {{.*}}"counting-function"={{.*}} }
|
||||
// NO-MCOUNT1-NOT: attributes #1 = { {{.*}}"counting-function"={{.*}} }
|
||||
// NO-MCOUNT-NOT: attributes #{{[0-9]}} = { {{.*}}"instrument-function-entry-inlined"={{.*}} }
|
||||
// NO-MCOUNT1-NOT: attributes #1 = { {{.*}}"instrument-function-entry-inlined"={{.*}} }
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
// REQUIRES: x86-registered-target
|
||||
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -S -finstrument-functions -O2 -o - %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -S -finstrument-functions-after-inlining -O2 -o - %s | FileCheck -check-prefix=NOINLINE %s
|
||||
|
||||
// It's not so nice having asm tests in Clang, but we need to check that we set
|
||||
// up the pipeline correctly in order to have the instrumentation inserted.
|
||||
|
||||
int leaf(int x) {
|
||||
return x;
|
||||
// CHECK-LABEL: leaf:
|
||||
// CHECK: callq __cyg_profile_func_enter
|
||||
// CHECK-NOT: cyg_profile
|
||||
// CHECK: callq __cyg_profile_func_exit
|
||||
// CHECK-NOT: cyg_profile
|
||||
// CHECK: ret
|
||||
}
|
||||
|
||||
int root(int x) {
|
||||
return leaf(x);
|
||||
// CHECK-LABEL: root:
|
||||
// CHECK: callq __cyg_profile_func_enter
|
||||
// CHECK-NOT: cyg_profile
|
||||
|
||||
// Inlined from leaf():
|
||||
// CHECK: callq __cyg_profile_func_enter
|
||||
// CHECK-NOT: cyg_profile
|
||||
// CHECK: callq __cyg_profile_func_exit
|
||||
|
||||
// CHECK-NOT: cyg_profile
|
||||
// CHECK: callq __cyg_profile_func_exit
|
||||
// CHECK: ret
|
||||
|
||||
// NOINLINE-LABEL: root:
|
||||
// NOINLINE: callq __cyg_profile_func_enter
|
||||
// NOINLINE-NOT: cyg_profile
|
||||
// NOINLINE: callq __cyg_profile_func_exit
|
||||
// NOINLINE: ret
|
||||
}
|
|
@ -1,22 +1,26 @@
|
|||
// RUN: %clang_cc1 -S -emit-llvm -triple %itanium_abi_triple -o - %s -finstrument-functions | FileCheck %s
|
||||
// RUN: %clang_cc1 -S -emit-llvm -triple %itanium_abi_triple -o - %s -finstrument-functions -disable-llvm-passes | FileCheck %s
|
||||
|
||||
// CHECK: @_Z5test1i
|
||||
int test1(int x) {
|
||||
// CHECK: __cyg_profile_func_enter
|
||||
// CHECK: __cyg_profile_func_exit
|
||||
// CHECK: define i32 @_Z5test1i(i32 %x) #[[ATTR1:[0-9]+]]
|
||||
// CHECK: ret
|
||||
return x;
|
||||
}
|
||||
|
||||
// CHECK: @_Z5test2i
|
||||
int test2(int) __attribute__((no_instrument_function));
|
||||
int test2(int x) {
|
||||
// CHECK-NOT: __cyg_profile_func_enter
|
||||
// CHECK-NOT: __cyg_profile_func_exit
|
||||
// CHECK: define i32 @_Z5test2i(i32 %x) #[[ATTR2:[0-9]+]]
|
||||
// CHECK: ret
|
||||
return x;
|
||||
}
|
||||
|
||||
// CHECK: attributes #[[ATTR1]] =
|
||||
// CHECK-SAME: "instrument-function-entry"="__cyg_profile_func_enter"
|
||||
// CHECK-SAME: "instrument-function-exit"="__cyg_profile_func_exit"
|
||||
|
||||
// CHECK: attributes #[[ATTR2]] =
|
||||
// CHECK-NOT: "instrument-function-entry"
|
||||
|
||||
|
||||
// This test case previously crashed code generation. It exists solely
|
||||
// to test -finstrument-function does not crash codegen for this trivial
|
||||
// case.
|
||||
|
|
|
@ -43,36 +43,36 @@ int f() {
|
|||
|
||||
// CHECK-LABEL: f
|
||||
// TODO: add profiling support for arm-baremetal
|
||||
// CHECK-ARM-BAREMETAL-EABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01mcount"{{.*}} }
|
||||
// CHECK-ARM-BAREMETAL-EABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-BAREMETAL-EABI: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="mcount"{{.*}} }
|
||||
// CHECK-ARM64-BAREMETAL-EABI-MEABI-GNU: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01_mcount"{{.*}} }
|
||||
// CHECK-ARM-IOS-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="_mcount"{{.*}} }
|
||||
// CHECK-ARM-IOS-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-MEABI-GNU: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01_mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI-LINUX: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01_mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-FREEBSD: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="__mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-FREEBSD-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI-FREEBSD: attributes #{{[0-9]+}} = { {{.*}}"counting-function"=".mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-FREEBSD-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI-NETBSD: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="_mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-NETBSD-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI-OPENBSD: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="__mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-OPENBSD-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI-OPENBSD: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="__mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-OPENBSD-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI-MEABI-GNU-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-MEABI-GNU: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI-RTEMS: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-RTEMS-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI-RTEMS: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-RTEMS-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI-CLOUDABI: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-CLOUDABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI-CLOUDABI: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-CLOUDABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"counting-function"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-BAREMETAL-EABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01mcount"{{.*}} }
|
||||
// CHECK-ARM-BAREMETAL-EABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-BAREMETAL-EABI: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="mcount"{{.*}} }
|
||||
// CHECK-ARM64-BAREMETAL-EABI-MEABI-GNU: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01_mcount"{{.*}} }
|
||||
// CHECK-ARM-IOS-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="_mcount"{{.*}} }
|
||||
// CHECK-ARM-IOS-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-MEABI-GNU: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01_mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI-LINUX: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01_mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-FREEBSD: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="__mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-FREEBSD-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI-FREEBSD: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"=".mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-FREEBSD-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI-NETBSD: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="_mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-NETBSD-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI-OPENBSD: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="__mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-OPENBSD-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI-OPENBSD: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="__mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-OPENBSD-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI-MEABI-GNU-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-MEABI-GNU: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI-RTEMS: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-RTEMS-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI-RTEMS: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-RTEMS-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM-EABI-CLOUDABI: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="mcount"{{.*}} }
|
||||
// CHECK-ARM-EABI-CLOUDABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
// CHECK-ARM64-EABI-CLOUDABI: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="mcount"{{.*}} }
|
||||
// CHECK-ARM64-EABI-CLOUDABI-NOT: attributes #{{[0-9]+}} = { {{.*}}"instrument-function-entry-inlined"="\01__gnu_mcount_nc"{{.*}} }
|
||||
|
||||
|
|
Loading…
Reference in New Issue