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);
104void AArch64MCLFIRewriter::emitPendingTLSDescCall(
MCStreamer &Out,
106 if (!PendingTLSDescCall)
111 PendingTLSDescCall =
nullptr;
112 emitInst(Marker, Out, STI);
125 emitInst(Inst, Out, STI);
132void AArch64MCLFIRewriter::rewriteIndirectBranch(
const MCInst &Inst,
136 "expected register operand");
142 emitPendingTLSDescCall(Out, STI);
153void AArch64MCLFIRewriter::rewriteReturn(
const MCInst &Inst,
MCStreamer &Out,
156 "expected register operand");
159 rewriteIndirectBranch(Inst, Out, STI);
161 emitInst(Inst, Out, STI);
168void AArch64MCLFIRewriter::rewriteLRModification(
const MCInst &Inst,
171 emitInst(Inst, Out, STI);
172 emitAddMask(AArch64::LR, AArch64::LR, Out, STI);
188 Load.setOpcode(AArch64::LDURXi);
192 emitInst(Load, Out, STI);
195 emitBranch(AArch64::BLR, AArch64::LR, Out, STI);
204void AArch64MCLFIRewriter::rewriteTPRead(
const MCInst &Inst,
MCStreamer &Out,
209 Load.setOpcode(AArch64::LDRXui);
213 emitInst(Load, Out, STI);
219void AArch64MCLFIRewriter::rewriteTPWrite(
const MCInst &Inst,
MCStreamer &Out,
224 Store.setOpcode(AArch64::STRXui);
228 emitInst(Store, Out, STI);
233void AArch64MCLFIRewriter::doRewriteInst(
const MCInst &Inst,
MCStreamer &Out,
235 if (Inst.
getOpcode() == AArch64::TLSDESCCALL) {
241 if (MCRegister
Reg = mayModifyReserved(Inst)) {
242 error(Inst, Twine(
"illegal modification of reserved LFI register ") +
249 return rewriteSyscall(Inst, Out, STI);
252 return rewriteTPRead(Inst, Out, STI);
255 return rewriteTPWrite(Inst, Out, STI);
258 error(Inst,
"illegal access to privileged thread pointer register");
265 return rewriteReturn(Inst, Out, STI);
268 return rewriteIndirectBranch(Inst, Out, STI);
273 return rewriteLRModification(Inst, Out, STI);
275 emitInst(Inst, Out, STI);
286 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 createExpr(const MCExpr *Val)
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
MCRegister getReg() const
Returns the register number.
const MCExpr * getExpr() const
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)