Path: blob/main/contrib/llvm-project/llvm/lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp
35294 views
//===-- BPFMCTargetDesc.cpp - BPF Target Descriptions ---------------------===//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 provides BPF specific target descriptions.9//10//===----------------------------------------------------------------------===//1112#include "MCTargetDesc/BPFMCTargetDesc.h"13#include "MCTargetDesc/BPFInstPrinter.h"14#include "MCTargetDesc/BPFMCAsmInfo.h"15#include "TargetInfo/BPFTargetInfo.h"16#include "llvm/MC/MCInstrAnalysis.h"17#include "llvm/MC/MCInstrInfo.h"18#include "llvm/MC/MCRegisterInfo.h"19#include "llvm/MC/MCSubtargetInfo.h"20#include "llvm/MC/TargetRegistry.h"21#include "llvm/TargetParser/Host.h"2223#define GET_INSTRINFO_MC_DESC24#define ENABLE_INSTR_PREDICATE_VERIFIER25#include "BPFGenInstrInfo.inc"2627#define GET_SUBTARGETINFO_MC_DESC28#include "BPFGenSubtargetInfo.inc"2930#define GET_REGINFO_MC_DESC31#include "BPFGenRegisterInfo.inc"3233using namespace llvm;3435static MCInstrInfo *createBPFMCInstrInfo() {36MCInstrInfo *X = new MCInstrInfo();37InitBPFMCInstrInfo(X);38return X;39}4041static MCRegisterInfo *createBPFMCRegisterInfo(const Triple &TT) {42MCRegisterInfo *X = new MCRegisterInfo();43InitBPFMCRegisterInfo(X, BPF::R11 /* RAReg doesn't exist */);44return X;45}4647static MCSubtargetInfo *createBPFMCSubtargetInfo(const Triple &TT,48StringRef CPU, StringRef FS) {49return createBPFMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);50}5152static MCStreamer *53createBPFMCStreamer(const Triple &T, MCContext &Ctx,54std::unique_ptr<MCAsmBackend> &&MAB,55std::unique_ptr<MCObjectWriter> &&OW,56std::unique_ptr<MCCodeEmitter> &&Emitter) {57return createELFStreamer(Ctx, std::move(MAB), std::move(OW),58std::move(Emitter));59}6061static MCInstPrinter *createBPFMCInstPrinter(const Triple &T,62unsigned SyntaxVariant,63const MCAsmInfo &MAI,64const MCInstrInfo &MII,65const MCRegisterInfo &MRI) {66if (SyntaxVariant == 0)67return new BPFInstPrinter(MAI, MII, MRI);68return nullptr;69}7071namespace {7273class BPFMCInstrAnalysis : public MCInstrAnalysis {74public:75explicit BPFMCInstrAnalysis(const MCInstrInfo *Info)76: MCInstrAnalysis(Info) {}7778bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size,79uint64_t &Target) const override {80// The target is the 3rd operand of cond inst and the 1st of uncond inst.81int32_t Imm;82if (isConditionalBranch(Inst)) {83if (Inst.getOpcode() == BPF::JCOND)84Imm = (short)Inst.getOperand(0).getImm();85else86Imm = (short)Inst.getOperand(2).getImm();87} else if (isUnconditionalBranch(Inst)) {88if (Inst.getOpcode() == BPF::JMP)89Imm = (short)Inst.getOperand(0).getImm();90else91Imm = (int)Inst.getOperand(0).getImm();92} else93return false;9495Target = Addr + Size + Imm * Size;96return true;97}98};99100} // end anonymous namespace101102static MCInstrAnalysis *createBPFInstrAnalysis(const MCInstrInfo *Info) {103return new BPFMCInstrAnalysis(Info);104}105106extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeBPFTargetMC() {107for (Target *T :108{&getTheBPFleTarget(), &getTheBPFbeTarget(), &getTheBPFTarget()}) {109// Register the MC asm info.110RegisterMCAsmInfo<BPFMCAsmInfo> X(*T);111112// Register the MC instruction info.113TargetRegistry::RegisterMCInstrInfo(*T, createBPFMCInstrInfo);114115// Register the MC register info.116TargetRegistry::RegisterMCRegInfo(*T, createBPFMCRegisterInfo);117118// Register the MC subtarget info.119TargetRegistry::RegisterMCSubtargetInfo(*T,120createBPFMCSubtargetInfo);121122// Register the object streamer123TargetRegistry::RegisterELFStreamer(*T, createBPFMCStreamer);124125// Register the MCInstPrinter.126TargetRegistry::RegisterMCInstPrinter(*T, createBPFMCInstPrinter);127128// Register the MC instruction analyzer.129TargetRegistry::RegisterMCInstrAnalysis(*T, createBPFInstrAnalysis);130}131132// Register the MC code emitter133TargetRegistry::RegisterMCCodeEmitter(getTheBPFleTarget(),134createBPFMCCodeEmitter);135TargetRegistry::RegisterMCCodeEmitter(getTheBPFbeTarget(),136createBPFbeMCCodeEmitter);137138// Register the ASM Backend139TargetRegistry::RegisterMCAsmBackend(getTheBPFleTarget(),140createBPFAsmBackend);141TargetRegistry::RegisterMCAsmBackend(getTheBPFbeTarget(),142createBPFbeAsmBackend);143144if (sys::IsLittleEndianHost) {145TargetRegistry::RegisterMCCodeEmitter(getTheBPFTarget(),146createBPFMCCodeEmitter);147TargetRegistry::RegisterMCAsmBackend(getTheBPFTarget(),148createBPFAsmBackend);149} else {150TargetRegistry::RegisterMCCodeEmitter(getTheBPFTarget(),151createBPFbeMCCodeEmitter);152TargetRegistry::RegisterMCAsmBackend(getTheBPFTarget(),153createBPFbeAsmBackend);154}155156}157158159