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