Skip to content

Commit

Permalink
[ORC] Fix weak hidden symbols failure on PPC with runtimedyld
Browse files Browse the repository at this point in the history
Fix "JIT session error: Symbols not found: [ DW.ref.__gxx_personality_v0 ] error" which happens when trying to use exceptions on ppc linux. To do this, it expands AutoClaimSymbols option in RTDyldObjectLinkingLayer to also claim weak symbols before they are tried to be resovled. In ppc linux, DW.ref symbols is emitted as weak hidden symbols in the later stage of MC pipeline. This means when using IRLayer (i.e. LLJIT), IRLayer will not claim responsibility for such symbols and RuntimeDyld will skip defining this symbol even though it couldn't resolve corresponding external symbol.

Reviewed By: sgraenitz

Differential Revision: https://reviews.llvm.org/D129175
  • Loading branch information
sunho committed Jul 28, 2022
1 parent 0cc3c18 commit 72ea1a7
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,6 @@ extern "C" int throw_exception() {
// FIXME: Re-enable the excluded target triples.
const clang::CompilerInstance *CI = Interp->getCompilerInstance();
const llvm::Triple &Triple = CI->getASTContext().getTargetInfo().getTriple();
// FIXME: PPC fails due to `Symbols not found: [DW.ref.__gxx_personality_v0]`
// The current understanding is that the JIT should emit this symbol if it was
// not (eg. the way passing clang -fPIC does it).
if (Triple.isPPC())
return;

// FIXME: ARM fails due to `Not implemented relocation type!`
if (Triple.isARM())
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/ExecutionEngine/Orc/LLJIT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -746,6 +746,11 @@ LLJIT::createObjectLinkingLayer(LLJITBuilderState &S, ExecutionSession &ES) {
Layer->setAutoClaimResponsibilityForObjectSymbols(true);
}

if (S.JTMB->getTargetTriple().isOSBinFormatELF() &&
(S.JTMB->getTargetTriple().getArch() == Triple::ArchType::ppc64 ||
S.JTMB->getTargetTriple().getArch() == Triple::ArchType::ppc64le))
Layer->setAutoClaimResponsibilityForObjectSymbols(true);

// FIXME: Explicit conversion to std::unique_ptr<ObjectLayer> added to silence
// errors from some GCC / libstdc++ bots. Remove this conversion (i.e.
// just return ObjLinkingLayer) once those bots are upgraded.
Expand Down
35 changes: 35 additions & 0 deletions llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ void RTDyldObjectLinkingLayer::emit(
// filter these later.
auto InternalSymbols = std::make_shared<std::set<StringRef>>();
{
SymbolFlagsMap ExtraSymbolsToClaim;
for (auto &Sym : (*Obj)->symbols()) {

// Skip file symbols.
Expand All @@ -128,6 +129,33 @@ void RTDyldObjectLinkingLayer::emit(
return;
}

// Try to claim responsibility of weak symbols
// if AutoClaimObjectSymbols flag is set.
if (AutoClaimObjectSymbols &&
(*SymFlagsOrErr & object::BasicSymbolRef::SF_Weak)) {
auto SymName = Sym.getName();
if (!SymName) {
ES.reportError(SymName.takeError());
R->failMaterialization();
return;
}

// Already included in responsibility set, skip it
SymbolStringPtr SymbolName = ES.intern(*SymName);
if (R->getSymbols().count(SymbolName))
continue;

auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym);
if (!SymFlags) {
ES.reportError(SymFlags.takeError());
R->failMaterialization();
return;
}

ExtraSymbolsToClaim[SymbolName] = *SymFlags;
continue;
}

// Don't include symbols that aren't global.
if (!(*SymFlagsOrErr & object::BasicSymbolRef::SF_Global)) {
if (auto SymName = Sym.getName())
Expand All @@ -139,6 +167,13 @@ void RTDyldObjectLinkingLayer::emit(
}
}
}

if (!ExtraSymbolsToClaim.empty()) {
if (auto Err = R->defineMaterializing(ExtraSymbolsToClaim)) {
ES.reportError(std::move(Err));
R->failMaterialization();
}
}
}

auto MemMgr = GetMemoryManager();
Expand Down

0 comments on commit 72ea1a7

Please sign in to comment.