forked from OSchip/llvm-project
Add a TargetMachine local MCRegisterInfo and MCInstrInfo so that
they can be used without a subtarget in constructing subtarget independent passes. llvm-svn: 232775
This commit is contained in:
parent
c759fe90bc
commit
72e23a219c
|
@ -30,6 +30,8 @@ class Mangler;
|
|||
class MCAsmInfo;
|
||||
class MCCodeGenInfo;
|
||||
class MCContext;
|
||||
class MCInstrInfo;
|
||||
class MCRegisterInfo;
|
||||
class MCSymbol;
|
||||
class Target;
|
||||
class DataLayout;
|
||||
|
@ -86,6 +88,8 @@ protected: // Can only create subclasses.
|
|||
/// AsmInfo - Contains target specific asm information.
|
||||
///
|
||||
const MCAsmInfo *AsmInfo;
|
||||
const MCRegisterInfo *MRI;
|
||||
const MCInstrInfo *MII;
|
||||
|
||||
unsigned RequireStructuredCFG : 1;
|
||||
|
||||
|
@ -134,6 +138,8 @@ public:
|
|||
/// getMCAsmInfo - Return target specific asm information.
|
||||
///
|
||||
const MCAsmInfo *getMCAsmInfo() const { return AsmInfo; }
|
||||
const MCRegisterInfo *getMCRegisterInfo() const { return MRI; }
|
||||
const MCInstrInfo *getMCInstrInfo() const { return MII; }
|
||||
|
||||
/// getIntrinsicInfo - If intrinsic information is available, return it. If
|
||||
/// not, return null.
|
||||
|
|
|
@ -47,8 +47,10 @@ EnableFastISelOption("fast-isel", cl::Hidden,
|
|||
cl::desc("Enable the \"fast\" instruction selector"));
|
||||
|
||||
void LLVMTargetMachine::initAsmInfo() {
|
||||
MCAsmInfo *TmpAsmInfo = TheTarget.createMCAsmInfo(
|
||||
*getSubtargetImpl()->getRegisterInfo(), getTargetTriple());
|
||||
MRI = TheTarget.createMCRegInfo(getTargetTriple());
|
||||
MII = TheTarget.createMCInstrInfo();
|
||||
|
||||
MCAsmInfo *TmpAsmInfo = TheTarget.createMCAsmInfo(*MRI, getTargetTriple());
|
||||
// TargetSelect.h moved to a different directory between LLVM 2.9 and 3.0,
|
||||
// and if the old one gets included then MCAsmInfo will be NULL and
|
||||
// we'll crash later.
|
||||
|
@ -113,8 +115,7 @@ static MCContext *addPassesToGenerateCode(LLVMTargetMachine *TM,
|
|||
// Install a MachineModuleInfo class, which is an immutable pass that holds
|
||||
// all the per-module stuff we're generating, including MCContext.
|
||||
MachineModuleInfo *MMI = new MachineModuleInfo(
|
||||
*TM->getMCAsmInfo(), *TM->getSubtargetImpl()->getRegisterInfo(),
|
||||
TM->getObjFileLowering());
|
||||
*TM->getMCAsmInfo(), *TM->getMCRegisterInfo(), TM->getObjFileLowering());
|
||||
PM.add(MMI);
|
||||
|
||||
// Set up a MachineFunction for the rest of CodeGen to work on.
|
||||
|
@ -164,15 +165,15 @@ bool LLVMTargetMachine::addPassesToEmitFile(PassManagerBase &PM,
|
|||
|
||||
const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
|
||||
const MCAsmInfo &MAI = *getMCAsmInfo();
|
||||
const MCRegisterInfo &MRI = *getSubtargetImpl()->getRegisterInfo();
|
||||
const MCInstrInfo &MII = *getSubtargetImpl()->getInstrInfo();
|
||||
const MCRegisterInfo &MRI = *getMCRegisterInfo();
|
||||
const MCInstrInfo &MII = *getMCInstrInfo();
|
||||
|
||||
std::unique_ptr<MCStreamer> AsmStreamer;
|
||||
|
||||
switch (FileType) {
|
||||
case CGFT_AssemblyFile: {
|
||||
MCInstPrinter *InstPrinter =
|
||||
getTarget().createMCInstPrinter(MAI.getAssemblerDialect(), MAI,
|
||||
MII, MRI, STI);
|
||||
MCInstPrinter *InstPrinter = getTarget().createMCInstPrinter(
|
||||
MAI.getAssemblerDialect(), MAI, MII, MRI, STI);
|
||||
|
||||
// Create a code emitter if asked to show the encoding.
|
||||
MCCodeEmitter *MCE = nullptr;
|
||||
|
@ -239,16 +240,16 @@ bool LLVMTargetMachine::addPassesToEmitMC(PassManagerBase &PM,
|
|||
|
||||
// Create the code emitter for the target if it exists. If not, .o file
|
||||
// emission fails.
|
||||
const MCRegisterInfo &MRI = *getSubtargetImpl()->getRegisterInfo();
|
||||
const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
|
||||
MCCodeEmitter *MCE = getTarget().createMCCodeEmitter(
|
||||
*getSubtargetImpl()->getInstrInfo(), MRI, *Ctx);
|
||||
const MCRegisterInfo &MRI = *getMCRegisterInfo();
|
||||
MCCodeEmitter *MCE =
|
||||
getTarget().createMCCodeEmitter(*getMCInstrInfo(), MRI, *Ctx);
|
||||
MCAsmBackend *MAB = getTarget().createMCAsmBackend(MRI, getTargetTriple(),
|
||||
TargetCPU);
|
||||
if (!MCE || !MAB)
|
||||
return true;
|
||||
|
||||
Triple T(getTargetTriple());
|
||||
const MCSubtargetInfo &STI = getSubtarget<MCSubtargetInfo>();
|
||||
std::unique_ptr<MCStreamer> AsmStreamer(getTarget().createMCObjectStreamer(
|
||||
T, *Ctx, *MAB, Out, MCE, STI, Options.MCOptions.MCRelaxAll));
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include "llvm/MC/MCAsmInfo.h"
|
||||
#include "llvm/MC/MCCodeGenInfo.h"
|
||||
#include "llvm/MC/MCContext.h"
|
||||
#include "llvm/MC/MCInstrInfo.h"
|
||||
#include "llvm/MC/MCSectionMachO.h"
|
||||
#include "llvm/MC/MCTargetOptions.h"
|
||||
#include "llvm/MC/SectionKind.h"
|
||||
|
@ -40,12 +41,14 @@ TargetMachine::TargetMachine(const Target &T, StringRef DataLayoutString,
|
|||
StringRef TT, StringRef CPU, StringRef FS,
|
||||
const TargetOptions &Options)
|
||||
: TheTarget(T), DL(DataLayoutString), TargetTriple(TT), TargetCPU(CPU),
|
||||
TargetFS(FS), CodeGenInfo(nullptr), AsmInfo(nullptr),
|
||||
RequireStructuredCFG(false), Options(Options) {}
|
||||
TargetFS(FS), CodeGenInfo(nullptr), AsmInfo(nullptr), MRI(nullptr),
|
||||
MII(nullptr), RequireStructuredCFG(false), Options(Options) {}
|
||||
|
||||
TargetMachine::~TargetMachine() {
|
||||
delete CodeGenInfo;
|
||||
delete AsmInfo;
|
||||
delete MRI;
|
||||
delete MII;
|
||||
}
|
||||
|
||||
/// \brief Reset the target options based on the function's attributes.
|
||||
|
|
Loading…
Reference in New Issue