30#define DEBUG_TYPE "mccodeemitter"
42 :
MRI(mri), IsLittleEndian(IsLittleEndian), Ctx(ctx) {}
43 BPFMCCodeEmitter(
const BPFMCCodeEmitter &) =
delete;
44 void operator=(
const BPFMCCodeEmitter &) =
delete;
45 ~BPFMCCodeEmitter()
override =
default;
85unsigned BPFMCCodeEmitter::getMachineOpValue(
const MCInst &
MI,
94 if (
MI.getOpcode() != BPF::LD_imm64 && High32Bits != 0 &&
95 High33Bits != 0x1FFFFFFFFULL) {
96 Ctx.reportWarning(
MI.getLoc(),
97 "immediate out of range, shall fit in 32 bits");
99 return static_cast<unsigned>(
Imm);
108 if (
MI.getOpcode() == BPF::JAL)
111 else if (
MI.getOpcode() == BPF::LD_imm64)
113 else if (
MI.getOpcode() == BPF::JMPL)
124 return (Val & 0x0F) << 4 | (Val & 0xF0) >> 4;
127void BPFMCCodeEmitter::encodeInstruction(
const MCInst &
MI,
131 unsigned Opcode =
MI.getOpcode();
136 if (Opcode == BPF::LD_imm64 || Opcode == BPF::LD_pseudo) {
171 int MemOpStartIndex = 1, Opcode =
MI.getOpcode();
172 if (Opcode == BPF::CMPXCHGW32 || Opcode == BPF::CMPXCHGD)
176 const MCOperand Op1 =
MI.getOperand(MemOpStartIndex);
177 assert(Op1.
isReg() &&
"First operand is not register.");
178 Encoding =
MRI.getEncodingValue(Op1.
getReg());
180 MCOperand Op2 =
MI.getOperand(MemOpStartIndex + 1);
181 assert(Op2.
isImm() &&
"Second operand is not immediate.");
182 Encoding |= Op2.
getImm() & 0xffff;
186#include "BPFGenMCCodeEmitter.inc"
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static uint8_t SwapBits(uint8_t Val)
static void addFixup(SmallVectorImpl< MCFixup > &Fixups, uint32_t Offset, const MCExpr *Value, uint16_t Kind, bool PCRel=false)
This file defines the SmallVector class.
This class represents an Operation in the Expression.
MCCodeEmitter - Generic instruction encoding interface.
virtual void encodeInstruction(const MCInst &Inst, SmallVectorImpl< char > &CB, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const =0
Encode the given Inst to bytes and append to CB.
MCCodeEmitter & operator=(const MCCodeEmitter &)=delete
Context object for machine code objects.
const MCRegisterInfo * getRegisterInfo() const
Base class for the full range of assembler expressions which are needed for parsing.
@ SymbolRef
References to labels and assigned expressions.
static MCFixup create(uint32_t Offset, const MCExpr *Value, MCFixupKind Kind, bool PCRel=false)
Consider bit fields if we need more flags.
Instances of this class represent a single low-level machine instruction.
Interface to description of machine instruction set.
Instances of this class represent operands of the MCInst class.
MCRegister getReg() const
Returns the register number.
const MCExpr * getExpr() const
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
Generic base class for all target subtargets.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
LLVM Value Representation.
A raw_ostream that writes to an SmallVector or SmallString.
This is an optimization pass for GlobalISel generic memory operations.
@ FK_Data_4
A four-byte fixup.
@ FK_SecRel_8
A eight-byte section relative fixup.
@ FK_Data_2
A two-byte fixup.
MCCodeEmitter * createBPFbeMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
MCCodeEmitter * createBPFMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)
Adapter to write values to a stream in a particular byte order.