brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.4 KiB · 726f8f4 Raw
139 lines · cpp
1//===-- BPFSubtarget.cpp - BPF Subtarget Information ----------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the BPF specific subclass of TargetSubtargetInfo.10//11//===----------------------------------------------------------------------===//12 13#include "BPFSubtarget.h"14#include "BPF.h"15#include "BPFTargetMachine.h"16#include "GISel/BPFCallLowering.h"17#include "GISel/BPFLegalizerInfo.h"18#include "GISel/BPFRegisterBankInfo.h"19#include "llvm/MC/TargetRegistry.h"20#include "llvm/TargetParser/Host.h"21 22using namespace llvm;23 24#define DEBUG_TYPE "bpf-subtarget"25 26#define GET_SUBTARGETINFO_TARGET_DESC27#define GET_SUBTARGETINFO_CTOR28#include "BPFGenSubtargetInfo.inc"29 30static cl::opt<bool> Disable_ldsx("disable-ldsx", cl::Hidden, cl::init(false),31  cl::desc("Disable ldsx insns"));32static cl::opt<bool> Disable_movsx("disable-movsx", cl::Hidden, cl::init(false),33  cl::desc("Disable movsx insns"));34static cl::opt<bool> Disable_bswap("disable-bswap", cl::Hidden, cl::init(false),35  cl::desc("Disable bswap insns"));36static cl::opt<bool> Disable_sdiv_smod("disable-sdiv-smod", cl::Hidden,37  cl::init(false), cl::desc("Disable sdiv/smod insns"));38static cl::opt<bool> Disable_gotol("disable-gotol", cl::Hidden, cl::init(false),39  cl::desc("Disable gotol insn"));40static cl::opt<bool>41    Disable_StoreImm("disable-storeimm", cl::Hidden, cl::init(false),42                     cl::desc("Disable BPF_ST (immediate store) insn"));43static cl::opt<bool> Disable_load_acq_store_rel(44    "disable-load-acq-store-rel", cl::Hidden, cl::init(false),45    cl::desc("Disable load-acquire and store-release insns"));46static cl::opt<bool> Disable_gotox("disable-gotox", cl::Hidden, cl::init(false),47                                   cl::desc("Disable gotox insn"));48 49void BPFSubtarget::anchor() {}50 51BPFSubtarget &BPFSubtarget::initializeSubtargetDependencies(StringRef CPU,52                                                            StringRef FS) {53  initializeEnvironment();54  initSubtargetFeatures(CPU, FS);55  ParseSubtargetFeatures(CPU, /*TuneCPU*/ CPU, FS);56  return *this;57}58 59void BPFSubtarget::initializeEnvironment() {60  HasJmpExt = false;61  HasJmp32 = false;62  HasAlu32 = false;63  UseDwarfRIS = false;64  HasLdsx = false;65  HasMovsx = false;66  HasBswap = false;67  HasSdivSmod = false;68  HasGotol = false;69  HasStoreImm = false;70  HasLoadAcqStoreRel = false;71  HasGotox = false;72  AllowsMisalignedMemAccess = false;73}74 75void BPFSubtarget::initSubtargetFeatures(StringRef CPU, StringRef FS) {76  if (CPU.empty())77    CPU = "v3";78  if (CPU == "probe")79    CPU = sys::detail::getHostCPUNameForBPF();80  if (CPU == "generic" || CPU == "v1")81    return;82  if (CPU == "v2") {83    HasJmpExt = true;84    return;85  }86  if (CPU == "v3") {87    HasJmpExt = true;88    HasJmp32 = true;89    HasAlu32 = true;90    return;91  }92  if (CPU == "v4") {93    HasJmpExt = true;94    HasJmp32 = true;95    HasAlu32 = true;96    HasLdsx = !Disable_ldsx;97    HasMovsx = !Disable_movsx;98    HasBswap = !Disable_bswap;99    HasSdivSmod = !Disable_sdiv_smod;100    HasGotol = !Disable_gotol;101    HasStoreImm = !Disable_StoreImm;102    HasLoadAcqStoreRel = !Disable_load_acq_store_rel;103    HasGotox = !Disable_gotox;104    return;105  }106}107 108BPFSubtarget::BPFSubtarget(const Triple &TT, const std::string &CPU,109                           const std::string &FS, const TargetMachine &TM)110    : BPFGenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS),111      InstrInfo(initializeSubtargetDependencies(CPU, FS)), FrameLowering(*this),112      TLInfo(TM, *this) {113  IsLittleEndian = TT.isLittleEndian();114 115  CallLoweringInfo.reset(new BPFCallLowering(*getTargetLowering()));116  Legalizer.reset(new BPFLegalizerInfo(*this));117  auto *RBI = new BPFRegisterBankInfo(*getRegisterInfo());118  RegBankInfo.reset(RBI);119 120  InstSelector.reset(createBPFInstructionSelector(121      *static_cast<const BPFTargetMachine *>(&TM), *this, *RBI));122}123 124const CallLowering *BPFSubtarget::getCallLowering() const {125  return CallLoweringInfo.get();126}127 128InstructionSelector *BPFSubtarget::getInstructionSelector() const {129  return InstSelector.get();130}131 132const LegalizerInfo *BPFSubtarget::getLegalizerInfo() const {133  return Legalizer.get();134}135 136const RegisterBankInfo *BPFSubtarget::getRegBankInfo() const {137  return RegBankInfo.get();138}139