33#define DEBUG_TYPE "loongarch-asm-printer"
38 "Annotate table jump instruction to correlate it with the jump table."),
43#include "LoongArchGenMCPseudoLowering.inc"
51 LoongArch_MC::verifyInstructionPredicates(
60 switch (
MI->getOpcode()) {
61 case TargetOpcode::STATEPOINT:
64 case TargetOpcode::PATCHABLE_FUNCTION_ENTER:
67 case TargetOpcode::PATCHABLE_FUNCTION_EXIT:
70 case TargetOpcode::PATCHABLE_TAIL_CALL:
81 const char *ExtraCode,
88 if (ExtraCode && ExtraCode[0]) {
89 if (ExtraCode[1] != 0)
92 switch (ExtraCode[0]) {
107 unsigned RegID = MO.
getReg().
id(), FirstReg;
108 if (RegID >= LoongArch::XR0 && RegID <= LoongArch::XR31)
109 FirstReg = LoongArch::XR0;
110 else if (RegID >= LoongArch::VR0 && RegID <= LoongArch::VR31)
111 FirstReg = LoongArch::VR0;
112 else if (RegID >= LoongArch::F0_64 && RegID <= LoongArch::F31_64)
113 FirstReg = LoongArch::F0_64;
114 else if (RegID >= LoongArch::F0 && RegID <= LoongArch::F31)
115 FirstReg = LoongArch::F0;
121 (ExtraCode[0] ==
'u' ? LoongArch::XR0 : LoongArch::VR0));
147 const char *ExtraCode,
166 if (OffsetMO.
isReg())
168 else if (OffsetMO.
isImm())
169 OS <<
", " << OffsetMO.
getImm();
183 assert(PatchBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
189 switch (CallTarget.
getType()) {
204 .addReg(LoongArch::R1)
215 MCSymbol *MILabel = Ctx.createTempSymbol();
217 SM.recordStatepoint(*MILabel,
MI);
223 if (
F.hasFnAttribute(
"patchable-function-entry")) {
224 unsigned Num =
F.getFnAttributeAsParsedInteger(
"patchable-function-entry");
252 const int8_t NoopsInSledCount = 11;
271 assert(
TM.getTargetTriple().isOSBinFormatELF());
275 auto JTI =
MF->getJumpTableInfo();
277 if (!JTI || 0 == EntrySize)
281 const auto &JT = JTI->getJumpTables();
289 for (
unsigned Idx = 0; Idx < EntrySize; ++Idx) {
290 int JTIIdx = LAFI->getJumpInfoJTIIndex(Idx);
291 if (JT[JTIIdx].MBBs.empty())
305 unsigned Size)
const {
310 getTargetStreamer().emitDTPRel32Value(Expr->getSubExpr());
313 getTargetStreamer().emitDTPRel64Value(Expr->getSubExpr());
334 "LoongArch Assembly Printer",
false,
false)
338LLVMInitializeLoongArchAsmPrinter() {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static MCDisassembler::DecodeStatus addOperand(MCInst &Inst, const MCOperand &Opnd)
#define LLVM_EXTERNAL_VISIBILITY
cl::opt< bool > LArchAnnotateTableJump("loongarch-annotate-tablejump", cl::Hidden, cl::desc("Annotate table jump instruction to correlate it with the jump table."), cl::init(false))
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
void emitNops(unsigned N)
Emit N NOP instructions.
virtual void emitDebugValue(const MCExpr *Value, unsigned Size) const
Emit the directive and value for debug thread local expression.
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
TargetMachine & TM
Target machine description.
void emitXRayTable()
Emit a table with all XRay instrumentation points.
virtual void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &OS)
Print the MachineOperand as a symbol.
MachineFunction * MF
The current machine function.
virtual void emitJumpTableInfo()
Print assembly representations of the jump tables used by the current function to the current output ...
MCSymbol * GetJTISymbol(unsigned JTID, bool isLinkerPrivate=false) const
Return the symbol for the specified jump table entry.
void recordSled(MCSymbol *Sled, const MachineInstr &MI, SledKind Kind, uint8_t Version=0)
MachineModuleInfo * MMI
This is a pointer to the current MachineModuleInfo.
MCContext & OutContext
This is the context for the output file that we are streaming.
bool runOnMachineFunction(MachineFunction &MF) override
Emit the specified function out to the OutStreamer.
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
const MCAsmInfo & MAI
Target Asm Printer information.
const DataLayout & getDataLayout() const
Return information about data layout.
const MCSubtargetInfo & getSubtargetInfo() const
Return information about subtarget.
virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &OS)
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant.
LLVM_ABI unsigned getPointerSize(unsigned AS=0) const
The pointer representation size in bytes, rounded up to a whole number of bytes.
void emitSled(const MachineInstr &MI, SledKind Kind)
void LowerPATCHABLE_FUNCTION_EXIT(const MachineInstr &MI)
bool runOnMachineFunction(MachineFunction &MF) override
Emit the specified function out to the OutStreamer.
void emitDebugValue(const MCExpr *Value, unsigned Size) const override
Emit the directive and value for debug thread local expression.
void LowerSTATEPOINT(const MachineInstr &MI)
void LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI)
void emitInstruction(const MachineInstr *MI) override
Targets should implement this to emit instructions.
bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &OS) override
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant as...
bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const
bool lowerPseudoInstExpansion(const MachineInstr *MI, MCInst &Inst)
void emitJumpTableInfo() override
Print assembly representations of the jump tables used by the current function to the current output ...
bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, const char *ExtraCode, raw_ostream &OS) override
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant.
void LowerPATCHABLE_TAIL_CALL(const MachineInstr &MI)
static const char * getRegisterName(MCRegister Reg)
LoongArchMachineFunctionInfo - This class is derived from MachineFunctionInfo and contains private Lo...
unsigned getJumpInfoSize()
Base class for the full range of assembler expressions which are needed for parsing.
Instances of this class represent a single low-level machine instruction.
Instances of this class represent operands of the MCInst class.
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
const MCExpr * getExpr() const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
bool isCPI() const
isCPI - Tests if this is a MO_ConstantPoolIndex operand.
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
bool isBlockAddress() const
isBlockAddress - Tests if this is a MO_BlockAddress operand.
Register getReg() const
getReg - Returns the register number.
@ MO_Immediate
Immediate operand.
@ MO_GlobalAddress
Address of a global value.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
constexpr unsigned id() const
MI-level Statepoint operands.
uint32_t getNumPatchBytes() const
Return the number of patchable bytes the given statepoint should emit.
const MachineOperand & getCallTarget() const
Return the target of the underlying call.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
Target & getTheLoongArch64Target()
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
bool lowerLoongArchMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, AsmPrinter &AP)
Target & getTheLoongArch32Target()
This struct is a compact representation of a valid (non-zero power of two) alignment.
RegisterAsmPrinter - Helper template for registering a target specific assembly printer,...