1e4c8c807SAlexei Starovoitov //===-- BPFSubtarget.cpp - BPF Subtarget Information ----------------------===//
2e4c8c807SAlexei Starovoitov //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e4c8c807SAlexei Starovoitov //
7e4c8c807SAlexei Starovoitov //===----------------------------------------------------------------------===//
8e4c8c807SAlexei Starovoitov //
9e4c8c807SAlexei Starovoitov // This file implements the BPF specific subclass of TargetSubtargetInfo.
10e4c8c807SAlexei Starovoitov //
11e4c8c807SAlexei Starovoitov //===----------------------------------------------------------------------===//
12e4c8c807SAlexei Starovoitov
13e4c8c807SAlexei Starovoitov #include "BPFSubtarget.h"
14e4c8c807SAlexei Starovoitov #include "BPF.h"
1589b57061SReid Kleckner #include "llvm/MC/TargetRegistry.h"
16dc1dbf6eSYonghong Song #include "llvm/Support/Host.h"
17e4c8c807SAlexei Starovoitov
18e4c8c807SAlexei Starovoitov using namespace llvm;
19e4c8c807SAlexei Starovoitov
20e4c8c807SAlexei Starovoitov #define DEBUG_TYPE "bpf-subtarget"
21e4c8c807SAlexei Starovoitov
22e4c8c807SAlexei Starovoitov #define GET_SUBTARGETINFO_TARGET_DESC
23e4c8c807SAlexei Starovoitov #define GET_SUBTARGETINFO_CTOR
24e4c8c807SAlexei Starovoitov #include "BPFGenSubtargetInfo.inc"
25e4c8c807SAlexei Starovoitov
anchor()26e4c8c807SAlexei Starovoitov void BPFSubtarget::anchor() {}
27e4c8c807SAlexei Starovoitov
initializeSubtargetDependencies(StringRef CPU,StringRef FS)28dc1dbf6eSYonghong Song BPFSubtarget &BPFSubtarget::initializeSubtargetDependencies(StringRef CPU,
29dc1dbf6eSYonghong Song StringRef FS) {
30dc1dbf6eSYonghong Song initializeEnvironment();
31dc1dbf6eSYonghong Song initSubtargetFeatures(CPU, FS);
32c7a0b268SCraig Topper ParseSubtargetFeatures(CPU, /*TuneCPU*/ CPU, FS);
33dc1dbf6eSYonghong Song return *this;
34dc1dbf6eSYonghong Song }
35dc1dbf6eSYonghong Song
initializeEnvironment()36dc1dbf6eSYonghong Song void BPFSubtarget::initializeEnvironment() {
37dc1dbf6eSYonghong Song HasJmpExt = false;
3866b18e57SJiong Wang HasJmp32 = false;
3942389377SYonghong Song HasAlu32 = false;
4003e1c8b8SYonghong Song UseDwarfRIS = false;
41dc1dbf6eSYonghong Song }
42dc1dbf6eSYonghong Song
initSubtargetFeatures(StringRef CPU,StringRef FS)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 }
5266b18e57SJiong Wang if (CPU == "v3") {
5366b18e57SJiong Wang HasJmpExt = true;
5466b18e57SJiong Wang HasJmp32 = true;
556b8baf30SYonghong Song HasAlu32 = true;
5666b18e57SJiong Wang return;
5766b18e57SJiong Wang }
58dc1dbf6eSYonghong Song }
59dc1dbf6eSYonghong Song
BPFSubtarget(const Triple & TT,const std::string & CPU,const std::string & FS,const TargetMachine & TM)60a73f1fdbSDaniel Sanders BPFSubtarget::BPFSubtarget(const Triple &TT, const std::string &CPU,
61e4c8c807SAlexei Starovoitov const std::string &FS, const TargetMachine &TM)
62*f3a344d2SKazu Hirata : BPFGenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS),
63dc1dbf6eSYonghong Song FrameLowering(initializeSubtargetDependencies(CPU, FS)),
6450f17235SDaniel Sanders TLInfo(TM, *this) {}
65