1ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===-- BPFMCTargetDesc.cpp - BPF Target Descriptions ---------------------===//
2ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
3ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//                     The LLVM Compiler Infrastructure
4ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
5ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// This file is distributed under the University of Illinois Open Source
6ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// License. See LICENSE.TXT for details.
7ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
8ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===----------------------------------------------------------------------===//
9ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
10ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines// This file provides BPF specific target descriptions.
11ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//
12ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines//===----------------------------------------------------------------------===//
13ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
14ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "BPF.h"
15ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "BPFMCTargetDesc.h"
16ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "BPFMCAsmInfo.h"
17ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "InstPrinter/BPFInstPrinter.h"
18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/MC/MCCodeGenInfo.h"
19ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/MC/MCInstrInfo.h"
20ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/MC/MCRegisterInfo.h"
21ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/MC/MCStreamer.h"
22ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/MC/MCSubtargetInfo.h"
23ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Support/ErrorHandling.h"
24ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Support/TargetRegistry.h"
25ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
26ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#define GET_INSTRINFO_MC_DESC
27ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "BPFGenInstrInfo.inc"
28ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#define GET_SUBTARGETINFO_MC_DESC
30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "BPFGenSubtargetInfo.inc"
31ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
32ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#define GET_REGINFO_MC_DESC
33ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "BPFGenRegisterInfo.inc"
34ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesusing namespace llvm;
36ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
37ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic MCInstrInfo *createBPFMCInstrInfo() {
38ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MCInstrInfo *X = new MCInstrInfo();
39ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  InitBPFMCInstrInfo(X);
40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return X;
41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
42ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
43ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic MCRegisterInfo *createBPFMCRegisterInfo(StringRef TT) {
44ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MCRegisterInfo *X = new MCRegisterInfo();
45ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  InitBPFMCRegisterInfo(X, BPF::R11 /* RAReg doesn't exist */);
46ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return X;
47ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
48ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
49ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic MCSubtargetInfo *createBPFMCSubtargetInfo(StringRef TT, StringRef CPU,
50ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                                 StringRef FS) {
51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MCSubtargetInfo *X = new MCSubtargetInfo();
52ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  InitBPFMCSubtargetInfo(X, TT, CPU, FS);
53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return X;
54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
56ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic MCCodeGenInfo *createBPFMCCodeGenInfo(StringRef TT, Reloc::Model RM,
57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                             CodeModel::Model CM,
58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                             CodeGenOpt::Level OL) {
59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MCCodeGenInfo *X = new MCCodeGenInfo();
60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  X->InitMCCodeGenInfo(RM, CM, OL);
61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return X;
62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstatic MCStreamer *createBPFMCStreamer(const Triple &T,
65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                       MCContext &Ctx, MCAsmBackend &MAB,
662c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                                       raw_pwrite_stream &OS, MCCodeEmitter *Emitter,
67ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                       bool RelaxAll) {
684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return createELFStreamer(Ctx, MAB, OS, Emitter, RelaxAll);
69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
70ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
712c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarstatic MCInstPrinter *createBPFMCInstPrinter(const Triple &T,
722c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                                             unsigned SyntaxVariant,
732c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                                             const MCAsmInfo &MAI,
742c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                                             const MCInstrInfo &MII,
752c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                                             const MCRegisterInfo &MRI) {
76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (SyntaxVariant == 0)
77ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return new BPFInstPrinter(MAI, MII, MRI);
78ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return 0;
79ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
81ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesextern "C" void LLVMInitializeBPFTargetMC() {
82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Register the MC asm info.
83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  RegisterMCAsmInfo<BPFMCAsmInfo> X(TheBPFTarget);
84ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Register the MC codegen info.
86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetRegistry::RegisterMCCodeGenInfo(TheBPFTarget, createBPFMCCodeGenInfo);
87ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
88ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Register the MC instruction info.
89ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetRegistry::RegisterMCInstrInfo(TheBPFTarget, createBPFMCInstrInfo);
90ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
91ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Register the MC register info.
92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetRegistry::RegisterMCRegInfo(TheBPFTarget, createBPFMCRegisterInfo);
93ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
94ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Register the MC subtarget info.
95ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetRegistry::RegisterMCSubtargetInfo(TheBPFTarget,
96ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                          createBPFMCSubtargetInfo);
97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
98ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Register the MC code emitter
99ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetRegistry::RegisterMCCodeEmitter(TheBPFTarget,
100ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                        llvm::createBPFMCCodeEmitter);
101ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
102ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Register the ASM Backend
103ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetRegistry::RegisterMCAsmBackend(TheBPFTarget, createBPFAsmBackend);
104ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
105ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Register the object streamer
1064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  TargetRegistry::RegisterELFStreamer(TheBPFTarget, createBPFMCStreamer);
107ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
108ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  // Register the MCInstPrinter.
109ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  TargetRegistry::RegisterMCInstPrinter(TheBPFTarget, createBPFMCInstPrinter);
110ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
111