BPFMCTargetDesc.cpp revision 286684
183828Sdfr//===-- BPFMCTargetDesc.cpp - BPF Target Descriptions ---------------------===// 283828Sdfr// 3164010Smarcel// The LLVM Compiler Infrastructure 483828Sdfr// 583828Sdfr// This file is distributed under the University of Illinois Open Source 683828Sdfr// License. See LICENSE.TXT for details. 783828Sdfr// 883828Sdfr//===----------------------------------------------------------------------===// 983828Sdfr// 1083828Sdfr// This file provides BPF specific target descriptions. 1183828Sdfr// 1283828Sdfr//===----------------------------------------------------------------------===// 1383828Sdfr 1483828Sdfr#include "BPF.h" 1583828Sdfr#include "BPFMCTargetDesc.h" 1683828Sdfr#include "BPFMCAsmInfo.h" 1783828Sdfr#include "InstPrinter/BPFInstPrinter.h" 1883828Sdfr#include "llvm/MC/MCCodeGenInfo.h" 1983828Sdfr#include "llvm/MC/MCInstrInfo.h" 2083828Sdfr#include "llvm/MC/MCRegisterInfo.h" 2183828Sdfr#include "llvm/MC/MCStreamer.h" 2283828Sdfr#include "llvm/MC/MCSubtargetInfo.h" 2383828Sdfr#include "llvm/Support/ErrorHandling.h" 2483828Sdfr#include "llvm/Support/TargetRegistry.h" 2583828Sdfr 2683828Sdfr#define GET_INSTRINFO_MC_DESC 2783828Sdfr#include "BPFGenInstrInfo.inc" 28124140Sobrien 29124140Sobrien#define GET_SUBTARGETINFO_MC_DESC 30124140Sobrien#include "BPFGenSubtargetInfo.inc" 3183828Sdfr 3283828Sdfr#define GET_REGINFO_MC_DESC 3383828Sdfr#include "BPFGenRegisterInfo.inc" 3483828Sdfr 3583828Sdfrusing namespace llvm; 3683828Sdfr 3783828Sdfrstatic MCInstrInfo *createBPFMCInstrInfo() { 3883828Sdfr MCInstrInfo *X = new MCInstrInfo(); 39164010Smarcel InitBPFMCInstrInfo(X); 40164010Smarcel return X; 4183828Sdfr} 4283828Sdfr 4383828Sdfrstatic MCRegisterInfo *createBPFMCRegisterInfo(const Triple &TT) { 44164010Smarcel MCRegisterInfo *X = new MCRegisterInfo(); 4583828Sdfr InitBPFMCRegisterInfo(X, BPF::R11 /* RAReg doesn't exist */); 46164010Smarcel return X; 47164010Smarcel} 48164010Smarcel 49164010Smarcelstatic MCSubtargetInfo *createBPFMCSubtargetInfo(const Triple &TT, 50164010Smarcel StringRef CPU, StringRef FS) { 51164010Smarcel return createBPFMCSubtargetInfoImpl(TT, CPU, FS); 52164010Smarcel} 53292625Semaste 54164010Smarcelstatic MCCodeGenInfo *createBPFMCCodeGenInfo(const Triple &TT, Reloc::Model RM, 55164010Smarcel CodeModel::Model CM, 56164010Smarcel CodeGenOpt::Level OL) { 57164010Smarcel MCCodeGenInfo *X = new MCCodeGenInfo(); 58164010Smarcel X->initMCCodeGenInfo(RM, CM, OL); 59164010Smarcel return X; 60164010Smarcel} 61164010Smarcel 62164010Smarcelstatic MCStreamer *createBPFMCStreamer(const Triple &T, 63164010Smarcel MCContext &Ctx, MCAsmBackend &MAB, 64164010Smarcel raw_pwrite_stream &OS, MCCodeEmitter *Emitter, 6593409Smarcel bool RelaxAll) { 6693409Smarcel return createELFStreamer(Ctx, MAB, OS, Emitter, RelaxAll); 6793409Smarcel} 6893409Smarcel 6993409Smarcelstatic MCInstPrinter *createBPFMCInstPrinter(const Triple &T, 7093409Smarcel unsigned SyntaxVariant, 7193409Smarcel const MCAsmInfo &MAI, 7293409Smarcel const MCInstrInfo &MII, 7393409Smarcel const MCRegisterInfo &MRI) { 7493409Smarcel if (SyntaxVariant == 0) 7593409Smarcel return new BPFInstPrinter(MAI, MII, MRI); 7693409Smarcel return 0; 7793409Smarcel} 7893409Smarcel 7993409Smarcelextern "C" void LLVMInitializeBPFTargetMC() { 8093409Smarcel for (Target *T : {&TheBPFleTarget, &TheBPFbeTarget, &TheBPFTarget}) { 8193409Smarcel // Register the MC asm info. 8293409Smarcel RegisterMCAsmInfo<BPFMCAsmInfo> X(*T); 8393409Smarcel 8493409Smarcel // Register the MC codegen info. 8593409Smarcel TargetRegistry::RegisterMCCodeGenInfo(*T, createBPFMCCodeGenInfo); 8693409Smarcel 8793409Smarcel // Register the MC instruction info. 8893409Smarcel TargetRegistry::RegisterMCInstrInfo(*T, createBPFMCInstrInfo); 8993409Smarcel 9093409Smarcel // Register the MC register info. 9193409Smarcel TargetRegistry::RegisterMCRegInfo(*T, createBPFMCRegisterInfo); 9293409Smarcel 9393409Smarcel // Register the MC subtarget info. 9493409Smarcel TargetRegistry::RegisterMCSubtargetInfo(*T, 9593409Smarcel createBPFMCSubtargetInfo); 9693409Smarcel 9793409Smarcel // Register the object streamer 9893409Smarcel TargetRegistry::RegisterELFStreamer(*T, createBPFMCStreamer); 99164010Smarcel 10083828Sdfr // Register the MCInstPrinter. 10183828Sdfr TargetRegistry::RegisterMCInstPrinter(*T, createBPFMCInstPrinter); 102277943Sambrisko } 10383828Sdfr 104277943Sambrisko // Register the MC code emitter 105277943Sambrisko TargetRegistry::RegisterMCCodeEmitter(TheBPFleTarget, createBPFMCCodeEmitter); 106277943Sambrisko TargetRegistry::RegisterMCCodeEmitter(TheBPFbeTarget, createBPFbeMCCodeEmitter); 10783828Sdfr 10883828Sdfr // Register the ASM Backend 109164010Smarcel TargetRegistry::RegisterMCAsmBackend(TheBPFleTarget, createBPFAsmBackend); 11083828Sdfr TargetRegistry::RegisterMCAsmBackend(TheBPFbeTarget, createBPFbeAsmBackend); 11183828Sdfr 11283828Sdfr if (sys::IsLittleEndianHost) { 11383828Sdfr TargetRegistry::RegisterMCCodeEmitter(TheBPFTarget, createBPFMCCodeEmitter); 11483828Sdfr TargetRegistry::RegisterMCAsmBackend(TheBPFTarget, createBPFAsmBackend); 11583828Sdfr } else { 116164010Smarcel TargetRegistry::RegisterMCCodeEmitter(TheBPFTarget, createBPFbeMCCodeEmitter); 11783828Sdfr TargetRegistry::RegisterMCAsmBackend(TheBPFTarget, createBPFbeAsmBackend); 11883828Sdfr } 11993403Smarcel} 12093403Smarcel