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"
16dc1dbf6eSYonghong 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 
29dc1dbf6eSYonghong Song BPFSubtarget &BPFSubtarget::initializeSubtargetDependencies(StringRef CPU,
30dc1dbf6eSYonghong Song                                                             StringRef FS) {
31dc1dbf6eSYonghong Song   initializeEnvironment();
32dc1dbf6eSYonghong Song   initSubtargetFeatures(CPU, FS);
3342389377SYonghong Song   ParseSubtargetFeatures(CPU, FS);
34dc1dbf6eSYonghong Song   return *this;
35dc1dbf6eSYonghong Song }
36dc1dbf6eSYonghong Song 
37dc1dbf6eSYonghong Song void BPFSubtarget::initializeEnvironment() {
38dc1dbf6eSYonghong Song   HasJmpExt = false;
3942389377SYonghong Song   HasAlu32 = false;
40*03e1c8b8SYonghong Song   UseDwarfRIS = false;
41dc1dbf6eSYonghong Song }
42dc1dbf6eSYonghong Song 
43dc1dbf6eSYonghong Song void BPFSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {
44dc1dbf6eSYonghong Song   if (CPU == "probe")
45dc1dbf6eSYonghong Song     CPU = sys::detail::getHostCPUNameForBPF();
46dc1dbf6eSYonghong Song   if (CPU == "generic" || CPU == "v1")
47dc1dbf6eSYonghong Song     return;
48dc1dbf6eSYonghong Song   if (CPU == "v2") {
49dc1dbf6eSYonghong Song     HasJmpExt = true;
50dc1dbf6eSYonghong Song     return;
51dc1dbf6eSYonghong Song   }
52dc1dbf6eSYonghong Song }
53dc1dbf6eSYonghong Song 
54a73f1fdbSDaniel Sanders BPFSubtarget::BPFSubtarget(const Triple &TT, const std::string &CPU,
55e4c8c807SAlexei Starovoitov                            const std::string &FS, const TargetMachine &TM)
56dc1dbf6eSYonghong Song     : BPFGenSubtargetInfo(TT, CPU, FS), InstrInfo(),
57dc1dbf6eSYonghong Song       FrameLowering(initializeSubtargetDependencies(CPU, FS)),
5850f17235SDaniel Sanders       TLInfo(TM, *this) {}
59