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 @@ -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. 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;