54 #define DEBUG_TYPE "mips-asm-printer"
68 it = MipsFI->StubsNeeded.begin();
69 it != MipsFI->StubsNeeded.end(); ++it) {
70 const char *
Symbol = it->first;
72 if (StubsNeeded.find(Symbol) == StubsNeeded.end())
73 StubsNeeded[Symbol] = Signature;
79 NaClAlignIndirectJumpTargets(MF);
90 #include "MipsGenMCPseudoLowering.inc"
94 void MipsAsmPrinter::emitPseudoIndirectBranch(
MCStreamer &OutStreamer,
96 bool HasLinkReg =
false;
146 if (InConstantPool && MI->
getOpcode() != Mips::CONSTPOOL_ENTRY) {
148 InConstantPool =
false;
150 if (MI->
getOpcode() == Mips::CONSTPOOL_ENTRY) {
162 if (!InConstantPool) {
164 InConstantPool =
true;
183 if (emitPseudoExpansionLowering(*OutStreamer, &*I))
186 if (I->getOpcode() == Mips::PseudoReturn ||
187 I->getOpcode() == Mips::PseudoReturn64 ||
188 I->getOpcode() == Mips::PseudoIndirectBranch ||
189 I->getOpcode() == Mips::PseudoIndirectBranch64 ||
190 I->getOpcode() == Mips::TAILCALLREG ||
191 I->getOpcode() == Mips::TAILCALLREG64) {
192 emitPseudoIndirectBranch(*OutStreamer, &*I);
204 && !isLongBranchPseudo(I->getOpcode()))
210 }
while ((++I != E) && I->isInsideBundle());
252 unsigned CPUBitmask = 0, FPUBitmask = 0;
253 int CPUTopSavedRegOff, FPUTopSavedRegOff;
260 unsigned CPURegSize = Mips::GPR32RegClass.getSize();
261 unsigned FGR32RegSize = Mips::FGR32RegClass.getSize();
262 unsigned AFGR64RegSize = Mips::AFGR64RegClass.getSize();
263 bool HasAFGR64Reg =
false;
264 unsigned CSFPRegsSize = 0;
266 for (
const auto &
I : CSI) {
267 unsigned Reg =
I.getReg();
272 if (Mips::FGR32RegClass.
contains(Reg)) {
273 FPUBitmask |= (1 << RegNum);
274 CSFPRegsSize += FGR32RegSize;
275 }
else if (Mips::AFGR64RegClass.
contains(Reg)) {
276 FPUBitmask |= (3 << RegNum);
277 CSFPRegsSize += AFGR64RegSize;
279 }
else if (Mips::GPR32RegClass.
contains(Reg))
280 CPUBitmask |= (1 << RegNum);
284 FPUTopSavedRegOff = FPUBitmask ?
285 (HasAFGR64Reg ? -AFGR64RegSize : -FGR32RegSize) : 0;
288 CPUTopSavedRegOff = CPUBitmask ? -CSFPRegsSize - CPURegSize : 0;
292 TS.
emitMask(CPUBitmask, CPUTopSavedRegOff);
295 TS.
emitFMask(FPUBitmask, FPUTopSavedRegOff);
310 getTargetStreamer().
emitFrame(stackReg, stackSize, returnReg);
315 switch (static_cast<MipsTargetMachine &>(
TM).getABI().GetEnumValue()) {
354 if (!IsNakedFunction)
357 if (!IsNakedFunction)
385 InConstantPool =
false;
406 if (isa<SwitchInst>(bb->getTerminator()))
432 while (I != Pred->
begin() && !(--
I)->isTerminator()) ;
434 return !I->isBarrier();
439 unsigned AsmVariant,
const char *ExtraCode,
442 if (ExtraCode && ExtraCode[0]) {
443 if (ExtraCode[1] != 0)
return true;
446 switch (ExtraCode[0]) {
486 if (!FlagsOP.
isImm())
501 unsigned RegOp = OpNum;
505 switch(ExtraCode[0]) {
538 unsigned OpNum,
unsigned AsmVariant,
539 const char *ExtraCode,
544 assert(BaseMO.isReg() &&
"Unexpected base pointer for inline asm memory operand.");
545 assert(OffsetMO.
isImm() &&
"Unexpected offset for inline asm memory operand.");
550 if (ExtraCode[0] ==
'D')
623 if (closeP) O <<
")";
661 const char *Modifier) {
669 if (
i != opNum) O <<
", ";
723 if (ABI.
IsO32() && (STI.isABI_FPXX() || STI.isFP64bit()))
729 if (ABI.
IsO32() && (!STI.useOddSPReg() || STI.isABI_FPXX()))
733 void MipsAsmPrinter::emitInlineAsmStart()
const {
749 void MipsAsmPrinter::emitInlineAsmEnd(
const MCSubtargetInfo &StartInfo,
763 void MipsAsmPrinter::EmitInstrReg(
const MCSubtargetInfo &STI,
unsigned Opcode,
772 unsigned Opcode,
unsigned Reg1,
780 if (Opcode == Mips::MTC1) {
781 unsigned Temp = Reg1;
792 unsigned Opcode,
unsigned Reg1,
793 unsigned Reg2,
unsigned Reg3) {
803 unsigned MovOpc,
unsigned Reg1,
804 unsigned Reg2,
unsigned FPReg1,
805 unsigned FPReg2,
bool LE) {
807 unsigned temp = Reg1;
811 EmitInstrRegReg(STI, MovOpc, Reg1, FPReg1);
812 EmitInstrRegReg(STI, MovOpc, Reg2, FPReg2);
817 bool LE,
bool ToFP) {
818 using namespace Mips16HardFloatInfo;
819 unsigned MovOpc = ToFP ? Mips::MTC1 : Mips::MFC1;
822 EmitInstrRegReg(STI, MovOpc, Mips::A0, Mips::F12);
825 EmitMovFPIntPair(STI, MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F14, LE);
828 EmitInstrRegReg(STI, MovOpc, Mips::A0, Mips::F12);
829 EmitMovFPIntPair(STI, MovOpc, Mips::A2, Mips::A3, Mips::F14, Mips::F15, LE);
832 EmitMovFPIntPair(STI, MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F13, LE);
835 EmitMovFPIntPair(STI, MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F13, LE);
836 EmitMovFPIntPair(STI, MovOpc, Mips::A2, Mips::A3, Mips::F14, Mips::F15, LE);
839 EmitMovFPIntPair(STI, MovOpc, Mips::A0, Mips::A1, Mips::F12, Mips::F13, LE);
840 EmitInstrRegReg(STI, MovOpc, Mips::A2, Mips::F14);
847 void MipsAsmPrinter::EmitSwapFPIntRetval(
850 using namespace Mips16HardFloatInfo;
851 unsigned MovOpc = Mips::MFC1;
854 EmitInstrRegReg(STI, MovOpc, Mips::V0, Mips::F0);
857 EmitMovFPIntPair(STI, MovOpc, Mips::V0, Mips::V1, Mips::F0, Mips::F1, LE);
860 EmitMovFPIntPair(STI, MovOpc, Mips::V0, Mips::V1, Mips::F0, Mips::F1, LE);
863 EmitMovFPIntPair(STI, MovOpc, Mips::V0, Mips::V1, Mips::F0, Mips::F1, LE);
864 EmitMovFPIntPair(STI, MovOpc, Mips::A0, Mips::A1, Mips::F2, Mips::F3, LE);
871 void MipsAsmPrinter::EmitFPCallStub(
874 using namespace Mips16HardFloatInfo;
894 switch (Signature->
RetSig) {
905 RetType =
"double complex";
917 Parms =
"float, float";
920 Parms =
"float, double";
926 Parms =
"double, double";
929 Parms =
"double, float";
935 OutStreamer->
AddComment(
"\t# Stub function to call " +
Twine(RetType) +
" " +
964 std::string x =
"__call_stub_fp_" + std::string(Symbol);
975 "should not be here if we are compiling pic");
992 EmitInstrRegRegReg(*STI,
Mips::OR, Mips::S2, Mips::RA, Mips::ZERO);
994 EmitSwapFPIntParams(*STI, Signature->
ParamSig, LE,
true);
998 EmitJal(*STI, MSymbol);
1001 EmitSwapFPIntRetval(*STI, Signature->
RetSig, LE);
1007 EmitInstrReg(*STI, Mips::JR, Mips::S2);
1025 it = StubsNeeded.begin();
1026 it != StubsNeeded.end(); ++it) {
1027 const char *Symbol = it->first;
1029 EmitFPCallStub(Symbol, Signature);
1043 unsigned Size)
const {
1061 const std::vector<MachineJumpTableEntry> &
JT = JtInfo->getJumpTables();
1062 for (
unsigned I = 0; I < JT.
size(); ++
I) {
1063 const std::vector<MachineBasicBlock*> &MBBs = JT[
I].MBBs;
1065 for (
unsigned J = 0; J < MBBs.size(); ++J)
1071 for (
auto &
MBB : MF) {
1077 bool MipsAsmPrinter::isLongBranchPseudo(
int Opcode)
const {
1078 return (Opcode == Mips::LONG_BRANCH_LUi
1079 || Opcode == Mips::LONG_BRANCH_ADDiu
1080 || Opcode == Mips::LONG_BRANCH_DADDiu);
MachineConstantPoolValue * MachineCPVal
virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff)
bool isEHPad() const
Returns true if the block is a landing pad.
unsigned getAlignment() const
getAlignment - Return the alignment (log2, not bytes) of the function.
StringRef getPrivateGlobalPrefix() const
StringRef getTargetCPU() const
const GlobalValue * getGlobal() const
instr_iterator instr_end()
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
MCSymbol * getSymbol(const GlobalValue *GV) const
void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
MachineBasicBlock * getMBB() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
A Module instance is used to store all the information related to an LLVM module. ...
const DataLayout & getDataLayout() const
Return information about data layout.
virtual void AddBlankLine()
AddBlankLine - Emit a blank line to a .s file to pretty it up.
void Lower(const MachineInstr *MI, MCInst &OutMI) const
MCContext & OutContext
This is the context for the output file that we are streaming.
static MCOperand createExpr(const MCExpr *Val)
void EmitFunctionBodyEnd() override
EmitFunctionBodyEnd - Targets can override this to emit stuff after the last basic block in the funct...
MO_TLSGD - Represents the offset into the global offset table at which.
void EmitDebugValue(const MCExpr *Value, unsigned Size) const override
Emit the directive and value for debug thread local expression.
const MachineFunction * MF
The current machine function.
Target & getTheMipselTarget()
virtual void EmitDTPRel64Value(const MCExpr *Value)
Emit the expression Value into the output as a dtprel (64-bit DTP relative) value.
virtual void emitDirectiveSetNoReorder()
A raw_ostream that writes to an SmallVector or SmallString.
bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const override
isBlockOnlyReachableByFallthough - Return true if the basic block has exactly one predecessor and the...
void PushSection()
Save the current and previous section on the section stack.
MachineBasicBlock reference.
unsigned getFunctionNumber() const
Return a unique ID for the current function.
const std::string & str() const
const Function * getFunction() const
getFunction - Return the LLVM function that this machine code represents
void Initialize(MCContext *C)
void EmitFunctionBodyStart() override
EmitFunctionBodyStart - Targets can override this to emit stuff before the first basic block in the f...
virtual void EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
void setAlignment(unsigned Align)
Set alignment of the basic block.
void EmitFunctionEntryLabel() override
EmitFunctionEntryLabel - Emit the label that is the entrypoint for the function.
return AArch64::GPR64RegClass contains(Reg)
const std::vector< CalleeSavedInfo > & getCalleeSavedInfo() const
Returns a reference to call saved info vector for the current function.
const Triple & getTargetTriple() const
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects...
MCSubtargetInfo * createMCSubtargetInfo(StringRef TheTriple, StringRef CPU, StringRef Features) const
createMCSubtargetInfo - Create a MCSubtargetInfo implementation.
virtual void emitDirectiveSetMicroMips()
const MipsABIInfo & getABI() const
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
static MCOperand createReg(unsigned Reg)
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
struct fuzzer::@269 Flags
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
virtual void emitFrame(unsigned StackReg, unsigned StackSize, unsigned ReturnReg)
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
void LLVMInitializeMipsAsmPrinter()
bool isReg() const
isReg - Tests if this is a MO_Register operand.
virtual void emitDirectiveSetNoMacro()
Base class for the full range of assembler expressions which are needed for parsing.
virtual void emitDirectiveSetPush()
virtual void emitDirectiveEnd(StringRef Name)
Reg
All possible values of the reg field in the ModR/M byte.
Represent a reference to a symbol from inside an expression.
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted...
virtual unsigned getFrameRegister(const MachineFunction &MF) const =0
Debug information queries.
MO_ABS_HI/LO - Represents the hi or low part of an absolute symbol address.
unsigned getNumOperands() const
Access to explicit operands of the instruction.
virtual void emitDirectiveModuleOddSPReg()
virtual void AddComment(const Twine &T, bool EOL=true)
Add a textual comment.
bool runOnMachineFunction(MachineFunction &MF) override
Emit the specified function out to the OutStreamer.
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Target & getTheMips64Target()
bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, const char *ExtraCode, raw_ostream &O) override
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant...
void printRegisterList(const MachineInstr *MI, int opNum, raw_ostream &O)
virtual void emitDirectiveModuleFP()
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
bool isLittleEndian() const
Layout endianness...
static GCRegistry::Add< OcamlGC > B("ocaml","ocaml 3.10-compatible GC")
This class is a data container for one entry in a MachineConstantPool.
MCContext & getContext() const
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS)
void EmitEndOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the end of their file...
Instances of this class represent a single low-level machine instruction.
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
MO_GPREL - Represents the offset from the current gp value to be used for the relocatable object file...
static GCRegistry::Add< CoreCLRGC > E("coreclr","CoreCLR-compatible GC")
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
const MachineBasicBlock * getParent() const
const Constant * ConstVal
bool isDebugValue() const
virtual void setUsesMicroMips()
Address of a global value.
unsigned getTargetFlags() const
Streaming machine code generation interface.
MO_GOT_CALL - Represents the offset into the global offset table at which the address of a call site ...
MCSymbol * createTempSymbol(bool CanBeUnnamed=true)
Create and return a new assembler temporary symbol with a unique but unspecified name.
Target & getTheMips64elTarget()
MCSymbol * CurrentFnSym
The symbol for the current function.
LLVM Basic Block Representation.
const MCAsmInfo * MAI
Target Asm Printer information.
virtual void emitDirectiveSetNoMicroMips()
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
virtual void emitDirectiveSetMips16()
virtual void SwitchSection(MCSection *Section, const MCExpr *Subsection=nullptr)
Set the current section where code is being emitted to Section.
const MachineOperand & getOperand(unsigned i) const
void printSavedRegsBitmask()
virtual bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, unsigned AsmVariant, const char *ExtraCode, raw_ostream &OS)
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant...
void EmitInstruction(const MachineInstr *MI) override
Targets should implement this to emit instructions.
static ManagedStatic< OptionRegistry > OR
virtual void emitDirectiveSetMacro()
virtual void emitDirectiveNaN2008()
TargetMachine & TM
Target machine description.
static unsigned getNumOperandRegisters(unsigned Flag)
getNumOperandRegisters - Extract the number of registers field from the inline asm operand flag...
virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value=0, unsigned ValueSize=1, unsigned MaxBytesToEmit=0)
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute)=0
Add the given Attribute to Symbol.
Address of a basic block.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang","erlang-compatible garbage collector")
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
int64_t getOffset() const
Return the offset from the symbol in this operand.
StringRef selectMipsCPU(const Triple &TT, StringRef CPU)
Select the Mips CPU for the given triple and cpu name.
self_iterator getIterator()
virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff)
MCSection * getTextSection() const
bool inMicroMipsMode() const
const char * getCurrentABIString() const
Emit Set directives.
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
bool runOnMachineFunction(MachineFunction &MF) override
Emit the specified function out to the OutStreamer.
bool inMips16Mode() const
MipsMCInstLower MCInstLowering
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
pred_iterator pred_begin()
MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
MO_GOTTPREL - Represents the offset from the thread pointer (Initial.
virtual void EmitDataRegion(MCDataRegionType Kind)
Note in the output the specified region Kind.
Triple - Helper class for working with autoconf configuration names.
void EmitAlignment(unsigned NumBits, const GlobalObject *GO=nullptr) const
Emit an alignment directive to the specified power of two boundary.
std::vector< MachineBasicBlock * >::const_iterator const_pred_iterator
virtual void emitDirectiveAbiCalls()
MO_GOT - Represents the offset into the global offset table at which the address the relocation entry...
Iterator for intrusive lists based on ilist_node.
void setOpcode(unsigned Op)
bool isTargetNaCl() const
StringRef getTargetFeatureString() const
virtual void EmitLabel(MCSymbol *Symbol)
Emit a label for Symbol into the current section.
virtual void emitDirectiveOptionPic0()
MachineOperand class - Representation of each machine instruction operand.
virtual void emitDirectiveSetPop()
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
static Twine utohexstr(const uint64_t &Val)
bool isPositionIndependent() const
virtual void emitDirectiveSetAt()
virtual void emitDirectiveSetNoMips16()
bool isPositionIndependent() const
void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O, const char *Modifier=nullptr)
void EmitStartOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the start of their fi...
virtual void emitDirectiveInsn()
bool isLittleEndian() const
const char * MipsFCCToString(Mips::CondCode CC)
Target & getTheMipsTarget()
MO_TPREL_HI/LO - Represents the hi and low part of the offset from.
static const unsigned MIPS_NACL_BUNDLE_ALIGN
virtual void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV)
virtual void setPic(bool Value)
void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O)
Representation of each machine instruction.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
bool hasAddressTaken() const
Test whether this block is potentially the target of an indirect branch.
void updateABIInfo(const PredicateLibrary &P)
virtual void emitDirectiveEnt(const MCSymbol &Symbol)
StringRef getName() const
getName - Get the symbol name.
const MipsSubtarget * Subtarget
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
.type _foo, STT_FUNC # aka
MCSymbol * GetBlockAddressSymbol(const BlockAddress *BA) const
Return the MCSymbol used to satisfy BlockAddress uses of the specified basic block.
virtual void EmitDTPRel32Value(const MCExpr *Value)
Emit the expression Value into the output as a dtprel (32-bit DTP relative) value.
MCSubtargetInfo - Generic base class for all target subtargets.
void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O)
virtual void emitELFSize(MCSymbol *Symbol, const MCExpr *Value)
Emit an ELF .size directive.
MipsFunctionInfo - This class is derived from MachineFunction private Mips target-specific informatio...
This represents a section on linux, lots of unix variants and some bare metal systems.
void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O)
virtual MCSymbol * GetCPISymbol(unsigned CPID) const
Return the symbol for the specified constant pool entry.
unsigned getReg() const
getReg - Returns the register number.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool PopSection()
Restore the current and previous section from the section stack.
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
virtual void emitDirectiveSetReorder()
static const char * getRegisterName(unsigned RegNo)
uint16_t getEncodingValue(unsigned RegNo) const
Returns the encoding for RegNo.
void EmitGlobalConstant(const DataLayout &DL, const Constant *CV)
Print a general LLVM constant to the .s file.
LLVM Value Representation.
void forbidModuleDirective()
const MCObjectFileInfo * getObjectFileInfo() const
RegisterAsmPrinter - Helper template for registering a target specific assembly printer, for use in the target machine initialization function.
virtual void emitDirectiveNaNLegacy()
This class implements an extremely fast bulk output stream that can only output to a stream...
MCOperand LowerOperand(const MachineOperand &MO, unsigned offset=0) const
const Target & getTarget() const
const MipsFunctionInfo * MipsFI
const std::vector< MachineConstantPoolEntry > & getConstants() const
void emitFrameDirective()
Frame Directive.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
void addOperand(const MCOperand &Op)
virtual void print(raw_ostream &O, const Module *M) const
print - Print out the internal state of the pass.
StringRef - Represent a constant reference to a string, i.e.
const BlockAddress * getBlockAddress() const
Address of indexed Constant in Constant Pool.
bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, unsigned AsmVariant, const char *ExtraCode, raw_ostream &O) override
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant as...
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml","ocaml 3.10-compatible collector")
union llvm::MachineConstantPoolEntry::@35 Val
The constant itself.
virtual void emitDirectiveSetNoAt()
void EmitBasicBlockEnd(const MachineBasicBlock &MBB) override
Targets can override this to emit stuff at the end of a basic block.
unsigned getRARegister() const
This method should return the register where the return address can be found.
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
Instances of this class represent operands of the MCInst class.
static GCRegistry::Add< ErlangGC > A("erlang","erlang-compatible garbage collector")
LLVM_NODISCARD std::string lower() const