brintos

brintos / llvm-project-archived public Read only

0
0
Text · 109.4 KiB · 48a9085 Raw
2920 lines · cpp
1//===- Bitcode/Writer/DXILBitcodeWriter.cpp - DXIL 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 "DXILBitcodeWriter.h"14#include "DXILValueEnumerator.h"15#include "DirectXIRPasses/PointerTypeAnalysis.h"16#include "llvm/ADT/STLExtras.h"17#include "llvm/Bitcode/BitcodeCommon.h"18#include "llvm/Bitcode/BitcodeReader.h"19#include "llvm/Bitcode/LLVMBitCodes.h"20#include "llvm/Bitstream/BitCodes.h"21#include "llvm/Bitstream/BitstreamWriter.h"22#include "llvm/IR/Attributes.h"23#include "llvm/IR/BasicBlock.h"24#include "llvm/IR/Comdat.h"25#include "llvm/IR/Constant.h"26#include "llvm/IR/Constants.h"27#include "llvm/IR/DebugInfoMetadata.h"28#include "llvm/IR/DebugLoc.h"29#include "llvm/IR/DerivedTypes.h"30#include "llvm/IR/Function.h"31#include "llvm/IR/GlobalAlias.h"32#include "llvm/IR/GlobalIFunc.h"33#include "llvm/IR/GlobalObject.h"34#include "llvm/IR/GlobalValue.h"35#include "llvm/IR/GlobalVariable.h"36#include "llvm/IR/InlineAsm.h"37#include "llvm/IR/InstrTypes.h"38#include "llvm/IR/Instruction.h"39#include "llvm/IR/Instructions.h"40#include "llvm/IR/LLVMContext.h"41#include "llvm/IR/Metadata.h"42#include "llvm/IR/Module.h"43#include "llvm/IR/ModuleSummaryIndex.h"44#include "llvm/IR/Operator.h"45#include "llvm/IR/Type.h"46#include "llvm/IR/UseListOrder.h"47#include "llvm/IR/Value.h"48#include "llvm/IR/ValueSymbolTable.h"49#include "llvm/Object/IRSymtab.h"50#include "llvm/Support/ErrorHandling.h"51#include "llvm/Support/ModRef.h"52#include "llvm/Support/SHA1.h"53#include "llvm/TargetParser/Triple.h"54 55namespace llvm {56namespace dxil {57 58// Generates an enum to use as an index in the Abbrev array of Metadata record.59enum MetadataAbbrev : unsigned {60#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,61#include "llvm/IR/Metadata.def"62  LastPlusOne63};64 65class DXILBitcodeWriter {66 67  /// These are manifest constants used by the bitcode writer. They do not need68  /// to be kept in sync with the reader, but need to be consistent within this69  /// file.70  enum {71    // VALUE_SYMTAB_BLOCK abbrev id's.72    VST_ENTRY_8_ABBREV = bitc::FIRST_APPLICATION_ABBREV,73    VST_ENTRY_7_ABBREV,74    VST_ENTRY_6_ABBREV,75    VST_BBENTRY_6_ABBREV,76 77    // CONSTANTS_BLOCK abbrev id's.78    CONSTANTS_SETTYPE_ABBREV = bitc::FIRST_APPLICATION_ABBREV,79    CONSTANTS_INTEGER_ABBREV,80    CONSTANTS_CE_CAST_Abbrev,81    CONSTANTS_NULL_Abbrev,82 83    // FUNCTION_BLOCK abbrev id's.84    FUNCTION_INST_LOAD_ABBREV = bitc::FIRST_APPLICATION_ABBREV,85    FUNCTION_INST_BINOP_ABBREV,86    FUNCTION_INST_BINOP_FLAGS_ABBREV,87    FUNCTION_INST_CAST_ABBREV,88    FUNCTION_INST_RET_VOID_ABBREV,89    FUNCTION_INST_RET_VAL_ABBREV,90    FUNCTION_INST_UNREACHABLE_ABBREV,91    FUNCTION_INST_GEP_ABBREV,92  };93 94  // Cache some types95  Type *I8Ty;96  Type *I8PtrTy;97 98  /// The stream created and owned by the client.99  BitstreamWriter &Stream;100 101  StringTableBuilder &StrtabBuilder;102 103  /// The Module to write to bitcode.104  const Module &M;105 106  /// Enumerates ids for all values in the module.107  ValueEnumerator VE;108 109  /// Map that holds the correspondence between GUIDs in the summary index,110  /// that came from indirect call profiles, and a value id generated by this111  /// class to use in the VST and summary block records.112  std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;113 114  /// Tracks the last value id recorded in the GUIDToValueMap.115  unsigned GlobalValueId;116 117  /// Saves the offset of the VSTOffset record that must eventually be118  /// backpatched with the offset of the actual VST.119  uint64_t VSTOffsetPlaceholder = 0;120 121  /// Pointer to the buffer allocated by caller for bitcode writing.122  const SmallVectorImpl<char> &Buffer;123 124  /// The start bit of the identification block.125  uint64_t BitcodeStartBit;126 127  /// This maps values to their typed pointers128  PointerTypeMap PointerMap;129 130public:131  /// Constructs a ModuleBitcodeWriter object for the given Module,132  /// writing to the provided \p Buffer.133  DXILBitcodeWriter(const Module &M, SmallVectorImpl<char> &Buffer,134                    StringTableBuilder &StrtabBuilder, BitstreamWriter &Stream)135      : I8Ty(Type::getInt8Ty(M.getContext())),136        I8PtrTy(TypedPointerType::get(I8Ty, 0)), Stream(Stream),137        StrtabBuilder(StrtabBuilder), M(M), VE(M, I8PtrTy), Buffer(Buffer),138        BitcodeStartBit(Stream.GetCurrentBitNo()),139        PointerMap(PointerTypeAnalysis::run(M)) {140    GlobalValueId = VE.getValues().size();141    // Enumerate the typed pointers142    for (auto El : PointerMap)143      VE.EnumerateType(El.second);144  }145 146  /// Emit the current module to the bitstream.147  void write();148 149  static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind);150  static void writeStringRecord(BitstreamWriter &Stream, unsigned Code,151                                StringRef Str, unsigned AbbrevToUse);152  static void writeIdentificationBlock(BitstreamWriter &Stream);153  static void emitSignedInt64(SmallVectorImpl<uint64_t> &Vals, uint64_t V);154  static void emitWideAPInt(SmallVectorImpl<uint64_t> &Vals, const APInt &A);155 156  static unsigned getEncodedComdatSelectionKind(const Comdat &C);157  static unsigned getEncodedLinkage(const GlobalValue::LinkageTypes Linkage);158  static unsigned getEncodedLinkage(const GlobalValue &GV);159  static unsigned getEncodedVisibility(const GlobalValue &GV);160  static unsigned getEncodedThreadLocalMode(const GlobalValue &GV);161  static unsigned getEncodedDLLStorageClass(const GlobalValue &GV);162  static unsigned getEncodedCastOpcode(unsigned Opcode);163  static unsigned getEncodedUnaryOpcode(unsigned Opcode);164  static unsigned getEncodedBinaryOpcode(unsigned Opcode);165  static unsigned getEncodedRMWOperation(AtomicRMWInst::BinOp Op);166  static unsigned getEncodedOrdering(AtomicOrdering Ordering);167  static uint64_t getOptimizationFlags(const Value *V);168 169private:170  void writeModuleVersion();171  void writePerModuleGlobalValueSummary();172 173  void writePerModuleFunctionSummaryRecord(SmallVector<uint64_t, 64> &NameVals,174                                           GlobalValueSummary *Summary,175                                           unsigned ValueID,176                                           unsigned FSCallsAbbrev,177                                           unsigned FSCallsProfileAbbrev,178                                           const Function &F);179  void writeModuleLevelReferences(const GlobalVariable &V,180                                  SmallVector<uint64_t, 64> &NameVals,181                                  unsigned FSModRefsAbbrev,182                                  unsigned FSModVTableRefsAbbrev);183 184  void assignValueId(GlobalValue::GUID ValGUID) {185    GUIDToValueIdMap[ValGUID] = ++GlobalValueId;186  }187 188  unsigned getValueId(GlobalValue::GUID ValGUID) {189    const auto &VMI = GUIDToValueIdMap.find(ValGUID);190    // Expect that any GUID value had a value Id assigned by an191    // earlier call to assignValueId.192    assert(VMI != GUIDToValueIdMap.end() &&193           "GUID does not have assigned value Id");194    return VMI->second;195  }196 197  // Helper to get the valueId for the type of value recorded in VI.198  unsigned getValueId(ValueInfo VI) {199    if (!VI.haveGVs() || !VI.getValue())200      return getValueId(VI.getGUID());201    return VE.getValueID(VI.getValue());202  }203 204  std::map<GlobalValue::GUID, unsigned> &valueIds() { return GUIDToValueIdMap; }205 206  uint64_t bitcodeStartBit() { return BitcodeStartBit; }207 208  size_t addToStrtab(StringRef Str);209 210  unsigned createDILocationAbbrev();211  unsigned createGenericDINodeAbbrev();212 213  void writeAttributeGroupTable();214  void writeAttributeTable();215  void writeTypeTable();216  void writeComdats();217  void writeValueSymbolTableForwardDecl();218  void writeModuleInfo();219  void writeValueAsMetadata(const ValueAsMetadata *MD,220                            SmallVectorImpl<uint64_t> &Record);221  void writeMDTuple(const MDTuple *N, SmallVectorImpl<uint64_t> &Record,222                    unsigned Abbrev);223  void writeDILocation(const DILocation *N, SmallVectorImpl<uint64_t> &Record,224                       unsigned &Abbrev);225  void writeGenericDINode(const GenericDINode *N,226                          SmallVectorImpl<uint64_t> &Record, unsigned &Abbrev) {227    llvm_unreachable("DXIL cannot contain GenericDI Nodes");228  }229  void writeDISubrange(const DISubrange *N, SmallVectorImpl<uint64_t> &Record,230                       unsigned Abbrev);231  void writeDIGenericSubrange(const DIGenericSubrange *N,232                              SmallVectorImpl<uint64_t> &Record,233                              unsigned Abbrev) {234    llvm_unreachable("DXIL cannot contain DIGenericSubrange Nodes");235  }236  void writeDIEnumerator(const DIEnumerator *N,237                         SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);238  void writeDIBasicType(const DIBasicType *N, SmallVectorImpl<uint64_t> &Record,239                        unsigned Abbrev);240  void writeDIFixedPointType(const DIFixedPointType *N,241                             SmallVectorImpl<uint64_t> &Record,242                             unsigned Abbrev) {243    llvm_unreachable("DXIL cannot contain DIFixedPointType Nodes");244  }245  void writeDIStringType(const DIStringType *N,246                         SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) {247    llvm_unreachable("DXIL cannot contain DIStringType Nodes");248  }249  void writeDIDerivedType(const DIDerivedType *N,250                          SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);251  void writeDISubrangeType(const DISubrangeType *N,252                           SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) {253    llvm_unreachable("DXIL cannot contain DISubrangeType Nodes");254  }255  void writeDICompositeType(const DICompositeType *N,256                            SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);257  void writeDISubroutineType(const DISubroutineType *N,258                             SmallVectorImpl<uint64_t> &Record,259                             unsigned Abbrev);260  void writeDIFile(const DIFile *N, SmallVectorImpl<uint64_t> &Record,261                   unsigned Abbrev);262  void writeDICompileUnit(const DICompileUnit *N,263                          SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);264  void writeDISubprogram(const DISubprogram *N,265                         SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);266  void writeDILexicalBlock(const DILexicalBlock *N,267                           SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);268  void writeDILexicalBlockFile(const DILexicalBlockFile *N,269                               SmallVectorImpl<uint64_t> &Record,270                               unsigned Abbrev);271  void writeDICommonBlock(const DICommonBlock *N,272                          SmallVectorImpl<uint64_t> &Record, unsigned Abbrev) {273    llvm_unreachable("DXIL cannot contain DICommonBlock Nodes");274  }275  void writeDINamespace(const DINamespace *N, SmallVectorImpl<uint64_t> &Record,276                        unsigned Abbrev);277  void writeDIMacro(const DIMacro *N, SmallVectorImpl<uint64_t> &Record,278                    unsigned Abbrev) {279    llvm_unreachable("DXIL cannot contain DIMacro Nodes");280  }281  void writeDIMacroFile(const DIMacroFile *N, SmallVectorImpl<uint64_t> &Record,282                        unsigned Abbrev) {283    llvm_unreachable("DXIL cannot contain DIMacroFile Nodes");284  }285  void writeDIArgList(const DIArgList *N, SmallVectorImpl<uint64_t> &Record,286                      unsigned Abbrev) {287    llvm_unreachable("DXIL cannot contain DIArgList Nodes");288  }289  void writeDIAssignID(const DIAssignID *N, SmallVectorImpl<uint64_t> &Record,290                       unsigned Abbrev) {291    // DIAssignID is experimental feature to track variable location in IR..292    // FIXME: translate DIAssignID to debug info DXIL supports.293    //   See https://github.com/llvm/llvm-project/issues/58989294    llvm_unreachable("DXIL cannot contain DIAssignID Nodes");295  }296  void writeDIModule(const DIModule *N, SmallVectorImpl<uint64_t> &Record,297                     unsigned Abbrev);298  void writeDITemplateTypeParameter(const DITemplateTypeParameter *N,299                                    SmallVectorImpl<uint64_t> &Record,300                                    unsigned Abbrev);301  void writeDITemplateValueParameter(const DITemplateValueParameter *N,302                                     SmallVectorImpl<uint64_t> &Record,303                                     unsigned Abbrev);304  void writeDIGlobalVariable(const DIGlobalVariable *N,305                             SmallVectorImpl<uint64_t> &Record,306                             unsigned Abbrev);307  void writeDILocalVariable(const DILocalVariable *N,308                            SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);309  void writeDILabel(const DILabel *N, SmallVectorImpl<uint64_t> &Record,310                    unsigned Abbrev) {311    llvm_unreachable("DXIL cannot contain DILabel Nodes");312  }313  void writeDIExpression(const DIExpression *N,314                         SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);315  void writeDIGlobalVariableExpression(const DIGlobalVariableExpression *N,316                                       SmallVectorImpl<uint64_t> &Record,317                                       unsigned Abbrev) {318    llvm_unreachable("DXIL cannot contain GlobalVariableExpression Nodes");319  }320  void writeDIObjCProperty(const DIObjCProperty *N,321                           SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);322  void writeDIImportedEntity(const DIImportedEntity *N,323                             SmallVectorImpl<uint64_t> &Record,324                             unsigned Abbrev);325  unsigned createNamedMetadataAbbrev();326  void writeNamedMetadata(SmallVectorImpl<uint64_t> &Record);327  unsigned createMetadataStringsAbbrev();328  void writeMetadataStrings(ArrayRef<const Metadata *> Strings,329                            SmallVectorImpl<uint64_t> &Record);330  void writeMetadataRecords(ArrayRef<const Metadata *> MDs,331                            SmallVectorImpl<uint64_t> &Record,332                            std::vector<unsigned> *MDAbbrevs = nullptr,333                            std::vector<uint64_t> *IndexPos = nullptr);334  void writeModuleMetadata();335  void writeFunctionMetadata(const Function &F);336  void writeFunctionMetadataAttachment(const Function &F);337  void pushGlobalMetadataAttachment(SmallVectorImpl<uint64_t> &Record,338                                    const GlobalObject &GO);339  void writeModuleMetadataKinds();340  void writeOperandBundleTags();341  void writeSyncScopeNames();342  void writeConstants(unsigned FirstVal, unsigned LastVal, bool isGlobal);343  void writeModuleConstants();344  bool pushValueAndType(const Value *V, unsigned InstID,345                        SmallVectorImpl<unsigned> &Vals);346  void writeOperandBundles(const CallBase &CB, unsigned InstID);347  void pushValue(const Value *V, unsigned InstID,348                 SmallVectorImpl<unsigned> &Vals);349  void pushValueSigned(const Value *V, unsigned InstID,350                       SmallVectorImpl<uint64_t> &Vals);351  void writeInstruction(const Instruction &I, unsigned InstID,352                        SmallVectorImpl<unsigned> &Vals);353  void writeFunctionLevelValueSymbolTable(const ValueSymbolTable &VST);354  void writeGlobalValueSymbolTable(355      DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);356  void writeFunction(const Function &F);357  void writeBlockInfo();358 359  unsigned getEncodedSyncScopeID(SyncScope::ID SSID) { return unsigned(SSID); }360 361  unsigned getEncodedAlign(MaybeAlign Alignment) { return encode(Alignment); }362 363  unsigned getTypeID(Type *T, const Value *V = nullptr);364  /// getGlobalObjectValueTypeID - returns the element type for a GlobalObject365  ///366  /// GlobalObject types are saved by PointerTypeAnalysis as pointers to the367  /// GlobalObject, but in the bitcode writer we need the pointer element type.368  unsigned getGlobalObjectValueTypeID(Type *T, const GlobalObject *G);369};370 371} // namespace dxil372} // namespace llvm373 374using namespace llvm;375using namespace llvm::dxil;376 377////////////////////////////////////////////////////////////////////////////////378/// Begin dxil::BitcodeWriter Implementation379////////////////////////////////////////////////////////////////////////////////380 381dxil::BitcodeWriter::BitcodeWriter(SmallVectorImpl<char> &Buffer)382    : Buffer(Buffer), Stream(new BitstreamWriter(Buffer)) {383  // Emit the file header.384  Stream->Emit((unsigned)'B', 8);385  Stream->Emit((unsigned)'C', 8);386  Stream->Emit(0x0, 4);387  Stream->Emit(0xC, 4);388  Stream->Emit(0xE, 4);389  Stream->Emit(0xD, 4);390}391 392dxil::BitcodeWriter::~BitcodeWriter() { }393 394/// Write the specified module to the specified output stream.395void dxil::WriteDXILToFile(const Module &M, raw_ostream &Out) {396  SmallVector<char, 0> Buffer;397  Buffer.reserve(256 * 1024);398 399  // If this is darwin or another generic macho target, reserve space for the400  // header.401  Triple TT(M.getTargetTriple());402  if (TT.isOSDarwin() || TT.isOSBinFormatMachO())403    Buffer.insert(Buffer.begin(), BWH_HeaderSize, 0);404 405  BitcodeWriter Writer(Buffer);406  Writer.writeModule(M);407 408  // Write the generated bitstream to "Out".409  if (!Buffer.empty())410    Out.write((char *)&Buffer.front(), Buffer.size());411}412 413void BitcodeWriter::writeBlob(unsigned Block, unsigned Record, StringRef Blob) {414  Stream->EnterSubblock(Block, 3);415 416  auto Abbv = std::make_shared<BitCodeAbbrev>();417  Abbv->Add(BitCodeAbbrevOp(Record));418  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));419  auto AbbrevNo = Stream->EmitAbbrev(std::move(Abbv));420 421  Stream->EmitRecordWithBlob(AbbrevNo, ArrayRef<uint64_t>{Record}, Blob);422 423  Stream->ExitBlock();424}425 426void BitcodeWriter::writeModule(const Module &M) {427 428  // The Mods vector is used by irsymtab::build, which requires non-const429  // Modules in case it needs to materialize metadata. But the bitcode writer430  // requires that the module is materialized, so we can cast to non-const here,431  // after checking that it is in fact materialized.432  assert(M.isMaterialized());433  Mods.push_back(const_cast<Module *>(&M));434 435  DXILBitcodeWriter ModuleWriter(M, Buffer, StrtabBuilder, *Stream);436  ModuleWriter.write();437}438 439////////////////////////////////////////////////////////////////////////////////440/// Begin dxil::BitcodeWriterBase Implementation441////////////////////////////////////////////////////////////////////////////////442 443unsigned DXILBitcodeWriter::getEncodedCastOpcode(unsigned Opcode) {444  switch (Opcode) {445  default:446    llvm_unreachable("Unknown cast instruction!");447  case Instruction::Trunc:448    return bitc::CAST_TRUNC;449  case Instruction::ZExt:450    return bitc::CAST_ZEXT;451  case Instruction::SExt:452    return bitc::CAST_SEXT;453  case Instruction::FPToUI:454    return bitc::CAST_FPTOUI;455  case Instruction::FPToSI:456    return bitc::CAST_FPTOSI;457  case Instruction::UIToFP:458    return bitc::CAST_UITOFP;459  case Instruction::SIToFP:460    return bitc::CAST_SITOFP;461  case Instruction::FPTrunc:462    return bitc::CAST_FPTRUNC;463  case Instruction::FPExt:464    return bitc::CAST_FPEXT;465  case Instruction::PtrToInt:466    return bitc::CAST_PTRTOINT;467  case Instruction::IntToPtr:468    return bitc::CAST_INTTOPTR;469  case Instruction::BitCast:470    return bitc::CAST_BITCAST;471  case Instruction::AddrSpaceCast:472    return bitc::CAST_ADDRSPACECAST;473  }474}475 476unsigned DXILBitcodeWriter::getEncodedUnaryOpcode(unsigned Opcode) {477  switch (Opcode) {478  default:479    llvm_unreachable("Unknown binary instruction!");480  case Instruction::FNeg:481    return bitc::UNOP_FNEG;482  }483}484 485unsigned DXILBitcodeWriter::getEncodedBinaryOpcode(unsigned Opcode) {486  switch (Opcode) {487  default:488    llvm_unreachable("Unknown binary instruction!");489  case Instruction::Add:490  case Instruction::FAdd:491    return bitc::BINOP_ADD;492  case Instruction::Sub:493  case Instruction::FSub:494    return bitc::BINOP_SUB;495  case Instruction::Mul:496  case Instruction::FMul:497    return bitc::BINOP_MUL;498  case Instruction::UDiv:499    return bitc::BINOP_UDIV;500  case Instruction::FDiv:501  case Instruction::SDiv:502    return bitc::BINOP_SDIV;503  case Instruction::URem:504    return bitc::BINOP_UREM;505  case Instruction::FRem:506  case Instruction::SRem:507    return bitc::BINOP_SREM;508  case Instruction::Shl:509    return bitc::BINOP_SHL;510  case Instruction::LShr:511    return bitc::BINOP_LSHR;512  case Instruction::AShr:513    return bitc::BINOP_ASHR;514  case Instruction::And:515    return bitc::BINOP_AND;516  case Instruction::Or:517    return bitc::BINOP_OR;518  case Instruction::Xor:519    return bitc::BINOP_XOR;520  }521}522 523unsigned DXILBitcodeWriter::getTypeID(Type *T, const Value *V) {524  if (!T->isPointerTy() &&525      // For Constant, always check PointerMap to make sure OpaquePointer in526      // things like constant struct/array works.527      (!V || !isa<Constant>(V)))528    return VE.getTypeID(T);529  auto It = PointerMap.find(V);530  if (It != PointerMap.end())531    return VE.getTypeID(It->second);532  // For Constant, return T when cannot find in PointerMap.533  // FIXME: support ConstantPointerNull which could map to more than one534  // TypedPointerType.535  // See https://github.com/llvm/llvm-project/issues/57942.536  if (V && isa<Constant>(V) && !isa<ConstantPointerNull>(V))537    return VE.getTypeID(T);538  return VE.getTypeID(I8PtrTy);539}540 541unsigned DXILBitcodeWriter::getGlobalObjectValueTypeID(Type *T,542                                                       const GlobalObject *G) {543  auto It = PointerMap.find(G);544  if (It != PointerMap.end()) {545    TypedPointerType *PtrTy = cast<TypedPointerType>(It->second);546    return VE.getTypeID(PtrTy->getElementType());547  }548  return VE.getTypeID(T);549}550 551unsigned DXILBitcodeWriter::getEncodedRMWOperation(AtomicRMWInst::BinOp Op) {552  switch (Op) {553  default:554    llvm_unreachable("Unknown RMW operation!");555  case AtomicRMWInst::Xchg:556    return bitc::RMW_XCHG;557  case AtomicRMWInst::Add:558    return bitc::RMW_ADD;559  case AtomicRMWInst::Sub:560    return bitc::RMW_SUB;561  case AtomicRMWInst::And:562    return bitc::RMW_AND;563  case AtomicRMWInst::Nand:564    return bitc::RMW_NAND;565  case AtomicRMWInst::Or:566    return bitc::RMW_OR;567  case AtomicRMWInst::Xor:568    return bitc::RMW_XOR;569  case AtomicRMWInst::Max:570    return bitc::RMW_MAX;571  case AtomicRMWInst::Min:572    return bitc::RMW_MIN;573  case AtomicRMWInst::UMax:574    return bitc::RMW_UMAX;575  case AtomicRMWInst::UMin:576    return bitc::RMW_UMIN;577  case AtomicRMWInst::FAdd:578    return bitc::RMW_FADD;579  case AtomicRMWInst::FSub:580    return bitc::RMW_FSUB;581  case AtomicRMWInst::FMax:582    return bitc::RMW_FMAX;583  case AtomicRMWInst::FMin:584    return bitc::RMW_FMIN;585  }586}587 588unsigned DXILBitcodeWriter::getEncodedOrdering(AtomicOrdering Ordering) {589  switch (Ordering) {590  case AtomicOrdering::NotAtomic:591    return bitc::ORDERING_NOTATOMIC;592  case AtomicOrdering::Unordered:593    return bitc::ORDERING_UNORDERED;594  case AtomicOrdering::Monotonic:595    return bitc::ORDERING_MONOTONIC;596  case AtomicOrdering::Acquire:597    return bitc::ORDERING_ACQUIRE;598  case AtomicOrdering::Release:599    return bitc::ORDERING_RELEASE;600  case AtomicOrdering::AcquireRelease:601    return bitc::ORDERING_ACQREL;602  case AtomicOrdering::SequentiallyConsistent:603    return bitc::ORDERING_SEQCST;604  }605  llvm_unreachable("Invalid ordering");606}607 608void DXILBitcodeWriter::writeStringRecord(BitstreamWriter &Stream,609                                          unsigned Code, StringRef Str,610                                          unsigned AbbrevToUse) {611  SmallVector<unsigned, 64> Vals;612 613  // Code: [strchar x N]614  for (char C : Str) {615    if (AbbrevToUse && !BitCodeAbbrevOp::isChar6(C))616      AbbrevToUse = 0;617    Vals.push_back(C);618  }619 620  // Emit the finished record.621  Stream.EmitRecord(Code, Vals, AbbrevToUse);622}623 624uint64_t DXILBitcodeWriter::getAttrKindEncoding(Attribute::AttrKind Kind) {625  switch (Kind) {626  case Attribute::Alignment:627    return bitc::ATTR_KIND_ALIGNMENT;628  case Attribute::AlwaysInline:629    return bitc::ATTR_KIND_ALWAYS_INLINE;630  case Attribute::Builtin:631    return bitc::ATTR_KIND_BUILTIN;632  case Attribute::ByVal:633    return bitc::ATTR_KIND_BY_VAL;634  case Attribute::Convergent:635    return bitc::ATTR_KIND_CONVERGENT;636  case Attribute::InAlloca:637    return bitc::ATTR_KIND_IN_ALLOCA;638  case Attribute::Cold:639    return bitc::ATTR_KIND_COLD;640  case Attribute::InlineHint:641    return bitc::ATTR_KIND_INLINE_HINT;642  case Attribute::InReg:643    return bitc::ATTR_KIND_IN_REG;644  case Attribute::JumpTable:645    return bitc::ATTR_KIND_JUMP_TABLE;646  case Attribute::MinSize:647    return bitc::ATTR_KIND_MIN_SIZE;648  case Attribute::Naked:649    return bitc::ATTR_KIND_NAKED;650  case Attribute::Nest:651    return bitc::ATTR_KIND_NEST;652  case Attribute::NoAlias:653    return bitc::ATTR_KIND_NO_ALIAS;654  case Attribute::NoBuiltin:655    return bitc::ATTR_KIND_NO_BUILTIN;656  case Attribute::NoDuplicate:657    return bitc::ATTR_KIND_NO_DUPLICATE;658  case Attribute::NoImplicitFloat:659    return bitc::ATTR_KIND_NO_IMPLICIT_FLOAT;660  case Attribute::NoInline:661    return bitc::ATTR_KIND_NO_INLINE;662  case Attribute::NonLazyBind:663    return bitc::ATTR_KIND_NON_LAZY_BIND;664  case Attribute::NonNull:665    return bitc::ATTR_KIND_NON_NULL;666  case Attribute::Dereferenceable:667    return bitc::ATTR_KIND_DEREFERENCEABLE;668  case Attribute::DereferenceableOrNull:669    return bitc::ATTR_KIND_DEREFERENCEABLE_OR_NULL;670  case Attribute::NoRedZone:671    return bitc::ATTR_KIND_NO_RED_ZONE;672  case Attribute::NoReturn:673    return bitc::ATTR_KIND_NO_RETURN;674  case Attribute::NoUnwind:675    return bitc::ATTR_KIND_NO_UNWIND;676  case Attribute::OptimizeForSize:677    return bitc::ATTR_KIND_OPTIMIZE_FOR_SIZE;678  case Attribute::OptimizeNone:679    return bitc::ATTR_KIND_OPTIMIZE_NONE;680  case Attribute::ReadNone:681    return bitc::ATTR_KIND_READ_NONE;682  case Attribute::ReadOnly:683    return bitc::ATTR_KIND_READ_ONLY;684  case Attribute::Returned:685    return bitc::ATTR_KIND_RETURNED;686  case Attribute::ReturnsTwice:687    return bitc::ATTR_KIND_RETURNS_TWICE;688  case Attribute::SExt:689    return bitc::ATTR_KIND_S_EXT;690  case Attribute::StackAlignment:691    return bitc::ATTR_KIND_STACK_ALIGNMENT;692  case Attribute::StackProtect:693    return bitc::ATTR_KIND_STACK_PROTECT;694  case Attribute::StackProtectReq:695    return bitc::ATTR_KIND_STACK_PROTECT_REQ;696  case Attribute::StackProtectStrong:697    return bitc::ATTR_KIND_STACK_PROTECT_STRONG;698  case Attribute::SafeStack:699    return bitc::ATTR_KIND_SAFESTACK;700  case Attribute::StructRet:701    return bitc::ATTR_KIND_STRUCT_RET;702  case Attribute::SanitizeAddress:703    return bitc::ATTR_KIND_SANITIZE_ADDRESS;704  case Attribute::SanitizeThread:705    return bitc::ATTR_KIND_SANITIZE_THREAD;706  case Attribute::SanitizeMemory:707    return bitc::ATTR_KIND_SANITIZE_MEMORY;708  case Attribute::UWTable:709    return bitc::ATTR_KIND_UW_TABLE;710  case Attribute::ZExt:711    return bitc::ATTR_KIND_Z_EXT;712  case Attribute::EndAttrKinds:713    llvm_unreachable("Can not encode end-attribute kinds marker.");714  case Attribute::None:715    llvm_unreachable("Can not encode none-attribute.");716  case Attribute::EmptyKey:717  case Attribute::TombstoneKey:718    llvm_unreachable("Trying to encode EmptyKey/TombstoneKey");719  default:720    llvm_unreachable("Trying to encode attribute not supported by DXIL. These "721                     "should be stripped in DXILPrepare");722  }723 724  llvm_unreachable("Trying to encode unknown attribute");725}726 727void DXILBitcodeWriter::emitSignedInt64(SmallVectorImpl<uint64_t> &Vals,728                                        uint64_t V) {729  if ((int64_t)V >= 0)730    Vals.push_back(V << 1);731  else732    Vals.push_back((-V << 1) | 1);733}734 735void DXILBitcodeWriter::emitWideAPInt(SmallVectorImpl<uint64_t> &Vals,736                                      const APInt &A) {737  // We have an arbitrary precision integer value to write whose738  // bit width is > 64. However, in canonical unsigned integer739  // format it is likely that the high bits are going to be zero.740  // So, we only write the number of active words.741  unsigned NumWords = A.getActiveWords();742  const uint64_t *RawData = A.getRawData();743  for (unsigned i = 0; i < NumWords; i++)744    emitSignedInt64(Vals, RawData[i]);745}746 747uint64_t DXILBitcodeWriter::getOptimizationFlags(const Value *V) {748  uint64_t Flags = 0;749 750  if (const auto *OBO = dyn_cast<OverflowingBinaryOperator>(V)) {751    if (OBO->hasNoSignedWrap())752      Flags |= 1 << bitc::OBO_NO_SIGNED_WRAP;753    if (OBO->hasNoUnsignedWrap())754      Flags |= 1 << bitc::OBO_NO_UNSIGNED_WRAP;755  } else if (const auto *PEO = dyn_cast<PossiblyExactOperator>(V)) {756    if (PEO->isExact())757      Flags |= 1 << bitc::PEO_EXACT;758  } else if (const auto *FPMO = dyn_cast<FPMathOperator>(V)) {759    if (FPMO->hasAllowReassoc() || FPMO->hasAllowContract())760      Flags |= bitc::UnsafeAlgebra;761    if (FPMO->hasNoNaNs())762      Flags |= bitc::NoNaNs;763    if (FPMO->hasNoInfs())764      Flags |= bitc::NoInfs;765    if (FPMO->hasNoSignedZeros())766      Flags |= bitc::NoSignedZeros;767    if (FPMO->hasAllowReciprocal())768      Flags |= bitc::AllowReciprocal;769  }770 771  return Flags;772}773 774unsigned775DXILBitcodeWriter::getEncodedLinkage(const GlobalValue::LinkageTypes Linkage) {776  switch (Linkage) {777  case GlobalValue::ExternalLinkage:778    return 0;779  case GlobalValue::WeakAnyLinkage:780    return 16;781  case GlobalValue::AppendingLinkage:782    return 2;783  case GlobalValue::InternalLinkage:784    return 3;785  case GlobalValue::LinkOnceAnyLinkage:786    return 18;787  case GlobalValue::ExternalWeakLinkage:788    return 7;789  case GlobalValue::CommonLinkage:790    return 8;791  case GlobalValue::PrivateLinkage:792    return 9;793  case GlobalValue::WeakODRLinkage:794    return 17;795  case GlobalValue::LinkOnceODRLinkage:796    return 19;797  case GlobalValue::AvailableExternallyLinkage:798    return 12;799  }800  llvm_unreachable("Invalid linkage");801}802 803unsigned DXILBitcodeWriter::getEncodedLinkage(const GlobalValue &GV) {804  return getEncodedLinkage(GV.getLinkage());805}806 807unsigned DXILBitcodeWriter::getEncodedVisibility(const GlobalValue &GV) {808  switch (GV.getVisibility()) {809  case GlobalValue::DefaultVisibility:810    return 0;811  case GlobalValue::HiddenVisibility:812    return 1;813  case GlobalValue::ProtectedVisibility:814    return 2;815  }816  llvm_unreachable("Invalid visibility");817}818 819unsigned DXILBitcodeWriter::getEncodedDLLStorageClass(const GlobalValue &GV) {820  switch (GV.getDLLStorageClass()) {821  case GlobalValue::DefaultStorageClass:822    return 0;823  case GlobalValue::DLLImportStorageClass:824    return 1;825  case GlobalValue::DLLExportStorageClass:826    return 2;827  }828  llvm_unreachable("Invalid DLL storage class");829}830 831unsigned DXILBitcodeWriter::getEncodedThreadLocalMode(const GlobalValue &GV) {832  switch (GV.getThreadLocalMode()) {833  case GlobalVariable::NotThreadLocal:834    return 0;835  case GlobalVariable::GeneralDynamicTLSModel:836    return 1;837  case GlobalVariable::LocalDynamicTLSModel:838    return 2;839  case GlobalVariable::InitialExecTLSModel:840    return 3;841  case GlobalVariable::LocalExecTLSModel:842    return 4;843  }844  llvm_unreachable("Invalid TLS model");845}846 847unsigned DXILBitcodeWriter::getEncodedComdatSelectionKind(const Comdat &C) {848  switch (C.getSelectionKind()) {849  case Comdat::Any:850    return bitc::COMDAT_SELECTION_KIND_ANY;851  case Comdat::ExactMatch:852    return bitc::COMDAT_SELECTION_KIND_EXACT_MATCH;853  case Comdat::Largest:854    return bitc::COMDAT_SELECTION_KIND_LARGEST;855  case Comdat::NoDeduplicate:856    return bitc::COMDAT_SELECTION_KIND_NO_DUPLICATES;857  case Comdat::SameSize:858    return bitc::COMDAT_SELECTION_KIND_SAME_SIZE;859  }860  llvm_unreachable("Invalid selection kind");861}862 863////////////////////////////////////////////////////////////////////////////////864/// Begin DXILBitcodeWriter Implementation865////////////////////////////////////////////////////////////////////////////////866 867void DXILBitcodeWriter::writeAttributeGroupTable() {868  const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =869      VE.getAttributeGroups();870  if (AttrGrps.empty())871    return;872 873  Stream.EnterSubblock(bitc::PARAMATTR_GROUP_BLOCK_ID, 3);874 875  SmallVector<uint64_t, 64> Record;876  for (ValueEnumerator::IndexAndAttrSet Pair : AttrGrps) {877    unsigned AttrListIndex = Pair.first;878    AttributeSet AS = Pair.second;879    Record.push_back(VE.getAttributeGroupID(Pair));880    Record.push_back(AttrListIndex);881 882    for (Attribute Attr : AS) {883      if (Attr.isEnumAttribute()) {884        uint64_t Val = getAttrKindEncoding(Attr.getKindAsEnum());885        assert(Val <= bitc::ATTR_KIND_ARGMEMONLY &&886               "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");887        Record.push_back(0);888        Record.push_back(Val);889      } else if (Attr.isIntAttribute()) {890        if (Attr.getKindAsEnum() == Attribute::AttrKind::Memory) {891          MemoryEffects ME = Attr.getMemoryEffects();892          if (ME.doesNotAccessMemory()) {893            Record.push_back(0);894            Record.push_back(bitc::ATTR_KIND_READ_NONE);895          } else {896            if (ME.onlyReadsMemory()) {897              Record.push_back(0);898              Record.push_back(bitc::ATTR_KIND_READ_ONLY);899            }900            if (ME.onlyAccessesArgPointees()) {901              Record.push_back(0);902              Record.push_back(bitc::ATTR_KIND_ARGMEMONLY);903            }904          }905        } else {906          uint64_t Val = getAttrKindEncoding(Attr.getKindAsEnum());907          assert(Val <= bitc::ATTR_KIND_ARGMEMONLY &&908                 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");909          Record.push_back(1);910          Record.push_back(Val);911          Record.push_back(Attr.getValueAsInt());912        }913      } else {914        StringRef Kind = Attr.getKindAsString();915        StringRef Val = Attr.getValueAsString();916 917        Record.push_back(Val.empty() ? 3 : 4);918        Record.append(Kind.begin(), Kind.end());919        Record.push_back(0);920        if (!Val.empty()) {921          Record.append(Val.begin(), Val.end());922          Record.push_back(0);923        }924      }925    }926 927    Stream.EmitRecord(bitc::PARAMATTR_GRP_CODE_ENTRY, Record);928    Record.clear();929  }930 931  Stream.ExitBlock();932}933 934void DXILBitcodeWriter::writeAttributeTable() {935  const std::vector<AttributeList> &Attrs = VE.getAttributeLists();936  if (Attrs.empty())937    return;938 939  Stream.EnterSubblock(bitc::PARAMATTR_BLOCK_ID, 3);940 941  SmallVector<uint64_t, 64> Record;942  for (AttributeList AL : Attrs) {943    for (unsigned i : AL.indexes()) {944      AttributeSet AS = AL.getAttributes(i);945      if (AS.hasAttributes())946        Record.push_back(VE.getAttributeGroupID({i, AS}));947    }948 949    Stream.EmitRecord(bitc::PARAMATTR_CODE_ENTRY, Record);950    Record.clear();951  }952 953  Stream.ExitBlock();954}955 956/// WriteTypeTable - Write out the type table for a module.957void DXILBitcodeWriter::writeTypeTable() {958  const ValueEnumerator::TypeList &TypeList = VE.getTypes();959 960  Stream.EnterSubblock(bitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */);961  SmallVector<uint64_t, 64> TypeVals;962 963  uint64_t NumBits = VE.computeBitsRequiredForTypeIndices();964 965  // Abbrev for TYPE_CODE_POINTER.966  auto Abbv = std::make_shared<BitCodeAbbrev>();967  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_POINTER));968  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));969  Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 0970  unsigned PtrAbbrev = Stream.EmitAbbrev(std::move(Abbv));971 972  // Abbrev for TYPE_CODE_FUNCTION.973  Abbv = std::make_shared<BitCodeAbbrev>();974  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_FUNCTION));975  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isvararg976  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));977  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));978  unsigned FunctionAbbrev = Stream.EmitAbbrev(std::move(Abbv));979 980  // Abbrev for TYPE_CODE_STRUCT_ANON.981  Abbv = std::make_shared<BitCodeAbbrev>();982  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_ANON));983  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked984  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));985  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));986  unsigned StructAnonAbbrev = Stream.EmitAbbrev(std::move(Abbv));987 988  // Abbrev for TYPE_CODE_STRUCT_NAME.989  Abbv = std::make_shared<BitCodeAbbrev>();990  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME));991  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));992  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));993  unsigned StructNameAbbrev = Stream.EmitAbbrev(std::move(Abbv));994 995  // Abbrev for TYPE_CODE_STRUCT_NAMED.996  Abbv = std::make_shared<BitCodeAbbrev>();997  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAMED));998  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked999  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1000  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));1001  unsigned StructNamedAbbrev = Stream.EmitAbbrev(std::move(Abbv));1002 1003  // Abbrev for TYPE_CODE_ARRAY.1004  Abbv = std::make_shared<BitCodeAbbrev>();1005  Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY));1006  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // size1007  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));1008  unsigned ArrayAbbrev = Stream.EmitAbbrev(std::move(Abbv));1009 1010  // Emit an entry count so the reader can reserve space.1011  TypeVals.push_back(TypeList.size());1012  Stream.EmitRecord(bitc::TYPE_CODE_NUMENTRY, TypeVals);1013  TypeVals.clear();1014 1015  // Loop over all of the types, emitting each in turn.1016  for (Type *T : TypeList) {1017    int AbbrevToUse = 0;1018    unsigned Code = 0;1019 1020    switch (T->getTypeID()) {1021    case Type::BFloatTyID:1022    case Type::X86_AMXTyID:1023    case Type::TokenTyID:1024    case Type::TargetExtTyID:1025      llvm_unreachable("These should never be used!!!");1026      break;1027    case Type::VoidTyID:1028      Code = bitc::TYPE_CODE_VOID;1029      break;1030    case Type::HalfTyID:1031      Code = bitc::TYPE_CODE_HALF;1032      break;1033    case Type::FloatTyID:1034      Code = bitc::TYPE_CODE_FLOAT;1035      break;1036    case Type::DoubleTyID:1037      Code = bitc::TYPE_CODE_DOUBLE;1038      break;1039    case Type::X86_FP80TyID:1040      Code = bitc::TYPE_CODE_X86_FP80;1041      break;1042    case Type::FP128TyID:1043      Code = bitc::TYPE_CODE_FP128;1044      break;1045    case Type::PPC_FP128TyID:1046      Code = bitc::TYPE_CODE_PPC_FP128;1047      break;1048    case Type::LabelTyID:1049      Code = bitc::TYPE_CODE_LABEL;1050      break;1051    case Type::MetadataTyID:1052      Code = bitc::TYPE_CODE_METADATA;1053      break;1054    case Type::IntegerTyID:1055      // INTEGER: [width]1056      Code = bitc::TYPE_CODE_INTEGER;1057      TypeVals.push_back(cast<IntegerType>(T)->getBitWidth());1058      break;1059    case Type::TypedPointerTyID: {1060      TypedPointerType *PTy = cast<TypedPointerType>(T);1061      // POINTER: [pointee type, address space]1062      Code = bitc::TYPE_CODE_POINTER;1063      TypeVals.push_back(getTypeID(PTy->getElementType()));1064      unsigned AddressSpace = PTy->getAddressSpace();1065      TypeVals.push_back(AddressSpace);1066      if (AddressSpace == 0)1067        AbbrevToUse = PtrAbbrev;1068      break;1069    }1070    case Type::PointerTyID: {1071      // POINTER: [pointee type, address space]1072      // Emitting an empty struct type for the pointer's type allows this to be1073      // order-independent. Non-struct types must be emitted in bitcode before1074      // they can be referenced.1075      TypeVals.push_back(false);1076      Code = bitc::TYPE_CODE_OPAQUE;1077      writeStringRecord(Stream, bitc::TYPE_CODE_STRUCT_NAME,1078                        "dxilOpaquePtrReservedName", StructNameAbbrev);1079      break;1080    }1081    case Type::FunctionTyID: {1082      FunctionType *FT = cast<FunctionType>(T);1083      // FUNCTION: [isvararg, retty, paramty x N]1084      Code = bitc::TYPE_CODE_FUNCTION;1085      TypeVals.push_back(FT->isVarArg());1086      TypeVals.push_back(getTypeID(FT->getReturnType()));1087      for (Type *PTy : FT->params())1088        TypeVals.push_back(getTypeID(PTy));1089      AbbrevToUse = FunctionAbbrev;1090      break;1091    }1092    case Type::StructTyID: {1093      StructType *ST = cast<StructType>(T);1094      // STRUCT: [ispacked, eltty x N]1095      TypeVals.push_back(ST->isPacked());1096      // Output all of the element types.1097      for (Type *ElTy : ST->elements())1098        TypeVals.push_back(getTypeID(ElTy));1099 1100      if (ST->isLiteral()) {1101        Code = bitc::TYPE_CODE_STRUCT_ANON;1102        AbbrevToUse = StructAnonAbbrev;1103      } else {1104        if (ST->isOpaque()) {1105          Code = bitc::TYPE_CODE_OPAQUE;1106        } else {1107          Code = bitc::TYPE_CODE_STRUCT_NAMED;1108          AbbrevToUse = StructNamedAbbrev;1109        }1110 1111        // Emit the name if it is present.1112        if (!ST->getName().empty())1113          writeStringRecord(Stream, bitc::TYPE_CODE_STRUCT_NAME, ST->getName(),1114                            StructNameAbbrev);1115      }1116      break;1117    }1118    case Type::ArrayTyID: {1119      ArrayType *AT = cast<ArrayType>(T);1120      // ARRAY: [numelts, eltty]1121      Code = bitc::TYPE_CODE_ARRAY;1122      TypeVals.push_back(AT->getNumElements());1123      TypeVals.push_back(getTypeID(AT->getElementType()));1124      AbbrevToUse = ArrayAbbrev;1125      break;1126    }1127    case Type::FixedVectorTyID:1128    case Type::ScalableVectorTyID: {1129      VectorType *VT = cast<VectorType>(T);1130      // VECTOR [numelts, eltty]1131      Code = bitc::TYPE_CODE_VECTOR;1132      TypeVals.push_back(VT->getElementCount().getKnownMinValue());1133      TypeVals.push_back(getTypeID(VT->getElementType()));1134      break;1135    }1136    }1137 1138    // Emit the finished record.1139    Stream.EmitRecord(Code, TypeVals, AbbrevToUse);1140    TypeVals.clear();1141  }1142 1143  Stream.ExitBlock();1144}1145 1146void DXILBitcodeWriter::writeComdats() {1147  SmallVector<uint16_t, 64> Vals;1148  for (const Comdat *C : VE.getComdats()) {1149    // COMDAT: [selection_kind, name]1150    Vals.push_back(getEncodedComdatSelectionKind(*C));1151    size_t Size = C->getName().size();1152    assert(isUInt<16>(Size));1153    Vals.push_back(Size);1154    for (char Chr : C->getName())1155      Vals.push_back((unsigned char)Chr);1156    Stream.EmitRecord(bitc::MODULE_CODE_COMDAT, Vals, /*AbbrevToUse=*/0);1157    Vals.clear();1158  }1159}1160 1161void DXILBitcodeWriter::writeValueSymbolTableForwardDecl() {}1162 1163/// Emit top-level description of module, including target triple, inline asm,1164/// descriptors for global variables, and function prototype info.1165/// Returns the bit offset to backpatch with the location of the real VST.1166void DXILBitcodeWriter::writeModuleInfo() {1167  // Emit various pieces of data attached to a module.1168 1169  // We need to hardcode a triple and datalayout that's compatible with the1170  // historical DXIL triple and datalayout from DXC.1171  StringRef Triple = "dxil-ms-dx";1172  StringRef DL = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-"1173                 "f16:16-f32:32-f64:64-n8:16:32:64";1174  writeStringRecord(Stream, bitc::MODULE_CODE_TRIPLE, Triple, 0 /*TODO*/);1175  writeStringRecord(Stream, bitc::MODULE_CODE_DATALAYOUT, DL, 0 /*TODO*/);1176 1177  if (!M.getModuleInlineAsm().empty())1178    writeStringRecord(Stream, bitc::MODULE_CODE_ASM, M.getModuleInlineAsm(),1179                      0 /*TODO*/);1180 1181  // Emit information about sections and GC, computing how many there are. Also1182  // compute the maximum alignment value.1183  std::map<std::string, unsigned> SectionMap;1184  std::map<std::string, unsigned> GCMap;1185  MaybeAlign MaxAlignment;1186  unsigned MaxGlobalType = 0;1187  const auto UpdateMaxAlignment = [&MaxAlignment](const MaybeAlign A) {1188    if (A)1189      MaxAlignment = !MaxAlignment ? *A : std::max(*MaxAlignment, *A);1190  };1191  for (const GlobalVariable &GV : M.globals()) {1192    UpdateMaxAlignment(GV.getAlign());1193    // Use getGlobalObjectValueTypeID to look up the enumerated type ID for1194    // Global Variable types.1195    MaxGlobalType = std::max(1196        MaxGlobalType, getGlobalObjectValueTypeID(GV.getValueType(), &GV));1197    if (GV.hasSection()) {1198      // Give section names unique ID's.1199      unsigned &Entry = SectionMap[std::string(GV.getSection())];1200      if (!Entry) {1201        writeStringRecord(Stream, bitc::MODULE_CODE_SECTIONNAME,1202                          GV.getSection(), 0 /*TODO*/);1203        Entry = SectionMap.size();1204      }1205    }1206  }1207  for (const Function &F : M) {1208    UpdateMaxAlignment(F.getAlign());1209    if (F.hasSection()) {1210      // Give section names unique ID's.1211      unsigned &Entry = SectionMap[std::string(F.getSection())];1212      if (!Entry) {1213        writeStringRecord(Stream, bitc::MODULE_CODE_SECTIONNAME, F.getSection(),1214                          0 /*TODO*/);1215        Entry = SectionMap.size();1216      }1217    }1218    if (F.hasGC()) {1219      // Same for GC names.1220      unsigned &Entry = GCMap[F.getGC()];1221      if (!Entry) {1222        writeStringRecord(Stream, bitc::MODULE_CODE_GCNAME, F.getGC(),1223                          0 /*TODO*/);1224        Entry = GCMap.size();1225      }1226    }1227  }1228 1229  // Emit abbrev for globals, now that we know # sections and max alignment.1230  unsigned SimpleGVarAbbrev = 0;1231  if (!M.global_empty()) {1232    // Add an abbrev for common globals with no visibility or thread1233    // localness.1234    auto Abbv = std::make_shared<BitCodeAbbrev>();1235    Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR));1236    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,1237                              Log2_32_Ceil(MaxGlobalType + 1)));1238    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // AddrSpace << 21239                                                           //| explicitType << 11240                                                           //| constant1241    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // Initializer.1242    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // Linkage.1243    if (!MaxAlignment)                                     // Alignment.1244      Abbv->Add(BitCodeAbbrevOp(0));1245    else {1246      unsigned MaxEncAlignment = getEncodedAlign(MaxAlignment);1247      Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,1248                                Log2_32_Ceil(MaxEncAlignment + 1)));1249    }1250    if (SectionMap.empty()) // Section.1251      Abbv->Add(BitCodeAbbrevOp(0));1252    else1253      Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,1254                                Log2_32_Ceil(SectionMap.size() + 1)));1255    // Don't bother emitting vis + thread local.1256    SimpleGVarAbbrev = Stream.EmitAbbrev(std::move(Abbv));1257  }1258 1259  // Emit the global variable information.1260  SmallVector<unsigned, 64> Vals;1261  for (const GlobalVariable &GV : M.globals()) {1262    unsigned AbbrevToUse = 0;1263 1264    // GLOBALVAR: [type, isconst, initid,1265    //             linkage, alignment, section, visibility, threadlocal,1266    //             unnamed_addr, externally_initialized, dllstorageclass,1267    //             comdat]1268    Vals.push_back(getGlobalObjectValueTypeID(GV.getValueType(), &GV));1269    Vals.push_back(1270        GV.getType()->getAddressSpace() << 2 | 2 |1271        (GV.isConstant() ? 1 : 0)); // HLSL Change - bitwise | was used with1272                                    // unsigned int and bool1273    Vals.push_back(1274        GV.isDeclaration() ? 0 : (VE.getValueID(GV.getInitializer()) + 1));1275    Vals.push_back(getEncodedLinkage(GV));1276    Vals.push_back(getEncodedAlign(GV.getAlign()));1277    Vals.push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]1278                                   : 0);1279    if (GV.isThreadLocal() ||1280        GV.getVisibility() != GlobalValue::DefaultVisibility ||1281        GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||1282        GV.isExternallyInitialized() ||1283        GV.getDLLStorageClass() != GlobalValue::DefaultStorageClass ||1284        GV.hasComdat()) {1285      Vals.push_back(getEncodedVisibility(GV));1286      Vals.push_back(getEncodedThreadLocalMode(GV));1287      Vals.push_back(GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);1288      Vals.push_back(GV.isExternallyInitialized());1289      Vals.push_back(getEncodedDLLStorageClass(GV));1290      Vals.push_back(GV.hasComdat() ? VE.getComdatID(GV.getComdat()) : 0);1291    } else {1292      AbbrevToUse = SimpleGVarAbbrev;1293    }1294 1295    Stream.EmitRecord(bitc::MODULE_CODE_GLOBALVAR, Vals, AbbrevToUse);1296    Vals.clear();1297  }1298 1299  // Emit the function proto information.1300  for (const Function &F : M) {1301    // FUNCTION:  [type, callingconv, isproto, linkage, paramattrs, alignment,1302    //             section, visibility, gc, unnamed_addr, prologuedata,1303    //             dllstorageclass, comdat, prefixdata, personalityfn]1304    Vals.push_back(getGlobalObjectValueTypeID(F.getFunctionType(), &F));1305    Vals.push_back(F.getCallingConv());1306    Vals.push_back(F.isDeclaration());1307    Vals.push_back(getEncodedLinkage(F));1308    Vals.push_back(VE.getAttributeListID(F.getAttributes()));1309    Vals.push_back(getEncodedAlign(F.getAlign()));1310    Vals.push_back(F.hasSection() ? SectionMap[std::string(F.getSection())]1311                                  : 0);1312    Vals.push_back(getEncodedVisibility(F));1313    Vals.push_back(F.hasGC() ? GCMap[F.getGC()] : 0);1314    Vals.push_back(F.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);1315    Vals.push_back(1316        F.hasPrologueData() ? (VE.getValueID(F.getPrologueData()) + 1) : 0);1317    Vals.push_back(getEncodedDLLStorageClass(F));1318    Vals.push_back(F.hasComdat() ? VE.getComdatID(F.getComdat()) : 0);1319    Vals.push_back(F.hasPrefixData() ? (VE.getValueID(F.getPrefixData()) + 1)1320                                     : 0);1321    Vals.push_back(1322        F.hasPersonalityFn() ? (VE.getValueID(F.getPersonalityFn()) + 1) : 0);1323 1324    unsigned AbbrevToUse = 0;1325    Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse);1326    Vals.clear();1327  }1328 1329  // Emit the alias information.1330  for (const GlobalAlias &A : M.aliases()) {1331    // ALIAS: [alias type, aliasee val#, linkage, visibility]1332    Vals.push_back(getTypeID(A.getValueType(), &A));1333    Vals.push_back(VE.getValueID(A.getAliasee()));1334    Vals.push_back(getEncodedLinkage(A));1335    Vals.push_back(getEncodedVisibility(A));1336    Vals.push_back(getEncodedDLLStorageClass(A));1337    Vals.push_back(getEncodedThreadLocalMode(A));1338    Vals.push_back(A.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);1339    unsigned AbbrevToUse = 0;1340    Stream.EmitRecord(bitc::MODULE_CODE_ALIAS_OLD, Vals, AbbrevToUse);1341    Vals.clear();1342  }1343}1344 1345void DXILBitcodeWriter::writeValueAsMetadata(1346    const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {1347  // Mimic an MDNode with a value as one operand.1348  Value *V = MD->getValue();1349  Type *Ty = V->getType();1350  if (Function *F = dyn_cast<Function>(V))1351    Ty = TypedPointerType::get(F->getFunctionType(), F->getAddressSpace());1352  else if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))1353    Ty = TypedPointerType::get(GV->getValueType(), GV->getAddressSpace());1354  Record.push_back(getTypeID(Ty, V));1355  Record.push_back(VE.getValueID(V));1356  Stream.EmitRecord(bitc::METADATA_VALUE, Record, 0);1357  Record.clear();1358}1359 1360void DXILBitcodeWriter::writeMDTuple(const MDTuple *N,1361                                     SmallVectorImpl<uint64_t> &Record,1362                                     unsigned Abbrev) {1363  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {1364    Metadata *MD = N->getOperand(i);1365    assert(!(MD && isa<LocalAsMetadata>(MD)) &&1366           "Unexpected function-local metadata");1367    Record.push_back(VE.getMetadataOrNullID(MD));1368  }1369  Stream.EmitRecord(N->isDistinct() ? bitc::METADATA_DISTINCT_NODE1370                                    : bitc::METADATA_NODE,1371                    Record, Abbrev);1372  Record.clear();1373}1374 1375void DXILBitcodeWriter::writeDILocation(const DILocation *N,1376                                        SmallVectorImpl<uint64_t> &Record,1377                                        unsigned &Abbrev) {1378  if (!Abbrev)1379    Abbrev = createDILocationAbbrev();1380  Record.push_back(N->isDistinct());1381  Record.push_back(N->getLine());1382  Record.push_back(N->getColumn());1383  Record.push_back(VE.getMetadataID(N->getScope()));1384  Record.push_back(VE.getMetadataOrNullID(N->getInlinedAt()));1385 1386  Stream.EmitRecord(bitc::METADATA_LOCATION, Record, Abbrev);1387  Record.clear();1388}1389 1390static uint64_t rotateSign(APInt Val) {1391  int64_t I = Val.getSExtValue();1392  uint64_t U = I;1393  return I < 0 ? ~(U << 1) : U << 1;1394}1395 1396void DXILBitcodeWriter::writeDISubrange(const DISubrange *N,1397                                        SmallVectorImpl<uint64_t> &Record,1398                                        unsigned Abbrev) {1399  Record.push_back(N->isDistinct());1400 1401  // TODO: Do we need to handle DIExpression here? What about cases where Count1402  // isn't specified but UpperBound and such are?1403  ConstantInt *Count = dyn_cast<ConstantInt *>(N->getCount());1404  assert(Count && "Count is missing or not ConstantInt");1405  Record.push_back(Count->getValue().getSExtValue());1406 1407  // TODO: Similarly, DIExpression is allowed here now1408  DISubrange::BoundType LowerBound = N->getLowerBound();1409  assert((LowerBound.isNull() || isa<ConstantInt *>(LowerBound)) &&1410         "Lower bound provided but not ConstantInt");1411  Record.push_back(1412      LowerBound ? rotateSign(cast<ConstantInt *>(LowerBound)->getValue()) : 0);1413 1414  Stream.EmitRecord(bitc::METADATA_SUBRANGE, Record, Abbrev);1415  Record.clear();1416}1417 1418void DXILBitcodeWriter::writeDIEnumerator(const DIEnumerator *N,1419                                          SmallVectorImpl<uint64_t> &Record,1420                                          unsigned Abbrev) {1421  Record.push_back(N->isDistinct());1422  Record.push_back(rotateSign(N->getValue()));1423  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1424 1425  Stream.EmitRecord(bitc::METADATA_ENUMERATOR, Record, Abbrev);1426  Record.clear();1427}1428 1429void DXILBitcodeWriter::writeDIBasicType(const DIBasicType *N,1430                                         SmallVectorImpl<uint64_t> &Record,1431                                         unsigned Abbrev) {1432  Record.push_back(N->isDistinct());1433  Record.push_back(N->getTag());1434  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1435  Record.push_back(N->getSizeInBits());1436  Record.push_back(N->getAlignInBits());1437  Record.push_back(N->getEncoding());1438 1439  Stream.EmitRecord(bitc::METADATA_BASIC_TYPE, Record, Abbrev);1440  Record.clear();1441}1442 1443void DXILBitcodeWriter::writeDIDerivedType(const DIDerivedType *N,1444                                           SmallVectorImpl<uint64_t> &Record,1445                                           unsigned Abbrev) {1446  Record.push_back(N->isDistinct());1447  Record.push_back(N->getTag());1448  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1449  Record.push_back(VE.getMetadataOrNullID(N->getFile()));1450  Record.push_back(N->getLine());1451  Record.push_back(VE.getMetadataOrNullID(N->getScope()));1452  Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));1453  Record.push_back(N->getSizeInBits());1454  Record.push_back(N->getAlignInBits());1455  Record.push_back(N->getOffsetInBits());1456  Record.push_back(N->getFlags());1457  Record.push_back(VE.getMetadataOrNullID(N->getExtraData()));1458 1459  Stream.EmitRecord(bitc::METADATA_DERIVED_TYPE, Record, Abbrev);1460  Record.clear();1461}1462 1463void DXILBitcodeWriter::writeDICompositeType(const DICompositeType *N,1464                                             SmallVectorImpl<uint64_t> &Record,1465                                             unsigned Abbrev) {1466  Record.push_back(N->isDistinct());1467  Record.push_back(N->getTag());1468  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1469  Record.push_back(VE.getMetadataOrNullID(N->getFile()));1470  Record.push_back(N->getLine());1471  Record.push_back(VE.getMetadataOrNullID(N->getScope()));1472  Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));1473  Record.push_back(N->getSizeInBits());1474  Record.push_back(N->getAlignInBits());1475  Record.push_back(N->getOffsetInBits());1476  Record.push_back(N->getFlags());1477  Record.push_back(VE.getMetadataOrNullID(N->getElements().get()));1478  Record.push_back(N->getRuntimeLang());1479  Record.push_back(VE.getMetadataOrNullID(N->getVTableHolder()));1480  Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get()));1481  Record.push_back(VE.getMetadataOrNullID(N->getRawIdentifier()));1482 1483  Stream.EmitRecord(bitc::METADATA_COMPOSITE_TYPE, Record, Abbrev);1484  Record.clear();1485}1486 1487void DXILBitcodeWriter::writeDISubroutineType(const DISubroutineType *N,1488                                              SmallVectorImpl<uint64_t> &Record,1489                                              unsigned Abbrev) {1490  Record.push_back(N->isDistinct());1491  Record.push_back(N->getFlags());1492  Record.push_back(VE.getMetadataOrNullID(N->getTypeArray().get()));1493 1494  Stream.EmitRecord(bitc::METADATA_SUBROUTINE_TYPE, Record, Abbrev);1495  Record.clear();1496}1497 1498void DXILBitcodeWriter::writeDIFile(const DIFile *N,1499                                    SmallVectorImpl<uint64_t> &Record,1500                                    unsigned Abbrev) {1501  Record.push_back(N->isDistinct());1502  Record.push_back(VE.getMetadataOrNullID(N->getRawFilename()));1503  Record.push_back(VE.getMetadataOrNullID(N->getRawDirectory()));1504 1505  Stream.EmitRecord(bitc::METADATA_FILE, Record, Abbrev);1506  Record.clear();1507}1508 1509void DXILBitcodeWriter::writeDICompileUnit(const DICompileUnit *N,1510                                           SmallVectorImpl<uint64_t> &Record,1511                                           unsigned Abbrev) {1512  Record.push_back(N->isDistinct());1513  Record.push_back(N->getSourceLanguage().getUnversionedName());1514  Record.push_back(VE.getMetadataOrNullID(N->getFile()));1515  Record.push_back(VE.getMetadataOrNullID(N->getRawProducer()));1516  Record.push_back(N->isOptimized());1517  Record.push_back(VE.getMetadataOrNullID(N->getRawFlags()));1518  Record.push_back(N->getRuntimeVersion());1519  Record.push_back(VE.getMetadataOrNullID(N->getRawSplitDebugFilename()));1520  Record.push_back(N->getEmissionKind());1521  Record.push_back(VE.getMetadataOrNullID(N->getEnumTypes().get()));1522  Record.push_back(VE.getMetadataOrNullID(N->getRetainedTypes().get()));1523  Record.push_back(/* subprograms */ 0);1524  Record.push_back(VE.getMetadataOrNullID(N->getGlobalVariables().get()));1525  Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get()));1526  Record.push_back(N->getDWOId());1527 1528  Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev);1529  Record.clear();1530}1531 1532void DXILBitcodeWriter::writeDISubprogram(const DISubprogram *N,1533                                          SmallVectorImpl<uint64_t> &Record,1534                                          unsigned Abbrev) {1535  Record.push_back(N->isDistinct());1536  Record.push_back(VE.getMetadataOrNullID(N->getScope()));1537  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1538  Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));1539  Record.push_back(VE.getMetadataOrNullID(N->getFile()));1540  Record.push_back(N->getLine());1541  Record.push_back(VE.getMetadataOrNullID(N->getType()));1542  Record.push_back(N->isLocalToUnit());1543  Record.push_back(N->isDefinition());1544  Record.push_back(N->getScopeLine());1545  Record.push_back(VE.getMetadataOrNullID(N->getContainingType()));1546  Record.push_back(N->getVirtuality());1547  Record.push_back(N->getVirtualIndex());1548  Record.push_back(N->getFlags());1549  Record.push_back(N->isOptimized());1550  Record.push_back(VE.getMetadataOrNullID(N->getRawUnit()));1551  Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get()));1552  Record.push_back(VE.getMetadataOrNullID(N->getDeclaration()));1553  Record.push_back(VE.getMetadataOrNullID(N->getRetainedNodes().get()));1554 1555  Stream.EmitRecord(bitc::METADATA_SUBPROGRAM, Record, Abbrev);1556  Record.clear();1557}1558 1559void DXILBitcodeWriter::writeDILexicalBlock(const DILexicalBlock *N,1560                                            SmallVectorImpl<uint64_t> &Record,1561                                            unsigned Abbrev) {1562  Record.push_back(N->isDistinct());1563  Record.push_back(VE.getMetadataOrNullID(N->getScope()));1564  Record.push_back(VE.getMetadataOrNullID(N->getFile()));1565  Record.push_back(N->getLine());1566  Record.push_back(N->getColumn());1567 1568  Stream.EmitRecord(bitc::METADATA_LEXICAL_BLOCK, Record, Abbrev);1569  Record.clear();1570}1571 1572void DXILBitcodeWriter::writeDILexicalBlockFile(1573    const DILexicalBlockFile *N, SmallVectorImpl<uint64_t> &Record,1574    unsigned Abbrev) {1575  Record.push_back(N->isDistinct());1576  Record.push_back(VE.getMetadataOrNullID(N->getScope()));1577  Record.push_back(VE.getMetadataOrNullID(N->getFile()));1578  Record.push_back(N->getDiscriminator());1579 1580  Stream.EmitRecord(bitc::METADATA_LEXICAL_BLOCK_FILE, Record, Abbrev);1581  Record.clear();1582}1583 1584void DXILBitcodeWriter::writeDINamespace(const DINamespace *N,1585                                         SmallVectorImpl<uint64_t> &Record,1586                                         unsigned Abbrev) {1587  Record.push_back(N->isDistinct());1588  Record.push_back(VE.getMetadataOrNullID(N->getScope()));1589  Record.push_back(VE.getMetadataOrNullID(N->getFile()));1590  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1591  Record.push_back(/* line number */ 0);1592 1593  Stream.EmitRecord(bitc::METADATA_NAMESPACE, Record, Abbrev);1594  Record.clear();1595}1596 1597void DXILBitcodeWriter::writeDIModule(const DIModule *N,1598                                      SmallVectorImpl<uint64_t> &Record,1599                                      unsigned Abbrev) {1600  Record.push_back(N->isDistinct());1601  for (auto &I : N->operands())1602    Record.push_back(VE.getMetadataOrNullID(I));1603 1604  Stream.EmitRecord(bitc::METADATA_MODULE, Record, Abbrev);1605  Record.clear();1606}1607 1608void DXILBitcodeWriter::writeDITemplateTypeParameter(1609    const DITemplateTypeParameter *N, SmallVectorImpl<uint64_t> &Record,1610    unsigned Abbrev) {1611  Record.push_back(N->isDistinct());1612  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1613  Record.push_back(VE.getMetadataOrNullID(N->getType()));1614 1615  Stream.EmitRecord(bitc::METADATA_TEMPLATE_TYPE, Record, Abbrev);1616  Record.clear();1617}1618 1619void DXILBitcodeWriter::writeDITemplateValueParameter(1620    const DITemplateValueParameter *N, SmallVectorImpl<uint64_t> &Record,1621    unsigned Abbrev) {1622  Record.push_back(N->isDistinct());1623  Record.push_back(N->getTag());1624  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1625  Record.push_back(VE.getMetadataOrNullID(N->getType()));1626  Record.push_back(VE.getMetadataOrNullID(N->getValue()));1627 1628  Stream.EmitRecord(bitc::METADATA_TEMPLATE_VALUE, Record, Abbrev);1629  Record.clear();1630}1631 1632void DXILBitcodeWriter::writeDIGlobalVariable(const DIGlobalVariable *N,1633                                              SmallVectorImpl<uint64_t> &Record,1634                                              unsigned Abbrev) {1635  Record.push_back(N->isDistinct());1636  Record.push_back(VE.getMetadataOrNullID(N->getScope()));1637  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1638  Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));1639  Record.push_back(VE.getMetadataOrNullID(N->getFile()));1640  Record.push_back(N->getLine());1641  Record.push_back(VE.getMetadataOrNullID(N->getType()));1642  Record.push_back(N->isLocalToUnit());1643  Record.push_back(N->isDefinition());1644  Record.push_back(/* N->getRawVariable() */ 0);1645  Record.push_back(VE.getMetadataOrNullID(N->getStaticDataMemberDeclaration()));1646 1647  Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR, Record, Abbrev);1648  Record.clear();1649}1650 1651void DXILBitcodeWriter::writeDILocalVariable(const DILocalVariable *N,1652                                             SmallVectorImpl<uint64_t> &Record,1653                                             unsigned Abbrev) {1654  Record.push_back(N->isDistinct());1655  Record.push_back(N->getTag());1656  Record.push_back(VE.getMetadataOrNullID(N->getScope()));1657  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1658  Record.push_back(VE.getMetadataOrNullID(N->getFile()));1659  Record.push_back(N->getLine());1660  Record.push_back(VE.getMetadataOrNullID(N->getType()));1661  Record.push_back(N->getArg());1662  Record.push_back(N->getFlags());1663 1664  Stream.EmitRecord(bitc::METADATA_LOCAL_VAR, Record, Abbrev);1665  Record.clear();1666}1667 1668void DXILBitcodeWriter::writeDIExpression(const DIExpression *N,1669                                          SmallVectorImpl<uint64_t> &Record,1670                                          unsigned Abbrev) {1671  Record.reserve(N->getElements().size() + 1);1672 1673  Record.push_back(N->isDistinct());1674  Record.append(N->elements_begin(), N->elements_end());1675 1676  Stream.EmitRecord(bitc::METADATA_EXPRESSION, Record, Abbrev);1677  Record.clear();1678}1679 1680void DXILBitcodeWriter::writeDIObjCProperty(const DIObjCProperty *N,1681                                            SmallVectorImpl<uint64_t> &Record,1682                                            unsigned Abbrev) {1683  llvm_unreachable("DXIL does not support objc!!!");1684}1685 1686void DXILBitcodeWriter::writeDIImportedEntity(const DIImportedEntity *N,1687                                              SmallVectorImpl<uint64_t> &Record,1688                                              unsigned Abbrev) {1689  Record.push_back(N->isDistinct());1690  Record.push_back(N->getTag());1691  Record.push_back(VE.getMetadataOrNullID(N->getScope()));1692  Record.push_back(VE.getMetadataOrNullID(N->getEntity()));1693  Record.push_back(N->getLine());1694  Record.push_back(VE.getMetadataOrNullID(N->getRawName()));1695 1696  Stream.EmitRecord(bitc::METADATA_IMPORTED_ENTITY, Record, Abbrev);1697  Record.clear();1698}1699 1700unsigned DXILBitcodeWriter::createDILocationAbbrev() {1701  // Abbrev for METADATA_LOCATION.1702  //1703  // Assume the column is usually under 128, and always output the inlined-at1704  // location (it's never more expensive than building an array size 1).1705  std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();1706  Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_LOCATION));1707  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));1708  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));1709  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));1710  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));1711  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));1712  return Stream.EmitAbbrev(std::move(Abbv));1713}1714 1715unsigned DXILBitcodeWriter::createGenericDINodeAbbrev() {1716  // Abbrev for METADATA_GENERIC_DEBUG.1717  //1718  // Assume the column is usually under 128, and always output the inlined-at1719  // location (it's never more expensive than building an array size 1).1720  std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();1721  Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_GENERIC_DEBUG));1722  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));1723  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));1724  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));1725  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));1726  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1727  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));1728  return Stream.EmitAbbrev(std::move(Abbv));1729}1730 1731void DXILBitcodeWriter::writeMetadataRecords(ArrayRef<const Metadata *> MDs,1732                                             SmallVectorImpl<uint64_t> &Record,1733                                             std::vector<unsigned> *MDAbbrevs,1734                                             std::vector<uint64_t> *IndexPos) {1735  if (MDs.empty())1736    return;1737 1738    // Initialize MDNode abbreviations.1739#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;1740#include "llvm/IR/Metadata.def"1741 1742  for (const Metadata *MD : MDs) {1743    if (IndexPos)1744      IndexPos->push_back(Stream.GetCurrentBitNo());1745    if (const MDNode *N = dyn_cast<MDNode>(MD)) {1746      assert(N->isResolved() && "Expected forward references to be resolved");1747 1748      switch (N->getMetadataID()) {1749      default:1750        llvm_unreachable("Invalid MDNode subclass");1751#define HANDLE_MDNODE_LEAF(CLASS)                                              \1752  case Metadata::CLASS##Kind:                                                  \1753    if (MDAbbrevs)                                                             \1754      write##CLASS(cast<CLASS>(N), Record,                                     \1755                   (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]);             \1756    else                                                                       \1757      write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev);                     \1758    continue;1759#include "llvm/IR/Metadata.def"1760      }1761    }1762    writeValueAsMetadata(cast<ValueAsMetadata>(MD), Record);1763  }1764}1765 1766unsigned DXILBitcodeWriter::createMetadataStringsAbbrev() {1767  auto Abbv = std::make_shared<BitCodeAbbrev>();1768  Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRING_OLD));1769  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1770  Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));1771  return Stream.EmitAbbrev(std::move(Abbv));1772}1773 1774void DXILBitcodeWriter::writeMetadataStrings(1775    ArrayRef<const Metadata *> Strings, SmallVectorImpl<uint64_t> &Record) {1776  if (Strings.empty())1777    return;1778 1779  unsigned MDSAbbrev = createMetadataStringsAbbrev();1780 1781  for (const Metadata *MD : Strings) {1782    const MDString *MDS = cast<MDString>(MD);1783    // Code: [strchar x N]1784    Record.append(MDS->bytes_begin(), MDS->bytes_end());1785 1786    // Emit the finished record.1787    Stream.EmitRecord(bitc::METADATA_STRING_OLD, Record, MDSAbbrev);1788    Record.clear();1789  }1790}1791 1792void DXILBitcodeWriter::writeModuleMetadata() {1793  if (!VE.hasMDs() && M.named_metadata_empty())1794    return;1795 1796  Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 5);1797 1798  // Emit all abbrevs upfront, so that the reader can jump in the middle of the1799  // block and load any metadata.1800  std::vector<unsigned> MDAbbrevs;1801 1802  MDAbbrevs.resize(MetadataAbbrev::LastPlusOne);1803  MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();1804  MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =1805      createGenericDINodeAbbrev();1806 1807  unsigned NameAbbrev = 0;1808  if (!M.named_metadata_empty()) {1809    // Abbrev for METADATA_NAME.1810    std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();1811    Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_NAME));1812    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1813    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));1814    NameAbbrev = Stream.EmitAbbrev(std::move(Abbv));1815  }1816 1817  SmallVector<uint64_t, 64> Record;1818  writeMetadataStrings(VE.getMDStrings(), Record);1819 1820  std::vector<uint64_t> IndexPos;1821  IndexPos.reserve(VE.getNonMDStrings().size());1822  writeMetadataRecords(VE.getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);1823 1824  // Write named metadata.1825  for (const NamedMDNode &NMD : M.named_metadata()) {1826    // Write name.1827    StringRef Str = NMD.getName();1828    Record.append(Str.bytes_begin(), Str.bytes_end());1829    Stream.EmitRecord(bitc::METADATA_NAME, Record, NameAbbrev);1830    Record.clear();1831 1832    // Write named metadata operands.1833    for (const MDNode *N : NMD.operands())1834      Record.push_back(VE.getMetadataID(N));1835    Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0);1836    Record.clear();1837  }1838 1839  Stream.ExitBlock();1840}1841 1842void DXILBitcodeWriter::writeFunctionMetadata(const Function &F) {1843  if (!VE.hasMDs())1844    return;1845 1846  Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 4);1847  SmallVector<uint64_t, 64> Record;1848  writeMetadataStrings(VE.getMDStrings(), Record);1849  writeMetadataRecords(VE.getNonMDStrings(), Record);1850  Stream.ExitBlock();1851}1852 1853void DXILBitcodeWriter::writeFunctionMetadataAttachment(const Function &F) {1854  Stream.EnterSubblock(bitc::METADATA_ATTACHMENT_ID, 3);1855 1856  SmallVector<uint64_t, 64> Record;1857 1858  // Write metadata attachments1859  // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]]1860  SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;1861  F.getAllMetadata(MDs);1862  if (!MDs.empty()) {1863    for (const auto &I : MDs) {1864      Record.push_back(I.first);1865      Record.push_back(VE.getMetadataID(I.second));1866    }1867    Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);1868    Record.clear();1869  }1870 1871  for (const BasicBlock &BB : F)1872    for (const Instruction &I : BB) {1873      MDs.clear();1874      I.getAllMetadataOtherThanDebugLoc(MDs);1875 1876      // If no metadata, ignore instruction.1877      if (MDs.empty())1878        continue;1879 1880      Record.push_back(VE.getInstructionID(&I));1881 1882      for (unsigned i = 0, e = MDs.size(); i != e; ++i) {1883        Record.push_back(MDs[i].first);1884        Record.push_back(VE.getMetadataID(MDs[i].second));1885      }1886      Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);1887      Record.clear();1888    }1889 1890  Stream.ExitBlock();1891}1892 1893void DXILBitcodeWriter::writeModuleMetadataKinds() {1894  SmallVector<uint64_t, 64> Record;1895 1896  // Write metadata kinds1897  // METADATA_KIND - [n x [id, name]]1898  SmallVector<StringRef, 8> Names;1899  M.getMDKindNames(Names);1900 1901  if (Names.empty())1902    return;1903 1904  Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3);1905 1906  for (unsigned MDKindID = 0, e = Names.size(); MDKindID != e; ++MDKindID) {1907    Record.push_back(MDKindID);1908    StringRef KName = Names[MDKindID];1909    Record.append(KName.begin(), KName.end());1910 1911    Stream.EmitRecord(bitc::METADATA_KIND, Record, 0);1912    Record.clear();1913  }1914 1915  Stream.ExitBlock();1916}1917 1918void DXILBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal,1919                                       bool isGlobal) {1920  if (FirstVal == LastVal)1921    return;1922 1923  Stream.EnterSubblock(bitc::CONSTANTS_BLOCK_ID, 4);1924 1925  unsigned AggregateAbbrev = 0;1926  unsigned String8Abbrev = 0;1927  unsigned CString7Abbrev = 0;1928  unsigned CString6Abbrev = 0;1929  // If this is a constant pool for the module, emit module-specific abbrevs.1930  if (isGlobal) {1931    // Abbrev for CST_CODE_AGGREGATE.1932    auto Abbv = std::make_shared<BitCodeAbbrev>();1933    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_AGGREGATE));1934    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1935    Abbv->Add(1936        BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, Log2_32_Ceil(LastVal + 1)));1937    AggregateAbbrev = Stream.EmitAbbrev(std::move(Abbv));1938 1939    // Abbrev for CST_CODE_STRING.1940    Abbv = std::make_shared<BitCodeAbbrev>();1941    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_STRING));1942    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1943    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));1944    String8Abbrev = Stream.EmitAbbrev(std::move(Abbv));1945    // Abbrev for CST_CODE_CSTRING.1946    Abbv = std::make_shared<BitCodeAbbrev>();1947    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING));1948    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1949    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));1950    CString7Abbrev = Stream.EmitAbbrev(std::move(Abbv));1951    // Abbrev for CST_CODE_CSTRING.1952    Abbv = std::make_shared<BitCodeAbbrev>();1953    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING));1954    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));1955    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));1956    CString6Abbrev = Stream.EmitAbbrev(std::move(Abbv));1957  }1958 1959  SmallVector<uint64_t, 64> Record;1960 1961  const ValueEnumerator::ValueList &Vals = VE.getValues();1962  Type *LastTy = nullptr;1963  for (unsigned i = FirstVal; i != LastVal; ++i) {1964    const Value *V = Vals[i].first;1965    // If we need to switch types, do so now.1966    if (V->getType() != LastTy) {1967      LastTy = V->getType();1968      Record.push_back(getTypeID(LastTy, V));1969      Stream.EmitRecord(bitc::CST_CODE_SETTYPE, Record,1970                        CONSTANTS_SETTYPE_ABBREV);1971      Record.clear();1972    }1973 1974    if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {1975      Record.push_back(unsigned(IA->hasSideEffects()) |1976                       unsigned(IA->isAlignStack()) << 1 |1977                       unsigned(IA->getDialect() & 1) << 2);1978 1979      // Add the asm string.1980      StringRef AsmStr = IA->getAsmString();1981      Record.push_back(AsmStr.size());1982      Record.append(AsmStr.begin(), AsmStr.end());1983 1984      // Add the constraint string.1985      StringRef ConstraintStr = IA->getConstraintString();1986      Record.push_back(ConstraintStr.size());1987      Record.append(ConstraintStr.begin(), ConstraintStr.end());1988      Stream.EmitRecord(bitc::CST_CODE_INLINEASM, Record);1989      Record.clear();1990      continue;1991    }1992    const Constant *C = cast<Constant>(V);1993    unsigned Code = -1U;1994    unsigned AbbrevToUse = 0;1995    if (C->isNullValue()) {1996      Code = bitc::CST_CODE_NULL;1997    } else if (isa<UndefValue>(C)) {1998      Code = bitc::CST_CODE_UNDEF;1999    } else if (const ConstantInt *IV = dyn_cast<ConstantInt>(C)) {2000      if (IV->getBitWidth() <= 64) {2001        uint64_t V = IV->getSExtValue();2002        emitSignedInt64(Record, V);2003        Code = bitc::CST_CODE_INTEGER;2004        AbbrevToUse = CONSTANTS_INTEGER_ABBREV;2005      } else { // Wide integers, > 64 bits in size.2006        // We have an arbitrary precision integer value to write whose2007        // bit width is > 64. However, in canonical unsigned integer2008        // format it is likely that the high bits are going to be zero.2009        // So, we only write the number of active words.2010        unsigned NWords = IV->getValue().getActiveWords();2011        const uint64_t *RawWords = IV->getValue().getRawData();2012        for (unsigned i = 0; i != NWords; ++i) {2013          emitSignedInt64(Record, RawWords[i]);2014        }2015        Code = bitc::CST_CODE_WIDE_INTEGER;2016      }2017    } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {2018      Code = bitc::CST_CODE_FLOAT;2019      Type *Ty = CFP->getType();2020      if (Ty->isHalfTy() || Ty->isFloatTy() || Ty->isDoubleTy()) {2021        Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());2022      } else if (Ty->isX86_FP80Ty()) {2023        // api needed to prevent premature destruction2024        // bits are not in the same order as a normal i80 APInt, compensate.2025        APInt api = CFP->getValueAPF().bitcastToAPInt();2026        const uint64_t *p = api.getRawData();2027        Record.push_back((p[1] << 48) | (p[0] >> 16));2028        Record.push_back(p[0] & 0xffffLL);2029      } else if (Ty->isFP128Ty() || Ty->isPPC_FP128Ty()) {2030        APInt api = CFP->getValueAPF().bitcastToAPInt();2031        const uint64_t *p = api.getRawData();2032        Record.push_back(p[0]);2033        Record.push_back(p[1]);2034      } else {2035        assert(0 && "Unknown FP type!");2036      }2037    } else if (isa<ConstantDataSequential>(C) &&2038               cast<ConstantDataSequential>(C)->isString()) {2039      const ConstantDataSequential *Str = cast<ConstantDataSequential>(C);2040      // Emit constant strings specially.2041      unsigned NumElts = Str->getNumElements();2042      // If this is a null-terminated string, use the denser CSTRING encoding.2043      if (Str->isCString()) {2044        Code = bitc::CST_CODE_CSTRING;2045        --NumElts; // Don't encode the null, which isn't allowed by char6.2046      } else {2047        Code = bitc::CST_CODE_STRING;2048        AbbrevToUse = String8Abbrev;2049      }2050      bool isCStr7 = Code == bitc::CST_CODE_CSTRING;2051      bool isCStrChar6 = Code == bitc::CST_CODE_CSTRING;2052      for (unsigned i = 0; i != NumElts; ++i) {2053        unsigned char V = Str->getElementAsInteger(i);2054        Record.push_back(V);2055        isCStr7 &= (V & 128) == 0;2056        if (isCStrChar6)2057          isCStrChar6 = BitCodeAbbrevOp::isChar6(V);2058      }2059 2060      if (isCStrChar6)2061        AbbrevToUse = CString6Abbrev;2062      else if (isCStr7)2063        AbbrevToUse = CString7Abbrev;2064    } else if (const ConstantDataSequential *CDS =2065                   dyn_cast<ConstantDataSequential>(C)) {2066      Code = bitc::CST_CODE_DATA;2067      Type *EltTy = CDS->getElementType();2068      if (isa<IntegerType>(EltTy)) {2069        for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i)2070          Record.push_back(CDS->getElementAsInteger(i));2071      } else if (EltTy->isFloatTy()) {2072        for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {2073          union {2074            float F;2075            uint32_t I;2076          };2077          F = CDS->getElementAsFloat(i);2078          Record.push_back(I);2079        }2080      } else {2081        assert(EltTy->isDoubleTy() && "Unknown ConstantData element type");2082        for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {2083          union {2084            double F;2085            uint64_t I;2086          };2087          F = CDS->getElementAsDouble(i);2088          Record.push_back(I);2089        }2090      }2091    } else if (isa<ConstantArray>(C) || isa<ConstantStruct>(C) ||2092               isa<ConstantVector>(C)) {2093      Code = bitc::CST_CODE_AGGREGATE;2094      for (const Value *Op : C->operands())2095        Record.push_back(VE.getValueID(Op));2096      AbbrevToUse = AggregateAbbrev;2097    } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {2098      switch (CE->getOpcode()) {2099      default:2100        if (Instruction::isCast(CE->getOpcode())) {2101          Code = bitc::CST_CODE_CE_CAST;2102          Record.push_back(getEncodedCastOpcode(CE->getOpcode()));2103          Record.push_back(2104              getTypeID(C->getOperand(0)->getType(), C->getOperand(0)));2105          Record.push_back(VE.getValueID(C->getOperand(0)));2106          AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;2107        } else {2108          assert(CE->getNumOperands() == 2 && "Unknown constant expr!");2109          Code = bitc::CST_CODE_CE_BINOP;2110          Record.push_back(getEncodedBinaryOpcode(CE->getOpcode()));2111          Record.push_back(VE.getValueID(C->getOperand(0)));2112          Record.push_back(VE.getValueID(C->getOperand(1)));2113          uint64_t Flags = getOptimizationFlags(CE);2114          if (Flags != 0)2115            Record.push_back(Flags);2116        }2117        break;2118      case Instruction::GetElementPtr: {2119        Code = bitc::CST_CODE_CE_GEP_OLD;2120        const auto *GO = cast<GEPOperator>(C);2121        if (GO->isInBounds())2122          Code = bitc::CST_CODE_CE_INBOUNDS_GEP;2123        Record.push_back(getTypeID(GO->getSourceElementType()));2124        for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) {2125          Record.push_back(2126              getTypeID(C->getOperand(i)->getType(), C->getOperand(i)));2127          Record.push_back(VE.getValueID(C->getOperand(i)));2128        }2129        break;2130      }2131      case Instruction::Select:2132        Code = bitc::CST_CODE_CE_SELECT;2133        Record.push_back(VE.getValueID(C->getOperand(0)));2134        Record.push_back(VE.getValueID(C->getOperand(1)));2135        Record.push_back(VE.getValueID(C->getOperand(2)));2136        break;2137      case Instruction::ExtractElement:2138        Code = bitc::CST_CODE_CE_EXTRACTELT;2139        Record.push_back(getTypeID(C->getOperand(0)->getType()));2140        Record.push_back(VE.getValueID(C->getOperand(0)));2141        Record.push_back(getTypeID(C->getOperand(1)->getType()));2142        Record.push_back(VE.getValueID(C->getOperand(1)));2143        break;2144      case Instruction::InsertElement:2145        Code = bitc::CST_CODE_CE_INSERTELT;2146        Record.push_back(VE.getValueID(C->getOperand(0)));2147        Record.push_back(VE.getValueID(C->getOperand(1)));2148        Record.push_back(getTypeID(C->getOperand(2)->getType()));2149        Record.push_back(VE.getValueID(C->getOperand(2)));2150        break;2151      case Instruction::ShuffleVector:2152        // If the return type and argument types are the same, this is a2153        // standard shufflevector instruction.  If the types are different,2154        // then the shuffle is widening or truncating the input vectors, and2155        // the argument type must also be encoded.2156        if (C->getType() == C->getOperand(0)->getType()) {2157          Code = bitc::CST_CODE_CE_SHUFFLEVEC;2158        } else {2159          Code = bitc::CST_CODE_CE_SHUFVEC_EX;2160          Record.push_back(getTypeID(C->getOperand(0)->getType()));2161        }2162        Record.push_back(VE.getValueID(C->getOperand(0)));2163        Record.push_back(VE.getValueID(C->getOperand(1)));2164        Record.push_back(VE.getValueID(C->getOperand(2)));2165        break;2166      }2167    } else if (const BlockAddress *BA = dyn_cast<BlockAddress>(C)) {2168      Code = bitc::CST_CODE_BLOCKADDRESS;2169      Record.push_back(getTypeID(BA->getFunction()->getType()));2170      Record.push_back(VE.getValueID(BA->getFunction()));2171      Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock()));2172    } else {2173#ifndef NDEBUG2174      C->dump();2175#endif2176      llvm_unreachable("Unknown constant!");2177    }2178    Stream.EmitRecord(Code, Record, AbbrevToUse);2179    Record.clear();2180  }2181 2182  Stream.ExitBlock();2183}2184 2185void DXILBitcodeWriter::writeModuleConstants() {2186  const ValueEnumerator::ValueList &Vals = VE.getValues();2187 2188  // Find the first constant to emit, which is the first non-globalvalue value.2189  // We know globalvalues have been emitted by WriteModuleInfo.2190  for (unsigned i = 0, e = Vals.size(); i != e; ++i) {2191    if (!isa<GlobalValue>(Vals[i].first)) {2192      writeConstants(i, Vals.size(), true);2193      return;2194    }2195  }2196}2197 2198/// pushValueAndType - The file has to encode both the value and type id for2199/// many values, because we need to know what type to create for forward2200/// references.  However, most operands are not forward references, so this type2201/// field is not needed.2202///2203/// This function adds V's value ID to Vals.  If the value ID is higher than the2204/// instruction ID, then it is a forward reference, and it also includes the2205/// type ID.  The value ID that is written is encoded relative to the InstID.2206bool DXILBitcodeWriter::pushValueAndType(const Value *V, unsigned InstID,2207                                         SmallVectorImpl<unsigned> &Vals) {2208  unsigned ValID = VE.getValueID(V);2209  // Make encoding relative to the InstID.2210  Vals.push_back(InstID - ValID);2211  if (ValID >= InstID) {2212    Vals.push_back(getTypeID(V->getType(), V));2213    return true;2214  }2215  return false;2216}2217 2218/// pushValue - Like pushValueAndType, but where the type of the value is2219/// omitted (perhaps it was already encoded in an earlier operand).2220void DXILBitcodeWriter::pushValue(const Value *V, unsigned InstID,2221                                  SmallVectorImpl<unsigned> &Vals) {2222  unsigned ValID = VE.getValueID(V);2223  Vals.push_back(InstID - ValID);2224}2225 2226void DXILBitcodeWriter::pushValueSigned(const Value *V, unsigned InstID,2227                                        SmallVectorImpl<uint64_t> &Vals) {2228  unsigned ValID = VE.getValueID(V);2229  int64_t diff = ((int32_t)InstID - (int32_t)ValID);2230  emitSignedInt64(Vals, diff);2231}2232 2233/// WriteInstruction - Emit an instruction2234void DXILBitcodeWriter::writeInstruction(const Instruction &I, unsigned InstID,2235                                         SmallVectorImpl<unsigned> &Vals) {2236  unsigned Code = 0;2237  unsigned AbbrevToUse = 0;2238  VE.setInstructionID(&I);2239  switch (I.getOpcode()) {2240  default:2241    if (Instruction::isCast(I.getOpcode())) {2242      Code = bitc::FUNC_CODE_INST_CAST;2243      if (!pushValueAndType(I.getOperand(0), InstID, Vals))2244        AbbrevToUse = (unsigned)FUNCTION_INST_CAST_ABBREV;2245      Vals.push_back(getTypeID(I.getType(), &I));2246      Vals.push_back(getEncodedCastOpcode(I.getOpcode()));2247    } else {2248      assert(isa<BinaryOperator>(I) && "Unknown instruction!");2249      Code = bitc::FUNC_CODE_INST_BINOP;2250      if (!pushValueAndType(I.getOperand(0), InstID, Vals))2251        AbbrevToUse = (unsigned)FUNCTION_INST_BINOP_ABBREV;2252      pushValue(I.getOperand(1), InstID, Vals);2253      Vals.push_back(getEncodedBinaryOpcode(I.getOpcode()));2254      uint64_t Flags = getOptimizationFlags(&I);2255      if (Flags != 0) {2256        if (AbbrevToUse == (unsigned)FUNCTION_INST_BINOP_ABBREV)2257          AbbrevToUse = (unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV;2258        Vals.push_back(Flags);2259      }2260    }2261    break;2262 2263  case Instruction::GetElementPtr: {2264    Code = bitc::FUNC_CODE_INST_GEP;2265    AbbrevToUse = (unsigned)FUNCTION_INST_GEP_ABBREV;2266    auto &GEPInst = cast<GetElementPtrInst>(I);2267    Vals.push_back(GEPInst.isInBounds());2268    Vals.push_back(getTypeID(GEPInst.getSourceElementType()));2269    for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i)2270      pushValueAndType(I.getOperand(i), InstID, Vals);2271    break;2272  }2273  case Instruction::ExtractValue: {2274    Code = bitc::FUNC_CODE_INST_EXTRACTVAL;2275    pushValueAndType(I.getOperand(0), InstID, Vals);2276    const ExtractValueInst *EVI = cast<ExtractValueInst>(&I);2277    Vals.append(EVI->idx_begin(), EVI->idx_end());2278    break;2279  }2280  case Instruction::InsertValue: {2281    Code = bitc::FUNC_CODE_INST_INSERTVAL;2282    pushValueAndType(I.getOperand(0), InstID, Vals);2283    pushValueAndType(I.getOperand(1), InstID, Vals);2284    const InsertValueInst *IVI = cast<InsertValueInst>(&I);2285    Vals.append(IVI->idx_begin(), IVI->idx_end());2286    break;2287  }2288  case Instruction::Select:2289    Code = bitc::FUNC_CODE_INST_VSELECT;2290    pushValueAndType(I.getOperand(1), InstID, Vals);2291    pushValue(I.getOperand(2), InstID, Vals);2292    pushValueAndType(I.getOperand(0), InstID, Vals);2293    break;2294  case Instruction::ExtractElement:2295    Code = bitc::FUNC_CODE_INST_EXTRACTELT;2296    pushValueAndType(I.getOperand(0), InstID, Vals);2297    pushValueAndType(I.getOperand(1), InstID, Vals);2298    break;2299  case Instruction::InsertElement:2300    Code = bitc::FUNC_CODE_INST_INSERTELT;2301    pushValueAndType(I.getOperand(0), InstID, Vals);2302    pushValue(I.getOperand(1), InstID, Vals);2303    pushValueAndType(I.getOperand(2), InstID, Vals);2304    break;2305  case Instruction::ShuffleVector:2306    Code = bitc::FUNC_CODE_INST_SHUFFLEVEC;2307    pushValueAndType(I.getOperand(0), InstID, Vals);2308    pushValue(I.getOperand(1), InstID, Vals);2309    pushValue(cast<ShuffleVectorInst>(&I)->getShuffleMaskForBitcode(), InstID,2310              Vals);2311    break;2312  case Instruction::ICmp:2313  case Instruction::FCmp: {2314    // compare returning Int1Ty or vector of Int1Ty2315    Code = bitc::FUNC_CODE_INST_CMP2;2316    pushValueAndType(I.getOperand(0), InstID, Vals);2317    pushValue(I.getOperand(1), InstID, Vals);2318    Vals.push_back(cast<CmpInst>(I).getPredicate());2319    uint64_t Flags = getOptimizationFlags(&I);2320    if (Flags != 0)2321      Vals.push_back(Flags);2322    break;2323  }2324 2325  case Instruction::Ret: {2326    Code = bitc::FUNC_CODE_INST_RET;2327    unsigned NumOperands = I.getNumOperands();2328    if (NumOperands == 0)2329      AbbrevToUse = (unsigned)FUNCTION_INST_RET_VOID_ABBREV;2330    else if (NumOperands == 1) {2331      if (!pushValueAndType(I.getOperand(0), InstID, Vals))2332        AbbrevToUse = (unsigned)FUNCTION_INST_RET_VAL_ABBREV;2333    } else {2334      for (unsigned i = 0, e = NumOperands; i != e; ++i)2335        pushValueAndType(I.getOperand(i), InstID, Vals);2336    }2337  } break;2338  case Instruction::Br: {2339    Code = bitc::FUNC_CODE_INST_BR;2340    const BranchInst &II = cast<BranchInst>(I);2341    Vals.push_back(VE.getValueID(II.getSuccessor(0)));2342    if (II.isConditional()) {2343      Vals.push_back(VE.getValueID(II.getSuccessor(1)));2344      pushValue(II.getCondition(), InstID, Vals);2345    }2346  } break;2347  case Instruction::Switch: {2348    Code = bitc::FUNC_CODE_INST_SWITCH;2349    const SwitchInst &SI = cast<SwitchInst>(I);2350    Vals.push_back(getTypeID(SI.getCondition()->getType()));2351    pushValue(SI.getCondition(), InstID, Vals);2352    Vals.push_back(VE.getValueID(SI.getDefaultDest()));2353    for (auto Case : SI.cases()) {2354      Vals.push_back(VE.getValueID(Case.getCaseValue()));2355      Vals.push_back(VE.getValueID(Case.getCaseSuccessor()));2356    }2357  } break;2358  case Instruction::IndirectBr:2359    Code = bitc::FUNC_CODE_INST_INDIRECTBR;2360    Vals.push_back(getTypeID(I.getOperand(0)->getType()));2361    // Encode the address operand as relative, but not the basic blocks.2362    pushValue(I.getOperand(0), InstID, Vals);2363    for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i)2364      Vals.push_back(VE.getValueID(I.getOperand(i)));2365    break;2366 2367  case Instruction::Invoke: {2368    const InvokeInst *II = cast<InvokeInst>(&I);2369    const Value *Callee = II->getCalledOperand();2370    FunctionType *FTy = II->getFunctionType();2371    Code = bitc::FUNC_CODE_INST_INVOKE;2372 2373    Vals.push_back(VE.getAttributeListID(II->getAttributes()));2374    Vals.push_back(II->getCallingConv() | 1 << 13);2375    Vals.push_back(VE.getValueID(II->getNormalDest()));2376    Vals.push_back(VE.getValueID(II->getUnwindDest()));2377    Vals.push_back(getTypeID(FTy));2378    pushValueAndType(Callee, InstID, Vals);2379 2380    // Emit value #'s for the fixed parameters.2381    for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)2382      pushValue(I.getOperand(i), InstID, Vals); // fixed param.2383 2384    // Emit type/value pairs for varargs params.2385    if (FTy->isVarArg()) {2386      for (unsigned i = FTy->getNumParams(), e = I.getNumOperands() - 3; i != e;2387           ++i)2388        pushValueAndType(I.getOperand(i), InstID, Vals); // vararg2389    }2390    break;2391  }2392  case Instruction::Resume:2393    Code = bitc::FUNC_CODE_INST_RESUME;2394    pushValueAndType(I.getOperand(0), InstID, Vals);2395    break;2396  case Instruction::Unreachable:2397    Code = bitc::FUNC_CODE_INST_UNREACHABLE;2398    AbbrevToUse = (unsigned)FUNCTION_INST_UNREACHABLE_ABBREV;2399    break;2400 2401  case Instruction::PHI: {2402    const PHINode &PN = cast<PHINode>(I);2403    Code = bitc::FUNC_CODE_INST_PHI;2404    // With the newer instruction encoding, forward references could give2405    // negative valued IDs.  This is most common for PHIs, so we use2406    // signed VBRs.2407    SmallVector<uint64_t, 128> Vals64;2408    Vals64.push_back(getTypeID(PN.getType()));2409    for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) {2410      pushValueSigned(PN.getIncomingValue(i), InstID, Vals64);2411      Vals64.push_back(VE.getValueID(PN.getIncomingBlock(i)));2412    }2413    // Emit a Vals64 vector and exit.2414    Stream.EmitRecord(Code, Vals64, AbbrevToUse);2415    Vals64.clear();2416    return;2417  }2418 2419  case Instruction::LandingPad: {2420    const LandingPadInst &LP = cast<LandingPadInst>(I);2421    Code = bitc::FUNC_CODE_INST_LANDINGPAD;2422    Vals.push_back(getTypeID(LP.getType()));2423    Vals.push_back(LP.isCleanup());2424    Vals.push_back(LP.getNumClauses());2425    for (unsigned I = 0, E = LP.getNumClauses(); I != E; ++I) {2426      if (LP.isCatch(I))2427        Vals.push_back(LandingPadInst::Catch);2428      else2429        Vals.push_back(LandingPadInst::Filter);2430      pushValueAndType(LP.getClause(I), InstID, Vals);2431    }2432    break;2433  }2434 2435  case Instruction::Alloca: {2436    Code = bitc::FUNC_CODE_INST_ALLOCA;2437    const AllocaInst &AI = cast<AllocaInst>(I);2438    Vals.push_back(getTypeID(AI.getAllocatedType()));2439    Vals.push_back(getTypeID(I.getOperand(0)->getType()));2440    Vals.push_back(VE.getValueID(I.getOperand(0))); // size.2441    unsigned AlignRecord = Log2_32(AI.getAlign().value()) + 1;2442    assert(AlignRecord < 1 << 5 && "alignment greater than 1 << 64");2443    AlignRecord |= AI.isUsedWithInAlloca() << 5;2444    AlignRecord |= 1 << 6;2445    Vals.push_back(AlignRecord);2446    break;2447  }2448 2449  case Instruction::Load:2450    if (cast<LoadInst>(I).isAtomic()) {2451      Code = bitc::FUNC_CODE_INST_LOADATOMIC;2452      pushValueAndType(I.getOperand(0), InstID, Vals);2453    } else {2454      Code = bitc::FUNC_CODE_INST_LOAD;2455      if (!pushValueAndType(I.getOperand(0), InstID, Vals)) // ptr2456        AbbrevToUse = (unsigned)FUNCTION_INST_LOAD_ABBREV;2457    }2458    Vals.push_back(getTypeID(I.getType()));2459    Vals.push_back(Log2(cast<LoadInst>(I).getAlign()) + 1);2460    Vals.push_back(cast<LoadInst>(I).isVolatile());2461    if (cast<LoadInst>(I).isAtomic()) {2462      Vals.push_back(getEncodedOrdering(cast<LoadInst>(I).getOrdering()));2463      Vals.push_back(getEncodedSyncScopeID(cast<LoadInst>(I).getSyncScopeID()));2464    }2465    break;2466  case Instruction::Store:2467    if (cast<StoreInst>(I).isAtomic())2468      Code = bitc::FUNC_CODE_INST_STOREATOMIC;2469    else2470      Code = bitc::FUNC_CODE_INST_STORE;2471    pushValueAndType(I.getOperand(1), InstID, Vals); // ptrty + ptr2472    pushValueAndType(I.getOperand(0), InstID, Vals); // valty + val2473    Vals.push_back(Log2(cast<StoreInst>(I).getAlign()) + 1);2474    Vals.push_back(cast<StoreInst>(I).isVolatile());2475    if (cast<StoreInst>(I).isAtomic()) {2476      Vals.push_back(getEncodedOrdering(cast<StoreInst>(I).getOrdering()));2477      Vals.push_back(2478          getEncodedSyncScopeID(cast<StoreInst>(I).getSyncScopeID()));2479    }2480    break;2481  case Instruction::AtomicCmpXchg:2482    Code = bitc::FUNC_CODE_INST_CMPXCHG;2483    pushValueAndType(I.getOperand(0), InstID, Vals); // ptrty + ptr2484    pushValueAndType(I.getOperand(1), InstID, Vals); // cmp.2485    pushValue(I.getOperand(2), InstID, Vals);        // newval.2486    Vals.push_back(cast<AtomicCmpXchgInst>(I).isVolatile());2487    Vals.push_back(2488        getEncodedOrdering(cast<AtomicCmpXchgInst>(I).getSuccessOrdering()));2489    Vals.push_back(2490        getEncodedSyncScopeID(cast<AtomicCmpXchgInst>(I).getSyncScopeID()));2491    Vals.push_back(2492        getEncodedOrdering(cast<AtomicCmpXchgInst>(I).getFailureOrdering()));2493    Vals.push_back(cast<AtomicCmpXchgInst>(I).isWeak());2494    break;2495  case Instruction::AtomicRMW:2496    Code = bitc::FUNC_CODE_INST_ATOMICRMW;2497    pushValueAndType(I.getOperand(0), InstID, Vals); // ptrty + ptr2498    pushValue(I.getOperand(1), InstID, Vals);        // val.2499    Vals.push_back(2500        getEncodedRMWOperation(cast<AtomicRMWInst>(I).getOperation()));2501    Vals.push_back(cast<AtomicRMWInst>(I).isVolatile());2502    Vals.push_back(getEncodedOrdering(cast<AtomicRMWInst>(I).getOrdering()));2503    Vals.push_back(2504        getEncodedSyncScopeID(cast<AtomicRMWInst>(I).getSyncScopeID()));2505    break;2506  case Instruction::Fence:2507    Code = bitc::FUNC_CODE_INST_FENCE;2508    Vals.push_back(getEncodedOrdering(cast<FenceInst>(I).getOrdering()));2509    Vals.push_back(getEncodedSyncScopeID(cast<FenceInst>(I).getSyncScopeID()));2510    break;2511  case Instruction::Call: {2512    const CallInst &CI = cast<CallInst>(I);2513    FunctionType *FTy = CI.getFunctionType();2514 2515    Code = bitc::FUNC_CODE_INST_CALL;2516 2517    Vals.push_back(VE.getAttributeListID(CI.getAttributes()));2518    Vals.push_back((CI.getCallingConv() << 1) | unsigned(CI.isTailCall()) |2519                   unsigned(CI.isMustTailCall()) << 14 | 1 << 15);2520    Vals.push_back(getGlobalObjectValueTypeID(FTy, CI.getCalledFunction()));2521    pushValueAndType(CI.getCalledOperand(), InstID, Vals); // Callee2522 2523    // Emit value #'s for the fixed parameters.2524    for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {2525      // Check for labels (can happen with asm labels).2526      if (FTy->getParamType(i)->isLabelTy())2527        Vals.push_back(VE.getValueID(CI.getArgOperand(i)));2528      else2529        pushValue(CI.getArgOperand(i), InstID, Vals); // fixed param.2530    }2531 2532    // Emit type/value pairs for varargs params.2533    if (FTy->isVarArg()) {2534      for (unsigned i = FTy->getNumParams(), e = CI.arg_size(); i != e; ++i)2535        pushValueAndType(CI.getArgOperand(i), InstID, Vals); // varargs2536    }2537    break;2538  }2539  case Instruction::VAArg:2540    Code = bitc::FUNC_CODE_INST_VAARG;2541    Vals.push_back(getTypeID(I.getOperand(0)->getType())); // valistty2542    pushValue(I.getOperand(0), InstID, Vals);              // valist.2543    Vals.push_back(getTypeID(I.getType()));                // restype.2544    break;2545  }2546 2547  Stream.EmitRecord(Code, Vals, AbbrevToUse);2548  Vals.clear();2549}2550 2551// Emit names for globals/functions etc.2552void DXILBitcodeWriter::writeFunctionLevelValueSymbolTable(2553    const ValueSymbolTable &VST) {2554  if (VST.empty())2555    return;2556  Stream.EnterSubblock(bitc::VALUE_SYMTAB_BLOCK_ID, 4);2557 2558  SmallVector<unsigned, 64> NameVals;2559 2560  // HLSL Change2561  // Read the named values from a sorted list instead of the original list2562  // to ensure the binary is the same no matter what values ever existed.2563  SmallVector<const ValueName *, 16> SortedTable;2564 2565  for (auto &VI : VST) {2566    SortedTable.push_back(VI.second->getValueName());2567  }2568  // The keys are unique, so there shouldn't be stability issues.2569  llvm::sort(SortedTable, [](const ValueName *A, const ValueName *B) {2570    return A->first() < B->first();2571  });2572 2573  for (const ValueName *SI : SortedTable) {2574    auto &Name = *SI;2575 2576    // Figure out the encoding to use for the name.2577    bool is7Bit = true;2578    bool isChar6 = true;2579    for (const char *C = Name.getKeyData(), *E = C + Name.getKeyLength();2580         C != E; ++C) {2581      if (isChar6)2582        isChar6 = BitCodeAbbrevOp::isChar6(*C);2583      if ((unsigned char)*C & 128) {2584        is7Bit = false;2585        break; // don't bother scanning the rest.2586      }2587    }2588 2589    unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;2590 2591    // VST_ENTRY:   [valueid, namechar x N]2592    // VST_BBENTRY: [bbid, namechar x N]2593    unsigned Code;2594    if (isa<BasicBlock>(SI->getValue())) {2595      Code = bitc::VST_CODE_BBENTRY;2596      if (isChar6)2597        AbbrevToUse = VST_BBENTRY_6_ABBREV;2598    } else {2599      Code = bitc::VST_CODE_ENTRY;2600      if (isChar6)2601        AbbrevToUse = VST_ENTRY_6_ABBREV;2602      else if (is7Bit)2603        AbbrevToUse = VST_ENTRY_7_ABBREV;2604    }2605 2606    NameVals.push_back(VE.getValueID(SI->getValue()));2607    for (const char *P = Name.getKeyData(),2608                    *E = Name.getKeyData() + Name.getKeyLength();2609         P != E; ++P)2610      NameVals.push_back((unsigned char)*P);2611 2612    // Emit the finished record.2613    Stream.EmitRecord(Code, NameVals, AbbrevToUse);2614    NameVals.clear();2615  }2616  Stream.ExitBlock();2617}2618 2619/// Emit a function body to the module stream.2620void DXILBitcodeWriter::writeFunction(const Function &F) {2621  Stream.EnterSubblock(bitc::FUNCTION_BLOCK_ID, 4);2622  VE.incorporateFunction(F);2623 2624  SmallVector<unsigned, 64> Vals;2625 2626  // Emit the number of basic blocks, so the reader can create them ahead of2627  // time.2628  Vals.push_back(VE.getBasicBlocks().size());2629  Stream.EmitRecord(bitc::FUNC_CODE_DECLAREBLOCKS, Vals);2630  Vals.clear();2631 2632  // If there are function-local constants, emit them now.2633  unsigned CstStart, CstEnd;2634  VE.getFunctionConstantRange(CstStart, CstEnd);2635  writeConstants(CstStart, CstEnd, false);2636 2637  // If there is function-local metadata, emit it now.2638  writeFunctionMetadata(F);2639 2640  // Keep a running idea of what the instruction ID is.2641  unsigned InstID = CstEnd;2642 2643  bool NeedsMetadataAttachment = F.hasMetadata();2644 2645  DILocation *LastDL = nullptr;2646 2647  // Finally, emit all the instructions, in order.2648  for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB)2649    for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E;2650         ++I) {2651      writeInstruction(*I, InstID, Vals);2652 2653      if (!I->getType()->isVoidTy())2654        ++InstID;2655 2656      // If the instruction has metadata, write a metadata attachment later.2657      NeedsMetadataAttachment |= I->hasMetadataOtherThanDebugLoc();2658 2659      // If the instruction has a debug location, emit it.2660      DILocation *DL = I->getDebugLoc();2661      if (!DL)2662        continue;2663 2664      if (DL == LastDL) {2665        // Just repeat the same debug loc as last time.2666        Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC_AGAIN, Vals);2667        continue;2668      }2669 2670      Vals.push_back(DL->getLine());2671      Vals.push_back(DL->getColumn());2672      Vals.push_back(VE.getMetadataOrNullID(DL->getScope()));2673      Vals.push_back(VE.getMetadataOrNullID(DL->getInlinedAt()));2674      Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals);2675      Vals.clear();2676 2677      LastDL = DL;2678    }2679 2680  // Emit names for all the instructions etc.2681  if (auto *Symtab = F.getValueSymbolTable())2682    writeFunctionLevelValueSymbolTable(*Symtab);2683 2684  if (NeedsMetadataAttachment)2685    writeFunctionMetadataAttachment(F);2686 2687  VE.purgeFunction();2688  Stream.ExitBlock();2689}2690 2691// Emit blockinfo, which defines the standard abbreviations etc.2692void DXILBitcodeWriter::writeBlockInfo() {2693  // We only want to emit block info records for blocks that have multiple2694  // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK and VALUE_SYMTAB_BLOCK.2695  // Other blocks can define their abbrevs inline.2696  Stream.EnterBlockInfoBlock();2697 2698  { // 8-bit fixed-width VST_ENTRY/VST_BBENTRY strings.2699    auto Abbv = std::make_shared<BitCodeAbbrev>();2700    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));2701    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));2702    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2703    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));2704    if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID,2705                                   std::move(Abbv)) != VST_ENTRY_8_ABBREV)2706      assert(false && "Unexpected abbrev ordering!");2707  }2708 2709  { // 7-bit fixed width VST_ENTRY strings.2710    auto Abbv = std::make_shared<BitCodeAbbrev>();2711    Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY));2712    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));2713    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2714    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));2715    if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID,2716                                   std::move(Abbv)) != VST_ENTRY_7_ABBREV)2717      assert(false && "Unexpected abbrev ordering!");2718  }2719  { // 6-bit char6 VST_ENTRY strings.2720    auto Abbv = std::make_shared<BitCodeAbbrev>();2721    Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY));2722    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));2723    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2724    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));2725    if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID,2726                                   std::move(Abbv)) != VST_ENTRY_6_ABBREV)2727      assert(false && "Unexpected abbrev ordering!");2728  }2729  { // 6-bit char6 VST_BBENTRY strings.2730    auto Abbv = std::make_shared<BitCodeAbbrev>();2731    Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_BBENTRY));2732    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));2733    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2734    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));2735    if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID,2736                                   std::move(Abbv)) != VST_BBENTRY_6_ABBREV)2737      assert(false && "Unexpected abbrev ordering!");2738  }2739 2740  { // SETTYPE abbrev for CONSTANTS_BLOCK.2741    auto Abbv = std::make_shared<BitCodeAbbrev>();2742    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_SETTYPE));2743    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,2744                              VE.computeBitsRequiredForTypeIndices()));2745    if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, std::move(Abbv)) !=2746        CONSTANTS_SETTYPE_ABBREV)2747      assert(false && "Unexpected abbrev ordering!");2748  }2749 2750  { // INTEGER abbrev for CONSTANTS_BLOCK.2751    auto Abbv = std::make_shared<BitCodeAbbrev>();2752    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_INTEGER));2753    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));2754    if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, std::move(Abbv)) !=2755        CONSTANTS_INTEGER_ABBREV)2756      assert(false && "Unexpected abbrev ordering!");2757  }2758 2759  { // CE_CAST abbrev for CONSTANTS_BLOCK.2760    auto Abbv = std::make_shared<BitCodeAbbrev>();2761    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CE_CAST));2762    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // cast opc2763    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,      // typeid2764                              VE.computeBitsRequiredForTypeIndices()));2765    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id2766 2767    if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, std::move(Abbv)) !=2768        CONSTANTS_CE_CAST_Abbrev)2769      assert(false && "Unexpected abbrev ordering!");2770  }2771  { // NULL abbrev for CONSTANTS_BLOCK.2772    auto Abbv = std::make_shared<BitCodeAbbrev>();2773    Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_NULL));2774    if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, std::move(Abbv)) !=2775        CONSTANTS_NULL_Abbrev)2776      assert(false && "Unexpected abbrev ordering!");2777  }2778 2779  // FIXME: This should only use space for first class types!2780 2781  { // INST_LOAD abbrev for FUNCTION_BLOCK.2782    auto Abbv = std::make_shared<BitCodeAbbrev>();2783    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_LOAD));2784    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Ptr2785    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,    // dest ty2786                              VE.computeBitsRequiredForTypeIndices()));2787    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4));   // Align2788    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile2789    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=2790        (unsigned)FUNCTION_INST_LOAD_ABBREV)2791      assert(false && "Unexpected abbrev ordering!");2792  }2793  { // INST_BINOP abbrev for FUNCTION_BLOCK.2794    auto Abbv = std::make_shared<BitCodeAbbrev>();2795    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP));2796    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // LHS2797    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // RHS2798    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc2799    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=2800        (unsigned)FUNCTION_INST_BINOP_ABBREV)2801      assert(false && "Unexpected abbrev ordering!");2802  }2803  { // INST_BINOP_FLAGS abbrev for FUNCTION_BLOCK.2804    auto Abbv = std::make_shared<BitCodeAbbrev>();2805    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP));2806    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // LHS2807    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));   // RHS2808    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc2809    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); // flags2810    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=2811        (unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV)2812      assert(false && "Unexpected abbrev ordering!");2813  }2814  { // INST_CAST abbrev for FUNCTION_BLOCK.2815    auto Abbv = std::make_shared<BitCodeAbbrev>();2816    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CAST));2817    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // OpVal2818    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,    // dest ty2819                              VE.computeBitsRequiredForTypeIndices()));2820    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc2821    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=2822        (unsigned)FUNCTION_INST_CAST_ABBREV)2823      assert(false && "Unexpected abbrev ordering!");2824  }2825 2826  { // INST_RET abbrev for FUNCTION_BLOCK.2827    auto Abbv = std::make_shared<BitCodeAbbrev>();2828    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET));2829    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=2830        (unsigned)FUNCTION_INST_RET_VOID_ABBREV)2831      assert(false && "Unexpected abbrev ordering!");2832  }2833  { // INST_RET abbrev for FUNCTION_BLOCK.2834    auto Abbv = std::make_shared<BitCodeAbbrev>();2835    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET));2836    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ValID2837    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=2838        (unsigned)FUNCTION_INST_RET_VAL_ABBREV)2839      assert(false && "Unexpected abbrev ordering!");2840  }2841  { // INST_UNREACHABLE abbrev for FUNCTION_BLOCK.2842    auto Abbv = std::make_shared<BitCodeAbbrev>();2843    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNREACHABLE));2844    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=2845        (unsigned)FUNCTION_INST_UNREACHABLE_ABBREV)2846      assert(false && "Unexpected abbrev ordering!");2847  }2848  {2849    auto Abbv = std::make_shared<BitCodeAbbrev>();2850    Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_GEP));2851    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));2852    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty2853                              Log2_32_Ceil(VE.getTypes().size() + 1)));2854    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));2855    Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));2856    if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=2857        (unsigned)FUNCTION_INST_GEP_ABBREV)2858      assert(false && "Unexpected abbrev ordering!");2859  }2860 2861  Stream.ExitBlock();2862}2863 2864void DXILBitcodeWriter::writeModuleVersion() {2865  // VERSION: [version#]2866  Stream.EmitRecord(bitc::MODULE_CODE_VERSION, ArrayRef<unsigned>{1});2867}2868 2869/// WriteModule - Emit the specified module to the bitstream.2870void DXILBitcodeWriter::write() {2871  // The identification block is new since llvm-3.7, but the old bitcode reader2872  // will skip it.2873  // writeIdentificationBlock(Stream);2874 2875  Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3);2876 2877  // It is redundant to fully-specify this here, but nice to make it explicit2878  // so that it is clear the DXIL module version is different.2879  DXILBitcodeWriter::writeModuleVersion();2880 2881  // Emit blockinfo, which defines the standard abbreviations etc.2882  writeBlockInfo();2883 2884  // Emit information about attribute groups.2885  writeAttributeGroupTable();2886 2887  // Emit information about parameter attributes.2888  writeAttributeTable();2889 2890  // Emit information describing all of the types in the module.2891  writeTypeTable();2892 2893  writeComdats();2894 2895  // Emit top-level description of module, including target triple, inline asm,2896  // descriptors for global variables, and function prototype info.2897  writeModuleInfo();2898 2899  // Emit constants.2900  writeModuleConstants();2901 2902  // Emit metadata.2903  writeModuleMetadataKinds();2904 2905  // Emit metadata.2906  writeModuleMetadata();2907 2908  // Emit names for globals/functions etc.2909  // DXIL uses the same format for module-level value symbol table as for the2910  // function level table.2911  writeFunctionLevelValueSymbolTable(M.getValueSymbolTable());2912 2913  // Emit function bodies.2914  for (const Function &F : M)2915    if (!F.isDeclaration())2916      writeFunction(F);2917 2918  Stream.ExitBlock();2919}2920