summaryrefslogtreecommitdiff
path: root/llvm/lib/ExecutionEngine/JITLink
diff options
context:
space:
mode:
authorMichael Kruse <llvm-project@meinersbur.de>2025-01-03 10:22:51 +0100
committerMichael Kruse <llvm-project@meinersbur.de>2025-01-03 10:22:51 +0100
commit38500d63e14ce340236840f60d356cdefb56a52c (patch)
tree17edbec446ce9b50d2f215a483b83afb293a635d /llvm/lib/ExecutionEngine/JITLink
parent1a3d5daaef7a6a63448a497da3eff7fc9e23df26 (diff)
parent27f30029741ecf023baece7b3dde1ff9011ffefc (diff)
Merge branch 'main' into users/meinersbur/flang_runtime_split-headersusers/meinersbur/flang_runtime_split-headers
Diffstat (limited to 'llvm/lib/ExecutionEngine/JITLink')
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/COFF.cpp5
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/COFFDirectiveParser.cpp24
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp113
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h38
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp76
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/DefineExternalSectionStartAndEndSymbols.h18
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/ELF.cpp21
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h14
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp22
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp31
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/ELF_i386.cpp17
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/ELF_loongarch.cpp22
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp35
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp17
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp17
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/JITLink.cpp31
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/JITLinkGeneric.cpp3
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp10
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/MachO.cpp8
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp26
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h4
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp12
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp11
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/PerGraphGOTAndPLTStubsBuilder.h4
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/aarch32.cpp4
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/aarch64.cpp5
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/loongarch.cpp2
-rw-r--r--llvm/lib/ExecutionEngine/JITLink/x86_64.cpp4
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");