mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[SystemZ] Add support for fentry.
SystemZAsmPrinter now properly emits function calls to __fentry__. Review: Ulrich Weigand llvm-svn: 370743
This commit is contained in:
parent
dbd4d84623
commit
e89d1ea35f
@ -501,6 +501,10 @@ void SystemZAsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
||||
}
|
||||
break;
|
||||
|
||||
case TargetOpcode::FENTRY_CALL:
|
||||
LowerFENTRY_CALL(*MI, Lower);
|
||||
return;
|
||||
|
||||
case TargetOpcode::STACKMAP:
|
||||
LowerSTACKMAP(*MI);
|
||||
return;
|
||||
@ -546,6 +550,16 @@ static unsigned EmitNop(MCContext &OutContext, MCStreamer &OutStreamer,
|
||||
}
|
||||
}
|
||||
|
||||
void SystemZAsmPrinter::LowerFENTRY_CALL(const MachineInstr &MI,
|
||||
SystemZMCInstLower &Lower) {
|
||||
MCContext &Ctx = MF->getContext();
|
||||
MCSymbol *fentry = Ctx.getOrCreateSymbol("__fentry__");
|
||||
const MCSymbolRefExpr *Op =
|
||||
MCSymbolRefExpr::create(fentry, MCSymbolRefExpr::VK_PLT, Ctx);
|
||||
OutStreamer->EmitInstruction(MCInstBuilder(SystemZ::BRASL)
|
||||
.addReg(SystemZ::R0D).addExpr(Op), getSubtargetInfo());
|
||||
}
|
||||
|
||||
void SystemZAsmPrinter::LowerSTACKMAP(const MachineInstr &MI) {
|
||||
const SystemZInstrInfo *TII =
|
||||
static_cast<const SystemZInstrInfo *>(MF->getSubtarget().getInstrInfo());
|
||||
|
@ -46,6 +46,7 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
void LowerFENTRY_CALL(const MachineInstr &MI, SystemZMCInstLower &MCIL);
|
||||
void LowerSTACKMAP(const MachineInstr &MI);
|
||||
void LowerPATCHPOINT(const MachineInstr &MI, SystemZMCInstLower &Lower);
|
||||
};
|
||||
|
29
test/CodeGen/SystemZ/fentry-insertion.ll
Normal file
29
test/CodeGen/SystemZ/fentry-insertion.ll
Normal file
@ -0,0 +1,29 @@
|
||||
; 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: brasl %r0, __fentry__
|
||||
; CHECK-NOT: mcount
|
||||
; CHECK: br %r14
|
||||
}
|
||||
|
||||
define void @test2() #1 {
|
||||
entry:
|
||||
br label %bb1
|
||||
bb1:
|
||||
call void @address_taken(i64 ptrtoint (i8* blockaddress(@test2, %bb1) to i64), i32 512)
|
||||
ret void
|
||||
|
||||
; CHECK-LABEL: @test2
|
||||
; CHECK: brasl %r0, __fentry__
|
||||
; CHECK-NOT: mcount
|
||||
; CHECK: br %r14
|
||||
}
|
||||
|
||||
declare void @address_taken(i64, i32) local_unnamed_addr
|
||||
attributes #0 = { "fentry-call"="true" }
|
||||
attributes #1 = { inlinehint minsize noredzone nounwind optsize sspstrong "fentry-call"="true" }
|
Loading…
Reference in New Issue
Block a user