]> granicus.if.org Git - llvm/commitdiff
[SystemZ] Add support for fentry.
authorJonas Paulsson <paulsson@linux.vnet.ibm.com>
Tue, 3 Sep 2019 11:21:12 +0000 (11:21 +0000)
committerJonas Paulsson <paulsson@linux.vnet.ibm.com>
Tue, 3 Sep 2019 11:21:12 +0000 (11:21 +0000)
SystemZAsmPrinter now properly emits function calls to __fentry__.

Review: Ulrich Weigand

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@370743 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SystemZ/SystemZAsmPrinter.cpp
lib/Target/SystemZ/SystemZAsmPrinter.h
test/CodeGen/SystemZ/fentry-insertion.ll [new file with mode: 0644]

index ef378e4ade7a5e3c772b0df3ebfaaf4fc6259ada..f03ed2014e4a956643af188e22554fe8fc436e1d 100644 (file)
@@ -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());
index aa5d3ca78e613d6474a2ff2b51be8906636b2446..d01a17c2ebe250e817b8fbaaaa0c9e7f3c74851f 100644 (file)
@@ -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);
 };
diff --git a/test/CodeGen/SystemZ/fentry-insertion.ll b/test/CodeGen/SystemZ/fentry-insertion.ll
new file mode 100644 (file)
index 0000000..63632d5
--- /dev/null
@@ -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" }