Skip to content

Commit 8fb83bf

Browse files
authored
[BOLT][NFC] Add MCSubtargetInfo to MCPlusBuilder (#68223)
On RISC-V, it's helpful to have access to `MCSubtargetInfo` while generating instructions in `MCPlusBuilder`. For example, a return instruction might be generated differently based on if the target supports compressed instructions (`c.jr ra`) or not (`jalr ra`).
1 parent a06e94c commit 8fb83bf

File tree

8 files changed

+44
-33
lines changed

8 files changed

+44
-33
lines changed

bolt/include/bolt/Core/MCPlusBuilder.h

+9-5
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ class MCPlusBuilder {
160160
const MCInstrAnalysis *Analysis;
161161
const MCInstrInfo *Info;
162162
const MCRegisterInfo *RegInfo;
163+
const MCSubtargetInfo *STI;
163164

164165
/// Map annotation name into an annotation index.
165166
StringMap<uint64_t> AnnotationNameIndexMap;
@@ -331,8 +332,8 @@ class MCPlusBuilder {
331332

332333
public:
333334
MCPlusBuilder(const MCInstrAnalysis *Analysis, const MCInstrInfo *Info,
334-
const MCRegisterInfo *RegInfo)
335-
: Analysis(Analysis), Info(Info), RegInfo(RegInfo) {
335+
const MCRegisterInfo *RegInfo, const MCSubtargetInfo *STI)
336+
: Analysis(Analysis), Info(Info), RegInfo(RegInfo), STI(STI) {
336337
// Initialize the default annotation allocator with id 0
337338
AnnotationAllocators.emplace(0, AnnotationAllocator());
338339
MaxAllocatorId++;
@@ -2079,15 +2080,18 @@ class MCPlusBuilder {
20792080

20802081
MCPlusBuilder *createX86MCPlusBuilder(const MCInstrAnalysis *,
20812082
const MCInstrInfo *,
2082-
const MCRegisterInfo *);
2083+
const MCRegisterInfo *,
2084+
const MCSubtargetInfo *);
20832085

20842086
MCPlusBuilder *createAArch64MCPlusBuilder(const MCInstrAnalysis *,
20852087
const MCInstrInfo *,
2086-
const MCRegisterInfo *);
2088+
const MCRegisterInfo *,
2089+
const MCSubtargetInfo *);
20872090

20882091
MCPlusBuilder *createRISCVMCPlusBuilder(const MCInstrAnalysis *,
20892092
const MCInstrInfo *,
2090-
const MCRegisterInfo *);
2093+
const MCRegisterInfo *,
2094+
const MCSubtargetInfo *);
20912095

20922096
} // namespace bolt
20932097
} // namespace llvm

bolt/include/bolt/Rewrite/RewriteInstance.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -584,7 +584,8 @@ class RewriteInstance {
584584
MCPlusBuilder *createMCPlusBuilder(const Triple::ArchType Arch,
585585
const MCInstrAnalysis *Analysis,
586586
const MCInstrInfo *Info,
587-
const MCRegisterInfo *RegInfo);
587+
const MCRegisterInfo *RegInfo,
588+
const MCSubtargetInfo *STI);
588589

589590
} // namespace bolt
590591
} // namespace llvm

bolt/lib/Rewrite/MachORewriteInstance.cpp

+11-7
Original file line numberDiff line numberDiff line change
@@ -56,25 +56,28 @@ namespace bolt {
5656

5757
extern MCPlusBuilder *createX86MCPlusBuilder(const MCInstrAnalysis *,
5858
const MCInstrInfo *,
59-
const MCRegisterInfo *);
59+
const MCRegisterInfo *,
60+
const MCSubtargetInfo *);
6061
extern MCPlusBuilder *createAArch64MCPlusBuilder(const MCInstrAnalysis *,
6162
const MCInstrInfo *,
62-
const MCRegisterInfo *);
63+
const MCRegisterInfo *,
64+
const MCSubtargetInfo *);
6365

