1e4c8c807SAlexei Starovoitov //===-- BPFSubtarget.cpp - BPF Subtarget Information ----------------------===//
2e4c8c807SAlexei Starovoitov //
3e4c8c807SAlexei Starovoitov //                     The LLVM Compiler Infrastructure
4e4c8c807SAlexei Starovoitov //
5e4c8c807SAlexei Starovoitov // This file is distributed under the University of Illinois Open Source
6e4c8c807SAlexei Starovoitov // License. See LICENSE.TXT for details.
7e4c8c807SAlexei Starovoitov //
8e4c8c807SAlexei Starovoitov //===----------------------------------------------------------------------===//
9e4c8c807SAlexei Starovoitov //
10e4c8c807SAlexei Starovoitov // This file implements the BPF specific subclass of TargetSubtargetInfo.
11e4c8c807SAlexei Starovoitov //
12e4c8c807SAlexei Starovoitov //===----------------------------------------------------------------------===//
13e4c8c807SAlexei Starovoitov 
14e4c8c807SAlexei Starovoitov #include "BPFSubtarget.h"
15e4c8c807SAlexei Starovoitov #include "BPF.h"
16*dc1dbf6eSYonghong Song #include "llvm/Support/Host.h"
17e4c8c807SAlexei Starovoitov #include "llvm/Support/TargetRegistry.h"
18e4c8c807SAlexei Starovoitov 
19e4c8c807SAlexei Starovoitov using namespace llvm;
20e4c8c807SAlexei Starovoitov 
21e4c8c807SAlexei Starovoitov #define DEBUG_TYPE "bpf-subtarget"
22e4c8c807SAlexei Starovoitov 
23e4c8c807SAlexei Starovoitov #define GET_SUBTARGETINFO_TARGET_DESC
24e4c8c807SAlexei Starovoitov #define GET_SUBTARGETINFO_CTOR
25e4c8c807SAlexei Starovoitov #include "BPFGenSubtargetInfo.inc"
26e4c8c807SAlexei Starovoitov 
27e4c8c807SAlexei Starovoitov void BPFSubtarget::anchor() {}
28e4c8c807SAlexei Starovoitov 
29*dc1dbf6eSYonghong Song BPFSubtarget &BPFSubtarget::initializeSubtargetDependencies(StringRef CPU,
30*dc1dbf6eSYonghong Song                                                             StringRef FS) {
31*dc1dbf6eSYonghong Song   initializeEnvironment();
32*dc1dbf6eSYonghong Song   initSubtargetFeatures(CPU, FS);
33*dc1dbf6eSYonghong Song   return *this;
34*dc1dbf6eSYonghong Song }
35*dc1dbf6eSYonghong Song 
36*dc1dbf6eSYonghong Song void BPFSubtarget::initializeEnvironment() {
37*dc1dbf6eSYonghong Song   HasJmpExt = false;
38*dc1dbf6eSYonghong Song }
39*dc1dbf6eSYonghong Song 
40*dc1dbf6eSYonghong Song void BPFSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
41*dc1dbf6eSYonghong Song   if (CPU == "probe")
42*dc1dbf6eSYonghong Song     CPU = sys::detail::getHostCPUNameForBPF();
43*dc1dbf6eSYonghong Song   if (CPU == "generic" || CPU == "v1")
44*dc1dbf6eSYonghong Song     return;
45*dc1dbf6eSYonghong Song   if (CPU == "v2") {
46*dc1dbf6eSYonghong Song     HasJmpExt = true;
47*dc1dbf6eSYonghong Song     return;
48*dc1dbf6eSYonghong Song   }
49*dc1dbf6eSYonghong Song }
50*dc1dbf6eSYonghong Song 
51a73f1fdbSDaniel Sanders BPFSubtarget::BPFSubtarget(const Triple &TT, const std::string &CPU,
52e4c8c807SAlexei Starovoitov                            const std::string &FS, const TargetMachine &TM)
53*dc1dbf6eSYonghong Song     : BPFGenSubtargetInfo(TT, CPU, FS), InstrInfo(),
54*dc1dbf6eSYonghong Song       FrameLowering(initializeSubtargetDependencies(CPU, FS)),
5550f17235SDaniel Sanders       TLInfo(TM, *this) {}
56