58 #define DEBUG_TYPE "asm-printer"
61 std::unique_ptr<MCStreamer> Streamer)
62 :
AsmPrinter(TM, std::move(Streamer)), AFI(nullptr), MCP(nullptr),
63 InConstantPool(
false) {}
70 InConstantPool =
false;
85 assert(Size &&
"C++ constructor pointer had zero size!");
88 assert(GV &&
"C++ constructor pointer was not a GlobalValue!");
128 if (! ThumbIndirectPads.empty()) {
131 for (
unsigned i = 0, e = ThumbIndirectPads.size(); i < e; i++) {
132 OutStreamer->EmitLabel(ThumbIndirectPads[i].second);
134 .addReg(ThumbIndirectPads[i].first)
139 ThumbIndirectPads.clear();
156 assert(!MO.
getSubReg() &&
"Subregs should be eliminated!");
157 if(ARM::GPRPairRegClass.
contains(Reg)) {
166 int64_t Imm = MO.
getImm();
184 GetARMGVSymbol(GV, TF)->
print(O,
MAI);
200 GetARMJTIPICJumpTableLabel(
unsigned uid)
const {
209 MCSymbol *ARMAsmPrinter::GetARMSJLJEHLabel()
const {
218 unsigned AsmVariant,
const char *ExtraCode,
221 if (ExtraCode && ExtraCode[0]) {
222 if (ExtraCode[1] != 0)
return true;
224 switch (ExtraCode[0]) {
252 if (!ARM::DPRRegClass.
contains(*SR))
274 unsigned RegBegin = MO.
getReg();
279 if (ARM::GPRPairRegClass.
contains(RegBegin)) {
281 unsigned Reg0 = TRI->
getSubReg(RegBegin, ARM::gsub_0);
283 RegBegin = TRI->
getSubReg(RegBegin, ARM::gsub_1);
291 unsigned RegOps = OpNum + 1;
307 if (!FlagsOP.
isImm())
330 if (RC == ARM::GPRPairRegClassID) {
338 ARM::gsub_0 : ARM::gsub_1);
344 unsigned RegOp = ExtraCode[0] ==
'Q' ? OpNum : OpNum + 1;
360 if (!ARM::QPRRegClass.
contains(Reg))
363 unsigned SubReg = TRI->
getSubReg(Reg, ExtraCode[0] ==
'e' ?
364 ARM::dsub_0 : ARM::dsub_1);
379 if(!ARM::GPRPairRegClass.
contains(Reg))
393 unsigned OpNum,
unsigned AsmVariant,
394 const char *ExtraCode,
397 if (ExtraCode && ExtraCode[0]) {
398 if (ExtraCode[1] != 0)
return true;
400 switch (ExtraCode[0]) {
402 default:
return true;
412 assert(MO.
isReg() &&
"unexpected inline asm memory operand");
425 const bool WasThumb =
isThumb(StartInfo);
426 if (!EndInfo || WasThumb !=
isThumb(*EndInfo)) {
487 if (!Stubs.empty()) {
492 for (
auto &Stub : Stubs)
500 if (!Stubs.empty()) {
504 for (
auto &Stub : Stubs)
554 void ARMAsmPrinter::emitAttributes() {
573 ArchFS = (
Twine(ArchFS) +
"," +
FS).str();
583 if (CPUString.find(
"generic") != 0) {
589 if (STI.hasDivide() || STI.hasDivideInARMMode())
599 if (STI.hasV7Ops()) {
600 if (STI.isAClass()) {
603 }
else if (STI.isRClass()) {
606 }
else if (STI.isMClass()) {
615 if (STI.isThumb1Only()) {
617 }
else if (STI.hasThumb2()) {
625 if (STI.hasFPARMv8()) {
630 }
else if (STI.hasVFP4())
640 if (STI.hasFPARMv8())
646 else if (STI.hasVFP4())
650 else if (STI.hasVFP3())
658 else if (STI.hasVFP2())
687 if (!STI.hasVFP2()) {
697 }
else if (STI.hasVFP3()) {
721 if (STI.allowsUnalignedMem())
734 if (STI.isFPOnlySP())
754 if (STI.hasMPExtension())
763 if (STI.hasDivideInARMMode() && !STI.hasV8Ops())
770 if (
auto WCharWidthValue = mdconst::extract_or_null<ConstantInt>(
771 SourceModule->getModuleFlag(
"wchar_size"))) {
772 int WCharWidth = WCharWidthValue->getZExtValue();
773 assert((WCharWidth == 2 || WCharWidth == 4) &&
774 "wchar_t width must be 2 or 4 bytes");
781 if (
auto EnumWidthValue = mdconst::extract_or_null<ConstantInt>(
782 SourceModule->getModuleFlag(
"min_enum_size"))) {
783 int EnumWidth = EnumWidthValue->getZExtValue();
784 assert((EnumWidth == 1 || EnumWidth == 4) &&
785 "Minimum enum width must be 1 or 4 bytes");
786 int EnumBuildAttr = EnumWidth == 1 ? 1 : 2;
796 if (STI.isR9Reserved())
801 if (STI.hasTrustZone() && STI.hasVirtualization())
804 else if (STI.hasTrustZone())
807 else if (STI.hasVirtualization())
820 +
"PC" +
Twine(FunctionNumber) +
"_" +
Twine(LabelId));
838 unsigned char TargetFlags) {
853 if (!StubSym.getPointer())
859 "Windows is the only supported COFF target");
888 cast<ARMConstantPoolConstant>(ACPV)->getBlockAddress();
896 MCSym = GetARMGVSymbol(GV, TF);
901 assert(ACPV->
isExtSymbol() &&
"unrecognized constant pool value");
902 const char *Sym = cast<ARMConstantPoolSymbol>(ACPV)->
getSymbol();
944 MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
953 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
955 for (
unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
986 MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
992 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
994 for (
unsigned i = 0, e = JTBBs.size(); i != e; ++i) {
1000 .addExpr(MBBSymbolExpr)
1007 unsigned OffsetWidth) {
1008 assert((OffsetWidth == 1 || OffsetWidth == 2) &&
"invalid tbb/tbh width");
1012 MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
1018 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
1024 for (
auto MBB : JTBBs) {
1056 void ARMAsmPrinter::EmitUnwindingInstruction(
const MachineInstr *
MI) {
1058 "Only instruction which are involved into frame setup code are allowed");
1068 unsigned SrcReg, DstReg;
1070 if (Opc == ARM::tPUSH || Opc == ARM::tLDRpci) {
1076 SrcReg = DstReg = ARM::SP;
1085 assert(DstReg == ARM::SP &&
1086 "Only stack pointer as a destination reg is supported");
1090 unsigned StartOp = 2 + 2;
1092 unsigned NumOffset = 0;
1100 StartOp = 2; NumOffset = 2;
1101 case ARM::STMDB_UPD:
1102 case ARM::t2STMDB_UPD:
1103 case ARM::VSTMDDB_UPD:
1104 assert(SrcReg == ARM::SP &&
1105 "Only stack pointer as a source reg is supported");
1106 for (
unsigned i = StartOp, NumOps = MI->
getNumOperands() - NumOffset;
1116 case ARM::STR_PRE_IMM:
1117 case ARM::STR_PRE_REG:
1118 case ARM::t2STR_PRE:
1120 "Only stack pointer as a source reg is supported");
1125 ATS.
emitRegSave(RegList, Opc == ARM::VSTMDDB_UPD);
1128 if (SrcReg == ARM::SP) {
1152 case ARM::tLDRpci: {
1159 assert(CPI != -1U &&
"Invalid constpool index");
1165 Offset = -cast<ConstantInt>(CPE.
Val.
ConstVal)->getSExtValue();
1171 if (DstReg == FramePtr && FramePtr != ARM::SP)
1174 ATS.
emitSetFP(FramePtr, ARM::SP, -Offset);
1175 else if (DstReg == ARM::SP) {
1185 }
else if (DstReg == ARM::SP) {
1198 #include "ARMGenMCPseudoLowering.inc"
1204 if (InConstantPool && MI->
getOpcode() != ARM::CONSTPOOL_ENTRY) {
1206 InConstantPool =
false;
1212 EmitUnwindingInstruction(MI);
1215 if (emitPseudoExpansionLowering(*
OutStreamer, MI))
1219 "Pseudo flag setting opcode should be expanded early");
1224 case ARM::t2MOVi32imm:
llvm_unreachable(
"Should be lowered by thumb2it pass");
1227 case ARM::tLEApcrel:
1228 case ARM::t2LEApcrel: {
1232 ARM::t2LEApcrel ? ARM::t2ADR
1233 : (MI->
getOpcode() == ARM::tLEApcrel ? ARM::tADR
1242 case ARM::LEApcrelJT:
1243 case ARM::tLEApcrelJT:
1244 case ARM::t2LEApcrelJT: {
1248 ARM::t2LEApcrelJT ? ARM::t2ADR
1249 : (MI->
getOpcode() == ARM::tLEApcrelJT ? ARM::tADR
1260 case ARM::BX_CALL: {
1274 case ARM::tBX_CALL: {
1286 for (
unsigned i = 0, e = ThumbIndirectPads.size(); i < e; i++) {
1287 if (ThumbIndirectPads[i].first == TReg) {
1288 TRegSym = ThumbIndirectPads[i].second;
1295 ThumbIndirectPads.push_back(std::make_pair(TReg, TRegSym));
1305 case ARM::BMOVPCRX_CALL: {
1325 case ARM::BMOVPCB_CALL: {
1338 MCSymbol *GVSym = GetARMGVSymbol(GV, TF);
1347 case ARM::MOVi16_ga_pcrel:
1348 case ARM::t2MOVi16_ga_pcrel: {
1350 TmpInst.
setOpcode(Opc == ARM::MOVi16_ga_pcrel? ARM::MOVi16 : ARM::t2MOVi16);
1355 MCSymbol *GVSym = GetARMGVSymbol(GV, TF);
1362 unsigned PCAdj = (Opc == ARM::MOVi16_ga_pcrel) ? 8 : 4;
1363 const MCExpr *PCRelExpr =
1378 case ARM::MOVTi16_ga_pcrel:
1379 case ARM::t2MOVTi16_ga_pcrel: {
1381 TmpInst.
setOpcode(Opc == ARM::MOVTi16_ga_pcrel
1382 ? ARM::MOVTi16 : ARM::t2MOVTi16);
1388 MCSymbol *GVSym = GetARMGVSymbol(GV, TF);
1395 unsigned PCAdj = (Opc == ARM::MOVTi16_ga_pcrel) ? 8 : 4;
1396 const MCExpr *PCRelExpr =
1410 case ARM::tPICADD: {
1463 case ARM::PICLDRSH: {
1481 case ARM::PICSTR: Opcode = ARM::STRrs;
break;
1482 case ARM::PICSTRB: Opcode = ARM::STRBrs;
break;
1483 case ARM::PICSTRH: Opcode = ARM::STRH;
break;
1484 case ARM::PICLDR: Opcode = ARM::LDRrs;
break;
1485 case ARM::PICLDRB: Opcode = ARM::LDRBrs;
break;
1486 case ARM::PICLDRH: Opcode = ARM::LDRH;
break;
1487 case ARM::PICLDRSB: Opcode = ARM::LDRSB;
break;
1488 case ARM::PICLDRSH: Opcode = ARM::LDRSH;
break;
1501 case ARM::CONSTPOOL_ENTRY: {
1511 if (!InConstantPool) {
1513 InConstantPool =
true;
1525 case ARM::JUMPTABLE_ADDRS:
1528 case ARM::JUMPTABLE_INSTS:
1531 case ARM::JUMPTABLE_TBB:
1532 case ARM::JUMPTABLE_TBH:
1535 case ARM::t2BR_JT: {
1546 case ARM::t2TBH_JT: {
1547 unsigned Opc = MI->
getOpcode() == ARM::t2TBB_JT ? ARM::t2TBB : ARM::t2TBH;
1563 unsigned Opc = MI->
getOpcode() == ARM::BR_JTr ?
1564 ARM::MOVr : ARM::tMOVr;
1572 if (Opc == ARM::MOVr)
1600 case ARM::BR_JTadd: {
1622 uint32_t Val = 0xe7ffdefeUL;
1629 case ARM::TRAPNaCl: {
1631 uint32_t Val = 0xe7fedef0UL;
1641 uint16_t Val = 0xdefe;
1648 case ARM::t2Int_eh_sjlj_setjmp:
1649 case ARM::t2Int_eh_sjlj_setjmp_nofp:
1650 case ARM::tInt_eh_sjlj_setjmp: {
1700 .addExpr(SymbolExpr)
1717 case ARM::Int_eh_sjlj_setjmp_nofp:
1718 case ARM::Int_eh_sjlj_setjmp: {
1777 case ARM::Int_eh_sjlj_longjmp: {
1815 case ARM::tInt_eh_sjlj_longjmp: {
MCSection * getNonLazySymbolPointerSection() const
MachineConstantPoolValue * MachineCPVal
MO_DLLIMPORT - On a symbol operand, this represents that the reference to the symbol is for an import...
StubValueTy & getHiddenGVStubEntry(MCSymbol *Sym)
void push_back(const T &Elt)
const MachineFunction * getParent() const
getParent - Return the MachineFunction containing this basic block.
A parsed version of the target data layout string in and methods for querying it. ...
SymbolListTy GetGVStubList()
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
virtual void emitFPU(unsigned FPU)
StringRef getTargetCPU() const
void EmitStartOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the start of their fi...
const GlobalValue * getGlobal() const
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
static ARMBuildAttrs::CPUArch getArchForCPU(StringRef CPU, const ARMSubtarget *Subtarget)
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
MCSymbol * getSymbol(const GlobalValue *GV) const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
Reloc::Model getRelocationModel() const
Returns the code generation relocation model.
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
const std::string & getCPUString() const
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. ...
void EmitJumpTableTBInst(const MachineInstr *MI, unsigned OffsetWidth)
MCContext & OutContext
This is the context for the output file that we are streaming.
static MCOperand createExpr(const MCExpr *Val)
virtual void emitArchExtension(unsigned ArchExt)
bool isTargetEHABICompatible() const
ARMConstantPoolValue - ARM specific constantpool value.
bool mayStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly modify memory.
Target specific streamer interface.
virtual void emitPad(int64_t Offset)
const MachineFunction * MF
The current machine function.
static GlobalValue * getGV(DataRefImpl &Symb)
const char * getPrivateGlobalPrefix() const
A raw_ostream that writes to an SmallVector or SmallString.
MCSymbol * getSymbolWithGlobalValueBase(const GlobalValue *GV, StringRef Suffix) const
Return the MCSymbol for a private symbol with global value name as its base, with the specified suffi...
MachineBasicBlock reference.
unsigned getFunctionNumber() const
Return a unique ID for the current function.
bool isThumbFunction() const
bool runOnMachineFunction(MachineFunction &F) override
runOnMachineFunction - This uses the EmitInstruction() method to print assembly for each instruction...
virtual void finishAttributeSection()
const Function * getFunction() const
getFunction - Return the LLVM function that this machine code represents
setjmp/longjmp based exceptions
MO_PLT - On a symbol operand, this represents an ELF PLT reference on a call operand.
std::vector< std::pair< MCSymbol *, StubValueTy > > SymbolListTy
static bool isThumb(const MCSubtargetInfo &STI)
static bool isUseOperandTiedToDef(unsigned Flag, unsigned &Idx)
isUseOperandTiedToDef - Return true if the flag of the inline asm operand indicates it is an use oper...
void LLVMInitializeARMAsmPrinter()
void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo, const MCSubtargetInfo *EndInfo) const override
Let the target do anything it needs to do after emitting inlineasm.
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV) const
void EmitFunctionBodyEnd() override
Targets can override this to emit stuff after the last basic block in the function.
const Triple & getTargetTriple() const
bool isGlobalValue() const
const std::vector< MachineJumpTableEntry > & getJumpTables() const
BlockAddress - The address of a basic block.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
static MCOperand createReg(unsigned Reg)
MCSuperRegIterator enumerates all super-registers of Reg.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool hasInternalLinkage() const
void EmitInstruction(const MachineInstr *MI) override
Targets should implement this to emit instructions.
static const MCBinaryExpr * createDiv(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Base class for the full range of assembler expressions which are needed for parsing.
bool mustAddCurrentAddress() const
const Module * getModule() const
Reg
All possible values of the reg field in the ModR/M byte.
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
virtual unsigned getFrameRegister(const MachineFunction &MF) const =0
Debug information queries.
MCContext & getContext() const
unsigned getNumOperands() const
Access to explicit operands of the instruction.
Context object for machine code objects.
static const ARMMCExpr * createLower16(const MCExpr *Expr, MCContext &Ctx)
void EmitFunctionBody()
This method emits the body and trailer for a function.
unsigned NoNaNsFPMath
NoNaNsFPMath - This flag is enabled when the -enable-no-nans-fp-math flag is specified on the command...
void EmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) override
EmitMachineConstantPoolValue - Print a machine constantpool value to the .s file. ...
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
.code16 (X86) / .code 16 (ARM)
static MCSymbol * getPICLabel(const char *Prefix, unsigned FunctionNumber, unsigned LabelId, MCContext &Ctx)
bool isTargetCOFF() const
bool isTargetMachO() const
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
virtual void emitMovSP(unsigned Reg, int64_t Offset=0)
ArchType getArch() const
getArch - Get the parsed architecture type of this triple.
This class is a data container for one entry in a MachineConstantPool.
static MCSymbolRefExpr::VariantKind getModifierVariantKind(ARMCP::ARMCPModifier Modifier)
static const char * getRegisterName(unsigned RegNo)
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
bool isMachineBasicBlock() const
virtual void EmitIntValue(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers...
MachineModuleInfo * MMI
This is a pointer to the current MachineModuleInfo.
Instances of this class represent a single low-level machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
SubArchType getSubArch() const
getSubArch - get the parsed subarchitecture type for this triple.
virtual void emitAttribute(unsigned Attribute, unsigned Value)
const MachineBasicBlock * getParent() const
const Constant * ConstVal
DBG_VALUE - a mapping of the llvm.dbg.value intrinsic.
Address of a global value.
void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O)
unsigned getTargetFlags() const
Streaming machine code generation interface.
MCInstBuilder & addReg(unsigned Reg)
Add a new register operand.
bool isBlockAddress() const
unsigned UnsafeFPMath
UnsafeFPMath - This flag is enabled when the -enable-unsafe-fp-math flag is specified on the command ...
virtual void emitRegSave(const SmallVectorImpl< unsigned > &RegList, bool isVector)
MCSymbol * createTempSymbol(bool CanBeUnnamed=true)
Create and return a new assembler temporary symbol with a unique but unspecified name.
Constant * stripPointerCasts()
MCSymbol * CurrentFnSym
The symbol for the current function.
const MCAsmInfo * MAI
Target Asm Printer information.
PointerIntPair - This class implements a pair of a pointer and small integer.
The instances of the Type class are immutable: once they are created, they are never changed...
This is an important base class in LLVM.
bool hasHiddenVisibility() const
This file contains the declarations for the subclasses of Constant, which represent the different fla...
const MachineOperand & getOperand(unsigned i) const
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...
unsigned getSubReg(unsigned Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo...
Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
virtual void emitSetFP(unsigned FpReg, unsigned SpReg, int64_t Offset=0)
TargetMachine & TM
Target machine description.
This class is intended to be used as a driving class for all asm writers.
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 unsigned getNumOperandRegisters(unsigned Flag)
getNumOperandRegisters - Extract the number of registers field from the inline asm operand flag...
bool isLittleEndian() const
virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute)=0
Add the given Attribute to Symbol.
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang","erlang-compatible garbage collector")
bool getFlag(MIFlag Flag) const
Return whether an MI flag is set.
void printOffset(int64_t Offset, raw_ostream &OS) const
This is just convenient handler for printing offsets.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
.subsections_via_symbols (MachO)
TRAP - Trapping instruction.
ExceptionHandling getExceptionHandlingType() const
A function that returns a base type.
unsigned convertAddSubFlagsOpcode(unsigned OldOpc)
Map pseudo instructions that imply an 'S' bit onto real opcodes.
int64_t getOffset() const
Return the offset from the symbol in this operand.
MCInstBuilder & addImm(int64_t Val)
Add a new integer immediate operand.
Ty & getObjFileInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
ARMAsmPrinter(TargetMachine &TM, std::unique_ptr< MCStreamer > Streamer)
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
unsigned NoInfsFPMath
NoInfsFPMath - This flag is enabled when the -enable-no-infs-fp-math flag is specified on the command...
void EmitXXStructor(const Constant *CV) override
Targets can override this to change how global constants that are part of a C++ static/global constru...
unsigned getSubReg() const
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
void EmitFunctionEntryLabel() override
EmitFunctionEntryLabel - Emit the label that is the entrypoint for the function.
Abstract base class for all machine specific constantpool value subclasses.
MCSymbol * getSymbol() const
getSymbol - Return the MCSymbol for this basic block.
StubValueTy & getGVStubEntry(MCSymbol *Sym)
MO_LO16 - On a symbol operand, this represents a relocation containing lower 16 bit of the address...
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.
const std::string & getModuleInlineAsm() const
Get any module-scope inline assembly blocks.
void EmitJumpTableInsts(const MachineInstr *MI)
PointerTy getPointer() const
void setOpcode(unsigned Op)
StringRef getTargetFeatureString() const
virtual void EmitLabel(MCSymbol *Symbol)
Emit a label for Symbol into the current section.
bool GVIsIndirectSymbol(const GlobalValue *GV, Reloc::Model RelocM) const
GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol.
SymbolListTy GetHiddenGVStubList()
uint64_t getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
static void emitNonLazySymbolPointer(MCStreamer &OutStreamer, MCSymbol *StubLabel, MachineModuleInfoImpl::StubValueTy &MCSym)
void EmitGlobalConstant(const Constant *CV)
Print a general LLVM constant to the .s file.
const DataLayout * getDataLayout() const
Deprecated in 3.7, will be removed in 3.8.
MachineOperand class - Representation of each machine instruction operand.
Module.h This file contains the declarations for the Module class.
Type * getType() const
All values are typed, get the type of this value.
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
const FeatureBitset & getFeatureBits() const
getFeatureBits - Return the feature bits.
Type * getType() const
getType - get type of this MachineConstantPoolValue.
SymbolStorageClass
Storage class tells where and what the symbol represents.
MCSymbol * getCurExceptionSym()
void LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, ARMAsmPrinter &AP)
LLVM_ATTRIBUTE_UNUSED_RESULT std::enable_if< !is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
.code32 (X86) / .code 32 (ARM)
FunctionNumber(functionNumber)
static bool hasRegClassConstraint(unsigned Flag, unsigned &RC)
hasRegClassConstraint - Returns true if the flag contains a register class constraint.
Representation of each machine instruction.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
static bool isPhysicalRegister(unsigned Reg)
isPhysicalRegister - Return true if the specified register number is in the physical register namespa...
void SetupMachineFunction(MachineFunction &MF)
This should be called when a new MachineFunction is being processed from runOnMachineFunction.
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
ARMFunctionInfo - This class is derived from MachineFunctionInfo and contains private ARM-specific in...
MCSymbol * GetBlockAddressSymbol(const BlockAddress *BA) const
Return the MCSymbol used to satisfy BlockAddress uses of the specified basic block.
bool PrintAsmOperand(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...
void EmitJumpTableAddrs(const MachineInstr *MI)
static const ARMMCExpr * createUpper16(const MCExpr *Expr, MCContext &Ctx)
MCSubtargetInfo - Generic base class for all target subtargets.
union llvm::MachineConstantPoolEntry::@30 Val
The constant itself.
MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation for MachO targets...
void EmitValue(const MCExpr *Value, unsigned Size, const SMLoc &Loc=SMLoc())
virtual MCSymbol * GetCPISymbol(unsigned CPID) const
Return the symbol for the specified constant pool entry.
unsigned getReg() const
getReg - Returns the register number.
unsigned getLabelId() const
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
unsigned char getPCAdjustment() const
unsigned HonorSignDependentRoundingFPMathOption
HonorSignDependentRoundingFPMath - This returns true when the -enable-sign-dependent-rounding-fp-math...
RegisterAsmPrinter - Helper template for registering a target specific assembly printer, for use in the target machine initialization function.
MO_NONLAZY - This is an independent flag, on a symbol operand "FOO" it represents a symbol which...
std::string ParseARMTriple(const Triple &TT, StringRef CPU)
static const unsigned FramePtr
This class implements an extremely fast bulk output stream that can only output to a stream...
Primary interface to the complete machine description for the target machine.
const std::vector< MachineConstantPoolEntry > & getConstants() const
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.
Address of indexed Constant in Constant Pool.
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml","ocaml 3.10-compatible collector")
unsigned getOriginalCPIdx(unsigned CloneIdx) const
ARMCP::ARMCPModifier getModifier() const
MCSymbol * GetExternalSymbolSymbol(StringRef Sym) const
Return the MCSymbol for the specified ExternalSymbol.
static MCOperand createImm(int64_t Val)
bool hasThumb2DSP() const
bool isTargetWindows() const
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx)
MO_HI16 - On a symbol operand, this represents a relocation containing higher 16 bit of the address...
virtual void switchVendor(StringRef Vendor)
bool empty() const
empty - Check if the string is empty.
FloatABI::ABIType FloatABIType
FloatABIType - This setting is set by -float-abi=xxx option is specfied on the command line...
virtual void emitTextAttribute(unsigned Attribute, StringRef String)
void EmitEndOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the end of their file...