60#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,
61#include "llvm/IR/Metadata.def"
79 CONSTANTS_INTEGER_ABBREV,
80 CONSTANTS_CE_CAST_Abbrev,
81 CONSTANTS_NULL_Abbrev,
85 FUNCTION_INST_BINOP_ABBREV,
86 FUNCTION_INST_BINOP_FLAGS_ABBREV,
87 FUNCTION_INST_CAST_ABBREV,
88 FUNCTION_INST_RET_VOID_ABBREV,
89 FUNCTION_INST_RET_VAL_ABBREV,
90 FUNCTION_INST_UNREACHABLE_ABBREV,
91 FUNCTION_INST_GEP_ABBREV,
112 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
115 unsigned GlobalValueId;
135 : I8Ty(
Type::getInt8Ty(M.getContext())),
137 StrtabBuilder(StrtabBuilder), M(M), VE(M, I8PtrTy), Buffer(Buffer),
138 BitcodeStartBit(Stream.GetCurrentBitNo()),
140 GlobalValueId = VE.getValues().
size();
142 for (
auto El : PointerMap)
143 VE.EnumerateType(El.second);
170 void writeModuleVersion();
171 void writePerModuleGlobalValueSummary();
176 unsigned FSCallsAbbrev,
177 unsigned FSCallsProfileAbbrev,
181 unsigned FSModRefsAbbrev,
182 unsigned FSModVTableRefsAbbrev);
185 GUIDToValueIdMap[ValGUID] = ++GlobalValueId;
189 const auto &VMI = GUIDToValueIdMap.find(ValGUID);
192 assert(VMI != GUIDToValueIdMap.end() &&
193 "GUID does not have assigned value Id");
199 if (!VI.haveGVs() || !VI.getValue())
200 return getValueId(VI.getGUID());
201 return VE.getValueID(VI.getValue());
204 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
206 uint64_t bitcodeStartBit() {
return BitcodeStartBit; }
208 size_t addToStrtab(StringRef Str);
210 unsigned createDILocationAbbrev();
211 unsigned createGenericDINodeAbbrev();
213 void writeAttributeGroupTable();
214 void writeAttributeTable();
215 void writeTypeTable();
217 void writeValueSymbolTableForwardDecl();
218 void writeModuleInfo();
219 void writeValueAsMetadata(
const ValueAsMetadata *MD,
220 SmallVectorImpl<uint64_t> &Record);
221 void writeMDTuple(
const MDTuple *
N, SmallVectorImpl<uint64_t> &Record,
223 void writeDILocation(
const DILocation *
N, SmallVectorImpl<uint64_t> &Record,
225 void writeGenericDINode(
const GenericDINode *
N,
226 SmallVectorImpl<uint64_t> &Record,
unsigned &Abbrev) {
229 void writeDISubrange(
const DISubrange *
N, SmallVectorImpl<uint64_t> &Record,
231 void writeDIGenericSubrange(
const DIGenericSubrange *
N,
232 SmallVectorImpl<uint64_t> &Record,
236 void writeDIEnumerator(
const DIEnumerator *
N,
237 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
238 void writeDIBasicType(
const DIBasicType *
N, SmallVectorImpl<uint64_t> &Record,
240 void writeDIFixedPointType(
const DIFixedPointType *
N,
241 SmallVectorImpl<uint64_t> &Record,
245 void writeDIStringType(
const DIStringType *
N,
246 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev) {
249 void writeDIDerivedType(
const DIDerivedType *
N,
250 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
251 void writeDISubrangeType(
const DISubrangeType *
N,
252 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev) {
255 void writeDICompositeType(
const DICompositeType *
N,
256 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
257 void writeDISubroutineType(
const DISubroutineType *
N,
258 SmallVectorImpl<uint64_t> &Record,
260 void writeDIFile(
const DIFile *
N, SmallVectorImpl<uint64_t> &Record,
262 void writeDICompileUnit(
const DICompileUnit *
N,
263 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
264 void writeDISubprogram(
const DISubprogram *
N,
265 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
266 void writeDILexicalBlock(
const DILexicalBlock *
N,
267 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
268 void writeDILexicalBlockFile(
const DILexicalBlockFile *
N,
269 SmallVectorImpl<uint64_t> &Record,
271 void writeDICommonBlock(
const DICommonBlock *
N,
272 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev) {
275 void writeDINamespace(
const DINamespace *
N, SmallVectorImpl<uint64_t> &Record,
277 void writeDIMacro(
const DIMacro *
N, SmallVectorImpl<uint64_t> &Record,
281 void writeDIMacroFile(
const DIMacroFile *
N, SmallVectorImpl<uint64_t> &Record,
285 void writeDIArgList(
const DIArgList *
N, SmallVectorImpl<uint64_t> &Record,
289 void writeDIAssignID(
const DIAssignID *
N, SmallVectorImpl<uint64_t> &Record,
296 void writeDIModule(
const DIModule *
N, SmallVectorImpl<uint64_t> &Record,
298 void writeDITemplateTypeParameter(
const DITemplateTypeParameter *
N,
299 SmallVectorImpl<uint64_t> &Record,
301 void writeDITemplateValueParameter(
const DITemplateValueParameter *
N,
302 SmallVectorImpl<uint64_t> &Record,
304 void writeDIGlobalVariable(
const DIGlobalVariable *
N,
305 SmallVectorImpl<uint64_t> &Record,
307 void writeDILocalVariable(
const DILocalVariable *
N,
308 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
309 void writeDILabel(
const DILabel *
N, SmallVectorImpl<uint64_t> &Record,
313 void writeDIExpression(
const DIExpression *
N,
314 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
315 void writeDIGlobalVariableExpression(
const DIGlobalVariableExpression *
N,
316 SmallVectorImpl<uint64_t> &Record,
320 void writeDIObjCProperty(
const DIObjCProperty *
N,
321 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
322 void writeDIImportedEntity(
const DIImportedEntity *
N,
323 SmallVectorImpl<uint64_t> &Record,
325 unsigned createNamedMetadataAbbrev();
326 void writeNamedMetadata(SmallVectorImpl<uint64_t> &Record);
327 unsigned createMetadataStringsAbbrev();
329 SmallVectorImpl<uint64_t> &Record);
331 SmallVectorImpl<uint64_t> &Record,
332 std::vector<unsigned> *MDAbbrevs =
nullptr,
333 std::vector<uint64_t> *IndexPos =
nullptr);
334 void writeModuleMetadata();
335 void writeFunctionMetadata(
const Function &
F);
336 void writeFunctionMetadataAttachment(
const Function &
F);
337 void pushGlobalMetadataAttachment(SmallVectorImpl<uint64_t> &Record,
338 const GlobalObject &GO);
339 void writeModuleMetadataKinds();
340 void writeOperandBundleTags();
341 void writeSyncScopeNames();
342 void writeConstants(
unsigned FirstVal,
unsigned LastVal,
bool isGlobal);
343 void writeModuleConstants();
344 bool pushValueAndType(
const Value *V,
unsigned InstID,
345 SmallVectorImpl<unsigned> &Vals);
346 void writeOperandBundles(
const CallBase &CB,
unsigned InstID);
347 void pushValue(
const Value *V,
unsigned InstID,
348 SmallVectorImpl<unsigned> &Vals);
349 void pushValueSigned(
const Value *V,
unsigned InstID,
350 SmallVectorImpl<uint64_t> &Vals);
351 void writeInstruction(
const Instruction &
I,
unsigned InstID,
352 SmallVectorImpl<unsigned> &Vals);
353 void writeFunctionLevelValueSymbolTable(
const ValueSymbolTable &VST);
354 void writeGlobalValueSymbolTable(
355 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
356 void writeFunction(
const Function &
F);
357 void writeBlockInfo();
359 unsigned getEncodedSyncScopeID(
SyncScope::ID SSID) {
return unsigned(SSID); }
361 unsigned getEncodedAlign(MaybeAlign Alignment) {
return encode(Alignment); }
363 unsigned getTypeID(
Type *
T,
const Value *V =
nullptr);
368 unsigned getGlobalObjectValueTypeID(
Type *
T,
const GlobalObject *
G);
384 Stream->Emit((
unsigned)
'B', 8);
385 Stream->Emit((
unsigned)
'C', 8);
386 Stream->Emit(0x0, 4);
387 Stream->Emit(0xC, 4);
388 Stream->Emit(0xE, 4);
389 Stream->Emit(0xD, 4);
401 Triple TT(M.getTargetTriple());
402 if (TT.isOSDarwin() || TT.isOSBinFormatMachO())
416 auto Abbv = std::make_shared<BitCodeAbbrev>();
419 auto AbbrevNo = Stream->
EmitAbbrev(std::move(Abbv));
432 assert(M.isMaterialized());
433 Mods.push_back(
const_cast<Module *
>(&M));
436 ModuleWriter.
write();
447 case Instruction::Trunc:
449 case Instruction::ZExt:
451 case Instruction::SExt:
453 case Instruction::FPToUI:
455 case Instruction::FPToSI:
457 case Instruction::UIToFP:
459 case Instruction::SIToFP:
461 case Instruction::FPTrunc:
463 case Instruction::FPExt:
465 case Instruction::PtrToInt:
467 case Instruction::IntToPtr:
469 case Instruction::BitCast:
471 case Instruction::AddrSpaceCast:
480 case Instruction::FNeg:
489 case Instruction::Add:
490 case Instruction::FAdd:
492 case Instruction::Sub:
493 case Instruction::FSub:
495 case Instruction::Mul:
496 case Instruction::FMul:
498 case Instruction::UDiv:
500 case Instruction::FDiv:
501 case Instruction::SDiv:
503 case Instruction::URem:
505 case Instruction::FRem:
506 case Instruction::SRem:
508 case Instruction::Shl:
510 case Instruction::LShr:
512 case Instruction::AShr:
514 case Instruction::And:
516 case Instruction::Or:
518 case Instruction::Xor:
523unsigned DXILBitcodeWriter::getTypeID(
Type *
T,
const Value *V) {
524 if (!
T->isPointerTy() &&
528 return VE.getTypeID(
T);
529 auto It = PointerMap.
find(V);
530 if (It != PointerMap.
end())
531 return VE.getTypeID(It->second);
537 return VE.getTypeID(
T);
538 return VE.getTypeID(I8PtrTy);
541unsigned DXILBitcodeWriter::getGlobalObjectValueTypeID(
Type *
T,
543 auto It = PointerMap.
find(
G);
544 if (It != PointerMap.
end()) {
548 return VE.getTypeID(
T);
610 unsigned AbbrevToUse) {
621 Stream.EmitRecord(Code, Vals, AbbrevToUse);
626 case Attribute::Alignment:
628 case Attribute::AlwaysInline:
630 case Attribute::Builtin:
632 case Attribute::ByVal:
634 case Attribute::Convergent:
636 case Attribute::InAlloca:
638 case Attribute::Cold:
640 case Attribute::InlineHint:
642 case Attribute::InReg:
644 case Attribute::JumpTable:
646 case Attribute::MinSize:
648 case Attribute::Naked:
650 case Attribute::Nest:
652 case Attribute::NoAlias:
654 case Attribute::NoBuiltin:
656 case Attribute::NoDuplicate:
658 case Attribute::NoImplicitFloat:
660 case Attribute::NoInline:
662 case Attribute::NonLazyBind:
664 case Attribute::NonNull:
666 case Attribute::Dereferenceable:
668 case Attribute::DereferenceableOrNull:
670 case Attribute::NoRedZone:
672 case Attribute::NoReturn:
674 case Attribute::NoUnwind:
676 case Attribute::OptimizeForSize:
678 case Attribute::OptimizeNone:
680 case Attribute::ReadNone:
682 case Attribute::ReadOnly:
684 case Attribute::Returned:
686 case Attribute::ReturnsTwice:
688 case Attribute::SExt:
690 case Attribute::StackAlignment:
692 case Attribute::StackProtect:
694 case Attribute::StackProtectReq:
696 case Attribute::StackProtectStrong:
698 case Attribute::SafeStack:
700 case Attribute::StructRet:
702 case Attribute::SanitizeAddress:
704 case Attribute::SanitizeThread:
706 case Attribute::SanitizeMemory:
708 case Attribute::UWTable:
710 case Attribute::ZExt:
721 "should be stripped in DXILPrepare");
741 unsigned NumWords =
A.getActiveWords();
742 const uint64_t *RawData =
A.getRawData();
743 for (
unsigned i = 0; i < NumWords; i++)
751 if (OBO->hasNoSignedWrap())
753 if (OBO->hasNoUnsignedWrap())
759 if (FPMO->hasAllowReassoc() || FPMO->hasAllowContract())
761 if (FPMO->hasNoNaNs())
763 if (FPMO->hasNoInfs())
765 if (FPMO->hasNoSignedZeros())
767 if (FPMO->hasAllowReciprocal())
848 switch (
C.getSelectionKind()) {
867void DXILBitcodeWriter::writeAttributeGroupTable() {
868 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
869 VE.getAttributeGroups();
870 if (AttrGrps.empty())
877 unsigned AttrListIndex = Pair.first;
879 Record.push_back(
VE.getAttributeGroupID(Pair));
880 Record.push_back(AttrListIndex);
883 if (Attr.isEnumAttribute()) {
886 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");
889 }
else if (Attr.isIntAttribute()) {
890 if (Attr.getKindAsEnum() == Attribute::AttrKind::Memory) {
908 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");
914 StringRef
Kind = Attr.getKindAsString();
915 StringRef Val = Attr.getValueAsString();
934void DXILBitcodeWriter::writeAttributeTable() {
935 const std::vector<AttributeList> &
Attrs = VE.getAttributeLists();
941 SmallVector<uint64_t, 64> Record;
942 for (AttributeList AL : Attrs) {
943 for (
unsigned i :
AL.indexes()) {
944 AttributeSet AS =
AL.getAttributes(i);
946 Record.
push_back(VE.getAttributeGroupID({i, AS}));
957void DXILBitcodeWriter::writeTypeTable() {
961 SmallVector<uint64_t, 64> TypeVals;
963 uint64_t NumBits = VE.computeBitsRequiredForTypeIndices();
966 auto Abbv = std::make_shared<BitCodeAbbrev>();
969 Abbv->Add(BitCodeAbbrevOp(0));
970 unsigned PtrAbbrev = Stream.EmitAbbrev(std::move(Abbv));
973 Abbv = std::make_shared<BitCodeAbbrev>();
978 unsigned FunctionAbbrev = Stream.EmitAbbrev(std::move(Abbv));
981 Abbv = std::make_shared<BitCodeAbbrev>();
986 unsigned StructAnonAbbrev = Stream.EmitAbbrev(std::move(Abbv));
989 Abbv = std::make_shared<BitCodeAbbrev>();
993 unsigned StructNameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
996 Abbv = std::make_shared<BitCodeAbbrev>();
1001 unsigned StructNamedAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1004 Abbv = std::make_shared<BitCodeAbbrev>();
1008 unsigned ArrayAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1016 for (
Type *
T : TypeList) {
1017 int AbbrevToUse = 0;
1020 switch (
T->getTypeID()) {
1067 AbbrevToUse = PtrAbbrev;
1078 "dxilOpaquePtrReservedName", StructNameAbbrev);
1086 TypeVals.
push_back(getTypeID(FT->getReturnType()));
1087 for (
Type *PTy : FT->params())
1089 AbbrevToUse = FunctionAbbrev;
1097 for (
Type *ElTy :
ST->elements())
1100 if (
ST->isLiteral()) {
1102 AbbrevToUse = StructAnonAbbrev;
1104 if (
ST->isOpaque()) {
1108 AbbrevToUse = StructNamedAbbrev;
1112 if (!
ST->getName().empty())
1122 TypeVals.
push_back(AT->getNumElements());
1123 TypeVals.
push_back(getTypeID(AT->getElementType()));
1124 AbbrevToUse = ArrayAbbrev;
1132 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1133 TypeVals.
push_back(getTypeID(VT->getElementType()));
1139 Stream.EmitRecord(Code, TypeVals, AbbrevToUse);
1146void DXILBitcodeWriter::writeComdats() {
1148 for (
const Comdat *
C : VE.getComdats()) {
1151 size_t Size =
C->getName().size();
1154 for (
char Chr :
C->getName())
1161void DXILBitcodeWriter::writeValueSymbolTableForwardDecl() {}
1166void DXILBitcodeWriter::writeModuleInfo() {
1171 StringRef Triple =
"dxil-ms-dx";
1172 StringRef
DL =
"e-m:e-p:32:32-i1:8-i8:8-i16:32-i32:32-i64:64-"
1173 "f16:32-f32:32-f64:64-n8:16:32:64";
1177 if (!M.getModuleInlineAsm().empty())
1183 std::map<std::string, unsigned> SectionMap;
1184 std::map<std::string, unsigned> GCMap;
1186 unsigned MaxGlobalType = 0;
1187 const auto UpdateMaxAlignment = [&
MaxAlignment](
const MaybeAlign
A) {
1191 for (
const GlobalVariable &GV : M.globals()) {
1192 UpdateMaxAlignment(GV.getAlign());
1195 MaxGlobalType = std::max(
1196 MaxGlobalType, getGlobalObjectValueTypeID(GV.getValueType(), &GV));
1197 if (GV.hasSection()) {
1199 unsigned &
Entry = SectionMap[std::string(GV.getSection())];
1202 GV.getSection(), 0 );
1203 Entry = SectionMap.size();
1207 for (
const Function &
F : M) {
1208 UpdateMaxAlignment(
F.getAlign());
1209 if (
F.hasSection()) {
1211 unsigned &
Entry = SectionMap[std::string(
F.getSection())];
1215 Entry = SectionMap.size();
1220 unsigned &
Entry = GCMap[
F.getGC()];
1224 Entry = GCMap.size();
1230 unsigned SimpleGVarAbbrev = 0;
1231 if (!M.global_empty()) {
1234 auto Abbv = std::make_shared<BitCodeAbbrev>();
1244 Abbv->Add(BitCodeAbbrevOp(0));
1246 unsigned MaxEncAlignment = getEncodedAlign(MaxAlignment);
1250 if (SectionMap.empty())
1251 Abbv->Add(BitCodeAbbrevOp(0));
1256 SimpleGVarAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1261 for (
const GlobalVariable &GV : M.globals()) {
1262 unsigned AbbrevToUse = 0;
1268 Vals.
push_back(getGlobalObjectValueTypeID(GV.getValueType(), &GV));
1270 GV.getType()->getAddressSpace() << 2 | 2 |
1271 (GV.isConstant() ? 1 : 0));
1274 GV.isDeclaration() ? 0 : (VE.getValueID(GV.getInitializer()) + 1));
1276 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1277 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1279 if (GV.isThreadLocal() ||
1282 GV.isExternallyInitialized() ||
1288 Vals.
push_back(GV.isExternallyInitialized());
1290 Vals.
push_back(GV.hasComdat() ? VE.getComdatID(GV.getComdat()) : 0);
1292 AbbrevToUse = SimpleGVarAbbrev;
1300 for (
const Function &
F : M) {
1304 Vals.
push_back(getGlobalObjectValueTypeID(
F.getFunctionType(), &
F));
1308 Vals.
push_back(VE.getAttributeListID(
F.getAttributes()));
1309 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1310 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1316 F.hasPrologueData() ? (VE.getValueID(
F.getPrologueData()) + 1) : 0);
1318 Vals.
push_back(
F.hasComdat() ? VE.getComdatID(
F.getComdat()) : 0);
1319 Vals.
push_back(
F.hasPrefixData() ? (VE.getValueID(
F.getPrefixData()) + 1)
1322 F.hasPersonalityFn() ? (VE.getValueID(
F.getPersonalityFn()) + 1) : 0);
1324 unsigned AbbrevToUse = 0;
1330 for (
const GlobalAlias &
A : M.aliases()) {
1333 Vals.
push_back(VE.getValueID(
A.getAliasee()));
1339 unsigned AbbrevToUse = 0;
1345void DXILBitcodeWriter::writeValueAsMetadata(
1346 const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
1349 Type *Ty =
V->getType();
1360void DXILBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1361 SmallVectorImpl<uint64_t> &Record,
1363 for (
unsigned i = 0, e =
N->getNumOperands(); i != e; ++i) {
1366 "Unexpected function-local metadata");
1367 Record.
push_back(VE.getMetadataOrNullID(MD));
1375void DXILBitcodeWriter::writeDILocation(
const DILocation *
N,
1376 SmallVectorImpl<uint64_t> &Record,
1379 Abbrev = createDILocationAbbrev();
1383 Record.
push_back(VE.getMetadataID(
N->getScope()));
1384 Record.
push_back(VE.getMetadataOrNullID(
N->getInlinedAt()));
1393 return I < 0 ? ~(U << 1) : U << 1;
1396void DXILBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1397 SmallVectorImpl<uint64_t> &Record,
1404 assert(
Count &&
"Count is missing or not ConstantInt");
1408 DISubrange::BoundType LowerBound =
N->getLowerBound();
1410 "Lower bound provided but not ConstantInt");
1418void DXILBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1419 SmallVectorImpl<uint64_t> &Record,
1423 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1429void DXILBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1430 SmallVectorImpl<uint64_t> &Record,
1434 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1443void DXILBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
1444 SmallVectorImpl<uint64_t> &Record,
1448 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1449 Record.
push_back(VE.getMetadataOrNullID(
N->getFile()));
1451 Record.
push_back(VE.getMetadataOrNullID(
N->getScope()));
1452 Record.
push_back(VE.getMetadataOrNullID(
N->getBaseType()));
1457 Record.
push_back(VE.getMetadataOrNullID(
N->getExtraData()));
1463void DXILBitcodeWriter::writeDICompositeType(
const DICompositeType *
N,
1464 SmallVectorImpl<uint64_t> &Record,
1468 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1469 Record.
push_back(VE.getMetadataOrNullID(
N->getFile()));
1471 Record.
push_back(VE.getMetadataOrNullID(
N->getScope()));
1472 Record.
push_back(VE.getMetadataOrNullID(
N->getBaseType()));
1477 Record.
push_back(VE.getMetadataOrNullID(
N->getElements().get()));
1479 Record.
push_back(VE.getMetadataOrNullID(
N->getVTableHolder()));
1480 Record.
push_back(VE.getMetadataOrNullID(
N->getTemplateParams().get()));
1481 Record.
push_back(VE.getMetadataOrNullID(
N->getRawIdentifier()));
1487void DXILBitcodeWriter::writeDISubroutineType(
const DISubroutineType *
N,
1488 SmallVectorImpl<uint64_t> &Record,
1492 Record.
push_back(VE.getMetadataOrNullID(
N->getTypeArray().get()));
1498void DXILBitcodeWriter::writeDIFile(
const DIFile *
N,
1499 SmallVectorImpl<uint64_t> &Record,
1502 Record.
push_back(VE.getMetadataOrNullID(
N->getRawFilename()));
1503 Record.
push_back(VE.getMetadataOrNullID(
N->getRawDirectory()));
1509void DXILBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
1510 SmallVectorImpl<uint64_t> &Record,
1513 Record.
push_back(
N->getSourceLanguage().getUnversionedName());
1514 Record.
push_back(VE.getMetadataOrNullID(
N->getFile()));
1515 Record.
push_back(VE.getMetadataOrNullID(
N->getRawProducer()));
1517 Record.
push_back(VE.getMetadataOrNullID(
N->getRawFlags()));
1519 Record.
push_back(VE.getMetadataOrNullID(
N->getRawSplitDebugFilename()));
1521 Record.
push_back(VE.getMetadataOrNullID(
N->getEnumTypes().get()));
1522 Record.
push_back(VE.getMetadataOrNullID(
N->getRetainedTypes().get()));
1524 Record.
push_back(VE.getMetadataOrNullID(
N->getGlobalVariables().get()));
1525 Record.
push_back(VE.getMetadataOrNullID(
N->getImportedEntities().get()));
1532void DXILBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
1533 SmallVectorImpl<uint64_t> &Record,
1536 Record.
push_back(VE.getMetadataOrNullID(
N->getScope()));
1537 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1538 Record.
push_back(VE.getMetadataOrNullID(
N->getRawLinkageName()));
1539 Record.
push_back(VE.getMetadataOrNullID(
N->getFile()));
1541 Record.
push_back(VE.getMetadataOrNullID(
N->getType()));
1545 Record.
push_back(VE.getMetadataOrNullID(
N->getContainingType()));
1550 Record.
push_back(VE.getMetadataOrNullID(
N->getRawUnit()));
1551 Record.
push_back(VE.getMetadataOrNullID(
N->getTemplateParams().get()));
1552 Record.
push_back(VE.getMetadataOrNullID(
N->getDeclaration()));
1553 Record.
push_back(VE.getMetadataOrNullID(
N->getRetainedNodes().get()));
1559void DXILBitcodeWriter::writeDILexicalBlock(
const DILexicalBlock *
N,
1560 SmallVectorImpl<uint64_t> &Record,
1563 Record.
push_back(VE.getMetadataOrNullID(
N->getScope()));
1564 Record.
push_back(VE.getMetadataOrNullID(
N->getFile()));
1572void DXILBitcodeWriter::writeDILexicalBlockFile(
1573 const DILexicalBlockFile *
N, SmallVectorImpl<uint64_t> &Record,
1576 Record.
push_back(VE.getMetadataOrNullID(
N->getScope()));
1577 Record.
push_back(VE.getMetadataOrNullID(
N->getFile()));
1584void DXILBitcodeWriter::writeDINamespace(
const DINamespace *
N,
1585 SmallVectorImpl<uint64_t> &Record,
1588 Record.
push_back(VE.getMetadataOrNullID(
N->getScope()));
1589 Record.
push_back(VE.getMetadataOrNullID(
N->getFile()));
1590 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1597void DXILBitcodeWriter::writeDIModule(
const DIModule *
N,
1598 SmallVectorImpl<uint64_t> &Record,
1601 for (
auto &
I :
N->operands())
1608void DXILBitcodeWriter::writeDITemplateTypeParameter(
1609 const DITemplateTypeParameter *
N, SmallVectorImpl<uint64_t> &Record,
1612 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1613 Record.
push_back(VE.getMetadataOrNullID(
N->getType()));
1619void DXILBitcodeWriter::writeDITemplateValueParameter(
1620 const DITemplateValueParameter *
N, SmallVectorImpl<uint64_t> &Record,
1624 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1625 Record.
push_back(VE.getMetadataOrNullID(
N->getType()));
1626 Record.
push_back(VE.getMetadataOrNullID(
N->getValue()));
1632void DXILBitcodeWriter::writeDIGlobalVariable(
const DIGlobalVariable *
N,
1633 SmallVectorImpl<uint64_t> &Record,
1636 Record.
push_back(VE.getMetadataOrNullID(
N->getScope()));
1637 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1638 Record.
push_back(VE.getMetadataOrNullID(
N->getRawLinkageName()));
1639 Record.
push_back(VE.getMetadataOrNullID(
N->getFile()));
1641 Record.
push_back(VE.getMetadataOrNullID(
N->getType()));
1645 Record.
push_back(VE.getMetadataOrNullID(
N->getStaticDataMemberDeclaration()));
1651void DXILBitcodeWriter::writeDILocalVariable(
const DILocalVariable *
N,
1652 SmallVectorImpl<uint64_t> &Record,
1656 Record.
push_back(VE.getMetadataOrNullID(
N->getScope()));
1657 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1658 Record.
push_back(VE.getMetadataOrNullID(
N->getFile()));
1660 Record.
push_back(VE.getMetadataOrNullID(
N->getType()));
1668void DXILBitcodeWriter::writeDIExpression(
const DIExpression *
N,
1669 SmallVectorImpl<uint64_t> &Record,
1671 Record.
reserve(
N->getElements().size() + 1);
1674 Record.
append(
N->elements_begin(),
N->elements_end());
1680void DXILBitcodeWriter::writeDIObjCProperty(
const DIObjCProperty *
N,
1681 SmallVectorImpl<uint64_t> &Record,
1686void DXILBitcodeWriter::writeDIImportedEntity(
const DIImportedEntity *
N,
1687 SmallVectorImpl<uint64_t> &Record,
1691 Record.
push_back(VE.getMetadataOrNullID(
N->getScope()));
1692 Record.
push_back(VE.getMetadataOrNullID(
N->getEntity()));
1694 Record.
push_back(VE.getMetadataOrNullID(
N->getRawName()));
1700unsigned DXILBitcodeWriter::createDILocationAbbrev() {
1705 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1712 return Stream.EmitAbbrev(std::move(Abbv));
1715unsigned DXILBitcodeWriter::createGenericDINodeAbbrev() {
1720 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1728 return Stream.EmitAbbrev(std::move(Abbv));
1732 SmallVectorImpl<uint64_t> &Record,
1733 std::vector<unsigned> *MDAbbrevs,
1734 std::vector<uint64_t> *IndexPos) {
1739#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
1740#include "llvm/IR/Metadata.def"
1744 IndexPos->push_back(Stream.GetCurrentBitNo());
1746 assert(
N->isResolved() &&
"Expected forward references to be resolved");
1748 switch (
N->getMetadataID()) {
1751#define HANDLE_MDNODE_LEAF(CLASS) \
1752 case Metadata::CLASS##Kind: \
1754 write##CLASS(cast<CLASS>(N), Record, \
1755 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
1757 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
1759#include "llvm/IR/Metadata.def"
1766unsigned DXILBitcodeWriter::createMetadataStringsAbbrev() {
1767 auto Abbv = std::make_shared<BitCodeAbbrev>();
1771 return Stream.EmitAbbrev(std::move(Abbv));
1774void DXILBitcodeWriter::writeMetadataStrings(
1776 if (Strings.
empty())
1779 unsigned MDSAbbrev = createMetadataStringsAbbrev();
1781 for (
const Metadata *MD : Strings) {
1792void DXILBitcodeWriter::writeModuleMetadata() {
1793 if (!VE.hasMDs() && M.named_metadata_empty())
1800 std::vector<unsigned> MDAbbrevs;
1803 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
1804 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
1805 createGenericDINodeAbbrev();
1807 unsigned NameAbbrev = 0;
1808 if (!M.named_metadata_empty()) {
1810 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1814 NameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1817 SmallVector<uint64_t, 64> Record;
1818 writeMetadataStrings(VE.getMDStrings(), Record);
1820 std::vector<uint64_t> IndexPos;
1821 IndexPos.reserve(VE.getNonMDStrings().size());
1822 writeMetadataRecords(VE.getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);
1825 for (
const NamedMDNode &NMD : M.named_metadata()) {
1827 StringRef Str = NMD.getName();
1828 Record.
append(Str.bytes_begin(), Str.bytes_end());
1833 for (
const MDNode *
N : NMD.operands())
1842void DXILBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
1847 SmallVector<uint64_t, 64> Record;
1848 writeMetadataStrings(VE.getMDStrings(), Record);
1849 writeMetadataRecords(VE.getNonMDStrings(), Record);
1853void DXILBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
1856 SmallVector<uint64_t, 64> Record;
1861 F.getAllMetadata(MDs);
1863 for (
const auto &
I : MDs) {
1865 Record.
push_back(VE.getMetadataID(
I.second));
1871 for (
const BasicBlock &BB :
F)
1872 for (
const Instruction &
I : BB) {
1874 I.getAllMetadataOtherThanDebugLoc(MDs);
1882 for (
unsigned i = 0, e = MDs.size(); i != e; ++i) {
1884 Record.
push_back(VE.getMetadataID(MDs[i].second));
1893void DXILBitcodeWriter::writeModuleMetadataKinds() {
1894 SmallVector<uint64_t, 64> Record;
1899 M.getMDKindNames(Names);
1906 for (
unsigned MDKindID = 0, e = Names.
size(); MDKindID != e; ++MDKindID) {
1908 StringRef KName = Names[MDKindID];
1918void DXILBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
1920 if (FirstVal == LastVal)
1925 unsigned AggregateAbbrev = 0;
1926 unsigned String8Abbrev = 0;
1927 unsigned CString7Abbrev = 0;
1928 unsigned CString6Abbrev = 0;
1932 auto Abbv = std::make_shared<BitCodeAbbrev>();
1937 AggregateAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1940 Abbv = std::make_shared<BitCodeAbbrev>();
1944 String8Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1946 Abbv = std::make_shared<BitCodeAbbrev>();
1950 CString7Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1952 Abbv = std::make_shared<BitCodeAbbrev>();
1956 CString6Abbrev = Stream.EmitAbbrev(std::move(Abbv));
1959 SmallVector<uint64_t, 64> Record;
1962 Type *LastTy =
nullptr;
1963 for (
unsigned i = FirstVal; i != LastVal; ++i) {
1964 const Value *
V = Vals[i].first;
1966 if (
V->getType() != LastTy) {
1967 LastTy =
V->getType();
1970 CONSTANTS_SETTYPE_ABBREV);
1976 unsigned(
IA->isAlignStack()) << 1 |
1977 unsigned(
IA->getDialect() & 1) << 2);
1980 StringRef AsmStr =
IA->getAsmString();
1985 StringRef ConstraintStr =
IA->getConstraintString();
1993 unsigned Code = -1U;
1994 unsigned AbbrevToUse = 0;
1995 if (
C->isNullValue()) {
2000 if (
IV->getBitWidth() <= 64) {
2001 uint64_t
V =
IV->getSExtValue();
2004 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2010 unsigned NWords =
IV->getValue().getActiveWords();
2011 const uint64_t *RawWords =
IV->getValue().getRawData();
2012 for (
unsigned i = 0; i != NWords; ++i) {
2019 Type *Ty = CFP->getType();
2021 Record.
push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2025 APInt api = CFP->getValueAPF().bitcastToAPInt();
2027 Record.
push_back((p[1] << 48) | (p[0] >> 16));
2030 APInt api = CFP->getValueAPF().bitcastToAPInt();
2035 assert(0 &&
"Unknown FP type!");
2041 unsigned NumElts = Str->getNumElements();
2043 if (Str->isCString()) {
2048 AbbrevToUse = String8Abbrev;
2052 for (
unsigned i = 0; i != NumElts; ++i) {
2053 unsigned char V = Str->getElementAsInteger(i);
2055 isCStr7 &= (
V & 128) == 0;
2061 AbbrevToUse = CString6Abbrev;
2063 AbbrevToUse = CString7Abbrev;
2064 }
else if (
const ConstantDataSequential *CDS =
2067 Type *EltTy = CDS->getElementType();
2069 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i)
2070 Record.
push_back(CDS->getElementAsInteger(i));
2072 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2077 F = CDS->getElementAsFloat(i);
2082 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2087 F = CDS->getElementAsDouble(i);
2094 for (
const Value *
Op :
C->operands())
2096 AbbrevToUse = AggregateAbbrev;
2098 switch (
CE->getOpcode()) {
2104 getTypeID(
C->getOperand(0)->getType(),
C->getOperand(0)));
2105 Record.
push_back(VE.getValueID(
C->getOperand(0)));
2106 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2108 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
2111 Record.
push_back(VE.getValueID(
C->getOperand(0)));
2112 Record.
push_back(VE.getValueID(
C->getOperand(1)));
2118 case Instruction::GetElementPtr: {
2121 if (GO->isInBounds())
2123 Record.
push_back(getTypeID(GO->getSourceElementType()));
2124 for (
unsigned i = 0, e =
CE->getNumOperands(); i != e; ++i) {
2126 getTypeID(
C->getOperand(i)->getType(),
C->getOperand(i)));
2127 Record.
push_back(VE.getValueID(
C->getOperand(i)));
2131 case Instruction::Select:
2133 Record.
push_back(VE.getValueID(
C->getOperand(0)));
2134 Record.
push_back(VE.getValueID(
C->getOperand(1)));
2135 Record.
push_back(VE.getValueID(
C->getOperand(2)));
2137 case Instruction::ExtractElement:
2139 Record.
push_back(getTypeID(
C->getOperand(0)->getType()));
2140 Record.
push_back(VE.getValueID(
C->getOperand(0)));
2141 Record.
push_back(getTypeID(
C->getOperand(1)->getType()));
2142 Record.
push_back(VE.getValueID(
C->getOperand(1)));
2144 case Instruction::InsertElement:
2146 Record.
push_back(VE.getValueID(
C->getOperand(0)));
2147 Record.
push_back(VE.getValueID(
C->getOperand(1)));
2148 Record.
push_back(getTypeID(
C->getOperand(2)->getType()));
2149 Record.
push_back(VE.getValueID(
C->getOperand(2)));
2151 case Instruction::ShuffleVector:
2156 if (
C->getType() ==
C->getOperand(0)->getType()) {
2160 Record.
push_back(getTypeID(
C->getOperand(0)->getType()));
2162 Record.
push_back(VE.getValueID(
C->getOperand(0)));
2163 Record.
push_back(VE.getValueID(
C->getOperand(1)));
2164 Record.
push_back(VE.getValueID(
C->getOperand(2)));
2169 Record.
push_back(getTypeID(BA->getFunction()->getType()));
2170 Record.
push_back(VE.getValueID(BA->getFunction()));
2171 Record.
push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock()));
2178 Stream.EmitRecord(Code, Record, AbbrevToUse);
2185void DXILBitcodeWriter::writeModuleConstants() {
2190 for (
unsigned i = 0, e = Vals.size(); i != e; ++i) {
2192 writeConstants(i, Vals.size(),
true);
2206bool DXILBitcodeWriter::pushValueAndType(
const Value *V,
unsigned InstID,
2207 SmallVectorImpl<unsigned> &Vals) {
2208 unsigned ValID = VE.getValueID(V);
2211 if (ValID >= InstID) {
2220void DXILBitcodeWriter::pushValue(
const Value *V,
unsigned InstID,
2221 SmallVectorImpl<unsigned> &Vals) {
2222 unsigned ValID = VE.getValueID(V);
2226void DXILBitcodeWriter::pushValueSigned(
const Value *V,
unsigned InstID,
2227 SmallVectorImpl<uint64_t> &Vals) {
2228 unsigned ValID = VE.getValueID(V);
2229 int64_t diff = ((int32_t)InstID - (int32_t)ValID);
2234void DXILBitcodeWriter::writeInstruction(
const Instruction &
I,
unsigned InstID,
2235 SmallVectorImpl<unsigned> &Vals) {
2237 unsigned AbbrevToUse = 0;
2238 VE.setInstructionID(&
I);
2239 switch (
I.getOpcode()) {
2243 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2244 AbbrevToUse = (unsigned)FUNCTION_INST_CAST_ABBREV;
2250 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2251 AbbrevToUse = (unsigned)FUNCTION_INST_BINOP_ABBREV;
2252 pushValue(
I.getOperand(1), InstID, Vals);
2256 if (AbbrevToUse == (
unsigned)FUNCTION_INST_BINOP_ABBREV)
2257 AbbrevToUse = (unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV;
2263 case Instruction::GetElementPtr: {
2265 AbbrevToUse = (unsigned)FUNCTION_INST_GEP_ABBREV;
2268 Vals.
push_back(getTypeID(GEPInst.getSourceElementType()));
2269 for (
unsigned i = 0, e =
I.getNumOperands(); i != e; ++i)
2270 pushValueAndType(
I.getOperand(i), InstID, Vals);
2273 case Instruction::ExtractValue: {
2275 pushValueAndType(
I.getOperand(0), InstID, Vals);
2280 case Instruction::InsertValue: {
2282 pushValueAndType(
I.getOperand(0), InstID, Vals);
2283 pushValueAndType(
I.getOperand(1), InstID, Vals);
2288 case Instruction::Select:
2290 pushValueAndType(
I.getOperand(1), InstID, Vals);
2291 pushValue(
I.getOperand(2), InstID, Vals);
2292 pushValueAndType(
I.getOperand(0), InstID, Vals);
2294 case Instruction::ExtractElement:
2296 pushValueAndType(
I.getOperand(0), InstID, Vals);
2297 pushValueAndType(
I.getOperand(1), InstID, Vals);
2299 case Instruction::InsertElement:
2301 pushValueAndType(
I.getOperand(0), InstID, Vals);
2302 pushValue(
I.getOperand(1), InstID, Vals);
2303 pushValueAndType(
I.getOperand(2), InstID, Vals);
2305 case Instruction::ShuffleVector:
2307 pushValueAndType(
I.getOperand(0), InstID, Vals);
2308 pushValue(
I.getOperand(1), InstID, Vals);
2312 case Instruction::ICmp:
2313 case Instruction::FCmp: {
2316 pushValueAndType(
I.getOperand(0), InstID, Vals);
2317 pushValue(
I.getOperand(1), InstID, Vals);
2325 case Instruction::Ret: {
2327 unsigned NumOperands =
I.getNumOperands();
2328 if (NumOperands == 0)
2329 AbbrevToUse = (unsigned)FUNCTION_INST_RET_VOID_ABBREV;
2330 else if (NumOperands == 1) {
2331 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2332 AbbrevToUse = (unsigned)FUNCTION_INST_RET_VAL_ABBREV;
2334 for (
unsigned i = 0, e = NumOperands; i !=
e; ++i)
2335 pushValueAndType(
I.getOperand(i), InstID, Vals);
2338 case Instruction::Br: {
2341 Vals.
push_back(VE.getValueID(
II.getSuccessor(0)));
2342 if (
II.isConditional()) {
2343 Vals.
push_back(VE.getValueID(
II.getSuccessor(1)));
2344 pushValue(
II.getCondition(), InstID, Vals);
2347 case Instruction::Switch: {
2350 Vals.
push_back(getTypeID(
SI.getCondition()->getType()));
2351 pushValue(
SI.getCondition(), InstID, Vals);
2352 Vals.
push_back(VE.getValueID(
SI.getDefaultDest()));
2353 for (
auto Case :
SI.cases()) {
2354 Vals.
push_back(VE.getValueID(Case.getCaseValue()));
2355 Vals.
push_back(VE.getValueID(Case.getCaseSuccessor()));
2358 case Instruction::IndirectBr:
2360 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2362 pushValue(
I.getOperand(0), InstID, Vals);
2363 for (
unsigned i = 1, e =
I.getNumOperands(); i != e; ++i)
2364 Vals.
push_back(VE.getValueID(
I.getOperand(i)));
2367 case Instruction::Invoke: {
2370 FunctionType *FTy =
II->getFunctionType();
2373 Vals.
push_back(VE.getAttributeListID(
II->getAttributes()));
2375 Vals.
push_back(VE.getValueID(
II->getNormalDest()));
2376 Vals.
push_back(VE.getValueID(
II->getUnwindDest()));
2378 pushValueAndType(Callee, InstID, Vals);
2381 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
2382 pushValue(
I.getOperand(i), InstID, Vals);
2385 if (FTy->isVarArg()) {
2386 for (
unsigned i = FTy->getNumParams(), e =
I.getNumOperands() - 3; i != e;
2388 pushValueAndType(
I.getOperand(i), InstID, Vals);
2392 case Instruction::Resume:
2394 pushValueAndType(
I.getOperand(0), InstID, Vals);
2396 case Instruction::Unreachable:
2398 AbbrevToUse = (unsigned)FUNCTION_INST_UNREACHABLE_ABBREV;
2401 case Instruction::PHI: {
2414 Stream.EmitRecord(Code, Vals64, AbbrevToUse);
2419 case Instruction::LandingPad: {
2430 pushValueAndType(LP.
getClause(
I), InstID, Vals);
2435 case Instruction::Alloca: {
2439 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2440 Vals.
push_back(VE.getValueID(
I.getOperand(0)));
2442 assert(AlignRecord < 1 << 5 &&
"alignment greater than 1 << 64");
2444 AlignRecord |= 1 << 6;
2449 case Instruction::Load:
2452 pushValueAndType(
I.getOperand(0), InstID, Vals);
2455 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2456 AbbrevToUse = (unsigned)FUNCTION_INST_LOAD_ABBREV;
2466 case Instruction::Store:
2471 pushValueAndType(
I.getOperand(1), InstID, Vals);
2472 pushValueAndType(
I.getOperand(0), InstID, Vals);
2481 case Instruction::AtomicCmpXchg:
2483 pushValueAndType(
I.getOperand(0), InstID, Vals);
2484 pushValueAndType(
I.getOperand(1), InstID, Vals);
2485 pushValue(
I.getOperand(2), InstID, Vals);
2495 case Instruction::AtomicRMW:
2497 pushValueAndType(
I.getOperand(0), InstID, Vals);
2498 pushValue(
I.getOperand(1), InstID, Vals);
2506 case Instruction::Fence:
2511 case Instruction::Call: {
2524 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
2526 if (FTy->getParamType(i)->isLabelTy())
2533 if (FTy->isVarArg()) {
2534 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
2539 case Instruction::VAArg:
2541 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2542 pushValue(
I.getOperand(0), InstID, Vals);
2547 Stream.EmitRecord(Code, Vals, AbbrevToUse);
2552void DXILBitcodeWriter::writeFunctionLevelValueSymbolTable(
2553 const ValueSymbolTable &VST) {
2565 for (
auto &VI : VST) {
2570 return A->first() <
B->first();
2573 for (
const ValueName *SI : SortedTable) {
2578 bool isChar6 =
true;
2579 for (
const char *
C =
Name.getKeyData(), *
E =
C +
Name.getKeyLength();
2583 if ((
unsigned char)*
C & 128) {
2589 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
2597 AbbrevToUse = VST_BBENTRY_6_ABBREV;
2601 AbbrevToUse = VST_ENTRY_6_ABBREV;
2603 AbbrevToUse = VST_ENTRY_7_ABBREV;
2606 NameVals.
push_back(VE.getValueID(
SI->getValue()));
2607 for (
const char *
P =
Name.getKeyData(),
2608 *
E =
Name.getKeyData() +
Name.getKeyLength();
2613 Stream.EmitRecord(Code, NameVals, AbbrevToUse);
2620void DXILBitcodeWriter::writeFunction(
const Function &
F) {
2622 VE.incorporateFunction(
F);
2628 Vals.
push_back(VE.getBasicBlocks().size());
2633 unsigned CstStart, CstEnd;
2634 VE.getFunctionConstantRange(CstStart, CstEnd);
2635 writeConstants(CstStart, CstEnd,
false);
2638 writeFunctionMetadata(
F);
2641 unsigned InstID = CstEnd;
2643 bool NeedsMetadataAttachment =
F.hasMetadata();
2645 DILocation *LastDL =
nullptr;
2651 writeInstruction(*
I, InstID, Vals);
2653 if (!
I->getType()->isVoidTy())
2657 NeedsMetadataAttachment |=
I->hasMetadataOtherThanDebugLoc();
2660 DILocation *
DL =
I->getDebugLoc();
2672 Vals.
push_back(VE.getMetadataOrNullID(
DL->getScope()));
2673 Vals.
push_back(VE.getMetadataOrNullID(
DL->getInlinedAt()));
2681 if (
auto *Symtab =
F.getValueSymbolTable())
2682 writeFunctionLevelValueSymbolTable(*Symtab);
2684 if (NeedsMetadataAttachment)
2685 writeFunctionMetadataAttachment(
F);
2692void DXILBitcodeWriter::writeBlockInfo() {
2696 Stream.EnterBlockInfoBlock();
2699 auto Abbv = std::make_shared<BitCodeAbbrev>();
2705 std::move(Abbv)) != VST_ENTRY_8_ABBREV)
2706 assert(
false &&
"Unexpected abbrev ordering!");
2710 auto Abbv = std::make_shared<BitCodeAbbrev>();
2716 std::move(Abbv)) != VST_ENTRY_7_ABBREV)
2717 assert(
false &&
"Unexpected abbrev ordering!");
2720 auto Abbv = std::make_shared<BitCodeAbbrev>();
2726 std::move(Abbv)) != VST_ENTRY_6_ABBREV)
2727 assert(
false &&
"Unexpected abbrev ordering!");
2730 auto Abbv = std::make_shared<BitCodeAbbrev>();
2736 std::move(Abbv)) != VST_BBENTRY_6_ABBREV)
2737 assert(
false &&
"Unexpected abbrev ordering!");
2741 auto Abbv = std::make_shared<BitCodeAbbrev>();
2744 VE.computeBitsRequiredForTypeIndices()));
2746 CONSTANTS_SETTYPE_ABBREV)
2747 assert(
false &&
"Unexpected abbrev ordering!");
2751 auto Abbv = std::make_shared<BitCodeAbbrev>();
2755 CONSTANTS_INTEGER_ABBREV)
2756 assert(
false &&
"Unexpected abbrev ordering!");
2760 auto Abbv = std::make_shared<BitCodeAbbrev>();
2764 VE.computeBitsRequiredForTypeIndices()));
2768 CONSTANTS_CE_CAST_Abbrev)
2769 assert(
false &&
"Unexpected abbrev ordering!");
2772 auto Abbv = std::make_shared<BitCodeAbbrev>();
2775 CONSTANTS_NULL_Abbrev)
2776 assert(
false &&
"Unexpected abbrev ordering!");
2782 auto Abbv = std::make_shared<BitCodeAbbrev>();
2786 VE.computeBitsRequiredForTypeIndices()));
2790 (
unsigned)FUNCTION_INST_LOAD_ABBREV)
2791 assert(
false &&
"Unexpected abbrev ordering!");
2794 auto Abbv = std::make_shared<BitCodeAbbrev>();
2800 (
unsigned)FUNCTION_INST_BINOP_ABBREV)
2801 assert(
false &&
"Unexpected abbrev ordering!");
2804 auto Abbv = std::make_shared<BitCodeAbbrev>();
2811 (
unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV)
2812 assert(
false &&
"Unexpected abbrev ordering!");
2815 auto Abbv = std::make_shared<BitCodeAbbrev>();
2819 VE.computeBitsRequiredForTypeIndices()));
2822 (
unsigned)FUNCTION_INST_CAST_ABBREV)
2823 assert(
false &&
"Unexpected abbrev ordering!");
2827 auto Abbv = std::make_shared<BitCodeAbbrev>();
2830 (
unsigned)FUNCTION_INST_RET_VOID_ABBREV)
2831 assert(
false &&
"Unexpected abbrev ordering!");
2834 auto Abbv = std::make_shared<BitCodeAbbrev>();
2838 (
unsigned)FUNCTION_INST_RET_VAL_ABBREV)
2839 assert(
false &&
"Unexpected abbrev ordering!");
2842 auto Abbv = std::make_shared<BitCodeAbbrev>();
2845 (
unsigned)FUNCTION_INST_UNREACHABLE_ABBREV)
2846 assert(
false &&
"Unexpected abbrev ordering!");
2849 auto Abbv = std::make_shared<BitCodeAbbrev>();
2857 (
unsigned)FUNCTION_INST_GEP_ABBREV)
2858 assert(
false &&
"Unexpected abbrev ordering!");
2864void DXILBitcodeWriter::writeModuleVersion() {
2879 DXILBitcodeWriter::writeModuleVersion();
2885 writeAttributeGroupTable();
2888 writeAttributeTable();
2900 writeModuleConstants();
2903 writeModuleMetadataKinds();
2906 writeModuleMetadata();
2911 writeFunctionLevelValueSymbolTable(M.getValueSymbolTable());
2915 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 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.
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)
@ 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'.
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.
void writeModule(const Module &M)
Write the specified module to the buffer specified at construction time.
BitcodeWriter(SmallVectorImpl< char > &Buffer)
Create a BitcodeWriter that writes to Buffer.
static void emitWideAPInt(SmallVectorImpl< uint64_t > &Vals, const APInt &A)
static unsigned getEncodedThreadLocalMode(const GlobalValue &GV)
static unsigned getEncodedCastOpcode(unsigned Opcode)
Begin dxil::BitcodeWriterBase Implementation.
static void writeStringRecord(BitstreamWriter &Stream, unsigned Code, StringRef Str, unsigned AbbrevToUse)
static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind)
static unsigned getEncodedDLLStorageClass(const GlobalValue &GV)
static unsigned getEncodedOrdering(AtomicOrdering Ordering)
static unsigned getEncodedLinkage(const GlobalValue::LinkageTypes Linkage)
static unsigned getEncodedVisibility(const GlobalValue &GV)
void write()
Emit the current module to the bitstream.
static void writeIdentificationBlock(BitstreamWriter &Stream)
static unsigned getEncodedBinaryOpcode(unsigned Opcode)
static void emitSignedInt64(SmallVectorImpl< uint64_t > &Vals, uint64_t V)
static unsigned getEncodedUnaryOpcode(unsigned Opcode)
static unsigned getEncodedRMWOperation(AtomicRMWInst::BinOp Op)
DXILBitcodeWriter(const Module &M, SmallVectorImpl< char > &Buffer, StringTableBuilder &StrtabBuilder, BitstreamWriter &Stream)
Constructs a ModuleBitcodeWriter object for the given Module, writing to the provided Buffer.
static unsigned getEncodedComdatSelectionKind(const Comdat &C)
static uint64_t getOptimizationFlags(const Value *V)
std::pair< unsigned, AttributeSet > IndexAndAttrSet
Attribute groups as encoded in bitcode are almost AttributeSets, but they include the AttributeList i...
std::vector< std::pair< const Value *, unsigned > > ValueList
std::vector< Type * > TypeList
This class implements an extremely fast bulk output stream that can only output to a stream.
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
An analysis to compute the PointerTypes for pointers in a Module.
void WriteDXILToFile(const Module &M, raw_ostream &Out)
Write the specified module to the specified raw output stream.
DenseMap< const Value *, Type * > PointerTypeMap
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.