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 // For Constant, always check PointerMap to make sure OpaquePointer in
533 // things like constant struct/array works.
534 if (!T->isPointerTy() && !isa_and_nonnull<Constant>(V))
535 return VE.getTypeID(T);
536 auto It = PointerMap.find(V);
537 if (It != PointerMap.end())
538 return VE.getTypeID(It->second);
539 // FIXME: support ConstantPointerNull and UndefValue which could map to more
540 // than one TypedPointerType.
541 // See https://github.com/llvm/llvm-project/issues/57942.
542 if (T->isPointerTy())
543 return VE.getTypeID(I8PtrTy);
544 return VE.getTypeID(T);
545}
546
547unsigned DXILBitcodeWriter::getGlobalObjectValueTypeID(Type *T,
548 const GlobalObject *G) {
549 auto It = PointerMap.find(G);
550 if (It != PointerMap.end()) {
551 TypedPointerType *PtrTy = cast<TypedPointerType>(It->second);
552 return VE.getTypeID(PtrTy->getElementType());
553 }
554 return VE.getTypeID(T);
555}
556
558 switch (Op) {
559 default:
560 llvm_unreachable("Unknown RMW operation!");
562 return bitc::RMW_XCHG;
564 return bitc::RMW_ADD;
566 return bitc::RMW_SUB;
568 return bitc::RMW_AND;
570 return bitc::RMW_NAND;
572 return bitc::RMW_OR;
574 return bitc::RMW_XOR;
576 return bitc::RMW_MAX;
578 return bitc::RMW_MIN;
580 return bitc::RMW_UMAX;
582 return bitc::RMW_UMIN;
584 return bitc::RMW_FADD;
586 return bitc::RMW_FSUB;
588 return bitc::RMW_FMAX;
590 return bitc::RMW_FMIN;
591 }
592}
593
613
615 unsigned Code, StringRef Str,
616 unsigned AbbrevToUse) {
618
619 // Code: [strchar x N]
620 for (char C : Str) {
621 if (AbbrevToUse && !BitCodeAbbrevOp::isChar6(C))
622 AbbrevToUse = 0;
623 Vals.push_back(C);
624 }
625
626 // Emit the finished record.
627 Stream.EmitRecord(Code, Vals, AbbrevToUse);
628}
629
631 switch (Kind) {
632 case Attribute::Alignment:
634 case Attribute::AlwaysInline:
636 case Attribute::Builtin:
638 case Attribute::ByVal:
640 case Attribute::Convergent:
642 case Attribute::InAlloca:
644 case Attribute::Cold:
646 case Attribute::InlineHint:
648 case Attribute::InReg:
650 case Attribute::JumpTable:
652 case Attribute::MinSize:
654 case Attribute::Naked:
656 case Attribute::Nest:
658 case Attribute::NoAlias:
660 case Attribute::NoBuiltin:
662 case Attribute::NoDuplicate:
664 case Attribute::NoImplicitFloat:
666 case Attribute::NoInline:
668 case Attribute::NonLazyBind:
670 case Attribute::NonNull:
672 case Attribute::Dereferenceable:
674 case Attribute::DereferenceableOrNull:
676 case Attribute::NoRedZone:
678 case Attribute::NoReturn:
680 case Attribute::NoUnwind:
682 case Attribute::OptimizeForSize:
684 case Attribute::OptimizeNone:
686 case Attribute::ReadNone:
688 case Attribute::ReadOnly:
690 case Attribute::Returned:
692 case Attribute::ReturnsTwice:
694 case Attribute::SExt:
696 case Attribute::StackAlignment:
698 case Attribute::StackProtect:
700 case Attribute::StackProtectReq:
702 case Attribute::StackProtectStrong:
704 case Attribute::SafeStack:
706 case Attribute::StructRet:
708 case Attribute::SanitizeAddress:
710 case Attribute::SanitizeThread:
712 case Attribute::SanitizeMemory:
714 case Attribute::UWTable:
716 case Attribute::ZExt:
719 llvm_unreachable("Can not encode end-attribute kinds marker.");
720 case Attribute::None:
721 llvm_unreachable("Can not encode none-attribute.");
724 llvm_unreachable("Trying to encode EmptyKey/TombstoneKey");
725 default:
726 llvm_unreachable("Trying to encode attribute not supported by DXIL. These "
727 "should be stripped in DXILPrepare");
728 }
729
730 llvm_unreachable("Trying to encode unknown attribute");
731}
732
734 uint64_t V) {
735 if ((int64_t)V >= 0)
736 Vals.push_back(V << 1);
737 else
738 Vals.push_back((-V << 1) | 1);
739}
740
742 const APInt &A) {
743 // We have an arbitrary precision integer value to write whose
744 // bit width is > 64. However, in canonical unsigned integer
745 // format it is likely that the high bits are going to be zero.
746 // So, we only write the number of active words.
747 unsigned NumWords = A.getActiveWords();
748 const uint64_t *RawData = A.getRawData();
749 for (unsigned i = 0; i < NumWords; i++)
750 emitSignedInt64(Vals, RawData[i]);
751}
752
754 uint64_t Flags = 0;
755
756 if (const auto *OBO = dyn_cast<OverflowingBinaryOperator>(V)) {
757 if (OBO->hasNoSignedWrap())
758 Flags |= 1 << bitc::OBO_NO_SIGNED_WRAP;
759 if (OBO->hasNoUnsignedWrap())
760 Flags |= 1 << bitc::OBO_NO_UNSIGNED_WRAP;
761 } else if (const auto *PEO = dyn_cast<PossiblyExactOperator>(V)) {
762 if (PEO->isExact())
763 Flags |= 1 << bitc::PEO_EXACT;
764 } else if (const auto *FPMO = dyn_cast<FPMathOperator>(V)) {
765 if (FPMO->hasAllowReassoc() || FPMO->hasAllowContract())
766 Flags |= bitc::UnsafeAlgebra;
767 if (FPMO->hasNoNaNs())
768 Flags |= bitc::NoNaNs;
769 if (FPMO->hasNoInfs())
770 Flags |= bitc::NoInfs;
771 if (FPMO->hasNoSignedZeros())
772 Flags |= bitc::NoSignedZeros;
773 if (FPMO->hasAllowReciprocal())
774 Flags |= bitc::AllowReciprocal;
775 }
776
777 return Flags;
778}
779
780unsigned
782 switch (Linkage) {
784 return 0;
786 return 16;
788 return 2;
790 return 3;
792 return 18;
794 return 7;
796 return 8;
798 return 9;
800 return 17;
802 return 19;
804 return 12;
805 }
806 llvm_unreachable("Invalid linkage");
807}
808
812
814 switch (GV.getVisibility()) {
816 return 0;
818 return 1;
820 return 2;
821 }
822 llvm_unreachable("Invalid visibility");
823}
824
826 switch (GV.getDLLStorageClass()) {
828 return 0;
830 return 1;
832 return 2;
833 }
834 llvm_unreachable("Invalid DLL storage class");
835}
836
838 switch (GV.getThreadLocalMode()) {
840 return 0;
842 return 1;
844 return 2;
846 return 3;
848 return 4;
849 }
850 llvm_unreachable("Invalid TLS model");
851}
852
868
869////////////////////////////////////////////////////////////////////////////////
870/// Begin DXILBitcodeWriter Implementation
871////////////////////////////////////////////////////////////////////////////////
872
873void DXILBitcodeWriter::writeAttributeGroupTable() {
874 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
875 VE.getAttributeGroups();
876 if (AttrGrps.empty())
877 return;
878
880
882 for (ValueEnumerator::IndexAndAttrSet Pair : AttrGrps) {
883 unsigned AttrListIndex = Pair.first;
884 AttributeSet AS = Pair.second;
885 Record.push_back(VE.getAttributeGroupID(Pair));
886 Record.push_back(AttrListIndex);
887
888 for (Attribute Attr : AS) {
889 if (Attr.isEnumAttribute()) {
890 uint64_t Val = getAttrKindEncoding(Attr.getKindAsEnum());
892 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");
893 Record.push_back(0);
894 Record.push_back(Val);
895 } else if (Attr.isIntAttribute()) {
896 if (Attr.getKindAsEnum() == Attribute::AttrKind::Memory) {
897 MemoryEffects ME = Attr.getMemoryEffects();
898 if (ME.doesNotAccessMemory()) {
899 Record.push_back(0);
901 } else {
902 if (ME.onlyReadsMemory()) {
903 Record.push_back(0);
905 }
906 if (ME.onlyAccessesArgPointees()) {
907 Record.push_back(0);
909 }
910 }
911 } else {
912 uint64_t Val = getAttrKindEncoding(Attr.getKindAsEnum());
914 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");
915 Record.push_back(1);
916 Record.push_back(Val);
917 Record.push_back(Attr.getValueAsInt());
918 }
919 } else {
920 StringRef Kind = Attr.getKindAsString();
921 StringRef Val = Attr.getValueAsString();
922
923 Record.push_back(Val.empty() ? 3 : 4);
924 Record.append(Kind.begin(), Kind.end());
925 Record.push_back(0);
926 if (!Val.empty()) {
927 Record.append(Val.begin(), Val.end());
928 Record.push_back(0);
929 }
930 }
931 }
932
933 Stream.EmitRecord(bitc::PARAMATTR_GRP_CODE_ENTRY, Record);
934 Record.clear();
935 }
936
937 Stream.ExitBlock();
938}
939
940void DXILBitcodeWriter::writeAttributeTable() {
941 const std::vector<AttributeList> &Attrs = VE.getAttributeLists();
942 if (Attrs.empty())
943 return;
944
945 Stream.EnterSubblock(bitc::PARAMATTR_BLOCK_ID, 3);
946
947 SmallVector<uint64_t, 64> Record;
948 for (AttributeList AL : Attrs) {
949 for (unsigned i : AL.indexes()) {
950 AttributeSet AS = AL.getAttributes(i);
951 if (AS.hasAttributes())
952 Record.push_back(VE.getAttributeGroupID({i, AS}));
953 }
954
955 Stream.EmitRecord(bitc::PARAMATTR_CODE_ENTRY, Record);
956 Record.clear();
957 }
958
959 Stream.ExitBlock();
960}
961
962/// WriteTypeTable - Write out the type table for a module.
963void DXILBitcodeWriter::writeTypeTable() {
964 const ValueEnumerator::TypeList &TypeList = VE.getTypes();
965
966 Stream.EnterSubblock(bitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */);
967 SmallVector<uint64_t, 64> TypeVals;
968
969 uint64_t NumBits = VE.computeBitsRequiredForTypeIndices();
970
971 // Abbrev for TYPE_CODE_POINTER.
972 auto Abbv = std::make_shared<BitCodeAbbrev>();
973 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_POINTER));
974 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));
975 Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 0
976 unsigned PtrAbbrev = Stream.EmitAbbrev(std::move(Abbv));
977
978 // Abbrev for TYPE_CODE_FUNCTION.
979 Abbv = std::make_shared<BitCodeAbbrev>();
980 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_FUNCTION));
981 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isvararg
982 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
983 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));
984 unsigned FunctionAbbrev = Stream.EmitAbbrev(std::move(Abbv));
985
986 // Abbrev for TYPE_CODE_STRUCT_ANON.
987 Abbv = std::make_shared<BitCodeAbbrev>();
988 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_ANON));
989 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked
990 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
991 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));
992 unsigned StructAnonAbbrev = Stream.EmitAbbrev(std::move(Abbv));
993
994 // Abbrev for TYPE_CODE_STRUCT_NAME.
995 Abbv = std::make_shared<BitCodeAbbrev>();
996 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME));
997 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
998 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
999 unsigned StructNameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1000
1001 // Abbrev for TYPE_CODE_STRUCT_NAMED.
1002 Abbv = std::make_shared<BitCodeAbbrev>();
1003 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAMED));
1004 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked
1005 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1006 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));
1007 unsigned StructNamedAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1008
1009 // Abbrev for TYPE_CODE_ARRAY.
1010 Abbv = std::make_shared<BitCodeAbbrev>();
1011 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY));
1012 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // size
1013 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));
1014 unsigned ArrayAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1015
1016 // Emit an entry count so the reader can reserve space.
1017 TypeVals.push_back(TypeList.size());
1018 Stream.EmitRecord(bitc::TYPE_CODE_NUMENTRY, TypeVals);
1019 TypeVals.clear();
1020
1021 // Loop over all of the types, emitting each in turn.
1022 for (Type *T : TypeList) {
1023 int AbbrevToUse = 0;
1024 unsigned Code = 0;
1025
1026 switch (T->getTypeID()) {
1027 case Type::BFloatTyID:
1028 case Type::X86_AMXTyID:
1029 case Type::TokenTyID:
1031 llvm_unreachable("These should never be used!!!");
1032 break;
1033 case Type::VoidTyID:
1035 break;
1036 case Type::HalfTyID:
1038 break;
1039 case Type::FloatTyID:
1041 break;
1042 case Type::DoubleTyID:
1044 break;
1045 case Type::X86_FP80TyID:
1047 break;
1048 case Type::FP128TyID:
1050 break;
1053 break;
1054 case Type::LabelTyID:
1056 break;
1057 case Type::MetadataTyID:
1059 break;
1060 case Type::ByteTyID:
1061 // BYTE: [width]
1062 // Note: we downgrade by converting to the equivalent integer.
1064 TypeVals.push_back(T->getByteBitWidth());
1065 break;
1066 case Type::IntegerTyID:
1067 // INTEGER: [width]
1070 break;
1072 TypedPointerType *PTy = cast<TypedPointerType>(T);
1073 // POINTER: [pointee type, address space]
1075 TypeVals.push_back(getTypeID(PTy->getElementType()));
1076 unsigned AddressSpace = PTy->getAddressSpace();
1077 TypeVals.push_back(AddressSpace);
1078 if (AddressSpace == 0)
1079 AbbrevToUse = PtrAbbrev;
1080 break;
1081 }
1082 case Type::PointerTyID: {
1083 // POINTER: [pointee type, address space]
1084 // Emitting an empty struct type for the pointer's type allows this to be
1085 // order-independent. Non-struct types must be emitted in bitcode before
1086 // they can be referenced.
1087 TypeVals.push_back(false);
1090 "dxilOpaquePtrReservedName", StructNameAbbrev);
1091 break;
1092 }
1093 case Type::FunctionTyID: {
1094 FunctionType *FT = cast<FunctionType>(T);
1095 // FUNCTION: [isvararg, retty, paramty x N]
1097 TypeVals.push_back(FT->isVarArg());
1098 TypeVals.push_back(getTypeID(FT->getReturnType()));
1099 for (Type *PTy : FT->params())
1100 TypeVals.push_back(getTypeID(PTy));
1101 AbbrevToUse = FunctionAbbrev;
1102 break;
1103 }
1104 case Type::StructTyID: {
1105 StructType *ST = cast<StructType>(T);
1106 // STRUCT: [ispacked, eltty x N]
1107 TypeVals.push_back(ST->isPacked());
1108 // Output all of the element types.
1109 for (Type *ElTy : ST->elements())
1110 TypeVals.push_back(getTypeID(ElTy));
1111
1112 if (ST->isLiteral()) {
1114 AbbrevToUse = StructAnonAbbrev;
1115 } else {
1116 if (ST->isOpaque()) {
1118 } else {
1120 AbbrevToUse = StructNamedAbbrev;
1121 }
1122
1123 // Emit the name if it is present.
1124 if (!ST->getName().empty())
1126 StructNameAbbrev);
1127 }
1128 break;
1129 }
1130 case Type::ArrayTyID: {
1132 // ARRAY: [numelts, eltty]
1134 TypeVals.push_back(AT->getNumElements());
1135 TypeVals.push_back(getTypeID(AT->getElementType()));
1136 AbbrevToUse = ArrayAbbrev;
1137 break;
1138 }
1142 // VECTOR [numelts, eltty]
1144 TypeVals.push_back(VT->getElementCount().getKnownMinValue());
1145 TypeVals.push_back(getTypeID(VT->getElementType()));
1146 break;
1147 }
1148 }
1149
1150 // Emit the finished record.
1151 Stream.EmitRecord(Code, TypeVals, AbbrevToUse);
1152 TypeVals.clear();
1153 }
1154
1155 Stream.ExitBlock();
1156}
1157
1158void DXILBitcodeWriter::writeComdats() {
1160 for (const Comdat *C : VE.getComdats()) {
1161 // COMDAT: [selection_kind, name]
1163 size_t Size = C->getName().size();
1165 Vals.push_back(Size);
1166 for (char Chr : C->getName())
1167 Vals.push_back((unsigned char)Chr);
1168 Stream.EmitRecord(bitc::MODULE_CODE_COMDAT, Vals, /*AbbrevToUse=*/0);
1169 Vals.clear();
1170 }
1171}
1172
1173void DXILBitcodeWriter::writeValueSymbolTableForwardDecl() {}
1174
1175/// Emit top-level description of module, including target triple, inline asm,
1176/// descriptors for global variables, and function prototype info.
1177/// Returns the bit offset to backpatch with the location of the real VST.
1178void DXILBitcodeWriter::writeModuleInfo() {
1179 // Emit various pieces of data attached to a module.
1180
1181 // We need to hardcode a triple and datalayout that's compatible with the
1182 // historical DXIL triple and datalayout from DXC.
1183 StringRef Triple = "dxil-ms-dx";
1184 StringRef DL = "e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-"
1185 "f16:16-f32:32-f64:64-n8:16:32:64";
1186 writeStringRecord(Stream, bitc::MODULE_CODE_TRIPLE, Triple, 0 /*TODO*/);
1188
1189 // The original bitcode writer wrote inline assembly here. Inline assembly
1190 // isn't valid in DXIL, so this is removed.
1191
1192 // Emit information about sections and GC, computing how many there are. Also
1193 // compute the maximum alignment value.
1194 std::map<std::string, unsigned> SectionMap;
1195 std::map<std::string, unsigned> GCMap;
1196 MaybeAlign MaxAlignment;
1197 unsigned MaxGlobalType = 0;
1198 const auto UpdateMaxAlignment = [&MaxAlignment](const MaybeAlign A) {
1199 if (A)
1200 MaxAlignment = !MaxAlignment ? *A : std::max(*MaxAlignment, *A);
1201 };
1202 for (const GlobalVariable &GV : M.globals()) {
1203 UpdateMaxAlignment(GV.getAlign());
1204 // Use getGlobalObjectValueTypeID to look up the enumerated type ID for
1205 // Global Variable types.
1206 MaxGlobalType = std::max(
1207 MaxGlobalType, getGlobalObjectValueTypeID(GV.getValueType(), &GV));
1208 if (GV.hasSection()) {
1209 // Give section names unique ID's.
1210 unsigned &Entry = SectionMap[std::string(GV.getSection())];
1211 if (!Entry) {
1213 GV.getSection(), 0 /*TODO*/);
1214 Entry = SectionMap.size();
1215 }
1216 }
1217 }
1218 for (const Function &F : M) {
1219 UpdateMaxAlignment(F.getAlign());
1220 if (F.hasSection()) {
1221 // Give section names unique ID's.
1222 unsigned &Entry = SectionMap[std::string(F.getSection())];
1223 if (!Entry) {
1225 0 /*TODO*/);
1226 Entry = SectionMap.size();
1227 }
1228 }
1229 if (F.hasGC()) {
1230 // Same for GC names.
1231 unsigned &Entry = GCMap[F.getGC()];
1232 if (!Entry) {
1234 0 /*TODO*/);
1235 Entry = GCMap.size();
1236 }
1237 }
1238 }
1239
1240 // Emit abbrev for globals, now that we know # sections and max alignment.
1241 unsigned SimpleGVarAbbrev = 0;
1242 if (!M.global_empty()) {
1243 // Add an abbrev for common globals with no visibility or thread
1244 // localness.
1245 auto Abbv = std::make_shared<BitCodeAbbrev>();
1246 Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR));
1247 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
1248 Log2_32_Ceil(MaxGlobalType + 1)));
1249 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // AddrSpace << 2
1250 //| explicitType << 1
1251 //| constant
1252 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Initializer.
1253 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // Linkage.
1254 if (!MaxAlignment) // Alignment.
1255 Abbv->Add(BitCodeAbbrevOp(0));
1256 else {
1257 unsigned MaxEncAlignment = getEncodedAlign(MaxAlignment);
1258 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
1259 Log2_32_Ceil(MaxEncAlignment + 1)));
1260 }
1261 if (SectionMap.empty()) // Section.
1262 Abbv->Add(BitCodeAbbrevOp(0));
1263 else
1264 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
1265 Log2_32_Ceil(SectionMap.size() + 1)));
1266 // Don't bother emitting vis + thread local.
1267 SimpleGVarAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1268 }
1269
1270 // Emit the global variable information.
1272 for (const GlobalVariable &GV : M.globals()) {
1273 unsigned AbbrevToUse = 0;
1274
1275 // GLOBALVAR: [type, isconst, initid,
1276 // linkage, alignment, section, visibility, threadlocal,
1277 // unnamed_addr, externally_initialized, dllstorageclass,
1278 // comdat]
1279 Vals.push_back(getGlobalObjectValueTypeID(GV.getValueType(), &GV));
1280 Vals.push_back(
1281 GV.getType()->getAddressSpace() << 2 | 2 |
1282 (GV.isConstant() ? 1 : 0)); // HLSL Change - bitwise | was used with
1283 // unsigned int and bool
1284 Vals.push_back(
1285 GV.isDeclaration() ? 0 : (VE.getValueID(GV.getInitializer()) + 1));
1286 Vals.push_back(getEncodedLinkage(GV));
1287 Vals.push_back(getEncodedAlign(GV.getAlign()));
1288 Vals.push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1289 : 0);
1290 if (GV.isThreadLocal() ||
1291 GV.getVisibility() != GlobalValue::DefaultVisibility ||
1292 GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||
1293 GV.isExternallyInitialized() ||
1294 GV.getDLLStorageClass() != GlobalValue::DefaultStorageClass ||
1295 GV.hasComdat()) {
1298 Vals.push_back(GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);
1299 Vals.push_back(GV.isExternallyInitialized());
1301 Vals.push_back(GV.hasComdat() ? VE.getComdatID(GV.getComdat()) : 0);
1302 } else {
1303 AbbrevToUse = SimpleGVarAbbrev;
1304 }
1305
1306 Stream.EmitRecord(bitc::MODULE_CODE_GLOBALVAR, Vals, AbbrevToUse);
1307 Vals.clear();
1308 }
1309
1310 // Emit the function proto information.
1311 for (const Function &OrigF : M) {
1312 const Function &F = VE.getDXILFunction(OrigF);
1313
1314 // FUNCTION: [type, callingconv, isproto, linkage, paramattrs, alignment,
1315 // section, visibility, gc, unnamed_addr, prologuedata,
1316 // dllstorageclass, comdat, prefixdata, personalityfn]
1317 Vals.push_back(getGlobalObjectValueTypeID(F.getFunctionType(), &F));
1318 Vals.push_back(F.getCallingConv());
1319 Vals.push_back(F.isDeclaration());
1321 Vals.push_back(VE.getAttributeListID(F.getAttributes()));
1322 Vals.push_back(getEncodedAlign(F.getAlign()));
1323 Vals.push_back(F.hasSection() ? SectionMap[std::string(F.getSection())]
1324 : 0);
1326 Vals.push_back(F.hasGC() ? GCMap[F.getGC()] : 0);
1327 Vals.push_back(F.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);
1328 Vals.push_back(
1329 F.hasPrologueData() ? (VE.getValueID(F.getPrologueData()) + 1) : 0);
1331 Vals.push_back(F.hasComdat() ? VE.getComdatID(F.getComdat()) : 0);
1332 Vals.push_back(F.hasPrefixData() ? (VE.getValueID(F.getPrefixData()) + 1)
1333 : 0);
1334 Vals.push_back(
1335 F.hasPersonalityFn() ? (VE.getValueID(F.getPersonalityFn()) + 1) : 0);
1336
1337 unsigned AbbrevToUse = 0;
1338 Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse);
1339 Vals.clear();
1340 }
1341
1342 // Emit the alias information.
1343 for (const GlobalAlias &A : M.aliases()) {
1344 // ALIAS: [alias type, aliasee val#, linkage, visibility]
1345 Vals.push_back(getTypeID(A.getValueType(), &A));
1346 Vals.push_back(VE.getValueID(A.getAliasee()));
1351 Vals.push_back(A.getUnnamedAddr() != GlobalValue::UnnamedAddr::None);
1352 unsigned AbbrevToUse = 0;
1353 Stream.EmitRecord(bitc::MODULE_CODE_ALIAS_OLD, Vals, AbbrevToUse);
1354 Vals.clear();
1355 }
1356}
1357
1358void DXILBitcodeWriter::writeValueAsMetadata(
1359 const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
1360 // Mimic an MDNode with a value as one operand.
1361 Value *V = MD->getValue();
1362 Type *Ty = V->getType();
1363 if (Function *F = dyn_cast<Function>(V))
1364 Ty = TypedPointerType::get(F->getFunctionType(), F->getAddressSpace());
1365 else if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
1366 Ty = TypedPointerType::get(GV->getValueType(), GV->getAddressSpace());
1367 Record.push_back(getTypeID(Ty, V));
1368 Record.push_back(VE.getValueID(V));
1369 Stream.EmitRecord(bitc::METADATA_VALUE, Record, 0);
1370 Record.clear();
1371}
1372
1373void DXILBitcodeWriter::writeMDTuple(const MDTuple *N,
1374 SmallVectorImpl<uint64_t> &Record,
1375 unsigned Abbrev) {
1376 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
1377 Metadata *MD = N->getOperand(i);
1378 assert(!(MD && isa<LocalAsMetadata>(MD)) &&
1379 "Unexpected function-local metadata");
1380 Record.push_back(VE.getMetadataOrNullID(MD));
1381 }
1382 Stream.EmitRecord(N->isDistinct() ? bitc::METADATA_DISTINCT_NODE
1384 Record, Abbrev);
1385 Record.clear();
1386}
1387
1388void DXILBitcodeWriter::writeDILocation(const DILocation *N,
1389 SmallVectorImpl<uint64_t> &Record,
1390 unsigned &Abbrev) {
1391 if (!Abbrev)
1392 Abbrev = createDILocationAbbrev();
1393 Record.push_back(N->isDistinct());
1394 Record.push_back(N->getLine());
1395 Record.push_back(N->getColumn());
1396 Record.push_back(VE.getMetadataID(N->getScope()));
1397 Record.push_back(VE.getMetadataOrNullID(N->getInlinedAt()));
1398
1399 Stream.EmitRecord(bitc::METADATA_LOCATION, Record, Abbrev);
1400 Record.clear();
1401}
1402
1404 int64_t I = Val.getSExtValue();
1405 uint64_t U = I;
1406 return I < 0 ? ~(U << 1) : U << 1;
1407}
1408
1409void DXILBitcodeWriter::writeDISubrange(const DISubrange *N,
1410 SmallVectorImpl<uint64_t> &Record,
1411 unsigned Abbrev) {
1412 Record.push_back(N->isDistinct());
1413
1414 // Count may be a reference to a DILocalVariable or DIGlobalVariable
1415 // in case of C99 VLA. Non-constant count It is not supported by
1416 // DXIL, so we emit a subrange of -1 (empty).
1417 if (ConstantInt *Count = dyn_cast<ConstantInt *>(N->getCount())) {
1418 Record.push_back(Count->getValue().getSExtValue());
1419 } else {
1420 Record.push_back(-1);
1421 }
1422
1423 // Similarly, non constant lower bound is not allowed here.
1424 DISubrange::BoundType LowerBound = N->getLowerBound();
1425 if (!LowerBound.isNull() && isa<ConstantInt *>(LowerBound)) {
1426 Record.push_back(rotateSign(cast<ConstantInt *>(LowerBound)->getValue()));
1427 } else {
1428 Record.push_back(0);
1429 }
1430
1431 Stream.EmitRecord(bitc::METADATA_SUBRANGE, Record, Abbrev);
1432 Record.clear();
1433}
1434
1435void DXILBitcodeWriter::writeDIEnumerator(const DIEnumerator *N,
1436 SmallVectorImpl<uint64_t> &Record,
1437 unsigned Abbrev) {
1438 Record.push_back(N->isDistinct());
1439 Record.push_back(rotateSign(N->getValue()));
1440 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1441
1442 Stream.EmitRecord(bitc::METADATA_ENUMERATOR, Record, Abbrev);
1443 Record.clear();
1444}
1445
1446void DXILBitcodeWriter::writeDIBasicType(const DIBasicType *N,
1447 SmallVectorImpl<uint64_t> &Record,
1448 unsigned Abbrev) {
1449 Record.push_back(N->isDistinct());
1450 Record.push_back(N->getTag());
1451 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1452 Record.push_back(N->getSizeInBits());
1453 Record.push_back(N->getAlignInBits());
1454 Record.push_back(N->getEncoding());
1455
1456 Stream.EmitRecord(bitc::METADATA_BASIC_TYPE, Record, Abbrev);
1457 Record.clear();
1458}
1459
1460void DXILBitcodeWriter::writeDIDerivedType(const DIDerivedType *N,
1461 SmallVectorImpl<uint64_t> &Record,
1462 unsigned Abbrev) {
1463 Record.push_back(N->isDistinct());
1464 Record.push_back(N->getTag());
1465 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1466 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
1467 Record.push_back(N->getLine());
1468 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
1469 Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));
1470 Record.push_back(N->getSizeInBits());
1471 Record.push_back(N->getAlignInBits());
1472 Record.push_back(N->getOffsetInBits());
1473 Record.push_back(N->getFlags());
1474 Record.push_back(VE.getMetadataOrNullID(N->getExtraData()));
1475
1476 Stream.EmitRecord(bitc::METADATA_DERIVED_TYPE, Record, Abbrev);
1477 Record.clear();
1478}
1479
1480void DXILBitcodeWriter::writeDICompositeType(const DICompositeType *N,
1481 SmallVectorImpl<uint64_t> &Record,
1482 unsigned Abbrev) {
1483 Record.push_back(N->isDistinct());
1484 Record.push_back(N->getTag());
1485 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1486 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
1487 Record.push_back(N->getLine());
1488 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
1489 Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));
1490 Record.push_back(N->getSizeInBits());
1491 Record.push_back(N->getAlignInBits());
1492 Record.push_back(N->getOffsetInBits());
1493 Record.push_back(N->getFlags());
1494 Record.push_back(VE.getMetadataOrNullID(N->getElements().get()));
1495 Record.push_back(N->getRuntimeLang());
1496 Record.push_back(VE.getMetadataOrNullID(N->getVTableHolder()));
1497 Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get()));
1498 Record.push_back(VE.getMetadataOrNullID(N->getRawIdentifier()));
1499
1500 Stream.EmitRecord(bitc::METADATA_COMPOSITE_TYPE, Record, Abbrev);
1501 Record.clear();
1502}
1503
1504void DXILBitcodeWriter::writeDISubroutineType(const DISubroutineType *N,
1505 SmallVectorImpl<uint64_t> &Record,
1506 unsigned Abbrev) {
1507 Record.push_back(N->isDistinct());
1508 Record.push_back(N->getFlags());
1509 Record.push_back(VE.getMetadataOrNullID(N->getTypeArray().get()));
1510
1511 Stream.EmitRecord(bitc::METADATA_SUBROUTINE_TYPE, Record, Abbrev);
1512 Record.clear();
1513}
1514
1515void DXILBitcodeWriter::writeDIFile(const DIFile *N,
1516 SmallVectorImpl<uint64_t> &Record,
1517 unsigned Abbrev) {
1518 Record.push_back(N->isDistinct());
1519 Record.push_back(VE.getMetadataOrNullID(N->getRawFilename()));
1520 Record.push_back(VE.getMetadataOrNullID(N->getRawDirectory()));
1521
1522 Stream.EmitRecord(bitc::METADATA_FILE, Record, Abbrev);
1523 Record.clear();
1524}
1525
1526void DXILBitcodeWriter::writeDICompileUnit(const DICompileUnit *N,
1527 SmallVectorImpl<uint64_t> &Record,
1528 unsigned Abbrev) {
1529 Record.push_back(N->isDistinct());
1530 Record.push_back(N->getSourceLanguage().getUnversionedName());
1531 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
1532 Record.push_back(VE.getMetadataOrNullID(N->getRawProducer()));
1533 Record.push_back(N->isOptimized());
1534 Record.push_back(VE.getMetadataOrNullID(N->getRawFlags()));
1535 Record.push_back(N->getRuntimeVersion());
1536 Record.push_back(VE.getMetadataOrNullID(N->getRawSplitDebugFilename()));
1537 Record.push_back(N->getEmissionKind());
1538 Record.push_back(VE.getMetadataOrNullID(N->getEnumTypes().get()));
1539 Record.push_back(VE.getMetadataOrNullID(N->getRetainedTypes().get()));
1540 Record.push_back(VE.getMetadataOrNullID(DebugInfo.MDExtra.lookup(N)));
1541 Record.push_back(VE.getMetadataOrNullID(N->getGlobalVariables().get()));
1542 Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get()));
1543 Record.push_back(N->getDWOId());
1544
1545 Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev);
1546 Record.clear();
1547}
1548
1549void DXILBitcodeWriter::writeDISubprogram(const DISubprogram *N,
1550 SmallVectorImpl<uint64_t> &Record,
1551 unsigned Abbrev) {
1552 Record.push_back(N->isDistinct());
1553 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
1554 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1555 Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));
1556 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
1557 Record.push_back(N->getLine());
1558 Record.push_back(VE.getMetadataOrNullID(N->getType()));
1559 Record.push_back(N->isLocalToUnit());
1560 Record.push_back(N->isDefinition());
1561 Record.push_back(N->getScopeLine());
1562 Record.push_back(VE.getMetadataOrNullID(N->getContainingType()));
1563 Record.push_back(N->getVirtuality());
1564 Record.push_back(N->getVirtualIndex());
1565 Record.push_back(N->getFlags());
1566 Record.push_back(N->isOptimized());
1567 Record.push_back(VE.getMetadataOrNullID(DebugInfo.MDExtra.lookup(N)));
1568 Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get()));
1569 Record.push_back(VE.getMetadataOrNullID(N->getDeclaration()));
1570 Record.push_back(VE.getMetadataOrNullID(N->getRetainedNodes().get()));
1571
1572 Stream.EmitRecord(bitc::METADATA_SUBPROGRAM, Record, Abbrev);
1573 Record.clear();
1574}
1575
1576void DXILBitcodeWriter::writeDILexicalBlock(const DILexicalBlock *N,
1577 SmallVectorImpl<uint64_t> &Record,
1578 unsigned Abbrev) {
1579 Record.push_back(N->isDistinct());
1580 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
1581 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
1582 Record.push_back(N->getLine());
1583 Record.push_back(N->getColumn());
1584
1585 Stream.EmitRecord(bitc::METADATA_LEXICAL_BLOCK, Record, Abbrev);
1586 Record.clear();
1587}
1588
1589void DXILBitcodeWriter::writeDILexicalBlockFile(
1590 const DILexicalBlockFile *N, SmallVectorImpl<uint64_t> &Record,
1591 unsigned Abbrev) {
1592 Record.push_back(N->isDistinct());
1593 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
1594 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
1595 Record.push_back(N->getDiscriminator());
1596
1597 Stream.EmitRecord(bitc::METADATA_LEXICAL_BLOCK_FILE, Record, Abbrev);
1598 Record.clear();
1599}
1600
1601void DXILBitcodeWriter::writeDINamespace(const DINamespace *N,
1602 SmallVectorImpl<uint64_t> &Record,
1603 unsigned Abbrev) {
1604 Record.push_back(N->isDistinct());
1605 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
1606 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
1607 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1608 Record.push_back(/* line number */ 0);
1609
1610 Stream.EmitRecord(bitc::METADATA_NAMESPACE, Record, Abbrev);
1611 Record.clear();
1612}
1613
1614void DXILBitcodeWriter::writeDIModule(const DIModule *N,
1615 SmallVectorImpl<uint64_t> &Record,
1616 unsigned Abbrev) {
1617 Record.push_back(N->isDistinct());
1618 for (auto &I : N->operands())
1619 Record.push_back(VE.getMetadataOrNullID(I));
1620
1621 Stream.EmitRecord(bitc::METADATA_MODULE, Record, Abbrev);
1622 Record.clear();
1623}
1624
1625void DXILBitcodeWriter::writeDITemplateTypeParameter(
1626 const DITemplateTypeParameter *N, SmallVectorImpl<uint64_t> &Record,
1627 unsigned Abbrev) {
1628 Record.push_back(N->isDistinct());
1629 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1630 Record.push_back(VE.getMetadataOrNullID(N->getType()));
1631
1632 Stream.EmitRecord(bitc::METADATA_TEMPLATE_TYPE, Record, Abbrev);
1633 Record.clear();
1634}
1635
1636void DXILBitcodeWriter::writeDITemplateValueParameter(
1637 const DITemplateValueParameter *N, SmallVectorImpl<uint64_t> &Record,
1638 unsigned Abbrev) {
1639 Record.push_back(N->isDistinct());
1640 Record.push_back(N->getTag());
1641 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1642 Record.push_back(VE.getMetadataOrNullID(N->getType()));
1643 Record.push_back(VE.getMetadataOrNullID(N->getValue()));
1644
1645 Stream.EmitRecord(bitc::METADATA_TEMPLATE_VALUE, Record, Abbrev);
1646 Record.clear();
1647}
1648
1649void DXILBitcodeWriter::writeDIGlobalVariable(const DIGlobalVariable *N,
1650 SmallVectorImpl<uint64_t> &Record,
1651 unsigned Abbrev) {
1652 Record.push_back(N->isDistinct());
1653 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
1654 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1655 Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));
1656 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
1657 Record.push_back(N->getLine());
1658 Record.push_back(VE.getMetadataOrNullID(N->getType()));
1659 Record.push_back(N->isLocalToUnit());
1660 Record.push_back(N->isDefinition());
1661 Record.push_back(VE.getMetadataOrNullID(DebugInfo.MDExtra.lookup(N)));
1662 Record.push_back(VE.getMetadataOrNullID(N->getStaticDataMemberDeclaration()));
1663
1664 Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR, Record, Abbrev);
1665 Record.clear();
1666}
1667
1668void DXILBitcodeWriter::writeDILocalVariable(const DILocalVariable *N,
1669 SmallVectorImpl<uint64_t> &Record,
1670 unsigned Abbrev) {
1671 constexpr unsigned DW_TAG_auto_variable = 0x0100;
1672 constexpr unsigned DW_TAG_arg_variable = 0x0101;
1673 Record.push_back(N->isDistinct());
1674 assert(N->getTag() == dwarf::DW_TAG_variable);
1675 Record.push_back(N->getArg() ? DW_TAG_arg_variable : DW_TAG_auto_variable);
1676 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
1677 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1678 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
1679 Record.push_back(N->getLine());
1680 Record.push_back(VE.getMetadataOrNullID(N->getType()));
1681 Record.push_back(N->getArg());
1682 Record.push_back(N->getFlags());
1683
1684 Stream.EmitRecord(bitc::METADATA_LOCAL_VAR, Record, Abbrev);
1685 Record.clear();
1686}
1687
1688void DXILBitcodeWriter::writeDIExpression(const DIExpression *N,
1689 SmallVectorImpl<uint64_t> &Record,
1690 unsigned Abbrev) {
1691 Record.reserve(N->getElements().size() + 1);
1692
1693 Record.push_back(N->isDistinct());
1694 Record.append(N->elements_begin(), N->elements_end());
1695
1696 Stream.EmitRecord(bitc::METADATA_EXPRESSION, Record, Abbrev);
1697 Record.clear();
1698}
1699
1700void DXILBitcodeWriter::writeDIObjCProperty(const DIObjCProperty *N,
1701 SmallVectorImpl<uint64_t> &Record,
1702 unsigned Abbrev) {
1703 llvm_unreachable("DXIL does not support objc!!!");
1704}
1705
1706void DXILBitcodeWriter::writeDIImportedEntity(const DIImportedEntity *N,
1707 SmallVectorImpl<uint64_t> &Record,
1708 unsigned Abbrev) {
1709 Record.push_back(N->isDistinct());
1710 Record.push_back(N->getTag());
1711 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
1712 Record.push_back(VE.getMetadataOrNullID(N->getEntity()));
1713 Record.push_back(N->getLine());
1714 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1715
1716 Stream.EmitRecord(bitc::METADATA_IMPORTED_ENTITY, Record, Abbrev);
1717 Record.clear();
1718}
1719
1720unsigned DXILBitcodeWriter::createDILocationAbbrev() {
1721 // Abbrev for METADATA_LOCATION.
1722 //
1723 // Assume the column is usually under 128, and always output the inlined-at
1724 // location (it's never more expensive than building an array size 1).
1725 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1726 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_LOCATION));
1727 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1728 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1729 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1730 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1731 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1732 return Stream.EmitAbbrev(std::move(Abbv));
1733}
1734
1735unsigned DXILBitcodeWriter::createGenericDINodeAbbrev() {
1736 // Abbrev for METADATA_GENERIC_DEBUG.
1737 //
1738 // Assume the column is usually under 128, and always output the inlined-at
1739 // location (it's never more expensive than building an array size 1).
1740 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1741 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_GENERIC_DEBUG));
1742 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1743 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1744 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1745 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1746 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1747 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1748 return Stream.EmitAbbrev(std::move(Abbv));
1749}
1750
1751void DXILBitcodeWriter::writeMetadataRecords(ArrayRef<const Metadata *> MDs,
1752 SmallVectorImpl<uint64_t> &Record,
1753 std::vector<unsigned> *MDAbbrevs,
1754 std::vector<uint64_t> *IndexPos) {
1755 if (MDs.empty())
1756 return;
1757
1758 // Initialize MDNode abbreviations.
1759#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
1760#include "llvm/IR/Metadata.def"
1761
1762 for (const Metadata *MD : MDs) {
1763 if (IndexPos)
1764 IndexPos->push_back(Stream.GetCurrentBitNo());
1765 if (const MDNode *N = dyn_cast<MDNode>(MD)) {
1766 assert(N->isResolved() && "Expected forward references to be resolved");
1767
1768 switch (N->getMetadataID()) {
1769 default:
1770 llvm_unreachable("Invalid MDNode subclass");
1771#define HANDLE_MDNODE_LEAF(CLASS) \
1772 case Metadata::CLASS##Kind: \
1773 if (MDAbbrevs) \
1774 write##CLASS(cast<CLASS>(N), Record, \
1775 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
1776 else \
1777 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
1778 continue;
1779#include "llvm/IR/Metadata.def"
1780 }
1781 }
1782 writeValueAsMetadata(cast<ValueAsMetadata>(MD), Record);
1783 }
1784}
1785
1786unsigned DXILBitcodeWriter::createMetadataStringsAbbrev() {
1787 auto Abbv = std::make_shared<BitCodeAbbrev>();
1788 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRING_OLD));
1789 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1790 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
1791 return Stream.EmitAbbrev(std::move(Abbv));
1792}
1793
1794void DXILBitcodeWriter::writeMetadataStrings(
1795 ArrayRef<const Metadata *> Strings, SmallVectorImpl<uint64_t> &Record) {
1796 if (Strings.empty())
1797 return;
1798
1799 unsigned MDSAbbrev = createMetadataStringsAbbrev();
1800
1801 for (const Metadata *MD : Strings) {
1802 const MDString *MDS = cast<MDString>(MD);
1803 // Code: [strchar x N]
1804 Record.append(MDS->bytes_begin(), MDS->bytes_end());
1805
1806 // Emit the finished record.
1807 Stream.EmitRecord(bitc::METADATA_STRING_OLD, Record, MDSAbbrev);
1808 Record.clear();
1809 }
1810}
1811
1812void DXILBitcodeWriter::writeModuleMetadata() {
1813 if (!VE.hasMDs() && M.named_metadata_empty())
1814 return;
1815
1816 Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 5);
1817
1818 // Emit all abbrevs upfront, so that the reader can jump in the middle of the
1819 // block and load any metadata.
1820 std::vector<unsigned> MDAbbrevs;
1821
1822 MDAbbrevs.resize(MetadataAbbrev::LastPlusOne);
1823 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
1824 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
1825 createGenericDINodeAbbrev();
1826
1827 unsigned NameAbbrev = 0;
1828 if (!M.named_metadata_empty()) {
1829 // Abbrev for METADATA_NAME.
1830 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1831 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_NAME));
1832 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1833 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
1834 NameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1835 }
1836
1837 SmallVector<uint64_t, 64> Record;
1838 writeMetadataStrings(VE.getMDStrings(), Record);
1839
1840 std::vector<uint64_t> IndexPos;
1841 IndexPos.reserve(VE.getNonMDStrings().size());
1842 writeMetadataRecords(VE.getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);
1843
1844 // Write named metadata.
1845 for (const NamedMDNode &NMD : M.named_metadata()) {
1846 // Write name.
1847 StringRef Str = NMD.getName();
1848 Record.append(Str.bytes_begin(), Str.bytes_end());
1849 Stream.EmitRecord(bitc::METADATA_NAME, Record, NameAbbrev);
1850 Record.clear();
1851
1852 // Write named metadata operands.
1853 for (const MDNode *N : NMD.operands())
1854 Record.push_back(VE.getMetadataID(N));
1855 Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0);
1856 Record.clear();
1857 }
1858
1859 Stream.ExitBlock();
1860}
1861
1862void DXILBitcodeWriter::writeFunctionMetadata(const Function &F) {
1863 if (!VE.hasMDs())
1864 return;
1865
1866 Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 4);
1867 SmallVector<uint64_t, 64> Record;
1868 writeMetadataStrings(VE.getMDStrings(), Record);
1869 writeMetadataRecords(VE.getNonMDStrings(), Record);
1870 Stream.ExitBlock();
1871}
1872
1873void DXILBitcodeWriter::writeFunctionMetadataAttachment(const Function &F) {
1874 Stream.EnterSubblock(bitc::METADATA_ATTACHMENT_ID, 3);
1875
1876 SmallVector<uint64_t, 64> Record;
1877
1878 // Write metadata attachments
1879 // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]]
1881 F.getAllMetadata(MDs);
1882 if (!MDs.empty()) {
1883 for (const auto &I : MDs) {
1884 if (I.first == LLVMContext::MD_dbg)
1885 continue;
1886 Record.push_back(I.first);
1887 Record.push_back(VE.getMetadataID(I.second));
1888 }
1889 }
1890 if (!Record.empty()) {
1891 Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);
1892 Record.clear();
1893 }
1894
1895 for (const BasicBlock &BB : F)
1896 for (const Instruction &OrigI : BB) {
1897 const Instruction &I = VE.getDXILInstruction(OrigI);
1898
1899 MDs.clear();
1900 I.getAllMetadataOtherThanDebugLoc(MDs);
1901
1902 // If no metadata, ignore instruction.
1903 if (MDs.empty())
1904 continue;
1905
1906 Record.push_back(VE.getInstructionID(&I));
1907
1908 for (unsigned i = 0, e = MDs.size(); i != e; ++i) {
1909 Record.push_back(MDs[i].first);
1910 Record.push_back(VE.getMetadataID(MDs[i].second));
1911 }
1912 Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);
1913 Record.clear();
1914 }
1915
1916 Stream.ExitBlock();
1917}
1918
1919void DXILBitcodeWriter::writeModuleMetadataKinds() {
1920 SmallVector<uint64_t, 64> Record;
1921
1922 // Write metadata kinds
1923 // METADATA_KIND - [n x [id, name]]
1925 M.getMDKindNames(Names);
1926
1927 if (Names.empty())
1928 return;
1929
1930 Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3);
1931
1932 for (unsigned MDKindID = 0, e = Names.size(); MDKindID != e; ++MDKindID) {
1933 Record.push_back(MDKindID);
1934 StringRef KName = Names[MDKindID];
1935 Record.append(KName.begin(), KName.end());
1936
1937 Stream.EmitRecord(bitc::METADATA_KIND, Record, 0);
1938 Record.clear();
1939 }
1940
1941 Stream.ExitBlock();
1942}
1943
1944void DXILBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal,
1945 bool isGlobal) {
1946 if (FirstVal == LastVal)
1947 return;
1948
1949 Stream.EnterSubblock(bitc::CONSTANTS_BLOCK_ID, 4);
1950
1951 unsigned AggregateAbbrev = 0;
1952 unsigned String8Abbrev = 0;
1953 unsigned CString7Abbrev = 0;
1954 unsigned CString6Abbrev = 0;
1955 // If this is a constant pool for the module, emit module-specific abbrevs.
1956 if (isGlobal) {
1957 // Abbrev for CST_CODE_AGGREGATE.
1958 auto Abbv = std::make_shared<BitCodeAbbrev>();
1959 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_AGGREGATE));
1960 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1961 Abbv->Add(
1962 BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, Log2_32_Ceil(LastVal + 1)));
1963 AggregateAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1964
1965 // Abbrev for CST_CODE_STRING.
1966 Abbv = std::make_shared<BitCodeAbbrev>();
1967 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_STRING));
1968 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1969 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
1970 String8Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1971 // Abbrev for CST_CODE_CSTRING.
1972 Abbv = std::make_shared<BitCodeAbbrev>();
1973 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING));
1974 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1975 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));
1976 CString7Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1977 // Abbrev for CST_CODE_CSTRING.
1978 Abbv = std::make_shared<BitCodeAbbrev>();
1979 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING));
1980 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1981 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
1982 CString6Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1983 }
1984
1985 SmallVector<uint64_t, 64> Record;
1986
1987 const ValueEnumerator::ValueList &Vals = VE.getValues();
1988 Type *LastTy = nullptr;
1989 for (unsigned i = FirstVal; i != LastVal; ++i) {
1990 const Value *V = Vals[i].first;
1991 // If we need to switch types, do so now.
1992 if (V->getType() != LastTy) {
1993 LastTy = V->getType();
1994 Record.push_back(getTypeID(LastTy, V));
1995 Stream.EmitRecord(bitc::CST_CODE_SETTYPE, Record,
1996 CONSTANTS_SETTYPE_ABBREV);
1997 Record.clear();
1998 }
1999
2000 if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
2001 Record.push_back(unsigned(IA->hasSideEffects()) |
2002 unsigned(IA->isAlignStack()) << 1 |
2003 unsigned(IA->getDialect() & 1) << 2);
2004
2005 // Add the asm string.
2006 StringRef AsmStr = IA->getAsmString();
2007 Record.push_back(AsmStr.size());
2008 Record.append(AsmStr.begin(), AsmStr.end());
2009
2010 // Add the constraint string.
2011 StringRef ConstraintStr = IA->getConstraintString();
2012 Record.push_back(ConstraintStr.size());
2013 Record.append(ConstraintStr.begin(), ConstraintStr.end());
2014 Stream.EmitRecord(bitc::CST_CODE_INLINEASM, Record);
2015 Record.clear();
2016 continue;
2017 }
2018 const Constant *C = cast<Constant>(V);
2019 unsigned Code = -1U;
2020 unsigned AbbrevToUse = 0;
2021 if (C->isNullValue()) {
2023 } else if (isa<UndefValue>(C)) {
2025 } else if (const ConstantInt *IV = dyn_cast<ConstantInt>(C)) {
2026 if (IV->getBitWidth() <= 64) {
2027 uint64_t V = IV->getSExtValue();
2028 emitSignedInt64(Record, V);
2030 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2031 } else { // Wide integers, > 64 bits in size.
2032 // We have an arbitrary precision integer value to write whose
2033 // bit width is > 64. However, in canonical unsigned integer
2034 // format it is likely that the high bits are going to be zero.
2035 // So, we only write the number of active words.
2036 unsigned NWords = IV->getValue().getActiveWords();
2037 const uint64_t *RawWords = IV->getValue().getRawData();
2038 for (unsigned i = 0; i != NWords; ++i) {
2039 emitSignedInt64(Record, RawWords[i]);
2040 }
2042 }
2043 } else if (const ConstantByte *BV = dyn_cast<ConstantByte>(C)) {
2044 // Note: we downgrade by converting to the equivalent integer - this logic
2045 // should match the `ConstantInt` case above.
2046 if (BV->getBitWidth() <= 64) {
2047 uint64_t V = BV->getSExtValue();
2048 emitSignedInt64(Record, V);
2050 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2051 } else { // Wide bytes, > 64 bits in size.
2052 unsigned NWords = BV->getValue().getActiveWords();
2053 const uint64_t *RawWords = BV->getValue().getRawData();
2054 for (unsigned i = 0; i != NWords; ++i) {
2055 emitSignedInt64(Record, RawWords[i]);
2056 }
2058 }
2059 } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
2061 Type *Ty = CFP->getType()->getScalarType();
2062 if (Ty->isHalfTy() || Ty->isFloatTy() || Ty->isDoubleTy()) {
2063 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2064 } else if (Ty->isX86_FP80Ty()) {
2065 // api needed to prevent premature destruction
2066 // bits are not in the same order as a normal i80 APInt, compensate.
2067 APInt api = CFP->getValueAPF().bitcastToAPInt();
2068 const uint64_t *p = api.getRawData();
2069 Record.push_back((p[1] << 48) | (p[0] >> 16));
2070 Record.push_back(p[0] & 0xffffLL);
2071 } else if (Ty->isFP128Ty() || Ty->isPPC_FP128Ty()) {
2072 APInt api = CFP->getValueAPF().bitcastToAPInt();
2073 const uint64_t *p = api.getRawData();
2074 Record.push_back(p[0]);
2075 Record.push_back(p[1]);
2076 } else {
2077 assert(0 && "Unknown FP type!");
2078 }
2079 } else if (isa<ConstantDataSequential>(C) &&
2080 cast<ConstantDataSequential>(C)->isString()) {
2081 const ConstantDataSequential *Str = cast<ConstantDataSequential>(C);
2082 // Emit constant strings specially.
2083 unsigned NumElts = Str->getNumElements();
2084 // If this is a null-terminated string, use the denser CSTRING encoding.
2085 if (Str->isCString()) {
2087 --NumElts; // Don't encode the null, which isn't allowed by char6.
2088 } else {
2090 AbbrevToUse = String8Abbrev;
2091 }
2092 bool isCStr7 = Code == bitc::CST_CODE_CSTRING;
2093 bool isCStrChar6 = Code == bitc::CST_CODE_CSTRING;
2094 for (unsigned i = 0; i != NumElts; ++i) {
2095 unsigned char V = Str->getElementAsInteger(i);
2096 Record.push_back(V);
2097 isCStr7 &= (V & 128) == 0;
2098 if (isCStrChar6)
2099 isCStrChar6 = BitCodeAbbrevOp::isChar6(V);
2100 }
2101
2102 if (isCStrChar6)
2103 AbbrevToUse = CString6Abbrev;
2104 else if (isCStr7)
2105 AbbrevToUse = CString7Abbrev;
2106 } else if (const ConstantDataSequential *CDS =
2109 Type *EltTy = CDS->getElementType();
2110 if (isa<IntegerType>(EltTy) || isa<ByteType>(EltTy)) {
2111 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i)
2112 Record.push_back(CDS->getElementAsInteger(i));
2113 } else if (EltTy->isFloatTy()) {
2114 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2115 union {
2116 float F;
2117 uint32_t I;
2118 };
2119 F = CDS->getElementAsFloat(i);
2120 Record.push_back(I);
2121 }
2122 } else {
2123 assert(EltTy->isDoubleTy() && "Unknown ConstantData element type");
2124 for (unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2125 union {
2126 double F;
2127 uint64_t I;
2128 };
2129 F = CDS->getElementAsDouble(i);
2130 Record.push_back(I);
2131 }
2132 }
2133 } else if (isa<ConstantArray>(C) || isa<ConstantStruct>(C) ||
2136 for (const Value *Op : C->operands())
2137 Record.push_back(VE.getValueID(Op));
2138 AbbrevToUse = AggregateAbbrev;
2139 } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
2140 switch (CE->getOpcode()) {
2141 default:
2142 if (Instruction::isCast(CE->getOpcode())) {
2144 Record.push_back(getEncodedCastOpcode(CE->getOpcode()));
2145 Record.push_back(
2146 getTypeID(C->getOperand(0)->getType(), C->getOperand(0)));
2147 Record.push_back(VE.getValueID(C->getOperand(0)));
2148 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2149 } else {
2150 assert(CE->getNumOperands() == 2 && "Unknown constant expr!");
2152 Record.push_back(getEncodedBinaryOpcode(CE->getOpcode()));
2153 Record.push_back(VE.getValueID(C->getOperand(0)));
2154 Record.push_back(VE.getValueID(C->getOperand(1)));
2155 uint64_t Flags = getOptimizationFlags(CE);
2156 if (Flags != 0)
2157 Record.push_back(Flags);
2158 }
2159 break;
2160 case Instruction::GetElementPtr: {
2162 const auto *GO = cast<GEPOperator>(C);
2163 if (GO->isInBounds())
2165 Record.push_back(getTypeID(GO->getSourceElementType()));
2166 for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) {
2167 Record.push_back(
2168 getTypeID(C->getOperand(i)->getType(), C->getOperand(i)));
2169 Record.push_back(VE.getValueID(C->getOperand(i)));
2170 }
2171 break;
2172 }
2173 case Instruction::Select:
2175 Record.push_back(VE.getValueID(C->getOperand(0)));
2176 Record.push_back(VE.getValueID(C->getOperand(1)));
2177 Record.push_back(VE.getValueID(C->getOperand(2)));
2178 break;
2179 case Instruction::ExtractElement:
2181 Record.push_back(getTypeID(C->getOperand(0)->getType()));
2182 Record.push_back(VE.getValueID(C->getOperand(0)));
2183 Record.push_back(getTypeID(C->getOperand(1)->getType()));
2184 Record.push_back(VE.getValueID(C->getOperand(1)));
2185 break;
2186 case Instruction::InsertElement:
2188 Record.push_back(VE.getValueID(C->getOperand(0)));
2189 Record.push_back(VE.getValueID(C->getOperand(1)));
2190 Record.push_back(getTypeID(C->getOperand(2)->getType()));
2191 Record.push_back(VE.getValueID(C->getOperand(2)));
2192 break;
2193 case Instruction::ShuffleVector:
2194 // If the return type and argument types are the same, this is a
2195 // standard shufflevector instruction. If the types are different,
2196 // then the shuffle is widening or truncating the input vectors, and
2197 // the argument type must also be encoded.
2198 if (C->getType() == C->getOperand(0)->getType()) {
2200 } else {
2202 Record.push_back(getTypeID(C->getOperand(0)->getType()));
2203 }
2204 Record.push_back(VE.getValueID(C->getOperand(0)));
2205 Record.push_back(VE.getValueID(C->getOperand(1)));
2206 Record.push_back(VE.getValueID(C->getOperand(2)));
2207 break;
2208 }
2209 } else if (const BlockAddress *BA = dyn_cast<BlockAddress>(C)) {
2211 Record.push_back(getTypeID(BA->getFunction()->getType()));
2212 Record.push_back(VE.getValueID(BA->getFunction()));
2213 Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock()));
2214 } else {
2215#ifndef NDEBUG
2216 C->dump();
2217#endif
2218 llvm_unreachable("Unknown constant!");
2219 }
2220 Stream.EmitRecord(Code, Record, AbbrevToUse);
2221 Record.clear();
2222 }
2223
2224 Stream.ExitBlock();
2225}
2226
2227void DXILBitcodeWriter::writeModuleConstants() {
2228 const ValueEnumerator::ValueList &Vals = VE.getValues();
2229
2230 // Find the first constant to emit, which is the first non-globalvalue value.
2231 // We know globalvalues have been emitted by WriteModuleInfo.
2232 for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
2233 if (!isa<GlobalValue>(Vals[i].first)) {
2234 writeConstants(i, Vals.size(), true);
2235 return;
2236 }
2237 }
2238}
2239
2240/// pushValueAndType - The file has to encode both the value and type id for
2241/// many values, because we need to know what type to create for forward
2242/// references. However, most operands are not forward references, so this type
2243/// field is not needed.
2244///
2245/// This function adds V's value ID to Vals. If the value ID is higher than the
2246/// instruction ID, then it is a forward reference, and it also includes the
2247/// type ID. The value ID that is written is encoded relative to the InstID.
2248bool DXILBitcodeWriter::pushValueAndType(const Value *V, unsigned InstID,
2249 SmallVectorImpl<unsigned> &Vals) {
2250 unsigned ValID = VE.getValueID(V);
2251 // Make encoding relative to the InstID.
2252 Vals.push_back(InstID - ValID);
2253 if (ValID >= InstID) {
2254 Vals.push_back(getTypeID(V->getType(), V));
2255 return true;
2256 }
2257 return false;
2258}
2259
2260/// pushValue - Like pushValueAndType, but where the type of the value is
2261/// omitted (perhaps it was already encoded in an earlier operand).
2262void DXILBitcodeWriter::pushValue(const Value *V, unsigned InstID,
2263 SmallVectorImpl<unsigned> &Vals) {
2264 unsigned ValID = VE.getValueID(V);
2265 Vals.push_back(InstID - ValID);
2266}
2267
2268void DXILBitcodeWriter::pushValueSigned(const Value *V, unsigned InstID,
2269 SmallVectorImpl<uint64_t> &Vals) {
2270 unsigned ValID = VE.getValueID(V);
2271 int64_t diff = ((int32_t)InstID - (int32_t)ValID);
2272 emitSignedInt64(Vals, diff);
2273}
2274
2275/// WriteInstruction - Emit an instruction
2276void DXILBitcodeWriter::writeInstruction(const Instruction &I, unsigned InstID,
2277 SmallVectorImpl<unsigned> &Vals) {
2278 unsigned Code = 0;
2279 unsigned AbbrevToUse = 0;
2280 VE.setInstructionID(&I);
2281 switch (I.getOpcode()) {
2282 default:
2283 if (Instruction::isCast(I.getOpcode())) {
2285 if (!pushValueAndType(I.getOperand(0), InstID, Vals))
2286 AbbrevToUse = (unsigned)FUNCTION_INST_CAST_ABBREV;
2287 Vals.push_back(getTypeID(I.getType(), &I));
2288 Vals.push_back(getEncodedCastOpcode(I.getOpcode()));
2289 } else {
2290 assert(isa<BinaryOperator>(I) && "Unknown instruction!");
2292 if (!pushValueAndType(I.getOperand(0), InstID, Vals))
2293 AbbrevToUse = (unsigned)FUNCTION_INST_BINOP_ABBREV;
2294 pushValue(I.getOperand(1), InstID, Vals);
2295 Vals.push_back(getEncodedBinaryOpcode(I.getOpcode()));
2296 uint64_t Flags = getOptimizationFlags(&I);
2297 if (Flags != 0) {
2298 if (AbbrevToUse == (unsigned)FUNCTION_INST_BINOP_ABBREV)
2299 AbbrevToUse = (unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV;
2300 Vals.push_back(Flags);
2301 }
2302 }
2303 break;
2304
2305 case Instruction::GetElementPtr: {
2307 AbbrevToUse = (unsigned)FUNCTION_INST_GEP_ABBREV;
2308 auto &GEPInst = cast<GetElementPtrInst>(I);
2309 Vals.push_back(GEPInst.isInBounds());
2310 Vals.push_back(getTypeID(GEPInst.getSourceElementType()));
2311 for (unsigned i = 0, e = I.getNumOperands(); i != e; ++i)
2312 pushValueAndType(I.getOperand(i), InstID, Vals);
2313 break;
2314 }
2315 case Instruction::ExtractValue: {
2317 pushValueAndType(I.getOperand(0), InstID, Vals);
2318 const ExtractValueInst *EVI = cast<ExtractValueInst>(&I);
2319 Vals.append(EVI->idx_begin(), EVI->idx_end());
2320 break;
2321 }
2322 case Instruction::InsertValue: {
2324 pushValueAndType(I.getOperand(0), InstID, Vals);
2325 pushValueAndType(I.getOperand(1), InstID, Vals);
2326 const InsertValueInst *IVI = cast<InsertValueInst>(&I);
2327 Vals.append(IVI->idx_begin(), IVI->idx_end());
2328 break;
2329 }
2330 case Instruction::Select:
2332 pushValueAndType(I.getOperand(1), InstID, Vals);
2333 pushValue(I.getOperand(2), InstID, Vals);
2334 pushValueAndType(I.getOperand(0), InstID, Vals);
2335 break;
2336 case Instruction::ExtractElement:
2338 pushValueAndType(I.getOperand(0), InstID, Vals);
2339 pushValueAndType(I.getOperand(1), InstID, Vals);
2340 break;
2341 case Instruction::InsertElement:
2343 pushValueAndType(I.getOperand(0), InstID, Vals);
2344 pushValue(I.getOperand(1), InstID, Vals);
2345 pushValueAndType(I.getOperand(2), InstID, Vals);
2346 break;
2347 case Instruction::ShuffleVector:
2349 pushValueAndType(I.getOperand(0), InstID, Vals);
2350 pushValue(I.getOperand(1), InstID, Vals);
2351 pushValue(cast<ShuffleVectorInst>(&I)->getShuffleMaskForBitcode(), InstID,
2352 Vals);
2353 break;
2354 case Instruction::ICmp:
2355 case Instruction::FCmp: {
2356 // compare returning Int1Ty or vector of Int1Ty
2358 pushValueAndType(I.getOperand(0), InstID, Vals);
2359 pushValue(I.getOperand(1), InstID, Vals);
2361 uint64_t Flags = getOptimizationFlags(&I);
2362 if (Flags != 0)
2363 Vals.push_back(Flags);
2364 break;
2365 }
2366
2367 case Instruction::Ret: {
2369 unsigned NumOperands = I.getNumOperands();
2370 if (NumOperands == 0)
2371 AbbrevToUse = (unsigned)FUNCTION_INST_RET_VOID_ABBREV;
2372 else if (NumOperands == 1) {
2373 if (!pushValueAndType(I.getOperand(0), InstID, Vals))
2374 AbbrevToUse = (unsigned)FUNCTION_INST_RET_VAL_ABBREV;
2375 } else {
2376 for (unsigned i = 0, e = NumOperands; i != e; ++i)
2377 pushValueAndType(I.getOperand(i), InstID, Vals);
2378 }
2379 } break;
2380 case Instruction::UncondBr:
2382 Vals.push_back(VE.getValueID(cast<UncondBrInst>(I).getSuccessor()));
2383 break;
2384 case Instruction::CondBr: {
2386 const CondBrInst &II = cast<CondBrInst>(I);
2387 Vals.push_back(VE.getValueID(II.getSuccessor(0)));
2388 Vals.push_back(VE.getValueID(II.getSuccessor(1)));
2389 pushValue(II.getCondition(), InstID, Vals);
2390 } break;
2391 case Instruction::Switch: {
2393 const SwitchInst &SI = cast<SwitchInst>(I);
2394 Vals.push_back(getTypeID(SI.getCondition()->getType()));
2395 pushValue(SI.getCondition(), InstID, Vals);
2396 Vals.push_back(VE.getValueID(SI.getDefaultDest()));
2397 for (auto Case : SI.cases()) {
2398 Vals.push_back(VE.getValueID(Case.getCaseValue()));
2399 Vals.push_back(VE.getValueID(Case.getCaseSuccessor()));
2400 }
2401 } break;
2402 case Instruction::IndirectBr:
2404 Vals.push_back(getTypeID(I.getOperand(0)->getType()));
2405 // Encode the address operand as relative, but not the basic blocks.
2406 pushValue(I.getOperand(0), InstID, Vals);
2407 for (unsigned i = 1, e = I.getNumOperands(); i != e; ++i)
2408 Vals.push_back(VE.getValueID(I.getOperand(i)));
2409 break;
2410
2411 case Instruction::Invoke: {
2412 const InvokeInst *II = cast<InvokeInst>(&I);
2413 const Value *Callee = II->getCalledOperand();
2414 FunctionType *FTy = II->getFunctionType();
2416
2417 Vals.push_back(VE.getAttributeListID(II->getAttributes()));
2418 Vals.push_back(II->getCallingConv() | 1 << 13);
2419 Vals.push_back(VE.getValueID(II->getNormalDest()));
2420 Vals.push_back(VE.getValueID(II->getUnwindDest()));
2421 Vals.push_back(getTypeID(FTy));
2422 pushValueAndType(Callee, InstID, Vals);
2423
2424 // Emit value #'s for the fixed parameters.
2425 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
2426 pushValue(I.getOperand(i), InstID, Vals); // fixed param.
2427
2428 // Emit type/value pairs for varargs params.
2429 if (FTy->isVarArg()) {
2430 for (unsigned i = FTy->getNumParams(), e = I.getNumOperands() - 3; i != e;
2431 ++i)
2432 pushValueAndType(I.getOperand(i), InstID, Vals); // vararg
2433 }
2434 break;
2435 }
2436 case Instruction::Resume:
2438 pushValueAndType(I.getOperand(0), InstID, Vals);
2439 break;
2440 case Instruction::Unreachable:
2442 AbbrevToUse = (unsigned)FUNCTION_INST_UNREACHABLE_ABBREV;
2443 break;
2444
2445 case Instruction::PHI: {
2446 const PHINode &PN = cast<PHINode>(I);
2448 // With the newer instruction encoding, forward references could give
2449 // negative valued IDs. This is most common for PHIs, so we use
2450 // signed VBRs.
2452 Vals64.push_back(getTypeID(PN.getType()));
2453 for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) {
2454 pushValueSigned(PN.getIncomingValue(i), InstID, Vals64);
2455 Vals64.push_back(VE.getValueID(PN.getIncomingBlock(i)));
2456 }
2457 // Emit a Vals64 vector and exit.
2458 Stream.EmitRecord(Code, Vals64, AbbrevToUse);
2459 Vals64.clear();
2460 return;
2461 }
2462
2463 case Instruction::LandingPad: {
2464 const LandingPadInst &LP = cast<LandingPadInst>(I);
2466 Vals.push_back(getTypeID(LP.getType()));
2467 Vals.push_back(LP.isCleanup());
2468 Vals.push_back(LP.getNumClauses());
2469 for (unsigned I = 0, E = LP.getNumClauses(); I != E; ++I) {
2470 if (LP.isCatch(I))
2472 else
2474 pushValueAndType(LP.getClause(I), InstID, Vals);
2475 }
2476 break;
2477 }
2478
2479 case Instruction::Alloca: {
2481 const AllocaInst &AI = cast<AllocaInst>(I);
2482 Vals.push_back(getTypeID(AI.getAllocatedType()));
2483 Vals.push_back(getTypeID(I.getOperand(0)->getType()));
2484 Vals.push_back(VE.getValueID(I.getOperand(0))); // size.
2485 unsigned AlignRecord = Log2_32(AI.getAlign().value()) + 1;
2486 assert(AlignRecord < 1 << 5 && "alignment greater than 1 << 64");
2487 AlignRecord |= AI.isUsedWithInAlloca() << 5;
2488 AlignRecord |= 1 << 6;
2489 Vals.push_back(AlignRecord);
2490 break;
2491 }
2492
2493 case Instruction::Load:
2494 if (cast<LoadInst>(I).isAtomic()) {
2496 pushValueAndType(I.getOperand(0), InstID, Vals);
2497 } else {
2499 if (!pushValueAndType(I.getOperand(0), InstID, Vals)) // ptr
2500 AbbrevToUse = (unsigned)FUNCTION_INST_LOAD_ABBREV;
2501 }
2502 Vals.push_back(getTypeID(I.getType()));
2503 Vals.push_back(Log2(cast<LoadInst>(I).getAlign()) + 1);
2504 Vals.push_back(cast<LoadInst>(I).isVolatile());
2505 if (cast<LoadInst>(I).isAtomic()) {
2506 Vals.push_back(getEncodedOrdering(cast<LoadInst>(I).getOrdering()));
2507 Vals.push_back(getEncodedSyncScopeID(cast<LoadInst>(I).getSyncScopeID()));
2508 }
2509 break;
2510 case Instruction::Store:
2511 if (cast<StoreInst>(I).isAtomic())
2513 else
2515 pushValueAndType(I.getOperand(1), InstID, Vals); // ptrty + ptr
2516 pushValueAndType(I.getOperand(0), InstID, Vals); // valty + val
2517 Vals.push_back(Log2(cast<StoreInst>(I).getAlign()) + 1);
2518 Vals.push_back(cast<StoreInst>(I).isVolatile());
2519 if (cast<StoreInst>(I).isAtomic()) {
2520 Vals.push_back(getEncodedOrdering(cast<StoreInst>(I).getOrdering()));
2521 Vals.push_back(
2522 getEncodedSyncScopeID(cast<StoreInst>(I).getSyncScopeID()));
2523 }
2524 break;
2525 case Instruction::AtomicCmpXchg:
2527 pushValueAndType(I.getOperand(0), InstID, Vals); // ptrty + ptr
2528 pushValueAndType(I.getOperand(1), InstID, Vals); // cmp.
2529 pushValue(I.getOperand(2), InstID, Vals); // newval.
2530 Vals.push_back(cast<AtomicCmpXchgInst>(I).isVolatile());
2531 Vals.push_back(
2532 getEncodedOrdering(cast<AtomicCmpXchgInst>(I).getSuccessOrdering()));
2533 Vals.push_back(
2534 getEncodedSyncScopeID(cast<AtomicCmpXchgInst>(I).getSyncScopeID()));
2535 Vals.push_back(
2536 getEncodedOrdering(cast<AtomicCmpXchgInst>(I).getFailureOrdering()));
2537 Vals.push_back(cast<AtomicCmpXchgInst>(I).isWeak());
2538 break;
2539 case Instruction::AtomicRMW:
2541 pushValueAndType(I.getOperand(0), InstID, Vals); // ptrty + ptr
2542 pushValue(I.getOperand(1), InstID, Vals); // val.
2543 Vals.push_back(
2545 Vals.push_back(cast<AtomicRMWInst>(I).isVolatile());
2546 Vals.push_back(getEncodedOrdering(cast<AtomicRMWInst>(I).getOrdering()));
2547 Vals.push_back(
2548 getEncodedSyncScopeID(cast<AtomicRMWInst>(I).getSyncScopeID()));
2549 break;
2550 case Instruction::Fence:
2552 Vals.push_back(getEncodedOrdering(cast<FenceInst>(I).getOrdering()));
2553 Vals.push_back(getEncodedSyncScopeID(cast<FenceInst>(I).getSyncScopeID()));
2554 break;
2555 case Instruction::Call: {
2556 const CallInst &CI = cast<CallInst>(I);
2557 FunctionType *FTy = CI.getFunctionType();
2558
2560
2561 Vals.push_back(VE.getAttributeListID(CI.getAttributes()));
2562 Vals.push_back((CI.getCallingConv() << 1) | unsigned(CI.isTailCall()) |
2563 unsigned(CI.isMustTailCall()) << 14 | 1 << 15);
2564 Vals.push_back(getGlobalObjectValueTypeID(FTy, CI.getCalledFunction()));
2565 pushValueAndType(CI.getCalledOperand(), InstID, Vals); // Callee
2566
2567 // Emit value #'s for the fixed parameters.
2568 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
2569 // Check for labels (can happen with asm labels).
2570 if (FTy->getParamType(i)->isLabelTy())
2571 Vals.push_back(VE.getValueID(CI.getArgOperand(i)));
2572 else
2573 pushValue(CI.getArgOperand(i), InstID, Vals); // fixed param.
2574 }
2575
2576 // Emit type/value pairs for varargs params.
2577 if (FTy->isVarArg()) {
2578 for (unsigned i = FTy->getNumParams(), e = CI.arg_size(); i != e; ++i)
2579 pushValueAndType(CI.getArgOperand(i), InstID, Vals); // varargs
2580 }
2581 break;
2582 }
2583 case Instruction::VAArg:
2585 Vals.push_back(getTypeID(I.getOperand(0)->getType())); // valistty
2586 pushValue(I.getOperand(0), InstID, Vals); // valist.
2587 Vals.push_back(getTypeID(I.getType())); // restype.
2588 break;
2589 }
2590
2591 Stream.EmitRecord(Code, Vals, AbbrevToUse);
2592 Vals.clear();
2593}
2594
2595// Emit names for globals/functions etc.
2596void DXILBitcodeWriter::writeFunctionLevelValueSymbolTable(
2597 const ValueSymbolTable &VST) {
2598 if (VST.empty())
2599 return;
2600 Stream.EnterSubblock(bitc::VALUE_SYMTAB_BLOCK_ID, 4);
2601
2603
2604 // HLSL Change
2605 // Read the named values from a sorted list instead of the original list
2606 // to ensure the binary is the same no matter what values ever existed.
2608
2609 for (auto &VI : VST) {
2610 const Value &V = VE.getDXILValue(*VI.second);
2611 SortedTable.push_back(V.getValueName());
2612 }
2613 // The keys are unique, so there shouldn't be stability issues.
2614 llvm::sort(SortedTable, [](const ValueName *A, const ValueName *B) {
2615 return A->first() < B->first();
2616 });
2617
2618 for (const ValueName *SI : SortedTable) {
2619 auto &Name = *SI;
2620
2621 // Figure out the encoding to use for the name.
2622 bool is7Bit = true;
2623 bool isChar6 = true;
2624 for (const char *C = Name.getKeyData(), *E = C + Name.getKeyLength();
2625 C != E; ++C) {
2626 if (isChar6)
2627 isChar6 = BitCodeAbbrevOp::isChar6(*C);
2628 if ((unsigned char)*C & 128) {
2629 is7Bit = false;
2630 break; // don't bother scanning the rest.
2631 }
2632 }
2633
2634 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
2635
2636 // VST_ENTRY: [valueid, namechar x N]
2637 // VST_BBENTRY: [bbid, namechar x N]
2638 unsigned Code;
2639 if (isa<BasicBlock>(SI->getValue())) {
2641 if (isChar6)
2642 AbbrevToUse = VST_BBENTRY_6_ABBREV;
2643 } else {
2645 if (isChar6)
2646 AbbrevToUse = VST_ENTRY_6_ABBREV;
2647 else if (is7Bit)
2648 AbbrevToUse = VST_ENTRY_7_ABBREV;
2649 }
2650
2651 NameVals.push_back(VE.getValueID(SI->getValue()));
2652 for (const char *P = Name.getKeyData(),
2653 *E = Name.getKeyData() + Name.getKeyLength();
2654 P != E; ++P)
2655 NameVals.push_back((unsigned char)*P);
2656
2657 // Emit the finished record.
2658 Stream.EmitRecord(Code, NameVals, AbbrevToUse);
2659 NameVals.clear();
2660 }
2661 Stream.ExitBlock();
2662}
2663
2664/// Emit a function body to the module stream.
2665void DXILBitcodeWriter::writeFunction(const Function &F) {
2666 Stream.EnterSubblock(bitc::FUNCTION_BLOCK_ID, 4);
2667 VE.incorporateFunction(F);
2668
2670
2671 // Emit the number of basic blocks, so the reader can create them ahead of
2672 // time.
2673 Vals.push_back(VE.getBasicBlocks().size());
2674 Stream.EmitRecord(bitc::FUNC_CODE_DECLAREBLOCKS, Vals);
2675 Vals.clear();
2676
2677 // If there are function-local constants, emit them now.
2678 unsigned CstStart, CstEnd;
2679 VE.getFunctionConstantRange(CstStart, CstEnd);
2680 writeConstants(CstStart, CstEnd, false);
2681
2682 // If there is function-local metadata, emit it now.
2683 writeFunctionMetadata(F);
2684
2685 // Keep a running idea of what the instruction ID is.
2686 unsigned InstID = CstEnd;
2687
2688 bool NeedsMetadataAttachment = F.hasMetadata();
2689
2690 DILocation *LastDL = nullptr;
2691
2692 // Finally, emit all the instructions, in order.
2693 for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
2694 for (BasicBlock::const_iterator It = BB->begin(), E = BB->end(); It != E;
2695 ++It) {
2696 const Instruction &I = VE.getDXILInstruction(*It);
2697
2698 writeInstruction(I, InstID, Vals);
2699
2700 if (!I.getType()->isVoidTy())
2701 ++InstID;
2702
2703 // If the instruction has metadata, write a metadata attachment later.
2704 NeedsMetadataAttachment |= I.hasMetadataOtherThanDebugLoc();
2705
2706 // If the instruction has a debug location, emit it.
2707 DILocation *DL = I.getDebugLoc();
2708 if (!DL)
2709 continue;
2710
2711 if (DL == LastDL) {
2712 // Just repeat the same debug loc as last time.
2713 Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC_AGAIN, Vals);
2714 continue;
2715 }
2716
2717 Vals.push_back(DL->getLine());
2718 Vals.push_back(DL->getColumn());
2719 Vals.push_back(VE.getMetadataOrNullID(DL->getScope()));
2720 Vals.push_back(VE.getMetadataOrNullID(DL->getInlinedAt()));
2721 Stream.EmitRecord(bitc::FUNC_CODE_DEBUG_LOC, Vals);
2722 Vals.clear();
2723
2724 LastDL = DL;
2725 }
2726
2727 // Emit names for all the instructions etc.
2728 if (auto *Symtab = F.getValueSymbolTable())
2729 writeFunctionLevelValueSymbolTable(*Symtab);
2730
2731 if (NeedsMetadataAttachment)
2732 writeFunctionMetadataAttachment(F);
2733
2734 VE.purgeFunction();
2735 Stream.ExitBlock();
2736}
2737
2738// Emit blockinfo, which defines the standard abbreviations etc.
2739void DXILBitcodeWriter::writeBlockInfo() {
2740 // We only want to emit block info records for blocks that have multiple
2741 // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK and VALUE_SYMTAB_BLOCK.
2742 // Other blocks can define their abbrevs inline.
2743 Stream.EnterBlockInfoBlock();
2744
2745 { // 8-bit fixed-width VST_ENTRY/VST_BBENTRY strings.
2746 auto Abbv = std::make_shared<BitCodeAbbrev>();
2747 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
2748 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2749 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2750 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
2751 if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID,
2752 std::move(Abbv)) != VST_ENTRY_8_ABBREV)
2753 assert(false && "Unexpected abbrev ordering!");
2754 }
2755
2756 { // 7-bit fixed width VST_ENTRY strings.
2757 auto Abbv = std::make_shared<BitCodeAbbrev>();
2758 Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY));
2759 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2760 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2761 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));
2762 if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID,
2763 std::move(Abbv)) != VST_ENTRY_7_ABBREV)
2764 assert(false && "Unexpected abbrev ordering!");
2765 }
2766 { // 6-bit char6 VST_ENTRY strings.
2767 auto Abbv = std::make_shared<BitCodeAbbrev>();
2768 Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY));
2769 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2770 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2771 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
2772 if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID,
2773 std::move(Abbv)) != VST_ENTRY_6_ABBREV)
2774 assert(false && "Unexpected abbrev ordering!");
2775 }
2776 { // 6-bit char6 VST_BBENTRY strings.
2777 auto Abbv = std::make_shared<BitCodeAbbrev>();
2778 Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_BBENTRY));
2779 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2780 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2781 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
2782 if (Stream.EmitBlockInfoAbbrev(bitc::VALUE_SYMTAB_BLOCK_ID,
2783 std::move(Abbv)) != VST_BBENTRY_6_ABBREV)
2784 assert(false && "Unexpected abbrev ordering!");
2785 }
2786
2787 { // SETTYPE abbrev for CONSTANTS_BLOCK.
2788 auto Abbv = std::make_shared<BitCodeAbbrev>();
2789 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_SETTYPE));
2790 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
2791 VE.computeBitsRequiredForTypeIndices()));
2792 if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, std::move(Abbv)) !=
2793 CONSTANTS_SETTYPE_ABBREV)
2794 assert(false && "Unexpected abbrev ordering!");
2795 }
2796
2797 { // INTEGER abbrev for CONSTANTS_BLOCK.
2798 auto Abbv = std::make_shared<BitCodeAbbrev>();
2799 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_INTEGER));
2800 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
2801 if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, std::move(Abbv)) !=
2802 CONSTANTS_INTEGER_ABBREV)
2803 assert(false && "Unexpected abbrev ordering!");
2804 }
2805
2806 { // CE_CAST abbrev for CONSTANTS_BLOCK.
2807 auto Abbv = std::make_shared<BitCodeAbbrev>();
2808 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CE_CAST));
2809 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // cast opc
2810 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // typeid
2811 VE.computeBitsRequiredForTypeIndices()));
2812 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id
2813
2814 if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, std::move(Abbv)) !=
2815 CONSTANTS_CE_CAST_Abbrev)
2816 assert(false && "Unexpected abbrev ordering!");
2817 }
2818 { // NULL abbrev for CONSTANTS_BLOCK.
2819 auto Abbv = std::make_shared<BitCodeAbbrev>();
2820 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_NULL));
2821 if (Stream.EmitBlockInfoAbbrev(bitc::CONSTANTS_BLOCK_ID, std::move(Abbv)) !=
2822 CONSTANTS_NULL_Abbrev)
2823 assert(false && "Unexpected abbrev ordering!");
2824 }
2825
2826 // FIXME: This should only use space for first class types!
2827
2828 { // INST_LOAD abbrev for FUNCTION_BLOCK.
2829 auto Abbv = std::make_shared<BitCodeAbbrev>();
2830 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_LOAD));
2831 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Ptr
2832 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty
2833 VE.computeBitsRequiredForTypeIndices()));
2834 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // Align
2835 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile
2836 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=
2837 (unsigned)FUNCTION_INST_LOAD_ABBREV)
2838 assert(false && "Unexpected abbrev ordering!");
2839 }
2840 { // INST_BINOP abbrev for FUNCTION_BLOCK.
2841 auto Abbv = std::make_shared<BitCodeAbbrev>();
2842 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP));
2843 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS
2844 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS
2845 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
2846 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=
2847 (unsigned)FUNCTION_INST_BINOP_ABBREV)
2848 assert(false && "Unexpected abbrev ordering!");
2849 }
2850 { // INST_BINOP_FLAGS abbrev for FUNCTION_BLOCK.
2851 auto Abbv = std::make_shared<BitCodeAbbrev>();
2852 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP));
2853 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LHS
2854 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // RHS
2855 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
2856 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); // flags
2857 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=
2858 (unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV)
2859 assert(false && "Unexpected abbrev ordering!");
2860 }
2861 { // INST_CAST abbrev for FUNCTION_BLOCK.
2862 auto Abbv = std::make_shared<BitCodeAbbrev>();
2863 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CAST));
2864 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // OpVal
2865 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty
2866 VE.computeBitsRequiredForTypeIndices()));
2867 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
2868 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=
2869 (unsigned)FUNCTION_INST_CAST_ABBREV)
2870 assert(false && "Unexpected abbrev ordering!");
2871 }
2872
2873 { // INST_RET abbrev for FUNCTION_BLOCK.
2874 auto Abbv = std::make_shared<BitCodeAbbrev>();
2875 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET));
2876 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=
2877 (unsigned)FUNCTION_INST_RET_VOID_ABBREV)
2878 assert(false && "Unexpected abbrev ordering!");
2879 }
2880 { // INST_RET abbrev for FUNCTION_BLOCK.
2881 auto Abbv = std::make_shared<BitCodeAbbrev>();
2882 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET));
2883 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // ValID
2884 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=
2885 (unsigned)FUNCTION_INST_RET_VAL_ABBREV)
2886 assert(false && "Unexpected abbrev ordering!");
2887 }
2888 { // INST_UNREACHABLE abbrev for FUNCTION_BLOCK.
2889 auto Abbv = std::make_shared<BitCodeAbbrev>();
2890 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNREACHABLE));
2891 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=
2892 (unsigned)FUNCTION_INST_UNREACHABLE_ABBREV)
2893 assert(false && "Unexpected abbrev ordering!");
2894 }
2895 {
2896 auto Abbv = std::make_shared<BitCodeAbbrev>();
2897 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_GEP));
2898 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
2899 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // dest ty
2900 Log2_32_Ceil(VE.getTypes().size() + 1)));
2901 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2902 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2903 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, std::move(Abbv)) !=
2904 (unsigned)FUNCTION_INST_GEP_ABBREV)
2905 assert(false && "Unexpected abbrev ordering!");
2906 }
2907
2908 Stream.ExitBlock();
2909}
2910
2911void DXILBitcodeWriter::writeModuleVersion() {
2912 // VERSION: [version#]
2913 Stream.EmitRecord(bitc::MODULE_CODE_VERSION, ArrayRef<unsigned>{1});
2914}
2915
2916/// WriteModule - Emit the specified module to the bitstream.
2918 // The identification block is new since llvm-3.7, but the old bitcode reader
2919 // will skip it.
2920 // writeIdentificationBlock(Stream);
2921
2922 Stream.EnterSubblock(bitc::MODULE_BLOCK_ID, 3);
2923
2924 // It is redundant to fully-specify this here, but nice to make it explicit
2925 // so that it is clear the DXIL module version is different.
2926 DXILBitcodeWriter::writeModuleVersion();
2927
2928 // Emit blockinfo, which defines the standard abbreviations etc.
2929 writeBlockInfo();
2930
2931 // Emit information about attribute groups.
2932 writeAttributeGroupTable();
2933
2934 // Emit information about parameter attributes.
2935 writeAttributeTable();
2936
2937 // Emit information describing all of the types in the module.
2938 writeTypeTable();
2939
2940 writeComdats();
2941
2942 // Emit top-level description of module, including target triple, inline asm,
2943 // descriptors for global variables, and function prototype info.
2944 writeModuleInfo();
2945
2946 // Emit constants.
2947 writeModuleConstants();
2948
2949 // Emit metadata.
2950 writeModuleMetadataKinds();
2951
2952 // Emit metadata.
2953 writeModuleMetadata();
2954
2955 // Emit names for globals/functions etc.
2956 // DXIL uses the same format for module-level value symbol table as for the
2957 // function level table.
2958 writeFunctionLevelValueSymbolTable(M.getValueSymbolTable());
2959
2960 // Emit function bodies.
2961 for (const Function &F : M)
2962 if (!F.isDeclaration())
2963 writeFunction(F);
2964
2965 Stream.ExitBlock();
2966}
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...
static MaybeAlign getAlign(Value *Ptr)
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)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
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:1587
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:478
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:223
iterator end()
Definition DenseMap.h:141
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:368
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.
constexpr bool isAtomic(const T &...O)
Definition SIDefines.h:383
@ 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:390
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
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
StringMapEntry< Value * > ValueName
Definition Value.h:56
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:1669
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
bool isa_and_nonnull(const Y &Val)
Definition Casting.h:676
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
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:1636
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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
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.