diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h b/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h --- a/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/ppc64.h @@ -204,9 +204,11 @@ if (isExternal) { E.setKind(ppc64::CallBranchDeltaRestoreTOC); this->StubKind = LongBranchSaveR2; + // FIXME: We assume the addend to the external target is zero. It's + // quite unusual that the addend of an external target to be non-zero as + // if we have known the layout of the external object. E.setTarget(this->getEntryForTarget(G, E.getTarget())); - // We previously set branching to local entry. Now reverse that - // operation. + // Addend to the stub is zero. E.setAddend(0); } else // TODO: There are cases a local function call need a call stub. diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp --- a/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp +++ b/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; diff --git a/llvm/test/ExecutionEngine/JITLink/ppc64/ppc64-rel24-non-zero-addend.test b/llvm/test/ExecutionEngine/JITLink/ppc64/ppc64-rel24-non-zero-addend.test --- a/llvm/test/ExecutionEngine/JITLink/ppc64/ppc64-rel24-non-zero-addend.test +++ b/llvm/test/ExecutionEngine/JITLink/ppc64/ppc64-rel24-non-zero-addend.test @@ -1,7 +1,4 @@ -# 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: Addend == 0 && "Addend is expected to be 0 for a function call" -# +# RUN: llvm-jitlink -noexec %t.o 2>&1 # The object is generated from llvm/test/ExecutionEngine/MCJIT/test-global-ctors.ll, # containing an R_PPC64_REL24 whose addend is not zero.