50#define DEBUG_TYPE "asm-printer"
53 std::unique_ptr<MCStreamer> Streamer)
55 MCP(nullptr), InConstantPool(
false), OptimizationGoals(-1) {}
66 InConstantPool =
false;
93 assert(
Size &&
"C++ constructor pointer had zero size!");
96 assert(GV &&
"C++ constructor pointer was not a GlobalValue!");
106 if (PromotedGlobals.count(GV))
130 unsigned OptimizationGoal;
133 OptimizationGoal = 6;
134 else if (
F.hasMinSize())
136 OptimizationGoal = 4;
137 else if (
F.hasOptSize())
139 OptimizationGoal = 3;
142 OptimizationGoal = 2;
145 OptimizationGoal = 1;
148 OptimizationGoal = 5;
151 if (OptimizationGoals == -1)
152 OptimizationGoals = OptimizationGoal;
153 else if (OptimizationGoals != (
int)OptimizationGoal)
154 OptimizationGoals = 0;
157 bool Local =
F.hasLocalLinkage();
177 if (! ThumbIndirectPads.empty()) {
182 for (std::pair<unsigned, MCSymbol *> &TIP : ThumbIndirectPads) {
190 ThumbIndirectPads.clear();
228 if(ARM::GPRPairRegClass.
contains(Reg)) {
231 Reg =
TRI->getSubReg(Reg, ARM::gsub_0);
262 if (Subtarget->genExecuteOnly())
281GetARMJTIPICJumpTableLabel(
unsigned uid)
const {
292 if (ExtraCode && ExtraCode[0]) {
293 if (ExtraCode[1] != 0)
return true;
295 switch (ExtraCode[0]) {
304 if (
MI->getOperand(OpNum).isReg()) {
305 MCRegister Reg =
MI->getOperand(OpNum).getReg().asMCReg();
312 bool Lane0 =
TRI->getSubReg(SR, ARM::ssub_0) == Reg;
319 if (!
MI->getOperand(OpNum).isImm())
321 O << ~(
MI->getOperand(OpNum).getImm());
324 if (!
MI->getOperand(OpNum).isImm())
326 O << (
MI->getOperand(OpNum).getImm() & 0xffff);
329 if (!
MI->getOperand(OpNum).isReg())
337 if (ARM::GPRPairRegClass.
contains(RegBegin)) {
339 Register Reg0 =
TRI->getSubReg(RegBegin, ARM::gsub_0);
341 RegBegin =
TRI->getSubReg(RegBegin, ARM::gsub_1);
349 unsigned RegOps = OpNum + 1;
350 while (
MI->getOperand(RegOps).isReg()) {
365 if (!FlagsOP.
isImm())
373 if (
F.isUseOperandTiedToDef(TiedIdx)) {
375 unsigned OpFlags =
MI->getOperand(OpNum).getImm();
377 OpNum +=
F.getNumOperandRegisters() + 1;
386 const unsigned NumVals =
F.getNumOperandRegisters();
395 if (ExtraCode[0] ==
'Q')
401 if (
F.hasRegClassConstraint(RC) &&
402 ARM::GPRPairRegClass.hasSubClassEq(
TRI->getRegClass(RC))) {
410 TRI->getSubReg(MO.
getReg(), FirstHalf ? ARM::gsub_0 : ARM::gsub_1);
416 unsigned RegOp = FirstHalf ? OpNum : OpNum + 1;
417 if (RegOp >=
MI->getNumOperands())
429 if (!
MI->getOperand(OpNum).isReg())
431 Register Reg =
MI->getOperand(OpNum).getReg();
432 if (!ARM::QPRRegClass.
contains(Reg))
436 TRI->getSubReg(Reg, ExtraCode[0] ==
'e' ? ARM::dsub_0 : ARM::dsub_1);
451 if(!ARM::GPRPairRegClass.
contains(Reg))
453 Reg =
TRI->getSubReg(Reg, ARM::gsub_1);
465 unsigned OpNum,
const char *ExtraCode,
468 if (ExtraCode && ExtraCode[0]) {
469 if (ExtraCode[1] != 0)
return true;
471 switch (ExtraCode[0]) {
473 default:
return true;
475 if (!
MI->getOperand(OpNum).isReg())
483 assert(MO.
isReg() &&
"unexpected inline asm memory operand");
496 const bool WasThumb =
isThumb(StartInfo);
497 if (!EndInfo || WasThumb !=
isThumb(*EndInfo)) {
515 if (TT.isOSBinFormatELF())
520 if (!M.getModuleInlineAsm().empty() && TT.isThumb())
550 if (TT.isOSBinFormatMachO()) {
560 if (!Stubs.empty()) {
565 for (
auto &Stub : Stubs)
573 if (!Stubs.empty()) {
578 for (
auto &Stub : Stubs)
597 if (OptimizationGoals > 0 &&
601 OptimizationGoals = -1;
618 return F.getFnAttribute(Attr).getValueAsString() !=
Value;
627 StringRef AttrVal =
F.getFnAttribute(Attr).getValueAsString();
632void ARMAsmPrinter::emitAttributes() {
651 ArchFS = (
Twine(ArchFS) +
"," +
FS).str();
653 ArchFS = std::string(FS);
657 const ARMSubtarget STI(TT, std::string(CPU), ArchFS, ATM,
667 }
else if (STI.isRWPI()) {
702 if (!STI.hasVFP2Base()) {
712 }
else if (STI.hasVFP3Base()) {
729 "no-trapping-math",
"true") ||
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;
790 auto *PACValue = mdconst::extract_or_null<ConstantInt>(
791 SourceModule->getModuleFlag(
"sign-return-address"));
792 if (PACValue && PACValue->isOne()) {
796 if (!STI.hasPACBTI()) {
803 auto *BTIValue = mdconst::extract_or_null<ConstantInt>(
804 SourceModule->getModuleFlag(
"branch-target-enforcement"));
805 if (BTIValue && BTIValue->isOne()) {
809 if (!STI.hasPACBTI()) {
821 else if (STI.isR9Reserved())
835 +
"BF" +
Twine(FunctionNumber) +
"_" +
Twine(LabelId));
843 +
"PC" +
Twine(FunctionNumber) +
"_" +
Twine(LabelId));
868 unsigned char TargetFlags) {
884 if (!StubSym.getPointer())
890 "Windows is the only supported COFF target");
912 if (!StubSym.getPointer())
940 auto *ACPC = cast<ARMConstantPoolConstant>(ACPV);
941 for (
const auto *GV : ACPC->promotedGlobals()) {
942 if (!EmittedPromotedGlobalLabels.count(GV)) {
945 EmittedPromotedGlobalLabels.insert(GV);
956 cast<ARMConstantPoolConstant>(ACPV)->getBlockAddress();
959 const GlobalValue *GV = cast<ARMConstantPoolConstant>(ACPV)->getGV();
964 MCSym = GetARMGVSymbol(GV, TF);
970 auto Sym = cast<ARMConstantPoolSymbol>(ACPV)->getSymbol();
1010 MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
1018 const std::vector<MachineJumpTableEntry> &JT = MJTI->
getJumpTables();
1019 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
1056 MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
1061 const std::vector<MachineJumpTableEntry> &JT = MJTI->
getJumpTables();
1062 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
1069 .addExpr(MBBSymbolExpr)
1076 unsigned OffsetWidth) {
1077 assert((OffsetWidth == 1 || OffsetWidth == 2) &&
"invalid tbb/tbh width");
1084 MCSymbol *JTISymbol = GetARMJTIPICJumpTableLabel(JTI);
1089 const std::vector<MachineJumpTableEntry> &JT = MJTI->
getJumpTables();
1090 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
1096 for (
auto *
MBB : JTBBs) {
1132 const MCSymbol *BranchLabel)
const {
1142 BaseLabel = GetARMJTIPICJumpTableLabel(JTI);
1149 BaseLabel = BranchLabel;
1157 BaseLabel = BranchLabel;
1162 BaseLabel =
nullptr;
1169 return std::make_tuple(BaseLabel, BaseOffset, BranchLabel, EntrySize);
1172void ARMAsmPrinter::EmitUnwindingInstruction(
const MachineInstr *
MI) {
1174 "Only instruction which are involved into frame setup code are allowed");
1184 unsigned Opc =
MI->getOpcode();
1185 unsigned SrcReg, DstReg;
1190 SrcReg = DstReg = ARM::SP;
1194 case ARM::t2MOVTi16:
1215 DstReg =
MI->getOperand(0).getReg();
1218 SrcReg = ARM::FPSCR;
1219 DstReg =
MI->getOperand(0).getReg();
1221 case ARM::VMRS_FPEXC:
1222 SrcReg = ARM::FPEXC;
1223 DstReg =
MI->getOperand(0).getReg();
1226 SrcReg =
MI->getOperand(1).getReg();
1227 DstReg =
MI->getOperand(0).getReg();
1232 if (
MI->mayStore()) {
1234 assert(DstReg == ARM::SP &&
1235 "Only stack pointer as a destination reg is supported");
1239 unsigned StartOp = 2 + 2;
1241 unsigned NumOffset = 0;
1244 unsigned PadBefore = 0;
1247 unsigned PadAfter = 0;
1255 StartOp = 2; NumOffset = 2;
1257 case ARM::STMDB_UPD:
1258 case ARM::t2STMDB_UPD:
1259 case ARM::VSTMDDB_UPD:
1260 assert(SrcReg == ARM::SP &&
1261 "Only stack pointer as a source reg is supported");
1262 for (
unsigned i = StartOp, NumOps =
MI->getNumOperands() - NumOffset;
1275 "Pad registers must come before restored ones");
1289 case ARM::STR_PRE_IMM:
1290 case ARM::STR_PRE_REG:
1291 case ARM::t2STR_PRE:
1292 assert(
MI->getOperand(2).getReg() == ARM::SP &&
1293 "Only stack pointer as a source reg is supported");
1295 SrcReg = RemappedReg;
1299 case ARM::t2STRD_PRE:
1300 assert(
MI->getOperand(3).getReg() == ARM::SP &&
1301 "Only stack pointer as a source reg is supported");
1302 SrcReg =
MI->getOperand(1).getReg();
1304 SrcReg = RemappedReg;
1306 SrcReg =
MI->getOperand(2).getReg();
1308 SrcReg = RemappedReg;
1310 PadBefore = -
MI->getOperand(4).getImm() - 8;
1323 if (SrcReg == ARM::SP) {
1339 case ARM::t2ADDri12:
1340 case ARM::t2ADDspImm:
1341 case ARM::t2ADDspImm12:
1342 Offset = -
MI->getOperand(2).getImm();
1346 case ARM::t2SUBri12:
1347 case ARM::t2SUBspImm:
1348 case ARM::t2SUBspImm12:
1349 Offset =
MI->getOperand(2).getImm();
1352 Offset =
MI->getOperand(2).getImm()*4;
1356 Offset = -
MI->getOperand(2).getImm()*4;
1369 else if (DstReg == ARM::SP) {
1379 }
else if (DstReg == ARM::SP) {
1392 case ARM::VMRS_FPEXC:
1399 case ARM::tLDRpci: {
1402 unsigned CPI =
MI->getOperand(1).getIndex();
1406 assert(CPI != -1U &&
"Invalid constpool index");
1416 Offset =
MI->getOperand(1).getImm();
1419 case ARM::t2MOVTi16:
1420 Offset =
MI->getOperand(2).getImm();
1424 Offset =
MI->getOperand(2).getImm();
1428 assert(
MI->getOperand(3).getImm() == 8 &&
1429 "The shift amount is not equal to 8");
1430 assert(
MI->getOperand(2).getReg() ==
MI->getOperand(0).getReg() &&
1431 "The source register is not equal to the destination register");
1435 assert(
MI->getOperand(2).getReg() ==
MI->getOperand(0).getReg() &&
1436 "The source register is not equal to the destination register");
1437 Offset =
MI->getOperand(3).getImm();
1454#include "ARMGenMCPseudoLowering.inc"
1457 ARM_MC::verifyInstructionPredicates(
MI->getOpcode(),
1465 if (InConstantPool &&
MI->getOpcode() != ARM::CONSTPOOL_ENTRY) {
1467 InConstantPool =
false;
1473 EmitUnwindingInstruction(
MI);
1476 if (
MCInst OutInst; lowerPseudoInstExpansion(
MI, OutInst)) {
1482 "Pseudo flag setting opcode should be expanded early");
1485 unsigned Opc =
MI->getOpcode();
1487 case ARM::t2MOVi32imm:
llvm_unreachable(
"Should be lowered by thumb2it pass");
1488 case ARM::DBG_VALUE:
llvm_unreachable(
"Should be handled by generic printing");
1490 case ARM::tLEApcrel:
1491 case ARM::t2LEApcrel: {
1495 ARM::t2LEApcrel ? ARM::t2ADR
1496 : (
MI->getOpcode() == ARM::tLEApcrel ? ARM::tADR
1498 .
addReg(
MI->getOperand(0).getReg())
1501 .
addImm(
MI->getOperand(2).getImm())
1502 .
addReg(
MI->getOperand(3).getReg()));
1505 case ARM::LEApcrelJT:
1506 case ARM::tLEApcrelJT:
1507 case ARM::t2LEApcrelJT: {
1509 GetARMJTIPICJumpTableLabel(
MI->getOperand(1).getIndex());
1511 ARM::t2LEApcrelJT ? ARM::t2ADR
1512 : (
MI->getOpcode() == ARM::tLEApcrelJT ? ARM::tADR
1514 .
addReg(
MI->getOperand(0).getReg())
1517 .
addImm(
MI->getOperand(2).getImm())
1518 .
addReg(
MI->getOperand(3).getReg()));
1523 case ARM::BX_CALL: {
1533 assert(Subtarget->hasV4TOps());
1535 .addReg(
MI->getOperand(0).getReg()));
1538 case ARM::tBX_CALL: {
1539 if (Subtarget->hasV5TOps())
1550 for (std::pair<unsigned, MCSymbol *> &TIP : ThumbIndirectPads) {
1551 if (TIP.first == TReg) {
1552 TRegSym = TIP.second;
1559 ThumbIndirectPads.push_back(std::make_pair(TReg, TRegSym));
1569 case ARM::BMOVPCRX_CALL: {
1581 .addReg(
MI->getOperand(0).getReg())
1589 case ARM::BMOVPCB_CALL: {
1601 const unsigned TF =
Op.getTargetFlags();
1602 MCSymbol *GVSym = GetARMGVSymbol(GV, TF);
1611 case ARM::MOVi16_ga_pcrel:
1612 case ARM::t2MOVi16_ga_pcrel: {
1614 TmpInst.
setOpcode(
Opc == ARM::MOVi16_ga_pcrel? ARM::MOVi16 : ARM::t2MOVi16);
1617 unsigned TF =
MI->getOperand(1).getTargetFlags();
1619 MCSymbol *GVSym = GetARMGVSymbol(GV, TF);
1626 unsigned PCAdj = (
Opc == ARM::MOVi16_ga_pcrel) ? 8 : 4;
1645 case ARM::MOVTi16_ga_pcrel:
1646 case ARM::t2MOVTi16_ga_pcrel: {
1649 ? ARM::MOVTi16 : ARM::t2MOVTi16);
1653 unsigned TF =
MI->getOperand(2).getTargetFlags();
1655 MCSymbol *GVSym = GetARMGVSymbol(GV, TF);
1662 unsigned PCAdj = (
Opc == ARM::MOVTi16_ga_pcrel) ? 8 : 4;
1693 if (
MI->getOperand(1).isReg()) {
1695 MCInst.addReg(
MI->getOperand(1).getReg());
1698 const MCExpr *BranchTarget;
1699 if (
MI->getOperand(1).isMBB())
1702 else if (
MI->getOperand(1).isGlobal()) {
1705 GetARMGVSymbol(GV,
MI->getOperand(1).getTargetFlags()),
OutContext);
1706 }
else if (
MI->getOperand(1).isSymbol()) {
1713 MCInst.addExpr(BranchTarget);
1716 if (
Opc == ARM::t2BFic) {
1721 MCInst.addExpr(ElseLabel);
1722 MCInst.addImm(
MI->getOperand(3).getImm());
1724 MCInst.addImm(
MI->getOperand(2).getImm())
1725 .addReg(
MI->getOperand(3).getReg());
1731 case ARM::t2BF_LabelPseudo: {
1740 case ARM::tPICADD: {
1753 .addReg(
MI->getOperand(0).getReg())
1754 .
addReg(
MI->getOperand(0).getReg())
1774 .addReg(
MI->getOperand(0).getReg())
1776 .
addReg(
MI->getOperand(1).getReg())
1778 .
addImm(
MI->getOperand(3).getImm())
1779 .
addReg(
MI->getOperand(4).getReg())
1791 case ARM::PICLDRSH: {
1805 switch (
MI->getOpcode()) {
1808 case ARM::PICSTR: Opcode = ARM::STRrs;
break;
1809 case ARM::PICSTRB: Opcode = ARM::STRBrs;
break;
1810 case ARM::PICSTRH: Opcode = ARM::STRH;
break;
1811 case ARM::PICLDR: Opcode = ARM::LDRrs;
break;
1812 case ARM::PICLDRB: Opcode = ARM::LDRBrs;
break;
1813 case ARM::PICLDRH: Opcode = ARM::LDRH;
break;
1814 case ARM::PICLDRSB: Opcode = ARM::LDRSB;
break;
1815 case ARM::PICLDRSH: Opcode = ARM::LDRSH;
break;
1818 .addReg(
MI->getOperand(0).getReg())
1820 .
addReg(
MI->getOperand(1).getReg())
1823 .
addImm(
MI->getOperand(3).getImm())
1824 .
addReg(
MI->getOperand(4).getReg()));
1828 case ARM::CONSTPOOL_ENTRY: {
1829 if (Subtarget->genExecuteOnly())
1837 unsigned LabelId = (
unsigned)
MI->getOperand(0).getImm();
1838 unsigned CPIdx = (
unsigned)
MI->getOperand(1).getIndex();
1841 if (!InConstantPool) {
1843 InConstantPool =
true;
1855 case ARM::JUMPTABLE_ADDRS:
1858 case ARM::JUMPTABLE_INSTS:
1861 case ARM::JUMPTABLE_TBB:
1862 case ARM::JUMPTABLE_TBH:
1865 case ARM::t2BR_JT: {
1868 .addReg(
MI->getOperand(0).getReg())
1875 case ARM::t2TBH_JT: {
1876 unsigned Opc =
MI->getOpcode() == ARM::t2TBB_JT ? ARM::t2TBB : ARM::t2TBH;
1880 .addReg(
MI->getOperand(0).getReg())
1881 .
addReg(
MI->getOperand(1).getReg())
1888 case ARM::tTBH_JT: {
1890 bool Is8Bit =
MI->getOpcode() == ARM::tTBB_JT;
1893 assert(
MI->getOperand(1).isKill() &&
"We need the index register as scratch!");
1906 if (
Base == ARM::PC) {
1929 unsigned Opc = Is8Bit ? ARM::tLDRBi : ARM::tLDRHi;
1933 .addImm(Is8Bit ? 4 : 2)
1943 unsigned Opc = Is8Bit ? ARM::tLDRBr : ARM::tLDRHr;
1976 unsigned Opc =
MI->getOpcode() == ARM::BR_JTr ?
1977 ARM::MOVr : ARM::tMOVr;
1985 if (
Opc == ARM::MOVr)
1990 case ARM::BR_JTm_i12: {
2003 case ARM::BR_JTm_rs: {
2017 case ARM::BR_JTadd: {
2021 .addReg(
MI->getOperand(0).getReg())
2022 .
addReg(
MI->getOperand(1).getReg())
2055 case ARM::t2Int_eh_sjlj_setjmp:
2056 case ARM::t2Int_eh_sjlj_setjmp_nofp:
2057 case ARM::tInt_eh_sjlj_setjmp: {
2066 Register SrcReg =
MI->getOperand(0).getReg();
2067 Register ValReg =
MI->getOperand(1).getReg();
2107 .addExpr(SymbolExpr)
2124 case ARM::Int_eh_sjlj_setjmp_nofp:
2125 case ARM::Int_eh_sjlj_setjmp: {
2132 Register SrcReg =
MI->getOperand(0).getReg();
2133 Register ValReg =
MI->getOperand(1).getReg();
2184 case ARM::Int_eh_sjlj_longjmp: {
2189 Register SrcReg =
MI->getOperand(0).getReg();
2190 Register ScratchReg =
MI->getOperand(1).getReg();
2238 assert(Subtarget->hasV4TOps());
2246 case ARM::tInt_eh_sjlj_longjmp: {
2252 Register SrcReg =
MI->getOperand(0).getReg();
2253 Register ScratchReg =
MI->getOperand(1).getReg();
2318 case ARM::tInt_WIN_eh_sjlj_longjmp: {
2323 Register SrcReg =
MI->getOperand(0).getReg();
2348 case ARM::PATCHABLE_FUNCTION_ENTER:
2351 case ARM::PATCHABLE_FUNCTION_EXIT:
2354 case ARM::PATCHABLE_TAIL_CALL:
2357 case ARM::SpeculationBarrierISBDSBEndBB: {
2369 case ARM::t2SpeculationBarrierISBDSBEndBB: {
2385 case ARM::SpeculationBarrierSBEndBB: {
2392 case ARM::t2SpeculationBarrierSBEndBB: {
2400 case ARM::SEH_StackAlloc:
2402 MI->getOperand(1).getImm());
2405 case ARM::SEH_SaveRegs:
2406 case ARM::SEH_SaveRegs_Ret:
2408 MI->getOperand(1).getImm());
2411 case ARM::SEH_SaveSP:
2415 case ARM::SEH_SaveFRegs:
2417 MI->getOperand(1).getImm());
2420 case ARM::SEH_SaveLR:
2425 case ARM::SEH_Nop_Ret:
2429 case ARM::SEH_PrologEnd:
2433 case ARM::SEH_EpilogStart:
2437 case ARM::SEH_EpilogEnd:
2459LLVMInitializeARMAsmPrinter() {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void emitNonLazySymbolPointer(MCStreamer &OutStreamer, MCSymbol *StubLabel, MachineModuleInfoImpl::StubValueTy &MCSym)
static uint8_t getModifierSpecifier(ARMCP::ARMCPModifier Modifier)
static MCSymbol * getPICLabel(StringRef Prefix, unsigned FunctionNumber, unsigned LabelId, MCContext &Ctx)
static bool checkFunctionsAttributeConsistency(const Module &M, StringRef Attr, StringRef Value)
static bool isThumb(const MCSubtargetInfo &STI)
static MCSymbol * getBFLabel(StringRef Prefix, unsigned FunctionNumber, unsigned LabelId, MCContext &Ctx)
static bool checkDenormalAttributeConsistency(const Module &M, StringRef Attr, DenormalMode Value)
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define LLVM_EXTERNAL_VISIBILITY
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
Module.h This file contains the declarations for the Module class.
Register const TargetRegisterInfo * TRI
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file defines the SmallString class.
static const unsigned FramePtr
void emitJumpTableAddrs(const MachineInstr *MI)
void emitJumpTableTBInst(const MachineInstr *MI, unsigned OffsetWidth)
void emitFunctionBodyEnd() override
Targets can override this to emit stuff after the last basic block in the function.
bool runOnMachineFunction(MachineFunction &F) override
runOnMachineFunction - This uses the emitInstruction() method to print assembly for each instruction.
MCSymbol * GetCPISymbol(unsigned CPID) const override
Return the symbol for the specified constant pool entry.
void printOperand(const MachineInstr *MI, int OpNum, raw_ostream &O)
void emitStartOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the start of their fi...
ARMAsmPrinter(TargetMachine &TM, std::unique_ptr< MCStreamer > Streamer)
void emitFunctionEntryLabel() override
EmitFunctionEntryLabel - Emit the label that is the entrypoint for the function.
void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo, const MCSubtargetInfo *EndInfo) const override
Let the target do anything it needs to do after emitting inlineasm.
void LowerPATCHABLE_FUNCTION_EXIT(const MachineInstr &MI)
void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) override
EmitMachineConstantPoolValue - Print a machine constantpool value to the .s file.
bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNum, const char *ExtraCode, raw_ostream &O) override
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant.
void emitXXStructor(const DataLayout &DL, const Constant *CV) override
Targets can override this to change how global constants that are part of a C++ static/global constru...
void LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI)
void LowerPATCHABLE_TAIL_CALL(const MachineInstr &MI)
void emitEndOfAsmFile(Module &M) override
This virtual method can be overridden by targets that want to emit something at the end of their file...
std::tuple< const MCSymbol *, uint64_t, const MCSymbol *, codeview::JumpTableEntrySize > getCodeViewJumpTableInfo(int JTI, const MachineInstr *BranchInstr, const MCSymbol *BranchLabel) const override
Gets information required to create a CodeView debug symbol for a jump table.
void emitJumpTableInsts(const MachineInstr *MI)
const ARMBaseTargetMachine & getTM() const
void emitGlobalVariable(const GlobalVariable *GV) override
Emit the specified global variable to the .s file.
bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, const char *ExtraCode, raw_ostream &O) override
Print the specified operand of MI, an INLINEASM instruction, using the specified assembler variant as...
void emitInstruction(const MachineInstr *MI) override
Targets should implement this to emit instructions.
void PrintSymbolOperand(const MachineOperand &MO, raw_ostream &O) override
Print the MachineOperand as a symbol.
bool isLittleEndian() const
ARMConstantPoolValue - ARM specific constantpool value.
bool isPromotedGlobal() const
unsigned char getPCAdjustment() const
bool isMachineBasicBlock() const
bool isGlobalValue() const
ARMCP::ARMCPModifier getModifier() const
bool mustAddCurrentAddress() const
unsigned getLabelId() const
bool isBlockAddress() const
ARMFunctionInfo - This class is derived from MachineFunctionInfo and contains private ARM-specific in...
SmallPtrSet< const GlobalVariable *, 2 > & getGlobalsPromotedToConstantPool()
DenseMap< unsigned, unsigned > EHPrologueRemappedRegs
bool isThumbFunction() const
bool isCmseNSEntryFunction() const
DenseMap< unsigned, unsigned > EHPrologueOffsetInRegs
unsigned getOriginalCPIdx(unsigned CloneIdx) const
static const char * getRegisterName(MCRegister Reg, unsigned AltIdx=ARM::NoRegAltName)
bool isTargetMachO() const
bool isTargetAEABI() const
bool isThumb1Only() const
MCPhysReg getFramePointerReg() const
bool isTargetWindows() const
bool isTargetEHABICompatible() const
bool isGVIndirectSymbol(const GlobalValue *GV) const
True if the GV will be accessed via an indirect symbol.
bool isTargetDarwin() const
bool isTargetCOFF() const
bool isTargetGNUAEABI() const
bool isTargetMuslAEABI() const
void emitTargetAttributes(const MCSubtargetInfo &STI)
Emit the build attributes that only depend on the hardware that we expect.
virtual void emitSetFP(MCRegister FpReg, MCRegister SpReg, int64_t Offset=0)
virtual void finishAttributeSection()
virtual void emitMovSP(MCRegister Reg, int64_t Offset=0)
virtual void emitARMWinCFISaveSP(unsigned Reg)
virtual void emitInst(uint32_t Inst, char Suffix='\0')
virtual void emitARMWinCFISaveLR(unsigned Offset)
virtual void emitTextAttribute(unsigned Attribute, StringRef String)
virtual void emitARMWinCFIAllocStack(unsigned Size, bool Wide)
virtual void emitARMWinCFISaveRegMask(unsigned Mask, bool Wide)
virtual void emitRegSave(const SmallVectorImpl< MCRegister > &RegList, bool isVector)
virtual void emitARMWinCFIEpilogEnd()
virtual void emitARMWinCFIPrologEnd(bool Fragment)
virtual void switchVendor(StringRef Vendor)
virtual void emitCode16()
virtual void emitARMWinCFISaveFRegs(unsigned First, unsigned Last)
virtual void emitSyntaxUnified()
virtual void emitARMWinCFIEpilogStart(unsigned Condition)
virtual void emitPad(int64_t Offset)
virtual void emitAttribute(unsigned Attribute, unsigned Value)
virtual void emitARMWinCFINop(bool Wide)
This class is intended to be used as a driving class for all asm writers.
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
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...
MCSymbol * getSymbol(const GlobalValue *GV) const
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
virtual void emitGlobalVariable(const GlobalVariable *GV)
Emit the specified global variable to the .s file.
TargetMachine & TM
Target machine description.
void emitXRayTable()
Emit a table with all XRay instrumentation points.
MCSymbol * getMBBExceptionSym(const MachineBasicBlock &MBB)
const MCAsmInfo * MAI
Target Asm Printer information.
MachineFunction * MF
The current machine function.
virtual void SetupMachineFunction(MachineFunction &MF)
This should be called when a new MachineFunction is being processed from runOnMachineFunction.
void emitFunctionBody()
This method emits the body and trailer for a function.
virtual void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const
This emits linkage information about GVSym based on GV, if this is supported by the target.
unsigned getFunctionNumber() const
Return a unique ID for the current function.
void printOffset(int64_t Offset, raw_ostream &OS) const
This is just convenient handler for printing offsets.
void emitGlobalConstant(const DataLayout &DL, const Constant *CV, AliasMapTy *AliasList=nullptr)
EmitGlobalConstant - Print a general LLVM constant to the .s file.
MCSymbol * getSymbolPreferLocal(const GlobalValue &GV) const
Similar to getSymbol() but preferred for references.
MCSymbol * CurrentFnSym
The symbol for the current function.
MachineModuleInfo * MMI
This is a pointer to the current MachineModuleInfo.
void emitAlignment(Align Alignment, const GlobalObject *GV=nullptr, unsigned MaxBytesToEmit=0) const
Emit an alignment directive to the specified power of two boundary.
MCContext & OutContext
This is the context for the output file that we are streaming.
bool isPositionIndependent() const
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV) const
MCSymbol * GetBlockAddressSymbol(const BlockAddress *BA) const
Return the MCSymbol used to satisfy BlockAddress uses of the specified basic block.
const DataLayout & getDataLayout() const
Return information about data layout.
virtual void emitFunctionEntryLabel()
EmitFunctionEntryLabel - Emit the label that is the entrypoint for the function.
MCSymbol * GetExternalSymbolSymbol(const Twine &Sym) const
Return the MCSymbol for the specified ExternalSymbol.
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.
The address of a basic block.
This is an important base class in LLVM.
const Constant * stripPointerCasts() const
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
TypeSize getTypeAllocSize(Type *Ty) const
Returns the offset in bytes between successive objects of the specified type, including alignment pad...
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
bool hasInternalLinkage() const
ExceptionHandling getExceptionHandlingType() const
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
static const MCBinaryExpr * createDiv(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Base class for the full range of assembler expressions which are needed for parsing.
MCInstBuilder & addReg(MCRegister Reg)
Add a new register operand.
MCInstBuilder & addImm(int64_t Val)
Add a new integer immediate operand.
MCInstBuilder & addExpr(const MCExpr *Val)
Add a new MCExpr operand.
Instances of this class represent a single low-level machine instruction.
void addOperand(const MCOperand Op)
void setOpcode(unsigned Op)
MCSection * getThreadLocalPointerSection() const
MCSection * getNonLazySymbolPointerSection() const
static MCOperand createExpr(const MCExpr *Val)
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
Wrapper class representing physical registers. Should be passed by value.
Streaming machine code generation interface.
virtual bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute)=0
Add the given Attribute to Symbol.
MCContext & getContext() const
void emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
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.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) 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 ...
LLVM_ABI void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
StringRef getName() const
getName - Get the symbol name.
Target specific streamer interface.
LLVM_ABI MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
This class is a data container for one entry in a MachineConstantPool.
union llvm::MachineConstantPoolEntry::@205 Val
The constant itself.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
MachineConstantPoolValue * MachineCPVal
const Constant * ConstVal
Abstract base class for all machine specific constantpool value subclasses.
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
const std::vector< MachineConstantPoolEntry > & getConstants() const
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
const MachineBasicBlock & front() const
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
const std::vector< MachineJumpTableEntry > & getJumpTables() const
MachineModuleInfoCOFF - This is a MachineModuleInfoImpl implementation for COFF targets.
StubValueTy & getGVStubEntry(MCSymbol *Sym)
std::vector< std::pair< MCSymbol *, StubValueTy > > SymbolListTy
MachineModuleInfoMachO - This is a MachineModuleInfoImpl implementation for MachO targets.
SymbolListTy GetThreadLocalGVStubList()
StubValueTy & getGVStubEntry(MCSymbol *Sym)
StubValueTy & getThreadLocalGVStubEntry(MCSymbol *Sym)
SymbolListTy GetGVStubList()
Accessor methods to return the set of stubs in sorted order.
const Module * getModule() const
Ty & getObjFileInfo()
Keep track of various per-module pieces of information for backends that would like to do so.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
const GlobalValue * getGlobal() const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
unsigned getTargetFlags() const
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
Register getReg() const
getReg - Returns the register number.
@ MO_Immediate
Immediate operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_GlobalAddress
Address of a global value.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_Register
Register operand.
int64_t getOffset() const
Return the offset from the symbol in this operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
A Module instance is used to store all the information related to an LLVM module.
virtual void print(raw_ostream &OS, const Module *M) const
print - Print out the internal state of the pass.
PointerIntPair - This class implements a pair of a pointer and small integer.
PointerTy getPointer() const
Wrapper class representing virtual and physical registers.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Primary interface to the complete machine description for the target machine.
CodeGenOptLevel getOptLevel() const
Returns the optimization level: None, Less, Default, or Aggressive.
const Triple & getTargetTriple() const
StringRef getTargetFeatureString() const
StringRef getTargetCPU() const
unsigned UnsafeFPMath
UnsafeFPMath - This flag is enabled when the -enable-unsafe-fp-math flag is specified on the command ...
FloatABI::ABIType FloatABIType
FloatABIType - This setting is set by -float-abi=xxx option is specfied on the command line.
unsigned NoInfsFPMath
NoInfsFPMath - This flag is enabled when the -enable-no-infs-fp-math flag is specified on the command...
unsigned HonorSignDependentRoundingFPMathOption
HonorSignDependentRoundingFPMath - This returns true when the -enable-sign-dependent-rounding-fp-math...
unsigned NoNaNsFPMath
NoNaNsFPMath - This flag is enabled when the -enable-no-nans-fp-math flag is specified on the command...
unsigned NoTrappingFPMath
NoTrappingFPMath - This flag is enabled when the -enable-no-trapping-fp-math is specified on the comm...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TypeSize getRegSizeInBits(const TargetRegisterClass &RC) const
Return the size in bits of a register from class RC.
virtual Register getFrameRegister(const MachineFunction &MF) const =0
Debug information queries.
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an SmallVector or SmallString.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ SECREL
Thread Pointer Offset.
@ GOT_PREL
Thread Local Storage (General Dynamic Mode)
@ SBREL
Section Relative (Windows TLS)
@ GOTTPOFF
Global Offset Table, PC Relative.
@ TPOFF
Global Offset Table, Thread Pointer Offset.
@ MO_LO16
MO_LO16 - On a symbol operand, this represents a relocation containing lower 16 bit of the address.
@ MO_LO_0_7
MO_LO_0_7 - On a symbol operand, this represents a relocation containing bits 0 through 7 of the addr...
@ MO_LO_8_15
MO_LO_8_15 - On a symbol operand, this represents a relocation containing bits 8 through 15 of the ad...
@ MO_NONLAZY
MO_NONLAZY - This is an independent flag, on a symbol operand "FOO" it represents a symbol which,...
@ MO_HI_8_15
MO_HI_8_15 - On a symbol operand, this represents a relocation containing bits 24 through 31 of the a...
@ MO_HI16
MO_HI16 - On a symbol operand, this represents a relocation containing higher 16 bit of the address.
@ MO_DLLIMPORT
MO_DLLIMPORT - On a symbol operand, this represents that the reference to the symbol is for an import...
@ MO_HI_0_7
MO_HI_0_7 - On a symbol operand, this represents a relocation containing bits 16 through 23 of the ad...
@ MO_COFFSTUB
MO_COFFSTUB - On a symbol operand "FOO", this indicates that the reference is actually to the "....
std::string ParseARMTriple(const Triple &TT, StringRef CPU)
const MCSpecifierExpr * createLower16(const MCExpr *Expr, MCContext &Ctx)
const MCSpecifierExpr * createUpper16(const MCExpr *Expr, MCContext &Ctx)
SymbolStorageClass
Storage class tells where and what the symbol represents.
@ IMAGE_SYM_CLASS_EXTERNAL
External symbol.
@ IMAGE_SYM_CLASS_STATIC
Static.
@ IMAGE_SYM_DTYPE_FUNCTION
A function that returns a base type.
@ SCT_COMPLEX_TYPE_SHIFT
Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
@ C
The default llvm calling convention, compatible with C.
Reg
All possible values of the reg field in the ModR/M byte.
This is an optimization pass for GlobalISel generic memory operations.
Target & getTheThumbBETarget()
@ MCDR_DataRegionEnd
.end_data_region
@ MCDR_DataRegion
.data_region
@ MCDR_DataRegionJT8
.data_region jt8
@ MCDR_DataRegionJT32
.data_region jt32
@ MCDR_DataRegionJT16
.data_region jt16
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
void LowerARMMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, ARMAsmPrinter &AP)
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
DenormalMode parseDenormalFPAttribute(StringRef Str)
Returns the denormal mode to use for inputs and outputs.
Target & getTheARMLETarget()
unsigned convertAddSubFlagsOpcode(unsigned OldOpc)
Map pseudo instructions that imply an 'S' bit onto real opcodes.
@ MCSA_IndirectSymbol
.indirect_symbol (MachO)
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function
Target & getTheARMBETarget()
Target & getTheThumbLETarget()
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Represent subnormal handling kind for floating point instruction inputs and outputs.
static constexpr DenormalMode getPositiveZero()
static constexpr DenormalMode getPreserveSign()
RegisterAsmPrinter - Helper template for registering a target specific assembly printer,...