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()),
139 PointerMap(PointerTypeAnalysis::run(M)) {
142 for (
auto El : PointerMap)
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());
204 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
206 uint64_t bitcodeStartBit() {
return BitcodeStartBit; }
210 unsigned createDILocationAbbrev();
211 unsigned createGenericDINodeAbbrev();
213 void writeAttributeGroupTable();
214 void writeAttributeTable();
215 void writeTypeTable();
217 void writeValueSymbolTableForwardDecl();
218 void writeModuleInfo();
316 unsigned createNamedMetadataAbbrev();
318 unsigned createMetadataStringsAbbrev();
323 std::vector<unsigned> *MDAbbrevs =
nullptr,
324 std::vector<uint64_t> *IndexPos =
nullptr);
325 void writeModuleMetadata();
326 void writeFunctionMetadata(
const Function &
F);
327 void writeFunctionMetadataAttachment(
const Function &
F);
330 void writeModuleMetadataKinds();
331 void writeOperandBundleTags();
332 void writeSyncScopeNames();
333 void writeConstants(
unsigned FirstVal,
unsigned LastVal,
bool isGlobal);
334 void writeModuleConstants();
335 bool pushValueAndType(
const Value *V,
unsigned InstID,
337 void writeOperandBundles(
const CallBase &CB,
unsigned InstID);
338 void pushValue(
const Value *V,
unsigned InstID,
340 void pushValueSigned(
const Value *V,
unsigned InstID,
342 void writeInstruction(
const Instruction &
I,
unsigned InstID,
345 void writeGlobalValueSymbolTable(
348 void writeBlockInfo();
352 unsigned getEncodedAlign(
MaybeAlign Alignment) {
return encode(Alignment); }
354 unsigned getTypeID(
Type *
T,
const Value *V =
nullptr);
375 Stream->
Emit((
unsigned)
'B', 8);
376 Stream->
Emit((
unsigned)
'C', 8);
377 Stream->
Emit(0x0, 4);
378 Stream->
Emit(0xC, 4);
379 Stream->
Emit(0xE, 4);
380 Stream->
Emit(0xD, 4);
392 Triple TT(M.getTargetTriple());
393 if (TT.isOSDarwin() || TT.isOSBinFormatMachO())
407 auto Abbv = std::make_shared<BitCodeAbbrev>();
410 auto AbbrevNo = Stream->
EmitAbbrev(std::move(Abbv));
423 assert(M.isMaterialized());
424 Mods.push_back(
const_cast<Module *
>(&M));
427 ModuleWriter.
write();
438 case Instruction::Trunc:
440 case Instruction::ZExt:
442 case Instruction::SExt:
444 case Instruction::FPToUI:
446 case Instruction::FPToSI:
448 case Instruction::UIToFP:
450 case Instruction::SIToFP:
452 case Instruction::FPTrunc:
454 case Instruction::FPExt:
456 case Instruction::PtrToInt:
458 case Instruction::IntToPtr:
460 case Instruction::BitCast:
462 case Instruction::AddrSpaceCast:
471 case Instruction::FNeg:
480 case Instruction::Add:
481 case Instruction::FAdd:
483 case Instruction::Sub:
484 case Instruction::FSub:
486 case Instruction::Mul:
487 case Instruction::FMul:
489 case Instruction::UDiv:
491 case Instruction::FDiv:
492 case Instruction::SDiv:
494 case Instruction::URem:
496 case Instruction::FRem:
497 case Instruction::SRem:
499 case Instruction::Shl:
501 case Instruction::LShr:
503 case Instruction::AShr:
505 case Instruction::And:
507 case Instruction::Or:
509 case Instruction::Xor:
514unsigned DXILBitcodeWriter::getTypeID(
Type *
T,
const Value *V) {
515 if (!
T->isPointerTy() &&
518 (!V || !isa<Constant>(V)))
520 auto It = PointerMap.
find(V);
521 if (It != PointerMap.
end())
527 if (V && isa<Constant>(V) && !isa<ConstantPointerNull>(V))
532unsigned DXILBitcodeWriter::getGlobalObjectValueTypeID(
Type *
T,
534 auto It = PointerMap.
find(
G);
535 if (It != PointerMap.
end()) {
601 unsigned AbbrevToUse) {
617 case Attribute::Alignment:
619 case Attribute::AlwaysInline:
621 case Attribute::Builtin:
623 case Attribute::ByVal:
625 case Attribute::Convergent:
627 case Attribute::InAlloca:
629 case Attribute::Cold:
631 case Attribute::InlineHint:
633 case Attribute::InReg:
635 case Attribute::JumpTable:
637 case Attribute::MinSize:
639 case Attribute::Naked:
641 case Attribute::Nest:
643 case Attribute::NoAlias:
645 case Attribute::NoBuiltin:
647 case Attribute::NoCapture:
649 case Attribute::NoDuplicate:
651 case Attribute::NoImplicitFloat:
653 case Attribute::NoInline:
655 case Attribute::NonLazyBind:
657 case Attribute::NonNull:
659 case Attribute::Dereferenceable:
661 case Attribute::DereferenceableOrNull:
663 case Attribute::NoRedZone:
665 case Attribute::NoReturn:
667 case Attribute::NoUnwind:
669 case Attribute::OptimizeForSize:
671 case Attribute::OptimizeNone:
673 case Attribute::ReadNone:
675 case Attribute::ReadOnly:
677 case Attribute::Returned:
679 case Attribute::ReturnsTwice:
681 case Attribute::SExt:
683 case Attribute::StackAlignment:
685 case Attribute::StackProtect:
687 case Attribute::StackProtectReq:
689 case Attribute::StackProtectStrong:
691 case Attribute::SafeStack:
693 case Attribute::StructRet:
695 case Attribute::SanitizeAddress:
697 case Attribute::SanitizeThread:
699 case Attribute::SanitizeMemory:
701 case Attribute::UWTable:
703 case Attribute::ZExt:
714 "should be stripped in DXILPrepare");
734 unsigned NumWords =
A.getActiveWords();
735 const uint64_t *RawData =
A.getRawData();
736 for (
unsigned i = 0; i < NumWords; i++)
743 if (
const auto *OBO = dyn_cast<OverflowingBinaryOperator>(V)) {
744 if (OBO->hasNoSignedWrap())
746 if (OBO->hasNoUnsignedWrap())
748 }
else if (
const auto *PEO = dyn_cast<PossiblyExactOperator>(V)) {
751 }
else if (
const auto *FPMO = dyn_cast<FPMathOperator>(V)) {
752 if (FPMO->hasAllowReassoc() || FPMO->hasAllowContract())
754 if (FPMO->hasNoNaNs())
756 if (FPMO->hasNoInfs())
758 if (FPMO->hasNoSignedZeros())
760 if (FPMO->hasAllowReciprocal())
841 switch (
C.getSelectionKind()) {
860void DXILBitcodeWriter::writeAttributeGroupTable() {
861 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
863 if (AttrGrps.empty())
870 unsigned AttrListIndex = Pair.first;
873 Record.push_back(AttrListIndex);
876 if (Attr.isEnumAttribute()) {
879 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");
882 }
else if (Attr.isIntAttribute()) {
883 if (Attr.getKindAsEnum() == Attribute::AttrKind::Memory) {
901 "DXIL does not support attributes above ATTR_KIND_ARGMEMONLY");
904 Record.push_back(Attr.getValueAsInt());
927void DXILBitcodeWriter::writeAttributeTable() {
936 for (
unsigned i :
AL.indexes()) {
950void DXILBitcodeWriter::writeTypeTable() {
959 auto Abbv = std::make_shared<BitCodeAbbrev>();
963 unsigned PtrAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
966 Abbv = std::make_shared<BitCodeAbbrev>();
971 unsigned FunctionAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
974 Abbv = std::make_shared<BitCodeAbbrev>();
979 unsigned StructAnonAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
982 Abbv = std::make_shared<BitCodeAbbrev>();
986 unsigned StructNameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
989 Abbv = std::make_shared<BitCodeAbbrev>();
994 unsigned StructNamedAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
997 Abbv = std::make_shared<BitCodeAbbrev>();
1001 unsigned ArrayAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1009 for (
Type *
T : TypeList) {
1010 int AbbrevToUse = 0;
1013 switch (
T->getTypeID()) {
1060 AbbrevToUse = PtrAbbrev;
1071 "dxilOpaquePtrReservedName", StructNameAbbrev);
1079 TypeVals.
push_back(getTypeID(FT->getReturnType()));
1080 for (
Type *PTy : FT->params())
1082 AbbrevToUse = FunctionAbbrev;
1090 for (
Type *ElTy :
ST->elements())
1093 if (
ST->isLiteral()) {
1095 AbbrevToUse = StructAnonAbbrev;
1097 if (
ST->isOpaque()) {
1101 AbbrevToUse = StructNamedAbbrev;
1105 if (!
ST->getName().empty())
1115 TypeVals.
push_back(AT->getNumElements());
1116 TypeVals.
push_back(getTypeID(AT->getElementType()));
1117 AbbrevToUse = ArrayAbbrev;
1125 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1126 TypeVals.
push_back(getTypeID(VT->getElementType()));
1132 Stream.
EmitRecord(Code, TypeVals, AbbrevToUse);
1139void DXILBitcodeWriter::writeComdats() {
1144 size_t Size =
C->getName().size();
1147 for (
char Chr :
C->getName())
1154void DXILBitcodeWriter::writeValueSymbolTableForwardDecl() {}
1159void DXILBitcodeWriter::writeModuleInfo() {
1161 if (!
M.getTargetTriple().empty())
1164 const std::string &
DL =
M.getDataLayoutStr();
1167 if (!
M.getModuleInlineAsm().empty())
1173 std::map<std::string, unsigned> SectionMap;
1174 std::map<std::string, unsigned> GCMap;
1176 unsigned MaxGlobalType = 0;
1177 const auto UpdateMaxAlignment = [&MaxAlignment](
const MaybeAlign A) {
1179 MaxAlignment = !MaxAlignment ? *
A : std::max(*MaxAlignment, *
A);
1182 UpdateMaxAlignment(GV.getAlign());
1185 MaxGlobalType = std::max(
1186 MaxGlobalType, getGlobalObjectValueTypeID(GV.getValueType(), &GV));
1187 if (GV.hasSection()) {
1189 unsigned &
Entry = SectionMap[std::string(GV.getSection())];
1192 GV.getSection(), 0 );
1193 Entry = SectionMap.size();
1198 UpdateMaxAlignment(
F.getAlign());
1199 if (
F.hasSection()) {
1201 unsigned &
Entry = SectionMap[std::string(
F.getSection())];
1205 Entry = SectionMap.size();
1210 unsigned &
Entry = GCMap[
F.getGC()];
1214 Entry = GCMap.size();
1220 unsigned SimpleGVarAbbrev = 0;
1221 if (!
M.global_empty()) {
1224 auto Abbv = std::make_shared<BitCodeAbbrev>();
1236 unsigned MaxEncAlignment = getEncodedAlign(MaxAlignment);
1240 if (SectionMap.empty())
1246 SimpleGVarAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1252 unsigned AbbrevToUse = 0;
1258 Vals.
push_back(getGlobalObjectValueTypeID(GV.getValueType(), &GV));
1260 GV.getType()->getAddressSpace() << 2 | 2 |
1261 (GV.isConstant() ? 1 : 0));
1264 GV.isDeclaration() ? 0 : (VE.
getValueID(GV.getInitializer()) + 1));
1266 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1267 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1269 if (GV.isThreadLocal() ||
1272 GV.isExternallyInitialized() ||
1278 Vals.
push_back(GV.isExternallyInitialized());
1282 AbbrevToUse = SimpleGVarAbbrev;
1294 Vals.
push_back(getGlobalObjectValueTypeID(
F.getFunctionType(), &
F));
1299 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1300 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1306 F.hasPrologueData() ? (VE.
getValueID(
F.getPrologueData()) + 1) : 0);
1312 F.hasPersonalityFn() ? (VE.
getValueID(
F.getPersonalityFn()) + 1) : 0);
1314 unsigned AbbrevToUse = 0;
1329 unsigned AbbrevToUse = 0;
1335void DXILBitcodeWriter::writeValueAsMetadata(
1339 Type *Ty =
V->getType();
1340 if (
Function *
F = dyn_cast<Function>(V))
1344 Record.push_back(getTypeID(Ty, V));
1350void DXILBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1353 for (
unsigned i = 0, e =
N->getNumOperands(); i != e; ++i) {
1355 assert(!(MD && isa<LocalAsMetadata>(MD)) &&
1356 "Unexpected function-local metadata");
1365void DXILBitcodeWriter::writeDILocation(
const DILocation *
N,
1369 Abbrev = createDILocationAbbrev();
1370 Record.push_back(
N->isDistinct());
1371 Record.push_back(
N->getLine());
1372 Record.push_back(
N->getColumn());
1383 return I < 0 ? ~(U << 1) : U << 1;
1386void DXILBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1389 Record.push_back(
N->isDistinct());
1394 assert(Count &&
"Count is missing or not ConstantInt");
1398 DISubrange::BoundType LowerBound =
N->getLowerBound();
1400 "Lower bound provided but not ConstantInt");
1408void DXILBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1411 Record.push_back(
N->isDistinct());
1419void DXILBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1422 Record.push_back(
N->isDistinct());
1423 Record.push_back(
N->getTag());
1425 Record.push_back(
N->getSizeInBits());
1426 Record.push_back(
N->getAlignInBits());
1427 Record.push_back(
N->getEncoding());
1433void DXILBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
1436 Record.push_back(
N->isDistinct());
1437 Record.push_back(
N->getTag());
1440 Record.push_back(
N->getLine());
1443 Record.push_back(
N->getSizeInBits());
1444 Record.push_back(
N->getAlignInBits());
1445 Record.push_back(
N->getOffsetInBits());
1446 Record.push_back(
N->getFlags());
1456 Record.push_back(
N->isDistinct());
1457 Record.push_back(
N->getTag());
1460 Record.push_back(
N->getLine());
1463 Record.push_back(
N->getSizeInBits());
1464 Record.push_back(
N->getAlignInBits());
1465 Record.push_back(
N->getOffsetInBits());
1466 Record.push_back(
N->getFlags());
1468 Record.push_back(
N->getRuntimeLang());
1480 Record.push_back(
N->isDistinct());
1481 Record.push_back(
N->getFlags());
1488void DXILBitcodeWriter::writeDIFile(
const DIFile *
N,
1491 Record.push_back(
N->isDistinct());
1499void DXILBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
1502 Record.push_back(
N->isDistinct());
1503 Record.push_back(
N->getSourceLanguage());
1506 Record.push_back(
N->isOptimized());
1508 Record.push_back(
N->getRuntimeVersion());
1510 Record.push_back(
N->getEmissionKind());
1516 Record.push_back(
N->getDWOId());
1522void DXILBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
1525 Record.push_back(
N->isDistinct());
1530 Record.push_back(
N->getLine());
1532 Record.push_back(
N->isLocalToUnit());
1533 Record.push_back(
N->isDefinition());
1534 Record.push_back(
N->getScopeLine());
1536 Record.push_back(
N->getVirtuality());
1537 Record.push_back(
N->getVirtualIndex());
1538 Record.push_back(
N->getFlags());
1539 Record.push_back(
N->isOptimized());
1552 Record.push_back(
N->isDistinct());
1555 Record.push_back(
N->getLine());
1556 Record.push_back(
N->getColumn());
1562void DXILBitcodeWriter::writeDILexicalBlockFile(
1565 Record.push_back(
N->isDistinct());
1568 Record.push_back(
N->getDiscriminator());
1574void DXILBitcodeWriter::writeDINamespace(
const DINamespace *
N,
1577 Record.push_back(
N->isDistinct());
1587void DXILBitcodeWriter::writeDIModule(
const DIModule *
N,
1590 Record.push_back(
N->isDistinct());
1591 for (
auto &
I :
N->operands())
1598void DXILBitcodeWriter::writeDITemplateTypeParameter(
1601 Record.push_back(
N->isDistinct());
1609void DXILBitcodeWriter::writeDITemplateValueParameter(
1612 Record.push_back(
N->isDistinct());
1613 Record.push_back(
N->getTag());
1625 Record.push_back(
N->isDistinct());
1630 Record.push_back(
N->getLine());
1632 Record.push_back(
N->isLocalToUnit());
1633 Record.push_back(
N->isDefinition());
1644 Record.push_back(
N->isDistinct());
1645 Record.push_back(
N->getTag());
1649 Record.push_back(
N->getLine());
1651 Record.push_back(
N->getArg());
1652 Record.push_back(
N->getFlags());
1658void DXILBitcodeWriter::writeDIExpression(
const DIExpression *
N,
1661 Record.reserve(
N->getElements().size() + 1);
1663 Record.push_back(
N->isDistinct());
1664 Record.append(
N->elements_begin(),
N->elements_end());
1679 Record.push_back(
N->isDistinct());
1680 Record.push_back(
N->getTag());
1683 Record.push_back(
N->getLine());
1690unsigned DXILBitcodeWriter::createDILocationAbbrev() {
1695 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1705unsigned DXILBitcodeWriter::createGenericDINodeAbbrev() {
1710 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1723 std::vector<unsigned> *MDAbbrevs,
1724 std::vector<uint64_t> *IndexPos) {
1729#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
1730#include "llvm/IR/Metadata.def"
1735 if (
const MDNode *
N = dyn_cast<MDNode>(MD)) {
1736 assert(
N->isResolved() &&
"Expected forward references to be resolved");
1738 switch (
N->getMetadataID()) {
1741#define HANDLE_MDNODE_LEAF(CLASS) \
1742 case Metadata::CLASS##Kind: \
1744 write##CLASS(cast<CLASS>(N), Record, \
1745 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
1747 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
1749#include "llvm/IR/Metadata.def"
1752 writeValueAsMetadata(cast<ValueAsMetadata>(MD),
Record);
1756unsigned DXILBitcodeWriter::createMetadataStringsAbbrev() {
1757 auto Abbv = std::make_shared<BitCodeAbbrev>();
1764void DXILBitcodeWriter::writeMetadataStrings(
1766 if (Strings.empty())
1769 unsigned MDSAbbrev = createMetadataStringsAbbrev();
1771 for (
const Metadata *MD : Strings) {
1772 const MDString *MDS = cast<MDString>(MD);
1782void DXILBitcodeWriter::writeModuleMetadata() {
1783 if (!VE.
hasMDs() &&
M.named_metadata_empty())
1790 std::vector<unsigned> MDAbbrevs;
1793 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
1794 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
1795 createGenericDINodeAbbrev();
1797 unsigned NameAbbrev = 0;
1798 if (!
M.named_metadata_empty()) {
1800 std::shared_ptr<BitCodeAbbrev> Abbv = std::make_shared<BitCodeAbbrev>();
1804 NameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1810 std::vector<uint64_t> IndexPos;
1818 Record.append(Str.bytes_begin(), Str.bytes_end());
1823 for (
const MDNode *
N : NMD.operands())
1832void DXILBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
1843void DXILBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
1851 F.getAllMetadata(MDs);
1853 for (
const auto &
I : MDs) {
1864 I.getAllMetadataOtherThanDebugLoc(MDs);
1872 for (
unsigned i = 0, e = MDs.size(); i != e; ++i) {
1873 Record.push_back(MDs[i].first);
1883void DXILBitcodeWriter::writeModuleMetadataKinds() {
1889 M.getMDKindNames(Names);
1896 for (
unsigned MDKindID = 0, e = Names.
size(); MDKindID != e; ++MDKindID) {
1897 Record.push_back(MDKindID);
1908void DXILBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
1910 if (FirstVal == LastVal)
1915 unsigned AggregateAbbrev = 0;
1916 unsigned String8Abbrev = 0;
1917 unsigned CString7Abbrev = 0;
1918 unsigned CString6Abbrev = 0;
1922 auto Abbv = std::make_shared<BitCodeAbbrev>();
1927 AggregateAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1930 Abbv = std::make_shared<BitCodeAbbrev>();
1934 String8Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
1936 Abbv = std::make_shared<BitCodeAbbrev>();
1940 CString7Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
1942 Abbv = std::make_shared<BitCodeAbbrev>();
1946 CString6Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
1952 Type *LastTy =
nullptr;
1953 for (
unsigned i = FirstVal; i != LastVal; ++i) {
1954 const Value *
V = Vals[i].first;
1956 if (
V->getType() != LastTy) {
1957 LastTy =
V->getType();
1958 Record.push_back(getTypeID(LastTy, V));
1960 CONSTANTS_SETTYPE_ABBREV);
1964 if (
const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
1965 Record.push_back(
unsigned(
IA->hasSideEffects()) |
1966 unsigned(
IA->isAlignStack()) << 1 |
1967 unsigned(
IA->getDialect() & 1) << 2);
1970 const std::string &AsmStr =
IA->getAsmString();
1971 Record.push_back(AsmStr.size());
1972 Record.append(AsmStr.begin(), AsmStr.end());
1975 const std::string &ConstraintStr =
IA->getConstraintString();
1976 Record.push_back(ConstraintStr.size());
1977 Record.append(ConstraintStr.begin(), ConstraintStr.end());
1983 unsigned Code = -1U;
1984 unsigned AbbrevToUse = 0;
1985 if (
C->isNullValue()) {
1987 }
else if (isa<UndefValue>(
C)) {
1990 if (
IV->getBitWidth() <= 64) {
1994 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2000 unsigned NWords =
IV->getValue().getActiveWords();
2001 const uint64_t *RawWords =
IV->getValue().getRawData();
2002 for (
unsigned i = 0; i != NWords; ++i) {
2007 }
else if (
const ConstantFP *CFP = dyn_cast<ConstantFP>(
C)) {
2009 Type *Ty = CFP->getType();
2011 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2015 APInt api = CFP->getValueAPF().bitcastToAPInt();
2017 Record.push_back((p[1] << 48) | (p[0] >> 16));
2018 Record.push_back(p[0] & 0xffffLL);
2020 APInt api = CFP->getValueAPF().bitcastToAPInt();
2025 assert(0 &&
"Unknown FP type!");
2027 }
else if (isa<ConstantDataSequential>(
C) &&
2028 cast<ConstantDataSequential>(
C)->isString()) {
2031 unsigned NumElts = Str->getNumElements();
2033 if (Str->isCString()) {
2038 AbbrevToUse = String8Abbrev;
2042 for (
unsigned i = 0; i != NumElts; ++i) {
2043 unsigned char V = Str->getElementAsInteger(i);
2045 isCStr7 &= (
V & 128) == 0;
2051 AbbrevToUse = CString6Abbrev;
2053 AbbrevToUse = CString7Abbrev;
2055 dyn_cast<ConstantDataSequential>(
C)) {
2057 Type *EltTy = CDS->getElementType();
2058 if (isa<IntegerType>(EltTy)) {
2059 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i)
2060 Record.push_back(CDS->getElementAsInteger(i));
2062 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2067 F = CDS->getElementAsFloat(i);
2072 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i) {
2077 F = CDS->getElementAsDouble(i);
2081 }
else if (isa<ConstantArray>(
C) || isa<ConstantStruct>(
C) ||
2082 isa<ConstantVector>(
C)) {
2084 for (
const Value *
Op :
C->operands())
2086 AbbrevToUse = AggregateAbbrev;
2087 }
else if (
const ConstantExpr *CE = dyn_cast<ConstantExpr>(
C)) {
2088 switch (
CE->getOpcode()) {
2094 getTypeID(
C->getOperand(0)->getType(),
C->getOperand(0)));
2096 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2098 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
2108 case Instruction::GetElementPtr: {
2110 const auto *GO = cast<GEPOperator>(
C);
2111 if (GO->isInBounds())
2113 Record.push_back(getTypeID(GO->getSourceElementType()));
2114 for (
unsigned i = 0, e =
CE->getNumOperands(); i != e; ++i) {
2116 getTypeID(
C->getOperand(i)->getType(),
C->getOperand(i)));
2121 case Instruction::Select:
2127 case Instruction::ExtractElement:
2129 Record.push_back(getTypeID(
C->getOperand(0)->getType()));
2131 Record.push_back(getTypeID(
C->getOperand(1)->getType()));
2134 case Instruction::InsertElement:
2138 Record.push_back(getTypeID(
C->getOperand(2)->getType()));
2141 case Instruction::ShuffleVector:
2146 if (
C->getType() ==
C->getOperand(0)->getType()) {
2150 Record.push_back(getTypeID(
C->getOperand(0)->getType()));
2157 }
else if (
const BlockAddress *BA = dyn_cast<BlockAddress>(
C)) {
2159 Record.push_back(getTypeID(BA->getFunction()->getType()));
2175void DXILBitcodeWriter::writeModuleConstants() {
2180 for (
unsigned i = 0, e = Vals.size(); i != e; ++i) {
2181 if (!isa<GlobalValue>(Vals[i].first)) {
2182 writeConstants(i, Vals.size(),
true);
2196bool DXILBitcodeWriter::pushValueAndType(
const Value *V,
unsigned InstID,
2201 if (
ValID >= InstID) {
2210void DXILBitcodeWriter::pushValue(
const Value *V,
unsigned InstID,
2216void DXILBitcodeWriter::pushValueSigned(
const Value *V,
unsigned InstID,
2219 int64_t diff = ((int32_t)InstID - (int32_t)
ValID);
2224void DXILBitcodeWriter::writeInstruction(
const Instruction &
I,
unsigned InstID,
2227 unsigned AbbrevToUse = 0;
2229 switch (
I.getOpcode()) {
2233 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2234 AbbrevToUse = (
unsigned)FUNCTION_INST_CAST_ABBREV;
2238 assert(isa<BinaryOperator>(
I) &&
"Unknown instruction!");
2240 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2241 AbbrevToUse = (
unsigned)FUNCTION_INST_BINOP_ABBREV;
2242 pushValue(
I.getOperand(1), InstID, Vals);
2246 if (AbbrevToUse == (
unsigned)FUNCTION_INST_BINOP_ABBREV)
2247 AbbrevToUse = (
unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV;
2253 case Instruction::GetElementPtr: {
2255 AbbrevToUse = (
unsigned)FUNCTION_INST_GEP_ABBREV;
2256 auto &GEPInst = cast<GetElementPtrInst>(
I);
2258 Vals.
push_back(getTypeID(GEPInst.getSourceElementType()));
2259 for (
unsigned i = 0, e =
I.getNumOperands(); i != e; ++i)
2260 pushValueAndType(
I.getOperand(i), InstID, Vals);
2263 case Instruction::ExtractValue: {
2265 pushValueAndType(
I.getOperand(0), InstID, Vals);
2270 case Instruction::InsertValue: {
2272 pushValueAndType(
I.getOperand(0), InstID, Vals);
2273 pushValueAndType(
I.getOperand(1), InstID, Vals);
2278 case Instruction::Select:
2280 pushValueAndType(
I.getOperand(1), InstID, Vals);
2281 pushValue(
I.getOperand(2), InstID, Vals);
2282 pushValueAndType(
I.getOperand(0), InstID, Vals);
2284 case Instruction::ExtractElement:
2286 pushValueAndType(
I.getOperand(0), InstID, Vals);
2287 pushValueAndType(
I.getOperand(1), InstID, Vals);
2289 case Instruction::InsertElement:
2291 pushValueAndType(
I.getOperand(0), InstID, Vals);
2292 pushValue(
I.getOperand(1), InstID, Vals);
2293 pushValueAndType(
I.getOperand(2), InstID, Vals);
2295 case Instruction::ShuffleVector:
2297 pushValueAndType(
I.getOperand(0), InstID, Vals);
2298 pushValue(
I.getOperand(1), InstID, Vals);
2299 pushValue(cast<ShuffleVectorInst>(&
I)->getShuffleMaskForBitcode(), InstID,
2302 case Instruction::ICmp:
2303 case Instruction::FCmp: {
2306 pushValueAndType(
I.getOperand(0), InstID, Vals);
2307 pushValue(
I.getOperand(1), InstID, Vals);
2315 case Instruction::Ret: {
2317 unsigned NumOperands =
I.getNumOperands();
2318 if (NumOperands == 0)
2319 AbbrevToUse = (
unsigned)FUNCTION_INST_RET_VOID_ABBREV;
2320 else if (NumOperands == 1) {
2321 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2322 AbbrevToUse = (
unsigned)FUNCTION_INST_RET_VAL_ABBREV;
2324 for (
unsigned i = 0, e = NumOperands; i !=
e; ++i)
2325 pushValueAndType(
I.getOperand(i), InstID, Vals);
2328 case Instruction::Br: {
2332 if (
II.isConditional()) {
2334 pushValue(
II.getCondition(), InstID, Vals);
2337 case Instruction::Switch: {
2340 Vals.
push_back(getTypeID(
SI.getCondition()->getType()));
2341 pushValue(
SI.getCondition(), InstID, Vals);
2343 for (
auto Case :
SI.cases()) {
2348 case Instruction::IndirectBr:
2350 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2352 pushValue(
I.getOperand(0), InstID, Vals);
2353 for (
unsigned i = 1, e =
I.getNumOperands(); i != e; ++i)
2357 case Instruction::Invoke: {
2368 pushValueAndType(Callee, InstID, Vals);
2371 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
2372 pushValue(
I.getOperand(i), InstID, Vals);
2375 if (FTy->isVarArg()) {
2376 for (
unsigned i = FTy->getNumParams(), e =
I.getNumOperands() - 3; i != e;
2378 pushValueAndType(
I.getOperand(i), InstID, Vals);
2382 case Instruction::Resume:
2384 pushValueAndType(
I.getOperand(0), InstID, Vals);
2386 case Instruction::Unreachable:
2388 AbbrevToUse = (
unsigned)FUNCTION_INST_UNREACHABLE_ABBREV;
2391 case Instruction::PHI: {
2392 const PHINode &PN = cast<PHINode>(
I);
2404 Stream.
EmitRecord(Code, Vals64, AbbrevToUse);
2409 case Instruction::LandingPad: {
2420 pushValueAndType(LP.
getClause(
I), InstID, Vals);
2425 case Instruction::Alloca: {
2429 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2432 assert(AlignRecord < 1 << 5 &&
"alignment greater than 1 << 64");
2434 AlignRecord |= 1 << 6;
2439 case Instruction::Load:
2440 if (cast<LoadInst>(
I).isAtomic()) {
2442 pushValueAndType(
I.getOperand(0), InstID, Vals);
2445 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2446 AbbrevToUse = (
unsigned)FUNCTION_INST_LOAD_ABBREV;
2450 Vals.
push_back(cast<LoadInst>(
I).isVolatile());
2451 if (cast<LoadInst>(
I).isAtomic()) {
2453 Vals.
push_back(getEncodedSyncScopeID(cast<LoadInst>(
I).getSyncScopeID()));
2456 case Instruction::Store:
2457 if (cast<StoreInst>(
I).isAtomic())
2461 pushValueAndType(
I.getOperand(1), InstID, Vals);
2462 pushValueAndType(
I.getOperand(0), InstID, Vals);
2464 Vals.
push_back(cast<StoreInst>(
I).isVolatile());
2465 if (cast<StoreInst>(
I).isAtomic()) {
2468 getEncodedSyncScopeID(cast<StoreInst>(
I).getSyncScopeID()));
2471 case Instruction::AtomicCmpXchg:
2473 pushValueAndType(
I.getOperand(0), InstID, Vals);
2474 pushValueAndType(
I.getOperand(1), InstID, Vals);
2475 pushValue(
I.getOperand(2), InstID, Vals);
2476 Vals.
push_back(cast<AtomicCmpXchgInst>(
I).isVolatile());
2480 getEncodedSyncScopeID(cast<AtomicCmpXchgInst>(
I).getSyncScopeID()));
2483 Vals.
push_back(cast<AtomicCmpXchgInst>(
I).isWeak());
2485 case Instruction::AtomicRMW:
2487 pushValueAndType(
I.getOperand(0), InstID, Vals);
2488 pushValue(
I.getOperand(1), InstID, Vals);
2491 Vals.
push_back(cast<AtomicRMWInst>(
I).isVolatile());
2494 getEncodedSyncScopeID(cast<AtomicRMWInst>(
I).getSyncScopeID()));
2496 case Instruction::Fence:
2499 Vals.
push_back(getEncodedSyncScopeID(cast<FenceInst>(
I).getSyncScopeID()));
2501 case Instruction::Call: {
2514 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
2516 if (FTy->getParamType(i)->isLabelTy())
2523 if (FTy->isVarArg()) {
2524 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
2529 case Instruction::VAArg:
2531 Vals.
push_back(getTypeID(
I.getOperand(0)->getType()));
2532 pushValue(
I.getOperand(0), InstID, Vals);
2542void DXILBitcodeWriter::writeFunctionLevelValueSymbolTable(
2555 for (
auto &VI : VST) {
2560 return A->first() <
B->first();
2563 for (
const ValueName *SI : SortedTable) {
2568 bool isChar6 =
true;
2569 for (
const char *
C =
Name.getKeyData(), *E =
C +
Name.getKeyLength();
2573 if ((
unsigned char)*
C & 128) {
2579 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
2584 if (isa<BasicBlock>(
SI->getValue())) {
2587 AbbrevToUse = VST_BBENTRY_6_ABBREV;
2591 AbbrevToUse = VST_ENTRY_6_ABBREV;
2593 AbbrevToUse = VST_ENTRY_7_ABBREV;
2597 for (
const char *
P =
Name.getKeyData(),
2598 *E =
Name.getKeyData() +
Name.getKeyLength();
2603 Stream.
EmitRecord(Code, NameVals, AbbrevToUse);
2610void DXILBitcodeWriter::writeFunction(
const Function &
F) {
2623 unsigned CstStart, CstEnd;
2625 writeConstants(CstStart, CstEnd,
false);
2628 writeFunctionMetadata(
F);
2631 unsigned InstID = CstEnd;
2633 bool NeedsMetadataAttachment =
F.hasMetadata();
2641 writeInstruction(*
I, InstID, Vals);
2643 if (!
I->getType()->isVoidTy())
2647 NeedsMetadataAttachment |=
I->hasMetadataOtherThanDebugLoc();
2671 if (
auto *Symtab =
F.getValueSymbolTable())
2672 writeFunctionLevelValueSymbolTable(*Symtab);
2674 if (NeedsMetadataAttachment)
2675 writeFunctionMetadataAttachment(
F);
2682void DXILBitcodeWriter::writeBlockInfo() {
2689 auto Abbv = std::make_shared<BitCodeAbbrev>();
2695 std::move(Abbv)) != VST_ENTRY_8_ABBREV)
2696 assert(
false &&
"Unexpected abbrev ordering!");
2700 auto Abbv = std::make_shared<BitCodeAbbrev>();
2706 std::move(Abbv)) != VST_ENTRY_7_ABBREV)
2707 assert(
false &&
"Unexpected abbrev ordering!");
2710 auto Abbv = std::make_shared<BitCodeAbbrev>();
2716 std::move(Abbv)) != VST_ENTRY_6_ABBREV)
2717 assert(
false &&
"Unexpected abbrev ordering!");
2720 auto Abbv = std::make_shared<BitCodeAbbrev>();
2726 std::move(Abbv)) != VST_BBENTRY_6_ABBREV)
2727 assert(
false &&
"Unexpected abbrev ordering!");
2731 auto Abbv = std::make_shared<BitCodeAbbrev>();
2736 CONSTANTS_SETTYPE_ABBREV)
2737 assert(
false &&
"Unexpected abbrev ordering!");
2741 auto Abbv = std::make_shared<BitCodeAbbrev>();
2745 CONSTANTS_INTEGER_ABBREV)
2746 assert(
false &&
"Unexpected abbrev ordering!");
2750 auto Abbv = std::make_shared<BitCodeAbbrev>();
2758 CONSTANTS_CE_CAST_Abbrev)
2759 assert(
false &&
"Unexpected abbrev ordering!");
2762 auto Abbv = std::make_shared<BitCodeAbbrev>();
2765 CONSTANTS_NULL_Abbrev)
2766 assert(
false &&
"Unexpected abbrev ordering!");
2772 auto Abbv = std::make_shared<BitCodeAbbrev>();
2780 (
unsigned)FUNCTION_INST_LOAD_ABBREV)
2781 assert(
false &&
"Unexpected abbrev ordering!");
2784 auto Abbv = std::make_shared<BitCodeAbbrev>();
2790 (
unsigned)FUNCTION_INST_BINOP_ABBREV)
2791 assert(
false &&
"Unexpected abbrev ordering!");
2794 auto Abbv = std::make_shared<BitCodeAbbrev>();
2801 (
unsigned)FUNCTION_INST_BINOP_FLAGS_ABBREV)
2802 assert(
false &&
"Unexpected abbrev ordering!");
2805 auto Abbv = std::make_shared<BitCodeAbbrev>();
2812 (
unsigned)FUNCTION_INST_CAST_ABBREV)
2813 assert(
false &&
"Unexpected abbrev ordering!");
2817 auto Abbv = std::make_shared<BitCodeAbbrev>();
2820 (
unsigned)FUNCTION_INST_RET_VOID_ABBREV)
2821 assert(
false &&
"Unexpected abbrev ordering!");
2824 auto Abbv = std::make_shared<BitCodeAbbrev>();
2828 (
unsigned)FUNCTION_INST_RET_VAL_ABBREV)
2829 assert(
false &&
"Unexpected abbrev ordering!");
2832 auto Abbv = std::make_shared<BitCodeAbbrev>();
2835 (
unsigned)FUNCTION_INST_UNREACHABLE_ABBREV)
2836 assert(
false &&
"Unexpected abbrev ordering!");
2839 auto Abbv = std::make_shared<BitCodeAbbrev>();
2847 (
unsigned)FUNCTION_INST_GEP_ABBREV)
2848 assert(
false &&
"Unexpected abbrev ordering!");
2854void DXILBitcodeWriter::writeModuleVersion() {
2869 DXILBitcodeWriter::writeModuleVersion();
2875 writeAttributeGroupTable();
2878 writeAttributeTable();
2890 writeModuleConstants();
2893 writeModuleMetadataKinds();
2896 writeModuleMetadata();
2901 writeFunctionLevelValueSymbolTable(M.getValueSymbolTable());
2905 if (!
F.isDeclaration())
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
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
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
an instruction to allocate memory on the stack
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.
bool hasAttributes() const
Return true if attributes exists in this set.
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.
LLVM Basic Block Representation.
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 EmitRecord(unsigned Code, const Container &Vals, unsigned Abbrev=0)
EmitRecord - Emit the specified record to the stream, using an abbrev if we have one to compress the ...
void Emit(uint32_t Val, unsigned NumBits)
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...
unsigned EmitBlockInfoAbbrev(unsigned BlockID, std::shared_ptr< BitCodeAbbrev > Abbv)
EmitBlockInfoAbbrev - Emit a DEFINE_ABBREV record for the specified BlockID.
void EnterBlockInfoBlock()
EnterBlockInfoBlock - Start emitting the BLOCKINFO_BLOCK.
void EnterSubblock(unsigned BlockID, unsigned CodeLen)
uint64_t GetCurrentBitNo() const
Retrieve the current position in the stream, in bits.
The address of a basic block.
Conditional or Unconditional Branch instruction.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
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.
This class represents a function call, abstracting a target machine's calling convention.
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.
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
A constant value that is initialized with an expression using other constant values.
ConstantFP - Floating Point Values [float, double].
This is the shared class of boolean and integer constants.
const APInt & getValue() const
Return the constant as an APInt value reference.
This is an important base class in LLVM.
List of ValueAsMetadata, to be used as an argument to a dbg.value intrinsic.
Basic type, like 'int' or 'float'.
A pair of DIGlobalVariable and DIExpression.
An imported module (C++ using directive or similar).
Represents a module in the programming language, for example, a Clang module, or a Fortran module.
String type, Fortran CHARACTER(n)
Type array for a subprogram.
This class represents an Operation in the Expression.
iterator find(const_arg_type_t< KeyT > Val)
BasicBlockListType::const_iterator const_iterator
Generic tagged DWARF-like metadata node.
Function and variable summary information to aid decisions and implementation of importing.
VisibilityTypes getVisibility() const
LinkageTypes getLinkage() const
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
This instruction inserts a struct field of array element value into an aggregate value.
idx_iterator idx_end() const
idx_iterator idx_begin() const
The landingpad instruction holds all of the information necessary to generate correct exception handl...
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.
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
Utility for building string tables with deduplicated suffixes.
Class to represent struct types.
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 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.
std::vector< std::pair< const Value *, unsigned > > ValueList
std::vector< Type * > TypeList
This class provides a symbol table of name/value pairs.
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)
ArrayRef< const Metadata * > getNonMDStrings() const
Get the non-MDString metadata for this block.
unsigned getValueID(const Value *V) const
std::pair< unsigned, AttributeSet > IndexAndAttrSet
Attribute groups as encoded in bitcode are almost AttributeSets, but they include the AttributeList i...
void setInstructionID(const Instruction *I)
void EnumerateType(Type *T)
unsigned getMetadataOrNullID(const Metadata *MD) const
const std::vector< IndexAndAttrSet > & getAttributeGroups() const
unsigned getComdatID(const Comdat *C) const
ArrayRef< const Metadata * > getMDStrings() const
Get the MDString metadata for this block.
bool hasMDs() const
Check whether the current block has any metadata to emit.
uint64_t computeBitsRequiredForTypeIndices() const
const ComdatSetType & getComdats() const
unsigned getAttributeListID(AttributeList PAL) const
unsigned getMetadataID(const Metadata *MD) const
const TypeList & getTypes() const
const std::vector< AttributeList > & getAttributeLists() const
void incorporateFunction(const Function &F)
incorporateFunction/purgeFunction - If you'd like to deal with a function, use these two methods to g...
unsigned getTypeID(Type *T) const
unsigned getInstructionID(const Instruction *I) const
const ValueList & getValues() const
unsigned getGlobalBasicBlockID(const BasicBlock *BB) const
getGlobalBasicBlockID - This returns the function-specific ID for the specified basic block.
void getFunctionConstantRange(unsigned &Start, unsigned &End) const
getFunctionConstantRange - Return the range of values that corresponds to function-local constants.
const std::vector< const BasicBlock * > & getBasicBlocks() const
unsigned getAttributeGroupID(IndexAndAttrSet Group) const
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
void WriteDXILToFile(const Module &M, raw_ostream &Out)
Write the specified module to the specified raw output stream.
NodeAddr< CodeNode * > Code
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.
unsigned encode(MaybeAlign A)
Returns a representation of the alignment that encodes undefined as 0.
MaybeAlign getAlign(const Function &F, unsigned Index)
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)
AtomicOrdering
Atomic ordering for LLVM's memory model.
unsigned Log2(Align A)
Returns the log2 of the alignment.
uint64_t value() const
This is a hole in the type system and should not be abused.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
ValID - Represents a reference of a definition of some sort with no type.
Struct that holds a reference to a particular GUID in a global value summary.