mirror of
https://github.com/intel/llvm.git
synced 2026-01-22 15:41:35 +08:00
[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`).
This commit is contained in:
@@ -160,6 +160,7 @@ protected:
|
||||
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 @@ public:
|
||||
|
||||
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 @@ public:
|
||||
|
||||
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
|
||||
|
||||
@@ -584,7 +584,8 @@ private:
|
||||
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
|
||||
|
||||
@@ -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>());
|
||||
}
|
||||
|
||||
@@ -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>();
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -471,8 +471,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -52,8 +52,9 @@ protected:
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user