diff options
Diffstat (limited to 'llvm/lib/Target/Nios2/MCTargetDesc/Nios2MCTargetDesc.cpp')
-rw-r--r-- | llvm/lib/Target/Nios2/MCTargetDesc/Nios2MCTargetDesc.cpp | 75 |
1 files changed, 74 insertions, 1 deletions
diff --git a/llvm/lib/Target/Nios2/MCTargetDesc/Nios2MCTargetDesc.cpp b/llvm/lib/Target/Nios2/MCTargetDesc/Nios2MCTargetDesc.cpp index 0c70dc0bedc..e57b44d3cfd 100644 --- a/llvm/lib/Target/Nios2/MCTargetDesc/Nios2MCTargetDesc.cpp +++ b/llvm/lib/Target/Nios2/MCTargetDesc/Nios2MCTargetDesc.cpp @@ -12,8 +12,13 @@ //===----------------------------------------------------------------------===// #include "Nios2MCTargetDesc.h" +#include "InstPrinter/Nios2InstPrinter.h" +#include "Nios2MCAsmInfo.h" +#include "Nios2TargetStreamer.h" #include "llvm/MC/MCInstrInfo.h" +#include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCSubtargetInfo.h" +#include "llvm/Support/TargetRegistry.h" using namespace llvm; @@ -26,4 +31,72 @@ using namespace llvm; #define GET_REGINFO_MC_DESC #include "Nios2GenRegisterInfo.inc" -extern "C" void LLVMInitializeNios2TargetMC() {} +static MCInstrInfo *createNios2MCInstrInfo() { + MCInstrInfo *X = new MCInstrInfo(); + InitNios2MCInstrInfo(X); // defined in Nios2GenInstrInfo.inc + return X; +} + +static MCRegisterInfo *createNios2MCRegisterInfo(const Triple &TT) { + MCRegisterInfo *X = new MCRegisterInfo(); + InitNios2MCRegisterInfo(X, Nios2::R15); // defined in Nios2GenRegisterInfo.inc + return X; +} + +static MCSubtargetInfo * +createNios2MCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { + if (CPU.empty() || CPU == "generic") + CPU = "nios2r1"; + return createNios2MCSubtargetInfoImpl(TT, CPU, FS); + // createNios2MCSubtargetInfoImpl defined in Nios2GenSubtargetInfo.inc +} + +static MCAsmInfo *createNios2MCAsmInfo(const MCRegisterInfo &MRI, + const Triple &TT) { + MCAsmInfo *MAI = new Nios2MCAsmInfo(TT); + + unsigned SP = MRI.getDwarfRegNum(Nios2::SP, true); + MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, SP, 0); + MAI->addInitialFrameState(Inst); + + return MAI; +} + +static MCInstPrinter *createNios2MCInstPrinter(const Triple &T, + unsigned SyntaxVariant, + const MCAsmInfo &MAI, + const MCInstrInfo &MII, + const MCRegisterInfo &MRI) { + return new Nios2InstPrinter(MAI, MII, MRI); +} + +static MCTargetStreamer *createNios2AsmTargetStreamer(MCStreamer &S, + formatted_raw_ostream &OS, + MCInstPrinter *InstPrint, + bool isVerboseAsm) { + return new Nios2TargetAsmStreamer(S, OS); +} + +extern "C" void LLVMInitializeNios2TargetMC() { + Target *T = &getTheNios2Target(); + + // Register the MC asm info. + RegisterMCAsmInfoFn X(*T, createNios2MCAsmInfo); + + // Register the MC instruction info. + TargetRegistry::RegisterMCInstrInfo(*T, createNios2MCInstrInfo); + + // Register the MC register info. + TargetRegistry::RegisterMCRegInfo(*T, createNios2MCRegisterInfo); + + // Register the asm target streamer. + TargetRegistry::RegisterAsmTargetStreamer(*T, createNios2AsmTargetStreamer); + + // Register the MC subtarget info. + TargetRegistry::RegisterMCSubtargetInfo(*T, createNios2MCSubtargetInfo); + // Register the MCInstPrinter. + TargetRegistry::RegisterMCInstPrinter(*T, createNios2MCInstPrinter); + + // Register the asm backend. + TargetRegistry::RegisterMCAsmBackend(*T, createNios2AsmBackend); +} |