Author: Sunho Kim Date: 2022-07-28T21:12:25+09:00 New Revision: 72ea1a721e005f29c6fea4a684807a68abd93c39
URL: https://github.com/llvm/llvm-project/commit/72ea1a721e005f29c6fea4a684807a68abd93c39 DIFF: https://github.com/llvm/llvm-project/commit/72ea1a721e005f29c6fea4a684807a68abd93c39.diff LOG: [ORC] Fix weak hidden symbols failure on PPC with runtimedyld 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 Added: Modified: clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp llvm/lib/ExecutionEngine/Orc/LLJIT.cpp llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp Removed: ################################################################################ diff --git a/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp b/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp index 75928d912dd4..a1dbcfa3410f 100644 --- a/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp +++ b/clang/unittests/Interpreter/ExceptionTests/InterpreterExceptionTest.cpp @@ -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()) diff --git a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp index 1926ef1ecc72..17ad0a2170f9 100644 --- a/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp +++ b/llvm/lib/ExecutionEngine/Orc/LLJIT.cpp @@ -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. diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp index 27044f66a55d..5d1c9afc560a 100644 --- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp @@ -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. @@ -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()) @@ -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(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits