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