[llvm] [JITLink] Add GOT indirection optimization for SystemZ (PR #171919)

Ulrich Weigand via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 12 04:15:11 PST 2025


================
@@ -106,11 +106,51 @@ const char *getEdgeKindName(Edge::Kind R) {
     return "RequestGOTAndTransformToDelta32dbl";
   case RequestTLSDescInGOTAndTransformToDelta64FromGOT:
     return "RequestTLSDescInGOTAndTransformToDelta64FromGOT";
+  case Delta32dblToPtrJumpStubBypassable:
+    return "Delta32dblToPtrJumpStubBypassable";
   default:
     return getGenericEdgeKindName(static_cast<Edge::Kind>(R));
   }
 }
 
+Error optimizeGOTAndStubAccesses(LinkGraph &G) {
+  LLVM_DEBUG(dbgs() << "Optimizing GOT entries and stubs:\n");
+
+  for (auto *B : G.blocks())
+    for (auto &E : B->edges()) {
+      if (E.getKind() == systemz::Delta32dblToPtrJumpStubBypassable) {
+        auto &StubBlock = E.getTarget().getBlock();
+        assert(StubBlock.getSize() == sizeof(Pointer64JumpStubContent) &&
+               "Stub block should be stub sized");
+        assert(StubBlock.edges_size() == 1 &&
+               "Stub block should only have one outgoing edge");
+
+        auto &GOTBlock = StubBlock.edges().begin()->getTarget().getBlock();
+        assert(GOTBlock.getSize() == G.getPointerSize() &&
+               "GOT block should be pointer sized");
+        assert(GOTBlock.edges_size() == 1 &&
+               "GOT block should only have one outgoing edge");
+
+        auto &GOTTarget = GOTBlock.edges().begin()->getTarget();
+        orc::ExecutorAddr EdgeAddr = B->getAddress() + E.getOffset();
+        orc::ExecutorAddr TargetAddr = GOTTarget.getAddress();
+
+        int64_t Displacement = TargetAddr - EdgeAddr;
+        if (isInt<32>(Displacement)) {
----------------
uweigand wrote:

Also, this should be `isInt<33>` here.

https://github.com/llvm/llvm-project/pull/171919


More information about the llvm-commits mailing list