[llvm] [BOLT][NFC] Add MCSubtargetInfo to MCPlusBuilder (PR #68223)
Job Noorman via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 4 07:22:09 PDT 2023
https://github.com/mtvec created https://github.com/llvm/llvm-project/pull/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`).
>From db44fd018950c68ed4bbeca8386a14a406b5c537 Mon Sep 17 00:00:00 2001
From: Job Noorman <jnoorman at igalia.com>
Date: Tue, 26 Sep 2023 16:18:17 +0200
Subject: [PATCH] [BOLT][NFC] Add MCSubtargetInfo to MCPlusBuilder
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`).
---
bolt/include/bolt/Core/MCPlusBuilder.h | 14 +++++++++-----
bolt/include/bolt/Rewrite/RewriteInstance.h | 3 ++-
bolt/lib/Rewrite/MachORewriteInstance.cpp | 18 +++++++++++-------
bolt/lib/Rewrite/RewriteInstance.cpp | 14 ++++++++------
.../Target/AArch64/AArch64MCPlusBuilder.cpp | 9 ++++-----
bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp | 5 +++--
bolt/lib/Target/X86/X86MCPlusBuilder.cpp | 9 ++++-----
bolt/unittests/Core/MCPlusBuilder.cpp | 5 +++--
8 files changed, 44 insertions(+), 33 deletions(-)
diff --git a/bolt/include/bolt/Core/MCPlusBuilder.h b/bolt/include/bolt/Core/MCPlusBuilder.h
index 5e12a4ac14c9e46..14dd96e45d7afe6 100644
--- a/bolt/include/bolt/Core/MCPlusBuilder.h
+++ b/bolt/include/bolt/Core/MCPlusBuilder.h
@@ -160,6 +160,7 @@ class MCPlusBuilder {
const MCInstrAnalysis *Analysis;
const MCInstrInfo *Info;
const MCRegisterInfo *RegInfo;
+ const MCSubtargetInfo *STI;
/// Map annotation name into an annotation index.
StringMap<uint64_t> AnnotationNameIndexMap;
@@ -331,8 +332,8 @@ class MCPlusBuilder {
public:
MCPlusBuilder(const MCInstrAnalysis *Analysis, const MCInstrInfo *Info,
- const MCRegisterInfo *RegInfo)
- : Analysis(Analysis), Info(Info), RegInfo(RegInfo) {
+ const MCRegisterInfo *RegInfo, const MCSubtargetInfo *STI)
+ : Analysis(Analysis), Info(Info), RegInfo(RegInfo), STI(STI) {
// Initialize the default annotation allocator with id 0
AnnotationAllocators.emplace(0, AnnotationAllocator());
MaxAllocatorId++;
@@ -2079,15 +2080,18 @@ class MCPlusBuilder {
MCPlusBuilder *createX86MCPlusBuilder(const MCInstrAnalysis *,
const MCInstrInfo *,
- const MCRegisterInfo *);
+ const MCRegisterInfo *,
+ const MCSubtargetInfo *);
MCPlusBuilder *createAArch64MCPlusBuilder(const MCInstrAnalysis *,
const MCInstrInfo *,
- const MCRegisterInfo *);
+ const MCRegisterInfo *,
+ const MCSubtargetInfo *);
MCPlusBuilder *createRISCVMCPlusBuilder(const MCInstrAnalysis *,
const MCInstrInfo *,
- const MCRegisterInfo *);
+ const MCRegisterInfo *,
+ const MCSubtargetInfo *);
} // namespace bolt
} // namespace llvm
diff --git a/bolt/include/bolt/Rewrite/RewriteInstance.h b/bolt/include/bolt/Rewrite/RewriteInstance.h
index 1dacdc944f9775b..329fe356603d0e5 100644
--- a/bolt/include/bolt/Rewrite/RewriteInstance.h
+++ b/bolt/include/bolt/Rewrite/RewriteInstance.h
@@ -584,7 +584,8 @@ class RewriteInstance {
MCPlusBuilder *createMCPlusBuilder(const Triple::ArchType Arch,
const MCInstrAnalysis *Analysis,
const MCInstrInfo *Info,
- const MCRegisterInfo *RegInfo);
+ const MCRegisterInfo *RegInfo,
+ const MCSubtargetInfo *STI);
} // namespace bolt
} // namespace llvm
diff --git a/bolt/lib/Rewrite/MachORewriteInstance.cpp b/bolt/lib/Rewrite/MachORewriteInstance.cpp
index b827a196c82653a..8be8257f15c1ce9 100644
--- a/bolt/lib/Rewrite/MachORewriteInstance.cpp
+++ b/bolt/lib/Rewrite/MachORewriteInstance.cpp
@@ -56,25 +56,28 @@ namespace bolt {
extern MCPlusBuilder *createX86MCPlusBuilder(const MCInstrAnalysis *,
const MCInstrInfo *,
- const MCRegisterInfo *);
+ const MCRegisterInfo *,
+ const MCSubtargetInfo *);
extern MCPlusBuilder *createAArch64MCPlusBuilder(const MCInstrAnalysis *,
const MCInstrInfo *,
- const MCRegisterInfo *);
+ const MCRegisterInfo *,
+ const MCSubtargetInfo *);
namespace {
MCPlusBuilder *createMCPlusBuilder(const Triple::ArchType Arch,
const MCInstrAnalysis *Analysis,
const MCInstrInfo *Info,
- const MCRegisterInfo *RegInfo) {
+ const MCRegisterInfo *RegInfo,
+ const MCSubtargetInfo *STI) {
#ifdef X86_AVAILABLE
if (Arch == Triple::x86_64)
- return createX86MCPlusBuilder(Analysis, Info, RegInfo);
+ return createX86MCPlusBuilder(Analysis, Info, RegInfo, STI);
#endif
#ifdef AARCH64_AVAILABLE
if (Arch == Triple::aarch64)
- return createAArch64MCPlusBuilder(Analysis, Info, RegInfo);
+ return createAArch64MCPlusBuilder(Analysis, Info, RegInfo, STI);
#endif
llvm_unreachable("architecture unsupported by MCPlusBuilder");
@@ -106,8 +109,9 @@ MachORewriteInstance::MachORewriteInstance(object::MachOObjectFile *InputFile,
return;
}
BC = std::move(BCOrErr.get());
- BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(createMCPlusBuilder(
- BC->TheTriple->getArch(), BC->MIA.get(), BC->MII.get(), BC->MRI.get())));
+ BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(
+ createMCPlusBuilder(BC->TheTriple->getArch(), BC->MIA.get(),
+ BC->MII.get(), BC->MRI.get(), BC->STI.get())));
if (opts::Instrument)
BC->setRuntimeLibrary(std::make_unique<InstrumentationRuntimeLibrary>());
}
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index 5cbbd1a5a8acaa8..e7ab8fbca508d89 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -272,20 +272,21 @@ extern const char *BoltRevision;
MCPlusBuilder *createMCPlusBuilder(const Triple::ArchType Arch,
const MCInstrAnalysis *Analysis,
const MCInstrInfo *Info,
- const MCRegisterInfo *RegInfo) {
+ const MCRegisterInfo *RegInfo,
+ const MCSubtargetInfo *STI) {
#ifdef X86_AVAILABLE
if (Arch == Triple::x86_64)
- return createX86MCPlusBuilder(Analysis, Info, RegInfo);
+ return createX86MCPlusBuilder(Analysis, Info, RegInfo, STI);
#endif
#ifdef AARCH64_AVAILABLE
if (Arch == Triple::aarch64)
- return createAArch64MCPlusBuilder(Analysis, Info, RegInfo);
+ return createAArch64MCPlusBuilder(Analysis, Info, RegInfo, STI);
#endif
#ifdef RISCV_AVAILABLE
if (Arch == Triple::riscv64)
- return createRISCVMCPlusBuilder(Analysis, Info, RegInfo);
+ return createRISCVMCPlusBuilder(Analysis, Info, RegInfo, STI);
#endif
llvm_unreachable("architecture unsupported by MCPlusBuilder");
@@ -348,8 +349,9 @@ RewriteInstance::RewriteInstance(ELFObjectFileBase *File, const int Argc,
return;
}
BC = std::move(BCOrErr.get());
- BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(createMCPlusBuilder(
- BC->TheTriple->getArch(), BC->MIA.get(), BC->MII.get(), BC->MRI.get())));
+ BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(
+ createMCPlusBuilder(BC->TheTriple->getArch(), BC->MIA.get(),
+ BC->MII.get(), BC->MRI.get(), BC->STI.get())));
BAT = std::make_unique<BoltAddressTranslation>();
diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
index bf77244102a21b1..c2a4607411a49e1 100644
--- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
+++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
@@ -128,9 +128,7 @@ static InstructionListType createIncMemory(MCPhysReg RegTo, MCPhysReg RegTmp) {
}
class AArch64MCPlusBuilder : public MCPlusBuilder {
public:
- AArch64MCPlusBuilder(const MCInstrAnalysis *Analysis, const MCInstrInfo *Info,
- const MCRegisterInfo *RegInfo)
- : MCPlusBuilder(Analysis, Info, RegInfo) {}
+ using MCPlusBuilder::MCPlusBuilder;
bool equals(const MCTargetExpr &A, const MCTargetExpr &B,
CompFuncTy Comp) const override {
@@ -1654,8 +1652,9 @@ namespace bolt {
MCPlusBuilder *createAArch64MCPlusBuilder(const MCInstrAnalysis *Analysis,
const MCInstrInfo *Info,
- const MCRegisterInfo *RegInfo) {
- return new AArch64MCPlusBuilder(Analysis, Info, RegInfo);
+ const MCRegisterInfo *RegInfo,
+ const MCSubtargetInfo *STI) {
+ return new AArch64MCPlusBuilder(Analysis, Info, RegInfo, STI);
}
} // namespace bolt
diff --git a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
index c2e64039a250079..f06455117a1c24d 100644
--- a/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
+++ b/bolt/lib/Target/RISCV/RISCVMCPlusBuilder.cpp
@@ -457,8 +457,9 @@ namespace bolt {
MCPlusBuilder *createRISCVMCPlusBuilder(const MCInstrAnalysis *Analysis,
const MCInstrInfo *Info,
- const MCRegisterInfo *RegInfo) {
- return new RISCVMCPlusBuilder(Analysis, Info, RegInfo);
+ const MCRegisterInfo *RegInfo,
+ const MCSubtargetInfo *STI) {
+ return new RISCVMCPlusBuilder(Analysis, Info, RegInfo, STI);
}
} // namespace bolt
diff --git a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp
index 99b08a91d969604..ce8a4d691485446 100644
--- a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp
+++ b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp
@@ -87,9 +87,7 @@ static InstructionListType createIncMemory(const MCSymbol *Target,
class X86MCPlusBuilder : public MCPlusBuilder {
public:
- X86MCPlusBuilder(const MCInstrAnalysis *Analysis, const MCInstrInfo *Info,
- const MCRegisterInfo *RegInfo)
- : MCPlusBuilder(Analysis, Info, RegInfo) {}
+ using MCPlusBuilder::MCPlusBuilder;
std::unique_ptr<MCSymbolizer>
createTargetSymbolizer(BinaryFunction &Function,
@@ -3579,8 +3577,9 @@ namespace bolt {
MCPlusBuilder *createX86MCPlusBuilder(const MCInstrAnalysis *Analysis,
const MCInstrInfo *Info,
- const MCRegisterInfo *RegInfo) {
- return new X86MCPlusBuilder(Analysis, Info, RegInfo);
+ const MCRegisterInfo *RegInfo,
+ const MCSubtargetInfo *STI) {
+ return new X86MCPlusBuilder(Analysis, Info, RegInfo, STI);
}
} // namespace bolt
diff --git a/bolt/unittests/Core/MCPlusBuilder.cpp b/bolt/unittests/Core/MCPlusBuilder.cpp
index 6519ff6934d1f8a..b851c756e7960e9 100644
--- a/bolt/unittests/Core/MCPlusBuilder.cpp
+++ b/bolt/unittests/Core/MCPlusBuilder.cpp
@@ -52,8 +52,9 @@ struct MCPlusBuilderTester : public testing::TestWithParam<Triple::ArchType> {
BC = cantFail(BinaryContext::createBinaryContext(
ObjFile.get(), true, DWARFContext::create(*ObjFile.get())));
ASSERT_FALSE(!BC);
- BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(createMCPlusBuilder(
- GetParam(), BC->MIA.get(), BC->MII.get(), BC->MRI.get())));
+ BC->initializeTarget(std::unique_ptr<MCPlusBuilder>(
+ createMCPlusBuilder(GetParam(), BC->MIA.get(), BC->MII.get(),
+ BC->MRI.get(), BC->STI.get())));
}
void testRegAliases(Triple::ArchType Arch, uint64_t Register,
More information about the llvm-commits
mailing list