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;
141 : I8Ty(
Type::getInt8Ty(M.getContext())),
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) {
532 if (!
T->isPointerTy() &&
536 return VE.getTypeID(
T);
537 auto It = PointerMap.
find(V);
538 if (It != PointerMap.
end())
539 return VE.getTypeID(It->second);
545 return VE.getTypeID(
T);
546 return VE.getTypeID(I8PtrTy);
549unsigned DXILBitcodeWriter::getGlobalObjectValueTypeID(
Type *
T,
551 auto It = PointerMap.
find(
G);
552 if (It != PointerMap.
end()) {
556 return VE.getTypeID(
T);
618 unsigned AbbrevToUse) {
629 Stream.EmitRecord(Code, Vals, AbbrevToUse);
634 case Attribute::Alignment:
636 case Attribute::AlwaysInline:
638 case Attribute::Builtin:
640 case Attribute::ByVal:
642 case Attribute::Convergent:
644 case Attribute::InAlloca:
646 case Attribute::Cold:
648 case Attribute::InlineHint:
650 case Attribute::InReg:
652 case Attribute::JumpTable:
654 case Attribute::MinSize:
656 case Attribute::Naked:
658 case Attribute::Nest:
660 case Attribute::NoAlias:
662 case Attribute::NoBuiltin:
664 case Attribute::NoDuplicate:
666 case Attribute::NoImplicitFloat:
668 case Attribute::NoInline:
670 case Attribute::NonLazyBind:
672 case Attribute::NonNull:
674 case Attribute::Dereferenceable:
676 case Attribute::DereferenceableOrNull:
678 case Attribute::NoRedZone:
680 case Attribute::NoReturn:
682 case Attribute::NoUnwind:
684 case Attribute::OptimizeForSize:
686 case Attribute::OptimizeNone:
688 case Attribute::ReadNone:
690 case Attribute::ReadOnly:
692 case Attribute::Returned:
694 case Attribute::ReturnsTwice:
696 case Attribute::SExt:
698 case Attribute::StackAlignment:
700 case Attribute::StackProtect:
702 case Attribute::StackProtectReq:
704 case Attribute::StackProtectStrong:
706 case Attribute::SafeStack:
708 case Attribute::StructRet:
710 case Attribute::SanitizeAddress:
712 case Attribute::SanitizeThread:
714 case Attribute::SanitizeMemory:
716 case Attribute::UWTable:
718 case Attribute::ZExt:
729 "should be stripped in DXILPrepare");
749 unsigned NumWords =
A.getActiveWords();
750 const uint64_t *RawData =
A.getRawData();
751 for (
unsigned i = 0; i < NumWords; i++)
759 if (OBO->hasNoSignedWrap())
761 if (OBO->hasNoUnsignedWrap())
767 if (FPMO->hasAllowReassoc() || FPMO->hasAllowContract())
769 if (FPMO->hasNoNaNs())
771 if (FPMO->hasNoInfs())
773 if (FPMO->hasNoSignedZeros())
775 if (FPMO->hasAllowReciprocal())
856 switch (
C.getSelectionKind()) {
875void DXILBitcodeWriter::writeAttributeGroupTable() {
876 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
877 VE.getAttributeGroups();
878 if (AttrGrps.empty())
885 unsigned AttrListIndex = Pair.first;
887 Record.push_back(
VE.getAttributeGroupID(Pair));
888 Record.push_back(AttrListIndex);
891 if (Attr.isEnumAttribute()) {
894 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");
897 }
else if (Attr.isIntAttribute()) {
898 if (Attr.getKindAsEnum() == Attribute::AttrKind::Memory) {
916 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");
919 Record.push_back(Attr.getValueAsInt());
922 StringRef
Kind = Attr.getKindAsString();
923 StringRef Val = Attr.getValueAsString();
942void DXILBitcodeWriter::writeAttributeTable() {
943 const std::vector<AttributeList> &
Attrs = VE.getAttributeLists();
949 SmallVector<uint64_t, 64>
Record;
950 for (AttributeList AL : Attrs) {
951 for (
unsigned i :
AL.indexes()) {
952 AttributeSet AS =
AL.getAttributes(i);
954 Record.push_back(VE.getAttributeGroupID({i, AS}));
965void DXILBitcodeWriter::writeTypeTable() {
969 SmallVector<uint64_t, 64> TypeVals;
971 uint64_t NumBits = VE.computeBitsRequiredForTypeIndices();
974 auto Abbv = std::make_shared<BitCodeAbbrev>();
977 Abbv->Add(BitCodeAbbrevOp(0));
978 unsigned PtrAbbrev = Stream.EmitAbbrev(std::move(Abbv));
981 Abbv = std::make_shared<BitCodeAbbrev>();
986 unsigned FunctionAbbrev = Stream.EmitAbbrev(std::move(Abbv));
989 Abbv = std::make_shared<BitCodeAbbrev>();
994 unsigned StructAnonAbbrev = Stream.EmitAbbrev(std::move(Abbv));
997 Abbv = std::make_shared<BitCodeAbbrev>();
1001 unsigned StructNameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1004 Abbv = std::make_shared<BitCodeAbbrev>();
1009 unsigned StructNamedAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1012 Abbv = std::make_shared<BitCodeAbbrev>();
1016 unsigned ArrayAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1024 for (
Type *
T : TypeList) {
1025 int AbbrevToUse = 0;
1028 switch (
T->getTypeID()) {
1081 AbbrevToUse = PtrAbbrev;
1092 "dxilOpaquePtrReservedName", StructNameAbbrev);
1100 TypeVals.
push_back(getTypeID(FT->getReturnType()));
1101 for (
Type *PTy : FT->params())
1103 AbbrevToUse = FunctionAbbrev;
1111 for (
Type *ElTy :
ST->elements())
1114 if (
ST->isLiteral()) {
1116 AbbrevToUse = StructAnonAbbrev;
1118 if (
ST->isOpaque()) {
1122 AbbrevToUse = StructNamedAbbrev;
1126 if (!
ST->getName().empty())
1136 TypeVals.
push_back(AT->getNumElements());
1137 TypeVals.
push_back(getTypeID(AT->getElementType()));
1138 AbbrevToUse = ArrayAbbrev;
1146 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1147 TypeVals.
push_back(getTypeID(VT->getElementType()));
1153 Stream.EmitRecord(Code, TypeVals, AbbrevToUse);
1160void DXILBitcodeWriter::writeComdats() {
1162 for (
const Comdat *
C : VE.getComdats()) {
1165 size_t Size =
C->getName().size();
1168 for (
char Chr :
C->getName())
1175void DXILBitcodeWriter::writeValueSymbolTableForwardDecl() {}
1180void DXILBitcodeWriter::writeModuleInfo() {
1185 StringRef Triple =
"dxil-ms-dx";
1186 StringRef
DL =
"e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-"
1187 "f16:16-f32:32-f64:64-n8:16:32:64";
1191 if (!M.getModuleInlineAsm().empty())
1197 std::map<std::string, unsigned> SectionMap;
1198 std::map<std::string, unsigned> GCMap;
1200 unsigned MaxGlobalType = 0;
1201 const auto UpdateMaxAlignment = [&
MaxAlignment](
const MaybeAlign
A) {
1205 for (
const GlobalVariable &GV : M.globals()) {
1206 UpdateMaxAlignment(GV.getAlign());
1209 MaxGlobalType = std::max(
1210 MaxGlobalType, getGlobalObjectValueTypeID(GV.getValueType(), &GV));
1211 if (GV.hasSection()) {
1213 unsigned &
Entry = SectionMap[std::string(GV.getSection())];
1216 GV.getSection(), 0 );
1217 Entry = SectionMap.size();
1221 for (
const Function &
F : M) {
1222 UpdateMaxAlignment(
F.getAlign());
1223 if (
F.hasSection()) {
1225 unsigned &
Entry = SectionMap[std::string(
F.getSection())];
1229 Entry = SectionMap.size();
1234 unsigned &
Entry = GCMap[
F.getGC()];
1238 Entry = GCMap.size();
1244 unsigned SimpleGVarAbbrev = 0;
1245 if (!M.global_empty()) {
1248 auto Abbv = std::make_shared<BitCodeAbbrev>();
1258 Abbv->Add(BitCodeAbbrevOp(0));
1260 unsigned MaxEncAlignment = getEncodedAlign(MaxAlignment);
1264 if (SectionMap.empty())
1265 Abbv->Add(BitCodeAbbrevOp(0));
1270 SimpleGVarAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1275 for (
const GlobalVariable &GV : M.globals()) {
1276 unsigned AbbrevToUse = 0;
1282 Vals.
push_back(getGlobalObjectValueTypeID(GV.getValueType(), &GV));
1284 GV.getType()->getAddressSpace() << 2 | 2 |
1285 (GV.isConstant() ? 1 : 0));
1288 GV.isDeclaration() ? 0 : (VE.getValueID(GV.getInitializer()) + 1));
1290 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1291 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1293 if (GV.isThreadLocal() ||
1296 GV.isExternallyInitialized() ||
1302 Vals.
push_back(GV.isExternallyInitialized());
1304 Vals.
push_back(GV.hasComdat() ? VE.getComdatID(GV.getComdat()) : 0);
1306 AbbrevToUse = SimpleGVarAbbrev;
1314 for (
const Function &
F : M) {
1318 Vals.
push_back(getGlobalObjectValueTypeID(
F.getFunctionType(), &
F));
1322 Vals.
push_back(VE.getAttributeListID(
F.getAttributes()));
1323 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1324 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1330 F.hasPrologueData() ? (VE.getValueID(
F.getPrologueData()) + 1) : 0);
1332 Vals.
push_back(
F.hasComdat() ? VE.getComdatID(
F.getComdat()) : 0);
1333 Vals.
push_back(
F.hasPrefixData() ? (VE.getValueID(
F.getPrefixData()) + 1)
1336 F.hasPersonalityFn() ? (VE.getValueID(
F.getPersonalityFn()) + 1) : 0);
1338 unsigned AbbrevToUse = 0;
1344 for (
const GlobalAlias &
A : M.aliases()) {
1347 Vals.
push_back(VE.getValueID(
A.getAliasee()));
1353 unsigned AbbrevToUse = 0;
1359void DXILBitcodeWriter::writeValueAsMetadata(
1360 const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
1363 Type *Ty =
V->getType();
1368 Record.push_back(getTypeID(Ty, V));
1369 Record.push_back(VE.getValueID(V));
1374void DXILBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1375 SmallVectorImpl<uint64_t> &Record,
1377 for (
unsigned i = 0, e =
N->getNumOperands(); i != e; ++i) {
1380 "Unexpected function-local metadata");
1381 Record.push_back(VE.getMetadataOrNullID(MD));
1389void DXILBitcodeWriter::writeDILocation(
const DILocation *
N,
1390 SmallVectorImpl<uint64_t> &Record,
1393 Abbrev = createDILocationAbbrev();
1394 Record.push_back(
N->isDistinct());
1395 Record.push_back(
N->getLine());
1396 Record.push_back(
N->getColumn());
1397 Record.push_back(VE.getMetadataID(
N->getScope()));
1398 Record.push_back(VE.getMetadataOrNullID(
N->getInlinedAt()));
1407 return I < 0 ? ~(U << 1) : U << 1;
1410void DXILBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1411 SmallVectorImpl<uint64_t> &Record,
1413 Record.push_back(
N->isDistinct());
1419 Record.push_back(
Count->getValue().getSExtValue());
1425 DISubrange::BoundType LowerBound =
N->getLowerBound();
1436void DXILBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1437 SmallVectorImpl<uint64_t> &Record,
1439 Record.push_back(
N->isDistinct());
1441 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1447void DXILBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1448 SmallVectorImpl<uint64_t> &Record,
1450 Record.push_back(
N->isDistinct());
1451 Record.push_back(
N->getTag());
1452 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1453 Record.push_back(
N->getSizeInBits());
1454 Record.push_back(
N->getAlignInBits());
1455 Record.push_back(
N->getEncoding());
1461void DXILBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
1462 SmallVectorImpl<uint64_t> &Record,
1464 Record.push_back(
N->isDistinct());
1465 Record.push_back(
N->getTag());
1466 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1467 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1468 Record.push_back(
N->getLine());
1469 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1470 Record.push_back(VE.getMetadataOrNullID(
N->getBaseType()));
1471 Record.push_back(
N->getSizeInBits());
1472 Record.push_back(
N->getAlignInBits());
1473 Record.push_back(
N->getOffsetInBits());
1474 Record.push_back(
N->getFlags());
1475 Record.push_back(VE.getMetadataOrNullID(
N->getExtraData()));
1481void DXILBitcodeWriter::writeDICompositeType(
const DICompositeType *
N,
1482 SmallVectorImpl<uint64_t> &Record,
1484 Record.push_back(
N->isDistinct());
1485 Record.push_back(
N->getTag());
1486 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1487 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1488 Record.push_back(
N->getLine());
1489 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1490 Record.push_back(VE.getMetadataOrNullID(
N->getBaseType()));
1491 Record.push_back(
N->getSizeInBits());
1492 Record.push_back(
N->getAlignInBits());
1493 Record.push_back(
N->getOffsetInBits());
1494 Record.push_back(
N->getFlags());
1495 Record.push_back(VE.getMetadataOrNullID(
N->getElements().get()));
1496 Record.push_back(
N->getRuntimeLang());
1497 Record.push_back(VE.getMetadataOrNullID(
N->getVTableHolder()));
1498 Record.push_back(VE.getMetadataOrNullID(
N->getTemplateParams().get()));
1499 Record.push_back(VE.getMetadataOrNullID(
N->getRawIdentifier()));
1505void DXILBitcodeWriter::writeDISubroutineType(
const DISubroutineType *
N,
1506 SmallVectorImpl<uint64_t> &Record,
1508 Record.push_back(
N->isDistinct());
1509 Record.push_back(
N->getFlags());
1510 Record.push_back(VE.getMetadataOrNullID(
N->getTypeArray().get()));
1516void DXILBitcodeWriter::writeDIFile(
const DIFile *
N,
1517 SmallVectorImpl<uint64_t> &Record,
1519 Record.push_back(
N->isDistinct());
1520 Record.push_back(VE.getMetadataOrNullID(
N->getRawFilename()));
1521 Record.push_back(VE.getMetadataOrNullID(
N->getRawDirectory()));
1527void DXILBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
1528 SmallVectorImpl<uint64_t> &Record,
1530 Record.push_back(
N->isDistinct());
1531 DISourceLanguageName Lang =
N->getSourceLanguage();
1538 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1539 Record.push_back(VE.getMetadataOrNullID(
N->getRawProducer()));
1540 Record.push_back(
N->isOptimized());
1541 Record.push_back(VE.getMetadataOrNullID(
N->getRawFlags()));
1542 Record.push_back(
N->getRuntimeVersion());
1543 Record.push_back(VE.getMetadataOrNullID(
N->getRawSplitDebugFilename()));
1544 Record.push_back(
N->getEmissionKind());
1545 Record.push_back(VE.getMetadataOrNullID(
N->getEnumTypes().get()));
1546 Record.push_back(VE.getMetadataOrNullID(
N->getRetainedTypes().get()));
1548 Record.push_back(VE.getMetadataOrNullID(
N->getGlobalVariables().get()));
1549 Record.push_back(VE.getMetadataOrNullID(
N->getImportedEntities().get()));
1550 Record.push_back(
N->getDWOId());
1556void DXILBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
1557 SmallVectorImpl<uint64_t> &Record,
1559 Record.push_back(
N->isDistinct());
1560 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1561 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1562 Record.push_back(VE.getMetadataOrNullID(
N->getRawLinkageName()));
1563 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1564 Record.push_back(
N->getLine());
1565 Record.push_back(VE.getMetadataOrNullID(
N->getType()));
1566 Record.push_back(
N->isLocalToUnit());
1567 Record.push_back(
N->isDefinition());
1568 Record.push_back(
N->getScopeLine());
1569 Record.push_back(VE.getMetadataOrNullID(
N->getContainingType()));
1570 Record.push_back(
N->getVirtuality());
1571 Record.push_back(
N->getVirtualIndex());
1572 Record.push_back(
N->getFlags());
1573 Record.push_back(
N->isOptimized());
1574 Record.push_back(VE.getMetadataOrNullID(
N->getRawUnit()));
1575 Record.push_back(VE.getMetadataOrNullID(
N->getTemplateParams().get()));
1576 Record.push_back(VE.getMetadataOrNullID(
N->getDeclaration()));
1577 Record.push_back(VE.getMetadataOrNullID(
N->getRetainedNodes().get()));
1583void DXILBitcodeWriter::writeDILexicalBlock(
const DILexicalBlock *
N,
1584 SmallVectorImpl<uint64_t> &Record,
1586 Record.push_back(
N->isDistinct());
1587 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1588 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1589 Record.push_back(
N->getLine());
1590 Record.push_back(
N->getColumn());
1596void DXILBitcodeWriter::writeDILexicalBlockFile(
1597 const DILexicalBlockFile *
N, SmallVectorImpl<uint64_t> &Record,
1599 Record.push_back(
N->isDistinct());
1600 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1601 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1602 Record.push_back(
N->getDiscriminator());
1608void DXILBitcodeWriter::writeDINamespace(
const DINamespace *
N,
1609 SmallVectorImpl<uint64_t> &Record,
1611 Record.push_back(
N->isDistinct());
1612 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1613 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1614 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1621void DXILBitcodeWriter::writeDIModule(
const DIModule *
N,
1622 SmallVectorImpl<uint64_t> &Record,
1624 Record.push_back(
N->isDistinct());
1625 for (
auto &
I :
N->operands())
1626 Record.push_back(VE.getMetadataOrNullID(
I));
1632void DXILBitcodeWriter::writeDITemplateTypeParameter(
1633 const DITemplateTypeParameter *
N, SmallVectorImpl<uint64_t> &Record,
1635 Record.push_back(
N->isDistinct());
1636 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1637 Record.push_back(VE.getMetadataOrNullID(
N->getType()));
1643void DXILBitcodeWriter::writeDITemplateValueParameter(
1644 const DITemplateValueParameter *
N, SmallVectorImpl<uint64_t> &Record,
1646 Record.push_back(
N->isDistinct());
1647 Record.push_back(
N->getTag());
1648 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1649 Record.push_back(VE.getMetadataOrNullID(
N->getType()));
1650 Record.push_back(VE.getMetadataOrNullID(
N->getValue()));
1656void DXILBitcodeWriter::writeDIGlobalVariable(
const DIGlobalVariable *
N,
1657 SmallVectorImpl<uint64_t> &Record,
1659 Record.push_back(
N->isDistinct());
1660 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1661 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1662 Record.push_back(VE.getMetadataOrNullID(
N->getRawLinkageName()));
1663 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1664 Record.push_back(
N->getLine());
1665 Record.push_back(VE.getMetadataOrNullID(
N->getType()));
1666 Record.push_back(
N->isLocalToUnit());
1667 Record.push_back(
N->isDefinition());
1669 Record.push_back(VE.getMetadataOrNullID(
N->getStaticDataMemberDeclaration()));
1675void DXILBitcodeWriter::writeDILocalVariable(
const DILocalVariable *
N,
1676 SmallVectorImpl<uint64_t> &Record,
1678 constexpr unsigned DW_TAG_auto_variable = 0x0100;
1679 constexpr unsigned DW_TAG_arg_variable = 0x0101;
1680 Record.push_back(
N->isDistinct());
1681 assert(
N->getTag() == dwarf::DW_TAG_variable);
1682 Record.push_back(
N->getArg() ? DW_TAG_arg_variable : DW_TAG_auto_variable);
1683 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1684 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1685 Record.push_back(VE.getMetadataOrNullID(
N->getFile()));
1686 Record.push_back(
N->getLine());
1687 Record.push_back(VE.getMetadataOrNullID(
N->getType()));
1688 Record.push_back(
N->getArg());
1689 Record.push_back(
N->getFlags());
1695void DXILBitcodeWriter::writeDIExpression(
const DIExpression *
N,
1696 SmallVectorImpl<uint64_t> &Record,
1698 Record.reserve(
N->getElements().size() + 1);
1700 Record.push_back(
N->isDistinct());
1701 Record.append(
N->elements_begin(),
N->elements_end());
1707void DXILBitcodeWriter::writeDIObjCProperty(
const DIObjCProperty *
N,
1708 SmallVectorImpl<uint64_t> &Record,
1713void DXILBitcodeWriter::writeDIImportedEntity(
const DIImportedEntity *
N,
1714 SmallVectorImpl<uint64_t> &Record,
1716 Record.push_back(
N->isDistinct());
1717 Record.push_back(
N->getTag());
1718 Record.push_back(VE.getMetadataOrNullID(
N->getScope()));
1719 Record.push_back(VE.getMetadataOrNullID(
N->getEntity()));
1720 Record.push_back(
N->getLine());
1721 Record.push_back(VE.getMetadataOrNullID(
N->getRawName()));
1727unsigned DXILBitcodeWriter::createDILocationAbbrev() {
1732 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1739 return Stream.EmitAbbrev(std::move(Abbv));
1742unsigned DXILBitcodeWriter::createGenericDINodeAbbrev() {
1747 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1755 return Stream.EmitAbbrev(std::move(Abbv));
1759 SmallVectorImpl<uint64_t> &Record,
1760 std::vector<unsigned> *MDAbbrevs,
1761 std::vector<uint64_t> *IndexPos) {
1766#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
1767#include "llvm/IR/Metadata.def"
1771 IndexPos->push_back(Stream.GetCurrentBitNo());
1773 assert(
N->isResolved() &&
"Expected forward references to be resolved");
1775 switch (
N->getMetadataID()) {
1778#define HANDLE_MDNODE_LEAF(CLASS) \
1779 case Metadata::CLASS##Kind: \
1781 write##CLASS(cast<CLASS>(N), Record, \
1782 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
1784 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
1786#include "llvm/IR/Metadata.def"
1793unsigned DXILBitcodeWriter::createMetadataStringsAbbrev() {
1794 auto Abbv = std::make_shared<BitCodeAbbrev>();
1798 return Stream.EmitAbbrev(std::move(Abbv));
1801void DXILBitcodeWriter::writeMetadataStrings(
1803 if (Strings.
empty())
1806 unsigned MDSAbbrev = createMetadataStringsAbbrev();
1808 for (
const Metadata *MD : Strings) {
1819void DXILBitcodeWriter::writeModuleMetadata() {
1820 if (!VE.hasMDs() && M.named_metadata_empty())
1827 std::vector<unsigned> MDAbbrevs;
1830 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
1831 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
1832 createGenericDINodeAbbrev();
1834 unsigned NameAbbrev = 0;
1835 if (!M.named_metadata_empty()) {
1837 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1841 NameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1844 SmallVector<uint64_t, 64>
Record;
1845 writeMetadataStrings(VE.getMDStrings(), Record);
1847 std::vector<uint64_t> IndexPos;
1848 IndexPos.reserve(VE.getNonMDStrings().size());
1849 writeMetadataRecords(VE.getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);
1852 for (
const NamedMDNode &NMD : M.named_metadata()) {
1854 StringRef Str = NMD.getName();
1855 Record.append(Str.bytes_begin(), Str.bytes_end());
1860 for (
const MDNode *
N : NMD.operands())
1861 Record.push_back(VE.getMetadataID(
N));
1869void DXILBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
1874 SmallVector<uint64_t, 64>
Record;
1875 writeMetadataStrings(VE.getMDStrings(), Record);
1876 writeMetadataRecords(VE.getNonMDStrings(), Record);
1880void DXILBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
1883 SmallVector<uint64_t, 64>
Record;
1888 F.getAllMetadata(MDs);
1890 for (
const auto &
I : MDs) {
1892 Record.push_back(VE.getMetadataID(
I.second));
1898 for (
const BasicBlock &BB :
F)
1899 for (
const Instruction &
I : BB) {
1901 I.getAllMetadataOtherThanDebugLoc(MDs);
1907 Record.push_back(VE.getInstructionID(&
I));
1909 for (
unsigned i = 0, e = MDs.size(); i != e; ++i) {
1910 Record.push_back(MDs[i].first);
1911 Record.push_back(VE.getMetadataID(MDs[i].second));
1920void DXILBitcodeWriter::writeModuleMetadataKinds() {
1921 SmallVector<uint64_t, 64>
Record;
1926 M.getMDKindNames(Names);
1933 for (
unsigned MDKindID = 0, e = Names.
size(); MDKindID != e; ++MDKindID) {
1934 Record.push_back(MDKindID);
1935 StringRef KName = Names[MDKindID];
1945void DXILBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
1947 if (FirstVal == LastVal)
1952 unsigned AggregateAbbrev = 0;
1953 unsigned String8Abbrev = 0;
1954 unsigned CString7Abbrev = 0;
1955 unsigned CString6Abbrev = 0;
1959 auto Abbv = std::make_shared<BitCodeAbbrev>();
1964 AggregateAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1967 Abbv = std::make_shared<BitCodeAbbrev>();
1971 String8Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1973 Abbv = std::make_shared<BitCodeAbbrev>();
1977 CString7Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1979 Abbv = std::make_shared<BitCodeAbbrev>();
1983 CString6Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1986 SmallVector<uint64_t, 64>
Record;
1989 Type *LastTy =
nullptr;
1990 for (
unsigned i = FirstVal; i != LastVal; ++i) {
1991 const Value *
V = Vals[i].first;
1993 if (
V->getType() != LastTy) {
1994 LastTy =
V->getType();
1995 Record.push_back(getTypeID(LastTy, V));
1997 CONSTANTS_SETTYPE_ABBREV);
2002 Record.push_back(
unsigned(
IA->hasSideEffects()) |
2003 unsigned(
IA->isAlignStack()) << 1 |
2004 unsigned(
IA->getDialect() & 1) << 2);
2007 StringRef AsmStr =
IA->getAsmString();
2012 StringRef ConstraintStr =
IA->getConstraintString();
2020 unsigned Code = -1U;
2021 unsigned AbbrevToUse = 0;
2022 if (
C->isNullValue()) {
2027 if (
IV->getBitWidth() <= 64) {
2028 uint64_t
V =
IV->getSExtValue();
2031 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2037 unsigned NWords =
IV->getValue().getActiveWords();
2038 const uint64_t *RawWords =
IV->getValue().getRawData();
2039 for (
unsigned i = 0; i != NWords; ++i) {
2047 if (BV->getBitWidth() <= 64) {
2048 uint64_t
V = BV->getSExtValue();
2051 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2053 unsigned NWords = BV->getValue().getActiveWords();
2054 const uint64_t *RawWords = BV->getValue().getRawData();
2055 for (
unsigned i = 0; i != NWords; ++i) {
2064 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2068 APInt api = CFP->getValueAPF().bitcastToAPInt();
2070 Record.push_back((p[1] << 48) | (p[0] >> 16));
2071 Record.push_back(p[0] & 0xffffLL);
2073 APInt api = CFP->getValueAPF().bitcastToAPInt();
2078 assert(0 &&
"Unknown FP type!");
2084 unsigned NumElts = Str->getNumElements();
2086 if (Str->isCString()) {
2091 AbbrevToUse = String8Abbrev;
2095 for (
unsigned i = 0; i != NumElts; ++i) {
2096 unsigned char V = Str->getElementAsInteger(i);
2098 isCStr7 &= (
V & 128) == 0;
2104 AbbrevToUse = CString6Abbrev;
2106 AbbrevToUse = CString7Abbrev;
2107 }
else if (
const ConstantDataSequential *CDS =
2110 Type *EltTy = CDS->getElementType();
2112 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i)
2113 Record.push_back(CDS->getElementAsInteger(i));
2115 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2120 F = CDS->getElementAsFloat(i);
2125 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2130 F = CDS->getElementAsDouble(i);
2137 for (
const Value *
Op :
C->operands())
2138 Record.push_back(VE.getValueID(
Op));
2139 AbbrevToUse = AggregateAbbrev;
2141 switch (
CE->getOpcode()) {
2147 getTypeID(
C->getOperand(0)->getType(),
C->getOperand(0)));
2148 Record.push_back(VE.getValueID(
C->getOperand(0)));
2149 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2151 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
2154 Record.push_back(VE.getValueID(
C->getOperand(0)));
2155 Record.push_back(VE.getValueID(
C->getOperand(1)));
2161 case Instruction::GetElementPtr: {
2164 if (GO->isInBounds())
2166 Record.push_back(getTypeID(GO->getSourceElementType()));
2167 for (
unsigned i = 0, e =
CE->getNumOperands(); i != e; ++i) {
2169 getTypeID(
C->getOperand(i)->getType(),
C->getOperand(i)));
2170 Record.push_back(VE.getValueID(
C->getOperand(i)));
2174 case Instruction::Select:
2176 Record.push_back(VE.getValueID(
C->getOperand(0)));
2177 Record.push_back(VE.getValueID(
C->getOperand(1)));
2178 Record.push_back(VE.getValueID(
C->getOperand(2)));
2180 case Instruction::ExtractElement:
2182 Record.push_back(getTypeID(
C->getOperand(0)->getType()));
2183 Record.push_back(VE.getValueID(
C->getOperand(0)));
2184 Record.push_back(getTypeID(
C->getOperand(1)->getType()));
2185 Record.push_back(VE.getValueID(
C->getOperand(1)));
2187 case Instruction::InsertElement:
2189 Record.push_back(VE.getValueID(
C->getOperand(0)));
2190 Record.push_back(VE.getValueID(
C->getOperand(1)));
2191 Record.push_back(getTypeID(
C->getOperand(2)->getType()));
2192 Record.push_back(VE.getValueID(
C->getOperand(2)));
2194 case Instruction::ShuffleVector:
2199 if (
C->getType() ==
C->getOperand(0)->getType()) {
2203 Record.push_back(getTypeID(
C->getOperand(0)->getType()));
2205 Record.push_back(VE.getValueID(
C->getOperand(0)));
2206 Record.push_back(VE.getValueID(
C->getOperand(1)));
2207 Record.push_back(VE.getValueID(
C->getOperand(2)));
2212 Record.push_back(getTypeID(BA->getFunction()->getType()));
2213 Record.push_back(VE.getValueID(BA->getFunction()));
2214 Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock()));
2221 Stream.EmitRecord(Code, Record, AbbrevToUse);
2228void DXILBitcodeWriter::writeModuleConstants() {
2233 for (
unsigned i = 0, e = Vals.size(); i != e; ++i) {
2235 writeConstants(i, Vals.size(),
true);
2249bool DXILBitcodeWriter::pushValueAndType(
const Value *V,
unsigned InstID,
2250 SmallVectorImpl<unsigned> &Vals) {
2251 unsigned ValID = VE.getValueID(V);
2254 if (ValID >= InstID) {
2263void DXILBitcodeWriter::pushValue(
const Value *V,
unsigned InstID,
2264 SmallVectorImpl<unsigned> &Vals) {
2265 unsigned ValID = VE.getValueID(V);
2269void DXILBitcodeWriter::pushValueSigned(
const Value *V,
unsigned InstID,
2270 SmallVectorImpl<uint64_t> &Vals) {
2271 unsigned ValID = VE.getValueID(V);
2272 int64_t diff = ((int32_t)InstID - (int32_t)ValID);
2277void DXILBitcodeWriter::writeInstruction(
const Instruction &
I,
unsigned InstID,
2278 SmallVectorImpl<unsigned> &Vals) {
2280 unsigned AbbrevToUse = 0;
2281 VE.setInstructionID(&
I);
2282 switch (
I.getOpcode()) {
2286 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2287 AbbrevToUse = (unsigned)FUNCTION_INST_CAST_ABBREV;
2293 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2294 AbbrevToUse = (unsigned)FUNCTION_INST_BINOP_ABBREV;
2295 pushValue(
I.getOperand(1), InstID, Vals);
2299 if (AbbrevToUse == (
unsigned)FUNCTION_INST_BINOP_ABBREV)
2300 AbbrevToUse = (unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV;
2306 case Instruction::GetElementPtr: {
2308 AbbrevToUse = (unsigned)FUNCTION_INST_GEP_ABBREV;
2311 Vals.
push_back(getTypeID(GEPInst.getSourceElementType()));
2312 for (
unsigned i = 0, e =
I.getNumOperands(); i != e; ++i)
2313 pushValueAndType(
I.getOperand(i), InstID, Vals);
2316 case Instruction::ExtractValue: {
2318 pushValueAndType(
I.getOperand(0), InstID, Vals);
2323 case Instruction::InsertValue: {
2325 pushValueAndType(
I.getOperand(0), InstID, Vals);
2326 pushValueAndType(
I.getOperand(1), InstID, Vals);
2331 case Instruction::Select:
2333 pushValueAndType(
I.getOperand(1), InstID, Vals);
2334 pushValue(
I.getOperand(2), InstID, Vals);
2335 pushValueAndType(
I.getOperand(0), InstID, Vals);
2337 case Instruction::ExtractElement:
2339 pushValueAndType(
I.getOperand(0), InstID, Vals);
2340 pushValueAndType(
I.getOperand(1), InstID, Vals);
2342 case Instruction::InsertElement:
2344 pushValueAndType(
I.getOperand(0), InstID, Vals);
2345 pushValue(
I.getOperand(1), InstID, Vals);
2346 pushValueAndType(
I.getOperand(2), InstID, Vals);
2348 case Instruction::ShuffleVector:
2350 pushValueAndType(
I.getOperand(0), InstID, Vals);
2351 pushValue(
I.getOperand(1), InstID, Vals);
2355 case Instruction::ICmp:
2356 case Instruction::FCmp: {
2359 pushValueAndType(
I.getOperand(0), InstID, Vals);
2360 pushValue(
I.getOperand(1), InstID, Vals);
2368 case Instruction::Ret: {
2370 unsigned NumOperands =
I.getNumOperands();
2371 if (NumOperands == 0)
2372 AbbrevToUse = (unsigned)FUNCTION_INST_RET_VOID_ABBREV;
2373 else if (NumOperands == 1) {
2374 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2375 AbbrevToUse = (unsigned)FUNCTION_INST_RET_VAL_ABBREV;
2377 for (
unsigned i = 0, e = NumOperands; i !=
e; ++i)
2378 pushValueAndType(
I.getOperand(i), InstID, Vals);
2381 case Instruction::UncondBr:
2385 case Instruction::CondBr: {
2388 Vals.
push_back(VE.getValueID(
II.getSuccessor(0)));
2389 Vals.
push_back(VE.getValueID(
II.getSuccessor(1)));
2390 pushValue(
II.getCondition(), InstID, Vals);
2392 case Instruction::Switch: {
2395 Vals.
push_back(getTypeID(
SI.getCondition()->getType()));
2396 pushValue(
SI.getCondition(), InstID, Vals);
2397 Vals.
push_back(VE.getValueID(
SI.getDefaultDest()));
2398 for (
auto Case :
SI.cases()) {
2399 Vals.
push_back(VE.getValueID(Case.getCaseValue()));
2400 Vals.
push_back(VE.getValueID(Case.getCaseSuccessor()));
2403 case Instruction::IndirectBr:
2405 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2407 pushValue(
I.getOperand(0), InstID, Vals);
2408 for (
unsigned i = 1, e =
I.getNumOperands(); i != e; ++i)
2409 Vals.
push_back(VE.getValueID(
I.getOperand(i)));
2412 case Instruction::Invoke: {
2415 FunctionType *FTy =
II->getFunctionType();
2418 Vals.
push_back(VE.getAttributeListID(
II->getAttributes()));
2420 Vals.
push_back(VE.getValueID(
II->getNormalDest()));
2421 Vals.
push_back(VE.getValueID(
II->getUnwindDest()));
2423 pushValueAndType(Callee, InstID, Vals);
2426 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
2427 pushValue(
I.getOperand(i), InstID, Vals);
2430 if (FTy->isVarArg()) {
2431 for (
unsigned i = FTy->getNumParams(), e =
I.getNumOperands() - 3; i != e;
2433 pushValueAndType(
I.getOperand(i), InstID, Vals);
2437 case Instruction::Resume:
2439 pushValueAndType(
I.getOperand(0), InstID, Vals);
2441 case Instruction::Unreachable:
2443 AbbrevToUse = (unsigned)FUNCTION_INST_UNREACHABLE_ABBREV;
2446 case Instruction::PHI: {
2459 Stream.EmitRecord(Code, Vals64, AbbrevToUse);
2464 case Instruction::LandingPad: {
2475 pushValueAndType(LP.
getClause(
I), InstID, Vals);
2480 case Instruction::Alloca: {
2484 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2485 Vals.
push_back(VE.getValueID(
I.getOperand(0)));
2487 assert(AlignRecord < 1 << 5 &&
"alignment greater than 1 << 64");
2489 AlignRecord |= 1 << 6;
2494 case Instruction::Load:
2497 pushValueAndType(
I.getOperand(0), InstID, Vals);
2500 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2501 AbbrevToUse = (unsigned)FUNCTION_INST_LOAD_ABBREV;
2511 case Instruction::Store:
2516 pushValueAndType(
I.getOperand(1), InstID, Vals);
2517 pushValueAndType(
I.getOperand(0), InstID, Vals);
2526 case Instruction::AtomicCmpXchg:
2528 pushValueAndType(
I.getOperand(0), InstID, Vals);
2529 pushValueAndType(
I.getOperand(1), InstID, Vals);
2530 pushValue(
I.getOperand(2), InstID, Vals);
2540 case Instruction::AtomicRMW:
2542 pushValueAndType(
I.getOperand(0), InstID, Vals);
2543 pushValue(
I.getOperand(1), InstID, Vals);
2551 case Instruction::Fence:
2556 case Instruction::Call: {
2569 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
2571 if (FTy->getParamType(i)->isLabelTy())
2578 if (FTy->isVarArg()) {
2579 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
2584 case Instruction::VAArg:
2586 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2587 pushValue(
I.getOperand(0), InstID, Vals);
2592 Stream.EmitRecord(Code, Vals, AbbrevToUse);
2597void DXILBitcodeWriter::writeFunctionLevelValueSymbolTable(
2598 const ValueSymbolTable &VST) {
2610 for (
auto &VI : VST) {
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;
2696 writeInstruction(*
I, InstID, Vals);
2698 if (!
I->getType()->isVoidTy())
2702 NeedsMetadataAttachment |=
I->hasMetadataOtherThanDebugLoc();
2705 DILocation *
DL =
I->getDebugLoc();
2717 Vals.
push_back(VE.getMetadataOrNullID(
DL->getScope()));
2718 Vals.
push_back(VE.getMetadataOrNullID(
DL->getInlinedAt()));
2726 if (
auto *Symtab =
F.getValueSymbolTable())
2727 writeFunctionLevelValueSymbolTable(*Symtab);
2729 if (NeedsMetadataAttachment)
2730 writeFunctionMetadataAttachment(
F);
2737void DXILBitcodeWriter::writeBlockInfo() {
2741 Stream.EnterBlockInfoBlock();
2744 auto Abbv = std::make_shared<BitCodeAbbrev>();
2750 std::move(Abbv)) != VST_ENTRY_8_ABBREV)
2751 assert(
false &&
"Unexpected abbrev ordering!");
2755 auto Abbv = std::make_shared<BitCodeAbbrev>();
2761 std::move(Abbv)) != VST_ENTRY_7_ABBREV)
2762 assert(
false &&
"Unexpected abbrev ordering!");
2765 auto Abbv = std::make_shared<BitCodeAbbrev>();
2771 std::move(Abbv)) != VST_ENTRY_6_ABBREV)
2772 assert(
false &&
"Unexpected abbrev ordering!");
2775 auto Abbv = std::make_shared<BitCodeAbbrev>();
2781 std::move(Abbv)) != VST_BBENTRY_6_ABBREV)
2782 assert(
false &&
"Unexpected abbrev ordering!");
2786 auto Abbv = std::make_shared<BitCodeAbbrev>();
2789 VE.computeBitsRequiredForTypeIndices()));
2791 CONSTANTS_SETTYPE_ABBREV)
2792 assert(
false &&
"Unexpected abbrev ordering!");
2796 auto Abbv = std::make_shared<BitCodeAbbrev>();
2800 CONSTANTS_INTEGER_ABBREV)
2801 assert(
false &&
"Unexpected abbrev ordering!");
2805 auto Abbv = std::make_shared<BitCodeAbbrev>();
2809 VE.computeBitsRequiredForTypeIndices()));
2813 CONSTANTS_CE_CAST_Abbrev)
2814 assert(
false &&
"Unexpected abbrev ordering!");
2817 auto Abbv = std::make_shared<BitCodeAbbrev>();
2820 CONSTANTS_NULL_Abbrev)
2821 assert(
false &&
"Unexpected abbrev ordering!");
2827 auto Abbv = std::make_shared<BitCodeAbbrev>();
2831 VE.computeBitsRequiredForTypeIndices()));
2835 (
unsigned)FUNCTION_INST_LOAD_ABBREV)
2836 assert(
false &&
"Unexpected abbrev ordering!");
2839 auto Abbv = std::make_shared<BitCodeAbbrev>();
2845 (
unsigned)FUNCTION_INST_BINOP_ABBREV)
2846 assert(
false &&
"Unexpected abbrev ordering!");
2849 auto Abbv = std::make_shared<BitCodeAbbrev>();
2856 (
unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV)
2857 assert(
false &&
"Unexpected abbrev ordering!");
2860 auto Abbv = std::make_shared<BitCodeAbbrev>();
2864 VE.computeBitsRequiredForTypeIndices()));
2867 (
unsigned)FUNCTION_INST_CAST_ABBREV)
2868 assert(
false &&
"Unexpected abbrev ordering!");
2872 auto Abbv = std::make_shared<BitCodeAbbrev>();
2875 (
unsigned)FUNCTION_INST_RET_VOID_ABBREV)
2876 assert(
false &&
"Unexpected abbrev ordering!");
2879 auto Abbv = std::make_shared<BitCodeAbbrev>();
2883 (
unsigned)FUNCTION_INST_RET_VAL_ABBREV)
2884 assert(
false &&
"Unexpected abbrev ordering!");
2887 auto Abbv = std::make_shared<BitCodeAbbrev>();
2890 (
unsigned)FUNCTION_INST_UNREACHABLE_ABBREV)
2891 assert(
false &&
"Unexpected abbrev ordering!");
2894 auto Abbv = std::make_shared<BitCodeAbbrev>();
2902 (
unsigned)FUNCTION_INST_GEP_ABBREV)
2903 assert(
false &&
"Unexpected abbrev ordering!");
2909void DXILBitcodeWriter::writeModuleVersion() {
2924 DXILBitcodeWriter::writeModuleVersion();
2930 writeAttributeGroupTable();
2933 writeAttributeTable();
2945 writeModuleConstants();
2948 writeModuleMetadataKinds();
2951 writeModuleMetadata();
2956 writeFunctionLevelValueSymbolTable(M.getValueSymbolTable());
2960 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...
Module.h This file contains the declarations for the Module class.
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
uint64_t IntrinsicInst * II
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.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
bool empty() const
empty - 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.
uint16_t getUnversionedName() const
Transitional API for cases where we do not yet support versioned source language names.
uint32_t getVersion() const
Returns language version. Only valid for versioned language names.
bool hasVersionedName() const
uint16_t getName() const
Returns a versioned or unversioned language name.
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.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
constexpr size_t size() const
size - 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.
@ 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
std::optional< SourceLanguage > toDW_LANG(SourceLanguageName name, uint32_t version)
Convert a DWARF 6 pair of language name and version to a DWARF 5 DW_LANG.
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
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.
FunctionAddr VTableAddr Value
StringMapEntry< Value * > ValueName
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.
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.
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)
FunctionAddr VTableAddr Count
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.
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.