diff --git a/bolt/include/bolt/Core/MCPlusBuilder.h b/bolt/include/bolt/Core/MCPlusBuilder.h index 5e12a4ac14c9e..14dd96e45d7af 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 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 1dacdc944f977..329fe356603d0 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 b827a196c8265..8be8257f15c1c 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(createMCPlusBuilder( - BC->TheTriple->getArch(), BC->MIA.get(), BC->MII.get(), BC->MRI.get()))); + BC->initializeTarget(std::unique_ptr( + createMCPlusBuilder(BC->TheTriple->getArch(), BC->MIA.get(), + BC->MII.get(), BC->MRI.get(), BC->STI.get()))); if (opts::Instrument) BC->setRuntimeLibrary(std::make_unique()); } diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp index 5cbbd1a5a8aca..e7ab8fbca508d 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(createMCPlusBuilder( - BC->TheTriple->getArch(), BC->MIA.get(), BC->MII.get(), BC->MRI.get()))); + BC->initializeTarget(std::unique_ptr( + createMCPlusBuilder(BC->TheTriple->getArch(), BC->MIA.get(), + BC->MII.get(), BC->MRI.get(), BC->STI.get()))); BAT = std::make_unique(); diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp index bf77244102a21..c2a4607411a49 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 c2e64039a2500..f06455117a1c2 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 99b08a91d9696..ce8a4d6914854 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 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 6519ff6934d1f..b851c756e7960 100644 --- a/bolt/unittests/Core/MCPlusBuilder.cpp +++ b/bolt/unittests/Core/MCPlusBuilder.cpp @@ -52,8 +52,9 @@ struct MCPlusBuilderTester : public testing::TestWithParam { BC = cantFail(BinaryContext::createBinaryContext( ObjFile.get(), true, DWARFContext::create(*ObjFile.get()))); ASSERT_FALSE(!BC); - BC->initializeTarget(std::unique_ptr(createMCPlusBuilder( - GetParam(), BC->MIA.get(), BC->MII.get(), BC->MRI.get()))); + BC->initializeTarget(std::unique_ptr( + createMCPlusBuilder(GetParam(), BC->MIA.get(), BC->MII.get(), + BC->MRI.get(), BC->STI.get()))); } void testRegAliases(Triple::ArchType Arch, uint64_t Register,