brintos

brintos / llvm-project-archived public Read only

0
0
Text · 232.2 KiB · 0dd3fa3 Raw
5964 lines · cpp
1//===- Bitcode/Writer/BitcodeWriter.cpp - Bitcode Writer ------------------===//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// Bitcode writer implementation.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/Bitcode/BitcodeWriter.h"14#include "ValueEnumerator.h"15#include "llvm/ADT/APFloat.h"16#include "llvm/ADT/APInt.h"17#include "llvm/ADT/ArrayRef.h"18#include "llvm/ADT/DenseMap.h"19#include "llvm/ADT/STLExtras.h"20#include "llvm/ADT/SetVector.h"21#include "llvm/ADT/SmallPtrSet.h"22#include "llvm/ADT/SmallString.h"23#include "llvm/ADT/SmallVector.h"24#include "llvm/ADT/StringMap.h"25#include "llvm/ADT/StringRef.h"26#include "llvm/Analysis/MemoryProfileInfo.h"27#include "llvm/BinaryFormat/Dwarf.h"28#include "llvm/Bitcode/BitcodeCommon.h"29#include "llvm/Bitcode/BitcodeReader.h"30#include "llvm/Bitcode/LLVMBitCodes.h"31#include "llvm/Bitstream/BitCodes.h"32#include "llvm/Bitstream/BitstreamWriter.h"33#include "llvm/Config/llvm-config.h"34#include "llvm/IR/Attributes.h"35#include "llvm/IR/BasicBlock.h"36#include "llvm/IR/Comdat.h"37#include "llvm/IR/Constant.h"38#include "llvm/IR/ConstantRangeList.h"39#include "llvm/IR/Constants.h"40#include "llvm/IR/DebugInfoMetadata.h"41#include "llvm/IR/DebugLoc.h"42#include "llvm/IR/DerivedTypes.h"43#include "llvm/IR/Function.h"44#include "llvm/IR/GlobalAlias.h"45#include "llvm/IR/GlobalIFunc.h"46#include "llvm/IR/GlobalObject.h"47#include "llvm/IR/GlobalValue.h"48#include "llvm/IR/GlobalVariable.h"49#include "llvm/IR/InlineAsm.h"50#include "llvm/IR/InstrTypes.h"51#include "llvm/IR/Instruction.h"52#include "llvm/IR/Instructions.h"53#include "llvm/IR/LLVMContext.h"54#include "llvm/IR/Metadata.h"55#include "llvm/IR/Module.h"56#include "llvm/IR/ModuleSummaryIndex.h"57#include "llvm/IR/Operator.h"58#include "llvm/IR/Type.h"59#include "llvm/IR/UseListOrder.h"60#include "llvm/IR/Value.h"61#include "llvm/IR/ValueSymbolTable.h"62#include "llvm/MC/StringTableBuilder.h"63#include "llvm/MC/TargetRegistry.h"64#include "llvm/Object/IRSymtab.h"65#include "llvm/ProfileData/MemProf.h"66#include "llvm/ProfileData/MemProfRadixTree.h"67#include "llvm/Support/AtomicOrdering.h"68#include "llvm/Support/Casting.h"69#include "llvm/Support/CommandLine.h"70#include "llvm/Support/Compiler.h"71#include "llvm/Support/Endian.h"72#include "llvm/Support/Error.h"73#include "llvm/Support/ErrorHandling.h"74#include "llvm/Support/MathExtras.h"75#include "llvm/Support/SHA1.h"76#include "llvm/Support/raw_ostream.h"77#include "llvm/TargetParser/Triple.h"78#include <algorithm>79#include <cassert>80#include <cstddef>81#include <cstdint>82#include <iterator>83#include <map>84#include <memory>85#include <optional>86#include <string>87#include <utility>88#include <vector>89 90using namespace llvm;91using namespace llvm::memprof;92 93static cl::opt<unsigned>94    IndexThreshold("bitcode-mdindex-threshold", cl::Hidden, cl::init(25),95                   cl::desc("Number of metadatas above which we emit an index "96                            "to enable lazy-loading"));97static cl::opt<uint32_t> FlushThreshold(98    "bitcode-flush-threshold", cl::Hidden, cl::init(512),99    cl::desc("The threshold (unit M) for flushing LLVM bitcode."));100 101static cl::opt<bool> WriteRelBFToSummary(102    "write-relbf-to-summary", cl::Hidden, cl::init(false),103    cl::desc("Write relative block frequency to function summary "));104 105// Since we only use the context information in the memprof summary records in106// the LTO backends to do assertion checking, save time and space by only107// serializing the context for non-NDEBUG builds.108// TODO: Currently this controls writing context of the allocation info records,109// which are larger and more expensive, but we should do this for the callsite110// records as well.111// FIXME: Convert to a const once this has undergone more sigificant testing.112static cl::opt<bool>113    CombinedIndexMemProfContext("combined-index-memprof-context", cl::Hidden,114#ifdef NDEBUG115                                cl::init(false),116#else117                                cl::init(true),118#endif119                                cl::desc(""));120 121static cl::opt<bool> PreserveBitcodeUseListOrder(122    "preserve-bc-uselistorder", cl::Hidden, cl::init(true),123    cl::desc("Preserve use-list order when writing LLVM bitcode."));124 125namespace llvm {126extern FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold;127}128 129namespace {130 131/// These are manifest constants used by the bitcode writer. They do not need to132/// be kept in sync with the reader, but need to be consistent within this file.133enum {134  // VALUE_SYMTAB_BLOCK abbrev id's.135  VST_ENTRY_8_ABBREV = bitc::FIRST_APPLICATION_ABBREV,136  VST_ENTRY_7_ABBREV,137  VST_ENTRY_6_ABBREV,138  VST_BBENTRY_6_ABBREV,139 140  // CONSTANTS_BLOCK abbrev id's.141  CONSTANTS_SETTYPE_ABBREV = bitc::FIRST_APPLICATION_ABBREV,142  CONSTANTS_INTEGER_ABBREV,143  CONSTANTS_CE_CAST_Abbrev,144  CONSTANTS_NULL_Abbrev,145 146  // FUNCTION_BLOCK abbrev id's.147  FUNCTION_INST_LOAD_ABBREV = bitc::FIRST_APPLICATION_ABBREV,148  FUNCTION_INST_STORE_ABBREV,149  FUNCTION_INST_UNOP_ABBREV,150  FUNCTION_INST_UNOP_FLAGS_ABBREV,151  FUNCTION_INST_BINOP_ABBREV,152  FUNCTION_INST_BINOP_FLAGS_ABBREV,153  FUNCTION_INST_CAST_ABBREV,154  FUNCTION_INST_CAST_FLAGS_ABBREV,155  FUNCTION_INST_RET_VOID_ABBREV,156  FUNCTION_INST_RET_VAL_ABBREV,157  FUNCTION_INST_BR_UNCOND_ABBREV,158  FUNCTION_INST_BR_COND_ABBREV,159  FUNCTION_INST_UNREACHABLE_ABBREV,160  FUNCTION_INST_GEP_ABBREV,161  FUNCTION_INST_CMP_ABBREV,162  FUNCTION_INST_CMP_FLAGS_ABBREV,163  FUNCTION_DEBUG_RECORD_VALUE_ABBREV,164  FUNCTION_DEBUG_LOC_ABBREV,165};166 167/// Abstract class to manage the bitcode writing, subclassed for each bitcode168/// file type.169class BitcodeWriterBase {170protected:171  /// The stream created and owned by the client.172  BitstreamWriter &Stream;173 174  StringTableBuilder &StrtabBuilder;175 176public:177  /// Constructs a BitcodeWriterBase object that writes to the provided178  /// \p Stream.179  BitcodeWriterBase(BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder)180      : Stream(Stream), StrtabBuilder(StrtabBuilder) {}181 182protected:183  void writeModuleVersion();184};185 186void BitcodeWriterBase::writeModuleVersion() {187  // VERSION: [version#]188  Stream.EmitRecord(bitc::MODULE_CODE_VERSION, ArrayRef<uint64_t>{2});189}190 191/// Base class to manage the module bitcode writing, currently subclassed for192/// ModuleBitcodeWriter and ThinLinkBitcodeWriter.193class ModuleBitcodeWriterBase : public BitcodeWriterBase {194protected:195  /// The Module to write to bitcode.196  const Module &M;197 198  /// Enumerates ids for all values in the module.199  ValueEnumerator VE;200 201  /// Optional per-module index to write for ThinLTO.202  const ModuleSummaryIndex *Index;203 204  /// Map that holds the correspondence between GUIDs in the summary index,205  /// that came from indirect call profiles, and a value id generated by this206  /// class to use in the VST and summary block records.207  std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;208 209  /// Tracks the last value id recorded in the GUIDToValueMap.210  unsigned GlobalValueId;211 212  /// Saves the offset of the VSTOffset record that must eventually be213  /// backpatched with the offset of the actual VST.214  uint64_t VSTOffsetPlaceholder = 0;215 216public:217  /// Constructs a ModuleBitcodeWriterBase object for the given Module,218  /// writing to the provided \p Buffer.219  ModuleBitcodeWriterBase(const Module &M, StringTableBuilder &StrtabBuilder,220                          BitstreamWriter &Stream,221                          bool ShouldPreserveUseListOrder,222                          const ModuleSummaryIndex *Index)223      : BitcodeWriterBase(Stream, StrtabBuilder), M(M),224        VE(M, PreserveBitcodeUseListOrder.getNumOccurrences()225                  ? PreserveBitcodeUseListOrder226                  : ShouldPreserveUseListOrder),227        Index(Index) {228    // Assign ValueIds to any callee values in the index that came from229    // indirect call profiles and were recorded as a GUID not a Value*230    // (which would have been assigned an ID by the ValueEnumerator).231    // The starting ValueId is just after the number of values in the232    // ValueEnumerator, so that they can be emitted in the VST.233    GlobalValueId = VE.getValues().size();234    if (!Index)235      return;236    for (const auto &GUIDSummaryLists : *Index)237      // Examine all summaries for this GUID.238      for (auto &Summary : GUIDSummaryLists.second.getSummaryList())239        if (auto FS = dyn_cast<FunctionSummary>(Summary.get())) {240          // For each call in the function summary, see if the call241          // is to a GUID (which means it is for an indirect call,242          // otherwise we would have a Value for it). If so, synthesize243          // a value id.244          for (auto &CallEdge : FS->calls())245            if (!CallEdge.first.haveGVs() || !CallEdge.first.getValue())246              assignValueId(CallEdge.first.getGUID());247 248          // For each referenced variables in the function summary, see if the249          // variable is represented by a GUID (as opposed to a symbol to250          // declarations or definitions in the module). If so, synthesize a251          // value id.252          for (auto &RefEdge : FS->refs())253            if (!RefEdge.haveGVs() || !RefEdge.getValue())254              assignValueId(RefEdge.getGUID());255        }256  }257 258protected:259  void writePerModuleGlobalValueSummary();260 261private:262  void writePerModuleFunctionSummaryRecord(263      SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,264      unsigned ValueID, unsigned FSCallsAbbrev, unsigned FSCallsProfileAbbrev,265      unsigned CallsiteAbbrev, unsigned AllocAbbrev, unsigned ContextIdAbbvId,266      const Function &F, DenseMap<CallStackId, LinearCallStackId> &CallStackPos,267      CallStackId &CallStackCount);268  void writeModuleLevelReferences(const GlobalVariable &V,269                                  SmallVector<uint64_t, 64> &NameVals,270                                  unsigned FSModRefsAbbrev,271                                  unsigned FSModVTableRefsAbbrev);272 273  void assignValueId(GlobalValue::GUID ValGUID) {274    GUIDToValueIdMap[ValGUID] = ++GlobalValueId;275  }276 277  unsigned getValueId(GlobalValue::GUID ValGUID) {278    const auto &VMI = GUIDToValueIdMap.find(ValGUID);279    // Expect that any GUID value had a value Id assigned by an280    // earlier call to assignValueId.281    assert(VMI != GUIDToValueIdMap.end() &&282           "GUID does not have assigned value Id");283    return VMI->second;284  }285 286  // Helper to get the valueId for the type of value recorded in VI.287  unsigned getValueId(ValueInfo VI) {288    if (!VI.haveGVs() || !VI.getValue())289      return getValueId(VI.getGUID());290    return VE.getValueID(VI.getValue());291  }292 293  std::map<GlobalValue::GUID, unsigned> &valueIds() { return GUIDToValueIdMap; }294};295 296/// Class to manage the bitcode writing for a module.297class ModuleBitcodeWriter : public ModuleBitcodeWriterBase {298  /// True if a module hash record should be written.299  bool GenerateHash;300 301  /// If non-null, when GenerateHash is true, the resulting hash is written302  /// into ModHash.303  ModuleHash *ModHash;304 305  SHA1 Hasher;306 307  /// The start bit of the identification block.308  uint64_t BitcodeStartBit;309 310public:311  /// Constructs a ModuleBitcodeWriter object for the given Module,312  /// writing to the provided \p Buffer.313  ModuleBitcodeWriter(const Module &M, StringTableBuilder &StrtabBuilder,314                      BitstreamWriter &Stream, bool ShouldPreserveUseListOrder,315                      const ModuleSummaryIndex *Index, bool GenerateHash,316                      ModuleHash *ModHash = nullptr)317      : ModuleBitcodeWriterBase(M, StrtabBuilder, Stream,318                                ShouldPreserveUseListOrder, Index),319        GenerateHash(GenerateHash), ModHash(ModHash),320        BitcodeStartBit(Stream.GetCurrentBitNo()) {}321 322  /// Emit the current module to the bitstream.323  void write();324 325private:326  uint64_t bitcodeStartBit() { return BitcodeStartBit; }327 328  size_t addToStrtab(StringRef Str);329 330  void writeAttributeGroupTable();331  void writeAttributeTable();332  void writeTypeTable();333  void writeComdats();334  void writeValueSymbolTableForwardDecl();335  void writeModuleInfo();336  void writeValueAsMetadata(const ValueAsMetadata *MD,337                            SmallVectorImpl<uint64_t> &Record);338  void writeMDTuple(const MDTuple *N, SmallVectorImpl<uint64_t> &Record,339                    unsigned Abbrev);340  unsigned createDILocationAbbrev();341  void writeDILocation(const DILocation *N, SmallVectorImpl<uint64_t> &Record,342                       unsigned &Abbrev);343  unsigned createGenericDINodeAbbrev();344  void writeGenericDINode(const GenericDINode *N,345                          SmallVectorImpl<uint64_t> &Record, unsigned &Abbrev);346  void writeDISubrange(const DISubrange *N, SmallVectorImpl<uint64_t> &Record,347                       unsigned Abbrev);348  void writeDIGenericSubrange(const DIGenericSubrange *N,349                              SmallVectorImpl<uint64_t> &Record,350                              unsigned Abbrev);351  void writeDIEnumerator(const DIEnumerator *N,352                         SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);353  void writeDIBasicType(const DIBasicType *N, SmallVectorImpl<uint64_t> &Record,354                        unsigned Abbrev);355  void writeDIFixedPointType(const DIFixedPointType *N,356                             SmallVectorImpl<uint64_t> &Record,357                             unsigned Abbrev);358  void writeDIStringType(const DIStringType *N,359                         SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);360  void writeDIDerivedType(const DIDerivedType *N,361                          SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);362  void writeDISubrangeType(const DISubrangeType *N,363                           SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);364  void writeDICompositeType(const DICompositeType *N,365                            SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);366  void writeDISubroutineType(const DISubroutineType *N,367                             SmallVectorImpl<uint64_t> &Record,368                             unsigned Abbrev);369  void writeDIFile(const DIFile *N, SmallVectorImpl<uint64_t> &Record,370                   unsigned Abbrev);371  void writeDICompileUnit(const DICompileUnit *N,372                          SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);373  void writeDISubprogram(const DISubprogram *N,374                         SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);375  void writeDILexicalBlock(const DILexicalBlock *N,376                           SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);377  void writeDILexicalBlockFile(const DILexicalBlockFile *N,378                               SmallVectorImpl<uint64_t> &Record,379                               unsigned Abbrev);380  void writeDICommonBlock(const DICommonBlock *N,381                          SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);382  void writeDINamespace(const DINamespace *N, SmallVectorImpl<uint64_t> &Record,383                        unsigned Abbrev);384  void writeDIMacro(const DIMacro *N, SmallVectorImpl<uint64_t> &Record,385                    unsigned Abbrev);386  void writeDIMacroFile(const DIMacroFile *N, SmallVectorImpl<uint64_t> &Record,387                        unsigned Abbrev);388  void writeDIArgList(const DIArgList *N, SmallVectorImpl<uint64_t> &Record);389  void writeDIModule(const DIModule *N, SmallVectorImpl<uint64_t> &Record,390                     unsigned Abbrev);391  void writeDIAssignID(const DIAssignID *N, SmallVectorImpl<uint64_t> &Record,392                       unsigned Abbrev);393  void writeDITemplateTypeParameter(const DITemplateTypeParameter *N,394                                    SmallVectorImpl<uint64_t> &Record,395                                    unsigned Abbrev);396  void writeDITemplateValueParameter(const DITemplateValueParameter *N,397                                     SmallVectorImpl<uint64_t> &Record,398                                     unsigned Abbrev);399  void writeDIGlobalVariable(const DIGlobalVariable *N,400                             SmallVectorImpl<uint64_t> &Record,401                             unsigned Abbrev);402  void writeDILocalVariable(const DILocalVariable *N,403                            SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);404  void writeDILabel(const DILabel *N,405                    SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);406  void writeDIExpression(const DIExpression *N,407                         SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);408  void writeDIGlobalVariableExpression(const DIGlobalVariableExpression *N,409                                       SmallVectorImpl<uint64_t> &Record,410                                       unsigned Abbrev);411  void writeDIObjCProperty(const DIObjCProperty *N,412                           SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);413  void writeDIImportedEntity(const DIImportedEntity *N,414                             SmallVectorImpl<uint64_t> &Record,415                             unsigned Abbrev);416  unsigned createNamedMetadataAbbrev();417  void writeNamedMetadata(SmallVectorImpl<uint64_t> &Record);418  unsigned createMetadataStringsAbbrev();419  void writeMetadataStrings(ArrayRef<const Metadata *> Strings,420                            SmallVectorImpl<uint64_t> &Record);421  void writeMetadataRecords(ArrayRef<const Metadata *> MDs,422                            SmallVectorImpl<uint64_t> &Record,423                            std::vector<unsigned> *MDAbbrevs = nullptr,424                            std::vector<uint64_t> *IndexPos = nullptr);425  void writeModuleMetadata();426  void writeFunctionMetadata(const Function &F);427  void writeFunctionMetadataAttachment(const Function &F);428  void pushGlobalMetadataAttachment(SmallVectorImpl<uint64_t> &Record,429                                    const GlobalObject &GO);430  void writeModuleMetadataKinds();431  void writeOperandBundleTags();432  void writeSyncScopeNames();433  void writeConstants(unsigned FirstVal, unsigned LastVal, bool isGlobal);434  void writeModuleConstants();435  bool pushValueAndType(const Value *V, unsigned InstID,436                        SmallVectorImpl<unsigned> &Vals);437  bool pushValueOrMetadata(const Value *V, unsigned InstID,438                           SmallVectorImpl<unsigned> &Vals);439  void writeOperandBundles(const CallBase &CB, unsigned InstID);440  void pushValue(const Value *V, unsigned InstID,441                 SmallVectorImpl<unsigned> &Vals);442  void pushValueSigned(const Value *V, unsigned InstID,443                       SmallVectorImpl<uint64_t> &Vals);444  void writeInstruction(const Instruction &I, unsigned InstID,445                        SmallVectorImpl<unsigned> &Vals);446  void writeFunctionLevelValueSymbolTable(const ValueSymbolTable &VST);447  void writeGlobalValueSymbolTable(448      DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);449  void writeUseList(UseListOrder &&Order);450  void writeUseListBlock(const Function *F);451  void452  writeFunction(const Function &F,453                DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);454  void writeBlockInfo();455  void writeModuleHash(StringRef View);456 457  unsigned getEncodedSyncScopeID(SyncScope::ID SSID) {458    return unsigned(SSID);459  }460 461  unsigned getEncodedAlign(MaybeAlign Alignment) { return encode(Alignment); }462};463 464/// Class to manage the bitcode writing for a combined index.465class IndexBitcodeWriter : public BitcodeWriterBase {466  /// The combined index to write to bitcode.467  const ModuleSummaryIndex &Index;468 469  /// When writing combined summaries, provides the set of global value470  /// summaries for which the value (function, function alias, etc) should be471  /// imported as a declaration.472  const GVSummaryPtrSet *DecSummaries = nullptr;473 474  /// When writing a subset of the index for distributed backends, client475  /// provides a map of modules to the corresponding GUIDs/summaries to write.476  const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex;477 478  /// Map that holds the correspondence between the GUID used in the combined479  /// index and a value id generated by this class to use in references.480  std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;481 482  // The stack ids used by this index, which will be a subset of those in483  // the full index in the case of distributed indexes.484  std::vector<uint64_t> StackIds;485 486  // Keep a map of the stack id indices used by records being written for this487  // index to the index of the corresponding stack id in the above StackIds488  // vector. Ensures we write each referenced stack id once.489  DenseMap<unsigned, unsigned> StackIdIndicesToIndex;490 491  /// Tracks the last value id recorded in the GUIDToValueMap.492  unsigned GlobalValueId = 0;493 494  /// Tracks the assignment of module paths in the module path string table to495  /// an id assigned for use in summary references to the module path.496  DenseMap<StringRef, uint64_t> ModuleIdMap;497 498public:499  /// Constructs a IndexBitcodeWriter object for the given combined index,500  /// writing to the provided \p Buffer. When writing a subset of the index501  /// for a distributed backend, provide a \p ModuleToSummariesForIndex map.502  /// If provided, \p DecSummaries specifies the set of summaries for which503  /// the corresponding functions or aliased functions should be imported as a504  /// declaration (but not definition) for each module.505  IndexBitcodeWriter(506      BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder,507      const ModuleSummaryIndex &Index,508      const GVSummaryPtrSet *DecSummaries = nullptr,509      const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex = nullptr)510      : BitcodeWriterBase(Stream, StrtabBuilder), Index(Index),511        DecSummaries(DecSummaries),512        ModuleToSummariesForIndex(ModuleToSummariesForIndex) {513 514    // See if the StackIdIndex was already added to the StackId map and515    // vector. If not, record it.516    auto RecordStackIdReference = [&](unsigned StackIdIndex) {517      // If the StackIdIndex is not yet in the map, the below insert ensures518      // that it will point to the new StackIds vector entry we push to just519      // below.520      auto Inserted =521          StackIdIndicesToIndex.insert({StackIdIndex, StackIds.size()});522      if (Inserted.second)523        StackIds.push_back(Index.getStackIdAtIndex(StackIdIndex));524    };525 526    // Assign unique value ids to all summaries to be written, for use527    // in writing out the call graph edges. Save the mapping from GUID528    // to the new global value id to use when writing those edges, which529    // are currently saved in the index in terms of GUID.530    forEachSummary([&](GVInfo I, bool IsAliasee) {531      GUIDToValueIdMap[I.first] = ++GlobalValueId;532      // If this is invoked for an aliasee, we want to record the above mapping,533      // but not the information needed for its summary entry (if the aliasee is534      // to be imported, we will invoke this separately with IsAliasee=false).535      if (IsAliasee)536        return;537      auto *FS = dyn_cast<FunctionSummary>(I.second);538      if (!FS)539        return;540      // Record all stack id indices actually used in the summary entries being541      // written, so that we can compact them in the case of distributed ThinLTO542      // indexes.543      for (auto &CI : FS->callsites()) {544        // If the stack id list is empty, this callsite info was synthesized for545        // a missing tail call frame. Ensure that the callee's GUID gets a value546        // id. Normally we only generate these for defined summaries, which in547        // the case of distributed ThinLTO is only the functions already defined548        // in the module or that we want to import. We don't bother to include549        // all the callee symbols as they aren't normally needed in the backend.550        // However, for the synthesized callsite infos we do need the callee551        // GUID in the backend so that we can correlate the identified callee552        // with this callsite info (which for non-tail calls is done by the553        // ordering of the callsite infos and verified via stack ids).554        if (CI.StackIdIndices.empty()) {555          GUIDToValueIdMap[CI.Callee.getGUID()] = ++GlobalValueId;556          continue;557        }558        for (auto Idx : CI.StackIdIndices)559          RecordStackIdReference(Idx);560      }561      if (CombinedIndexMemProfContext) {562        for (auto &AI : FS->allocs())563          for (auto &MIB : AI.MIBs)564            for (auto Idx : MIB.StackIdIndices)565              RecordStackIdReference(Idx);566      }567    });568  }569 570  /// The below iterator returns the GUID and associated summary.571  using GVInfo = std::pair<GlobalValue::GUID, GlobalValueSummary *>;572 573  /// Calls the callback for each value GUID and summary to be written to574  /// bitcode. This hides the details of whether they are being pulled from the575  /// entire index or just those in a provided ModuleToSummariesForIndex map.576  template<typename Functor>577  void forEachSummary(Functor Callback) {578    if (ModuleToSummariesForIndex) {579      for (auto &M : *ModuleToSummariesForIndex)580        for (auto &Summary : M.second) {581          Callback(Summary, false);582          // Ensure aliasee is handled, e.g. for assigning a valueId,583          // even if we are not importing the aliasee directly (the584          // imported alias will contain a copy of aliasee).585          if (auto *AS = dyn_cast<AliasSummary>(Summary.getSecond()))586            Callback({AS->getAliaseeGUID(), &AS->getAliasee()}, true);587        }588    } else {589      for (auto &Summaries : Index)590        for (auto &Summary : Summaries.second.getSummaryList())591          Callback({Summaries.first, Summary.get()}, false);592    }593  }594 595  /// Calls the callback for each entry in the modulePaths StringMap that596  /// should be written to the module path string table. This hides the details597  /// of whether they are being pulled from the entire index or just those in a598  /// provided ModuleToSummariesForIndex map.599  template <typename Functor> void forEachModule(Functor Callback) {600    if (ModuleToSummariesForIndex) {601      for (const auto &M : *ModuleToSummariesForIndex) {602        const auto &MPI = Index.modulePaths().find(M.first);603        if (MPI == Index.modulePaths().end()) {604          // This should only happen if the bitcode file was empty, in which605          // case we shouldn't be importing (the ModuleToSummariesForIndex606          // would only include the module we are writing and index for).607          assert(ModuleToSummariesForIndex->size() == 1);608          continue;609        }610        Callback(*MPI);611      }612    } else {613      // Since StringMap iteration order isn't guaranteed, order by path string614      // first.615      // FIXME: Make this a vector of StringMapEntry instead to avoid the later616      // map lookup.617      std::vector<StringRef> ModulePaths;618      for (auto &[ModPath, _] : Index.modulePaths())619        ModulePaths.push_back(ModPath);620      llvm::sort(ModulePaths);621      for (auto &ModPath : ModulePaths)622        Callback(*Index.modulePaths().find(ModPath));623    }624  }625 626  /// Main entry point for writing a combined index to bitcode.627  void write();628 629private:630  void writeModStrings();631  void writeCombinedGlobalValueSummary();632 633  std::optional<unsigned> getValueId(GlobalValue::GUID ValGUID) {634    auto VMI = GUIDToValueIdMap.find(ValGUID);635    if (VMI == GUIDToValueIdMap.end())636      return std::nullopt;637    return VMI->second;638  }639 640  std::map<GlobalValue::GUID, unsigned> &valueIds() { return GUIDToValueIdMap; }641};642 643} // end anonymous namespace644 645static unsigned getEncodedCastOpcode(unsigned Opcode) {646  switch (Opcode) {647  default: llvm_unreachable("Unknown cast instruction!");648  case Instruction::Trunc   : return bitc::CAST_TRUNC;649  case Instruction::ZExt    : return bitc::CAST_ZEXT;650  case Instruction::SExt    : return bitc::CAST_SEXT;651  case Instruction::FPToUI  : return bitc::CAST_FPTOUI;652  case Instruction::FPToSI  : return bitc::CAST_FPTOSI;653  case Instruction::UIToFP  : return bitc::CAST_UITOFP;654  case Instruction::SIToFP  : return bitc::CAST_SITOFP;655  case Instruction::FPTrunc : return bitc::CAST_FPTRUNC;656  case Instruction::FPExt   : return bitc::CAST_FPEXT;657  case Instruction::PtrToAddr: return bitc::CAST_PTRTOADDR;658  case Instruction::PtrToInt: return bitc::CAST_PTRTOINT;659  case Instruction::IntToPtr: return bitc::CAST_INTTOPTR;660  case Instruction::BitCast : return bitc::CAST_BITCAST;661  case Instruction::AddrSpaceCast: return bitc::CAST_ADDRSPACECAST;662  }663}664 665static unsigned getEncodedUnaryOpcode(unsigned Opcode) {666  switch (Opcode) {667  default: llvm_unreachable("Unknown binary instruction!");668  case Instruction::FNeg: return bitc::UNOP_FNEG;669  }670}671 672static unsigned getEncodedBinaryOpcode(unsigned Opcode) {673  switch (Opcode) {674  default: llvm_unreachable("Unknown binary instruction!");675  case Instruction::Add:676  case Instruction::FAdd: return bitc::BINOP_ADD;677  case Instruction::Sub:678  case Instruction::FSub: return bitc::BINOP_SUB;679  case Instruction::Mul:680  case Instruction::FMul: return bitc::BINOP_MUL;681  case Instruction::UDiv: return bitc::BINOP_UDIV;682  case Instruction::FDiv:683  case Instruction::SDiv: return bitc::BINOP_SDIV;684  case Instruction::URem: return bitc::BINOP_UREM;685  case Instruction::FRem:686  case Instruction::SRem: return bitc::BINOP_SREM;687  case Instruction::Shl:  return bitc::BINOP_SHL;688  case Instruction::LShr: return bitc::BINOP_LSHR;689  case Instruction::AShr: return bitc::BINOP_ASHR;690  case Instruction::And:  return bitc::BINOP_AND;691  case Instruction::Or:   return bitc::BINOP_OR;692  case Instruction::Xor:  return bitc::BINOP_XOR;693  }694}695 696static unsigned getEncodedRMWOperation(AtomicRMWInst::BinOp Op) {697  switch (Op) {698  default: llvm_unreachable("Unknown RMW operation!");699  case AtomicRMWInst::Xchg: return bitc::RMW_XCHG;700  case AtomicRMWInst::Add: return bitc::RMW_ADD;701  case AtomicRMWInst::Sub: return bitc::RMW_SUB;702  case AtomicRMWInst::And: return bitc::RMW_AND;703  case AtomicRMWInst::Nand: return bitc::RMW_NAND;704  case AtomicRMWInst::Or: return bitc::RMW_OR;705  case AtomicRMWInst::Xor: return bitc::RMW_XOR;706  case AtomicRMWInst::Max: return bitc::RMW_MAX;707  case AtomicRMWInst::Min: return bitc::RMW_MIN;708  case AtomicRMWInst::UMax: return bitc::RMW_UMAX;709  case AtomicRMWInst::UMin: return bitc::RMW_UMIN;710  case AtomicRMWInst::FAdd: return bitc::RMW_FADD;711  case AtomicRMWInst::FSub: return bitc::RMW_FSUB;712  case AtomicRMWInst::FMax: return bitc::RMW_FMAX;713  case AtomicRMWInst::FMin: return bitc::RMW_FMIN;714  case AtomicRMWInst::FMaximum:715    return bitc::RMW_FMAXIMUM;716  case AtomicRMWInst::FMinimum:717    return bitc::RMW_FMINIMUM;718  case AtomicRMWInst::UIncWrap:719    return bitc::RMW_UINC_WRAP;720  case AtomicRMWInst::UDecWrap:721    return bitc::RMW_UDEC_WRAP;722  case AtomicRMWInst::USubCond:723    return bitc::RMW_USUB_COND;724  case AtomicRMWInst::USubSat:725    return bitc::RMW_USUB_SAT;726  }727}728 729static unsigned getEncodedOrdering(AtomicOrdering Ordering) {730  switch (Ordering) {731  case AtomicOrdering::NotAtomic: return bitc::ORDERING_NOTATOMIC;732  case AtomicOrdering::Unordered: return bitc::ORDERING_UNORDERED;733  case AtomicOrdering::Monotonic: return bitc::ORDERING_MONOTONIC;734  case AtomicOrdering::Acquire: return bitc::ORDERING_ACQUIRE;735  case AtomicOrdering::Release: return bitc::ORDERING_RELEASE;736  case AtomicOrdering::AcquireRelease: return bitc::ORDERING_ACQREL;737  case AtomicOrdering::SequentiallyConsistent: return bitc::ORDERING_SEQCST;738  }739  llvm_unreachable("Invalid ordering");740}741 742static void writeStringRecord(BitstreamWriter &Stream, unsigned Code,743                              StringRef Str, unsigned AbbrevToUse) {744  SmallVector<unsigned, 64> Vals;745 746  // Code: [strchar x N]747  for (char C : Str) {748    if (AbbrevToUse && !BitCodeAbbrevOp::isChar6(C))749      AbbrevToUse = 0;750    Vals.push_back(C);751  }752 753  // Emit the finished record.754  Stream.EmitRecord(Code, Vals, AbbrevToUse);755}756 757static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) {758  switch (Kind) {759  case Attribute::Alignment:760    return bitc::ATTR_KIND_ALIGNMENT;761  case Attribute::AllocAlign:762    return bitc::ATTR_KIND_ALLOC_ALIGN;763  case Attribute::AllocSize:764    return bitc::ATTR_KIND_ALLOC_SIZE;765  case Attribute::AlwaysInline:766    return bitc::ATTR_KIND_ALWAYS_INLINE;767  case Attribute::Builtin:768    return bitc::ATTR_KIND_BUILTIN;769  case Attribute::ByVal:770    return bitc::ATTR_KIND_BY_VAL;771  case Attribute::Convergent:772    return bitc::ATTR_KIND_CONVERGENT;773  case Attribute::InAlloca:774    return bitc::ATTR_KIND_IN_ALLOCA;775  case Attribute::Cold:776    return bitc::ATTR_KIND_COLD;777  case Attribute::DisableSanitizerInstrumentation:778    return bitc::ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION;779  case Attribute::FnRetThunkExtern:780    return bitc::ATTR_KIND_FNRETTHUNK_EXTERN;781  case Attribute::Hot:782    return bitc::ATTR_KIND_HOT;783  case Attribute::ElementType:784    return bitc::ATTR_KIND_ELEMENTTYPE;785  case Attribute::HybridPatchable:786    return bitc::ATTR_KIND_HYBRID_PATCHABLE;787  case Attribute::InlineHint:788    return bitc::ATTR_KIND_INLINE_HINT;789  case Attribute::InReg:790    return bitc::ATTR_KIND_IN_REG;791  case Attribute::JumpTable:792    return bitc::ATTR_KIND_JUMP_TABLE;793  case Attribute::MinSize:794    return bitc::ATTR_KIND_MIN_SIZE;795  case Attribute::AllocatedPointer:796    return bitc::ATTR_KIND_ALLOCATED_POINTER;797  case Attribute::AllocKind:798    return bitc::ATTR_KIND_ALLOC_KIND;799  case Attribute::Memory:800    return bitc::ATTR_KIND_MEMORY;801  case Attribute::NoFPClass:802    return bitc::ATTR_KIND_NOFPCLASS;803  case Attribute::Naked:804    return bitc::ATTR_KIND_NAKED;805  case Attribute::Nest:806    return bitc::ATTR_KIND_NEST;807  case Attribute::NoAlias:808    return bitc::ATTR_KIND_NO_ALIAS;809  case Attribute::NoBuiltin:810    return bitc::ATTR_KIND_NO_BUILTIN;811  case Attribute::NoCallback:812    return bitc::ATTR_KIND_NO_CALLBACK;813  case Attribute::NoDivergenceSource:814    return bitc::ATTR_KIND_NO_DIVERGENCE_SOURCE;815  case Attribute::NoDuplicate:816    return bitc::ATTR_KIND_NO_DUPLICATE;817  case Attribute::NoFree:818    return bitc::ATTR_KIND_NOFREE;819  case Attribute::NoImplicitFloat:820    return bitc::ATTR_KIND_NO_IMPLICIT_FLOAT;821  case Attribute::NoInline:822    return bitc::ATTR_KIND_NO_INLINE;823  case Attribute::NoRecurse:824    return bitc::ATTR_KIND_NO_RECURSE;825  case Attribute::NoMerge:826    return bitc::ATTR_KIND_NO_MERGE;827  case Attribute::NonLazyBind:828    return bitc::ATTR_KIND_NON_LAZY_BIND;829  case Attribute::NonNull:830    return bitc::ATTR_KIND_NON_NULL;831  case Attribute::Dereferenceable:832    return bitc::ATTR_KIND_DEREFERENCEABLE;833  case Attribute::DereferenceableOrNull:834    return bitc::ATTR_KIND_DEREFERENCEABLE_OR_NULL;835  case Attribute::NoRedZone:836    return bitc::ATTR_KIND_NO_RED_ZONE;837  case Attribute::NoReturn:838    return bitc::ATTR_KIND_NO_RETURN;839  case Attribute::NoSync:840    return bitc::ATTR_KIND_NOSYNC;841  case Attribute::NoCfCheck:842    return bitc::ATTR_KIND_NOCF_CHECK;843  case Attribute::NoProfile:844    return bitc::ATTR_KIND_NO_PROFILE;845  case Attribute::SkipProfile:846    return bitc::ATTR_KIND_SKIP_PROFILE;847  case Attribute::NoUnwind:848    return bitc::ATTR_KIND_NO_UNWIND;849  case Attribute::NoSanitizeBounds:850    return bitc::ATTR_KIND_NO_SANITIZE_BOUNDS;851  case Attribute::NoSanitizeCoverage:852    return bitc::ATTR_KIND_NO_SANITIZE_COVERAGE;853  case Attribute::NullPointerIsValid:854    return bitc::ATTR_KIND_NULL_POINTER_IS_VALID;855  case Attribute::OptimizeForDebugging:856    return bitc::ATTR_KIND_OPTIMIZE_FOR_DEBUGGING;857  case Attribute::OptForFuzzing:858    return bitc::ATTR_KIND_OPT_FOR_FUZZING;859  case Attribute::OptimizeForSize:860    return bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE;861  case Attribute::OptimizeNone:862    return bitc::ATTR_KIND_OPTIMIZE_NONE;863  case Attribute::ReadNone:864    return bitc::ATTR_KIND_READ_NONE;865  case Attribute::ReadOnly:866    return bitc::ATTR_KIND_READ_ONLY;867  case Attribute::Returned:868    return bitc::ATTR_KIND_RETURNED;869  case Attribute::ReturnsTwice:870    return bitc::ATTR_KIND_RETURNS_TWICE;871  case Attribute::SExt:872    return bitc::ATTR_KIND_S_EXT;873  case Attribute::Speculatable:874    return bitc::ATTR_KIND_SPECULATABLE;875  case Attribute::StackAlignment:876    return bitc::ATTR_KIND_STACK_ALIGNMENT;877  case Attribute::StackProtect:878    return bitc::ATTR_KIND_STACK_PROTECT;879  case Attribute::StackProtectReq:880    return bitc::ATTR_KIND_STACK_PROTECT_REQ;881  case Attribute::StackProtectStrong:882    return bitc::ATTR_KIND_STACK_PROTECT_STRONG;883  case Attribute::SafeStack:884    return bitc::ATTR_KIND_SAFESTACK;885  case Attribute::ShadowCallStack:886    return bitc::ATTR_KIND_SHADOWCALLSTACK;887  case Attribute::StrictFP:888    return bitc::ATTR_KIND_STRICT_FP;889  case Attribute::StructRet:890    return bitc::ATTR_KIND_STRUCT_RET;891  case Attribute::SanitizeAddress:892    return bitc::ATTR_KIND_SANITIZE_ADDRESS;893  case Attribute::SanitizeAllocToken:894    return bitc::ATTR_KIND_SANITIZE_ALLOC_TOKEN;895  case Attribute::SanitizeHWAddress:896    return bitc::ATTR_KIND_SANITIZE_HWADDRESS;897  case Attribute::SanitizeThread:898    return bitc::ATTR_KIND_SANITIZE_THREAD;899  case Attribute::SanitizeType:900    return bitc::ATTR_KIND_SANITIZE_TYPE;901  case Attribute::SanitizeMemory:902    return bitc::ATTR_KIND_SANITIZE_MEMORY;903  case Attribute::SanitizeNumericalStability:904    return bitc::ATTR_KIND_SANITIZE_NUMERICAL_STABILITY;905  case Attribute::SanitizeRealtime:906    return bitc::ATTR_KIND_SANITIZE_REALTIME;907  case Attribute::SanitizeRealtimeBlocking:908    return bitc::ATTR_KIND_SANITIZE_REALTIME_BLOCKING;909  case Attribute::SpeculativeLoadHardening:910    return bitc::ATTR_KIND_SPECULATIVE_LOAD_HARDENING;911  case Attribute::SwiftError:912    return bitc::ATTR_KIND_SWIFT_ERROR;913  case Attribute::SwiftSelf:914    return bitc::ATTR_KIND_SWIFT_SELF;915  case Attribute::SwiftAsync:916    return bitc::ATTR_KIND_SWIFT_ASYNC;917  case Attribute::UWTable:918    return bitc::ATTR_KIND_UW_TABLE;919  case Attribute::VScaleRange:920    return bitc::ATTR_KIND_VSCALE_RANGE;921  case Attribute::WillReturn:922    return bitc::ATTR_KIND_WILLRETURN;923  case Attribute::WriteOnly:924    return bitc::ATTR_KIND_WRITEONLY;925  case Attribute::ZExt:926    return bitc::ATTR_KIND_Z_EXT;927  case Attribute::ImmArg:928    return bitc::ATTR_KIND_IMMARG;929  case Attribute::SanitizeMemTag:930    return bitc::ATTR_KIND_SANITIZE_MEMTAG;931  case Attribute::Preallocated:932    return bitc::ATTR_KIND_PREALLOCATED;933  case Attribute::NoUndef:934    return bitc::ATTR_KIND_NOUNDEF;935  case Attribute::ByRef:936    return bitc::ATTR_KIND_BYREF;937  case Attribute::MustProgress:938    return bitc::ATTR_KIND_MUSTPROGRESS;939  case Attribute::PresplitCoroutine:940    return bitc::ATTR_KIND_PRESPLIT_COROUTINE;941  case Attribute::Writable:942    return bitc::ATTR_KIND_WRITABLE;943  case Attribute::CoroDestroyOnlyWhenComplete:944    return bitc::ATTR_KIND_CORO_ONLY_DESTROY_WHEN_COMPLETE;945  case Attribute::CoroElideSafe:946    return bitc::ATTR_KIND_CORO_ELIDE_SAFE;947  case Attribute::DeadOnUnwind:948    return bitc::ATTR_KIND_DEAD_ON_UNWIND;949  case Attribute::Range:950    return bitc::ATTR_KIND_RANGE;951  case Attribute::Initializes:952    return bitc::ATTR_KIND_INITIALIZES;953  case Attribute::NoExt:954    return bitc::ATTR_KIND_NO_EXT;955  case Attribute::Captures:956    return bitc::ATTR_KIND_CAPTURES;957  case Attribute::DeadOnReturn:958    return bitc::ATTR_KIND_DEAD_ON_RETURN;959  case Attribute::NoCreateUndefOrPoison:960    return bitc::ATTR_KIND_NO_CREATE_UNDEF_OR_POISON;961  case Attribute::EndAttrKinds:962    llvm_unreachable("Can not encode end-attribute kinds marker.");963  case Attribute::None:964    llvm_unreachable("Can not encode none-attribute.");965  case Attribute::EmptyKey:966  case Attribute::TombstoneKey:967    llvm_unreachable("Trying to encode EmptyKey/TombstoneKey");968  }969 970  llvm_unreachable("Trying to encode unknown attribute");971}972 973static void emitSignedInt64(SmallVectorImpl<uint64_t> &Vals, uint64_t V) {974  if ((int64_t)V >= 0)975    Vals.push_back(V << 1);976  else977    Vals.push_back((-V << 1) | 1);978}979 980static void emitWideAPInt(SmallVectorImpl<uint64_t> &Vals, const APInt &A) {981  // We have an arbitrary precision integer value to write whose982  // bit width is > 64. However, in canonical unsigned integer983  // format it is likely that the high bits are going to be zero.984  // So, we only write the number of active words.985  unsigned NumWords = A.getActiveWords();986  const uint64_t *RawData = A.getRawData();987  for (unsigned i = 0; i < NumWords; i++)988    emitSignedInt64(Vals, RawData[i]);989}990 991static void emitConstantRange(SmallVectorImpl<uint64_t> &Record,992                              const ConstantRange &CR, bool EmitBitWidth) {993  unsigned BitWidth = CR.getBitWidth();994  if (EmitBitWidth)995    Record.push_back(BitWidth);996  if (BitWidth > 64) {997    Record.push_back(CR.getLower().getActiveWords() |998                     (uint64_t(CR.getUpper().getActiveWords()) << 32));999    emitWideAPInt(Record, CR.getLower());1000    emitWideAPInt(Record, CR.getUpper());1001  } else {1002    emitSignedInt64(Record, CR.getLower().getSExtValue());1003    emitSignedInt64(Record, CR.getUpper().getSExtValue());1004  }1005}1006 1007void ModuleBitcodeWriter::writeAttributeGroupTable() {1008  const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =1009      VE.getAttributeGroups();1010  if (AttrGrps.empty()) return;1011 1012  Stream.EnterSubblock(bitc::PARAMATTR_GROUP_BLOCK_ID, 3);1013 1014  SmallVector<uint64_t, 64> Record;1015  for (ValueEnumerator::IndexAndAttrSet Pair : AttrGrps) {1016    unsigned AttrListIndex = Pair.first;1017    AttributeSet AS = Pair.second;1018    Record.push_back(VE.getAttributeGroupID(Pair));1019    Record.push_back(AttrListIndex);1020 1021    for (Attribute Attr : AS) {1022      if (Attr.isEnumAttribute()) {1023        Record.push_back(0);1024        Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum()));1025      } else if (Attr.isIntAttribute()) {1026        Record.push_back(1);1027        Attribute::AttrKind Kind = Attr.getKindAsEnum();1028        Record.push_back(getAttrKindEncoding(Kind));1029        if (Kind == Attribute::Memory) {1030          // Version field for upgrading old memory effects.1031          const uint64_t Version = 1;1032          Record.push_back((Version << 56) | Attr.getValueAsInt());1033        } else {1034          Record.push_back(Attr.getValueAsInt());1035        }1036      } else if (Attr.isStringAttribute()) {1037        StringRef Kind = Attr.getKindAsString();1038        StringRef Val = Attr.getValueAsString();1039 1040        Record.push_back(Val.empty() ? 3 : 4);1041        Record.append(Kind.begin(), Kind.end());1042        Record.push_back(0);1043        if (!Val.empty()) {1044          Record.append(Val.begin(), Val.end());1045          Record.push_back(0);1046        }1047      } else if (Attr.isTypeAttribute()) {1048        Type *Ty = Attr.getValueAsType();1049        Record.push_back(Ty ? 6 : 5);1050        Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum()));1051        if (Ty)1052          Record.push_back(VE.getTypeID(Attr.getValueAsType()));1053      } else if (Attr.isConstantRangeAttribute()) {1054        Record.push_back(7);1055        Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum()));1056        emitConstantRange(Record, Attr.getValueAsConstantRange(),1057                          /*EmitBitWidth=*/true);1058      } else {1059        assert(Attr.isConstantRangeListAttribute());1060        Record.push_back(8);1061        Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum()));1062        ArrayRef<ConstantRange> Val = Attr.getValueAsConstantRangeList();1063        Record.push_back(Val.size());1064        Record.push_back(Val[0].getBitWidth());1065        for (auto &CR : Val)1066          emitConstantRange(Record, CR, /*EmitBitWidth=*/false);1067      }1068    }1069 1070    Stream.EmitRecord(bitc::PARAMATTR_GRP_CODE_ENTRY, Record);1071    Record.clear();1072  }1073 1074  Stream.ExitBlock();1075}1076 1077void ModuleBitcodeWriter::writeAttributeTable() {1078  const std::vector<AttributeList> &Attrs = VE.getAttributeLists();1079  if (Attrs.empty()) return;1080 1081  Stream.EnterSubblock(bitc::PARAMATTR_BLOCK_ID, 3);1082 1083  SmallVector<uint64_t, 64> Record;1084  for (const AttributeList &AL : Attrs) {1085    for (unsigned i : AL.indexes()) {1086      AttributeSet AS = AL.getAttributes(i);1087      if (AS.hasAttributes())1088        Record.push_back(VE.getAttributeGroupID({i, AS}));1089    }1090 1091    Stream.EmitRecord(bitc::PARAMATTR_CODE_ENTRY, Record);1092    Record.clear();1093  }1094 1095  Stream.ExitBlock();1096}1097 1098/// WriteTypeTable - Write out the type table for a module.1099void ModuleBitcodeWriter::writeTypeTable() {1100  const ValueEnumerator::TypeList &TypeList = VE.getTypes();1101 1102  Stream.EnterSubblock(bitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */);1103  SmallVector<uint64_t, 64> TypeVals;1104 1105  uint64_t NumBits = VE.computeBitsRequiredForTypeIndices();1106 1107  // Abbrev for TYPE_CODE_OPAQUE_POINTER.1108  auto Abbv = std::make_shared<BitCodeAbbrev>();1109  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_OPAQUE_POINTER));1110  Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 01111  unsigned OpaquePtrAbbrev = Stream.EmitAbbrev(std::move(Abbv));1112 1113  // Abbrev for TYPE_CODE_FUNCTION.1114  Abbv = std::make_shared<BitCodeAbbrev>();1115  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_FUNCTION));1116  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));  // isvararg1117  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1118  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));1119  unsigned FunctionAbbrev = Stream.EmitAbbrev(std::move(Abbv));1120 1121  // Abbrev for TYPE_CODE_STRUCT_ANON.1122  Abbv = std::make_shared<BitCodeAbbrev>();1123  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_ANON));1124  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));  // ispacked1125  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1126  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));1127  unsigned StructAnonAbbrev = Stream.EmitAbbrev(std::move(Abbv));1128 1129  // Abbrev for TYPE_CODE_STRUCT_NAME.1130  Abbv = std::make_shared<BitCodeAbbrev>();1131  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME));1132  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1133  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));1134  unsigned StructNameAbbrev = Stream.EmitAbbrev(std::move(Abbv));1135 1136  // Abbrev for TYPE_CODE_STRUCT_NAMED.1137  Abbv = std::make_shared<BitCodeAbbrev>();1138  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAMED));1139  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));  // ispacked1140  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1141  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));1142  unsigned StructNamedAbbrev = Stream.EmitAbbrev(std::move(Abbv));1143 1144  // Abbrev for TYPE_CODE_ARRAY.1145  Abbv = std::make_shared<BitCodeAbbrev>();1146  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY));1147  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // size1148  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));1149  unsigned ArrayAbbrev = Stream.EmitAbbrev(std::move(Abbv));1150 1151  // Emit an entry count so the reader can reserve space.1152  TypeVals.push_back(TypeList.size());1153  Stream.EmitRecord(bitc::TYPE_CODE_NUMENTRY, TypeVals);1154  TypeVals.clear();1155 1156  // Loop over all of the types, emitting each in turn.1157  for (Type *T : TypeList) {1158    int AbbrevToUse = 0;1159    unsigned Code = 0;1160 1161    switch (T->getTypeID()) {1162    case Type::VoidTyID:      Code = bitc::TYPE_CODE_VOID;      break;1163    case Type::HalfTyID:      Code = bitc::TYPE_CODE_HALF;      break;1164    case Type::BFloatTyID:    Code = bitc::TYPE_CODE_BFLOAT;    break;1165    case Type::FloatTyID:     Code = bitc::TYPE_CODE_FLOAT;     break;1166    case Type::DoubleTyID:    Code = bitc::TYPE_CODE_DOUBLE;    break;1167    case Type::X86_FP80TyID:  Code = bitc::TYPE_CODE_X86_FP80;  break;1168    case Type::FP128TyID:     Code = bitc::TYPE_CODE_FP128;     break;1169    case Type::PPC_FP128TyID: Code = bitc::TYPE_CODE_PPC_FP128; break;1170    case Type::LabelTyID:     Code = bitc::TYPE_CODE_LABEL;     break;1171    case Type::MetadataTyID:1172      Code = bitc::TYPE_CODE_METADATA;1173      break;1174    case Type::X86_AMXTyID:   Code = bitc::TYPE_CODE_X86_AMX;   break;1175    case Type::TokenTyID:     Code = bitc::TYPE_CODE_TOKEN;     break;1176    case Type::IntegerTyID:1177      // INTEGER: [width]1178      Code = bitc::TYPE_CODE_INTEGER;1179      TypeVals.push_back(cast<IntegerType>(T)->getBitWidth());1180      break;1181    case Type::PointerTyID: {1182      PointerType *PTy = cast<PointerType>(T);1183      unsigned AddressSpace = PTy->getAddressSpace();1184      // OPAQUE_POINTER: [address space]1185      Code = bitc::TYPE_CODE_OPAQUE_POINTER;1186      TypeVals.push_back(AddressSpace);1187      if (AddressSpace == 0)1188        AbbrevToUse = OpaquePtrAbbrev;1189      break;1190    }1191    case Type::FunctionTyID: {1192      FunctionType *FT = cast<FunctionType>(T);1193      // FUNCTION: [isvararg, retty, paramty x N]1194      Code = bitc::TYPE_CODE_FUNCTION;1195      TypeVals.push_back(FT->isVarArg());1196      TypeVals.push_back(VE.getTypeID(FT->getReturnType()));1197      for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i)1198        TypeVals.push_back(VE.getTypeID(FT->getParamType(i)));1199      AbbrevToUse = FunctionAbbrev;1200      break;1201    }1202    case Type::StructTyID: {1203      StructType *ST = cast<StructType>(T);1204      // STRUCT: [ispacked, eltty x N]1205      TypeVals.push_back(ST->isPacked());1206      // Output all of the element types.1207      for (Type *ET : ST->elements())1208        TypeVals.push_back(VE.getTypeID(ET));1209 1210      if (ST->isLiteral()) {1211        Code = bitc::TYPE_CODE_STRUCT_ANON;1212        AbbrevToUse = StructAnonAbbrev;1213      } else {1214        if (ST->isOpaque()) {1215          Code = bitc::TYPE_CODE_OPAQUE;1216        } else {1217          Code = bitc::TYPE_CODE_STRUCT_NAMED;1218          AbbrevToUse = StructNamedAbbrev;1219        }1220 1221        // Emit the name if it is present.1222        if (!ST->getName().empty())1223          writeStringRecord(Stream, bitc::TYPE_CODE_STRUCT_NAME, ST->getName(),1224                            StructNameAbbrev);1225      }1226      break;1227    }1228    case Type::ArrayTyID: {1229      ArrayType *AT = cast<ArrayType>(T);1230      // ARRAY: [numelts, eltty]1231      Code = bitc::TYPE_CODE_ARRAY;1232      TypeVals.push_back(AT->getNumElements());1233      TypeVals.push_back(VE.getTypeID(AT->getElementType()));1234      AbbrevToUse = ArrayAbbrev;1235      break;1236    }1237    case Type::FixedVectorTyID:1238    case Type::ScalableVectorTyID: {1239      VectorType *VT = cast<VectorType>(T);1240      // VECTOR [numelts, eltty] or1241      //        [numelts, eltty, scalable]1242      Code = bitc::TYPE_CODE_VECTOR;1243      TypeVals.push_back(VT->getElementCount().getKnownMinValue());1244      TypeVals.push_back(VE.getTypeID(VT->getElementType()));1245      if (isa<ScalableVectorType>(VT))1246        TypeVals.push_back(true);1247      break;1248    }1249    case Type::TargetExtTyID: {1250      TargetExtType *TET = cast<TargetExtType>(T);1251      Code = bitc::TYPE_CODE_TARGET_TYPE;1252      writeStringRecord(Stream, bitc::TYPE_CODE_STRUCT_NAME, TET->getName(),1253                        StructNameAbbrev);1254      TypeVals.push_back(TET->getNumTypeParameters());1255      for (Type *InnerTy : TET->type_params())1256        TypeVals.push_back(VE.getTypeID(InnerTy));1257      llvm::append_range(TypeVals, TET->int_params());1258      break;1259    }1260    case Type::TypedPointerTyID:1261      llvm_unreachable("Typed pointers cannot be added to IR modules");1262    }1263 1264    // Emit the finished record.1265    Stream.EmitRecord(Code, TypeVals, AbbrevToUse);1266    TypeVals.clear();1267  }1268 1269  Stream.ExitBlock();1270}1271 1272static unsigned getEncodedLinkage(const GlobalValue::LinkageTypes Linkage) {1273  switch (Linkage) {1274  case GlobalValue::ExternalLinkage:1275    return 0;1276  case GlobalValue::WeakAnyLinkage:1277    return 16;1278  case GlobalValue::AppendingLinkage:1279    return 2;1280  case GlobalValue::InternalLinkage:1281    return 3;1282  case GlobalValue::LinkOnceAnyLinkage:1283    return 18;1284  case GlobalValue::ExternalWeakLinkage:1285    return 7;1286  case GlobalValue::CommonLinkage:1287    return 8;1288  case GlobalValue::PrivateLinkage:1289    return 9;1290  case GlobalValue::WeakODRLinkage:1291    return 17;1292  case GlobalValue::LinkOnceODRLinkage:1293    return 19;1294  case GlobalValue::AvailableExternallyLinkage:1295    return 12;1296  }1297  llvm_unreachable("Invalid linkage");1298}1299 1300static unsigned getEncodedLinkage(const GlobalValue &GV) {1301  return getEncodedLinkage(GV.getLinkage());1302}1303 1304static uint64_t getEncodedFFlags(FunctionSummary::FFlags Flags) {1305  uint64_t RawFlags = 0;1306  RawFlags |= Flags.ReadNone;1307  RawFlags |= (Flags.ReadOnly << 1);1308  RawFlags |= (Flags.NoRecurse << 2);1309  RawFlags |= (Flags.ReturnDoesNotAlias << 3);1310  RawFlags |= (Flags.NoInline << 4);1311  RawFlags |= (Flags.AlwaysInline << 5);1312  RawFlags |= (Flags.NoUnwind << 6);1313  RawFlags |= (Flags.MayThrow << 7);1314  RawFlags |= (Flags.HasUnknownCall << 8);1315  RawFlags |= (Flags.MustBeUnreachable << 9);1316  return RawFlags;1317}1318 1319// Decode the flags for GlobalValue in the summary. See getDecodedGVSummaryFlags1320// in BitcodeReader.cpp.1321static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags,1322                                         bool ImportAsDecl = false) {1323  uint64_t RawFlags = 0;1324 1325  RawFlags |= Flags.NotEligibleToImport; // bool1326  RawFlags |= (Flags.Live << 1);1327  RawFlags |= (Flags.DSOLocal << 2);1328  RawFlags |= (Flags.CanAutoHide << 3);1329 1330  // Linkage don't need to be remapped at that time for the summary. Any future1331  // change to the getEncodedLinkage() function will need to be taken into1332  // account here as well.1333  RawFlags = (RawFlags << 4) | Flags.Linkage; // 4 bits1334 1335  RawFlags |= (Flags.Visibility << 8); // 2 bits1336 1337  unsigned ImportType = Flags.ImportType | ImportAsDecl;1338  RawFlags |= (ImportType << 10); // 1 bit1339 1340  return RawFlags;1341}1342 1343static uint64_t getEncodedGVarFlags(GlobalVarSummary::GVarFlags Flags) {1344  uint64_t RawFlags = Flags.MaybeReadOnly | (Flags.MaybeWriteOnly << 1) |1345                      (Flags.Constant << 2) | Flags.VCallVisibility << 3;1346  return RawFlags;1347}1348 1349static uint64_t getEncodedHotnessCallEdgeInfo(const CalleeInfo &CI) {1350  uint64_t RawFlags = 0;1351 1352  RawFlags |= CI.Hotness;            // 3 bits1353  RawFlags |= (CI.HasTailCall << 3); // 1 bit1354 1355  return RawFlags;1356}1357 1358static uint64_t getEncodedRelBFCallEdgeInfo(const CalleeInfo &CI) {1359  uint64_t RawFlags = 0;1360 1361  RawFlags |= CI.RelBlockFreq; // CalleeInfo::RelBlockFreqBits bits1362  RawFlags |= (CI.HasTailCall << CalleeInfo::RelBlockFreqBits); // 1 bit1363 1364  return RawFlags;1365}1366 1367static unsigned getEncodedVisibility(const GlobalValue &GV) {1368  switch (GV.getVisibility()) {1369  case GlobalValue::DefaultVisibility:   return 0;1370  case GlobalValue::HiddenVisibility:    return 1;1371  case GlobalValue::ProtectedVisibility: return 2;1372  }1373  llvm_unreachable("Invalid visibility");1374}1375 1376static unsigned getEncodedDLLStorageClass(const GlobalValue &GV) {1377  switch (GV.getDLLStorageClass()) {1378  case GlobalValue::DefaultStorageClass:   return 0;1379  case GlobalValue::DLLImportStorageClass: return 1;1380  case GlobalValue::DLLExportStorageClass: return 2;1381  }1382  llvm_unreachable("Invalid DLL storage class");1383}1384 1385static unsigned getEncodedThreadLocalMode(const GlobalValue &GV) {1386  switch (GV.getThreadLocalMode()) {1387    case GlobalVariable::NotThreadLocal:         return 0;1388    case GlobalVariable::GeneralDynamicTLSModel: return 1;1389    case GlobalVariable::LocalDynamicTLSModel:   return 2;1390    case GlobalVariable::InitialExecTLSModel:    return 3;1391    case GlobalVariable::LocalExecTLSModel:      return 4;1392  }1393  llvm_unreachable("Invalid TLS model");1394}1395 1396static unsigned getEncodedComdatSelectionKind(const Comdat &C) {1397  switch (C.getSelectionKind()) {1398  case Comdat::Any:1399    return bitc::COMDAT_SELECTION_KIND_ANY;1400  case Comdat::ExactMatch:1401    return bitc::COMDAT_SELECTION_KIND_EXACT_MATCH;1402  case Comdat::Largest:1403    return bitc::COMDAT_SELECTION_KIND_LARGEST;1404  case Comdat::NoDeduplicate:1405    return bitc::COMDAT_SELECTION_KIND_NO_DUPLICATES;1406  case Comdat::SameSize:1407    return bitc::COMDAT_SELECTION_KIND_SAME_SIZE;1408  }1409  llvm_unreachable("Invalid selection kind");1410}1411 1412static unsigned getEncodedUnnamedAddr(const GlobalValue &GV) {1413  switch (GV.getUnnamedAddr()) {1414  case GlobalValue::UnnamedAddr::None:   return 0;1415  case GlobalValue::UnnamedAddr::Local:  return 2;1416  case GlobalValue::UnnamedAddr::Global: return 1;1417  }1418  llvm_unreachable("Invalid unnamed_addr");1419}1420 1421size_t ModuleBitcodeWriter::addToStrtab(StringRef Str) {1422  if (GenerateHash)1423    Hasher.update(Str);1424  return StrtabBuilder.add(Str);1425}1426 1427void ModuleBitcodeWriter::writeComdats() {1428  SmallVector<unsigned, 64> Vals;1429  for (const Comdat *C : VE.getComdats()) {1430    // COMDAT: [strtab offset, strtab size, selection_kind]1431    Vals.push_back(addToStrtab(C->getName()));1432    Vals.push_back(C->getName().size());1433    Vals.push_back(getEncodedComdatSelectionKind(*C));1434    Stream.EmitRecord(bitc::MODULE_CODE_COMDAT, Vals, /*AbbrevToUse=*/0);1435    Vals.clear();1436  }1437}1438 1439/// Write a record that will eventually hold the word offset of the1440/// module-level VST. For now the offset is 0, which will be backpatched1441/// after the real VST is written. Saves the bit offset to backpatch.1442void ModuleBitcodeWriter::writeValueSymbolTableForwardDecl() {1443  // Write a placeholder value in for the offset of the real VST,1444  // which is written after the function blocks so that it can include1445  // the offset of each function. The placeholder offset will be1446  // updated when the real VST is written.1447  auto Abbv = std::make_shared<BitCodeAbbrev>();1448  Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_VSTOFFSET));1449  // Blocks are 32-bit aligned, so we can use a 32-bit word offset to1450  // hold the real VST offset. Must use fixed instead of VBR as we don't1451  // know how many VBR chunks to reserve ahead of time.1452  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));1453  unsigned VSTOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbv));1454 1455  // Emit the placeholder1456  uint64_t Vals[] = {bitc::MODULE_CODE_VSTOFFSET, 0};1457  Stream.EmitRecordWithAbbrev(VSTOffsetAbbrev, Vals);1458 1459  // Compute and save the bit offset to the placeholder, which will be1460  // patched when the real VST is written. We can simply subtract the 32-bit1461  // fixed size from the current bit number to get the location to backpatch.1462  VSTOffsetPlaceholder = Stream.GetCurrentBitNo() - 32;1463}1464 1465enum StringEncoding { SE_Char6, SE_Fixed7, SE_Fixed8 };1466 1467/// Determine the encoding to use for the given string name and length.1468static StringEncoding getStringEncoding(StringRef Str) {1469  bool isChar6 = true;1470  for (char C : Str) {1471    if (isChar6)1472      isChar6 = BitCodeAbbrevOp::isChar6(C);1473    if ((unsigned char)C & 128)1474      // don't bother scanning the rest.1475      return SE_Fixed8;1476  }1477  if (isChar6)1478    return SE_Char6;1479  return SE_Fixed7;1480}1481 1482static_assert(sizeof(GlobalValue::SanitizerMetadata) <= sizeof(unsigned),1483              "Sanitizer Metadata is too large for naive serialization.");1484static unsigned1485serializeSanitizerMetadata(const GlobalValue::SanitizerMetadata &Meta) {1486  return Meta.NoAddress | (Meta.NoHWAddress << 1) |1487         (Meta.Memtag << 2) | (Meta.IsDynInit << 3);1488}1489 1490/// Emit top-level description of module, including target triple, inline asm,1491/// descriptors for global variables, and function prototype info.1492/// Returns the bit offset to backpatch with the location of the real VST.1493void ModuleBitcodeWriter::writeModuleInfo() {1494  // Emit various pieces of data attached to a module.1495  if (!M.getTargetTriple().empty())1496    writeStringRecord(Stream, bitc::MODULE_CODE_TRIPLE,1497                      M.getTargetTriple().str(), 0 /*TODO*/);1498  const std::string &DL = M.getDataLayoutStr();1499  if (!DL.empty())1500    writeStringRecord(Stream, bitc::MODULE_CODE_DATALAYOUT, DL, 0 /*TODO*/);1501  if (!M.getModuleInlineAsm().empty())1502    writeStringRecord(Stream, bitc::MODULE_CODE_ASM, M.getModuleInlineAsm(),1503                      0 /*TODO*/);1504 1505  // Emit information about sections and GC, computing how many there are. Also1506  // compute the maximum alignment value.1507  std::map<std::string, unsigned> SectionMap;1508  std::map<std::string, unsigned> GCMap;1509  MaybeAlign MaxGVarAlignment;1510  unsigned MaxGlobalType = 0;1511  for (const GlobalVariable &GV : M.globals()) {1512    if (MaybeAlign A = GV.getAlign())1513      MaxGVarAlignment = !MaxGVarAlignment ? *A : std::max(*MaxGVarAlignment, *A);1514    MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV.getValueType()));1515    if (GV.hasSection()) {1516      // Give section names unique ID's.1517      unsigned &Entry = SectionMap[std::string(GV.getSection())];1518      if (!Entry) {1519        writeStringRecord(Stream, bitc::MODULE_CODE_SECTIONNAME, GV.getSection(),1520                          0 /*TODO*/);1521        Entry = SectionMap.size();1522      }1523    }1524  }1525  for (const Function &F : M) {1526    if (F.hasSection()) {1527      // Give section names unique ID's.1528      unsigned &Entry = SectionMap[std::string(F.getSection())];1529      if (!Entry) {1530        writeStringRecord(Stream, bitc::MODULE_CODE_SECTIONNAME, F.getSection(),1531                          0 /*TODO*/);1532        Entry = SectionMap.size();1533      }1534    }1535    if (F.hasGC()) {1536      // Same for GC names.1537      unsigned &Entry = GCMap[F.getGC()];1538      if (!Entry) {1539        writeStringRecord(Stream, bitc::MODULE_CODE_GCNAME, F.getGC(),1540                          0 /*TODO*/);1541        Entry = GCMap.size();1542      }1543    }1544  }1545 1546  // Emit abbrev for globals, now that we know # sections and max alignment.1547  unsigned SimpleGVarAbbrev = 0;1548  if (!M.global_empty()) {1549    // Add an abbrev for common globals with no visibility or thread localness.1550    auto Abbv = std::make_shared<BitCodeAbbrev>();1551    Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR));1552    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));1553    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));1554    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,1555                              Log2_32_Ceil(MaxGlobalType+1)));1556    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // AddrSpace << 21557                                                           //| explicitType << 11558                                                           //| constant1559    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // Initializer.1560    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // Linkage.1561    if (!MaxGVarAlignment)                                 // Alignment.1562      Abbv->Add(BitCodeAbbrevOp(0));1563    else {1564      unsigned MaxEncAlignment = getEncodedAlign(MaxGVarAlignment);1565      Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,1566                               Log2_32_Ceil(MaxEncAlignment+1)));1567    }1568    if (SectionMap.empty())                                    // Section.1569      Abbv->Add(BitCodeAbbrevOp(0));1570    else1571      Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,1572                               Log2_32_Ceil(SectionMap.size()+1)));1573    // Don't bother emitting vis + thread local.1574    SimpleGVarAbbrev = Stream.EmitAbbrev(std::move(Abbv));1575  }1576 1577  SmallVector<unsigned, 64> Vals;1578  // Emit the module's source file name.1579  {1580    StringEncoding Bits = getStringEncoding(M.getSourceFileName());1581    BitCodeAbbrevOp AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8);1582    if (Bits == SE_Char6)1583      AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Char6);1584    else if (Bits == SE_Fixed7)1585      AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7);1586 1587    // MODULE_CODE_SOURCE_FILENAME: [namechar x N]1588    auto Abbv = std::make_shared<BitCodeAbbrev>();1589    Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_SOURCE_FILENAME));1590    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1591    Abbv->Add(AbbrevOpToUse);1592    unsigned FilenameAbbrev = Stream.EmitAbbrev(std::move(Abbv));1593 1594    for (const auto P : M.getSourceFileName())1595      Vals.push_back((unsigned char)P);1596 1597    // Emit the finished record.1598    Stream.EmitRecord(bitc::MODULE_CODE_SOURCE_FILENAME, Vals, FilenameAbbrev);1599    Vals.clear();1600  }1601 1602  // Emit the global variable information.1603  for (const GlobalVariable &GV : M.globals()) {1604    unsigned AbbrevToUse = 0;1605 1606    // GLOBALVAR: [strtab offset, strtab size, type, isconst, initid,1607    //             linkage, alignment, section, visibility, threadlocal,1608    //             unnamed_addr, externally_initialized, dllstorageclass,1609    //             comdat, attributes, DSO_Local, GlobalSanitizer, code_model]1610    Vals.push_back(addToStrtab(GV.getName()));1611    Vals.push_back(GV.getName().size());1612    Vals.push_back(VE.getTypeID(GV.getValueType()));1613    Vals.push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant());1614    Vals.push_back(GV.isDeclaration() ? 0 :1615                   (VE.getValueID(GV.getInitializer()) + 1));1616    Vals.push_back(getEncodedLinkage(GV));1617    Vals.push_back(getEncodedAlign(GV.getAlign()));1618    Vals.push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]1619                                   : 0);1620    if (GV.isThreadLocal() ||1621        GV.getVisibility() != GlobalValue::DefaultVisibility ||1622        GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||1623        GV.isExternallyInitialized() ||1624        GV.getDLLStorageClass() != GlobalValue::DefaultStorageClass ||1625        GV.hasComdat() || GV.hasAttributes() || GV.isDSOLocal() ||1626        GV.hasPartition() || GV.hasSanitizerMetadata() || GV.getCodeModel()) {1627      Vals.push_back(getEncodedVisibility(GV));1628      Vals.push_back(getEncodedThreadLocalMode(GV));1629      Vals.push_back(getEncodedUnnamedAddr(GV));1630      Vals.push_back(GV.isExternallyInitialized());1631      Vals.push_back(getEncodedDLLStorageClass(GV));1632      Vals.push_back(GV.hasComdat() ? VE.getComdatID(GV.getComdat()) : 0);1633 1634      auto AL = GV.getAttributesAsList(AttributeList::FunctionIndex);1635      Vals.push_back(VE.getAttributeListID(AL));1636 1637      Vals.push_back(GV.isDSOLocal());1638      Vals.push_back(addToStrtab(GV.getPartition()));1639      Vals.push_back(GV.getPartition().size());1640 1641      Vals.push_back((GV.hasSanitizerMetadata() ? serializeSanitizerMetadata(1642                                                      GV.getSanitizerMetadata())1643                                                : 0));1644      Vals.push_back(GV.getCodeModelRaw());1645    } else {1646      AbbrevToUse = SimpleGVarAbbrev;1647    }1648 1649    Stream.EmitRecord(bitc::MODULE_CODE_GLOBALVAR, Vals, AbbrevToUse);1650    Vals.clear();1651  }1652 1653  // Emit the function proto information.1654  for (const Function &F : M) {1655    // FUNCTION:  [strtab offset, strtab size, type, callingconv, isproto,1656    //             linkage, paramattrs, alignment, section, visibility, gc,1657    //             unnamed_addr, prologuedata, dllstorageclass, comdat,1658    //             prefixdata, personalityfn, DSO_Local, addrspace]1659    Vals.push_back(addToStrtab(F.getName()));1660    Vals.push_back(F.getName().size());1661    Vals.push_back(VE.getTypeID(F.getFunctionType()));1662    Vals.push_back(F.getCallingConv());1663    Vals.push_back(F.isDeclaration());1664    Vals.push_back(getEncodedLinkage(F));1665    Vals.push_back(VE.getAttributeListID(F.getAttributes()));1666    Vals.push_back(getEncodedAlign(F.getAlign()));1667    Vals.push_back(F.hasSection() ? SectionMap[std::string(F.getSection())]1668                                  : 0);1669    Vals.push_back(getEncodedVisibility(F));1670    Vals.push_back(F.hasGC() ? GCMap[F.getGC()] : 0);1671    Vals.push_back(getEncodedUnnamedAddr(F));1672    Vals.push_back(F.hasPrologueData() ? (VE.getValueID(F.getPrologueData()) + 1)1673                                       : 0);1674    Vals.push_back(getEncodedDLLStorageClass(F));1675    Vals.push_back(F.hasComdat() ? VE.getComdatID(F.getComdat()) : 0);1676    Vals.push_back(F.hasPrefixData() ? (VE.getValueID(F.getPrefixData()) + 1)1677                                     : 0);1678    Vals.push_back(1679        F.hasPersonalityFn() ? (VE.getValueID(F.getPersonalityFn()) + 1) : 0);1680 1681    Vals.push_back(F.isDSOLocal());1682    Vals.push_back(F.getAddressSpace());1683    Vals.push_back(addToStrtab(F.getPartition()));1684    Vals.push_back(F.getPartition().size());1685 1686    unsigned AbbrevToUse = 0;1687    Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse);1688    Vals.clear();1689  }1690 1691  // Emit the alias information.1692  for (const GlobalAlias &A : M.aliases()) {1693    // ALIAS: [strtab offset, strtab size, alias type, aliasee val#, linkage,1694    //         visibility, dllstorageclass, threadlocal, unnamed_addr,1695    //         DSO_Local]1696    Vals.push_back(addToStrtab(A.getName()));1697    Vals.push_back(A.getName().size());1698    Vals.push_back(VE.getTypeID(A.getValueType()));1699    Vals.push_back(A.getType()->getAddressSpace());1700    Vals.push_back(VE.getValueID(A.getAliasee()));1701    Vals.push_back(getEncodedLinkage(A));1702    Vals.push_back(getEncodedVisibility(A));1703    Vals.push_back(getEncodedDLLStorageClass(A));1704    Vals.push_back(getEncodedThreadLocalMode(A));1705    Vals.push_back(getEncodedUnnamedAddr(A));1706    Vals.push_back(A.isDSOLocal());1707    Vals.push_back(addToStrtab(A.getPartition()));1708    Vals.push_back(A.getPartition().size());1709 1710    unsigned AbbrevToUse = 0;1711    Stream.EmitRecord(bitc::MODULE_CODE_ALIAS, Vals, AbbrevToUse);1712    Vals.clear();1713  }1714 1715  // Emit the ifunc information.1716  for (const GlobalIFunc &I : M.ifuncs()) {1717    // IFUNC: [strtab offset, strtab size, ifunc type, address space, resolver1718    //         val#, linkage, visibility, DSO_Local]1719    Vals.push_back(addToStrtab(I.getName()));1720    Vals.push_back(I.getName().size());1721    Vals.push_back(VE.getTypeID(I.getValueType()));1722    Vals.push_back(I.getType()->getAddressSpace());1723    Vals.push_back(VE.getValueID(I.getResolver()));1724    Vals.push_back(getEncodedLinkage(I));1725    Vals.push_back(getEncodedVisibility(I));1726    Vals.push_back(I.isDSOLocal());1727    Vals.push_back(addToStrtab(I.getPartition()));1728    Vals.push_back(I.getPartition().size());1729    Stream.EmitRecord(bitc::MODULE_CODE_IFUNC, Vals);1730    Vals.clear();1731  }1732 1733  writeValueSymbolTableForwardDecl();1734}1735 1736static uint64_t getOptimizationFlags(const Value *V) {1737  uint64_t Flags = 0;1738 1739  if (const auto *OBO = dyn_cast<OverflowingBinaryOperator>(V)) {1740    if (OBO->hasNoSignedWrap())1741      Flags |= 1 << bitc::OBO_NO_SIGNED_WRAP;1742    if (OBO->hasNoUnsignedWrap())1743      Flags |= 1 << bitc::OBO_NO_UNSIGNED_WRAP;1744  } else if (const auto *PEO = dyn_cast<PossiblyExactOperator>(V)) {1745    if (PEO->isExact())1746      Flags |= 1 << bitc::PEO_EXACT;1747  } else if (const auto *PDI = dyn_cast<PossiblyDisjointInst>(V)) {1748    if (PDI->isDisjoint())1749      Flags |= 1 << bitc::PDI_DISJOINT;1750  } else if (const auto *FPMO = dyn_cast<FPMathOperator>(V)) {1751    if (FPMO->hasAllowReassoc())1752      Flags |= bitc::AllowReassoc;1753    if (FPMO->hasNoNaNs())1754      Flags |= bitc::NoNaNs;1755    if (FPMO->hasNoInfs())1756      Flags |= bitc::NoInfs;1757    if (FPMO->hasNoSignedZeros())1758      Flags |= bitc::NoSignedZeros;1759    if (FPMO->hasAllowReciprocal())1760      Flags |= bitc::AllowReciprocal;1761    if (FPMO->hasAllowContract())1762      Flags |= bitc::AllowContract;1763    if (FPMO->hasApproxFunc())1764      Flags |= bitc::ApproxFunc;1765  } else if (const auto *NNI = dyn_cast<PossiblyNonNegInst>(V)) {1766    if (NNI->hasNonNeg())1767      Flags |= 1 << bitc::PNNI_NON_NEG;1768  } else if (const auto *TI = dyn_cast<TruncInst>(V)) {1769    if (TI->hasNoSignedWrap())1770      Flags |= 1 << bitc::TIO_NO_SIGNED_WRAP;1771    if (TI->hasNoUnsignedWrap())1772      Flags |= 1 << bitc::TIO_NO_UNSIGNED_WRAP;1773  } else if (const auto *GEP = dyn_cast<GEPOperator>(V)) {1774    if (GEP->isInBounds())1775      Flags |= 1 << bitc::GEP_INBOUNDS;1776    if (GEP->hasNoUnsignedSignedWrap())1777      Flags |= 1 << bitc::GEP_NUSW;1778    if (GEP->hasNoUnsignedWrap())1779      Flags |= 1 << bitc::GEP_NUW;1780  } else if (const auto *ICmp = dyn_cast<ICmpInst>(V)) {1781    if (ICmp->hasSameSign())1782      Flags |= 1 << bitc::ICMP_SAME_SIGN;1783  }1784 1785  return Flags;1786}1787 1788void ModuleBitcodeWriter::writeValueAsMetadata(1789    const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {1790  // Mimic an MDNode with a value as one operand.1791  Value *V = MD->getValue();1792  Record.push_back(VE.getTypeID(V->getType()));1793  Record.push_back(VE.getValueID(V));1794  Stream.EmitRecord(bitc::METADATA_VALUE, Record, 0);1795  Record.clear();1796}1797 1798void ModuleBitcodeWriter::writeMDTuple(const MDTuple *N,1799                                       SmallVectorImpl<uint64_t> &Record,1800                                       unsigned Abbrev) {1801  for (const MDOperand &MDO : N->operands()) {1802    Metadata *MD = MDO;1803    assert(!(MD && isa<LocalAsMetadata>(MD)) &&1804           "Unexpected function-local metadata");1805    Record.push_back(VE.getMetadataOrNullID(MD));1806  }1807  Stream.EmitRecord(N->isDistinct() ? bitc::METADATA_DISTINCT_NODE1808                                    : bitc::METADATA_NODE,1809                    Record, Abbrev);1810  Record.clear();1811}1812 1813unsigned ModuleBitcodeWriter::createDILocationAbbrev() {1814  // Assume the column is usually under 128, and always output the inlined-at1815  // location (it's never more expensive than building an array size 1).1816  auto Abbv = std::make_shared<BitCodeAbbrev>();1817  Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_LOCATION));1818  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isDistinct1819  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // line1820  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // column1821  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // scope1822  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // inlinedAt1823  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isImplicitCode1824  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // atomGroup1825  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // atomRank1826  return Stream.EmitAbbrev(std::move(Abbv));1827}1828 1829void ModuleBitcodeWriter::writeDILocation(const DILocation *N,1830                                          SmallVectorImpl<uint64_t> &Record,1831                                          unsigned &Abbrev) {1832  if (!Abbrev)1833    Abbrev = createDILocationAbbrev();1834 1835  Record.push_back(N->isDistinct());1836  Record.push_back(N->getLine());1837  Record.push_back(N->getColumn());1838  Record.push_back(VE.getMetadataID(N->getScope()));1839  Record.push_back(VE.getMetadataOrNullID(N->getInlinedAt()));1840  Record.push_back(N->isImplicitCode());1841  Record.push_back(N->getAtomGroup());1842  Record.push_back(N->getAtomRank());1843  Stream.EmitRecord(bitc::METADATA_LOCATION, Record, Abbrev);1844  Record.clear();1845}1846 1847unsigned ModuleBitcodeWriter::createGenericDINodeAbbrev() {1848  // Assume the column is usually under 128, and always output the inlined-at1849  // location (it's never more expensive than building an array size 1).1850  auto Abbv = std::make_shared<BitCodeAbbrev>();1851  Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_GENERIC_DEBUG));1852  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));1853  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));1854  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));1855  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));1856  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1857  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));1858  return Stream.EmitAbbrev(std::move(Abbv));1859}1860 1861void ModuleBitcodeWriter::writeGenericDINode(const GenericDINode *N,1862                                             SmallVectorImpl<uint64_t> &Record,1863                                             unsigned &Abbrev) {1864  if (!Abbrev)1865    Abbrev = createGenericDINodeAbbrev();1866 1867  Record.push_back(N->isDistinct());1868  Record.push_back(N->getTag());1869  Record.push_back(0); // Per-tag version field; unused for now.1870 1871  for (auto &I : N->operands())1872    Record.push_back(VE.getMetadataOrNullID(I));1873 1874  Stream.EmitRecord(bitc::METADATA_GENERIC_DEBUG, Record, Abbrev);1875  Record.clear();1876}1877 1878void ModuleBitcodeWriter::writeDISubrange(const DISubrange *N,1879                                          SmallVectorImpl<uint64_t> &Record,1880                                          unsigned Abbrev) {1881  const uint64_t Version = 2 << 1;1882  Record.push_back((uint64_t)N->isDistinct() | Version);1883  Record.push_back(VE.getMetadataOrNullID(N->getRawCountNode()));1884  Record.push_back(VE.getMetadataOrNullID(N->getRawLowerBound()));1885  Record.push_back(VE.getMetadataOrNullID(N->getRawUpperBound()));1886  Record.push_back(VE.getMetadataOrNullID(N->getRawStride()));1887 1888  Stream.EmitRecord(bitc::METADATA_SUBRANGE, Record, Abbrev);1889  Record.clear();1890}1891 1892void ModuleBitcodeWriter::writeDIGenericSubrange(1893    const DIGenericSubrange *N, SmallVectorImpl<uint64_t> &Record,1894    unsigned Abbrev) {1895  Record.push_back((uint64_t)N->isDistinct());1896  Record.push_back(VE.getMetadataOrNullID(N->getRawCountNode()));1897  Record.push_back(VE.getMetadataOrNullID(N->getRawLowerBound()));1898  Record.push_back(VE.getMetadataOrNullID(N->getRawUpperBound()));1899  Record.push_back(VE.getMetadataOrNullID(N->getRawStride()));1900 1901  Stream.EmitRecord(bitc::METADATA_GENERIC_SUBRANGE, Record, Abbrev);1902  Record.clear();1903}1904 1905void ModuleBitcodeWriter::writeDIEnumerator(const DIEnumerator *N,1906                                            SmallVectorImpl<uint64_t> &Record,1907                                            unsigned Abbrev) {1908  const uint64_t IsBigInt = 1 << 2;1909  Record.push_back(IsBigInt | (N->isUnsigned() << 1) | N->isDistinct());1910  Record.push_back(N->getValue().getBitWidth());1911  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1912  emitWideAPInt(Record, N->getValue());1913 1914  Stream.EmitRecord(bitc::METADATA_ENUMERATOR, Record, Abbrev);1915  Record.clear();1916}1917 1918void ModuleBitcodeWriter::writeDIBasicType(const DIBasicType *N,1919                                           SmallVectorImpl<uint64_t> &Record,1920                                           unsigned Abbrev) {1921  const unsigned SizeIsMetadata = 0x2;1922  Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct());1923  Record.push_back(N->getTag());1924  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1925  Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));1926  Record.push_back(N->getAlignInBits());1927  Record.push_back(N->getEncoding());1928  Record.push_back(N->getFlags());1929  Record.push_back(N->getNumExtraInhabitants());1930  Record.push_back(N->getDataSizeInBits());1931 1932  Stream.EmitRecord(bitc::METADATA_BASIC_TYPE, Record, Abbrev);1933  Record.clear();1934}1935 1936void ModuleBitcodeWriter::writeDIFixedPointType(1937    const DIFixedPointType *N, SmallVectorImpl<uint64_t> &Record,1938    unsigned Abbrev) {1939  const unsigned SizeIsMetadata = 0x2;1940  Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct());1941  Record.push_back(N->getTag());1942  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1943  Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));1944  Record.push_back(N->getAlignInBits());1945  Record.push_back(N->getEncoding());1946  Record.push_back(N->getFlags());1947  Record.push_back(N->getKind());1948  Record.push_back(N->getFactorRaw());1949 1950  auto WriteWideInt = [&](const APInt &Value) {1951    // Write an encoded word that holds the number of active words and1952    // the number of bits.1953    uint64_t NumWords = Value.getActiveWords();1954    uint64_t Encoded = (NumWords << 32) | Value.getBitWidth();1955    Record.push_back(Encoded);1956    emitWideAPInt(Record, Value);1957  };1958 1959  WriteWideInt(N->getNumeratorRaw());1960  WriteWideInt(N->getDenominatorRaw());1961 1962  Stream.EmitRecord(bitc::METADATA_FIXED_POINT_TYPE, Record, Abbrev);1963  Record.clear();1964}1965 1966void ModuleBitcodeWriter::writeDIStringType(const DIStringType *N,1967                                            SmallVectorImpl<uint64_t> &Record,1968                                            unsigned Abbrev) {1969  const unsigned SizeIsMetadata = 0x2;1970  Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct());1971  Record.push_back(N->getTag());1972  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1973  Record.push_back(VE.getMetadataOrNullID(N->getStringLength()));1974  Record.push_back(VE.getMetadataOrNullID(N->getStringLengthExp()));1975  Record.push_back(VE.getMetadataOrNullID(N->getStringLocationExp()));1976  Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));1977  Record.push_back(N->getAlignInBits());1978  Record.push_back(N->getEncoding());1979 1980  Stream.EmitRecord(bitc::METADATA_STRING_TYPE, Record, Abbrev);1981  Record.clear();1982}1983 1984void ModuleBitcodeWriter::writeDIDerivedType(const DIDerivedType *N,1985                                             SmallVectorImpl<uint64_t> &Record,1986                                             unsigned Abbrev) {1987  const unsigned SizeIsMetadata = 0x2;1988  Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct());1989  Record.push_back(N->getTag());1990  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1991  Record.push_back(VE.getMetadataOrNullID(N->getFile()));1992  Record.push_back(N->getLine());1993  Record.push_back(VE.getMetadataOrNullID(N->getScope()));1994  Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));1995  Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));1996  Record.push_back(N->getAlignInBits());1997  Record.push_back(VE.getMetadataOrNullID(N->getRawOffsetInBits()));1998  Record.push_back(N->getFlags());1999  Record.push_back(VE.getMetadataOrNullID(N->getExtraData()));2000 2001  // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means2002  // that there is no DWARF address space associated with DIDerivedType.2003  if (const auto &DWARFAddressSpace = N->getDWARFAddressSpace())2004    Record.push_back(*DWARFAddressSpace + 1);2005  else2006    Record.push_back(0);2007 2008  Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));2009 2010  if (auto PtrAuthData = N->getPtrAuthData())2011    Record.push_back(PtrAuthData->RawData);2012  else2013    Record.push_back(0);2014 2015  Stream.EmitRecord(bitc::METADATA_DERIVED_TYPE, Record, Abbrev);2016  Record.clear();2017}2018 2019void ModuleBitcodeWriter::writeDISubrangeType(const DISubrangeType *N,2020                                              SmallVectorImpl<uint64_t> &Record,2021                                              unsigned Abbrev) {2022  const unsigned SizeIsMetadata = 0x2;2023  Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct());2024  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2025  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2026  Record.push_back(N->getLine());2027  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2028  Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));2029  Record.push_back(N->getAlignInBits());2030  Record.push_back(N->getFlags());2031  Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));2032  Record.push_back(VE.getMetadataOrNullID(N->getRawLowerBound()));2033  Record.push_back(VE.getMetadataOrNullID(N->getRawUpperBound()));2034  Record.push_back(VE.getMetadataOrNullID(N->getRawStride()));2035  Record.push_back(VE.getMetadataOrNullID(N->getRawBias()));2036 2037  Stream.EmitRecord(bitc::METADATA_SUBRANGE_TYPE, Record, Abbrev);2038  Record.clear();2039}2040 2041void ModuleBitcodeWriter::writeDICompositeType(2042    const DICompositeType *N, SmallVectorImpl<uint64_t> &Record,2043    unsigned Abbrev) {2044  const unsigned IsNotUsedInOldTypeRef = 0x2;2045  const unsigned SizeIsMetadata = 0x4;2046  Record.push_back(SizeIsMetadata | IsNotUsedInOldTypeRef |2047                   (unsigned)N->isDistinct());2048  Record.push_back(N->getTag());2049  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2050  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2051  Record.push_back(N->getLine());2052  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2053  Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));2054  Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));2055  Record.push_back(N->getAlignInBits());2056  Record.push_back(VE.getMetadataOrNullID(N->getRawOffsetInBits()));2057  Record.push_back(N->getFlags());2058  Record.push_back(VE.getMetadataOrNullID(N->getElements().get()));2059  Record.push_back(N->getRuntimeLang());2060  Record.push_back(VE.getMetadataOrNullID(N->getVTableHolder()));2061  Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get()));2062  Record.push_back(VE.getMetadataOrNullID(N->getRawIdentifier()));2063  Record.push_back(VE.getMetadataOrNullID(N->getDiscriminator()));2064  Record.push_back(VE.getMetadataOrNullID(N->getRawDataLocation()));2065  Record.push_back(VE.getMetadataOrNullID(N->getRawAssociated()));2066  Record.push_back(VE.getMetadataOrNullID(N->getRawAllocated()));2067  Record.push_back(VE.getMetadataOrNullID(N->getRawRank()));2068  Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));2069  Record.push_back(N->getNumExtraInhabitants());2070  Record.push_back(VE.getMetadataOrNullID(N->getRawSpecification()));2071  Record.push_back(2072      N->getEnumKind().value_or(dwarf::DW_APPLE_ENUM_KIND_invalid));2073  Record.push_back(VE.getMetadataOrNullID(N->getRawBitStride()));2074 2075  Stream.EmitRecord(bitc::METADATA_COMPOSITE_TYPE, Record, Abbrev);2076  Record.clear();2077}2078 2079void ModuleBitcodeWriter::writeDISubroutineType(2080    const DISubroutineType *N, SmallVectorImpl<uint64_t> &Record,2081    unsigned Abbrev) {2082  const unsigned HasNoOldTypeRefs = 0x2;2083  Record.push_back(HasNoOldTypeRefs | (unsigned)N->isDistinct());2084  Record.push_back(N->getFlags());2085  Record.push_back(VE.getMetadataOrNullID(N->getTypeArray().get()));2086  Record.push_back(N->getCC());2087 2088  Stream.EmitRecord(bitc::METADATA_SUBROUTINE_TYPE, Record, Abbrev);2089  Record.clear();2090}2091 2092void ModuleBitcodeWriter::writeDIFile(const DIFile *N,2093                                      SmallVectorImpl<uint64_t> &Record,2094                                      unsigned Abbrev) {2095  Record.push_back(N->isDistinct());2096  Record.push_back(VE.getMetadataOrNullID(N->getRawFilename()));2097  Record.push_back(VE.getMetadataOrNullID(N->getRawDirectory()));2098  if (N->getRawChecksum()) {2099    Record.push_back(N->getRawChecksum()->Kind);2100    Record.push_back(VE.getMetadataOrNullID(N->getRawChecksum()->Value));2101  } else {2102    // Maintain backwards compatibility with the old internal representation of2103    // CSK_None in ChecksumKind by writing nulls here when Checksum is None.2104    Record.push_back(0);2105    Record.push_back(VE.getMetadataOrNullID(nullptr));2106  }2107  auto Source = N->getRawSource();2108  if (Source)2109    Record.push_back(VE.getMetadataOrNullID(Source));2110 2111  Stream.EmitRecord(bitc::METADATA_FILE, Record, Abbrev);2112  Record.clear();2113}2114 2115void ModuleBitcodeWriter::writeDICompileUnit(const DICompileUnit *N,2116                                             SmallVectorImpl<uint64_t> &Record,2117                                             unsigned Abbrev) {2118  assert(N->isDistinct() && "Expected distinct compile units");2119  Record.push_back(/* IsDistinct */ true);2120 2121  auto Lang = N->getSourceLanguage();2122  Record.push_back(Lang.getName());2123  // Set bit so the MetadataLoader can distniguish between versioned and2124  // unversioned names.2125  if (Lang.hasVersionedName())2126    Record.back() ^= (uint64_t(1) << 63);2127 2128  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2129  Record.push_back(VE.getMetadataOrNullID(N->getRawProducer()));2130  Record.push_back(N->isOptimized());2131  Record.push_back(VE.getMetadataOrNullID(N->getRawFlags()));2132  Record.push_back(N->getRuntimeVersion());2133  Record.push_back(VE.getMetadataOrNullID(N->getRawSplitDebugFilename()));2134  Record.push_back(N->getEmissionKind());2135  Record.push_back(VE.getMetadataOrNullID(N->getEnumTypes().get()));2136  Record.push_back(VE.getMetadataOrNullID(N->getRetainedTypes().get()));2137  Record.push_back(/* subprograms */ 0);2138  Record.push_back(VE.getMetadataOrNullID(N->getGlobalVariables().get()));2139  Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get()));2140  Record.push_back(N->getDWOId());2141  Record.push_back(VE.getMetadataOrNullID(N->getMacros().get()));2142  Record.push_back(N->getSplitDebugInlining());2143  Record.push_back(N->getDebugInfoForProfiling());2144  Record.push_back((unsigned)N->getNameTableKind());2145  Record.push_back(N->getRangesBaseAddress());2146  Record.push_back(VE.getMetadataOrNullID(N->getRawSysRoot()));2147  Record.push_back(VE.getMetadataOrNullID(N->getRawSDK()));2148  Record.push_back(Lang.hasVersionedName() ? Lang.getVersion() : 0);2149 2150  Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev);2151  Record.clear();2152}2153 2154void ModuleBitcodeWriter::writeDISubprogram(const DISubprogram *N,2155                                            SmallVectorImpl<uint64_t> &Record,2156                                            unsigned Abbrev) {2157  const uint64_t HasUnitFlag = 1 << 1;2158  const uint64_t HasSPFlagsFlag = 1 << 2;2159  Record.push_back(uint64_t(N->isDistinct()) | HasUnitFlag | HasSPFlagsFlag);2160  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2161  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2162  Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));2163  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2164  Record.push_back(N->getLine());2165  Record.push_back(VE.getMetadataOrNullID(N->getType()));2166  Record.push_back(N->getScopeLine());2167  Record.push_back(VE.getMetadataOrNullID(N->getContainingType()));2168  Record.push_back(N->getSPFlags());2169  Record.push_back(N->getVirtualIndex());2170  Record.push_back(N->getFlags());2171  Record.push_back(VE.getMetadataOrNullID(N->getRawUnit()));2172  Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get()));2173  Record.push_back(VE.getMetadataOrNullID(N->getDeclaration()));2174  Record.push_back(VE.getMetadataOrNullID(N->getRetainedNodes().get()));2175  Record.push_back(N->getThisAdjustment());2176  Record.push_back(VE.getMetadataOrNullID(N->getThrownTypes().get()));2177  Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));2178  Record.push_back(VE.getMetadataOrNullID(N->getRawTargetFuncName()));2179  Record.push_back(N->getKeyInstructionsEnabled());2180 2181  Stream.EmitRecord(bitc::METADATA_SUBPROGRAM, Record, Abbrev);2182  Record.clear();2183}2184 2185void ModuleBitcodeWriter::writeDILexicalBlock(const DILexicalBlock *N,2186                                              SmallVectorImpl<uint64_t> &Record,2187                                              unsigned Abbrev) {2188  Record.push_back(N->isDistinct());2189  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2190  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2191  Record.push_back(N->getLine());2192  Record.push_back(N->getColumn());2193 2194  Stream.EmitRecord(bitc::METADATA_LEXICAL_BLOCK, Record, Abbrev);2195  Record.clear();2196}2197 2198void ModuleBitcodeWriter::writeDILexicalBlockFile(2199    const DILexicalBlockFile *N, SmallVectorImpl<uint64_t> &Record,2200    unsigned Abbrev) {2201  Record.push_back(N->isDistinct());2202  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2203  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2204  Record.push_back(N->getDiscriminator());2205 2206  Stream.EmitRecord(bitc::METADATA_LEXICAL_BLOCK_FILE, Record, Abbrev);2207  Record.clear();2208}2209 2210void ModuleBitcodeWriter::writeDICommonBlock(const DICommonBlock *N,2211                                             SmallVectorImpl<uint64_t> &Record,2212                                             unsigned Abbrev) {2213  Record.push_back(N->isDistinct());2214  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2215  Record.push_back(VE.getMetadataOrNullID(N->getDecl()));2216  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2217  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2218  Record.push_back(N->getLineNo());2219 2220  Stream.EmitRecord(bitc::METADATA_COMMON_BLOCK, Record, Abbrev);2221  Record.clear();2222}2223 2224void ModuleBitcodeWriter::writeDINamespace(const DINamespace *N,2225                                           SmallVectorImpl<uint64_t> &Record,2226                                           unsigned Abbrev) {2227  Record.push_back(N->isDistinct() | N->getExportSymbols() << 1);2228  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2229  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2230 2231  Stream.EmitRecord(bitc::METADATA_NAMESPACE, Record, Abbrev);2232  Record.clear();2233}2234 2235void ModuleBitcodeWriter::writeDIMacro(const DIMacro *N,2236                                       SmallVectorImpl<uint64_t> &Record,2237                                       unsigned Abbrev) {2238  Record.push_back(N->isDistinct());2239  Record.push_back(N->getMacinfoType());2240  Record.push_back(N->getLine());2241  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2242  Record.push_back(VE.getMetadataOrNullID(N->getRawValue()));2243 2244  Stream.EmitRecord(bitc::METADATA_MACRO, Record, Abbrev);2245  Record.clear();2246}2247 2248void ModuleBitcodeWriter::writeDIMacroFile(const DIMacroFile *N,2249                                           SmallVectorImpl<uint64_t> &Record,2250                                           unsigned Abbrev) {2251  Record.push_back(N->isDistinct());2252  Record.push_back(N->getMacinfoType());2253  Record.push_back(N->getLine());2254  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2255  Record.push_back(VE.getMetadataOrNullID(N->getElements().get()));2256 2257  Stream.EmitRecord(bitc::METADATA_MACRO_FILE, Record, Abbrev);2258  Record.clear();2259}2260 2261void ModuleBitcodeWriter::writeDIArgList(const DIArgList *N,2262                                         SmallVectorImpl<uint64_t> &Record) {2263  Record.reserve(N->getArgs().size());2264  for (ValueAsMetadata *MD : N->getArgs())2265    Record.push_back(VE.getMetadataID(MD));2266 2267  Stream.EmitRecord(bitc::METADATA_ARG_LIST, Record);2268  Record.clear();2269}2270 2271void ModuleBitcodeWriter::writeDIModule(const DIModule *N,2272                                        SmallVectorImpl<uint64_t> &Record,2273                                        unsigned Abbrev) {2274  Record.push_back(N->isDistinct());2275  for (auto &I : N->operands())2276    Record.push_back(VE.getMetadataOrNullID(I));2277  Record.push_back(N->getLineNo());2278  Record.push_back(N->getIsDecl());2279 2280  Stream.EmitRecord(bitc::METADATA_MODULE, Record, Abbrev);2281  Record.clear();2282}2283 2284void ModuleBitcodeWriter::writeDIAssignID(const DIAssignID *N,2285                                          SmallVectorImpl<uint64_t> &Record,2286                                          unsigned Abbrev) {2287  // There are no arguments for this metadata type.2288  Record.push_back(N->isDistinct());2289  Stream.EmitRecord(bitc::METADATA_ASSIGN_ID, Record, Abbrev);2290  Record.clear();2291}2292 2293void ModuleBitcodeWriter::writeDITemplateTypeParameter(2294    const DITemplateTypeParameter *N, SmallVectorImpl<uint64_t> &Record,2295    unsigned Abbrev) {2296  Record.push_back(N->isDistinct());2297  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2298  Record.push_back(VE.getMetadataOrNullID(N->getType()));2299  Record.push_back(N->isDefault());2300 2301  Stream.EmitRecord(bitc::METADATA_TEMPLATE_TYPE, Record, Abbrev);2302  Record.clear();2303}2304 2305void ModuleBitcodeWriter::writeDITemplateValueParameter(2306    const DITemplateValueParameter *N, SmallVectorImpl<uint64_t> &Record,2307    unsigned Abbrev) {2308  Record.push_back(N->isDistinct());2309  Record.push_back(N->getTag());2310  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2311  Record.push_back(VE.getMetadataOrNullID(N->getType()));2312  Record.push_back(N->isDefault());2313  Record.push_back(VE.getMetadataOrNullID(N->getValue()));2314 2315  Stream.EmitRecord(bitc::METADATA_TEMPLATE_VALUE, Record, Abbrev);2316  Record.clear();2317}2318 2319void ModuleBitcodeWriter::writeDIGlobalVariable(2320    const DIGlobalVariable *N, SmallVectorImpl<uint64_t> &Record,2321    unsigned Abbrev) {2322  const uint64_t Version = 2 << 1;2323  Record.push_back((uint64_t)N->isDistinct() | Version);2324  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2325  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2326  Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));2327  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2328  Record.push_back(N->getLine());2329  Record.push_back(VE.getMetadataOrNullID(N->getType()));2330  Record.push_back(N->isLocalToUnit());2331  Record.push_back(N->isDefinition());2332  Record.push_back(VE.getMetadataOrNullID(N->getStaticDataMemberDeclaration()));2333  Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams()));2334  Record.push_back(N->getAlignInBits());2335  Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));2336 2337  Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR, Record, Abbrev);2338  Record.clear();2339}2340 2341void ModuleBitcodeWriter::writeDILocalVariable(2342    const DILocalVariable *N, SmallVectorImpl<uint64_t> &Record,2343    unsigned Abbrev) {2344  // In order to support all possible bitcode formats in BitcodeReader we need2345  // to distinguish the following cases:2346  // 1) Record has no artificial tag (Record[1]),2347  //   has no obsolete inlinedAt field (Record[9]).2348  //   In this case Record size will be 8, HasAlignment flag is false.2349  // 2) Record has artificial tag (Record[1]),2350  //   has no obsolete inlignedAt field (Record[9]).2351  //   In this case Record size will be 9, HasAlignment flag is false.2352  // 3) Record has both artificial tag (Record[1]) and2353  //   obsolete inlignedAt field (Record[9]).2354  //   In this case Record size will be 10, HasAlignment flag is false.2355  // 4) Record has neither artificial tag, nor inlignedAt field, but2356  //   HasAlignment flag is true and Record[8] contains alignment value.2357  const uint64_t HasAlignmentFlag = 1 << 1;2358  Record.push_back((uint64_t)N->isDistinct() | HasAlignmentFlag);2359  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2360  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2361  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2362  Record.push_back(N->getLine());2363  Record.push_back(VE.getMetadataOrNullID(N->getType()));2364  Record.push_back(N->getArg());2365  Record.push_back(N->getFlags());2366  Record.push_back(N->getAlignInBits());2367  Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));2368 2369  Stream.EmitRecord(bitc::METADATA_LOCAL_VAR, Record, Abbrev);2370  Record.clear();2371}2372 2373void ModuleBitcodeWriter::writeDILabel(2374    const DILabel *N, SmallVectorImpl<uint64_t> &Record,2375    unsigned Abbrev) {2376  uint64_t IsArtificialFlag = uint64_t(N->isArtificial()) << 1;2377  Record.push_back((uint64_t)N->isDistinct() | IsArtificialFlag);2378  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2379  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2380  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2381  Record.push_back(N->getLine());2382  Record.push_back(N->getColumn());2383  Record.push_back(N->getCoroSuspendIdx().has_value()2384                       ? (uint64_t)N->getCoroSuspendIdx().value()2385                       : std::numeric_limits<uint64_t>::max());2386 2387  Stream.EmitRecord(bitc::METADATA_LABEL, Record, Abbrev);2388  Record.clear();2389}2390 2391void ModuleBitcodeWriter::writeDIExpression(const DIExpression *N,2392                                            SmallVectorImpl<uint64_t> &Record,2393                                            unsigned Abbrev) {2394  Record.reserve(N->getElements().size() + 1);2395  const uint64_t Version = 3 << 1;2396  Record.push_back((uint64_t)N->isDistinct() | Version);2397  Record.append(N->elements_begin(), N->elements_end());2398 2399  Stream.EmitRecord(bitc::METADATA_EXPRESSION, Record, Abbrev);2400  Record.clear();2401}2402 2403void ModuleBitcodeWriter::writeDIGlobalVariableExpression(2404    const DIGlobalVariableExpression *N, SmallVectorImpl<uint64_t> &Record,2405    unsigned Abbrev) {2406  Record.push_back(N->isDistinct());2407  Record.push_back(VE.getMetadataOrNullID(N->getVariable()));2408  Record.push_back(VE.getMetadataOrNullID(N->getExpression()));2409 2410  Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR_EXPR, Record, Abbrev);2411  Record.clear();2412}2413 2414void ModuleBitcodeWriter::writeDIObjCProperty(const DIObjCProperty *N,2415                                              SmallVectorImpl<uint64_t> &Record,2416                                              unsigned Abbrev) {2417  Record.push_back(N->isDistinct());2418  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2419  Record.push_back(VE.getMetadataOrNullID(N->getFile()));2420  Record.push_back(N->getLine());2421  Record.push_back(VE.getMetadataOrNullID(N->getRawSetterName()));2422  Record.push_back(VE.getMetadataOrNullID(N->getRawGetterName()));2423  Record.push_back(N->getAttributes());2424  Record.push_back(VE.getMetadataOrNullID(N->getType()));2425 2426  Stream.EmitRecord(bitc::METADATA_OBJC_PROPERTY, Record, Abbrev);2427  Record.clear();2428}2429 2430void ModuleBitcodeWriter::writeDIImportedEntity(2431    const DIImportedEntity *N, SmallVectorImpl<uint64_t> &Record,2432    unsigned Abbrev) {2433  Record.push_back(N->isDistinct());2434  Record.push_back(N->getTag());2435  Record.push_back(VE.getMetadataOrNullID(N->getScope()));2436  Record.push_back(VE.getMetadataOrNullID(N->getEntity()));2437  Record.push_back(N->getLine());2438  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));2439  Record.push_back(VE.getMetadataOrNullID(N->getRawFile()));2440  Record.push_back(VE.getMetadataOrNullID(N->getElements().get()));2441 2442  Stream.EmitRecord(bitc::METADATA_IMPORTED_ENTITY, Record, Abbrev);2443  Record.clear();2444}2445 2446unsigned ModuleBitcodeWriter::createNamedMetadataAbbrev() {2447  auto Abbv = std::make_shared<BitCodeAbbrev>();2448  Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_NAME));2449  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2450  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));2451  return Stream.EmitAbbrev(std::move(Abbv));2452}2453 2454void ModuleBitcodeWriter::writeNamedMetadata(2455    SmallVectorImpl<uint64_t> &Record) {2456  if (M.named_metadata_empty())2457    return;2458 2459  unsigned Abbrev = createNamedMetadataAbbrev();2460  for (const NamedMDNode &NMD : M.named_metadata()) {2461    // Write name.2462    StringRef Str = NMD.getName();2463    Record.append(Str.bytes_begin(), Str.bytes_end());2464    Stream.EmitRecord(bitc::METADATA_NAME, Record, Abbrev);2465    Record.clear();2466 2467    // Write named metadata operands.2468    for (const MDNode *N : NMD.operands())2469      Record.push_back(VE.getMetadataID(N));2470    Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0);2471    Record.clear();2472  }2473}2474 2475unsigned ModuleBitcodeWriter::createMetadataStringsAbbrev() {2476  auto Abbv = std::make_shared<BitCodeAbbrev>();2477  Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRINGS));2478  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of strings2479  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // offset to chars2480  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));2481  return Stream.EmitAbbrev(std::move(Abbv));2482}2483 2484/// Write out a record for MDString.2485///2486/// All the metadata strings in a metadata block are emitted in a single2487/// record.  The sizes and strings themselves are shoved into a blob.2488void ModuleBitcodeWriter::writeMetadataStrings(2489    ArrayRef<const Metadata *> Strings, SmallVectorImpl<uint64_t> &Record) {2490  if (Strings.empty())2491    return;2492 2493  // Start the record with the number of strings.2494  Record.push_back(bitc::METADATA_STRINGS);2495  Record.push_back(Strings.size());2496 2497  // Emit the sizes of the strings in the blob.2498  SmallString<256> Blob;2499  {2500    BitstreamWriter W(Blob);2501    for (const Metadata *MD : Strings)2502      W.EmitVBR(cast<MDString>(MD)->getLength(), 6);2503    W.FlushToWord();2504  }2505 2506  // Add the offset to the strings to the record.2507  Record.push_back(Blob.size());2508 2509  // Add the strings to the blob.2510  for (const Metadata *MD : Strings)2511    Blob.append(cast<MDString>(MD)->getString());2512 2513  // Emit the final record.2514  Stream.EmitRecordWithBlob(createMetadataStringsAbbrev(), Record, Blob);2515  Record.clear();2516}2517 2518// Generates an enum to use as an index in the Abbrev array of Metadata record.2519enum MetadataAbbrev : unsigned {2520#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,2521#include "llvm/IR/Metadata.def"2522  LastPlusOne2523};2524 2525void ModuleBitcodeWriter::writeMetadataRecords(2526    ArrayRef<const Metadata *> MDs, SmallVectorImpl<uint64_t> &Record,2527    std::vector<unsigned> *MDAbbrevs, std::vector<uint64_t> *IndexPos) {2528  if (MDs.empty())2529    return;2530 2531  // Initialize MDNode abbreviations.2532#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;2533#include "llvm/IR/Metadata.def"2534 2535  for (const Metadata *MD : MDs) {2536    if (IndexPos)2537      IndexPos->push_back(Stream.GetCurrentBitNo());2538    if (const MDNode *N = dyn_cast<MDNode>(MD)) {2539      assert(N->isResolved() && "Expected forward references to be resolved");2540 2541      switch (N->getMetadataID()) {2542      default:2543        llvm_unreachable("Invalid MDNode subclass");2544#define HANDLE_MDNODE_LEAF(CLASS)                                              \2545  case Metadata::CLASS##Kind:                                                  \2546    if (MDAbbrevs)                                                             \2547      write##CLASS(cast<CLASS>(N), Record,                                     \2548                   (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]);             \2549    else                                                                       \2550      write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev);                     \2551    continue;2552#include "llvm/IR/Metadata.def"2553      }2554    }2555    if (auto *AL = dyn_cast<DIArgList>(MD)) {2556      writeDIArgList(AL, Record);2557      continue;2558    }2559    writeValueAsMetadata(cast<ValueAsMetadata>(MD), Record);2560  }2561}2562 2563void ModuleBitcodeWriter::writeModuleMetadata() {2564  if (!VE.hasMDs() && M.named_metadata_empty())2565    return;2566 2567  Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 4);2568  SmallVector<uint64_t, 64> Record;2569 2570  // Emit all abbrevs upfront, so that the reader can jump in the middle of the2571  // block and load any metadata.2572  std::vector<unsigned> MDAbbrevs;2573 2574  MDAbbrevs.resize(MetadataAbbrev::LastPlusOne);2575  MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();2576  MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =2577      createGenericDINodeAbbrev();2578 2579  auto Abbv = std::make_shared<BitCodeAbbrev>();2580  Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_INDEX_OFFSET));2581  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));2582  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));2583  unsigned OffsetAbbrev = Stream.EmitAbbrev(std::move(Abbv));2584 2585  Abbv = std::make_shared<BitCodeAbbrev>();2586  Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_INDEX));2587  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2588  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));2589  unsigned IndexAbbrev = Stream.EmitAbbrev(std::move(Abbv));2590 2591  // Emit MDStrings together upfront.2592  writeMetadataStrings(VE.getMDStrings(), Record);2593 2594  // We only emit an index for the metadata record if we have more than a given2595  // (naive) threshold of metadatas, otherwise it is not worth it.2596  if (VE.getNonMDStrings().size() > IndexThreshold) {2597    // Write a placeholder value in for the offset of the metadata index,2598    // which is written after the records, so that it can include2599    // the offset of each entry. The placeholder offset will be2600    // updated after all records are emitted.2601    uint64_t Vals[] = {0, 0};2602    Stream.EmitRecord(bitc::METADATA_INDEX_OFFSET, Vals, OffsetAbbrev);2603  }2604 2605  // Compute and save the bit offset to the current position, which will be2606  // patched when we emit the index later. We can simply subtract the 64-bit2607  // fixed size from the current bit number to get the location to backpatch.2608  uint64_t IndexOffsetRecordBitPos = Stream.GetCurrentBitNo();2609 2610  // This index will contain the bitpos for each individual record.2611  std::vector<uint64_t> IndexPos;2612  IndexPos.reserve(VE.getNonMDStrings().size());2613 2614  // Write all the records2615  writeMetadataRecords(VE.getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);2616 2617  if (VE.getNonMDStrings().size() > IndexThreshold) {2618    // Now that we have emitted all the records we will emit the index. But2619    // first2620    // backpatch the forward reference so that the reader can skip the records2621    // efficiently.2622    Stream.BackpatchWord64(IndexOffsetRecordBitPos - 64,2623                           Stream.GetCurrentBitNo() - IndexOffsetRecordBitPos);2624 2625    // Delta encode the index.2626    uint64_t PreviousValue = IndexOffsetRecordBitPos;2627    for (auto &Elt : IndexPos) {2628      auto EltDelta = Elt - PreviousValue;2629      PreviousValue = Elt;2630      Elt = EltDelta;2631    }2632    // Emit the index record.2633    Stream.EmitRecord(bitc::METADATA_INDEX, IndexPos, IndexAbbrev);2634    IndexPos.clear();2635  }2636 2637  // Write the named metadata now.2638  writeNamedMetadata(Record);2639 2640  auto AddDeclAttachedMetadata = [&](const GlobalObject &GO) {2641    SmallVector<uint64_t, 4> Record;2642    Record.push_back(VE.getValueID(&GO));2643    pushGlobalMetadataAttachment(Record, GO);2644    Stream.EmitRecord(bitc::METADATA_GLOBAL_DECL_ATTACHMENT, Record);2645  };2646  for (const Function &F : M)2647    if (F.isDeclaration() && F.hasMetadata())2648      AddDeclAttachedMetadata(F);2649  for (const GlobalIFunc &GI : M.ifuncs())2650    if (GI.hasMetadata())2651      AddDeclAttachedMetadata(GI);2652  // FIXME: Only store metadata for declarations here, and move data for global2653  // variable definitions to a separate block (PR28134).2654  for (const GlobalVariable &GV : M.globals())2655    if (GV.hasMetadata())2656      AddDeclAttachedMetadata(GV);2657 2658  Stream.ExitBlock();2659}2660 2661void ModuleBitcodeWriter::writeFunctionMetadata(const Function &F) {2662  if (!VE.hasMDs())2663    return;2664 2665  Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3);2666  SmallVector<uint64_t, 64> Record;2667  writeMetadataStrings(VE.getMDStrings(), Record);2668  writeMetadataRecords(VE.getNonMDStrings(), Record);2669  Stream.ExitBlock();2670}2671 2672void ModuleBitcodeWriter::pushGlobalMetadataAttachment(2673    SmallVectorImpl<uint64_t> &Record, const GlobalObject &GO) {2674  // [n x [id, mdnode]]2675  SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;2676  GO.getAllMetadata(MDs);2677  for (const auto &I : MDs) {2678    Record.push_back(I.first);2679    Record.push_back(VE.getMetadataID(I.second));2680  }2681}2682 2683void ModuleBitcodeWriter::writeFunctionMetadataAttachment(const Function &F) {2684  Stream.EnterSubblock(bitc::METADATA_ATTACHMENT_ID, 3);2685 2686  SmallVector<uint64_t, 64> Record;2687 2688  if (F.hasMetadata()) {2689    pushGlobalMetadataAttachment(Record, F);2690    Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);2691    Record.clear();2692  }2693 2694  // Write metadata attachments2695  // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]]2696  SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;2697  for (const BasicBlock &BB : F)2698    for (const Instruction &I : BB) {2699      MDs.clear();2700      I.getAllMetadataOtherThanDebugLoc(MDs);2701 2702      // If no metadata, ignore instruction.2703      if (MDs.empty()) continue;2704 2705      Record.push_back(VE.getInstructionID(&I));2706 2707      for (const auto &[ID, MD] : MDs) {2708        Record.push_back(ID);2709        Record.push_back(VE.getMetadataID(MD));2710      }2711      Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);2712      Record.clear();2713    }2714 2715  Stream.ExitBlock();2716}2717 2718void ModuleBitcodeWriter::writeModuleMetadataKinds() {2719  SmallVector<uint64_t, 64> Record;2720 2721  // Write metadata kinds2722  // METADATA_KIND - [n x [id, name]]2723  SmallVector<StringRef, 8> Names;2724  M.getMDKindNames(Names);2725 2726  if (Names.empty()) return;2727 2728  Stream.EnterSubblock(bitc::METADATA_KIND_BLOCK_ID, 3);2729 2730  for (unsigned MDKindID = 0, e = Names.size(); MDKindID != e; ++MDKindID) {2731    Record.push_back(MDKindID);2732    StringRef KName = Names[MDKindID];2733    Record.append(KName.begin(), KName.end());2734 2735    Stream.EmitRecord(bitc::METADATA_KIND, Record, 0);2736    Record.clear();2737  }2738 2739  Stream.ExitBlock();2740}2741 2742void ModuleBitcodeWriter::writeOperandBundleTags() {2743  // Write metadata kinds2744  //2745  // OPERAND_BUNDLE_TAGS_BLOCK_ID : N x OPERAND_BUNDLE_TAG2746  //2747  // OPERAND_BUNDLE_TAG - [strchr x N]2748 2749  SmallVector<StringRef, 8> Tags;2750  M.getOperandBundleTags(Tags);2751 2752  if (Tags.empty())2753    return;2754 2755  Stream.EnterSubblock(bitc::OPERAND_BUNDLE_TAGS_BLOCK_ID, 3);2756 2757  SmallVector<uint64_t, 64> Record;2758 2759  for (auto Tag : Tags) {2760    Record.append(Tag.begin(), Tag.end());2761 2762    Stream.EmitRecord(bitc::OPERAND_BUNDLE_TAG, Record, 0);2763    Record.clear();2764  }2765 2766  Stream.ExitBlock();2767}2768 2769void ModuleBitcodeWriter::writeSyncScopeNames() {2770  SmallVector<StringRef, 8> SSNs;2771  M.getContext().getSyncScopeNames(SSNs);2772  if (SSNs.empty())2773    return;2774 2775  Stream.EnterSubblock(bitc::SYNC_SCOPE_NAMES_BLOCK_ID, 2);2776 2777  SmallVector<uint64_t, 64> Record;2778  for (auto SSN : SSNs) {2779    Record.append(SSN.begin(), SSN.end());2780    Stream.EmitRecord(bitc::SYNC_SCOPE_NAME, Record, 0);2781    Record.clear();2782  }2783 2784  Stream.ExitBlock();2785}2786 2787void ModuleBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal,2788                                         bool isGlobal) {2789  if (FirstVal == LastVal) return;2790 2791  Stream.EnterSubblock(bitc::CONSTANTS_BLOCK_ID, 4);2792 2793  unsigned AggregateAbbrev = 0;2794  unsigned String8Abbrev = 0;2795  unsigned CString7Abbrev = 0;2796  unsigned CString6Abbrev = 0;2797  // If this is a constant pool for the module, emit module-specific abbrevs.2798  if (isGlobal) {2799    // Abbrev for CST_CODE_AGGREGATE.2800    auto Abbv = std::make_shared<BitCodeAbbrev>();2801    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_AGGREGATE));2802    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2803    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, Log2_32_Ceil(LastVal+1)));2804    AggregateAbbrev = Stream.EmitAbbrev(std::move(Abbv));2805 2806    // Abbrev for CST_CODE_STRING.2807    Abbv = std::make_shared<BitCodeAbbrev>();2808    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_STRING));2809    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2810    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));2811    String8Abbrev = Stream.EmitAbbrev(std::move(Abbv));2812    // Abbrev for CST_CODE_CSTRING.2813    Abbv = std::make_shared<BitCodeAbbrev>();2814    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING));2815    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2816    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));2817    CString7Abbrev = Stream.EmitAbbrev(std::move(Abbv));2818    // Abbrev for CST_CODE_CSTRING.2819    Abbv = std::make_shared<BitCodeAbbrev>();2820    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING));2821    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2822    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));2823    CString6Abbrev = Stream.EmitAbbrev(std::move(Abbv));2824  }2825 2826  SmallVector<uint64_t, 64> Record;2827 2828  const ValueEnumerator::ValueList &Vals = VE.getValues();2829  Type *LastTy = nullptr;2830  for (unsigned i = FirstVal; i != LastVal; ++i) {2831    const Value *V = Vals[i].first;2832    // If we need to switch types, do so now.2833    if (V->getType() != LastTy) {2834      LastTy = V->getType();2835      Record.push_back(VE.getTypeID(LastTy));2836      Stream.EmitRecord(bitc::CST_CODE_SETTYPE, Record,2837                        CONSTANTS_SETTYPE_ABBREV);2838      Record.clear();2839    }2840 2841    if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {2842      Record.push_back(VE.getTypeID(IA->getFunctionType()));2843      Record.push_back(2844          unsigned(IA->hasSideEffects()) | unsigned(IA->isAlignStack()) << 1 |2845          unsigned(IA->getDialect() & 1) << 2 | unsigned(IA->canThrow()) << 3);2846 2847      // Add the asm string.2848      StringRef AsmStr = IA->getAsmString();2849      Record.push_back(AsmStr.size());2850      Record.append(AsmStr.begin(), AsmStr.end());2851 2852      // Add the constraint string.2853      StringRef ConstraintStr = IA->getConstraintString();2854      Record.push_back(ConstraintStr.size());2855      Record.append(ConstraintStr.begin(), ConstraintStr.end());2856      Stream.EmitRecord(bitc::CST_CODE_INLINEASM, Record);2857      Record.clear();2858      continue;2859    }2860    const Constant *C = cast<Constant>(V);2861    unsigned Code = -1U;2862    unsigned AbbrevToUse = 0;2863    if (C->isNullValue()) {2864      Code = bitc::CST_CODE_NULL;2865    } else if (isa<PoisonValue>(C)) {2866      Code = bitc::CST_CODE_POISON;2867    } else if (isa<UndefValue>(C)) {2868      Code = bitc::CST_CODE_UNDEF;2869    } else if (const ConstantInt *IV = dyn_cast<ConstantInt>(C)) {2870      if (IV->getBitWidth() <= 64) {2871        uint64_t V = IV->getSExtValue();2872        emitSignedInt64(Record, V);2873        Code = bitc::CST_CODE_INTEGER;2874        AbbrevToUse = CONSTANTS_INTEGER_ABBREV;2875      } else {                             // Wide integers, > 64 bits in size.2876        emitWideAPInt(Record, IV->getValue());2877        Code = bitc::CST_CODE_WIDE_INTEGER;2878      }2879    } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {2880      Code = bitc::CST_CODE_FLOAT;2881      Type *Ty = CFP->getType()->getScalarType();2882      if (Ty->isHalfTy() || Ty->isBFloatTy() || Ty->isFloatTy() ||2883          Ty->isDoubleTy()) {2884        Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());2885      } else if (Ty->isX86_FP80Ty()) {2886        // api needed to prevent premature destruction2887        // bits are not in the same order as a normal i80 APInt, compensate.2888        APInt api = CFP->getValueAPF().bitcastToAPInt();2889        const uint64_t *p = api.getRawData();2890        Record.push_back((p[1] << 48) | (p[0] >> 16));2891        Record.push_back(p[0] & 0xffffLL);2892      } else if (Ty->isFP128Ty() || Ty->isPPC_FP128Ty()) {2893        APInt api = CFP->getValueAPF().bitcastToAPInt();2894        const uint64_t *p = api.getRawData();2895        Record.push_back(p[0]);2896        Record.push_back(p[1]);2897      } else {2898        assert(0 && "Unknown FP type!");2899      }2900    } else if (isa<ConstantDataSequential>(C) &&2901               cast<ConstantDataSequential>(C)->isString()) {2902      const ConstantDataSequential *Str = cast<ConstantDataSequential>(C);2903      // Emit constant strings specially.2904      uint64_t NumElts = Str->getNumElements();2905      // If this is a null-terminated string, use the denser CSTRING encoding.2906      if (Str->isCString()) {2907        Code = bitc::CST_CODE_CSTRING;2908        --NumElts;  // Don't encode the null, which isn't allowed by char6.2909      } else {2910        Code = bitc::CST_CODE_STRING;2911        AbbrevToUse = String8Abbrev;2912      }2913      bool isCStr7 = Code == bitc::CST_CODE_CSTRING;2914      bool isCStrChar6 = Code == bitc::CST_CODE_CSTRING;2915      for (uint64_t i = 0; i != NumElts; ++i) {2916        unsigned char V = Str->getElementAsInteger(i);2917        Record.push_back(V);2918        isCStr7 &= (V & 128) == 0;2919        if (isCStrChar6)2920          isCStrChar6 = BitCodeAbbrevOp::isChar6(V);2921      }2922 2923      if (isCStrChar6)2924        AbbrevToUse = CString6Abbrev;2925      else if (isCStr7)2926        AbbrevToUse = CString7Abbrev;2927    } else if (const ConstantDataSequential *CDS =2928                  dyn_cast<ConstantDataSequential>(C)) {2929      Code = bitc::CST_CODE_DATA;2930      Type *EltTy = CDS->getElementType();2931      if (isa<IntegerType>(EltTy)) {2932        for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)2933          Record.push_back(CDS->getElementAsInteger(i));2934      } else {2935        for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)2936          Record.push_back(2937              CDS->getElementAsAPFloat(i).bitcastToAPInt().getLimitedValue());2938      }2939    } else if (isa<ConstantAggregate>(C)) {2940      Code = bitc::CST_CODE_AGGREGATE;2941      for (const Value *Op : C->operands())2942        Record.push_back(VE.getValueID(Op));2943      AbbrevToUse = AggregateAbbrev;2944    } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {2945      switch (CE->getOpcode()) {2946      default:2947        if (Instruction::isCast(CE->getOpcode())) {2948          Code = bitc::CST_CODE_CE_CAST;2949          Record.push_back(getEncodedCastOpcode(CE->getOpcode()));2950          Record.push_back(VE.getTypeID(C->getOperand(0)->getType()));2951          Record.push_back(VE.getValueID(C->getOperand(0)));2952          AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;2953        } else {2954          assert(CE->getNumOperands() == 2 && "Unknown constant expr!");2955          Code = bitc::CST_CODE_CE_BINOP;2956          Record.push_back(getEncodedBinaryOpcode(CE->getOpcode()));2957          Record.push_back(VE.getValueID(C->getOperand(0)));2958          Record.push_back(VE.getValueID(C->getOperand(1)));2959          uint64_t Flags = getOptimizationFlags(CE);2960          if (Flags != 0)2961            Record.push_back(Flags);2962        }2963        break;2964      case Instruction::FNeg: {2965        assert(CE->getNumOperands() == 1 && "Unknown constant expr!");2966        Code = bitc::CST_CODE_CE_UNOP;2967        Record.push_back(getEncodedUnaryOpcode(CE->getOpcode()));2968        Record.push_back(VE.getValueID(C->getOperand(0)));2969        uint64_t Flags = getOptimizationFlags(CE);2970        if (Flags != 0)2971          Record.push_back(Flags);2972        break;2973      }2974      case Instruction::GetElementPtr: {2975        Code = bitc::CST_CODE_CE_GEP;2976        const auto *GO = cast<GEPOperator>(C);2977        Record.push_back(VE.getTypeID(GO->getSourceElementType()));2978        Record.push_back(getOptimizationFlags(GO));2979        if (std::optional<ConstantRange> Range = GO->getInRange()) {2980          Code = bitc::CST_CODE_CE_GEP_WITH_INRANGE;2981          emitConstantRange(Record, *Range, /*EmitBitWidth=*/true);2982        }2983        for (const Value *Op : CE->operands()) {2984          Record.push_back(VE.getTypeID(Op->getType()));2985          Record.push_back(VE.getValueID(Op));2986        }2987        break;2988      }2989      case Instruction::ExtractElement:2990        Code = bitc::CST_CODE_CE_EXTRACTELT;2991        Record.push_back(VE.getTypeID(C->getOperand(0)->getType()));2992        Record.push_back(VE.getValueID(C->getOperand(0)));2993        Record.push_back(VE.getTypeID(C->getOperand(1)->getType()));2994        Record.push_back(VE.getValueID(C->getOperand(1)));2995        break;2996      case Instruction::InsertElement:2997        Code = bitc::CST_CODE_CE_INSERTELT;2998        Record.push_back(VE.getValueID(C->getOperand(0)));2999        Record.push_back(VE.getValueID(C->getOperand(1)));3000        Record.push_back(VE.getTypeID(C->getOperand(2)->getType()));3001        Record.push_back(VE.getValueID(C->getOperand(2)));3002        break;3003      case Instruction::ShuffleVector:3004        // If the return type and argument types are the same, this is a3005        // standard shufflevector instruction.  If the types are different,3006        // then the shuffle is widening or truncating the input vectors, and3007        // the argument type must also be encoded.3008        if (C->getType() == C->getOperand(0)->getType()) {3009          Code = bitc::CST_CODE_CE_SHUFFLEVEC;3010        } else {3011          Code = bitc::CST_CODE_CE_SHUFVEC_EX;3012          Record.push_back(VE.getTypeID(C->getOperand(0)->getType()));3013        }3014        Record.push_back(VE.getValueID(C->getOperand(0)));3015        Record.push_back(VE.getValueID(C->getOperand(1)));3016        Record.push_back(VE.getValueID(CE->getShuffleMaskForBitcode()));3017        break;3018      }3019    } else if (const BlockAddress *BA = dyn_cast<BlockAddress>(C)) {3020      Code = bitc::CST_CODE_BLOCKADDRESS;3021      Record.push_back(VE.getTypeID(BA->getFunction()->getType()));3022      Record.push_back(VE.getValueID(BA->getFunction()));3023      Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock()));3024    } else if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C)) {3025      Code = bitc::CST_CODE_DSO_LOCAL_EQUIVALENT;3026      Record.push_back(VE.getTypeID(Equiv->getGlobalValue()->getType()));3027      Record.push_back(VE.getValueID(Equiv->getGlobalValue()));3028    } else if (const auto *NC = dyn_cast<NoCFIValue>(C)) {3029      Code = bitc::CST_CODE_NO_CFI_VALUE;3030      Record.push_back(VE.getTypeID(NC->getGlobalValue()->getType()));3031      Record.push_back(VE.getValueID(NC->getGlobalValue()));3032    } else if (const auto *CPA = dyn_cast<ConstantPtrAuth>(C)) {3033      Code = bitc::CST_CODE_PTRAUTH2;3034      Record.push_back(VE.getValueID(CPA->getPointer()));3035      Record.push_back(VE.getValueID(CPA->getKey()));3036      Record.push_back(VE.getValueID(CPA->getDiscriminator()));3037      Record.push_back(VE.getValueID(CPA->getAddrDiscriminator()));3038      Record.push_back(VE.getValueID(CPA->getDeactivationSymbol()));3039    } else {3040#ifndef NDEBUG3041      C->dump();3042#endif3043      llvm_unreachable("Unknown constant!");3044    }3045    Stream.EmitRecord(Code, Record, AbbrevToUse);3046    Record.clear();3047  }3048 3049  Stream.ExitBlock();3050}3051 3052void ModuleBitcodeWriter::writeModuleConstants() {3053  const ValueEnumerator::ValueList &Vals = VE.getValues();3054 3055  // Find the first constant to emit, which is the first non-globalvalue value.3056  // We know globalvalues have been emitted by WriteModuleInfo.3057  for (unsigned i = 0, e = Vals.size(); i != e; ++i) {3058    if (!isa<GlobalValue>(Vals[i].first)) {3059      writeConstants(i, Vals.size(), true);3060      return;3061    }3062  }3063}3064 3065/// pushValueAndType - The file has to encode both the value and type id for3066/// many values, because we need to know what type to create for forward3067/// references.  However, most operands are not forward references, so this type3068/// field is not needed.3069///3070/// This function adds V's value ID to Vals.  If the value ID is higher than the3071/// instruction ID, then it is a forward reference, and it also includes the3072/// type ID.  The value ID that is written is encoded relative to the InstID.3073bool ModuleBitcodeWriter::pushValueAndType(const Value *V, unsigned InstID,3074                                           SmallVectorImpl<unsigned> &Vals) {3075  unsigned ValID = VE.getValueID(V);3076  // Make encoding relative to the InstID.3077  Vals.push_back(InstID - ValID);3078  if (ValID >= InstID) {3079    Vals.push_back(VE.getTypeID(V->getType()));3080    return true;3081  }3082  return false;3083}3084 3085bool ModuleBitcodeWriter::pushValueOrMetadata(const Value *V, unsigned InstID,3086                                              SmallVectorImpl<unsigned> &Vals) {3087  bool IsMetadata = V->getType()->isMetadataTy();3088  if (IsMetadata) {3089    Vals.push_back(bitc::OB_METADATA);3090    Metadata *MD = cast<MetadataAsValue>(V)->getMetadata();3091    unsigned ValID = VE.getMetadataID(MD);3092    Vals.push_back(InstID - ValID);3093    return false;3094  }3095  return pushValueAndType(V, InstID, Vals);3096}3097 3098void ModuleBitcodeWriter::writeOperandBundles(const CallBase &CS,3099                                              unsigned InstID) {3100  SmallVector<unsigned, 64> Record;3101  LLVMContext &C = CS.getContext();3102 3103  for (unsigned i = 0, e = CS.getNumOperandBundles(); i != e; ++i) {3104    const auto &Bundle = CS.getOperandBundleAt(i);3105    Record.push_back(C.getOperandBundleTagID(Bundle.getTagName()));3106 3107    for (auto &Input : Bundle.Inputs)3108      pushValueOrMetadata(Input, InstID, Record);3109 3110    Stream.EmitRecord(bitc::FUNC_CODE_OPERAND_BUNDLE, Record);3111    Record.clear();3112  }3113}3114 3115/// pushValue - Like pushValueAndType, but where the type of the value is3116/// omitted (perhaps it was already encoded in an earlier operand).3117void ModuleBitcodeWriter::pushValue(const Value *V, unsigned InstID,3118                                    SmallVectorImpl<unsigned> &Vals) {3119  unsigned ValID = VE.getValueID(V);3120  Vals.push_back(InstID - ValID);3121}3122 3123void ModuleBitcodeWriter::pushValueSigned(const Value *V, unsigned InstID,3124                                          SmallVectorImpl<uint64_t> &Vals) {3125  unsigned ValID = VE.getValueID(V);3126  int64_t diff = ((int32_t)InstID - (int32_t)ValID);3127  emitSignedInt64(Vals, diff);3128}3129 3130/// WriteInstruction - Emit an instruction to the specified stream.3131void ModuleBitcodeWriter::writeInstruction(const Instruction &I,3132                                           unsigned InstID,3133                                           SmallVectorImpl<unsigned> &Vals) {3134  unsigned Code = 0;3135  unsigned AbbrevToUse = 0;3136  VE.setInstructionID(&I);3137  switch (I.getOpcode()) {3138  default:3139    if (Instruction::isCast(I.getOpcode())) {3140      Code = bitc::FUNC_CODE_INST_CAST;3141      if (!pushValueAndType(I.getOperand(0), InstID, Vals))3142        AbbrevToUse = FUNCTION_INST_CAST_ABBREV;3143      Vals.push_back(VE.getTypeID(I.getType()));3144      Vals.push_back(getEncodedCastOpcode(I.getOpcode()));3145      uint64_t Flags = getOptimizationFlags(&I);3146      if (Flags != 0) {3147        if (AbbrevToUse == FUNCTION_INST_CAST_ABBREV)3148          AbbrevToUse = FUNCTION_INST_CAST_FLAGS_ABBREV;3149        Vals.push_back(Flags);3150      }3151    } else {3152      assert(isa<BinaryOperator>(I) && "Unknown instruction!");3153      Code = bitc::FUNC_CODE_INST_BINOP;3154      if (!pushValueAndType(I.getOperand(0), InstID, Vals))3155        AbbrevToUse = FUNCTION_INST_BINOP_ABBREV;3156      pushValue(I.getOperand(1), InstID, Vals);3157      Vals.push_back(getEncodedBinaryOpcode(I.getOpcode()));3158      uint64_t Flags = getOptimizationFlags(&I);3159      if (Flags != 0) {3160        if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV)3161          AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV;3162        Vals.push_back(Flags);3163      }3164    }3165    break;3166  case Instruction::FNeg: {3167    Code = bitc::FUNC_CODE_INST_UNOP;3168    if (!pushValueAndType(I.getOperand(0), InstID, Vals))3169      AbbrevToUse = FUNCTION_INST_UNOP_ABBREV;3170    Vals.push_back(getEncodedUnaryOpcode(I.getOpcode()));3171    uint64_t Flags = getOptimizationFlags(&I);3172    if (Flags != 0) {3173      if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV)3174        AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV;3175      Vals.push_back(Flags);3176    }3177    break;3178  }3179  case Instruction::GetElementPtr: {3180    Code = bitc::FUNC_CODE_INST_GEP;3181    AbbrevToUse = FUNCTION_INST_GEP_ABBREV;3182    auto &GEPInst = cast<GetElementPtrInst>(I);3183    Vals.push_back(getOptimizationFlags(&I));3184    Vals.push_back(VE.getTypeID(GEPInst.getSourceElementType()));3185    for (const Value *Op : I.operands())3186      pushValueAndType(Op, InstID, Vals);3187    break;3188  }3189  case Instruction::ExtractValue: {3190    Code = bitc::FUNC_CODE_INST_EXTRACTVAL;3191    pushValueAndType(I.getOperand(0), InstID, Vals);3192    const ExtractValueInst *EVI = cast<ExtractValueInst>(&I);3193    Vals.append(EVI->idx_begin(), EVI->idx_end());3194    break;3195  }3196  case Instruction::InsertValue: {3197    Code = bitc::FUNC_CODE_INST_INSERTVAL;3198    pushValueAndType(I.getOperand(0), InstID, Vals);3199    pushValueAndType(I.getOperand(1), InstID, Vals);3200    const InsertValueInst *IVI = cast<InsertValueInst>(&I);3201    Vals.append(IVI->idx_begin(), IVI->idx_end());3202    break;3203  }3204  case Instruction::Select: {3205    Code = bitc::FUNC_CODE_INST_VSELECT;3206    pushValueAndType(I.getOperand(1), InstID, Vals);3207    pushValue(I.getOperand(2), InstID, Vals);3208    pushValueAndType(I.getOperand(0), InstID, Vals);3209    uint64_t Flags = getOptimizationFlags(&I);3210    if (Flags != 0)3211      Vals.push_back(Flags);3212    break;3213  }3214  case Instruction::ExtractElement:3215    Code = bitc::FUNC_CODE_INST_EXTRACTELT;3216    pushValueAndType(I.getOperand(0), InstID, Vals);3217    pushValueAndType(I.getOperand(1), InstID, Vals);3218    break;3219  case Instruction::InsertElement:3220    Code = bitc::FUNC_CODE_INST_INSERTELT;3221    pushValueAndType(I.getOperand(0), InstID, Vals);3222    pushValue(I.getOperand(1), InstID, Vals);3223    pushValueAndType(I.getOperand(2), InstID, Vals);3224    break;3225  case Instruction::ShuffleVector:3226    Code = bitc::FUNC_CODE_INST_SHUFFLEVEC;3227    pushValueAndType(I.getOperand(0), InstID, Vals);3228    pushValue(I.getOperand(1), InstID, Vals);3229    pushValue(cast<ShuffleVectorInst>(I).getShuffleMaskForBitcode(), InstID,3230              Vals);3231    break;3232  case Instruction::ICmp:3233  case Instruction::FCmp: {3234    // compare returning Int1Ty or vector of Int1Ty3235    Code = bitc::FUNC_CODE_INST_CMP2;3236    AbbrevToUse = FUNCTION_INST_CMP_ABBREV;3237    if (pushValueAndType(I.getOperand(0), InstID, Vals))3238      AbbrevToUse = 0;3239    pushValue(I.getOperand(1), InstID, Vals);3240    Vals.push_back(cast<CmpInst>(I).getPredicate());3241    uint64_t Flags = getOptimizationFlags(&I);3242    if (Flags != 0) {3243      Vals.push_back(Flags);3244      if (AbbrevToUse)3245        AbbrevToUse = FUNCTION_INST_CMP_FLAGS_ABBREV;3246    }3247    break;3248  }3249 3250  case Instruction::Ret:3251    {3252      Code = bitc::FUNC_CODE_INST_RET;3253      unsigned NumOperands = I.getNumOperands();3254      if (NumOperands == 0)3255        AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV;3256      else if (NumOperands == 1) {3257        if (!pushValueAndType(I.getOperand(0), InstID, Vals))3258          AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV;3259      } else {3260        for (const Value *Op : I.operands())3261          pushValueAndType(Op, InstID, Vals);3262      }3263    }3264    break;3265  case Instruction::Br:3266    {3267      Code = bitc::FUNC_CODE_INST_BR;3268      AbbrevToUse = FUNCTION_INST_BR_UNCOND_ABBREV;3269      const BranchInst &II = cast<BranchInst>(I);3270      Vals.push_back(VE.getValueID(II.getSuccessor(0)));3271      if (II.isConditional()) {3272        Vals.push_back(VE.getValueID(II.getSuccessor(1)));3273        pushValue(II.getCondition(), InstID, Vals);3274        AbbrevToUse = FUNCTION_INST_BR_COND_ABBREV;3275      }3276    }3277    break;3278  case Instruction::Switch:3279    {3280      Code = bitc::FUNC_CODE_INST_SWITCH;3281      const SwitchInst &SI = cast<SwitchInst>(I);3282      Vals.push_back(VE.getTypeID(SI.getCondition()->getType()));3283      pushValue(SI.getCondition(), InstID, Vals);3284      Vals.push_back(VE.getValueID(SI.getDefaultDest()));3285      for (auto Case : SI.cases()) {3286        Vals.push_back(VE.getValueID(Case.getCaseValue()));3287        Vals.push_back(VE.getValueID(Case.getCaseSuccessor()));3288      }3289    }3290    break;3291  case Instruction::IndirectBr:3292    Code = bitc::FUNC_CODE_INST_INDIRECTBR;3293    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));3294    // Encode the address operand as relative, but not the basic blocks.3295    pushValue(I.getOperand(0), InstID, Vals);3296    for (const Value *Op : drop_begin(I.operands()))3297      Vals.push_back(VE.getValueID(Op));3298    break;3299 3300  case Instruction::Invoke: {3301    const InvokeInst *II = cast<InvokeInst>(&I);3302    const Value *Callee = II->getCalledOperand();3303    FunctionType *FTy = II->getFunctionType();3304 3305    if (II->hasOperandBundles())3306      writeOperandBundles(*II, InstID);3307 3308    Code = bitc::FUNC_CODE_INST_INVOKE;3309 3310    Vals.push_back(VE.getAttributeListID(II->getAttributes()));3311    Vals.push_back(II->getCallingConv() | 1 << 13);3312    Vals.push_back(VE.getValueID(II->getNormalDest()));3313    Vals.push_back(VE.getValueID(II->getUnwindDest()));3314    Vals.push_back(VE.getTypeID(FTy));3315    pushValueAndType(Callee, InstID, Vals);3316 3317    // Emit value #'s for the fixed parameters.3318    for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)3319      pushValue(I.getOperand(i), InstID, Vals); // fixed param.3320 3321    // Emit type/value pairs for varargs params.3322    if (FTy->isVarArg()) {3323      for (unsigned i = FTy->getNumParams(), e = II->arg_size(); i != e; ++i)3324        pushValueAndType(I.getOperand(i), InstID, Vals); // vararg3325    }3326    break;3327  }3328  case Instruction::Resume:3329    Code = bitc::FUNC_CODE_INST_RESUME;3330    pushValueAndType(I.getOperand(0), InstID, Vals);3331    break;3332  case Instruction::CleanupRet: {3333    Code = bitc::FUNC_CODE_INST_CLEANUPRET;3334    const auto &CRI = cast<CleanupReturnInst>(I);3335    pushValue(CRI.getCleanupPad(), InstID, Vals);3336    if (CRI.hasUnwindDest())3337      Vals.push_back(VE.getValueID(CRI.getUnwindDest()));3338    break;3339  }3340  case Instruction::CatchRet: {3341    Code = bitc::FUNC_CODE_INST_CATCHRET;3342    const auto &CRI = cast<CatchReturnInst>(I);3343    pushValue(CRI.getCatchPad(), InstID, Vals);3344    Vals.push_back(VE.getValueID(CRI.getSuccessor()));3345    break;3346  }3347  case Instruction::CleanupPad:3348  case Instruction::CatchPad: {3349    const auto &FuncletPad = cast<FuncletPadInst>(I);3350    Code = isa<CatchPadInst>(FuncletPad) ? bitc::FUNC_CODE_INST_CATCHPAD3351                                         : bitc::FUNC_CODE_INST_CLEANUPPAD;3352    pushValue(FuncletPad.getParentPad(), InstID, Vals);3353 3354    unsigned NumArgOperands = FuncletPad.arg_size();3355    Vals.push_back(NumArgOperands);3356    for (unsigned Op = 0; Op != NumArgOperands; ++Op)3357      pushValueAndType(FuncletPad.getArgOperand(Op), InstID, Vals);3358    break;3359  }3360  case Instruction::CatchSwitch: {3361    Code = bitc::FUNC_CODE_INST_CATCHSWITCH;3362    const auto &CatchSwitch = cast<CatchSwitchInst>(I);3363 3364    pushValue(CatchSwitch.getParentPad(), InstID, Vals);3365 3366    unsigned NumHandlers = CatchSwitch.getNumHandlers();3367    Vals.push_back(NumHandlers);3368    for (const BasicBlock *CatchPadBB : CatchSwitch.handlers())3369      Vals.push_back(VE.getValueID(CatchPadBB));3370 3371    if (CatchSwitch.hasUnwindDest())3372      Vals.push_back(VE.getValueID(CatchSwitch.getUnwindDest()));3373    break;3374  }3375  case Instruction::CallBr: {3376    const CallBrInst *CBI = cast<CallBrInst>(&I);3377    const Value *Callee = CBI->getCalledOperand();3378    FunctionType *FTy = CBI->getFunctionType();3379 3380    if (CBI->hasOperandBundles())3381      writeOperandBundles(*CBI, InstID);3382 3383    Code = bitc::FUNC_CODE_INST_CALLBR;3384 3385    Vals.push_back(VE.getAttributeListID(CBI->getAttributes()));3386 3387    Vals.push_back(CBI->getCallingConv() << bitc::CALL_CCONV |3388                   1 << bitc::CALL_EXPLICIT_TYPE);3389 3390    Vals.push_back(VE.getValueID(CBI->getDefaultDest()));3391    Vals.push_back(CBI->getNumIndirectDests());3392    for (unsigned i = 0, e = CBI->getNumIndirectDests(); i != e; ++i)3393      Vals.push_back(VE.getValueID(CBI->getIndirectDest(i)));3394 3395    Vals.push_back(VE.getTypeID(FTy));3396    pushValueAndType(Callee, InstID, Vals);3397 3398    // Emit value #'s for the fixed parameters.3399    for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)3400      pushValue(I.getOperand(i), InstID, Vals); // fixed param.3401 3402    // Emit type/value pairs for varargs params.3403    if (FTy->isVarArg()) {3404      for (unsigned i = FTy->getNumParams(), e = CBI->arg_size(); i != e; ++i)3405        pushValueAndType(I.getOperand(i), InstID, Vals); // vararg3406    }3407    break;3408  }3409  case Instruction::Unreachable:3410    Code = bitc::FUNC_CODE_INST_UNREACHABLE;3411    AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;3412    break;3413 3414  case Instruction::PHI: {3415    const PHINode &PN = cast<PHINode>(I);3416    Code = bitc::FUNC_CODE_INST_PHI;3417    // With the newer instruction encoding, forward references could give3418    // negative valued IDs.  This is most common for PHIs, so we use3419    // signed VBRs.3420    SmallVector<uint64_t, 128> Vals64;3421    Vals64.push_back(VE.getTypeID(PN.getType()));3422    for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) {3423      pushValueSigned(PN.getIncomingValue(i), InstID, Vals64);3424      Vals64.push_back(VE.getValueID(PN.getIncomingBlock(i)));3425    }3426 3427    uint64_t Flags = getOptimizationFlags(&I);3428    if (Flags != 0)3429      Vals64.push_back(Flags);3430 3431    // Emit a Vals64 vector and exit.3432    Stream.EmitRecord(Code, Vals64, AbbrevToUse);3433    Vals64.clear();3434    return;3435  }3436 3437  case Instruction::LandingPad: {3438    const LandingPadInst &LP = cast<LandingPadInst>(I);3439    Code = bitc::FUNC_CODE_INST_LANDINGPAD;3440    Vals.push_back(VE.getTypeID(LP.getType()));3441    Vals.push_back(LP.isCleanup());3442    Vals.push_back(LP.getNumClauses());3443    for (unsigned I = 0, E = LP.getNumClauses(); I != E; ++I) {3444      if (LP.isCatch(I))3445        Vals.push_back(LandingPadInst::Catch);3446      else3447        Vals.push_back(LandingPadInst::Filter);3448      pushValueAndType(LP.getClause(I), InstID, Vals);3449    }3450    break;3451  }3452 3453  case Instruction::Alloca: {3454    Code = bitc::FUNC_CODE_INST_ALLOCA;3455    const AllocaInst &AI = cast<AllocaInst>(I);3456    Vals.push_back(VE.getTypeID(AI.getAllocatedType()));3457    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));3458    Vals.push_back(VE.getValueID(I.getOperand(0))); // size.3459    using APV = AllocaPackedValues;3460    unsigned Record = 0;3461    unsigned EncodedAlign = getEncodedAlign(AI.getAlign());3462    Bitfield::set<APV::AlignLower>(3463        Record, EncodedAlign & ((1 << APV::AlignLower::Bits) - 1));3464    Bitfield::set<APV::AlignUpper>(Record,3465                                   EncodedAlign >> APV::AlignLower::Bits);3466    Bitfield::set<APV::UsedWithInAlloca>(Record, AI.isUsedWithInAlloca());3467    Bitfield::set<APV::ExplicitType>(Record, true);3468    Bitfield::set<APV::SwiftError>(Record, AI.isSwiftError());3469    Vals.push_back(Record);3470 3471    unsigned AS = AI.getAddressSpace();3472    if (AS != M.getDataLayout().getAllocaAddrSpace())3473      Vals.push_back(AS);3474    break;3475  }3476 3477  case Instruction::Load:3478    if (cast<LoadInst>(I).isAtomic()) {3479      Code = bitc::FUNC_CODE_INST_LOADATOMIC;3480      pushValueAndType(I.getOperand(0), InstID, Vals);3481    } else {3482      Code = bitc::FUNC_CODE_INST_LOAD;3483      if (!pushValueAndType(I.getOperand(0), InstID, Vals)) // ptr3484        AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;3485    }3486    Vals.push_back(VE.getTypeID(I.getType()));3487    Vals.push_back(getEncodedAlign(cast<LoadInst>(I).getAlign()));3488    Vals.push_back(cast<LoadInst>(I).isVolatile());3489    if (cast<LoadInst>(I).isAtomic()) {3490      Vals.push_back(getEncodedOrdering(cast<LoadInst>(I).getOrdering()));3491      Vals.push_back(getEncodedSyncScopeID(cast<LoadInst>(I).getSyncScopeID()));3492    }3493    break;3494  case Instruction::Store:3495    if (cast<StoreInst>(I).isAtomic()) {3496      Code = bitc::FUNC_CODE_INST_STOREATOMIC;3497    } else {3498      Code = bitc::FUNC_CODE_INST_STORE;3499      AbbrevToUse = FUNCTION_INST_STORE_ABBREV;3500    }3501    if (pushValueAndType(I.getOperand(1), InstID, Vals)) // ptrty + ptr3502      AbbrevToUse = 0;3503    if (pushValueAndType(I.getOperand(0), InstID, Vals)) // valty + val3504      AbbrevToUse = 0;3505    Vals.push_back(getEncodedAlign(cast<StoreInst>(I).getAlign()));3506    Vals.push_back(cast<StoreInst>(I).isVolatile());3507    if (cast<StoreInst>(I).isAtomic()) {3508      Vals.push_back(getEncodedOrdering(cast<StoreInst>(I).getOrdering()));3509      Vals.push_back(3510          getEncodedSyncScopeID(cast<StoreInst>(I).getSyncScopeID()));3511    }3512    break;3513  case Instruction::AtomicCmpXchg:3514    Code = bitc::FUNC_CODE_INST_CMPXCHG;3515    pushValueAndType(I.getOperand(0), InstID, Vals); // ptrty + ptr3516    pushValueAndType(I.getOperand(1), InstID, Vals); // cmp.3517    pushValue(I.getOperand(2), InstID, Vals);        // newval.3518    Vals.push_back(cast<AtomicCmpXchgInst>(I).isVolatile());3519    Vals.push_back(3520        getEncodedOrdering(cast<AtomicCmpXchgInst>(I).getSuccessOrdering()));3521    Vals.push_back(3522        getEncodedSyncScopeID(cast<AtomicCmpXchgInst>(I).getSyncScopeID()));3523    Vals.push_back(3524        getEncodedOrdering(cast<AtomicCmpXchgInst>(I).getFailureOrdering()));3525    Vals.push_back(cast<AtomicCmpXchgInst>(I).isWeak());3526    Vals.push_back(getEncodedAlign(cast<AtomicCmpXchgInst>(I).getAlign()));3527    break;3528  case Instruction::AtomicRMW:3529    Code = bitc::FUNC_CODE_INST_ATOMICRMW;3530    pushValueAndType(I.getOperand(0), InstID, Vals); // ptrty + ptr3531    pushValueAndType(I.getOperand(1), InstID, Vals); // valty + val3532    Vals.push_back(3533        getEncodedRMWOperation(cast<AtomicRMWInst>(I).getOperation()));3534    Vals.push_back(cast<AtomicRMWInst>(I).isVolatile());3535    Vals.push_back(getEncodedOrdering(cast<AtomicRMWInst>(I).getOrdering()));3536    Vals.push_back(3537        getEncodedSyncScopeID(cast<AtomicRMWInst>(I).getSyncScopeID()));3538    Vals.push_back(getEncodedAlign(cast<AtomicRMWInst>(I).getAlign()));3539    break;3540  case Instruction::Fence:3541    Code = bitc::FUNC_CODE_INST_FENCE;3542    Vals.push_back(getEncodedOrdering(cast<FenceInst>(I).getOrdering()));3543    Vals.push_back(getEncodedSyncScopeID(cast<FenceInst>(I).getSyncScopeID()));3544    break;3545  case Instruction::Call: {3546    const CallInst &CI = cast<CallInst>(I);3547    FunctionType *FTy = CI.getFunctionType();3548 3549    if (CI.hasOperandBundles())3550      writeOperandBundles(CI, InstID);3551 3552    Code = bitc::FUNC_CODE_INST_CALL;3553 3554    Vals.push_back(VE.getAttributeListID(CI.getAttributes()));3555 3556    unsigned Flags = getOptimizationFlags(&I);3557    Vals.push_back(CI.getCallingConv() << bitc::CALL_CCONV |3558                   unsigned(CI.isTailCall()) << bitc::CALL_TAIL |3559                   unsigned(CI.isMustTailCall()) << bitc::CALL_MUSTTAIL |3560                   1 << bitc::CALL_EXPLICIT_TYPE |3561                   unsigned(CI.isNoTailCall()) << bitc::CALL_NOTAIL |3562                   unsigned(Flags != 0) << bitc::CALL_FMF);3563    if (Flags != 0)3564      Vals.push_back(Flags);3565 3566    Vals.push_back(VE.getTypeID(FTy));3567    pushValueAndType(CI.getCalledOperand(), InstID, Vals); // Callee3568 3569    // Emit value #'s for the fixed parameters.3570    for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)3571      pushValue(CI.getArgOperand(i), InstID, Vals); // fixed param.3572 3573    // Emit type/value pairs for varargs params.3574    if (FTy->isVarArg()) {3575      for (unsigned i = FTy->getNumParams(), e = CI.arg_size(); i != e; ++i)3576        pushValueAndType(CI.getArgOperand(i), InstID, Vals); // varargs3577    }3578    break;3579  }3580  case Instruction::VAArg:3581    Code = bitc::FUNC_CODE_INST_VAARG;3582    Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));   // valistty3583    pushValue(I.getOperand(0), InstID, Vals);                   // valist.3584    Vals.push_back(VE.getTypeID(I.getType())); // restype.3585    break;3586  case Instruction::Freeze:3587    Code = bitc::FUNC_CODE_INST_FREEZE;3588    pushValueAndType(I.getOperand(0), InstID, Vals);3589    break;3590  }3591 3592  Stream.EmitRecord(Code, Vals, AbbrevToUse);3593  Vals.clear();3594}3595 3596/// Write a GlobalValue VST to the module. The purpose of this data structure is3597/// to allow clients to efficiently find the function body.3598void ModuleBitcodeWriter::writeGlobalValueSymbolTable(3599  DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {3600  // Get the offset of the VST we are writing, and backpatch it into3601  // the VST forward declaration record.3602  uint64_t VSTOffset = Stream.GetCurrentBitNo();3603  // The BitcodeStartBit was the stream offset of the identification block.3604  VSTOffset -= bitcodeStartBit();3605  assert((VSTOffset & 31) == 0 && "VST block not 32-bit aligned");3606  // Note that we add 1 here because the offset is relative to one word3607  // before the start of the identification block, which was historically3608  // always the start of the regular bitcode header.3609  Stream.BackpatchWord(VSTOffsetPlaceholder, VSTOffset / 32 + 1);3610 3611  Stream.EnterSubblock(bitc::VALUE_SYMTAB_BLOCK_ID, 4);3612 3613  auto Abbv = std::make_shared<BitCodeAbbrev>();3614  Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_FNENTRY));3615  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id3616  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // funcoffset3617  unsigned FnEntryAbbrev = Stream.EmitAbbrev(std::move(Abbv));3618 3619  for (const Function &F : M) {3620    uint64_t Record[2];3621 3622    if (F.isDeclaration())3623      continue;3624 3625    Record[0] = VE.getValueID(&F);3626 3627    // Save the word offset of the function (from the start of the3628    // actual bitcode written to the stream).3629    uint64_t BitcodeIndex = FunctionToBitcodeIndex[&F] - bitcodeStartBit();3630    assert((BitcodeIndex & 31) == 0 && "function block not 32-bit aligned");3631    // Note that we add 1 here because the offset is relative to one word3632    // before the start of the identification block, which was historically3633    // always the start of the regular bitcode header.3634    Record[1] = BitcodeIndex / 32 + 1;3635 3636    Stream.EmitRecord(bitc::VST_CODE_FNENTRY, Record, FnEntryAbbrev);3637  }3638 3639  Stream.ExitBlock();3640}3641 3642/// Emit names for arguments, instructions and basic blocks in a function.3643void ModuleBitcodeWriter::writeFunctionLevelValueSymbolTable(3644    const ValueSymbolTable &VST) {3645  if (VST.empty())3646    return;3647 3648  Stream.EnterSubblock(bitc::VALUE_SYMTAB_BLOCK_ID, 4);3649 3650  // FIXME: Set up the abbrev, we know how many values there are!3651  // FIXME: We know if the type names can use 7-bit ascii.3652  SmallVector<uint64_t, 64> NameVals;3653 3654  for (const ValueName &Name : VST) {3655    // Figure out the encoding to use for the name.3656    StringEncoding Bits = getStringEncoding(Name.getKey());3657 3658    unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;3659    NameVals.push_back(VE.getValueID(Name.getValue()));3660 3661    // VST_CODE_ENTRY:   [valueid, namechar x N]3662    // VST_CODE_BBENTRY: [bbid, namechar x N]3663    unsigned Code;3664    if (isa<BasicBlock>(Name.getValue())) {3665      Code = bitc::VST_CODE_BBENTRY;3666      if (Bits == SE_Char6)3667        AbbrevToUse = VST_BBENTRY_6_ABBREV;3668    } else {3669      Code = bitc::VST_CODE_ENTRY;3670      if (Bits == SE_Char6)3671        AbbrevToUse = VST_ENTRY_6_ABBREV;3672      else if (Bits == SE_Fixed7)3673        AbbrevToUse = VST_ENTRY_7_ABBREV;3674    }3675 3676    for (const auto P : Name.getKey())3677      NameVals.push_back((unsigned char)P);3678 3679    // Emit the finished record.3680    Stream.EmitRecord(Code, NameVals, AbbrevToUse);3681    NameVals.clear();3682  }3683 3684  Stream.ExitBlock();3685}3686 3687void ModuleBitcodeWriter::writeUseList(UseListOrder &&Order) {3688  assert(Order.Shuffle.size() >= 2 && "Shuffle too small");3689  unsigned Code;3690  if (isa<BasicBlock>(Order.V))3691    Code = bitc::USELIST_CODE_BB;3692  else3693    Code = bitc::USELIST_CODE_DEFAULT;3694 3695  SmallVector<uint64_t, 64> Record(Order.Shuffle.begin(), Order.Shuffle.end());3696  Record.push_back(VE.getValueID(Order.V));3697  Stream.EmitRecord(Code, Record);3698}3699 3700void ModuleBitcodeWriter::writeUseListBlock(const Function *F) {3701  assert(VE.shouldPreserveUseListOrder() &&3702         "Expected to be preserving use-list order");3703 3704  auto hasMore = [&]() {3705    return !VE.UseListOrders.empty() && VE.UseListOrders.back().F == F;3706  };3707  if (!hasMore())3708    // Nothing to do.3709    return;3710 3711  Stream.EnterSubblock(bitc::USELIST_BLOCK_ID, 3);3712  while (hasMore()) {3713    writeUseList(std::move(VE.UseListOrders.back()));3714    VE.UseListOrders.pop_back();3715  }3716  Stream.ExitBlock();3717}3718 3719/// Emit a function body to the module stream.3720void ModuleBitcodeWriter::writeFunction(3721    const Function &F,3722    DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {3723  // Save the bitcode index of the start of this function block for recording3724  // in the VST.3725  FunctionToBitcodeIndex[&F] = Stream.GetCurrentBitNo();3726 3727  Stream.EnterSubblock(bitc::FUNCTION_BLOCK_ID, 5);3728  VE.incorporateFunction(F);3729 3730  SmallVector<unsigned, 64> Vals;3731 3732  // Emit the number of basic blocks, so the reader can create them ahead of3733  // time.3734  Vals.push_back(VE.getBasicBlocks().size());3735  Stream.EmitRecord(bitc::FUNC_CODE_DECLAREBLOCKS, Vals);3736  Vals.clear();3737 3738  // If there are function-local constants, emit them now.3739  unsigned CstStart, CstEnd;3740  VE.getFunctionConstantRange(CstStart, CstEnd);3741  writeConstants(CstStart, CstEnd, false);3742 3743  // If there is function-local metadata, emit it now.3744  writeFunctionMetadata(F);3745 3746  // Keep a running idea of what the instruction ID is.3747  unsigned InstID = CstEnd;3748 3749  bool NeedsMetadataAttachment = F.hasMetadata();3750 3751  DILocation *LastDL = nullptr;3752  SmallSetVector<Function *, 4> BlockAddressUsers;3753 3754  // Finally, emit all the instructions, in order.3755  for (const BasicBlock &BB : F) {3756    for (const Instruction &I : BB) {3757      writeInstruction(I, InstID, Vals);3758 3759      if (!I.getType()->isVoidTy())3760        ++InstID;3761 3762      // If the instruction has metadata, write a metadata attachment later.3763      NeedsMetadataAttachment |= I.hasMetadataOtherThanDebugLoc();3764 3765      // If the instruction has a debug location, emit it.3766      if (DILocation *DL = I.getDebugLoc()) {3767        if (DL == LastDL) {3768          // Just repeat the same debug loc as last time.3769          Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC_AGAIN, Vals);3770        } else {3771          Vals.push_back(DL->getLine());3772          Vals.push_back(DL->getColumn());3773          Vals.push_back(VE.getMetadataOrNullID(DL->getScope()));3774          Vals.push_back(VE.getMetadataOrNullID(DL->getInlinedAt()));3775          Vals.push_back(DL->isImplicitCode());3776          Vals.push_back(DL->getAtomGroup());3777          Vals.push_back(DL->getAtomRank());3778          Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals,3779                            FUNCTION_DEBUG_LOC_ABBREV);3780          Vals.clear();3781          LastDL = DL;3782        }3783      }3784 3785      // If the instruction has DbgRecords attached to it, emit them. Note that3786      // they come after the instruction so that it's easy to attach them again3787      // when reading the bitcode, even though conceptually the debug locations3788      // start "before" the instruction.3789      if (I.hasDbgRecords()) {3790        /// Try to push the value only (unwrapped), otherwise push the3791        /// metadata wrapped value. Returns true if the value was pushed3792        /// without the ValueAsMetadata wrapper.3793        auto PushValueOrMetadata = [&Vals, InstID,3794                                    this](Metadata *RawLocation) {3795          assert(RawLocation &&3796                 "RawLocation unexpectedly null in DbgVariableRecord");3797          if (ValueAsMetadata *VAM = dyn_cast<ValueAsMetadata>(RawLocation)) {3798            SmallVector<unsigned, 2> ValAndType;3799            // If the value is a fwd-ref the type is also pushed. We don't3800            // want the type, so fwd-refs are kept wrapped (pushValueAndType3801            // returns false if the value is pushed without type).3802            if (!pushValueAndType(VAM->getValue(), InstID, ValAndType)) {3803              Vals.push_back(ValAndType[0]);3804              return true;3805            }3806          }3807          // The metadata is a DIArgList, or ValueAsMetadata wrapping a3808          // fwd-ref. Push the metadata ID.3809          Vals.push_back(VE.getMetadataID(RawLocation));3810          return false;3811        };3812 3813        // Write out non-instruction debug information attached to this3814        // instruction. Write it after the instruction so that it's easy to3815        // re-attach to the instruction reading the records in.3816        for (DbgRecord &DR : I.DebugMarker->getDbgRecordRange()) {3817          if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {3818            Vals.push_back(VE.getMetadataID(&*DLR->getDebugLoc()));3819            Vals.push_back(VE.getMetadataID(DLR->getLabel()));3820            Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_LABEL, Vals);3821            Vals.clear();3822            continue;3823          }3824 3825          // First 3 fields are common to all kinds:3826          //   DILocation, DILocalVariable, DIExpression3827          // dbg_value (FUNC_CODE_DEBUG_RECORD_VALUE)3828          //   ..., LocationMetadata3829          // dbg_value (FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE - abbrev'd)3830          //   ..., Value3831          // dbg_declare (FUNC_CODE_DEBUG_RECORD_DECLARE)3832          //   ..., LocationMetadata3833          // dbg_assign (FUNC_CODE_DEBUG_RECORD_ASSIGN)3834          //   ..., LocationMetadata, DIAssignID, DIExpression, LocationMetadata3835          DbgVariableRecord &DVR = cast<DbgVariableRecord>(DR);3836          Vals.push_back(VE.getMetadataID(&*DVR.getDebugLoc()));3837          Vals.push_back(VE.getMetadataID(DVR.getVariable()));3838          Vals.push_back(VE.getMetadataID(DVR.getExpression()));3839          if (DVR.isDbgValue()) {3840            if (PushValueOrMetadata(DVR.getRawLocation()))3841              Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE, Vals,3842                                FUNCTION_DEBUG_RECORD_VALUE_ABBREV);3843            else3844              Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_VALUE, Vals);3845          } else if (DVR.isDbgDeclare()) {3846            Vals.push_back(VE.getMetadataID(DVR.getRawLocation()));3847            Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_DECLARE, Vals);3848          } else if (DVR.isDbgDeclareValue()) {3849            Vals.push_back(VE.getMetadataID(DVR.getRawLocation()));3850            Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_DECLARE_VALUE, Vals);3851          } else {3852            assert(DVR.isDbgAssign() && "Unexpected DbgRecord kind");3853            Vals.push_back(VE.getMetadataID(DVR.getRawLocation()));3854            Vals.push_back(VE.getMetadataID(DVR.getAssignID()));3855            Vals.push_back(VE.getMetadataID(DVR.getAddressExpression()));3856            Vals.push_back(VE.getMetadataID(DVR.getRawAddress()));3857            Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_RECORD_ASSIGN, Vals);3858          }3859          Vals.clear();3860        }3861      }3862    }3863 3864    if (BlockAddress *BA = BlockAddress::lookup(&BB)) {3865      SmallVector<Value *> Worklist{BA};3866      SmallPtrSet<Value *, 8> Visited{BA};3867      while (!Worklist.empty()) {3868        Value *V = Worklist.pop_back_val();3869        for (User *U : V->users()) {3870          if (auto *I = dyn_cast<Instruction>(U)) {3871            Function *P = I->getFunction();3872            if (P != &F)3873              BlockAddressUsers.insert(P);3874          } else if (isa<Constant>(U) && !isa<GlobalValue>(U) &&3875                     Visited.insert(U).second)3876            Worklist.push_back(U);3877        }3878      }3879    }3880  }3881 3882  if (!BlockAddressUsers.empty()) {3883    Vals.resize(BlockAddressUsers.size());3884    for (auto I : llvm::enumerate(BlockAddressUsers))3885      Vals[I.index()] = VE.getValueID(I.value());3886    Stream.EmitRecord(bitc::FUNC_CODE_BLOCKADDR_USERS, Vals);3887    Vals.clear();3888  }3889 3890  // Emit names for all the instructions etc.3891  if (auto *Symtab = F.getValueSymbolTable())3892    writeFunctionLevelValueSymbolTable(*Symtab);3893 3894  if (NeedsMetadataAttachment)3895    writeFunctionMetadataAttachment(F);3896  if (VE.shouldPreserveUseListOrder())3897    writeUseListBlock(&F);3898  VE.purgeFunction();3899  Stream.ExitBlock();3900}3901 3902// Emit blockinfo, which defines the standard abbreviations etc.3903void ModuleBitcodeWriter::writeBlockInfo() {3904  // We only want to emit block info records for blocks that have multiple3905  // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK and VALUE_SYMTAB_BLOCK.3906  // Other blocks can define their abbrevs inline.3907  Stream.EnterBlockInfoBlock();3908 3909  // Encode type indices using fixed size based on number of types.3910  BitCodeAbbrevOp TypeAbbrevOp(BitCodeAbbrevOp::Fixed,3911                               VE.computeBitsRequiredForTypeIndices());3912  // Encode value indices as 6-bit VBR.3913  BitCodeAbbrevOp ValAbbrevOp(BitCodeAbbrevOp::VBR, 6);3914 3915  { // 8-bit fixed-width VST_CODE_ENTRY/VST_CODE_BBENTRY strings.3916    auto Abbv = std::make_shared<BitCodeAbbrev>();3917    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));3918    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));3919    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));3920    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));3921    if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, Abbv) !=3922        VST_ENTRY_8_ABBREV)3923      llvm_unreachable("Unexpected abbrev ordering!");3924  }3925 3926  { // 7-bit fixed width VST_CODE_ENTRY strings.3927    auto Abbv = std::make_shared<BitCodeAbbrev>();3928    Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY));3929    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));3930    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));3931    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));3932    if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, Abbv) !=3933        VST_ENTRY_7_ABBREV)3934      llvm_unreachable("Unexpected abbrev ordering!");3935  }3936  { // 6-bit char6 VST_CODE_ENTRY strings.3937    auto Abbv = std::make_shared<BitCodeAbbrev>();3938    Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY));3939    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));3940    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));3941    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));3942    if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, Abbv) !=3943        VST_ENTRY_6_ABBREV)3944      llvm_unreachable("Unexpected abbrev ordering!");3945  }3946  { // 6-bit char6 VST_CODE_BBENTRY strings.3947    auto Abbv = std::make_shared<BitCodeAbbrev>();3948    Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_BBENTRY));3949    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));3950    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));3951    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));3952    if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID, Abbv) !=3953        VST_BBENTRY_6_ABBREV)3954      llvm_unreachable("Unexpected abbrev ordering!");3955  }3956 3957  { // SETTYPE abbrev for CONSTANTS_BLOCK.3958    auto Abbv = std::make_shared<BitCodeAbbrev>();3959    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_SETTYPE));3960    Abbv->Add(TypeAbbrevOp);3961    if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, Abbv) !=3962        CONSTANTS_SETTYPE_ABBREV)3963      llvm_unreachable("Unexpected abbrev ordering!");3964  }3965 3966  { // INTEGER abbrev for CONSTANTS_BLOCK.3967    auto Abbv = std::make_shared<BitCodeAbbrev>();3968    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_INTEGER));3969    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));3970    if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, Abbv) !=3971        CONSTANTS_INTEGER_ABBREV)3972      llvm_unreachable("Unexpected abbrev ordering!");3973  }3974 3975  { // CE_CAST abbrev for CONSTANTS_BLOCK.3976    auto Abbv = std::make_shared<BitCodeAbbrev>();3977    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CE_CAST));3978    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4));  // cast opc3979    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,       // typeid3980                              VE.computeBitsRequiredForTypeIndices()));3981    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));    // value id3982 3983    if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, Abbv) !=3984        CONSTANTS_CE_CAST_Abbrev)3985      llvm_unreachable("Unexpected abbrev ordering!");3986  }3987  { // NULL abbrev for CONSTANTS_BLOCK.3988    auto Abbv = std::make_shared<BitCodeAbbrev>();3989    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_NULL));3990    if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, Abbv) !=3991        CONSTANTS_NULL_Abbrev)3992      llvm_unreachable("Unexpected abbrev ordering!");3993  }3994 3995  // FIXME: This should only use space for first class types!3996 3997  { // INST_LOAD abbrev for FUNCTION_BLOCK.3998    auto Abbv = std::make_shared<BitCodeAbbrev>();3999    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_LOAD));4000    Abbv->Add(ValAbbrevOp); // Ptr4001    Abbv->Add(TypeAbbrevOp); // dest ty4002    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // Align4003    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile4004    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4005        FUNCTION_INST_LOAD_ABBREV)4006      llvm_unreachable("Unexpected abbrev ordering!");4007  }4008  {4009    auto Abbv = std::make_shared<BitCodeAbbrev>();4010    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_STORE));4011    Abbv->Add(ValAbbrevOp);                                // op14012    Abbv->Add(ValAbbrevOp);                                // op04013    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // align4014    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile4015    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4016        FUNCTION_INST_STORE_ABBREV)4017      llvm_unreachable("Unexpected abbrev ordering!");4018  }4019  { // INST_UNOP abbrev for FUNCTION_BLOCK.4020    auto Abbv = std::make_shared<BitCodeAbbrev>();4021    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNOP));4022    Abbv->Add(ValAbbrevOp); // LHS4023    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc4024    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4025        FUNCTION_INST_UNOP_ABBREV)4026      llvm_unreachable("Unexpected abbrev ordering!");4027  }4028  { // INST_UNOP_FLAGS abbrev for FUNCTION_BLOCK.4029    auto Abbv = std::make_shared<BitCodeAbbrev>();4030    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNOP));4031    Abbv->Add(ValAbbrevOp); // LHS4032    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc4033    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // flags4034    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4035        FUNCTION_INST_UNOP_FLAGS_ABBREV)4036      llvm_unreachable("Unexpected abbrev ordering!");4037  }4038  { // INST_BINOP abbrev for FUNCTION_BLOCK.4039    auto Abbv = std::make_shared<BitCodeAbbrev>();4040    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP));4041    Abbv->Add(ValAbbrevOp); // LHS4042    Abbv->Add(ValAbbrevOp); // RHS4043    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc4044    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4045        FUNCTION_INST_BINOP_ABBREV)4046      llvm_unreachable("Unexpected abbrev ordering!");4047  }4048  { // INST_BINOP_FLAGS abbrev for FUNCTION_BLOCK.4049    auto Abbv = std::make_shared<BitCodeAbbrev>();4050    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP));4051    Abbv->Add(ValAbbrevOp); // LHS4052    Abbv->Add(ValAbbrevOp); // RHS4053    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc4054    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // flags4055    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4056        FUNCTION_INST_BINOP_FLAGS_ABBREV)4057      llvm_unreachable("Unexpected abbrev ordering!");4058  }4059  { // INST_CAST abbrev for FUNCTION_BLOCK.4060    auto Abbv = std::make_shared<BitCodeAbbrev>();4061    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CAST));4062    Abbv->Add(ValAbbrevOp); // OpVal4063    Abbv->Add(TypeAbbrevOp); // dest ty4064    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc4065    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4066        FUNCTION_INST_CAST_ABBREV)4067      llvm_unreachable("Unexpected abbrev ordering!");4068  }4069  { // INST_CAST_FLAGS abbrev for FUNCTION_BLOCK.4070    auto Abbv = std::make_shared<BitCodeAbbrev>();4071    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CAST));4072    Abbv->Add(ValAbbrevOp); // OpVal4073    Abbv->Add(TypeAbbrevOp); // dest ty4074    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc4075    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // flags4076    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4077        FUNCTION_INST_CAST_FLAGS_ABBREV)4078      llvm_unreachable("Unexpected abbrev ordering!");4079  }4080 4081  { // INST_RET abbrev for FUNCTION_BLOCK.4082    auto Abbv = std::make_shared<BitCodeAbbrev>();4083    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET));4084    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4085        FUNCTION_INST_RET_VOID_ABBREV)4086      llvm_unreachable("Unexpected abbrev ordering!");4087  }4088  { // INST_RET abbrev for FUNCTION_BLOCK.4089    auto Abbv = std::make_shared<BitCodeAbbrev>();4090    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET));4091    Abbv->Add(ValAbbrevOp);4092    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4093        FUNCTION_INST_RET_VAL_ABBREV)4094      llvm_unreachable("Unexpected abbrev ordering!");4095  }4096  {4097    auto Abbv = std::make_shared<BitCodeAbbrev>();4098    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BR));4099    // TODO: Use different abbrev for absolute value reference (succ0)?4100    Abbv->Add(ValAbbrevOp); // succ04101    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4102        FUNCTION_INST_BR_UNCOND_ABBREV)4103      llvm_unreachable("Unexpected abbrev ordering!");4104  }4105  {4106    auto Abbv = std::make_shared<BitCodeAbbrev>();4107    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BR));4108    // TODO: Use different abbrev for absolute value references (succ0, succ1)?4109    Abbv->Add(ValAbbrevOp); // succ04110    Abbv->Add(ValAbbrevOp); // succ14111    Abbv->Add(ValAbbrevOp); // cond4112    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4113        FUNCTION_INST_BR_COND_ABBREV)4114      llvm_unreachable("Unexpected abbrev ordering!");4115  }4116  { // INST_UNREACHABLE abbrev for FUNCTION_BLOCK.4117    auto Abbv = std::make_shared<BitCodeAbbrev>();4118    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNREACHABLE));4119    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4120        FUNCTION_INST_UNREACHABLE_ABBREV)4121      llvm_unreachable("Unexpected abbrev ordering!");4122  }4123  {4124    auto Abbv = std::make_shared<BitCodeAbbrev>();4125    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_GEP));4126    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // flags4127    Abbv->Add(TypeAbbrevOp); // dest ty4128    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4129    Abbv->Add(ValAbbrevOp);4130    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4131        FUNCTION_INST_GEP_ABBREV)4132      llvm_unreachable("Unexpected abbrev ordering!");4133  }4134  {4135    auto Abbv = std::make_shared<BitCodeAbbrev>();4136    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CMP2));4137    Abbv->Add(ValAbbrevOp);                                // op04138    Abbv->Add(ValAbbrevOp);                                // op14139    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 6)); // pred4140    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4141        FUNCTION_INST_CMP_ABBREV)4142      llvm_unreachable("Unexpected abbrev ordering!");4143  }4144  {4145    auto Abbv = std::make_shared<BitCodeAbbrev>();4146    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CMP2));4147    Abbv->Add(ValAbbrevOp);                                // op04148    Abbv->Add(ValAbbrevOp);                                // op14149    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 6)); // pred4150    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // flags4151    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4152        FUNCTION_INST_CMP_FLAGS_ABBREV)4153      llvm_unreachable("Unexpected abbrev ordering!");4154  }4155  {4156    auto Abbv = std::make_shared<BitCodeAbbrev>();4157    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE));4158    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 7)); // dbgloc4159    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 7)); // var4160    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 7)); // expr4161    Abbv->Add(ValAbbrevOp); // val4162    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4163        FUNCTION_DEBUG_RECORD_VALUE_ABBREV)4164      llvm_unreachable("Unexpected abbrev ordering! 1");4165  }4166  {4167    auto Abbv = std::make_shared<BitCodeAbbrev>();4168    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_DEBUG_LOC));4169    // NOTE: No IsDistinct field for FUNC_CODE_DEBUG_LOC.4170    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));4171    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4172    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));4173    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));4174    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));4175    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Atom group.4176    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 3)); // Atom rank.4177    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=4178        FUNCTION_DEBUG_LOC_ABBREV)4179      llvm_unreachable("Unexpected abbrev ordering!");4180  }4181  Stream.ExitBlock();4182}4183 4184/// Write the module path strings, currently only used when generating4185/// a combined index file.4186void IndexBitcodeWriter::writeModStrings() {4187  Stream.EnterSubblock(bitc::MODULE_STRTAB_BLOCK_ID, 3);4188 4189  // TODO: See which abbrev sizes we actually need to emit4190 4191  // 8-bit fixed-width MST_ENTRY strings.4192  auto Abbv = std::make_shared<BitCodeAbbrev>();4193  Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_ENTRY));4194  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4195  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4196  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));4197  unsigned Abbrev8Bit = Stream.EmitAbbrev(std::move(Abbv));4198 4199  // 7-bit fixed width MST_ENTRY strings.4200  Abbv = std::make_shared<BitCodeAbbrev>();4201  Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_ENTRY));4202  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4203  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4204  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));4205  unsigned Abbrev7Bit = Stream.EmitAbbrev(std::move(Abbv));4206 4207  // 6-bit char6 MST_ENTRY strings.4208  Abbv = std::make_shared<BitCodeAbbrev>();4209  Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_ENTRY));4210  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4211  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4212  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));4213  unsigned Abbrev6Bit = Stream.EmitAbbrev(std::move(Abbv));4214 4215  // Module Hash, 160 bits SHA1. Optionally, emitted after each MST_CODE_ENTRY.4216  Abbv = std::make_shared<BitCodeAbbrev>();4217  Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_HASH));4218  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4219  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4220  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4221  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4222  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4223  unsigned AbbrevHash = Stream.EmitAbbrev(std::move(Abbv));4224 4225  SmallVector<unsigned, 64> Vals;4226  forEachModule([&](const StringMapEntry<ModuleHash> &MPSE) {4227    StringRef Key = MPSE.getKey();4228    const auto &Hash = MPSE.getValue();4229    StringEncoding Bits = getStringEncoding(Key);4230    unsigned AbbrevToUse = Abbrev8Bit;4231    if (Bits == SE_Char6)4232      AbbrevToUse = Abbrev6Bit;4233    else if (Bits == SE_Fixed7)4234      AbbrevToUse = Abbrev7Bit;4235 4236    auto ModuleId = ModuleIdMap.size();4237    ModuleIdMap[Key] = ModuleId;4238    Vals.push_back(ModuleId);4239    Vals.append(Key.begin(), Key.end());4240 4241    // Emit the finished record.4242    Stream.EmitRecord(bitc::MST_CODE_ENTRY, Vals, AbbrevToUse);4243 4244    // Emit an optional hash for the module now4245    if (llvm::any_of(Hash, [](uint32_t H) { return H; })) {4246      Vals.assign(Hash.begin(), Hash.end());4247      // Emit the hash record.4248      Stream.EmitRecord(bitc::MST_CODE_HASH, Vals, AbbrevHash);4249    }4250 4251    Vals.clear();4252  });4253  Stream.ExitBlock();4254}4255 4256/// Write the function type metadata related records that need to appear before4257/// a function summary entry (whether per-module or combined).4258template <typename Fn>4259static void writeFunctionTypeMetadataRecords(BitstreamWriter &Stream,4260                                             FunctionSummary *FS,4261                                             Fn GetValueID) {4262  if (!FS->type_tests().empty())4263    Stream.EmitRecord(bitc::FS_TYPE_TESTS, FS->type_tests());4264 4265  SmallVector<uint64_t, 64> Record;4266 4267  auto WriteVFuncIdVec = [&](uint64_t Ty,4268                             ArrayRef<FunctionSummary::VFuncId> VFs) {4269    if (VFs.empty())4270      return;4271    Record.clear();4272    for (auto &VF : VFs) {4273      Record.push_back(VF.GUID);4274      Record.push_back(VF.Offset);4275    }4276    Stream.EmitRecord(Ty, Record);4277  };4278 4279  WriteVFuncIdVec(bitc::FS_TYPE_TEST_ASSUME_VCALLS,4280                  FS->type_test_assume_vcalls());4281  WriteVFuncIdVec(bitc::FS_TYPE_CHECKED_LOAD_VCALLS,4282                  FS->type_checked_load_vcalls());4283 4284  auto WriteConstVCallVec = [&](uint64_t Ty,4285                                ArrayRef<FunctionSummary::ConstVCall> VCs) {4286    for (auto &VC : VCs) {4287      Record.clear();4288      Record.push_back(VC.VFunc.GUID);4289      Record.push_back(VC.VFunc.Offset);4290      llvm::append_range(Record, VC.Args);4291      Stream.EmitRecord(Ty, Record);4292    }4293  };4294 4295  WriteConstVCallVec(bitc::FS_TYPE_TEST_ASSUME_CONST_VCALL,4296                     FS->type_test_assume_const_vcalls());4297  WriteConstVCallVec(bitc::FS_TYPE_CHECKED_LOAD_CONST_VCALL,4298                     FS->type_checked_load_const_vcalls());4299 4300  auto WriteRange = [&](ConstantRange Range) {4301    Range = Range.sextOrTrunc(FunctionSummary::ParamAccess::RangeWidth);4302    assert(Range.getLower().getNumWords() == 1);4303    assert(Range.getUpper().getNumWords() == 1);4304    emitSignedInt64(Record, *Range.getLower().getRawData());4305    emitSignedInt64(Record, *Range.getUpper().getRawData());4306  };4307 4308  if (!FS->paramAccesses().empty()) {4309    Record.clear();4310    for (auto &Arg : FS->paramAccesses()) {4311      size_t UndoSize = Record.size();4312      Record.push_back(Arg.ParamNo);4313      WriteRange(Arg.Use);4314      Record.push_back(Arg.Calls.size());4315      for (auto &Call : Arg.Calls) {4316        Record.push_back(Call.ParamNo);4317        std::optional<unsigned> ValueID = GetValueID(Call.Callee);4318        if (!ValueID) {4319          // If ValueID is unknown we can't drop just this call, we must drop4320          // entire parameter.4321          Record.resize(UndoSize);4322          break;4323        }4324        Record.push_back(*ValueID);4325        WriteRange(Call.Offsets);4326      }4327    }4328    if (!Record.empty())4329      Stream.EmitRecord(bitc::FS_PARAM_ACCESS, Record);4330  }4331}4332 4333/// Collect type IDs from type tests used by function.4334static void4335getReferencedTypeIds(FunctionSummary *FS,4336                     std::set<GlobalValue::GUID> &ReferencedTypeIds) {4337  if (!FS->type_tests().empty())4338    for (auto &TT : FS->type_tests())4339      ReferencedTypeIds.insert(TT);4340 4341  auto GetReferencedTypesFromVFuncIdVec =4342      [&](ArrayRef<FunctionSummary::VFuncId> VFs) {4343        for (auto &VF : VFs)4344          ReferencedTypeIds.insert(VF.GUID);4345      };4346 4347  GetReferencedTypesFromVFuncIdVec(FS->type_test_assume_vcalls());4348  GetReferencedTypesFromVFuncIdVec(FS->type_checked_load_vcalls());4349 4350  auto GetReferencedTypesFromConstVCallVec =4351      [&](ArrayRef<FunctionSummary::ConstVCall> VCs) {4352        for (auto &VC : VCs)4353          ReferencedTypeIds.insert(VC.VFunc.GUID);4354      };4355 4356  GetReferencedTypesFromConstVCallVec(FS->type_test_assume_const_vcalls());4357  GetReferencedTypesFromConstVCallVec(FS->type_checked_load_const_vcalls());4358}4359 4360static void writeWholeProgramDevirtResolutionByArg(4361    SmallVector<uint64_t, 64> &NameVals, const std::vector<uint64_t> &args,4362    const WholeProgramDevirtResolution::ByArg &ByArg) {4363  NameVals.push_back(args.size());4364  llvm::append_range(NameVals, args);4365 4366  NameVals.push_back(ByArg.TheKind);4367  NameVals.push_back(ByArg.Info);4368  NameVals.push_back(ByArg.Byte);4369  NameVals.push_back(ByArg.Bit);4370}4371 4372static void writeWholeProgramDevirtResolution(4373    SmallVector<uint64_t, 64> &NameVals, StringTableBuilder &StrtabBuilder,4374    uint64_t Id, const WholeProgramDevirtResolution &Wpd) {4375  NameVals.push_back(Id);4376 4377  NameVals.push_back(Wpd.TheKind);4378  NameVals.push_back(StrtabBuilder.add(Wpd.SingleImplName));4379  NameVals.push_back(Wpd.SingleImplName.size());4380 4381  NameVals.push_back(Wpd.ResByArg.size());4382  for (auto &A : Wpd.ResByArg)4383    writeWholeProgramDevirtResolutionByArg(NameVals, A.first, A.second);4384}4385 4386static void writeTypeIdSummaryRecord(SmallVector<uint64_t, 64> &NameVals,4387                                     StringTableBuilder &StrtabBuilder,4388                                     StringRef Id,4389                                     const TypeIdSummary &Summary) {4390  NameVals.push_back(StrtabBuilder.add(Id));4391  NameVals.push_back(Id.size());4392 4393  NameVals.push_back(Summary.TTRes.TheKind);4394  NameVals.push_back(Summary.TTRes.SizeM1BitWidth);4395  NameVals.push_back(Summary.TTRes.AlignLog2);4396  NameVals.push_back(Summary.TTRes.SizeM1);4397  NameVals.push_back(Summary.TTRes.BitMask);4398  NameVals.push_back(Summary.TTRes.InlineBits);4399 4400  for (auto &W : Summary.WPDRes)4401    writeWholeProgramDevirtResolution(NameVals, StrtabBuilder, W.first,4402                                      W.second);4403}4404 4405static void writeTypeIdCompatibleVtableSummaryRecord(4406    SmallVector<uint64_t, 64> &NameVals, StringTableBuilder &StrtabBuilder,4407    StringRef Id, const TypeIdCompatibleVtableInfo &Summary,4408    ValueEnumerator &VE) {4409  NameVals.push_back(StrtabBuilder.add(Id));4410  NameVals.push_back(Id.size());4411 4412  for (auto &P : Summary) {4413    NameVals.push_back(P.AddressPointOffset);4414    NameVals.push_back(VE.getValueID(P.VTableVI.getValue()));4415  }4416}4417 4418// Adds the allocation contexts to the CallStacks map. We simply use the4419// size at the time the context was added as the CallStackId. This works because4420// when we look up the call stacks later on we process the function summaries4421// and their allocation records in the same exact order.4422static void collectMemProfCallStacks(4423    FunctionSummary *FS, std::function<LinearFrameId(unsigned)> GetStackIndex,4424    MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> &CallStacks) {4425  // The interfaces in ProfileData/MemProf.h use a type alias for a stack frame4426  // id offset into the index of the full stack frames. The ModuleSummaryIndex4427  // currently uses unsigned. Make sure these stay in sync.4428  static_assert(std::is_same_v<LinearFrameId, unsigned>);4429  for (auto &AI : FS->allocs()) {4430    for (auto &MIB : AI.MIBs) {4431      SmallVector<unsigned> StackIdIndices;4432      StackIdIndices.reserve(MIB.StackIdIndices.size());4433      for (auto Id : MIB.StackIdIndices)4434        StackIdIndices.push_back(GetStackIndex(Id));4435      // The CallStackId is the size at the time this context was inserted.4436      CallStacks.insert({CallStacks.size(), StackIdIndices});4437    }4438  }4439}4440 4441// Build the radix tree from the accumulated CallStacks, write out the resulting4442// linearized radix tree array, and return the map of call stack positions into4443// this array for use when writing the allocation records. The returned map is4444// indexed by a CallStackId which in this case is implicitly determined by the4445// order of function summaries and their allocation infos being written.4446static DenseMap<CallStackId, LinearCallStackId> writeMemoryProfileRadixTree(4447    MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> &&CallStacks,4448    BitstreamWriter &Stream, unsigned RadixAbbrev) {4449  assert(!CallStacks.empty());4450  DenseMap<unsigned, FrameStat> FrameHistogram =4451      computeFrameHistogram<LinearFrameId>(CallStacks);4452  CallStackRadixTreeBuilder<LinearFrameId> Builder;4453  // We don't need a MemProfFrameIndexes map as we have already converted the4454  // full stack id hash to a linear offset into the StackIds array.4455  Builder.build(std::move(CallStacks), /*MemProfFrameIndexes=*/nullptr,4456                FrameHistogram);4457  Stream.EmitRecord(bitc::FS_CONTEXT_RADIX_TREE_ARRAY, Builder.getRadixArray(),4458                    RadixAbbrev);4459  return Builder.takeCallStackPos();4460}4461 4462static void writeFunctionHeapProfileRecords(4463    BitstreamWriter &Stream, FunctionSummary *FS, unsigned CallsiteAbbrev,4464    unsigned AllocAbbrev, unsigned ContextIdAbbvId, bool PerModule,4465    std::function<unsigned(const ValueInfo &VI)> GetValueID,4466    std::function<unsigned(unsigned)> GetStackIndex,4467    bool WriteContextSizeInfoIndex,4468    DenseMap<CallStackId, LinearCallStackId> &CallStackPos,4469    CallStackId &CallStackCount) {4470  SmallVector<uint64_t> Record;4471 4472  for (auto &CI : FS->callsites()) {4473    Record.clear();4474    // Per module callsite clones should always have a single entry of4475    // value 0.4476    assert(!PerModule || (CI.Clones.size() == 1 && CI.Clones[0] == 0));4477    Record.push_back(GetValueID(CI.Callee));4478    if (!PerModule) {4479      Record.push_back(CI.StackIdIndices.size());4480      Record.push_back(CI.Clones.size());4481    }4482    for (auto Id : CI.StackIdIndices)4483      Record.push_back(GetStackIndex(Id));4484    if (!PerModule)4485      llvm::append_range(Record, CI.Clones);4486    Stream.EmitRecord(PerModule ? bitc::FS_PERMODULE_CALLSITE_INFO4487                                : bitc::FS_COMBINED_CALLSITE_INFO,4488                      Record, CallsiteAbbrev);4489  }4490 4491  for (auto &AI : FS->allocs()) {4492    Record.clear();4493    // Per module alloc versions should always have a single entry of4494    // value 0.4495    assert(!PerModule || (AI.Versions.size() == 1 && AI.Versions[0] == 0));4496    Record.push_back(AI.MIBs.size());4497    if (!PerModule)4498      Record.push_back(AI.Versions.size());4499    for (auto &MIB : AI.MIBs) {4500      Record.push_back((uint8_t)MIB.AllocType);4501      // The per-module summary always needs to include the alloc context, as we4502      // use it during the thin link. For the combined index it is optional (see4503      // comments where CombinedIndexMemProfContext is defined).4504      if (PerModule || CombinedIndexMemProfContext) {4505        // Record the index into the radix tree array for this context.4506        assert(CallStackCount <= CallStackPos.size());4507        Record.push_back(CallStackPos[CallStackCount++]);4508      }4509    }4510    if (!PerModule)4511      llvm::append_range(Record, AI.Versions);4512    assert(AI.ContextSizeInfos.empty() ||4513           AI.ContextSizeInfos.size() == AI.MIBs.size());4514    // Optionally emit the context size information if it exists.4515    if (WriteContextSizeInfoIndex && !AI.ContextSizeInfos.empty()) {4516      // The abbreviation id for the context ids record should have been created4517      // if we are emitting the per-module index, which is where we write this4518      // info.4519      assert(ContextIdAbbvId);4520      SmallVector<uint32_t> ContextIds;4521      // At least one context id per ContextSizeInfos entry (MIB), broken into 24522      // halves.4523      ContextIds.reserve(AI.ContextSizeInfos.size() * 2);4524      for (auto &Infos : AI.ContextSizeInfos) {4525        Record.push_back(Infos.size());4526        for (auto [FullStackId, TotalSize] : Infos) {4527          // The context ids are emitted separately as a fixed width array,4528          // which is more efficient than a VBR given that these hashes are4529          // typically close to 64-bits. The max fixed width entry is 32 bits so4530          // it is split into 2.4531          ContextIds.push_back(static_cast<uint32_t>(FullStackId >> 32));4532          ContextIds.push_back(static_cast<uint32_t>(FullStackId));4533          Record.push_back(TotalSize);4534        }4535      }4536      // The context ids are expected by the reader to immediately precede the4537      // associated alloc info record.4538      Stream.EmitRecord(bitc::FS_ALLOC_CONTEXT_IDS, ContextIds,4539                        ContextIdAbbvId);4540    }4541    Stream.EmitRecord(PerModule4542                          ? bitc::FS_PERMODULE_ALLOC_INFO4543                          : (CombinedIndexMemProfContext4544                                 ? bitc::FS_COMBINED_ALLOC_INFO4545                                 : bitc::FS_COMBINED_ALLOC_INFO_NO_CONTEXT),4546                      Record, AllocAbbrev);4547  }4548}4549 4550// Helper to emit a single function summary record.4551void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(4552    SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,4553    unsigned ValueID, unsigned FSCallsRelBFAbbrev,4554    unsigned FSCallsProfileAbbrev, unsigned CallsiteAbbrev,4555    unsigned AllocAbbrev, unsigned ContextIdAbbvId, const Function &F,4556    DenseMap<CallStackId, LinearCallStackId> &CallStackPos,4557    CallStackId &CallStackCount) {4558  NameVals.push_back(ValueID);4559 4560  FunctionSummary *FS = cast<FunctionSummary>(Summary);4561 4562  writeFunctionTypeMetadataRecords(4563      Stream, FS, [&](const ValueInfo &VI) -> std::optional<unsigned> {4564        return {VE.getValueID(VI.getValue())};4565      });4566 4567  writeFunctionHeapProfileRecords(4568      Stream, FS, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,4569      /*PerModule*/ true,4570      /*GetValueId*/ [&](const ValueInfo &VI) { return getValueId(VI); },4571      /*GetStackIndex*/ [&](unsigned I) { return I; },4572      /*WriteContextSizeInfoIndex*/ true, CallStackPos, CallStackCount);4573 4574  auto SpecialRefCnts = FS->specialRefCounts();4575  NameVals.push_back(getEncodedGVSummaryFlags(FS->flags()));4576  NameVals.push_back(FS->instCount());4577  NameVals.push_back(getEncodedFFlags(FS->fflags()));4578  NameVals.push_back(FS->refs().size());4579  NameVals.push_back(SpecialRefCnts.first);  // rorefcnt4580  NameVals.push_back(SpecialRefCnts.second); // worefcnt4581 4582  for (auto &RI : FS->refs())4583    NameVals.push_back(getValueId(RI));4584 4585  const bool UseRelBFRecord =4586      WriteRelBFToSummary && !F.hasProfileData() &&4587      ForceSummaryEdgesCold == FunctionSummary::FSHT_None;4588  for (auto &ECI : FS->calls()) {4589    NameVals.push_back(getValueId(ECI.first));4590    if (UseRelBFRecord)4591      NameVals.push_back(getEncodedRelBFCallEdgeInfo(ECI.second));4592    else4593      NameVals.push_back(getEncodedHotnessCallEdgeInfo(ECI.second));4594  }4595 4596  unsigned FSAbbrev =4597      (UseRelBFRecord ? FSCallsRelBFAbbrev : FSCallsProfileAbbrev);4598  unsigned Code =4599      (UseRelBFRecord ? bitc::FS_PERMODULE_RELBF : bitc::FS_PERMODULE_PROFILE);4600 4601  // Emit the finished record.4602  Stream.EmitRecord(Code, NameVals, FSAbbrev);4603  NameVals.clear();4604}4605 4606// Collect the global value references in the given variable's initializer,4607// and emit them in a summary record.4608void ModuleBitcodeWriterBase::writeModuleLevelReferences(4609    const GlobalVariable &V, SmallVector<uint64_t, 64> &NameVals,4610    unsigned FSModRefsAbbrev, unsigned FSModVTableRefsAbbrev) {4611  auto VI = Index->getValueInfo(V.getGUID());4612  if (!VI || VI.getSummaryList().empty()) {4613    // Only declarations should not have a summary (a declaration might however4614    // have a summary if the def was in module level asm).4615    assert(V.isDeclaration());4616    return;4617  }4618  auto *Summary = VI.getSummaryList()[0].get();4619  NameVals.push_back(VE.getValueID(&V));4620  GlobalVarSummary *VS = cast<GlobalVarSummary>(Summary);4621  NameVals.push_back(getEncodedGVSummaryFlags(VS->flags()));4622  NameVals.push_back(getEncodedGVarFlags(VS->varflags()));4623 4624  auto VTableFuncs = VS->vTableFuncs();4625  if (!VTableFuncs.empty())4626    NameVals.push_back(VS->refs().size());4627 4628  unsigned SizeBeforeRefs = NameVals.size();4629  for (auto &RI : VS->refs())4630    NameVals.push_back(VE.getValueID(RI.getValue()));4631  // Sort the refs for determinism output, the vector returned by FS->refs() has4632  // been initialized from a DenseSet.4633  llvm::sort(drop_begin(NameVals, SizeBeforeRefs));4634 4635  if (VTableFuncs.empty())4636    Stream.EmitRecord(bitc::FS_PERMODULE_GLOBALVAR_INIT_REFS, NameVals,4637                      FSModRefsAbbrev);4638  else {4639    // VTableFuncs pairs should already be sorted by offset.4640    for (auto &P : VTableFuncs) {4641      NameVals.push_back(VE.getValueID(P.FuncVI.getValue()));4642      NameVals.push_back(P.VTableOffset);4643    }4644 4645    Stream.EmitRecord(bitc::FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS, NameVals,4646                      FSModVTableRefsAbbrev);4647  }4648  NameVals.clear();4649}4650 4651/// Emit the per-module summary section alongside the rest of4652/// the module's bitcode.4653void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {4654  // By default we compile with ThinLTO if the module has a summary, but the4655  // client can request full LTO with a module flag.4656  bool IsThinLTO = true;4657  if (auto *MD =4658          mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("ThinLTO")))4659    IsThinLTO = MD->getZExtValue();4660  Stream.EnterSubblock(IsThinLTO ? bitc::GLOBALVAL_SUMMARY_BLOCK_ID4661                                 : bitc::FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID,4662                       4);4663 4664  Stream.EmitRecord(4665      bitc::FS_VERSION,4666      ArrayRef<uint64_t>{ModuleSummaryIndex::BitcodeSummaryVersion});4667 4668  // Write the index flags.4669  uint64_t Flags = 0;4670  // Bits 1-3 are set only in the combined index, skip them.4671  if (Index->enableSplitLTOUnit())4672    Flags |= 0x8;4673  if (Index->hasUnifiedLTO())4674    Flags |= 0x200;4675 4676  Stream.EmitRecord(bitc::FS_FLAGS, ArrayRef<uint64_t>{Flags});4677 4678  if (Index->begin() == Index->end()) {4679    Stream.ExitBlock();4680    return;4681  }4682 4683  auto Abbv = std::make_shared<BitCodeAbbrev>();4684  Abbv->Add(BitCodeAbbrevOp(bitc::FS_VALUE_GUID));4685  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));4686  // GUIDS often use up most of 64-bits, so encode as two Fixed 32.4687  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4688  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4689  unsigned ValueGuidAbbrev = Stream.EmitAbbrev(std::move(Abbv));4690 4691  for (const auto &GVI : valueIds()) {4692    Stream.EmitRecord(bitc::FS_VALUE_GUID,4693                      ArrayRef<uint32_t>{GVI.second,4694                                         static_cast<uint32_t>(GVI.first >> 32),4695                                         static_cast<uint32_t>(GVI.first)},4696                      ValueGuidAbbrev);4697  }4698 4699  if (!Index->stackIds().empty()) {4700    auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();4701    StackIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_STACK_IDS));4702    // numids x stackid4703    StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4704    // The stack ids are hashes that are close to 64 bits in size, so emitting4705    // as a pair of 32-bit fixed-width values is more efficient than a VBR.4706    StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4707    unsigned StackIdAbbvId = Stream.EmitAbbrev(std::move(StackIdAbbv));4708    SmallVector<uint32_t> Vals;4709    Vals.reserve(Index->stackIds().size() * 2);4710    for (auto Id : Index->stackIds()) {4711      Vals.push_back(static_cast<uint32_t>(Id >> 32));4712      Vals.push_back(static_cast<uint32_t>(Id));4713    }4714    Stream.EmitRecord(bitc::FS_STACK_IDS, Vals, StackIdAbbvId);4715  }4716 4717  unsigned ContextIdAbbvId = 0;4718  if (metadataMayIncludeContextSizeInfo()) {4719    // n x context id4720    auto ContextIdAbbv = std::make_shared<BitCodeAbbrev>();4721    ContextIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_ALLOC_CONTEXT_IDS));4722    ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4723    // The context ids are hashes that are close to 64 bits in size, so emitting4724    // as a pair of 32-bit fixed-width values is more efficient than a VBR if we4725    // are emitting them for all MIBs. Otherwise we use VBR to better compress 04726    // values that are expected to more frequently occur in an alloc's memprof4727    // summary.4728    if (metadataIncludesAllContextSizeInfo())4729      ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4730    else4731      ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4732    ContextIdAbbvId = Stream.EmitAbbrev(std::move(ContextIdAbbv));4733  }4734 4735  // Abbrev for FS_PERMODULE_PROFILE.4736  Abbv = std::make_shared<BitCodeAbbrev>();4737  Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_PROFILE));4738  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // valueid4739  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // flags4740  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // instcount4741  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // fflags4742  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // numrefs4743  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // rorefcnt4744  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // worefcnt4745  // numrefs x valueid, n x (valueid, hotness+tailcall flags)4746  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4747  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4748  unsigned FSCallsProfileAbbrev = Stream.EmitAbbrev(std::move(Abbv));4749 4750  // Abbrev for FS_PERMODULE_RELBF.4751  Abbv = std::make_shared<BitCodeAbbrev>();4752  Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_RELBF));4753  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // valueid4754  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // flags4755  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // instcount4756  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // fflags4757  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // numrefs4758  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // rorefcnt4759  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // worefcnt4760  // numrefs x valueid, n x (valueid, rel_block_freq+tailcall])4761  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4762  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4763  unsigned FSCallsRelBFAbbrev = Stream.EmitAbbrev(std::move(Abbv));4764 4765  // Abbrev for FS_PERMODULE_GLOBALVAR_INIT_REFS.4766  Abbv = std::make_shared<BitCodeAbbrev>();4767  Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_GLOBALVAR_INIT_REFS));4768  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid4769  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags4770  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));  // valueids4771  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4772  unsigned FSModRefsAbbrev = Stream.EmitAbbrev(std::move(Abbv));4773 4774  // Abbrev for FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS.4775  Abbv = std::make_shared<BitCodeAbbrev>();4776  Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS));4777  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid4778  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags4779  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs4780  // numrefs x valueid, n x (valueid , offset)4781  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4782  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4783  unsigned FSModVTableRefsAbbrev = Stream.EmitAbbrev(std::move(Abbv));4784 4785  // Abbrev for FS_ALIAS.4786  Abbv = std::make_shared<BitCodeAbbrev>();4787  Abbv->Add(BitCodeAbbrevOp(bitc::FS_ALIAS));4788  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // valueid4789  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // flags4790  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // valueid4791  unsigned FSAliasAbbrev = Stream.EmitAbbrev(std::move(Abbv));4792 4793  // Abbrev for FS_TYPE_ID_METADATA4794  Abbv = std::make_shared<BitCodeAbbrev>();4795  Abbv->Add(BitCodeAbbrevOp(bitc::FS_TYPE_ID_METADATA));4796  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // typeid strtab index4797  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // typeid length4798  // n x (valueid , offset)4799  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4800  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4801  unsigned TypeIdCompatibleVtableAbbrev = Stream.EmitAbbrev(std::move(Abbv));4802 4803  Abbv = std::make_shared<BitCodeAbbrev>();4804  Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_CALLSITE_INFO));4805  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid4806  // n x stackidindex4807  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4808  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4809  unsigned CallsiteAbbrev = Stream.EmitAbbrev(std::move(Abbv));4810 4811  Abbv = std::make_shared<BitCodeAbbrev>();4812  Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_ALLOC_INFO));4813  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // nummib4814  // n x (alloc type, context radix tree index)4815  // optional: nummib x (numcontext x total size)4816  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4817  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4818  unsigned AllocAbbrev = Stream.EmitAbbrev(std::move(Abbv));4819 4820  Abbv = std::make_shared<BitCodeAbbrev>();4821  Abbv->Add(BitCodeAbbrevOp(bitc::FS_CONTEXT_RADIX_TREE_ARRAY));4822  // n x entry4823  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4824  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4825  unsigned RadixAbbrev = Stream.EmitAbbrev(std::move(Abbv));4826 4827  // First walk through all the functions and collect the allocation contexts in4828  // their associated summaries, for use in constructing a radix tree of4829  // contexts. Note that we need to do this in the same order as the functions4830  // are processed further below since the call stack positions in the resulting4831  // radix tree array are identified based on this order.4832  MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;4833  for (const Function &F : M) {4834    // Summary emission does not support anonymous functions, they have to be4835    // renamed using the anonymous function renaming pass.4836    if (!F.hasName())4837      report_fatal_error("Unexpected anonymous function when writing summary");4838 4839    ValueInfo VI = Index->getValueInfo(F.getGUID());4840    if (!VI || VI.getSummaryList().empty()) {4841      // Only declarations should not have a summary (a declaration might4842      // however have a summary if the def was in module level asm).4843      assert(F.isDeclaration());4844      continue;4845    }4846    auto *Summary = VI.getSummaryList()[0].get();4847    FunctionSummary *FS = cast<FunctionSummary>(Summary);4848    collectMemProfCallStacks(4849        FS, /*GetStackIndex*/ [](unsigned I) { return I; }, CallStacks);4850  }4851  // Finalize the radix tree, write it out, and get the map of positions in the4852  // linearized tree array.4853  DenseMap<CallStackId, LinearCallStackId> CallStackPos;4854  if (!CallStacks.empty()) {4855    CallStackPos =4856        writeMemoryProfileRadixTree(std::move(CallStacks), Stream, RadixAbbrev);4857  }4858 4859  // Keep track of the current index into the CallStackPos map.4860  CallStackId CallStackCount = 0;4861 4862  SmallVector<uint64_t, 64> NameVals;4863  // Iterate over the list of functions instead of the Index to4864  // ensure the ordering is stable.4865  for (const Function &F : M) {4866    // Summary emission does not support anonymous functions, they have to4867    // renamed using the anonymous function renaming pass.4868    if (!F.hasName())4869      report_fatal_error("Unexpected anonymous function when writing summary");4870 4871    ValueInfo VI = Index->getValueInfo(F.getGUID());4872    if (!VI || VI.getSummaryList().empty()) {4873      // Only declarations should not have a summary (a declaration might4874      // however have a summary if the def was in module level asm).4875      assert(F.isDeclaration());4876      continue;4877    }4878    auto *Summary = VI.getSummaryList()[0].get();4879    writePerModuleFunctionSummaryRecord(4880        NameVals, Summary, VE.getValueID(&F), FSCallsRelBFAbbrev,4881        FSCallsProfileAbbrev, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId, F,4882        CallStackPos, CallStackCount);4883  }4884 4885  // Capture references from GlobalVariable initializers, which are outside4886  // of a function scope.4887  for (const GlobalVariable &G : M.globals())4888    writeModuleLevelReferences(G, NameVals, FSModRefsAbbrev,4889                               FSModVTableRefsAbbrev);4890 4891  for (const GlobalAlias &A : M.aliases()) {4892    auto *Aliasee = A.getAliaseeObject();4893    // Skip ifunc and nameless functions which don't have an entry in the4894    // summary.4895    if (!Aliasee->hasName() || isa<GlobalIFunc>(Aliasee))4896      continue;4897    auto AliasId = VE.getValueID(&A);4898    auto AliaseeId = VE.getValueID(Aliasee);4899    NameVals.push_back(AliasId);4900    auto *Summary = Index->getGlobalValueSummary(A);4901    AliasSummary *AS = cast<AliasSummary>(Summary);4902    NameVals.push_back(getEncodedGVSummaryFlags(AS->flags()));4903    NameVals.push_back(AliaseeId);4904    Stream.EmitRecord(bitc::FS_ALIAS, NameVals, FSAliasAbbrev);4905    NameVals.clear();4906  }4907 4908  for (auto &S : Index->typeIdCompatibleVtableMap()) {4909    writeTypeIdCompatibleVtableSummaryRecord(NameVals, StrtabBuilder, S.first,4910                                             S.second, VE);4911    Stream.EmitRecord(bitc::FS_TYPE_ID_METADATA, NameVals,4912                      TypeIdCompatibleVtableAbbrev);4913    NameVals.clear();4914  }4915 4916  if (Index->getBlockCount())4917    Stream.EmitRecord(bitc::FS_BLOCK_COUNT,4918                      ArrayRef<uint64_t>{Index->getBlockCount()});4919 4920  Stream.ExitBlock();4921}4922 4923/// Emit the combined summary section into the combined index file.4924void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {4925  Stream.EnterSubblock(bitc::GLOBALVAL_SUMMARY_BLOCK_ID, 4);4926  Stream.EmitRecord(4927      bitc::FS_VERSION,4928      ArrayRef<uint64_t>{ModuleSummaryIndex::BitcodeSummaryVersion});4929 4930  // Write the index flags.4931  Stream.EmitRecord(bitc::FS_FLAGS, ArrayRef<uint64_t>{Index.getFlags()});4932 4933  auto Abbv = std::make_shared<BitCodeAbbrev>();4934  Abbv->Add(BitCodeAbbrevOp(bitc::FS_VALUE_GUID));4935  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));4936  // GUIDS often use up most of 64-bits, so encode as two Fixed 32.4937  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4938  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4939  unsigned ValueGuidAbbrev = Stream.EmitAbbrev(std::move(Abbv));4940 4941  for (const auto &GVI : valueIds()) {4942    Stream.EmitRecord(bitc::FS_VALUE_GUID,4943                      ArrayRef<uint32_t>{GVI.second,4944                                         static_cast<uint32_t>(GVI.first >> 32),4945                                         static_cast<uint32_t>(GVI.first)},4946                      ValueGuidAbbrev);4947  }4948 4949  // Write the stack ids used by this index, which will be a subset of those in4950  // the full index in the case of distributed indexes.4951  if (!StackIds.empty()) {4952    auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();4953    StackIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_STACK_IDS));4954    // numids x stackid4955    StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4956    // The stack ids are hashes that are close to 64 bits in size, so emitting4957    // as a pair of 32-bit fixed-width values is more efficient than a VBR.4958    StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));4959    unsigned StackIdAbbvId = Stream.EmitAbbrev(std::move(StackIdAbbv));4960    SmallVector<uint32_t> Vals;4961    Vals.reserve(StackIds.size() * 2);4962    for (auto Id : StackIds) {4963      Vals.push_back(static_cast<uint32_t>(Id >> 32));4964      Vals.push_back(static_cast<uint32_t>(Id));4965    }4966    Stream.EmitRecord(bitc::FS_STACK_IDS, Vals, StackIdAbbvId);4967  }4968 4969  // Abbrev for FS_COMBINED_PROFILE.4970  Abbv = std::make_shared<BitCodeAbbrev>();4971  Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_PROFILE));4972  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // valueid4973  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // modid4974  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // flags4975  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // instcount4976  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // fflags4977  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // entrycount4978  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // numrefs4979  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // rorefcnt4980  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // worefcnt4981  // numrefs x valueid, n x (valueid, hotness+tailcall flags)4982  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));4983  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4984  unsigned FSCallsProfileAbbrev = Stream.EmitAbbrev(std::move(Abbv));4985 4986  // Abbrev for FS_COMBINED_GLOBALVAR_INIT_REFS.4987  Abbv = std::make_shared<BitCodeAbbrev>();4988  Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_GLOBALVAR_INIT_REFS));4989  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // valueid4990  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // modid4991  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // flags4992  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));    // valueids4993  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));4994  unsigned FSModRefsAbbrev = Stream.EmitAbbrev(std::move(Abbv));4995 4996  // Abbrev for FS_COMBINED_ALIAS.4997  Abbv = std::make_shared<BitCodeAbbrev>();4998  Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_ALIAS));4999  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // valueid5000  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // modid5001  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // flags5002  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));   // valueid5003  unsigned FSAliasAbbrev = Stream.EmitAbbrev(std::move(Abbv));5004 5005  Abbv = std::make_shared<BitCodeAbbrev>();5006  Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_CALLSITE_INFO));5007  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid5008  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numstackindices5009  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numver5010  // numstackindices x stackidindex, numver x version5011  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));5012  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));5013  unsigned CallsiteAbbrev = Stream.EmitAbbrev(std::move(Abbv));5014 5015  Abbv = std::make_shared<BitCodeAbbrev>();5016  Abbv->Add(BitCodeAbbrevOp(CombinedIndexMemProfContext5017                                ? bitc::FS_COMBINED_ALLOC_INFO5018                                : bitc::FS_COMBINED_ALLOC_INFO_NO_CONTEXT));5019  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // nummib5020  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numver5021  // nummib x (alloc type, context radix tree index),5022  // numver x version5023  // optional: nummib x total size5024  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));5025  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));5026  unsigned AllocAbbrev = Stream.EmitAbbrev(std::move(Abbv));5027 5028  auto shouldImportValueAsDecl = [&](GlobalValueSummary *GVS) -> bool {5029    if (DecSummaries == nullptr)5030      return false;5031    return DecSummaries->count(GVS);5032  };5033 5034  // The aliases are emitted as a post-pass, and will point to the value5035  // id of the aliasee. Save them in a vector for post-processing.5036  SmallVector<AliasSummary *, 64> Aliases;5037 5038  // Save the value id for each summary for alias emission.5039  DenseMap<const GlobalValueSummary *, unsigned> SummaryToValueIdMap;5040 5041  SmallVector<uint64_t, 64> NameVals;5042 5043  // Set that will be populated during call to writeFunctionTypeMetadataRecords5044  // with the type ids referenced by this index file.5045  std::set<GlobalValue::GUID> ReferencedTypeIds;5046 5047  // For local linkage, we also emit the original name separately5048  // immediately after the record.5049  auto MaybeEmitOriginalName = [&](GlobalValueSummary &S) {5050    // We don't need to emit the original name if we are writing the index for5051    // distributed backends (in which case ModuleToSummariesForIndex is5052    // non-null). The original name is only needed during the thin link, since5053    // for SamplePGO the indirect call targets for local functions have5054    // have the original name annotated in profile.5055    // Continue to emit it when writing out the entire combined index, which is5056    // used in testing the thin link via llvm-lto.5057    if (ModuleToSummariesForIndex || !GlobalValue::isLocalLinkage(S.linkage()))5058      return;5059    NameVals.push_back(S.getOriginalName());5060    Stream.EmitRecord(bitc::FS_COMBINED_ORIGINAL_NAME, NameVals);5061    NameVals.clear();5062  };5063 5064  DenseMap<CallStackId, LinearCallStackId> CallStackPos;5065  if (CombinedIndexMemProfContext) {5066    Abbv = std::make_shared<BitCodeAbbrev>();5067    Abbv->Add(BitCodeAbbrevOp(bitc::FS_CONTEXT_RADIX_TREE_ARRAY));5068    // n x entry5069    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));5070    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));5071    unsigned RadixAbbrev = Stream.EmitAbbrev(std::move(Abbv));5072 5073    // First walk through all the functions and collect the allocation contexts5074    // in their associated summaries, for use in constructing a radix tree of5075    // contexts. Note that we need to do this in the same order as the functions5076    // are processed further below since the call stack positions in the5077    // resulting radix tree array are identified based on this order.5078    MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;5079    forEachSummary([&](GVInfo I, bool IsAliasee) {5080      // Don't collect this when invoked for an aliasee, as it is not needed for5081      // the alias summary. If the aliasee is to be imported, we will invoke5082      // this separately with IsAliasee=false.5083      if (IsAliasee)5084        return;5085      GlobalValueSummary *S = I.second;5086      assert(S);5087      auto *FS = dyn_cast<FunctionSummary>(S);5088      if (!FS)5089        return;5090      collectMemProfCallStacks(5091          FS,5092          /*GetStackIndex*/5093          [&](unsigned I) {5094            // Get the corresponding index into the list of StackIds actually5095            // being written for this combined index (which may be a subset in5096            // the case of distributed indexes).5097            assert(StackIdIndicesToIndex.contains(I));5098            return StackIdIndicesToIndex[I];5099          },5100          CallStacks);5101    });5102    // Finalize the radix tree, write it out, and get the map of positions in5103    // the linearized tree array.5104    if (!CallStacks.empty()) {5105      CallStackPos = writeMemoryProfileRadixTree(std::move(CallStacks), Stream,5106                                                 RadixAbbrev);5107    }5108  }5109 5110  // Keep track of the current index into the CallStackPos map. Not used if5111  // CombinedIndexMemProfContext is false.5112  CallStackId CallStackCount = 0;5113 5114  DenseSet<GlobalValue::GUID> DefOrUseGUIDs;5115  forEachSummary([&](GVInfo I, bool IsAliasee) {5116    GlobalValueSummary *S = I.second;5117    assert(S);5118    DefOrUseGUIDs.insert(I.first);5119    for (const ValueInfo &VI : S->refs())5120      DefOrUseGUIDs.insert(VI.getGUID());5121 5122    auto ValueId = getValueId(I.first);5123    assert(ValueId);5124    SummaryToValueIdMap[S] = *ValueId;5125 5126    // If this is invoked for an aliasee, we want to record the above5127    // mapping, but then not emit a summary entry (if the aliasee is5128    // to be imported, we will invoke this separately with IsAliasee=false).5129    if (IsAliasee)5130      return;5131 5132    if (auto *AS = dyn_cast<AliasSummary>(S)) {5133      // Will process aliases as a post-pass because the reader wants all5134      // global to be loaded first.5135      Aliases.push_back(AS);5136      return;5137    }5138 5139    if (auto *VS = dyn_cast<GlobalVarSummary>(S)) {5140      NameVals.push_back(*ValueId);5141      assert(ModuleIdMap.count(VS->modulePath()));5142      NameVals.push_back(ModuleIdMap[VS->modulePath()]);5143      NameVals.push_back(5144          getEncodedGVSummaryFlags(VS->flags(), shouldImportValueAsDecl(VS)));5145      NameVals.push_back(getEncodedGVarFlags(VS->varflags()));5146      for (auto &RI : VS->refs()) {5147        auto RefValueId = getValueId(RI.getGUID());5148        if (!RefValueId)5149          continue;5150        NameVals.push_back(*RefValueId);5151      }5152 5153      // Emit the finished record.5154      Stream.EmitRecord(bitc::FS_COMBINED_GLOBALVAR_INIT_REFS, NameVals,5155                        FSModRefsAbbrev);5156      NameVals.clear();5157      MaybeEmitOriginalName(*S);5158      return;5159    }5160 5161    auto GetValueId = [&](const ValueInfo &VI) -> std::optional<unsigned> {5162      if (!VI)5163        return std::nullopt;5164      return getValueId(VI.getGUID());5165    };5166 5167    auto *FS = cast<FunctionSummary>(S);5168    writeFunctionTypeMetadataRecords(Stream, FS, GetValueId);5169    getReferencedTypeIds(FS, ReferencedTypeIds);5170 5171    writeFunctionHeapProfileRecords(5172        Stream, FS, CallsiteAbbrev, AllocAbbrev, /*ContextIdAbbvId*/ 0,5173        /*PerModule*/ false,5174        /*GetValueId*/5175        [&](const ValueInfo &VI) -> unsigned {5176          std::optional<unsigned> ValueID = GetValueId(VI);5177          // This can happen in shared index files for distributed ThinLTO if5178          // the callee function summary is not included. Record 0 which we5179          // will have to deal with conservatively when doing any kind of5180          // validation in the ThinLTO backends.5181          if (!ValueID)5182            return 0;5183          return *ValueID;5184        },5185        /*GetStackIndex*/5186        [&](unsigned I) {5187          // Get the corresponding index into the list of StackIds actually5188          // being written for this combined index (which may be a subset in5189          // the case of distributed indexes).5190          assert(StackIdIndicesToIndex.contains(I));5191          return StackIdIndicesToIndex[I];5192        },5193        /*WriteContextSizeInfoIndex*/ false, CallStackPos, CallStackCount);5194 5195    NameVals.push_back(*ValueId);5196    assert(ModuleIdMap.count(FS->modulePath()));5197    NameVals.push_back(ModuleIdMap[FS->modulePath()]);5198    NameVals.push_back(5199        getEncodedGVSummaryFlags(FS->flags(), shouldImportValueAsDecl(FS)));5200    NameVals.push_back(FS->instCount());5201    NameVals.push_back(getEncodedFFlags(FS->fflags()));5202    // TODO: Stop writing entry count and bump bitcode version.5203    NameVals.push_back(0 /* EntryCount */);5204 5205    // Fill in below5206    NameVals.push_back(0); // numrefs5207    NameVals.push_back(0); // rorefcnt5208    NameVals.push_back(0); // worefcnt5209 5210    unsigned Count = 0, RORefCnt = 0, WORefCnt = 0;5211    for (auto &RI : FS->refs()) {5212      auto RefValueId = getValueId(RI.getGUID());5213      if (!RefValueId)5214        continue;5215      NameVals.push_back(*RefValueId);5216      if (RI.isReadOnly())5217        RORefCnt++;5218      else if (RI.isWriteOnly())5219        WORefCnt++;5220      Count++;5221    }5222    NameVals[6] = Count;5223    NameVals[7] = RORefCnt;5224    NameVals[8] = WORefCnt;5225 5226    for (auto &EI : FS->calls()) {5227      // If this GUID doesn't have a value id, it doesn't have a function5228      // summary and we don't need to record any calls to it.5229      std::optional<unsigned> CallValueId = GetValueId(EI.first);5230      if (!CallValueId)5231        continue;5232      NameVals.push_back(*CallValueId);5233      NameVals.push_back(getEncodedHotnessCallEdgeInfo(EI.second));5234    }5235 5236    // Emit the finished record.5237    Stream.EmitRecord(bitc::FS_COMBINED_PROFILE, NameVals,5238                      FSCallsProfileAbbrev);5239    NameVals.clear();5240    MaybeEmitOriginalName(*S);5241  });5242 5243  for (auto *AS : Aliases) {5244    auto AliasValueId = SummaryToValueIdMap[AS];5245    assert(AliasValueId);5246    NameVals.push_back(AliasValueId);5247    assert(ModuleIdMap.count(AS->modulePath()));5248    NameVals.push_back(ModuleIdMap[AS->modulePath()]);5249    NameVals.push_back(5250        getEncodedGVSummaryFlags(AS->flags(), shouldImportValueAsDecl(AS)));5251    auto AliaseeValueId = SummaryToValueIdMap[&AS->getAliasee()];5252    assert(AliaseeValueId);5253    NameVals.push_back(AliaseeValueId);5254 5255    // Emit the finished record.5256    Stream.EmitRecord(bitc::FS_COMBINED_ALIAS, NameVals, FSAliasAbbrev);5257    NameVals.clear();5258    MaybeEmitOriginalName(*AS);5259 5260    if (auto *FS = dyn_cast<FunctionSummary>(&AS->getAliasee()))5261      getReferencedTypeIds(FS, ReferencedTypeIds);5262  }5263 5264  SmallVector<StringRef, 4> Functions;5265  auto EmitCfiFunctions = [&](const CfiFunctionIndex &CfiIndex,5266                              bitc::GlobalValueSummarySymtabCodes Code) {5267    if (CfiIndex.empty())5268      return;5269    for (GlobalValue::GUID GUID : DefOrUseGUIDs) {5270      auto Defs = CfiIndex.forGuid(GUID);5271      llvm::append_range(Functions, Defs);5272    }5273    if (Functions.empty())5274      return;5275    llvm::sort(Functions);5276    for (const auto &S : Functions) {5277      NameVals.push_back(StrtabBuilder.add(S));5278      NameVals.push_back(S.size());5279    }5280    Stream.EmitRecord(Code, NameVals);5281    NameVals.clear();5282    Functions.clear();5283  };5284 5285  EmitCfiFunctions(Index.cfiFunctionDefs(), bitc::FS_CFI_FUNCTION_DEFS);5286  EmitCfiFunctions(Index.cfiFunctionDecls(), bitc::FS_CFI_FUNCTION_DECLS);5287 5288  // Walk the GUIDs that were referenced, and write the5289  // corresponding type id records.5290  for (auto &T : ReferencedTypeIds) {5291    auto TidIter = Index.typeIds().equal_range(T);5292    for (const auto &[GUID, TypeIdPair] : make_range(TidIter)) {5293      writeTypeIdSummaryRecord(NameVals, StrtabBuilder, TypeIdPair.first,5294                               TypeIdPair.second);5295      Stream.EmitRecord(bitc::FS_TYPE_ID, NameVals);5296      NameVals.clear();5297    }5298  }5299 5300  if (Index.getBlockCount())5301    Stream.EmitRecord(bitc::FS_BLOCK_COUNT,5302                      ArrayRef<uint64_t>{Index.getBlockCount()});5303 5304  Stream.ExitBlock();5305}5306 5307/// Create the "IDENTIFICATION_BLOCK_ID" containing a single string with the5308/// current llvm version, and a record for the epoch number.5309static void writeIdentificationBlock(BitstreamWriter &Stream) {5310  Stream.EnterSubblock(bitc::IDENTIFICATION_BLOCK_ID, 5);5311 5312  // Write the "user readable" string identifying the bitcode producer5313  auto Abbv = std::make_shared<BitCodeAbbrev>();5314  Abbv->Add(BitCodeAbbrevOp(bitc::IDENTIFICATION_CODE_STRING));5315  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));5316  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));5317  auto StringAbbrev = Stream.EmitAbbrev(std::move(Abbv));5318  writeStringRecord(Stream, bitc::IDENTIFICATION_CODE_STRING,5319                    "LLVM" LLVM_VERSION_STRING, StringAbbrev);5320 5321  // Write the epoch version5322  Abbv = std::make_shared<BitCodeAbbrev>();5323  Abbv->Add(BitCodeAbbrevOp(bitc::IDENTIFICATION_CODE_EPOCH));5324  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));5325  auto EpochAbbrev = Stream.EmitAbbrev(std::move(Abbv));5326  constexpr std::array<unsigned, 1> Vals = {{bitc::BITCODE_CURRENT_EPOCH}};5327  Stream.EmitRecord(bitc::IDENTIFICATION_CODE_EPOCH, Vals, EpochAbbrev);5328  Stream.ExitBlock();5329}5330 5331void ModuleBitcodeWriter::writeModuleHash(StringRef View) {5332  // Emit the module's hash.5333  // MODULE_CODE_HASH: [5*i32]5334  if (GenerateHash) {5335    uint32_t Vals[5];5336    Hasher.update(ArrayRef<uint8_t>(5337        reinterpret_cast<const uint8_t *>(View.data()), View.size()));5338    std::array<uint8_t, 20> Hash = Hasher.result();5339    for (int Pos = 0; Pos < 20; Pos += 4) {5340      Vals[Pos / 4] = support::endian::read32be(Hash.data() + Pos);5341    }5342 5343    // Emit the finished record.5344    Stream.EmitRecord(bitc::MODULE_CODE_HASH, Vals);5345 5346    if (ModHash)5347      // Save the written hash value.5348      llvm::copy(Vals, std::begin(*ModHash));5349  }5350}5351 5352void ModuleBitcodeWriter::write() {5353  writeIdentificationBlock(Stream);5354 5355  Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3);5356  // We will want to write the module hash at this point. Block any flushing so5357  // we can have access to the whole underlying data later.5358  Stream.markAndBlockFlushing();5359 5360  writeModuleVersion();5361 5362  // Emit blockinfo, which defines the standard abbreviations etc.5363  writeBlockInfo();5364 5365  // Emit information describing all of the types in the module.5366  writeTypeTable();5367 5368  // Emit information about attribute groups.5369  writeAttributeGroupTable();5370 5371  // Emit information about parameter attributes.5372  writeAttributeTable();5373 5374  writeComdats();5375 5376  // Emit top-level description of module, including target triple, inline asm,5377  // descriptors for global variables, and function prototype info.5378  writeModuleInfo();5379 5380  // Emit constants.5381  writeModuleConstants();5382 5383  // Emit metadata kind names.5384  writeModuleMetadataKinds();5385 5386  // Emit metadata.5387  writeModuleMetadata();5388 5389  // Emit module-level use-lists.5390  if (VE.shouldPreserveUseListOrder())5391    writeUseListBlock(nullptr);5392 5393  writeOperandBundleTags();5394  writeSyncScopeNames();5395 5396  // Emit function bodies.5397  DenseMap<const Function *, uint64_t> FunctionToBitcodeIndex;5398  for (const Function &F : M)5399    if (!F.isDeclaration())5400      writeFunction(F, FunctionToBitcodeIndex);5401 5402  // Need to write after the above call to WriteFunction which populates5403  // the summary information in the index.5404  if (Index)5405    writePerModuleGlobalValueSummary();5406 5407  writeGlobalValueSymbolTable(FunctionToBitcodeIndex);5408 5409  writeModuleHash(Stream.getMarkedBufferAndResumeFlushing());5410 5411  Stream.ExitBlock();5412}5413 5414static void writeInt32ToBuffer(uint32_t Value, SmallVectorImpl<char> &Buffer,5415                               uint32_t &Position) {5416  support::endian::write32le(&Buffer[Position], Value);5417  Position += 4;5418}5419 5420/// If generating a bc file on darwin, we have to emit a5421/// header and trailer to make it compatible with the system archiver.  To do5422/// this we emit the following header, and then emit a trailer that pads the5423/// file out to be a multiple of 16 bytes.5424///5425/// struct bc_header {5426///   uint32_t Magic;         // 0x0B17C0DE5427///   uint32_t Version;       // Version, currently always 0.5428///   uint32_t BitcodeOffset; // Offset to traditional bitcode file.5429///   uint32_t BitcodeSize;   // Size of traditional bitcode file.5430///   uint32_t CPUType;       // CPU specifier.5431///   ... potentially more later ...5432/// };5433static void emitDarwinBCHeaderAndTrailer(SmallVectorImpl<char> &Buffer,5434                                         const Triple &TT) {5435  unsigned CPUType = ~0U;5436 5437  // Match x86_64-*, i[3-9]86-*, powerpc-*, powerpc64-*, arm-*, thumb-*,5438  // armv[0-9]-*, thumbv[0-9]-*, armv5te-*, or armv6t2-*. The CPUType is a magic5439  // number from /usr/include/mach/machine.h.  It is ok to reproduce the5440  // specific constants here because they are implicitly part of the Darwin ABI.5441  enum {5442    DARWIN_CPU_ARCH_ABI64      = 0x01000000,5443    DARWIN_CPU_TYPE_X86        = 7,5444    DARWIN_CPU_TYPE_ARM        = 12,5445    DARWIN_CPU_TYPE_POWERPC    = 185446  };5447 5448  Triple::ArchType Arch = TT.getArch();5449  if (Arch == Triple::x86_64)5450    CPUType = DARWIN_CPU_TYPE_X86 | DARWIN_CPU_ARCH_ABI64;5451  else if (Arch == Triple::x86)5452    CPUType = DARWIN_CPU_TYPE_X86;5453  else if (Arch == Triple::ppc)5454    CPUType = DARWIN_CPU_TYPE_POWERPC;5455  else if (Arch == Triple::ppc64)5456    CPUType = DARWIN_CPU_TYPE_POWERPC | DARWIN_CPU_ARCH_ABI64;5457  else if (Arch == Triple::arm || Arch == Triple::thumb)5458    CPUType = DARWIN_CPU_TYPE_ARM;5459 5460  // Traditional Bitcode starts after header.5461  assert(Buffer.size() >= BWH_HeaderSize &&5462         "Expected header size to be reserved");5463  unsigned BCOffset = BWH_HeaderSize;5464  unsigned BCSize = Buffer.size() - BWH_HeaderSize;5465 5466  // Write the magic and version.5467  unsigned Position = 0;5468  writeInt32ToBuffer(0x0B17C0DE, Buffer, Position);5469  writeInt32ToBuffer(0, Buffer, Position); // Version.5470  writeInt32ToBuffer(BCOffset, Buffer, Position);5471  writeInt32ToBuffer(BCSize, Buffer, Position);5472  writeInt32ToBuffer(CPUType, Buffer, Position);5473 5474  // If the file is not a multiple of 16 bytes, insert dummy padding.5475  while (Buffer.size() & 15)5476    Buffer.push_back(0);5477}5478 5479/// Helper to write the header common to all bitcode files.5480static void writeBitcodeHeader(BitstreamWriter &Stream) {5481  // Emit the file header.5482  Stream.Emit((unsigned)'B', 8);5483  Stream.Emit((unsigned)'C', 8);5484  Stream.Emit(0x0, 4);5485  Stream.Emit(0xC, 4);5486  Stream.Emit(0xE, 4);5487  Stream.Emit(0xD, 4);5488}5489 5490BitcodeWriter::BitcodeWriter(SmallVectorImpl<char> &Buffer)5491    : Stream(new BitstreamWriter(Buffer)) {5492  writeBitcodeHeader(*Stream);5493}5494 5495BitcodeWriter::BitcodeWriter(raw_ostream &FS)5496    : Stream(new BitstreamWriter(FS, FlushThreshold)) {5497  writeBitcodeHeader(*Stream);5498}5499 5500BitcodeWriter::~BitcodeWriter() { assert(WroteStrtab); }5501 5502void BitcodeWriter::writeBlob(unsigned Block, unsigned Record, StringRef Blob) {5503  Stream->EnterSubblock(Block, 3);5504 5505  auto Abbv = std::make_shared<BitCodeAbbrev>();5506  Abbv->Add(BitCodeAbbrevOp(Record));5507  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));5508  auto AbbrevNo = Stream->EmitAbbrev(std::move(Abbv));5509 5510  Stream->EmitRecordWithBlob(AbbrevNo, ArrayRef<uint64_t>{Record}, Blob);5511 5512  Stream->ExitBlock();5513}5514 5515void BitcodeWriter::writeSymtab() {5516  assert(!WroteStrtab && !WroteSymtab);5517 5518  // If any module has module-level inline asm, we will require a registered asm5519  // parser for the target so that we can create an accurate symbol table for5520  // the module.5521  for (Module *M : Mods) {5522    if (M->getModuleInlineAsm().empty())5523      continue;5524 5525    std::string Err;5526    const Triple TT(M->getTargetTriple());5527    const Target *T = TargetRegistry::lookupTarget(TT, Err);5528    if (!T || !T->hasMCAsmParser())5529      return;5530  }5531 5532  WroteSymtab = true;5533  SmallVector<char, 0> Symtab;5534  // The irsymtab::build function may be unable to create a symbol table if the5535  // module is malformed (e.g. it contains an invalid alias). Writing a symbol5536  // table is not required for correctness, but we still want to be able to5537  // write malformed modules to bitcode files, so swallow the error.5538  if (Error E = irsymtab::build(Mods, Symtab, StrtabBuilder, Alloc)) {5539    consumeError(std::move(E));5540    return;5541  }5542 5543  writeBlob(bitc::SYMTAB_BLOCK_ID, bitc::SYMTAB_BLOB,5544            {Symtab.data(), Symtab.size()});5545}5546 5547void BitcodeWriter::writeStrtab() {5548  assert(!WroteStrtab);5549 5550  std::vector<char> Strtab;5551  StrtabBuilder.finalizeInOrder();5552  Strtab.resize(StrtabBuilder.getSize());5553  StrtabBuilder.write((uint8_t *)Strtab.data());5554 5555  writeBlob(bitc::STRTAB_BLOCK_ID, bitc::STRTAB_BLOB,5556            {Strtab.data(), Strtab.size()});5557 5558  WroteStrtab = true;5559}5560 5561void BitcodeWriter::copyStrtab(StringRef Strtab) {5562  writeBlob(bitc::STRTAB_BLOCK_ID, bitc::STRTAB_BLOB, Strtab);5563  WroteStrtab = true;5564}5565 5566void BitcodeWriter::writeModule(const Module &M,5567                                bool ShouldPreserveUseListOrder,5568                                const ModuleSummaryIndex *Index,5569                                bool GenerateHash, ModuleHash *ModHash) {5570  assert(!WroteStrtab);5571 5572  // The Mods vector is used by irsymtab::build, which requires non-const5573  // Modules in case it needs to materialize metadata. But the bitcode writer5574  // requires that the module is materialized, so we can cast to non-const here,5575  // after checking that it is in fact materialized.5576  assert(M.isMaterialized());5577  Mods.push_back(const_cast<Module *>(&M));5578 5579  ModuleBitcodeWriter ModuleWriter(M, StrtabBuilder, *Stream,5580                                   ShouldPreserveUseListOrder, Index,5581                                   GenerateHash, ModHash);5582  ModuleWriter.write();5583}5584 5585void BitcodeWriter::writeIndex(5586    const ModuleSummaryIndex *Index,5587    const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex,5588    const GVSummaryPtrSet *DecSummaries) {5589  IndexBitcodeWriter IndexWriter(*Stream, StrtabBuilder, *Index, DecSummaries,5590                                 ModuleToSummariesForIndex);5591  IndexWriter.write();5592}5593 5594/// Write the specified module to the specified output stream.5595void llvm::WriteBitcodeToFile(const Module &M, raw_ostream &Out,5596                              bool ShouldPreserveUseListOrder,5597                              const ModuleSummaryIndex *Index,5598                              bool GenerateHash, ModuleHash *ModHash) {5599  auto Write = [&](BitcodeWriter &Writer) {5600    Writer.writeModule(M, ShouldPreserveUseListOrder, Index, GenerateHash,5601                       ModHash);5602    Writer.writeSymtab();5603    Writer.writeStrtab();5604  };5605  Triple TT(M.getTargetTriple());5606  if (TT.isOSDarwin() || TT.isOSBinFormatMachO()) {5607    // If this is darwin or another generic macho target, reserve space for the5608    // header. Note that the header is computed *after* the output is known, so5609    // we currently explicitly use a buffer, write to it, and then subsequently5610    // flush to Out.5611    SmallVector<char, 0> Buffer;5612    Buffer.reserve(256 * 1024);5613    Buffer.insert(Buffer.begin(), BWH_HeaderSize, 0);5614    BitcodeWriter Writer(Buffer);5615    Write(Writer);5616    emitDarwinBCHeaderAndTrailer(Buffer, TT);5617    Out.write(Buffer.data(), Buffer.size());5618  } else {5619    BitcodeWriter Writer(Out);5620    Write(Writer);5621  }5622}5623 5624void IndexBitcodeWriter::write() {5625  Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3);5626 5627  writeModuleVersion();5628 5629  // Write the module paths in the combined index.5630  writeModStrings();5631 5632  // Write the summary combined index records.5633  writeCombinedGlobalValueSummary();5634 5635  Stream.ExitBlock();5636}5637 5638// Write the specified module summary index to the given raw output stream,5639// where it will be written in a new bitcode block. This is used when5640// writing the combined index file for ThinLTO. When writing a subset of the5641// index for a distributed backend, provide a \p ModuleToSummariesForIndex map.5642void llvm::writeIndexToFile(5643    const ModuleSummaryIndex &Index, raw_ostream &Out,5644    const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex,5645    const GVSummaryPtrSet *DecSummaries) {5646  SmallVector<char, 0> Buffer;5647  Buffer.reserve(256 * 1024);5648 5649  BitcodeWriter Writer(Buffer);5650  Writer.writeIndex(&Index, ModuleToSummariesForIndex, DecSummaries);5651  Writer.writeStrtab();5652 5653  Out.write((char *)&Buffer.front(), Buffer.size());5654}5655 5656namespace {5657 5658/// Class to manage the bitcode writing for a thin link bitcode file.5659class ThinLinkBitcodeWriter : public ModuleBitcodeWriterBase {5660  /// ModHash is for use in ThinLTO incremental build, generated while writing5661  /// the module bitcode file.5662  const ModuleHash *ModHash;5663 5664public:5665  ThinLinkBitcodeWriter(const Module &M, StringTableBuilder &StrtabBuilder,5666                        BitstreamWriter &Stream,5667                        const ModuleSummaryIndex &Index,5668                        const ModuleHash &ModHash)5669      : ModuleBitcodeWriterBase(M, StrtabBuilder, Stream,5670                                /*ShouldPreserveUseListOrder=*/false, &Index),5671        ModHash(&ModHash) {}5672 5673  void write();5674 5675private:5676  void writeSimplifiedModuleInfo();5677};5678 5679} // end anonymous namespace5680 5681// This function writes a simpilified module info for thin link bitcode file.5682// It only contains the source file name along with the name(the offset and5683// size in strtab) and linkage for global values. For the global value info5684// entry, in order to keep linkage at offset 5, there are three zeros used5685// as padding.5686void ThinLinkBitcodeWriter::writeSimplifiedModuleInfo() {5687  SmallVector<unsigned, 64> Vals;5688  // Emit the module's source file name.5689  {5690    StringEncoding Bits = getStringEncoding(M.getSourceFileName());5691    BitCodeAbbrevOp AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8);5692    if (Bits == SE_Char6)5693      AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Char6);5694    else if (Bits == SE_Fixed7)5695      AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7);5696 5697    // MODULE_CODE_SOURCE_FILENAME: [namechar x N]5698    auto Abbv = std::make_shared<BitCodeAbbrev>();5699    Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_SOURCE_FILENAME));5700    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));5701    Abbv->Add(AbbrevOpToUse);5702    unsigned FilenameAbbrev = Stream.EmitAbbrev(std::move(Abbv));5703 5704    for (const auto P : M.getSourceFileName())5705      Vals.push_back((unsigned char)P);5706 5707    Stream.EmitRecord(bitc::MODULE_CODE_SOURCE_FILENAME, Vals, FilenameAbbrev);5708    Vals.clear();5709  }5710 5711  // Emit the global variable information.5712  for (const GlobalVariable &GV : M.globals()) {5713    // GLOBALVAR: [strtab offset, strtab size, 0, 0, 0, linkage]5714    Vals.push_back(StrtabBuilder.add(GV.getName()));5715    Vals.push_back(GV.getName().size());5716    Vals.push_back(0);5717    Vals.push_back(0);5718    Vals.push_back(0);5719    Vals.push_back(getEncodedLinkage(GV));5720 5721    Stream.EmitRecord(bitc::MODULE_CODE_GLOBALVAR, Vals);5722    Vals.clear();5723  }5724 5725  // Emit the function proto information.5726  for (const Function &F : M) {5727    // FUNCTION:  [strtab offset, strtab size, 0, 0, 0, linkage]5728    Vals.push_back(StrtabBuilder.add(F.getName()));5729    Vals.push_back(F.getName().size());5730    Vals.push_back(0);5731    Vals.push_back(0);5732    Vals.push_back(0);5733    Vals.push_back(getEncodedLinkage(F));5734 5735    Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals);5736    Vals.clear();5737  }5738 5739  // Emit the alias information.5740  for (const GlobalAlias &A : M.aliases()) {5741    // ALIAS: [strtab offset, strtab size, 0, 0, 0, linkage]5742    Vals.push_back(StrtabBuilder.add(A.getName()));5743    Vals.push_back(A.getName().size());5744    Vals.push_back(0);5745    Vals.push_back(0);5746    Vals.push_back(0);5747    Vals.push_back(getEncodedLinkage(A));5748 5749    Stream.EmitRecord(bitc::MODULE_CODE_ALIAS, Vals);5750    Vals.clear();5751  }5752 5753  // Emit the ifunc information.5754  for (const GlobalIFunc &I : M.ifuncs()) {5755    // IFUNC: [strtab offset, strtab size, 0, 0, 0, linkage]5756    Vals.push_back(StrtabBuilder.add(I.getName()));5757    Vals.push_back(I.getName().size());5758    Vals.push_back(0);5759    Vals.push_back(0);5760    Vals.push_back(0);5761    Vals.push_back(getEncodedLinkage(I));5762 5763    Stream.EmitRecord(bitc::MODULE_CODE_IFUNC, Vals);5764    Vals.clear();5765  }5766}5767 5768void ThinLinkBitcodeWriter::write() {5769  Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3);5770 5771  writeModuleVersion();5772 5773  writeSimplifiedModuleInfo();5774 5775  writePerModuleGlobalValueSummary();5776 5777  // Write module hash.5778  Stream.EmitRecord(bitc::MODULE_CODE_HASH, ArrayRef<uint32_t>(*ModHash));5779 5780  Stream.ExitBlock();5781}5782 5783void BitcodeWriter::writeThinLinkBitcode(const Module &M,5784                                         const ModuleSummaryIndex &Index,5785                                         const ModuleHash &ModHash) {5786  assert(!WroteStrtab);5787 5788  // The Mods vector is used by irsymtab::build, which requires non-const5789  // Modules in case it needs to materialize metadata. But the bitcode writer5790  // requires that the module is materialized, so we can cast to non-const here,5791  // after checking that it is in fact materialized.5792  assert(M.isMaterialized());5793  Mods.push_back(const_cast<Module *>(&M));5794 5795  ThinLinkBitcodeWriter ThinLinkWriter(M, StrtabBuilder, *Stream, Index,5796                                       ModHash);5797  ThinLinkWriter.write();5798}5799 5800// Write the specified thin link bitcode file to the given raw output stream,5801// where it will be written in a new bitcode block. This is used when5802// writing the per-module index file for ThinLTO.5803void llvm::writeThinLinkBitcodeToFile(const Module &M, raw_ostream &Out,5804                                      const ModuleSummaryIndex &Index,5805                                      const ModuleHash &ModHash) {5806  SmallVector<char, 0> Buffer;5807  Buffer.reserve(256 * 1024);5808 5809  BitcodeWriter Writer(Buffer);5810  Writer.writeThinLinkBitcode(M, Index, ModHash);5811  Writer.writeSymtab();5812  Writer.writeStrtab();5813 5814  Out.write((char *)&Buffer.front(), Buffer.size());5815}5816 5817static const char *getSectionNameForBitcode(const Triple &T) {5818  switch (T.getObjectFormat()) {5819  case Triple::MachO:5820    return "__LLVM,__bitcode";5821  case Triple::COFF:5822  case Triple::ELF:5823  case Triple::Wasm:5824  case Triple::UnknownObjectFormat:5825    return ".llvmbc";5826  case Triple::GOFF:5827    llvm_unreachable("GOFF is not yet implemented");5828    break;5829  case Triple::SPIRV:5830    if (T.getVendor() == Triple::AMD)5831      return ".llvmbc";5832    llvm_unreachable("SPIRV is not yet implemented");5833    break;5834  case Triple::XCOFF:5835    llvm_unreachable("XCOFF is not yet implemented");5836    break;5837  case Triple::DXContainer:5838    llvm_unreachable("DXContainer is not yet implemented");5839    break;5840  }5841  llvm_unreachable("Unimplemented ObjectFormatType");5842}5843 5844static const char *getSectionNameForCommandline(const Triple &T) {5845  switch (T.getObjectFormat()) {5846  case Triple::MachO:5847    return "__LLVM,__cmdline";5848  case Triple::COFF:5849  case Triple::ELF:5850  case Triple::Wasm:5851  case Triple::UnknownObjectFormat:5852    return ".llvmcmd";5853  case Triple::GOFF:5854    llvm_unreachable("GOFF is not yet implemented");5855    break;5856  case Triple::SPIRV:5857    if (T.getVendor() == Triple::AMD)5858      return ".llvmcmd";5859    llvm_unreachable("SPIRV is not yet implemented");5860    break;5861  case Triple::XCOFF:5862    llvm_unreachable("XCOFF is not yet implemented");5863    break;5864  case Triple::DXContainer:5865    llvm_unreachable("DXC is not yet implemented");5866    break;5867  }5868  llvm_unreachable("Unimplemented ObjectFormatType");5869}5870 5871void llvm::embedBitcodeInModule(llvm::Module &M, llvm::MemoryBufferRef Buf,5872                                bool EmbedBitcode, bool EmbedCmdline,5873                                const std::vector<uint8_t> &CmdArgs) {5874  // Save llvm.compiler.used and remove it.5875  SmallVector<Constant *, 2> UsedArray;5876  SmallVector<GlobalValue *, 4> UsedGlobals;5877  GlobalVariable *Used = collectUsedGlobalVariables(M, UsedGlobals, true);5878  Type *UsedElementType = Used ? Used->getValueType()->getArrayElementType()5879                               : PointerType::getUnqual(M.getContext());5880  for (auto *GV : UsedGlobals) {5881    if (GV->getName() != "llvm.embedded.module" &&5882        GV->getName() != "llvm.cmdline")5883      UsedArray.push_back(5884          ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));5885  }5886  if (Used)5887    Used->eraseFromParent();5888 5889  // Embed the bitcode for the llvm module.5890  std::string Data;5891  ArrayRef<uint8_t> ModuleData;5892  Triple T(M.getTargetTriple());5893 5894  if (EmbedBitcode) {5895    if (Buf.getBufferSize() == 0 ||5896        !isBitcode((const unsigned char *)Buf.getBufferStart(),5897                   (const unsigned char *)Buf.getBufferEnd())) {5898      // If the input is LLVM Assembly, bitcode is produced by serializing5899      // the module. Use-lists order need to be preserved in this case.5900      llvm::raw_string_ostream OS(Data);5901      llvm::WriteBitcodeToFile(M, OS, /* ShouldPreserveUseListOrder */ true);5902      ModuleData =5903          ArrayRef<uint8_t>((const uint8_t *)OS.str().data(), OS.str().size());5904    } else5905      // If the input is LLVM bitcode, write the input byte stream directly.5906      ModuleData = ArrayRef<uint8_t>((const uint8_t *)Buf.getBufferStart(),5907                                     Buf.getBufferSize());5908  }5909  llvm::Constant *ModuleConstant =5910      llvm::ConstantDataArray::get(M.getContext(), ModuleData);5911  llvm::GlobalVariable *GV = new llvm::GlobalVariable(5912      M, ModuleConstant->getType(), true, llvm::GlobalValue::PrivateLinkage,5913      ModuleConstant);5914  GV->setSection(getSectionNameForBitcode(T));5915  // Set alignment to 1 to prevent padding between two contributions from input5916  // sections after linking.5917  GV->setAlignment(Align(1));5918  UsedArray.push_back(5919      ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));5920  if (llvm::GlobalVariable *Old =5921          M.getGlobalVariable("llvm.embedded.module", true)) {5922    assert(Old->hasZeroLiveUses() &&5923           "llvm.embedded.module can only be used once in llvm.compiler.used");5924    GV->takeName(Old);5925    Old->eraseFromParent();5926  } else {5927    GV->setName("llvm.embedded.module");5928  }5929 5930  // Skip if only bitcode needs to be embedded.5931  if (EmbedCmdline) {5932    // Embed command-line options.5933    ArrayRef<uint8_t> CmdData(const_cast<uint8_t *>(CmdArgs.data()),5934                              CmdArgs.size());5935    llvm::Constant *CmdConstant =5936        llvm::ConstantDataArray::get(M.getContext(), CmdData);5937    GV = new llvm::GlobalVariable(M, CmdConstant->getType(), true,5938                                  llvm::GlobalValue::PrivateLinkage,5939                                  CmdConstant);5940    GV->setSection(getSectionNameForCommandline(T));5941    GV->setAlignment(Align(1));5942    UsedArray.push_back(5943        ConstantExpr::getPointerBitCastOrAddrSpaceCast(GV, UsedElementType));5944    if (llvm::GlobalVariable *Old = M.getGlobalVariable("llvm.cmdline", true)) {5945      assert(Old->hasZeroLiveUses() &&5946             "llvm.cmdline can only be used once in llvm.compiler.used");5947      GV->takeName(Old);5948      Old->eraseFromParent();5949    } else {5950      GV->setName("llvm.cmdline");5951    }5952  }5953 5954  if (UsedArray.empty())5955    return;5956 5957  // Recreate llvm.compiler.used.5958  ArrayType *ATy = ArrayType::get(UsedElementType, UsedArray.size());5959  auto *NewUsed = new GlobalVariable(5960      M, ATy, false, llvm::GlobalValue::AppendingLinkage,5961      llvm::ConstantArray::get(ATy, UsedArray), "llvm.compiler.used");5962  NewUsed->setSection("llvm.metadata");5963}5964