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