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