Home | History | Annotate | Line # | Download | only in AsmPrinter
      1 //===- AsmPrinter.cpp - Common AsmPrinter code ----------------------------===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // This file implements the AsmPrinter class.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #include "llvm/CodeGen/AsmPrinter.h"
     14 #include "CodeViewDebug.h"
     15 #include "DwarfDebug.h"
     16 #include "DwarfException.h"
     17 #include "PseudoProbePrinter.h"
     18 #include "WasmException.h"
     19 #include "WinCFGuard.h"
     20 #include "WinException.h"
     21 #include "llvm/ADT/APFloat.h"
     22 #include "llvm/ADT/APInt.h"
     23 #include "llvm/ADT/DenseMap.h"
     24 #include "llvm/ADT/STLExtras.h"
     25 #include "llvm/ADT/SmallPtrSet.h"
     26 #include "llvm/ADT/SmallString.h"
     27 #include "llvm/ADT/SmallVector.h"
     28 #include "llvm/ADT/Statistic.h"
     29 #include "llvm/ADT/StringRef.h"
     30 #include "llvm/ADT/Triple.h"
     31 #include "llvm/ADT/Twine.h"
     32 #include "llvm/Analysis/ConstantFolding.h"
     33 #include "llvm/Analysis/EHPersonalities.h"
     34 #include "llvm/Analysis/MemoryLocation.h"
     35 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
     36 #include "llvm/BinaryFormat/COFF.h"
     37 #include "llvm/BinaryFormat/Dwarf.h"
     38 #include "llvm/BinaryFormat/ELF.h"
     39 #include "llvm/CodeGen/GCMetadata.h"
     40 #include "llvm/CodeGen/GCMetadataPrinter.h"
     41 #include "llvm/CodeGen/MachineBasicBlock.h"
     42 #include "llvm/CodeGen/MachineConstantPool.h"
     43 #include "llvm/CodeGen/MachineDominators.h"
     44 #include "llvm/CodeGen/MachineFrameInfo.h"
     45 #include "llvm/CodeGen/MachineFunction.h"
     46 #include "llvm/CodeGen/MachineFunctionPass.h"
     47 #include "llvm/CodeGen/MachineInstr.h"
     48 #include "llvm/CodeGen/MachineInstrBundle.h"
     49 #include "llvm/CodeGen/MachineJumpTableInfo.h"
     50 #include "llvm/CodeGen/MachineLoopInfo.h"
     51 #include "llvm/CodeGen/MachineMemOperand.h"
     52 #include "llvm/CodeGen/MachineModuleInfo.h"
     53 #include "llvm/CodeGen/MachineModuleInfoImpls.h"
     54 #include "llvm/CodeGen/MachineOperand.h"
     55 #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
     56 #include "llvm/CodeGen/StackMaps.h"
     57 #include "llvm/CodeGen/TargetFrameLowering.h"
     58 #include "llvm/CodeGen/TargetInstrInfo.h"
     59 #include "llvm/CodeGen/TargetLowering.h"
     60 #include "llvm/CodeGen/TargetOpcodes.h"
     61 #include "llvm/CodeGen/TargetRegisterInfo.h"
     62 #include "llvm/IR/BasicBlock.h"
     63 #include "llvm/IR/Comdat.h"
     64 #include "llvm/IR/Constant.h"
     65 #include "llvm/IR/Constants.h"
     66 #include "llvm/IR/DataLayout.h"
     67 #include "llvm/IR/DebugInfoMetadata.h"
     68 #include "llvm/IR/DerivedTypes.h"
     69 #include "llvm/IR/Function.h"
     70 #include "llvm/IR/GCStrategy.h"
     71 #include "llvm/IR/GlobalAlias.h"
     72 #include "llvm/IR/GlobalIFunc.h"
     73 #include "llvm/IR/GlobalIndirectSymbol.h"
     74 #include "llvm/IR/GlobalObject.h"
     75 #include "llvm/IR/GlobalValue.h"
     76 #include "llvm/IR/GlobalVariable.h"
     77 #include "llvm/IR/Instruction.h"
     78 #include "llvm/IR/Mangler.h"
     79 #include "llvm/IR/Metadata.h"
     80 #include "llvm/IR/Module.h"
     81 #include "llvm/IR/Operator.h"
     82 #include "llvm/IR/PseudoProbe.h"
     83 #include "llvm/IR/Type.h"
     84 #include "llvm/IR/Value.h"
     85 #include "llvm/MC/MCAsmInfo.h"
     86 #include "llvm/MC/MCContext.h"
     87 #include "llvm/MC/MCDirectives.h"
     88 #include "llvm/MC/MCDwarf.h"
     89 #include "llvm/MC/MCExpr.h"
     90 #include "llvm/MC/MCInst.h"
     91 #include "llvm/MC/MCSection.h"
     92 #include "llvm/MC/MCSectionCOFF.h"
     93 #include "llvm/MC/MCSectionELF.h"
     94 #include "llvm/MC/MCSectionMachO.h"
     95 #include "llvm/MC/MCSectionXCOFF.h"
     96 #include "llvm/MC/MCStreamer.h"
     97 #include "llvm/MC/MCSubtargetInfo.h"
     98 #include "llvm/MC/MCSymbol.h"
     99 #include "llvm/MC/MCSymbolELF.h"
    100 #include "llvm/MC/MCSymbolXCOFF.h"
    101 #include "llvm/MC/MCTargetOptions.h"
    102 #include "llvm/MC/MCValue.h"
    103 #include "llvm/MC/SectionKind.h"
    104 #include "llvm/Pass.h"
    105 #include "llvm/Remarks/Remark.h"
    106 #include "llvm/Remarks/RemarkFormat.h"
    107 #include "llvm/Remarks/RemarkStreamer.h"
    108 #include "llvm/Remarks/RemarkStringTable.h"
    109 #include "llvm/Support/Casting.h"
    110 #include "llvm/Support/CommandLine.h"
    111 #include "llvm/Support/Compiler.h"
    112 #include "llvm/Support/ErrorHandling.h"
    113 #include "llvm/Support/FileSystem.h"
    114 #include "llvm/Support/Format.h"
    115 #include "llvm/Support/MathExtras.h"
    116 #include "llvm/Support/Path.h"
    117 #include "llvm/Support/TargetRegistry.h"
    118 #include "llvm/Support/Timer.h"
    119 #include "llvm/Support/raw_ostream.h"
    120 #include "llvm/Target/TargetLoweringObjectFile.h"
    121 #include "llvm/Target/TargetMachine.h"
    122 #include "llvm/Target/TargetOptions.h"
    123 #include <algorithm>
    124 #include <cassert>
    125 #include <cinttypes>
    126 #include <cstdint>
    127 #include <iterator>
    128 #include <limits>
    129 #include <memory>
    130 #include <string>
    131 #include <utility>
    132 #include <vector>
    133 
    134 using namespace llvm;
    135 
    136 #define DEBUG_TYPE "asm-printer"
    137 
    138 // FIXME: this option currently only applies to DWARF, and not CodeView, tables
    139 static cl::opt<bool>
    140     DisableDebugInfoPrinting("disable-debug-info-print", cl::Hidden,
    141                              cl::desc("Disable debug info printing"));
    142 
    143 const char DWARFGroupName[] = "dwarf";
    144 const char DWARFGroupDescription[] = "DWARF Emission";
    145 const char DbgTimerName[] = "emit";
    146 const char DbgTimerDescription[] = "Debug Info Emission";
    147 const char EHTimerName[] = "write_exception";
    148 const char EHTimerDescription[] = "DWARF Exception Writer";
    149 const char CFGuardName[] = "Control Flow Guard";
    150 const char CFGuardDescription[] = "Control Flow Guard";
    151 const char CodeViewLineTablesGroupName[] = "linetables";
    152 const char CodeViewLineTablesGroupDescription[] = "CodeView Line Tables";
    153 const char PPTimerName[] = "emit";
    154 const char PPTimerDescription[] = "Pseudo Probe Emission";
    155 const char PPGroupName[] = "pseudo probe";
    156 const char PPGroupDescription[] = "Pseudo Probe Emission";
    157 
    158 STATISTIC(EmittedInsts, "Number of machine instrs printed");
    159 
    160 char AsmPrinter::ID = 0;
    161 
    162 using gcp_map_type = DenseMap<GCStrategy *, std::unique_ptr<GCMetadataPrinter>>;
    163 
    164 static gcp_map_type &getGCMap(void *&P) {
    165   if (!P)
    166     P = new gcp_map_type();
    167   return *(gcp_map_type*)P;
    168 }
    169 
    170 /// getGVAlignment - Return the alignment to use for the specified global
    171 /// value.  This rounds up to the preferred alignment if possible and legal.
    172 Align AsmPrinter::getGVAlignment(const GlobalObject *GV, const DataLayout &DL,
    173                                  Align InAlign) {
    174   Align Alignment;
    175   if (const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV))
    176     Alignment = DL.getPreferredAlign(GVar);
    177 
    178   // If InAlign is specified, round it to it.
    179   if (InAlign > Alignment)
    180     Alignment = InAlign;
    181 
    182   // If the GV has a specified alignment, take it into account.
    183   const MaybeAlign GVAlign(GV->getAlignment());
    184   if (!GVAlign)
    185     return Alignment;
    186 
    187   assert(GVAlign && "GVAlign must be set");
    188 
    189   // If the GVAlign is larger than NumBits, or if we are required to obey
    190   // NumBits because the GV has an assigned section, obey it.
    191   if (*GVAlign > Alignment || GV->hasSection())
    192     Alignment = *GVAlign;
    193   return Alignment;
    194 }
    195 
    196 AsmPrinter::AsmPrinter(TargetMachine &tm, std::unique_ptr<MCStreamer> Streamer)
    197     : MachineFunctionPass(ID), TM(tm), MAI(tm.getMCAsmInfo()),
    198       OutContext(Streamer->getContext()), OutStreamer(std::move(Streamer)) {
    199   VerboseAsm = OutStreamer->isVerboseAsm();
    200 }
    201 
    202 AsmPrinter::~AsmPrinter() {
    203   assert(!DD && Handlers.size() == NumUserHandlers &&
    204          "Debug/EH info didn't get finalized");
    205 
    206   if (GCMetadataPrinters) {
    207     gcp_map_type &GCMap = getGCMap(GCMetadataPrinters);
    208 
    209     delete &GCMap;
    210     GCMetadataPrinters = nullptr;
    211   }
    212 }
    213 
    214 bool AsmPrinter::isPositionIndependent() const {
    215   return TM.isPositionIndependent();
    216 }
    217 
    218 /// getFunctionNumber - Return a unique ID for the current function.
    219 unsigned AsmPrinter::getFunctionNumber() const {
    220   return MF->getFunctionNumber();
    221 }
    222 
    223 const TargetLoweringObjectFile &AsmPrinter::getObjFileLowering() const {
    224   return *TM.getObjFileLowering();
    225 }
    226 
    227 const DataLayout &AsmPrinter::getDataLayout() const {
    228   return MMI->getModule()->getDataLayout();
    229 }
    230 
    231 // Do not use the cached DataLayout because some client use it without a Module
    232 // (dsymutil, llvm-dwarfdump).
    233 unsigned AsmPrinter::getPointerSize() const {
    234   return TM.getPointerSize(0); // FIXME: Default address space
    235 }
    236 
    237 const MCSubtargetInfo &AsmPrinter::getSubtargetInfo() const {
    238   assert(MF && "getSubtargetInfo requires a valid MachineFunction!");
    239   return MF->getSubtarget<MCSubtargetInfo>();
    240 }
    241 
    242 void AsmPrinter::EmitToStreamer(MCStreamer &S, const MCInst &Inst) {
    243   S.emitInstruction(Inst, getSubtargetInfo());
    244 }
    245 
    246 void AsmPrinter::emitInitialRawDwarfLocDirective(const MachineFunction &MF) {
    247   if (DD) {
    248     assert(OutStreamer->hasRawTextSupport() &&
    249            "Expected assembly output mode.");
    250     (void)DD->emitInitialLocDirective(MF, /*CUID=*/0);
    251   }
    252 }
    253 
    254 /// getCurrentSection() - Return the current section we are emitting to.
    255 const MCSection *AsmPrinter::getCurrentSection() const {
    256   return OutStreamer->getCurrentSectionOnly();
    257 }
    258 
    259 void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const {
    260   AU.setPreservesAll();
    261   MachineFunctionPass::getAnalysisUsage(AU);
    262   AU.addRequired<MachineOptimizationRemarkEmitterPass>();
    263   AU.addRequired<GCModuleInfo>();
    264 }
    265 
    266 bool AsmPrinter::doInitialization(Module &M) {
    267   auto *MMIWP = getAnalysisIfAvailable<MachineModuleInfoWrapperPass>();
    268   MMI = MMIWP ? &MMIWP->getMMI() : nullptr;
    269 
    270   // Initialize TargetLoweringObjectFile.
    271   const_cast<TargetLoweringObjectFile&>(getObjFileLowering())
    272     .Initialize(OutContext, TM);
    273 
    274   const_cast<TargetLoweringObjectFile &>(getObjFileLowering())
    275       .getModuleMetadata(M);
    276 
    277   OutStreamer->InitSections(false);
    278 
    279   if (DisableDebugInfoPrinting)
    280     MMI->setDebugInfoAvailability(false);
    281 
    282   // Emit the version-min deployment target directive if needed.
    283   //
    284   // FIXME: If we end up with a collection of these sorts of Darwin-specific
    285   // or ELF-specific things, it may make sense to have a platform helper class
    286   // that will work with the target helper class. For now keep it here, as the
    287   // alternative is duplicated code in each of the target asm printers that
    288   // use the directive, where it would need the same conditionalization
    289   // anyway.
    290   const Triple &Target = TM.getTargetTriple();
    291   OutStreamer->emitVersionForTarget(Target, M.getSDKVersion());
    292 
    293   // Allow the target to emit any magic that it wants at the start of the file.
    294   emitStartOfAsmFile(M);
    295 
    296   // Very minimal debug info. It is ignored if we emit actual debug info. If we
    297   // don't, this at least helps the user find where a global came from.
    298   if (MAI->hasSingleParameterDotFile()) {
    299     // .file "foo.c"
    300     if (MAI->hasBasenameOnlyForFileDirective())
    301       OutStreamer->emitFileDirective(
    302           llvm::sys::path::filename(M.getSourceFileName()));
    303     else
    304       OutStreamer->emitFileDirective(M.getSourceFileName());
    305   }
    306 
    307   GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
    308   assert(MI && "AsmPrinter didn't require GCModuleInfo?");
    309   for (auto &I : *MI)
    310     if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I))
    311       MP->beginAssembly(M, *MI, *this);
    312 
    313   // Emit module-level inline asm if it exists.
    314   if (!M.getModuleInlineAsm().empty()) {
    315     // We're at the module level. Construct MCSubtarget from the default CPU
    316     // and target triple.
    317     std::unique_ptr<MCSubtargetInfo> STI(TM.getTarget().createMCSubtargetInfo(
    318         TM.getTargetTriple().str(), TM.getTargetCPU(),
    319         TM.getTargetFeatureString()));
    320     assert(STI && "Unable to create subtarget info");
    321     OutStreamer->AddComment("Start of file scope inline assembly");
    322     OutStreamer->AddBlankLine();
    323     emitInlineAsm(M.getModuleInlineAsm() + "\n",
    324                   OutContext.getSubtargetCopy(*STI), TM.Options.MCOptions);
    325     OutStreamer->AddComment("End of file scope inline assembly");
    326     OutStreamer->AddBlankLine();
    327   }
    328 
    329   if (MAI->doesSupportDebugInformation()) {
    330     bool EmitCodeView = M.getCodeViewFlag();
    331     if (EmitCodeView && TM.getTargetTriple().isOSWindows()) {
    332       Handlers.emplace_back(std::make_unique<CodeViewDebug>(this),
    333                             DbgTimerName, DbgTimerDescription,
    334                             CodeViewLineTablesGroupName,
    335                             CodeViewLineTablesGroupDescription);
    336     }
    337     if (!EmitCodeView || M.getDwarfVersion()) {
    338       if (!DisableDebugInfoPrinting) {
    339         DD = new DwarfDebug(this);
    340         Handlers.emplace_back(std::unique_ptr<DwarfDebug>(DD), DbgTimerName,
    341                               DbgTimerDescription, DWARFGroupName,
    342                               DWARFGroupDescription);
    343       }
    344     }
    345   }
    346 
    347   if (M.getNamedMetadata(PseudoProbeDescMetadataName)) {
    348     PP = new PseudoProbeHandler(this, &M);
    349     Handlers.emplace_back(std::unique_ptr<PseudoProbeHandler>(PP), PPTimerName,
    350                           PPTimerDescription, PPGroupName, PPGroupDescription);
    351   }
    352 
    353   switch (MAI->getExceptionHandlingType()) {
    354   case ExceptionHandling::None:
    355     // We may want to emit CFI for debug.
    356     LLVM_FALLTHROUGH;
    357   case ExceptionHandling::SjLj:
    358   case ExceptionHandling::DwarfCFI:
    359   case ExceptionHandling::ARM:
    360     for (auto &F : M.getFunctionList()) {
    361       if (getFunctionCFISectionType(F) != CFISection::None)
    362         ModuleCFISection = getFunctionCFISectionType(F);
    363       // If any function needsUnwindTableEntry(), it needs .eh_frame and hence
    364       // the module needs .eh_frame. If we have found that case, we are done.
    365       if (ModuleCFISection == CFISection::EH)
    366         break;
    367     }
    368     assert(MAI->getExceptionHandlingType() == ExceptionHandling::DwarfCFI ||
    369            ModuleCFISection != CFISection::EH);
    370     break;
    371   default:
    372     break;
    373   }
    374 
    375   EHStreamer *ES = nullptr;
    376   switch (MAI->getExceptionHandlingType()) {
    377   case ExceptionHandling::None:
    378     if (!needsCFIForDebug())
    379       break;
    380     LLVM_FALLTHROUGH;
    381   case ExceptionHandling::SjLj:
    382   case ExceptionHandling::DwarfCFI:
    383     ES = new DwarfCFIException(this);
    384     break;
    385   case ExceptionHandling::ARM:
    386     ES = new ARMException(this);
    387     break;
    388   case ExceptionHandling::WinEH:
    389     switch (MAI->getWinEHEncodingType()) {
    390     default: llvm_unreachable("unsupported unwinding information encoding");
    391     case WinEH::EncodingType::Invalid:
    392       break;
    393     case WinEH::EncodingType::X86:
    394     case WinEH::EncodingType::Itanium:
    395       ES = new WinException(this);
    396       break;
    397     }
    398     break;
    399   case ExceptionHandling::Wasm:
    400     ES = new WasmException(this);
    401     break;
    402   case ExceptionHandling::AIX:
    403     ES = new AIXException(this);
    404     break;
    405   }
    406   if (ES)
    407     Handlers.emplace_back(std::unique_ptr<EHStreamer>(ES), EHTimerName,
    408                           EHTimerDescription, DWARFGroupName,
    409                           DWARFGroupDescription);
    410 
    411   // Emit tables for any value of cfguard flag (i.e. cfguard=1 or cfguard=2).
    412   if (mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("cfguard")))
    413     Handlers.emplace_back(std::make_unique<WinCFGuard>(this), CFGuardName,
    414                           CFGuardDescription, DWARFGroupName,
    415                           DWARFGroupDescription);
    416 
    417   for (const HandlerInfo &HI : Handlers) {
    418     NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
    419                        HI.TimerGroupDescription, TimePassesIsEnabled);
    420     HI.Handler->beginModule(&M);
    421   }
    422 
    423   return false;
    424 }
    425 
    426 static bool canBeHidden(const GlobalValue *GV, const MCAsmInfo &MAI) {
    427   if (!MAI.hasWeakDefCanBeHiddenDirective())
    428     return false;
    429 
    430   return GV->canBeOmittedFromSymbolTable();
    431 }
    432 
    433 void AsmPrinter::emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const {
    434   GlobalValue::LinkageTypes Linkage = GV->getLinkage();
    435   switch (Linkage) {
    436   case GlobalValue::CommonLinkage:
    437   case GlobalValue::LinkOnceAnyLinkage:
    438   case GlobalValue::LinkOnceODRLinkage:
    439   case GlobalValue::WeakAnyLinkage:
    440   case GlobalValue::WeakODRLinkage:
    441     if (MAI->hasWeakDefDirective()) {
    442       // .globl _foo
    443       OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
    444 
    445       if (!canBeHidden(GV, *MAI))
    446         // .weak_definition _foo
    447         OutStreamer->emitSymbolAttribute(GVSym, MCSA_WeakDefinition);
    448       else
    449         OutStreamer->emitSymbolAttribute(GVSym, MCSA_WeakDefAutoPrivate);
    450     } else if (MAI->avoidWeakIfComdat() && GV->hasComdat()) {
    451       // .globl _foo
    452       OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
    453       //NOTE: linkonce is handled by the section the symbol was assigned to.
    454     } else {
    455       // .weak _foo
    456       OutStreamer->emitSymbolAttribute(GVSym, MCSA_Weak);
    457     }
    458     return;
    459   case GlobalValue::ExternalLinkage:
    460     OutStreamer->emitSymbolAttribute(GVSym, MCSA_Global);
    461     return;
    462   case GlobalValue::PrivateLinkage:
    463   case GlobalValue::InternalLinkage:
    464     return;
    465   case GlobalValue::ExternalWeakLinkage:
    466   case GlobalValue::AvailableExternallyLinkage:
    467   case GlobalValue::AppendingLinkage:
    468     llvm_unreachable("Should never emit this");
    469   }
    470   llvm_unreachable("Unknown linkage type!");
    471 }
    472 
    473 void AsmPrinter::getNameWithPrefix(SmallVectorImpl<char> &Name,
    474                                    const GlobalValue *GV) const {
    475   TM.getNameWithPrefix(Name, GV, getObjFileLowering().getMangler());
    476 }
    477 
    478 MCSymbol *AsmPrinter::getSymbol(const GlobalValue *GV) const {
    479   return TM.getSymbol(GV);
    480 }
    481 
    482 MCSymbol *AsmPrinter::getSymbolPreferLocal(const GlobalValue &GV) const {
    483   // On ELF, use .Lfoo$local if GV is a non-interposable GlobalObject with an
    484   // exact definion (intersection of GlobalValue::hasExactDefinition() and
    485   // !isInterposable()). These linkages include: external, appending, internal,
    486   // private. It may be profitable to use a local alias for external. The
    487   // assembler would otherwise be conservative and assume a global default
    488   // visibility symbol can be interposable, even if the code generator already
    489   // assumed it.
    490   if (TM.getTargetTriple().isOSBinFormatELF() && GV.canBenefitFromLocalAlias()) {
    491     const Module &M = *GV.getParent();
    492     if (TM.getRelocationModel() != Reloc::Static &&
    493         M.getPIELevel() == PIELevel::Default && GV.isDSOLocal())
    494       return getSymbolWithGlobalValueBase(&GV, "$local");
    495   }
    496   return TM.getSymbol(&GV);
    497 }
    498 
    499 /// EmitGlobalVariable - Emit the specified global variable to the .s file.
    500 void AsmPrinter::emitGlobalVariable(const GlobalVariable *GV) {
    501   bool IsEmuTLSVar = TM.useEmulatedTLS() && GV->isThreadLocal();
    502   assert(!(IsEmuTLSVar && GV->hasCommonLinkage()) &&
    503          "No emulated TLS variables in the common section");
    504 
    505   // Never emit TLS variable xyz in emulated TLS model.
    506   // The initialization value is in __emutls_t.xyz instead of xyz.
    507   if (IsEmuTLSVar)
    508     return;
    509 
    510   if (GV->hasInitializer()) {
    511     // Check to see if this is a special global used by LLVM, if so, emit it.
    512     if (emitSpecialLLVMGlobal(GV))
    513       return;
    514 
    515     // Skip the emission of global equivalents. The symbol can be emitted later
    516     // on by emitGlobalGOTEquivs in case it turns out to be needed.
    517     if (GlobalGOTEquivs.count(getSymbol(GV)))
    518       return;
    519 
    520     if (isVerbose()) {
    521       // When printing the control variable __emutls_v.*,
    522       // we don't need to print the original TLS variable name.
    523       GV->printAsOperand(OutStreamer->GetCommentOS(),
    524                      /*PrintType=*/false, GV->getParent());
    525       OutStreamer->GetCommentOS() << '\n';
    526     }
    527   }
    528 
    529   MCSymbol *GVSym = getSymbol(GV);
    530   MCSymbol *EmittedSym = GVSym;
    531 
    532   // getOrCreateEmuTLSControlSym only creates the symbol with name and default
    533   // attributes.
    534   // GV's or GVSym's attributes will be used for the EmittedSym.
    535   emitVisibility(EmittedSym, GV->getVisibility(), !GV->isDeclaration());
    536 
    537   if (!GV->hasInitializer())   // External globals require no extra code.
    538     return;
    539 
    540   GVSym->redefineIfPossible();
    541   if (GVSym->isDefined() || GVSym->isVariable())
    542     OutContext.reportError(SMLoc(), "symbol '" + Twine(GVSym->getName()) +
    543                                         "' is already defined");
    544 
    545   if (MAI->hasDotTypeDotSizeDirective())
    546     OutStreamer->emitSymbolAttribute(EmittedSym, MCSA_ELF_TypeObject);
    547 
    548   SectionKind GVKind = TargetLoweringObjectFile::getKindForGlobal(GV, TM);
    549 
    550   const DataLayout &DL = GV->getParent()->getDataLayout();
    551   uint64_t Size = DL.getTypeAllocSize(GV->getValueType());
    552 
    553   // If the alignment is specified, we *must* obey it.  Overaligning a global
    554   // with a specified alignment is a prompt way to break globals emitted to
    555   // sections and expected to be contiguous (e.g. ObjC metadata).
    556   const Align Alignment = getGVAlignment(GV, DL);
    557 
    558   for (const HandlerInfo &HI : Handlers) {
    559     NamedRegionTimer T(HI.TimerName, HI.TimerDescription,
    560                        HI.TimerGroupName, HI.TimerGroupDescription,
    561                        TimePassesIsEnabled);
    562     HI.Handler->setSymbolSize(GVSym, Size);
    563   }
    564 
    565   // Handle common symbols
    566   if (GVKind.isCommon()) {
    567     if (Size == 0) Size = 1;   // .comm Foo, 0 is undefined, avoid it.
    568     // .comm _foo, 42, 4
    569     const bool SupportsAlignment =
    570         getObjFileLowering().getCommDirectiveSupportsAlignment();
    571     OutStreamer->emitCommonSymbol(GVSym, Size,
    572                                   SupportsAlignment ? Alignment.value() : 0);
    573     return;
    574   }
    575 
    576   // Determine to which section this global should be emitted.
    577   MCSection *TheSection = getObjFileLowering().SectionForGlobal(GV, GVKind, TM);
    578 
    579   // If we have a bss global going to a section that supports the
    580   // zerofill directive, do so here.
    581   if (GVKind.isBSS() && MAI->hasMachoZeroFillDirective() &&
    582       TheSection->isVirtualSection()) {
    583     if (Size == 0)
    584       Size = 1; // zerofill of 0 bytes is undefined.
    585     emitLinkage(GV, GVSym);
    586     // .zerofill __DATA, __bss, _foo, 400, 5
    587     OutStreamer->emitZerofill(TheSection, GVSym, Size, Alignment.value());
    588     return;
    589   }
    590 
    591   // If this is a BSS local symbol and we are emitting in the BSS
    592   // section use .lcomm/.comm directive.
    593   if (GVKind.isBSSLocal() &&
    594       getObjFileLowering().getBSSSection() == TheSection) {
    595     if (Size == 0)
    596       Size = 1; // .comm Foo, 0 is undefined, avoid it.
    597 
    598     // Use .lcomm only if it supports user-specified alignment.
    599     // Otherwise, while it would still be correct to use .lcomm in some
    600     // cases (e.g. when Align == 1), the external assembler might enfore
    601     // some -unknown- default alignment behavior, which could cause
    602     // spurious differences between external and integrated assembler.
    603     // Prefer to simply fall back to .local / .comm in this case.
    604     if (MAI->getLCOMMDirectiveAlignmentType() != LCOMM::NoAlignment) {
    605       // .lcomm _foo, 42
    606       OutStreamer->emitLocalCommonSymbol(GVSym, Size, Alignment.value());
    607       return;
    608     }
    609 
    610     // .local _foo
    611     OutStreamer->emitSymbolAttribute(GVSym, MCSA_Local);
    612     // .comm _foo, 42, 4
    613     const bool SupportsAlignment =
    614         getObjFileLowering().getCommDirectiveSupportsAlignment();
    615     OutStreamer->emitCommonSymbol(GVSym, Size,
    616                                   SupportsAlignment ? Alignment.value() : 0);
    617     return;
    618   }
    619 
    620   // Handle thread local data for mach-o which requires us to output an
    621   // additional structure of data and mangle the original symbol so that we
    622   // can reference it later.
    623   //
    624   // TODO: This should become an "emit thread local global" method on TLOF.
    625   // All of this macho specific stuff should be sunk down into TLOFMachO and
    626   // stuff like "TLSExtraDataSection" should no longer be part of the parent
    627   // TLOF class.  This will also make it more obvious that stuff like
    628   // MCStreamer::EmitTBSSSymbol is macho specific and only called from macho
    629   // specific code.
    630   if (GVKind.isThreadLocal() && MAI->hasMachoTBSSDirective()) {
    631     // Emit the .tbss symbol
    632     MCSymbol *MangSym =
    633         OutContext.getOrCreateSymbol(GVSym->getName() + Twine("$tlv$init"));
    634 
    635     if (GVKind.isThreadBSS()) {
    636       TheSection = getObjFileLowering().getTLSBSSSection();
    637       OutStreamer->emitTBSSSymbol(TheSection, MangSym, Size, Alignment.value());
    638     } else if (GVKind.isThreadData()) {
    639       OutStreamer->SwitchSection(TheSection);
    640 
    641       emitAlignment(Alignment, GV);
    642       OutStreamer->emitLabel(MangSym);
    643 
    644       emitGlobalConstant(GV->getParent()->getDataLayout(),
    645                          GV->getInitializer());
    646     }
    647 
    648     OutStreamer->AddBlankLine();
    649 
    650     // Emit the variable struct for the runtime.
    651     MCSection *TLVSect = getObjFileLowering().getTLSExtraDataSection();
    652 
    653     OutStreamer->SwitchSection(TLVSect);
    654     // Emit the linkage here.
    655     emitLinkage(GV, GVSym);
    656     OutStreamer->emitLabel(GVSym);
    657 
    658     // Three pointers in size:
    659     //   - __tlv_bootstrap - used to make sure support exists
    660     //   - spare pointer, used when mapped by the runtime
    661     //   - pointer to mangled symbol above with initializer
    662     unsigned PtrSize = DL.getPointerTypeSize(GV->getType());
    663     OutStreamer->emitSymbolValue(GetExternalSymbolSymbol("_tlv_bootstrap"),
    664                                 PtrSize);
    665     OutStreamer->emitIntValue(0, PtrSize);
    666     OutStreamer->emitSymbolValue(MangSym, PtrSize);
    667 
    668     OutStreamer->AddBlankLine();
    669     return;
    670   }
    671 
    672   MCSymbol *EmittedInitSym = GVSym;
    673 
    674   OutStreamer->SwitchSection(TheSection);
    675 
    676   emitLinkage(GV, EmittedInitSym);
    677   emitAlignment(Alignment, GV);
    678 
    679   OutStreamer->emitLabel(EmittedInitSym);
    680   MCSymbol *LocalAlias = getSymbolPreferLocal(*GV);
    681   if (LocalAlias != EmittedInitSym)
    682     OutStreamer->emitLabel(LocalAlias);
    683 
    684   emitGlobalConstant(GV->getParent()->getDataLayout(), GV->getInitializer());
    685 
    686   if (MAI->hasDotTypeDotSizeDirective())
    687     // .size foo, 42
    688     OutStreamer->emitELFSize(EmittedInitSym,
    689                              MCConstantExpr::create(Size, OutContext));
    690 
    691   OutStreamer->AddBlankLine();
    692 }
    693 
    694 /// Emit the directive and value for debug thread local expression
    695 ///
    696 /// \p Value - The value to emit.
    697 /// \p Size - The size of the integer (in bytes) to emit.
    698 void AsmPrinter::emitDebugValue(const MCExpr *Value, unsigned Size) const {
    699   OutStreamer->emitValue(Value, Size);
    700 }
    701 
    702 void AsmPrinter::emitFunctionHeaderComment() {}
    703 
    704 /// EmitFunctionHeader - This method emits the header for the current
    705 /// function.
    706 void AsmPrinter::emitFunctionHeader() {
    707   const Function &F = MF->getFunction();
    708 
    709   if (isVerbose())
    710     OutStreamer->GetCommentOS()
    711         << "-- Begin function "
    712         << GlobalValue::dropLLVMManglingEscape(F.getName()) << '\n';
    713 
    714   // Print out constants referenced by the function
    715   emitConstantPool();
    716 
    717   // Print the 'header' of function.
    718   // If basic block sections are desired, explicitly request a unique section
    719   // for this function's entry block.
    720   if (MF->front().isBeginSection())
    721     MF->setSection(getObjFileLowering().getUniqueSectionForFunction(F, TM));
    722   else
    723     MF->setSection(getObjFileLowering().SectionForGlobal(&F, TM));
    724   OutStreamer->SwitchSection(MF->getSection());
    725 
    726   if (!MAI->hasVisibilityOnlyWithLinkage())
    727     emitVisibility(CurrentFnSym, F.getVisibility());
    728 
    729   if (MAI->needsFunctionDescriptors())
    730     emitLinkage(&F, CurrentFnDescSym);
    731 
    732   emitLinkage(&F, CurrentFnSym);
    733   if (MAI->hasFunctionAlignment())
    734     emitAlignment(MF->getAlignment(), &F);
    735 
    736   if (MAI->hasDotTypeDotSizeDirective())
    737     OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_ELF_TypeFunction);
    738 
    739   if (F.hasFnAttribute(Attribute::Cold))
    740     OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_Cold);
    741 
    742   if (isVerbose()) {
    743     F.printAsOperand(OutStreamer->GetCommentOS(),
    744                    /*PrintType=*/false, F.getParent());
    745     emitFunctionHeaderComment();
    746     OutStreamer->GetCommentOS() << '\n';
    747   }
    748 
    749   // Emit the prefix data.
    750   if (F.hasPrefixData()) {
    751     if (MAI->hasSubsectionsViaSymbols()) {
    752       // Preserving prefix data on platforms which use subsections-via-symbols
    753       // is a bit tricky. Here we introduce a symbol for the prefix data
    754       // and use the .alt_entry attribute to mark the function's real entry point
    755       // as an alternative entry point to the prefix-data symbol.
    756       MCSymbol *PrefixSym = OutContext.createLinkerPrivateTempSymbol();
    757       OutStreamer->emitLabel(PrefixSym);
    758 
    759       emitGlobalConstant(F.getParent()->getDataLayout(), F.getPrefixData());
    760 
    761       // Emit an .alt_entry directive for the actual function symbol.
    762       OutStreamer->emitSymbolAttribute(CurrentFnSym, MCSA_AltEntry);
    763     } else {
    764       emitGlobalConstant(F.getParent()->getDataLayout(), F.getPrefixData());
    765     }
    766   }
    767 
    768   // Emit M NOPs for -fpatchable-function-entry=N,M where M>0. We arbitrarily
    769   // place prefix data before NOPs.
    770   unsigned PatchableFunctionPrefix = 0;
    771   unsigned PatchableFunctionEntry = 0;
    772   (void)F.getFnAttribute("patchable-function-prefix")
    773       .getValueAsString()
    774       .getAsInteger(10, PatchableFunctionPrefix);
    775   (void)F.getFnAttribute("patchable-function-entry")
    776       .getValueAsString()
    777       .getAsInteger(10, PatchableFunctionEntry);
    778   if (PatchableFunctionPrefix) {
    779     CurrentPatchableFunctionEntrySym =
    780         OutContext.createLinkerPrivateTempSymbol();
    781     OutStreamer->emitLabel(CurrentPatchableFunctionEntrySym);
    782     emitNops(PatchableFunctionPrefix);
    783   } else if (PatchableFunctionEntry) {
    784     // May be reassigned when emitting the body, to reference the label after
    785     // the initial BTI (AArch64) or endbr32/endbr64 (x86).
    786     CurrentPatchableFunctionEntrySym = CurrentFnBegin;
    787   }
    788 
    789   // Emit the function descriptor. This is a virtual function to allow targets
    790   // to emit their specific function descriptor. Right now it is only used by
    791   // the AIX target. The PowerPC 64-bit V1 ELF target also uses function
    792   // descriptors and should be converted to use this hook as well.
    793   if (MAI->needsFunctionDescriptors())
    794     emitFunctionDescriptor();
    795 
    796   // Emit the CurrentFnSym. This is a virtual function to allow targets to do
    797   // their wild and crazy things as required.
    798   emitFunctionEntryLabel();
    799 
    800   // If the function had address-taken blocks that got deleted, then we have
    801   // references to the dangling symbols.  Emit them at the start of the function
    802   // so that we don't get references to undefined symbols.
    803   std::vector<MCSymbol*> DeadBlockSyms;
    804   MMI->takeDeletedSymbolsForFunction(&F, DeadBlockSyms);
    805   for (unsigned i = 0, e = DeadBlockSyms.size(); i != e; ++i) {
    806     OutStreamer->AddComment("Address taken block that was later removed");
    807     OutStreamer->emitLabel(DeadBlockSyms[i]);
    808   }
    809 
    810   if (CurrentFnBegin) {
    811     if (MAI->useAssignmentForEHBegin()) {
    812       MCSymbol *CurPos = OutContext.createTempSymbol();
    813       OutStreamer->emitLabel(CurPos);
    814       OutStreamer->emitAssignment(CurrentFnBegin,
    815                                  MCSymbolRefExpr::create(CurPos, OutContext));
    816     } else {
    817       OutStreamer->emitLabel(CurrentFnBegin);
    818     }
    819   }
    820 
    821   // Emit pre-function debug and/or EH information.
    822   for (const HandlerInfo &HI : Handlers) {
    823     NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
    824                        HI.TimerGroupDescription, TimePassesIsEnabled);
    825     HI.Handler->beginFunction(MF);
    826   }
    827 
    828   // Emit the prologue data.
    829   if (F.hasPrologueData())
    830     emitGlobalConstant(F.getParent()->getDataLayout(), F.getPrologueData());
    831 }
    832 
    833 /// EmitFunctionEntryLabel - Emit the label that is the entrypoint for the
    834 /// function.  This can be overridden by targets as required to do custom stuff.
    835 void AsmPrinter::emitFunctionEntryLabel() {
    836   CurrentFnSym->redefineIfPossible();
    837 
    838   // The function label could have already been emitted if two symbols end up
    839   // conflicting due to asm renaming.  Detect this and emit an error.
    840   if (CurrentFnSym->isVariable())
    841     report_fatal_error("'" + Twine(CurrentFnSym->getName()) +
    842                        "' is a protected alias");
    843 
    844   OutStreamer->emitLabel(CurrentFnSym);
    845 
    846   if (TM.getTargetTriple().isOSBinFormatELF()) {
    847     MCSymbol *Sym = getSymbolPreferLocal(MF->getFunction());
    848     if (Sym != CurrentFnSym)
    849       OutStreamer->emitLabel(Sym);
    850   }
    851 }
    852 
    853 /// emitComments - Pretty-print comments for instructions.
    854 static void emitComments(const MachineInstr &MI, raw_ostream &CommentOS) {
    855   const MachineFunction *MF = MI.getMF();
    856   const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
    857 
    858   // Check for spills and reloads
    859 
    860   // We assume a single instruction only has a spill or reload, not
    861   // both.
    862   Optional<unsigned> Size;
    863   if ((Size = MI.getRestoreSize(TII))) {
    864     CommentOS << *Size << "-byte Reload\n";
    865   } else if ((Size = MI.getFoldedRestoreSize(TII))) {
    866     if (*Size) {
    867       if (*Size == unsigned(MemoryLocation::UnknownSize))
    868         CommentOS << "Unknown-size Folded Reload\n";
    869       else
    870         CommentOS << *Size << "-byte Folded Reload\n";
    871     }
    872   } else if ((Size = MI.getSpillSize(TII))) {
    873     CommentOS << *Size << "-byte Spill\n";
    874   } else if ((Size = MI.getFoldedSpillSize(TII))) {
    875     if (*Size) {
    876       if (*Size == unsigned(MemoryLocation::UnknownSize))
    877         CommentOS << "Unknown-size Folded Spill\n";
    878       else
    879         CommentOS << *Size << "-byte Folded Spill\n";
    880     }
    881   }
    882 
    883   // Check for spill-induced copies
    884   if (MI.getAsmPrinterFlag(MachineInstr::ReloadReuse))
    885     CommentOS << " Reload Reuse\n";
    886 }
    887 
    888 /// emitImplicitDef - This method emits the specified machine instruction
    889 /// that is an implicit def.
    890 void AsmPrinter::emitImplicitDef(const MachineInstr *MI) const {
    891   Register RegNo = MI->getOperand(0).getReg();
    892 
    893   SmallString<128> Str;
    894   raw_svector_ostream OS(Str);
    895   OS << "implicit-def: "
    896      << printReg(RegNo, MF->getSubtarget().getRegisterInfo());
    897 
    898   OutStreamer->AddComment(OS.str());
    899   OutStreamer->AddBlankLine();
    900 }
    901 
    902 static void emitKill(const MachineInstr *MI, AsmPrinter &AP) {
    903   std::string Str;
    904   raw_string_ostream OS(Str);
    905   OS << "kill:";
    906   for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
    907     const MachineOperand &Op = MI->getOperand(i);
    908     assert(Op.isReg() && "KILL instruction must have only register operands");
    909     OS << ' ' << (Op.isDef() ? "def " : "killed ")
    910        << printReg(Op.getReg(), AP.MF->getSubtarget().getRegisterInfo());
    911   }
    912   AP.OutStreamer->AddComment(OS.str());
    913   AP.OutStreamer->AddBlankLine();
    914 }
    915 
    916 /// emitDebugValueComment - This method handles the target-independent form
    917 /// of DBG_VALUE, returning true if it was able to do so.  A false return
    918 /// means the target will need to handle MI in EmitInstruction.
    919 static bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP) {
    920   // This code handles only the 4-operand target-independent form.
    921   if (MI->isNonListDebugValue() && MI->getNumOperands() != 4)
    922     return false;
    923 
    924   SmallString<128> Str;
    925   raw_svector_ostream OS(Str);
    926   OS << "DEBUG_VALUE: ";
    927 
    928   const DILocalVariable *V = MI->getDebugVariable();
    929   if (auto *SP = dyn_cast<DISubprogram>(V->getScope())) {
    930     StringRef Name = SP->getName();
    931     if (!Name.empty())
    932       OS << Name << ":";
    933   }
    934   OS << V->getName();
    935   OS << " <- ";
    936 
    937   const DIExpression *Expr = MI->getDebugExpression();
    938   if (Expr->getNumElements()) {
    939     OS << '[';
    940     ListSeparator LS;
    941     for (auto Op : Expr->expr_ops()) {
    942       OS << LS << dwarf::OperationEncodingString(Op.getOp());
    943       for (unsigned I = 0; I < Op.getNumArgs(); ++I)
    944         OS << ' ' << Op.getArg(I);
    945     }
    946     OS << "] ";
    947   }
    948 
    949   // Register or immediate value. Register 0 means undef.
    950   for (const MachineOperand &Op : MI->debug_operands()) {
    951     if (&Op != MI->debug_operands().begin())
    952       OS << ", ";
    953     switch (Op.getType()) {
    954     case MachineOperand::MO_FPImmediate: {
    955       APFloat APF = APFloat(Op.getFPImm()->getValueAPF());
    956       Type *ImmTy = Op.getFPImm()->getType();
    957       if (ImmTy->isBFloatTy() || ImmTy->isHalfTy() || ImmTy->isFloatTy() ||
    958           ImmTy->isDoubleTy()) {
    959         OS << APF.convertToDouble();
    960       } else {
    961         // There is no good way to print long double.  Convert a copy to
    962         // double.  Ah well, it's only a comment.
    963         bool ignored;
    964         APF.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven,
    965                     &ignored);
    966         OS << "(long double) " << APF.convertToDouble();
    967       }
    968       break;
    969     }
    970     case MachineOperand::MO_Immediate: {
    971       OS << Op.getImm();
    972       break;
    973     }
    974     case MachineOperand::MO_CImmediate: {
    975       Op.getCImm()->getValue().print(OS, false /*isSigned*/);
    976       break;
    977     }
    978     case MachineOperand::MO_TargetIndex: {
    979       OS << "!target-index(" << Op.getIndex() << "," << Op.getOffset() << ")";
    980       // NOTE: Want this comment at start of line, don't emit with AddComment.
    981       AP.OutStreamer->emitRawComment(OS.str());
    982       break;
    983     }
    984     case MachineOperand::MO_Register:
    985     case MachineOperand::MO_FrameIndex: {
    986       Register Reg;
    987       Optional<StackOffset> Offset;
    988       if (Op.isReg()) {
    989         Reg = Op.getReg();
    990       } else {
    991         const TargetFrameLowering *TFI =
    992             AP.MF->getSubtarget().getFrameLowering();
    993         Offset = TFI->getFrameIndexReference(*AP.MF, Op.getIndex(), Reg);
    994       }
    995       if (!Reg) {
    996         // Suppress offset, it is not meaningful here.
    997         OS << "undef";
    998         break;
    999       }
   1000       // The second operand is only an offset if it's an immediate.
   1001       if (MI->isIndirectDebugValue())
   1002         Offset = StackOffset::getFixed(MI->getDebugOffset().getImm());
   1003       if (Offset)
   1004         OS << '[';
   1005       OS << printReg(Reg, AP.MF->getSubtarget().getRegisterInfo());
   1006       if (Offset)
   1007         OS << '+' << Offset->getFixed() << ']';
   1008       break;
   1009     }
   1010     default:
   1011       llvm_unreachable("Unknown operand type");
   1012     }
   1013   }
   1014 
   1015   // NOTE: Want this comment at start of line, don't emit with AddComment.
   1016   AP.OutStreamer->emitRawComment(OS.str());
   1017   return true;
   1018 }
   1019 
   1020 /// This method handles the target-independent form of DBG_LABEL, returning
   1021 /// true if it was able to do so.  A false return means the target will need
   1022 /// to handle MI in EmitInstruction.
   1023 static bool emitDebugLabelComment(const MachineInstr *MI, AsmPrinter &AP) {
   1024   if (MI->getNumOperands() != 1)
   1025     return false;
   1026 
   1027   SmallString<128> Str;
   1028   raw_svector_ostream OS(Str);
   1029   OS << "DEBUG_LABEL: ";
   1030 
   1031   const DILabel *V = MI->getDebugLabel();
   1032   if (auto *SP = dyn_cast<DISubprogram>(
   1033           V->getScope()->getNonLexicalBlockFileScope())) {
   1034     StringRef Name = SP->getName();
   1035     if (!Name.empty())
   1036       OS << Name << ":";
   1037   }
   1038   OS << V->getName();
   1039 
   1040   // NOTE: Want this comment at start of line, don't emit with AddComment.
   1041   AP.OutStreamer->emitRawComment(OS.str());
   1042   return true;
   1043 }
   1044 
   1045 AsmPrinter::CFISection
   1046 AsmPrinter::getFunctionCFISectionType(const Function &F) const {
   1047   // Ignore functions that won't get emitted.
   1048   if (F.isDeclarationForLinker())
   1049     return CFISection::None;
   1050 
   1051   if (MAI->getExceptionHandlingType() == ExceptionHandling::DwarfCFI &&
   1052       F.needsUnwindTableEntry())
   1053     return CFISection::EH;
   1054 
   1055   if (MMI->hasDebugInfo() || TM.Options.ForceDwarfFrameSection)
   1056     return CFISection::Debug;
   1057 
   1058   return CFISection::None;
   1059 }
   1060 
   1061 AsmPrinter::CFISection
   1062 AsmPrinter::getFunctionCFISectionType(const MachineFunction &MF) const {
   1063   return getFunctionCFISectionType(MF.getFunction());
   1064 }
   1065 
   1066 bool AsmPrinter::needsSEHMoves() {
   1067   return MAI->usesWindowsCFI() && MF->getFunction().needsUnwindTableEntry();
   1068 }
   1069 
   1070 bool AsmPrinter::needsCFIForDebug() const {
   1071   return MAI->getExceptionHandlingType() == ExceptionHandling::None &&
   1072          MAI->doesUseCFIForDebug() && ModuleCFISection == CFISection::Debug;
   1073 }
   1074 
   1075 void AsmPrinter::emitCFIInstruction(const MachineInstr &MI) {
   1076   ExceptionHandling ExceptionHandlingType = MAI->getExceptionHandlingType();
   1077   if (!needsCFIForDebug() &&
   1078       ExceptionHandlingType != ExceptionHandling::DwarfCFI &&
   1079       ExceptionHandlingType != ExceptionHandling::ARM)
   1080     return;
   1081 
   1082   if (getFunctionCFISectionType(*MF) == CFISection::None)
   1083     return;
   1084 
   1085   // If there is no "real" instruction following this CFI instruction, skip
   1086   // emitting it; it would be beyond the end of the function's FDE range.
   1087   auto *MBB = MI.getParent();
   1088   auto I = std::next(MI.getIterator());
   1089   while (I != MBB->end() && I->isTransient())
   1090     ++I;
   1091   if (I == MBB->instr_end() &&
   1092       MBB->getReverseIterator() == MBB->getParent()->rbegin())
   1093     return;
   1094 
   1095   const std::vector<MCCFIInstruction> &Instrs = MF->getFrameInstructions();
   1096   unsigned CFIIndex = MI.getOperand(0).getCFIIndex();
   1097   const MCCFIInstruction &CFI = Instrs[CFIIndex];
   1098   emitCFIInstruction(CFI);
   1099 }
   1100 
   1101 void AsmPrinter::emitFrameAlloc(const MachineInstr &MI) {
   1102   // The operands are the MCSymbol and the frame offset of the allocation.
   1103   MCSymbol *FrameAllocSym = MI.getOperand(0).getMCSymbol();
   1104   int FrameOffset = MI.getOperand(1).getImm();
   1105 
   1106   // Emit a symbol assignment.
   1107   OutStreamer->emitAssignment(FrameAllocSym,
   1108                              MCConstantExpr::create(FrameOffset, OutContext));
   1109 }
   1110 
   1111 /// Returns the BB metadata to be emitted in the .llvm_bb_addr_map section for a
   1112 /// given basic block. This can be used to capture more precise profile
   1113 /// information. We use the last 4 bits (LSBs) to encode the following
   1114 /// information:
   1115 ///  * (1): set if return block (ret or tail call).
   1116 ///  * (2): set if ends with a tail call.
   1117 ///  * (3): set if exception handling (EH) landing pad.
   1118 ///  * (4): set if the block can fall through to its next.
   1119 /// The remaining bits are zero.
   1120 static unsigned getBBAddrMapMetadata(const MachineBasicBlock &MBB) {
   1121   const TargetInstrInfo *TII = MBB.getParent()->getSubtarget().getInstrInfo();
   1122   return ((unsigned)MBB.isReturnBlock()) |
   1123          ((!MBB.empty() && TII->isTailCall(MBB.back())) << 1) |
   1124          (MBB.isEHPad() << 2) |
   1125          (const_cast<MachineBasicBlock &>(MBB).canFallThrough() << 3);
   1126 }
   1127 
   1128 void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) {
   1129   MCSection *BBAddrMapSection =
   1130       getObjFileLowering().getBBAddrMapSection(*MF.getSection());
   1131   assert(BBAddrMapSection && ".llvm_bb_addr_map section is not initialized.");
   1132 
   1133   const MCSymbol *FunctionSymbol = getFunctionBegin();
   1134 
   1135   OutStreamer->PushSection();
   1136   OutStreamer->SwitchSection(BBAddrMapSection);
   1137   OutStreamer->emitSymbolValue(FunctionSymbol, getPointerSize());
   1138   // Emit the total number of basic blocks in this function.
   1139   OutStreamer->emitULEB128IntValue(MF.size());
   1140   // Emit BB Information for each basic block in the funciton.
   1141   for (const MachineBasicBlock &MBB : MF) {
   1142     const MCSymbol *MBBSymbol =
   1143         MBB.isEntryBlock() ? FunctionSymbol : MBB.getSymbol();
   1144     // Emit the basic block offset.
   1145     emitLabelDifferenceAsULEB128(MBBSymbol, FunctionSymbol);
   1146     // Emit the basic block size. When BBs have alignments, their size cannot
   1147     // always be computed from their offsets.
   1148     emitLabelDifferenceAsULEB128(MBB.getEndSymbol(), MBBSymbol);
   1149     OutStreamer->emitULEB128IntValue(getBBAddrMapMetadata(MBB));
   1150   }
   1151   OutStreamer->PopSection();
   1152 }
   1153 
   1154 void AsmPrinter::emitPseudoProbe(const MachineInstr &MI) {
   1155   auto GUID = MI.getOperand(0).getImm();
   1156   auto Index = MI.getOperand(1).getImm();
   1157   auto Type = MI.getOperand(2).getImm();
   1158   auto Attr = MI.getOperand(3).getImm();
   1159   DILocation *DebugLoc = MI.getDebugLoc();
   1160   PP->emitPseudoProbe(GUID, Index, Type, Attr, DebugLoc);
   1161 }
   1162 
   1163 void AsmPrinter::emitStackSizeSection(const MachineFunction &MF) {
   1164   if (!MF.getTarget().Options.EmitStackSizeSection)
   1165     return;
   1166 
   1167   MCSection *StackSizeSection =
   1168       getObjFileLowering().getStackSizesSection(*getCurrentSection());
   1169   if (!StackSizeSection)
   1170     return;
   1171 
   1172   const MachineFrameInfo &FrameInfo = MF.getFrameInfo();
   1173   // Don't emit functions with dynamic stack allocations.
   1174   if (FrameInfo.hasVarSizedObjects())
   1175     return;
   1176 
   1177   OutStreamer->PushSection();
   1178   OutStreamer->SwitchSection(StackSizeSection);
   1179 
   1180   const MCSymbol *FunctionSymbol = getFunctionBegin();
   1181   uint64_t StackSize = FrameInfo.getStackSize();
   1182   OutStreamer->emitSymbolValue(FunctionSymbol, TM.getProgramPointerSize());
   1183   OutStreamer->emitULEB128IntValue(StackSize);
   1184 
   1185   OutStreamer->PopSection();
   1186 }
   1187 
   1188 void AsmPrinter::emitStackUsage(const MachineFunction &MF) {
   1189   const std::string &OutputFilename = MF.getTarget().Options.StackUsageOutput;
   1190 
   1191   // OutputFilename empty implies -fstack-usage is not passed.
   1192   if (OutputFilename.empty())
   1193     return;
   1194 
   1195   const MachineFrameInfo &FrameInfo = MF.getFrameInfo();
   1196   uint64_t StackSize = FrameInfo.getStackSize();
   1197 
   1198   if (StackUsageStream == nullptr) {
   1199     std::error_code EC;
   1200     StackUsageStream =
   1201         std::make_unique<raw_fd_ostream>(OutputFilename, EC, sys::fs::OF_Text);
   1202     if (EC) {
   1203       errs() << "Could not open file: " << EC.message();
   1204       return;
   1205     }
   1206   }
   1207 
   1208   *StackUsageStream << MF.getFunction().getParent()->getName();
   1209   if (const DISubprogram *DSP = MF.getFunction().getSubprogram())
   1210     *StackUsageStream << ':' << DSP->getLine();
   1211 
   1212   *StackUsageStream << ':' << MF.getName() << '\t' << StackSize << '\t';
   1213   if (FrameInfo.hasVarSizedObjects())
   1214     *StackUsageStream << "dynamic\n";
   1215   else
   1216     *StackUsageStream << "static\n";
   1217 }
   1218 
   1219 static bool needFuncLabelsForEHOrDebugInfo(const MachineFunction &MF) {
   1220   MachineModuleInfo &MMI = MF.getMMI();
   1221   if (!MF.getLandingPads().empty() || MF.hasEHFunclets() || MMI.hasDebugInfo())
   1222     return true;
   1223 
   1224   // We might emit an EH table that uses function begin and end labels even if
   1225   // we don't have any landingpads.
   1226   if (!MF.getFunction().hasPersonalityFn())
   1227     return false;
   1228   return !isNoOpWithoutInvoke(
   1229       classifyEHPersonality(MF.getFunction().getPersonalityFn()));
   1230 }
   1231 
   1232 /// EmitFunctionBody - This method emits the body and trailer for a
   1233 /// function.
   1234 void AsmPrinter::emitFunctionBody() {
   1235   emitFunctionHeader();
   1236 
   1237   // Emit target-specific gunk before the function body.
   1238   emitFunctionBodyStart();
   1239 
   1240   if (isVerbose()) {
   1241     // Get MachineDominatorTree or compute it on the fly if it's unavailable
   1242     MDT = getAnalysisIfAvailable<MachineDominatorTree>();
   1243     if (!MDT) {
   1244       OwnedMDT = std::make_unique<MachineDominatorTree>();
   1245       OwnedMDT->getBase().recalculate(*MF);
   1246       MDT = OwnedMDT.get();
   1247     }
   1248 
   1249     // Get MachineLoopInfo or compute it on the fly if it's unavailable
   1250     MLI = getAnalysisIfAvailable<MachineLoopInfo>();
   1251     if (!MLI) {
   1252       OwnedMLI = std::make_unique<MachineLoopInfo>();
   1253       OwnedMLI->getBase().analyze(MDT->getBase());
   1254       MLI = OwnedMLI.get();
   1255     }
   1256   }
   1257 
   1258   // Print out code for the function.
   1259   bool HasAnyRealCode = false;
   1260   int NumInstsInFunction = 0;
   1261 
   1262   bool CanDoExtraAnalysis = ORE->allowExtraAnalysis(DEBUG_TYPE);
   1263   for (auto &MBB : *MF) {
   1264     // Print a label for the basic block.
   1265     emitBasicBlockStart(MBB);
   1266     DenseMap<StringRef, unsigned> MnemonicCounts;
   1267     for (auto &MI : MBB) {
   1268       // Print the assembly for the instruction.
   1269       if (!MI.isPosition() && !MI.isImplicitDef() && !MI.isKill() &&
   1270           !MI.isDebugInstr()) {
   1271         HasAnyRealCode = true;
   1272         ++NumInstsInFunction;
   1273       }
   1274 
   1275       // If there is a pre-instruction symbol, emit a label for it here.
   1276       if (MCSymbol *S = MI.getPreInstrSymbol())
   1277         OutStreamer->emitLabel(S);
   1278 
   1279       for (const HandlerInfo &HI : Handlers) {
   1280         NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
   1281                            HI.TimerGroupDescription, TimePassesIsEnabled);
   1282         HI.Handler->beginInstruction(&MI);
   1283       }
   1284 
   1285       if (isVerbose())
   1286         emitComments(MI, OutStreamer->GetCommentOS());
   1287 
   1288       switch (MI.getOpcode()) {
   1289       case TargetOpcode::CFI_INSTRUCTION:
   1290         emitCFIInstruction(MI);
   1291         break;
   1292       case TargetOpcode::LOCAL_ESCAPE:
   1293         emitFrameAlloc(MI);
   1294         break;
   1295       case TargetOpcode::ANNOTATION_LABEL:
   1296       case TargetOpcode::EH_LABEL:
   1297       case TargetOpcode::GC_LABEL:
   1298         OutStreamer->emitLabel(MI.getOperand(0).getMCSymbol());
   1299         break;
   1300       case TargetOpcode::INLINEASM:
   1301       case TargetOpcode::INLINEASM_BR:
   1302         emitInlineAsm(&MI);
   1303         break;
   1304       case TargetOpcode::DBG_VALUE:
   1305       case TargetOpcode::DBG_VALUE_LIST:
   1306         if (isVerbose()) {
   1307           if (!emitDebugValueComment(&MI, *this))
   1308             emitInstruction(&MI);
   1309         }
   1310         break;
   1311       case TargetOpcode::DBG_INSTR_REF:
   1312         // This instruction reference will have been resolved to a machine
   1313         // location, and a nearby DBG_VALUE created. We can safely ignore
   1314         // the instruction reference.
   1315         break;
   1316       case TargetOpcode::DBG_LABEL:
   1317         if (isVerbose()) {
   1318           if (!emitDebugLabelComment(&MI, *this))
   1319             emitInstruction(&MI);
   1320         }
   1321         break;
   1322       case TargetOpcode::IMPLICIT_DEF:
   1323         if (isVerbose()) emitImplicitDef(&MI);
   1324         break;
   1325       case TargetOpcode::KILL:
   1326         if (isVerbose()) emitKill(&MI, *this);
   1327         break;
   1328       case TargetOpcode::PSEUDO_PROBE:
   1329         emitPseudoProbe(MI);
   1330         break;
   1331       default:
   1332         emitInstruction(&MI);
   1333         if (CanDoExtraAnalysis) {
   1334           MCInst MCI;
   1335           MCI.setOpcode(MI.getOpcode());
   1336           auto Name = OutStreamer->getMnemonic(MCI);
   1337           auto I = MnemonicCounts.insert({Name, 0u});
   1338           I.first->second++;
   1339         }
   1340         break;
   1341       }
   1342 
   1343       // If there is a post-instruction symbol, emit a label for it here.
   1344       if (MCSymbol *S = MI.getPostInstrSymbol())
   1345         OutStreamer->emitLabel(S);
   1346 
   1347       for (const HandlerInfo &HI : Handlers) {
   1348         NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
   1349                            HI.TimerGroupDescription, TimePassesIsEnabled);
   1350         HI.Handler->endInstruction();
   1351       }
   1352     }
   1353 
   1354     // We must emit temporary symbol for the end of this basic block, if either
   1355     // we have BBLabels enabled or if this basic blocks marks the end of a
   1356     // section (except the section containing the entry basic block as the end
   1357     // symbol for that section is CurrentFnEnd).
   1358     if (MF->hasBBLabels() ||
   1359         (MAI->hasDotTypeDotSizeDirective() && MBB.isEndSection() &&
   1360          !MBB.sameSection(&MF->front())))
   1361       OutStreamer->emitLabel(MBB.getEndSymbol());
   1362 
   1363     if (MBB.isEndSection()) {
   1364       // The size directive for the section containing the entry block is
   1365       // handled separately by the function section.
   1366       if (!MBB.sameSection(&MF->front())) {
   1367         if (MAI->hasDotTypeDotSizeDirective()) {
   1368           // Emit the size directive for the basic block section.
   1369           const MCExpr *SizeExp = MCBinaryExpr::createSub(
   1370               MCSymbolRefExpr::create(MBB.getEndSymbol(), OutContext),
   1371               MCSymbolRefExpr::create(CurrentSectionBeginSym, OutContext),
   1372               OutContext);
   1373           OutStreamer->emitELFSize(CurrentSectionBeginSym, SizeExp);
   1374         }
   1375         MBBSectionRanges[MBB.getSectionIDNum()] =
   1376             MBBSectionRange{CurrentSectionBeginSym, MBB.getEndSymbol()};
   1377       }
   1378     }
   1379     emitBasicBlockEnd(MBB);
   1380 
   1381     if (CanDoExtraAnalysis) {
   1382       // Skip empty blocks.
   1383       if (MBB.empty())
   1384         continue;
   1385 
   1386       MachineOptimizationRemarkAnalysis R(DEBUG_TYPE, "InstructionMix",
   1387                                           MBB.begin()->getDebugLoc(), &MBB);
   1388 
   1389       // Generate instruction mix remark. First, sort counts in descending order
   1390       // by count and name.
   1391       SmallVector<std::pair<StringRef, unsigned>, 128> MnemonicVec;
   1392       for (auto &KV : MnemonicCounts)
   1393         MnemonicVec.emplace_back(KV.first, KV.second);
   1394 
   1395       sort(MnemonicVec, [](const std::pair<StringRef, unsigned> &A,
   1396                            const std::pair<StringRef, unsigned> &B) {
   1397         if (A.second > B.second)
   1398           return true;
   1399         if (A.second == B.second)
   1400           return StringRef(A.first) < StringRef(B.first);
   1401         return false;
   1402       });
   1403       R << "BasicBlock: " << ore::NV("BasicBlock", MBB.getName()) << "\n";
   1404       for (auto &KV : MnemonicVec) {
   1405         auto Name = (Twine("INST_") + KV.first.trim()).str();
   1406         R << KV.first << ": " << ore::NV(Name, KV.second) << "\n";
   1407       }
   1408       ORE->emit(R);
   1409     }
   1410   }
   1411 
   1412   EmittedInsts += NumInstsInFunction;
   1413   MachineOptimizationRemarkAnalysis R(DEBUG_TYPE, "InstructionCount",
   1414                                       MF->getFunction().getSubprogram(),
   1415                                       &MF->front());
   1416   R << ore::NV("NumInstructions", NumInstsInFunction)
   1417     << " instructions in function";
   1418   ORE->emit(R);
   1419 
   1420   // If the function is empty and the object file uses .subsections_via_symbols,
   1421   // then we need to emit *something* to the function body to prevent the
   1422   // labels from collapsing together.  Just emit a noop.
   1423   // Similarly, don't emit empty functions on Windows either. It can lead to
   1424   // duplicate entries (two functions with the same RVA) in the Guard CF Table
   1425   // after linking, causing the kernel not to load the binary:
   1426   // https://developercommunity.visualstudio.com/content/problem/45366/vc-linker-creates-invalid-dll-with-clang-cl.html
   1427   // FIXME: Hide this behind some API in e.g. MCAsmInfo or MCTargetStreamer.
   1428   const Triple &TT = TM.getTargetTriple();
   1429   if (!HasAnyRealCode && (MAI->hasSubsectionsViaSymbols() ||
   1430                           (TT.isOSWindows() && TT.isOSBinFormatCOFF()))) {
   1431     MCInst Noop = MF->getSubtarget().getInstrInfo()->getNop();
   1432 
   1433     // Targets can opt-out of emitting the noop here by leaving the opcode
   1434     // unspecified.
   1435     if (Noop.getOpcode()) {
   1436       OutStreamer->AddComment("avoids zero-length function");
   1437       emitNops(1);
   1438     }
   1439   }
   1440 
   1441   // Switch to the original section in case basic block sections was used.
   1442   OutStreamer->SwitchSection(MF->getSection());
   1443 
   1444   const Function &F = MF->getFunction();
   1445   for (const auto &BB : F) {
   1446     if (!BB.hasAddressTaken())
   1447       continue;
   1448     MCSymbol *Sym = GetBlockAddressSymbol(&BB);
   1449     if (Sym->isDefined())
   1450       continue;
   1451     OutStreamer->AddComment("Address of block that was removed by CodeGen");
   1452     OutStreamer->emitLabel(Sym);
   1453   }
   1454 
   1455   // Emit target-specific gunk after the function body.
   1456   emitFunctionBodyEnd();
   1457 
   1458   if (needFuncLabelsForEHOrDebugInfo(*MF) ||
   1459       MAI->hasDotTypeDotSizeDirective()) {
   1460     // Create a symbol for the end of function.
   1461     CurrentFnEnd = createTempSymbol("func_end");
   1462     OutStreamer->emitLabel(CurrentFnEnd);
   1463   }
   1464 
   1465   // If the target wants a .size directive for the size of the function, emit
   1466   // it.
   1467   if (MAI->hasDotTypeDotSizeDirective()) {
   1468     // We can get the size as difference between the function label and the
   1469     // temp label.
   1470     const MCExpr *SizeExp = MCBinaryExpr::createSub(
   1471         MCSymbolRefExpr::create(CurrentFnEnd, OutContext),
   1472         MCSymbolRefExpr::create(CurrentFnSymForSize, OutContext), OutContext);
   1473     OutStreamer->emitELFSize(CurrentFnSym, SizeExp);
   1474   }
   1475 
   1476   for (const HandlerInfo &HI : Handlers) {
   1477     NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
   1478                        HI.TimerGroupDescription, TimePassesIsEnabled);
   1479     HI.Handler->markFunctionEnd();
   1480   }
   1481 
   1482   MBBSectionRanges[MF->front().getSectionIDNum()] =
   1483       MBBSectionRange{CurrentFnBegin, CurrentFnEnd};
   1484 
   1485   // Print out jump tables referenced by the function.
   1486   emitJumpTableInfo();
   1487 
   1488   // Emit post-function debug and/or EH information.
   1489   for (const HandlerInfo &HI : Handlers) {
   1490     NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
   1491                        HI.TimerGroupDescription, TimePassesIsEnabled);
   1492     HI.Handler->endFunction(MF);
   1493   }
   1494 
   1495   // Emit section containing BB address offsets and their metadata, when
   1496   // BB labels are requested for this function. Skip empty functions.
   1497   if (MF->hasBBLabels() && HasAnyRealCode)
   1498     emitBBAddrMapSection(*MF);
   1499 
   1500   // Emit section containing stack size metadata.
   1501   emitStackSizeSection(*MF);
   1502 
   1503   // Emit .su file containing function stack size information.
   1504   emitStackUsage(*MF);
   1505 
   1506   emitPatchableFunctionEntries();
   1507 
   1508   if (isVerbose())
   1509     OutStreamer->GetCommentOS() << "-- End function\n";
   1510 
   1511   OutStreamer->AddBlankLine();
   1512 }
   1513 
   1514 /// Compute the number of Global Variables that uses a Constant.
   1515 static unsigned getNumGlobalVariableUses(const Constant *C) {
   1516   if (!C)
   1517     return 0;
   1518 
   1519   if (isa<GlobalVariable>(C))
   1520     return 1;
   1521 
   1522   unsigned NumUses = 0;
   1523   for (auto *CU : C->users())
   1524     NumUses += getNumGlobalVariableUses(dyn_cast<Constant>(CU));
   1525 
   1526   return NumUses;
   1527 }
   1528 
   1529 /// Only consider global GOT equivalents if at least one user is a
   1530 /// cstexpr inside an initializer of another global variables. Also, don't
   1531 /// handle cstexpr inside instructions. During global variable emission,
   1532 /// candidates are skipped and are emitted later in case at least one cstexpr
   1533 /// isn't replaced by a PC relative GOT entry access.
   1534 static bool isGOTEquivalentCandidate(const GlobalVariable *GV,
   1535                                      unsigned &NumGOTEquivUsers) {
   1536   // Global GOT equivalents are unnamed private globals with a constant
   1537   // pointer initializer to another global symbol. They must point to a
   1538   // GlobalVariable or Function, i.e., as GlobalValue.
   1539   if (!GV->hasGlobalUnnamedAddr() || !GV->hasInitializer() ||
   1540       !GV->isConstant() || !GV->isDiscardableIfUnused() ||
   1541       !isa<GlobalValue>(GV->getOperand(0)))
   1542     return false;
   1543 
   1544   // To be a got equivalent, at least one of its users need to be a constant
   1545   // expression used by another global variable.
   1546   for (auto *U : GV->users())
   1547     NumGOTEquivUsers += getNumGlobalVariableUses(dyn_cast<Constant>(U));
   1548 
   1549   return NumGOTEquivUsers > 0;
   1550 }
   1551 
   1552 /// Unnamed constant global variables solely contaning a pointer to
   1553 /// another globals variable is equivalent to a GOT table entry; it contains the
   1554 /// the address of another symbol. Optimize it and replace accesses to these
   1555 /// "GOT equivalents" by using the GOT entry for the final global instead.
   1556 /// Compute GOT equivalent candidates among all global variables to avoid
   1557 /// emitting them if possible later on, after it use is replaced by a GOT entry
   1558 /// access.
   1559 void AsmPrinter::computeGlobalGOTEquivs(Module &M) {
   1560   if (!getObjFileLowering().supportIndirectSymViaGOTPCRel())
   1561     return;
   1562 
   1563   for (const auto &G : M.globals()) {
   1564     unsigned NumGOTEquivUsers = 0;
   1565     if (!isGOTEquivalentCandidate(&G, NumGOTEquivUsers))
   1566       continue;
   1567 
   1568     const MCSymbol *GOTEquivSym = getSymbol(&G);
   1569     GlobalGOTEquivs[GOTEquivSym] = std::make_pair(&G, NumGOTEquivUsers);
   1570   }
   1571 }
   1572 
   1573 /// Constant expressions using GOT equivalent globals may not be eligible
   1574 /// for PC relative GOT entry conversion, in such cases we need to emit such
   1575 /// globals we previously omitted in EmitGlobalVariable.
   1576 void AsmPrinter::emitGlobalGOTEquivs() {
   1577   if (!getObjFileLowering().supportIndirectSymViaGOTPCRel())
   1578     return;
   1579 
   1580   SmallVector<const GlobalVariable *, 8> FailedCandidates;
   1581   for (auto &I : GlobalGOTEquivs) {
   1582     const GlobalVariable *GV = I.second.first;
   1583     unsigned Cnt = I.second.second;
   1584     if (Cnt)
   1585       FailedCandidates.push_back(GV);
   1586   }
   1587   GlobalGOTEquivs.clear();
   1588 
   1589   for (auto *GV : FailedCandidates)
   1590     emitGlobalVariable(GV);
   1591 }
   1592 
   1593 void AsmPrinter::emitGlobalIndirectSymbol(Module &M,
   1594                                           const GlobalIndirectSymbol& GIS) {
   1595   MCSymbol *Name = getSymbol(&GIS);
   1596   bool IsFunction = GIS.getValueType()->isFunctionTy();
   1597   // Treat bitcasts of functions as functions also. This is important at least
   1598   // on WebAssembly where object and function addresses can't alias each other.
   1599   if (!IsFunction)
   1600     if (auto *CE = dyn_cast<ConstantExpr>(GIS.getIndirectSymbol()))
   1601       if (CE->getOpcode() == Instruction::BitCast)
   1602         IsFunction =
   1603           CE->getOperand(0)->getType()->getPointerElementType()->isFunctionTy();
   1604 
   1605   // AIX's assembly directive `.set` is not usable for aliasing purpose,
   1606   // so AIX has to use the extra-label-at-definition strategy. At this
   1607   // point, all the extra label is emitted, we just have to emit linkage for
   1608   // those labels.
   1609   if (TM.getTargetTriple().isOSBinFormatXCOFF()) {
   1610     assert(!isa<GlobalIFunc>(GIS) && "IFunc is not supported on AIX.");
   1611     assert(MAI->hasVisibilityOnlyWithLinkage() &&
   1612            "Visibility should be handled with emitLinkage() on AIX.");
   1613     emitLinkage(&GIS, Name);
   1614     // If it's a function, also emit linkage for aliases of function entry
   1615     // point.
   1616     if (IsFunction)
   1617       emitLinkage(&GIS,
   1618                   getObjFileLowering().getFunctionEntryPointSymbol(&GIS, TM));
   1619     return;
   1620   }
   1621 
   1622   if (GIS.hasExternalLinkage() || !MAI->getWeakRefDirective())
   1623     OutStreamer->emitSymbolAttribute(Name, MCSA_Global);
   1624   else if (GIS.hasWeakLinkage() || GIS.hasLinkOnceLinkage())
   1625     OutStreamer->emitSymbolAttribute(Name, MCSA_WeakReference);
   1626   else
   1627     assert(GIS.hasLocalLinkage() && "Invalid alias or ifunc linkage");
   1628 
   1629   // Set the symbol type to function if the alias has a function type.
   1630   // This affects codegen when the aliasee is not a function.
   1631   if (IsFunction)
   1632     OutStreamer->emitSymbolAttribute(Name, isa<GlobalIFunc>(GIS)
   1633                                                ? MCSA_ELF_TypeIndFunction
   1634                                                : MCSA_ELF_TypeFunction);
   1635 
   1636   emitVisibility(Name, GIS.getVisibility());
   1637 
   1638   const MCExpr *Expr = lowerConstant(GIS.getIndirectSymbol());
   1639 
   1640   if (isa<GlobalAlias>(&GIS) && MAI->hasAltEntry() && isa<MCBinaryExpr>(Expr))
   1641     OutStreamer->emitSymbolAttribute(Name, MCSA_AltEntry);
   1642 
   1643   // Emit the directives as assignments aka .set:
   1644   OutStreamer->emitAssignment(Name, Expr);
   1645   MCSymbol *LocalAlias = getSymbolPreferLocal(GIS);
   1646   if (LocalAlias != Name)
   1647     OutStreamer->emitAssignment(LocalAlias, Expr);
   1648 
   1649   if (auto *GA = dyn_cast<GlobalAlias>(&GIS)) {
   1650     // If the aliasee does not correspond to a symbol in the output, i.e. the
   1651     // alias is not of an object or the aliased object is private, then set the
   1652     // size of the alias symbol from the type of the alias. We don't do this in
   1653     // other situations as the alias and aliasee having differing types but same
   1654     // size may be intentional.
   1655     const GlobalObject *BaseObject = GA->getBaseObject();
   1656     if (MAI->hasDotTypeDotSizeDirective() && GA->getValueType()->isSized() &&
   1657         (!BaseObject || BaseObject->hasPrivateLinkage())) {
   1658       const DataLayout &DL = M.getDataLayout();
   1659       uint64_t Size = DL.getTypeAllocSize(GA->getValueType());
   1660       OutStreamer->emitELFSize(Name, MCConstantExpr::create(Size, OutContext));
   1661     }
   1662   }
   1663 }
   1664 
   1665 void AsmPrinter::emitRemarksSection(remarks::RemarkStreamer &RS) {
   1666   if (!RS.needsSection())
   1667     return;
   1668 
   1669   remarks::RemarkSerializer &RemarkSerializer = RS.getSerializer();
   1670 
   1671   Optional<SmallString<128>> Filename;
   1672   if (Optional<StringRef> FilenameRef = RS.getFilename()) {
   1673     Filename = *FilenameRef;
   1674     sys::fs::make_absolute(*Filename);
   1675     assert(!Filename->empty() && "The filename can't be empty.");
   1676   }
   1677 
   1678   std::string Buf;
   1679   raw_string_ostream OS(Buf);
   1680   std::unique_ptr<remarks::MetaSerializer> MetaSerializer =
   1681       Filename ? RemarkSerializer.metaSerializer(OS, StringRef(*Filename))
   1682                : RemarkSerializer.metaSerializer(OS);
   1683   MetaSerializer->emit();
   1684 
   1685   // Switch to the remarks section.
   1686   MCSection *RemarksSection =
   1687       OutContext.getObjectFileInfo()->getRemarksSection();
   1688   OutStreamer->SwitchSection(RemarksSection);
   1689 
   1690   OutStreamer->emitBinaryData(OS.str());
   1691 }
   1692 
   1693 bool AsmPrinter::doFinalization(Module &M) {
   1694   // Set the MachineFunction to nullptr so that we can catch attempted
   1695   // accesses to MF specific features at the module level and so that
   1696   // we can conditionalize accesses based on whether or not it is nullptr.
   1697   MF = nullptr;
   1698 
   1699   // Gather all GOT equivalent globals in the module. We really need two
   1700   // passes over the globals: one to compute and another to avoid its emission
   1701   // in EmitGlobalVariable, otherwise we would not be able to handle cases
   1702   // where the got equivalent shows up before its use.
   1703   computeGlobalGOTEquivs(M);
   1704 
   1705   // Emit global variables.
   1706   for (const auto &G : M.globals())
   1707     emitGlobalVariable(&G);
   1708 
   1709   // Emit remaining GOT equivalent globals.
   1710   emitGlobalGOTEquivs();
   1711 
   1712   const TargetLoweringObjectFile &TLOF = getObjFileLowering();
   1713 
   1714   // Emit linkage(XCOFF) and visibility info for declarations
   1715   for (const Function &F : M) {
   1716     if (!F.isDeclarationForLinker())
   1717       continue;
   1718 
   1719     MCSymbol *Name = getSymbol(&F);
   1720     // Function getSymbol gives us the function descriptor symbol for XCOFF.
   1721 
   1722     if (!TM.getTargetTriple().isOSBinFormatXCOFF()) {
   1723       GlobalValue::VisibilityTypes V = F.getVisibility();
   1724       if (V == GlobalValue::DefaultVisibility)
   1725         continue;
   1726 
   1727       emitVisibility(Name, V, false);
   1728       continue;
   1729     }
   1730 
   1731     if (F.isIntrinsic())
   1732       continue;
   1733 
   1734     // Handle the XCOFF case.
   1735     // Variable `Name` is the function descriptor symbol (see above). Get the
   1736     // function entry point symbol.
   1737     MCSymbol *FnEntryPointSym = TLOF.getFunctionEntryPointSymbol(&F, TM);
   1738     // Emit linkage for the function entry point.
   1739     emitLinkage(&F, FnEntryPointSym);
   1740 
   1741     // Emit linkage for the function descriptor.
   1742     emitLinkage(&F, Name);
   1743   }
   1744 
   1745   // Emit the remarks section contents.
   1746   // FIXME: Figure out when is the safest time to emit this section. It should
   1747   // not come after debug info.
   1748   if (remarks::RemarkStreamer *RS = M.getContext().getMainRemarkStreamer())
   1749     emitRemarksSection(*RS);
   1750 
   1751   TLOF.emitModuleMetadata(*OutStreamer, M);
   1752 
   1753   if (TM.getTargetTriple().isOSBinFormatELF()) {
   1754     MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>();
   1755 
   1756     // Output stubs for external and common global variables.
   1757     MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList();
   1758     if (!Stubs.empty()) {
   1759       OutStreamer->SwitchSection(TLOF.getDataSection());
   1760       const DataLayout &DL = M.getDataLayout();
   1761 
   1762       emitAlignment(Align(DL.getPointerSize()));
   1763       for (const auto &Stub : Stubs) {
   1764         OutStreamer->emitLabel(Stub.first);
   1765         OutStreamer->emitSymbolValue(Stub.second.getPointer(),
   1766                                      DL.getPointerSize());
   1767       }
   1768     }
   1769   }
   1770 
   1771   if (TM.getTargetTriple().isOSBinFormatCOFF()) {
   1772     MachineModuleInfoCOFF &MMICOFF =
   1773         MMI->getObjFileInfo<MachineModuleInfoCOFF>();
   1774 
   1775     // Output stubs for external and common global variables.
   1776     MachineModuleInfoCOFF::SymbolListTy Stubs = MMICOFF.GetGVStubList();
   1777     if (!Stubs.empty()) {
   1778       const DataLayout &DL = M.getDataLayout();
   1779 
   1780       for (const auto &Stub : Stubs) {
   1781         SmallString<256> SectionName = StringRef(".rdata$");
   1782         SectionName += Stub.first->getName();
   1783         OutStreamer->SwitchSection(OutContext.getCOFFSection(
   1784             SectionName,
   1785             COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ |
   1786                 COFF::IMAGE_SCN_LNK_COMDAT,
   1787             SectionKind::getReadOnly(), Stub.first->getName(),
   1788             COFF::IMAGE_COMDAT_SELECT_ANY));
   1789         emitAlignment(Align(DL.getPointerSize()));
   1790         OutStreamer->emitSymbolAttribute(Stub.first, MCSA_Global);
   1791         OutStreamer->emitLabel(Stub.first);
   1792         OutStreamer->emitSymbolValue(Stub.second.getPointer(),
   1793                                      DL.getPointerSize());
   1794       }
   1795     }
   1796   }
   1797 
   1798   // Finalize debug and EH information.
   1799   for (const HandlerInfo &HI : Handlers) {
   1800     NamedRegionTimer T(HI.TimerName, HI.TimerDescription, HI.TimerGroupName,
   1801                        HI.TimerGroupDescription, TimePassesIsEnabled);
   1802     HI.Handler->endModule();
   1803   }
   1804 
   1805   // This deletes all the ephemeral handlers that AsmPrinter added, while
   1806   // keeping all the user-added handlers alive until the AsmPrinter is
   1807   // destroyed.
   1808   Handlers.erase(Handlers.begin() + NumUserHandlers, Handlers.end());
   1809   DD = nullptr;
   1810 
   1811   // If the target wants to know about weak references, print them all.
   1812   if (MAI->getWeakRefDirective()) {
   1813     // FIXME: This is not lazy, it would be nice to only print weak references
   1814     // to stuff that is actually used.  Note that doing so would require targets
   1815     // to notice uses in operands (due to constant exprs etc).  This should
   1816     // happen with the MC stuff eventually.
   1817 
   1818     // Print out module-level global objects here.
   1819     for (const auto &GO : M.global_objects()) {
   1820       if (!GO.hasExternalWeakLinkage())
   1821         continue;
   1822       OutStreamer->emitSymbolAttribute(getSymbol(&GO), MCSA_WeakReference);
   1823     }
   1824   }
   1825 
   1826   // Print aliases in topological order, that is, for each alias a = b,
   1827   // b must be printed before a.
   1828   // This is because on some targets (e.g. PowerPC) linker expects aliases in
   1829   // such an order to generate correct TOC information.
   1830   SmallVector<const GlobalAlias *, 16> AliasStack;
   1831   SmallPtrSet<const GlobalAlias *, 16> AliasVisited;
   1832   for (const auto &Alias : M.aliases()) {
   1833     for (const GlobalAlias *Cur = &Alias; Cur;
   1834          Cur = dyn_cast<GlobalAlias>(Cur->getAliasee())) {
   1835       if (!AliasVisited.insert(Cur).second)
   1836         break;
   1837       AliasStack.push_back(Cur);
   1838     }
   1839     for (const GlobalAlias *AncestorAlias : llvm::reverse(AliasStack))
   1840       emitGlobalIndirectSymbol(M, *AncestorAlias);
   1841     AliasStack.clear();
   1842   }
   1843   for (const auto &IFunc : M.ifuncs())
   1844     emitGlobalIndirectSymbol(M, IFunc);
   1845 
   1846   GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
   1847   assert(MI && "AsmPrinter didn't require GCModuleInfo?");
   1848   for (GCModuleInfo::iterator I = MI->end(), E = MI->begin(); I != E; )
   1849     if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(**--I))
   1850       MP->finishAssembly(M, *MI, *this);
   1851 
   1852   // Emit llvm.ident metadata in an '.ident' directive.
   1853   emitModuleIdents(M);
   1854 
   1855   // Emit bytes for llvm.commandline metadata.
   1856   emitModuleCommandLines(M);
   1857 
   1858   // Emit __morestack address if needed for indirect calls.
   1859   if (MMI->usesMorestackAddr()) {
   1860     Align Alignment(1);
   1861     MCSection *ReadOnlySection = getObjFileLowering().getSectionForConstant(
   1862         getDataLayout(), SectionKind::getReadOnly(),
   1863         /*C=*/nullptr, Alignment);
   1864     OutStreamer->SwitchSection(ReadOnlySection);
   1865 
   1866     MCSymbol *AddrSymbol =
   1867         OutContext.getOrCreateSymbol(StringRef("__morestack_addr"));
   1868     OutStreamer->emitLabel(AddrSymbol);
   1869 
   1870     unsigned PtrSize = MAI->getCodePointerSize();
   1871     OutStreamer->emitSymbolValue(GetExternalSymbolSymbol("__morestack"),
   1872                                  PtrSize);
   1873   }
   1874 
   1875   // Emit .note.GNU-split-stack and .note.GNU-no-split-stack sections if
   1876   // split-stack is used.
   1877   if (TM.getTargetTriple().isOSBinFormatELF() && MMI->hasSplitStack()) {
   1878     OutStreamer->SwitchSection(
   1879         OutContext.getELFSection(".note.GNU-split-stack", ELF::SHT_PROGBITS, 0));
   1880     if (MMI->hasNosplitStack())
   1881       OutStreamer->SwitchSection(
   1882           OutContext.getELFSection(".note.GNU-no-split-stack", ELF::SHT_PROGBITS, 0));
   1883   }
   1884 
   1885   // If we don't have any trampolines, then we don't require stack memory
   1886   // to be executable. Some targets have a directive to declare this.
   1887   Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
   1888   if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
   1889     if (MCSection *S = MAI->getNonexecutableStackSection(OutContext))
   1890       OutStreamer->SwitchSection(S);
   1891 
   1892   if (TM.Options.EmitAddrsig) {
   1893     // Emit address-significance attributes for all globals.
   1894     OutStreamer->emitAddrsig();
   1895     for (const GlobalValue &GV : M.global_values()) {
   1896       if (!GV.use_empty() && !GV.isTransitiveUsedByMetadataOnly() &&
   1897           !GV.isThreadLocal() && !GV.hasDLLImportStorageClass() &&
   1898           !GV.getName().startswith("llvm.") && !GV.hasAtLeastLocalUnnamedAddr())
   1899         OutStreamer->emitAddrsigSym(getSymbol(&GV));
   1900     }
   1901   }
   1902 
   1903   // Emit symbol partition specifications (ELF only).
   1904   if (TM.getTargetTriple().isOSBinFormatELF()) {
   1905     unsigned UniqueID = 0;
   1906     for (const GlobalValue &GV : M.global_values()) {
   1907       if (!GV.hasPartition() || GV.isDeclarationForLinker() ||
   1908           GV.getVisibility() != GlobalValue::DefaultVisibility)
   1909         continue;
   1910 
   1911       OutStreamer->SwitchSection(
   1912           OutContext.getELFSection(".llvm_sympart", ELF::SHT_LLVM_SYMPART, 0, 0,
   1913                                    "", false, ++UniqueID, nullptr));
   1914       OutStreamer->emitBytes(GV.getPartition());
   1915       OutStreamer->emitZeros(1);
   1916       OutStreamer->emitValue(
   1917           MCSymbolRefExpr::create(getSymbol(&GV), OutContext),
   1918           MAI->getCodePointerSize());
   1919     }
   1920   }
   1921 
   1922   // Allow the target to emit any magic that it wants at the end of the file,
   1923   // after everything else has gone out.
   1924   emitEndOfAsmFile(M);
   1925 
   1926   MMI = nullptr;
   1927 
   1928   OutStreamer->Finish();
   1929   OutStreamer->reset();
   1930   OwnedMLI.reset();
   1931   OwnedMDT.reset();
   1932 
   1933   return false;
   1934 }
   1935 
   1936 MCSymbol *AsmPrinter::getMBBExceptionSym(const MachineBasicBlock &MBB) {
   1937   auto Res = MBBSectionExceptionSyms.try_emplace(MBB.getSectionIDNum());
   1938   if (Res.second)
   1939     Res.first->second = createTempSymbol("exception");
   1940   return Res.first->second;
   1941 }
   1942 
   1943 void AsmPrinter::SetupMachineFunction(MachineFunction &MF) {
   1944   this->MF = &MF;
   1945   const Function &F = MF.getFunction();
   1946 
   1947   // Get the function symbol.
   1948   if (!MAI->needsFunctionDescriptors()) {
   1949     CurrentFnSym = getSymbol(&MF.getFunction());
   1950   } else {
   1951     assert(TM.getTargetTriple().isOSAIX() &&
   1952            "Only AIX uses the function descriptor hooks.");
   1953     // AIX is unique here in that the name of the symbol emitted for the
   1954     // function body does not have the same name as the source function's
   1955     // C-linkage name.
   1956     assert(CurrentFnDescSym && "The function descriptor symbol needs to be"
   1957                                " initalized first.");
   1958 
   1959     // Get the function entry point symbol.
   1960     CurrentFnSym = getObjFileLowering().getFunctionEntryPointSymbol(&F, TM);
   1961   }
   1962 
   1963   CurrentFnSymForSize = CurrentFnSym;
   1964   CurrentFnBegin = nullptr;
   1965   CurrentSectionBeginSym = nullptr;
   1966   MBBSectionRanges.clear();
   1967   MBBSectionExceptionSyms.clear();
   1968   bool NeedsLocalForSize = MAI->needsLocalForSize();
   1969   if (F.hasFnAttribute("patchable-function-entry") ||
   1970       F.hasFnAttribute("function-instrument") ||
   1971       F.hasFnAttribute("xray-instruction-threshold") ||
   1972       needFuncLabelsForEHOrDebugInfo(MF) || NeedsLocalForSize ||
   1973       MF.getTarget().Options.EmitStackSizeSection || MF.hasBBLabels()) {
   1974     CurrentFnBegin = createTempSymbol("func_begin");
   1975     if (NeedsLocalForSize)
   1976       CurrentFnSymForSize = CurrentFnBegin;
   1977   }
   1978 
   1979   ORE = &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
   1980 }
   1981 
   1982 namespace {
   1983 
   1984 // Keep track the alignment, constpool entries per Section.
   1985   struct SectionCPs {
   1986     MCSection *S;
   1987     Align Alignment;
   1988     SmallVector<unsigned, 4> CPEs;
   1989 
   1990     SectionCPs(MCSection *s, Align a) : S(s), Alignment(a) {}
   1991   };
   1992 
   1993 } // end anonymous namespace
   1994 
   1995 /// EmitConstantPool - Print to the current output stream assembly
   1996 /// representations of the constants in the constant pool MCP. This is
   1997 /// used to print out constants which have been "spilled to memory" by
   1998 /// the code generator.
   1999 void AsmPrinter::emitConstantPool() {
   2000   const MachineConstantPool *MCP = MF->getConstantPool();
   2001   const std::vector<MachineConstantPoolEntry> &CP = MCP->getConstants();
   2002   if (CP.empty()) return;
   2003 
   2004   // Calculate sections for constant pool entries. We collect entries to go into
   2005   // the same section together to reduce amount of section switch statements.
   2006   SmallVector<SectionCPs, 4> CPSections;
   2007   for (unsigned i = 0, e = CP.size(); i != e; ++i) {
   2008     const MachineConstantPoolEntry &CPE = CP[i];
   2009     Align Alignment = CPE.getAlign();
   2010 
   2011     SectionKind Kind = CPE.getSectionKind(&getDataLayout());
   2012 
   2013     const Constant *C = nullptr;
   2014     if (!CPE.isMachineConstantPoolEntry())
   2015       C = CPE.Val.ConstVal;
   2016 
   2017     MCSection *S = getObjFileLowering().getSectionForConstant(
   2018         getDataLayout(), Kind, C, Alignment);
   2019 
   2020     // The number of sections are small, just do a linear search from the
   2021     // last section to the first.
   2022     bool Found = false;
   2023     unsigned SecIdx = CPSections.size();
   2024     while (SecIdx != 0) {
   2025       if (CPSections[--SecIdx].S == S) {
   2026         Found = true;
   2027         break;
   2028       }
   2029     }
   2030     if (!Found) {
   2031       SecIdx = CPSections.size();
   2032       CPSections.push_back(SectionCPs(S, Alignment));
   2033     }
   2034 
   2035     if (Alignment > CPSections[SecIdx].Alignment)
   2036       CPSections[SecIdx].Alignment = Alignment;
   2037     CPSections[SecIdx].CPEs.push_back(i);
   2038   }
   2039 
   2040   // Now print stuff into the calculated sections.
   2041   const MCSection *CurSection = nullptr;
   2042   unsigned Offset = 0;
   2043   for (unsigned i = 0, e = CPSections.size(); i != e; ++i) {
   2044     for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) {
   2045       unsigned CPI = CPSections[i].CPEs[j];
   2046       MCSymbol *Sym = GetCPISymbol(CPI);
   2047       if (!Sym->isUndefined())
   2048         continue;
   2049 
   2050       if (CurSection != CPSections[i].S) {
   2051         OutStreamer->SwitchSection(CPSections[i].S);
   2052         emitAlignment(Align(CPSections[i].Alignment));
   2053         CurSection = CPSections[i].S;
   2054         Offset = 0;
   2055       }
   2056 
   2057       MachineConstantPoolEntry CPE = CP[CPI];
   2058 
   2059       // Emit inter-object padding for alignment.
   2060       unsigned NewOffset = alignTo(Offset, CPE.getAlign());
   2061       OutStreamer->emitZeros(NewOffset - Offset);
   2062 
   2063       Offset = NewOffset + CPE.getSizeInBytes(getDataLayout());
   2064 
   2065       OutStreamer->emitLabel(Sym);
   2066       if (CPE.isMachineConstantPoolEntry())
   2067         emitMachineConstantPoolValue(CPE.Val.MachineCPVal);
   2068       else
   2069         emitGlobalConstant(getDataLayout(), CPE.Val.ConstVal);
   2070     }
   2071   }
   2072 }
   2073 
   2074 // Print assembly representations of the jump tables used by the current
   2075 // function.
   2076 void AsmPrinter::emitJumpTableInfo() {
   2077   const DataLayout &DL = MF->getDataLayout();
   2078   const MachineJumpTableInfo *MJTI = MF->getJumpTableInfo();
   2079   if (!MJTI) return;
   2080   if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_Inline) return;
   2081   const std::vector<MachineJumpTableEntry> &JT = MJTI->getJumpTables();
   2082   if (JT.empty()) return;
   2083 
   2084   // Pick the directive to use to print the jump table entries, and switch to
   2085   // the appropriate section.
   2086   const Function &F = MF->getFunction();
   2087   const TargetLoweringObjectFile &TLOF = getObjFileLowering();
   2088   bool JTInDiffSection = !TLOF.shouldPutJumpTableInFunctionSection(
   2089       MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32,
   2090       F);
   2091   if (JTInDiffSection) {
   2092     // Drop it in the readonly section.
   2093     MCSection *ReadOnlySection = TLOF.getSectionForJumpTable(F, TM);
   2094     OutStreamer->SwitchSection(ReadOnlySection);
   2095   }
   2096 
   2097   emitAlignment(Align(MJTI->getEntryAlignment(DL)));
   2098 
   2099   // Jump tables in code sections are marked with a data_region directive
   2100   // where that's supported.
   2101   if (!JTInDiffSection)
   2102     OutStreamer->emitDataRegion(MCDR_DataRegionJT32);
   2103 
   2104   for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) {
   2105     const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
   2106 
   2107     // If this jump table was deleted, ignore it.
   2108     if (JTBBs.empty()) continue;
   2109 
   2110     // For the EK_LabelDifference32 entry, if using .set avoids a relocation,
   2111     /// emit a .set directive for each unique entry.
   2112     if (MJTI->getEntryKind() == MachineJumpTableInfo::EK_LabelDifference32 &&
   2113         MAI->doesSetDirectiveSuppressReloc()) {
   2114       SmallPtrSet<const MachineBasicBlock*, 16> EmittedSets;
   2115       const TargetLowering *TLI = MF->getSubtarget().getTargetLowering();
   2116       const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF,JTI,OutContext);
   2117       for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii) {
   2118         const MachineBasicBlock *MBB = JTBBs[ii];
   2119         if (!EmittedSets.insert(MBB).second)
   2120           continue;
   2121 
   2122         // .set LJTSet, LBB32-base
   2123         const MCExpr *LHS =
   2124           MCSymbolRefExpr::create(MBB->getSymbol(), OutContext);
   2125         OutStreamer->emitAssignment(GetJTSetSymbol(JTI, MBB->getNumber()),
   2126                                     MCBinaryExpr::createSub(LHS, Base,
   2127                                                             OutContext));
   2128       }
   2129     }
   2130 
   2131     // On some targets (e.g. Darwin) we want to emit two consecutive labels
   2132     // before each jump table.  The first label is never referenced, but tells
   2133     // the assembler and linker the extents of the jump table object.  The
   2134     // second label is actually referenced by the code.
   2135     if (JTInDiffSection && DL.hasLinkerPrivateGlobalPrefix())
   2136       // FIXME: This doesn't have to have any specific name, just any randomly
   2137       // named and numbered local label started with 'l' would work.  Simplify
   2138       // GetJTISymbol.
   2139       OutStreamer->emitLabel(GetJTISymbol(JTI, true));
   2140 
   2141     MCSymbol* JTISymbol = GetJTISymbol(JTI);
   2142     OutStreamer->emitLabel(JTISymbol);
   2143 
   2144     for (unsigned ii = 0, ee = JTBBs.size(); ii != ee; ++ii)
   2145       emitJumpTableEntry(MJTI, JTBBs[ii], JTI);
   2146   }
   2147   if (!JTInDiffSection)
   2148     OutStreamer->emitDataRegion(MCDR_DataRegionEnd);
   2149 }
   2150 
   2151 /// EmitJumpTableEntry - Emit a jump table entry for the specified MBB to the
   2152 /// current stream.
   2153 void AsmPrinter::emitJumpTableEntry(const MachineJumpTableInfo *MJTI,
   2154                                     const MachineBasicBlock *MBB,
   2155                                     unsigned UID) const {
   2156   assert(MBB && MBB->getNumber() >= 0 && "Invalid basic block");
   2157   const MCExpr *Value = nullptr;
   2158   switch (MJTI->getEntryKind()) {
   2159   case MachineJumpTableInfo::EK_Inline:
   2160     llvm_unreachable("Cannot emit EK_Inline jump table entry");
   2161   case MachineJumpTableInfo::EK_Custom32:
   2162     Value = MF->getSubtarget().getTargetLowering()->LowerCustomJumpTableEntry(
   2163         MJTI, MBB, UID, OutContext);
   2164     break;
   2165   case MachineJumpTableInfo::EK_BlockAddress:
   2166     // EK_BlockAddress - Each entry is a plain address of block, e.g.:
   2167     //     .word LBB123
   2168     Value = MCSymbolRefExpr::create(MBB->getSymbol(), OutContext);
   2169     break;
   2170   case MachineJumpTableInfo::EK_GPRel32BlockAddress: {
   2171     // EK_GPRel32BlockAddress - Each entry is an address of block, encoded
   2172     // with a relocation as gp-relative, e.g.:
   2173     //     .gprel32 LBB123
   2174     MCSymbol *MBBSym = MBB->getSymbol();
   2175     OutStreamer->emitGPRel32Value(MCSymbolRefExpr::create(MBBSym, OutContext));
   2176     return;
   2177   }
   2178 
   2179   case MachineJumpTableInfo::EK_GPRel64BlockAddress: {
   2180     // EK_GPRel64BlockAddress - Each entry is an address of block, encoded
   2181     // with a relocation as gp-relative, e.g.:
   2182     //     .gpdword LBB123
   2183     MCSymbol *MBBSym = MBB->getSymbol();
   2184     OutStreamer->emitGPRel64Value(MCSymbolRefExpr::create(MBBSym, OutContext));
   2185     return;
   2186   }
   2187 
   2188   case MachineJumpTableInfo::EK_LabelDifference32: {
   2189     // Each entry is the address of the block minus the address of the jump
   2190     // table. This is used for PIC jump tables where gprel32 is not supported.
   2191     // e.g.:
   2192     //      .word LBB123 - LJTI1_2
   2193     // If the .set directive avoids relocations, this is emitted as:
   2194     //      .set L4_5_set_123, LBB123 - LJTI1_2
   2195     //      .word L4_5_set_123
   2196     if (MAI->doesSetDirectiveSuppressReloc()) {
   2197       Value = MCSymbolRefExpr::create(GetJTSetSymbol(UID, MBB->getNumber()),
   2198                                       OutContext);
   2199       break;
   2200     }
   2201     Value = MCSymbolRefExpr::create(MBB->getSymbol(), OutContext);
   2202     const TargetLowering *TLI = MF->getSubtarget().getTargetLowering();
   2203     const MCExpr *Base = TLI->getPICJumpTableRelocBaseExpr(MF, UID, OutContext);
   2204     Value = MCBinaryExpr::createSub(Value, Base, OutContext);
   2205     break;
   2206   }
   2207   }
   2208 
   2209   assert(Value && "Unknown entry kind!");
   2210 
   2211   unsigned EntrySize = MJTI->getEntrySize(getDataLayout());
   2212   OutStreamer->emitValue(Value, EntrySize);
   2213 }
   2214 
   2215 /// EmitSpecialLLVMGlobal - Check to see if the specified global is a
   2216 /// special global used by LLVM.  If so, emit it and return true, otherwise
   2217 /// do nothing and return false.
   2218 bool AsmPrinter::emitSpecialLLVMGlobal(const GlobalVariable *GV) {
   2219   if (GV->getName() == "llvm.used") {
   2220     if (MAI->hasNoDeadStrip())    // No need to emit this at all.
   2221       emitLLVMUsedList(cast<ConstantArray>(GV->getInitializer()));
   2222     return true;
   2223   }
   2224 
   2225   // Ignore debug and non-emitted data.  This handles llvm.compiler.used.
   2226   if (GV->getSection() == "llvm.metadata" ||
   2227       GV->hasAvailableExternallyLinkage())
   2228     return true;
   2229 
   2230   if (!GV->hasAppendingLinkage()) return false;
   2231 
   2232   assert(GV->hasInitializer() && "Not a special LLVM global!");
   2233 
   2234   if (GV->getName() == "llvm.global_ctors") {
   2235     emitXXStructorList(GV->getParent()->getDataLayout(), GV->getInitializer(),
   2236                        /* isCtor */ true);
   2237 
   2238     return true;
   2239   }
   2240 
   2241   if (GV->getName() == "llvm.global_dtors") {
   2242     emitXXStructorList(GV->getParent()->getDataLayout(), GV->getInitializer(),
   2243                        /* isCtor */ false);
   2244 
   2245     return true;
   2246   }
   2247 
   2248   report_fatal_error("unknown special variable");
   2249 }
   2250 
   2251 /// EmitLLVMUsedList - For targets that define a MAI::UsedDirective, mark each
   2252 /// global in the specified llvm.used list.
   2253 void AsmPrinter::emitLLVMUsedList(const ConstantArray *InitList) {
   2254   // Should be an array of 'i8*'.
   2255   for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
   2256     const GlobalValue *GV =
   2257       dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts());
   2258     if (GV)
   2259       OutStreamer->emitSymbolAttribute(getSymbol(GV), MCSA_NoDeadStrip);
   2260   }
   2261 }
   2262 
   2263 void AsmPrinter::preprocessXXStructorList(const DataLayout &DL,
   2264                                           const Constant *List,
   2265                                           SmallVector<Structor, 8> &Structors) {
   2266   // Should be an array of '{ i32, void ()*, i8* }' structs.  The first value is
   2267   // the init priority.
   2268   if (!isa<ConstantArray>(List))
   2269     return;
   2270 
   2271   // Gather the structors in a form that's convenient for sorting by priority.
   2272   for (Value *O : cast<ConstantArray>(List)->operands()) {
   2273     auto *CS = cast<ConstantStruct>(O);
   2274     if (CS->getOperand(1)->isNullValue())
   2275       break; // Found a null terminator, skip the rest.
   2276     ConstantInt *Priority = dyn_cast<ConstantInt>(CS->getOperand(0));
   2277     if (!Priority)
   2278       continue; // Malformed.
   2279     Structors.push_back(Structor());
   2280     Structor &S = Structors.back();
   2281     S.Priority = Priority->getLimitedValue(65535);
   2282     S.Func = CS->getOperand(1);
   2283     if (!CS->getOperand(2)->isNullValue()) {
   2284       if (TM.getTargetTriple().isOSAIX())
   2285         llvm::report_fatal_error(
   2286             "associated data of XXStructor list is not yet supported on AIX");
   2287       S.ComdatKey =
   2288           dyn_cast<GlobalValue>(CS->getOperand(2)->stripPointerCasts());
   2289     }
   2290   }
   2291 
   2292   // Emit the function pointers in the target-specific order
   2293   llvm::stable_sort(Structors, [](const Structor &L, const Structor &R) {
   2294     return L.Priority < R.Priority;
   2295   });
   2296 }
   2297 
   2298 /// EmitXXStructorList - Emit the ctor or dtor list taking into account the init
   2299 /// priority.
   2300 void AsmPrinter::emitXXStructorList(const DataLayout &DL, const Constant *List,
   2301                                     bool IsCtor) {
   2302   SmallVector<Structor, 8> Structors;
   2303   preprocessXXStructorList(DL, List, Structors);
   2304   if (Structors.empty())
   2305     return;
   2306 
   2307   const Align Align = DL.getPointerPrefAlignment();
   2308   for (Structor &S : Structors) {
   2309     const TargetLoweringObjectFile &Obj = getObjFileLowering();
   2310     const MCSymbol *KeySym = nullptr;
   2311     if (GlobalValue *GV = S.ComdatKey) {
   2312       if (GV->isDeclarationForLinker())
   2313         // If the associated variable is not defined in this module
   2314         // (it might be available_externally, or have been an
   2315         // available_externally definition that was dropped by the
   2316         // EliminateAvailableExternally pass), some other TU
   2317         // will provide its dynamic initializer.
   2318         continue;
   2319 
   2320       KeySym = getSymbol(GV);
   2321     }
   2322 
   2323     MCSection *OutputSection =
   2324         (IsCtor ? Obj.getStaticCtorSection(S.Priority, KeySym)
   2325                 : Obj.getStaticDtorSection(S.Priority, KeySym));
   2326     OutStreamer->SwitchSection(OutputSection);
   2327     if (OutStreamer->getCurrentSection() != OutStreamer->getPreviousSection())
   2328       emitAlignment(Align);
   2329     emitXXStructor(DL, S.Func);
   2330   }
   2331 }
   2332 
   2333 void AsmPrinter::emitModuleIdents(Module &M) {
   2334   if (!MAI->hasIdentDirective())
   2335     return;
   2336 
   2337   if (const NamedMDNode *NMD = M.getNamedMetadata("llvm.ident")) {
   2338     for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
   2339       const MDNode *N = NMD->getOperand(i);
   2340       assert(N->getNumOperands() == 1 &&
   2341              "llvm.ident metadata entry can have only one operand");
   2342       const MDString *S = cast<MDString>(N->getOperand(0));
   2343       OutStreamer->emitIdent(S->getString());
   2344     }
   2345   }
   2346 }
   2347 
   2348 void AsmPrinter::emitModuleCommandLines(Module &M) {
   2349   MCSection *CommandLine = getObjFileLowering().getSectionForCommandLines();
   2350   if (!CommandLine)
   2351     return;
   2352 
   2353   const NamedMDNode *NMD = M.getNamedMetadata("llvm.commandline");
   2354   if (!NMD || !NMD->getNumOperands())
   2355     return;
   2356 
   2357   OutStreamer->PushSection();
   2358   OutStreamer->SwitchSection(CommandLine);
   2359   OutStreamer->emitZeros(1);
   2360   for (unsigned i = 0, e = NMD->getNumOperands(); i != e; ++i) {
   2361     const MDNode *N = NMD->getOperand(i);
   2362     assert(N->getNumOperands() == 1 &&
   2363            "llvm.commandline metadata entry can have only one operand");
   2364     const MDString *S = cast<MDString>(N->getOperand(0));
   2365     OutStreamer->emitBytes(S->getString());
   2366     OutStreamer->emitZeros(1);
   2367   }
   2368   OutStreamer->PopSection();
   2369 }
   2370 
   2371 //===--------------------------------------------------------------------===//
   2372 // Emission and print routines
   2373 //
   2374 
   2375 /// Emit a byte directive and value.
   2376 ///
   2377 void AsmPrinter::emitInt8(int Value) const { OutStreamer->emitInt8(Value); }
   2378 
   2379 /// Emit a short directive and value.
   2380 void AsmPrinter::emitInt16(int Value) const { OutStreamer->emitInt16(Value); }
   2381 
   2382 /// Emit a long directive and value.
   2383 void AsmPrinter::emitInt32(int Value) const { OutStreamer->emitInt32(Value); }
   2384 
   2385 /// Emit a long long directive and value.
   2386 void AsmPrinter::emitInt64(uint64_t Value) const {
   2387   OutStreamer->emitInt64(Value);
   2388 }
   2389 
   2390 /// Emit something like ".long Hi-Lo" where the size in bytes of the directive
   2391 /// is specified by Size and Hi/Lo specify the labels. This implicitly uses
   2392 /// .set if it avoids relocations.
   2393 void AsmPrinter::emitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo,
   2394                                      unsigned Size) const {
   2395   OutStreamer->emitAbsoluteSymbolDiff(Hi, Lo, Size);
   2396 }
   2397 
   2398 /// EmitLabelPlusOffset - Emit something like ".long Label+Offset"
   2399 /// where the size in bytes of the directive is specified by Size and Label
   2400 /// specifies the label.  This implicitly uses .set if it is available.
   2401 void AsmPrinter::emitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset,
   2402                                      unsigned Size,
   2403                                      bool IsSectionRelative) const {
   2404   if (MAI->needsDwarfSectionOffsetDirective() && IsSectionRelative) {
   2405     OutStreamer->EmitCOFFSecRel32(Label, Offset);
   2406     if (Size > 4)
   2407       OutStreamer->emitZeros(Size - 4);
   2408     return;
   2409   }
   2410 
   2411   // Emit Label+Offset (or just Label if Offset is zero)
   2412   const MCExpr *Expr = MCSymbolRefExpr::create(Label, OutContext);
   2413   if (Offset)
   2414     Expr = MCBinaryExpr::createAdd(
   2415         Expr, MCConstantExpr::create(Offset, OutContext), OutContext);
   2416 
   2417   OutStreamer->emitValue(Expr, Size);
   2418 }
   2419 
   2420 //===----------------------------------------------------------------------===//
   2421 
   2422 // EmitAlignment - Emit an alignment directive to the specified power of
   2423 // two boundary.  If a global value is specified, and if that global has
   2424 // an explicit alignment requested, it will override the alignment request
   2425 // if required for correctness.
   2426 void AsmPrinter::emitAlignment(Align Alignment, const GlobalObject *GV) const {
   2427   if (GV)
   2428     Alignment = getGVAlignment(GV, GV->getParent()->getDataLayout(), Alignment);
   2429 
   2430   if (Alignment == Align(1))
   2431     return; // 1-byte aligned: no need to emit alignment.
   2432 
   2433   if (getCurrentSection()->getKind().isText())
   2434     OutStreamer->emitCodeAlignment(Alignment.value());
   2435   else
   2436     OutStreamer->emitValueToAlignment(Alignment.value());
   2437 }
   2438 
   2439 //===----------------------------------------------------------------------===//
   2440 // Constant emission.
   2441 //===----------------------------------------------------------------------===//
   2442 
   2443 const MCExpr *AsmPrinter::lowerConstant(const Constant *CV) {
   2444   MCContext &Ctx = OutContext;
   2445 
   2446   if (CV->isNullValue() || isa<UndefValue>(CV))
   2447     return MCConstantExpr::create(0, Ctx);
   2448 
   2449   if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV))
   2450     return MCConstantExpr::create(CI->getZExtValue(), Ctx);
   2451 
   2452   if (const GlobalValue *GV = dyn_cast<GlobalValue>(CV))
   2453     return MCSymbolRefExpr::create(getSymbol(GV), Ctx);
   2454 
   2455   if (const BlockAddress *BA = dyn_cast<BlockAddress>(CV))
   2456     return MCSymbolRefExpr::create(GetBlockAddressSymbol(BA), Ctx);
   2457 
   2458   if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(CV))
   2459     return getObjFileLowering().lowerDSOLocalEquivalent(Equiv, TM);
   2460 
   2461   const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV);
   2462   if (!CE) {
   2463     llvm_unreachable("Unknown constant value to lower!");
   2464   }
   2465 
   2466   switch (CE->getOpcode()) {
   2467   case Instruction::AddrSpaceCast: {
   2468     const Constant *Op = CE->getOperand(0);
   2469     unsigned DstAS = CE->getType()->getPointerAddressSpace();
   2470     unsigned SrcAS = Op->getType()->getPointerAddressSpace();
   2471     if (TM.isNoopAddrSpaceCast(SrcAS, DstAS))
   2472       return lowerConstant(Op);
   2473 
   2474     // Fallthrough to error.
   2475     LLVM_FALLTHROUGH;
   2476   }
   2477   default: {
   2478     // If the code isn't optimized, there may be outstanding folding
   2479     // opportunities. Attempt to fold the expression using DataLayout as a
   2480     // last resort before giving up.
   2481     Constant *C = ConstantFoldConstant(CE, getDataLayout());
   2482     if (C != CE)
   2483       return lowerConstant(C);
   2484 
   2485     // Otherwise report the problem to the user.
   2486     std::string S;
   2487     raw_string_ostream OS(S);
   2488     OS << "Unsupported expression in static initializer: ";
   2489     CE->printAsOperand(OS, /*PrintType=*/false,
   2490                    !MF ? nullptr : MF->getFunction().getParent());
   2491     report_fatal_error(OS.str());
   2492   }
   2493   case Instruction::GetElementPtr: {
   2494     // Generate a symbolic expression for the byte address
   2495     APInt OffsetAI(getDataLayout().getPointerTypeSizeInBits(CE->getType()), 0);
   2496     cast<GEPOperator>(CE)->accumulateConstantOffset(getDataLayout(), OffsetAI);
   2497 
   2498     const MCExpr *Base = lowerConstant(CE->getOperand(0));
   2499     if (!OffsetAI)
   2500       return Base;
   2501 
   2502     int64_t Offset = OffsetAI.getSExtValue();
   2503     return MCBinaryExpr::createAdd(Base, MCConstantExpr::create(Offset, Ctx),
   2504                                    Ctx);
   2505   }
   2506 
   2507   case Instruction::Trunc:
   2508     // We emit the value and depend on the assembler to truncate the generated
   2509     // expression properly.  This is important for differences between
   2510     // blockaddress labels.  Since the two labels are in the same function, it
   2511     // is reasonable to treat their delta as a 32-bit value.
   2512     LLVM_FALLTHROUGH;
   2513   case Instruction::BitCast:
   2514     return lowerConstant(CE->getOperand(0));
   2515 
   2516   case Instruction::IntToPtr: {
   2517     const DataLayout &DL = getDataLayout();
   2518 
   2519     // Handle casts to pointers by changing them into casts to the appropriate
   2520     // integer type.  This promotes constant folding and simplifies this code.
   2521     Constant *Op = CE->getOperand(0);
   2522     Op = ConstantExpr::getIntegerCast(Op, DL.getIntPtrType(CV->getType()),
   2523                                       false/*ZExt*/);
   2524     return lowerConstant(Op);
   2525   }
   2526 
   2527   case Instruction::PtrToInt: {
   2528     const DataLayout &DL = getDataLayout();
   2529 
   2530     // Support only foldable casts to/from pointers that can be eliminated by
   2531     // changing the pointer to the appropriately sized integer type.
   2532     Constant *Op = CE->getOperand(0);
   2533     Type *Ty = CE->getType();
   2534 
   2535     const MCExpr *OpExpr = lowerConstant(Op);
   2536 
   2537     // We can emit the pointer value into this slot if the slot is an
   2538     // integer slot equal to the size of the pointer.
   2539     //
   2540     // If the pointer is larger than the resultant integer, then
   2541     // as with Trunc just depend on the assembler to truncate it.
   2542     if (DL.getTypeAllocSize(Ty).getFixedSize() <=
   2543         DL.getTypeAllocSize(Op->getType()).getFixedSize())
   2544       return OpExpr;
   2545 
   2546     // Otherwise the pointer is smaller than the resultant integer, mask off
   2547     // the high bits so we are sure to get a proper truncation if the input is
   2548     // a constant expr.
   2549     unsigned InBits = DL.getTypeAllocSizeInBits(Op->getType());
   2550     const MCExpr *MaskExpr = MCConstantExpr::create(~0ULL >> (64-InBits), Ctx);
   2551     return MCBinaryExpr::createAnd(OpExpr, MaskExpr, Ctx);
   2552   }
   2553 
   2554   case Instruction::Sub: {
   2555     GlobalValue *LHSGV;
   2556     APInt LHSOffset;
   2557     DSOLocalEquivalent *DSOEquiv;
   2558     if (IsConstantOffsetFromGlobal(CE->getOperand(0), LHSGV, LHSOffset,
   2559                                    getDataLayout(), &DSOEquiv)) {
   2560       GlobalValue *RHSGV;
   2561       APInt RHSOffset;
   2562       if (IsConstantOffsetFromGlobal(CE->getOperand(1), RHSGV, RHSOffset,
   2563                                      getDataLayout())) {
   2564         const MCExpr *RelocExpr =
   2565             getObjFileLowering().lowerRelativeReference(LHSGV, RHSGV, TM);
   2566         if (!RelocExpr) {
   2567           const MCExpr *LHSExpr =
   2568               MCSymbolRefExpr::create(getSymbol(LHSGV), Ctx);
   2569           if (DSOEquiv &&
   2570               getObjFileLowering().supportDSOLocalEquivalentLowering())
   2571             LHSExpr =
   2572                 getObjFileLowering().lowerDSOLocalEquivalent(DSOEquiv, TM);
   2573           RelocExpr = MCBinaryExpr::createSub(
   2574               LHSExpr, MCSymbolRefExpr::create(getSymbol(RHSGV), Ctx), Ctx);
   2575         }
   2576         int64_t Addend = (LHSOffset - RHSOffset).getSExtValue();
   2577         if (Addend != 0)
   2578           RelocExpr = MCBinaryExpr::createAdd(
   2579               RelocExpr, MCConstantExpr::create(Addend, Ctx), Ctx);
   2580         return RelocExpr;
   2581       }
   2582     }
   2583   }
   2584   // else fallthrough
   2585   LLVM_FALLTHROUGH;
   2586 
   2587   // The MC library also has a right-shift operator, but it isn't consistently
   2588   // signed or unsigned between different targets.
   2589   case Instruction::Add:
   2590   case Instruction::Mul:
   2591   case Instruction::SDiv:
   2592   case Instruction::SRem:
   2593   case Instruction::Shl:
   2594   case Instruction::And:
   2595   case Instruction::Or:
   2596   case Instruction::Xor: {
   2597     const MCExpr *LHS = lowerConstant(CE->getOperand(0));
   2598     const MCExpr *RHS = lowerConstant(CE->getOperand(1));
   2599     switch (CE->getOpcode()) {
   2600     default: llvm_unreachable("Unknown binary operator constant cast expr");
   2601     case Instruction::Add: return MCBinaryExpr::createAdd(LHS, RHS, Ctx);
   2602     case Instruction::Sub: return MCBinaryExpr::createSub(LHS, RHS, Ctx);
   2603     case Instruction::Mul: return MCBinaryExpr::createMul(LHS, RHS, Ctx);
   2604     case Instruction::SDiv: return MCBinaryExpr::createDiv(LHS, RHS, Ctx);
   2605     case Instruction::SRem: return MCBinaryExpr::createMod(LHS, RHS, Ctx);
   2606     case Instruction::Shl: return MCBinaryExpr::createShl(LHS, RHS, Ctx);
   2607     case Instruction::And: return MCBinaryExpr::createAnd(LHS, RHS, Ctx);
   2608     case Instruction::Or:  return MCBinaryExpr::createOr (LHS, RHS, Ctx);
   2609     case Instruction::Xor: return MCBinaryExpr::createXor(LHS, RHS, Ctx);
   2610     }
   2611   }
   2612   }
   2613 }
   2614 
   2615 static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *C,
   2616                                    AsmPrinter &AP,
   2617                                    const Constant *BaseCV = nullptr,
   2618                                    uint64_t Offset = 0);
   2619 
   2620 static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP);
   2621 static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP);
   2622 
   2623 /// isRepeatedByteSequence - Determine whether the given value is
   2624 /// composed of a repeated sequence of identical bytes and return the
   2625 /// byte value.  If it is not a repeated sequence, return -1.
   2626 static int isRepeatedByteSequence(const ConstantDataSequential *V) {
   2627   StringRef Data = V->getRawDataValues();
   2628   assert(!Data.empty() && "Empty aggregates should be CAZ node");
   2629   char C = Data[0];
   2630   for (unsigned i = 1, e = Data.size(); i != e; ++i)
   2631     if (Data[i] != C) return -1;
   2632   return static_cast<uint8_t>(C); // Ensure 255 is not returned as -1.
   2633 }
   2634 
   2635 /// isRepeatedByteSequence - Determine whether the given value is
   2636 /// composed of a repeated sequence of identical bytes and return the
   2637 /// byte value.  If it is not a repeated sequence, return -1.
   2638 static int isRepeatedByteSequence(const Value *V, const DataLayout &DL) {
   2639   if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
   2640     uint64_t Size = DL.getTypeAllocSizeInBits(V->getType());
   2641     assert(Size % 8 == 0);
   2642 
   2643     // Extend the element to take zero padding into account.
   2644     APInt Value = CI->getValue().zextOrSelf(Size);
   2645     if (!Value.isSplat(8))
   2646       return -1;
   2647 
   2648     return Value.zextOrTrunc(8).getZExtValue();
   2649   }
   2650   if (const ConstantArray *CA = dyn_cast<ConstantArray>(V)) {
   2651     // Make sure all array elements are sequences of the same repeated
   2652     // byte.
   2653     assert(CA->getNumOperands() != 0 && "Should be a CAZ");
   2654     Constant *Op0 = CA->getOperand(0);
   2655     int Byte = isRepeatedByteSequence(Op0, DL);
   2656     if (Byte == -1)
   2657       return -1;
   2658 
   2659     // All array elements must be equal.
   2660     for (unsigned i = 1, e = CA->getNumOperands(); i != e; ++i)
   2661       if (CA->getOperand(i) != Op0)
   2662         return -1;
   2663     return Byte;
   2664   }
   2665 
   2666   if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(V))
   2667     return isRepeatedByteSequence(CDS);
   2668 
   2669   return -1;
   2670 }
   2671 
   2672 static void emitGlobalConstantDataSequential(const DataLayout &DL,
   2673                                              const ConstantDataSequential *CDS,
   2674                                              AsmPrinter &AP) {
   2675   // See if we can aggregate this into a .fill, if so, emit it as such.
   2676   int Value = isRepeatedByteSequence(CDS, DL);
   2677   if (Value != -1) {
   2678     uint64_t Bytes = DL.getTypeAllocSize(CDS->getType());
   2679     // Don't emit a 1-byte object as a .fill.
   2680     if (Bytes > 1)
   2681       return AP.OutStreamer->emitFill(Bytes, Value);
   2682   }
   2683 
   2684   // If this can be emitted with .ascii/.asciz, emit it as such.
   2685   if (CDS->isString())
   2686     return AP.OutStreamer->emitBytes(CDS->getAsString());
   2687 
   2688   // Otherwise, emit the values in successive locations.
   2689   unsigned ElementByteSize = CDS->getElementByteSize();
   2690   if (isa<IntegerType>(CDS->getElementType())) {
   2691     for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
   2692       if (AP.isVerbose())
   2693         AP.OutStreamer->GetCommentOS() << format("0x%" PRIx64 "\n",
   2694                                                  CDS->getElementAsInteger(i));
   2695       AP.OutStreamer->emitIntValue(CDS->getElementAsInteger(i),
   2696                                    ElementByteSize);
   2697     }
   2698   } else {
   2699     Type *ET = CDS->getElementType();
   2700     for (unsigned I = 0, E = CDS->getNumElements(); I != E; ++I)
   2701       emitGlobalConstantFP(CDS->getElementAsAPFloat(I), ET, AP);
   2702   }
   2703 
   2704   unsigned Size = DL.getTypeAllocSize(CDS->getType());
   2705   unsigned EmittedSize =
   2706       DL.getTypeAllocSize(CDS->getElementType()) * CDS->getNumElements();
   2707   assert(EmittedSize <= Size && "Size cannot be less than EmittedSize!");
   2708   if (unsigned Padding = Size - EmittedSize)
   2709     AP.OutStreamer->emitZeros(Padding);
   2710 }
   2711 
   2712 static void emitGlobalConstantArray(const DataLayout &DL,
   2713                                     const ConstantArray *CA, AsmPrinter &AP,
   2714                                     const Constant *BaseCV, uint64_t Offset) {
   2715   // See if we can aggregate some values.  Make sure it can be
   2716   // represented as a series of bytes of the constant value.
   2717   int Value = isRepeatedByteSequence(CA, DL);
   2718 
   2719   if (Value != -1) {
   2720     uint64_t Bytes = DL.getTypeAllocSize(CA->getType());
   2721     AP.OutStreamer->emitFill(Bytes, Value);
   2722   }
   2723   else {
   2724     for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) {
   2725       emitGlobalConstantImpl(DL, CA->getOperand(i), AP, BaseCV, Offset);
   2726       Offset += DL.getTypeAllocSize(CA->getOperand(i)->getType());
   2727     }
   2728   }
   2729 }
   2730 
   2731 static void emitGlobalConstantVector(const DataLayout &DL,
   2732                                      const ConstantVector *CV, AsmPrinter &AP) {
   2733   for (unsigned i = 0, e = CV->getType()->getNumElements(); i != e; ++i)
   2734     emitGlobalConstantImpl(DL, CV->getOperand(i), AP);
   2735 
   2736   unsigned Size = DL.getTypeAllocSize(CV->getType());
   2737   unsigned EmittedSize = DL.getTypeAllocSize(CV->getType()->getElementType()) *
   2738                          CV->getType()->getNumElements();
   2739   if (unsigned Padding = Size - EmittedSize)
   2740     AP.OutStreamer->emitZeros(Padding);
   2741 }
   2742 
   2743 static void emitGlobalConstantStruct(const DataLayout &DL,
   2744                                      const ConstantStruct *CS, AsmPrinter &AP,
   2745                                      const Constant *BaseCV, uint64_t Offset) {
   2746   // Print the fields in successive locations. Pad to align if needed!
   2747   unsigned Size = DL.getTypeAllocSize(CS->getType());
   2748   const StructLayout *Layout = DL.getStructLayout(CS->getType());
   2749   uint64_t SizeSoFar = 0;
   2750   for (unsigned i = 0, e = CS->getNumOperands(); i != e; ++i) {
   2751     const Constant *Field = CS->getOperand(i);
   2752 
   2753     // Print the actual field value.
   2754     emitGlobalConstantImpl(DL, Field, AP, BaseCV, Offset + SizeSoFar);
   2755 
   2756     // Check if padding is needed and insert one or more 0s.
   2757     uint64_t FieldSize = DL.getTypeAllocSize(Field->getType());
   2758     uint64_t PadSize = ((i == e-1 ? Size : Layout->getElementOffset(i+1))
   2759                         - Layout->getElementOffset(i)) - FieldSize;
   2760     SizeSoFar += FieldSize + PadSize;
   2761 
   2762     // Insert padding - this may include padding to increase the size of the
   2763     // current field up to the ABI size (if the struct is not packed) as well
   2764     // as padding to ensure that the next field starts at the right offset.
   2765     AP.OutStreamer->emitZeros(PadSize);
   2766   }
   2767   assert(SizeSoFar == Layout->getSizeInBytes() &&
   2768          "Layout of constant struct may be incorrect!");
   2769 }
   2770 
   2771 static void emitGlobalConstantFP(APFloat APF, Type *ET, AsmPrinter &AP) {
   2772   assert(ET && "Unknown float type");
   2773   APInt API = APF.bitcastToAPInt();
   2774 
   2775   // First print a comment with what we think the original floating-point value
   2776   // should have been.
   2777   if (AP.isVerbose()) {
   2778     SmallString<8> StrVal;
   2779     APF.toString(StrVal);
   2780     ET->print(AP.OutStreamer->GetCommentOS());
   2781     AP.OutStreamer->GetCommentOS() << ' ' << StrVal << '\n';
   2782   }
   2783 
   2784   // Now iterate through the APInt chunks, emitting them in endian-correct
   2785   // order, possibly with a smaller chunk at beginning/end (e.g. for x87 80-bit
   2786   // floats).
   2787   unsigned NumBytes = API.getBitWidth() / 8;
   2788   unsigned TrailingBytes = NumBytes % sizeof(uint64_t);
   2789   const uint64_t *p = API.getRawData();
   2790 
   2791   // PPC's long double has odd notions of endianness compared to how LLVM
   2792   // handles it: p[0] goes first for *big* endian on PPC.
   2793   if (AP.getDataLayout().isBigEndian() && !ET->isPPC_FP128Ty()) {
   2794     int Chunk = API.getNumWords() - 1;
   2795 
   2796     if (TrailingBytes)
   2797       AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk--], TrailingBytes);
   2798 
   2799     for (; Chunk >= 0; --Chunk)
   2800       AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], sizeof(uint64_t));
   2801   } else {
   2802     unsigned Chunk;
   2803     for (Chunk = 0; Chunk < NumBytes / sizeof(uint64_t); ++Chunk)
   2804       AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], sizeof(uint64_t));
   2805 
   2806     if (TrailingBytes)
   2807       AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], TrailingBytes);
   2808   }
   2809 
   2810   // Emit the tail padding for the long double.
   2811   const DataLayout &DL = AP.getDataLayout();
   2812   AP.OutStreamer->emitZeros(DL.getTypeAllocSize(ET) - DL.getTypeStoreSize(ET));
   2813 }
   2814 
   2815 static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP) {
   2816   emitGlobalConstantFP(CFP->getValueAPF(), CFP->getType(), AP);
   2817 }
   2818 
   2819 static void emitGlobalConstantLargeInt(const ConstantInt *CI, AsmPrinter &AP) {
   2820   const DataLayout &DL = AP.getDataLayout();
   2821   unsigned BitWidth = CI->getBitWidth();
   2822 
   2823   // Copy the value as we may massage the layout for constants whose bit width
   2824   // is not a multiple of 64-bits.
   2825   APInt Realigned(CI->getValue());
   2826   uint64_t ExtraBits = 0;
   2827   unsigned ExtraBitsSize = BitWidth & 63;
   2828 
   2829   if (ExtraBitsSize) {
   2830     // The bit width of the data is not a multiple of 64-bits.
   2831     // The extra bits are expected to be at the end of the chunk of the memory.
   2832     // Little endian:
   2833     // * Nothing to be done, just record the extra bits to emit.
   2834     // Big endian:
   2835     // * Record the extra bits to emit.
   2836     // * Realign the raw data to emit the chunks of 64-bits.
   2837     if (DL.isBigEndian()) {
   2838       // Basically the structure of the raw data is a chunk of 64-bits cells:
   2839       //    0        1         BitWidth / 64
   2840       // [chunk1][chunk2] ... [chunkN].
   2841       // The most significant chunk is chunkN and it should be emitted first.
   2842       // However, due to the alignment issue chunkN contains useless bits.
   2843       // Realign the chunks so that they contain only useful information:
   2844       // ExtraBits     0       1       (BitWidth / 64) - 1
   2845       //       chu[nk1 chu][nk2 chu] ... [nkN-1 chunkN]
   2846       ExtraBitsSize = alignTo(ExtraBitsSize, 8);
   2847       ExtraBits = Realigned.getRawData()[0] &
   2848         (((uint64_t)-1) >> (64 - ExtraBitsSize));
   2849       Realigned.lshrInPlace(ExtraBitsSize);
   2850     } else
   2851       ExtraBits = Realigned.getRawData()[BitWidth / 64];
   2852   }
   2853 
   2854   // We don't expect assemblers to support integer data directives
   2855   // for more than 64 bits, so we emit the data in at most 64-bit
   2856   // quantities at a time.
   2857   const uint64_t *RawData = Realigned.getRawData();
   2858   for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) {
   2859     uint64_t Val = DL.isBigEndian() ? RawData[e - i - 1] : RawData[i];
   2860     AP.OutStreamer->emitIntValue(Val, 8);
   2861   }
   2862 
   2863   if (ExtraBitsSize) {
   2864     // Emit the extra bits after the 64-bits chunks.
   2865 
   2866     // Emit a directive that fills the expected size.
   2867     uint64_t Size = AP.getDataLayout().getTypeStoreSize(CI->getType());
   2868     Size -= (BitWidth / 64) * 8;
   2869     assert(Size && Size * 8 >= ExtraBitsSize &&
   2870            (ExtraBits & (((uint64_t)-1) >> (64 - ExtraBitsSize)))
   2871            == ExtraBits && "Directive too small for extra bits.");
   2872     AP.OutStreamer->emitIntValue(ExtraBits, Size);
   2873   }
   2874 }
   2875 
   2876 /// Transform a not absolute MCExpr containing a reference to a GOT
   2877 /// equivalent global, by a target specific GOT pc relative access to the
   2878 /// final symbol.
   2879 static void handleIndirectSymViaGOTPCRel(AsmPrinter &AP, const MCExpr **ME,
   2880                                          const Constant *BaseCst,
   2881                                          uint64_t Offset) {
   2882   // The global @foo below illustrates a global that uses a got equivalent.
   2883   //
   2884   //  @bar = global i32 42
   2885   //  @gotequiv = private unnamed_addr constant i32* @bar
   2886   //  @foo = i32 trunc (i64 sub (i64 ptrtoint (i32** @gotequiv to i64),
   2887   //                             i64 ptrtoint (i32* @foo to i64))
   2888   //                        to i32)
   2889   //
   2890   // The cstexpr in @foo is converted into the MCExpr `ME`, where we actually
   2891   // check whether @foo is suitable to use a GOTPCREL. `ME` is usually in the
   2892   // form:
   2893   //
   2894   //  foo = cstexpr, where
   2895   //    cstexpr := <gotequiv> - "." + <cst>
   2896   //    cstexpr := <gotequiv> - (<foo> - <offset from @foo base>) + <cst>
   2897   //
   2898   // After canonicalization by evaluateAsRelocatable `ME` turns into:
   2899   //
   2900   //  cstexpr := <gotequiv> - <foo> + gotpcrelcst, where
   2901   //    gotpcrelcst := <offset from @foo base> + <cst>
   2902   MCValue MV;
   2903   if (!(*ME)->evaluateAsRelocatable(MV, nullptr, nullptr) || MV.isAbsolute())
   2904     return;
   2905   const MCSymbolRefExpr *SymA = MV.getSymA();
   2906   if (!SymA)
   2907     return;
   2908 
   2909   // Check that GOT equivalent symbol is cached.
   2910   const MCSymbol *GOTEquivSym = &SymA->getSymbol();
   2911   if (!AP.GlobalGOTEquivs.count(GOTEquivSym))
   2912     return;
   2913 
   2914   const GlobalValue *BaseGV = dyn_cast_or_null<GlobalValue>(BaseCst);
   2915   if (!BaseGV)
   2916     return;
   2917 
   2918   // Check for a valid base symbol
   2919   const MCSymbol *BaseSym = AP.getSymbol(BaseGV);
   2920   const MCSymbolRefExpr *SymB = MV.getSymB();
   2921 
   2922   if (!SymB || BaseSym != &SymB->getSymbol())
   2923     return;
   2924 
   2925   // Make sure to match:
   2926   //
   2927   //    gotpcrelcst := <offset from @foo base> + <cst>
   2928   //
   2929   // If gotpcrelcst is positive it means that we can safely fold the pc rel
   2930   // displacement into the GOTPCREL. We can also can have an extra offset <cst>
   2931   // if the target knows how to encode it.
   2932   int64_t GOTPCRelCst = Offset + MV.getConstant();
   2933   if (GOTPCRelCst < 0)
   2934     return;
   2935   if (!AP.getObjFileLowering().supportGOTPCRelWithOffset() && GOTPCRelCst != 0)
   2936     return;
   2937 
   2938   // Emit the GOT PC relative to replace the got equivalent global, i.e.:
   2939   //
   2940   //  bar:
   2941   //    .long 42
   2942   //  gotequiv:
   2943   //    .quad bar
   2944   //  foo:
   2945   //    .long gotequiv - "." + <cst>
   2946   //
   2947   // is replaced by the target specific equivalent to:
   2948   //
   2949   //  bar:
   2950   //    .long 42
   2951   //  foo:
   2952   //    .long bar@GOTPCREL+<gotpcrelcst>
   2953   AsmPrinter::GOTEquivUsePair Result = AP.GlobalGOTEquivs[GOTEquivSym];
   2954   const GlobalVariable *GV = Result.first;
   2955   int NumUses = (int)Result.second;
   2956   const GlobalValue *FinalGV = dyn_cast<GlobalValue>(GV->getOperand(0));
   2957   const MCSymbol *FinalSym = AP.getSymbol(FinalGV);
   2958   *ME = AP.getObjFileLowering().getIndirectSymViaGOTPCRel(
   2959       FinalGV, FinalSym, MV, Offset, AP.MMI, *AP.OutStreamer);
   2960 
   2961   // Update GOT equivalent usage information
   2962   --NumUses;
   2963   if (NumUses >= 0)
   2964     AP.GlobalGOTEquivs[GOTEquivSym] = std::make_pair(GV, NumUses);
   2965 }
   2966 
   2967 static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *CV,
   2968                                    AsmPrinter &AP, const Constant *BaseCV,
   2969                                    uint64_t Offset) {
   2970   uint64_t Size = DL.getTypeAllocSize(CV->getType());
   2971 
   2972   // Globals with sub-elements such as combinations of arrays and structs
   2973   // are handled recursively by emitGlobalConstantImpl. Keep track of the
   2974   // constant symbol base and the current position with BaseCV and Offset.
   2975   if (!BaseCV && CV->hasOneUse())
   2976     BaseCV = dyn_cast<Constant>(CV->user_back());
   2977 
   2978   if (isa<ConstantAggregateZero>(CV) || isa<UndefValue>(CV))
   2979     return AP.OutStreamer->emitZeros(Size);
   2980 
   2981   if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
   2982     const uint64_t StoreSize = DL.getTypeStoreSize(CV->getType());
   2983 
   2984     if (StoreSize <= 8) {
   2985       if (AP.isVerbose())
   2986         AP.OutStreamer->GetCommentOS() << format("0x%" PRIx64 "\n",
   2987                                                  CI->getZExtValue());
   2988       AP.OutStreamer->emitIntValue(CI->getZExtValue(), StoreSize);
   2989     } else {
   2990       emitGlobalConstantLargeInt(CI, AP);
   2991     }
   2992 
   2993     // Emit tail padding if needed
   2994     if (Size != StoreSize)
   2995       AP.OutStreamer->emitZeros(Size - StoreSize);
   2996 
   2997     return;
   2998   }
   2999 
   3000   if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV))
   3001     return emitGlobalConstantFP(CFP, AP);
   3002 
   3003   if (isa<ConstantPointerNull>(CV)) {
   3004     AP.OutStreamer->emitIntValue(0, Size);
   3005     return;
   3006   }
   3007 
   3008   if (const ConstantDataSequential *CDS = dyn_cast<ConstantDataSequential>(CV))
   3009     return emitGlobalConstantDataSequential(DL, CDS, AP);
   3010 
   3011   if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV))
   3012     return emitGlobalConstantArray(DL, CVA, AP, BaseCV, Offset);
   3013 
   3014   if (const ConstantStruct *CVS = dyn_cast<ConstantStruct>(CV))
   3015     return emitGlobalConstantStruct(DL, CVS, AP, BaseCV, Offset);
   3016 
   3017   if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
   3018     // Look through bitcasts, which might not be able to be MCExpr'ized (e.g. of
   3019     // vectors).
   3020     if (CE->getOpcode() == Instruction::BitCast)
   3021       return emitGlobalConstantImpl(DL, CE->getOperand(0), AP);
   3022 
   3023     if (Size > 8) {
   3024       // If the constant expression's size is greater than 64-bits, then we have
   3025       // to emit the value in chunks. Try to constant fold the value and emit it
   3026       // that way.
   3027       Constant *New = ConstantFoldConstant(CE, DL);
   3028       if (New != CE)
   3029         return emitGlobalConstantImpl(DL, New, AP);
   3030     }
   3031   }
   3032 
   3033   if (const ConstantVector *V = dyn_cast<ConstantVector>(CV))
   3034     return emitGlobalConstantVector(DL, V, AP);
   3035 
   3036   // Otherwise, it must be a ConstantExpr.  Lower it to an MCExpr, then emit it
   3037   // thread the streamer with EmitValue.
   3038   const MCExpr *ME = AP.lowerConstant(CV);
   3039 
   3040   // Since lowerConstant already folded and got rid of all IR pointer and
   3041   // integer casts, detect GOT equivalent accesses by looking into the MCExpr
   3042   // directly.
   3043   if (AP.getObjFileLowering().supportIndirectSymViaGOTPCRel())
   3044     handleIndirectSymViaGOTPCRel(AP, &ME, BaseCV, Offset);
   3045 
   3046   AP.OutStreamer->emitValue(ME, Size);
   3047 }
   3048 
   3049 /// EmitGlobalConstant - Print a general LLVM constant to the .s file.
   3050 void AsmPrinter::emitGlobalConstant(const DataLayout &DL, const Constant *CV) {
   3051   uint64_t Size = DL.getTypeAllocSize(CV->getType());
   3052   if (Size)
   3053     emitGlobalConstantImpl(DL, CV, *this);
   3054   else if (MAI->hasSubsectionsViaSymbols()) {
   3055     // If the global has zero size, emit a single byte so that two labels don't
   3056     // look like they are at the same location.
   3057     OutStreamer->emitIntValue(0, 1);
   3058   }
   3059 }
   3060 
   3061 void AsmPrinter::emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
   3062   // Target doesn't support this yet!
   3063   llvm_unreachable("Target does not support EmitMachineConstantPoolValue");
   3064 }
   3065 
   3066 void AsmPrinter::printOffset(int64_t Offset, raw_ostream &OS) const {
   3067   if (Offset > 0)
   3068     OS << '+' << Offset;
   3069   else if (Offset < 0)
   3070     OS << Offset;
   3071 }
   3072 
   3073 void AsmPrinter::emitNops(unsigned N) {
   3074   MCInst Nop = MF->getSubtarget().getInstrInfo()->getNop();
   3075   for (; N; --N)
   3076     EmitToStreamer(*OutStreamer, Nop);
   3077 }
   3078 
   3079 //===----------------------------------------------------------------------===//
   3080 // Symbol Lowering Routines.
   3081 //===----------------------------------------------------------------------===//
   3082 
   3083 MCSymbol *AsmPrinter::createTempSymbol(const Twine &Name) const {
   3084   return OutContext.createTempSymbol(Name, true);
   3085 }
   3086 
   3087 MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BlockAddress *BA) const {
   3088   return MMI->getAddrLabelSymbol(BA->getBasicBlock());
   3089 }
   3090 
   3091 MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BasicBlock *BB) const {
   3092   return MMI->getAddrLabelSymbol(BB);
   3093 }
   3094 
   3095 /// GetCPISymbol - Return the symbol for the specified constant pool entry.
   3096 MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const {
   3097   if (getSubtargetInfo().getTargetTriple().isWindowsMSVCEnvironment()) {
   3098     const MachineConstantPoolEntry &CPE =
   3099         MF->getConstantPool()->getConstants()[CPID];
   3100     if (!CPE.isMachineConstantPoolEntry()) {
   3101       const DataLayout &DL = MF->getDataLayout();
   3102       SectionKind Kind = CPE.getSectionKind(&DL);
   3103       const Constant *C = CPE.Val.ConstVal;
   3104       Align Alignment = CPE.Alignment;
   3105       if (const MCSectionCOFF *S = dyn_cast<MCSectionCOFF>(
   3106               getObjFileLowering().getSectionForConstant(DL, Kind, C,
   3107                                                          Alignment))) {
   3108         if (MCSymbol *Sym = S->getCOMDATSymbol()) {
   3109           if (Sym->isUndefined())
   3110             OutStreamer->emitSymbolAttribute(Sym, MCSA_Global);
   3111           return Sym;
   3112         }
   3113       }
   3114     }
   3115   }
   3116 
   3117   const DataLayout &DL = getDataLayout();
   3118   return OutContext.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
   3119                                       "CPI" + Twine(getFunctionNumber()) + "_" +
   3120                                       Twine(CPID));
   3121 }
   3122 
   3123 /// GetJTISymbol - Return the symbol for the specified jump table entry.
   3124 MCSymbol *AsmPrinter::GetJTISymbol(unsigned JTID, bool isLinkerPrivate) const {
   3125   return MF->getJTISymbol(JTID, OutContext, isLinkerPrivate);
   3126 }
   3127 
   3128 /// GetJTSetSymbol - Return the symbol for the specified jump table .set
   3129 /// FIXME: privatize to AsmPrinter.
   3130 MCSymbol *AsmPrinter::GetJTSetSymbol(unsigned UID, unsigned MBBID) const {
   3131   const DataLayout &DL = getDataLayout();
   3132   return OutContext.getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
   3133                                       Twine(getFunctionNumber()) + "_" +
   3134                                       Twine(UID) + "_set_" + Twine(MBBID));
   3135 }
   3136 
   3137 MCSymbol *AsmPrinter::getSymbolWithGlobalValueBase(const GlobalValue *GV,
   3138                                                    StringRef Suffix) const {
   3139   return getObjFileLowering().getSymbolWithGlobalValueBase(GV, Suffix, TM);
   3140 }
   3141 
   3142 /// Return the MCSymbol for the specified ExternalSymbol.
   3143 MCSymbol *AsmPrinter::GetExternalSymbolSymbol(StringRef Sym) const {
   3144   SmallString<60> NameStr;
   3145   Mangler::getNameWithPrefix(NameStr, Sym, getDataLayout());
   3146   return OutContext.getOrCreateSymbol(NameStr);
   3147 }
   3148 
   3149 /// PrintParentLoopComment - Print comments about parent loops of this one.
   3150 static void PrintParentLoopComment(raw_ostream &OS, const MachineLoop *Loop,
   3151                                    unsigned FunctionNumber) {
   3152   if (!Loop) return;
   3153   PrintParentLoopComment(OS, Loop->getParentLoop(), FunctionNumber);
   3154   OS.indent(Loop->getLoopDepth()*2)
   3155     << "Parent Loop BB" << FunctionNumber << "_"
   3156     << Loop->getHeader()->getNumber()
   3157     << " Depth=" << Loop->getLoopDepth() << '\n';
   3158 }
   3159 
   3160 /// PrintChildLoopComment - Print comments about child loops within
   3161 /// the loop for this basic block, with nesting.
   3162 static void PrintChildLoopComment(raw_ostream &OS, const MachineLoop *Loop,
   3163                                   unsigned FunctionNumber) {
   3164   // Add child loop information
   3165   for (const MachineLoop *CL : *Loop) {
   3166     OS.indent(CL->getLoopDepth()*2)
   3167       << "Child Loop BB" << FunctionNumber << "_"
   3168       << CL->getHeader()->getNumber() << " Depth " << CL->getLoopDepth()
   3169       << '\n';
   3170     PrintChildLoopComment(OS, CL, FunctionNumber);
   3171   }
   3172 }
   3173 
   3174 /// emitBasicBlockLoopComments - Pretty-print comments for basic blocks.
   3175 static void emitBasicBlockLoopComments(const MachineBasicBlock &MBB,
   3176                                        const MachineLoopInfo *LI,
   3177                                        const AsmPrinter &AP) {
   3178   // Add loop depth information
   3179   const MachineLoop *Loop = LI->getLoopFor(&MBB);
   3180   if (!Loop) return;
   3181 
   3182   MachineBasicBlock *Header = Loop->getHeader();
   3183   assert(Header && "No header for loop");
   3184 
   3185   // If this block is not a loop header, just print out what is the loop header
   3186   // and return.
   3187   if (Header != &MBB) {
   3188     AP.OutStreamer->AddComment("  in Loop: Header=BB" +
   3189                                Twine(AP.getFunctionNumber())+"_" +
   3190                                Twine(Loop->getHeader()->getNumber())+
   3191                                " Depth="+Twine(Loop->getLoopDepth()));
   3192     return;
   3193   }
   3194 
   3195   // Otherwise, it is a loop header.  Print out information about child and
   3196   // parent loops.
   3197   raw_ostream &OS = AP.OutStreamer->GetCommentOS();
   3198 
   3199   PrintParentLoopComment(OS, Loop->getParentLoop(), AP.getFunctionNumber());
   3200 
   3201   OS << "=>";
   3202   OS.indent(Loop->getLoopDepth()*2-2);
   3203 
   3204   OS << "This ";
   3205   if (Loop->isInnermost())
   3206     OS << "Inner ";
   3207   OS << "Loop Header: Depth=" + Twine(Loop->getLoopDepth()) << '\n';
   3208 
   3209   PrintChildLoopComment(OS, Loop, AP.getFunctionNumber());
   3210 }
   3211 
   3212 /// emitBasicBlockStart - This method prints the label for the specified
   3213 /// MachineBasicBlock, an alignment (if present) and a comment describing
   3214 /// it if appropriate.
   3215 void AsmPrinter::emitBasicBlockStart(const MachineBasicBlock &MBB) {
   3216   // End the previous funclet and start a new one.
   3217   if (MBB.isEHFuncletEntry()) {
   3218     for (const HandlerInfo &HI : Handlers) {
   3219       HI.Handler->endFunclet();
   3220       HI.Handler->beginFunclet(MBB);
   3221     }
   3222   }
   3223 
   3224   // Emit an alignment directive for this block, if needed.
   3225   const Align Alignment = MBB.getAlignment();
   3226   if (Alignment != Align(1))
   3227     emitAlignment(Alignment);
   3228 
   3229   // Switch to a new section if this basic block must begin a section. The
   3230   // entry block is always placed in the function section and is handled
   3231   // separately.
   3232   if (MBB.isBeginSection() && !MBB.isEntryBlock()) {
   3233     OutStreamer->SwitchSection(
   3234         getObjFileLowering().getSectionForMachineBasicBlock(MF->getFunction(),
   3235                                                             MBB, TM));
   3236     CurrentSectionBeginSym = MBB.getSymbol();
   3237   }
   3238 
   3239   // If the block has its address taken, emit any labels that were used to
   3240   // reference the block.  It is possible that there is more than one label
   3241   // here, because multiple LLVM BB's may have been RAUW'd to this block after
   3242   // the references were generated.
   3243   if (MBB.hasAddressTaken()) {
   3244     const BasicBlock *BB = MBB.getBasicBlock();
   3245     if (isVerbose())
   3246       OutStreamer->AddComment("Block address taken");
   3247 
   3248     // MBBs can have their address taken as part of CodeGen without having
   3249     // their corresponding BB's address taken in IR
   3250     if (BB->hasAddressTaken())
   3251       for (MCSymbol *Sym : MMI->getAddrLabelSymbolToEmit(BB))
   3252         OutStreamer->emitLabel(Sym);
   3253   }
   3254 
   3255   // Print some verbose block comments.
   3256   if (isVerbose()) {
   3257     if (const BasicBlock *BB = MBB.getBasicBlock()) {
   3258       if (BB->hasName()) {
   3259         BB->printAsOperand(OutStreamer->GetCommentOS(),
   3260                            /*PrintType=*/false, BB->getModule());
   3261         OutStreamer->GetCommentOS() << '\n';
   3262       }
   3263     }
   3264 
   3265     assert(MLI != nullptr && "MachineLoopInfo should has been computed");
   3266     emitBasicBlockLoopComments(MBB, MLI, *this);
   3267   }
   3268 
   3269   // Print the main label for the block.
   3270   if (shouldEmitLabelForBasicBlock(MBB)) {
   3271     if (isVerbose() && MBB.hasLabelMustBeEmitted())
   3272       OutStreamer->AddComment("Label of block must be emitted");
   3273     OutStreamer->emitLabel(MBB.getSymbol());
   3274   } else {
   3275     if (isVerbose()) {
   3276       // NOTE: Want this comment at start of line, don't emit with AddComment.
   3277       OutStreamer->emitRawComment(" %bb." + Twine(MBB.getNumber()) + ":",
   3278                                   false);
   3279     }
   3280   }
   3281 
   3282   if (MBB.isEHCatchretTarget() &&
   3283       MAI->getExceptionHandlingType() == ExceptionHandling::WinEH) {
   3284     OutStreamer->emitLabel(MBB.getEHCatchretSymbol());
   3285   }
   3286 
   3287   // With BB sections, each basic block must handle CFI information on its own
   3288   // if it begins a section (Entry block is handled separately by
   3289   // AsmPrinterHandler::beginFunction).
   3290   if (MBB.isBeginSection() && !MBB.isEntryBlock())
   3291     for (const HandlerInfo &HI : Handlers)
   3292       HI.Handler->beginBasicBlock(MBB);
   3293 }
   3294 
   3295 void AsmPrinter::emitBasicBlockEnd(const MachineBasicBlock &MBB) {
   3296   // Check if CFI information needs to be updated for this MBB with basic block
   3297   // sections.
   3298   if (MBB.isEndSection())
   3299     for (const HandlerInfo &HI : Handlers)
   3300       HI.Handler->endBasicBlock(MBB);
   3301 }
   3302 
   3303 void AsmPrinter::emitVisibility(MCSymbol *Sym, unsigned Visibility,
   3304                                 bool IsDefinition) const {
   3305   MCSymbolAttr Attr = MCSA_Invalid;
   3306 
   3307   switch (Visibility) {
   3308   default: break;
   3309   case GlobalValue::HiddenVisibility:
   3310     if (IsDefinition)
   3311       Attr = MAI->getHiddenVisibilityAttr();
   3312     else
   3313       Attr = MAI->getHiddenDeclarationVisibilityAttr();
   3314     break;
   3315   case GlobalValue::ProtectedVisibility:
   3316     Attr = MAI->getProtectedVisibilityAttr();
   3317     break;
   3318   }
   3319 
   3320   if (Attr != MCSA_Invalid)
   3321     OutStreamer->emitSymbolAttribute(Sym, Attr);
   3322 }
   3323 
   3324 bool AsmPrinter::shouldEmitLabelForBasicBlock(
   3325     const MachineBasicBlock &MBB) const {
   3326   // With `-fbasic-block-sections=`, a label is needed for every non-entry block
   3327   // in the labels mode (option `=labels`) and every section beginning in the
   3328   // sections mode (`=all` and `=list=`).
   3329   if ((MF->hasBBLabels() || MBB.isBeginSection()) && !MBB.isEntryBlock())
   3330     return true;
   3331   // A label is needed for any block with at least one predecessor (when that
   3332   // predecessor is not the fallthrough predecessor, or if it is an EH funclet
   3333   // entry, or if a label is forced).
   3334   return !MBB.pred_empty() &&
   3335          (!isBlockOnlyReachableByFallthrough(&MBB) || MBB.isEHFuncletEntry() ||
   3336           MBB.hasLabelMustBeEmitted());
   3337 }
   3338 
   3339 /// isBlockOnlyReachableByFallthough - Return true if the basic block has
   3340 /// exactly one predecessor and the control transfer mechanism between
   3341 /// the predecessor and this block is a fall-through.
   3342 bool AsmPrinter::
   3343 isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const {
   3344   // If this is a landing pad, it isn't a fall through.  If it has no preds,
   3345   // then nothing falls through to it.
   3346   if (MBB->isEHPad() || MBB->pred_empty())
   3347     return false;
   3348 
   3349   // If there isn't exactly one predecessor, it can't be a fall through.
   3350   if (MBB->pred_size() > 1)
   3351     return false;
   3352 
   3353   // The predecessor has to be immediately before this block.
   3354   MachineBasicBlock *Pred = *MBB->pred_begin();
   3355   if (!Pred->isLayoutSuccessor(MBB))
   3356     return false;
   3357 
   3358   // If the block is completely empty, then it definitely does fall through.
   3359   if (Pred->empty())
   3360     return true;
   3361 
   3362   // Check the terminators in the previous blocks
   3363   for (const auto &MI : Pred->terminators()) {
   3364     // If it is not a simple branch, we are in a table somewhere.
   3365     if (!MI.isBranch() || MI.isIndirectBranch())
   3366       return false;
   3367 
   3368     // If we are the operands of one of the branches, this is not a fall
   3369     // through. Note that targets with delay slots will usually bundle
   3370     // terminators with the delay slot instruction.
   3371     for (ConstMIBundleOperands OP(MI); OP.isValid(); ++OP) {
   3372       if (OP->isJTI())
   3373         return false;
   3374       if (OP->isMBB() && OP->getMBB() == MBB)
   3375         return false;
   3376     }
   3377   }
   3378 
   3379   return true;
   3380 }
   3381 
   3382 GCMetadataPrinter *AsmPrinter::GetOrCreateGCPrinter(GCStrategy &S) {
   3383   if (!S.usesMetadata())
   3384     return nullptr;
   3385 
   3386   gcp_map_type &GCMap = getGCMap(GCMetadataPrinters);
   3387   gcp_map_type::iterator GCPI = GCMap.find(&S);
   3388   if (GCPI != GCMap.end())
   3389     return GCPI->second.get();
   3390 
   3391   auto Name = S.getName();
   3392 
   3393   for (const GCMetadataPrinterRegistry::entry &GCMetaPrinter :
   3394        GCMetadataPrinterRegistry::entries())
   3395     if (Name == GCMetaPrinter.getName()) {
   3396       std::unique_ptr<GCMetadataPrinter> GMP = GCMetaPrinter.instantiate();
   3397       GMP->S = &S;
   3398       auto IterBool = GCMap.insert(std::make_pair(&S, std::move(GMP)));
   3399       return IterBool.first->second.get();
   3400     }
   3401 
   3402   report_fatal_error("no GCMetadataPrinter registered for GC: " + Twine(Name));
   3403 }
   3404 
   3405 void AsmPrinter::emitStackMaps(StackMaps &SM) {
   3406   GCModuleInfo *MI = getAnalysisIfAvailable<GCModuleInfo>();
   3407   assert(MI && "AsmPrinter didn't require GCModuleInfo?");
   3408   bool NeedsDefault = false;
   3409   if (MI->begin() == MI->end())
   3410     // No GC strategy, use the default format.
   3411     NeedsDefault = true;
   3412   else
   3413     for (auto &I : *MI) {
   3414       if (GCMetadataPrinter *MP = GetOrCreateGCPrinter(*I))
   3415         if (MP->emitStackMaps(SM, *this))
   3416           continue;
   3417       // The strategy doesn't have printer or doesn't emit custom stack maps.
   3418       // Use the default format.
   3419       NeedsDefault = true;
   3420     }
   3421 
   3422   if (NeedsDefault)
   3423     SM.serializeToStackMapSection();
   3424 }
   3425 
   3426 /// Pin vtable to this file.
   3427 AsmPrinterHandler::~AsmPrinterHandler() = default;
   3428 
   3429 void AsmPrinterHandler::markFunctionEnd() {}
   3430 
   3431 // In the binary's "xray_instr_map" section, an array of these function entries
   3432 // describes each instrumentation point.  When XRay patches your code, the index
   3433 // into this table will be given to your handler as a patch point identifier.
   3434 void AsmPrinter::XRayFunctionEntry::emit(int Bytes, MCStreamer *Out) const {
   3435   auto Kind8 = static_cast<uint8_t>(Kind);
   3436   Out->emitBinaryData(StringRef(reinterpret_cast<const char *>(&Kind8), 1));
   3437   Out->emitBinaryData(
   3438       StringRef(reinterpret_cast<const char *>(&AlwaysInstrument), 1));
   3439   Out->emitBinaryData(StringRef(reinterpret_cast<const char *>(&Version), 1));
   3440   auto Padding = (4 * Bytes) - ((2 * Bytes) + 3);
   3441   assert(Padding >= 0 && "Instrumentation map entry > 4 * Word Size");
   3442   Out->emitZeros(Padding);
   3443 }
   3444 
   3445 void AsmPrinter::emitXRayTable() {
   3446   if (Sleds.empty())
   3447     return;
   3448 
   3449   auto PrevSection = OutStreamer->getCurrentSectionOnly();
   3450   const Function &F = MF->getFunction();
   3451   MCSection *InstMap = nullptr;
   3452   MCSection *FnSledIndex = nullptr;
   3453   const Triple &TT = TM.getTargetTriple();
   3454   // Use PC-relative addresses on all targets.
   3455   if (TT.isOSBinFormatELF()) {
   3456     auto LinkedToSym = cast<MCSymbolELF>(CurrentFnSym);
   3457     auto Flags = ELF::SHF_ALLOC | ELF::SHF_LINK_ORDER;
   3458     StringRef GroupName;
   3459     if (F.hasComdat()) {
   3460       Flags |= ELF::SHF_GROUP;
   3461       GroupName = F.getComdat()->getName();
   3462     }
   3463     InstMap = OutContext.getELFSection("xray_instr_map", ELF::SHT_PROGBITS,
   3464                                        Flags, 0, GroupName, F.hasComdat(),
   3465                                        MCSection::NonUniqueID, LinkedToSym);
   3466 
   3467     if (!TM.Options.XRayOmitFunctionIndex)
   3468       FnSledIndex = OutContext.getELFSection(
   3469           "xray_fn_idx", ELF::SHT_PROGBITS, Flags | ELF::SHF_WRITE, 0,
   3470           GroupName, F.hasComdat(), MCSection::NonUniqueID, LinkedToSym);
   3471   } else if (MF->getSubtarget().getTargetTriple().isOSBinFormatMachO()) {
   3472     InstMap = OutContext.getMachOSection("__DATA", "xray_instr_map", 0,
   3473                                          SectionKind::getReadOnlyWithRel());
   3474     if (!TM.Options.XRayOmitFunctionIndex)
   3475       FnSledIndex = OutContext.getMachOSection(
   3476           "__DATA", "xray_fn_idx", 0, SectionKind::getReadOnlyWithRel());
   3477   } else {
   3478     llvm_unreachable("Unsupported target");
   3479   }
   3480 
   3481   auto WordSizeBytes = MAI->getCodePointerSize();
   3482 
   3483   // Now we switch to the instrumentation map section. Because this is done
   3484   // per-function, we are able to create an index entry that will represent the
   3485   // range of sleds associated with a function.
   3486   auto &Ctx = OutContext;
   3487   MCSymbol *SledsStart = OutContext.createTempSymbol("xray_sleds_start", true);
   3488   OutStreamer->SwitchSection(InstMap);
   3489   OutStreamer->emitLabel(SledsStart);
   3490   for (const auto &Sled : Sleds) {
   3491     MCSymbol *Dot = Ctx.createTempSymbol();
   3492     OutStreamer->emitLabel(Dot);
   3493     OutStreamer->emitValueImpl(
   3494         MCBinaryExpr::createSub(MCSymbolRefExpr::create(Sled.Sled, Ctx),
   3495                                 MCSymbolRefExpr::create(Dot, Ctx), Ctx),
   3496         WordSizeBytes);
   3497     OutStreamer->emitValueImpl(
   3498         MCBinaryExpr::createSub(
   3499             MCSymbolRefExpr::create(CurrentFnBegin, Ctx),
   3500             MCBinaryExpr::createAdd(MCSymbolRefExpr::create(Dot, Ctx),
   3501                                     MCConstantExpr::create(WordSizeBytes, Ctx),
   3502                                     Ctx),
   3503             Ctx),
   3504         WordSizeBytes);
   3505     Sled.emit(WordSizeBytes, OutStreamer.get());
   3506   }
   3507   MCSymbol *SledsEnd = OutContext.createTempSymbol("xray_sleds_end", true);
   3508   OutStreamer->emitLabel(SledsEnd);
   3509 
   3510   // We then emit a single entry in the index per function. We use the symbols
   3511   // that bound the instrumentation map as the range for a specific function.
   3512   // Each entry here will be 2 * word size aligned, as we're writing down two
   3513   // pointers. This should work for both 32-bit and 64-bit platforms.
   3514   if (FnSledIndex) {
   3515     OutStreamer->SwitchSection(FnSledIndex);
   3516     OutStreamer->emitCodeAlignment(2 * WordSizeBytes);
   3517     OutStreamer->emitSymbolValue(SledsStart, WordSizeBytes, false);
   3518     OutStreamer->emitSymbolValue(SledsEnd, WordSizeBytes, false);
   3519     OutStreamer->SwitchSection(PrevSection);
   3520   }
   3521   Sleds.clear();
   3522 }
   3523 
   3524 void AsmPrinter::recordSled(MCSymbol *Sled, const MachineInstr &MI,
   3525                             SledKind Kind, uint8_t Version) {
   3526   const Function &F = MI.getMF()->getFunction();
   3527   auto Attr = F.getFnAttribute("function-instrument");
   3528   bool LogArgs = F.hasFnAttribute("xray-log-args");
   3529   bool AlwaysInstrument =
   3530     Attr.isStringAttribute() && Attr.getValueAsString() == "xray-always";
   3531   if (Kind == SledKind::FUNCTION_ENTER && LogArgs)
   3532     Kind = SledKind::LOG_ARGS_ENTER;
   3533   Sleds.emplace_back(XRayFunctionEntry{Sled, CurrentFnSym, Kind,
   3534                                        AlwaysInstrument, &F, Version});
   3535 }
   3536 
   3537 void AsmPrinter::emitPatchableFunctionEntries() {
   3538   const Function &F = MF->getFunction();
   3539   unsigned PatchableFunctionPrefix = 0, PatchableFunctionEntry = 0;
   3540   (void)F.getFnAttribute("patchable-function-prefix")
   3541       .getValueAsString()
   3542       .getAsInteger(10, PatchableFunctionPrefix);
   3543   (void)F.getFnAttribute("patchable-function-entry")
   3544       .getValueAsString()
   3545       .getAsInteger(10, PatchableFunctionEntry);
   3546   if (!PatchableFunctionPrefix && !PatchableFunctionEntry)
   3547     return;
   3548   const unsigned PointerSize = getPointerSize();
   3549   if (TM.getTargetTriple().isOSBinFormatELF()) {
   3550     auto Flags = ELF::SHF_WRITE | ELF::SHF_ALLOC;
   3551     const MCSymbolELF *LinkedToSym = nullptr;
   3552     StringRef GroupName;
   3553 
   3554     // GNU as < 2.35 did not support section flag 'o'. GNU ld < 2.36 did not
   3555     // support mixed SHF_LINK_ORDER and non-SHF_LINK_ORDER sections.
   3556     if (MAI->useIntegratedAssembler() || MAI->binutilsIsAtLeast(2, 36)) {
   3557       Flags |= ELF::SHF_LINK_ORDER;
   3558       if (F.hasComdat()) {
   3559         Flags |= ELF::SHF_GROUP;
   3560         GroupName = F.getComdat()->getName();
   3561       }
   3562       LinkedToSym = cast<MCSymbolELF>(CurrentFnSym);
   3563     }
   3564     OutStreamer->SwitchSection(OutContext.getELFSection(
   3565         "__patchable_function_entries", ELF::SHT_PROGBITS, Flags, 0, GroupName,
   3566         F.hasComdat(), MCSection::NonUniqueID, LinkedToSym));
   3567     emitAlignment(Align(PointerSize));
   3568     OutStreamer->emitSymbolValue(CurrentPatchableFunctionEntrySym, PointerSize);
   3569   }
   3570 }
   3571 
   3572 uint16_t AsmPrinter::getDwarfVersion() const {
   3573   return OutStreamer->getContext().getDwarfVersion();
   3574 }
   3575 
   3576 void AsmPrinter::setDwarfVersion(uint16_t Version) {
   3577   OutStreamer->getContext().setDwarfVersion(Version);
   3578 }
   3579 
   3580 bool AsmPrinter::isDwarf64() const {
   3581   return OutStreamer->getContext().getDwarfFormat() == dwarf::DWARF64;
   3582 }
   3583 
   3584 unsigned int AsmPrinter::getDwarfOffsetByteSize() const {
   3585   return dwarf::getDwarfOffsetByteSize(
   3586       OutStreamer->getContext().getDwarfFormat());
   3587 }
   3588 
   3589 unsigned int AsmPrinter::getUnitLengthFieldByteSize() const {
   3590   return dwarf::getUnitLengthFieldByteSize(
   3591       OutStreamer->getContext().getDwarfFormat());
   3592 }
   3593