diff options
| author | Michael Kruse <llvm-project@meinersbur.de> | 2025-01-03 10:22:51 +0100 |
|---|---|---|
| committer | Michael Kruse <llvm-project@meinersbur.de> | 2025-01-03 10:22:51 +0100 |
| commit | 38500d63e14ce340236840f60d356cdefb56a52c (patch) | |
| tree | 17edbec446ce9b50d2f215a483b83afb293a635d /llvm/lib/ExecutionEngine/JITLink | |
| parent | 1a3d5daaef7a6a63448a497da3eff7fc9e23df26 (diff) | |
| parent | 27f30029741ecf023baece7b3dde1ff9011ffefc (diff) | |
Merge branch 'main' into users/meinersbur/flang_runtime_split-headersusers/meinersbur/flang_runtime_split-headers
Diffstat (limited to 'llvm/lib/ExecutionEngine/JITLink')
28 files changed, 345 insertions, 249 deletions
diff --git a/llvm/lib/ExecutionEngine/JITLink/COFF.cpp b/llvm/lib/ExecutionEngine/JITLink/COFF.cpp index 4503642f52a9..d370e99169b1 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFF.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFF.cpp @@ -40,7 +40,8 @@ static StringRef getMachineName(uint16_t Machine) { } Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromCOFFObject(MemoryBufferRef ObjectBuffer) { +createLinkGraphFromCOFFObject(MemoryBufferRef ObjectBuffer, + std::shared_ptr<orc::SymbolStringPool> SSP) { StringRef Data = ObjectBuffer.getBuffer(); // Check magic @@ -108,7 +109,7 @@ createLinkGraphFromCOFFObject(MemoryBufferRef ObjectBuffer) { switch (Machine) { case COFF::IMAGE_FILE_MACHINE_AMD64: - return createLinkGraphFromCOFFObject_x86_64(ObjectBuffer); + return createLinkGraphFromCOFFObject_x86_64(ObjectBuffer, std::move(SSP)); default: return make_error<JITLinkError>( "Unsupported target machine architecture in COFF object " + diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp index f23f3ed9406b..ecf5c0e519ca 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp @@ -19,21 +19,17 @@ using namespace jitlink; #define DEBUG_TYPE "jitlink" -// Create prefix string literals used in Options.td -#define PREFIX(NAME, VALUE) \ - static constexpr StringLiteral NAME##_init[] = VALUE; \ - static constexpr ArrayRef<StringLiteral> NAME(NAME##_init, \ - std::size(NAME##_init) - 1); +#define OPTTABLE_STR_TABLE_CODE #include "COFFOptions.inc" -#undef PREFIX +#undef OPTTABLE_STR_TABLE_CODE -static constexpr const StringLiteral PrefixTable_init[] = -#define PREFIX_UNION(VALUES) VALUES +#define OPTTABLE_PREFIXES_TABLE_CODE #include "COFFOptions.inc" -#undef PREFIX_UNION - ; -static constexpr const ArrayRef<StringLiteral> - PrefixTable(PrefixTable_init, std::size(PrefixTable_init) - 1); +#undef OPTTABLE_PREFIXES_TABLE_CODE + +#define OPTTABLE_PREFIXES_UNION_CODE +#include "COFFOptions.inc" +#undef OPTTABLE_PREFIXES_UNION_CODE // Create table mapping all options defined in COFFOptions.td using namespace llvm::opt; @@ -46,7 +42,9 @@ static constexpr opt::OptTable::Info infoTable[] = { class COFFOptTable : public opt::PrecomputedOptTable { public: - COFFOptTable() : PrecomputedOptTable(infoTable, PrefixTable, true) {} + COFFOptTable() + : PrecomputedOptTable(OptionStrTable, OptionPrefixesTable, infoTable, + OptionPrefixesUnion, true) {} }; static COFFOptTable optTable; diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp index 92630650ec93..5d43f7b03bc2 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp @@ -11,6 +11,8 @@ //===----------------------------------------------------------------------===// #include "COFFLinkGraphBuilder.h" +#include <memory> + #define DEBUG_TYPE "jitlink" static const char *CommonSectionName = "__common"; @@ -24,12 +26,16 @@ static Triple createTripleWithCOFFFormat(Triple T) { } COFFLinkGraphBuilder::COFFLinkGraphBuilder( - const object::COFFObjectFile &Obj, Triple TT, SubtargetFeatures Features, + const object::COFFObjectFile &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT, + SubtargetFeatures Features, LinkGraph::GetEdgeKindNameFunction GetEdgeKindName) - : Obj(Obj), G(std::make_unique<LinkGraph>( - Obj.getFileName().str(), createTripleWithCOFFFormat(TT), - std::move(Features), getPointerSize(Obj), - getEndianness(Obj), std::move(GetEdgeKindName))) { + : Obj(Obj), + G(std::make_unique<LinkGraph>(Obj.getFileName().str(), std::move(SSP), + createTripleWithCOFFFormat(TT), + std::move(Features), getPointerSize(Obj), + getEndianness(Obj), + std::move(GetEdgeKindName))) { LLVM_DEBUG({ dbgs() << "Created COFFLinkGraphBuilder for \"" << Obj.getFileName() << "\"\n"; @@ -226,18 +232,19 @@ Error COFFLinkGraphBuilder::graphifySymbols() { " (" + toString(SecOrErr.takeError()) + ")"); Sec = *SecOrErr; } + auto InternedSymbolName = G->intern(std::move(SymbolName)); // Create jitlink symbol jitlink::Symbol *GSym = nullptr; if (Sym->isFileRecord()) LLVM_DEBUG({ dbgs() << " " << SymIndex << ": Skipping FileRecord symbol \"" - << SymbolName << "\" in " + << InternedSymbolName << "\" in " << getCOFFSectionName(SectionIndex, Sec, *Sym) << " (index: " << SectionIndex << ") \n"; }); else if (Sym->isUndefined()) { - GSym = createExternalSymbol(SymIndex, SymbolName, *Sym, Sec); + GSym = createExternalSymbol(SymIndex, InternedSymbolName, *Sym, Sec); } else if (Sym->isWeakExternal()) { auto *WeakExternal = Sym->getAux<object::coff_aux_weak_external>(); COFFSymbolIndex TagIndex = WeakExternal->TagIndex; @@ -246,7 +253,7 @@ Error COFFLinkGraphBuilder::graphifySymbols() { {SymIndex, TagIndex, Characteristics, SymbolName}); } else { Expected<jitlink::Symbol *> NewGSym = - createDefinedSymbol(SymIndex, SymbolName, *Sym, Sec); + createDefinedSymbol(SymIndex, InternedSymbolName, *Sym, Sec); if (!NewGSym) return NewGSym.takeError(); GSym = *NewGSym; @@ -254,7 +261,7 @@ Error COFFLinkGraphBuilder::graphifySymbols() { LLVM_DEBUG({ dbgs() << " " << SymIndex << ": Creating defined graph symbol for COFF symbol \"" - << SymbolName << "\" in " + << InternedSymbolName << "\" in " << getCOFFSectionName(SectionIndex, Sec, *Sym) << " (index: " << SectionIndex << ") \n"; dbgs() << " " << *GSym << "\n"; @@ -293,14 +300,13 @@ Error COFFLinkGraphBuilder::handleDirectiveSection(StringRef Str) { if (From.empty() || To.empty()) return make_error<JITLinkError>( "Invalid COFF /alternatename directive"); - AlternateNames[From] = To; + AlternateNames[G->intern(From)] = G->intern(To); break; } case COFF_OPT_incl: { - auto DataCopy = G->allocateContent(S); - StringRef StrCopy(DataCopy.data(), DataCopy.size()); - ExternalSymbols[StrCopy] = &G->addExternalSymbol(StrCopy, 0, false); - ExternalSymbols[StrCopy]->setLive(true); + auto Symbol = &G->addExternalSymbol(S, 0, false); + Symbol->setLive(true); + ExternalSymbols[Symbol->getName()] = Symbol; break; } case COFF_OPT_export: @@ -332,8 +338,8 @@ Error COFFLinkGraphBuilder::flushWeakAliasRequests() { ? Scope::Default : Scope::Local; - auto NewSymbol = - createAliasSymbol(WeakExternal.SymbolName, Linkage::Weak, S, *Target); + auto NewSymbol = createAliasSymbol(G->intern(WeakExternal.SymbolName), + Linkage::Weak, S, *Target); if (!NewSymbol) return NewSymbol.takeError(); setGraphSymbol(AliasSymbol->getSectionNumber(), WeakExternal.Alias, @@ -354,37 +360,44 @@ Error COFFLinkGraphBuilder::flushWeakAliasRequests() { } Error COFFLinkGraphBuilder::handleAlternateNames() { - for (auto &KeyValue : AlternateNames) - if (DefinedSymbols.count(KeyValue.second) && - ExternalSymbols.count(KeyValue.first)) { - auto *Target = DefinedSymbols[KeyValue.second]; - auto *Alias = ExternalSymbols[KeyValue.first]; + for (auto &KeyValue : AlternateNames) { + auto DefinedSymbolName = KeyValue.second; + auto ExternalSymbolsName = KeyValue.first; + if (DefinedSymbols.count(DefinedSymbolName) && + ExternalSymbols.count(ExternalSymbolsName)) { + auto *Target = DefinedSymbols[DefinedSymbolName]; + auto *Alias = ExternalSymbols[ExternalSymbolsName]; G->makeDefined(*Alias, Target->getBlock(), Target->getOffset(), Target->getSize(), Linkage::Weak, Scope::Local, false); } + } return Error::success(); } Symbol *COFFLinkGraphBuilder::createExternalSymbol( - COFFSymbolIndex SymIndex, StringRef SymbolName, + COFFSymbolIndex SymIndex, orc::SymbolStringPtr SymbolName, object::COFFSymbolRef Symbol, const object::coff_section *Section) { - if (!ExternalSymbols.count(SymbolName)) - ExternalSymbols[SymbolName] = - &G->addExternalSymbol(SymbolName, Symbol.getValue(), false); + llvm::jitlink::Symbol *Sym = nullptr; + if (!ExternalSymbols.count(SymbolName)) { + Sym = &G->addExternalSymbol(*SymbolName, Symbol.getValue(), false); + ExternalSymbols[Sym->getName()] = Sym; + } else { + Sym = ExternalSymbols[SymbolName]; + } LLVM_DEBUG({ dbgs() << " " << SymIndex << ": Creating external graph symbol for COFF symbol \"" - << SymbolName << "\" in " + << Sym->getName() << "\" in " << getCOFFSectionName(Symbol.getSectionNumber(), Section, Symbol) << " (index: " << Symbol.getSectionNumber() << ") \n"; }); - return ExternalSymbols[SymbolName]; + return Sym; } -Expected<Symbol *> COFFLinkGraphBuilder::createAliasSymbol(StringRef SymbolName, - Linkage L, Scope S, - Symbol &Target) { +Expected<Symbol *> +COFFLinkGraphBuilder::createAliasSymbol(orc::SymbolStringPtr SymbolName, + Linkage L, Scope S, Symbol &Target) { if (!Target.isDefined()) { // FIXME: Support this when there's a way to handle this. return make_error<JITLinkError>("Weak external symbol with external " @@ -460,8 +473,9 @@ Error COFFLinkGraphBuilder::calculateImplicitSizeOfSymbols() { } Expected<Symbol *> COFFLinkGraphBuilder::createDefinedSymbol( - COFFSymbolIndex SymIndex, StringRef SymbolName, + COFFSymbolIndex SymIndex, orc::SymbolStringPtr SymbolName, object::COFFSymbolRef Symbol, const object::coff_section *Section) { + if (Symbol.isCommon()) { // FIXME: correct alignment return &G->addDefinedSymbol( @@ -470,6 +484,7 @@ Expected<Symbol *> COFFLinkGraphBuilder::createDefinedSymbol( 0, SymbolName, Symbol.getValue(), Linkage::Weak, Scope::Default, false, false); } + if (Symbol.isAbsolute()) return &G->addAbsoluteSymbol(SymbolName, orc::ExecutorAddr(Symbol.getValue()), 0, @@ -603,7 +618,7 @@ Expected<Symbol *> COFFLinkGraphBuilder::createCOMDATExportRequest( // Process the second symbol of COMDAT sequence. Expected<Symbol *> COFFLinkGraphBuilder::exportCOMDATSymbol(COFFSymbolIndex SymIndex, - StringRef SymbolName, + orc::SymbolStringPtr SymbolName, object::COFFSymbolRef Symbol) { Block *B = getGraphBlock(Symbol.getSectionNumber()); auto &PendingComdatExport = PendingComdatExports[Symbol.getSectionNumber()]; @@ -627,5 +642,39 @@ COFFLinkGraphBuilder::exportCOMDATSymbol(COFFSymbolIndex SymIndex, return GSym; } +Symbol *GetImageBaseSymbol::operator()(LinkGraph &G) { + if (ImageBase) + return *ImageBase; + + auto IBN = G.intern(ImageBaseName); + + // Check external symbols for image base. + for (auto *Sym : G.external_symbols()) { + if (Sym->getName() == IBN) { + ImageBase = Sym; + return Sym; + } + } + + // Check absolute symbols (unexpected, but legal). + for (auto *Sym : G.absolute_symbols()) { + if (Sym->getName() == IBN) { + ImageBase = Sym; + return Sym; + } + } + + // Finally, check defined symbols. + for (auto *Sym : G.defined_symbols()) { + if (Sym->hasName() && Sym->getName() == IBN) { + ImageBase = Sym; + return Sym; + } + } + + ImageBase = nullptr; + return nullptr; +} + } // namespace jitlink } // namespace llvm diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h index e5f3ce8c53f5..55442e0cee55 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h +++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h @@ -37,7 +37,8 @@ protected: using COFFSectionIndex = int32_t; using COFFSymbolIndex = int32_t; - COFFLinkGraphBuilder(const object::COFFObjectFile &Obj, Triple TT, + COFFLinkGraphBuilder(const object::COFFObjectFile &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT, SubtargetFeatures Features, LinkGraph::GetEdgeKindNameFunction GetEdgeKindName); @@ -78,6 +79,12 @@ protected: return GraphBlocks[SecIndex]; } + Symbol &addImageBaseSymbol(StringRef Name = "__ImageBase") { + auto &ImageBase = G->addExternalSymbol(G->intern(Name), 0, true); + ImageBase.setLive(true); + return ImageBase; + } + object::COFFObjectFile::section_iterator_range sections() const { return Obj.sections(); } @@ -134,20 +141,21 @@ private: Section &getCommonSection(); - Symbol *createExternalSymbol(COFFSymbolIndex SymIndex, StringRef SymbolName, + Symbol *createExternalSymbol(COFFSymbolIndex SymIndex, + orc::SymbolStringPtr SymbolName, object::COFFSymbolRef Symbol, const object::coff_section *Section); - Expected<Symbol *> createAliasSymbol(StringRef SymbolName, Linkage L, Scope S, - Symbol &Target); + Expected<Symbol *> createAliasSymbol(orc::SymbolStringPtr SymbolName, + Linkage L, Scope S, Symbol &Target); Expected<Symbol *> createDefinedSymbol(COFFSymbolIndex SymIndex, - StringRef SymbolName, + orc::SymbolStringPtr SymbolName, object::COFFSymbolRef Symbol, const object::coff_section *Section); Expected<Symbol *> createCOMDATExportRequest( COFFSymbolIndex SymIndex, object::COFFSymbolRef Symbol, const object::coff_aux_section_definition *Definition); Expected<Symbol *> exportCOMDATSymbol(COFFSymbolIndex SymIndex, - StringRef SymbolName, + orc::SymbolStringPtr SymbolName, object::COFFSymbolRef Symbol); Error handleDirectiveSection(StringRef Str); @@ -176,9 +184,9 @@ private: std::vector<Block *> GraphBlocks; std::vector<Symbol *> GraphSymbols; - DenseMap<StringRef, StringRef> AlternateNames; - DenseMap<StringRef, Symbol *> ExternalSymbols; - DenseMap<StringRef, Symbol *> DefinedSymbols; + DenseMap<orc::SymbolStringPtr, orc::SymbolStringPtr> AlternateNames; + DenseMap<orc::SymbolStringPtr, Symbol *> ExternalSymbols; + DenseMap<orc::SymbolStringPtr, Symbol *> DefinedSymbols; }; template <typename RelocHandlerFunction> @@ -214,6 +222,18 @@ Error COFFLinkGraphBuilder::forEachRelocation(const object::SectionRef &RelSec, return Error::success(); } +class GetImageBaseSymbol { +public: + GetImageBaseSymbol(StringRef ImageBaseName = "__ImageBase") + : ImageBaseName(ImageBaseName) {} + Symbol *operator()(LinkGraph &G); + void reset() { ImageBase = std::nullopt; } + +private: + StringRef ImageBaseName; + std::optional<Symbol *> ImageBase; +}; + } // end namespace jitlink } // end namespace llvm diff --git a/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp index 01b9deab4313..151f1b337087 100644 --- a/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp @@ -93,9 +93,12 @@ private: Edge::Kind Kind = Edge::Invalid; const char *FixupPtr = BlockToFix.getContent().data() + Offset; + Symbol *ImageBase = GetImageBaseSymbol()(getGraph()); switch (Rel.getType()) { case COFF::RelocationTypeAMD64::IMAGE_REL_AMD64_ADDR32NB: { + if (!ImageBase) + ImageBase = &addImageBaseSymbol(); Kind = EdgeKind_coff_x86_64::Pointer32NB; Addend = *reinterpret_cast<const support::little32_t *>(FixupPtr); break; @@ -148,6 +151,7 @@ private: SectionIdx = getObject().getNumberOfSections() + 1; else SectionIdx = COFFSymbol.getSectionNumber(); + auto *AbsSym = &getGraph().addAbsoluteSymbol( "secidx", orc::ExecutorAddr(SectionIdx), 2, Linkage::Strong, Scope::Local, false); @@ -181,24 +185,25 @@ private: } public: - COFFLinkGraphBuilder_x86_64(const object::COFFObjectFile &Obj, const Triple T, - const SubtargetFeatures Features) - : COFFLinkGraphBuilder(Obj, std::move(T), std::move(Features), + COFFLinkGraphBuilder_x86_64(const object::COFFObjectFile &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, + const Triple T, const SubtargetFeatures Features) + : COFFLinkGraphBuilder(Obj, std::move(SSP), std::move(T), + std::move(Features), getCOFFX86RelocationKindName) {} }; class COFFLinkGraphLowering_x86_64 { public: // Lowers COFF x86_64 specific edges to generic x86_64 edges. - Error lowerCOFFRelocationEdges(LinkGraph &G, JITLinkContext &Ctx) { + Error operator()(LinkGraph &G) { for (auto *B : G.blocks()) { for (auto &E : B->edges()) { switch (E.getKind()) { case EdgeKind_coff_x86_64::Pointer32NB: { - auto ImageBase = getImageBaseAddress(G, Ctx); - if (!ImageBase) - return ImageBase.takeError(); - E.setAddend(E.getAddend() - ImageBase->getValue()); + auto ImageBase = GetImageBase(G); + assert(ImageBase && "__ImageBase symbol must be defined"); + E.setAddend(E.getAddend() - ImageBase->getAddress().getValue()); E.setKind(x86_64::Pointer32); break; } @@ -230,58 +235,18 @@ public: } private: - static StringRef getImageBaseSymbolName() { return "__ImageBase"; } - orc::ExecutorAddr getSectionStart(Section &Sec) { if (!SectionStartCache.count(&Sec)) { SectionRange Range(Sec); SectionStartCache[&Sec] = Range.getStart(); + return Range.getStart(); } return SectionStartCache[&Sec]; } - Expected<orc::ExecutorAddr> getImageBaseAddress(LinkGraph &G, - JITLinkContext &Ctx) { - if (this->ImageBase) - return this->ImageBase; - for (auto *S : G.defined_symbols()) - if (S->getName() == getImageBaseSymbolName()) { - this->ImageBase = S->getAddress(); - return this->ImageBase; - } - - JITLinkContext::LookupMap Symbols; - Symbols[getImageBaseSymbolName()] = SymbolLookupFlags::RequiredSymbol; - orc::ExecutorAddr ImageBase; - Error Err = Error::success(); - Ctx.lookup(Symbols, - createLookupContinuation([&](Expected<AsyncLookupResult> LR) { - ErrorAsOutParameter _(Err); - if (!LR) { - Err = LR.takeError(); - return; - } - ImageBase = LR->begin()->second.getAddress(); - })); - if (Err) - return std::move(Err); - this->ImageBase = ImageBase; - return ImageBase; - } - + GetImageBaseSymbol GetImageBase; DenseMap<Section *, orc::ExecutorAddr> SectionStartCache; - orc::ExecutorAddr ImageBase; }; - -Error lowerEdges_COFF_x86_64(LinkGraph &G, JITLinkContext *Ctx) { - LLVM_DEBUG(dbgs() << "Lowering COFF x86_64 edges:\n"); - COFFLinkGraphLowering_x86_64 GraphLowering; - - if (auto Err = GraphLowering.lowerCOFFRelocationEdges(G, *Ctx)) - return Err; - - return Error::success(); -} } // namespace namespace llvm { @@ -305,8 +270,8 @@ const char *getCOFFX86RelocationKindName(Edge::Kind R) { } } -Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromCOFFObject_x86_64(MemoryBufferRef ObjectBuffer) { +Expected<std::unique_ptr<LinkGraph>> createLinkGraphFromCOFFObject_x86_64( + MemoryBufferRef ObjectBuffer, std::shared_ptr<orc::SymbolStringPool> SSP) { LLVM_DEBUG({ dbgs() << "Building jitlink graph for new input " << ObjectBuffer.getBufferIdentifier() << "...\n"; @@ -320,7 +285,8 @@ createLinkGraphFromCOFFObject_x86_64(MemoryBufferRef ObjectBuffer) { if (!Features) return Features.takeError(); - return COFFLinkGraphBuilder_x86_64(**COFFObj, (*COFFObj)->makeTriple(), + return COFFLinkGraphBuilder_x86_64(**COFFObj, std::move(SSP), + (*COFFObj)->makeTriple(), std::move(*Features)) .buildGraph(); } @@ -338,9 +304,7 @@ void link_COFF_x86_64(std::unique_ptr<LinkGraph> G, Config.PrePrunePasses.push_back(markAllSymbolsLive); // Add COFF edge lowering passes. - JITLinkContext *CtxPtr = Ctx.get(); - Config.PreFixupPasses.push_back( - [CtxPtr](LinkGraph &G) { return lowerEdges_COFF_x86_64(G, CtxPtr); }); + Config.PreFixupPasses.push_back(COFFLinkGraphLowering_x86_64()); } if (auto Err = Ctx->modifyPassConfig(*G, Config)) diff --git a/llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h b/llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h index 49cfc5dec25b..c7a2f071c29f 100644 --- a/llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h +++ b/llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h @@ -112,13 +112,13 @@ identifyELFSectionStartAndEndSymbols(LinkGraph &G, Symbol &Sym) { constexpr StringRef EndSymbolPrefix = "__stop_"; auto SymName = Sym.getName(); - if (SymName.starts_with(StartSymbolPrefix)) { - if (auto *Sec = - G.findSectionByName(SymName.drop_front(StartSymbolPrefix.size()))) + if ((*SymName).starts_with(StartSymbolPrefix)) { + if (auto *Sec = G.findSectionByName( + (*SymName).drop_front(StartSymbolPrefix.size()))) return {*Sec, true}; - } else if (SymName.starts_with(EndSymbolPrefix)) { + } else if ((*SymName).starts_with(EndSymbolPrefix)) { if (auto *Sec = - G.findSectionByName(SymName.drop_front(EndSymbolPrefix.size()))) + G.findSectionByName((*SymName).drop_front(EndSymbolPrefix.size()))) return {*Sec, false}; } return {}; @@ -131,15 +131,15 @@ identifyMachOSectionStartAndEndSymbols(LinkGraph &G, Symbol &Sym) { constexpr StringRef EndSymbolPrefix = "section$end$"; auto SymName = Sym.getName(); - if (SymName.starts_with(StartSymbolPrefix)) { + if ((*SymName).starts_with(StartSymbolPrefix)) { auto [SegName, SecName] = - SymName.drop_front(StartSymbolPrefix.size()).split('$'); + (*SymName).drop_front(StartSymbolPrefix.size()).split('$'); std::string SectionName = (SegName + "," + SecName).str(); if (auto *Sec = G.findSectionByName(SectionName)) return {*Sec, true}; - } else if (SymName.starts_with(EndSymbolPrefix)) { + } else if ((*SymName).starts_with(EndSymbolPrefix)) { auto [SegName, SecName] = - SymName.drop_front(EndSymbolPrefix.size()).split('$'); + (*SymName).drop_front(EndSymbolPrefix.size()).split('$'); std::string SectionName = (SegName + "," + SecName).str(); if (auto *Sec = G.findSectionByName(SectionName)) return {*Sec, false}; diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF.cpp index d92feeccf5e9..663a883a4bcc 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF.cpp @@ -69,7 +69,8 @@ Expected<uint16_t> readTargetMachineArch(StringRef Buffer) { } Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromELFObject(MemoryBufferRef ObjectBuffer) { +createLinkGraphFromELFObject(MemoryBufferRef ObjectBuffer, + std::shared_ptr<orc::SymbolStringPool> SSP) { StringRef Buffer = ObjectBuffer.getBuffer(); if (Buffer.size() < ELF::EI_NIDENT) return make_error<JITLinkError>("Truncated ELF buffer"); @@ -84,23 +85,23 @@ createLinkGraphFromELFObject(MemoryBufferRef ObjectBuffer) { switch (*TargetMachineArch) { case ELF::EM_AARCH64: - return createLinkGraphFromELFObject_aarch64(ObjectBuffer); + return createLinkGraphFromELFObject_aarch64(ObjectBuffer, std::move(SSP)); case ELF::EM_ARM: - return createLinkGraphFromELFObject_aarch32(ObjectBuffer); - case ELF::EM_LOONGARCH: - return createLinkGraphFromELFObject_loongarch(ObjectBuffer); + return createLinkGraphFromELFObject_aarch32(ObjectBuffer, std::move(SSP)); case ELF::EM_PPC64: { if (DataEncoding == ELF::ELFDATA2LSB) - return createLinkGraphFromELFObject_ppc64le(ObjectBuffer); + return createLinkGraphFromELFObject_ppc64le(ObjectBuffer, std::move(SSP)); else - return createLinkGraphFromELFObject_ppc64(ObjectBuffer); + return createLinkGraphFromELFObject_ppc64(ObjectBuffer, std::move(SSP)); } + case ELF::EM_LOONGARCH: + return createLinkGraphFromELFObject_loongarch(ObjectBuffer, std::move(SSP)); case ELF::EM_RISCV: - return createLinkGraphFromELFObject_riscv(ObjectBuffer); + return createLinkGraphFromELFObject_riscv(ObjectBuffer, std::move(SSP)); case ELF::EM_X86_64: - return createLinkGraphFromELFObject_x86_64(ObjectBuffer); + return createLinkGraphFromELFObject_x86_64(ObjectBuffer, std::move(SSP)); case ELF::EM_386: - return createLinkGraphFromELFObject_i386(ObjectBuffer); + return createLinkGraphFromELFObject_i386(ObjectBuffer, std::move(SSP)); default: return make_error<JITLinkError>( "Unsupported target machine architecture in ELF object " + diff --git a/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h index c05961c64837..fbe40fe5f757 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h +++ b/llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h @@ -58,7 +58,8 @@ class ELFLinkGraphBuilder : public ELFLinkGraphBuilderBase { using ELFFile = object::ELFFile<ELFT>; public: - ELFLinkGraphBuilder(const object::ELFFile<ELFT> &Obj, Triple TT, + ELFLinkGraphBuilder(const object::ELFFile<ELFT> &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT, SubtargetFeatures Features, StringRef FileName, LinkGraph::GetEdgeKindNameFunction GetEdgeKindName); @@ -189,12 +190,13 @@ protected: template <typename ELFT> ELFLinkGraphBuilder<ELFT>::ELFLinkGraphBuilder( - const ELFFile &Obj, Triple TT, SubtargetFeatures Features, - StringRef FileName, LinkGraph::GetEdgeKindNameFunction GetEdgeKindName) + const ELFFile &Obj, std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT, + SubtargetFeatures Features, StringRef FileName, + LinkGraph::GetEdgeKindNameFunction GetEdgeKindName) : ELFLinkGraphBuilderBase(std::make_unique<LinkGraph>( - FileName.str(), Triple(std::move(TT)), std::move(Features), - ELFT::Is64Bits ? 8 : 4, llvm::endianness(ELFT::Endianness), - std::move(GetEdgeKindName))), + FileName.str(), std::move(SSP), Triple(std::move(TT)), + std::move(Features), ELFT::Is64Bits ? 8 : 4, + llvm::endianness(ELFT::Endianness), std::move(GetEdgeKindName))), Obj(Obj) { LLVM_DEBUG( { dbgs() << "Created ELFLinkGraphBuilder for \"" << FileName << "\""; }); diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp index 866de2cb227c..475de4866013 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp @@ -219,11 +219,13 @@ protected: public: ELFLinkGraphBuilder_aarch32(StringRef FileName, - const llvm::object::ELFFile<ELFT> &Obj, Triple TT, - SubtargetFeatures Features, + const llvm::object::ELFFile<ELFT> &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, + Triple TT, SubtargetFeatures Features, aarch32::ArmConfig ArmCfg) - : ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features), - FileName, getELFAArch32EdgeKindName), + : ELFLinkGraphBuilder<ELFT>(Obj, std::move(SSP), std::move(TT), + std::move(Features), FileName, + getELFAArch32EdgeKindName), ArmCfg(std::move(ArmCfg)) {} }; @@ -239,8 +241,8 @@ Error buildTables_ELF_aarch32(LinkGraph &G) { return Error::success(); } -Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromELFObject_aarch32(MemoryBufferRef ObjectBuffer) { +Expected<std::unique_ptr<LinkGraph>> createLinkGraphFromELFObject_aarch32( + MemoryBufferRef ObjectBuffer, std::shared_ptr<orc::SymbolStringPool> SSP) { LLVM_DEBUG({ dbgs() << "Building jitlink graph for new input " << ObjectBuffer.getBufferIdentifier() << "...\n"; @@ -273,16 +275,16 @@ createLinkGraphFromELFObject_aarch32(MemoryBufferRef ObjectBuffer) { case Triple::thumb: { auto &ELFFile = cast<ELFObjectFile<ELF32LE>>(**ELFObj).getELFFile(); return ELFLinkGraphBuilder_aarch32<llvm::endianness::little>( - (*ELFObj)->getFileName(), ELFFile, TT, std::move(*Features), - ArmCfg) + (*ELFObj)->getFileName(), ELFFile, std::move(SSP), TT, + std::move(*Features), ArmCfg) .buildGraph(); } case Triple::armeb: case Triple::thumbeb: { auto &ELFFile = cast<ELFObjectFile<ELF32BE>>(**ELFObj).getELFFile(); return ELFLinkGraphBuilder_aarch32<llvm::endianness::big>( - (*ELFObj)->getFileName(), ELFFile, TT, std::move(*Features), - ArmCfg) + (*ELFObj)->getFileName(), ELFFile, std::move(SSP), TT, + std::move(*Features), ArmCfg) .buildGraph(); } default: diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp index 86e505489079..260a493f0ffd 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp @@ -52,10 +52,13 @@ private: } Error getOrCreateGOTSymbol(LinkGraph &G) { + auto InteredGOTSymbolName = + G.getSymbolStringPool()->intern(ELFGOTSymbolName); + auto DefineExternalGOTSymbolIfPresent = createDefineExternalSectionStartAndEndSymbolsPass( [&](LinkGraph &LG, Symbol &Sym) -> SectionRangeSymbolDesc { - if (Sym.getName() == ELFGOTSymbolName) + if (*Sym.getName() == ELFGOTSymbolName) if (auto *GOTSection = G.findSectionByName( aarch64::GOTTableManager::getSectionName())) { GOTSymbol = &Sym; @@ -81,7 +84,7 @@ private: // Check for an existing defined symbol. for (auto *Sym : GOTSection->symbols()) - if (Sym->getName() == ELFGOTSymbolName) { + if (Sym->getName() == InteredGOTSymbolName) { GOTSymbol = Sym; return Error::success(); } @@ -90,11 +93,12 @@ private: SectionRange SR(*GOTSection); if (SR.empty()) GOTSymbol = - &G.addAbsoluteSymbol(ELFGOTSymbolName, orc::ExecutorAddr(), 0, + // FIXME: we should only do this once + &G.addAbsoluteSymbol(InteredGOTSymbolName, orc::ExecutorAddr(), 0, Linkage::Strong, Scope::Local, true); else GOTSymbol = - &G.addDefinedSymbol(*SR.getFirstBlock(), 0, ELFGOTSymbolName, 0, + &G.addDefinedSymbol(*SR.getFirstBlock(), 0, InteredGOTSymbolName, 0, Linkage::Strong, Scope::Local, false, true); } @@ -103,7 +107,7 @@ private: // we just need to point the GOT symbol at some address in this graph. if (!GOTSymbol) { for (auto *Sym : G.external_symbols()) { - if (Sym->getName() == ELFGOTSymbolName) { + if (*Sym->getName() == ELFGOTSymbolName) { auto Blocks = G.blocks(); if (!Blocks.empty()) { G.makeAbsolute(*Sym, (*Blocks.begin())->getAddress()); @@ -525,10 +529,13 @@ private: public: ELFLinkGraphBuilder_aarch64(StringRef FileName, - const object::ELFFile<ELFT> &Obj, Triple TT, - SubtargetFeatures Features) - : ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features), - FileName, aarch64::getEdgeKindName) {} + const object::ELFFile<ELFT> &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, + Triple TT, SubtargetFeatures Features) + + : ELFLinkGraphBuilder<ELFT>(Obj, std::move(SSP), std::move(TT), + std::move(Features), FileName, + aarch64::getEdgeKindName) {} }; // TLS Info Builder. @@ -665,8 +672,8 @@ Error buildTables_ELF_aarch64(LinkGraph &G) { namespace llvm { namespace jitlink { -Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromELFObject_aarch64(MemoryBufferRef ObjectBuffer) { +Expected<std::unique_ptr<LinkGraph>> createLinkGraphFromELFObject_aarch64( + MemoryBufferRef ObjectBuffer, std::shared_ptr<orc::SymbolStringPool> SSP) { LLVM_DEBUG({ dbgs() << "Building jitlink graph for new input " << ObjectBuffer.getBufferIdentifier() << "...\n"; @@ -685,7 +692,7 @@ createLinkGraphFromELFObject_aarch64(MemoryBufferRef ObjectBuffer) { auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF64LE>>(**ELFObj); return ELFLinkGraphBuilder_aarch64<object::ELF64LE>( - (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), + (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), std::move(SSP), (*ELFObj)->makeTriple(), std::move(*Features)) .buildGraph(); } diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_i386.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_i386.cpp index 2d5f28cad1cc..4ce43c1962c8 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_i386.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_i386.cpp @@ -56,7 +56,8 @@ private: auto DefineExternalGOTSymbolIfPresent = createDefineExternalSectionStartAndEndSymbolsPass( [&](LinkGraph &LG, Symbol &Sym) -> SectionRangeSymbolDesc { - if (Sym.getName() == ELFGOTSymbolName) + if (Sym.getName() != nullptr && + *Sym.getName() == ELFGOTSymbolName) if (auto *GOTSection = G.findSectionByName( i386::GOTTableManager::getSectionName())) { GOTSymbol = &Sym; @@ -82,7 +83,7 @@ private: // Check for an existing defined symbol. for (auto *Sym : GOTSection->symbols()) - if (Sym->getName() == ELFGOTSymbolName) { + if (Sym->getName() != nullptr && *Sym->getName() == ELFGOTSymbolName) { GOTSymbol = Sym; return Error::success(); } @@ -224,13 +225,16 @@ private: public: ELFLinkGraphBuilder_i386(StringRef FileName, const object::ELFFile<ELFT> &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT, SubtargetFeatures Features) - : ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features), - FileName, i386::getEdgeKindName) {} + : ELFLinkGraphBuilder<ELFT>(Obj, std::move(SSP), std::move(TT), + std::move(Features), FileName, + i386::getEdgeKindName) {} }; Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromELFObject_i386(MemoryBufferRef ObjectBuffer) { +createLinkGraphFromELFObject_i386(MemoryBufferRef ObjectBuffer, + std::shared_ptr<orc::SymbolStringPool> SSP) { LLVM_DEBUG({ dbgs() << "Building jitlink graph for new input " << ObjectBuffer.getBufferIdentifier() << "...\n"; @@ -248,8 +252,9 @@ createLinkGraphFromELFObject_i386(MemoryBufferRef ObjectBuffer) { "Only i386 (little endian) is supported for now"); auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF32LE>>(**ELFObj); + return ELFLinkGraphBuilder_i386<object::ELF32LE>( - (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), + (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), std::move(SSP), (*ELFObj)->makeTriple(), std::move(*Features)) .buildGraph(); } diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_loongarch.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_loongarch.cpp index 42fcfebd12d6..a12e9f33e80a 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_loongarch.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_loongarch.cpp @@ -58,6 +58,10 @@ private: return Pointer32; case ELF::R_LARCH_32_PCREL: return Delta32; + case ELF::R_LARCH_B16: + return Branch16PCRel; + case ELF::R_LARCH_B21: + return Branch21PCRel; case ELF::R_LARCH_B26: return Branch26PCRel; case ELF::R_LARCH_PCALA_HI20: @@ -131,10 +135,12 @@ private: public: ELFLinkGraphBuilder_loongarch(StringRef FileName, - const object::ELFFile<ELFT> &Obj, Triple TT, - SubtargetFeatures Features) - : ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features), - FileName, loongarch::getEdgeKindName) {} + const object::ELFFile<ELFT> &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, + Triple TT, SubtargetFeatures Features) + : ELFLinkGraphBuilder<ELFT>(Obj, std::move(SSP), std::move(TT), + std::move(Features), FileName, + loongarch::getEdgeKindName) {} }; Error buildTables_ELF_loongarch(LinkGraph &G) { @@ -151,8 +157,8 @@ Error buildTables_ELF_loongarch(LinkGraph &G) { namespace llvm { namespace jitlink { -Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromELFObject_loongarch(MemoryBufferRef ObjectBuffer) { +Expected<std::unique_ptr<LinkGraph>> createLinkGraphFromELFObject_loongarch( + MemoryBufferRef ObjectBuffer, std::shared_ptr<orc::SymbolStringPool> SSP) { LLVM_DEBUG({ dbgs() << "Building jitlink graph for new input " << ObjectBuffer.getBufferIdentifier() << "...\n"; @@ -170,7 +176,7 @@ createLinkGraphFromELFObject_loongarch(MemoryBufferRef ObjectBuffer) { auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF64LE>>(**ELFObj); return ELFLinkGraphBuilder_loongarch<object::ELF64LE>( (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), - (*ELFObj)->makeTriple(), std::move(*Features)) + std::move(SSP), (*ELFObj)->makeTriple(), std::move(*Features)) .buildGraph(); } @@ -178,7 +184,7 @@ createLinkGraphFromELFObject_loongarch(MemoryBufferRef ObjectBuffer) { "Invalid triple for LoongArch ELF object file"); auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF32LE>>(**ELFObj); return ELFLinkGraphBuilder_loongarch<object::ELF32LE>( - (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), + (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), std::move(SSP), (*ELFObj)->makeTriple(), std::move(*Features)) .buildGraph(); } diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp index 3b86250b60a4..83b51eb61e1c 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp @@ -106,14 +106,14 @@ Symbol &createELFGOTHeader(LinkGraph &G, Symbol *TOCSymbol = nullptr; for (Symbol *Sym : G.defined_symbols()) - if (LLVM_UNLIKELY(Sym->getName() == ELFTOCSymbolName)) { + if (LLVM_UNLIKELY(Sym->hasName() && *Sym->getName() == ELFTOCSymbolName)) { TOCSymbol = Sym; break; } if (LLVM_LIKELY(TOCSymbol == nullptr)) { for (Symbol *Sym : G.external_symbols()) - if (Sym->getName() == ELFTOCSymbolName) { + if (Sym->hasName() && *Sym->getName() == ELFTOCSymbolName) { TOCSymbol = Sym; break; } @@ -393,10 +393,12 @@ private: public: ELFLinkGraphBuilder_ppc64(StringRef FileName, - const object::ELFFile<ELFT> &Obj, Triple TT, - SubtargetFeatures Features) - : ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features), - FileName, ppc64::getEdgeKindName) {} + const object::ELFFile<ELFT> &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, + Triple TT, SubtargetFeatures Features) + : ELFLinkGraphBuilder<ELFT>(Obj, std::move(SSP), std::move(TT), + std::move(Features), FileName, + ppc64::getEdgeKindName) {} }; template <llvm::endianness Endianness> @@ -417,7 +419,8 @@ private: Error defineTOCBase(LinkGraph &G) { for (Symbol *Sym : G.defined_symbols()) { - if (LLVM_UNLIKELY(Sym->getName() == ELFTOCSymbolName)) { + if (LLVM_UNLIKELY(Sym->hasName() && + *Sym->getName() == ELFTOCSymbolName)) { TOCSymbol = Sym; return Error::success(); } @@ -427,7 +430,7 @@ private: "TOCSymbol should not be defined at this point"); for (Symbol *Sym : G.external_symbols()) { - if (Sym->getName() == ELFTOCSymbolName) { + if (Sym->hasName() && *Sym->getName() == ELFTOCSymbolName) { TOCSymbol = Sym; break; } @@ -463,7 +466,8 @@ private: template <llvm::endianness Endianness> Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromELFObject_ppc64(MemoryBufferRef ObjectBuffer) { +createLinkGraphFromELFObject_ppc64(MemoryBufferRef ObjectBuffer, + std::shared_ptr<orc::SymbolStringPool> SSP) { LLVM_DEBUG({ dbgs() << "Building jitlink graph for new input " << ObjectBuffer.getBufferIdentifier() << "...\n"; @@ -480,7 +484,7 @@ createLinkGraphFromELFObject_ppc64(MemoryBufferRef ObjectBuffer) { using ELFT = object::ELFType<Endianness, true>; auto &ELFObjFile = cast<object::ELFObjectFile<ELFT>>(**ELFObj); return ELFLinkGraphBuilder_ppc64<Endianness>( - (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), + (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), std::move(SSP), (*ELFObj)->makeTriple(), std::move(*Features)) .buildGraph(); } @@ -517,15 +521,16 @@ void link_ELF_ppc64(std::unique_ptr<LinkGraph> G, } Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromELFObject_ppc64(MemoryBufferRef ObjectBuffer) { +createLinkGraphFromELFObject_ppc64(MemoryBufferRef ObjectBuffer, + std::shared_ptr<orc::SymbolStringPool> SSP) { return createLinkGraphFromELFObject_ppc64<llvm::endianness::big>( - std::move(ObjectBuffer)); + std::move(ObjectBuffer), std::move(SSP)); } -Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromELFObject_ppc64le(MemoryBufferRef ObjectBuffer) { +Expected<std::unique_ptr<LinkGraph>> createLinkGraphFromELFObject_ppc64le( + MemoryBufferRef ObjectBuffer, std::shared_ptr<orc::SymbolStringPool> SSP) { return createLinkGraphFromELFObject_ppc64<llvm::endianness::little>( - std::move(ObjectBuffer)); + std::move(ObjectBuffer), std::move(SSP)); } /// jit-link the given object buffer, which must be a ELF ppc64 object file. diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp index 0cf548ede938..71a0f14368ac 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp @@ -927,14 +927,17 @@ private: public: ELFLinkGraphBuilder_riscv(StringRef FileName, - const object::ELFFile<ELFT> &Obj, Triple TT, - SubtargetFeatures Features) - : ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features), - FileName, riscv::getEdgeKindName) {} + const object::ELFFile<ELFT> &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, + Triple TT, SubtargetFeatures Features) + : ELFLinkGraphBuilder<ELFT>(Obj, std::move(SSP), std::move(TT), + std::move(Features), FileName, + riscv::getEdgeKindName) {} }; Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromELFObject_riscv(MemoryBufferRef ObjectBuffer) { +createLinkGraphFromELFObject_riscv(MemoryBufferRef ObjectBuffer, + std::shared_ptr<orc::SymbolStringPool> SSP) { LLVM_DEBUG({ dbgs() << "Building jitlink graph for new input " << ObjectBuffer.getBufferIdentifier() << "...\n"; @@ -952,7 +955,7 @@ createLinkGraphFromELFObject_riscv(MemoryBufferRef ObjectBuffer) { auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF64LE>>(**ELFObj); return ELFLinkGraphBuilder_riscv<object::ELF64LE>( (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), - (*ELFObj)->makeTriple(), std::move(*Features)) + std::move(SSP), (*ELFObj)->makeTriple(), std::move(*Features)) .buildGraph(); } else { assert((*ELFObj)->getArch() == Triple::riscv32 && @@ -960,7 +963,7 @@ createLinkGraphFromELFObject_riscv(MemoryBufferRef ObjectBuffer) { auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF32LE>>(**ELFObj); return ELFLinkGraphBuilder_riscv<object::ELF32LE>( (*ELFObj)->getFileName(), ELFObjFile.getELFFile(), - (*ELFObj)->makeTriple(), std::move(*Features)) + std::move(SSP), (*ELFObj)->makeTriple(), std::move(*Features)) .buildGraph(); } } diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp index 44122726fb5c..bccda8e90a1f 100644 --- a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp @@ -238,9 +238,10 @@ private: public: ELFLinkGraphBuilder_x86_64(StringRef FileName, + std::shared_ptr<orc::SymbolStringPool> SSP, const object::ELFFile<object::ELF64LE> &Obj, SubtargetFeatures Features) - : ELFLinkGraphBuilder(Obj, Triple("x86_64-unknown-linux"), + : ELFLinkGraphBuilder(Obj, std::move(SSP), Triple("x86_64-unknown-linux"), std::move(Features), FileName, x86_64::getEdgeKindName) {} }; @@ -261,12 +262,12 @@ public: private: Symbol *GOTSymbol = nullptr; - Error getOrCreateGOTSymbol(LinkGraph &G) { auto DefineExternalGOTSymbolIfPresent = createDefineExternalSectionStartAndEndSymbolsPass( [&](LinkGraph &LG, Symbol &Sym) -> SectionRangeSymbolDesc { - if (Sym.getName() == ELFGOTSymbolName) + if (Sym.getName() != nullptr && + *Sym.getName() == ELFGOTSymbolName) if (auto *GOTSection = G.findSectionByName( x86_64::GOTTableManager::getSectionName())) { GOTSymbol = &Sym; @@ -292,7 +293,7 @@ private: // Check for an existing defined symbol. for (auto *Sym : GOTSection->symbols()) - if (Sym->getName() == ELFGOTSymbolName) { + if (Sym->getName() != nullptr && *Sym->getName() == ELFGOTSymbolName) { GOTSymbol = Sym; return Error::success(); } @@ -314,7 +315,7 @@ private: // we just need to point the GOT symbol at some address in this graph. if (!GOTSymbol) { for (auto *Sym : G.external_symbols()) { - if (Sym->getName() == ELFGOTSymbolName) { + if (*Sym->getName() == ELFGOTSymbolName) { auto Blocks = G.blocks(); if (!Blocks.empty()) { G.makeAbsolute(*Sym, (*Blocks.begin())->getAddress()); @@ -333,8 +334,8 @@ private: } }; -Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromELFObject_x86_64(MemoryBufferRef ObjectBuffer) { +Expected<std::unique_ptr<LinkGraph>> createLinkGraphFromELFObject_x86_64( + MemoryBufferRef ObjectBuffer, std::shared_ptr<orc::SymbolStringPool> SSP) { LLVM_DEBUG({ dbgs() << "Building jitlink graph for new input " << ObjectBuffer.getBufferIdentifier() << "...\n"; @@ -349,7 +350,7 @@ createLinkGraphFromELFObject_x86_64(MemoryBufferRef ObjectBuffer) { return Features.takeError(); auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF64LE>>(**ELFObj); - return ELFLinkGraphBuilder_x86_64((*ELFObj)->getFileName(), + return ELFLinkGraphBuilder_x86_64((*ELFObj)->getFileName(), std::move(SSP), ELFObjFile.getELFFile(), std::move(*Features)) .buildGraph(); diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp b/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp index 2da3750b4ed2..5edfbdb05f7b 100644 --- a/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp @@ -125,7 +125,7 @@ raw_ostream &operator<<(raw_ostream &OS, const Symbol &Sym) { << ", linkage: " << formatv("{0:6}", getLinkageName(Sym.getLinkage())) << ", scope: " << formatv("{0:8}", getScopeName(Sym.getScope())) << ", " << (Sym.isLive() ? "live" : "dead") << " - " - << (Sym.hasName() ? Sym.getName() : "<anonymous symbol>"); + << (Sym.hasName() ? *Sym.getName() : "<anonymous symbol>"); return OS; } @@ -167,6 +167,16 @@ Section::~Section() { B->~Block(); } +LinkGraph::~LinkGraph() { + for (auto *Sym : AbsoluteSymbols) { + Sym->~Symbol(); + } + for (auto *Sym : external_symbols()) { + Sym->~Symbol(); + } + ExternalSymbols.clear(); +} + std::vector<Block *> LinkGraph::splitBlockImpl(std::vector<Block *> Blocks, SplitBlockCache *Cache) { assert(!Blocks.empty() && "Blocks must at least contain the original block"); @@ -481,22 +491,25 @@ PointerJumpStubCreator getPointerJumpStubCreator(const Triple &TT) { } Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromObject(MemoryBufferRef ObjectBuffer) { +createLinkGraphFromObject(MemoryBufferRef ObjectBuffer, + std::shared_ptr<orc::SymbolStringPool> SSP) { auto Magic = identify_magic(ObjectBuffer.getBuffer()); switch (Magic) { case file_magic::macho_object: - return createLinkGraphFromMachOObject(ObjectBuffer); + return createLinkGraphFromMachOObject(ObjectBuffer, std::move(SSP)); case file_magic::elf_relocatable: - return createLinkGraphFromELFObject(ObjectBuffer); + return createLinkGraphFromELFObject(ObjectBuffer, std::move(SSP)); case file_magic::coff_object: - return createLinkGraphFromCOFFObject(ObjectBuffer); + return createLinkGraphFromCOFFObject(ObjectBuffer, std::move(SSP)); default: return make_error<JITLinkError>("Unsupported file format"); }; } -std::unique_ptr<LinkGraph> absoluteSymbolsLinkGraph(const Triple &TT, - orc::SymbolMap Symbols) { +std::unique_ptr<LinkGraph> +absoluteSymbolsLinkGraph(const Triple &TT, + std::shared_ptr<orc::SymbolStringPool> SSP, + orc::SymbolMap Symbols) { unsigned PointerSize; endianness Endianness = TT.isLittleEndian() ? endianness::little : endianness::big; @@ -518,8 +531,8 @@ std::unique_ptr<LinkGraph> absoluteSymbolsLinkGraph(const Triple &TT, static std::atomic<uint64_t> Counter = {0}; auto Index = Counter.fetch_add(1, std::memory_order_relaxed); auto G = std::make_unique<LinkGraph>( - "<Absolute Symbols " + std::to_string(Index) + ">", TT, PointerSize, - Endianness, /*GetEdgeKindName=*/nullptr); + "<Absolute Symbols " + std::to_string(Index) + ">", std::move(SSP), TT, + PointerSize, Endianness, /*GetEdgeKindName=*/nullptr); for (auto &[Name, Def] : Symbols) { auto &Sym = G->addAbsoluteSymbol(*Name, Def.getAddress(), /*Size=*/0, diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp b/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp index e5dbb7ee0510..584b9f006746 100644 --- a/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp @@ -211,8 +211,7 @@ JITLinkContext::LookupMap JITLinkerBase::getExternalSymbolNames() const { for (auto *Sym : G->external_symbols()) { assert(!Sym->getAddress() && "External has already been assigned an address"); - assert(Sym->getName() != StringRef() && Sym->getName() != "" && - "Externals must be named"); + assert(Sym->hasName() && "Externals must be named"); SymbolLookupFlags LookupFlags = Sym->isWeaklyReferenced() ? SymbolLookupFlags::WeaklyReferencedSymbol : SymbolLookupFlags::RequiredSymbol; diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp b/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp index 42a77a52beef..2e3323af98e9 100644 --- a/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp @@ -144,6 +144,7 @@ orc::shared::AllocActions &BasicLayout::graphAllocActions() { } void SimpleSegmentAlloc::Create(JITLinkMemoryManager &MemMgr, + std::shared_ptr<orc::SymbolStringPool> SSP, const JITLinkDylib *JD, SegmentMap Segments, OnCreatedFunction OnCreated) { @@ -155,7 +156,7 @@ void SimpleSegmentAlloc::Create(JITLinkMemoryManager &MemMgr, "__---.finalize", "__R--.finalize", "__-W-.finalize", "__RW-.finalize", "__--X.finalize", "__R-X.finalize", "__-WX.finalize", "__RWX.finalize"}; - auto G = std::make_unique<LinkGraph>("", Triple(), 0, + auto G = std::make_unique<LinkGraph>("", std::move(SSP), Triple(), 0, llvm::endianness::native, nullptr); orc::AllocGroupSmallMap<Block *> ContentBlocks; @@ -201,11 +202,12 @@ void SimpleSegmentAlloc::Create(JITLinkMemoryManager &MemMgr, } Expected<SimpleSegmentAlloc> -SimpleSegmentAlloc::Create(JITLinkMemoryManager &MemMgr, const JITLinkDylib *JD, - SegmentMap Segments) { +SimpleSegmentAlloc::Create(JITLinkMemoryManager &MemMgr, + std::shared_ptr<orc::SymbolStringPool> SSP, + const JITLinkDylib *JD, SegmentMap Segments) { std::promise<MSVCPExpected<SimpleSegmentAlloc>> AllocP; auto AllocF = AllocP.get_future(); - Create(MemMgr, JD, std::move(Segments), + Create(MemMgr, std::move(SSP), JD, std::move(Segments), [&](Expected<SimpleSegmentAlloc> Result) { AllocP.set_value(std::move(Result)); }); diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO.cpp index f1181b59234e..b9cfb8fb8fa9 100644 --- a/llvm/lib/ExecutionEngine/JITLink/MachO.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/MachO.cpp @@ -25,7 +25,8 @@ namespace llvm { namespace jitlink { Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromMachOObject(MemoryBufferRef ObjectBuffer) { +createLinkGraphFromMachOObject(MemoryBufferRef ObjectBuffer, + std::shared_ptr<orc::SymbolStringPool> SSP) { StringRef Data = ObjectBuffer.getBuffer(); if (Data.size() < 4) return make_error<JITLinkError>("Truncated MachO buffer \"" + @@ -61,9 +62,10 @@ createLinkGraphFromMachOObject(MemoryBufferRef ObjectBuffer) { switch (CPUType) { case MachO::CPU_TYPE_ARM64: - return createLinkGraphFromMachOObject_arm64(ObjectBuffer); + return createLinkGraphFromMachOObject_arm64(ObjectBuffer, std::move(SSP)); case MachO::CPU_TYPE_X86_64: - return createLinkGraphFromMachOObject_x86_64(ObjectBuffer); + return createLinkGraphFromMachOObject_x86_64(ObjectBuffer, + std::move(SSP)); } return make_error<JITLinkError>("MachO-64 CPU type not valid"); } else diff --git a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp index 15d679bcbb5d..0e7ecf6cc138 100644 --- a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp @@ -49,13 +49,14 @@ Expected<std::unique_ptr<LinkGraph>> MachOLinkGraphBuilder::buildGraph() { } MachOLinkGraphBuilder::MachOLinkGraphBuilder( - const object::MachOObjectFile &Obj, Triple TT, SubtargetFeatures Features, + const object::MachOObjectFile &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT, + SubtargetFeatures Features, LinkGraph::GetEdgeKindNameFunction GetEdgeKindName) - : Obj(Obj), - G(std::make_unique<LinkGraph>(std::string(Obj.getFileName()), - std::move(TT), std::move(Features), - getPointerSize(Obj), getEndianness(Obj), - std::move(GetEdgeKindName))) { + : Obj(Obj), G(std::make_unique<LinkGraph>( + std::string(Obj.getFileName()), std::move(SSP), + std::move(TT), std::move(Features), getPointerSize(Obj), + getEndianness(Obj), std::move(GetEdgeKindName))) { auto &MachHeader = Obj.getHeader64(); SubsectionsViaSymbols = MachHeader.flags & MachO::MH_SUBSECTIONS_VIA_SYMBOLS; } @@ -319,9 +320,8 @@ Error MachOLinkGraphBuilder::createNormalizedSymbols() { } } - IndexToSymbol[SymbolIndex] = - &createNormalizedSymbol(*Name, Value, Type, Sect, Desc, - getLinkage(Desc), getScope(*Name, Type)); + IndexToSymbol[SymbolIndex] = &createNormalizedSymbol( + Name, Value, Type, Sect, Desc, getLinkage(Desc), getScope(*Name, Type)); } return Error::success(); @@ -587,7 +587,7 @@ Symbol &MachOLinkGraphBuilder::createStandardGraphSymbol(NormalizedSymbol &NSym, if (!NSym.Name) dbgs() << "<anonymous symbol>"; else - dbgs() << NSym.Name; + dbgs() << *NSym.Name; if (IsText) dbgs() << " [text]"; if (IsNoDeadStrip) @@ -726,7 +726,7 @@ Error MachOLinkGraphBuilder::graphifyCStringSection( LLVM_DEBUG({ dbgs() << " Adding symbol for c-string block " << B.getRange() << ": " - << (Sym.hasName() ? Sym.getName() : "<anonymous symbol>") + << (Sym.hasName() ? *Sym.getName() : "<anonymous symbol>") << " at offset " << formatv("{0:x}", Sym.getOffset()) << "\n"; }); @@ -826,7 +826,7 @@ Error CompactUnwindSplitter::operator()(LinkGraph &G) { LLVM_DEBUG({ dbgs() << " Updating compact unwind record at " << CURec->getAddress() << " to point to " - << (E.getTarget().hasName() ? E.getTarget().getName() + << (E.getTarget().hasName() ? *E.getTarget().getName() : StringRef()) << " (at " << E.getTarget().getAddress() << ")\n"; }); @@ -835,7 +835,7 @@ Error CompactUnwindSplitter::operator()(LinkGraph &G) { return make_error<JITLinkError>( "Error adding keep-alive edge for compact unwind record at " + formatv("{0:x}", CURec->getAddress()) + ": target " + - E.getTarget().getName() + " is an external symbol"); + *E.getTarget().getName() + " is an external symbol"); auto &TgtBlock = E.getTarget().getBlock(); auto &CURecSym = G.addAnonymousSymbol(*CURec, 0, CURecordSize, false, false); diff --git a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h index a4ae0ac1ecfc..6afa01250f62 100644 --- a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h +++ b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h @@ -83,10 +83,10 @@ protected: using SectionParserFunction = std::function<Error(NormalizedSection &S)>; - MachOLinkGraphBuilder(const object::MachOObjectFile &Obj, Triple TT, + MachOLinkGraphBuilder(const object::MachOObjectFile &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT, SubtargetFeatures Features, LinkGraph::GetEdgeKindNameFunction GetEdgeKindName); - LinkGraph &getGraph() const { return *G; } const object::MachOObjectFile &getObject() const { return Obj; } diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp index 6a947828a5e6..8b43dc97e49a 100644 --- a/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp @@ -27,9 +27,10 @@ namespace { class MachOLinkGraphBuilder_arm64 : public MachOLinkGraphBuilder { public: MachOLinkGraphBuilder_arm64(const object::MachOObjectFile &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, SubtargetFeatures Features) - : MachOLinkGraphBuilder(Obj, getObjectTriple(Obj), std::move(Features), - aarch64::getEdgeKindName), + : MachOLinkGraphBuilder(Obj, std::move(SSP), getObjectTriple(Obj), + std::move(Features), aarch64::getEdgeKindName), NumSymbols(Obj.getSymtabLoadCommand().nsyms) {} private: @@ -580,8 +581,8 @@ private: uint64_t NullValue = 0; }; -Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromMachOObject_arm64(MemoryBufferRef ObjectBuffer) { +Expected<std::unique_ptr<LinkGraph>> createLinkGraphFromMachOObject_arm64( + MemoryBufferRef ObjectBuffer, std::shared_ptr<orc::SymbolStringPool> SSP) { auto MachOObj = object::ObjectFile::createMachOObjectFile(ObjectBuffer); if (!MachOObj) return MachOObj.takeError(); @@ -590,7 +591,8 @@ createLinkGraphFromMachOObject_arm64(MemoryBufferRef ObjectBuffer) { if (!Features) return Features.takeError(); - return MachOLinkGraphBuilder_arm64(**MachOObj, std::move(*Features)) + return MachOLinkGraphBuilder_arm64(**MachOObj, std::move(SSP), + std::move(*Features)) .buildGraph(); } diff --git a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp index 2c69d61316a8..113b1953e36a 100644 --- a/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp @@ -27,8 +27,10 @@ namespace { class MachOLinkGraphBuilder_x86_64 : public MachOLinkGraphBuilder { public: MachOLinkGraphBuilder_x86_64(const object::MachOObjectFile &Obj, + std::shared_ptr<orc::SymbolStringPool> SSP, SubtargetFeatures Features) - : MachOLinkGraphBuilder(Obj, Triple("x86_64-apple-darwin"), + : MachOLinkGraphBuilder(Obj, std::move(SSP), + Triple("x86_64-apple-darwin"), std::move(Features), x86_64::getEdgeKindName) {} private: @@ -483,8 +485,8 @@ private: } }; -Expected<std::unique_ptr<LinkGraph>> -createLinkGraphFromMachOObject_x86_64(MemoryBufferRef ObjectBuffer) { +Expected<std::unique_ptr<LinkGraph>> createLinkGraphFromMachOObject_x86_64( + MemoryBufferRef ObjectBuffer, std::shared_ptr<orc::SymbolStringPool> SSP) { auto MachOObj = object::ObjectFile::createMachOObjectFile(ObjectBuffer); if (!MachOObj) return MachOObj.takeError(); @@ -493,7 +495,8 @@ createLinkGraphFromMachOObject_x86_64(MemoryBufferRef ObjectBuffer) { if (!Features) return Features.takeError(); - return MachOLinkGraphBuilder_x86_64(**MachOObj, std::move(*Features)) + return MachOLinkGraphBuilder_x86_64(**MachOObj, std::move(SSP), + std::move(*Features)) .buildGraph(); } diff --git a/llvm/lib/ExecutionEngine/JITLink/PerGraphGOTAndPLTStubsBuilder.h b/llvm/lib/ExecutionEngine/JITLink/PerGraphGOTAndPLTStubsBuilder.h index 6e325f92bafb..a073ddcae294 100644 --- a/llvm/lib/ExecutionEngine/JITLink/PerGraphGOTAndPLTStubsBuilder.h +++ b/llvm/lib/ExecutionEngine/JITLink/PerGraphGOTAndPLTStubsBuilder.h @@ -114,8 +114,8 @@ protected: private: BuilderImplT &impl() { return static_cast<BuilderImplT &>(*this); } - DenseMap<StringRef, Symbol *> GOTEntries; - DenseMap<StringRef, Symbol *> PLTStubs; + DenseMap<orc::SymbolStringPtr, Symbol *> GOTEntries; + DenseMap<orc::SymbolStringPtr, Symbol *> PLTStubs; }; } // end namespace jitlink diff --git a/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp b/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp index d183498f30a6..7b255717f238 100644 --- a/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/aarch32.cpp @@ -852,7 +852,7 @@ bool StubsManager_prev7::visitEdge(LinkGraph &G, Block *B, Edge &E) { Symbol &Target = E.getTarget(); assert(Target.hasName() && "Edge cannot point to anonymous target"); - auto [Slot, NewStub] = getStubMapSlot(Target.getName()); + auto [Slot, NewStub] = getStubMapSlot(*Target.getName()); if (NewStub) { if (!StubsSection) @@ -896,7 +896,7 @@ bool StubsManager_v7::visitEdge(LinkGraph &G, Block *B, Edge &E) { Symbol &Target = E.getTarget(); assert(Target.hasName() && "Edge cannot point to anonymous target"); - Symbol *&StubSymbol = getStubSymbolSlot(Target.getName(), MakeThumb); + Symbol *&StubSymbol = getStubSymbolSlot(*Target.getName(), MakeThumb); if (!StubSymbol) { if (!StubsSection) diff --git a/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp b/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp index a79dbd5e4494..968ed217d8a9 100644 --- a/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp @@ -29,6 +29,11 @@ const char PointerJumpStubContent[12] = { 0x00, 0x02, 0x1f, (char)0xd6u // BR x16 }; +const char ReentryTrampolineContent[8] = { + (char)0xfd, 0x7b, (char)0xbf, (char)0xa9, // STP x30, [sp, #-8] + 0x00, 0x00, 0x00, (char)0x94 // BL +}; + const char *getEdgeKindName(Edge::Kind R) { switch (R) { case Pointer64: diff --git a/llvm/lib/ExecutionEngine/JITLink/loongarch.cpp b/llvm/lib/ExecutionEngine/JITLink/loongarch.cpp index 010c0ed6713d..cdb3da04354e 100644 --- a/llvm/lib/ExecutionEngine/JITLink/loongarch.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/loongarch.cpp @@ -44,6 +44,8 @@ const char *getEdgeKindName(Edge::Kind K) { KIND_NAME_CASE(Delta32) KIND_NAME_CASE(NegDelta32) KIND_NAME_CASE(Delta64) + KIND_NAME_CASE(Branch16PCRel) + KIND_NAME_CASE(Branch21PCRel) KIND_NAME_CASE(Branch26PCRel) KIND_NAME_CASE(Page20) KIND_NAME_CASE(PageOffset12) diff --git a/llvm/lib/ExecutionEngine/JITLink/x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/x86_64.cpp index e5b48d2c3fab..a84e0001f115 100644 --- a/llvm/lib/ExecutionEngine/JITLink/x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/x86_64.cpp @@ -85,6 +85,10 @@ const char NullPointerContent[PointerSize] = {0x00, 0x00, 0x00, 0x00, const char PointerJumpStubContent[6] = { static_cast<char>(0xFFu), 0x25, 0x00, 0x00, 0x00, 0x00}; +const char ReentryTrampolineContent[5] = { + static_cast<char>(0xe8), 0x00, 0x00, 0x00, 0x00 +}; + Error optimizeGOTAndStubAccesses(LinkGraph &G) { LLVM_DEBUG(dbgs() << "Optimizing GOT entries and stubs:\n"); |
