[PATCH] D119557: [Systemz/z/OS] Centralize emitting the call type information

Kai Nacke via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Feb 14 09:01:31 PST 2022


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG62ba528a6869: [Systemz/z/OS] Centralize emitting the call type information (authored by Kai).

Changed prior to commit:
  https://reviews.llvm.org/D119557?vs=407925&id=408444#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D119557/new/

https://reviews.llvm.org/D119557

Files:
  llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
  llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
  llvm/test/CodeGen/SystemZ/call-zos-02.ll


Index: llvm/test/CodeGen/SystemZ/call-zos-02.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/SystemZ/call-zos-02.ll
@@ -0,0 +1,17 @@
+; RUN: llc --mtriple=s390x-ibm-zos --show-mc-encoding < %s | FileCheck %s
+
+define internal signext i32 @caller() {
+entry:
+  ret i32 0
+}
+
+
+define hidden signext i32 @caller2() {
+entry:
+; CHECK-LABEL:   caller2:
+; CHECK:         brasl 7, caller at PLT   * encoding: [0xc0,0x75,A,A,A,A]
+; CHECK-NEXT:    * fixup A - offset: 2, value: caller at PLT+2, kind: FK_390_PC32DBL
+; CHECK-NEXT:    bcr     0, 3          * encoding: [0x07,0x03]
+  %call = call signext i32 @caller()
+  ret i32 %call
+}
Index: llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
===================================================================
--- llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
+++ llvm/lib/Target/SystemZ/SystemZAsmPrinter.h
@@ -33,6 +33,18 @@
     return static_cast<SystemZTargetStreamer *>(TS);
   }
 
+  /// Call type information for XPLINK.
+  enum class CallType {
+    BASR76 = 0,   // b'x000' == BASR  r7,r6
+    BRAS7 = 1,    // b'x001' == BRAS  r7,ep
+    RESVD_2 = 2,  // b'x010'
+    BRASL7 = 3,   // b'x011' == BRASL r7,ep
+    RESVD_4 = 4,  // b'x100'
+    RESVD_5 = 5,  // b'x101'
+    BALR1415 = 6, // b'x110' == BALR  r14,r15
+    BASR33 = 7,   // b'x111' == BASR  r3,r3
+  };
+
 public:
   SystemZAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer)
       : AsmPrinter(TM, std::move(Streamer)), SM(*this) {}
@@ -54,6 +66,7 @@
   void emitFunctionEntryLabel() override;
 
 private:
+  void emitCallInformation(CallType CT);
   void LowerFENTRY_CALL(const MachineInstr &MI, SystemZMCInstLower &MCIL);
   void LowerSTACKMAP(const MachineInstr &MI);
   void LowerPATCHPOINT(const MachineInstr &MI, SystemZMCInstLower &Lower);
Index: llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
===================================================================
--- llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
+++ llvm/lib/Target/SystemZ/SystemZAsmPrinter.cpp
@@ -124,6 +124,18 @@
     .addImm(0);
 }
 
+// The XPLINK ABI requires that a no-op encoding the call type is emitted after
+// each call to a subroutine. This information can be used by the called
+// function to determine its entry point, e.g. for generating a backtrace. The
+// call type is encoded as a register number in the bcr instruction. See
+// enumeration CallType for the possible values.
+void SystemZAsmPrinter::emitCallInformation(CallType CT) {
+  EmitToStreamer(*OutStreamer,
+                 MCInstBuilder(SystemZ::BCRAsm)
+                     .addImm(0)
+                     .addReg(SystemZMC::GR64Regs[static_cast<unsigned>(CT)]));
+}
+
 void SystemZAsmPrinter::emitInstruction(const MachineInstr *MI) {
   SystemZMCInstLower Lower(MF->getContext(), *this);
   MCInst LoweredMI;
@@ -234,18 +246,14 @@
                        .addReg(SystemZ::R7D)
                        .addExpr(Lower.getExpr(MI->getOperand(0),
                                               MCSymbolRefExpr::VK_PLT)));
-    EmitToStreamer(
-        *OutStreamer,
-        MCInstBuilder(SystemZ::BCRAsm).addImm(0).addReg(SystemZ::R3D));
+    emitCallInformation(CallType::BRASL7);
     return;
 
   case SystemZ::CallBASR_XPLINK64:
     EmitToStreamer(*OutStreamer, MCInstBuilder(SystemZ::BASR)
                                      .addReg(SystemZ::R7D)
                                      .addReg(MI->getOperand(0).getReg()));
-    EmitToStreamer(
-        *OutStreamer,
-        MCInstBuilder(SystemZ::BCRAsm).addImm(0).addReg(SystemZ::R0D));
+    emitCallInformation(CallType::BASR76);
     return;
 
   case SystemZ::CallBRASL:


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D119557.408444.patch
Type: text/x-patch
Size: 3684 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220214/b1de5d0c/attachment.bin>


More information about the llvm-commits mailing list