Index: clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp =================================================================== --- clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp +++ clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp @@ -98,11 +98,6 @@ // 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()) Index: llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h =================================================================== --- llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h +++ llvm/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h @@ -118,6 +118,18 @@ return *this; } + /// If set, this RTDyldObjectLinkingLayer instance will claim responsibility + /// for any weak hidden symbols provided by a given object file that were not + /// already in the MaterializationResponsibility instance. Setting this flag + /// allows to expose certain weak hidden symbols inserted later in the MC + /// pipeline. A notalbe example is DW.ref. symbols which are emitted as weak + /// hidden in ppc linux enviornment. (i.e. DW.ref.__gxx_personality_v0) + RTDyldObjectLinkingLayer &setAutoClaimResponsibilityForWeakHiddenSymbols( + bool AutoClaimWeakHiddenSymbols) { + this->AutoClaimWeakHiddenSymbols = AutoClaimWeakHiddenSymbols; + return *this; + } + /// Register a JITEventListener. void registerJITEventListener(JITEventListener &L); @@ -150,6 +162,7 @@ bool ProcessAllSections = false; bool OverrideObjectFlags = false; bool AutoClaimObjectSymbols = false; + bool AutoClaimWeakHiddenSymbols = false; DenseMap> MemMgrs; std::vector EventListeners; }; Index: llvm/lib/ExecutionEngine/Orc/LLJIT.cpp =================================================================== --- llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -745,6 +745,10 @@ Layer->setAutoClaimResponsibilityForObjectSymbols(true); } + if (S.JTMB->getTargetTriple().getArch() == Triple::ArchType::ppc64 || + S.JTMB->getTargetTriple().getArch() == Triple::ArchType::ppc64le) + Layer->setAutoClaimResponsibilityForWeakHiddenSymbols(true); + // FIXME: Explicit conversion to std::unique_ptr added to silence // errors from some GCC / libstdc++ bots. Remove this conversion (i.e. // just return ObjLinkingLayer) once those bots are upgraded. Index: llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp =================================================================== --- llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp +++ llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp @@ -108,6 +108,7 @@ // filter these later. auto InternalSymbols = std::make_shared>(); { + SymbolFlagsMap ExtraSymbolsToClaim; for (auto &Sym : (*Obj)->symbols()) { // Skip file symbols. @@ -128,6 +129,33 @@ return; } + // Try to claim responsibility of weak hidden symbols + // if AutoClaimWeakHiddenSymbols flag is set. + if (AutoClaimWeakHiddenSymbols && + (*SymFlagsOrErr & object::BasicSymbolRef::SF_Weak) && + (*SymFlagsOrErr & object::BasicSymbolRef::SF_Hidden)) { + auto SymName = Sym.getName(); + if (!SymName) { + ES.reportError(SymName.takeError()); + R->failMaterialization(); + return; + } + + // Already included in responsibility set, skip it + if (R->getSymbols().count(ES.intern(*SymName))) + continue; + + auto SymFlags = JITSymbolFlags::fromObjectSymbol(Sym); + if (!SymFlags) { + ES.reportError(SymFlags.takeError()); + R->failMaterialization(); + return; + } + + ExtraSymbolsToClaim[ES.intern(*SymName)] = *SymFlags; + continue; + } + // Don't include symbols that aren't global. if (!(*SymFlagsOrErr & object::BasicSymbolRef::SF_Global)) { if (auto SymName = Sym.getName()) @@ -139,6 +167,13 @@ } } } + + if (!ExtraSymbolsToClaim.empty()) { + if (auto Err = R->defineMaterializing(ExtraSymbolsToClaim)) { + ES.reportError(std::move(Err)); + R->failMaterialization(); + } + } } auto MemMgr = GetMemoryManager();