Lines Matching +full:mii +full:- +full:rt

1 //===-- PPCAsmPrinter.cpp - Print machine instrs to PowerPC assembly ------===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 // of machine-dependent LLVM code to PowerPC assembly language. This printer is
16 //===----------------------------------------------------------------------===//
99 "aix-ssp-tb-bit", cl::init(false),
161 // non-TOC-based local-exec variables.
218 /// PPCLinuxAsmPrinter - PowerPC assembly printer, customized for Linux
252 // This is used for AIX's extra-label-at-definition aliasing strategy.
269 if (MAI->isLittleEndian()) in PPCAIXAsmPrinter()
271 "cannot create AIX PPC Assembly Printer for a little-endian target"); in PPCAIXAsmPrinter()
312 getSymbol(GV)->print(O, MAI); in PrintSymbolOperand()
319 const MachineOperand &MO = MI->getOperand(OpNo); in printOperand()
327 // FIXME - What about special registers used in mfspr/mtspr? in printOperand()
336 MO.getMBB()->getSymbol()->print(O, MAI); in printOperand()
343 GetBlockAddressSymbol(MO.getBlockAddress())->print(O, MAI); in printOperand()
356 /// PrintAsmOperand - Print out an operand for an inline asm expression.
370 if (!MI->getOperand(OpNo).isReg() || in PrintAsmOperand()
371 OpNo+1 == MI->getNumOperands() || in PrintAsmOperand()
372 !MI->getOperand(OpNo+1).isReg()) in PrintAsmOperand()
374 ++OpNo; // Return the high-part. in PrintAsmOperand()
379 if (MI->getOperand(OpNo).isImm()) in PrintAsmOperand()
383 if(!MI->getOperand(OpNo).isReg()) in PrintAsmOperand()
387 Register Reg = MI->getOperand(OpNo).getReg(); in PrintAsmOperand()
389 Reg = PPC::VSX32 + (Reg - PPC::V0); in PrintAsmOperand()
391 Reg = PPC::VSX32 + (Reg - PPC::VF0); in PrintAsmOperand()
420 case 'y': // A memory reference for an X-form instruction in PrintAsmMemoryOperand()
427 if (MI->getOperand(OpNo).isImm()) in PrintAsmMemoryOperand()
435 // have a value in -16(r1), we will generate a load into r<n> in PrintAsmMemoryOperand()
438 assert(MI->getOperand(OpNo).isReg()); in PrintAsmMemoryOperand()
443 assert(MI->getOperand(OpNo).isReg()); in PrintAsmMemoryOperand()
496 XSym->setPerSymbolCodeModel(MCSymbolXCOFF::CM_Large); in setOptionalCodeModel()
499 XSym->setPerSymbolCodeModel(MCSymbolXCOFF::CM_Small); in setOptionalCodeModel()
506 /// lookUpOrCreateTOCEntry -- Given a symbol, look up whether a TOC entry
525 auto &Ctx = OutStreamer->getContext(); in LowerSTACKMAP()
527 OutStreamer->emitLabel(MILabel); in LowerSTACKMAP()
534 MachineBasicBlock::const_iterator MII(MI); in LowerSTACKMAP() local
535 ++MII; in LowerSTACKMAP()
537 if (MII == MBB.end() || MII->isCall() || in LowerSTACKMAP()
538 MII->getOpcode() == PPC::DBG_VALUE || in LowerSTACKMAP()
539 MII->getOpcode() == TargetOpcode::PATCHPOINT || in LowerSTACKMAP()
540 MII->getOpcode() == TargetOpcode::STACKMAP) in LowerSTACKMAP()
542 ++MII; in LowerSTACKMAP()
543 NumNOPBytes -= 4; in LowerSTACKMAP()
554 auto &Ctx = OutStreamer->getContext(); in LowerPATCHPOINT()
556 OutStreamer->emitLabel(MILabel); in LowerPATCHPOINT()
592 int TOCSaveOffset = Subtarget->getFrameLowering()->getTOCSaveOffset(); in LowerPATCHPOINT()
601 if (!Subtarget->isELFv2ABI()) { in LowerPATCHPOINT()
647 assert((NumBytes - EncodedBytes) % 4 == 0 && in LowerPATCHPOINT()
654 /// will create the csect and use the qual-name symbol instead of creating just
673 ->getQualNameSymbol(); in createMCSymbolForTlsGetAddr()
677 assert(Subtarget->isAIXABI() && in EmitAIXTlsCallHelper()
680 MCSymbol *TlsCall = createMCSymbolForTlsGetAddr(OutContext, MI->getOpcode()); in EmitAIXTlsCallHelper()
686 /// EmitTlsCall -- Given a GETtls[ld]ADDR[32] instruction, print a
693 assert(MI->getNumOperands() >= 3 && "Expecting at least 3 operands from MI"); in EmitTlsCall()
694 if (MI->getOperand(2).getTargetFlags() == PPCII::MO_GOT_TLSGD_PCREL_FLAG || in EmitTlsCall()
695 MI->getOperand(2).getTargetFlags() == PPCII::MO_GOT_TLSLD_PCREL_FLAG) { in EmitTlsCall()
699 const Module *M = MF->getFunction().getParent(); in EmitTlsCall()
701 assert(MI->getOperand(0).isReg() && in EmitTlsCall()
702 ((Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::X3) || in EmitTlsCall()
703 (!Subtarget->isPPC64() && MI->getOperand(0).getReg() == PPC::R3)) && in EmitTlsCall()
705 assert(MI->getOperand(1).isReg() && in EmitTlsCall()
706 ((Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::X3) || in EmitTlsCall()
707 (!Subtarget->isPPC64() && MI->getOperand(1).getReg() == PPC::R3)) && in EmitTlsCall()
710 if (Subtarget->isAIXABI()) { in EmitTlsCall()
715 Register VarOffsetReg = Subtarget->isPPC64() ? PPC::X4 : PPC::R4; in EmitTlsCall()
717 assert((MI->getOpcode() == PPC::GETtlsMOD32AIX || in EmitTlsCall()
718 MI->getOpcode() == PPC::GETtlsMOD64AIX || in EmitTlsCall()
719 (MI->getOperand(2).isReg() && in EmitTlsCall()
720 MI->getOperand(2).getReg() == VarOffsetReg)) && in EmitTlsCall()
728 if (Subtarget->is32BitELFABI() && isPositionIndependent()) in EmitTlsCall()
735 if (Kind == MCSymbolRefExpr::VK_PLT && Subtarget->isSecurePlt() && in EmitTlsCall()
736 M->getPICLevel() == PICLevel::BigPIC) in EmitTlsCall()
739 const MachineOperand &MO = MI->getOperand(2); in EmitTlsCall()
744 MCInstBuilder(Subtarget->isPPC64() ? Opcode in EmitTlsCall()
750 /// Map a machine operand for a TOC pseudo-machine instruction to its
778 GlobalValue::LinkageTypes Linkage = GlobalV->getLinkage(); in getTOCEntryTypeForMO()
796 /// EmitInstruction -- Print out a single PowerPC MI in Darwin syntax to
800 PPC_MC::verifyInstructionPredicates(MI->getOpcode(), in emitInstruction()
804 const bool IsPPC64 = Subtarget->isPPC64(); in emitInstruction()
805 const bool IsAIX = Subtarget->isAIXABI(); in emitInstruction()
806 const bool HasAIXSmallLocalTLS = Subtarget->hasAIXSmallLocalExecTLS() || in emitInstruction()
807 Subtarget->hasAIXSmallLocalDynamicTLS(); in emitInstruction()
808 const Module *M = MF->getFunction().getParent(); in emitInstruction()
809 PICLevel::Level PL = M->getPICLevel(); in emitInstruction()
813 if (!MI->isInlineAsm()) { in emitInstruction()
814 for (const MachineOperand &MO: MI->operands()) { in emitInstruction()
817 if (Subtarget->hasSPE()) { in emitInstruction()
828 llvm_unreachable("SPE register found in FPU-targeted code!"); in emitInstruction()
837 // Apply an offset to the TOC-based expression such that the adjusted in emitInstruction()
839 // or DS field) is the signed 16-bit truncation of the original notional in emitInstruction()
842 // by AIX ld -r. in emitInstruction()
844 OriginalOffset - llvm::SignExtend32<16>(OriginalOffset); in emitInstruction()
846 Expr, MCConstantExpr::create(-Adjustment, OutContext), OutContext); in emitInstruction()
853 MCSymbolRefExpr::VariantKind::VK_None) -> const MCExpr * { in emitInstruction()
859 (TOCEntryIter - TOC.begin()) * EntryByteSize; in emitInstruction()
868 // For TLS initial-exec and local-exec accesses on AIX, we have one TOC in emitInstruction()
881 // On AIX, TLS model opt may have turned local-dynamic accesses into in emitInstruction()
882 // initial-exec accesses. in emitInstruction()
883 PPCFunctionInfo *FuncInfo = MF->getInfo<PPCFunctionInfo>(); in emitInstruction()
885 FuncInfo->isAIXFuncUseTLSIEForLD()) { in emitInstruction()
890 llvm_unreachable("Only expecting local-exec or initial-exec accesses!"); in emitInstruction()
899 // For local-dynamic TLS access on AIX, we have one TOC entry for the symbol in emitInstruction()
909 // Lower multi-instruction pseudo operations. in emitInstruction()
910 switch (MI->getOpcode()) { in emitInstruction()
913 assert(!Subtarget->isAIXABI() && in emitInstruction()
917 if (MAI->isLittleEndian()) in emitInstruction()
919 const Function &F = MF->getFunction(); in emitInstruction()
921 (void)F.getFnAttribute("patchable-function-entry") in emitInstruction()
938 // Into this: bl _GLOBAL_OFFSET_TABLE_@local-4 in emitInstruction()
939 // _GLOBAL_OFFSET_TABLE_@local-4 (instruction preceding in emitInstruction()
962 MCSymbol *PICBase = MF->getPICBaseSymbol(); in emitInstruction()
972 OutStreamer->emitLabel(PICBase); in emitInstruction()
976 // Transform %rd = UpdateGBR(%rt, %ri) in emitInstruction()
977 // Into: lwz %rt, .L0$poff - .L0$pb(%ri) in emitInstruction()
978 // add %rd, %rt, %ri in emitInstruction()
980 // addis r30, r30, {.LTOC,_GLOBAL_OFFSET_TABLE} - .L0$pb@ha in emitInstruction()
981 // addi r30, r30, {.LTOC,_GLOBAL_OFFSET_TABLE} - .L0$pb@l in emitInstruction()
984 if (Subtarget->isSecurePlt() && isPositionIndependent() ) { in emitInstruction()
987 M->getPICLevel() == PICLevel::SmallPIC ? "_GLOBAL_OFFSET_TABLE_" in emitInstruction()
990 MCSymbolRefExpr::create(MF->getPICBaseSymbol(), OutContext); in emitInstruction()
1007 MF->getInfo<PPCFunctionInfo>()->getPICOffsetSymbol(*MF); in emitInstruction()
1012 MCSymbolRefExpr::create(MF->getPICBaseSymbol(), in emitInstruction()
1018 // Step 1: lwz %rt, .L$poff - .L$pb(%ri) in emitInstruction()
1040 const MachineOperand &MO = MI->getOperand(1); in emitInstruction()
1070 // relative to the toc-base. in emitInstruction()
1074 "This pseudo should only be selected for 32-bit small code model."); in emitInstruction()
1080 OutStreamer->getCommentOS() << MO << '\n'; in emitInstruction()
1086 // '.LTOC' to manifest the toc-relative offset. in emitInstruction()
1105 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1128 const MachineOperand &MO = MI->getOperand(1); in emitInstruction()
1151 OutStreamer->getCommentOS() << MO << '\n'; in emitInstruction()
1156 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1162 "This pseudo should only be selected for 32-bit large code model on" in emitInstruction()
1179 // If the symbol does not have the toc-data attribute, then we create the in emitInstruction()
1180 // TOC entry on AIX. If the toc-data attribute is used, the TOC entry in emitInstruction()
1189 return GV->hasAttribute("toc-data"); in emitInstruction()
1201 const MachineOperand &MO = MI->getOperand(1); in emitInstruction()
1207 "This pseudo should only be selected for 32-bit large code model on" in emitInstruction()
1244 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1253 MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal()); in emitInstruction()
1287 const MachineOperand &MO = MI->getOperand(1); in emitInstruction()
1293 (!MO.isGlobal() || Subtarget->isGVIndirectSymbol(MO.getGlobal())) && in emitInstruction()
1317 unsigned Op = MI->getOpcode(); in emitInstruction()
1319 // Change the opcode to load address for toc-data. in emitInstruction()
1320 // ADDItocL is only used for 32-bit toc-data on AIX and will always use LA. in emitInstruction()
1324 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1328 assert(!(MO.isGlobal() && Subtarget->isGVIndirectSymbol(MO.getGlobal())) && in emitInstruction()
1346 assert(IsPPC64 && "Not supported for 32-bit PowerPC"); in emitInstruction()
1347 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1354 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1355 .addReg(MI->getOperand(1).getReg()) in emitInstruction()
1366 const MachineOperand &MO = MI->getOperand(1); in emitInstruction()
1391 OutStreamer->emitLabel(GOTRef); in emitInstruction()
1392 OutStreamer->emitValue(OffsExpr, 4); in emitInstruction()
1393 OutStreamer->emitLabel(NextInstr); in emitInstruction()
1395 .addReg(MI->getOperand(0).getReg())); in emitInstruction()
1397 .addReg(MI->getOperand(1).getReg()) in emitInstruction()
1399 .addReg(MI->getOperand(0).getReg())); in emitInstruction()
1401 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1402 .addReg(MI->getOperand(1).getReg()) in emitInstruction()
1403 .addReg(MI->getOperand(0).getReg())); in emitInstruction()
1414 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1417 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1418 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1425 assert(IsPPC64 && "Not supported for 32-bit PowerPC"); in emitInstruction()
1426 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1433 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1434 .addReg(MI->getOperand(1).getReg()) in emitInstruction()
1444 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1453 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1454 .addReg(MI->getOperand(1).getReg()) in emitInstruction()
1487 assert(IsPPC64 && "Not supported for 32-bit PowerPC"); in emitInstruction()
1488 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1495 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1496 .addReg(MI->getOperand(1).getReg()) in emitInstruction()
1506 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1515 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1516 .addReg(MI->getOperand(1).getReg()) in emitInstruction()
1536 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1545 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1546 .addReg(MI->getOperand(1).getReg()) in emitInstruction()
1553 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1559 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1560 .addReg(MI->getOperand(1).getReg()) in emitInstruction()
1571 const MachineOperand &MO = MI->getOperand(2); in emitInstruction()
1579 .addReg(MI->getOperand(0).getReg()) in emitInstruction()
1580 .addReg(MI->getOperand(1).getReg()) in emitInstruction()
1586 if (!Subtarget->hasMFOCRF()) { in emitInstruction()
1590 MI->getOpcode() == PPC::MFOCRF ? PPC::MFCR : PPC::MFCR8; in emitInstruction()
1591 OutStreamer->AddComment(PPCInstPrinter:: in emitInstruction()
1592 getRegisterName(MI->getOperand(1).getReg())); in emitInstruction()
1594 .addReg(MI->getOperand(0).getReg())); in emitInstruction()
1600 if (!Subtarget->hasMFOCRF()) { in emitInstruction()
1604 MI->getOpcode() == PPC::MTOCRF ? PPC::MTCRF : PPC::MTCRF8; in emitInstruction()
1606 ->getEncodingValue(MI->getOperand(0).getReg()); in emitInstruction()
1607 OutStreamer->AddComment(PPCInstPrinter:: in emitInstruction()
1608 getRegisterName(MI->getOperand(0).getReg())); in emitInstruction()
1611 .addReg(MI->getOperand(1).getReg())); in emitInstruction()
1621 unsigned OpNum = (MI->getOpcode() == PPC::STD) ? 2 : 1; in emitInstruction()
1622 // For non-TOC-based local-exec TLS accesses with non-zero offsets, the in emitInstruction()
1625 for (const MachineOperand &TempMO : MI->operands()) { in emitInstruction()
1631 const MachineOperand &MO = MI->getOperand(OpNum); in emitInstruction()
1633 const DataLayout &DL = MO.getGlobal()->getDataLayout(); in emitInstruction()
1634 if (MO.getGlobal()->getPointerAlignment(DL) < 4) in emitInstruction()
1635 llvm_unreachable("Global must be word-aligned for LD, STD, LWA!"); in emitInstruction()
1639 // non-TOC-based local-exec sequence or to process the instruction normally. in emitInstruction()
1661 // A faster non-TOC-based local-[exec|dynamic] sequence is represented by in emitInstruction()
1667 bool IsMIADDI8 = MI->getOpcode() == PPC::ADDI8; in emitInstruction()
1669 const MachineOperand &MO = MI->getOperand(OpNum); in emitInstruction()
1706 // For non-TOC-based local-[exec|dynamic] variables that have a non-zero offset,
1707 // we need to create a new MCExpr that adds the non-zero offset to the address
1708 // of the local-[exec|dynamic] variable that will be used in either an addi,
1710 // between [-32768, 32768), so if the TLS address + its non-zero offset is
1715 // Non-zero offsets (for loads, stores or `addi`) require additional handling. in getAdjustedFasterLocalExpr()
1724 "Only local-[exec|dynamic] accesses are handled!"); in getAdjustedFasterLocalExpr()
1726 bool IsGlobalADeclaration = GValue->isDeclarationForLinker(); in getAdjustedFasterLocalExpr()
1728 // in the TLS variable-to-address mapping. All TLS variables should exist in getAdjustedFasterLocalExpr()
1734 "variable-to-address map!"); in getAdjustedFasterLocalExpr()
1737 IsGlobalADeclaration ? 0 : TLSVarsMapEntryIter->second; in getAdjustedFasterLocalExpr()
1741 // non-zero offset to the TLS variable address. in getAdjustedFasterLocalExpr()
1756 // TLSVar@le + Offset - Delta in getAdjustedFasterLocalExpr()
1759 // Check that the total instruction displacement fits within [-32768,32768). in getAdjustedFasterLocalExpr()
1760 [[maybe_unused]] ptrdiff_t InstDisp = TLSVarAddress + Offset - Delta; in getAdjustedFasterLocalExpr()
1762 ((InstDisp < 32768) && (InstDisp >= -32768)) && in getAdjustedFasterLocalExpr()
1763 "Expecting the instruction displacement for local-[exec|dynamic] TLS " in getAdjustedFasterLocalExpr()
1764 "variables to be between [-32768, 32768)!"); in getAdjustedFasterLocalExpr()
1766 Expr, MCConstantExpr::create(-Delta, OutContext), OutContext); in getAdjustedFasterLocalExpr()
1774 Metadata *MD = M.getModuleFlag("float-abi"); in emitGNUAttributes()
1778 StringRef flt = FloatABI->getString(); in emitGNUAttributes()
1779 // TODO: Support emitting soft-fp and hard double/single attributes. in emitGNUAttributes()
1781 OutStreamer->emitGNUAttribute(Tag_GNU_Power_ABI_FP, in emitGNUAttributes()
1785 OutStreamer->emitGNUAttribute(Tag_GNU_Power_ABI_FP, in emitGNUAttributes()
1789 OutStreamer->emitGNUAttribute(Tag_GNU_Power_ABI_FP, in emitGNUAttributes()
1795 if (!Subtarget->isPPC64()) in emitInstruction()
1798 switch (MI->getOpcode()) { in emitInstruction()
1805 // std 0, -8(1) in emitInstruction()
1811 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number in emitInstruction()
1814 if (!MAI->isLittleEndian()) in emitInstruction()
1818 OutStreamer->emitLabel(BeginOfSled); in emitInstruction()
1825 MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1)); in emitInstruction()
1833 OutStreamer->emitLabel(EndOfSled); in emitInstruction()
1838 unsigned RetOpcode = MI->getOperand(0).getImm(); in emitInstruction()
1841 for (const auto &MO : llvm::drop_begin(MI->operands())) { in emitInstruction()
1871 // std 0, -8(1) in emitInstruction()
1878 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number in emitInstruction()
1885 static_cast<PPC::Predicate>(MI->getOperand(1).getImm()))) in emitInstruction()
1886 .addReg(MI->getOperand(2).getReg()) in emitInstruction()
1895 // std 0, -8(1) in emitInstruction()
1901 // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number in emitInstruction()
1903 OutStreamer->emitCodeAlignment(Align(8), &getSubtargetInfo()); in emitInstruction()
1905 OutStreamer->emitLabel(BeginOfSled); in emitInstruction()
1910 MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1)); in emitInstruction()
1920 OutStreamer->emitLabel(FallthroughLabel); in emitInstruction()
1938 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); in emitStartOfAsmFile()
1939 TS->emitAbiVersion(2); in emitStartOfAsmFile()
1949 OutStreamer->switchSection(OutContext.getELFSection( in emitStartOfAsmFile()
1955 OutStreamer->emitLabel(CurrentPos); in emitStartOfAsmFile()
1964 OutStreamer->emitAssignment(TOCSym, tocExpr); in emitStartOfAsmFile()
1966 OutStreamer->switchSection(getObjFileLowering().getTextSection()); in emitStartOfAsmFile()
1970 // linux/ppc32 - Normal entry label. in emitFunctionEntryLabel()
1971 if (!Subtarget->isPPC64() && in emitFunctionEntryLabel()
1973 MF->getFunction().getParent()->getPICLevel() == PICLevel::SmallPIC)) in emitFunctionEntryLabel()
1976 if (!Subtarget->isPPC64()) { in emitFunctionEntryLabel()
1977 const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>(); in emitFunctionEntryLabel()
1978 if (PPCFI->usesPICBase() && !Subtarget->isSecurePlt()) { in emitFunctionEntryLabel()
1979 MCSymbol *RelocSymbol = PPCFI->getPICOffsetSymbol(*MF); in emitFunctionEntryLabel()
1980 MCSymbol *PICBase = MF->getPICBaseSymbol(); in emitFunctionEntryLabel()
1981 OutStreamer->emitLabel(RelocSymbol); in emitFunctionEntryLabel()
1989 OutStreamer->emitValue(OffsExpr, 4); in emitFunctionEntryLabel()
1990 OutStreamer->emitLabel(CurrentFnSym); in emitFunctionEntryLabel()
1996 // ELFv2 ABI - Normal entry label. in emitFunctionEntryLabel()
1997 if (Subtarget->isELFv2ABI()) { in emitFunctionEntryLabel()
2000 // full 8-byte offset to the TOC in memory immediately preceding in emitFunctionEntryLabel()
2003 && !MF->getRegInfo().use_empty(PPC::X2)) { in emitFunctionEntryLabel()
2004 const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>(); in emitFunctionEntryLabel()
2007 MCSymbol *GlobalEPSymbol = PPCFI->getGlobalEPSymbol(*MF); in emitFunctionEntryLabel()
2014 OutStreamer->emitLabel(PPCFI->getTOCOffsetSymbol(*MF)); in emitFunctionEntryLabel()
2015 OutStreamer->emitValue(TOCDeltaExpr, 8); in emitFunctionEntryLabel()
2021 MCSectionSubPair Current = OutStreamer->getCurrentSection(); in emitFunctionEntryLabel()
2022 MCSectionELF *Section = OutStreamer->getContext().getELFSection( in emitFunctionEntryLabel()
2024 OutStreamer->switchSection(Section); in emitFunctionEntryLabel()
2025 OutStreamer->emitLabel(CurrentFnSym); in emitFunctionEntryLabel()
2026 OutStreamer->emitValueToAlignment(Align(8)); in emitFunctionEntryLabel()
2030 OutStreamer->emitValue(MCSymbolRefExpr::create(Symbol1, OutContext), in emitFunctionEntryLabel()
2034 OutStreamer->emitValue( in emitFunctionEntryLabel()
2038 OutStreamer->emitIntValue(0, 8 /* size */); in emitFunctionEntryLabel()
2039 OutStreamer->switchSection(Current.first, Current.second); in emitFunctionEntryLabel()
2048 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); in emitEndOfAsmFile()
2055 OutStreamer->emitSymbolValue( in emitEndOfAsmFile()
2057 MAI->getCodePointerSize()); in emitEndOfAsmFile()
2064 OutStreamer->switchSection(Section); in emitEndOfAsmFile()
2066 OutStreamer->emitValueToAlignment(Align(4)); in emitEndOfAsmFile()
2072 OutStreamer->emitLabel(TOCEntryLabel); in emitEndOfAsmFile()
2074 TS->emitTCEntry(*TOCEntryTarget, TOCMapPair.first.second); in emitEndOfAsmFile()
2076 OutStreamer->emitSymbolValue(TOCEntryTarget, 4); in emitEndOfAsmFile()
2083 /// EmitFunctionBodyStart - Emit a global entry point prefix for ELFv2.
2095 // addis r2,r12,(.TOC.-.Lfunc_gepNN)@ha in emitFunctionBodyStart()
2096 // addi r2,r2,(.TOC.-.Lfunc_gepNN)@l in emitFunctionBodyStart()
2098 // .localentry func, .Lfunc_lepNN-.Lfunc_gepNN in emitFunctionBodyStart()
2104 // .quad .TOC.-.Lfunc_gepNN # done by EmitFunctionEntryLabel in emitFunctionBodyStart()
2108 // ld r2,.Lfunc_tocNN-.Lfunc_gepNN(r12) in emitFunctionBodyStart()
2111 // .localentry func, .Lfunc_lepNN-.Lfunc_gepNN in emitFunctionBodyStart()
2116 const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>(); in emitFunctionBodyStart()
2117 const bool UsesX2OrR2 = !MF->getRegInfo().use_empty(PPC::X2) || in emitFunctionBodyStart()
2118 !MF->getRegInfo().use_empty(PPC::R2); in emitFunctionBodyStart()
2119 const bool PCrelGEPRequired = Subtarget->isUsingPCRelativeCalls() && in emitFunctionBodyStart()
2120 UsesX2OrR2 && PPCFI->usesTOCBasePtr(); in emitFunctionBodyStart()
2121 const bool NonPCrelGEPRequired = !Subtarget->isUsingPCRelativeCalls() && in emitFunctionBodyStart()
2122 Subtarget->isELFv2ABI() && UsesX2OrR2; in emitFunctionBodyStart()
2129 // branch-selection pass which sets the offset of the first block in the in emitFunctionBodyStart()
2131 MCSymbol *GlobalEntryLabel = PPCFI->getGlobalEPSymbol(*MF); in emitFunctionBodyStart()
2132 OutStreamer->emitLabel(GlobalEntryLabel); in emitFunctionBodyStart()
2154 MCSymbol *TOCOffset = PPCFI->getTOCOffsetSymbol(*MF); in emitFunctionBodyStart()
2169 MCSymbol *LocalEntryLabel = PPCFI->getLocalEPSymbol(*MF); in emitFunctionBodyStart()
2170 OutStreamer->emitLabel(LocalEntryLabel); in emitFunctionBodyStart()
2178 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); in emitFunctionBodyStart()
2179 TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym), LocalOffsetExp); in emitFunctionBodyStart()
2180 } else if (Subtarget->isUsingPCRelativeCalls()) { in emitFunctionBodyStart()
2184 // 1) A leaf function that does not use R2 (or treats it as callee-saved in emitFunctionBodyStart()
2202 if (MF->getFrameInfo().hasCalls() || MF->getFrameInfo().hasTailCall() || in emitFunctionBodyStart()
2203 MF->hasInlineAsm() || (!PPCFI->usesTOCBasePtr() && UsesX2OrR2)) { in emitFunctionBodyStart()
2205 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); in emitFunctionBodyStart()
2206 TS->emitLocalEntry(cast<MCSymbolELF>(CurrentFnSym), in emitFunctionBodyStart()
2212 /// EmitFunctionBodyEnd - Print the traceback table before the .size
2216 // Only the 64-bit target requires a traceback table. For now, in emitFunctionBodyEnd()
2218 // the end of the function, and zeroes for the eight-byte in emitFunctionBodyEnd()
2220 // FIXME: We should fill in the eight-byte mandatory fields as described in in emitFunctionBodyEnd()
2221 // the PPC64 ELF ABI (this is a low-priority item because GDB does not in emitFunctionBodyEnd()
2223 if (Subtarget->isPPC64()) { in emitFunctionBodyEnd()
2224 OutStreamer->emitIntValue(0, 4/*size*/); in emitFunctionBodyEnd()
2225 OutStreamer->emitIntValue(0, 8/*size*/); in emitFunctionBodyEnd()
2232 assert(MAI->hasVisibilityOnlyWithLinkage() && in emitLinkage()
2236 switch (GV->getLinkage()) { in emitLinkage()
2238 LinkageAttr = GV->isDeclaration() ? MCSA_Extern : MCSA_Global; in emitLinkage()
2253 assert(GV->getVisibility() == GlobalValue::DefaultVisibility && in emitLinkage()
2267 if (GV->hasDLLExportStorageClass() && !GV->hasDefaultVisibility()) in emitLinkage()
2269 "Cannot not be both dllexport and non-default visibility"); in emitLinkage()
2270 switch (GV->getVisibility()) { in emitLinkage()
2274 if (GV->hasDLLExportStorageClass()) in emitLinkage()
2275 VisibilityAttr = MAI->getExportedVisibilityAttr(); in emitLinkage()
2278 VisibilityAttr = MAI->getHiddenVisibilityAttr(); in emitLinkage()
2281 VisibilityAttr = MAI->getProtectedVisibilityAttr(); in emitLinkage()
2287 if (GV->getThreadLocalMode() == GlobalVariable::LocalDynamicTLSModel && in emitLinkage()
2288 GV->hasName() && GV->getName() == "_$TLSML") in emitLinkage()
2291 OutStreamer->emitXCOFFSymbolLinkageWithVisibility(GVSym, LinkageAttr, in emitLinkage()
2300 FnDescSec->setAlignment(Align(Subtarget->isPPC64() ? 8 : 4)); in SetupMachineFunction()
2302 CurrentFnDescSym = FnDescSec->getQualNameSymbol(); in SetupMachineFunction()
2311 const PPCSubtarget &Subtarget = MF->getSubtarget<PPCSubtarget>(); in getNumberOfVRSaved()
2314 const MachineRegisterInfo &MRI = MF->getRegInfo(); in getNumberOfVRSaved()
2318 return PPC::V31 - Reg + 1; in getNumberOfVRSaved()
2338 OutStreamer->switchSection(getObjFileLowering().getCompactUnwindSection()); in emitFunctionBodyEnd()
2341 OutStreamer->emitLabel(EHInfoLabel); in emitFunctionBodyEnd()
2344 OutStreamer->emitInt32(0); in emitFunctionBodyEnd()
2346 const DataLayout &DL = MMI->getModule()->getDataLayout(); in emitFunctionBodyEnd()
2349 OutStreamer->emitValueToAlignment(Align(PointerSize)); in emitFunctionBodyEnd()
2351 OutStreamer->emitIntValue(0, PointerSize); in emitFunctionBodyEnd()
2352 OutStreamer->emitIntValue(0, PointerSize); in emitFunctionBodyEnd()
2353 OutStreamer->switchSection(MF->getSection()); in emitFunctionBodyEnd()
2360 MCSymbol *FuncEnd = createTempSymbol(MF->getName()); in emitTracebackTable()
2361 OutStreamer->emitLabel(FuncEnd); in emitTracebackTable()
2363 OutStreamer->AddComment("Traceback table begin"); in emitTracebackTable()
2365 OutStreamer->emitIntValueInHexWithPadding(0, 4 /*size*/); in emitTracebackTable()
2371 OutStreamer->AddComment(CommentOS.str()); in emitTracebackTable()
2377 OutStreamer->emitIntValueInHexWithPadding(Value, Size); in emitTracebackTable()
2404 const PPCFunctionInfo *FI = MF->getInfo<PPCFunctionInfo>(); in emitTracebackTable()
2405 const MachineRegisterInfo &MRI = MF->getRegInfo(); in emitTracebackTable()
2407 // Check the function uses floating-point processor instructions or not in emitTracebackTable()
2416 CommentOS << (Prefix) << ((V) & (TracebackTable::Field##Mask) ? "+" : "-") \ in emitTracebackTable()
2442 OutStreamer->emitIntValueInHexWithPadding( in emitTracebackTable()
2449 static_cast<const PPCRegisterInfo *>(Subtarget->getRegisterInfo()); in emitTracebackTable()
2450 Register FrameReg = RegInfo->getFrameRegister(*MF); in emitTracebackTable()
2451 if (FrameReg == (Subtarget->isPPC64() ? PPC::X31 : PPC::R31)) in emitTracebackTable()
2454 const SmallVectorImpl<Register> &MustSaveCRs = FI->getMustSaveCRs(); in emitTracebackTable()
2458 if (FI->mustSaveLR()) in emitTracebackTable()
2470 OutStreamer->emitIntValueInHexWithPadding((FirstHalfOfMandatoryField & 0xff), in emitTracebackTable()
2476 SecondHalfOfMandatoryField |= MF->getFrameInfo().getStackSize() in emitTracebackTable()
2483 FPRSaved = PPC::F31 - Reg + 1; in emitTracebackTable()
2493 OutStreamer->emitIntValueInHexWithPadding( in emitTracebackTable()
2508 if (FI->hasVectorParms() || HasVectorInst) in emitTracebackTable()
2520 // X13 is reserved under 64-bit environment. in emitTracebackTable()
2521 unsigned GPRBegin = Subtarget->isPPC64() ? PPC::X14 : PPC::R13; in emitTracebackTable()
2522 unsigned GPREnd = Subtarget->isPPC64() ? PPC::X31 : PPC::R31; in emitTracebackTable()
2526 GPRSaved = GPREnd - Reg + 1; in emitTracebackTable()
2538 OutStreamer->emitIntValueInHexWithPadding( in emitTracebackTable()
2542 uint32_t NumberOfFixedParms = FI->getFixedParmsNum(); in emitTracebackTable()
2549 OutStreamer->emitIntValueInHexWithPadding( in emitTracebackTable()
2557 uint32_t NumberOfFPParms = FI->getFloatingPointParmsNum(); in emitTracebackTable()
2566 OutStreamer->emitIntValueInHexWithPadding(SecondHalfOfMandatoryField & 0xff, in emitTracebackTable()
2573 uint32_t ParmsTypeValue = FI->getParmsType(); in emitTracebackTable()
2576 FI->hasVectorParms() in emitTracebackTable()
2579 FI->getVectorParmsNum()) in emitTracebackTable()
2588 OutStreamer->emitIntValueInHexWithPadding(ParmsTypeValue, in emitTracebackTable()
2592 OutStreamer->AddComment("Function size"); in emitTracebackTable()
2595 &(MF->getFunction()), TM); in emitTracebackTable()
2596 OutStreamer->emitAbsoluteSymbolDiff(FuncEnd, FuncSectSym, 4); in emitTracebackTable()
2607 StringRef Name = MF->getName().substr(0, INT16_MAX); in emitTracebackTable()
2612 OutStreamer->AddComment("Function Name"); in emitTracebackTable()
2613 OutStreamer->emitBytes(Name); in emitTracebackTable()
2618 OutStreamer->AddComment("AllocaUsed"); in emitTracebackTable()
2619 OutStreamer->emitIntValueInHex(AllocReg, sizeof(AllocReg)); in emitTracebackTable()
2637 if (FI->getVarArgsFrameIndex()) in emitTracebackTable()
2641 unsigned VectorParmsNum = FI->getVectorParmsNum(); in emitTracebackTable()
2652 OutStreamer->emitIntValueInHexWithPadding((VRData & 0xff00) >> 8, 1); in emitTracebackTable()
2657 OutStreamer->emitIntValueInHexWithPadding(VRData & 0x00ff, 1); in emitTracebackTable()
2659 uint32_t VecParmTypeValue = FI->getVecExtParmsType(); in emitTracebackTable()
2668 OutStreamer->emitIntValueInHexWithPadding(VecParmTypeValue, in emitTracebackTable()
2689 auto &Ctx = OutStreamer->getContext(); in emitTracebackTable()
2695 ->getQualNameSymbol(); in emitTracebackTable()
2701 OutStreamer->emitValueToAlignment(Align(4)); in emitTracebackTable()
2702 OutStreamer->AddComment("EHInfo Table"); in emitTracebackTable()
2703 OutStreamer->emitValue(Exp, DL.getPointerSize()); in emitTracebackTable()
2710 return GV->hasAppendingLinkage() && in isSpecialLLVMGlobalArrayToSkip()
2711 StringSwitch<bool>(GV->getName()) in isSpecialLLVMGlobalArrayToSkip()
2722 return StringSwitch<bool>(GV->getName()) in isSpecialLLVMGlobalArrayForStaticInit()
2729 return getAliasOffset(GA->getAliasee()); in getAliasOffset()
2735 if (CBE->getOpcode() != MCBinaryExpr::Add) in getAliasOffset()
2737 auto *RHS = dyn_cast<MCConstantExpr>(CBE->getRHS()); in getAliasOffset()
2740 return RHS->getValue(); in getAliasOffset()
2749 PointerSize >= GV->getAlign().valueOrOne().value() && in tocDataChecks()
2753 Type *GVType = GV->getValueType(); in tocDataChecks()
2754 assert(GVType->isSized() && "A GlobalVariable's size must be known to be " in tocDataChecks()
2756 if (GV->getDataLayout().getTypeSizeInBits(GVType) > in tocDataChecks()
2761 if (GV->hasPrivateLinkage()) in tocDataChecks()
2771 // If the Global Variable has the toc-data attribute, it needs to be emitted in emitGlobalVariable()
2773 if (GV->hasAttribute("toc-data")) { in emitGlobalVariable()
2774 unsigned PointerSize = GV->getDataLayout().getPointerSize(); in emitGlobalVariable()
2784 assert(!GV->getName().starts_with("llvm.") && in emitGlobalVariableHelper()
2787 if (GV->hasComdat()) in emitGlobalVariableHelper()
2792 if (GV->isDeclarationForLinker()) { in emitGlobalVariableHelper()
2805 if (GV->hasInitializer()) { in emitGlobalVariableHelper()
2806 GV->printAsOperand(OutStreamer->getCommentOS(), in emitGlobalVariableHelper()
2807 /*PrintType=*/false, GV->getParent()); in emitGlobalVariableHelper()
2808 OutStreamer->getCommentOS() << '\n'; in emitGlobalVariableHelper()
2816 OutStreamer->switchSection(Csect); in emitGlobalVariableHelper()
2818 const DataLayout &DL = GV->getDataLayout(); in emitGlobalVariableHelper()
2820 // Handle common and zero-initialized local symbols. in emitGlobalVariableHelper()
2821 if (GV->hasCommonLinkage() || GVKind.isBSSLocal() || in emitGlobalVariableHelper()
2823 Align Alignment = GV->getAlign().value_or(DL.getPreferredAlign(GV)); in emitGlobalVariableHelper()
2824 uint64_t Size = DL.getTypeAllocSize(GV->getValueType()); in emitGlobalVariableHelper()
2825 GVSym->setStorageClass( in emitGlobalVariableHelper()
2828 if (GVKind.isBSSLocal() && Csect->getMappingClass() == XCOFF::XMC_TD) { in emitGlobalVariableHelper()
2829 OutStreamer->emitZeros(Size); in emitGlobalVariableHelper()
2831 assert(Csect->getMappingClass() != XCOFF::XMC_TD && in emitGlobalVariableHelper()
2832 "BSS local toc-data already handled and TLS variables " in emitGlobalVariableHelper()
2834 OutStreamer->emitXCOFFLocalCommonSymbol( in emitGlobalVariableHelper()
2835 OutContext.getOrCreateSymbol(GVSym->getSymbolTableName()), Size, in emitGlobalVariableHelper()
2838 OutStreamer->emitCommonSymbol(GVSym, Size, Alignment); in emitGlobalVariableHelper()
2852 // When -fdata-sections is enabled, every GlobalVariable will in emitGlobalVariableHelper()
2854 if (!TM.getDataSections() || GV->hasSection()) { in emitGlobalVariableHelper()
2855 if (Csect->getMappingClass() != XCOFF::XMC_TD) in emitGlobalVariableHelper()
2856 OutStreamer->emitLabel(EmittedInitSym); in emitGlobalVariableHelper()
2861 emitGlobalConstant(GV->getDataLayout(), GV->getInitializer()); in emitGlobalVariableHelper()
2869 AliasList[getAliasOffset(GA->getAliasee())].push_back(GA); in emitGlobalVariableHelper()
2872 emitGlobalConstant(GV->getDataLayout(), GV->getInitializer(), in emitGlobalVariableHelper()
2880 MCSectionSubPair Current = OutStreamer->getCurrentSection(); in emitFunctionDescriptor()
2882 OutStreamer->switchSection( in emitFunctionDescriptor()
2883 cast<MCSymbolXCOFF>(CurrentFnDescSym)->getRepresentedCsect()); in emitFunctionDescriptor()
2886 for (const GlobalAlias *Alias : GOAliasMap[&MF->getFunction()]) in emitFunctionDescriptor()
2887 OutStreamer->emitLabel(getSymbol(Alias)); in emitFunctionDescriptor()
2890 OutStreamer->emitValue(MCSymbolRefExpr::create(CurrentFnSym, OutContext), in emitFunctionDescriptor()
2895 ->getQualNameSymbol(); in emitFunctionDescriptor()
2896 OutStreamer->emitValue(MCSymbolRefExpr::create(TOCBaseSym, OutContext), in emitFunctionDescriptor()
2899 OutStreamer->emitIntValue(0, PointerSize); in emitFunctionDescriptor()
2901 OutStreamer->switchSection(Current.first, Current.second); in emitFunctionDescriptor()
2907 if (!TM.getFunctionSections() || MF->getFunction().hasSection()) in emitFunctionEntryLabel()
2911 for (const GlobalAlias *Alias : GOAliasMap[&MF->getFunction()]) in emitFunctionEntryLabel()
2912 OutStreamer->emitLabel( in emitFunctionEntryLabel()
2925 // same address (because one or more of them are zero-length), the referring in emitPGORefs()
2943 OutStreamer->switchSection(CntsSection); in emitPGORefs()
2948 OutStreamer->emitXCOFFRefDirective(S); in emitPGORefs()
2954 OutStreamer->emitXCOFFRefDirective(S); in emitPGORefs()
2960 OutStreamer->emitXCOFFRefDirective(S); in emitPGORefs()
2966 // If there are no functions and there are no toc-data definitions in this in emitEndOfAsmFile()
2974 OutStreamer->switchSection(getObjFileLowering().getTOCBaseSection()); in emitEndOfAsmFile()
2977 static_cast<PPCTargetStreamer *>(OutStreamer->getTargetStreamer()); in emitEndOfAsmFile()
2987 (Subtarget->hasAIXShLibTLSModelOpt() && in emitEndOfAsmFile()
2992 Name += cast<MCSymbolXCOFF>(I.first.first)->getSymbolTableName(); in emitEndOfAsmFile()
3000 OutStreamer->switchSection(TCEntry); in emitEndOfAsmFile()
3002 OutStreamer->emitLabel(I.second); in emitEndOfAsmFile()
3003 TS->emitTCEntry(*I.first.first, I.first.second); in emitEndOfAsmFile()
3007 // non-common global variables before the common ones, as emitting a in emitEndOfAsmFile()
3010 if (!GV->hasCommonLinkage()) in emitEndOfAsmFile()
3014 if (GV->hasCommonLinkage()) in emitEndOfAsmFile()
3024 if (GO->isDeclarationForLinker()) in doInitialization()
3031 Align GOAlign = getGVAlignment(GO, GO->getDataLayout()); in doInitialization()
3032 Csect->ensureMinAlignment(GOAlign); in doInitialization()
3037 // or not local-exec TLS variables require special assembly printing. in doInitialization()
3100 if (Aliasee->hasCommonLinkage()) { in doInitialization()
3104 " is invalid because " + Aliasee->getName() + in doInitialization()
3112 std::optional<CodeModel::Model> OptionalCodeModel = GVar->getCodeModel(); in doInitialization()
3125 switch (MI->getOpcode()) { in emitInstruction()
3132 if (MI->getNumOperands() < 5) in emitInstruction()
3134 const MachineOperand &LangMO = MI->getOperand(3); in emitInstruction()
3135 const MachineOperand &ReasonMO = MI->getOperand(4); in emitInstruction()
3139 OutStreamer->emitLabel(TempSym); in emitInstruction()
3140 OutStreamer->emitXCOFFExceptDirective(CurrentFnSym, TempSym, in emitInstruction()
3142 Subtarget->isPPC64() ? MI->getMF()->getInstructionCount() * 8 : in emitInstruction()
3143 MI->getMF()->getInstructionCount() * 4, in emitInstruction()
3144 MMI->hasDebugInfo()); in emitInstruction()
3155 createMCSymbolForTlsGetAddr(OutContext, MI->getOpcode()); in emitInstruction()
3163 const MachineOperand &MO = MI->getOperand(0); in emitInstruction()
3181 if (MI->getOperand(0).isSymbol()) in emitInstruction()
3202 if (!MAI->usesDwarfFileAndLocDirectives() && MMI->hasDebugInfo()) in doFinalization()
3203 OutStreamer->doFinalizationAtSectionEnd( in doFinalization()
3204 OutStreamer->getContext().getObjectFileInfo()->getTextSection()); in doFinalization()
3207 OutStreamer->emitSymbolAttribute(Sym, MCSA_Extern); in doFinalization()
3219 return 20 + (P - 20) * 16; in mapToSinitPriority()
3222 return 1004 + (P - 81); in mapToSinitPriority()
3225 return 2047 + (P - 1124) * 33878; in mapToSinitPriority()
3227 return 2147482625u + (P - 64512); in mapToSinitPriority()
3237 // - directly mapping the first 21 and the last 20 elements of the ranges in convertToSinitPriority()
3238 // - linear interpolating the intermediate values with a step size of 16. in convertToSinitPriority()
3242 // - directly mapping the first and the last 1024 elements of the ranges in convertToSinitPriority()
3243 // - linear interpolating the intermediate values with a step size of 33878. in convertToSinitPriority()
3263 S.Func = CE->getOperand(0); in emitXXStructorList()
3279 GlobalValue::LinkageTypes Linkage = GV->getLinkage(); in emitTTypeReference()
3288 ->getQualNameSymbol(); in emitTTypeReference()
3289 auto &Ctx = OutStreamer->getContext(); in emitTTypeReference()
3293 OutStreamer->emitValue(Exp, GetSizeOfEncodedValue(Encoding)); in emitTTypeReference()
3295 OutStreamer->emitIntValue(0, GetSizeOfEncodedValue(Encoding)); in emitTTypeReference()
3311 if (!NMD || !NMD->getNumOperands()) in emitModuleCommandLines()
3316 for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) { in emitModuleCommandLines()
3317 const MDNode *N = NMD->getOperand(i); in emitModuleCommandLines()
3318 assert(N->getNumOperands() == 1 && in emitModuleCommandLines()
3320 const MDString *MDS = cast<MDString>(N->getOperand(0)); in emitModuleCommandLines()
3323 RSOS << "@(#)opt " << MDS->getString() << "\n"; in emitModuleCommandLines()
3326 OutStreamer->emitXCOFFCInfoSym(".GCC.command.line", RSOS.str()); in emitModuleCommandLines()