diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h --- a/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h @@ -21,6 +21,7 @@ #include "llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h" #include "llvm/ExecutionEngine/JITLink/MemoryFlags.h" #include "llvm/ExecutionEngine/JITSymbol.h" +#include "llvm/ExecutionEngine/Orc/SymbolStringPool.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Error.h" @@ -402,10 +403,10 @@ friend class LinkGraph; private: - Symbol(Addressable &Base, orc::ExecutorAddrDiff Offset, StringRef Name, - orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsLive, - bool IsCallable) - : Name(Name), Base(&Base), Offset(Offset), Size(Size) { + Symbol(Addressable &Base, orc::ExecutorAddrDiff Offset, + orc::SymbolStringPtr Name, orc::ExecutorAddrDiff Size, Linkage L, + Scope S, bool IsLive, bool IsCallable) + : Name(std::move(Name)), Base(&Base), Offset(Offset), Size(Size) { assert(Offset <= MaxOffset && "Offset out of range"); setLinkage(L); setScope(S); @@ -414,37 +415,40 @@ } static Symbol &constructCommon(BumpPtrAllocator &Allocator, Block &Base, - StringRef Name, orc::ExecutorAddrDiff Size, - Scope S, bool IsLive) { - assert(!Name.empty() && "Common symbol name cannot be empty"); + orc::SymbolStringPtr Name, + orc::ExecutorAddrDiff Size, Scope S, + bool IsLive) { + assert(Name && "Common symbol name cannot be empty"); assert(Base.isDefined() && "Cannot create common symbol from undefined block"); assert(static_cast(Base).getSize() == Size && "Common symbol size should match underlying block size"); auto *Sym = Allocator.Allocate(); - new (Sym) Symbol(Base, 0, Name, Size, Linkage::Weak, S, IsLive, false); + new (Sym) + Symbol(Base, 0, std::move(Name), Size, Linkage::Weak, S, IsLive, false); return *Sym; } static Symbol &constructExternal(BumpPtrAllocator &Allocator, - Addressable &Base, StringRef Name, + Addressable &Base, orc::SymbolStringPtr Name, orc::ExecutorAddrDiff Size, Linkage L) { assert(!Base.isDefined() && "Cannot create external symbol from defined block"); - assert(!Name.empty() && "External symbol name cannot be empty"); + assert(Name && "External symbol name cannot be empty"); auto *Sym = Allocator.Allocate(); - new (Sym) Symbol(Base, 0, Name, Size, L, Scope::Default, false, false); + new (Sym) + Symbol(Base, 0, std::move(Name), Size, L, Scope::Default, false, false); return *Sym; } static Symbol &constructAbsolute(BumpPtrAllocator &Allocator, - Addressable &Base, StringRef Name, + Addressable &Base, orc::SymbolStringPtr Name, orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsLive) { assert(!Base.isDefined() && "Cannot create absolute symbol from a defined block"); auto *Sym = Allocator.Allocate(); - new (Sym) Symbol(Base, 0, Name, Size, L, S, IsLive, false); + new (Sym) Symbol(Base, 0, std::move(Name), Size, L, S, IsLive, false); return *Sym; } @@ -455,20 +459,22 @@ assert((Offset + Size) <= Base.getSize() && "Symbol extends past end of block"); auto *Sym = Allocator.Allocate(); - new (Sym) Symbol(Base, Offset, StringRef(), Size, Linkage::Strong, - Scope::Local, IsLive, IsCallable); + new (Sym) Symbol(Base, Offset, orc::SymbolStringPtr(nullptr), Size, + Linkage::Strong, Scope::Local, IsLive, IsCallable); return *Sym; } static Symbol &constructNamedDef(BumpPtrAllocator &Allocator, Block &Base, - orc::ExecutorAddrDiff Offset, StringRef Name, + orc::ExecutorAddrDiff Offset, + orc::SymbolStringPtr Name, orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsLive, bool IsCallable) { assert((Offset + Size) <= Base.getSize() && "Symbol extends past end of block"); - assert(!Name.empty() && "Name cannot be empty"); + assert(Name && "Name cannot be empty"); auto *Sym = Allocator.Allocate(); - new (Sym) Symbol(Base, Offset, Name, Size, L, S, IsLive, IsCallable); + new (Sym) + Symbol(Base, Offset, std::move(Name), Size, L, S, IsLive, IsCallable); return *Sym; } @@ -485,18 +491,18 @@ Symbol &operator=(Symbol &&) = delete; /// Returns true if this symbol has a name. - bool hasName() const { return !Name.empty(); } + bool hasName() const { return Name != nullptr; } /// Returns the name of this symbol (empty if the symbol is anonymous). - StringRef getName() const { - assert((!Name.empty() || getScope() == Scope::Local) && + orc::SymbolStringPtr getName() const { + assert((Name || getScope() == Scope::Local) && "Anonymous symbol has non-local scope"); return Name; } /// Rename this symbol. The client is responsible for updating scope and /// linkage if this name-change requires it. - void setName(StringRef Name) { this->Name = Name; } + void setName(orc::SymbolStringPtr Name) { this->Name = std::move(Name); } /// Returns true if this Symbol has content (potentially) defined within this /// object file (i.e. is anything but an external or absolute symbol). @@ -598,7 +604,7 @@ /// Set the linkage for this Symbol. void setLinkage(Linkage L) { - assert((L == Linkage::Strong || (!Base->isAbsolute() && !Name.empty())) && + assert((L == Linkage::Strong || (!Base->isAbsolute() && Name)) && "Linkage can only be applied to defined named symbols"); this->L = static_cast(L); } @@ -608,7 +614,7 @@ /// Set the visibility for this Symbol. void setScope(Scope S) { - assert((!Name.empty() || S == Scope::Local) && + assert((Name || S == Scope::Local) && "Can not set anonymous symbol to non-local scope"); assert((S == Scope::Default || Base->isDefined() || Base->isAbsolute()) && "Invalid visibility for symbol type"); @@ -642,8 +648,7 @@ static constexpr uint64_t MaxOffset = (1ULL << 59) - 1; - // FIXME: A char* or SymbolStringPtr may pack better. - StringRef Name; + orc::SymbolStringPtr Name; Addressable *Base = nullptr; uint64_t Offset : 59; uint64_t L : 1; @@ -946,12 +951,22 @@ support::endianness Endianness, GetEdgeKindNameFunction GetEdgeKindName) : Name(std::move(Name)), TT(TT), PointerSize(PointerSize), + Endianness(Endianness), GetEdgeKindName(std::move(GetEdgeKindName)) { + SSP = std::make_shared(); + } + + LinkGraph(std::string Name, std::shared_ptr SSP, + const Triple &TT, unsigned PointerSize, + support::endianness Endianness, + GetEdgeKindNameFunction GetEdgeKindName) + : Name(std::move(Name)), SSP(SSP), TT(TT), PointerSize(PointerSize), Endianness(Endianness), GetEdgeKindName(std::move(GetEdgeKindName)) {} LinkGraph(const LinkGraph &) = delete; LinkGraph &operator=(const LinkGraph &) = delete; LinkGraph(LinkGraph &&) = delete; LinkGraph &operator=(LinkGraph &&) = delete; + ~LinkGraph(); /// Returns the name of this graph (usually the name of the original /// underlying MemoryBuffer). @@ -968,6 +983,8 @@ const char *getEdgeKindName(Edge::Kind K) const { return GetEdgeKindName(K); } + std::shared_ptr getSymbolStringPool() { return SSP; } + /// Allocate a mutable buffer of the given size using the LinkGraph's /// allocator. MutableArrayRef allocateBuffer(size_t Size) { @@ -1084,12 +1101,13 @@ Linkage L) { assert(llvm::count_if(ExternalSymbols, [&](const Symbol *Sym) { - return Sym->getName() == Name; + return *(Sym->getName()) == Name; }) == 0 && "Duplicate external symbol"); + auto SSPName = SSP->intern(Name); auto &Sym = Symbol::constructExternal( - Allocator, createAddressable(orc::ExecutorAddr(), false), Name, Size, - L); + Allocator, createAddressable(orc::ExecutorAddr(), false), + std::move(SSPName), Size, L); ExternalSymbols.insert(&Sym); return Sym; } @@ -1099,12 +1117,15 @@ orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsLive) { assert((S == Scope::Local || llvm::count_if(AbsoluteSymbols, - [&](const Symbol *Sym) { - return Sym->getName() == Name; - }) == 0) && - "Duplicate absolute symbol"); - auto &Sym = Symbol::constructAbsolute(Allocator, createAddressable(Address), - Name, Size, L, S, IsLive); + [&](const Symbol *Sym) { + return *(Sym->getName()) == + Name; + }) == 0) && + "Duplicate absolute symbol"); + auto SSPName = SSP->intern(Name); + auto &Sym = + Symbol::constructAbsolute(Allocator, createAddressable(Address), + std::move(SSPName), Size, L, S, IsLive); AbsoluteSymbols.insert(&Sym); return Sym; } @@ -1115,12 +1136,13 @@ uint64_t Alignment, bool IsLive) { assert(llvm::count_if(defined_symbols(), [&](const Symbol *Sym) { - return Sym->getName() == Name; + return *(Sym->getName()) == Name; }) == 0 && "Duplicate defined symbol"); + auto SSPName = SSP->intern(Name); auto &Sym = Symbol::constructCommon( - Allocator, createBlock(Section, Size, Address, Alignment, 0), Name, - Size, S, IsLive); + Allocator, createBlock(Section, Size, Address, Alignment, 0), + std::move(SSPName), Size, S, IsLive); Section.addSymbol(Sym); return Sym; } @@ -1139,13 +1161,16 @@ Symbol &addDefinedSymbol(Block &Content, orc::ExecutorAddrDiff Offset, StringRef Name, orc::ExecutorAddrDiff Size, Linkage L, Scope S, bool IsCallable, bool IsLive) { + auto SSPName = SSP->intern(Name); assert((S == Scope::Local || llvm::count_if(defined_symbols(), [&](const Symbol *Sym) { - return Sym->getName() == Name; + return *(Sym->getName()) == + *SSPName; }) == 0) && "Duplicate defined symbol"); - auto &Sym = Symbol::constructNamedDef(Allocator, Content, Offset, Name, - Size, L, S, IsLive, IsCallable); + auto &Sym = Symbol::constructNamedDef(Allocator, Content, Offset, + std::move(SSPName), Size, L, S, + IsLive, IsCallable); Content.getSection().addSymbol(Sym); return Sym; } @@ -1413,6 +1438,7 @@ BumpPtrAllocator Allocator; std::string Name; + std::shared_ptr SSP; Triple TT; unsigned PointerSize; support::endianness Endianness; diff --git a/llvm/include/llvm/ExecutionEngine/JITLink/TableManager.h b/llvm/include/llvm/ExecutionEngine/JITLink/TableManager.h --- a/llvm/include/llvm/ExecutionEngine/JITLink/TableManager.h +++ b/llvm/include/llvm/ExecutionEngine/JITLink/TableManager.h @@ -39,7 +39,7 @@ auto &Entry = impl().createEntry(G, Target); DEBUG_WITH_TYPE("jitlink", { dbgs() << " Created" << impl().getSectionName() << "entry for " - << Target.getName() << ": " << Entry << "\n"; + << *(Target.getName()) << ": " << Entry << "\n"; }); EntryI = Entries.insert(std::make_pair(Target.getName(), &Entry)).first; } @@ -54,7 +54,7 @@ private: TableManagerImplT &impl() { return static_cast(*this); } - DenseMap Entries; + DenseMap Entries; }; } // namespace jitlink diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h --- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h +++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h @@ -46,7 +46,8 @@ const object::COFFObjectFile &getObject() const { return Obj; } virtual Error addRelocations() = 0; - virtual Symbol &createDLLImportEntry(StringRef StubName, Symbol &Target) = 0; + virtual Symbol &createDLLImportEntry(orc::SymbolStringPtr StubName, + Symbol &Target) = 0; Error graphifySections(); Error graphifySymbols(); diff --git a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp --- a/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp @@ -235,7 +235,8 @@ auto ExternalSym = createExternalSymbol( SymIndex, SymbolName.drop_front(getDLLImportStubPrefix().size()), *Sym, Sec); - GSym = &createDLLImportEntry(SymbolName, *ExternalSym); + auto SSPName = G->getSymbolStringPool()->intern(SymbolName); + GSym = &createDLLImportEntry(SSPName, *ExternalSym); } else GSym = createExternalSymbol(SymIndex, SymbolName, *Sym, Sec); } else if (Sym->isWeakExternal()) { diff --git a/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp --- a/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp @@ -62,9 +62,10 @@ return Error::success(); } - Symbol &createDLLImportEntry(StringRef StubName, Symbol &Target) override { + Symbol &createDLLImportEntry(orc::SymbolStringPtr StubName, + Symbol &Target) override { auto &Sym = DLLImportTable.getEntryForTarget(getGraph(), Target); - Sym.setName(StubName); + Sym.setName(std::move(StubName)); return Sym; } @@ -251,7 +252,7 @@ if (this->ImageBase) return this->ImageBase; for (auto *S : G.defined_symbols()) - if (S->getName() == getImageBaseSymbolName()) { + if (*S->getName() == getImageBaseSymbolName()) { this->ImageBase = S->getAddress().getValue(); return this->ImageBase; } diff --git a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp --- a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp @@ -385,7 +385,7 @@ dbgs() << " WARNING: Not adding keep-alive edge to FDE at " << RecordAddress << ", which points to " << ((*PCBegin)->isExternal() ? "external" : "absolute") - << " symbol \"" << (*PCBegin)->getName() + << " symbol \"" << *((*PCBegin)->getName()) << "\" -- FDE must be kept alive manually or it will be " << "dead stripped.\n"; }); @@ -538,7 +538,7 @@ << (BlockToFix.getAddress() + PointerFieldOffset) << " to " << FieldName << " at " << EdgeI->second.Target->getAddress(); if (EdgeI->second.Target->hasName()) - dbgs() << " (" << EdgeI->second.Target->getName() << ")"; + dbgs() << " (" << *(EdgeI->second.Target->getName()) << ")"; dbgs() << "\n"; }); if (auto Err = skipEncodedPointer(PointerEncoding, RecordReader)) @@ -600,7 +600,7 @@ << (BlockToFix.getAddress() + PointerFieldOffset) << " to " << FieldName << " at " << TargetSym->getAddress(); if (TargetSym->hasName()) - dbgs() << " (" << TargetSym->getName() << ")"; + dbgs() << " (" << *TargetSym->getName() << ")"; dbgs() << "\n"; }); diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp --- a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp @@ -277,7 +277,7 @@ auto DefineExternalGOTSymbolIfPresent = createDefineExternalSectionStartAndEndSymbolsPass( [&](LinkGraph &LG, Symbol &Sym) -> SectionRangeSymbolDesc { - if (Sym.getName() == ELFGOTSymbolName) + if (*Sym.getName() == ELFGOTSymbolName) if (auto *GOTSection = G.findSectionByName( x86_64::GOTTableManager::getSectionName())) { GOTSymbol = &Sym; @@ -303,7 +303,7 @@ // Check for an existing defined symbol. for (auto *Sym : GOTSection->symbols()) - if (Sym->getName() == ELFGOTSymbolName) { + if (*Sym->getName() == ELFGOTSymbolName) { GOTSymbol = Sym; return Error::success(); } @@ -350,7 +350,7 @@ constexpr StringRef StartSymbolPrefix = "__start"; constexpr StringRef EndSymbolPrefix = "__end"; - auto SymName = Sym.getName(); + auto SymName = *Sym.getName(); if (SymName.startswith(StartSymbolPrefix)) { if (auto *Sec = G.findSectionByName(SymName.drop_front(StartSymbolPrefix.size()))) diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp b/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp --- a/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/JITLink.cpp @@ -105,7 +105,7 @@ << ", linkage: " << formatv("{0:6}", getLinkageName(Sym.getLinkage())) << ", scope: " << formatv("{0:8}", getScopeName(Sym.getScope())) << ", " << (Sym.isLive() ? "live" : "dead") << " - " - << (Sym.hasName() ? Sym.getName() : ""); + << (Sym.hasName() ? *Sym.getName() : ""); return OS; } @@ -117,7 +117,7 @@ auto &TargetSym = E.getTarget(); if (TargetSym.hasName()) - OS << TargetSym.getName(); + OS << *TargetSym.getName(); else { auto &TargetBlock = TargetSym.getBlock(); auto &TargetSec = TargetBlock.getSection(); @@ -147,6 +147,15 @@ B->~Block(); } +LinkGraph::~LinkGraph() { + for (auto *Sym : ExternalSymbols) { + Sym->~Symbol(); + } + for (auto *Sym : AbsoluteSymbols) { + Sym->~Symbol(); + } +} + Block &LinkGraph::splitBlock(Block &B, size_t SplitIndex, SplitBlockCache *Cache) { @@ -295,7 +304,7 @@ OS << formatv("-{0:x8}", -E.getAddend()); OS << ", kind = " << getEdgeKindName(E.getKind()) << ", target = "; if (E.getTarget().hasName()) - OS << E.getTarget().getName(); + OS << *E.getTarget().getName(); else OS << "addressable@" << formatv("{0:x16}", E.getTarget().getAddress()) << "+" @@ -365,7 +374,7 @@ ErrStream << "In graph " << G.getName() << ", section " << Sec.getName() << ": relocation target "; if (E.getTarget().hasName()) { - ErrStream << "\"" << E.getTarget().getName() << "\""; + ErrStream << "\"" << *E.getTarget().getName() << "\""; } else ErrStream << E.getTarget().getBlock().getSection().getName() << " + " << formatv("{0:x}", E.getOffset()); @@ -382,7 +391,7 @@ BestSymbolForBlock = Sym; if (BestSymbolForBlock) - ErrStream << BestSymbolForBlock->getName() << ", "; + ErrStream << *BestSymbolForBlock->getName() << ", "; else ErrStream << " @ "; diff --git a/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp b/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp --- a/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp @@ -200,13 +200,13 @@ for (auto *Sym : G->external_symbols()) { assert(!Sym->getAddress() && "External has already been assigned an address"); - assert(Sym->getName() != StringRef() && Sym->getName() != "" && + assert(Sym->hasName() && *Sym->getName() != "" && "Externals must be named"); SymbolLookupFlags LookupFlags = Sym->getLinkage() == Linkage::Weak ? SymbolLookupFlags::WeaklyReferencedSymbol : SymbolLookupFlags::RequiredSymbol; - UnresolvedExternals[Sym->getName()] = LookupFlags; + UnresolvedExternals[*Sym->getName()] = LookupFlags; } return UnresolvedExternals; } @@ -217,7 +217,7 @@ "External symbol is not at the start of its addressable block"); assert(!Sym->getAddress() && "Symbol already resolved"); assert(!Sym->isDefined() && "Symbol being resolved is already defined"); - auto ResultI = Result.find(Sym->getName()); + auto ResultI = Result.find(*Sym->getName()); if (ResultI != Result.end()) Sym->getAddressable().setAddress( orc::ExecutorAddr(ResultI->second.getAddress())); @@ -229,7 +229,7 @@ LLVM_DEBUG({ dbgs() << "Externals after applying lookup result:\n"; for (auto *Sym : G->external_symbols()) - dbgs() << " " << Sym->getName() << ": " + dbgs() << " " << *Sym->getName() << ": " << formatv("{0:x16}", Sym->getAddress().getValue()) << "\n"; }); } diff --git a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp --- a/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp +++ b/llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp @@ -712,7 +712,7 @@ LLVM_DEBUG({ dbgs() << " Adding symbol for c-string block " << B.getRange() << ": " - << (Sym.hasName() ? Sym.getName() : "") + << (Sym.hasName() ? *Sym.getName() : "") << " at offset " << formatv("{0:x}", Sym.getOffset()) << "\n"; }); @@ -805,7 +805,7 @@ LLVM_DEBUG({ dbgs() << " Updating compact unwind record at " << formatv("{0:x16}", CURec.getAddress()) << " to point to " - << (E.getTarget().hasName() ? E.getTarget().getName() + << (E.getTarget().hasName() ? *E.getTarget().getName() : StringRef()) << " (at " << formatv("{0:x16}", E.getTarget().getAddress()) << ")\n"; @@ -815,7 +815,7 @@ return make_error( "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/PerGraphGOTAndPLTStubsBuilder.h b/llvm/lib/ExecutionEngine/JITLink/PerGraphGOTAndPLTStubsBuilder.h --- a/llvm/lib/ExecutionEngine/JITLink/PerGraphGOTAndPLTStubsBuilder.h +++ b/llvm/lib/ExecutionEngine/JITLink/PerGraphGOTAndPLTStubsBuilder.h @@ -70,17 +70,17 @@ Symbol &getGOTEntry(Symbol &Target) { assert(Target.hasName() && "GOT edge cannot point to anonymous target"); - auto GOTEntryI = GOTEntries.find(Target.getName()); + auto GOTEntryI = GOTEntries.find(*(Target.getName())); // Build the entry if it doesn't exist. if (GOTEntryI == GOTEntries.end()) { auto &GOTEntry = impl().createGOTEntry(Target); LLVM_DEBUG({ - dbgs() << " Created GOT entry for " << Target.getName() << ": " + dbgs() << " Created GOT entry for " << *(Target.getName()) << ": " << GOTEntry << "\n"; }); GOTEntryI = - GOTEntries.insert(std::make_pair(Target.getName(), &GOTEntry)).first; + GOTEntries.insert(std::make_pair(*Target.getName(), &GOTEntry)).first; } assert(GOTEntryI != GOTEntries.end() && "Could not get GOT entry symbol"); @@ -92,16 +92,16 @@ Symbol &getPLTStub(Symbol &Target) { assert(Target.hasName() && "External branch edge can not point to an anonymous target"); - auto StubI = PLTStubs.find(Target.getName()); + auto StubI = PLTStubs.find(*Target.getName()); if (StubI == PLTStubs.end()) { auto &StubSymbol = impl().createPLTStub(Target); LLVM_DEBUG({ - dbgs() << " Created PLT stub for " << Target.getName() << ": " + dbgs() << " Created PLT stub for " << *Target.getName() << ": " << StubSymbol << "\n"; }); StubI = - PLTStubs.insert(std::make_pair(Target.getName(), &StubSymbol)).first; + PLTStubs.insert(std::make_pair(*Target.getName(), &StubSymbol)).first; } assert(StubI != PLTStubs.end() && "Count not get stub symbol"); diff --git a/llvm/lib/ExecutionEngine/Orc/COFFPlatform.cpp b/llvm/lib/ExecutionEngine/Orc/COFFPlatform.cpp --- a/llvm/lib/ExecutionEngine/Orc/COFFPlatform.cpp +++ b/llvm/lib/ExecutionEngine/Orc/COFFPlatform.cpp @@ -64,9 +64,9 @@ default: llvm_unreachable("Unrecognized architecture"); } - + auto SSP = CP.getExecutionSession().getSymbolStringPool(); auto G = std::make_unique( - "", TT, PointerSize, Endianness, + "", SSP, TT, PointerSize, Endianness, jitlink::getGenericEdgeKindName); auto &HeaderSection = G->createSection("__header", jitlink::MemProt::Read); auto &HeaderBlock = createHeaderBlock(*G, HeaderSection); @@ -730,7 +730,7 @@ jitlink::LinkGraph &G, MaterializationResponsibility &MR, bool IsBootstraping) { auto I = llvm::find_if(G.defined_symbols(), [this](jitlink::Symbol *Sym) { - return Sym->getName() == *CP.COFFHeaderStartSymbol; + return *Sym->getName() == *CP.COFFHeaderStartSymbol; }); assert(I != G.defined_symbols().end() && "Missing COFF header start symbol"); diff --git a/llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp b/llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp --- a/llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp @@ -59,8 +59,8 @@ // void *__dso_handle = &__dso_handle; auto G = std::make_unique( - "", TT, PointerSize, Endianness, - jitlink::getGenericEdgeKindName); + "", ENP.getExecutionSession().getSymbolStringPool(), TT, + PointerSize, Endianness, jitlink::getGenericEdgeKindName); auto &DSOHandleSection = G->createSection(".data.__dso_handle", jitlink::MemProt::Read); auto &DSOHandleBlock = G->createContentBlock( @@ -690,7 +690,7 @@ Config.PostAllocationPasses.push_back([this, &JD = MR.getTargetJITDylib()]( jitlink::LinkGraph &G) -> Error { auto I = llvm::find_if(G.defined_symbols(), [this](jitlink::Symbol *Sym) { - return Sym->getName() == *MP.DSOHandleSymbol; + return *Sym->getName() == *MP.DSOHandleSymbol; }); assert(I != G.defined_symbols().end() && "Missing DSO handle symbol"); { @@ -840,10 +840,14 @@ jitlink::LinkGraph &G, JITDylib &JD) { for (auto *Sym : G.external_symbols()) { - if (Sym->getName() == "__tls_get_addr") { - Sym->setName("___orc_rt_elfnix_tls_get_addr"); - } else if (Sym->getName() == "__tlsdesc_resolver") { - Sym->setName("___orc_rt_elfnix_tlsdesc_resolver"); + if (*Sym->getName() == "__tls_get_addr") { + auto TLSGetAddr = + MP.getExecutionSession().intern("___orc_rt_elfnix_tls_get_addr"); + Sym->setName(std::move(TLSGetAddr)); + } else if (*Sym->getName() == "__tlsdesc_resolver") { + auto TLSGetAddr = + MP.getExecutionSession().intern("___orc_rt_elfnix_tlsdesc_resolver"); + Sym->setName(std::move(TLSGetAddr)); } } diff --git a/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp --- a/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ExecutionUtils.cpp @@ -10,6 +10,7 @@ #include "llvm/ExecutionEngine/JITLink/x86_64.h" #include "llvm/ExecutionEngine/Orc/Layer.h" #include "llvm/ExecutionEngine/Orc/ObjectFileInterface.h" +#include "llvm/ExecutionEngine/Orc/SymbolStringPool.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Function.h" #include "llvm/IR/GlobalVariable.h" @@ -530,7 +531,8 @@ jitlink::x86_64::createAnonymousPointer(*G, Sec, &Target); auto NameCopy = G->allocateString(Twine(getImpPrefix()) + *KV.first); StringRef NameCopyRef = StringRef(NameCopy.data(), NameCopy.size()); - Ptr.setName(NameCopyRef); + auto SymbolName = G->getSymbolStringPool()->intern(NameCopyRef); + Ptr.setName(std::move(SymbolName)); Ptr.setLinkage(jitlink::Linkage::Strong); Ptr.setScope(jitlink::Scope::Default); diff --git a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp --- a/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp +++ b/llvm/lib/ExecutionEngine/Orc/IndirectionUtils.cpp @@ -409,7 +409,7 @@ auto SymSize = Sym.getSize() ? Sym.getSize() : B.getSize() - Sym.getOffset(); auto Content = makeArrayRef(SymStartInBlock, SymSize); - LLVM_DEBUG(dbgs() << "Adding self-relocations to " << Sym.getName() << "\n"); + LLVM_DEBUG(dbgs() << "Adding self-relocations to " << *Sym.getName() << "\n"); SmallDenseSet ExistingRelocations; for (auto &E : B.edges()) { diff --git a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp --- a/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp +++ b/llvm/lib/ExecutionEngine/Orc/MachOPlatform.cpp @@ -83,8 +83,8 @@ } auto G = std::make_unique( - "", TT, PointerSize, Endianness, - jitlink::getGenericEdgeKindName); + "", MOP.getExecutionSession().getSymbolStringPool(), TT, + PointerSize, Endianness, jitlink::getGenericEdgeKindName); auto &HeaderSection = G->createSection("__header", jitlink::MemProt::Read); auto &HeaderBlock = createHeaderBlock(*G, HeaderSection); @@ -673,7 +673,7 @@ Error MachOPlatform::MachOPlatformPlugin::associateJITDylibHeaderSymbol( jitlink::LinkGraph &G, MaterializationResponsibility &MR) { auto I = llvm::find_if(G.defined_symbols(), [this](jitlink::Symbol *Sym) { - return Sym->getName() == *MP.MachOHeaderStartSymbol; + return *Sym->getName() == *MP.MachOHeaderStartSymbol; }); assert(I != G.defined_symbols().end() && "Missing MachO header start symbol"); @@ -811,8 +811,10 @@ // Rename external references to __tlv_bootstrap to ___orc_rt_tlv_get_addr. for (auto *Sym : G.external_symbols()) - if (Sym->getName() == "__tlv_bootstrap") { - Sym->setName("___orc_rt_macho_tlv_get_addr"); + if (*Sym->getName() == "__tlv_bootstrap") { + auto TLSGetADDR = + MP.getExecutionSession().intern("___orc_rt_macho_tlv_get_addr"); + Sym->setName(std::move(TLSGetADDR)); break; } @@ -988,9 +990,11 @@ for (auto *Sym : G.defined_symbols()) { if (!Sym->hasName()) continue; - if (Sym->getName() == "___orc_rt_macho_register_ehframe_section") + + auto SymName = *Sym->getName(); + if (SymName == "___orc_rt_macho_register_ehframe_section") orc_rt_macho_register_ehframe_section = ExecutorAddr(Sym->getAddress()); - else if (Sym->getName() == "___orc_rt_macho_deregister_ehframe_section") + else if (SymName == "___orc_rt_macho_deregister_ehframe_section") orc_rt_macho_deregister_ehframe_section = ExecutorAddr(Sym->getAddress()); if (orc_rt_macho_register_ehframe_section && diff --git a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp --- a/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp +++ b/llvm/lib/ExecutionEngine/Orc/ObjectLinkingLayer.cpp @@ -55,7 +55,7 @@ if (Sym->isCallable()) Flags |= JITSymbolFlags::Callable; - LGI.SymbolFlags[ES.intern(Sym->getName())] = Flags; + LGI.SymbolFlags[Sym->getName()] = Flags; } if ((G.getTargetTriple().isOSBinFormatMachO() && hasMachOInitSection(G)) || @@ -101,7 +101,7 @@ void discard(const JITDylib &JD, const SymbolStringPtr &Name) override { for (auto *Sym : G->defined_symbols()) - if (Sym->getName() == *Name) { + if (Sym->getName() == Name) { assert(Sym->getLinkage() == Linkage::Weak && "Discarding non-weak definition"); G->makeExternal(*Sym); @@ -203,15 +203,13 @@ } Error notifyResolved(LinkGraph &G) override { - auto &ES = Layer.getExecutionSession(); - SymbolFlagsMap ExtraSymbolsToClaim; bool AutoClaim = Layer.AutoClaimObjectSymbols; SymbolMap InternedResult; for (auto *Sym : G.defined_symbols()) if (Sym->hasName() && Sym->getScope() != Scope::Local) { - auto InternedName = ES.intern(Sym->getName()); + auto InternedName = Sym->getName(); JITSymbolFlags Flags; if (Sym->isCallable()) @@ -230,7 +228,7 @@ for (auto *Sym : G.absolute_symbols()) if (Sym->hasName() && Sym->getScope() != Scope::Local) { - auto InternedName = ES.intern(Sym->getName()); + auto InternedName = Sym->getName(); JITSymbolFlags Flags; if (Sym->isCallable()) Flags |= JITSymbolFlags::Callable; @@ -350,9 +348,8 @@ // Lazily populated map of blocks to BlockSymbolDependencies values. class BlockDependenciesMap { public: - BlockDependenciesMap(ExecutionSession &ES, - DenseMap> BlockDeps) - : ES(ES), BlockDeps(std::move(BlockDeps)) {} + BlockDependenciesMap(DenseMap> BlockDeps) + : BlockDeps(std::move(BlockDeps)) {} const BlockSymbolDependencies &operator[](const Block &B) { // Check the cache first. @@ -378,15 +375,6 @@ .first->second; } - SymbolStringPtr &getInternedName(Symbol &Sym) { - auto I = NameCache.find(&Sym); - if (I != NameCache.end()) - return I->second; - - return NameCache.insert(std::make_pair(&Sym, ES.intern(Sym.getName()))) - .first->second; - } - private: BlockSymbolDependencies &getBlockImmediateDeps(Block &B) { // Check the cache first. @@ -399,9 +387,9 @@ auto &Tgt = E.getTarget(); if (Tgt.getScope() != Scope::Local) { if (Tgt.isExternal()) - BIDCacheVal.External.insert(getInternedName(Tgt)); + BIDCacheVal.External.insert(Tgt.getName()); else - BIDCacheVal.Internal.insert(getInternedName(Tgt)); + BIDCacheVal.Internal.insert(Tgt.getName()); } } @@ -410,15 +398,12 @@ .first->second; } - ExecutionSession &ES; DenseMap> BlockDeps; - DenseMap NameCache; DenseMap BlockImmediateDepsCache; DenseMap BlockTransitiveDepsCache; }; Error claimOrExternalizeWeakAndCommonSymbols(LinkGraph &G) { - auto &ES = Layer.getExecutionSession(); SymbolFlagsMap NewSymbolsToClaim; std::vector> NameToSym; @@ -426,8 +411,8 @@ auto ProcessSymbol = [&](Symbol *Sym) { if (Sym->hasName() && Sym->getLinkage() == Linkage::Weak && Sym->getScope() != Scope::Local) { - auto Name = ES.intern(Sym->getName()); - if (!MR->getSymbols().count(ES.intern(Sym->getName()))) { + auto Name = Sym->getName(); + if (!MR->getSymbols().count(Name)) { JITSymbolFlags SF = JITSymbolFlags::Weak; if (Sym->getScope() == Scope::Default) SF |= JITSymbolFlags::Exported; @@ -455,15 +440,13 @@ } Error markResponsibilitySymbolsLive(LinkGraph &G) const { - auto &ES = Layer.getExecutionSession(); for (auto *Sym : G.defined_symbols()) - if (Sym->hasName() && MR->getSymbols().count(ES.intern(Sym->getName()))) + if (Sym->hasName() && MR->getSymbols().count(Sym->getName())) Sym->setLive(true); return Error::success(); } Error computeNamedSymbolDependencies(LinkGraph &G) { - auto &ES = MR->getTargetJITDylib().getExecutionSession(); auto BlockDeps = computeBlockNonLocalDeps(G); // Compute dependencies for symbols defined in the JITLink graph. @@ -479,7 +462,7 @@ if (SymDeps.External.empty() && SymDeps.Internal.empty()) continue; - auto SymName = ES.intern(Sym->getName()); + auto SymName = Sym->getName(); if (!SymDeps.External.empty()) ExternalNamedSymbolDeps[SymName] = SymDeps.External; if (!SymDeps.Internal.empty()) @@ -504,11 +487,9 @@ ExternalNamedSymbolDeps[Name].insert(S); } else { if (Sym->isExternal()) - ExternalNamedSymbolDeps[Name].insert( - BlockDeps.getInternedName(*Sym)); + ExternalNamedSymbolDeps[Name].insert(Sym->getName()); else - InternalNamedSymbolDeps[Name].insert( - BlockDeps.getInternedName(*Sym)); + InternalNamedSymbolDeps[Name].insert(Sym->getName()); } } } @@ -578,8 +559,7 @@ for (auto &KV : BlockInfos) BlockDeps[KV.first] = std::move(KV.second.Dependencies); - return BlockDependenciesMap(Layer.getExecutionSession(), - std::move(BlockDeps)); + return BlockDependenciesMap(std::move(BlockDeps)); } void registerDependencies(const SymbolDependenceMap &QueryDeps) { diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-coff.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-coff.cpp --- a/llvm/tools/llvm-jitlink/llvm-jitlink-coff.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink-coff.cpp @@ -118,7 +118,7 @@ // then add it to the GOT entry info table. if (Sym->getSize() != 0) { if (auto TS = getCOFFGOTTarget(G, Sym->getBlock())) - FileInfo.GOTEntryInfos[TS->getName()] = { + FileInfo.GOTEntryInfos[*TS->getName()] = { Sym->getSymbolContent(), Sym->getAddress().getValue()}; else return TS.takeError(); @@ -130,8 +130,8 @@ inconvertibleErrorCode()); if (auto TS = getCOFFStubTarget(G, Sym->getBlock())) - FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue()}; + FileInfo.StubInfos[*TS->getName()] = {Sym->getSymbolContent(), + Sym->getAddress().getValue()}; else return TS.takeError(); SectionContainsContent = true; @@ -139,12 +139,12 @@ if (Sym->hasName()) { if (Sym->isSymbolZeroFill()) { - S.SymbolInfos[Sym->getName()] = {Sym->getSize(), - Sym->getAddress().getValue()}; + S.SymbolInfos[*Sym->getName()] = {Sym->getSize(), + Sym->getAddress().getValue()}; SectionContainsZeroFill = true; } else { - S.SymbolInfos[Sym->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue()}; + S.SymbolInfos[*Sym->getName()] = {Sym->getSymbolContent(), + Sym->getAddress().getValue()}; SectionContainsContent = true; } } diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp --- a/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink-elf.cpp @@ -120,7 +120,7 @@ // then add it to the GOT entry info table. if (Sym->getSize() != 0) { if (auto TS = getELFGOTTarget(G, Sym->getBlock())) - FileInfo.GOTEntryInfos[TS->getName()] = { + FileInfo.GOTEntryInfos[*(TS->getName())] = { Sym->getSymbolContent(), Sym->getAddress().getValue()}; else return TS.takeError(); @@ -132,8 +132,8 @@ inconvertibleErrorCode()); if (auto TS = getELFStubTarget(G, Sym->getBlock())) - FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue()}; + FileInfo.StubInfos[*TS->getName()] = {Sym->getSymbolContent(), + Sym->getAddress().getValue()}; else return TS.takeError(); SectionContainsContent = true; @@ -141,12 +141,12 @@ if (Sym->hasName()) { if (Sym->isSymbolZeroFill()) { - S.SymbolInfos[Sym->getName()] = {Sym->getSize(), - Sym->getAddress().getValue()}; + S.SymbolInfos[*Sym->getName()] = {Sym->getSize(), + Sym->getAddress().getValue()}; SectionContainsZeroFill = true; } else { - S.SymbolInfos[Sym->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue()}; + S.SymbolInfos[*Sym->getName()] = {Sym->getSymbolContent(), + Sym->getAddress().getValue()}; SectionContainsContent = true; } } diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp --- a/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink-macho.cpp @@ -118,7 +118,7 @@ inconvertibleErrorCode()); if (auto TS = getMachOGOTTarget(G, Sym->getBlock())) - FileInfo.GOTEntryInfos[TS->getName()] = { + FileInfo.GOTEntryInfos[*TS->getName()] = { Sym->getSymbolContent(), Sym->getAddress().getValue()}; else return TS.takeError(); @@ -129,19 +129,19 @@ inconvertibleErrorCode()); if (auto TS = getMachOStubTarget(G, Sym->getBlock())) - FileInfo.StubInfos[TS->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue()}; + FileInfo.StubInfos[*TS->getName()] = {Sym->getSymbolContent(), + Sym->getAddress().getValue()}; else return TS.takeError(); SectionContainsContent = true; } else if (Sym->hasName()) { if (Sym->isSymbolZeroFill()) { - S.SymbolInfos[Sym->getName()] = {Sym->getSize(), - Sym->getAddress().getValue()}; + S.SymbolInfos[*Sym->getName()] = {Sym->getSize(), + Sym->getAddress().getValue()}; SectionContainsZeroFill = true; } else { - S.SymbolInfos[Sym->getName()] = {Sym->getSymbolContent(), - Sym->getAddress().getValue()}; + S.SymbolInfos[*Sym->getName()] = {Sym->getSymbolContent(), + Sym->getAddress().getValue()}; SectionContainsContent = true; } } diff --git a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp --- a/llvm/tools/llvm-jitlink/llvm-jitlink.cpp +++ b/llvm/tools/llvm-jitlink/llvm-jitlink.cpp @@ -352,30 +352,30 @@ if (!Sym->hasName()) continue; + auto SymName = *(Sym->getName()); + if (Sym->getLinkage() == Linkage::Weak) { - if (!S.CanonicalWeakDefs.count(Sym->getName()) || - S.CanonicalWeakDefs[Sym->getName()] != G.getName()) { - LLVM_DEBUG({ - dbgs() << " Externalizing weak symbol " << Sym->getName() << "\n"; - }); + if (!S.CanonicalWeakDefs.count(SymName) || + S.CanonicalWeakDefs[SymName] != G.getName()) { + LLVM_DEBUG( + { dbgs() << " Externalizing weak symbol " << SymName << "\n"; }); DefinitionsToRemove.push_back(Sym); } else { - LLVM_DEBUG({ - dbgs() << " Making weak symbol " << Sym->getName() << " strong\n"; - }); - if (S.HarnessExternals.count(Sym->getName())) + LLVM_DEBUG( + { dbgs() << " Making weak symbol " << SymName << " strong\n"; }); + if (S.HarnessExternals.count(SymName)) Sym->setScope(Scope::Default); else Sym->setScope(Scope::Hidden); Sym->setLinkage(Linkage::Strong); } - } else if (S.HarnessExternals.count(Sym->getName())) { - LLVM_DEBUG(dbgs() << " Promoting " << Sym->getName() << "\n"); + } else if (S.HarnessExternals.count(SymName)) { + LLVM_DEBUG(dbgs() << " Promoting " << SymName << "\n"); Sym->setScope(Scope::Default); Sym->setLive(true); continue; - } else if (S.HarnessDefinitions.count(Sym->getName())) { - LLVM_DEBUG(dbgs() << " Externalizing " << Sym->getName() << "\n"); + } else if (S.HarnessDefinitions.count(SymName)) { + LLVM_DEBUG(dbgs() << " Externalizing " << SymName << "\n"); DefinitionsToRemove.push_back(Sym); } } diff --git a/llvm/unittests/ExecutionEngine/JITLink/EHFrameSupportTests.cpp b/llvm/unittests/ExecutionEngine/JITLink/EHFrameSupportTests.cpp --- a/llvm/unittests/ExecutionEngine/JITLink/EHFrameSupportTests.cpp +++ b/llvm/unittests/ExecutionEngine/JITLink/EHFrameSupportTests.cpp @@ -210,7 +210,7 @@ ASSERT_TRUE(!!CFIBI.getPCBeginEdge()); auto &PCBeginTarget = CFIBI.getPCBeginEdge()->getTarget(); ASSERT_TRUE(PCBeginTarget.hasName()); - Targets.insert(PCBeginTarget.getName()); + Targets.insert(*PCBeginTarget.getName()); // If the FDE points at CIEs[0] (the CIE without a personality) then it // should not have an LSDA. If it points to CIEs[1] then it should have @@ -235,7 +235,7 @@ // Make '_a' external. for (auto *Sym : G->defined_symbols()) - if (Sym->hasName() && Sym->getName() == "_a") { + if (Sym->hasName() && *Sym->getName() == "_a") { G->makeExternal(*Sym); break; } diff --git a/llvm/unittests/ExecutionEngine/JITLink/LinkGraphTests.cpp b/llvm/unittests/ExecutionEngine/JITLink/LinkGraphTests.cpp --- a/llvm/unittests/ExecutionEngine/JITLink/LinkGraphTests.cpp +++ b/llvm/unittests/ExecutionEngine/JITLink/LinkGraphTests.cpp @@ -8,6 +8,7 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ExecutionEngine/JITLink/JITLink.h" +#include "llvm/ExecutionEngine/Orc/SymbolStringPool.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Memory.h" #include "gtest/gtest.h" @@ -68,6 +69,23 @@ EXPECT_TRUE(llvm::empty(G.absolute_symbols())); EXPECT_TRUE(llvm::empty(G.defined_symbols())); EXPECT_TRUE(llvm::empty(G.blocks())); + EXPECT_TRUE(G.getSymbolStringPool()); +} + +TEST(LinkGraphTest, ConstructionWithPool) { + auto SSP = std::make_shared(); + // Check that LinkGraph construction works as expected. + LinkGraph G("foo", SSP, Triple("x86_64-apple-darwin"), 8, support::little, + getGenericEdgeKindName); + EXPECT_EQ(G.getName(), "foo"); + EXPECT_EQ(G.getTargetTriple().str(), "x86_64-apple-darwin"); + EXPECT_EQ(G.getPointerSize(), 8U); + EXPECT_EQ(G.getEndianness(), support::little); + EXPECT_TRUE(llvm::empty(G.external_symbols())); + EXPECT_TRUE(llvm::empty(G.absolute_symbols())); + EXPECT_TRUE(llvm::empty(G.defined_symbols())); + EXPECT_TRUE(llvm::empty(G.blocks())); + EXPECT_EQ(&*G.getSymbolStringPool(), &*SSP); } TEST(LinkGraphTest, AddressAccess) { @@ -682,3 +700,17 @@ EXPECT_EQ(E2->getOffset(), 4U); } } + +TEST(LinkGraphTest, SymbolPoolSupport) { + // Check that we can get addresses for blocks, symbols, and edges. + LinkGraph G("foo", Triple("x86_64-apple-darwin"), 8, support::little, + getGenericEdgeKindName); + + auto &Sec1 = G.createSection("__data.1", MemProt::Read | MemProt::Write); + orc::ExecutorAddr B1Addr(0x1000); + auto &B1 = G.createContentBlock(Sec1, BlockContent, B1Addr, 8, 0); + auto &S1 = G.addDefinedSymbol(B1, 4, "S1", 4, Linkage::Strong, Scope::Default, + false, false); + auto SN1 = G.getSymbolStringPool()->intern("S1"); + ASSERT_EQ(S1.getName(), SN1); +} \ No newline at end of file