Skip to content

Commit bb01210

Browse files
mtvecChenyang-L
authored andcommitted
[JITLink] Use SubtargetFeatures to store features in LinkGraph
D149522 introduced target features to LinkGraph. However, to avoid a public dependency on MC, the features were stored in a std::vector instead of using SubtargetFeatures directly. Since SubtargetFeatures was moved from MC to TargetParser (D150549), we can now use it directly to store the features. This patch implements that and removes the (private) dependency on MC. Reviewed By: lhames Differential Revision: https://reviews.llvm.org/D153749
1 parent bf967c2 commit bb01210

17 files changed

+36
-40
lines changed

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include "llvm/Support/FormatVariadic.h"
3030
#include "llvm/Support/MathExtras.h"
3131
#include "llvm/Support/MemoryBuffer.h"
32+
#include "llvm/TargetParser/SubtargetFeature.h"
3233
#include "llvm/TargetParser/Triple.h"
3334
#include <optional>
3435

@@ -984,9 +985,7 @@ class LinkGraph {
984985

985986
using GetEdgeKindNameFunction = const char *(*)(Edge::Kind);
986987

987-
using FeatureVector = std::vector<std::string>;
988-
989-
LinkGraph(std::string Name, const Triple &TT, FeatureVector Features,
988+
LinkGraph(std::string Name, const Triple &TT, SubtargetFeatures Features,
990989
unsigned PointerSize, support::endianness Endianness,
991990
GetEdgeKindNameFunction GetEdgeKindName)
992991
: Name(std::move(Name)), TT(TT), Features(std::move(Features)),
@@ -996,8 +995,8 @@ class LinkGraph {
996995
LinkGraph(std::string Name, const Triple &TT, unsigned PointerSize,
997996
support::endianness Endianness,
998997
GetEdgeKindNameFunction GetEdgeKindName)
999-
: LinkGraph(std::move(Name), TT, FeatureVector(), PointerSize, Endianness,
1000-
GetEdgeKindName) {}
998+
: LinkGraph(std::move(Name), TT, SubtargetFeatures(), PointerSize,
999+
Endianness, GetEdgeKindName) {}
10011000

10021001
LinkGraph(const LinkGraph &) = delete;
10031002
LinkGraph &operator=(const LinkGraph &) = delete;
@@ -1012,7 +1011,7 @@ class LinkGraph {
10121011
const Triple &getTargetTriple() const { return TT; }
10131012

10141013
/// Return the subtarget features for this Graph.
1015-
const FeatureVector &getFeatures() const { return Features; }
1014+
const SubtargetFeatures &getFeatures() const { return Features; }
10161015

10171016
/// Returns the pointer size for use in this graph.
10181017
unsigned getPointerSize() const { return PointerSize; }
@@ -1519,7 +1518,7 @@ class LinkGraph {
15191518

15201519
std::string Name;
15211520
Triple TT;
1522-
FeatureVector Features;
1521+
SubtargetFeatures Features;
15231522
unsigned PointerSize;
15241523
support::endianness Endianness;
15251524
GetEdgeKindNameFunction GetEdgeKindName = nullptr;

llvm/lib/ExecutionEngine/JITLink/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ add_llvm_component_library(LLVMJITLink
5252

5353
LINK_COMPONENTS
5454
BinaryFormat
55-
MC
5655
Object
5756
Option
5857
OrcTargetProcess

llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ static Triple createTripleWithCOFFFormat(Triple T) {
2424
}
2525

2626
COFFLinkGraphBuilder::COFFLinkGraphBuilder(
27-
const object::COFFObjectFile &Obj, Triple TT,
28-
LinkGraph::FeatureVector Features,
27+
const object::COFFObjectFile &Obj, Triple TT, SubtargetFeatures Features,
2928
LinkGraph::GetEdgeKindNameFunction GetEdgeKindName)
3029
: Obj(Obj), G(std::make_unique<LinkGraph>(
3130
Obj.getFileName().str(), createTripleWithCOFFFormat(TT),

llvm/lib/ExecutionEngine/JITLink/COFFLinkGraphBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class COFFLinkGraphBuilder {
3939
using COFFSymbolIndex = int32_t;
4040

4141
COFFLinkGraphBuilder(const object::COFFObjectFile &Obj, Triple TT,
42-
LinkGraph::FeatureVector Features,
42+
SubtargetFeatures Features,
4343
LinkGraph::GetEdgeKindNameFunction GetEdgeKindName);
4444

4545
LinkGraph &getGraph() const { return *G; }

llvm/lib/ExecutionEngine/JITLink/COFF_x86_64.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ class COFFLinkGraphBuilder_x86_64 : public COFFLinkGraphBuilder {
182182

183183
public:
184184
COFFLinkGraphBuilder_x86_64(const object::COFFObjectFile &Obj, const Triple T,
185-
const LinkGraph::FeatureVector Features)
185+
const SubtargetFeatures Features)
186186
: COFFLinkGraphBuilder(Obj, std::move(T), std::move(Features),
187187
getCOFFX86RelocationKindName) {}
188188
};
@@ -321,7 +321,7 @@ createLinkGraphFromCOFFObject_x86_64(MemoryBufferRef ObjectBuffer) {
321321
return Features.takeError();
322322

323323
return COFFLinkGraphBuilder_x86_64(**COFFObj, (*COFFObj)->makeTriple(),
324-
Features->getFeatures())
324+
std::move(*Features))
325325
.buildGraph();
326326
}
327327

llvm/lib/ExecutionEngine/JITLink/ELFLinkGraphBuilder.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class ELFLinkGraphBuilder : public ELFLinkGraphBuilderBase {
5959

6060
public:
6161
ELFLinkGraphBuilder(const object::ELFFile<ELFT> &Obj, Triple TT,
62-
LinkGraph::FeatureVector Features, StringRef FileName,
62+
SubtargetFeatures Features, StringRef FileName,
6363
LinkGraph::GetEdgeKindNameFunction GetEdgeKindName);
6464

6565
/// Debug sections are included in the graph by default. Use
@@ -189,7 +189,7 @@ class ELFLinkGraphBuilder : public ELFLinkGraphBuilderBase {
189189

190190
template <typename ELFT>
191191
ELFLinkGraphBuilder<ELFT>::ELFLinkGraphBuilder(
192-
const ELFFile &Obj, Triple TT, LinkGraph::FeatureVector Features,
192+
const ELFFile &Obj, Triple TT, SubtargetFeatures Features,
193193
StringRef FileName, LinkGraph::GetEdgeKindNameFunction GetEdgeKindName)
194194
: ELFLinkGraphBuilderBase(std::make_unique<LinkGraph>(
195195
FileName.str(), Triple(std::move(TT)), std::move(Features),

llvm/lib/ExecutionEngine/JITLink/ELF_aarch32.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ class ELFLinkGraphBuilder_aarch32
191191
public:
192192
ELFLinkGraphBuilder_aarch32(StringRef FileName,
193193
const llvm::object::ELFFile<ELFT> &Obj, Triple TT,
194-
LinkGraph::FeatureVector Features,
194+
SubtargetFeatures Features,
195195
aarch32::ArmConfig ArmCfg)
196196
: ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features),
197197
FileName, getELFAArch32EdgeKindName),
@@ -254,15 +254,15 @@ createLinkGraphFromELFObject_aarch32(MemoryBufferRef ObjectBuffer) {
254254
case Triple::thumb: {
255255
auto &ELFFile = cast<ELFObjectFile<ELF32LE>>(**ELFObj).getELFFile();
256256
return ELFLinkGraphBuilder_aarch32<support::little>(
257-
(*ELFObj)->getFileName(), ELFFile, TT, Features->getFeatures(),
257+
(*ELFObj)->getFileName(), ELFFile, TT, std::move(*Features),
258258
ArmCfg)
259259
.buildGraph();
260260
}
261261
case Triple::armeb:
262262
case Triple::thumbeb: {
263263
auto &ELFFile = cast<ELFObjectFile<ELF32BE>>(**ELFObj).getELFFile();
264264
return ELFLinkGraphBuilder_aarch32<support::big>(
265-
(*ELFObj)->getFileName(), ELFFile, TT, Features->getFeatures(),
265+
(*ELFObj)->getFileName(), ELFFile, TT, std::move(*Features),
266266
ArmCfg)
267267
.buildGraph();
268268
}

llvm/lib/ExecutionEngine/JITLink/ELF_aarch64.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ class ELFLinkGraphBuilder_aarch64 : public ELFLinkGraphBuilder<ELFT> {
429429
public:
430430
ELFLinkGraphBuilder_aarch64(StringRef FileName,
431431
const object::ELFFile<ELFT> &Obj, Triple TT,
432-
LinkGraph::FeatureVector Features)
432+
SubtargetFeatures Features)
433433
: ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features),
434434
FileName, aarch64::getEdgeKindName) {}
435435
};
@@ -589,7 +589,7 @@ createLinkGraphFromELFObject_aarch64(MemoryBufferRef ObjectBuffer) {
589589
auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF64LE>>(**ELFObj);
590590
return ELFLinkGraphBuilder_aarch64<object::ELF64LE>(
591591
(*ELFObj)->getFileName(), ELFObjFile.getELFFile(),
592-
(*ELFObj)->makeTriple(), Features->getFeatures())
592+
(*ELFObj)->makeTriple(), std::move(*Features))
593593
.buildGraph();
594594
}
595595

llvm/lib/ExecutionEngine/JITLink/ELF_i386.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class ELFLinkGraphBuilder_i386 : public ELFLinkGraphBuilder<ELFT> {
210210

211211
public:
212212
ELFLinkGraphBuilder_i386(StringRef FileName, const object::ELFFile<ELFT> &Obj,
213-
Triple TT, LinkGraph::FeatureVector Features)
213+
Triple TT, SubtargetFeatures Features)
214214
: ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features),
215215
FileName, i386::getEdgeKindName) {}
216216
};
@@ -236,7 +236,7 @@ createLinkGraphFromELFObject_i386(MemoryBufferRef ObjectBuffer) {
236236
auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF32LE>>(**ELFObj);
237237
return ELFLinkGraphBuilder_i386<object::ELF32LE>(
238238
(*ELFObj)->getFileName(), ELFObjFile.getELFFile(),
239-
(*ELFObj)->makeTriple(), Features->getFeatures())
239+
(*ELFObj)->makeTriple(), std::move(*Features))
240240
.buildGraph();
241241
}
242242

llvm/lib/ExecutionEngine/JITLink/ELF_loongarch.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ class ELFLinkGraphBuilder_loongarch : public ELFLinkGraphBuilder<ELFT> {
130130
public:
131131
ELFLinkGraphBuilder_loongarch(StringRef FileName,
132132
const object::ELFFile<ELFT> &Obj, Triple TT,
133-
LinkGraph::FeatureVector Features)
133+
SubtargetFeatures Features)
134134
: ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features),
135135
FileName, loongarch::getEdgeKindName) {}
136136
};
@@ -168,7 +168,7 @@ createLinkGraphFromELFObject_loongarch(MemoryBufferRef ObjectBuffer) {
168168
auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF64LE>>(**ELFObj);
169169
return ELFLinkGraphBuilder_loongarch<object::ELF64LE>(
170170
(*ELFObj)->getFileName(), ELFObjFile.getELFFile(),
171-
(*ELFObj)->makeTriple(), Features->getFeatures())
171+
(*ELFObj)->makeTriple(), std::move(*Features))
172172
.buildGraph();
173173
}
174174

