Path: blob/main/contrib/llvm-project/llvm/lib/Target/BPF/BPFSubtarget.cpp
35294 views
//===-- BPFSubtarget.cpp - BPF Subtarget Information ----------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements the BPF specific subclass of TargetSubtargetInfo.9//10//===----------------------------------------------------------------------===//1112#include "BPFSubtarget.h"13#include "BPF.h"14#include "BPFTargetMachine.h"15#include "GISel/BPFCallLowering.h"16#include "GISel/BPFLegalizerInfo.h"17#include "GISel/BPFRegisterBankInfo.h"18#include "llvm/MC/TargetRegistry.h"19#include "llvm/TargetParser/Host.h"2021using namespace llvm;2223#define DEBUG_TYPE "bpf-subtarget"2425#define GET_SUBTARGETINFO_TARGET_DESC26#define GET_SUBTARGETINFO_CTOR27#include "BPFGenSubtargetInfo.inc"2829static cl::opt<bool> Disable_ldsx("disable-ldsx", cl::Hidden, cl::init(false),30cl::desc("Disable ldsx insns"));31static cl::opt<bool> Disable_movsx("disable-movsx", cl::Hidden, cl::init(false),32cl::desc("Disable movsx insns"));33static cl::opt<bool> Disable_bswap("disable-bswap", cl::Hidden, cl::init(false),34cl::desc("Disable bswap insns"));35static cl::opt<bool> Disable_sdiv_smod("disable-sdiv-smod", cl::Hidden,36cl::init(false), cl::desc("Disable sdiv/smod insns"));37static cl::opt<bool> Disable_gotol("disable-gotol", cl::Hidden, cl::init(false),38cl::desc("Disable gotol insn"));39static cl::opt<bool>40Disable_StoreImm("disable-storeimm", cl::Hidden, cl::init(false),41cl::desc("Disable BPF_ST (immediate store) insn"));4243void BPFSubtarget::anchor() {}4445BPFSubtarget &BPFSubtarget::initializeSubtargetDependencies(StringRef CPU,46StringRef FS) {47initializeEnvironment();48initSubtargetFeatures(CPU, FS);49ParseSubtargetFeatures(CPU, /*TuneCPU*/ CPU, FS);50return *this;51}5253void BPFSubtarget::initializeEnvironment() {54HasJmpExt = false;55HasJmp32 = false;56HasAlu32 = false;57UseDwarfRIS = false;58HasLdsx = false;59HasMovsx = false;60HasBswap = false;61HasSdivSmod = false;62HasGotol = false;63HasStoreImm = false;64}6566void BPFSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {67if (CPU == "probe")68CPU = sys::detail::getHostCPUNameForBPF();69if (CPU == "generic" || CPU == "v1")70return;71if (CPU == "v2") {72HasJmpExt = true;73return;74}75if (CPU == "v3") {76HasJmpExt = true;77HasJmp32 = true;78HasAlu32 = true;79return;80}81if (CPU == "v4") {82HasJmpExt = true;83HasJmp32 = true;84HasAlu32 = true;85HasLdsx = !Disable_ldsx;86HasMovsx = !Disable_movsx;87HasBswap = !Disable_bswap;88HasSdivSmod = !Disable_sdiv_smod;89HasGotol = !Disable_gotol;90HasStoreImm = !Disable_StoreImm;91return;92}93}9495BPFSubtarget::BPFSubtarget(const Triple &TT, const std::string &CPU,96const std::string &FS, const TargetMachine &TM)97: BPFGenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS),98FrameLowering(initializeSubtargetDependencies(CPU, FS)),99TLInfo(TM, *this) {100IsLittleEndian = TT.isLittleEndian();101102CallLoweringInfo.reset(new BPFCallLowering(*getTargetLowering()));103Legalizer.reset(new BPFLegalizerInfo(*this));104auto *RBI = new BPFRegisterBankInfo(*getRegisterInfo());105RegBankInfo.reset(RBI);106107InstSelector.reset(createBPFInstructionSelector(108*static_cast<const BPFTargetMachine *>(&TM), *this, *RBI));109}110111const CallLowering *BPFSubtarget::getCallLowering() const {112return CallLoweringInfo.get();113}114115InstructionSelector *BPFSubtarget::getInstructionSelector() const {116return InstSelector.get();117}118119const LegalizerInfo *BPFSubtarget::getLegalizerInfo() const {120return Legalizer.get();121}122123const RegisterBankInfo *BPFSubtarget::getRegBankInfo() const {124return RegBankInfo.get();125}126127128