62#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,
63#include "llvm/IR/Metadata.def"
81 CONSTANTS_INTEGER_ABBREV,
82 CONSTANTS_CE_CAST_Abbrev,
83 CONSTANTS_NULL_Abbrev,
87 FUNCTION_INST_BINOP_ABBREV,
88 FUNCTION_INST_BINOP_FLAGS_ABBREV,
89 FUNCTION_INST_CAST_ABBREV,
90 FUNCTION_INST_RET_VOID_ABBREV,
91 FUNCTION_INST_RET_VAL_ABBREV,
92 FUNCTION_INST_UNREACHABLE_ABBREV,
93 FUNCTION_INST_GEP_ABBREV,
114 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
117 unsigned GlobalValueId;
143 StrtabBuilder(StrtabBuilder), M(M), VE(M, I8PtrTy, DebugInfo),
144 Buffer(Buffer), BitcodeStartBit(Stream.GetCurrentBitNo()),
146 GlobalValueId = VE.getValues().
size();
148 for (
auto El : PointerMap)
149 VE.EnumerateType(El.second);
176 void writeModuleVersion();
177 void writePerModuleGlobalValueSummary();
182 unsigned FSCallsAbbrev,
183 unsigned FSCallsProfileAbbrev,
187 unsigned FSModRefsAbbrev,
188 unsigned FSModVTableRefsAbbrev);
191 GUIDToValueIdMap[ValGUID] = ++GlobalValueId;
195 const auto &VMI = GUIDToValueIdMap.find(ValGUID);
198 assert(VMI != GUIDToValueIdMap.end() &&
199 "GUID does not have assigned value Id");
205 if (!VI.haveGVs() || !VI.getValue())
206 return getValueId(VI.getGUID());
207 return VE.getValueID(VI.getValue());
210 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
212 uint64_t bitcodeStartBit() {
return BitcodeStartBit; }
214 size_t addToStrtab(StringRef Str);
216 unsigned createDILocationAbbrev();
217 unsigned createGenericDINodeAbbrev();
219 void writeAttributeGroupTable();
220 void writeAttributeTable();
221 void writeTypeTable();
223 void writeValueSymbolTableForwardDecl();
224 void writeModuleInfo();
225 void writeValueAsMetadata(
const ValueAsMetadata *MD,
226 SmallVectorImpl<uint64_t> &Record);
227 void writeMDTuple(
const MDTuple *
N, SmallVectorImpl<uint64_t> &Record,
229 void writeDILocation(
const DILocation *
N, SmallVectorImpl<uint64_t> &Record,
231 void writeGenericDINode(
const GenericDINode *
N,
232 SmallVectorImpl<uint64_t> &Record,
unsigned &Abbrev) {
235 void writeDISubrange(
const DISubrange *
N, SmallVectorImpl<uint64_t> &Record,
237 void writeDIGenericSubrange(
const DIGenericSubrange *
N,
238 SmallVectorImpl<uint64_t> &Record,
242 void writeDIEnumerator(
const DIEnumerator *
N,
243 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
244 void writeDIBasicType(
const DIBasicType *
N, SmallVectorImpl<uint64_t> &Record,
246 void writeDIFixedPointType(
const DIFixedPointType *
N,
247 SmallVectorImpl<uint64_t> &Record,
251 void writeDIStringType(
const DIStringType *
N,
252 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev) {
255 void writeDIDerivedType(
const DIDerivedType *
N,
256 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
257 void writeDISubrangeType(
const DISubrangeType *
N,
258 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev) {
261 void writeDICompositeType(
const DICompositeType *
N,
262 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
263 void writeDISubroutineType(
const DISubroutineType *
N,
264 SmallVectorImpl<uint64_t> &Record,
266 void writeDIFile(
const DIFile *
N, SmallVectorImpl<uint64_t> &Record,
268 void writeDICompileUnit(
const DICompileUnit *
N,
269 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
270 void writeDISubprogram(
const DISubprogram *
N,
271 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
272 void writeDILexicalBlock(
const DILexicalBlock *
N,
273 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
274 void writeDILexicalBlockFile(
const DILexicalBlockFile *
N,
275 SmallVectorImpl<uint64_t> &Record,
277 void writeDICommonBlock(
const DICommonBlock *
N,
278 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev) {
281 void writeDINamespace(
const DINamespace *
N, SmallVectorImpl<uint64_t> &Record,
283 void writeDIMacro(
const DIMacro *
N, SmallVectorImpl<uint64_t> &Record,
287 void writeDIMacroFile(
const DIMacroFile *
N, SmallVectorImpl<uint64_t> &Record,
291 void writeDIArgList(
const DIArgList *
N, SmallVectorImpl<uint64_t> &Record,
295 void writeDIAssignID(
const DIAssignID *
N, SmallVectorImpl<uint64_t> &Record,
302 void writeDIModule(
const DIModule *
N, SmallVectorImpl<uint64_t> &Record,
304 void writeDITemplateTypeParameter(
const DITemplateTypeParameter *
N,
305 SmallVectorImpl<uint64_t> &Record,
307 void writeDITemplateValueParameter(
const DITemplateValueParameter *
N,
308 SmallVectorImpl<uint64_t> &Record,
310 void writeDIGlobalVariable(
const DIGlobalVariable *
N,
311 SmallVectorImpl<uint64_t> &Record,
313 void writeDILocalVariable(
const DILocalVariable *
N,
314 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
315 void writeDILabel(
const DILabel *
N, SmallVectorImpl<uint64_t> &Record,
319 void writeDIExpression(
const DIExpression *
N,
320 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
321 void writeDIGlobalVariableExpression(
const DIGlobalVariableExpression *
N,
322 SmallVectorImpl<uint64_t> &Record,
326 void writeDIObjCProperty(
const DIObjCProperty *
N,
327 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
328 void writeDIImportedEntity(
const DIImportedEntity *
N,
329 SmallVectorImpl<uint64_t> &Record,
331 unsigned createNamedMetadataAbbrev();
332 void writeNamedMetadata(SmallVectorImpl<uint64_t> &Record);
333 unsigned createMetadataStringsAbbrev();
335 SmallVectorImpl<uint64_t> &Record);
337 SmallVectorImpl<uint64_t> &Record,
338 std::vector<unsigned> *MDAbbrevs =
nullptr,
339 std::vector<uint64_t> *IndexPos =
nullptr);
340 void writeModuleMetadata();
341 void writeFunctionMetadata(
const Function &
F);
342 void writeFunctionMetadataAttachment(
const Function &
F);
343 void pushGlobalMetadataAttachment(SmallVectorImpl<uint64_t> &Record,
344 const GlobalObject &GO);
345 void writeModuleMetadataKinds();
346 void writeOperandBundleTags();
347 void writeSyncScopeNames();
348 void writeConstants(
unsigned FirstVal,
unsigned LastVal,
bool isGlobal);
349 void writeModuleConstants();
350 bool pushValueAndType(
const Value *V,
unsigned InstID,
351 SmallVectorImpl<unsigned> &Vals);
352 void writeOperandBundles(
const CallBase &CB,
unsigned InstID);
353 void pushValue(
const Value *V,
unsigned InstID,
354 SmallVectorImpl<unsigned> &Vals);
355 void pushValueSigned(
const Value *V,
unsigned InstID,
356 SmallVectorImpl<uint64_t> &Vals);
357 void writeInstruction(
const Instruction &
I,
unsigned InstID,
358 SmallVectorImpl<unsigned> &Vals);
359 void writeFunctionLevelValueSymbolTable(
const ValueSymbolTable &VST);
360 void writeGlobalValueSymbolTable(
361 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
362 void writeFunction(
const Function &
F);
363 void writeBlockInfo();
365 unsigned getEncodedSyncScopeID(
SyncScope::ID SSID) {
return unsigned(SSID); }
367 unsigned getEncodedAlign(MaybeAlign Alignment) {
return encode(Alignment); }
369 unsigned getTypeID(
Type *
T,
const Value *V =
nullptr);
374 unsigned getGlobalObjectValueTypeID(
Type *
T,
const GlobalObject *
G);
390 Stream->Emit((
unsigned)
'B', 8);
391 Stream->Emit((
unsigned)
'C', 8);
392 Stream->Emit(0x0, 4);
393 Stream->Emit(0xC, 4);
394 Stream->Emit(0xE, 4);
395 Stream->Emit(0xD, 4);
408 Triple TT(M.getTargetTriple());
409 if (TT.isOSDarwin() || TT.isOSBinFormatMachO())
423 auto Abbv = std::make_shared<BitCodeAbbrev>();
426 auto AbbrevNo = Stream->
EmitAbbrev(std::move(Abbv));
440 assert(M.isMaterialized());
441 Mods.push_back(
const_cast<Module *
>(&M));
444 ModuleWriter.
write();
455 case Instruction::Trunc:
457 case Instruction::ZExt:
459 case Instruction::SExt:
461 case Instruction::FPToUI:
463 case Instruction::FPToSI:
465 case Instruction::UIToFP:
467 case Instruction::SIToFP:
469 case Instruction::FPTrunc:
471 case Instruction::FPExt:
473 case Instruction::PtrToInt:
475 case Instruction::IntToPtr:
477 case Instruction::BitCast:
479 case Instruction::AddrSpaceCast:
488 case Instruction::FNeg:
497 case Instruction::Add:
498 case Instruction::FAdd:
500 case Instruction::Sub:
501 case Instruction::FSub:
503 case Instruction::Mul:
504 case Instruction::FMul:
506 case Instruction::UDiv:
508 case Instruction::FDiv:
509 case Instruction::SDiv:
511 case Instruction::URem:
513 case Instruction::FRem:
514 case Instruction::SRem:
516 case Instruction::Shl:
518 case Instruction::LShr:
520 case Instruction::AShr:
522 case Instruction::And:
524 case Instruction::Or:
526 case Instruction::Xor:
531unsigned DXILBitcodeWriter::getTypeID(
Type *
T,
const Value *V) {
535 return VE.getTypeID(
T);
536 auto It = PointerMap.
find(V);
537 if (It != PointerMap.
end())
538 return VE.getTypeID(It->second);
542 if (
T->isPointerTy())
543 return VE.getTypeID(I8PtrTy);
544 return VE.getTypeID(
T);
547unsigned DXILBitcodeWriter::getGlobalObjectValueTypeID(
Type *
T,
549 auto It = PointerMap.
find(
G);
550 if (It != PointerMap.
end()) {
554 return VE.getTypeID(
T);
616 unsigned AbbrevToUse) {
627 Stream.EmitRecord(Code, Vals, AbbrevToUse);
632 case Attribute::Alignment:
634 case Attribute::AlwaysInline:
636 case Attribute::Builtin:
638 case Attribute::ByVal:
640 case Attribute::Convergent:
642 case Attribute::InAlloca:
644 case Attribute::Cold:
646 case Attribute::InlineHint:
648 case Attribute::InReg:
650 case Attribute::JumpTable:
652 case Attribute::MinSize:
654 case Attribute::Naked:
656 case Attribute::Nest:
658 case Attribute::NoAlias:
660 case Attribute::NoBuiltin:
662 case Attribute::NoDuplicate:
664 case Attribute::NoImplicitFloat:
666 case Attribute::NoInline:
668 case Attribute::NonLazyBind:
670 case Attribute::NonNull:
672 case Attribute::Dereferenceable:
674 case Attribute::DereferenceableOrNull:
676 case Attribute::NoRedZone:
678 case Attribute::NoReturn:
680 case Attribute::NoUnwind:
682 case Attribute::OptimizeForSize:
684 case Attribute::OptimizeNone:
686 case Attribute::ReadNone:
688 case Attribute::ReadOnly:
690 case Attribute::Returned:
692 case Attribute::ReturnsTwice:
694 case Attribute::SExt:
696 case Attribute::StackAlignment:
698 case Attribute::StackProtect:
700 case Attribute::StackProtectReq:
702 case Attribute::StackProtectStrong:
704 case Attribute::SafeStack:
706 case Attribute::StructRet:
708 case Attribute::SanitizeAddress:
710 case Attribute::SanitizeThread:
712 case Attribute::SanitizeMemory:
714 case Attribute::UWTable:
716 case Attribute::ZExt:
727 "should be stripped in DXILPrepare");
747 unsigned NumWords =
A.getActiveWords();
748 const uint64_t *RawData =
A.getRawData();
749 for (
unsigned i = 0; i < NumWords; i++)
757 if (OBO->hasNoSignedWrap())
759 if (OBO->hasNoUnsignedWrap())
765 if (FPMO->hasAllowReassoc() || FPMO->hasAllowContract())
767 if (FPMO->hasNoNaNs())
769 if (FPMO->hasNoInfs())
771 if (FPMO->hasNoSignedZeros())
773 if (FPMO->hasAllowReciprocal())
854 switch (
C.getSelectionKind()) {
873void DXILBitcodeWriter::writeAttributeGroupTable() {
874 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
875 VE.getAttributeGroups();
876 if (AttrGrps.empty())
883 unsigned AttrListIndex = Pair.first;
885 Record.push_back(
VE.getAttributeGroupID(Pair));
886 Record.push_back(AttrListIndex);
889 if (Attr.isEnumAttribute()) {
892 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");
895 }
else if (Attr.isIntAttribute()) {
896 if (Attr.getKindAsEnum() == Attribute::AttrKind::Memory) {
914 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");
917 Record.push_back(Attr.getValueAsInt());
920 StringRef
Kind = Attr.getKindAsString();
921 StringRef Val = Attr.getValueAsString();
940void DXILBitcodeWriter::writeAttributeTable() {
941 const std::vector<AttributeList> &
Attrs = VE.getAttributeLists();
947 SmallVector<uint64_t, 64>
Record;
948 for (AttributeList AL : Attrs) {
949 for (
unsigned i :
AL.indexes()) {
950 AttributeSet AS =
AL.getAttributes(i);
952 Record.push_back(VE.getAttributeGroupID({i, AS}));
963void DXILBitcodeWriter::writeTypeTable() {
967 SmallVector<uint64_t, 64> TypeVals;
969 uint64_t NumBits = VE.computeBitsRequiredForTypeIndices();
972 auto Abbv = std::make_shared<BitCodeAbbrev>();
975 Abbv->Add(BitCodeAbbrevOp(0));
976 unsigned PtrAbbrev = Stream.EmitAbbrev(std::move(Abbv));
979 Abbv = std::make_shared<BitCodeAbbrev>();
984 unsigned FunctionAbbrev = Stream.EmitAbbrev(std::move(Abbv));
987 Abbv = std::make_shared<BitCodeAbbrev>();
992 unsigned StructAnonAbbrev = Stream.EmitAbbrev(std::move(Abbv));
995 Abbv = std::make_shared<BitCodeAbbrev>();
999 unsigned StructNameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1002 Abbv = std::make_shared<BitCodeAbbrev>();
1007 unsigned StructNamedAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1010 Abbv = std::make_shared<BitCodeAbbrev>();
1014 unsigned ArrayAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1022 for (
Type *
T : TypeList) {
1023 int AbbrevToUse = 0;
1026 switch (
T->getTypeID()) {
1079 AbbrevToUse = PtrAbbrev;
1090 "dxilOpaquePtrReservedName", StructNameAbbrev);
1098 TypeVals.
push_back(getTypeID(FT->getReturnType()));
1099 for (
Type *PTy : FT->params())
1101 AbbrevToUse = FunctionAbbrev;
1109 for (
Type *ElTy :
ST->elements())
1112 if (
ST->isLiteral()) {
1114 AbbrevToUse = StructAnonAbbrev;
1116 if (
ST->isOpaque()) {
1120 AbbrevToUse = StructNamedAbbrev;
1124 if (!
ST->getName().empty())
1134 TypeVals.
push_back(AT->getNumElements());
1135 TypeVals.
push_back(getTypeID(AT->getElementType()));
1136 AbbrevToUse = ArrayAbbrev;
1144 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1145 TypeVals.
push_back(getTypeID(VT->getElementType()));
1151 Stream.EmitRecord(Code, TypeVals, AbbrevToUse);
1158void DXILBitcodeWriter::writeComdats() {
1160 for (
const Comdat *
C : VE.getComdats()) {
1163 size_t Size =
C->getName().size();
1166 for (
char Chr :
C->getName())
1173void DXILBitcodeWriter::writeValueSymbolTableForwardDecl() {}
1178void DXILBitcodeWriter::writeModuleInfo() {
1183 StringRef Triple =
"dxil-ms-dx";
1184 StringRef
DL =
"e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-"
1185 "f16:16-f32:32-f64:64-n8:16:32:64";
1194 std::map<std::string, unsigned> SectionMap;
1195 std::map<std::string, unsigned> GCMap;
1197 unsigned MaxGlobalType = 0;
1198 const auto UpdateMaxAlignment = [&
MaxAlignment](
const MaybeAlign
A) {
1202 for (
const GlobalVariable &GV : M.globals()) {
1203 UpdateMaxAlignment(GV.getAlign());
1206 MaxGlobalType = std::max(
1207 MaxGlobalType, getGlobalObjectValueTypeID(GV.getValueType(), &GV));
1208 if (GV.hasSection()) {
1210 unsigned &
Entry = SectionMap[std::string(GV.getSection())];
1213 GV.getSection(), 0 );
1214 Entry = SectionMap.size();
1218 for (
const Function &
F : M) {
1219 UpdateMaxAlignment(
F.getAlign());
1220 if (
F.hasSection()) {
1222 unsigned &
Entry = SectionMap[std::string(
F.getSection())];
1226 Entry = SectionMap.size();
1231 unsigned &
Entry = GCMap[
F.getGC()];
1235 Entry = GCMap.size();
1241 unsigned SimpleGVarAbbrev = 0;
1242 if (!M.global_empty()) {
1245 auto Abbv = std::make_shared<BitCodeAbbrev>();
1255 Abbv->Add(BitCodeAbbrevOp(0));
1257 unsigned MaxEncAlignment = getEncodedAlign(MaxAlignment);
1261 if (SectionMap.empty())
1262 Abbv->Add(BitCodeAbbrevOp(0));
1267 SimpleGVarAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1272 for (
const GlobalVariable &GV : M.globals()) {
1273 unsigned AbbrevToUse = 0;
1279 Vals.
push_back(getGlobalObjectValueTypeID(GV.getValueType(), &GV));
1281 GV.getType()->getAddressSpace() << 2 | 2 |
1282 (GV.isConstant() ? 1 : 0));
1285 GV.isDeclaration() ? 0 : (VE.getValueID(GV.getInitializer()) + 1));
1287 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1288 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1290 if (GV.isThreadLocal() ||
1293 GV.isExternallyInitialized() ||
1299 Vals.
push_back(GV.isExternallyInitialized());
1301 Vals.
push_back(GV.hasComdat() ? VE.getComdatID(GV.getComdat()) : 0);
1303 AbbrevToUse = SimpleGVarAbbrev;
1311 for (
const Function &OrigF : M) {
1312 const Function &
F = VE.getDXILFunction(OrigF);
1317 Vals.
push_back(getGlobalObjectValueTypeID(
F.getFunctionType(), &
F));
1321 Vals.
push_back(VE.getAttributeListID(
F.getAttributes()));
1322 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1323 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1329 F.hasPrologueData() ? (VE.getValueID(
F.getPrologueData()) + 1) : 0);
1331 Vals.
push_back(
F.hasComdat() ? VE.getComdatID(
F.getComdat()) : 0);
1332 Vals.
push_back(
F.hasPrefixData() ? (VE.getValueID(
F.getPrefixData()) + 1)
1335 F.hasPersonalityFn() ? (VE.getValueID(
F.getPersonalityFn()) + 1) : 0);
1337 unsigned AbbrevToUse = 0;
1343 for (
const GlobalAlias &
A : M.aliases()) {
1346 Vals.
push_back(VE.getValueID(
A.getAliasee()));
1352 unsigned AbbrevToUse = 0;
1358void DXILBitcodeWriter::writeValueAsMetadata(
1359 const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
1362 Type *Ty =
V->getType();
1367 Record.push_back(getTypeID(Ty, V));
1368 Record.push_back(VE.getValueID(V));
1373void DXILBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1374 SmallVectorImpl<uint64_t> &Record,
1376 for (
unsigned i = 0, e =
N->getNumOperands(); i != e; ++i) {
1379 "Unexpected function-local metadata");
1380 Record.push_back(VE.getMetadataOrNullID(MD));
1388void DXILBitcodeWriter::writeDILocation(
const DILocation *
N,
1389 SmallVectorImpl<uint64_t> &Record,
1392 Abbrev = createDILocationAbbrev();
1393 Record.push_back(
N->isDistinct());
1394 Record.push_back(
N->getLine());
1395 Record.push_back(
N->getColumn());
1396 Record.push_back(VE.getMetadataID(
N->getScope()));
1397 Record.push_back(VE.getMetadataOrNullID(
N->getInlinedAt()));
1406 return I < 0 ? ~(U << 1) : U << 1;
1409void DXILBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1410 SmallVectorImpl<uint64_t> &Record,
1412 Record.push_back(
N->isDistinct());
1418 Record.push_back(
Count->getValue().getSExtValue());
1424 DISubrange::BoundType LowerBound =
N->getLowerBound();
1435void DXILBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1436 SmallVectorImpl<uint64_t> &Record,
1438 Record.push_back(
N->isDistinct());
1440 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1446void DXILBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1447 SmallVectorImpl<uint64_t> &Record,
1449 Record.push_back(
N->isDistinct());
1450 Record.push_back(
N->getTag());
1451 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1452 Record.push_back(
N->getSizeInBits());
1453 Record.push_back(
N->getAlignInBits());
1454 Record.push_back(
N->getEncoding());
1460void DXILBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
1461 SmallVectorImpl<uint64_t> &Record,
1463 Record.push_back(
N->isDistinct());
1464 Record.push_back(
N->getTag());
1465 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1466 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1467 Record.push_back(
N->getLine());
1468 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1469 Record.push_back(VE.getMetadataOrNullID(
N->getBaseType()));
1470 Record.push_back(
N->getSizeInBits());
1471 Record.push_back(
N->getAlignInBits());
1472 Record.push_back(
N->getOffsetInBits());
1473 Record.push_back(
N->getFlags());
1474 Record.push_back(VE.getMetadataOrNullID(
N->getExtraData()));
1480void DXILBitcodeWriter::writeDICompositeType(
const DICompositeType *
N,
1481 SmallVectorImpl<uint64_t> &Record,
1483 Record.push_back(
N->isDistinct());
1484 Record.push_back(
N->getTag());
1485 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1486 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1487 Record.push_back(
N->getLine());
1488 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1489 Record.push_back(VE.getMetadataOrNullID(
N->getBaseType()));
1490 Record.push_back(
N->getSizeInBits());
1491 Record.push_back(
N->getAlignInBits());
1492 Record.push_back(
N->getOffsetInBits());
1493 Record.push_back(
N->getFlags());
1494 Record.push_back(VE.getMetadataOrNullID(
N->getElements().get()));
1495 Record.push_back(
N->getRuntimeLang());
1496 Record.push_back(VE.getMetadataOrNullID(
N->getVTableHolder()));
1497 Record.push_back(VE.getMetadataOrNullID(
N->getTemplateParams().get()));
1498 Record.push_back(VE.getMetadataOrNullID(
N->getRawIdentifier()));
1504void DXILBitcodeWriter::writeDISubroutineType(
const DISubroutineType *
N,
1505 SmallVectorImpl<uint64_t> &Record,
1507 Record.push_back(
N->isDistinct());
1508 Record.push_back(
N->getFlags());
1509 Record.push_back(VE.getMetadataOrNullID(
N->getTypeArray().get()));
1515void DXILBitcodeWriter::writeDIFile(
const DIFile *
N,
1516 SmallVectorImpl<uint64_t> &Record,
1518 Record.push_back(
N->isDistinct());
1519 Record.push_back(VE.getMetadataOrNullID(
N->getRawFilename()));
1520 Record.push_back(VE.getMetadataOrNullID(
N->getRawDirectory()));
1526void DXILBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
1527 SmallVectorImpl<uint64_t> &Record,
1529 Record.push_back(
N->isDistinct());
1530 Record.push_back(
N->getSourceLanguage().getUnversionedName());
1531 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1532 Record.push_back(VE.getMetadataOrNullID(
N->getRawProducer()));
1533 Record.push_back(
N->isOptimized());
1534 Record.push_back(VE.getMetadataOrNullID(
N->getRawFlags()));
1535 Record.push_back(
N->getRuntimeVersion());
1536 Record.push_back(VE.getMetadataOrNullID(
N->getRawSplitDebugFilename()));
1537 Record.push_back(
N->getEmissionKind());
1538 Record.push_back(VE.getMetadataOrNullID(
N->getEnumTypes().get()));
1539 Record.push_back(VE.getMetadataOrNullID(
N->getRetainedTypes().get()));
1540 Record.push_back(VE.getMetadataOrNullID(DebugInfo.MDExtra.lookup(
N)));
1541 Record.push_back(VE.getMetadataOrNullID(
N->getGlobalVariables().get()));
1542 Record.push_back(VE.getMetadataOrNullID(
N->getImportedEntities().get()));
1543 Record.push_back(
N->getDWOId());
1549void DXILBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
1550 SmallVectorImpl<uint64_t> &Record,
1552 Record.push_back(
N->isDistinct());
1553 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1554 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1555 Record.push_back(VE.getMetadataOrNullID(
N->getRawLinkageName()));
1556 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1557 Record.push_back(
N->getLine());
1558 Record.push_back(VE.getMetadataOrNullID(
N->getType()));
1559 Record.push_back(
N->isLocalToUnit());
1560 Record.push_back(
N->isDefinition());
1561 Record.push_back(
N->getScopeLine());
1562 Record.push_back(VE.getMetadataOrNullID(
N->getContainingType()));
1563 Record.push_back(
N->getVirtuality());
1564 Record.push_back(
N->getVirtualIndex());
1565 Record.push_back(
N->getFlags());
1566 Record.push_back(
N->isOptimized());
1567 Record.push_back(VE.getMetadataOrNullID(DebugInfo.MDExtra.lookup(
N)));
1568 Record.push_back(VE.getMetadataOrNullID(
N->getTemplateParams().get()));
1569 Record.push_back(VE.getMetadataOrNullID(
N->getDeclaration()));
1570 Record.push_back(VE.getMetadataOrNullID(
N->getRetainedNodes().get()));
1576void DXILBitcodeWriter::writeDILexicalBlock(
const DILexicalBlock *
N,
1577 SmallVectorImpl<uint64_t> &Record,
1579 Record.push_back(
N->isDistinct());
1580 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1581 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1582 Record.push_back(
N->getLine());
1583 Record.push_back(
N->getColumn());
1589void DXILBitcodeWriter::writeDILexicalBlockFile(
1590 const DILexicalBlockFile *
N, SmallVectorImpl<uint64_t> &Record,
1592 Record.push_back(
N->isDistinct());
1593 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1594 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1595 Record.push_back(
N->getDiscriminator());
1601void DXILBitcodeWriter::writeDINamespace(
const DINamespace *
N,
1602 SmallVectorImpl<uint64_t> &Record,
1604 Record.push_back(
N->isDistinct());
1605 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1606 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1607 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1614void DXILBitcodeWriter::writeDIModule(
const DIModule *
N,
1615 SmallVectorImpl<uint64_t> &Record,
1617 Record.push_back(
N->isDistinct());
1618 for (
auto &
I :
N->operands())
1619 Record.push_back(VE.getMetadataOrNullID(
I));
1625void DXILBitcodeWriter::writeDITemplateTypeParameter(
1626 const DITemplateTypeParameter *
N, SmallVectorImpl<uint64_t> &Record,
1628 Record.push_back(
N->isDistinct());
1629 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1630 Record.push_back(VE.getMetadataOrNullID(
N->getType()));
1636void DXILBitcodeWriter::writeDITemplateValueParameter(
1637 const DITemplateValueParameter *
N, SmallVectorImpl<uint64_t> &Record,
1639 Record.push_back(
N->isDistinct());
1640 Record.push_back(
N->getTag());
1641 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1642 Record.push_back(VE.getMetadataOrNullID(
N->getType()));
1643 Record.push_back(VE.getMetadataOrNullID(
N->getValue()));
1649void DXILBitcodeWriter::writeDIGlobalVariable(
const DIGlobalVariable *
N,
1650 SmallVectorImpl<uint64_t> &Record,
1652 Record.push_back(
N->isDistinct());
1653 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1654 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1655 Record.push_back(VE.getMetadataOrNullID(
N->getRawLinkageName()));
1656 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1657 Record.push_back(
N->getLine());
1658 Record.push_back(VE.getMetadataOrNullID(
N->getType()));
1659 Record.push_back(
N->isLocalToUnit());
1660 Record.push_back(
N->isDefinition());
1661 Record.push_back(VE.getMetadataOrNullID(DebugInfo.MDExtra.lookup(
N)));
1662 Record.push_back(VE.getMetadataOrNullID(
N->getStaticDataMemberDeclaration()));
1668void DXILBitcodeWriter::writeDILocalVariable(
const DILocalVariable *
N,
1669 SmallVectorImpl<uint64_t> &Record,
1671 constexpr unsigned DW_TAG_auto_variable = 0x0100;
1672 constexpr unsigned DW_TAG_arg_variable = 0x0101;
1673 Record.push_back(
N->isDistinct());
1674 assert(
N->getTag() == dwarf::DW_TAG_variable);
1675 Record.push_back(
N->getArg() ? DW_TAG_arg_variable : DW_TAG_auto_variable);
1676 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1677 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1678 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1679 Record.push_back(
N->getLine());
1680 Record.push_back(VE.getMetadataOrNullID(
N->getType()));
1681 Record.push_back(
N->getArg());
1682 Record.push_back(
N->getFlags());
1688void DXILBitcodeWriter::writeDIExpression(
const DIExpression *
N,
1689 SmallVectorImpl<uint64_t> &Record,
1691 Record.reserve(
N->getElements().size() + 1);
1693 Record.push_back(
N->isDistinct());
1694 Record.append(
N->elements_begin(),
N->elements_end());
1700void DXILBitcodeWriter::writeDIObjCProperty(
const DIObjCProperty *
N,
1701 SmallVectorImpl<uint64_t> &Record,
1706void DXILBitcodeWriter::writeDIImportedEntity(
const DIImportedEntity *
N,
1707 SmallVectorImpl<uint64_t> &Record,
1709 Record.push_back(
N->isDistinct());
1710 Record.push_back(
N->getTag());
1711 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1712 Record.push_back(VE.getMetadataOrNullID(
N->getEntity()));
1713 Record.push_back(
N->getLine());
1714 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1720unsigned DXILBitcodeWriter::createDILocationAbbrev() {
1725 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1732 return Stream.EmitAbbrev(std::move(Abbv));
1735unsigned DXILBitcodeWriter::createGenericDINodeAbbrev() {
1740 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1748 return Stream.EmitAbbrev(std::move(Abbv));
1752 SmallVectorImpl<uint64_t> &Record,
1753 std::vector<unsigned> *MDAbbrevs,
1754 std::vector<uint64_t> *IndexPos) {
1759#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
1760#include "llvm/IR/Metadata.def"
1764 IndexPos->push_back(Stream.GetCurrentBitNo());
1766 assert(
N->isResolved() &&
"Expected forward references to be resolved");
1768 switch (
N->getMetadataID()) {
1771#define HANDLE_MDNODE_LEAF(CLASS) \
1772 case Metadata::CLASS##Kind: \
1774 write##CLASS(cast<CLASS>(N), Record, \
1775 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
1777 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
1779#include "llvm/IR/Metadata.def"
1786unsigned DXILBitcodeWriter::createMetadataStringsAbbrev() {
1787 auto Abbv = std::make_shared<BitCodeAbbrev>();
1791 return Stream.EmitAbbrev(std::move(Abbv));
1794void DXILBitcodeWriter::writeMetadataStrings(
1796 if (Strings.
empty())
1799 unsigned MDSAbbrev = createMetadataStringsAbbrev();
1801 for (
const Metadata *MD : Strings) {
1812void DXILBitcodeWriter::writeModuleMetadata() {
1813 if (!VE.hasMDs() && M.named_metadata_empty())
1820 std::vector<unsigned> MDAbbrevs;
1823 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
1824 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
1825 createGenericDINodeAbbrev();
1827 unsigned NameAbbrev = 0;
1828 if (!M.named_metadata_empty()) {
1830 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1834 NameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1837 SmallVector<uint64_t, 64>
Record;
1838 writeMetadataStrings(VE.getMDStrings(), Record);
1840 std::vector<uint64_t> IndexPos;
1841 IndexPos.reserve(VE.getNonMDStrings().size());
1842 writeMetadataRecords(VE.getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);
1845 for (
const NamedMDNode &NMD : M.named_metadata()) {
1847 StringRef Str = NMD.getName();
1848 Record.append(Str.bytes_begin(), Str.bytes_end());
1853 for (
const MDNode *
N : NMD.operands())
1854 Record.push_back(VE.getMetadataID(
N));
1862void DXILBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
1867 SmallVector<uint64_t, 64>
Record;
1868 writeMetadataStrings(VE.getMDStrings(), Record);
1869 writeMetadataRecords(VE.getNonMDStrings(), Record);
1873void DXILBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
1876 SmallVector<uint64_t, 64>
Record;
1881 F.getAllMetadata(MDs);
1883 for (
const auto &
I : MDs) {
1884 if (
I.first == LLVMContext::MD_dbg)
1887 Record.push_back(VE.getMetadataID(
I.second));
1895 for (
const BasicBlock &BB :
F)
1896 for (
const Instruction &OrigI : BB) {
1900 I.getAllMetadataOtherThanDebugLoc(MDs);
1906 Record.push_back(VE.getInstructionID(&
I));
1908 for (
unsigned i = 0, e = MDs.size(); i != e; ++i) {
1909 Record.push_back(MDs[i].first);
1910 Record.push_back(VE.getMetadataID(MDs[i].second));
1919void DXILBitcodeWriter::writeModuleMetadataKinds() {
1920 SmallVector<uint64_t, 64>
Record;
1925 M.getMDKindNames(Names);
1932 for (
unsigned MDKindID = 0, e = Names.
size(); MDKindID != e; ++MDKindID) {
1933 Record.push_back(MDKindID);
1934 StringRef KName = Names[MDKindID];
1944void DXILBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
1946 if (FirstVal == LastVal)
1951 unsigned AggregateAbbrev = 0;
1952 unsigned String8Abbrev = 0;
1953 unsigned CString7Abbrev = 0;
1954 unsigned CString6Abbrev = 0;
1958 auto Abbv = std::make_shared<BitCodeAbbrev>();
1963 AggregateAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1966 Abbv = std::make_shared<BitCodeAbbrev>();
1970 String8Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1972 Abbv = std::make_shared<BitCodeAbbrev>();
1976 CString7Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1978 Abbv = std::make_shared<BitCodeAbbrev>();
1982 CString6Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1985 SmallVector<uint64_t, 64>
Record;
1988 Type *LastTy =
nullptr;
1989 for (
unsigned i = FirstVal; i != LastVal; ++i) {
1990 const Value *
V = Vals[i].first;
1992 if (
V->getType() != LastTy) {
1993 LastTy =
V->getType();
1994 Record.push_back(getTypeID(LastTy, V));
1996 CONSTANTS_SETTYPE_ABBREV);
2001 Record.push_back(
unsigned(
IA->hasSideEffects()) |
2002 unsigned(
IA->isAlignStack()) << 1 |
2003 unsigned(
IA->getDialect() & 1) << 2);
2006 StringRef AsmStr =
IA->getAsmString();
2011 StringRef ConstraintStr =
IA->getConstraintString();
2019 unsigned Code = -1U;
2020 unsigned AbbrevToUse = 0;
2021 if (
C->isNullValue()) {
2026 if (
IV->getBitWidth() <= 64) {
2027 uint64_t
V =
IV->getSExtValue();
2030 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2036 unsigned NWords =
IV->getValue().getActiveWords();
2037 const uint64_t *RawWords =
IV->getValue().getRawData();
2038 for (
unsigned i = 0; i != NWords; ++i) {
2046 if (BV->getBitWidth() <= 64) {
2047 uint64_t
V = BV->getSExtValue();
2050 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2052 unsigned NWords = BV->getValue().getActiveWords();
2053 const uint64_t *RawWords = BV->getValue().getRawData();
2054 for (
unsigned i = 0; i != NWords; ++i) {
2063 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2067 APInt api = CFP->getValueAPF().bitcastToAPInt();
2069 Record.push_back((p[1] << 48) | (p[0] >> 16));
2070 Record.push_back(p[0] & 0xffffLL);
2072 APInt api = CFP->getValueAPF().bitcastToAPInt();
2077 assert(0 &&
"Unknown FP type!");
2083 unsigned NumElts = Str->getNumElements();
2085 if (Str->isCString()) {
2090 AbbrevToUse = String8Abbrev;
2094 for (
unsigned i = 0; i != NumElts; ++i) {
2095 unsigned char V = Str->getElementAsInteger(i);
2097 isCStr7 &= (
V & 128) == 0;
2103 AbbrevToUse = CString6Abbrev;
2105 AbbrevToUse = CString7Abbrev;
2106 }
else if (
const ConstantDataSequential *CDS =
2109 Type *EltTy = CDS->getElementType();
2111 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i)
2112 Record.push_back(CDS->getElementAsInteger(i));
2114 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2119 F = CDS->getElementAsFloat(i);
2124 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2129 F = CDS->getElementAsDouble(i);
2136 for (
const Value *
Op :
C->operands())
2137 Record.push_back(VE.getValueID(
Op));
2138 AbbrevToUse = AggregateAbbrev;
2140 switch (
CE->getOpcode()) {
2146 getTypeID(
C->getOperand(0)->getType(),
C->getOperand(0)));
2147 Record.push_back(VE.getValueID(
C->getOperand(0)));
2148 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2150 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
2153 Record.push_back(VE.getValueID(
C->getOperand(0)));
2154 Record.push_back(VE.getValueID(
C->getOperand(1)));
2160 case Instruction::GetElementPtr: {
2163 if (GO->isInBounds())
2165 Record.push_back(getTypeID(GO->getSourceElementType()));
2166 for (
unsigned i = 0, e =
CE->getNumOperands(); i != e; ++i) {
2168 getTypeID(
C->getOperand(i)->getType(),
C->getOperand(i)));
2169 Record.push_back(VE.getValueID(
C->getOperand(i)));
2173 case Instruction::Select:
2175 Record.push_back(VE.getValueID(
C->getOperand(0)));
2176 Record.push_back(VE.getValueID(
C->getOperand(1)));
2177 Record.push_back(VE.getValueID(
C->getOperand(2)));
2179 case Instruction::ExtractElement:
2181 Record.push_back(getTypeID(
C->getOperand(0)->getType()));
2182 Record.push_back(VE.getValueID(
C->getOperand(0)));
2183 Record.push_back(getTypeID(
C->getOperand(1)->getType()));
2184 Record.push_back(VE.getValueID(
C->getOperand(1)));
2186 case Instruction::InsertElement:
2188 Record.push_back(VE.getValueID(
C->getOperand(0)));
2189 Record.push_back(VE.getValueID(
C->getOperand(1)));
2190 Record.push_back(getTypeID(
C->getOperand(2)->getType()));
2191 Record.push_back(VE.getValueID(
C->getOperand(2)));
2193 case Instruction::ShuffleVector:
2198 if (
C->getType() ==
C->getOperand(0)->getType()) {
2202 Record.push_back(getTypeID(
C->getOperand(0)->getType()));
2204 Record.push_back(VE.getValueID(
C->getOperand(0)));
2205 Record.push_back(VE.getValueID(
C->getOperand(1)));
2206 Record.push_back(VE.getValueID(
C->getOperand(2)));
2211 Record.push_back(getTypeID(BA->getFunction()->getType()));
2212 Record.push_back(VE.getValueID(BA->getFunction()));
2213 Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock()));
2220 Stream.EmitRecord(Code, Record, AbbrevToUse);
2227void DXILBitcodeWriter::writeModuleConstants() {
2232 for (
unsigned i = 0, e = Vals.size(); i != e; ++i) {
2234 writeConstants(i, Vals.size(),
true);
2248bool DXILBitcodeWriter::pushValueAndType(
const Value *V,
unsigned InstID,
2249 SmallVectorImpl<unsigned> &Vals) {
2250 unsigned ValID = VE.getValueID(V);
2253 if (ValID >= InstID) {
2262void DXILBitcodeWriter::pushValue(
const Value *V,
unsigned InstID,
2263 SmallVectorImpl<unsigned> &Vals) {
2264 unsigned ValID = VE.getValueID(V);
2268void DXILBitcodeWriter::pushValueSigned(
const Value *V,
unsigned InstID,
2269 SmallVectorImpl<uint64_t> &Vals) {
2270 unsigned ValID = VE.getValueID(V);
2271 int64_t diff = ((int32_t)InstID - (int32_t)ValID);
2276void DXILBitcodeWriter::writeInstruction(
const Instruction &
I,
unsigned InstID,
2277 SmallVectorImpl<unsigned> &Vals) {
2279 unsigned AbbrevToUse = 0;
2280 VE.setInstructionID(&
I);
2281 switch (
I.getOpcode()) {
2285 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2286 AbbrevToUse = (unsigned)FUNCTION_INST_CAST_ABBREV;
2292 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2293 AbbrevToUse = (unsigned)FUNCTION_INST_BINOP_ABBREV;
2294 pushValue(
I.getOperand(1), InstID, Vals);
2298 if (AbbrevToUse == (
unsigned)FUNCTION_INST_BINOP_ABBREV)
2299 AbbrevToUse = (unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV;
2305 case Instruction::GetElementPtr: {
2307 AbbrevToUse = (unsigned)FUNCTION_INST_GEP_ABBREV;
2310 Vals.
push_back(getTypeID(GEPInst.getSourceElementType()));
2311 for (
unsigned i = 0, e =
I.getNumOperands(); i != e; ++i)
2312 pushValueAndType(
I.getOperand(i), InstID, Vals);
2315 case Instruction::ExtractValue: {
2317 pushValueAndType(
I.getOperand(0), InstID, Vals);
2322 case Instruction::InsertValue: {
2324 pushValueAndType(
I.getOperand(0), InstID, Vals);
2325 pushValueAndType(
I.getOperand(1), InstID, Vals);
2330 case Instruction::Select:
2332 pushValueAndType(
I.getOperand(1), InstID, Vals);
2333 pushValue(
I.getOperand(2), InstID, Vals);
2334 pushValueAndType(
I.getOperand(0), InstID, Vals);
2336 case Instruction::ExtractElement:
2338 pushValueAndType(
I.getOperand(0), InstID, Vals);
2339 pushValueAndType(
I.getOperand(1), InstID, Vals);
2341 case Instruction::InsertElement:
2343 pushValueAndType(
I.getOperand(0), InstID, Vals);
2344 pushValue(
I.getOperand(1), InstID, Vals);
2345 pushValueAndType(
I.getOperand(2), InstID, Vals);
2347 case Instruction::ShuffleVector:
2349 pushValueAndType(
I.getOperand(0), InstID, Vals);
2350 pushValue(
I.getOperand(1), InstID, Vals);
2354 case Instruction::ICmp:
2355 case Instruction::FCmp: {
2358 pushValueAndType(
I.getOperand(0), InstID, Vals);
2359 pushValue(
I.getOperand(1), InstID, Vals);
2367 case Instruction::Ret: {
2369 unsigned NumOperands =
I.getNumOperands();
2370 if (NumOperands == 0)
2371 AbbrevToUse = (unsigned)FUNCTION_INST_RET_VOID_ABBREV;
2372 else if (NumOperands == 1) {
2373 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2374 AbbrevToUse = (unsigned)FUNCTION_INST_RET_VAL_ABBREV;
2376 for (
unsigned i = 0, e = NumOperands; i !=
e; ++i)
2377 pushValueAndType(
I.getOperand(i), InstID, Vals);
2380 case Instruction::UncondBr:
2384 case Instruction::CondBr: {
2387 Vals.
push_back(VE.getValueID(
II.getSuccessor(0)));
2388 Vals.
push_back(VE.getValueID(
II.getSuccessor(1)));
2389 pushValue(
II.getCondition(), InstID, Vals);
2391 case Instruction::Switch: {
2394 Vals.
push_back(getTypeID(
SI.getCondition()->getType()));
2395 pushValue(
SI.getCondition(), InstID, Vals);
2396 Vals.
push_back(VE.getValueID(
SI.getDefaultDest()));
2397 for (
auto Case :
SI.cases()) {
2398 Vals.
push_back(VE.getValueID(Case.getCaseValue()));
2399 Vals.
push_back(VE.getValueID(Case.getCaseSuccessor()));
2402 case Instruction::IndirectBr:
2404 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2406 pushValue(
I.getOperand(0), InstID, Vals);
2407 for (
unsigned i = 1, e =
I.getNumOperands(); i != e; ++i)
2408 Vals.
push_back(VE.getValueID(
I.getOperand(i)));
2411 case Instruction::Invoke: {
2414 FunctionType *FTy =
II->getFunctionType();
2417 Vals.
push_back(VE.getAttributeListID(
II->getAttributes()));
2419 Vals.
push_back(VE.getValueID(
II->getNormalDest()));
2420 Vals.
push_back(VE.getValueID(
II->getUnwindDest()));
2422 pushValueAndType(Callee, InstID, Vals);
2425 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
2426 pushValue(
I.getOperand(i), InstID, Vals);
2429 if (FTy->isVarArg()) {
2430 for (
unsigned i = FTy->getNumParams(), e =
I.getNumOperands() - 3; i != e;
2432 pushValueAndType(
I.getOperand(i), InstID, Vals);
2436 case Instruction::Resume:
2438 pushValueAndType(
I.getOperand(0), InstID, Vals);
2440 case Instruction::Unreachable:
2442 AbbrevToUse = (unsigned)FUNCTION_INST_UNREACHABLE_ABBREV;
2445 case Instruction::PHI: {
2458 Stream.EmitRecord(Code, Vals64, AbbrevToUse);
2463 case Instruction::LandingPad: {
2474 pushValueAndType(LP.
getClause(
I), InstID, Vals);
2479 case Instruction::Alloca: {
2483 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2484 Vals.
push_back(VE.getValueID(
I.getOperand(0)));
2486 assert(AlignRecord < 1 << 5 &&
"alignment greater than 1 << 64");
2488 AlignRecord |= 1 << 6;
2493 case Instruction::Load:
2496 pushValueAndType(
I.getOperand(0), InstID, Vals);
2499 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2500 AbbrevToUse = (unsigned)FUNCTION_INST_LOAD_ABBREV;
2510 case Instruction::Store:
2515 pushValueAndType(
I.getOperand(1), InstID, Vals);
2516 pushValueAndType(
I.getOperand(0), InstID, Vals);
2525 case Instruction::AtomicCmpXchg:
2527 pushValueAndType(
I.getOperand(0), InstID, Vals);
2528 pushValueAndType(
I.getOperand(1), InstID, Vals);
2529 pushValue(
I.getOperand(2), InstID, Vals);
2539 case Instruction::AtomicRMW:
2541 pushValueAndType(
I.getOperand(0), InstID, Vals);
2542 pushValue(
I.getOperand(1), InstID, Vals);
2550 case Instruction::Fence:
2555 case Instruction::Call: {
2568 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
2570 if (FTy->getParamType(i)->isLabelTy())
2577 if (FTy->isVarArg()) {
2578 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
2583 case Instruction::VAArg:
2585 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2586 pushValue(
I.getOperand(0), InstID, Vals);
2591 Stream.EmitRecord(Code, Vals, AbbrevToUse);
2596void DXILBitcodeWriter::writeFunctionLevelValueSymbolTable(
2597 const ValueSymbolTable &VST) {
2609 for (
auto &VI : VST) {
2610 const Value &
V = VE.getDXILValue(*
VI.second);
2615 return A->first() <
B->first();
2618 for (
const ValueName *SI : SortedTable) {
2623 bool isChar6 =
true;
2624 for (
const char *
C =
Name.getKeyData(), *
E =
C +
Name.getKeyLength();
2628 if ((
unsigned char)*
C & 128) {
2634 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
2642 AbbrevToUse = VST_BBENTRY_6_ABBREV;
2646 AbbrevToUse = VST_ENTRY_6_ABBREV;
2648 AbbrevToUse = VST_ENTRY_7_ABBREV;
2651 NameVals.
push_back(VE.getValueID(
SI->getValue()));
2652 for (
const char *
P =
Name.getKeyData(),
2653 *
E =
Name.getKeyData() +
Name.getKeyLength();
2658 Stream.EmitRecord(Code, NameVals, AbbrevToUse);
2665void DXILBitcodeWriter::writeFunction(
const Function &
F) {
2667 VE.incorporateFunction(
F);
2673 Vals.
push_back(VE.getBasicBlocks().size());
2678 unsigned CstStart, CstEnd;
2679 VE.getFunctionConstantRange(CstStart, CstEnd);
2680 writeConstants(CstStart, CstEnd,
false);
2683 writeFunctionMetadata(
F);
2686 unsigned InstID = CstEnd;
2688 bool NeedsMetadataAttachment =
F.hasMetadata();
2690 DILocation *LastDL =
nullptr;
2698 writeInstruction(
I, InstID, Vals);
2700 if (!
I.getType()->isVoidTy())
2704 NeedsMetadataAttachment |=
I.hasMetadataOtherThanDebugLoc();
2707 DILocation *
DL =
I.getDebugLoc();
2719 Vals.
push_back(VE.getMetadataOrNullID(
DL->getScope()));
2720 Vals.
push_back(VE.getMetadataOrNullID(
DL->getInlinedAt()));
2728 if (
auto *Symtab =
F.getValueSymbolTable())
2729 writeFunctionLevelValueSymbolTable(*Symtab);
2731 if (NeedsMetadataAttachment)
2732 writeFunctionMetadataAttachment(
F);
2739void DXILBitcodeWriter::writeBlockInfo() {
2743 Stream.EnterBlockInfoBlock();
2746 auto Abbv = std::make_shared<BitCodeAbbrev>();
2752 std::move(Abbv)) != VST_ENTRY_8_ABBREV)
2753 assert(
false &&
"Unexpected abbrev ordering!");
2757 auto Abbv = std::make_shared<BitCodeAbbrev>();
2763 std::move(Abbv)) != VST_ENTRY_7_ABBREV)
2764 assert(
false &&
"Unexpected abbrev ordering!");
2767 auto Abbv = std::make_shared<BitCodeAbbrev>();
2773 std::move(Abbv)) != VST_ENTRY_6_ABBREV)
2774 assert(
false &&
"Unexpected abbrev ordering!");
2777 auto Abbv = std::make_shared<BitCodeAbbrev>();
2783 std::move(Abbv)) != VST_BBENTRY_6_ABBREV)
2784 assert(
false &&
"Unexpected abbrev ordering!");
2788 auto Abbv = std::make_shared<BitCodeAbbrev>();
2791 VE.computeBitsRequiredForTypeIndices()));
2793 CONSTANTS_SETTYPE_ABBREV)
2794 assert(
false &&
"Unexpected abbrev ordering!");
2798 auto Abbv = std::make_shared<BitCodeAbbrev>();
2802 CONSTANTS_INTEGER_ABBREV)
2803 assert(
false &&
"Unexpected abbrev ordering!");
2807 auto Abbv = std::make_shared<BitCodeAbbrev>();
2811 VE.computeBitsRequiredForTypeIndices()));
2815 CONSTANTS_CE_CAST_Abbrev)
2816 assert(
false &&
"Unexpected abbrev ordering!");
2819 auto Abbv = std::make_shared<BitCodeAbbrev>();
2822 CONSTANTS_NULL_Abbrev)
2823 assert(
false &&
"Unexpected abbrev ordering!");
2829 auto Abbv = std::make_shared<BitCodeAbbrev>();
2833 VE.computeBitsRequiredForTypeIndices()));
2837 (
unsigned)FUNCTION_INST_LOAD_ABBREV)
2838 assert(
false &&
"Unexpected abbrev ordering!");
2841 auto Abbv = std::make_shared<BitCodeAbbrev>();
2847 (
unsigned)FUNCTION_INST_BINOP_ABBREV)
2848 assert(
false &&
"Unexpected abbrev ordering!");
2851 auto Abbv = std::make_shared<BitCodeAbbrev>();
2858 (
unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV)
2859 assert(
false &&
"Unexpected abbrev ordering!");
2862 auto Abbv = std::make_shared<BitCodeAbbrev>();
2866 VE.computeBitsRequiredForTypeIndices()));
2869 (
unsigned)FUNCTION_INST_CAST_ABBREV)
2870 assert(
false &&
"Unexpected abbrev ordering!");
2874 auto Abbv = std::make_shared<BitCodeAbbrev>();
2877 (
unsigned)FUNCTION_INST_RET_VOID_ABBREV)
2878 assert(
false &&
"Unexpected abbrev ordering!");
2881 auto Abbv = std::make_shared<BitCodeAbbrev>();
2885 (
unsigned)FUNCTION_INST_RET_VAL_ABBREV)
2886 assert(
false &&
"Unexpected abbrev ordering!");
2889 auto Abbv = std::make_shared<BitCodeAbbrev>();
2892 (
unsigned)FUNCTION_INST_UNREACHABLE_ABBREV)
2893 assert(
false &&
"Unexpected abbrev ordering!");
2896 auto Abbv = std::make_shared<BitCodeAbbrev>();
2904 (
unsigned)FUNCTION_INST_GEP_ABBREV)
2905 assert(
false &&
"Unexpected abbrev ordering!");
2911void DXILBitcodeWriter::writeModuleVersion() {
2926 DXILBitcodeWriter::writeModuleVersion();
2932 writeAttributeGroupTable();
2935 writeAttributeTable();
2947 writeModuleConstants();
2950 writeModuleMetadataKinds();
2953 writeModuleMetadata();
2958 writeFunctionLevelValueSymbolTable(M.getValueSymbolTable());
2962 if (!
F.isDeclaration())
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)
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
static MaybeAlign getAlign(Value *Ptr)
Module.h This file contains the declarations for the Module class.
static constexpr Value * getValue(Ty &ValueOrUse)
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
uint64_t IntrinsicInst * II
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
static const uint32_t IV[8]
Class for arbitrary precision integers.
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
int64_t getSExtValue() const
Get sign extended value.
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
bool isUsedWithInAlloca() const
Return true if this alloca is used as an inalloca argument to a call.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
Check if the array is empty.
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ Min
*p = old <signed v ? 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.
This class holds the attributes for a particular argument, parameter, function, or return value.
bool hasAttributes() const
Return true if attributes exists in this set.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
@ None
No attributes have been set.
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
@ EndAttrKinds
Sentinel value useful for loops.
InstListType::const_iterator const_iterator
BitCodeAbbrevOp - This describes one or more operands in an abbreviation.
static bool isChar6(char C)
isChar6 - Return true if this character is legal in the Char6 encoding.
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 isMustTailCall() const
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
iterator find(const_arg_type_t< KeyT > Val)
BasicBlockListType::const_iterator const_iterator
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.
@ DLLImportStorageClass
Function to be imported from DLL.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AppendingLinkage
Special purpose, only applies to global arrays.
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
DLLStorageClassTypes getDLLStorageClass() const
idx_iterator idx_end() const
idx_iterator idx_begin() 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
const unsigned char * bytes_end() const
bool doesNotAccessMemory() const
Whether this function accesses no memory.
bool onlyAccessesArgPointees() const
Whether this function only (at most) accesses argument memory.
bool onlyReadsMemory() const
Whether this function only (at most) reads memory.
A Module instance is used to store all the information related to an LLVM module.
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
constexpr size_t size() const
Get the string size.
Utility for building string tables with deduplicated suffixes.
Triple - Helper class for working with autoconf configuration names.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isX86_FP80Ty() const
Return true if this is x86 long double.
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
@ X86_AMXTyID
AMX vectors (8192 bits, X86 specific)
@ TypedPointerTyID
Typed pointer used by some GPU targets.
@ HalfTyID
16-bit floating point type
@ TargetExtTyID
Target extension type.
@ VoidTyID
type with no size
@ ScalableVectorTyID
Scalable SIMD vector type.
@ FloatTyID
32-bit floating point type
@ IntegerTyID
Arbitrary bit width integers.
@ FixedVectorTyID
Fixed width SIMD vector type.
@ BFloatTyID
16-bit floating point type (7-bit significand)
@ DoubleTyID
64-bit floating point type
@ X86_FP80TyID
80-bit floating point type (X87)
@ PPC_FP128TyID
128-bit floating point type (two 64-bits, PowerPC)
@ ByteTyID
Arbitrary bit width bytes.
@ FP128TyID
128-bit floating point type (112-bit significand)
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
bool isFP128Ty() const
Return true if this is 'fp128'.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
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.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
BitcodeWriter(SmallVectorImpl< char > &Buffer)
Create a BitcodeWriter that writes to Buffer.
void writeModule(const Module &M, const DXILDebugInfoMap &DebugInfo)
Write the specified module to the buffer specified at construction time.
static void emitWideAPInt(SmallVectorImpl< uint64_t > &Vals, const APInt &A)
static unsigned getEncodedThreadLocalMode(const GlobalValue &GV)
static unsigned getEncodedCastOpcode(unsigned Opcode)
Begin dxil::BitcodeWriterBase Implementation.
static void writeStringRecord(BitstreamWriter &Stream, unsigned Code, StringRef Str, unsigned AbbrevToUse)
static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind)
static unsigned getEncodedDLLStorageClass(const GlobalValue &GV)
static unsigned getEncodedOrdering(AtomicOrdering Ordering)
static unsigned getEncodedLinkage(const GlobalValue::LinkageTypes Linkage)
static unsigned getEncodedVisibility(const GlobalValue &GV)
void write()
Emit the current module to the bitstream.
static void writeIdentificationBlock(BitstreamWriter &Stream)
static unsigned getEncodedBinaryOpcode(unsigned Opcode)
static void emitSignedInt64(SmallVectorImpl< uint64_t > &Vals, uint64_t V)
static unsigned getEncodedUnaryOpcode(unsigned Opcode)
DXILBitcodeWriter(const Module &M, SmallVectorImpl< char > &Buffer, StringTableBuilder &StrtabBuilder, BitstreamWriter &Stream, const DXILDebugInfoMap &DebugInfo)
Constructs a ModuleBitcodeWriter object for the given Module, writing to the provided Buffer.
static unsigned getEncodedRMWOperation(AtomicRMWInst::BinOp Op)
static unsigned getEncodedComdatSelectionKind(const Comdat &C)
static uint64_t getOptimizationFlags(const Value *V)
std::pair< unsigned, AttributeSet > IndexAndAttrSet
Attribute groups as encoded in bitcode are almost AttributeSets, but they include the AttributeList i...
std::vector< std::pair< const Value *, unsigned > > ValueList
std::vector< Type * > TypeList
This class implements an extremely fast bulk output stream that can only output to a stream.
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.
@ C
The default llvm calling convention, compatible with C.
Predicate getPredicate(unsigned Condition, unsigned Hint)
Return predicate consisting of specified condition and hint bits.
constexpr bool isAtomic(const T &...O)
@ CE
Windows NT (Windows on ARM)
@ METADATA_TEMPLATE_VALUE
@ METADATA_LEXICAL_BLOCK_FILE
@ METADATA_SUBROUTINE_TYPE
@ METADATA_IMPORTED_ENTITY
@ METADATA_COMPOSITE_TYPE
@ CST_CODE_CE_INBOUNDS_GEP
@ 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_RETURNS_TWICE
@ ATTR_KIND_NON_LAZY_BIND
@ ATTR_KIND_DEREFERENCEABLE
@ ATTR_KIND_OPTIMIZE_NONE
@ ATTR_KIND_DEREFERENCEABLE_OR_NULL
@ ATTR_KIND_ALWAYS_INLINE
@ ATTR_KIND_SANITIZE_THREAD
@ PARAMATTR_GROUP_BLOCK_ID
@ MODULE_CODE_SECTIONNAME
@ FUNC_CODE_INST_LANDINGPAD
@ FUNC_CODE_INST_EXTRACTVAL
@ 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_INSERTVAL
@ FUNC_CODE_DECLAREBLOCKS
@ FUNC_CODE_INST_INSERTELT
@ FUNC_CODE_INST_SHUFFLEVEC
@ FUNC_CODE_INST_UNREACHABLE
@ FIRST_APPLICATION_ABBREV
@ PARAMATTR_GRP_CODE_ENTRY
An analysis to compute the PointerTypes for pointers in a Module.
DenseMap< const Value *, Type * > PointerTypeMap
void WriteDXILToFile(const Module &M, raw_ostream &Out, const DXILDebugInfoMap &DebugInfo)
Write the specified module to the specified raw output stream.
NodeAddr< CodeNode * > Code
friend class Instruction
Iterator for Instructions in a `BasicBlock.
constexpr size_t MaxAlignment
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.
StringMapEntry< Value * > ValueName
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.
unsigned encode(MaybeAlign A)
Returns a representation of the alignment that encodes undefined as 0.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
bool isa_and_nonnull(const Y &Val)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
void sort(IteratorTy Start, IteratorTy End)
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
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...
AtomicOrdering
Atomic ordering for LLVM's memory model.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
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.
unsigned Log2(Align A)
Returns the log2 of the alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Struct that holds a reference to a particular GUID in a global value summary.