https://github.com/pmur updated https://github.com/llvm/llvm-project/pull/184641
>From e46121ec0857a5726c7dbfcbe9ef3db0dbecc458 Mon Sep 17 00:00:00 2001 From: Paul Murphy <[email protected]> Date: Tue, 3 Mar 2026 14:43:18 -0600 Subject: [PATCH 1/3] [LLVM][CodeGen][X86] Support mnop-mcount and mrecord-mcount attributes Support mnop-mcount and mrecord-mcount attributes when used with the fentry-call=true attribute. Similar to SystemZ, use the mnop-mcount attribute to place a nop instead of a call to __fentry__. Likewise, use the mrecord-mcount attribute to record the location of the call to fentry (or nop if used with the above) to a section named __mcount_loc. --- llvm/lib/CodeGen/FEntryInserter.cpp | 10 ++-- .../Target/SystemZ/SystemZISelDAGToDAG.cpp | 6 --- llvm/lib/Target/X86/X86MCInstLower.cpp | 18 +++++++ llvm/test/CodeGen/X86/mnop-mcount-01.ll | 36 +++++++++++++ llvm/test/CodeGen/X86/mnop-mcount-02.ll | 11 ++++ llvm/test/CodeGen/X86/mrecord-mcount-01.ll | 51 +++++++++++++++++++ llvm/test/CodeGen/X86/mrecord-mcount-02.ll | 11 ++++ 7 files changed, 134 insertions(+), 9 deletions(-) create mode 100644 llvm/test/CodeGen/X86/mnop-mcount-01.ll create mode 100644 llvm/test/CodeGen/X86/mnop-mcount-02.ll create mode 100644 llvm/test/CodeGen/X86/mrecord-mcount-01.ll create mode 100644 llvm/test/CodeGen/X86/mrecord-mcount-02.ll diff --git a/llvm/lib/CodeGen/FEntryInserter.cpp b/llvm/lib/CodeGen/FEntryInserter.cpp index d8a3ac6370e9c..20e538ba0955c 100644 --- a/llvm/lib/CodeGen/FEntryInserter.cpp +++ b/llvm/lib/CodeGen/FEntryInserter.cpp @@ -51,10 +51,14 @@ PreservedAnalyses FEntryInserterPass::run(MachineFunction &MF, } bool FEntryInserter::run(MachineFunction &MF) { - const std::string FEntryName = std::string( - MF.getFunction().getFnAttribute("fentry-call").getValueAsString()); - if (FEntryName != "true") + const Function &F = MF.getFunction(); + if (F.getFnAttribute("fentry-call").getValueAsString() != "true") { + if (F.hasFnAttribute("mnop-mcount")) + report_fatal_error("mnop-mcount only supported with fentry-call"); + if (F.hasFnAttribute("mrecord-mcount")) + report_fatal_error("mrecord-mcount only supported with fentry-call"); return false; + } auto &FirstMBB = *MF.begin(); auto *TII = MF.getSubtarget().getInstrInfo(); diff --git a/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp b/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp index 9ab0a4a7f2368..86fa6985a53ce 100644 --- a/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp +++ b/llvm/lib/Target/SystemZ/SystemZISelDAGToDAG.cpp @@ -373,12 +373,6 @@ class SystemZDAGToDAGISel : public SelectionDAGISel { bool runOnMachineFunction(MachineFunction &MF) override { const Function &F = MF.getFunction(); - if (F.getFnAttribute("fentry-call").getValueAsString() != "true") { - if (F.hasFnAttribute("mnop-mcount")) - report_fatal_error("mnop-mcount only supported with fentry-call"); - if (F.hasFnAttribute("mrecord-mcount")) - report_fatal_error("mrecord-mcount only supported with fentry-call"); - } if (F.getParent()->getStackProtectorGuard() != "global") { if (F.getParent()->hasStackProtectorGuardRecord()) report_fatal_error("mstack-protector-guard-record only supported with " diff --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp index ad0946b4c3310..76610e2418511 100644 --- a/llvm/lib/Target/X86/X86MCInstLower.cpp +++ b/llvm/lib/Target/X86/X86MCInstLower.cpp @@ -26,6 +26,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/CodeGen/MachineBranchProbabilityInfo.h" #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFunction.h" @@ -44,6 +45,7 @@ #include "llvm/MC/MCInst.h" #include "llvm/MC/MCInstBuilder.h" #include "llvm/MC/MCSection.h" +#include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSymbol.h" #include "llvm/MC/TargetRegistry.h" @@ -892,6 +894,22 @@ void X86AsmPrinter::LowerFENTRY_CALL(const MachineInstr &MI, X86MCInstLower &MCIL) { bool Is64Bits = Subtarget->is64Bit(); MCContext &Ctx = OutStreamer->getContext(); + + if (MF->getFunction().hasFnAttribute("mrecord-mcount")) { + MCSymbol *DotSym = OutContext.createTempSymbol(); + OutStreamer->pushSection(); + OutStreamer->switchSection( + Ctx.getELFSection("__mcount_loc", ELF::SHT_PROGBITS, ELF::SHF_ALLOC)); + OutStreamer->emitSymbolValue(DotSym, Is64Bits ? 8 : 4); + OutStreamer->popSection(); + OutStreamer->emitLabel(DotSym); + } + + if (MF->getFunction().hasFnAttribute("mnop-mcount")) { + emitX86Nops(*OutStreamer, 5, Subtarget); + return; + } + MCSymbol *fentry = Ctx.getOrCreateSymbol("__fentry__"); const MCSymbolRefExpr *Op = MCSymbolRefExpr::create(fentry, Ctx); diff --git a/llvm/test/CodeGen/X86/mnop-mcount-01.ll b/llvm/test/CodeGen/X86/mnop-mcount-01.ll new file mode 100644 index 0000000000000..ede06b74bcc8e --- /dev/null +++ b/llvm/test/CodeGen/X86/mnop-mcount-01.ll @@ -0,0 +1,36 @@ +; RUN: llc %s -mtriple=x86_64-linux-gnu -o - -verify-machineinstrs \ +; RUN: | FileCheck --check-prefixes=X64 %s +; RUN: llc %s -mtriple=i686-linux-gnu -o - -verify-machineinstrs \ +; RUN: | FileCheck --check-prefix=X86 %s + +define void @test1() #0 { +entry: + ret void + +; X64-LABEL: @test1 +; X64: callq __fentry__ +; X64: retq +; X86-LABEL: @test1 +; X86: calll __fentry__ +; X86: retl +} + +define void @test2() #1 { +entry: + ret void + +; X64-LABEL: @test2 +; X64-NOT: callq __fentry__ +; X64: nopl 8(%rax,%rax) +; X64: retq +; X86-LABEL: @test2 +; X86-NOT: calll __fentry__ +; X86: xchgw %ax, %ax +; X86: xchgw %ax, %ax +; X86: nop +; X86: retl +} + +attributes #0 = { "fentry-call"="true" } +attributes #1 = { "fentry-call"="true" "mnop-mcount" } + diff --git a/llvm/test/CodeGen/X86/mnop-mcount-02.ll b/llvm/test/CodeGen/X86/mnop-mcount-02.ll new file mode 100644 index 0000000000000..9721278d66430 --- /dev/null +++ b/llvm/test/CodeGen/X86/mnop-mcount-02.ll @@ -0,0 +1,11 @@ +; RUN: not --crash llc %s -mtriple=x86_64-linux-gnu -o - 2>&1 | FileCheck %s +; RUN: not --crash llc %s -mtriple=i686-linux-gnu -o - 2>&1 | FileCheck %s +; +; CHECK: LLVM ERROR: mnop-mcount only supported with fentry-call + +define void @test1() #0 { +entry: + ret void +} + +attributes #0 = { "instrument-function-entry-inlined"="mcount" "mnop-mcount" } diff --git a/llvm/test/CodeGen/X86/mrecord-mcount-01.ll b/llvm/test/CodeGen/X86/mrecord-mcount-01.ll new file mode 100644 index 0000000000000..cc27f1eb791ad --- /dev/null +++ b/llvm/test/CodeGen/X86/mrecord-mcount-01.ll @@ -0,0 +1,51 @@ +; RUN: llc %s -mtriple=x86_64-linux-gnu -o - -verify-machineinstrs \ +; RUN: | FileCheck --check-prefix=X64 %s +; RUN: llc %s -mtriple=i686-linux-gnu -o - -verify-machineinstrs \ +; RUN: | FileCheck --check-prefix=X86 %s + +define void @test1() #0 { +entry: + ret void + +; X64-LABEL: test1: +; X64: .section __mcount_loc,"a",@progbits +; X64: .quad .Ltmp0 +; X64: .text +; X64: .Ltmp0: +; X64: callq __fentry__ +; X64: retq +; X86-LABEL: test1: +; X86: .section __mcount_loc,"a",@progbits +; X86: .long .Ltmp0 +; X86: .text +; X86: .Ltmp0: +; X86: calll __fentry__ +; X86: retl +} + +define void @test2() #1 { +entry: + ret void + +; X64-LABEL: test2: +; X64: .section __mcount_loc,"a",@progbits +; X64: .quad .Ltmp1 +; X64: .text +; X64: .Ltmp1: +; X64: nopl 8(%rax,%rax) +; X64-NOT: callq __fentry__ +; X64: retq +; X86-LABEL: test2: +; X86: .section __mcount_loc,"a",@progbits +; X86: .long .Ltmp1 +; X86: .text +; X86: .Ltmp1: +; X86: xchgw %ax, %ax +; X86: xchgw %ax, %ax +; X86: nop +; X86-NOT: calll __fentry__ +; X86: retl +} + +attributes #0 = { "fentry-call"="true" "mrecord-mcount" } +attributes #1 = { "fentry-call"="true" "mnop-mcount" "mrecord-mcount" } diff --git a/llvm/test/CodeGen/X86/mrecord-mcount-02.ll b/llvm/test/CodeGen/X86/mrecord-mcount-02.ll new file mode 100644 index 0000000000000..2ee317c77a703 --- /dev/null +++ b/llvm/test/CodeGen/X86/mrecord-mcount-02.ll @@ -0,0 +1,11 @@ +; RUN: not --crash llc %s -mtriple=x86_64-linux-gnu -o - 2>&1 | FileCheck %s +; RUN: not --crash llc %s -mtriple=i686-linux-gnu -o - 2>&1 | FileCheck %s +; +; CHECK: LLVM ERROR: mrecord-mcount only supported with fentry-call + +define void @test1() #0 { +entry: + ret void +} + +attributes #0 = { "instrument-function-entry-inlined"="mcount" "mrecord-mcount" } >From 1c2d64d221cdaed84aaea6daaefb82bf69142d36 Mon Sep 17 00:00:00 2001 From: Paul Murphy <[email protected]> Date: Wed, 4 Mar 2026 08:47:16 -0600 Subject: [PATCH 2/3] [clang] enable -mnop-mcount -mrecord-mcount for x86 These are gated by -mfentry. --- clang/lib/Driver/ToolChains/Clang.cpp | 6 ++++-- clang/test/CodeGen/mnop-mcount.c | 16 ++++++++++++++++ clang/test/CodeGen/mrecord-mcount.c | 16 ++++++++++++++++ clang/test/Driver/mcount.c | 5 ++--- 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index d42af0b16a1eb..eb8cf99f401c5 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7272,14 +7272,16 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, << A->getAsString(Args) << TripleStr; } if (Arg *A = Args.getLastArg(options::OPT_mnop_mcount)) { - if (Arch == llvm::Triple::systemz) + if (Arch == llvm::Triple::systemz || + (TC.getTriple().isX86() && TC.getTriple().isOSBinFormatELF())) A->render(Args, CmdArgs); else D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args) << TripleStr; } if (Arg *A = Args.getLastArg(options::OPT_mrecord_mcount)) { - if (Arch == llvm::Triple::systemz) + if (Arch == llvm::Triple::systemz || + (TC.getTriple().isX86() && TC.getTriple().isOSBinFormatELF())) A->render(Args, CmdArgs); else D.Diag(diag::err_drv_unsupported_opt_for_target) diff --git a/clang/test/CodeGen/mnop-mcount.c b/clang/test/CodeGen/mnop-mcount.c index ebb21cc560e37..9455043b0d4e3 100644 --- a/clang/test/CodeGen/mnop-mcount.c +++ b/clang/test/CodeGen/mnop-mcount.c @@ -6,6 +6,22 @@ // RUN: %s 2>&1 | FileCheck -check-prefix=NOPG %s // RUN: %clang_cc1 -mnop-mcount -triple s390x-ibm-linux -emit-llvm -o - %s \ // RUN: 2>&1 | FileCheck -check-prefix=NOPG %s +// RUN: %clang_cc1 -pg -mfentry -mnop-mcount -triple x86_64-unknown-linux -emit-llvm \ +// RUN: -o - %s 2>&1 | FileCheck %s +// RUN: not %clang_cc1 -pg -mnop-mcount -triple x86_64-unknown-linux -emit-llvm -o - \ +// RUN: %s 2>&1 | FileCheck -check-prefix=NOMFENTRY %s +// RUN: %clang_cc1 -mfentry -mnop-mcount -triple x86_64-unknown-linux -emit-llvm -o - \ +// RUN: %s 2>&1 | FileCheck -check-prefix=NOPG %s +// RUN: %clang_cc1 -mnop-mcount -triple x86_64-unknown-linux -emit-llvm -o - %s \ +// RUN: 2>&1 | FileCheck -check-prefix=NOPG %s +// RUN: %clang_cc1 -pg -mfentry -mnop-mcount -triple i686-unknown-linux -emit-llvm \ +// RUN: -o - %s 2>&1 | FileCheck %s +// RUN: not %clang_cc1 -pg -mnop-mcount -triple i686-unknown-linux -emit-llvm -o - \ +// RUN: %s 2>&1 | FileCheck -check-prefix=NOMFENTRY %s +// RUN: %clang_cc1 -mfentry -mnop-mcount -triple i686-unknown-linux -emit-llvm -o - \ +// RUN: %s 2>&1 | FileCheck -check-prefix=NOPG %s +// RUN: %clang_cc1 -mnop-mcount -triple i686-unknown-linux -emit-llvm -o - %s \ +// RUN: 2>&1 | FileCheck -check-prefix=NOPG %s int foo(void) { return 0; diff --git a/clang/test/CodeGen/mrecord-mcount.c b/clang/test/CodeGen/mrecord-mcount.c index 292a807073cef..f00b4594f5d8e 100644 --- a/clang/test/CodeGen/mrecord-mcount.c +++ b/clang/test/CodeGen/mrecord-mcount.c @@ -6,6 +6,22 @@ // RUN: %s 2>&1 | FileCheck -check-prefix=NOPG %s // RUN: %clang_cc1 -mrecord-mcount -triple s390x-ibm-linux -emit-llvm -o - %s \ // RUN: 2>&1 | FileCheck -check-prefix=NOPG %s +// RUN: %clang_cc1 -pg -mfentry -mrecord-mcount -triple x86_64-unknown-linux -emit-llvm \ +// RUN: -o - %s 2>&1 | FileCheck %s +// RUN: not %clang_cc1 -pg -mrecord-mcount -triple x86_64-unknown-linux -emit-llvm -o - \ +// RUN: %s 2>&1 | FileCheck -check-prefix=NOMFENTRY %s +// RUN: %clang_cc1 -mfentry -mrecord-mcount -triple x86_64-unknown-linux -emit-llvm -o - \ +// RUN: %s 2>&1 | FileCheck -check-prefix=NOPG %s +// RUN: %clang_cc1 -mrecord-mcount -triple x86_64-unknown-linux -emit-llvm -o - %s \ +// RUN: 2>&1 | FileCheck -check-prefix=NOPG %s +// RUN: %clang_cc1 -pg -mfentry -mrecord-mcount -triple i686-unknown-linux -emit-llvm \ +// RUN: -o - %s 2>&1 | FileCheck %s +// RUN: not %clang_cc1 -pg -mrecord-mcount -triple i686-unknown-linux -emit-llvm -o - \ +// RUN: %s 2>&1 | FileCheck -check-prefix=NOMFENTRY %s +// RUN: %clang_cc1 -mfentry -mrecord-mcount -triple i686-unknown-linux -emit-llvm -o - \ +// RUN: %s 2>&1 | FileCheck -check-prefix=NOPG %s +// RUN: %clang_cc1 -mrecord-mcount -triple i686-unknown-linux -emit-llvm -o - %s \ +// RUN: 2>&1 | FileCheck -check-prefix=NOPG %s int foo(void) { return 0; diff --git a/clang/test/Driver/mcount.c b/clang/test/Driver/mcount.c index 70f554745b9c3..d50055f90344e 100644 --- a/clang/test/Driver/mcount.c +++ b/clang/test/Driver/mcount.c @@ -1,12 +1,11 @@ // RUN: %clang --target=s390x -c -### %s -mnop-mcount -mrecord-mcount 2>&1 | FileCheck %s +// RUN: %clang --target=x86_64 -c -### %s -mnop-mcount -mrecord-mcount 2>&1 | FileCheck %s +// RUN: %clang --target=i686 -c -### %s -mnop-mcount -mrecord-mcount 2>&1 | FileCheck %s // CHECK: "-mnop-mcount" // CHECK: "-mrecord-mcount" -// RUN: not %clang --target=x86_64 -c -### %s -mnop-mcount -mrecord-mcount 2>&1 | FileCheck --check-prefix=ERR1 %s // RUN: not %clang --target=aarch64 -c -### %s -mnop-mcount -mrecord-mcount 2>&1 | FileCheck --check-prefix=ERR2 %s -// ERR1: error: unsupported option '-mnop-mcount' for target 'x86_64' -// ERR1: error: unsupported option '-mrecord-mcount' for target 'x86_64' // ERR2: error: unsupported option '-mnop-mcount' for target 'aarch64' // ERR2: error: unsupported option '-mrecord-mcount' for target 'aarch64' >From 9746dfec9c36ebc9a39e5ec4bc42f5def81081ae Mon Sep 17 00:00:00 2001 From: Paul Murphy <[email protected]> Date: Wed, 27 May 2026 13:42:33 -0500 Subject: [PATCH 3/3] [LLVM][CodeGen][X86] Support larger NOOPs on x86 when available The mnop-mcount attribute benefits from using a single no-op instruction instead of 3 when supported. Update codegen to support single instruction 3-10 byte NOOPs. --- llvm/lib/Target/X86/X86MCInstLower.cpp | 21 +++++++++++---------- llvm/test/CodeGen/X86/mnop-mcount-01.ll | 9 +++++++++ llvm/test/CodeGen/X86/mrecord-mcount-01.ll | 17 +++++++++++++++++ 3 files changed, 37 insertions(+), 10 deletions(-) diff --git a/llvm/lib/Target/X86/X86MCInstLower.cpp b/llvm/lib/Target/X86/X86MCInstLower.cpp index 76610e2418511..3a04186d6d425 100644 --- a/llvm/lib/Target/X86/X86MCInstLower.cpp +++ b/llvm/lib/Target/X86/X86MCInstLower.cpp @@ -671,9 +671,8 @@ static unsigned emitNop(MCStreamer &OS, unsigned NumBytes, // target cpu. 15-bytes is the longest single NOP instruction, but some // platforms can't decode the longest forms efficiently. unsigned MaxNopLength = 1; + unsigned BaseReg = X86::RAX; if (Subtarget->is64Bit()) { - // FIXME: We can use NOOPL on 32-bit targets with FeatureNOPL, but the - // IndexReg/BaseReg below need to be updated. if (Subtarget->hasFeature(X86::TuningFast7ByteNOP)) MaxNopLength = 7; else if (Subtarget->hasFeature(X86::TuningFast15ByteNOP)) @@ -682,16 +681,18 @@ static unsigned emitNop(MCStreamer &OS, unsigned NumBytes, MaxNopLength = 11; else MaxNopLength = 10; - } if (Subtarget->is32Bit()) + } else if (Subtarget->is32Bit() && Subtarget->hasFeature(X86::FeatureNOPL)) { + BaseReg = X86::EAX; + MaxNopLength = 10; + } else if (Subtarget->is32Bit()) MaxNopLength = 2; // Cap a single nop emission at the profitable value for the target NumBytes = std::min(NumBytes, MaxNopLength); unsigned NopSize; - unsigned Opc, BaseReg, ScaleVal, IndexReg, Displacement, SegmentReg; + unsigned Opc, ScaleVal, IndexReg, Displacement, SegmentReg; IndexReg = Displacement = SegmentReg = 0; - BaseReg = X86::RAX; ScaleVal = 1; switch (NumBytes) { case 0: @@ -718,13 +719,13 @@ static unsigned emitNop(MCStreamer &OS, unsigned NumBytes, NopSize = 5; Opc = X86::NOOPL; Displacement = 8; - IndexReg = X86::RAX; + IndexReg = BaseReg; break; case 6: NopSize = 6; Opc = X86::NOOPW; Displacement = 8; - IndexReg = X86::RAX; + IndexReg = BaseReg; break; case 7: NopSize = 7; @@ -735,19 +736,19 @@ static unsigned emitNop(MCStreamer &OS, unsigned NumBytes, NopSize = 8; Opc = X86::NOOPL; Displacement = 512; - IndexReg = X86::RAX; + IndexReg = BaseReg; break; case 9: NopSize = 9; Opc = X86::NOOPW; Displacement = 512; - IndexReg = X86::RAX; + IndexReg = BaseReg; break; default: NopSize = 10; Opc = X86::NOOPW; Displacement = 512; - IndexReg = X86::RAX; + IndexReg = BaseReg; SegmentReg = X86::CS; break; } diff --git a/llvm/test/CodeGen/X86/mnop-mcount-01.ll b/llvm/test/CodeGen/X86/mnop-mcount-01.ll index ede06b74bcc8e..4e99774f1d08e 100644 --- a/llvm/test/CodeGen/X86/mnop-mcount-01.ll +++ b/llvm/test/CodeGen/X86/mnop-mcount-01.ll @@ -2,6 +2,8 @@ ; RUN: | FileCheck --check-prefixes=X64 %s ; RUN: llc %s -mtriple=i686-linux-gnu -o - -verify-machineinstrs \ ; RUN: | FileCheck --check-prefix=X86 %s +; RUN: llc %s -mtriple=i686-linux-gnu -mcpu=pentium_pro -o - -verify-machineinstrs \ +; RUN: | FileCheck --check-prefix=PPRO %s define void @test1() #0 { entry: @@ -13,6 +15,9 @@ entry: ; X86-LABEL: @test1 ; X86: calll __fentry__ ; X86: retl +; PPRO-LABEL: @test1 +; PPRO: calll __fentry__ +; PPRO: retl } define void @test2() #1 { @@ -29,6 +34,10 @@ entry: ; X86: xchgw %ax, %ax ; X86: nop ; X86: retl +; PPRO-LABEL: @test2 +; PPRO: nopl 8(%eax,%eax) +; PPRO-NOT: calll __fentry__ +; PPRO: retl } attributes #0 = { "fentry-call"="true" } diff --git a/llvm/test/CodeGen/X86/mrecord-mcount-01.ll b/llvm/test/CodeGen/X86/mrecord-mcount-01.ll index cc27f1eb791ad..829b111a87504 100644 --- a/llvm/test/CodeGen/X86/mrecord-mcount-01.ll +++ b/llvm/test/CodeGen/X86/mrecord-mcount-01.ll @@ -2,6 +2,8 @@ ; RUN: | FileCheck --check-prefix=X64 %s ; RUN: llc %s -mtriple=i686-linux-gnu -o - -verify-machineinstrs \ ; RUN: | FileCheck --check-prefix=X86 %s +; RUN: llc %s -mtriple=i686-linux-gnu -mcpu=pentium_pro -o - -verify-machineinstrs \ +; RUN: | FileCheck --check-prefix=PPRO %s define void @test1() #0 { entry: @@ -21,6 +23,13 @@ entry: ; X86: .Ltmp0: ; X86: calll __fentry__ ; X86: retl +; PPRO-LABEL: test1: +; PPRO: .section __mcount_loc,"a",@progbits +; PPRO: .long .Ltmp0 +; PPRO: .text +; PPRO: .Ltmp0: +; PPRO: calll __fentry__ +; PPRO: retl } define void @test2() #1 { @@ -45,6 +54,14 @@ entry: ; X86: nop ; X86-NOT: calll __fentry__ ; X86: retl +; PPRO-LABEL: test2: +; PPRO: .section __mcount_loc,"a",@progbits +; PPRO: .long .Ltmp1 +; PPRO: .text +; PPRO: .Ltmp1: +; PPRO: nopl 8(%eax,%eax) +; PPRO-NOT: calll __fentry__ +; PPRO: retl } attributes #0 = { "fentry-call"="true" "mrecord-mcount" } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
