1*9880d681SAndroid Build Coastguard Worker //===-- BPFTargetMachine.cpp - Define TargetMachine for BPF ---------------===//
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 // Implements the info about BPF target spec.
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 "BPFTargetMachine.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/LegacyPassManager.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/Passes.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/TargetPassConfig.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/FormattedStream.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetOptions.h"
23*9880d681SAndroid Build Coastguard Worker using namespace llvm;
24*9880d681SAndroid Build Coastguard Worker
LLVMInitializeBPFTarget()25*9880d681SAndroid Build Coastguard Worker extern "C" void LLVMInitializeBPFTarget() {
26*9880d681SAndroid Build Coastguard Worker // Register the target.
27*9880d681SAndroid Build Coastguard Worker RegisterTargetMachine<BPFTargetMachine> X(TheBPFleTarget);
28*9880d681SAndroid Build Coastguard Worker RegisterTargetMachine<BPFTargetMachine> Y(TheBPFbeTarget);
29*9880d681SAndroid Build Coastguard Worker RegisterTargetMachine<BPFTargetMachine> Z(TheBPFTarget);
30*9880d681SAndroid Build Coastguard Worker }
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker // DataLayout: little or big endian
computeDataLayout(const Triple & TT)33*9880d681SAndroid Build Coastguard Worker static std::string computeDataLayout(const Triple &TT) {
34*9880d681SAndroid Build Coastguard Worker if (TT.getArch() == Triple::bpfeb)
35*9880d681SAndroid Build Coastguard Worker return "E-m:e-p:64:64-i64:64-n32:64-S128";
36*9880d681SAndroid Build Coastguard Worker else
37*9880d681SAndroid Build Coastguard Worker return "e-m:e-p:64:64-i64:64-n32:64-S128";
38*9880d681SAndroid Build Coastguard Worker }
39*9880d681SAndroid Build Coastguard Worker
getEffectiveRelocModel(Optional<Reloc::Model> RM)40*9880d681SAndroid Build Coastguard Worker static Reloc::Model getEffectiveRelocModel(Optional<Reloc::Model> RM) {
41*9880d681SAndroid Build Coastguard Worker if (!RM.hasValue())
42*9880d681SAndroid Build Coastguard Worker return Reloc::PIC_;
43*9880d681SAndroid Build Coastguard Worker return *RM;
44*9880d681SAndroid Build Coastguard Worker }
45*9880d681SAndroid Build Coastguard Worker
BPFTargetMachine(const Target & T,const Triple & TT,StringRef CPU,StringRef FS,const TargetOptions & Options,Optional<Reloc::Model> RM,CodeModel::Model CM,CodeGenOpt::Level OL)46*9880d681SAndroid Build Coastguard Worker BPFTargetMachine::BPFTargetMachine(const Target &T, const Triple &TT,
47*9880d681SAndroid Build Coastguard Worker StringRef CPU, StringRef FS,
48*9880d681SAndroid Build Coastguard Worker const TargetOptions &Options,
49*9880d681SAndroid Build Coastguard Worker Optional<Reloc::Model> RM,
50*9880d681SAndroid Build Coastguard Worker CodeModel::Model CM, CodeGenOpt::Level OL)
51*9880d681SAndroid Build Coastguard Worker : LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options,
52*9880d681SAndroid Build Coastguard Worker getEffectiveRelocModel(RM), CM, OL),
53*9880d681SAndroid Build Coastguard Worker TLOF(make_unique<TargetLoweringObjectFileELF>()),
54*9880d681SAndroid Build Coastguard Worker Subtarget(TT, CPU, FS, *this) {
55*9880d681SAndroid Build Coastguard Worker initAsmInfo();
56*9880d681SAndroid Build Coastguard Worker }
57*9880d681SAndroid Build Coastguard Worker namespace {
58*9880d681SAndroid Build Coastguard Worker // BPF Code Generator Pass Configuration Options.
59*9880d681SAndroid Build Coastguard Worker class BPFPassConfig : public TargetPassConfig {
60*9880d681SAndroid Build Coastguard Worker public:
BPFPassConfig(BPFTargetMachine * TM,PassManagerBase & PM)61*9880d681SAndroid Build Coastguard Worker BPFPassConfig(BPFTargetMachine *TM, PassManagerBase &PM)
62*9880d681SAndroid Build Coastguard Worker : TargetPassConfig(TM, PM) {}
63*9880d681SAndroid Build Coastguard Worker
getBPFTargetMachine() const64*9880d681SAndroid Build Coastguard Worker BPFTargetMachine &getBPFTargetMachine() const {
65*9880d681SAndroid Build Coastguard Worker return getTM<BPFTargetMachine>();
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker bool addInstSelector() override;
69*9880d681SAndroid Build Coastguard Worker };
70*9880d681SAndroid Build Coastguard Worker }
71*9880d681SAndroid Build Coastguard Worker
createPassConfig(PassManagerBase & PM)72*9880d681SAndroid Build Coastguard Worker TargetPassConfig *BPFTargetMachine::createPassConfig(PassManagerBase &PM) {
73*9880d681SAndroid Build Coastguard Worker return new BPFPassConfig(this, PM);
74*9880d681SAndroid Build Coastguard Worker }
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker // Install an instruction selector pass using
77*9880d681SAndroid Build Coastguard Worker // the ISelDag to gen BPF code.
addInstSelector()78*9880d681SAndroid Build Coastguard Worker bool BPFPassConfig::addInstSelector() {
79*9880d681SAndroid Build Coastguard Worker addPass(createBPFISelDag(getBPFTargetMachine()));
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker return false;
82*9880d681SAndroid Build Coastguard Worker }
83