Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions clang/lib/Driver/ToolChains/Clang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6884,14 +6884,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_64() && 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_64() && TC.getTriple().isOSBinFormatELF()))
A->render(Args, CmdArgs);
else
D.Diag(diag::err_drv_unsupported_opt_for_target)
Expand Down
8 changes: 8 additions & 0 deletions clang/test/CodeGen/mnop-mcount.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@
// 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-ibm-linux -emit-llvm \
// RUN: -o - %s 2>&1 | FileCheck %s
// RUN: not %clang_cc1 -pg -mnop-mcount -triple x86_64-ibm-linux -emit-llvm -o - \
// RUN: %s 2>&1 | FileCheck -check-prefix=NOMFENTRY %s
// RUN: %clang_cc1 -mfentry -mnop-mcount -triple x86_64-ibm-linux -emit-llvm -o - \
// RUN: %s 2>&1 | FileCheck -check-prefix=NOPG %s
// RUN: %clang_cc1 -mnop-mcount -triple x86_64-ibm-linux -emit-llvm -o - %s \
// RUN: 2>&1 | FileCheck -check-prefix=NOPG %s

int foo(void) {
return 0;
Expand Down
8 changes: 8 additions & 0 deletions clang/test/CodeGen/mrecord-mcount.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@
// 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-ibm-linux -emit-llvm \
// RUN: -o - %s 2>&1 | FileCheck %s
// RUN: not %clang_cc1 -pg -mrecord-mcount -triple x86_64-ibm-linux -emit-llvm -o - \
// RUN: %s 2>&1 | FileCheck -check-prefix=NOMFENTRY %s
// RUN: %clang_cc1 -mfentry -mrecord-mcount -triple x86_64-ibm-linux -emit-llvm -o - \
// RUN: %s 2>&1 | FileCheck -check-prefix=NOPG %s
// RUN: %clang_cc1 -mrecord-mcount -triple x86_64-ibm-linux -emit-llvm -o - %s \
// RUN: 2>&1 | FileCheck -check-prefix=NOPG %s

int foo(void) {
return 0;
Expand Down
4 changes: 1 addition & 3 deletions clang/test/Driver/mcount.c
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
// 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

// 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'
14 changes: 11 additions & 3 deletions llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,11 +179,19 @@ namespace {
bool runOnMachineFunction(MachineFunction &MF) override {
// Reset the subtarget each time through.
Subtarget = &MF.getSubtarget<X86Subtarget>();
IndirectTlsSegRefs = MF.getFunction().hasFnAttribute(
"indirect-tls-seg-refs");
const Function &F = MF.getFunction();

IndirectTlsSegRefs = F.hasFnAttribute("indirect-tls-seg-refs");

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");
}

// OptFor[Min]Size are used in pattern predicates that isel is matching.
OptForMinSize = MF.getFunction().hasMinSize();
OptForMinSize = F.hasMinSize();
return SelectionDAGISel::runOnMachineFunction(MF);
}

Expand Down
18 changes: 18 additions & 0 deletions llvm/lib/Target/X86/X86MCInstLower.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand Down Expand Up @@ -885,6 +887,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);

Expand Down
26 changes: 26 additions & 0 deletions llvm/test/CodeGen/X86/mnop-mcount-01.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
; RUN: llc %s -mtriple=x86_64-linux-gnu -o - -verify-machineinstrs \
; RUN: | FileCheck %s

define void @test1() #0 {
entry:
ret void

; CHECK-LABEL: @test1
; CHECK: callq __fentry__
; CHECK-NOT: nopl 8(%rax,%rax)
; CHECK: retq
}

define void @test2() #1 {
entry:
ret void

; CHECK-LABEL: @test2
; CHECK-NOT: callq __fentry__
; CHECK: nopl 8(%rax,%rax)
; CHECK: retq
}

attributes #0 = { "fentry-call"="true" }
attributes #1 = { "fentry-call"="true" "mnop-mcount" }

10 changes: 10 additions & 0 deletions llvm/test/CodeGen/X86/mnop-mcount-02.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
; RUN: not --crash llc %s -mtriple=x86_64-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" }
32 changes: 32 additions & 0 deletions llvm/test/CodeGen/X86/mrecord-mcount-01.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
; RUN: llc %s -mtriple=x86_64-linux-gnu -o - -verify-machineinstrs \
; RUN: | FileCheck %s

define void @test1() #0 {
entry:
ret void

; CHECK-LABEL: test1:
; CHECK: .section __mcount_loc,"a",@progbits
; CHECK: .quad .Ltmp0
; CHECK: .text
; CHECK: .Ltmp0:
; CHECK: callq __fentry__
; CHECK: retq
}

define void @test2() #1 {
entry:
ret void

; CHECK-LABEL: test2:
; CHECK: .section __mcount_loc,"a",@progbits
; CHECK: .quad .Ltmp1
; CHECK: .text
; CHECK: .Ltmp1:
; CHECK: nopl 8(%rax,%rax)
; CHECK-NOT: callq __fentry__
; CHECK: retq
}

attributes #0 = { "fentry-call"="true" "mrecord-mcount" }
attributes #1 = { "fentry-call"="true" "mnop-mcount" "mrecord-mcount" }
10 changes: 10 additions & 0 deletions llvm/test/CodeGen/X86/mrecord-mcount-02.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
; RUN: not --crash llc %s -mtriple=x86_64-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" }