34#define DEBUG_TYPE "loongarch-asm-printer"
39 "Annotate table jump instruction to correlate it with the jump table."),
44#include "LoongArchGenMCPseudoLowering.inc"
52 StringRef ABIName = M.getTargetABIFromMD();
53 if (!ABIName.
empty()) {
55 TM.getTargetTriple(),
TM.getMCSubtargetInfo().getFeatureBits(),
61 LoongArch_MC::verifyInstructionPredicates(
70 switch (
MI->getOpcode()) {
71 case TargetOpcode::STATEPOINT:
74 case TargetOpcode::PATCHABLE_FUNCTION_ENTER:
77 case TargetOpcode::PATCHABLE_FUNCTION_EXIT:
80 case TargetOpcode::PATCHABLE_TAIL_CALL:
91 const char *ExtraCode,
98 if (ExtraCode && ExtraCode[0]) {
99 if (ExtraCode[1] != 0)
102 switch (ExtraCode[0]) {
117 unsigned RegID = MO.
getReg().
id(), FirstReg;
118 if (RegID >= LoongArch::XR0 && RegID <= LoongArch::XR31)
119 FirstReg = LoongArch::XR0;
120 else if (RegID >= LoongArch::VR0 && RegID <= LoongArch::VR31)
121 FirstReg = LoongArch::VR0;
122 else if (RegID >= LoongArch::F0_64 && RegID <= LoongArch::F31_64)
123 FirstReg = LoongArch::F0_64;
124 else if (RegID >= LoongArch::F0 && RegID <= LoongArch::F31)
125 FirstReg = LoongArch::F0;
131 (ExtraCode[0] ==
'u' ? LoongArch::XR0 : LoongArch::VR0));
157 const char *ExtraCode,
176 if (OffsetMO.
isReg())
178 else if (OffsetMO.
isImm())
179 OS <<
", " << OffsetMO.
getImm();
193 assert(PatchBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
199 switch (CallTarget.
getType()) {
214 .addReg(LoongArch::R1)
225 MCSymbol *MILabel = Ctx.createTempSymbol();
227 SM.recordStatepoint(*MILabel,
MI);
233 if (
F.hasFnAttribute(
"patchable-function-entry")) {
234 unsigned Num =
F.getFnAttributeAsParsedInteger(
"patchable-function-entry");
262 const int8_t NoopsInSledCount = 11;
281 assert(
TM.getTargetTriple().isOSBinFormatELF());
285 auto JTI =
MF->getJumpTableInfo();
287 if (!JTI || 0 == EntrySize)
291 const auto &JT = JTI->getJumpTables();
299 for (
unsigned Idx = 0; Idx < EntrySize; ++Idx) {
300 int JTIIdx = LAFI->getJumpInfoJTIIndex(Idx);
301 if (JT[JTIIdx].MBBs.empty())
315 unsigned Size)
const {
320 getTargetStreamer().emitDTPRel32Value(Expr->getSubExpr());
323 getTargetStreamer().emitDTPRel64Value(Expr->getSubExpr());
344 "LoongArch Assembly Printer",
false,
false)
348LLVMInitializeLoongArchAsmPrinter() {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static MCDisassembler::DecodeStatus addOperand(MCInst &Inst, const MCOperand &Opnd)
#define LLVM_EXTERNAL_VISIBILITY
Module.h This file contains the declarations for the Module class.
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 emitStartOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the start of their fi...
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.
A Module instance is used to store all the information related to an LLVM module.
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.
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
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.
ABI computeTargetABI(const Triple &TT, const FeatureBitset &FeatureBits, StringRef ABIName)
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,...