@@ -177,7 +177,7 @@ createLinkGraphFromELFObject_loongarch(MemoryBufferRef ObjectBuffer) {
177177
auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF32LE>>(**ELFObj);
178178
return ELFLinkGraphBuilder_loongarch<object::ELF32LE>(
179179
(*ELFObj)->getFileName(), ELFObjFile.getELFFile(),
180-
(*ELFObj)->makeTriple(), Features->getFeatures())
180+
(*ELFObj)->makeTriple(), std::move(*Features))
181181
.buildGraph();
182182
}
183183

llvm/lib/ExecutionEngine/JITLink/ELF_ppc64.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class ELFLinkGraphBuilder_ppc64
6363
public:
6464
ELFLinkGraphBuilder_ppc64(StringRef FileName,
6565
const object::ELFFile<ELFT> &Obj, Triple TT,
66-
LinkGraph::FeatureVector Features)
66+
SubtargetFeatures Features)
6767
: ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features),
6868
FileName, ppc64::getEdgeKindName) {}
6969
};
@@ -106,7 +106,7 @@ createLinkGraphFromELFObject_ppc64(MemoryBufferRef ObjectBuffer) {
106106
auto &ELFObjFile = cast<object::ELFObjectFile<ELFT>>(**ELFObj);
107107
return ELFLinkGraphBuilder_ppc64<Endianness>(
108108
(*ELFObj)->getFileName(), ELFObjFile.getELFFile(),
109-
(*ELFObj)->makeTriple(), Features->getFeatures())
109+
(*ELFObj)->makeTriple(), std::move(*Features))
110110
.buildGraph();
111111
}
112112

