1*9880d681SAndroid Build Coastguard Worker //===-- BPFMCTargetDesc.cpp - BPF Target Descriptions ---------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file provides BPF specific target descriptions.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "BPF.h"
15*9880d681SAndroid Build Coastguard Worker #include "BPFMCTargetDesc.h"
16*9880d681SAndroid Build Coastguard Worker #include "BPFMCAsmInfo.h"
17*9880d681SAndroid Build Coastguard Worker #include "InstPrinter/BPFInstPrinter.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrInfo.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCRegisterInfo.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSubtargetInfo.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker #define GET_INSTRINFO_MC_DESC
26*9880d681SAndroid Build Coastguard Worker #include "BPFGenInstrInfo.inc"
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_MC_DESC
29*9880d681SAndroid Build Coastguard Worker #include "BPFGenSubtargetInfo.inc"
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_MC_DESC
32*9880d681SAndroid Build Coastguard Worker #include "BPFGenRegisterInfo.inc"
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker using namespace llvm;
35*9880d681SAndroid Build Coastguard Worker
createBPFMCInstrInfo()36*9880d681SAndroid Build Coastguard Worker static MCInstrInfo *createBPFMCInstrInfo() {
37*9880d681SAndroid Build Coastguard Worker MCInstrInfo *X = new MCInstrInfo();
38*9880d681SAndroid Build Coastguard Worker InitBPFMCInstrInfo(X);
39*9880d681SAndroid Build Coastguard Worker return X;
40*9880d681SAndroid Build Coastguard Worker }
41*9880d681SAndroid Build Coastguard Worker
createBPFMCRegisterInfo(const Triple & TT)42*9880d681SAndroid Build Coastguard Worker static MCRegisterInfo *createBPFMCRegisterInfo(const Triple &TT) {
43*9880d681SAndroid Build Coastguard Worker MCRegisterInfo *X = new MCRegisterInfo();
44*9880d681SAndroid Build Coastguard Worker InitBPFMCRegisterInfo(X, BPF::R11 /* RAReg doesn't exist */);
45*9880d681SAndroid Build Coastguard Worker return X;
46*9880d681SAndroid Build Coastguard Worker }
47*9880d681SAndroid Build Coastguard Worker
createBPFMCSubtargetInfo(const Triple & TT,StringRef CPU,StringRef FS)48*9880d681SAndroid Build Coastguard Worker static MCSubtargetInfo *createBPFMCSubtargetInfo(const Triple &TT,
49*9880d681SAndroid Build Coastguard Worker StringRef CPU, StringRef FS) {
50*9880d681SAndroid Build Coastguard Worker return createBPFMCSubtargetInfoImpl(TT, CPU, FS);
51*9880d681SAndroid Build Coastguard Worker }
52*9880d681SAndroid Build Coastguard Worker
createBPFMCStreamer(const Triple & T,MCContext & Ctx,MCAsmBackend & MAB,raw_pwrite_stream & OS,MCCodeEmitter * Emitter,bool RelaxAll)53*9880d681SAndroid Build Coastguard Worker static MCStreamer *createBPFMCStreamer(const Triple &T,
54*9880d681SAndroid Build Coastguard Worker MCContext &Ctx, MCAsmBackend &MAB,
55*9880d681SAndroid Build Coastguard Worker raw_pwrite_stream &OS, MCCodeEmitter *Emitter,
56*9880d681SAndroid Build Coastguard Worker bool RelaxAll) {
57*9880d681SAndroid Build Coastguard Worker return createELFStreamer(Ctx, MAB, OS, Emitter, RelaxAll);
58*9880d681SAndroid Build Coastguard Worker }
59*9880d681SAndroid Build Coastguard Worker
createBPFMCInstPrinter(const Triple & T,unsigned SyntaxVariant,const MCAsmInfo & MAI,const MCInstrInfo & MII,const MCRegisterInfo & MRI)60*9880d681SAndroid Build Coastguard Worker static MCInstPrinter *createBPFMCInstPrinter(const Triple &T,
61*9880d681SAndroid Build Coastguard Worker unsigned SyntaxVariant,
62*9880d681SAndroid Build Coastguard Worker const MCAsmInfo &MAI,
63*9880d681SAndroid Build Coastguard Worker const MCInstrInfo &MII,
64*9880d681SAndroid Build Coastguard Worker const MCRegisterInfo &MRI) {
65*9880d681SAndroid Build Coastguard Worker if (SyntaxVariant == 0)
66*9880d681SAndroid Build Coastguard Worker return new BPFInstPrinter(MAI, MII, MRI);
67*9880d681SAndroid Build Coastguard Worker return 0;
68*9880d681SAndroid Build Coastguard Worker }
69*9880d681SAndroid Build Coastguard Worker
LLVMInitializeBPFTargetMC()70*9880d681SAndroid Build Coastguard Worker extern "C" void LLVMInitializeBPFTargetMC() {
71*9880d681SAndroid Build Coastguard Worker for (Target *T : {&TheBPFleTarget, &TheBPFbeTarget, &TheBPFTarget}) {
72*9880d681SAndroid Build Coastguard Worker // Register the MC asm info.
73*9880d681SAndroid Build Coastguard Worker RegisterMCAsmInfo<BPFMCAsmInfo> X(*T);
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker // Register the MC instruction info.
76*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCInstrInfo(*T, createBPFMCInstrInfo);
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker // Register the MC register info.
79*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCRegInfo(*T, createBPFMCRegisterInfo);
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker // Register the MC subtarget info.
82*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCSubtargetInfo(*T,
83*9880d681SAndroid Build Coastguard Worker createBPFMCSubtargetInfo);
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker // Register the object streamer
86*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterELFStreamer(*T, createBPFMCStreamer);
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker // Register the MCInstPrinter.
89*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCInstPrinter(*T, createBPFMCInstPrinter);
90*9880d681SAndroid Build Coastguard Worker }
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker // Register the MC code emitter
93*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCCodeEmitter(TheBPFleTarget, createBPFMCCodeEmitter);
94*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCCodeEmitter(TheBPFbeTarget, createBPFbeMCCodeEmitter);
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker // Register the ASM Backend
97*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCAsmBackend(TheBPFleTarget, createBPFAsmBackend);
98*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCAsmBackend(TheBPFbeTarget, createBPFbeAsmBackend);
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker if (sys::IsLittleEndianHost) {
101*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCCodeEmitter(TheBPFTarget, createBPFMCCodeEmitter);
102*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCAsmBackend(TheBPFTarget, createBPFAsmBackend);
103*9880d681SAndroid Build Coastguard Worker } else {
104*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCCodeEmitter(TheBPFTarget, createBPFbeMCCodeEmitter);
105*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCAsmBackend(TheBPFTarget, createBPFbeAsmBackend);
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker }
108