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