brintos

brintos / llvm-project-archived public Read only

0
0
Text · 177.9 KiB · 7932765 Raw
5495 lines · cpp
1//===- AsmWriter.cpp - Printing LLVM as an assembly file ------------------===//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-exception6//7//===----------------------------------------------------------------------===//8//9// This library implements `print` family of functions in classes like10// Module, Function, Value, etc. In-memory representation of those classes is11// converted to IR strings.12//13// Note that these routines must be extremely tolerant of various errors in the14// LLVM code, because it can be used for debugging transformations.15//16//===----------------------------------------------------------------------===//17 18#include "llvm/ADT/APFloat.h"19#include "llvm/ADT/APInt.h"20#include "llvm/ADT/ArrayRef.h"21#include "llvm/ADT/DenseMap.h"22#include "llvm/ADT/STLExtras.h"23#include "llvm/ADT/SetVector.h"24#include "llvm/ADT/SmallPtrSet.h"25#include "llvm/ADT/SmallString.h"26#include "llvm/ADT/SmallVector.h"27#include "llvm/ADT/StringExtras.h"28#include "llvm/ADT/StringRef.h"29#include "llvm/ADT/iterator_range.h"30#include "llvm/BinaryFormat/Dwarf.h"31#include "llvm/Config/llvm-config.h"32#include "llvm/IR/Argument.h"33#include "llvm/IR/AssemblyAnnotationWriter.h"34#include "llvm/IR/Attributes.h"35#include "llvm/IR/BasicBlock.h"36#include "llvm/IR/CFG.h"37#include "llvm/IR/CallingConv.h"38#include "llvm/IR/Comdat.h"39#include "llvm/IR/Constant.h"40#include "llvm/IR/Constants.h"41#include "llvm/IR/DebugInfoMetadata.h"42#include "llvm/IR/DebugProgramInstruction.h"43#include "llvm/IR/DerivedTypes.h"44#include "llvm/IR/Function.h"45#include "llvm/IR/GlobalAlias.h"46#include "llvm/IR/GlobalIFunc.h"47#include "llvm/IR/GlobalObject.h"48#include "llvm/IR/GlobalValue.h"49#include "llvm/IR/GlobalVariable.h"50#include "llvm/IR/IRPrintingPasses.h"51#include "llvm/IR/InlineAsm.h"52#include "llvm/IR/InstrTypes.h"53#include "llvm/IR/Instruction.h"54#include "llvm/IR/Instructions.h"55#include "llvm/IR/IntrinsicInst.h"56#include "llvm/IR/Intrinsics.h"57#include "llvm/IR/LLVMContext.h"58#include "llvm/IR/Metadata.h"59#include "llvm/IR/Module.h"60#include "llvm/IR/ModuleSlotTracker.h"61#include "llvm/IR/ModuleSummaryIndex.h"62#include "llvm/IR/Operator.h"63#include "llvm/IR/Type.h"64#include "llvm/IR/TypeFinder.h"65#include "llvm/IR/TypedPointerType.h"66#include "llvm/IR/Use.h"67#include "llvm/IR/User.h"68#include "llvm/IR/Value.h"69#include "llvm/Support/AtomicOrdering.h"70#include "llvm/Support/Casting.h"71#include "llvm/Support/Compiler.h"72#include "llvm/Support/Debug.h"73#include "llvm/Support/ErrorHandling.h"74#include "llvm/Support/Format.h"75#include "llvm/Support/FormattedStream.h"76#include "llvm/Support/SaveAndRestore.h"77#include "llvm/Support/raw_ostream.h"78#include <cassert>79#include <cctype>80#include <cstddef>81#include <cstdint>82#include <iterator>83#include <memory>84#include <optional>85#include <string>86#include <tuple>87#include <utility>88#include <vector>89 90using namespace llvm;91 92// See https://llvm.org/docs/DebuggingLLVM.html for why these flags are useful.93 94static cl::opt<bool>95    PrintInstAddrs("print-inst-addrs", cl::Hidden,96                   cl::desc("Print addresses of instructions when dumping"));97 98static cl::opt<bool> PrintInstDebugLocs(99    "print-inst-debug-locs", cl::Hidden,100    cl::desc("Pretty print debug locations of instructions when dumping"));101 102static cl::opt<bool> PrintProfData(103    "print-prof-data", cl::Hidden,104    cl::desc("Pretty print perf data (branch weights, etc) when dumping"));105 106static cl::opt<bool> PreserveAssemblyUseListOrder(107    "preserve-ll-uselistorder", cl::Hidden, cl::init(false),108    cl::desc("Preserve use-list order when writing LLVM assembly."));109 110// Make virtual table appear in this compilation unit.111AssemblyAnnotationWriter::~AssemblyAnnotationWriter() = default;112 113//===----------------------------------------------------------------------===//114// Helper Functions115//===----------------------------------------------------------------------===//116 117using OrderMap = MapVector<const Value *, unsigned>;118 119using UseListOrderMap =120    DenseMap<const Function *, MapVector<const Value *, std::vector<unsigned>>>;121 122/// Look for a value that might be wrapped as metadata, e.g. a value in a123/// metadata operand. Returns the input value as-is if it is not wrapped.124static const Value *skipMetadataWrapper(const Value *V) {125  if (const auto *MAV = dyn_cast<MetadataAsValue>(V))126    if (const auto *VAM = dyn_cast<ValueAsMetadata>(MAV->getMetadata()))127      return VAM->getValue();128  return V;129}130 131static void orderValue(const Value *V, OrderMap &OM) {132  if (OM.lookup(V))133    return;134 135  if (const auto *C = dyn_cast<Constant>(V)) {136    if (isa<ConstantData>(C))137      return;138 139    if (C->getNumOperands() && !isa<GlobalValue>(C))140      for (const Value *Op : C->operands())141        if (!isa<BasicBlock>(Op) && !isa<GlobalValue>(Op))142          orderValue(Op, OM);143  }144 145  // Note: we cannot cache this lookup above, since inserting into the map146  // changes the map's size, and thus affects the other IDs.147  unsigned ID = OM.size() + 1;148  OM[V] = ID;149}150 151static OrderMap orderModule(const Module *M) {152  OrderMap OM;153 154  auto OrderConstantValue = [&OM](const Value *V) {155    if (isa<Constant>(V) || isa<InlineAsm>(V))156      orderValue(V, OM);157  };158 159  auto OrderConstantFromMetadata = [&](Metadata *MD) {160    if (const auto *VAM = dyn_cast<ValueAsMetadata>(MD)) {161      OrderConstantValue(VAM->getValue());162    } else if (const auto *AL = dyn_cast<DIArgList>(MD)) {163      for (const auto *VAM : AL->getArgs())164        OrderConstantValue(VAM->getValue());165    }166  };167 168  for (const GlobalVariable &G : M->globals()) {169    if (G.hasInitializer())170      if (!isa<GlobalValue>(G.getInitializer()))171        orderValue(G.getInitializer(), OM);172    orderValue(&G, OM);173  }174  for (const GlobalAlias &A : M->aliases()) {175    if (!isa<GlobalValue>(A.getAliasee()))176      orderValue(A.getAliasee(), OM);177    orderValue(&A, OM);178  }179  for (const GlobalIFunc &I : M->ifuncs()) {180    if (!isa<GlobalValue>(I.getResolver()))181      orderValue(I.getResolver(), OM);182    orderValue(&I, OM);183  }184  for (const Function &F : *M) {185    for (const Use &U : F.operands())186      if (!isa<GlobalValue>(U.get()))187        orderValue(U.get(), OM);188 189    orderValue(&F, OM);190 191    if (F.isDeclaration())192      continue;193 194    for (const Argument &A : F.args())195      orderValue(&A, OM);196    for (const BasicBlock &BB : F) {197      orderValue(&BB, OM);198      for (const Instruction &I : BB) {199        // Debug records can contain Value references, that can then contain200        // Values disconnected from the rest of the Value hierachy, if wrapped201        // in some kind of constant-expression. Find and order any Values that202        // are wrapped in debug-info.203        for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {204          OrderConstantFromMetadata(DVR.getRawLocation());205          if (DVR.isDbgAssign())206            OrderConstantFromMetadata(DVR.getRawAddress());207        }208 209        for (const Value *Op : I.operands()) {210          Op = skipMetadataWrapper(Op);211          if ((isa<Constant>(*Op) && !isa<GlobalValue>(*Op)) ||212              isa<InlineAsm>(*Op))213            orderValue(Op, OM);214        }215        orderValue(&I, OM);216      }217    }218  }219  return OM;220}221 222static std::vector<unsigned>223predictValueUseListOrder(const Value *V, unsigned ID, const OrderMap &OM) {224  // Predict use-list order for this one.225  using Entry = std::pair<const Use *, unsigned>;226  SmallVector<Entry, 64> List;227  for (const Use &U : V->uses())228    // Check if this user will be serialized.229    if (OM.lookup(U.getUser()))230      List.push_back(std::make_pair(&U, List.size()));231 232  if (List.size() < 2)233    // We may have lost some users.234    return {};235 236  // When referencing a value before its declaration, a temporary value is237  // created, which will later be RAUWed with the actual value. This reverses238  // the use list. This happens for all values apart from basic blocks.239  bool GetsReversed = !isa<BasicBlock>(V);240  if (auto *BA = dyn_cast<BlockAddress>(V))241    ID = OM.lookup(BA->getBasicBlock());242  llvm::sort(List, [&](const Entry &L, const Entry &R) {243    const Use *LU = L.first;244    const Use *RU = R.first;245    if (LU == RU)246      return false;247 248    auto LID = OM.lookup(LU->getUser());249    auto RID = OM.lookup(RU->getUser());250 251    // If ID is 4, then expect: 7 6 5 1 2 3.252    if (LID < RID) {253      if (GetsReversed)254        if (RID <= ID)255          return true;256      return false;257    }258    if (RID < LID) {259      if (GetsReversed)260        if (LID <= ID)261          return false;262      return true;263    }264 265    // LID and RID are equal, so we have different operands of the same user.266    // Assume operands are added in order for all instructions.267    if (GetsReversed)268      if (LID <= ID)269        return LU->getOperandNo() < RU->getOperandNo();270    return LU->getOperandNo() > RU->getOperandNo();271  });272 273  if (llvm::is_sorted(List, llvm::less_second()))274    // Order is already correct.275    return {};276 277  // Store the shuffle.278  std::vector<unsigned> Shuffle(List.size());279  for (size_t I = 0, E = List.size(); I != E; ++I)280    Shuffle[I] = List[I].second;281  return Shuffle;282}283 284static UseListOrderMap predictUseListOrder(const Module *M) {285  OrderMap OM = orderModule(M);286  UseListOrderMap ULOM;287  for (const auto &Pair : OM) {288    const Value *V = Pair.first;289    if (V->use_empty() || std::next(V->use_begin()) == V->use_end())290      continue;291 292    std::vector<unsigned> Shuffle =293        predictValueUseListOrder(V, Pair.second, OM);294    if (Shuffle.empty())295      continue;296 297    const Function *F = nullptr;298    if (auto *I = dyn_cast<Instruction>(V))299      F = I->getFunction();300    if (auto *A = dyn_cast<Argument>(V))301      F = A->getParent();302    if (auto *BB = dyn_cast<BasicBlock>(V))303      F = BB->getParent();304    ULOM[F][V] = std::move(Shuffle);305  }306  return ULOM;307}308 309static const Module *getModuleFromVal(const Value *V) {310  if (const auto *MA = dyn_cast<Argument>(V))311    return MA->getParent() ? MA->getParent()->getParent() : nullptr;312 313  if (const auto *BB = dyn_cast<BasicBlock>(V))314    return BB->getParent() ? BB->getParent()->getParent() : nullptr;315 316  if (const auto *I = dyn_cast<Instruction>(V)) {317    const Function *M = I->getParent() ? I->getParent()->getParent() : nullptr;318    return M ? M->getParent() : nullptr;319  }320 321  if (const auto *GV = dyn_cast<GlobalValue>(V))322    return GV->getParent();323 324  if (const auto *MAV = dyn_cast<MetadataAsValue>(V)) {325    for (const User *U : MAV->users())326      if (isa<Instruction>(U))327        if (const Module *M = getModuleFromVal(U))328          return M;329    return nullptr;330  }331 332  return nullptr;333}334 335static const Module *getModuleFromDPI(const DbgMarker *Marker) {336  const Function *M =337      Marker->getParent() ? Marker->getParent()->getParent() : nullptr;338  return M ? M->getParent() : nullptr;339}340 341static const Module *getModuleFromDPI(const DbgRecord *DR) {342  return DR->getMarker() ? getModuleFromDPI(DR->getMarker()) : nullptr;343}344 345static void printCallingConv(unsigned cc, raw_ostream &Out) {346  switch (cc) {347  default:                         Out << "cc" << cc; break;348  case CallingConv::Fast:          Out << "fastcc"; break;349  case CallingConv::Cold:          Out << "coldcc"; break;350  case CallingConv::AnyReg:        Out << "anyregcc"; break;351  case CallingConv::PreserveMost:  Out << "preserve_mostcc"; break;352  case CallingConv::PreserveAll:   Out << "preserve_allcc"; break;353  case CallingConv::PreserveNone:  Out << "preserve_nonecc"; break;354  case CallingConv::CXX_FAST_TLS:  Out << "cxx_fast_tlscc"; break;355  case CallingConv::GHC:           Out << "ghccc"; break;356  case CallingConv::Tail:          Out << "tailcc"; break;357  case CallingConv::GRAAL:         Out << "graalcc"; break;358  case CallingConv::CFGuard_Check: Out << "cfguard_checkcc"; break;359  case CallingConv::X86_StdCall:   Out << "x86_stdcallcc"; break;360  case CallingConv::X86_FastCall:  Out << "x86_fastcallcc"; break;361  case CallingConv::X86_ThisCall:  Out << "x86_thiscallcc"; break;362  case CallingConv::X86_RegCall:   Out << "x86_regcallcc"; break;363  case CallingConv::X86_VectorCall:Out << "x86_vectorcallcc"; break;364  case CallingConv::Intel_OCL_BI:  Out << "intel_ocl_bicc"; break;365  case CallingConv::ARM_APCS:      Out << "arm_apcscc"; break;366  case CallingConv::ARM_AAPCS:     Out << "arm_aapcscc"; break;367  case CallingConv::ARM_AAPCS_VFP: Out << "arm_aapcs_vfpcc"; break;368  case CallingConv::AArch64_VectorCall: Out << "aarch64_vector_pcs"; break;369  case CallingConv::AArch64_SVE_VectorCall:370    Out << "aarch64_sve_vector_pcs";371    break;372  case CallingConv::AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0:373    Out << "aarch64_sme_preservemost_from_x0";374    break;375  case CallingConv::AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1:376    Out << "aarch64_sme_preservemost_from_x1";377    break;378  case CallingConv::AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2:379    Out << "aarch64_sme_preservemost_from_x2";380    break;381  case CallingConv::MSP430_INTR:   Out << "msp430_intrcc"; break;382  case CallingConv::AVR_INTR:      Out << "avr_intrcc "; break;383  case CallingConv::AVR_SIGNAL:    Out << "avr_signalcc "; break;384  case CallingConv::PTX_Kernel:    Out << "ptx_kernel"; break;385  case CallingConv::PTX_Device:    Out << "ptx_device"; break;386  case CallingConv::X86_64_SysV:   Out << "x86_64_sysvcc"; break;387  case CallingConv::Win64:         Out << "win64cc"; break;388  case CallingConv::SPIR_FUNC:     Out << "spir_func"; break;389  case CallingConv::SPIR_KERNEL:   Out << "spir_kernel"; break;390  case CallingConv::Swift:         Out << "swiftcc"; break;391  case CallingConv::SwiftTail:     Out << "swifttailcc"; break;392  case CallingConv::X86_INTR:      Out << "x86_intrcc"; break;393  case CallingConv::DUMMY_HHVM:394    Out << "hhvmcc";395    break;396  case CallingConv::DUMMY_HHVM_C:397    Out << "hhvm_ccc";398    break;399  case CallingConv::AMDGPU_VS:     Out << "amdgpu_vs"; break;400  case CallingConv::AMDGPU_LS:     Out << "amdgpu_ls"; break;401  case CallingConv::AMDGPU_HS:     Out << "amdgpu_hs"; break;402  case CallingConv::AMDGPU_ES:     Out << "amdgpu_es"; break;403  case CallingConv::AMDGPU_GS:     Out << "amdgpu_gs"; break;404  case CallingConv::AMDGPU_PS:     Out << "amdgpu_ps"; break;405  case CallingConv::AMDGPU_CS:     Out << "amdgpu_cs"; break;406  case CallingConv::AMDGPU_CS_Chain:407    Out << "amdgpu_cs_chain";408    break;409  case CallingConv::AMDGPU_CS_ChainPreserve:410    Out << "amdgpu_cs_chain_preserve";411    break;412  case CallingConv::AMDGPU_KERNEL: Out << "amdgpu_kernel"; break;413  case CallingConv::AMDGPU_Gfx:    Out << "amdgpu_gfx"; break;414  case CallingConv::AMDGPU_Gfx_WholeWave:415    Out << "amdgpu_gfx_whole_wave";416    break;417  case CallingConv::M68k_RTD:      Out << "m68k_rtdcc"; break;418  case CallingConv::RISCV_VectorCall:419    Out << "riscv_vector_cc";420    break;421#define CC_VLS_CASE(ABI_VLEN)                                                  \422  case CallingConv::RISCV_VLSCall_##ABI_VLEN:                                  \423    Out << "riscv_vls_cc(" #ABI_VLEN ")";                                      \424    break;425    CC_VLS_CASE(32)426    CC_VLS_CASE(64)427    CC_VLS_CASE(128)428    CC_VLS_CASE(256)429    CC_VLS_CASE(512)430    CC_VLS_CASE(1024)431    CC_VLS_CASE(2048)432    CC_VLS_CASE(4096)433    CC_VLS_CASE(8192)434    CC_VLS_CASE(16384)435    CC_VLS_CASE(32768)436    CC_VLS_CASE(65536)437#undef CC_VLS_CASE438  case CallingConv::CHERIoT_CompartmentCall:439    Out << "cheriot_compartmentcallcc";440    break;441  case CallingConv::CHERIoT_CompartmentCallee:442    Out << "cheriot_compartmentcalleecc";443    break;444  case CallingConv::CHERIoT_LibraryCall:445    Out << "cheriot_librarycallcc";446    break;447  }448}449 450enum PrefixType {451  GlobalPrefix,452  ComdatPrefix,453  LabelPrefix,454  LocalPrefix,455  NoPrefix456};457 458void llvm::printLLVMNameWithoutPrefix(raw_ostream &OS, StringRef Name) {459  assert(!Name.empty() && "Cannot get empty name!");460 461  // Scan the name to see if it needs quotes first.462  bool NeedsQuotes = isdigit(static_cast<unsigned char>(Name[0]));463  if (!NeedsQuotes) {464    for (unsigned char C : Name) {465      // By making this unsigned, the value passed in to isalnum will always be466      // in the range 0-255.  This is important when building with MSVC because467      // its implementation will assert.  This situation can arise when dealing468      // with UTF-8 multibyte characters.469      if (!isalnum(C) && C != '-' && C != '.' && C != '_') {470        NeedsQuotes = true;471        break;472      }473    }474  }475 476  // If we didn't need any quotes, just write out the name in one blast.477  if (!NeedsQuotes) {478    OS << Name;479    return;480  }481 482  // Okay, we need quotes.  Output the quotes and escape any scary characters as483  // needed.484  OS << '"';485  printEscapedString(Name, OS);486  OS << '"';487}488 489/// Turn the specified name into an 'LLVM name', which is either prefixed with %490/// (if the string only contains simple characters) or is surrounded with ""'s491/// (if it has special chars in it). Print it out.492static void printLLVMName(raw_ostream &OS, StringRef Name, PrefixType Prefix) {493  switch (Prefix) {494  case NoPrefix:495    break;496  case GlobalPrefix:497    OS << '@';498    break;499  case ComdatPrefix:500    OS << '$';501    break;502  case LabelPrefix:503    break;504  case LocalPrefix:505    OS << '%';506    break;507  }508  printLLVMNameWithoutPrefix(OS, Name);509}510 511/// Turn the specified name into an 'LLVM name', which is either prefixed with %512/// (if the string only contains simple characters) or is surrounded with ""'s513/// (if it has special chars in it). Print it out.514static void printLLVMName(raw_ostream &OS, const Value *V) {515  printLLVMName(OS, V->getName(),516                isa<GlobalValue>(V) ? GlobalPrefix : LocalPrefix);517}518 519static void printShuffleMask(raw_ostream &Out, Type *Ty, ArrayRef<int> Mask) {520  Out << ", <";521  if (isa<ScalableVectorType>(Ty))522    Out << "vscale x ";523  Out << Mask.size() << " x i32> ";524  if (all_of(Mask, [](int Elt) { return Elt == 0; })) {525    Out << "zeroinitializer";526  } else if (all_of(Mask, [](int Elt) { return Elt == PoisonMaskElem; })) {527    Out << "poison";528  } else {529    Out << "<";530    ListSeparator LS;531    for (int Elt : Mask) {532      Out << LS << "i32 ";533      if (Elt == PoisonMaskElem)534        Out << "poison";535      else536        Out << Elt;537    }538    Out << ">";539  }540}541 542namespace {543 544class TypePrinting {545public:546  TypePrinting(const Module *M = nullptr) : DeferredM(M) {}547 548  TypePrinting(const TypePrinting &) = delete;549  TypePrinting &operator=(const TypePrinting &) = delete;550 551  /// The named types that are used by the current module.552  TypeFinder &getNamedTypes();553 554  /// The numbered types, number to type mapping.555  std::vector<StructType *> &getNumberedTypes();556 557  bool empty();558 559  void print(Type *Ty, raw_ostream &OS);560 561  void printStructBody(StructType *Ty, raw_ostream &OS);562 563private:564  void incorporateTypes();565 566  /// A module to process lazily when needed. Set to nullptr as soon as used.567  const Module *DeferredM;568 569  TypeFinder NamedTypes;570 571  // The numbered types, along with their value.572  DenseMap<StructType *, unsigned> Type2Number;573 574  std::vector<StructType *> NumberedTypes;575};576 577} // end anonymous namespace578 579TypeFinder &TypePrinting::getNamedTypes() {580  incorporateTypes();581  return NamedTypes;582}583 584std::vector<StructType *> &TypePrinting::getNumberedTypes() {585  incorporateTypes();586 587  // We know all the numbers that each type is used and we know that it is a588  // dense assignment. Convert the map to an index table, if it's not done589  // already (judging from the sizes):590  if (NumberedTypes.size() == Type2Number.size())591    return NumberedTypes;592 593  NumberedTypes.resize(Type2Number.size());594  for (const auto &P : Type2Number) {595    assert(P.second < NumberedTypes.size() && "Didn't get a dense numbering?");596    assert(!NumberedTypes[P.second] && "Didn't get a unique numbering?");597    NumberedTypes[P.second] = P.first;598  }599  return NumberedTypes;600}601 602bool TypePrinting::empty() {603  incorporateTypes();604  return NamedTypes.empty() && Type2Number.empty();605}606 607void TypePrinting::incorporateTypes() {608  if (!DeferredM)609    return;610 611  NamedTypes.run(*DeferredM, false);612  DeferredM = nullptr;613 614  // The list of struct types we got back includes all the struct types, split615  // the unnamed ones out to a numbering and remove the anonymous structs.616  unsigned NextNumber = 0;617 618  std::vector<StructType *>::iterator NextToUse = NamedTypes.begin();619  for (StructType *STy : NamedTypes) {620    // Ignore anonymous types.621    if (STy->isLiteral())622      continue;623 624    if (STy->getName().empty())625      Type2Number[STy] = NextNumber++;626    else627      *NextToUse++ = STy;628  }629 630  NamedTypes.erase(NextToUse, NamedTypes.end());631}632 633/// Write the specified type to the specified raw_ostream, making use of type634/// names or up references to shorten the type name where possible.635void TypePrinting::print(Type *Ty, raw_ostream &OS) {636  switch (Ty->getTypeID()) {637  case Type::VoidTyID:      OS << "void"; return;638  case Type::HalfTyID:      OS << "half"; return;639  case Type::BFloatTyID:    OS << "bfloat"; return;640  case Type::FloatTyID:     OS << "float"; return;641  case Type::DoubleTyID:    OS << "double"; return;642  case Type::X86_FP80TyID:  OS << "x86_fp80"; return;643  case Type::FP128TyID:     OS << "fp128"; return;644  case Type::PPC_FP128TyID: OS << "ppc_fp128"; return;645  case Type::LabelTyID:     OS << "label"; return;646  case Type::MetadataTyID:647    OS << "metadata";648    return;649  case Type::X86_AMXTyID:   OS << "x86_amx"; return;650  case Type::TokenTyID:     OS << "token"; return;651  case Type::IntegerTyID:652    OS << 'i' << cast<IntegerType>(Ty)->getBitWidth();653    return;654 655  case Type::FunctionTyID: {656    FunctionType *FTy = cast<FunctionType>(Ty);657    print(FTy->getReturnType(), OS);658    OS << " (";659    ListSeparator LS;660    for (Type *Ty : FTy->params()) {661      OS << LS;662      print(Ty, OS);663    }664    if (FTy->isVarArg())665      OS << LS << "...";666    OS << ')';667    return;668  }669  case Type::StructTyID: {670    StructType *STy = cast<StructType>(Ty);671 672    if (STy->isLiteral())673      return printStructBody(STy, OS);674 675    if (!STy->getName().empty())676      return printLLVMName(OS, STy->getName(), LocalPrefix);677 678    incorporateTypes();679    const auto I = Type2Number.find(STy);680    if (I != Type2Number.end())681      OS << '%' << I->second;682    else  // Not enumerated, print the hex address.683      OS << "%\"type " << STy << '\"';684    return;685  }686  case Type::PointerTyID: {687    PointerType *PTy = cast<PointerType>(Ty);688    OS << "ptr";689    if (unsigned AddressSpace = PTy->getAddressSpace())690      OS << " addrspace(" << AddressSpace << ')';691    return;692  }693  case Type::ArrayTyID: {694    ArrayType *ATy = cast<ArrayType>(Ty);695    OS << '[' << ATy->getNumElements() << " x ";696    print(ATy->getElementType(), OS);697    OS << ']';698    return;699  }700  case Type::FixedVectorTyID:701  case Type::ScalableVectorTyID: {702    VectorType *PTy = cast<VectorType>(Ty);703    ElementCount EC = PTy->getElementCount();704    OS << "<";705    if (EC.isScalable())706      OS << "vscale x ";707    OS << EC.getKnownMinValue() << " x ";708    print(PTy->getElementType(), OS);709    OS << '>';710    return;711  }712  case Type::TypedPointerTyID: {713    TypedPointerType *TPTy = cast<TypedPointerType>(Ty);714    OS << "typedptr(" << *TPTy->getElementType() << ", "715       << TPTy->getAddressSpace() << ")";716    return;717  }718  case Type::TargetExtTyID:719    TargetExtType *TETy = cast<TargetExtType>(Ty);720    OS << "target(\"";721    printEscapedString(Ty->getTargetExtName(), OS);722    OS << "\"";723    for (Type *Inner : TETy->type_params()) {724      OS << ", ";725      Inner->print(OS, /*IsForDebug=*/false, /*NoDetails=*/true);726    }727    for (unsigned IntParam : TETy->int_params())728      OS << ", " << IntParam;729    OS << ")";730    return;731  }732  llvm_unreachable("Invalid TypeID");733}734 735void TypePrinting::printStructBody(StructType *STy, raw_ostream &OS) {736  if (STy->isOpaque()) {737    OS << "opaque";738    return;739  }740 741  if (STy->isPacked())742    OS << '<';743 744  if (STy->getNumElements() == 0) {745    OS << "{}";746  } else {747    OS << "{ ";748    ListSeparator LS;749    for (Type *Ty : STy->elements()) {750      OS << LS;751      print(Ty, OS);752    }753 754    OS << " }";755  }756  if (STy->isPacked())757    OS << '>';758}759 760AbstractSlotTrackerStorage::~AbstractSlotTrackerStorage() = default;761 762//===----------------------------------------------------------------------===//763// SlotTracker Class: Enumerate slot numbers for unnamed values764//===----------------------------------------------------------------------===//765/// This class provides computation of slot numbers for LLVM Assembly writing.766///767class llvm::SlotTracker : public AbstractSlotTrackerStorage {768public:769  /// ValueMap - A mapping of Values to slot numbers.770  using ValueMap = DenseMap<const Value *, unsigned>;771 772private:773  /// TheModule - The module for which we are holding slot numbers.774  const Module* TheModule;775 776  /// TheFunction - The function for which we are holding slot numbers.777  const Function* TheFunction = nullptr;778  bool FunctionProcessed = false;779  bool ShouldInitializeAllMetadata;780 781  std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>782      ProcessModuleHookFn;783  std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>784      ProcessFunctionHookFn;785 786  /// The summary index for which we are holding slot numbers.787  const ModuleSummaryIndex *TheIndex = nullptr;788 789  /// mMap - The slot map for the module level data.790  ValueMap mMap;791  unsigned mNext = 0;792 793  /// fMap - The slot map for the function level data.794  ValueMap fMap;795  unsigned fNext = 0;796 797  /// mdnMap - Map for MDNodes.798  DenseMap<const MDNode*, unsigned> mdnMap;799  unsigned mdnNext = 0;800 801  /// asMap - The slot map for attribute sets.802  DenseMap<AttributeSet, unsigned> asMap;803  unsigned asNext = 0;804 805  /// ModulePathMap - The slot map for Module paths used in the summary index.806  StringMap<unsigned> ModulePathMap;807  unsigned ModulePathNext = 0;808 809  /// GUIDMap - The slot map for GUIDs used in the summary index.810  DenseMap<GlobalValue::GUID, unsigned> GUIDMap;811  unsigned GUIDNext = 0;812 813  /// TypeIdMap - The slot map for type ids used in the summary index.814  StringMap<unsigned> TypeIdMap;815  unsigned TypeIdNext = 0;816 817  /// TypeIdCompatibleVtableMap - The slot map for type compatible vtable ids818  /// used in the summary index.819  StringMap<unsigned> TypeIdCompatibleVtableMap;820  unsigned TypeIdCompatibleVtableNext = 0;821 822public:823  /// Construct from a module.824  ///825  /// If \c ShouldInitializeAllMetadata, initializes all metadata in all826  /// functions, giving correct numbering for metadata referenced only from827  /// within a function (even if no functions have been initialized).828  explicit SlotTracker(const Module *M,829                       bool ShouldInitializeAllMetadata = false);830 831  /// Construct from a function, starting out in incorp state.832  ///833  /// If \c ShouldInitializeAllMetadata, initializes all metadata in all834  /// functions, giving correct numbering for metadata referenced only from835  /// within a function (even if no functions have been initialized).836  explicit SlotTracker(const Function *F,837                       bool ShouldInitializeAllMetadata = false);838 839  /// Construct from a module summary index.840  explicit SlotTracker(const ModuleSummaryIndex *Index);841 842  SlotTracker(const SlotTracker &) = delete;843  SlotTracker &operator=(const SlotTracker &) = delete;844 845  ~SlotTracker() override = default;846 847  void setProcessHook(848      std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>);849  void setProcessHook(std::function<void(AbstractSlotTrackerStorage *,850                                         const Function *, bool)>);851 852  unsigned getNextMetadataSlot() override { return mdnNext; }853 854  void createMetadataSlot(const MDNode *N) override;855 856  /// Return the slot number of the specified value in it's type857  /// plane.  If something is not in the SlotTracker, return -1.858  int getLocalSlot(const Value *V);859  int getGlobalSlot(const GlobalValue *V);860  int getMetadataSlot(const MDNode *N) override;861  int getAttributeGroupSlot(AttributeSet AS);862  int getModulePathSlot(StringRef Path);863  int getGUIDSlot(GlobalValue::GUID GUID);864  int getTypeIdSlot(StringRef Id);865  int getTypeIdCompatibleVtableSlot(StringRef Id);866 867  /// If you'd like to deal with a function instead of just a module, use868  /// this method to get its data into the SlotTracker.869  void incorporateFunction(const Function *F) {870    TheFunction = F;871    FunctionProcessed = false;872  }873 874  const Function *getFunction() const { return TheFunction; }875 876  /// After calling incorporateFunction, use this method to remove the877  /// most recently incorporated function from the SlotTracker. This878  /// will reset the state of the machine back to just the module contents.879  void purgeFunction();880 881  /// MDNode map iterators.882  using mdn_iterator = DenseMap<const MDNode*, unsigned>::iterator;883 884  mdn_iterator mdn_begin() { return mdnMap.begin(); }885  mdn_iterator mdn_end() { return mdnMap.end(); }886  unsigned mdn_size() const { return mdnMap.size(); }887  bool mdn_empty() const { return mdnMap.empty(); }888 889  /// AttributeSet map iterators.890  using as_iterator = DenseMap<AttributeSet, unsigned>::iterator;891 892  as_iterator as_begin()   { return asMap.begin(); }893  as_iterator as_end()     { return asMap.end(); }894  unsigned as_size() const { return asMap.size(); }895  bool as_empty() const    { return asMap.empty(); }896 897  /// GUID map iterators.898  using guid_iterator = DenseMap<GlobalValue::GUID, unsigned>::iterator;899 900  /// These functions do the actual initialization.901  inline void initializeIfNeeded();902  int initializeIndexIfNeeded();903 904  // Implementation Details905private:906  /// CreateModuleSlot - Insert the specified GlobalValue* into the slot table.907  void CreateModuleSlot(const GlobalValue *V);908 909  /// CreateMetadataSlot - Insert the specified MDNode* into the slot table.910  void CreateMetadataSlot(const MDNode *N);911 912  /// CreateFunctionSlot - Insert the specified Value* into the slot table.913  void CreateFunctionSlot(const Value *V);914 915  /// Insert the specified AttributeSet into the slot table.916  void CreateAttributeSetSlot(AttributeSet AS);917 918  inline void CreateModulePathSlot(StringRef Path);919  void CreateGUIDSlot(GlobalValue::GUID GUID);920  void CreateTypeIdSlot(StringRef Id);921  void CreateTypeIdCompatibleVtableSlot(StringRef Id);922 923  /// Add all of the module level global variables (and their initializers)924  /// and function declarations, but not the contents of those functions.925  void processModule();926  // Returns number of allocated slots927  int processIndex();928 929  /// Add all of the functions arguments, basic blocks, and instructions.930  void processFunction();931 932  /// Add the metadata directly attached to a GlobalObject.933  void processGlobalObjectMetadata(const GlobalObject &GO);934 935  /// Add all of the metadata from a function.936  void processFunctionMetadata(const Function &F);937 938  /// Add all of the metadata from an instruction.939  void processInstructionMetadata(const Instruction &I);940 941  /// Add all of the metadata from a DbgRecord.942  void processDbgRecordMetadata(const DbgRecord &DVR);943};944 945ModuleSlotTracker::ModuleSlotTracker(SlotTracker &Machine, const Module *M,946                                     const Function *F)947    : M(M), F(F), Machine(&Machine) {}948 949ModuleSlotTracker::ModuleSlotTracker(const Module *M,950                                     bool ShouldInitializeAllMetadata)951    : ShouldCreateStorage(M),952      ShouldInitializeAllMetadata(ShouldInitializeAllMetadata), M(M) {}953 954ModuleSlotTracker::~ModuleSlotTracker() = default;955 956SlotTracker *ModuleSlotTracker::getMachine() {957  if (!ShouldCreateStorage)958    return Machine;959 960  ShouldCreateStorage = false;961  MachineStorage =962      std::make_unique<SlotTracker>(M, ShouldInitializeAllMetadata);963  Machine = MachineStorage.get();964  if (ProcessModuleHookFn)965    Machine->setProcessHook(ProcessModuleHookFn);966  if (ProcessFunctionHookFn)967    Machine->setProcessHook(ProcessFunctionHookFn);968  return Machine;969}970 971void ModuleSlotTracker::incorporateFunction(const Function &F) {972  // Using getMachine() may lazily create the slot tracker.973  if (!getMachine())974    return;975 976  // Nothing to do if this is the right function already.977  if (this->F == &F)978    return;979  if (this->F)980    Machine->purgeFunction();981  Machine->incorporateFunction(&F);982  this->F = &F;983}984 985int ModuleSlotTracker::getLocalSlot(const Value *V) {986  assert(F && "No function incorporated");987  return Machine->getLocalSlot(V);988}989 990void ModuleSlotTracker::setProcessHook(991    std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>992        Fn) {993  ProcessModuleHookFn = Fn;994}995 996void ModuleSlotTracker::setProcessHook(997    std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>998        Fn) {999  ProcessFunctionHookFn = Fn;1000}1001 1002static SlotTracker *createSlotTracker(const Value *V) {1003  if (const auto *FA = dyn_cast<Argument>(V))1004    return new SlotTracker(FA->getParent());1005 1006  if (const auto *I = dyn_cast<Instruction>(V))1007    if (I->getParent())1008      return new SlotTracker(I->getParent()->getParent());1009 1010  if (const auto *BB = dyn_cast<BasicBlock>(V))1011    return new SlotTracker(BB->getParent());1012 1013  if (const auto *GV = dyn_cast<GlobalVariable>(V))1014    return new SlotTracker(GV->getParent());1015 1016  if (const auto *GA = dyn_cast<GlobalAlias>(V))1017    return new SlotTracker(GA->getParent());1018 1019  if (const auto *GIF = dyn_cast<GlobalIFunc>(V))1020    return new SlotTracker(GIF->getParent());1021 1022  if (const auto *Func = dyn_cast<Function>(V))1023    return new SlotTracker(Func);1024 1025  return nullptr;1026}1027 1028#if 01029#define ST_DEBUG(X) dbgs() << X1030#else1031#define ST_DEBUG(X)1032#endif1033 1034// Module level constructor. Causes the contents of the Module (sans functions)1035// to be added to the slot table.1036SlotTracker::SlotTracker(const Module *M, bool ShouldInitializeAllMetadata)1037    : TheModule(M), ShouldInitializeAllMetadata(ShouldInitializeAllMetadata) {}1038 1039// Function level constructor. Causes the contents of the Module and the one1040// function provided to be added to the slot table.1041SlotTracker::SlotTracker(const Function *F, bool ShouldInitializeAllMetadata)1042    : TheModule(F ? F->getParent() : nullptr), TheFunction(F),1043      ShouldInitializeAllMetadata(ShouldInitializeAllMetadata) {}1044 1045SlotTracker::SlotTracker(const ModuleSummaryIndex *Index)1046    : TheModule(nullptr), ShouldInitializeAllMetadata(false), TheIndex(Index) {}1047 1048inline void SlotTracker::initializeIfNeeded() {1049  if (TheModule) {1050    processModule();1051    TheModule = nullptr; ///< Prevent re-processing next time we're called.1052  }1053 1054  if (TheFunction && !FunctionProcessed)1055    processFunction();1056}1057 1058int SlotTracker::initializeIndexIfNeeded() {1059  if (!TheIndex)1060    return 0;1061  int NumSlots = processIndex();1062  TheIndex = nullptr; ///< Prevent re-processing next time we're called.1063  return NumSlots;1064}1065 1066// Iterate through all the global variables, functions, and global1067// variable initializers and create slots for them.1068void SlotTracker::processModule() {1069  ST_DEBUG("begin processModule!\n");1070 1071  // Add all of the unnamed global variables to the value table.1072  for (const GlobalVariable &Var : TheModule->globals()) {1073    if (!Var.hasName())1074      CreateModuleSlot(&Var);1075    processGlobalObjectMetadata(Var);1076    auto Attrs = Var.getAttributes();1077    if (Attrs.hasAttributes())1078      CreateAttributeSetSlot(Attrs);1079  }1080 1081  for (const GlobalAlias &A : TheModule->aliases()) {1082    if (!A.hasName())1083      CreateModuleSlot(&A);1084  }1085 1086  for (const GlobalIFunc &I : TheModule->ifuncs()) {1087    if (!I.hasName())1088      CreateModuleSlot(&I);1089    processGlobalObjectMetadata(I);1090  }1091 1092  // Add metadata used by named metadata.1093  for (const NamedMDNode &NMD : TheModule->named_metadata()) {1094    for (const MDNode *N : NMD.operands())1095      CreateMetadataSlot(N);1096  }1097 1098  for (const Function &F : *TheModule) {1099    if (!F.hasName())1100      // Add all the unnamed functions to the table.1101      CreateModuleSlot(&F);1102 1103    if (ShouldInitializeAllMetadata)1104      processFunctionMetadata(F);1105 1106    // Add all the function attributes to the table.1107    // FIXME: Add attributes of other objects?1108    AttributeSet FnAttrs = F.getAttributes().getFnAttrs();1109    if (FnAttrs.hasAttributes())1110      CreateAttributeSetSlot(FnAttrs);1111  }1112 1113  if (ProcessModuleHookFn)1114    ProcessModuleHookFn(this, TheModule, ShouldInitializeAllMetadata);1115 1116  ST_DEBUG("end processModule!\n");1117}1118 1119// Process the arguments, basic blocks, and instructions  of a function.1120void SlotTracker::processFunction() {1121  ST_DEBUG("begin processFunction!\n");1122  fNext = 0;1123 1124  // Process function metadata if it wasn't hit at the module-level.1125  if (!ShouldInitializeAllMetadata)1126    processFunctionMetadata(*TheFunction);1127 1128  // Add all the function arguments with no names.1129  for(Function::const_arg_iterator AI = TheFunction->arg_begin(),1130      AE = TheFunction->arg_end(); AI != AE; ++AI)1131    if (!AI->hasName())1132      CreateFunctionSlot(&*AI);1133 1134  ST_DEBUG("Inserting Instructions:\n");1135 1136  // Add all of the basic blocks and instructions with no names.1137  for (auto &BB : *TheFunction) {1138    if (!BB.hasName())1139      CreateFunctionSlot(&BB);1140 1141    for (auto &I : BB) {1142      if (!I.getType()->isVoidTy() && !I.hasName())1143        CreateFunctionSlot(&I);1144 1145      // We allow direct calls to any llvm.foo function here, because the1146      // target may not be linked into the optimizer.1147      if (const auto *Call = dyn_cast<CallBase>(&I)) {1148        // Add all the call attributes to the table.1149        AttributeSet Attrs = Call->getAttributes().getFnAttrs();1150        if (Attrs.hasAttributes())1151          CreateAttributeSetSlot(Attrs);1152      }1153    }1154  }1155 1156  if (ProcessFunctionHookFn)1157    ProcessFunctionHookFn(this, TheFunction, ShouldInitializeAllMetadata);1158 1159  FunctionProcessed = true;1160 1161  ST_DEBUG("end processFunction!\n");1162}1163 1164// Iterate through all the GUID in the index and create slots for them.1165int SlotTracker::processIndex() {1166  ST_DEBUG("begin processIndex!\n");1167  assert(TheIndex);1168 1169  // The first block of slots are just the module ids, which start at 0 and are1170  // assigned consecutively. Since the StringMap iteration order isn't1171  // guaranteed, order by path string before assigning slots.1172  std::vector<StringRef> ModulePaths;1173  for (auto &[ModPath, _] : TheIndex->modulePaths())1174    ModulePaths.push_back(ModPath);1175  llvm::sort(ModulePaths);1176  for (auto &ModPath : ModulePaths)1177    CreateModulePathSlot(ModPath);1178 1179  // Start numbering the GUIDs after the module ids.1180  GUIDNext = ModulePathNext;1181 1182  for (auto &GlobalList : *TheIndex)1183    CreateGUIDSlot(GlobalList.first);1184 1185  // Start numbering the TypeIdCompatibleVtables after the GUIDs.1186  TypeIdCompatibleVtableNext = GUIDNext;1187  for (auto &TId : TheIndex->typeIdCompatibleVtableMap())1188    CreateTypeIdCompatibleVtableSlot(TId.first);1189 1190  // Start numbering the TypeIds after the TypeIdCompatibleVtables.1191  TypeIdNext = TypeIdCompatibleVtableNext;1192  for (const auto &TID : TheIndex->typeIds())1193    CreateTypeIdSlot(TID.second.first);1194 1195  ST_DEBUG("end processIndex!\n");1196  return TypeIdNext;1197}1198 1199void SlotTracker::processGlobalObjectMetadata(const GlobalObject &GO) {1200  SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;1201  GO.getAllMetadata(MDs);1202  for (auto &MD : MDs)1203    CreateMetadataSlot(MD.second);1204}1205 1206void SlotTracker::processFunctionMetadata(const Function &F) {1207  processGlobalObjectMetadata(F);1208  for (auto &BB : F) {1209    for (auto &I : BB) {1210      for (const DbgRecord &DR : I.getDbgRecordRange())1211        processDbgRecordMetadata(DR);1212      processInstructionMetadata(I);1213    }1214  }1215}1216 1217void SlotTracker::processDbgRecordMetadata(const DbgRecord &DR) {1218  // Tolerate null metadata pointers: it's a completely illegal debug record,1219  // but we can have faulty metadata from debug-intrinsic days being1220  // autoupgraded into debug records. This gets caught by the verifier, which1221  // then will print the faulty IR, hitting this code path.1222  if (const auto *DVR = dyn_cast<const DbgVariableRecord>(&DR)) {1223    // Process metadata used by DbgRecords; we only specifically care about the1224    // DILocalVariable, DILocation, and DIAssignID fields, as the Value and1225    // Expression fields should only be printed inline and so do not use a slot.1226    // Note: The above doesn't apply for empty-metadata operands.1227    if (auto *Empty = dyn_cast_if_present<MDNode>(DVR->getRawLocation()))1228      CreateMetadataSlot(Empty);1229    if (DVR->getRawVariable())1230      CreateMetadataSlot(DVR->getRawVariable());1231    if (DVR->isDbgAssign()) {1232      if (auto *AssignID = DVR->getRawAssignID())1233        CreateMetadataSlot(cast<MDNode>(AssignID));1234      if (auto *Empty = dyn_cast_if_present<MDNode>(DVR->getRawAddress()))1235        CreateMetadataSlot(Empty);1236    }1237  } else if (const auto *DLR = dyn_cast<const DbgLabelRecord>(&DR)) {1238    CreateMetadataSlot(DLR->getRawLabel());1239  } else {1240    llvm_unreachable("unsupported DbgRecord kind");1241  }1242  if (DR.getDebugLoc())1243    CreateMetadataSlot(DR.getDebugLoc().getAsMDNode());1244}1245 1246void SlotTracker::processInstructionMetadata(const Instruction &I) {1247  // Process metadata used directly by intrinsics.1248  if (const auto *CI = dyn_cast<CallInst>(&I))1249    if (Function *F = CI->getCalledFunction())1250      if (F->isIntrinsic())1251        for (auto &Op : I.operands())1252          if (auto *V = dyn_cast_or_null<MetadataAsValue>(Op))1253            if (auto *N = dyn_cast<MDNode>(V->getMetadata()))1254              CreateMetadataSlot(N);1255 1256  // Process metadata attached to this instruction.1257  SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;1258  I.getAllMetadata(MDs);1259  for (auto &MD : MDs)1260    CreateMetadataSlot(MD.second);1261}1262 1263/// Clean up after incorporating a function. This is the only way to get out of1264/// the function incorporation state that affects get*Slot/Create*Slot. Function1265/// incorporation state is indicated by TheFunction != 0.1266void SlotTracker::purgeFunction() {1267  ST_DEBUG("begin purgeFunction!\n");1268  fMap.clear(); // Simply discard the function level map1269  TheFunction = nullptr;1270  FunctionProcessed = false;1271  ST_DEBUG("end purgeFunction!\n");1272}1273 1274/// getGlobalSlot - Get the slot number of a global value.1275int SlotTracker::getGlobalSlot(const GlobalValue *V) {1276  // Check for uninitialized state and do lazy initialization.1277  initializeIfNeeded();1278 1279  // Find the value in the module map1280  ValueMap::iterator MI = mMap.find(V);1281  return MI == mMap.end() ? -1 : (int)MI->second;1282}1283 1284void SlotTracker::setProcessHook(1285    std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>1286        Fn) {1287  ProcessModuleHookFn = Fn;1288}1289 1290void SlotTracker::setProcessHook(1291    std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>1292        Fn) {1293  ProcessFunctionHookFn = Fn;1294}1295 1296/// getMetadataSlot - Get the slot number of a MDNode.1297void SlotTracker::createMetadataSlot(const MDNode *N) { CreateMetadataSlot(N); }1298 1299/// getMetadataSlot - Get the slot number of a MDNode.1300int SlotTracker::getMetadataSlot(const MDNode *N) {1301  // Check for uninitialized state and do lazy initialization.1302  initializeIfNeeded();1303 1304  // Find the MDNode in the module map1305  mdn_iterator MI = mdnMap.find(N);1306  return MI == mdnMap.end() ? -1 : (int)MI->second;1307}1308 1309/// getLocalSlot - Get the slot number for a value that is local to a function.1310int SlotTracker::getLocalSlot(const Value *V) {1311  assert(!isa<Constant>(V) && "Can't get a constant or global slot with this!");1312 1313  // Check for uninitialized state and do lazy initialization.1314  initializeIfNeeded();1315 1316  ValueMap::iterator FI = fMap.find(V);1317  return FI == fMap.end() ? -1 : (int)FI->second;1318}1319 1320int SlotTracker::getAttributeGroupSlot(AttributeSet AS) {1321  // Check for uninitialized state and do lazy initialization.1322  initializeIfNeeded();1323 1324  // Find the AttributeSet in the module map.1325  as_iterator AI = asMap.find(AS);1326  return AI == asMap.end() ? -1 : (int)AI->second;1327}1328 1329int SlotTracker::getModulePathSlot(StringRef Path) {1330  // Check for uninitialized state and do lazy initialization.1331  initializeIndexIfNeeded();1332 1333  // Find the Module path in the map1334  auto I = ModulePathMap.find(Path);1335  return I == ModulePathMap.end() ? -1 : (int)I->second;1336}1337 1338int SlotTracker::getGUIDSlot(GlobalValue::GUID GUID) {1339  // Check for uninitialized state and do lazy initialization.1340  initializeIndexIfNeeded();1341 1342  // Find the GUID in the map1343  guid_iterator I = GUIDMap.find(GUID);1344  return I == GUIDMap.end() ? -1 : (int)I->second;1345}1346 1347int SlotTracker::getTypeIdSlot(StringRef Id) {1348  // Check for uninitialized state and do lazy initialization.1349  initializeIndexIfNeeded();1350 1351  // Find the TypeId string in the map1352  auto I = TypeIdMap.find(Id);1353  return I == TypeIdMap.end() ? -1 : (int)I->second;1354}1355 1356int SlotTracker::getTypeIdCompatibleVtableSlot(StringRef Id) {1357  // Check for uninitialized state and do lazy initialization.1358  initializeIndexIfNeeded();1359 1360  // Find the TypeIdCompatibleVtable string in the map1361  auto I = TypeIdCompatibleVtableMap.find(Id);1362  return I == TypeIdCompatibleVtableMap.end() ? -1 : (int)I->second;1363}1364 1365/// CreateModuleSlot - Insert the specified GlobalValue* into the slot table.1366void SlotTracker::CreateModuleSlot(const GlobalValue *V) {1367  assert(V && "Can't insert a null Value into SlotTracker!");1368  assert(!V->getType()->isVoidTy() && "Doesn't need a slot!");1369  assert(!V->hasName() && "Doesn't need a slot!");1370 1371  unsigned DestSlot = mNext++;1372  mMap[V] = DestSlot;1373 1374  ST_DEBUG("  Inserting value [" << V->getType() << "] = " << V << " slot=" <<1375           DestSlot << " [");1376  // G = Global, F = Function, A = Alias, I = IFunc, o = other1377  ST_DEBUG((isa<GlobalVariable>(V) ? 'G' :1378            (isa<Function>(V) ? 'F' :1379             (isa<GlobalAlias>(V) ? 'A' :1380              (isa<GlobalIFunc>(V) ? 'I' : 'o')))) << "]\n");1381}1382 1383/// CreateSlot - Create a new slot for the specified value if it has no name.1384void SlotTracker::CreateFunctionSlot(const Value *V) {1385  assert(!V->getType()->isVoidTy() && !V->hasName() && "Doesn't need a slot!");1386 1387  unsigned DestSlot = fNext++;1388  fMap[V] = DestSlot;1389 1390  // G = Global, F = Function, o = other1391  ST_DEBUG("  Inserting value [" << V->getType() << "] = " << V << " slot=" <<1392           DestSlot << " [o]\n");1393}1394 1395/// CreateModuleSlot - Insert the specified MDNode* into the slot table.1396void SlotTracker::CreateMetadataSlot(const MDNode *N) {1397  assert(N && "Can't insert a null Value into SlotTracker!");1398 1399  // Don't make slots for DIExpressions. We just print them inline everywhere.1400  if (isa<DIExpression>(N))1401    return;1402 1403  unsigned DestSlot = mdnNext;1404  if (!mdnMap.insert(std::make_pair(N, DestSlot)).second)1405    return;1406  ++mdnNext;1407 1408  // Recursively add any MDNodes referenced by operands.1409  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)1410    if (const auto *Op = dyn_cast_or_null<MDNode>(N->getOperand(i)))1411      CreateMetadataSlot(Op);1412}1413 1414void SlotTracker::CreateAttributeSetSlot(AttributeSet AS) {1415  assert(AS.hasAttributes() && "Doesn't need a slot!");1416 1417  if (asMap.try_emplace(AS, asNext).second)1418    ++asNext;1419}1420 1421/// Create a new slot for the specified Module1422void SlotTracker::CreateModulePathSlot(StringRef Path) {1423  ModulePathMap[Path] = ModulePathNext++;1424}1425 1426/// Create a new slot for the specified GUID1427void SlotTracker::CreateGUIDSlot(GlobalValue::GUID GUID) {1428  GUIDMap[GUID] = GUIDNext++;1429}1430 1431/// Create a new slot for the specified Id1432void SlotTracker::CreateTypeIdSlot(StringRef Id) {1433  TypeIdMap[Id] = TypeIdNext++;1434}1435 1436/// Create a new slot for the specified Id1437void SlotTracker::CreateTypeIdCompatibleVtableSlot(StringRef Id) {1438  TypeIdCompatibleVtableMap[Id] = TypeIdCompatibleVtableNext++;1439}1440 1441namespace {1442/// Common instances used by most of the printer functions.1443struct AsmWriterContext {1444  TypePrinting *TypePrinter = nullptr;1445  SlotTracker *Machine = nullptr;1446  const Module *Context = nullptr;1447 1448  AsmWriterContext(TypePrinting *TP, SlotTracker *ST, const Module *M = nullptr)1449      : TypePrinter(TP), Machine(ST), Context(M) {}1450 1451  static AsmWriterContext &getEmpty() {1452    static AsmWriterContext EmptyCtx(nullptr, nullptr);1453    return EmptyCtx;1454  }1455 1456  /// A callback that will be triggered when the underlying printer1457  /// prints a Metadata as operand.1458  virtual void onWriteMetadataAsOperand(const Metadata *) {}1459 1460  virtual ~AsmWriterContext() = default;1461};1462} // end anonymous namespace1463 1464//===----------------------------------------------------------------------===//1465// AsmWriter Implementation1466//===----------------------------------------------------------------------===//1467 1468static void writeAsOperandInternal(raw_ostream &Out, const Value *V,1469                                   AsmWriterContext &WriterCtx,1470                                   bool PrintType = false);1471 1472static void writeAsOperandInternal(raw_ostream &Out, const Metadata *MD,1473                                   AsmWriterContext &WriterCtx,1474                                   bool FromValue = false);1475 1476static void writeOptimizationInfo(raw_ostream &Out, const User *U) {1477  if (const auto *FPO = dyn_cast<const FPMathOperator>(U))1478    Out << FPO->getFastMathFlags();1479 1480  if (const auto *OBO = dyn_cast<OverflowingBinaryOperator>(U)) {1481    if (OBO->hasNoUnsignedWrap())1482      Out << " nuw";1483    if (OBO->hasNoSignedWrap())1484      Out << " nsw";1485  } else if (const auto *Div = dyn_cast<PossiblyExactOperator>(U)) {1486    if (Div->isExact())1487      Out << " exact";1488  } else if (const auto *PDI = dyn_cast<PossiblyDisjointInst>(U)) {1489    if (PDI->isDisjoint())1490      Out << " disjoint";1491  } else if (const auto *GEP = dyn_cast<GEPOperator>(U)) {1492    if (GEP->isInBounds())1493      Out << " inbounds";1494    else if (GEP->hasNoUnsignedSignedWrap())1495      Out << " nusw";1496    if (GEP->hasNoUnsignedWrap())1497      Out << " nuw";1498    if (auto InRange = GEP->getInRange()) {1499      Out << " inrange(" << InRange->getLower() << ", " << InRange->getUpper()1500          << ")";1501    }1502  } else if (const auto *NNI = dyn_cast<PossiblyNonNegInst>(U)) {1503    if (NNI->hasNonNeg())1504      Out << " nneg";1505  } else if (const auto *TI = dyn_cast<TruncInst>(U)) {1506    if (TI->hasNoUnsignedWrap())1507      Out << " nuw";1508    if (TI->hasNoSignedWrap())1509      Out << " nsw";1510  } else if (const auto *ICmp = dyn_cast<ICmpInst>(U)) {1511    if (ICmp->hasSameSign())1512      Out << " samesign";1513  }1514}1515 1516static void writeAPFloatInternal(raw_ostream &Out, const APFloat &APF) {1517  if (&APF.getSemantics() == &APFloat::IEEEsingle() ||1518      &APF.getSemantics() == &APFloat::IEEEdouble()) {1519    // We would like to output the FP constant value in exponential notation,1520    // but we cannot do this if doing so will lose precision.  Check here to1521    // make sure that we only output it in exponential format if we can parse1522    // the value back and get the same value.1523    //1524    bool ignored;1525    bool isDouble = &APF.getSemantics() == &APFloat::IEEEdouble();1526    bool isInf = APF.isInfinity();1527    bool isNaN = APF.isNaN();1528 1529    if (!isInf && !isNaN) {1530      double Val = APF.convertToDouble();1531      SmallString<128> StrVal;1532      APF.toString(StrVal, 6, 0, false);1533      // Check to make sure that the stringized number is not some string like1534      // "Inf" or NaN, that atof will accept, but the lexer will not.  Check1535      // that the string matches the "[-+]?[0-9]" regex.1536      //1537      assert((isDigit(StrVal[0]) ||1538              ((StrVal[0] == '-' || StrVal[0] == '+') && isDigit(StrVal[1]))) &&1539             "[-+]?[0-9] regex does not match!");1540      // Reparse stringized version!1541      if (APFloat(APFloat::IEEEdouble(), StrVal).convertToDouble() == Val) {1542        Out << StrVal;1543        return;1544      }1545    }1546 1547    // Otherwise we could not reparse it to exactly the same value, so we must1548    // output the string in hexadecimal format!  Note that loading and storing1549    // floating point types changes the bits of NaNs on some hosts, notably1550    // x86, so we must not use these types.1551    static_assert(sizeof(double) == sizeof(uint64_t),1552                  "assuming that double is 64 bits!");1553    APFloat apf = APF;1554 1555    // Floats are represented in ASCII IR as double, convert.1556    // FIXME: We should allow 32-bit hex float and remove this.1557    if (!isDouble) {1558      // A signaling NaN is quieted on conversion, so we need to recreate the1559      // expected value after convert (quiet bit of the payload is clear).1560      bool IsSNAN = apf.isSignaling();1561      apf.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven,1562                  &ignored);1563      if (IsSNAN) {1564        APInt Payload = apf.bitcastToAPInt();1565        apf =1566            APFloat::getSNaN(APFloat::IEEEdouble(), apf.isNegative(), &Payload);1567      }1568    }1569 1570    Out << format_hex(apf.bitcastToAPInt().getZExtValue(), 0, /*Upper=*/true);1571    return;1572  }1573 1574  // Either half, bfloat or some form of long double.1575  // These appear as a magic letter identifying the type, then a1576  // fixed number of hex digits.1577  Out << "0x";1578  APInt API = APF.bitcastToAPInt();1579  if (&APF.getSemantics() == &APFloat::x87DoubleExtended()) {1580    Out << 'K';1581    Out << format_hex_no_prefix(API.getHiBits(16).getZExtValue(), 4,1582                                /*Upper=*/true);1583    Out << format_hex_no_prefix(API.getLoBits(64).getZExtValue(), 16,1584                                /*Upper=*/true);1585  } else if (&APF.getSemantics() == &APFloat::IEEEquad()) {1586    Out << 'L';1587    Out << format_hex_no_prefix(API.getLoBits(64).getZExtValue(), 16,1588                                /*Upper=*/true);1589    Out << format_hex_no_prefix(API.getHiBits(64).getZExtValue(), 16,1590                                /*Upper=*/true);1591  } else if (&APF.getSemantics() == &APFloat::PPCDoubleDouble()) {1592    Out << 'M';1593    Out << format_hex_no_prefix(API.getLoBits(64).getZExtValue(), 16,1594                                /*Upper=*/true);1595    Out << format_hex_no_prefix(API.getHiBits(64).getZExtValue(), 16,1596                                /*Upper=*/true);1597  } else if (&APF.getSemantics() == &APFloat::IEEEhalf()) {1598    Out << 'H';1599    Out << format_hex_no_prefix(API.getZExtValue(), 4,1600                                /*Upper=*/true);1601  } else if (&APF.getSemantics() == &APFloat::BFloat()) {1602    Out << 'R';1603    Out << format_hex_no_prefix(API.getZExtValue(), 4,1604                                /*Upper=*/true);1605  } else1606    llvm_unreachable("Unsupported floating point type");1607}1608 1609static void writeConstantInternal(raw_ostream &Out, const Constant *CV,1610                                  AsmWriterContext &WriterCtx) {1611  if (const auto *CI = dyn_cast<ConstantInt>(CV)) {1612    Type *Ty = CI->getType();1613 1614    if (Ty->isVectorTy()) {1615      Out << "splat (";1616      WriterCtx.TypePrinter->print(Ty->getScalarType(), Out);1617      Out << " ";1618    }1619 1620    if (Ty->getScalarType()->isIntegerTy(1))1621      Out << (CI->getZExtValue() ? "true" : "false");1622    else1623      Out << CI->getValue();1624 1625    if (Ty->isVectorTy())1626      Out << ")";1627 1628    return;1629  }1630 1631  if (const auto *CFP = dyn_cast<ConstantFP>(CV)) {1632    Type *Ty = CFP->getType();1633 1634    if (Ty->isVectorTy()) {1635      Out << "splat (";1636      WriterCtx.TypePrinter->print(Ty->getScalarType(), Out);1637      Out << " ";1638    }1639 1640    writeAPFloatInternal(Out, CFP->getValueAPF());1641 1642    if (Ty->isVectorTy())1643      Out << ")";1644 1645    return;1646  }1647 1648  if (isa<ConstantAggregateZero>(CV) || isa<ConstantTargetNone>(CV)) {1649    Out << "zeroinitializer";1650    return;1651  }1652 1653  if (const auto *BA = dyn_cast<BlockAddress>(CV)) {1654    Out << "blockaddress(";1655    writeAsOperandInternal(Out, BA->getFunction(), WriterCtx);1656    Out << ", ";1657    writeAsOperandInternal(Out, BA->getBasicBlock(), WriterCtx);1658    Out << ")";1659    return;1660  }1661 1662  if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(CV)) {1663    Out << "dso_local_equivalent ";1664    writeAsOperandInternal(Out, Equiv->getGlobalValue(), WriterCtx);1665    return;1666  }1667 1668  if (const auto *NC = dyn_cast<NoCFIValue>(CV)) {1669    Out << "no_cfi ";1670    writeAsOperandInternal(Out, NC->getGlobalValue(), WriterCtx);1671    return;1672  }1673 1674  if (const auto *CPA = dyn_cast<ConstantPtrAuth>(CV)) {1675    Out << "ptrauth (";1676 1677    // ptrauth (ptr CST, i32 KEY[, i64 DISC[, ptr ADDRDISC[, ptr DS]?]?]?)1678    unsigned NumOpsToWrite = 2;1679    if (!CPA->getOperand(2)->isNullValue())1680      NumOpsToWrite = 3;1681    if (!CPA->getOperand(3)->isNullValue())1682      NumOpsToWrite = 4;1683    if (!CPA->getOperand(4)->isNullValue())1684      NumOpsToWrite = 5;1685 1686    ListSeparator LS;1687    for (unsigned i = 0, e = NumOpsToWrite; i != e; ++i) {1688      Out << LS;1689      writeAsOperandInternal(Out, CPA->getOperand(i), WriterCtx,1690                             /*PrintType=*/true);1691    }1692    Out << ')';1693    return;1694  }1695 1696  if (const auto *CA = dyn_cast<ConstantArray>(CV)) {1697    Out << '[';1698    ListSeparator LS;1699    for (const Value *Op : CA->operands()) {1700      Out << LS;1701      writeAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);1702    }1703    Out << ']';1704    return;1705  }1706 1707  if (const auto *CA = dyn_cast<ConstantDataArray>(CV)) {1708    // As a special case, print the array as a string if it is an array of1709    // i8 with ConstantInt values.1710    if (CA->isString()) {1711      Out << "c\"";1712      printEscapedString(CA->getAsString(), Out);1713      Out << '"';1714      return;1715    }1716 1717    Out << '[';1718    ListSeparator LS;1719    for (uint64_t i = 0, e = CA->getNumElements(); i != e; ++i) {1720      Out << LS;1721      writeAsOperandInternal(Out, CA->getElementAsConstant(i), WriterCtx,1722                             /*PrintType=*/true);1723    }1724    Out << ']';1725    return;1726  }1727 1728  if (const auto *CS = dyn_cast<ConstantStruct>(CV)) {1729    if (CS->getType()->isPacked())1730      Out << '<';1731    Out << '{';1732    if (CS->getNumOperands() != 0) {1733      Out << ' ';1734      ListSeparator LS;1735      for (const Value *Op : CS->operands()) {1736        Out << LS;1737        writeAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);1738      }1739      Out << ' ';1740    }1741    Out << '}';1742    if (CS->getType()->isPacked())1743      Out << '>';1744    return;1745  }1746 1747  if (isa<ConstantVector>(CV) || isa<ConstantDataVector>(CV)) {1748    auto *CVVTy = cast<FixedVectorType>(CV->getType());1749 1750    // Use the same shorthand for splat vector (i.e. "splat(Ty val)") as is1751    // permitted on IR input to reduce the output changes when enabling1752    // UseConstant{Int,FP}ForFixedLengthSplat.1753    // TODO: Remove this block when the UseConstant{Int,FP}ForFixedLengthSplat1754    // options are removed.1755    if (auto *SplatVal = CV->getSplatValue()) {1756      if (isa<ConstantInt>(SplatVal) || isa<ConstantFP>(SplatVal)) {1757        Out << "splat (";1758        writeAsOperandInternal(Out, SplatVal, WriterCtx, /*PrintType=*/true);1759        Out << ')';1760        return;1761      }1762    }1763 1764    Out << '<';1765    ListSeparator LS;1766    for (unsigned i = 0, e = CVVTy->getNumElements(); i != e; ++i) {1767      Out << LS;1768      writeAsOperandInternal(Out, CV->getAggregateElement(i), WriterCtx,1769                             /*PrintType=*/true);1770    }1771    Out << '>';1772    return;1773  }1774 1775  if (isa<ConstantPointerNull>(CV)) {1776    Out << "null";1777    return;1778  }1779 1780  if (isa<ConstantTokenNone>(CV)) {1781    Out << "none";1782    return;1783  }1784 1785  if (isa<PoisonValue>(CV)) {1786    Out << "poison";1787    return;1788  }1789 1790  if (isa<UndefValue>(CV)) {1791    Out << "undef";1792    return;1793  }1794 1795  if (const auto *CE = dyn_cast<ConstantExpr>(CV)) {1796    // Use the same shorthand for splat vector (i.e. "splat(Ty val)") as is1797    // permitted on IR input to reduce the output changes when enabling1798    // UseConstant{Int,FP}ForScalableSplat.1799    // TODO: Remove this block when the UseConstant{Int,FP}ForScalableSplat1800    // options are removed.1801    if (CE->getOpcode() == Instruction::ShuffleVector) {1802      if (auto *SplatVal = CE->getSplatValue()) {1803        if (isa<ConstantInt>(SplatVal) || isa<ConstantFP>(SplatVal)) {1804          Out << "splat (";1805          writeAsOperandInternal(Out, SplatVal, WriterCtx, /*PrintType=*/true);1806          Out << ')';1807          return;1808        }1809      }1810    }1811 1812    Out << CE->getOpcodeName();1813    writeOptimizationInfo(Out, CE);1814    Out << " (";1815 1816    if (const auto *GEP = dyn_cast<GEPOperator>(CE)) {1817      WriterCtx.TypePrinter->print(GEP->getSourceElementType(), Out);1818      Out << ", ";1819    }1820 1821    ListSeparator LS;1822    for (const Value *Op : CE->operands()) {1823      Out << LS;1824      writeAsOperandInternal(Out, Op, WriterCtx, /*PrintType=*/true);1825    }1826 1827    if (CE->isCast()) {1828      Out << " to ";1829      WriterCtx.TypePrinter->print(CE->getType(), Out);1830    }1831 1832    if (CE->getOpcode() == Instruction::ShuffleVector)1833      printShuffleMask(Out, CE->getType(), CE->getShuffleMask());1834 1835    Out << ')';1836    return;1837  }1838 1839  Out << "<placeholder or erroneous Constant>";1840}1841 1842static void writeMDTuple(raw_ostream &Out, const MDTuple *Node,1843                         AsmWriterContext &WriterCtx) {1844  Out << "!{";1845  ListSeparator LS;1846  for (const Metadata *MD : Node->operands()) {1847    Out << LS;1848    if (!MD) {1849      Out << "null";1850    } else if (auto *MDV = dyn_cast<ValueAsMetadata>(MD)) {1851      Value *V = MDV->getValue();1852      writeAsOperandInternal(Out, V, WriterCtx, /*PrintType=*/true);1853    } else {1854      writeAsOperandInternal(Out, MD, WriterCtx);1855      WriterCtx.onWriteMetadataAsOperand(MD);1856    }1857  }1858 1859  Out << "}";1860}1861 1862namespace {1863 1864struct MDFieldPrinter {1865  raw_ostream &Out;1866  ListSeparator FS;1867  AsmWriterContext &WriterCtx;1868 1869  explicit MDFieldPrinter(raw_ostream &Out)1870      : Out(Out), WriterCtx(AsmWriterContext::getEmpty()) {}1871  MDFieldPrinter(raw_ostream &Out, AsmWriterContext &Ctx)1872      : Out(Out), WriterCtx(Ctx) {}1873 1874  void printTag(const DINode *N);1875  void printMacinfoType(const DIMacroNode *N);1876  void printChecksum(const DIFile::ChecksumInfo<StringRef> &N);1877  void printString(StringRef Name, StringRef Value,1878                   bool ShouldSkipEmpty = true);1879  void printMetadata(StringRef Name, const Metadata *MD,1880                     bool ShouldSkipNull = true);1881  void printMetadataOrInt(StringRef Name, const Metadata *MD, bool IsUnsigned,1882                          bool ShouldSkipZero = true);1883  template <class IntTy>1884  void printInt(StringRef Name, IntTy Int, bool ShouldSkipZero = true);1885  void printAPInt(StringRef Name, const APInt &Int, bool IsUnsigned,1886                  bool ShouldSkipZero);1887  void printBool(StringRef Name, bool Value,1888                 std::optional<bool> Default = std::nullopt);1889  void printDIFlags(StringRef Name, DINode::DIFlags Flags);1890  void printDISPFlags(StringRef Name, DISubprogram::DISPFlags Flags);1891  template <class IntTy, class Stringifier>1892  void printDwarfEnum(StringRef Name, IntTy Value, Stringifier toString,1893                      bool ShouldSkipZero = true);1894  void printEmissionKind(StringRef Name, DICompileUnit::DebugEmissionKind EK);1895  void printNameTableKind(StringRef Name,1896                          DICompileUnit::DebugNameTableKind NTK);1897  void printFixedPointKind(StringRef Name, DIFixedPointType::FixedPointKind V);1898};1899 1900} // end anonymous namespace1901 1902void MDFieldPrinter::printTag(const DINode *N) {1903  Out << FS << "tag: ";1904  auto Tag = dwarf::TagString(N->getTag());1905  if (!Tag.empty())1906    Out << Tag;1907  else1908    Out << N->getTag();1909}1910 1911void MDFieldPrinter::printMacinfoType(const DIMacroNode *N) {1912  Out << FS << "type: ";1913  auto Type = dwarf::MacinfoString(N->getMacinfoType());1914  if (!Type.empty())1915    Out << Type;1916  else1917    Out << N->getMacinfoType();1918}1919 1920void MDFieldPrinter::printChecksum(1921    const DIFile::ChecksumInfo<StringRef> &Checksum) {1922  Out << FS << "checksumkind: " << Checksum.getKindAsString();1923  printString("checksum", Checksum.Value, /* ShouldSkipEmpty */ false);1924}1925 1926void MDFieldPrinter::printString(StringRef Name, StringRef Value,1927                                 bool ShouldSkipEmpty) {1928  if (ShouldSkipEmpty && Value.empty())1929    return;1930 1931  Out << FS << Name << ": \"";1932  printEscapedString(Value, Out);1933  Out << "\"";1934}1935 1936static void writeMetadataAsOperand(raw_ostream &Out, const Metadata *MD,1937                                   AsmWriterContext &WriterCtx) {1938  if (!MD) {1939    Out << "null";1940    return;1941  }1942  writeAsOperandInternal(Out, MD, WriterCtx);1943  WriterCtx.onWriteMetadataAsOperand(MD);1944}1945 1946void MDFieldPrinter::printMetadata(StringRef Name, const Metadata *MD,1947                                   bool ShouldSkipNull) {1948  if (ShouldSkipNull && !MD)1949    return;1950 1951  Out << FS << Name << ": ";1952  writeMetadataAsOperand(Out, MD, WriterCtx);1953}1954 1955void MDFieldPrinter::printMetadataOrInt(StringRef Name, const Metadata *MD,1956                                        bool IsUnsigned, bool ShouldSkipZero) {1957  if (!MD)1958    return;1959 1960  if (auto *CI = dyn_cast<ConstantAsMetadata>(MD)) {1961    auto *CV = cast<ConstantInt>(CI->getValue());1962    if (IsUnsigned)1963      printInt(Name, CV->getZExtValue(), ShouldSkipZero);1964    else1965      printInt(Name, CV->getSExtValue(), ShouldSkipZero);1966  } else1967    printMetadata(Name, MD);1968}1969 1970template <class IntTy>1971void MDFieldPrinter::printInt(StringRef Name, IntTy Int, bool ShouldSkipZero) {1972  if (ShouldSkipZero && !Int)1973    return;1974 1975  Out << FS << Name << ": " << Int;1976}1977 1978void MDFieldPrinter::printAPInt(StringRef Name, const APInt &Int,1979                                bool IsUnsigned, bool ShouldSkipZero) {1980  if (ShouldSkipZero && Int.isZero())1981    return;1982 1983  Out << FS << Name << ": ";1984  Int.print(Out, !IsUnsigned);1985}1986 1987void MDFieldPrinter::printBool(StringRef Name, bool Value,1988                               std::optional<bool> Default) {1989  if (Default && Value == *Default)1990    return;1991  Out << FS << Name << ": " << (Value ? "true" : "false");1992}1993 1994void MDFieldPrinter::printDIFlags(StringRef Name, DINode::DIFlags Flags) {1995  if (!Flags)1996    return;1997 1998  Out << FS << Name << ": ";1999 2000  SmallVector<DINode::DIFlags, 8> SplitFlags;2001  auto Extra = DINode::splitFlags(Flags, SplitFlags);2002 2003  ListSeparator FlagsFS(" | ");2004  for (auto F : SplitFlags) {2005    auto StringF = DINode::getFlagString(F);2006    assert(!StringF.empty() && "Expected valid flag");2007    Out << FlagsFS << StringF;2008  }2009  if (Extra || SplitFlags.empty())2010    Out << FlagsFS << Extra;2011}2012 2013void MDFieldPrinter::printDISPFlags(StringRef Name,2014                                    DISubprogram::DISPFlags Flags) {2015  // Always print this field, because no flags in the IR at all will be2016  // interpreted as old-style isDefinition: true.2017  Out << FS << Name << ": ";2018 2019  if (!Flags) {2020    Out << 0;2021    return;2022  }2023 2024  SmallVector<DISubprogram::DISPFlags, 8> SplitFlags;2025  auto Extra = DISubprogram::splitFlags(Flags, SplitFlags);2026 2027  ListSeparator FlagsFS(" | ");2028  for (auto F : SplitFlags) {2029    auto StringF = DISubprogram::getFlagString(F);2030    assert(!StringF.empty() && "Expected valid flag");2031    Out << FlagsFS << StringF;2032  }2033  if (Extra || SplitFlags.empty())2034    Out << FlagsFS << Extra;2035}2036 2037void MDFieldPrinter::printEmissionKind(StringRef Name,2038                                       DICompileUnit::DebugEmissionKind EK) {2039  Out << FS << Name << ": " << DICompileUnit::emissionKindString(EK);2040}2041 2042void MDFieldPrinter::printNameTableKind(StringRef Name,2043                                        DICompileUnit::DebugNameTableKind NTK) {2044  if (NTK == DICompileUnit::DebugNameTableKind::Default)2045    return;2046  Out << FS << Name << ": " << DICompileUnit::nameTableKindString(NTK);2047}2048 2049void MDFieldPrinter::printFixedPointKind(StringRef Name,2050                                         DIFixedPointType::FixedPointKind V) {2051  Out << FS << Name << ": " << DIFixedPointType::fixedPointKindString(V);2052}2053 2054template <class IntTy, class Stringifier>2055void MDFieldPrinter::printDwarfEnum(StringRef Name, IntTy Value,2056                                    Stringifier toString, bool ShouldSkipZero) {2057  if (ShouldSkipZero && !Value)2058    return;2059 2060  Out << FS << Name << ": ";2061  auto S = toString(Value);2062  if (!S.empty())2063    Out << S;2064  else2065    Out << Value;2066}2067 2068static void writeGenericDINode(raw_ostream &Out, const GenericDINode *N,2069                               AsmWriterContext &WriterCtx) {2070  Out << "!GenericDINode(";2071  MDFieldPrinter Printer(Out, WriterCtx);2072  Printer.printTag(N);2073  Printer.printString("header", N->getHeader());2074  if (N->getNumDwarfOperands()) {2075    Out << Printer.FS << "operands: {";2076    ListSeparator IFS;2077    for (auto &I : N->dwarf_operands()) {2078      Out << IFS;2079      writeMetadataAsOperand(Out, I, WriterCtx);2080    }2081    Out << "}";2082  }2083  Out << ")";2084}2085 2086static void writeDILocation(raw_ostream &Out, const DILocation *DL,2087                            AsmWriterContext &WriterCtx) {2088  Out << "!DILocation(";2089  MDFieldPrinter Printer(Out, WriterCtx);2090  // Always output the line, since 0 is a relevant and important value for it.2091  Printer.printInt("line", DL->getLine(), /* ShouldSkipZero */ false);2092  Printer.printInt("column", DL->getColumn());2093  Printer.printMetadata("scope", DL->getRawScope(), /* ShouldSkipNull */ false);2094  Printer.printMetadata("inlinedAt", DL->getRawInlinedAt());2095  Printer.printBool("isImplicitCode", DL->isImplicitCode(),2096                    /* Default */ false);2097  Printer.printInt("atomGroup", DL->getAtomGroup());2098  Printer.printInt<unsigned>("atomRank", DL->getAtomRank());2099  Out << ")";2100}2101 2102static void writeDIAssignID(raw_ostream &Out, const DIAssignID *DL,2103                            AsmWriterContext &WriterCtx) {2104  Out << "!DIAssignID()";2105  MDFieldPrinter Printer(Out, WriterCtx);2106}2107 2108static void writeDISubrange(raw_ostream &Out, const DISubrange *N,2109                            AsmWriterContext &WriterCtx) {2110  Out << "!DISubrange(";2111  MDFieldPrinter Printer(Out, WriterCtx);2112 2113  Printer.printMetadataOrInt("count", N->getRawCountNode(),2114                             /* IsUnsigned */ false,2115                             /* ShouldSkipZero */ false);2116 2117  // A lowerBound of constant 0 should not be skipped, since it is different2118  // from an unspecified lower bound (= nullptr).2119  Printer.printMetadataOrInt("lowerBound", N->getRawLowerBound(),2120                             /* IsUnsigned */ false,2121                             /* ShouldSkipZero */ false);2122  Printer.printMetadataOrInt("upperBound", N->getRawUpperBound(),2123                             /* IsUnsigned */ false,2124                             /* ShouldSkipZero */ false);2125  Printer.printMetadataOrInt("stride", N->getRawStride(),2126                             /* IsUnsigned */ false,2127                             /* ShouldSkipZero */ false);2128 2129  Out << ")";2130}2131 2132static void writeDIGenericSubrange(raw_ostream &Out, const DIGenericSubrange *N,2133                                   AsmWriterContext &WriterCtx) {2134  Out << "!DIGenericSubrange(";2135  MDFieldPrinter Printer(Out, WriterCtx);2136 2137  auto GetConstant = [&](Metadata *Bound) -> std::optional<int64_t> {2138    auto *BE = dyn_cast_or_null<DIExpression>(Bound);2139    if (!BE)2140      return std::nullopt;2141    if (BE->isConstant() &&2142        DIExpression::SignedOrUnsignedConstant::SignedConstant ==2143            *BE->isConstant()) {2144      return static_cast<int64_t>(BE->getElement(1));2145    }2146    return std::nullopt;2147  };2148 2149  auto *Count = N->getRawCountNode();2150  if (auto ConstantCount = GetConstant(Count))2151    Printer.printInt("count", *ConstantCount,2152                     /* ShouldSkipZero */ false);2153  else2154    Printer.printMetadata("count", Count, /*ShouldSkipNull */ true);2155 2156  auto *LBound = N->getRawLowerBound();2157  if (auto ConstantLBound = GetConstant(LBound))2158    Printer.printInt("lowerBound", *ConstantLBound,2159                     /* ShouldSkipZero */ false);2160  else2161    Printer.printMetadata("lowerBound", LBound, /*ShouldSkipNull */ true);2162 2163  auto *UBound = N->getRawUpperBound();2164  if (auto ConstantUBound = GetConstant(UBound))2165    Printer.printInt("upperBound", *ConstantUBound,2166                     /* ShouldSkipZero */ false);2167  else2168    Printer.printMetadata("upperBound", UBound, /*ShouldSkipNull */ true);2169 2170  auto *Stride = N->getRawStride();2171  if (auto ConstantStride = GetConstant(Stride))2172    Printer.printInt("stride", *ConstantStride,2173                     /* ShouldSkipZero */ false);2174  else2175    Printer.printMetadata("stride", Stride, /*ShouldSkipNull */ true);2176 2177  Out << ")";2178}2179 2180static void writeDIEnumerator(raw_ostream &Out, const DIEnumerator *N,2181                              AsmWriterContext &) {2182  Out << "!DIEnumerator(";2183  MDFieldPrinter Printer(Out);2184  Printer.printString("name", N->getName(), /* ShouldSkipEmpty */ false);2185  Printer.printAPInt("value", N->getValue(), N->isUnsigned(),2186                     /*ShouldSkipZero=*/false);2187  if (N->isUnsigned())2188    Printer.printBool("isUnsigned", true);2189  Out << ")";2190}2191 2192static void writeDIBasicType(raw_ostream &Out, const DIBasicType *N,2193                             AsmWriterContext &WriterCtx) {2194  Out << "!DIBasicType(";2195  MDFieldPrinter Printer(Out, WriterCtx);2196  if (N->getTag() != dwarf::DW_TAG_base_type)2197    Printer.printTag(N);2198  Printer.printString("name", N->getName());2199  Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);2200  Printer.printInt("align", N->getAlignInBits());2201  Printer.printInt("dataSize", N->getDataSizeInBits());2202  Printer.printDwarfEnum("encoding", N->getEncoding(),2203                         dwarf::AttributeEncodingString);2204  Printer.printInt("num_extra_inhabitants", N->getNumExtraInhabitants());2205  Printer.printDIFlags("flags", N->getFlags());2206  Out << ")";2207}2208 2209static void writeDIFixedPointType(raw_ostream &Out, const DIFixedPointType *N,2210                                  AsmWriterContext &WriterCtx) {2211  Out << "!DIFixedPointType(";2212  MDFieldPrinter Printer(Out, WriterCtx);2213  if (N->getTag() != dwarf::DW_TAG_base_type)2214    Printer.printTag(N);2215  Printer.printString("name", N->getName());2216  Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);2217  Printer.printInt("align", N->getAlignInBits());2218  Printer.printDwarfEnum("encoding", N->getEncoding(),2219                         dwarf::AttributeEncodingString);2220  Printer.printDIFlags("flags", N->getFlags());2221  Printer.printFixedPointKind("kind", N->getKind());2222  if (N->isRational()) {2223    bool IsUnsigned = !N->isSigned();2224    Printer.printAPInt("numerator", N->getNumerator(), IsUnsigned, false);2225    Printer.printAPInt("denominator", N->getDenominator(), IsUnsigned, false);2226  } else {2227    Printer.printInt("factor", N->getFactor());2228  }2229  Out << ")";2230}2231 2232static void writeDIStringType(raw_ostream &Out, const DIStringType *N,2233                              AsmWriterContext &WriterCtx) {2234  Out << "!DIStringType(";2235  MDFieldPrinter Printer(Out, WriterCtx);2236  if (N->getTag() != dwarf::DW_TAG_string_type)2237    Printer.printTag(N);2238  Printer.printString("name", N->getName());2239  Printer.printMetadata("stringLength", N->getRawStringLength());2240  Printer.printMetadata("stringLengthExpression", N->getRawStringLengthExp());2241  Printer.printMetadata("stringLocationExpression",2242                        N->getRawStringLocationExp());2243  Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);2244  Printer.printInt("align", N->getAlignInBits());2245  Printer.printDwarfEnum("encoding", N->getEncoding(),2246                         dwarf::AttributeEncodingString);2247  Out << ")";2248}2249 2250static void writeDIDerivedType(raw_ostream &Out, const DIDerivedType *N,2251                               AsmWriterContext &WriterCtx) {2252  Out << "!DIDerivedType(";2253  MDFieldPrinter Printer(Out, WriterCtx);2254  Printer.printTag(N);2255  Printer.printString("name", N->getName());2256  Printer.printMetadata("scope", N->getRawScope());2257  Printer.printMetadata("file", N->getRawFile());2258  Printer.printInt("line", N->getLine());2259  Printer.printMetadata("baseType", N->getRawBaseType(),2260                        /* ShouldSkipNull */ false);2261  Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);2262  Printer.printInt("align", N->getAlignInBits());2263  Printer.printMetadataOrInt("offset", N->getRawOffsetInBits(), true);2264  Printer.printDIFlags("flags", N->getFlags());2265  Printer.printMetadata("extraData", N->getRawExtraData());2266  if (const auto &DWARFAddressSpace = N->getDWARFAddressSpace())2267    Printer.printInt("dwarfAddressSpace", *DWARFAddressSpace,2268                     /* ShouldSkipZero */ false);2269  Printer.printMetadata("annotations", N->getRawAnnotations());2270  if (auto PtrAuthData = N->getPtrAuthData()) {2271    Printer.printInt("ptrAuthKey", PtrAuthData->key());2272    Printer.printBool("ptrAuthIsAddressDiscriminated",2273                      PtrAuthData->isAddressDiscriminated());2274    Printer.printInt("ptrAuthExtraDiscriminator",2275                     PtrAuthData->extraDiscriminator());2276    Printer.printBool("ptrAuthIsaPointer", PtrAuthData->isaPointer());2277    Printer.printBool("ptrAuthAuthenticatesNullValues",2278                      PtrAuthData->authenticatesNullValues());2279  }2280  Out << ")";2281}2282 2283static void writeDISubrangeType(raw_ostream &Out, const DISubrangeType *N,2284                                AsmWriterContext &WriterCtx) {2285  Out << "!DISubrangeType(";2286  MDFieldPrinter Printer(Out, WriterCtx);2287  Printer.printString("name", N->getName());2288  Printer.printMetadata("scope", N->getRawScope());2289  Printer.printMetadata("file", N->getRawFile());2290  Printer.printInt("line", N->getLine());2291  Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);2292  Printer.printInt("align", N->getAlignInBits());2293  Printer.printDIFlags("flags", N->getFlags());2294  Printer.printMetadata("baseType", N->getRawBaseType(),2295                        /* ShouldSkipNull */ false);2296  Printer.printMetadata("lowerBound", N->getRawLowerBound());2297  Printer.printMetadata("upperBound", N->getRawUpperBound());2298  Printer.printMetadata("stride", N->getRawStride());2299  Printer.printMetadata("bias", N->getRawBias());2300  Out << ")";2301}2302 2303static void writeDICompositeType(raw_ostream &Out, const DICompositeType *N,2304                                 AsmWriterContext &WriterCtx) {2305  Out << "!DICompositeType(";2306  MDFieldPrinter Printer(Out, WriterCtx);2307  Printer.printTag(N);2308  Printer.printString("name", N->getName());2309  Printer.printMetadata("scope", N->getRawScope());2310  Printer.printMetadata("file", N->getRawFile());2311  Printer.printInt("line", N->getLine());2312  Printer.printMetadata("baseType", N->getRawBaseType());2313  Printer.printMetadataOrInt("size", N->getRawSizeInBits(), true);2314  Printer.printInt("align", N->getAlignInBits());2315  Printer.printMetadataOrInt("offset", N->getRawOffsetInBits(), true);2316  Printer.printInt("num_extra_inhabitants", N->getNumExtraInhabitants());2317  Printer.printDIFlags("flags", N->getFlags());2318  Printer.printMetadata("elements", N->getRawElements());2319  Printer.printDwarfEnum("runtimeLang", N->getRuntimeLang(),2320                         dwarf::LanguageString);2321  Printer.printMetadata("vtableHolder", N->getRawVTableHolder());2322  Printer.printMetadata("templateParams", N->getRawTemplateParams());2323  Printer.printString("identifier", N->getIdentifier());2324  Printer.printMetadata("discriminator", N->getRawDiscriminator());2325  Printer.printMetadata("dataLocation", N->getRawDataLocation());2326  Printer.printMetadata("associated", N->getRawAssociated());2327  Printer.printMetadata("allocated", N->getRawAllocated());2328  if (auto *RankConst = N->getRankConst())2329    Printer.printInt("rank", RankConst->getSExtValue(),2330                     /* ShouldSkipZero */ false);2331  else2332    Printer.printMetadata("rank", N->getRawRank(), /*ShouldSkipNull */ true);2333  Printer.printMetadata("annotations", N->getRawAnnotations());2334  if (auto *Specification = N->getRawSpecification())2335    Printer.printMetadata("specification", Specification);2336 2337  if (auto EnumKind = N->getEnumKind())2338    Printer.printDwarfEnum("enumKind", *EnumKind, dwarf::EnumKindString,2339                           /*ShouldSkipZero=*/false);2340 2341  Printer.printMetadata("bitStride", N->getRawBitStride());2342  Out << ")";2343}2344 2345static void writeDISubroutineType(raw_ostream &Out, const DISubroutineType *N,2346                                  AsmWriterContext &WriterCtx) {2347  Out << "!DISubroutineType(";2348  MDFieldPrinter Printer(Out, WriterCtx);2349  Printer.printDIFlags("flags", N->getFlags());2350  Printer.printDwarfEnum("cc", N->getCC(), dwarf::ConventionString);2351  Printer.printMetadata("types", N->getRawTypeArray(),2352                        /* ShouldSkipNull */ false);2353  Out << ")";2354}2355 2356static void writeDIFile(raw_ostream &Out, const DIFile *N, AsmWriterContext &) {2357  Out << "!DIFile(";2358  MDFieldPrinter Printer(Out);2359  Printer.printString("filename", N->getFilename(),2360                      /* ShouldSkipEmpty */ false);2361  Printer.printString("directory", N->getDirectory(),2362                      /* ShouldSkipEmpty */ false);2363  // Print all values for checksum together, or not at all.2364  if (N->getChecksum())2365    Printer.printChecksum(*N->getChecksum());2366  if (N->getSource())2367    Printer.printString("source", *N->getSource(),2368                        /* ShouldSkipEmpty */ false);2369  Out << ")";2370}2371 2372static void writeDICompileUnit(raw_ostream &Out, const DICompileUnit *N,2373                               AsmWriterContext &WriterCtx) {2374  Out << "!DICompileUnit(";2375  MDFieldPrinter Printer(Out, WriterCtx);2376 2377  DISourceLanguageName Lang = N->getSourceLanguage();2378 2379  if (Lang.hasVersionedName()) {2380    Printer.printDwarfEnum(2381        "sourceLanguageName",2382        static_cast<llvm::dwarf::SourceLanguageName>(Lang.getName()),2383        dwarf::SourceLanguageNameString,2384        /* ShouldSkipZero */ false);2385 2386    Printer.printInt("sourceLanguageVersion", Lang.getVersion(),2387                     /*ShouldSkipZero=*/true);2388  } else {2389    Printer.printDwarfEnum("language", Lang.getName(), dwarf::LanguageString,2390                           /* ShouldSkipZero */ false);2391  }2392 2393  Printer.printMetadata("file", N->getRawFile(), /* ShouldSkipNull */ false);2394  Printer.printString("producer", N->getProducer());2395  Printer.printBool("isOptimized", N->isOptimized());2396  Printer.printString("flags", N->getFlags());2397  Printer.printInt("runtimeVersion", N->getRuntimeVersion(),2398                   /* ShouldSkipZero */ false);2399  Printer.printString("splitDebugFilename", N->getSplitDebugFilename());2400  Printer.printEmissionKind("emissionKind", N->getEmissionKind());2401  Printer.printMetadata("enums", N->getRawEnumTypes());2402  Printer.printMetadata("retainedTypes", N->getRawRetainedTypes());2403  Printer.printMetadata("globals", N->getRawGlobalVariables());2404  Printer.printMetadata("imports", N->getRawImportedEntities());2405  Printer.printMetadata("macros", N->getRawMacros());2406  Printer.printInt("dwoId", N->getDWOId());2407  Printer.printBool("splitDebugInlining", N->getSplitDebugInlining(), true);2408  Printer.printBool("debugInfoForProfiling", N->getDebugInfoForProfiling(),2409                    false);2410  Printer.printNameTableKind("nameTableKind", N->getNameTableKind());2411  Printer.printBool("rangesBaseAddress", N->getRangesBaseAddress(), false);2412  Printer.printString("sysroot", N->getSysRoot());2413  Printer.printString("sdk", N->getSDK());2414  Out << ")";2415}2416 2417static void writeDISubprogram(raw_ostream &Out, const DISubprogram *N,2418                              AsmWriterContext &WriterCtx) {2419  Out << "!DISubprogram(";2420  MDFieldPrinter Printer(Out, WriterCtx);2421  Printer.printString("name", N->getName());2422  Printer.printString("linkageName", N->getLinkageName());2423  Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);2424  Printer.printMetadata("file", N->getRawFile());2425  Printer.printInt("line", N->getLine());2426  Printer.printMetadata("type", N->getRawType());2427  Printer.printInt("scopeLine", N->getScopeLine());2428  Printer.printMetadata("containingType", N->getRawContainingType());2429  if (N->getVirtuality() != dwarf::DW_VIRTUALITY_none ||2430      N->getVirtualIndex() != 0)2431    Printer.printInt("virtualIndex", N->getVirtualIndex(), false);2432  Printer.printInt("thisAdjustment", N->getThisAdjustment());2433  Printer.printDIFlags("flags", N->getFlags());2434  Printer.printDISPFlags("spFlags", N->getSPFlags());2435  Printer.printMetadata("unit", N->getRawUnit());2436  Printer.printMetadata("templateParams", N->getRawTemplateParams());2437  Printer.printMetadata("declaration", N->getRawDeclaration());2438  Printer.printMetadata("retainedNodes", N->getRawRetainedNodes());2439  Printer.printMetadata("thrownTypes", N->getRawThrownTypes());2440  Printer.printMetadata("annotations", N->getRawAnnotations());2441  Printer.printString("targetFuncName", N->getTargetFuncName());2442  Printer.printBool("keyInstructions", N->getKeyInstructionsEnabled(), false);2443  Out << ")";2444}2445 2446static void writeDILexicalBlock(raw_ostream &Out, const DILexicalBlock *N,2447                                AsmWriterContext &WriterCtx) {2448  Out << "!DILexicalBlock(";2449  MDFieldPrinter Printer(Out, WriterCtx);2450  Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);2451  Printer.printMetadata("file", N->getRawFile());2452  Printer.printInt("line", N->getLine());2453  Printer.printInt("column", N->getColumn());2454  Out << ")";2455}2456 2457static void writeDILexicalBlockFile(raw_ostream &Out,2458                                    const DILexicalBlockFile *N,2459                                    AsmWriterContext &WriterCtx) {2460  Out << "!DILexicalBlockFile(";2461  MDFieldPrinter Printer(Out, WriterCtx);2462  Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);2463  Printer.printMetadata("file", N->getRawFile());2464  Printer.printInt("discriminator", N->getDiscriminator(),2465                   /* ShouldSkipZero */ false);2466  Out << ")";2467}2468 2469static void writeDINamespace(raw_ostream &Out, const DINamespace *N,2470                             AsmWriterContext &WriterCtx) {2471  Out << "!DINamespace(";2472  MDFieldPrinter Printer(Out, WriterCtx);2473  Printer.printString("name", N->getName());2474  Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);2475  Printer.printBool("exportSymbols", N->getExportSymbols(), false);2476  Out << ")";2477}2478 2479static void writeDICommonBlock(raw_ostream &Out, const DICommonBlock *N,2480                               AsmWriterContext &WriterCtx) {2481  Out << "!DICommonBlock(";2482  MDFieldPrinter Printer(Out, WriterCtx);2483  Printer.printMetadata("scope", N->getRawScope(), false);2484  Printer.printMetadata("declaration", N->getRawDecl(), false);2485  Printer.printString("name", N->getName());2486  Printer.printMetadata("file", N->getRawFile());2487  Printer.printInt("line", N->getLineNo());2488  Out << ")";2489}2490 2491static void writeDIMacro(raw_ostream &Out, const DIMacro *N,2492                         AsmWriterContext &WriterCtx) {2493  Out << "!DIMacro(";2494  MDFieldPrinter Printer(Out, WriterCtx);2495  Printer.printMacinfoType(N);2496  Printer.printInt("line", N->getLine());2497  Printer.printString("name", N->getName());2498  Printer.printString("value", N->getValue());2499  Out << ")";2500}2501 2502static void writeDIMacroFile(raw_ostream &Out, const DIMacroFile *N,2503                             AsmWriterContext &WriterCtx) {2504  Out << "!DIMacroFile(";2505  MDFieldPrinter Printer(Out, WriterCtx);2506  Printer.printInt("line", N->getLine());2507  Printer.printMetadata("file", N->getRawFile(), /* ShouldSkipNull */ false);2508  Printer.printMetadata("nodes", N->getRawElements());2509  Out << ")";2510}2511 2512static void writeDIModule(raw_ostream &Out, const DIModule *N,2513                          AsmWriterContext &WriterCtx) {2514  Out << "!DIModule(";2515  MDFieldPrinter Printer(Out, WriterCtx);2516  Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);2517  Printer.printString("name", N->getName());2518  Printer.printString("configMacros", N->getConfigurationMacros());2519  Printer.printString("includePath", N->getIncludePath());2520  Printer.printString("apinotes", N->getAPINotesFile());2521  Printer.printMetadata("file", N->getRawFile());2522  Printer.printInt("line", N->getLineNo());2523  Printer.printBool("isDecl", N->getIsDecl(), /* Default */ false);2524  Out << ")";2525}2526 2527static void writeDITemplateTypeParameter(raw_ostream &Out,2528                                         const DITemplateTypeParameter *N,2529                                         AsmWriterContext &WriterCtx) {2530  Out << "!DITemplateTypeParameter(";2531  MDFieldPrinter Printer(Out, WriterCtx);2532  Printer.printString("name", N->getName());2533  Printer.printMetadata("type", N->getRawType(), /* ShouldSkipNull */ false);2534  Printer.printBool("defaulted", N->isDefault(), /* Default= */ false);2535  Out << ")";2536}2537 2538static void writeDITemplateValueParameter(raw_ostream &Out,2539                                          const DITemplateValueParameter *N,2540                                          AsmWriterContext &WriterCtx) {2541  Out << "!DITemplateValueParameter(";2542  MDFieldPrinter Printer(Out, WriterCtx);2543  if (N->getTag() != dwarf::DW_TAG_template_value_parameter)2544    Printer.printTag(N);2545  Printer.printString("name", N->getName());2546  Printer.printMetadata("type", N->getRawType());2547  Printer.printBool("defaulted", N->isDefault(), /* Default= */ false);2548  Printer.printMetadata("value", N->getValue(), /* ShouldSkipNull */ false);2549  Out << ")";2550}2551 2552static void writeDIGlobalVariable(raw_ostream &Out, const DIGlobalVariable *N,2553                                  AsmWriterContext &WriterCtx) {2554  Out << "!DIGlobalVariable(";2555  MDFieldPrinter Printer(Out, WriterCtx);2556  Printer.printString("name", N->getName());2557  Printer.printString("linkageName", N->getLinkageName());2558  Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);2559  Printer.printMetadata("file", N->getRawFile());2560  Printer.printInt("line", N->getLine());2561  Printer.printMetadata("type", N->getRawType());2562  Printer.printBool("isLocal", N->isLocalToUnit());2563  Printer.printBool("isDefinition", N->isDefinition());2564  Printer.printMetadata("declaration", N->getRawStaticDataMemberDeclaration());2565  Printer.printMetadata("templateParams", N->getRawTemplateParams());2566  Printer.printInt("align", N->getAlignInBits());2567  Printer.printMetadata("annotations", N->getRawAnnotations());2568  Out << ")";2569}2570 2571static void writeDILocalVariable(raw_ostream &Out, const DILocalVariable *N,2572                                 AsmWriterContext &WriterCtx) {2573  Out << "!DILocalVariable(";2574  MDFieldPrinter Printer(Out, WriterCtx);2575  Printer.printString("name", N->getName());2576  Printer.printInt("arg", N->getArg());2577  Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);2578  Printer.printMetadata("file", N->getRawFile());2579  Printer.printInt("line", N->getLine());2580  Printer.printMetadata("type", N->getRawType());2581  Printer.printDIFlags("flags", N->getFlags());2582  Printer.printInt("align", N->getAlignInBits());2583  Printer.printMetadata("annotations", N->getRawAnnotations());2584  Out << ")";2585}2586 2587static void writeDILabel(raw_ostream &Out, const DILabel *N,2588                         AsmWriterContext &WriterCtx) {2589  Out << "!DILabel(";2590  MDFieldPrinter Printer(Out, WriterCtx);2591  Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);2592  Printer.printString("name", N->getName());2593  Printer.printMetadata("file", N->getRawFile());2594  Printer.printInt("line", N->getLine());2595  Printer.printInt("column", N->getColumn());2596  Printer.printBool("isArtificial", N->isArtificial(), false);2597  if (N->getCoroSuspendIdx())2598    Printer.printInt("coroSuspendIdx", *N->getCoroSuspendIdx(),2599                     /* ShouldSkipZero */ false);2600  Out << ")";2601}2602 2603static void writeDIExpression(raw_ostream &Out, const DIExpression *N,2604                              AsmWriterContext &WriterCtx) {2605  Out << "!DIExpression(";2606  ListSeparator FS;2607  if (N->isValid()) {2608    for (const DIExpression::ExprOperand &Op : N->expr_ops()) {2609      auto OpStr = dwarf::OperationEncodingString(Op.getOp());2610      assert(!OpStr.empty() && "Expected valid opcode");2611 2612      Out << FS << OpStr;2613      if (Op.getOp() == dwarf::DW_OP_LLVM_convert) {2614        Out << FS << Op.getArg(0);2615        Out << FS << dwarf::AttributeEncodingString(Op.getArg(1));2616      } else {2617        for (unsigned A = 0, AE = Op.getNumArgs(); A != AE; ++A)2618          Out << FS << Op.getArg(A);2619      }2620    }2621  } else {2622    for (const auto &I : N->getElements())2623      Out << FS << I;2624  }2625  Out << ")";2626}2627 2628static void writeDIArgList(raw_ostream &Out, const DIArgList *N,2629                           AsmWriterContext &WriterCtx,2630                           bool FromValue = false) {2631  assert(FromValue &&2632         "Unexpected DIArgList metadata outside of value argument");2633  Out << "!DIArgList(";2634  ListSeparator FS;2635  MDFieldPrinter Printer(Out, WriterCtx);2636  for (const Metadata *Arg : N->getArgs()) {2637    Out << FS;2638    writeAsOperandInternal(Out, Arg, WriterCtx, true);2639  }2640  Out << ")";2641}2642 2643static void writeDIGlobalVariableExpression(raw_ostream &Out,2644                                            const DIGlobalVariableExpression *N,2645                                            AsmWriterContext &WriterCtx) {2646  Out << "!DIGlobalVariableExpression(";2647  MDFieldPrinter Printer(Out, WriterCtx);2648  Printer.printMetadata("var", N->getVariable());2649  Printer.printMetadata("expr", N->getExpression());2650  Out << ")";2651}2652 2653static void writeDIObjCProperty(raw_ostream &Out, const DIObjCProperty *N,2654                                AsmWriterContext &WriterCtx) {2655  Out << "!DIObjCProperty(";2656  MDFieldPrinter Printer(Out, WriterCtx);2657  Printer.printString("name", N->getName());2658  Printer.printMetadata("file", N->getRawFile());2659  Printer.printInt("line", N->getLine());2660  Printer.printString("setter", N->getSetterName());2661  Printer.printString("getter", N->getGetterName());2662  Printer.printInt("attributes", N->getAttributes());2663  Printer.printMetadata("type", N->getRawType());2664  Out << ")";2665}2666 2667static void writeDIImportedEntity(raw_ostream &Out, const DIImportedEntity *N,2668                                  AsmWriterContext &WriterCtx) {2669  Out << "!DIImportedEntity(";2670  MDFieldPrinter Printer(Out, WriterCtx);2671  Printer.printTag(N);2672  Printer.printString("name", N->getName());2673  Printer.printMetadata("scope", N->getRawScope(), /* ShouldSkipNull */ false);2674  Printer.printMetadata("entity", N->getRawEntity());2675  Printer.printMetadata("file", N->getRawFile());2676  Printer.printInt("line", N->getLine());2677  Printer.printMetadata("elements", N->getRawElements());2678  Out << ")";2679}2680 2681static void writeMDNodeBodyInternal(raw_ostream &Out, const MDNode *Node,2682                                    AsmWriterContext &Ctx) {2683  if (Node->isDistinct())2684    Out << "distinct ";2685  else if (Node->isTemporary())2686    Out << "<temporary!> "; // Handle broken code.2687 2688  switch (Node->getMetadataID()) {2689  default:2690    llvm_unreachable("Expected uniquable MDNode");2691#define HANDLE_MDNODE_LEAF(CLASS)                                              \2692  case Metadata::CLASS##Kind:                                                  \2693    write##CLASS(Out, cast<CLASS>(Node), Ctx);                                 \2694    break;2695#include "llvm/IR/Metadata.def"2696  }2697}2698 2699// Full implementation of printing a Value as an operand with support for2700// TypePrinting, etc.2701static void writeAsOperandInternal(raw_ostream &Out, const Value *V,2702                                   AsmWriterContext &WriterCtx,2703                                   bool PrintType) {2704  if (PrintType) {2705    WriterCtx.TypePrinter->print(V->getType(), Out);2706    Out << ' ';2707  }2708 2709  if (V->hasName()) {2710    printLLVMName(Out, V);2711    return;2712  }2713 2714  const auto *CV = dyn_cast<Constant>(V);2715  if (CV && !isa<GlobalValue>(CV)) {2716    assert(WriterCtx.TypePrinter && "Constants require TypePrinting!");2717    writeConstantInternal(Out, CV, WriterCtx);2718    return;2719  }2720 2721  if (const auto *IA = dyn_cast<InlineAsm>(V)) {2722    Out << "asm ";2723    if (IA->hasSideEffects())2724      Out << "sideeffect ";2725    if (IA->isAlignStack())2726      Out << "alignstack ";2727    // We don't emit the AD_ATT dialect as it's the assumed default.2728    if (IA->getDialect() == InlineAsm::AD_Intel)2729      Out << "inteldialect ";2730    if (IA->canThrow())2731      Out << "unwind ";2732    Out << '"';2733    printEscapedString(IA->getAsmString(), Out);2734    Out << "\", \"";2735    printEscapedString(IA->getConstraintString(), Out);2736    Out << '"';2737    return;2738  }2739 2740  if (auto *MD = dyn_cast<MetadataAsValue>(V)) {2741    writeAsOperandInternal(Out, MD->getMetadata(), WriterCtx,2742                           /* FromValue */ true);2743    return;2744  }2745 2746  char Prefix = '%';2747  int Slot;2748  auto *Machine = WriterCtx.Machine;2749  // If we have a SlotTracker, use it.2750  if (Machine) {2751    if (const auto *GV = dyn_cast<GlobalValue>(V)) {2752      Slot = Machine->getGlobalSlot(GV);2753      Prefix = '@';2754    } else {2755      Slot = Machine->getLocalSlot(V);2756 2757      // If the local value didn't succeed, then we may be referring to a value2758      // from a different function.  Translate it, as this can happen when using2759      // address of blocks.2760      if (Slot == -1)2761        if ((Machine = createSlotTracker(V))) {2762          Slot = Machine->getLocalSlot(V);2763          delete Machine;2764        }2765    }2766  } else if ((Machine = createSlotTracker(V))) {2767    // Otherwise, create one to get the # and then destroy it.2768    if (const auto *GV = dyn_cast<GlobalValue>(V)) {2769      Slot = Machine->getGlobalSlot(GV);2770      Prefix = '@';2771    } else {2772      Slot = Machine->getLocalSlot(V);2773    }2774    delete Machine;2775    Machine = nullptr;2776  } else {2777    Slot = -1;2778  }2779 2780  if (Slot != -1)2781    Out << Prefix << Slot;2782  else2783    Out << "<badref>";2784}2785 2786static void writeAsOperandInternal(raw_ostream &Out, const Metadata *MD,2787                                   AsmWriterContext &WriterCtx,2788                                   bool FromValue) {2789  // Write DIExpressions and DIArgLists inline when used as a value. Improves2790  // readability of debug info intrinsics.2791  if (const auto *Expr = dyn_cast<DIExpression>(MD)) {2792    writeDIExpression(Out, Expr, WriterCtx);2793    return;2794  }2795  if (const auto *ArgList = dyn_cast<DIArgList>(MD)) {2796    writeDIArgList(Out, ArgList, WriterCtx, FromValue);2797    return;2798  }2799 2800  if (const auto *N = dyn_cast<MDNode>(MD)) {2801    std::unique_ptr<SlotTracker> MachineStorage;2802    SaveAndRestore SARMachine(WriterCtx.Machine);2803    if (!WriterCtx.Machine) {2804      MachineStorage = std::make_unique<SlotTracker>(WriterCtx.Context);2805      WriterCtx.Machine = MachineStorage.get();2806    }2807    int Slot = WriterCtx.Machine->getMetadataSlot(N);2808    if (Slot == -1) {2809      if (const auto *Loc = dyn_cast<DILocation>(N)) {2810        writeDILocation(Out, Loc, WriterCtx);2811        return;2812      }2813      // Give the pointer value instead of "badref", since this comes up all2814      // the time when debugging.2815      Out << "<" << N << ">";2816    } else2817      Out << '!' << Slot;2818    return;2819  }2820 2821  if (const auto *MDS = dyn_cast<MDString>(MD)) {2822    Out << "!\"";2823    printEscapedString(MDS->getString(), Out);2824    Out << '"';2825    return;2826  }2827 2828  auto *V = cast<ValueAsMetadata>(MD);2829  assert(WriterCtx.TypePrinter && "TypePrinter required for metadata values");2830  assert((FromValue || !isa<LocalAsMetadata>(V)) &&2831         "Unexpected function-local metadata outside of value argument");2832 2833  writeAsOperandInternal(Out, V->getValue(), WriterCtx, /*PrintType=*/true);2834}2835 2836namespace {2837 2838class AssemblyWriter {2839  formatted_raw_ostream &Out;2840  const Module *TheModule = nullptr;2841  const ModuleSummaryIndex *TheIndex = nullptr;2842  std::unique_ptr<SlotTracker> SlotTrackerStorage;2843  SlotTracker &Machine;2844  TypePrinting TypePrinter;2845  AssemblyAnnotationWriter *AnnotationWriter = nullptr;2846  SetVector<const Comdat *> Comdats;2847  bool IsForDebug;2848  bool ShouldPreserveUseListOrder;2849  UseListOrderMap UseListOrders;2850  SmallVector<StringRef, 8> MDNames;2851  /// Synchronization scope names registered with LLVMContext.2852  SmallVector<StringRef, 8> SSNs;2853  DenseMap<const GlobalValueSummary *, GlobalValue::GUID> SummaryToGUIDMap;2854 2855public:2856  /// Construct an AssemblyWriter with an external SlotTracker2857  AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac, const Module *M,2858                 AssemblyAnnotationWriter *AAW, bool IsForDebug,2859                 bool ShouldPreserveUseListOrder = false);2860 2861  AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,2862                 const ModuleSummaryIndex *Index, bool IsForDebug);2863 2864  AsmWriterContext getContext() {2865    return AsmWriterContext(&TypePrinter, &Machine, TheModule);2866  }2867 2868  void printMDNodeBody(const MDNode *MD);2869  void printNamedMDNode(const NamedMDNode *NMD);2870 2871  void printModule(const Module *M);2872 2873  void writeOperand(const Value *Op, bool PrintType);2874  void writeParamOperand(const Value *Operand, AttributeSet Attrs);2875  void writeOperandBundles(const CallBase *Call);2876  void writeSyncScope(const LLVMContext &Context,2877                      SyncScope::ID SSID);2878  void writeAtomic(const LLVMContext &Context,2879                   AtomicOrdering Ordering,2880                   SyncScope::ID SSID);2881  void writeAtomicCmpXchg(const LLVMContext &Context,2882                          AtomicOrdering SuccessOrdering,2883                          AtomicOrdering FailureOrdering,2884                          SyncScope::ID SSID);2885 2886  void writeAllMDNodes();2887  void writeMDNode(unsigned Slot, const MDNode *Node);2888  void writeAttribute(const Attribute &Attr, bool InAttrGroup = false);2889  void writeAttributeSet(const AttributeSet &AttrSet, bool InAttrGroup = false);2890  void writeAllAttributeGroups();2891 2892  void printTypeIdentities();2893  void printGlobal(const GlobalVariable *GV);2894  void printAlias(const GlobalAlias *GA);2895  void printIFunc(const GlobalIFunc *GI);2896  void printComdat(const Comdat *C);2897  void printFunction(const Function *F);2898  void printArgument(const Argument *FA, AttributeSet Attrs);2899  void printBasicBlock(const BasicBlock *BB);2900  void printInstructionLine(const Instruction &I);2901  void printInstruction(const Instruction &I);2902  void printDbgMarker(const DbgMarker &DPI);2903  void printDbgVariableRecord(const DbgVariableRecord &DVR);2904  void printDbgLabelRecord(const DbgLabelRecord &DLR);2905  void printDbgRecord(const DbgRecord &DR);2906  void printDbgRecordLine(const DbgRecord &DR);2907 2908  void printUseListOrder(const Value *V, ArrayRef<unsigned> Shuffle);2909  void printUseLists(const Function *F);2910 2911  void printModuleSummaryIndex();2912  void printSummaryInfo(unsigned Slot, const ValueInfo &VI);2913  void printSummary(const GlobalValueSummary &Summary);2914  void printAliasSummary(const AliasSummary *AS);2915  void printGlobalVarSummary(const GlobalVarSummary *GS);2916  void printFunctionSummary(const FunctionSummary *FS);2917  void printTypeIdSummary(const TypeIdSummary &TIS);2918  void printTypeIdCompatibleVtableSummary(const TypeIdCompatibleVtableInfo &TI);2919  void printTypeTestResolution(const TypeTestResolution &TTRes);2920  void printArgs(ArrayRef<uint64_t> Args);2921  void printWPDRes(const WholeProgramDevirtResolution &WPDRes);2922  void printTypeIdInfo(const FunctionSummary::TypeIdInfo &TIDInfo);2923  void printVFuncId(const FunctionSummary::VFuncId VFId);2924  void printNonConstVCalls(ArrayRef<FunctionSummary::VFuncId> VCallList,2925                           const char *Tag);2926  void printConstVCalls(ArrayRef<FunctionSummary::ConstVCall> VCallList,2927                        const char *Tag);2928 2929private:2930  /// Print out metadata attachments.2931  void printMetadataAttachments(2932      const SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs,2933      StringRef Separator);2934 2935  // printInfoComment - Print a little comment after the instruction indicating2936  // which slot it occupies.2937  void printInfoComment(const Value &V, bool isMaterializable = false);2938 2939  // printGCRelocateComment - print comment after call to the gc.relocate2940  // intrinsic indicating base and derived pointer names.2941  void printGCRelocateComment(const GCRelocateInst &Relocate);2942};2943 2944} // end anonymous namespace2945 2946AssemblyWriter::AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,2947                               const Module *M, AssemblyAnnotationWriter *AAW,2948                               bool IsForDebug, bool ShouldPreserveUseListOrder)2949    : Out(o), TheModule(M), Machine(Mac), TypePrinter(M), AnnotationWriter(AAW),2950      IsForDebug(IsForDebug),2951      ShouldPreserveUseListOrder(2952          PreserveAssemblyUseListOrder.getNumOccurrences()2953              ? PreserveAssemblyUseListOrder2954              : ShouldPreserveUseListOrder) {2955  if (!TheModule)2956    return;2957  for (const GlobalObject &GO : TheModule->global_objects())2958    if (const Comdat *C = GO.getComdat())2959      Comdats.insert(C);2960}2961 2962AssemblyWriter::AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,2963                               const ModuleSummaryIndex *Index, bool IsForDebug)2964    : Out(o), TheIndex(Index), Machine(Mac), TypePrinter(/*Module=*/nullptr),2965      IsForDebug(IsForDebug),2966      ShouldPreserveUseListOrder(PreserveAssemblyUseListOrder) {}2967 2968void AssemblyWriter::writeOperand(const Value *Operand, bool PrintType) {2969  if (!Operand) {2970    Out << "<null operand!>";2971    return;2972  }2973  auto WriteCtx = getContext();2974  writeAsOperandInternal(Out, Operand, WriteCtx, PrintType);2975}2976 2977void AssemblyWriter::writeSyncScope(const LLVMContext &Context,2978                                    SyncScope::ID SSID) {2979  switch (SSID) {2980  case SyncScope::System: {2981    break;2982  }2983  default: {2984    if (SSNs.empty())2985      Context.getSyncScopeNames(SSNs);2986 2987    Out << " syncscope(\"";2988    printEscapedString(SSNs[SSID], Out);2989    Out << "\")";2990    break;2991  }2992  }2993}2994 2995void AssemblyWriter::writeAtomic(const LLVMContext &Context,2996                                 AtomicOrdering Ordering,2997                                 SyncScope::ID SSID) {2998  if (Ordering == AtomicOrdering::NotAtomic)2999    return;3000 3001  writeSyncScope(Context, SSID);3002  Out << " " << toIRString(Ordering);3003}3004 3005void AssemblyWriter::writeAtomicCmpXchg(const LLVMContext &Context,3006                                        AtomicOrdering SuccessOrdering,3007                                        AtomicOrdering FailureOrdering,3008                                        SyncScope::ID SSID) {3009  assert(SuccessOrdering != AtomicOrdering::NotAtomic &&3010         FailureOrdering != AtomicOrdering::NotAtomic);3011 3012  writeSyncScope(Context, SSID);3013  Out << " " << toIRString(SuccessOrdering);3014  Out << " " << toIRString(FailureOrdering);3015}3016 3017void AssemblyWriter::writeParamOperand(const Value *Operand,3018                                       AttributeSet Attrs) {3019  if (!Operand) {3020    Out << "<null operand!>";3021    return;3022  }3023 3024  // Print the type3025  TypePrinter.print(Operand->getType(), Out);3026  // Print parameter attributes list3027  if (Attrs.hasAttributes()) {3028    Out << ' ';3029    writeAttributeSet(Attrs);3030  }3031  Out << ' ';3032  // Print the operand3033  auto WriterCtx = getContext();3034  writeAsOperandInternal(Out, Operand, WriterCtx);3035}3036 3037void AssemblyWriter::writeOperandBundles(const CallBase *Call) {3038  if (!Call->hasOperandBundles())3039    return;3040 3041  Out << " [ ";3042 3043  ListSeparator LS;3044  for (unsigned i = 0, e = Call->getNumOperandBundles(); i != e; ++i) {3045    OperandBundleUse BU = Call->getOperandBundleAt(i);3046 3047    Out << LS << '"';3048    printEscapedString(BU.getTagName(), Out);3049    Out << '"';3050 3051    Out << '(';3052 3053    ListSeparator InnerLS;3054    auto WriterCtx = getContext();3055    for (const auto &Input : BU.Inputs) {3056      Out << InnerLS;3057      if (Input == nullptr)3058        Out << "<null operand bundle!>";3059      else3060        writeAsOperandInternal(Out, Input, WriterCtx, /*PrintType=*/true);3061    }3062 3063    Out << ')';3064  }3065 3066  Out << " ]";3067}3068 3069void AssemblyWriter::printModule(const Module *M) {3070  Machine.initializeIfNeeded();3071 3072  if (ShouldPreserveUseListOrder)3073    UseListOrders = predictUseListOrder(M);3074 3075  if (!M->getModuleIdentifier().empty() &&3076      // Don't print the ID if it will start a new line (which would3077      // require a comment char before it).3078      M->getModuleIdentifier().find('\n') == std::string::npos)3079    Out << "; ModuleID = '" << M->getModuleIdentifier() << "'\n";3080 3081  if (!M->getSourceFileName().empty()) {3082    Out << "source_filename = \"";3083    printEscapedString(M->getSourceFileName(), Out);3084    Out << "\"\n";3085  }3086 3087  const std::string &DL = M->getDataLayoutStr();3088  if (!DL.empty())3089    Out << "target datalayout = \"" << DL << "\"\n";3090  if (!M->getTargetTriple().empty())3091    Out << "target triple = \"" << M->getTargetTriple().str() << "\"\n";3092 3093  if (!M->getModuleInlineAsm().empty()) {3094    Out << '\n';3095 3096    // Split the string into lines, to make it easier to read the .ll file.3097    StringRef Asm = M->getModuleInlineAsm();3098    do {3099      StringRef Front;3100      std::tie(Front, Asm) = Asm.split('\n');3101 3102      // We found a newline, print the portion of the asm string from the3103      // last newline up to this newline.3104      Out << "module asm \"";3105      printEscapedString(Front, Out);3106      Out << "\"\n";3107    } while (!Asm.empty());3108  }3109 3110  printTypeIdentities();3111 3112  // Output all comdats.3113  if (!Comdats.empty())3114    Out << '\n';3115  for (const Comdat *C : Comdats) {3116    printComdat(C);3117    if (C != Comdats.back())3118      Out << '\n';3119  }3120 3121  // Output all globals.3122  if (!M->global_empty()) Out << '\n';3123  for (const GlobalVariable &GV : M->globals()) {3124    printGlobal(&GV); Out << '\n';3125  }3126 3127  // Output all aliases.3128  if (!M->alias_empty()) Out << "\n";3129  for (const GlobalAlias &GA : M->aliases())3130    printAlias(&GA);3131 3132  // Output all ifuncs.3133  if (!M->ifunc_empty()) Out << "\n";3134  for (const GlobalIFunc &GI : M->ifuncs())3135    printIFunc(&GI);3136 3137  // Output all of the functions.3138  for (const Function &F : *M) {3139    Out << '\n';3140    printFunction(&F);3141  }3142 3143  // Output global use-lists.3144  printUseLists(nullptr);3145 3146  // Output all attribute groups.3147  if (!Machine.as_empty()) {3148    Out << '\n';3149    writeAllAttributeGroups();3150  }3151 3152  // Output named metadata.3153  if (!M->named_metadata_empty()) Out << '\n';3154 3155  for (const NamedMDNode &Node : M->named_metadata())3156    printNamedMDNode(&Node);3157 3158  // Output metadata.3159  if (!Machine.mdn_empty()) {3160    Out << '\n';3161    writeAllMDNodes();3162  }3163}3164 3165void AssemblyWriter::printModuleSummaryIndex() {3166  assert(TheIndex);3167  int NumSlots = Machine.initializeIndexIfNeeded();3168 3169  Out << "\n";3170 3171  // Print module path entries. To print in order, add paths to a vector3172  // indexed by module slot.3173  std::vector<std::pair<std::string, ModuleHash>> moduleVec;3174  std::string RegularLTOModuleName =3175      ModuleSummaryIndex::getRegularLTOModuleName();3176  moduleVec.resize(TheIndex->modulePaths().size());3177  for (auto &[ModPath, ModHash] : TheIndex->modulePaths())3178    moduleVec[Machine.getModulePathSlot(ModPath)] = std::make_pair(3179        // An empty module path is a special entry for a regular LTO module3180        // created during the thin link.3181        ModPath.empty() ? RegularLTOModuleName : std::string(ModPath), ModHash);3182 3183  unsigned i = 0;3184  for (auto &ModPair : moduleVec) {3185    Out << "^" << i++ << " = module: (";3186    Out << "path: \"";3187    printEscapedString(ModPair.first, Out);3188    Out << "\", hash: (";3189    ListSeparator FS;3190    for (auto Hash : ModPair.second)3191      Out << FS << Hash;3192    Out << "))\n";3193  }3194 3195  // FIXME: Change AliasSummary to hold a ValueInfo instead of summary pointer3196  // for aliasee (then update BitcodeWriter.cpp and remove get/setAliaseeGUID).3197  for (auto &GlobalList : *TheIndex) {3198    auto GUID = GlobalList.first;3199    for (auto &Summary : GlobalList.second.getSummaryList())3200      SummaryToGUIDMap[Summary.get()] = GUID;3201  }3202 3203  // Print the global value summary entries.3204  for (auto &GlobalList : *TheIndex) {3205    auto GUID = GlobalList.first;3206    auto VI = TheIndex->getValueInfo(GlobalList);3207    printSummaryInfo(Machine.getGUIDSlot(GUID), VI);3208  }3209 3210  // Print the TypeIdMap entries.3211  for (const auto &TID : TheIndex->typeIds()) {3212    Out << "^" << Machine.getTypeIdSlot(TID.second.first)3213        << " = typeid: (name: \"" << TID.second.first << "\"";3214    printTypeIdSummary(TID.second.second);3215    Out << ") ; guid = " << TID.first << "\n";3216  }3217 3218  // Print the TypeIdCompatibleVtableMap entries.3219  for (auto &TId : TheIndex->typeIdCompatibleVtableMap()) {3220    auto GUID = GlobalValue::getGUIDAssumingExternalLinkage(TId.first);3221    Out << "^" << Machine.getTypeIdCompatibleVtableSlot(TId.first)3222        << " = typeidCompatibleVTable: (name: \"" << TId.first << "\"";3223    printTypeIdCompatibleVtableSummary(TId.second);3224    Out << ") ; guid = " << GUID << "\n";3225  }3226 3227  // Don't emit flags when it's not really needed (value is zero by default).3228  if (TheIndex->getFlags()) {3229    Out << "^" << NumSlots << " = flags: " << TheIndex->getFlags() << "\n";3230    ++NumSlots;3231  }3232 3233  Out << "^" << NumSlots << " = blockcount: " << TheIndex->getBlockCount()3234      << "\n";3235}3236 3237static const char *3238getWholeProgDevirtResKindName(WholeProgramDevirtResolution::Kind K) {3239  switch (K) {3240  case WholeProgramDevirtResolution::Indir:3241    return "indir";3242  case WholeProgramDevirtResolution::SingleImpl:3243    return "singleImpl";3244  case WholeProgramDevirtResolution::BranchFunnel:3245    return "branchFunnel";3246  }3247  llvm_unreachable("invalid WholeProgramDevirtResolution kind");3248}3249 3250static const char *getWholeProgDevirtResByArgKindName(3251    WholeProgramDevirtResolution::ByArg::Kind K) {3252  switch (K) {3253  case WholeProgramDevirtResolution::ByArg::Indir:3254    return "indir";3255  case WholeProgramDevirtResolution::ByArg::UniformRetVal:3256    return "uniformRetVal";3257  case WholeProgramDevirtResolution::ByArg::UniqueRetVal:3258    return "uniqueRetVal";3259  case WholeProgramDevirtResolution::ByArg::VirtualConstProp:3260    return "virtualConstProp";3261  }3262  llvm_unreachable("invalid WholeProgramDevirtResolution::ByArg kind");3263}3264 3265static const char *getTTResKindName(TypeTestResolution::Kind K) {3266  switch (K) {3267  case TypeTestResolution::Unknown:3268    return "unknown";3269  case TypeTestResolution::Unsat:3270    return "unsat";3271  case TypeTestResolution::ByteArray:3272    return "byteArray";3273  case TypeTestResolution::Inline:3274    return "inline";3275  case TypeTestResolution::Single:3276    return "single";3277  case TypeTestResolution::AllOnes:3278    return "allOnes";3279  }3280  llvm_unreachable("invalid TypeTestResolution kind");3281}3282 3283void AssemblyWriter::printTypeTestResolution(const TypeTestResolution &TTRes) {3284  Out << "typeTestRes: (kind: " << getTTResKindName(TTRes.TheKind)3285      << ", sizeM1BitWidth: " << TTRes.SizeM1BitWidth;3286 3287  // The following fields are only used if the target does not support the use3288  // of absolute symbols to store constants. Print only if non-zero.3289  if (TTRes.AlignLog2)3290    Out << ", alignLog2: " << TTRes.AlignLog2;3291  if (TTRes.SizeM1)3292    Out << ", sizeM1: " << TTRes.SizeM1;3293  if (TTRes.BitMask)3294    // BitMask is uint8_t which causes it to print the corresponding char.3295    Out << ", bitMask: " << (unsigned)TTRes.BitMask;3296  if (TTRes.InlineBits)3297    Out << ", inlineBits: " << TTRes.InlineBits;3298 3299  Out << ")";3300}3301 3302void AssemblyWriter::printTypeIdSummary(const TypeIdSummary &TIS) {3303  Out << ", summary: (";3304  printTypeTestResolution(TIS.TTRes);3305  if (!TIS.WPDRes.empty()) {3306    Out << ", wpdResolutions: (";3307    ListSeparator FS;3308    for (auto &WPDRes : TIS.WPDRes) {3309      Out << FS;3310      Out << "(offset: " << WPDRes.first << ", ";3311      printWPDRes(WPDRes.second);3312      Out << ")";3313    }3314    Out << ")";3315  }3316  Out << ")";3317}3318 3319void AssemblyWriter::printTypeIdCompatibleVtableSummary(3320    const TypeIdCompatibleVtableInfo &TI) {3321  Out << ", summary: (";3322  ListSeparator FS;3323  for (auto &P : TI) {3324    Out << FS;3325    Out << "(offset: " << P.AddressPointOffset << ", ";3326    Out << "^" << Machine.getGUIDSlot(P.VTableVI.getGUID());3327    Out << ")";3328  }3329  Out << ")";3330}3331 3332void AssemblyWriter::printArgs(ArrayRef<uint64_t> Args) {3333  Out << "args: (" << llvm::interleaved(Args) << ')';3334}3335 3336void AssemblyWriter::printWPDRes(const WholeProgramDevirtResolution &WPDRes) {3337  Out << "wpdRes: (kind: ";3338  Out << getWholeProgDevirtResKindName(WPDRes.TheKind);3339 3340  if (WPDRes.TheKind == WholeProgramDevirtResolution::SingleImpl)3341    Out << ", singleImplName: \"" << WPDRes.SingleImplName << "\"";3342 3343  if (!WPDRes.ResByArg.empty()) {3344    Out << ", resByArg: (";3345    ListSeparator FS;3346    for (auto &ResByArg : WPDRes.ResByArg) {3347      Out << FS;3348      printArgs(ResByArg.first);3349      Out << ", byArg: (kind: ";3350      Out << getWholeProgDevirtResByArgKindName(ResByArg.second.TheKind);3351      if (ResByArg.second.TheKind ==3352              WholeProgramDevirtResolution::ByArg::UniformRetVal ||3353          ResByArg.second.TheKind ==3354              WholeProgramDevirtResolution::ByArg::UniqueRetVal)3355        Out << ", info: " << ResByArg.second.Info;3356 3357      // The following fields are only used if the target does not support the3358      // use of absolute symbols to store constants. Print only if non-zero.3359      if (ResByArg.second.Byte || ResByArg.second.Bit)3360        Out << ", byte: " << ResByArg.second.Byte3361            << ", bit: " << ResByArg.second.Bit;3362 3363      Out << ")";3364    }3365    Out << ")";3366  }3367  Out << ")";3368}3369 3370static const char *getSummaryKindName(GlobalValueSummary::SummaryKind SK) {3371  switch (SK) {3372  case GlobalValueSummary::AliasKind:3373    return "alias";3374  case GlobalValueSummary::FunctionKind:3375    return "function";3376  case GlobalValueSummary::GlobalVarKind:3377    return "variable";3378  }3379  llvm_unreachable("invalid summary kind");3380}3381 3382void AssemblyWriter::printAliasSummary(const AliasSummary *AS) {3383  Out << ", aliasee: ";3384  // The indexes emitted for distributed backends may not include the3385  // aliasee summary (only if it is being imported directly). Handle3386  // that case by just emitting "null" as the aliasee.3387  if (AS->hasAliasee())3388    Out << "^" << Machine.getGUIDSlot(SummaryToGUIDMap[&AS->getAliasee()]);3389  else3390    Out << "null";3391}3392 3393void AssemblyWriter::printGlobalVarSummary(const GlobalVarSummary *GS) {3394  auto VTableFuncs = GS->vTableFuncs();3395  Out << ", varFlags: (readonly: " << GS->VarFlags.MaybeReadOnly << ", "3396      << "writeonly: " << GS->VarFlags.MaybeWriteOnly << ", "3397      << "constant: " << GS->VarFlags.Constant;3398  if (!VTableFuncs.empty())3399    Out << ", "3400        << "vcall_visibility: " << GS->VarFlags.VCallVisibility;3401  Out << ")";3402 3403  if (!VTableFuncs.empty()) {3404    Out << ", vTableFuncs: (";3405    ListSeparator FS;3406    for (auto &P : VTableFuncs) {3407      Out << FS;3408      Out << "(virtFunc: ^" << Machine.getGUIDSlot(P.FuncVI.getGUID())3409          << ", offset: " << P.VTableOffset;3410      Out << ")";3411    }3412    Out << ")";3413  }3414}3415 3416static std::string getLinkageName(GlobalValue::LinkageTypes LT) {3417  switch (LT) {3418  case GlobalValue::ExternalLinkage:3419    return "external";3420  case GlobalValue::PrivateLinkage:3421    return "private";3422  case GlobalValue::InternalLinkage:3423    return "internal";3424  case GlobalValue::LinkOnceAnyLinkage:3425    return "linkonce";3426  case GlobalValue::LinkOnceODRLinkage:3427    return "linkonce_odr";3428  case GlobalValue::WeakAnyLinkage:3429    return "weak";3430  case GlobalValue::WeakODRLinkage:3431    return "weak_odr";3432  case GlobalValue::CommonLinkage:3433    return "common";3434  case GlobalValue::AppendingLinkage:3435    return "appending";3436  case GlobalValue::ExternalWeakLinkage:3437    return "extern_weak";3438  case GlobalValue::AvailableExternallyLinkage:3439    return "available_externally";3440  }3441  llvm_unreachable("invalid linkage");3442}3443 3444// When printing the linkage types in IR where the ExternalLinkage is3445// not printed, and other linkage types are expected to be printed with3446// a space after the name.3447static std::string getLinkageNameWithSpace(GlobalValue::LinkageTypes LT) {3448  if (LT == GlobalValue::ExternalLinkage)3449    return "";3450  return getLinkageName(LT) + " ";3451}3452 3453static const char *getVisibilityName(GlobalValue::VisibilityTypes Vis) {3454  switch (Vis) {3455  case GlobalValue::DefaultVisibility:3456    return "default";3457  case GlobalValue::HiddenVisibility:3458    return "hidden";3459  case GlobalValue::ProtectedVisibility:3460    return "protected";3461  }3462  llvm_unreachable("invalid visibility");3463}3464 3465static const char *getImportTypeName(GlobalValueSummary::ImportKind IK) {3466  switch (IK) {3467  case GlobalValueSummary::Definition:3468    return "definition";3469  case GlobalValueSummary::Declaration:3470    return "declaration";3471  }3472  llvm_unreachable("invalid import kind");3473}3474 3475void AssemblyWriter::printFunctionSummary(const FunctionSummary *FS) {3476  Out << ", insts: " << FS->instCount();3477  if (FS->fflags().anyFlagSet())3478    Out << ", " << FS->fflags();3479 3480  if (!FS->calls().empty()) {3481    Out << ", calls: (";3482    ListSeparator IFS;3483    for (auto &Call : FS->calls()) {3484      Out << IFS;3485      Out << "(callee: ^" << Machine.getGUIDSlot(Call.first.getGUID());3486      if (Call.second.getHotness() != CalleeInfo::HotnessType::Unknown)3487        Out << ", hotness: " << getHotnessName(Call.second.getHotness());3488      else if (Call.second.RelBlockFreq)3489        Out << ", relbf: " << Call.second.RelBlockFreq;3490      // Follow the convention of emitting flags as a boolean value, but only3491      // emit if true to avoid unnecessary verbosity and test churn.3492      if (Call.second.HasTailCall)3493        Out << ", tail: 1";3494      Out << ")";3495    }3496    Out << ")";3497  }3498 3499  if (const auto *TIdInfo = FS->getTypeIdInfo())3500    printTypeIdInfo(*TIdInfo);3501 3502  // The AllocationType identifiers capture the profiled context behavior3503  // reaching a specific static allocation site (possibly cloned).3504  auto AllocTypeName = [](uint8_t Type) -> const char * {3505    switch (Type) {3506    case (uint8_t)AllocationType::None:3507      return "none";3508    case (uint8_t)AllocationType::NotCold:3509      return "notcold";3510    case (uint8_t)AllocationType::Cold:3511      return "cold";3512    case (uint8_t)AllocationType::Hot:3513      return "hot";3514    }3515    llvm_unreachable("Unexpected alloc type");3516  };3517 3518  if (!FS->allocs().empty()) {3519    Out << ", allocs: (";3520    ListSeparator AFS;3521    for (auto &AI : FS->allocs()) {3522      Out << AFS;3523      Out << "(versions: (";3524      ListSeparator VFS;3525      for (auto V : AI.Versions) {3526        Out << VFS;3527        Out << AllocTypeName(V);3528      }3529      Out << "), memProf: (";3530      ListSeparator MIBFS;3531      for (auto &MIB : AI.MIBs) {3532        Out << MIBFS;3533        Out << "(type: " << AllocTypeName((uint8_t)MIB.AllocType);3534        Out << ", stackIds: (";3535        ListSeparator SIDFS;3536        for (auto Id : MIB.StackIdIndices) {3537          Out << SIDFS;3538          Out << TheIndex->getStackIdAtIndex(Id);3539        }3540        Out << "))";3541      }3542      Out << "))";3543    }3544    Out << ")";3545  }3546 3547  if (!FS->callsites().empty()) {3548    Out << ", callsites: (";3549    ListSeparator SNFS;3550    for (auto &CI : FS->callsites()) {3551      Out << SNFS;3552      if (CI.Callee)3553        Out << "(callee: ^" << Machine.getGUIDSlot(CI.Callee.getGUID());3554      else3555        Out << "(callee: null";3556      Out << ", clones: (";3557      ListSeparator VFS;3558      for (auto V : CI.Clones) {3559        Out << VFS;3560        Out << V;3561      }3562      Out << "), stackIds: (";3563      ListSeparator SIDFS;3564      for (auto Id : CI.StackIdIndices) {3565        Out << SIDFS;3566        Out << TheIndex->getStackIdAtIndex(Id);3567      }3568      Out << "))";3569    }3570    Out << ")";3571  }3572 3573  auto PrintRange = [&](const ConstantRange &Range) {3574    Out << "[" << Range.getSignedMin() << ", " << Range.getSignedMax() << "]";3575  };3576 3577  if (!FS->paramAccesses().empty()) {3578    Out << ", params: (";3579    ListSeparator IFS;3580    for (auto &PS : FS->paramAccesses()) {3581      Out << IFS;3582      Out << "(param: " << PS.ParamNo;3583      Out << ", offset: ";3584      PrintRange(PS.Use);3585      if (!PS.Calls.empty()) {3586        Out << ", calls: (";3587        ListSeparator IFS;3588        for (auto &Call : PS.Calls) {3589          Out << IFS;3590          Out << "(callee: ^" << Machine.getGUIDSlot(Call.Callee.getGUID());3591          Out << ", param: " << Call.ParamNo;3592          Out << ", offset: ";3593          PrintRange(Call.Offsets);3594          Out << ")";3595        }3596        Out << ")";3597      }3598      Out << ")";3599    }3600    Out << ")";3601  }3602}3603 3604void AssemblyWriter::printTypeIdInfo(3605    const FunctionSummary::TypeIdInfo &TIDInfo) {3606  Out << ", typeIdInfo: (";3607  ListSeparator TIDFS;3608  if (!TIDInfo.TypeTests.empty()) {3609    Out << TIDFS;3610    Out << "typeTests: (";3611    ListSeparator FS;3612    for (auto &GUID : TIDInfo.TypeTests) {3613      auto TidIter = TheIndex->typeIds().equal_range(GUID);3614      if (TidIter.first == TidIter.second) {3615        Out << FS;3616        Out << GUID;3617        continue;3618      }3619      // Print all type id that correspond to this GUID.3620      for (const auto &[GUID, TypeIdPair] : make_range(TidIter)) {3621        Out << FS;3622        auto Slot = Machine.getTypeIdSlot(TypeIdPair.first);3623        assert(Slot != -1);3624        Out << "^" << Slot;3625      }3626    }3627    Out << ")";3628  }3629  if (!TIDInfo.TypeTestAssumeVCalls.empty()) {3630    Out << TIDFS;3631    printNonConstVCalls(TIDInfo.TypeTestAssumeVCalls, "typeTestAssumeVCalls");3632  }3633  if (!TIDInfo.TypeCheckedLoadVCalls.empty()) {3634    Out << TIDFS;3635    printNonConstVCalls(TIDInfo.TypeCheckedLoadVCalls, "typeCheckedLoadVCalls");3636  }3637  if (!TIDInfo.TypeTestAssumeConstVCalls.empty()) {3638    Out << TIDFS;3639    printConstVCalls(TIDInfo.TypeTestAssumeConstVCalls,3640                     "typeTestAssumeConstVCalls");3641  }3642  if (!TIDInfo.TypeCheckedLoadConstVCalls.empty()) {3643    Out << TIDFS;3644    printConstVCalls(TIDInfo.TypeCheckedLoadConstVCalls,3645                     "typeCheckedLoadConstVCalls");3646  }3647  Out << ")";3648}3649 3650void AssemblyWriter::printVFuncId(const FunctionSummary::VFuncId VFId) {3651  auto TidIter = TheIndex->typeIds().equal_range(VFId.GUID);3652  if (TidIter.first == TidIter.second) {3653    Out << "vFuncId: (";3654    Out << "guid: " << VFId.GUID;3655    Out << ", offset: " << VFId.Offset;3656    Out << ")";3657    return;3658  }3659  // Print all type id that correspond to this GUID.3660  ListSeparator FS;3661  for (const auto &[GUID, TypeIdPair] : make_range(TidIter)) {3662    Out << FS;3663    Out << "vFuncId: (";3664    auto Slot = Machine.getTypeIdSlot(TypeIdPair.first);3665    assert(Slot != -1);3666    Out << "^" << Slot;3667    Out << ", offset: " << VFId.Offset;3668    Out << ")";3669  }3670}3671 3672void AssemblyWriter::printNonConstVCalls(3673    ArrayRef<FunctionSummary::VFuncId> VCallList, const char *Tag) {3674  Out << Tag << ": (";3675  ListSeparator FS;3676  for (auto &VFuncId : VCallList) {3677    Out << FS;3678    printVFuncId(VFuncId);3679  }3680  Out << ")";3681}3682 3683void AssemblyWriter::printConstVCalls(3684    ArrayRef<FunctionSummary::ConstVCall> VCallList, const char *Tag) {3685  Out << Tag << ": (";3686  ListSeparator FS;3687  for (auto &ConstVCall : VCallList) {3688    Out << FS;3689    Out << "(";3690    printVFuncId(ConstVCall.VFunc);3691    if (!ConstVCall.Args.empty()) {3692      Out << ", ";3693      printArgs(ConstVCall.Args);3694    }3695    Out << ")";3696  }3697  Out << ")";3698}3699 3700void AssemblyWriter::printSummary(const GlobalValueSummary &Summary) {3701  GlobalValueSummary::GVFlags GVFlags = Summary.flags();3702  GlobalValue::LinkageTypes LT = (GlobalValue::LinkageTypes)GVFlags.Linkage;3703  Out << getSummaryKindName(Summary.getSummaryKind()) << ": ";3704  Out << "(module: ^" << Machine.getModulePathSlot(Summary.modulePath())3705      << ", flags: (";3706  Out << "linkage: " << getLinkageName(LT);3707  Out << ", visibility: "3708      << getVisibilityName((GlobalValue::VisibilityTypes)GVFlags.Visibility);3709  Out << ", notEligibleToImport: " << GVFlags.NotEligibleToImport;3710  Out << ", live: " << GVFlags.Live;3711  Out << ", dsoLocal: " << GVFlags.DSOLocal;3712  Out << ", canAutoHide: " << GVFlags.CanAutoHide;3713  Out << ", importType: "3714      << getImportTypeName(GlobalValueSummary::ImportKind(GVFlags.ImportType));3715  Out << ")";3716 3717  if (Summary.getSummaryKind() == GlobalValueSummary::AliasKind)3718    printAliasSummary(cast<AliasSummary>(&Summary));3719  else if (Summary.getSummaryKind() == GlobalValueSummary::FunctionKind)3720    printFunctionSummary(cast<FunctionSummary>(&Summary));3721  else3722    printGlobalVarSummary(cast<GlobalVarSummary>(&Summary));3723 3724  auto RefList = Summary.refs();3725  if (!RefList.empty()) {3726    Out << ", refs: (";3727    ListSeparator FS;3728    for (auto &Ref : RefList) {3729      Out << FS;3730      if (Ref.isReadOnly())3731        Out << "readonly ";3732      else if (Ref.isWriteOnly())3733        Out << "writeonly ";3734      Out << "^" << Machine.getGUIDSlot(Ref.getGUID());3735    }3736    Out << ")";3737  }3738 3739  Out << ")";3740}3741 3742void AssemblyWriter::printSummaryInfo(unsigned Slot, const ValueInfo &VI) {3743  Out << "^" << Slot << " = gv: (";3744  if (VI.hasName() && !VI.name().empty())3745    Out << "name: \"" << VI.name() << "\"";3746  else3747    Out << "guid: " << VI.getGUID();3748  if (!VI.getSummaryList().empty()) {3749    Out << ", summaries: (";3750    ListSeparator FS;3751    for (auto &Summary : VI.getSummaryList()) {3752      Out << FS;3753      printSummary(*Summary);3754    }3755    Out << ")";3756  }3757  Out << ")";3758  if (VI.hasName() && !VI.name().empty())3759    Out << " ; guid = " << VI.getGUID();3760  Out << "\n";3761}3762 3763static void printMetadataIdentifier(StringRef Name,3764                                    formatted_raw_ostream &Out) {3765  if (Name.empty()) {3766    Out << "<empty name> ";3767  } else {3768    unsigned char FirstC = static_cast<unsigned char>(Name[0]);3769    if (isalpha(FirstC) || FirstC == '-' || FirstC == '$' || FirstC == '.' ||3770        FirstC == '_')3771      Out << FirstC;3772    else3773      Out << '\\' << hexdigit(FirstC >> 4) << hexdigit(FirstC & 0x0F);3774    for (unsigned i = 1, e = Name.size(); i != e; ++i) {3775      unsigned char C = Name[i];3776      if (isalnum(C) || C == '-' || C == '$' || C == '.' || C == '_')3777        Out << C;3778      else3779        Out << '\\' << hexdigit(C >> 4) << hexdigit(C & 0x0F);3780    }3781  }3782}3783 3784void AssemblyWriter::printNamedMDNode(const NamedMDNode *NMD) {3785  Out << '!';3786  printMetadataIdentifier(NMD->getName(), Out);3787  Out << " = !{";3788  ListSeparator LS;3789  for (const MDNode *Op : NMD->operands()) {3790    Out << LS;3791    // Write DIExpressions inline.3792    // FIXME: Ban DIExpressions in NamedMDNodes, they will serve no purpose.3793    if (auto *Expr = dyn_cast<DIExpression>(Op)) {3794      writeDIExpression(Out, Expr, AsmWriterContext::getEmpty());3795      continue;3796    }3797 3798    int Slot = Machine.getMetadataSlot(Op);3799    if (Slot == -1)3800      Out << "<badref>";3801    else3802      Out << '!' << Slot;3803  }3804  Out << "}\n";3805}3806 3807static void printVisibility(GlobalValue::VisibilityTypes Vis,3808                            formatted_raw_ostream &Out) {3809  switch (Vis) {3810  case GlobalValue::DefaultVisibility: break;3811  case GlobalValue::HiddenVisibility:    Out << "hidden "; break;3812  case GlobalValue::ProtectedVisibility: Out << "protected "; break;3813  }3814}3815 3816static void printDSOLocation(const GlobalValue &GV,3817                             formatted_raw_ostream &Out) {3818  if (GV.isDSOLocal() && !GV.isImplicitDSOLocal())3819    Out << "dso_local ";3820}3821 3822static void printDLLStorageClass(GlobalValue::DLLStorageClassTypes SCT,3823                                 formatted_raw_ostream &Out) {3824  switch (SCT) {3825  case GlobalValue::DefaultStorageClass: break;3826  case GlobalValue::DLLImportStorageClass: Out << "dllimport "; break;3827  case GlobalValue::DLLExportStorageClass: Out << "dllexport "; break;3828  }3829}3830 3831static void printThreadLocalModel(GlobalVariable::ThreadLocalMode TLM,3832                                  formatted_raw_ostream &Out) {3833  switch (TLM) {3834    case GlobalVariable::NotThreadLocal:3835      break;3836    case GlobalVariable::GeneralDynamicTLSModel:3837      Out << "thread_local ";3838      break;3839    case GlobalVariable::LocalDynamicTLSModel:3840      Out << "thread_local(localdynamic) ";3841      break;3842    case GlobalVariable::InitialExecTLSModel:3843      Out << "thread_local(initialexec) ";3844      break;3845    case GlobalVariable::LocalExecTLSModel:3846      Out << "thread_local(localexec) ";3847      break;3848  }3849}3850 3851static StringRef getUnnamedAddrEncoding(GlobalVariable::UnnamedAddr UA) {3852  switch (UA) {3853  case GlobalVariable::UnnamedAddr::None:3854    return "";3855  case GlobalVariable::UnnamedAddr::Local:3856    return "local_unnamed_addr";3857  case GlobalVariable::UnnamedAddr::Global:3858    return "unnamed_addr";3859  }3860  llvm_unreachable("Unknown UnnamedAddr");3861}3862 3863static void maybePrintComdat(formatted_raw_ostream &Out,3864                             const GlobalObject &GO) {3865  const Comdat *C = GO.getComdat();3866  if (!C)3867    return;3868 3869  if (isa<GlobalVariable>(GO))3870    Out << ',';3871  Out << " comdat";3872 3873  if (GO.getName() == C->getName())3874    return;3875 3876  Out << '(';3877  printLLVMName(Out, C->getName(), ComdatPrefix);3878  Out << ')';3879}3880 3881void AssemblyWriter::printGlobal(const GlobalVariable *GV) {3882  if (GV->isMaterializable())3883    Out << "; Materializable\n";3884 3885  AsmWriterContext WriterCtx(&TypePrinter, &Machine, GV->getParent());3886  writeAsOperandInternal(Out, GV, WriterCtx);3887  Out << " = ";3888 3889  if (!GV->hasInitializer() && GV->hasExternalLinkage())3890    Out << "external ";3891 3892  Out << getLinkageNameWithSpace(GV->getLinkage());3893  printDSOLocation(*GV, Out);3894  printVisibility(GV->getVisibility(), Out);3895  printDLLStorageClass(GV->getDLLStorageClass(), Out);3896  printThreadLocalModel(GV->getThreadLocalMode(), Out);3897  StringRef UA = getUnnamedAddrEncoding(GV->getUnnamedAddr());3898  if (!UA.empty())3899      Out << UA << ' ';3900 3901  if (unsigned AddressSpace = GV->getType()->getAddressSpace())3902    Out << "addrspace(" << AddressSpace << ") ";3903  if (GV->isExternallyInitialized()) Out << "externally_initialized ";3904  Out << (GV->isConstant() ? "constant " : "global ");3905  TypePrinter.print(GV->getValueType(), Out);3906 3907  if (GV->hasInitializer()) {3908    Out << ' ';3909    writeOperand(GV->getInitializer(), false);3910  }3911 3912  if (GV->hasSection()) {3913    Out << ", section \"";3914    printEscapedString(GV->getSection(), Out);3915    Out << '"';3916  }3917  if (GV->hasPartition()) {3918    Out << ", partition \"";3919    printEscapedString(GV->getPartition(), Out);3920    Out << '"';3921  }3922  if (auto CM = GV->getCodeModel()) {3923    Out << ", code_model \"";3924    switch (*CM) {3925    case CodeModel::Tiny:3926      Out << "tiny";3927      break;3928    case CodeModel::Small:3929      Out << "small";3930      break;3931    case CodeModel::Kernel:3932      Out << "kernel";3933      break;3934    case CodeModel::Medium:3935      Out << "medium";3936      break;3937    case CodeModel::Large:3938      Out << "large";3939      break;3940    }3941    Out << '"';3942  }3943 3944  using SanitizerMetadata = llvm::GlobalValue::SanitizerMetadata;3945  if (GV->hasSanitizerMetadata()) {3946    SanitizerMetadata MD = GV->getSanitizerMetadata();3947    if (MD.NoAddress)3948      Out << ", no_sanitize_address";3949    if (MD.NoHWAddress)3950      Out << ", no_sanitize_hwaddress";3951    if (MD.Memtag)3952      Out << ", sanitize_memtag";3953    if (MD.IsDynInit)3954      Out << ", sanitize_address_dyninit";3955  }3956 3957  maybePrintComdat(Out, *GV);3958  if (MaybeAlign A = GV->getAlign())3959    Out << ", align " << A->value();3960 3961  SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;3962  GV->getAllMetadata(MDs);3963  printMetadataAttachments(MDs, ", ");3964 3965  auto Attrs = GV->getAttributes();3966  if (Attrs.hasAttributes())3967    Out << " #" << Machine.getAttributeGroupSlot(Attrs);3968 3969  printInfoComment(*GV, GV->isMaterializable());3970}3971 3972void AssemblyWriter::printAlias(const GlobalAlias *GA) {3973  if (GA->isMaterializable())3974    Out << "; Materializable\n";3975 3976  AsmWriterContext WriterCtx(&TypePrinter, &Machine, GA->getParent());3977  writeAsOperandInternal(Out, GA, WriterCtx);3978  Out << " = ";3979 3980  Out << getLinkageNameWithSpace(GA->getLinkage());3981  printDSOLocation(*GA, Out);3982  printVisibility(GA->getVisibility(), Out);3983  printDLLStorageClass(GA->getDLLStorageClass(), Out);3984  printThreadLocalModel(GA->getThreadLocalMode(), Out);3985  StringRef UA = getUnnamedAddrEncoding(GA->getUnnamedAddr());3986  if (!UA.empty())3987      Out << UA << ' ';3988 3989  Out << "alias ";3990 3991  TypePrinter.print(GA->getValueType(), Out);3992  Out << ", ";3993 3994  if (const Constant *Aliasee = GA->getAliasee()) {3995    writeOperand(Aliasee, !isa<ConstantExpr>(Aliasee));3996  } else {3997    TypePrinter.print(GA->getType(), Out);3998    Out << " <<NULL ALIASEE>>";3999  }4000 4001  if (GA->hasPartition()) {4002    Out << ", partition \"";4003    printEscapedString(GA->getPartition(), Out);4004    Out << '"';4005  }4006 4007  printInfoComment(*GA, GA->isMaterializable());4008  Out << '\n';4009}4010 4011void AssemblyWriter::printIFunc(const GlobalIFunc *GI) {4012  if (GI->isMaterializable())4013    Out << "; Materializable\n";4014 4015  AsmWriterContext WriterCtx(&TypePrinter, &Machine, GI->getParent());4016  writeAsOperandInternal(Out, GI, WriterCtx);4017  Out << " = ";4018 4019  Out << getLinkageNameWithSpace(GI->getLinkage());4020  printDSOLocation(*GI, Out);4021  printVisibility(GI->getVisibility(), Out);4022 4023  Out << "ifunc ";4024 4025  TypePrinter.print(GI->getValueType(), Out);4026  Out << ", ";4027 4028  if (const Constant *Resolver = GI->getResolver()) {4029    writeOperand(Resolver, !isa<ConstantExpr>(Resolver));4030  } else {4031    TypePrinter.print(GI->getType(), Out);4032    Out << " <<NULL RESOLVER>>";4033  }4034 4035  if (GI->hasPartition()) {4036    Out << ", partition \"";4037    printEscapedString(GI->getPartition(), Out);4038    Out << '"';4039  }4040  SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;4041  GI->getAllMetadata(MDs);4042  if (!MDs.empty()) {4043    printMetadataAttachments(MDs, ", ");4044  }4045 4046  printInfoComment(*GI, GI->isMaterializable());4047  Out << '\n';4048}4049 4050void AssemblyWriter::printComdat(const Comdat *C) {4051  C->print(Out);4052}4053 4054void AssemblyWriter::printTypeIdentities() {4055  if (TypePrinter.empty())4056    return;4057 4058  Out << '\n';4059 4060  // Emit all numbered types.4061  auto &NumberedTypes = TypePrinter.getNumberedTypes();4062  for (unsigned I = 0, E = NumberedTypes.size(); I != E; ++I) {4063    Out << '%' << I << " = type ";4064 4065    // Make sure we print out at least one level of the type structure, so4066    // that we do not get %2 = type %24067    TypePrinter.printStructBody(NumberedTypes[I], Out);4068    Out << '\n';4069  }4070 4071  auto &NamedTypes = TypePrinter.getNamedTypes();4072  for (StructType *NamedType : NamedTypes) {4073    printLLVMName(Out, NamedType->getName(), LocalPrefix);4074    Out << " = type ";4075 4076    // Make sure we print out at least one level of the type structure, so4077    // that we do not get %FILE = type %FILE4078    TypePrinter.printStructBody(NamedType, Out);4079    Out << '\n';4080  }4081}4082 4083/// printFunction - Print all aspects of a function.4084void AssemblyWriter::printFunction(const Function *F) {4085  if (F->isMaterializable())4086    Out << "; Materializable\n";4087  else if (AnnotationWriter)4088    AnnotationWriter->emitFunctionAnnot(F, Out);4089 4090  const AttributeList &Attrs = F->getAttributes();4091  if (Attrs.hasFnAttrs()) {4092    AttributeSet AS = Attrs.getFnAttrs();4093    std::string AttrStr;4094 4095    for (const Attribute &Attr : AS) {4096      if (!Attr.isStringAttribute()) {4097        if (!AttrStr.empty()) AttrStr += ' ';4098        AttrStr += Attr.getAsString();4099      }4100    }4101 4102    if (!AttrStr.empty())4103      Out << "; Function Attrs: " << AttrStr << '\n';4104  }4105 4106  if (F->isIntrinsic() && F->getIntrinsicID() == Intrinsic::not_intrinsic)4107    Out << "; Unknown intrinsic\n";4108 4109  Machine.incorporateFunction(F);4110 4111  if (F->isDeclaration()) {4112    Out << "declare";4113    SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;4114    F->getAllMetadata(MDs);4115    printMetadataAttachments(MDs, " ");4116    Out << ' ';4117  } else4118    Out << "define ";4119 4120  Out << getLinkageNameWithSpace(F->getLinkage());4121  printDSOLocation(*F, Out);4122  printVisibility(F->getVisibility(), Out);4123  printDLLStorageClass(F->getDLLStorageClass(), Out);4124 4125  // Print the calling convention.4126  if (F->getCallingConv() != CallingConv::C) {4127    printCallingConv(F->getCallingConv(), Out);4128    Out << " ";4129  }4130 4131  FunctionType *FT = F->getFunctionType();4132  if (Attrs.hasRetAttrs())4133    Out << Attrs.getAsString(AttributeList::ReturnIndex) << ' ';4134  TypePrinter.print(F->getReturnType(), Out);4135  AsmWriterContext WriterCtx(&TypePrinter, &Machine, F->getParent());4136  Out << ' ';4137  writeAsOperandInternal(Out, F, WriterCtx);4138  Out << '(';4139 4140  // Loop over the arguments, printing them...4141  if (F->isDeclaration() && !IsForDebug) {4142    // We're only interested in the type here - don't print argument names.4143    ListSeparator LS;4144    for (unsigned I = 0, E = FT->getNumParams(); I != E; ++I) {4145      Out << LS;4146      // Output type.4147      TypePrinter.print(FT->getParamType(I), Out);4148 4149      AttributeSet ArgAttrs = Attrs.getParamAttrs(I);4150      if (ArgAttrs.hasAttributes()) {4151        Out << ' ';4152        writeAttributeSet(ArgAttrs);4153      }4154    }4155  } else {4156    // The arguments are meaningful here, print them in detail.4157    ListSeparator LS;4158    for (const Argument &Arg : F->args()) {4159      Out << LS;4160      printArgument(&Arg, Attrs.getParamAttrs(Arg.getArgNo()));4161    }4162  }4163 4164  // Finish printing arguments...4165  if (FT->isVarArg()) {4166    if (FT->getNumParams()) Out << ", ";4167    Out << "...";  // Output varargs portion of signature!4168  }4169  Out << ')';4170  StringRef UA = getUnnamedAddrEncoding(F->getUnnamedAddr());4171  if (!UA.empty())4172    Out << ' ' << UA;4173  // We print the function address space if it is non-zero or if we are writing4174  // a module with a non-zero program address space or if there is no valid4175  // Module* so that the file can be parsed without the datalayout string.4176  const Module *Mod = F->getParent();4177  if (F->getAddressSpace() != 0 || !Mod ||4178      Mod->getDataLayout().getProgramAddressSpace() != 0)4179    Out << " addrspace(" << F->getAddressSpace() << ")";4180  if (Attrs.hasFnAttrs())4181    Out << " #" << Machine.getAttributeGroupSlot(Attrs.getFnAttrs());4182  if (F->hasSection()) {4183    Out << " section \"";4184    printEscapedString(F->getSection(), Out);4185    Out << '"';4186  }4187  if (F->hasPartition()) {4188    Out << " partition \"";4189    printEscapedString(F->getPartition(), Out);4190    Out << '"';4191  }4192  maybePrintComdat(Out, *F);4193  if (MaybeAlign A = F->getAlign())4194    Out << " align " << A->value();4195  if (F->hasGC())4196    Out << " gc \"" << F->getGC() << '"';4197  if (F->hasPrefixData()) {4198    Out << " prefix ";4199    writeOperand(F->getPrefixData(), true);4200  }4201  if (F->hasPrologueData()) {4202    Out << " prologue ";4203    writeOperand(F->getPrologueData(), true);4204  }4205  if (F->hasPersonalityFn()) {4206    Out << " personality ";4207    writeOperand(F->getPersonalityFn(), /*PrintType=*/true);4208  }4209 4210  if (PrintProfData) {4211    if (auto *MDProf = F->getMetadata(LLVMContext::MD_prof)) {4212      Out << " ";4213      MDProf->print(Out, TheModule, /*IsForDebug=*/true);4214    }4215  }4216 4217  if (F->isDeclaration()) {4218    Out << '\n';4219  } else {4220    SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;4221    F->getAllMetadata(MDs);4222    printMetadataAttachments(MDs, " ");4223 4224    Out << " {";4225    // Output all of the function's basic blocks.4226    for (const BasicBlock &BB : *F)4227      printBasicBlock(&BB);4228 4229    // Output the function's use-lists.4230    printUseLists(F);4231 4232    Out << "}\n";4233  }4234 4235  Machine.purgeFunction();4236}4237 4238/// printArgument - This member is called for every argument that is passed into4239/// the function.  Simply print it out4240void AssemblyWriter::printArgument(const Argument *Arg, AttributeSet Attrs) {4241  // Output type...4242  TypePrinter.print(Arg->getType(), Out);4243 4244  // Output parameter attributes list4245  if (Attrs.hasAttributes()) {4246    Out << ' ';4247    writeAttributeSet(Attrs);4248  }4249 4250  // Output name, if available...4251  if (Arg->hasName()) {4252    Out << ' ';4253    printLLVMName(Out, Arg);4254  } else {4255    int Slot = Machine.getLocalSlot(Arg);4256    assert(Slot != -1 && "expect argument in function here");4257    Out << " %" << Slot;4258  }4259}4260 4261/// printBasicBlock - This member is called for each basic block in a method.4262void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {4263  bool IsEntryBlock = BB->getParent() && BB->isEntryBlock();4264  if (BB->hasName()) {              // Print out the label if it exists...4265    Out << "\n";4266    printLLVMName(Out, BB->getName(), LabelPrefix);4267    Out << ':';4268  } else if (!IsEntryBlock) {4269    Out << "\n";4270    int Slot = Machine.getLocalSlot(BB);4271    if (Slot != -1)4272      Out << Slot << ":";4273    else4274      Out << "<badref>:";4275  }4276 4277  if (!IsEntryBlock) {4278    // Output predecessors for the block.4279    Out.PadToColumn(50);4280    Out << ";";4281    if (pred_empty(BB)) {4282      Out << " No predecessors!";4283    } else {4284      Out << " preds = ";4285      ListSeparator LS;4286      for (const BasicBlock *Pred : predecessors(BB)) {4287        Out << LS;4288        writeOperand(Pred, false);4289      }4290    }4291  }4292 4293  Out << "\n";4294 4295  if (AnnotationWriter) AnnotationWriter->emitBasicBlockStartAnnot(BB, Out);4296 4297  // Output all of the instructions in the basic block...4298  for (const Instruction &I : *BB) {4299    for (const DbgRecord &DR : I.getDbgRecordRange())4300      printDbgRecordLine(DR);4301    printInstructionLine(I);4302  }4303 4304  if (AnnotationWriter) AnnotationWriter->emitBasicBlockEndAnnot(BB, Out);4305}4306 4307/// printInstructionLine - Print an instruction and a newline character.4308void AssemblyWriter::printInstructionLine(const Instruction &I) {4309  printInstruction(I);4310  Out << '\n';4311}4312 4313/// printGCRelocateComment - print comment after call to the gc.relocate4314/// intrinsic indicating base and derived pointer names.4315void AssemblyWriter::printGCRelocateComment(const GCRelocateInst &Relocate) {4316  Out << " ; (";4317  writeOperand(Relocate.getBasePtr(), false);4318  Out << ", ";4319  writeOperand(Relocate.getDerivedPtr(), false);4320  Out << ")";4321}4322 4323/// printInfoComment - Print a little comment after the instruction indicating4324/// which slot it occupies.4325void AssemblyWriter::printInfoComment(const Value &V, bool isMaterializable) {4326  if (const auto *Relocate = dyn_cast<GCRelocateInst>(&V))4327    printGCRelocateComment(*Relocate);4328 4329  if (AnnotationWriter && !isMaterializable)4330    AnnotationWriter->printInfoComment(V, Out);4331 4332  if (PrintInstDebugLocs) {4333    if (auto *I = dyn_cast<Instruction>(&V)) {4334      if (I->getDebugLoc()) {4335        Out << " ; ";4336        I->getDebugLoc().print(Out);4337      }4338    }4339  }4340  if (PrintProfData) {4341    if (auto *I = dyn_cast<Instruction>(&V)) {4342      if (auto *MD = I->getMetadata(LLVMContext::MD_prof)) {4343        Out << " ; ";4344        MD->print(Out, TheModule, /*IsForDebug=*/true);4345      }4346    }4347  }4348 4349  if (PrintInstAddrs)4350    Out << " ; " << &V;4351}4352 4353static void maybePrintCallAddrSpace(const Value *Operand, const Instruction *I,4354                                    raw_ostream &Out) {4355  // We print the address space of the call if it is non-zero.4356  if (Operand == nullptr) {4357    Out << " <cannot get addrspace!>";4358    return;4359  }4360  unsigned CallAddrSpace = Operand->getType()->getPointerAddressSpace();4361  bool PrintAddrSpace = CallAddrSpace != 0;4362  if (!PrintAddrSpace) {4363    const Module *Mod = getModuleFromVal(I);4364    // We also print it if it is zero but not equal to the program address space4365    // or if we can't find a valid Module* to make it possible to parse4366    // the resulting file even without a datalayout string.4367    if (!Mod || Mod->getDataLayout().getProgramAddressSpace() != 0)4368      PrintAddrSpace = true;4369  }4370  if (PrintAddrSpace)4371    Out << " addrspace(" << CallAddrSpace << ")";4372}4373 4374// This member is called for each Instruction in a function..4375void AssemblyWriter::printInstruction(const Instruction &I) {4376  if (AnnotationWriter) AnnotationWriter->emitInstructionAnnot(&I, Out);4377 4378  // Print out indentation for an instruction.4379  Out << "  ";4380 4381  // Print out name if it exists...4382  if (I.hasName()) {4383    printLLVMName(Out, &I);4384    Out << " = ";4385  } else if (!I.getType()->isVoidTy()) {4386    // Print out the def slot taken.4387    int SlotNum = Machine.getLocalSlot(&I);4388    if (SlotNum == -1)4389      Out << "<badref> = ";4390    else4391      Out << '%' << SlotNum << " = ";4392  }4393 4394  if (const auto *CI = dyn_cast<CallInst>(&I)) {4395    if (CI->isMustTailCall())4396      Out << "musttail ";4397    else if (CI->isTailCall())4398      Out << "tail ";4399    else if (CI->isNoTailCall())4400      Out << "notail ";4401  }4402 4403  // Print out the opcode...4404  Out << I.getOpcodeName();4405 4406  // If this is an atomic load or store, print out the atomic marker.4407  if ((isa<LoadInst>(I)  && cast<LoadInst>(I).isAtomic()) ||4408      (isa<StoreInst>(I) && cast<StoreInst>(I).isAtomic()))4409    Out << " atomic";4410 4411  if (isa<AtomicCmpXchgInst>(I) && cast<AtomicCmpXchgInst>(I).isWeak())4412    Out << " weak";4413 4414  // If this is a volatile operation, print out the volatile marker.4415  if ((isa<LoadInst>(I)  && cast<LoadInst>(I).isVolatile()) ||4416      (isa<StoreInst>(I) && cast<StoreInst>(I).isVolatile()) ||4417      (isa<AtomicCmpXchgInst>(I) && cast<AtomicCmpXchgInst>(I).isVolatile()) ||4418      (isa<AtomicRMWInst>(I) && cast<AtomicRMWInst>(I).isVolatile()))4419    Out << " volatile";4420 4421  // Print out optimization information.4422  writeOptimizationInfo(Out, &I);4423 4424  // Print out the compare instruction predicates4425  if (const auto *CI = dyn_cast<CmpInst>(&I))4426    Out << ' ' << CI->getPredicate();4427 4428  // Print out the atomicrmw operation4429  if (const auto *RMWI = dyn_cast<AtomicRMWInst>(&I))4430    Out << ' ' << AtomicRMWInst::getOperationName(RMWI->getOperation());4431 4432  // Print out the type of the operands...4433  const Value *Operand = I.getNumOperands() ? I.getOperand(0) : nullptr;4434 4435  // Special case conditional branches to swizzle the condition out to the front4436  if (isa<BranchInst>(I) && cast<BranchInst>(I).isConditional()) {4437    const BranchInst &BI(cast<BranchInst>(I));4438    Out << ' ';4439    writeOperand(BI.getCondition(), true);4440    Out << ", ";4441    writeOperand(BI.getSuccessor(0), true);4442    Out << ", ";4443    writeOperand(BI.getSuccessor(1), true);4444 4445  } else if (isa<SwitchInst>(I)) {4446    const SwitchInst& SI(cast<SwitchInst>(I));4447    // Special case switch instruction to get formatting nice and correct.4448    Out << ' ';4449    writeOperand(SI.getCondition(), true);4450    Out << ", ";4451    writeOperand(SI.getDefaultDest(), true);4452    Out << " [";4453    for (auto Case : SI.cases()) {4454      Out << "\n    ";4455      writeOperand(Case.getCaseValue(), true);4456      Out << ", ";4457      writeOperand(Case.getCaseSuccessor(), true);4458    }4459    Out << "\n  ]";4460  } else if (isa<IndirectBrInst>(I)) {4461    // Special case indirectbr instruction to get formatting nice and correct.4462    Out << ' ';4463    writeOperand(Operand, true);4464    Out << ", [";4465 4466    ListSeparator LS;4467    for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i) {4468      Out << LS;4469      writeOperand(I.getOperand(i), true);4470    }4471    Out << ']';4472  } else if (const auto *PN = dyn_cast<PHINode>(&I)) {4473    Out << ' ';4474    TypePrinter.print(I.getType(), Out);4475    Out << ' ';4476 4477    ListSeparator LS;4478    for (const auto &[V, Block] :4479         zip_equal(PN->incoming_values(), PN->blocks())) {4480      Out << LS << "[ ";4481      writeOperand(V, false);4482      Out << ", ";4483      writeOperand(Block, false);4484      Out << " ]";4485    }4486  } else if (const auto *EVI = dyn_cast<ExtractValueInst>(&I)) {4487    Out << ' ';4488    writeOperand(I.getOperand(0), true);4489    Out << ", ";4490    Out << llvm::interleaved(EVI->indices());4491  } else if (const auto *IVI = dyn_cast<InsertValueInst>(&I)) {4492    Out << ' ';4493    writeOperand(I.getOperand(0), true); Out << ", ";4494    writeOperand(I.getOperand(1), true);4495    Out << ", ";4496    Out << llvm::interleaved(IVI->indices());4497  } else if (const auto *LPI = dyn_cast<LandingPadInst>(&I)) {4498    Out << ' ';4499    TypePrinter.print(I.getType(), Out);4500    if (LPI->isCleanup() || LPI->getNumClauses() != 0)4501      Out << '\n';4502 4503    if (LPI->isCleanup())4504      Out << "          cleanup";4505 4506    for (unsigned i = 0, e = LPI->getNumClauses(); i != e; ++i) {4507      if (i != 0 || LPI->isCleanup()) Out << "\n";4508      if (LPI->isCatch(i))4509        Out << "          catch ";4510      else4511        Out << "          filter ";4512 4513      writeOperand(LPI->getClause(i), true);4514    }4515  } else if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(&I)) {4516    Out << " within ";4517    writeOperand(CatchSwitch->getParentPad(), /*PrintType=*/false);4518    Out << " [";4519    ListSeparator LS;4520    for (const BasicBlock *PadBB : CatchSwitch->handlers()) {4521      Out << LS;4522      writeOperand(PadBB, /*PrintType=*/true);4523    }4524    Out << "] unwind ";4525    if (const BasicBlock *UnwindDest = CatchSwitch->getUnwindDest())4526      writeOperand(UnwindDest, /*PrintType=*/true);4527    else4528      Out << "to caller";4529  } else if (const auto *FPI = dyn_cast<FuncletPadInst>(&I)) {4530    Out << " within ";4531    writeOperand(FPI->getParentPad(), /*PrintType=*/false);4532    Out << " [";4533    ListSeparator LS;4534    for (const Value *Op : FPI->arg_operands()) {4535      Out << LS;4536      writeOperand(Op, /*PrintType=*/true);4537    }4538    Out << ']';4539  } else if (isa<ReturnInst>(I) && !Operand) {4540    Out << " void";4541  } else if (const auto *CRI = dyn_cast<CatchReturnInst>(&I)) {4542    Out << " from ";4543    writeOperand(CRI->getOperand(0), /*PrintType=*/false);4544 4545    Out << " to ";4546    writeOperand(CRI->getOperand(1), /*PrintType=*/true);4547  } else if (const auto *CRI = dyn_cast<CleanupReturnInst>(&I)) {4548    Out << " from ";4549    writeOperand(CRI->getOperand(0), /*PrintType=*/false);4550 4551    Out << " unwind ";4552    if (CRI->hasUnwindDest())4553      writeOperand(CRI->getOperand(1), /*PrintType=*/true);4554    else4555      Out << "to caller";4556  } else if (const auto *CI = dyn_cast<CallInst>(&I)) {4557    // Print the calling convention being used.4558    if (CI->getCallingConv() != CallingConv::C) {4559      Out << " ";4560      printCallingConv(CI->getCallingConv(), Out);4561    }4562 4563    Operand = CI->getCalledOperand();4564    FunctionType *FTy = CI->getFunctionType();4565    Type *RetTy = FTy->getReturnType();4566    const AttributeList &PAL = CI->getAttributes();4567 4568    if (PAL.hasRetAttrs())4569      Out << ' ' << PAL.getAsString(AttributeList::ReturnIndex);4570 4571    // Only print addrspace(N) if necessary:4572    maybePrintCallAddrSpace(Operand, &I, Out);4573 4574    // If possible, print out the short form of the call instruction.  We can4575    // only do this if the first argument is a pointer to a nonvararg function,4576    // and if the return type is not a pointer to a function.4577    Out << ' ';4578    TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);4579    Out << ' ';4580    writeOperand(Operand, false);4581    Out << '(';4582    bool HasPrettyPrintedArgs =4583        isa<IntrinsicInst>(CI) &&4584        Intrinsic::hasPrettyPrintedArgs(CI->getIntrinsicID());4585 4586    ListSeparator LS;4587    Function *CalledFunc = CI->getCalledFunction();4588    auto PrintArgComment = [&](unsigned ArgNo) {4589      const auto *ConstArg = dyn_cast<Constant>(CI->getArgOperand(ArgNo));4590      if (!ConstArg)4591        return;4592      std::string ArgComment;4593      raw_string_ostream ArgCommentStream(ArgComment);4594      Intrinsic::ID IID = CalledFunc->getIntrinsicID();4595      Intrinsic::printImmArg(IID, ArgNo, ArgCommentStream, ConstArg);4596      if (ArgComment.empty())4597        return;4598      Out << "/* " << ArgComment << " */ ";4599    };4600    if (HasPrettyPrintedArgs) {4601      for (unsigned ArgNo = 0, NumArgs = CI->arg_size(); ArgNo < NumArgs;4602           ++ArgNo) {4603        Out << LS;4604        PrintArgComment(ArgNo);4605        writeParamOperand(CI->getArgOperand(ArgNo), PAL.getParamAttrs(ArgNo));4606      }4607    } else {4608      for (unsigned ArgNo = 0, NumArgs = CI->arg_size(); ArgNo < NumArgs;4609           ++ArgNo) {4610        Out << LS;4611        writeParamOperand(CI->getArgOperand(ArgNo), PAL.getParamAttrs(ArgNo));4612      }4613    }4614    // Emit an ellipsis if this is a musttail call in a vararg function.  This4615    // is only to aid readability, musttail calls forward varargs by default.4616    if (CI->isMustTailCall() && CI->getParent() &&4617        CI->getParent()->getParent() &&4618        CI->getParent()->getParent()->isVarArg()) {4619      if (CI->arg_size() > 0)4620        Out << ", ";4621      Out << "...";4622    }4623 4624    Out << ')';4625    if (PAL.hasFnAttrs())4626      Out << " #" << Machine.getAttributeGroupSlot(PAL.getFnAttrs());4627 4628    writeOperandBundles(CI);4629  } else if (const auto *II = dyn_cast<InvokeInst>(&I)) {4630    Operand = II->getCalledOperand();4631    FunctionType *FTy = II->getFunctionType();4632    Type *RetTy = FTy->getReturnType();4633    const AttributeList &PAL = II->getAttributes();4634 4635    // Print the calling convention being used.4636    if (II->getCallingConv() != CallingConv::C) {4637      Out << " ";4638      printCallingConv(II->getCallingConv(), Out);4639    }4640 4641    if (PAL.hasRetAttrs())4642      Out << ' ' << PAL.getAsString(AttributeList::ReturnIndex);4643 4644    // Only print addrspace(N) if necessary:4645    maybePrintCallAddrSpace(Operand, &I, Out);4646 4647    // If possible, print out the short form of the invoke instruction. We can4648    // only do this if the first argument is a pointer to a nonvararg function,4649    // and if the return type is not a pointer to a function.4650    //4651    Out << ' ';4652    TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);4653    Out << ' ';4654    writeOperand(Operand, false);4655    Out << '(';4656    ListSeparator LS;4657    for (unsigned op = 0, Eop = II->arg_size(); op < Eop; ++op) {4658      Out << LS;4659      writeParamOperand(II->getArgOperand(op), PAL.getParamAttrs(op));4660    }4661 4662    Out << ')';4663    if (PAL.hasFnAttrs())4664      Out << " #" << Machine.getAttributeGroupSlot(PAL.getFnAttrs());4665 4666    writeOperandBundles(II);4667 4668    Out << "\n          to ";4669    writeOperand(II->getNormalDest(), true);4670    Out << " unwind ";4671    writeOperand(II->getUnwindDest(), true);4672  } else if (const auto *CBI = dyn_cast<CallBrInst>(&I)) {4673    Operand = CBI->getCalledOperand();4674    FunctionType *FTy = CBI->getFunctionType();4675    Type *RetTy = FTy->getReturnType();4676    const AttributeList &PAL = CBI->getAttributes();4677 4678    // Print the calling convention being used.4679    if (CBI->getCallingConv() != CallingConv::C) {4680      Out << " ";4681      printCallingConv(CBI->getCallingConv(), Out);4682    }4683 4684    if (PAL.hasRetAttrs())4685      Out << ' ' << PAL.getAsString(AttributeList::ReturnIndex);4686 4687    // If possible, print out the short form of the callbr instruction. We can4688    // only do this if the first argument is a pointer to a nonvararg function,4689    // and if the return type is not a pointer to a function.4690    //4691    Out << ' ';4692    TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);4693    Out << ' ';4694    writeOperand(Operand, false);4695    Out << '(';4696    ListSeparator ArgLS;4697    for (unsigned op = 0, Eop = CBI->arg_size(); op < Eop; ++op) {4698      Out << ArgLS;4699      writeParamOperand(CBI->getArgOperand(op), PAL.getParamAttrs(op));4700    }4701 4702    Out << ')';4703    if (PAL.hasFnAttrs())4704      Out << " #" << Machine.getAttributeGroupSlot(PAL.getFnAttrs());4705 4706    writeOperandBundles(CBI);4707 4708    Out << "\n          to ";4709    writeOperand(CBI->getDefaultDest(), true);4710    Out << " [";4711    ListSeparator DestLS;4712    for (const BasicBlock *Dest : CBI->getIndirectDests()) {4713      Out << DestLS;4714      writeOperand(Dest, true);4715    }4716    Out << ']';4717  } else if (const auto *AI = dyn_cast<AllocaInst>(&I)) {4718    Out << ' ';4719    if (AI->isUsedWithInAlloca())4720      Out << "inalloca ";4721    if (AI->isSwiftError())4722      Out << "swifterror ";4723    TypePrinter.print(AI->getAllocatedType(), Out);4724 4725    // Explicitly write the array size if the code is broken, if it's an array4726    // allocation, or if the type is not canonical for scalar allocations.  The4727    // latter case prevents the type from mutating when round-tripping through4728    // assembly.4729    if (!AI->getArraySize() || AI->isArrayAllocation() ||4730        !AI->getArraySize()->getType()->isIntegerTy(32)) {4731      Out << ", ";4732      writeOperand(AI->getArraySize(), true);4733    }4734    if (MaybeAlign A = AI->getAlign()) {4735      Out << ", align " << A->value();4736    }4737 4738    unsigned AddrSpace = AI->getAddressSpace();4739    if (AddrSpace != 0)4740      Out << ", addrspace(" << AddrSpace << ')';4741  } else if (isa<CastInst>(I)) {4742    if (Operand) {4743      Out << ' ';4744      writeOperand(Operand, true);   // Work with broken code4745    }4746    Out << " to ";4747    TypePrinter.print(I.getType(), Out);4748  } else if (isa<VAArgInst>(I)) {4749    if (Operand) {4750      Out << ' ';4751      writeOperand(Operand, true);   // Work with broken code4752    }4753    Out << ", ";4754    TypePrinter.print(I.getType(), Out);4755  } else if (Operand) { // Print the normal way.4756    if (const auto *GEP = dyn_cast<GetElementPtrInst>(&I)) {4757      Out << ' ';4758      TypePrinter.print(GEP->getSourceElementType(), Out);4759      Out << ',';4760    } else if (const auto *LI = dyn_cast<LoadInst>(&I)) {4761      Out << ' ';4762      TypePrinter.print(LI->getType(), Out);4763      Out << ',';4764    }4765 4766    // PrintAllTypes - Instructions who have operands of all the same type4767    // omit the type from all but the first operand.  If the instruction has4768    // different type operands (for example br), then they are all printed.4769    bool PrintAllTypes = false;4770    Type *TheType = Operand->getType();4771 4772    // Select, Store, ShuffleVector, CmpXchg and AtomicRMW always print all4773    // types.4774    if (isa<SelectInst>(I) || isa<StoreInst>(I) || isa<ShuffleVectorInst>(I) ||4775        isa<ReturnInst>(I) || isa<AtomicCmpXchgInst>(I) ||4776        isa<AtomicRMWInst>(I)) {4777      PrintAllTypes = true;4778    } else {4779      for (unsigned i = 1, E = I.getNumOperands(); i != E; ++i) {4780        Operand = I.getOperand(i);4781        // note that Operand shouldn't be null, but the test helps make dump()4782        // more tolerant of malformed IR4783        if (Operand && Operand->getType() != TheType) {4784          PrintAllTypes = true;    // We have differing types!  Print them all!4785          break;4786        }4787      }4788    }4789 4790    if (!PrintAllTypes) {4791      Out << ' ';4792      TypePrinter.print(TheType, Out);4793    }4794 4795    Out << ' ';4796    ListSeparator LS;4797    for (const Value *Op : I.operands()) {4798      Out << LS;4799      writeOperand(Op, PrintAllTypes);4800    }4801  }4802 4803  // Print atomic ordering/alignment for memory operations4804  if (const auto *LI = dyn_cast<LoadInst>(&I)) {4805    if (LI->isAtomic())4806      writeAtomic(LI->getContext(), LI->getOrdering(), LI->getSyncScopeID());4807    if (MaybeAlign A = LI->getAlign())4808      Out << ", align " << A->value();4809  } else if (const auto *SI = dyn_cast<StoreInst>(&I)) {4810    if (SI->isAtomic())4811      writeAtomic(SI->getContext(), SI->getOrdering(), SI->getSyncScopeID());4812    if (MaybeAlign A = SI->getAlign())4813      Out << ", align " << A->value();4814  } else if (const auto *CXI = dyn_cast<AtomicCmpXchgInst>(&I)) {4815    writeAtomicCmpXchg(CXI->getContext(), CXI->getSuccessOrdering(),4816                       CXI->getFailureOrdering(), CXI->getSyncScopeID());4817    Out << ", align " << CXI->getAlign().value();4818  } else if (const auto *RMWI = dyn_cast<AtomicRMWInst>(&I)) {4819    writeAtomic(RMWI->getContext(), RMWI->getOrdering(),4820                RMWI->getSyncScopeID());4821    Out << ", align " << RMWI->getAlign().value();4822  } else if (const auto *FI = dyn_cast<FenceInst>(&I)) {4823    writeAtomic(FI->getContext(), FI->getOrdering(), FI->getSyncScopeID());4824  } else if (const auto *SVI = dyn_cast<ShuffleVectorInst>(&I)) {4825    printShuffleMask(Out, SVI->getType(), SVI->getShuffleMask());4826  }4827 4828  // Print Metadata info.4829  SmallVector<std::pair<unsigned, MDNode *>, 4> InstMD;4830  I.getAllMetadata(InstMD);4831  printMetadataAttachments(InstMD, ", ");4832 4833  // Print a nice comment.4834  printInfoComment(I);4835}4836 4837void AssemblyWriter::printDbgMarker(const DbgMarker &Marker) {4838  // There's no formal representation of a DbgMarker -- print purely as a4839  // debugging aid.4840  for (const DbgRecord &DPR : Marker.StoredDbgRecords) {4841    printDbgRecord(DPR);4842    Out << "\n";4843  }4844 4845  Out << "  DbgMarker -> { ";4846  printInstruction(*Marker.MarkedInstr);4847  Out << " }";4848}4849 4850void AssemblyWriter::printDbgRecord(const DbgRecord &DR) {4851  if (auto *DVR = dyn_cast<DbgVariableRecord>(&DR))4852    printDbgVariableRecord(*DVR);4853  else if (auto *DLR = dyn_cast<DbgLabelRecord>(&DR))4854    printDbgLabelRecord(*DLR);4855  else4856    llvm_unreachable("Unexpected DbgRecord kind");4857}4858 4859void AssemblyWriter::printDbgVariableRecord(const DbgVariableRecord &DVR) {4860  auto WriterCtx = getContext();4861  Out << "#dbg_";4862  switch (DVR.getType()) {4863  case DbgVariableRecord::LocationType::Value:4864    Out << "value";4865    break;4866  case DbgVariableRecord::LocationType::Declare:4867    Out << "declare";4868    break;4869  case DbgVariableRecord::LocationType::DeclareValue:4870    Out << "declare_value";4871    break;4872  case DbgVariableRecord::LocationType::Assign:4873    Out << "assign";4874    break;4875  default:4876    llvm_unreachable(4877        "Tried to print a DbgVariableRecord with an invalid LocationType!");4878  }4879 4880  auto PrintOrNull = [&](Metadata *M) {4881    if (!M)4882      Out << "(null)";4883    else4884      writeAsOperandInternal(Out, M, WriterCtx, true);4885  };4886 4887  Out << "(";4888  PrintOrNull(DVR.getRawLocation());4889  Out << ", ";4890  PrintOrNull(DVR.getRawVariable());4891  Out << ", ";4892  PrintOrNull(DVR.getRawExpression());4893  Out << ", ";4894  if (DVR.isDbgAssign()) {4895    PrintOrNull(DVR.getRawAssignID());4896    Out << ", ";4897    PrintOrNull(DVR.getRawAddress());4898    Out << ", ";4899    PrintOrNull(DVR.getRawAddressExpression());4900    Out << ", ";4901  }4902  PrintOrNull(DVR.getDebugLoc().getAsMDNode());4903  Out << ")";4904}4905 4906/// printDbgRecordLine - Print a DbgRecord with indentation and a newline4907/// character.4908void AssemblyWriter::printDbgRecordLine(const DbgRecord &DR) {4909  // Print lengthier indentation to bring out-of-line with instructions.4910  Out << "    ";4911  printDbgRecord(DR);4912  Out << '\n';4913}4914 4915void AssemblyWriter::printDbgLabelRecord(const DbgLabelRecord &Label) {4916  auto WriterCtx = getContext();4917  Out << "#dbg_label(";4918  writeAsOperandInternal(Out, Label.getRawLabel(), WriterCtx, true);4919  Out << ", ";4920  writeAsOperandInternal(Out, Label.getDebugLoc(), WriterCtx, true);4921  Out << ")";4922}4923 4924void AssemblyWriter::printMetadataAttachments(4925    const SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs,4926    StringRef Separator) {4927  if (MDs.empty())4928    return;4929 4930  if (MDNames.empty())4931    MDs[0].second->getContext().getMDKindNames(MDNames);4932 4933  auto WriterCtx = getContext();4934  for (const auto &I : MDs) {4935    unsigned Kind = I.first;4936    Out << Separator;4937    if (Kind < MDNames.size()) {4938      Out << "!";4939      printMetadataIdentifier(MDNames[Kind], Out);4940    } else4941      Out << "!<unknown kind #" << Kind << ">";4942    Out << ' ';4943    writeAsOperandInternal(Out, I.second, WriterCtx);4944  }4945}4946 4947void AssemblyWriter::writeMDNode(unsigned Slot, const MDNode *Node) {4948  Out << '!' << Slot << " = ";4949  printMDNodeBody(Node);4950  Out << "\n";4951}4952 4953void AssemblyWriter::writeAllMDNodes() {4954  SmallVector<const MDNode *, 16> Nodes;4955  Nodes.resize(Machine.mdn_size());4956  for (auto &I : llvm::make_range(Machine.mdn_begin(), Machine.mdn_end()))4957    Nodes[I.second] = cast<MDNode>(I.first);4958 4959  for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {4960    writeMDNode(i, Nodes[i]);4961  }4962}4963 4964void AssemblyWriter::printMDNodeBody(const MDNode *Node) {4965  auto WriterCtx = getContext();4966  writeMDNodeBodyInternal(Out, Node, WriterCtx);4967}4968 4969void AssemblyWriter::writeAttribute(const Attribute &Attr, bool InAttrGroup) {4970  if (!Attr.isTypeAttribute()) {4971    Out << Attr.getAsString(InAttrGroup);4972    return;4973  }4974 4975  Out << Attribute::getNameFromAttrKind(Attr.getKindAsEnum());4976  if (Type *Ty = Attr.getValueAsType()) {4977    Out << '(';4978    TypePrinter.print(Ty, Out);4979    Out << ')';4980  }4981}4982 4983void AssemblyWriter::writeAttributeSet(const AttributeSet &AttrSet,4984                                       bool InAttrGroup) {4985  ListSeparator LS(" ");4986  for (const auto &Attr : AttrSet) {4987    Out << LS;4988    writeAttribute(Attr, InAttrGroup);4989  }4990}4991 4992void AssemblyWriter::writeAllAttributeGroups() {4993  std::vector<std::pair<AttributeSet, unsigned>> asVec;4994  asVec.resize(Machine.as_size());4995 4996  for (auto &I : llvm::make_range(Machine.as_begin(), Machine.as_end()))4997    asVec[I.second] = I;4998 4999  for (const auto &I : asVec)5000    Out << "attributes #" << I.second << " = { "5001        << I.first.getAsString(true) << " }\n";5002}5003 5004void AssemblyWriter::printUseListOrder(const Value *V,5005                                       ArrayRef<unsigned> Shuffle) {5006  bool IsInFunction = Machine.getFunction();5007  if (IsInFunction)5008    Out << "  ";5009 5010  Out << "uselistorder";5011  if (const BasicBlock *BB = IsInFunction ? nullptr : dyn_cast<BasicBlock>(V)) {5012    Out << "_bb ";5013    writeOperand(BB->getParent(), false);5014    Out << ", ";5015    writeOperand(BB, false);5016  } else {5017    Out << " ";5018    writeOperand(V, true);5019  }5020 5021  assert(Shuffle.size() >= 2 && "Shuffle too small");5022  Out << ", { " << llvm::interleaved(Shuffle) << " }\n";5023}5024 5025void AssemblyWriter::printUseLists(const Function *F) {5026  auto It = UseListOrders.find(F);5027  if (It == UseListOrders.end())5028    return;5029 5030  Out << "\n; uselistorder directives\n";5031  for (const auto &Pair : It->second)5032    printUseListOrder(Pair.first, Pair.second);5033}5034 5035//===----------------------------------------------------------------------===//5036//                       External Interface declarations5037//===----------------------------------------------------------------------===//5038 5039void Function::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW,5040                     bool ShouldPreserveUseListOrder, bool IsForDebug) const {5041  SlotTracker SlotTable(this->getParent());5042  formatted_raw_ostream OS(ROS);5043  AssemblyWriter W(OS, SlotTable, this->getParent(), AAW, IsForDebug,5044                   ShouldPreserveUseListOrder);5045  W.printFunction(this);5046}5047 5048void BasicBlock::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW,5049                     bool ShouldPreserveUseListOrder,5050                     bool IsForDebug) const {5051  SlotTracker SlotTable(this->getParent());5052  formatted_raw_ostream OS(ROS);5053  AssemblyWriter W(OS, SlotTable, this->getModule(), AAW,5054                   IsForDebug,5055                   ShouldPreserveUseListOrder);5056  W.printBasicBlock(this);5057}5058 5059void Module::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW,5060                   bool ShouldPreserveUseListOrder, bool IsForDebug) const {5061  SlotTracker SlotTable(this);5062  formatted_raw_ostream OS(ROS);5063  AssemblyWriter W(OS, SlotTable, this, AAW, IsForDebug,5064                   ShouldPreserveUseListOrder);5065  W.printModule(this);5066}5067 5068void NamedMDNode::print(raw_ostream &ROS, bool IsForDebug) const {5069  SlotTracker SlotTable(getParent());5070  formatted_raw_ostream OS(ROS);5071  AssemblyWriter W(OS, SlotTable, getParent(), nullptr, IsForDebug);5072  W.printNamedMDNode(this);5073}5074 5075void NamedMDNode::print(raw_ostream &ROS, ModuleSlotTracker &MST,5076                        bool IsForDebug) const {5077  std::optional<SlotTracker> LocalST;5078  SlotTracker *SlotTable;5079  if (auto *ST = MST.getMachine())5080    SlotTable = ST;5081  else {5082    LocalST.emplace(getParent());5083    SlotTable = &*LocalST;5084  }5085 5086  formatted_raw_ostream OS(ROS);5087  AssemblyWriter W(OS, *SlotTable, getParent(), nullptr, IsForDebug);5088  W.printNamedMDNode(this);5089}5090 5091void Comdat::print(raw_ostream &ROS, bool /*IsForDebug*/) const {5092  printLLVMName(ROS, getName(), ComdatPrefix);5093  ROS << " = comdat ";5094 5095  switch (getSelectionKind()) {5096  case Comdat::Any:5097    ROS << "any";5098    break;5099  case Comdat::ExactMatch:5100    ROS << "exactmatch";5101    break;5102  case Comdat::Largest:5103    ROS << "largest";5104    break;5105  case Comdat::NoDeduplicate:5106    ROS << "nodeduplicate";5107    break;5108  case Comdat::SameSize:5109    ROS << "samesize";5110    break;5111  }5112 5113  ROS << '\n';5114}5115 5116void Type::print(raw_ostream &OS, bool /*IsForDebug*/, bool NoDetails) const {5117  TypePrinting TP;5118  TP.print(const_cast<Type*>(this), OS);5119 5120  if (NoDetails)5121    return;5122 5123  // If the type is a named struct type, print the body as well.5124  if (auto *STy = dyn_cast<StructType>(const_cast<Type *>(this)))5125    if (!STy->isLiteral()) {5126      OS << " = type ";5127      TP.printStructBody(STy, OS);5128    }5129}5130 5131static bool isReferencingMDNode(const Instruction &I) {5132  if (const auto *CI = dyn_cast<CallInst>(&I))5133    if (Function *F = CI->getCalledFunction())5134      if (F->isIntrinsic())5135        for (auto &Op : I.operands())5136          if (auto *V = dyn_cast_or_null<MetadataAsValue>(Op))5137            if (isa<MDNode>(V->getMetadata()))5138              return true;5139  return false;5140}5141 5142void DbgMarker::print(raw_ostream &ROS, bool IsForDebug) const {5143 5144  ModuleSlotTracker MST(getModuleFromDPI(this), true);5145  print(ROS, MST, IsForDebug);5146}5147 5148void DbgVariableRecord::print(raw_ostream &ROS, bool IsForDebug) const {5149 5150  ModuleSlotTracker MST(getModuleFromDPI(this), true);5151  print(ROS, MST, IsForDebug);5152}5153 5154void DbgMarker::print(raw_ostream &ROS, ModuleSlotTracker &MST,5155                      bool IsForDebug) const {5156  formatted_raw_ostream OS(ROS);5157  SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));5158  SlotTracker &SlotTable =5159      MST.getMachine() ? *MST.getMachine() : EmptySlotTable;5160  const Function *F = getParent() ? getParent()->getParent() : nullptr;5161  if (F)5162    MST.incorporateFunction(*F);5163  AssemblyWriter W(OS, SlotTable, getModuleFromDPI(this), nullptr, IsForDebug);5164  W.printDbgMarker(*this);5165}5166 5167void DbgLabelRecord::print(raw_ostream &ROS, bool IsForDebug) const {5168 5169  ModuleSlotTracker MST(getModuleFromDPI(this), true);5170  print(ROS, MST, IsForDebug);5171}5172 5173void DbgVariableRecord::print(raw_ostream &ROS, ModuleSlotTracker &MST,5174                              bool IsForDebug) const {5175  formatted_raw_ostream OS(ROS);5176  SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));5177  SlotTracker &SlotTable =5178      MST.getMachine() ? *MST.getMachine() : EmptySlotTable;5179  const Function *F = Marker && Marker->getParent()5180                          ? Marker->getParent()->getParent()5181                          : nullptr;5182  if (F)5183    MST.incorporateFunction(*F);5184  AssemblyWriter W(OS, SlotTable, getModuleFromDPI(this), nullptr, IsForDebug);5185  W.printDbgVariableRecord(*this);5186}5187 5188void DbgLabelRecord::print(raw_ostream &ROS, ModuleSlotTracker &MST,5189                           bool IsForDebug) const {5190  formatted_raw_ostream OS(ROS);5191  SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));5192  SlotTracker &SlotTable =5193      MST.getMachine() ? *MST.getMachine() : EmptySlotTable;5194  const Function *F =5195      Marker->getParent() ? Marker->getParent()->getParent() : nullptr;5196  if (F)5197    MST.incorporateFunction(*F);5198 5199  AssemblyWriter W(OS, SlotTable, getModuleFromDPI(this), nullptr, IsForDebug);5200  W.printDbgLabelRecord(*this);5201}5202 5203void Value::print(raw_ostream &ROS, bool IsForDebug) const {5204  bool ShouldInitializeAllMetadata = false;5205  if (auto *I = dyn_cast<Instruction>(this))5206    ShouldInitializeAllMetadata = isReferencingMDNode(*I);5207  else if (isa<Function>(this) || isa<MetadataAsValue>(this))5208    ShouldInitializeAllMetadata = true;5209 5210  ModuleSlotTracker MST(getModuleFromVal(this), ShouldInitializeAllMetadata);5211  print(ROS, MST, IsForDebug);5212}5213 5214void Value::print(raw_ostream &ROS, ModuleSlotTracker &MST,5215                  bool IsForDebug) const {5216  formatted_raw_ostream OS(ROS);5217  SlotTracker EmptySlotTable(static_cast<const Module *>(nullptr));5218  SlotTracker &SlotTable =5219      MST.getMachine() ? *MST.getMachine() : EmptySlotTable;5220  auto IncorporateFunction = [&](const Function *F) {5221    if (F)5222      MST.incorporateFunction(*F);5223  };5224 5225  if (const auto *I = dyn_cast<Instruction>(this)) {5226    IncorporateFunction(I->getParent() ? I->getParent()->getParent() : nullptr);5227    AssemblyWriter W(OS, SlotTable, getModuleFromVal(I), nullptr, IsForDebug);5228    W.printInstruction(*I);5229  } else if (const auto *BB = dyn_cast<BasicBlock>(this)) {5230    IncorporateFunction(BB->getParent());5231    AssemblyWriter W(OS, SlotTable, getModuleFromVal(BB), nullptr, IsForDebug);5232    W.printBasicBlock(BB);5233  } else if (const auto *GV = dyn_cast<GlobalValue>(this)) {5234    AssemblyWriter W(OS, SlotTable, GV->getParent(), nullptr, IsForDebug);5235    if (const auto *V = dyn_cast<GlobalVariable>(GV))5236      W.printGlobal(V);5237    else if (const auto *F = dyn_cast<Function>(GV))5238      W.printFunction(F);5239    else if (const auto *A = dyn_cast<GlobalAlias>(GV))5240      W.printAlias(A);5241    else if (const auto *I = dyn_cast<GlobalIFunc>(GV))5242      W.printIFunc(I);5243    else5244      llvm_unreachable("Unknown GlobalValue to print out!");5245  } else if (const auto *V = dyn_cast<MetadataAsValue>(this)) {5246    V->getMetadata()->print(ROS, MST, getModuleFromVal(V));5247  } else if (const auto *C = dyn_cast<Constant>(this)) {5248    TypePrinting TypePrinter;5249    TypePrinter.print(C->getType(), OS);5250    OS << ' ';5251    AsmWriterContext WriterCtx(&TypePrinter, MST.getMachine());5252    writeConstantInternal(OS, C, WriterCtx);5253  } else if (isa<InlineAsm>(this) || isa<Argument>(this)) {5254    this->printAsOperand(OS, /* PrintType */ true, MST);5255  } else {5256    llvm_unreachable("Unknown value to print out!");5257  }5258}5259 5260/// Print without a type, skipping the TypePrinting object.5261///5262/// \return \c true iff printing was successful.5263static bool printWithoutType(const Value &V, raw_ostream &O,5264                             SlotTracker *Machine, const Module *M) {5265  if (V.hasName() || isa<GlobalValue>(V) ||5266      (!isa<Constant>(V) && !isa<MetadataAsValue>(V))) {5267    AsmWriterContext WriterCtx(nullptr, Machine, M);5268    writeAsOperandInternal(O, &V, WriterCtx);5269    return true;5270  }5271  return false;5272}5273 5274static void printAsOperandImpl(const Value &V, raw_ostream &O, bool PrintType,5275                               ModuleSlotTracker &MST) {5276  TypePrinting TypePrinter(MST.getModule());5277  AsmWriterContext WriterCtx(&TypePrinter, MST.getMachine(), MST.getModule());5278  writeAsOperandInternal(O, &V, WriterCtx, PrintType);5279}5280 5281void Value::printAsOperand(raw_ostream &O, bool PrintType,5282                           const Module *M) const {5283  if (!M)5284    M = getModuleFromVal(this);5285 5286  if (!PrintType)5287    if (printWithoutType(*this, O, nullptr, M))5288      return;5289 5290  SlotTracker Machine(5291      M, /* ShouldInitializeAllMetadata */ isa<MetadataAsValue>(this));5292  ModuleSlotTracker MST(Machine, M);5293  printAsOperandImpl(*this, O, PrintType, MST);5294}5295 5296void Value::printAsOperand(raw_ostream &O, bool PrintType,5297                           ModuleSlotTracker &MST) const {5298  if (!PrintType)5299    if (printWithoutType(*this, O, MST.getMachine(), MST.getModule()))5300      return;5301 5302  printAsOperandImpl(*this, O, PrintType, MST);5303}5304 5305/// Recursive version of printMetadataImpl.5306static void printMetadataImplRec(raw_ostream &ROS, const Metadata &MD,5307                                 AsmWriterContext &WriterCtx) {5308  formatted_raw_ostream OS(ROS);5309  writeAsOperandInternal(OS, &MD, WriterCtx, /* FromValue */ true);5310 5311  auto *N = dyn_cast<MDNode>(&MD);5312  if (!N || isa<DIExpression>(MD))5313    return;5314 5315  OS << " = ";5316  writeMDNodeBodyInternal(OS, N, WriterCtx);5317}5318 5319namespace {5320struct MDTreeAsmWriterContext : public AsmWriterContext {5321  unsigned Level;5322  // {Level, Printed string}5323  using EntryTy = std::pair<unsigned, std::string>;5324  SmallVector<EntryTy, 4> Buffer;5325 5326  // Used to break the cycle in case there is any.5327  SmallPtrSet<const Metadata *, 4> Visited;5328 5329  raw_ostream &MainOS;5330 5331  MDTreeAsmWriterContext(TypePrinting *TP, SlotTracker *ST, const Module *M,5332                         raw_ostream &OS, const Metadata *InitMD)5333      : AsmWriterContext(TP, ST, M), Level(0U), Visited({InitMD}), MainOS(OS) {}5334 5335  void onWriteMetadataAsOperand(const Metadata *MD) override {5336    if (!Visited.insert(MD).second)5337      return;5338 5339    std::string Str;5340    raw_string_ostream SS(Str);5341    ++Level;5342    // A placeholder entry to memorize the correct5343    // position in buffer.5344    Buffer.emplace_back(std::make_pair(Level, ""));5345    unsigned InsertIdx = Buffer.size() - 1;5346 5347    printMetadataImplRec(SS, *MD, *this);5348    Buffer[InsertIdx].second = std::move(SS.str());5349    --Level;5350  }5351 5352  ~MDTreeAsmWriterContext() override {5353    for (const auto &Entry : Buffer) {5354      MainOS << "\n";5355      unsigned NumIndent = Entry.first * 2U;5356      MainOS.indent(NumIndent) << Entry.second;5357    }5358  }5359};5360} // end anonymous namespace5361 5362static void printMetadataImpl(raw_ostream &ROS, const Metadata &MD,5363                              ModuleSlotTracker &MST, const Module *M,5364                              bool OnlyAsOperand, bool PrintAsTree = false) {5365  formatted_raw_ostream OS(ROS);5366 5367  TypePrinting TypePrinter(M);5368 5369  std::unique_ptr<AsmWriterContext> WriterCtx;5370  if (PrintAsTree && !OnlyAsOperand)5371    WriterCtx = std::make_unique<MDTreeAsmWriterContext>(5372        &TypePrinter, MST.getMachine(), M, OS, &MD);5373  else5374    WriterCtx =5375        std::make_unique<AsmWriterContext>(&TypePrinter, MST.getMachine(), M);5376 5377  writeAsOperandInternal(OS, &MD, *WriterCtx, /* FromValue */ true);5378 5379  auto *N = dyn_cast<MDNode>(&MD);5380  if (OnlyAsOperand || !N || isa<DIExpression>(MD))5381    return;5382 5383  OS << " = ";5384  writeMDNodeBodyInternal(OS, N, *WriterCtx);5385}5386 5387void Metadata::printAsOperand(raw_ostream &OS, const Module *M) const {5388  ModuleSlotTracker MST(M, isa<MDNode>(this));5389  printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ true);5390}5391 5392void Metadata::printAsOperand(raw_ostream &OS, ModuleSlotTracker &MST,5393                              const Module *M) const {5394  printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ true);5395}5396 5397void Metadata::print(raw_ostream &OS, const Module *M,5398                     bool /*IsForDebug*/) const {5399  ModuleSlotTracker MST(M, isa<MDNode>(this));5400  printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false);5401}5402 5403void Metadata::print(raw_ostream &OS, ModuleSlotTracker &MST,5404                     const Module *M, bool /*IsForDebug*/) const {5405  printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false);5406}5407 5408void MDNode::printTree(raw_ostream &OS, const Module *M) const {5409  ModuleSlotTracker MST(M, true);5410  printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false,5411                    /*PrintAsTree=*/true);5412}5413 5414void MDNode::printTree(raw_ostream &OS, ModuleSlotTracker &MST,5415                       const Module *M) const {5416  printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false,5417                    /*PrintAsTree=*/true);5418}5419 5420void ModuleSummaryIndex::print(raw_ostream &ROS, bool IsForDebug) const {5421  SlotTracker SlotTable(this);5422  formatted_raw_ostream OS(ROS);5423  AssemblyWriter W(OS, SlotTable, this, IsForDebug);5424  W.printModuleSummaryIndex();5425}5426 5427void ModuleSlotTracker::collectMDNodes(MachineMDNodeListType &L, unsigned LB,5428                                       unsigned UB) const {5429  SlotTracker *ST = MachineStorage.get();5430  if (!ST)5431    return;5432 5433  for (auto &I : llvm::make_range(ST->mdn_begin(), ST->mdn_end()))5434    if (I.second >= LB && I.second < UB)5435      L.push_back(std::make_pair(I.second, I.first));5436}5437 5438#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)5439// Value::dump - allow easy printing of Values from the debugger.5440LLVM_DUMP_METHOD5441void Value::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }5442 5443// Value::dump - allow easy printing of Values from the debugger.5444LLVM_DUMP_METHOD5445void DbgMarker::dump() const {5446  print(dbgs(), /*IsForDebug=*/true);5447  dbgs() << '\n';5448}5449 5450// Value::dump - allow easy printing of Values from the debugger.5451LLVM_DUMP_METHOD5452void DbgRecord::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }5453 5454// Type::dump - allow easy printing of Types from the debugger.5455LLVM_DUMP_METHOD5456void Type::dump() const { print(dbgs(), /*IsForDebug=*/true); dbgs() << '\n'; }5457 5458// Module::dump() - Allow printing of Modules from the debugger.5459LLVM_DUMP_METHOD5460void Module::dump() const {5461  print(dbgs(), nullptr,5462        /*ShouldPreserveUseListOrder=*/false, /*IsForDebug=*/true);5463}5464 5465// Allow printing of Comdats from the debugger.5466LLVM_DUMP_METHOD5467void Comdat::dump() const { print(dbgs(), /*IsForDebug=*/true); }5468 5469// NamedMDNode::dump() - Allow printing of NamedMDNodes from the debugger.5470LLVM_DUMP_METHOD5471void NamedMDNode::dump() const { print(dbgs(), /*IsForDebug=*/true); }5472 5473LLVM_DUMP_METHOD5474void Metadata::dump() const { dump(nullptr); }5475 5476LLVM_DUMP_METHOD5477void Metadata::dump(const Module *M) const {5478  print(dbgs(), M, /*IsForDebug=*/true);5479  dbgs() << '\n';5480}5481 5482LLVM_DUMP_METHOD5483void MDNode::dumpTree() const { dumpTree(nullptr); }5484 5485LLVM_DUMP_METHOD5486void MDNode::dumpTree(const Module *M) const {5487  printTree(dbgs(), M);5488  dbgs() << '\n';5489}5490 5491// Allow printing of ModuleSummaryIndex from the debugger.5492LLVM_DUMP_METHOD5493void ModuleSummaryIndex::dump() const { print(dbgs(), /*IsForDebug=*/true); }5494#endif5495