46 return Reg == AArch64SysReg::TPIDR_EL1 ||
Reg == AArch64SysReg::TPIDR_EL2 ||
47 Reg == AArch64SysReg::TPIDR_EL3;
51 return Inst.
getOpcode() == AArch64::MRS &&
56 return Inst.
getOpcode() == AArch64::MSR &&
68MCRegister AArch64MCLFIRewriter::mayModifyReserved(
const MCInst &Inst)
const {
92 emitInst(Inst, Out, STI);
101 emitInst(Branch, Out, STI);
114 emitInst(Inst, Out, STI);
121void AArch64MCLFIRewriter::rewriteIndirectBranch(
const MCInst &Inst,
125 "expected register operand");
139void AArch64MCLFIRewriter::rewriteReturn(
const MCInst &Inst,
MCStreamer &Out,
142 "expected register operand");
145 rewriteIndirectBranch(Inst, Out, STI);
147 emitInst(Inst, Out, STI);
154void AArch64MCLFIRewriter::rewriteLRModification(
const MCInst &Inst,
157 emitInst(Inst, Out, STI);
158 emitAddMask(AArch64::LR, AArch64::LR, Out, STI);
174 Load.setOpcode(AArch64::LDURXi);
178 emitInst(Load, Out, STI);
181 emitBranch(AArch64::BLR, AArch64::LR, Out, STI);
190void AArch64MCLFIRewriter::rewriteTPRead(
const MCInst &Inst,
MCStreamer &Out,
195 Load.setOpcode(AArch64::LDRXui);
199 emitInst(Load, Out, STI);
205void AArch64MCLFIRewriter::rewriteTPWrite(
const MCInst &Inst,
MCStreamer &Out,
210 Store.setOpcode(AArch64::STRXui);
214 emitInst(Store, Out, STI);
219void AArch64MCLFIRewriter::doRewriteInst(
const MCInst &Inst,
MCStreamer &Out,
222 if (MCRegister
Reg = mayModifyReserved(Inst)) {
223 error(Inst, Twine(
"illegal modification of reserved LFI register ") +
230 return rewriteSyscall(Inst, Out, STI);
233 return rewriteTPRead(Inst, Out, STI);
236 return rewriteTPWrite(Inst, Out, STI);
239 error(Inst,
"illegal access to privileged thread pointer register");
246 return rewriteReturn(Inst, Out, STI);
249 return rewriteIndirectBranch(Inst, Out, STI);
254 return rewriteLRModification(Inst, Out, STI);
256 emitInst(Inst, Out, STI);
267 doRewriteInst(Inst, Out, STI);
static constexpr unsigned LFITPOffset
static constexpr MCRegister LFIScratchReg
static bool isPrivilegedTPAccess(const MCInst &Inst)
static constexpr MCRegister LFICtxReg
static bool isPrivilegedTP(int64_t Reg)
static bool isTPRead(const MCInst &Inst)
static bool isSyscall(const MCInst &Inst)
static constexpr MCRegister LFIAddrReg
static constexpr MCRegister LFIBaseReg
static constexpr int LFISyscallOffset
static bool isTPWrite(const MCInst &Inst)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
bool rewriteInst(const MCInst &Inst, MCStreamer &Out, const MCSubtargetInfo &STI) override
Instances of this class represent a single low-level machine instruction.
unsigned getNumOperands() const
unsigned getOpcode() const
void addOperand(const MCOperand Op)
void setOpcode(unsigned Op)
const MCOperand & getOperand(unsigned i) const
LLVM_ABI bool mayModifyRegister(const MCInst &Inst, MCRegister Reg) const
std::unique_ptr< MCRegisterInfo > RegInfo
LLVM_ABI bool explicitlyModifiesRegister(const MCInst &Inst, MCRegister Reg) const
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
MCRegister getReg() const
Returns the register number.
Wrapper class representing physical registers. Should be passed by value.
Streaming machine code generation interface.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
Generic base class for all target subtargets.
Target - Wrapper for Target specific information.
static unsigned getArithExtendImm(AArch64_AM::ShiftExtendType ET, unsigned Imm)
getArithExtendImm - Encode the extend type and shift amount for an arithmetic instruction: imm: 3-bit...
This is an optimization pass for GlobalISel generic memory operations.
static MCRegister getWRegFromXReg(MCRegister Reg)