//===-- BPFSubtarget.cpp - BPF Subtarget Information ----------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements the BPF specific subclass of TargetSubtargetInfo. // //===----------------------------------------------------------------------===// #include "BPFSubtarget.h" #include "BPF.h" #include "BPFTargetMachine.h" #include "GISel/BPFCallLowering.h" #include "GISel/BPFLegalizerInfo.h" #include "GISel/BPFRegisterBankInfo.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/TargetParser/Host.h" using namespace llvm; #define DEBUG_TYPE "bpf-subtarget" #define GET_SUBTARGETINFO_TARGET_DESC #define GET_SUBTARGETINFO_CTOR #include "BPFGenSubtargetInfo.inc" static cl::opt Disable_ldsx("disable-ldsx", cl::Hidden, cl::init(false), cl::desc("Disable ldsx insns")); static cl::opt Disable_movsx("disable-movsx", cl::Hidden, cl::init(false), cl::desc("Disable movsx insns")); static cl::opt Disable_bswap("disable-bswap", cl::Hidden, cl::init(false), cl::desc("Disable bswap insns")); static cl::opt Disable_sdiv_smod("disable-sdiv-smod", cl::Hidden, cl::init(false), cl::desc("Disable sdiv/smod insns")); static cl::opt Disable_gotol("disable-gotol", cl::Hidden, cl::init(false), cl::desc("Disable gotol insn")); static cl::opt Disable_StoreImm("disable-storeimm", cl::Hidden, cl::init(false), cl::desc("Disable BPF_ST (immediate store) insn")); void BPFSubtarget::anchor() {} BPFSubtarget &BPFSubtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) { initializeEnvironment(); initSubtargetFeatures(CPU, FS); ParseSubtargetFeatures(CPU, /*TuneCPU*/ CPU, FS); return *this; } void BPFSubtarget::initializeEnvironment() { HasJmpExt = false; HasJmp32 = false; HasAlu32 = false; UseDwarfRIS = false; HasLdsx = false; HasMovsx = false; HasBswap = false; HasSdivSmod = false; HasGotol = false; HasStoreImm = false; } void BPFSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) { if (CPU == "probe") CPU = sys::detail::getHostCPUNameForBPF(); if (CPU == "generic" || CPU == "v1") return; if (CPU == "v2") { HasJmpExt = true; return; } if (CPU == "v3") { HasJmpExt = true; HasJmp32 = true; HasAlu32 = true; return; } if (CPU == "v4") { HasJmpExt = true; HasJmp32 = true; HasAlu32 = true; HasLdsx = !Disable_ldsx; HasMovsx = !Disable_movsx; HasBswap = !Disable_bswap; HasSdivSmod = !Disable_sdiv_smod; HasGotol = !Disable_gotol; HasStoreImm = !Disable_StoreImm; return; } } BPFSubtarget::BPFSubtarget(const Triple &TT, const std::string &CPU, const std::string &FS, const TargetMachine &TM) : BPFGenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS), FrameLowering(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM, *this) { IsLittleEndian = TT.isLittleEndian(); CallLoweringInfo.reset(new BPFCallLowering(*getTargetLowering())); Legalizer.reset(new BPFLegalizerInfo(*this)); auto *RBI = new BPFRegisterBankInfo(*getRegisterInfo()); RegBankInfo.reset(RBI); InstSelector.reset(createBPFInstructionSelector( *static_cast(&TM), *this, *RBI)); } const CallLowering *BPFSubtarget::getCallLowering() const { return CallLoweringInfo.get(); } InstructionSelector *BPFSubtarget::getInstructionSelector() const { return InstSelector.get(); } const LegalizerInfo *BPFSubtarget::getLegalizerInfo() const { return Legalizer.get(); } const RegisterBankInfo *BPFSubtarget::getRegBankInfo() const { return RegBankInfo.get(); }