[PATCH] D158708: [JITLink][PowerPC] Fix incorrect assertion of addend for R_PPC64_REL24

Kai Luo via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 24 01:10:37 PDT 2023


lkail updated this revision to Diff 553029.

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D158708

Files:
  llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h
  llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp
  llvm/test/ExecutionEngine/JITLink/ppc64/ppc64-rel24-non-zero-addend.test


Index: llvm/test/ExecutionEngine/JITLink/ppc64/ppc64-rel24-non-zero-addend.test
===================================================================
--- llvm/test/ExecutionEngine/JITLink/ppc64/ppc64-rel24-non-zero-addend.test
+++ llvm/test/ExecutionEngine/JITLink/ppc64/ppc64-rel24-non-zero-addend.test
@@ -1,7 +1,6 @@
 # REQUIRES: asserts
 # RUN: yaml2obj %S/Inputs/rel24-non-zero-addend.yaml -o %t.o
-# RUN: not --crash llvm-jitlink -noexec %t.o 2>&1 | FileCheck %s
-# CHECK: Assertion `Addend == 0 && "Addend is expected to be 0 for a function call"' failed
+# RUN: llvm-jitlink -noexec %t.o
 #
 # The object is generated from llvm/test/ExecutionEngine/MCJIT/test-global-ctors.ll,
 # containing an R_PPC64_REL24 whose addend is not zero.
Index: llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp
===================================================================
--- llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp
+++ llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp
@@ -346,9 +346,13 @@
       break;
     case ELF::R_PPC64_REL24:
       Kind = ppc64::RequestCall;
-      assert(Addend == 0 && "Addend is expected to be 0 for a function call");
-      // We assume branching to local entry, will reverse the addend if not.
-      Addend = ELF::decodePPC64LocalEntryOffset((*ObjSymbol)->st_other);
+      // Determining a target is external or not is deferred in PostPrunePass.
+      // We assume branching to local entry by default, since in PostPrunePass,
+      // we don't have any context to determine LocalEntryOffset. If it finally
+      // turns out to be an external call, we'll have a stub for the external
+      // target, the target of this edge will be the stub and its addend will be
+      // set 0.
+      Addend += ELF::decodePPC64LocalEntryOffset((*ObjSymbol)->st_other);
       break;
     case ELF::R_PPC64_REL64:
       Kind = ppc64::Delta64;
Index: llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h
===================================================================
--- llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h
+++ llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h
@@ -205,8 +205,6 @@
         E.setKind(ppc64::CallBranchDeltaRestoreTOC);
         this->StubKind = LongBranchSaveR2;
         E.setTarget(this->getEntryForTarget(G, E.getTarget()));
-        // We previously set branching to local entry. Now reverse that
-        // operation.
         E.setAddend(0);
       } else
         // TODO: There are cases a local function call need a call stub.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D158708.553029.patch
Type: text/x-patch
Size: 2489 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230824/418945f6/attachment.bin>


More information about the llvm-commits mailing list