Skip to content

Commit 4eaff6c

Browse files
committed
[JITLink] Use target triple for LinkGraph pointer size and endianness.
Removes LinkGraph's PointerSize and Endianness members and uses the triple to find these values instead. Also removes some redundant Triple copies.
1 parent 9b5857a commit 4eaff6c

25 files changed

+128
-269
lines changed

llvm/include/llvm/ExecutionEngine/JITLink/JITLink.h

+10-25
Original file line numberDiff line numberDiff line change
@@ -1007,26 +1007,12 @@ class LinkGraph {
10071007
using GetEdgeKindNameFunction = const char *(*)(Edge::Kind);
10081008

10091009
LinkGraph(std::string Name, std::shared_ptr<orc::SymbolStringPool> SSP,
1010-
const Triple &TT, SubtargetFeatures Features, unsigned PointerSize,
1011-
llvm::endianness Endianness,
1010+
Triple TT, SubtargetFeatures Features,
10121011
GetEdgeKindNameFunction GetEdgeKindName)
1013-
: Name(std::move(Name)), SSP(std::move(SSP)), TT(TT),
1014-
Features(std::move(Features)), PointerSize(PointerSize),
1015-
Endianness(Endianness), GetEdgeKindName(std::move(GetEdgeKindName)) {}
1016-
1017-
LinkGraph(std::string Name, std::shared_ptr<orc::SymbolStringPool> SSP,
1018-
const Triple &TT, unsigned PointerSize, llvm::endianness Endianness,
1019-
GetEdgeKindNameFunction GetEdgeKindName)
1020-
: LinkGraph(std::move(Name), std::move(SSP), TT, SubtargetFeatures(),
1021-
PointerSize, Endianness, GetEdgeKindName) {}
1022-
1023-
LinkGraph(std::string Name, std::shared_ptr<orc::SymbolStringPool> SSP,
1024-
const Triple &TT, GetEdgeKindNameFunction GetEdgeKindName)
1025-
: LinkGraph(std::move(Name), std::move(SSP), TT, SubtargetFeatures(),
1026-
Triple::getArchPointerBitWidth(TT.getArch()) / 8,
1027-
TT.isLittleEndian() ? endianness::little : endianness::big,
1028-
GetEdgeKindName) {
1029-
assert(!(Triple::getArchPointerBitWidth(TT.getArch()) % 8) &&
1012+
: Name(std::move(Name)), SSP(std::move(SSP)), TT(std::move(TT)),
1013+
Features(std::move(Features)),
1014+
GetEdgeKindName(std::move(GetEdgeKindName)) {
1015+
assert(!(Triple::getArchPointerBitWidth(this->TT.getArch()) % 8) &&
10301016
"Arch bitwidth is not a multiple of 8");
10311017
}
10321018

@@ -1047,10 +1033,12 @@ class LinkGraph {
10471033
const SubtargetFeatures &getFeatures() const { return Features; }
10481034

10491035
/// Returns the pointer size for use in this graph.
1050-
unsigned getPointerSize() const { return PointerSize; }
1036+
unsigned getPointerSize() const { return TT.getArchPointerBitWidth() / 8; }
10511037

10521038
/// Returns the endianness of content in this graph.
1053-
llvm::endianness getEndianness() const { return Endianness; }
1039+
llvm::endianness getEndianness() const {
1040+
return TT.isLittleEndian() ? endianness::little : endianness::big;
1041+
}
10541042

10551043
const char *getEdgeKindName(Edge::Kind K) const { return GetEdgeKindName(K); }
10561044

@@ -1640,8 +1628,6 @@ class LinkGraph {
16401628
std::shared_ptr<orc::SymbolStringPool> SSP;
16411629
Triple TT;
16421630
SubtargetFeatures Features;
1643-
unsigned PointerSize;
1644-
llvm::endianness Endianness;
16451631
GetEdgeKindNameFunction GetEdgeKindName = nullptr;
16461632
DenseMap<StringRef, std::unique_ptr<Section>> Sections;
16471633
// FIXME(jared): these should become dense maps
@@ -2039,8 +2025,7 @@ createLinkGraphFromObject(MemoryBufferRef ObjectBuffer,
20392025

20402026
/// Create a \c LinkGraph defining the given absolute symbols.
20412027
std::unique_ptr<LinkGraph>
2042-
absoluteSymbolsLinkGraph(const Triple &TT,
2043-
std::shared_ptr<orc::SymbolStringPool> SSP,
2028+
absoluteSymbolsLinkGraph(Triple TT, std::shared_ptr<orc::SymbolStringPool> SSP,
20442029
orc::SymbolMap Symbols);
20452030

20462031
/// Link the given graph.

llvm/include/llvm/ExecutionEngine/JITLink/JITLinkMemoryManager.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "llvm/Support/MSVCErrorWorkarounds.h"
2626
#include "llvm/Support/Memory.h"
2727
#include "llvm/Support/RecyclingAllocator.h"
28+
#include "llvm/TargetParser/Triple.h"
2829

2930
#include <cassert>
3031
#include <cstdint>
@@ -322,14 +323,14 @@ class SimpleSegmentAlloc {
322323
JITLinkMemoryManager::InFlightAlloc::OnFinalizedFunction;
323324

324325
static void Create(JITLinkMemoryManager &MemMgr,
325-
std::shared_ptr<orc::SymbolStringPool> SSP,
326+
std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT,
326327
const JITLinkDylib *JD, SegmentMap Segments,
327328
OnCreatedFunction OnCreated);
328329

329330
static Expected<SimpleSegmentAlloc>
330331
Create(JITLinkMemoryManager &MemMgr,
331-
std::shared_ptr<orc::SymbolStringPool> SSP, const JITLinkDylib *JD,
332-
SegmentMap Segments);
332+
std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT,
333+
const JITLinkDylib *JD, SegmentMap Segments);
333334

334335
SimpleSegmentAlloc(SimpleSegmentAlloc &&);
335336
SimpleSegmentAlloc &operator=(SimpleSegmentAlloc &&);

llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp

+2-14
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,8 @@ COFFLinkGraphBuilder::COFFLinkGraphBuilder(
3232
LinkGraph::GetEdgeKindNameFunction GetEdgeKindName)
3333
: Obj(Obj),
3434
G(std::make_unique<LinkGraph>(Obj.getFileName().str(), std::move(SSP),
35-
createTripleWithCOFFFormat(TT),
36-
std::move(Features), getPointerSize(Obj),
37-
getEndianness(Obj),
35+
createTripleWithCOFFFormat(std::move(TT)),
36+
std::move(Features),
3837
std::move(GetEdgeKindName))) {
3938
LLVM_DEBUG({
4039
dbgs() << "Created COFFLinkGraphBuilder for \"" << Obj.getFileName()
@@ -44,17 +43,6 @@ COFFLinkGraphBuilder::COFFLinkGraphBuilder(
4443

4544
COFFLinkGraphBuilder::~COFFLinkGraphBuilder() = default;
4645

47-
unsigned
48-
COFFLinkGraphBuilder::getPointerSize(const object::COFFObjectFile &Obj) {
49-
return Obj.getBytesInAddress();
50-
}
51-
52-
llvm::endianness
53-
COFFLinkGraphBuilder::getEndianness(const object::COFFObjectFile &Obj) {
54-
return Obj.isLittleEndian() ? llvm::endianness::little
55-
: llvm::endianness::big;
56-
}
57-
5846
uint64_t COFFLinkGraphBuilder::getSectionSize(const object::COFFObjectFile &Obj,
5947
const object::coff_section *Sec) {
6048
// Consider the difference between executable form and object form.

llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h

+2-3
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,8 @@ ELFLinkGraphBuilder<ELFT>::ELFLinkGraphBuilder(
194194
SubtargetFeatures Features, StringRef FileName,
195195
LinkGraph::GetEdgeKindNameFunction GetEdgeKindName)
196196
: ELFLinkGraphBuilderBase(std::make_unique<LinkGraph>(
197-
FileName.str(), std::move(SSP), Triple(std::move(TT)),
198-
std::move(Features), ELFT::Is64Bits ? 8 : 4,
199-
llvm::endianness(ELFT::Endianness), std::move(GetEdgeKindName))),
197+
FileName.str(), std::move(SSP), std::move(TT), std::move(Features),
198+
std::move(GetEdgeKindName))),
200199
Obj(Obj) {
201200
LLVM_DEBUG(
202201
{ dbgs() << "Created ELFLinkGraphBuilder for \"" << FileName << "\""; });

llvm/lib/ExecutionEngine/JITLink/JITLink.cpp

+3-22
Original file line numberDiff line numberDiff line change
@@ -507,32 +507,13 @@ createLinkGraphFromObject(MemoryBufferRef ObjectBuffer,
507507
}
508508

509509
std::unique_ptr<LinkGraph>
510-
absoluteSymbolsLinkGraph(const Triple &TT,
511-
std::shared_ptr<orc::SymbolStringPool> SSP,
510+
absoluteSymbolsLinkGraph(Triple TT, std::shared_ptr<orc::SymbolStringPool> SSP,
512511
orc::SymbolMap Symbols) {
513-
unsigned PointerSize;
514-
endianness Endianness =
515-
TT.isLittleEndian() ? endianness::little : endianness::big;
516-
switch (TT.getArch()) {
517-
case Triple::aarch64:
518-
case llvm::Triple::riscv64:
519-
case Triple::x86_64:
520-
PointerSize = 8;
521-
break;
522-
case llvm::Triple::arm:
523-
case llvm::Triple::riscv32:
524-
case llvm::Triple::x86:
525-
PointerSize = 4;
526-
break;
527-
default:
528-
llvm::report_fatal_error("unhandled target architecture");
529-
}
530-
531512
static std::atomic<uint64_t> Counter = {0};
532513
auto Index = Counter.fetch_add(1, std::memory_order_relaxed);
533514
auto G = std::make_unique<LinkGraph>(
534-
"<Absolute Symbols " + std::to_string(Index) + ">", std::move(SSP), TT,
535-
PointerSize, Endianness, /*GetEdgeKindName=*/nullptr);
515+
"<Absolute Symbols " + std::to_string(Index) + ">", std::move(SSP),
516+
std::move(TT), SubtargetFeatures(), getGenericEdgeKindName);
536517
for (auto &[Name, Def] : Symbols) {
537518
auto &Sym =
538519
G->addAbsoluteSymbol(*Name, Def.getAddress(), /*Size=*/0,

llvm/lib/ExecutionEngine/JITLink/JITLinkMemoryManager.cpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,8 @@ orc::shared::AllocActions &BasicLayout::graphAllocActions() {
145145

146146
void SimpleSegmentAlloc::Create(JITLinkMemoryManager &MemMgr,
147147
std::shared_ptr<orc::SymbolStringPool> SSP,
148-
const JITLinkDylib *JD, SegmentMap Segments,
148+
Triple TT, const JITLinkDylib *JD,
149+
SegmentMap Segments,
149150
OnCreatedFunction OnCreated) {
150151

151152
static_assert(orc::AllocGroup::NumGroups == 32,
@@ -156,8 +157,9 @@ void SimpleSegmentAlloc::Create(JITLinkMemoryManager &MemMgr,
156157
"__---.finalize", "__R--.finalize", "__-W-.finalize", "__RW-.finalize",
157158
"__--X.finalize", "__R-X.finalize", "__-WX.finalize", "__RWX.finalize"};
158159

159-
auto G = std::make_unique<LinkGraph>("", std::move(SSP), Triple(), 0,
160-
llvm::endianness::native, nullptr);
160+
auto G =
161+
std::make_unique<LinkGraph>("", std::move(SSP), std::move(TT),
162+
SubtargetFeatures(), getGenericEdgeKindName);
161163
orc::AllocGroupSmallMap<Block *> ContentBlocks;
162164

163165
orc::ExecutorAddr NextAddr(0x100000);
@@ -201,13 +203,12 @@ void SimpleSegmentAlloc::Create(JITLinkMemoryManager &MemMgr,
201203
});
202204
}
203205

204-
Expected<SimpleSegmentAlloc>
205-
SimpleSegmentAlloc::Create(JITLinkMemoryManager &MemMgr,
206-
std::shared_ptr<orc::SymbolStringPool> SSP,
207-
const JITLinkDylib *JD, SegmentMap Segments) {
206+
Expected<SimpleSegmentAlloc> SimpleSegmentAlloc::Create(
207+
JITLinkMemoryManager &MemMgr, std::shared_ptr<orc::SymbolStringPool> SSP,
208+
Triple TT, const JITLinkDylib *JD, SegmentMap Segments) {
208209
std::promise<MSVCPExpected<SimpleSegmentAlloc>> AllocP;
209210
auto AllocF = AllocP.get_future();
210-
Create(MemMgr, std::move(SSP), JD, std::move(Segments),
211+
Create(MemMgr, std::move(SSP), std::move(TT), JD, std::move(Segments),
211212
[&](Expected<SimpleSegmentAlloc> Result) {
212213
AllocP.set_value(std::move(Result));
213214
});

llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp

+4-15
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ MachOLinkGraphBuilder::MachOLinkGraphBuilder(
5353
std::shared_ptr<orc::SymbolStringPool> SSP, Triple TT,
5454
SubtargetFeatures Features,
5555
LinkGraph::GetEdgeKindNameFunction GetEdgeKindName)
56-
: Obj(Obj), G(std::make_unique<LinkGraph>(
57-
std::string(Obj.getFileName()), std::move(SSP),
58-
std::move(TT), std::move(Features), getPointerSize(Obj),
59-
getEndianness(Obj), std::move(GetEdgeKindName))) {
56+
: Obj(Obj),
57+
G(std::make_unique<LinkGraph>(
58+
std::string(Obj.getFileName()), std::move(SSP), std::move(TT),
59+
std::move(Features), std::move(GetEdgeKindName))) {
6060
auto &MachHeader = Obj.getHeader64();
6161
SubsectionsViaSymbols = MachHeader.flags & MachO::MH_SUBSECTIONS_VIA_SYMBOLS;
6262
}
@@ -104,17 +104,6 @@ bool MachOLinkGraphBuilder::isZeroFillSection(const NormalizedSection &NSec) {
104104
}
105105
}
106106

107-
unsigned
108-
MachOLinkGraphBuilder::getPointerSize(const object::MachOObjectFile &Obj) {
109-
return Obj.is64Bit() ? 8 : 4;
110-
}
111-
112-
llvm::endianness
113-
MachOLinkGraphBuilder::getEndianness(const object::MachOObjectFile &Obj) {
114-
return Obj.isLittleEndian() ? llvm::endianness::little
115-
: llvm::endianness::big;
116-
}
117-
118107
Section &MachOLinkGraphBuilder::getCommonSection() {
119108
if (!CommonSection)
120109
CommonSection = &G->createSection(CommonSectionName,

llvm/lib/ExecutionEngine/Orc/COFFPlatform.cpp

+3-15
Original file line numberDiff line numberDiff line change
@@ -54,22 +54,10 @@ class COFFHeaderMaterializationUnit : public MaterializationUnit {
5454
StringRef getName() const override { return "COFFHeaderMU"; }
5555

5656
void materialize(std::unique_ptr<MaterializationResponsibility> R) override {
57-
unsigned PointerSize;
58-
llvm::endianness Endianness;
59-
const auto &TT = CP.getExecutionSession().getTargetTriple();
60-
61-
switch (TT.getArch()) {
62-
case Triple::x86_64:
63-
PointerSize = 8;
64-
Endianness = llvm::endianness::little;
65-
break;
66-
default:
67-
llvm_unreachable("Unrecognized architecture");
68-
}
69-
7057
auto G = std::make_unique<jitlink::LinkGraph>(
71-
"<COFFHeaderMU>", CP.getExecutionSession().getSymbolStringPool(), TT,
72-
PointerSize, Endianness, jitlink::getGenericEdgeKindName);
58+
"<COFFHeaderMU>", CP.getExecutionSession().getSymbolStringPool(),
59+
CP.getExecutionSession().getTargetTriple(), SubtargetFeatures(),
60+
jitlink::getGenericEdgeKindName);
7361
auto &HeaderSection = G->createSection("__header", MemProt::Read);
7462
auto &HeaderBlock = createHeaderBlock(*G, HeaderSection);
7563

llvm/lib/ExecutionEngine/Orc/DebugObjectManagerPlugin.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -331,9 +331,9 @@ Expected<SimpleSegmentAlloc> ELFDebugObject::finalizeWorkingMemory() {
331331
size_t Size = Buffer->getBufferSize();
332332

333333
// Allocate working memory for debug object in read-only segment.
334-
auto Alloc =
335-
SimpleSegmentAlloc::Create(MemMgr, ES.getSymbolStringPool(), JD,
336-
{{MemProt::Read, {Size, Align(PageSize)}}});
334+
auto Alloc = SimpleSegmentAlloc::Create(
335+
MemMgr, ES.getSymbolStringPool(), ES.getTargetTriple(), JD,
336+
{{MemProt::Read, {Size, Align(PageSize)}}});
337337
if (!Alloc)
338338
return Alloc;
339339

llvm/lib/ExecutionEngine/Orc/ELFNixPlatform.cpp

+11-43
Original file line numberDiff line numberDiff line change
@@ -40,34 +40,10 @@ getArgDataBufferType(const ArgTs &...Args) {
4040

4141
std::unique_ptr<jitlink::LinkGraph> createPlatformGraph(ELFNixPlatform &MOP,
4242
std::string Name) {
43-
unsigned PointerSize;
44-
llvm::endianness Endianness;
45-
const auto &TT = MOP.getExecutionSession().getTargetTriple();
46-
47-
switch (TT.getArch()) {
48-
case Triple::x86_64:
49-
PointerSize = 8;
50-
Endianness = llvm::endianness::little;
51-
break;
52-
case Triple::aarch64:
53-
PointerSize = 8;
54-
Endianness = llvm::endianness::little;
55-
break;
56-
case Triple::ppc64:
57-
PointerSize = 8;
58-
Endianness = llvm::endianness::big;
59-
break;
60-
case Triple::ppc64le:
61-
PointerSize = 8;
62-
Endianness = llvm::endianness::little;
63-
break;
64-
default:
65-
llvm_unreachable("Unrecognized architecture");
66-
}
67-
43+
auto &ES = MOP.getExecutionSession();
6844
return std::make_unique<jitlink::LinkGraph>(
69-
std::move(Name), MOP.getExecutionSession().getSymbolStringPool(), TT,
70-
PointerSize, Endianness, jitlink::getGenericEdgeKindName);
45+
std::move(Name), ES.getSymbolStringPool(), ES.getTargetTriple(),
46+
SubtargetFeatures(), jitlink::getGenericEdgeKindName);
7147
}
7248

7349
// Creates a Bootstrap-Complete LinkGraph to run deferred actions.
@@ -156,30 +132,22 @@ class DSOHandleMaterializationUnit : public MaterializationUnit {
156132
StringRef getName() const override { return "DSOHandleMU"; }
157133

158134
void materialize(std::unique_ptr<MaterializationResponsibility> R) override {
159-
unsigned PointerSize;
160-
llvm::endianness Endianness;
135+
136+
auto &ES = ENP.getExecutionSession();
137+
161138
jitlink::Edge::Kind EdgeKind;
162-
const auto &TT = ENP.getExecutionSession().getTargetTriple();
163139

164-
switch (TT.getArch()) {
140+
switch (ES.getTargetTriple().getArch()) {
165141
case Triple::x86_64:
166-
PointerSize = 8;
167-
Endianness = llvm::endianness::little;
168142
EdgeKind = jitlink::x86_64::Pointer64;
169143
break;
170144
case Triple::aarch64:
171-
PointerSize = 8;
172-
Endianness = llvm::endianness::little;
173145
EdgeKind = jitlink::aarch64::Pointer64;
174146
break;
175147
case Triple::ppc64:
176-
PointerSize = 8;
177-
Endianness = llvm::endianness::big;
178148
EdgeKind = jitlink::ppc64::Pointer64;
179149
break;
180150
case Triple::ppc64le:
181-
PointerSize = 8;
182-
Endianness = llvm::endianness::little;
183151
EdgeKind = jitlink::ppc64::Pointer64;
184152
break;
185153
default:
@@ -188,13 +156,13 @@ class DSOHandleMaterializationUnit : public MaterializationUnit {
188156

189157
// void *__dso_handle = &__dso_handle;
190158
auto G = std::make_unique<jitlink::LinkGraph>(
191-
"<DSOHandleMU>", ENP.getExecutionSession().getSymbolStringPool(), TT,
192-
PointerSize, Endianness, jitlink::getGenericEdgeKindName);
159+
"<DSOHandleMU>", ES.getSymbolStringPool(), ES.getTargetTriple(),
160+
SubtargetFeatures(), jitlink::getGenericEdgeKindName);
193161
auto &DSOHandleSection =
194162
G->createSection(".data.__dso_handle", MemProt::Read);
195163
auto &DSOHandleBlock = G->createContentBlock(
196-
DSOHandleSection, getDSOHandleContent(PointerSize), orc::ExecutorAddr(),
197-
8, 0);
164+
DSOHandleSection, getDSOHandleContent(G->getPointerSize()),
165+
orc::ExecutorAddr(), 8, 0);
198166
auto &DSOHandleSymbol = G->addDefinedSymbol(
199167
DSOHandleBlock, 0, *R->getInitializerSymbol(), DSOHandleBlock.getSize(),
200168
jitlink::Linkage::Strong, jitlink::Scope::Default, false, true);

0 commit comments

Comments
 (0)