llvm/lib/ExecutionEngine/JITLink/ELF_riscv.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -515,7 +515,7 @@ static bool isRelaxable(const Edge &E) {
515515
static RelaxAux initRelaxAux(LinkGraph &G) {
516516
RelaxAux Aux;
517517
Aux.Config.IsRV32 = G.getTargetTriple().isRISCV32();
518-
const auto &Features = G.getFeatures();
518+
const auto &Features = G.getFeatures().getFeatures();
519519
Aux.Config.HasRVC =
520520
std::find(Features.begin(), Features.end(), "+c") != Features.end();
521521

@@ -919,7 +919,7 @@ class ELFLinkGraphBuilder_riscv : public ELFLinkGraphBuilder<ELFT> {
919919
public:
920920
ELFLinkGraphBuilder_riscv(StringRef FileName,
921921
const object::ELFFile<ELFT> &Obj, Triple TT,
922-
LinkGraph::FeatureVector Features)
922+
SubtargetFeatures Features)
923923
: ELFLinkGraphBuilder<ELFT>(Obj, std::move(TT), std::move(Features),
924924
FileName, riscv::getEdgeKindName) {}
925925
};
@@ -943,15 +943,15 @@ createLinkGraphFromELFObject_riscv(MemoryBufferRef ObjectBuffer) {
943943
auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF64LE>>(**ELFObj);
944944
return ELFLinkGraphBuilder_riscv<object::ELF64LE>(
945945
(*ELFObj)->getFileName(), ELFObjFile.getELFFile(),
946-
(*ELFObj)->makeTriple(), Features->getFeatures())
946+
(*ELFObj)->makeTriple(), std::move(*Features))
947947
.buildGraph();
948948
} else {
949949
assert((*ELFObj)->getArch() == Triple::riscv32 &&
950950
"Invalid triple for RISCV ELF object file");
951951
auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF32LE>>(**ELFObj);
952952
return ELFLinkGraphBuilder_riscv<object::ELF32LE>(
953953
(*ELFObj)->getFileName(), ELFObjFile.getELFFile(),
954-
(*ELFObj)->makeTriple(), Features->getFeatures())
954+
(*ELFObj)->makeTriple(), std::move(*Features))
955955
.buildGraph();
956956
}
957957
}

llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ class ELFLinkGraphBuilder_x86_64 : public ELFLinkGraphBuilder<object::ELF64LE> {
228228
public:
229229
ELFLinkGraphBuilder_x86_64(StringRef FileName,
230230
const object::ELFFile<object::ELF64LE> &Obj,
231-
LinkGraph::FeatureVector Features)
231+
SubtargetFeatures Features)
232232
: ELFLinkGraphBuilder(Obj, Triple("x86_64-unknown-linux"),
233233
std::move(Features), FileName,
234234
x86_64::getEdgeKindName) {}
@@ -338,7 +338,7 @@ createLinkGraphFromELFObject_x86_64(MemoryBufferRef ObjectBuffer) {
338338
auto &ELFObjFile = cast<object::ELFObjectFile<object::ELF64LE>>(**ELFObj);
339339
return ELFLinkGraphBuilder_x86_64((*ELFObj)->getFileName(),
340340
ELFObjFile.getELFFile(),
341-
Features->getFeatures())
341+
std::move(*Features))
342342
.buildGraph();
343343
}
344344

llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ Expected<std::unique_ptr<LinkGraph>> MachOLinkGraphBuilder::buildGraph() {
4747
}
4848

4949
MachOLinkGraphBuilder::MachOLinkGraphBuilder(
50-
const object::MachOObjectFile &Obj, Triple TT,
51-
LinkGraph::FeatureVector Features,
50+
const object::MachOObjectFile &Obj, Triple TT, SubtargetFeatures Features,
5251
LinkGraph::GetEdgeKindNameFunction GetEdgeKindName)
5352
: Obj(Obj),
5453
G(std::make_unique<LinkGraph>(std::string(Obj.getFileName()),

llvm/lib/ExecutionEngine/JITLink/MachOLinkGraphBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ class MachOLinkGraphBuilder {
8484
using SectionParserFunction = std::function<Error(NormalizedSection &S)>;
8585

8686
MachOLinkGraphBuilder(const object::MachOObjectFile &Obj, Triple TT,
87-
LinkGraph::FeatureVector Features,
87+
SubtargetFeatures Features,
8888
LinkGraph::GetEdgeKindNameFunction GetEdgeKindName);
8989

9090
LinkGraph &getGraph() const { return *G; }

llvm/lib/ExecutionEngine/JITLink/MachO_arm64.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace {
2626
class MachOLinkGraphBuilder_arm64 : public MachOLinkGraphBuilder {
2727
public:
2828
MachOLinkGraphBuilder_arm64(const object::MachOObjectFile &Obj,
29-
LinkGraph::FeatureVector Features)
29+
SubtargetFeatures Features)
3030
: MachOLinkGraphBuilder(Obj, Triple("arm64-apple-darwin"),
3131
std::move(Features), aarch64::getEdgeKindName),
3232
NumSymbols(Obj.getSymtabLoadCommand().nsyms) {}
@@ -547,7 +547,7 @@ createLinkGraphFromMachOObject_arm64(MemoryBufferRef ObjectBuffer) {
547547
if (!Features)
548548
return Features.takeError();
549549

550-
return MachOLinkGraphBuilder_arm64(**MachOObj, Features->getFeatures())
550+
return MachOLinkGraphBuilder_arm64(**MachOObj, std::move(*Features))
551551
.buildGraph();
552552
}
553553

llvm/lib/ExecutionEngine/JITLink/MachO_x86_64.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace {
2626
class MachOLinkGraphBuilder_x86_64 : public MachOLinkGraphBuilder {
2727
public:
2828
MachOLinkGraphBuilder_x86_64(const object::MachOObjectFile &Obj,
29-
LinkGraph::FeatureVector Features)
29+
SubtargetFeatures Features)
3030
: MachOLinkGraphBuilder(Obj, Triple("x86_64-apple-darwin"),
3131
std::move(Features), x86_64::getEdgeKindName) {}
3232

@@ -472,7 +472,7 @@ createLinkGraphFromMachOObject_x86_64(MemoryBufferRef ObjectBuffer) {
472472
if (!Features)
473473
return Features.takeError();
474474

475-
return MachOLinkGraphBuilder_x86_64(**MachOObj, Features->getFeatures())
475+
return MachOLinkGraphBuilder_x86_64(**MachOObj, std::move(*Features))
476476
.buildGraph();
477477
}
478478

0 commit comments

Comments
 (0)