[SystemZ] Recognize mrecord-mcount in backend

Emit the __mcount_loc section for all fentry calls.

Review: Ulrich Weigand
https://reviews.llvm.org/D71629
This commit is contained in:
Jonas Paulsson 2019-12-17 13:13:16 -08:00
parent 63e2aa5658
commit 6be1578895
4 changed files with 60 additions and 3 deletions

View File

@ -16,11 +16,13 @@
#include "SystemZConstantPoolValue.h"
#include "SystemZMCInstLower.h"
#include "TargetInfo/SystemZTargetInfo.h"
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/CodeGen/MachineModuleInfoImpls.h"
#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
#include "llvm/IR/Mangler.h"
#include "llvm/MC/MCExpr.h"
#include "llvm/MC/MCInstBuilder.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/MC/MCStreamer.h"
#include "llvm/Support/TargetRegistry.h"
@ -553,6 +555,16 @@ static unsigned EmitNop(MCContext &OutContext, MCStreamer &OutStreamer,
void SystemZAsmPrinter::LowerFENTRY_CALL(const MachineInstr &MI,
SystemZMCInstLower &Lower) {
MCContext &Ctx = MF->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, 8);
OutStreamer->PopSection();
OutStreamer->EmitLabel(DotSym);
}
if (MF->getFunction().hasFnAttribute("mnop-mcount")) {
EmitNop(Ctx, *OutStreamer, 6, getSubtargetInfo());
return;

View File

@ -347,9 +347,12 @@ public:
bool runOnMachineFunction(MachineFunction &MF) override {
const Function &F = MF.getFunction();
if (F.hasFnAttribute("mnop-mcount") &&
F.getFnAttribute("fentry-call").getValueAsString() != "true")
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");
}
Subtarget = &MF.getSubtarget<SystemZSubtarget>();
return SelectionDAGISel::runOnMachineFunction(MF);

View File

@ -0,0 +1,32 @@
; RUN: llc %s -mtriple=s390x-linux-gnu -mcpu=z10 -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: brasl %r0, __fentry__@PLT
; CHECK: br %r14
}
define void @test2() #1 {
entry:
ret void
; CHECK-LABEL: test2:
; CHECK: .section __mcount_loc,"a",@progbits
; CHECK: .quad .Ltmp1
; CHECK: .text
; CHECK: .Ltmp1:
; CHECK: brcl 0, .Ltmp2
; CHECK: .Ltmp2:
; CHECK: br %r14
}
attributes #0 = { "fentry-call"="true" "mrecord-mcount" }
attributes #1 = { "fentry-call"="true" "mnop-mcount" "mrecord-mcount" }

View File

@ -0,0 +1,10 @@
; RUN: not llc %s -mtriple=s390x-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" }