6466
namespace {
6567

6668
MCPlusBuilder *createMCPlusBuilder(const Triple::ArchType Arch,
6769
const MCInstrAnalysis *Analysis,
6870
const MCInstrInfo *Info,
69-
const MCRegisterInfo *RegInfo) {
71+
const MCRegisterInfo *RegInfo,
72+
const MCSubtargetInfo *STI) {
7073
#ifdef X86_AVAILABLE
7174
if (Arch == Triple::x86_64)
72-
return createX86MCPlusBuilder(Analysis, Info, RegInfo);
75+
return createX86MCPlusBuilder(Analysis, Info, RegInfo, STI);
7376
#endif
7477

7578
#ifdef AARCH64_AVAILABLE
7679
if (Arch == Triple::aarch64)
77-
return createAArch64MCPlusBuilder(Analysis, Info, RegInfo);
80+
return createAArch64MCPlusBuilder(Analysis, Info, RegInfo, STI);
7881
#endif
7982

8083
llvm_unreachable("architecture unsupported by MCPlusBuilder");
@@ -106,8 +109,9 @@ MachORewriteInstance::MachORewriteInstance(object::MachOObjectFile *InputFile,
106109
return;
107110
}
108111
BC = std::move(BCOrErr.get());
109-
BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(createMCPlusBuilder(
110-
BC->TheTriple->getArch(), BC->MIA.get(), BC->MII.get(), BC->MRI.get())));
112+
BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(
113+
createMCPlusBuilder(BC->TheTriple->getArch(), BC->MIA.get(),
114+
BC->MII.get(), BC->MRI.get(), BC->STI.get())));
111115
if (opts::Instrument)
112116
BC->setRuntimeLibrary(std::make_unique<InstrumentationRuntimeLibrary>());
113117
}

bolt/lib/Rewrite/RewriteInstance.cpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -272,20 +272,21 @@ extern const char *BoltRevision;
272272
MCPlusBuilder *createMCPlusBuilder(const Triple::ArchType Arch,
273273
const MCInstrAnalysis *Analysis,
274274
const MCInstrInfo *Info,
275-
const MCRegisterInfo *RegInfo) {
275+
const MCRegisterInfo *RegInfo,
276+
const MCSubtargetInfo *STI) {
276277
#ifdef X86_AVAILABLE
277278
if (Arch == Triple::x86_64)
278-
return createX86MCPlusBuilder(Analysis, Info, RegInfo);
279+
return createX86MCPlusBuilder(Analysis, Info, RegInfo, STI);
279280
#endif
280281

281282
#ifdef AARCH64_AVAILABLE
282283
if (Arch == Triple::aarch64)
283-
return createAArch64MCPlusBuilder(Analysis, Info, RegInfo);
284+
return createAArch64MCPlusBuilder(Analysis, Info, RegInfo, STI);
284285
#endif
285286

286287
#ifdef RISCV_AVAILABLE
287288
if (Arch == Triple::riscv64)
288-
return createRISCVMCPlusBuilder(Analysis, Info, RegInfo);
289+
return createRISCVMCPlusBuilder(Analysis, Info, RegInfo, STI);
289290
#endif
290291

291292
llvm_unreachable("architecture unsupported by MCPlusBuilder");
@@ -348,8 +349,9 @@ RewriteInstance::RewriteInstance(ELFObjectFileBase *File, const int Argc,
348349
return;
349350
}
350351
BC = std::move(BCOrErr.get());
351-
BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(createMCPlusBuilder(
352-
BC->TheTriple->getArch(), BC->MIA.get(), BC->MII.get(), BC->MRI.get())));
352+
BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(
353+
createMCPlusBuilder(BC->TheTriple->getArch(), BC->MIA.get(),
354+
BC->MII.get(), BC->MRI.get(), BC->STI.get())));
353355

354356
BAT = std::make_unique<BoltAddressTranslation>();
355357

bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,7 @@ static InstructionListType createIncMemory(MCPhysReg RegTo, MCPhysReg RegTmp) {
128128
}
129129
class AArch64MCPlusBuilder : public MCPlusBuilder {
130130
public:
131-
AArch64MCPlusBuilder(const MCInstrAnalysis *Analysis, const MCInstrInfo *Info,
132-
const MCRegisterInfo *RegInfo)
133-
: MCPlusBuilder(Analysis, Info, RegInfo) {}
131+
using MCPlusBuilder::MCPlusBuilder;
134132

135133
bool equals(const MCTargetExpr &A, const MCTargetExpr &B,
136134
CompFuncTy Comp) const override {
@@ -1654,8 +1652,9 @@ namespace bolt {
16541652

16551653
MCPlusBuilder *createAArch64MCPlusBuilder(const MCInstrAnalysis *Analysis,
16561654
const MCInstrInfo *Info,
1657-
const MCRegisterInfo *RegInfo) {
1658-
return new AArch64MCPlusBuilder(Analysis, Info, RegInfo);
1655+
const MCRegisterInfo *RegInfo,
1656+
const MCSubtargetInfo *STI) {
1657+
return new AArch64MCPlusBuilder(Analysis, Info, RegInfo, STI);
16591658
}
16601659

16611660
} // namespace bolt

bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -471,8 +471,9 @@ namespace bolt {
471471

472472
MCPlusBuilder *createRISCVMCPlusBuilder(const MCInstrAnalysis *Analysis,
473473
const MCInstrInfo *Info,
474-
const MCRegisterInfo *RegInfo) {
475-
return new RISCVMCPlusBuilder(Analysis, Info, RegInfo);
474+
const MCRegisterInfo *RegInfo,
475+
const MCSubtargetInfo *STI) {
476+
return new RISCVMCPlusBuilder(Analysis, Info, RegInfo, STI);
476477
}
477478

478479
} // namespace bolt

bolt/lib/Target/X86/X86MCPlusBuilder.cpp

+4-5
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,7 @@ static InstructionListType createIncMemory(const MCSymbol *Target,
8787

8888
class X86MCPlusBuilder : public MCPlusBuilder {
8989
public:
90-
X86MCPlusBuilder(const MCInstrAnalysis *Analysis, const MCInstrInfo *Info,
91-
const MCRegisterInfo *RegInfo)
92-
: MCPlusBuilder(Analysis, Info, RegInfo) {}
90+
using MCPlusBuilder::MCPlusBuilder;
9391

9492
std::unique_ptr<MCSymbolizer>
9593
createTargetSymbolizer(BinaryFunction &Function,
@@ -3579,8 +3577,9 @@ namespace bolt {
35793577

35803578
MCPlusBuilder *createX86MCPlusBuilder(const MCInstrAnalysis *Analysis,
35813579
const MCInstrInfo *Info,
3582-
const MCRegisterInfo *RegInfo) {
3583-
return new X86MCPlusBuilder(Analysis, Info, RegInfo);
3580+
const MCRegisterInfo *RegInfo,
3581+
const MCSubtargetInfo *STI) {
3582+
return new X86MCPlusBuilder(Analysis, Info, RegInfo, STI);
35843583
}
35853584

35863585
} // namespace bolt

bolt/unittests/Core/MCPlusBuilder.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ struct MCPlusBuilderTester : public testing::TestWithParam<Triple::ArchType> {
5252
BC = cantFail(BinaryContext::createBinaryContext(
5353
ObjFile.get(), true, DWARFContext::create(*ObjFile.get())));
5454
ASSERT_FALSE(!BC);
55-
BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(createMCPlusBuilder(
56-
GetParam(), BC->MIA.get(), BC->MII.get(), BC->MRI.get())));
55+
BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(
56+
createMCPlusBuilder(GetParam(), BC->MIA.get(), BC->MII.get(),
57+
BC->MRI.get(), BC->STI.get())));
5758
}
5859

5960
void testRegAliases(Triple::ArchType Arch, uint64_t Register,

0 commit comments

Comments
 (0)