31#include "llvm/Config/llvm-config.h"
88 cl::desc(
"Number of metadatas above which we emit an index "
89 "to enable lazy-loading"));
92 cl::desc(
"The threshold (unit M) for flushing LLVM bitcode."));
96 cl::desc(
"Write relative block frequency to function summary "));
111 VST_BBENTRY_6_ABBREV,
115 CONSTANTS_INTEGER_ABBREV,
116 CONSTANTS_CE_CAST_Abbrev,
117 CONSTANTS_NULL_Abbrev,
121 FUNCTION_INST_UNOP_ABBREV,
122 FUNCTION_INST_UNOP_FLAGS_ABBREV,
123 FUNCTION_INST_BINOP_ABBREV,
124 FUNCTION_INST_BINOP_FLAGS_ABBREV,
125 FUNCTION_INST_CAST_ABBREV,
126 FUNCTION_INST_RET_VOID_ABBREV,
127 FUNCTION_INST_RET_VAL_ABBREV,
128 FUNCTION_INST_UNREACHABLE_ABBREV,
129 FUNCTION_INST_GEP_ABBREV,
134class BitcodeWriterBase {
145 : Stream(Stream), StrtabBuilder(StrtabBuilder) {}
148 void writeModuleVersion();
151void BitcodeWriterBase::writeModuleVersion() {
158class ModuleBitcodeWriterBase :
public BitcodeWriterBase {
172 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
175 unsigned GlobalValueId;
186 bool ShouldPreserveUseListOrder,
188 : BitcodeWriterBase(Stream, StrtabBuilder),
M(
M),
198 for (
const auto &GUIDSummaryLists : *
Index)
200 for (
auto &Summary : GUIDSummaryLists.second.SummaryList)
201 if (
auto FS = dyn_cast<FunctionSummary>(
Summary.get()))
206 for (
auto &CallEdge :
FS->calls())
207 if (!CallEdge.first.haveGVs() || !CallEdge.first.getValue())
208 assignValueId(CallEdge.first.getGUID());
212 void writePerModuleGlobalValueSummary();
215 void writePerModuleFunctionSummaryRecord(
217 unsigned ValueID,
unsigned FSCallsAbbrev,
unsigned FSCallsProfileAbbrev,
218 unsigned CallsiteAbbrev,
unsigned AllocAbbrev,
const Function &
F);
221 unsigned FSModRefsAbbrev,
222 unsigned FSModVTableRefsAbbrev);
225 GUIDToValueIdMap[ValGUID] = ++GlobalValueId;
229 const auto &VMI = GUIDToValueIdMap.find(ValGUID);
232 assert(VMI != GUIDToValueIdMap.end() &&
233 "GUID does not have assigned value Id");
239 if (!
VI.haveGVs() || !
VI.getValue())
240 return getValueId(
VI.getGUID());
244 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
248class ModuleBitcodeWriter :
public ModuleBitcodeWriterBase {
272 : ModuleBitcodeWriterBase(
M, StrtabBuilder, Stream,
273 ShouldPreserveUseListOrder,
Index),
274 Buffer(Buffer), GenerateHash(GenerateHash), ModHash(ModHash),
275 BitcodeStartBit(Stream.GetCurrentBitNo()) {}
281 uint64_t bitcodeStartBit() {
return BitcodeStartBit; }
285 void writeAttributeGroupTable();
286 void writeAttributeTable();
287 void writeTypeTable();
289 void writeValueSymbolTableForwardDecl();
290 void writeModuleInfo();
295 unsigned createDILocationAbbrev();
298 unsigned createGenericDINodeAbbrev();
367 unsigned createNamedMetadataAbbrev();
369 unsigned createMetadataStringsAbbrev();
374 std::vector<unsigned> *MDAbbrevs =
nullptr,
375 std::vector<uint64_t> *IndexPos =
nullptr);
376 void writeModuleMetadata();
377 void writeFunctionMetadata(
const Function &
F);
378 void writeFunctionMetadataAttachment(
const Function &
F);
381 void writeModuleMetadataKinds();
382 void writeOperandBundleTags();
383 void writeSyncScopeNames();
384 void writeConstants(
unsigned FirstVal,
unsigned LastVal,
bool isGlobal);
385 void writeModuleConstants();
386 bool pushValueAndType(
const Value *V,
unsigned InstID,
388 void writeOperandBundles(
const CallBase &CB,
unsigned InstID);
389 void pushValue(
const Value *V,
unsigned InstID,
391 void pushValueSigned(
const Value *V,
unsigned InstID,
393 void writeInstruction(
const Instruction &
I,
unsigned InstID,
396 void writeGlobalValueSymbolTable(
399 void writeUseListBlock(
const Function *
F);
403 void writeBlockInfo();
404 void writeModuleHash(
size_t BlockStartPos);
410 unsigned getEncodedAlign(
MaybeAlign Alignment) {
return encode(Alignment); }
414class IndexBitcodeWriter :
public BitcodeWriterBase {
420 const std::map<std::string, GVSummaryMapTy> *ModuleToSummariesForIndex;
424 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
429 std::vector<unsigned> StackIdIndices;
432 unsigned GlobalValueId = 0;
440 const std::map<std::string, GVSummaryMapTy>
441 *ModuleToSummariesForIndex =
nullptr)
442 : BitcodeWriterBase(Stream, StrtabBuilder),
Index(
Index),
443 ModuleToSummariesForIndex(ModuleToSummariesForIndex) {
448 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
449 GUIDToValueIdMap[
I.first] = ++GlobalValueId;
452 auto *
FS = dyn_cast<FunctionSummary>(
I.second);
458 for (
auto &CI :
FS->callsites())
459 for (
auto Idx : CI.StackIdIndices)
460 StackIdIndices.push_back(
Idx);
461 for (
auto &AI :
FS->allocs())
462 for (
auto &MIB : AI.MIBs)
463 for (
auto Idx : MIB.StackIdIndices)
464 StackIdIndices.push_back(
Idx);
467 StackIdIndices.erase(
468 std::unique(StackIdIndices.begin(), StackIdIndices.end()),
469 StackIdIndices.end());
473 using GVInfo = std::pair<GlobalValue::GUID, GlobalValueSummary *>;
478 template<
typename Functor>
479 void forEachSummary(Functor Callback) {
480 if (ModuleToSummariesForIndex) {
481 for (
auto &M : *ModuleToSummariesForIndex)
482 for (
auto &Summary :
M.second) {
483 Callback(Summary,
false);
487 if (
auto *AS = dyn_cast<AliasSummary>(
Summary.getSecond()))
488 Callback({AS->getAliaseeGUID(), &AS->getAliasee()},
true);
491 for (
auto &Summaries :
Index)
492 for (
auto &Summary : Summaries.second.SummaryList)
493 Callback({Summaries.first,
Summary.get()},
false);
501 template <
typename Functor>
void forEachModule(Functor Callback) {
502 if (ModuleToSummariesForIndex) {
503 for (
const auto &M : *ModuleToSummariesForIndex) {
504 const auto &MPI =
Index.modulePaths().find(
M.first);
505 if (MPI ==
Index.modulePaths().end()) {
509 assert(ModuleToSummariesForIndex->size() == 1);
515 for (
const auto &MPSE :
Index.modulePaths())
524 void writeModStrings();
525 void writeCombinedGlobalValueSummary();
528 auto VMI = GUIDToValueIdMap.find(ValGUID);
529 if (VMI == GUIDToValueIdMap.end())
534 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
568 case Instruction::Add:
570 case Instruction::Sub:
572 case Instruction::Mul:
575 case Instruction::FDiv:
578 case Instruction::FRem:
644 case Attribute::Alignment:
646 case Attribute::AllocAlign:
648 case Attribute::AllocSize:
650 case Attribute::AlwaysInline:
652 case Attribute::Builtin:
654 case Attribute::ByVal:
656 case Attribute::Convergent:
658 case Attribute::InAlloca:
660 case Attribute::Cold:
662 case Attribute::DisableSanitizerInstrumentation:
664 case Attribute::FnRetThunkExtern:
668 case Attribute::ElementType:
670 case Attribute::InlineHint:
672 case Attribute::InReg:
674 case Attribute::JumpTable:
676 case Attribute::MinSize:
678 case Attribute::AllocatedPointer:
680 case Attribute::AllocKind:
682 case Attribute::Memory:
684 case Attribute::NoFPClass:
686 case Attribute::Naked:
688 case Attribute::Nest:
690 case Attribute::NoAlias:
692 case Attribute::NoBuiltin:
694 case Attribute::NoCallback:
696 case Attribute::NoCapture:
698 case Attribute::NoDuplicate:
700 case Attribute::NoFree:
702 case Attribute::NoImplicitFloat:
704 case Attribute::NoInline:
706 case Attribute::NoRecurse:
708 case Attribute::NoMerge:
710 case Attribute::NonLazyBind:
712 case Attribute::NonNull:
714 case Attribute::Dereferenceable:
716 case Attribute::DereferenceableOrNull:
718 case Attribute::NoRedZone:
720 case Attribute::NoReturn:
722 case Attribute::NoSync:
724 case Attribute::NoCfCheck:
726 case Attribute::NoProfile:
728 case Attribute::SkipProfile:
730 case Attribute::NoUnwind:
732 case Attribute::NoSanitizeBounds:
734 case Attribute::NoSanitizeCoverage:
736 case Attribute::NullPointerIsValid:
738 case Attribute::OptForFuzzing:
740 case Attribute::OptimizeForSize:
742 case Attribute::OptimizeNone:
744 case Attribute::ReadNone:
746 case Attribute::ReadOnly:
748 case Attribute::Returned:
750 case Attribute::ReturnsTwice:
752 case Attribute::SExt:
754 case Attribute::Speculatable:
756 case Attribute::StackAlignment:
758 case Attribute::StackProtect:
760 case Attribute::StackProtectReq:
762 case Attribute::StackProtectStrong:
764 case Attribute::SafeStack:
766 case Attribute::ShadowCallStack:
768 case Attribute::StrictFP:
770 case Attribute::StructRet:
772 case Attribute::SanitizeAddress:
774 case Attribute::SanitizeHWAddress:
776 case Attribute::SanitizeThread:
778 case Attribute::SanitizeMemory:
780 case Attribute::SpeculativeLoadHardening:
782 case Attribute::SwiftError:
784 case Attribute::SwiftSelf:
786 case Attribute::SwiftAsync:
788 case Attribute::UWTable:
790 case Attribute::VScaleRange:
792 case Attribute::WillReturn:
794 case Attribute::WriteOnly:
796 case Attribute::ZExt:
798 case Attribute::ImmArg:
800 case Attribute::SanitizeMemTag:
802 case Attribute::Preallocated:
804 case Attribute::NoUndef:
806 case Attribute::ByRef:
808 case Attribute::MustProgress:
810 case Attribute::PresplitCoroutine:
824void ModuleBitcodeWriter::writeAttributeGroupTable() {
825 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
827 if (AttrGrps.empty())
return;
833 unsigned AttrListIndex = Pair.first;
836 Record.push_back(AttrListIndex);
839 if (Attr.isEnumAttribute()) {
842 }
else if (Attr.isIntAttribute()) {
845 Record.push_back(Attr.getValueAsInt());
846 }
else if (Attr.isStringAttribute()) {
858 assert(Attr.isTypeAttribute());
859 Type *Ty = Attr.getValueAsType();
860 Record.push_back(Ty ? 6 : 5);
874void ModuleBitcodeWriter::writeAttributeTable() {
876 if (
Attrs.empty())
return;
882 for (
unsigned i :
AL.indexes()) {
896void ModuleBitcodeWriter::writeTypeTable() {
905 auto Abbv = std::make_shared<BitCodeAbbrev>();
908 unsigned OpaquePtrAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
911 Abbv = std::make_shared<BitCodeAbbrev>();
916 unsigned FunctionAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
919 Abbv = std::make_shared<BitCodeAbbrev>();
924 unsigned StructAnonAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
927 Abbv = std::make_shared<BitCodeAbbrev>();
931 unsigned StructNameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
934 Abbv = std::make_shared<BitCodeAbbrev>();
939 unsigned StructNamedAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
942 Abbv = std::make_shared<BitCodeAbbrev>();
946 unsigned ArrayAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
954 for (
Type *
T : TypeList) {
958 switch (
T->getTypeID()) {
980 if (PTy->isOpaque()) {
985 AbbrevToUse = OpaquePtrAbbrev;
1000 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i)
1002 AbbrevToUse = FunctionAbbrev;
1010 for (
Type *ET :
ST->elements())
1013 if (
ST->isLiteral()) {
1015 AbbrevToUse = StructAnonAbbrev;
1017 if (
ST->isOpaque()) {
1021 AbbrevToUse = StructNamedAbbrev;
1025 if (!
ST->getName().empty())
1035 TypeVals.
push_back(AT->getNumElements());
1037 AbbrevToUse = ArrayAbbrev;
1046 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1048 if (isa<ScalableVectorType>(VT))
1058 for (
Type *InnerTy :
TET->type_params())
1060 for (
unsigned IntParam :
TET->int_params())
1069 Stream.
EmitRecord(Code, TypeVals, AbbrevToUse);
1110 RawFlags |=
Flags.ReadNone;
1111 RawFlags |= (
Flags.ReadOnly << 1);
1112 RawFlags |= (
Flags.NoRecurse << 2);
1113 RawFlags |= (
Flags.ReturnDoesNotAlias << 3);
1114 RawFlags |= (
Flags.NoInline << 4);
1115 RawFlags |= (
Flags.AlwaysInline << 5);
1116 RawFlags |= (
Flags.NoUnwind << 6);
1117 RawFlags |= (
Flags.MayThrow << 7);
1118 RawFlags |= (
Flags.HasUnknownCall << 8);
1119 RawFlags |= (
Flags.MustBeUnreachable << 9);
1128 RawFlags |=
Flags.NotEligibleToImport;
1129 RawFlags |= (
Flags.Live << 1);
1130 RawFlags |= (
Flags.DSOLocal << 2);
1131 RawFlags |= (
Flags.CanAutoHide << 3);
1136 RawFlags = (RawFlags << 4) |
Flags.Linkage;
1138 RawFlags |= (
Flags.Visibility << 8);
1145 (
Flags.Constant << 2) |
Flags.VCallVisibility << 3;
1169 case GlobalVariable::NotThreadLocal:
return 0;
1170 case GlobalVariable::GeneralDynamicTLSModel:
return 1;
1171 case GlobalVariable::LocalDynamicTLSModel:
return 2;
1172 case GlobalVariable::InitialExecTLSModel:
return 3;
1173 case GlobalVariable::LocalExecTLSModel:
return 4;
1179 switch (
C.getSelectionKind()) {
1196 case GlobalValue::UnnamedAddr::None:
return 0;
1197 case GlobalValue::UnnamedAddr::Local:
return 2;
1198 case GlobalValue::UnnamedAddr::Global:
return 1;
1203size_t ModuleBitcodeWriter::addToStrtab(
StringRef Str) {
1206 return StrtabBuilder.
add(Str);
1209void ModuleBitcodeWriter::writeComdats() {
1224void ModuleBitcodeWriter::writeValueSymbolTableForwardDecl() {
1229 auto Abbv = std::make_shared<BitCodeAbbrev>();
1235 unsigned VSTOffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1251 bool isChar6 =
true;
1252 for (
char C : Str) {
1255 if ((
unsigned char)
C & 128)
1265 "Sanitizer Metadata is too large for naive serialization.");
1268 return Meta.NoAddress | (Meta.NoHWAddress << 1) |
1269 (Meta.Memtag << 2) | (Meta.IsDynInit << 3);
1275void ModuleBitcodeWriter::writeModuleInfo() {
1277 if (!
M.getTargetTriple().empty())
1280 const std::string &
DL =
M.getDataLayoutStr();
1283 if (!
M.getModuleInlineAsm().empty())
1289 std::map<std::string, unsigned> SectionMap;
1290 std::map<std::string, unsigned> GCMap;
1292 unsigned MaxGlobalType = 0;
1293 const auto UpdateMaxAlignment = [&MaxAlignment](
const MaybeAlign A) {
1295 MaxAlignment = !MaxAlignment ? *
A : std::max(*MaxAlignment, *
A);
1298 UpdateMaxAlignment(GV.getAlign());
1299 MaxGlobalType = std::max(MaxGlobalType, VE.
getTypeID(GV.getValueType()));
1300 if (GV.hasSection()) {
1302 unsigned &Entry = SectionMap[std::string(GV.getSection())];
1306 Entry = SectionMap.size();
1311 UpdateMaxAlignment(
F.getAlign());
1312 if (
F.hasSection()) {
1314 unsigned &Entry = SectionMap[std::string(
F.getSection())];
1318 Entry = SectionMap.size();
1323 unsigned &Entry = GCMap[
F.getGC()];
1327 Entry = GCMap.size();
1333 unsigned SimpleGVarAbbrev = 0;
1334 if (!
M.global_empty()) {
1336 auto Abbv = std::make_shared<BitCodeAbbrev>();
1350 unsigned MaxEncAlignment = getEncodedAlign(MaxAlignment);
1354 if (SectionMap.empty())
1360 SimpleGVarAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1374 auto Abbv = std::make_shared<BitCodeAbbrev>();
1377 Abbv->Add(AbbrevOpToUse);
1378 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1380 for (
const auto P :
M.getSourceFileName())
1390 unsigned AbbrevToUse = 0;
1396 Vals.
push_back(addToStrtab(GV.getName()));
1399 Vals.
push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant());
1403 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1404 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1406 if (GV.isThreadLocal() ||
1408 GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||
1409 GV.isExternallyInitialized() ||
1411 GV.hasComdat() || GV.hasAttributes() || GV.isDSOLocal() ||
1412 GV.hasPartition() || GV.hasSanitizerMetadata()) {
1416 Vals.
push_back(GV.isExternallyInitialized());
1424 Vals.
push_back(addToStrtab(GV.getPartition()));
1425 Vals.
push_back(GV.getPartition().size());
1428 GV.getSanitizerMetadata())
1431 AbbrevToUse = SimpleGVarAbbrev;
1451 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1452 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1464 F.hasPersonalityFn() ? (VE.
getValueID(
F.getPersonalityFn()) + 1) : 0);
1468 Vals.
push_back(addToStrtab(
F.getPartition()));
1471 unsigned AbbrevToUse = 0;
1484 Vals.
push_back(
A.getType()->getAddressSpace());
1492 Vals.
push_back(addToStrtab(
A.getPartition()));
1495 unsigned AbbrevToUse = 0;
1507 Vals.
push_back(
I.getType()->getAddressSpace());
1512 Vals.
push_back(addToStrtab(
I.getPartition()));
1518 writeValueSymbolTableForwardDecl();
1524 if (
const auto *OBO = dyn_cast<OverflowingBinaryOperator>(V)) {
1525 if (OBO->hasNoSignedWrap())
1527 if (OBO->hasNoUnsignedWrap())
1529 }
else if (
const auto *PEO = dyn_cast<PossiblyExactOperator>(V)) {
1532 }
else if (
const auto *FPMO = dyn_cast<FPMathOperator>(V)) {
1533 if (FPMO->hasAllowReassoc())
1535 if (FPMO->hasNoNaNs())
1537 if (FPMO->hasNoInfs())
1539 if (FPMO->hasNoSignedZeros())
1541 if (FPMO->hasAllowReciprocal())
1543 if (FPMO->hasAllowContract())
1545 if (FPMO->hasApproxFunc())
1552void ModuleBitcodeWriter::writeValueAsMetadata(
1562void ModuleBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1565 for (
unsigned i = 0, e =
N->getNumOperands(); i != e; ++i) {
1567 assert(!(MD && isa<LocalAsMetadata>(MD)) &&
1568 "Unexpected function-local metadata");
1577unsigned ModuleBitcodeWriter::createDILocationAbbrev() {
1580 auto Abbv = std::make_shared<BitCodeAbbrev>();
1591void ModuleBitcodeWriter::writeDILocation(
const DILocation *
N,
1595 Abbrev = createDILocationAbbrev();
1597 Record.push_back(
N->isDistinct());
1598 Record.push_back(
N->getLine());
1599 Record.push_back(
N->getColumn());
1602 Record.push_back(
N->isImplicitCode());
1608unsigned ModuleBitcodeWriter::createGenericDINodeAbbrev() {
1611 auto Abbv = std::make_shared<BitCodeAbbrev>();
1622void ModuleBitcodeWriter::writeGenericDINode(
const GenericDINode *
N,
1626 Abbrev = createGenericDINodeAbbrev();
1628 Record.push_back(
N->isDistinct());
1629 Record.push_back(
N->getTag());
1632 for (
auto &
I :
N->operands())
1639void ModuleBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1653void ModuleBitcodeWriter::writeDIGenericSubrange(
1667 if ((int64_t)V >= 0)
1678 unsigned NumWords =
A.getActiveWords();
1679 const uint64_t *RawData =
A.getRawData();
1680 for (
unsigned i = 0; i < NumWords; i++)
1684void ModuleBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1688 Record.push_back(IsBigInt | (
N->isUnsigned() << 1) |
N->isDistinct());
1689 Record.push_back(
N->getValue().getBitWidth());
1697void ModuleBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1700 Record.push_back(
N->isDistinct());
1701 Record.push_back(
N->getTag());
1703 Record.push_back(
N->getSizeInBits());
1704 Record.push_back(
N->getAlignInBits());
1705 Record.push_back(
N->getEncoding());
1706 Record.push_back(
N->getFlags());
1712void ModuleBitcodeWriter::writeDIStringType(
const DIStringType *
N,
1715 Record.push_back(
N->isDistinct());
1716 Record.push_back(
N->getTag());
1721 Record.push_back(
N->getSizeInBits());
1722 Record.push_back(
N->getAlignInBits());
1723 Record.push_back(
N->getEncoding());
1729void ModuleBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
1732 Record.push_back(
N->isDistinct());
1733 Record.push_back(
N->getTag());
1736 Record.push_back(
N->getLine());
1739 Record.push_back(
N->getSizeInBits());
1740 Record.push_back(
N->getAlignInBits());
1741 Record.push_back(
N->getOffsetInBits());
1742 Record.push_back(
N->getFlags());
1747 if (
const auto &DWARFAddressSpace =
N->getDWARFAddressSpace())
1748 Record.push_back(*DWARFAddressSpace + 1);
1758void ModuleBitcodeWriter::writeDICompositeType(
1761 const unsigned IsNotUsedInOldTypeRef = 0x2;
1762 Record.push_back(IsNotUsedInOldTypeRef | (
unsigned)
N->isDistinct());
1763 Record.push_back(
N->getTag());
1766 Record.push_back(
N->getLine());
1769 Record.push_back(
N->getSizeInBits());
1770 Record.push_back(
N->getAlignInBits());
1771 Record.push_back(
N->getOffsetInBits());
1772 Record.push_back(
N->getFlags());
1774 Record.push_back(
N->getRuntimeLang());
1789void ModuleBitcodeWriter::writeDISubroutineType(
1792 const unsigned HasNoOldTypeRefs = 0x2;
1793 Record.push_back(HasNoOldTypeRefs | (
unsigned)
N->isDistinct());
1794 Record.push_back(
N->getFlags());
1802void ModuleBitcodeWriter::writeDIFile(
const DIFile *
N,
1805 Record.push_back(
N->isDistinct());
1808 if (
N->getRawChecksum()) {
1809 Record.push_back(
N->getRawChecksum()->Kind);
1817 auto Source =
N->getRawSource();
1825void ModuleBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
1828 assert(
N->isDistinct() &&
"Expected distinct compile units");
1830 Record.push_back(
N->getSourceLanguage());
1833 Record.push_back(
N->isOptimized());
1835 Record.push_back(
N->getRuntimeVersion());
1837 Record.push_back(
N->getEmissionKind());
1843 Record.push_back(
N->getDWOId());
1845 Record.push_back(
N->getSplitDebugInlining());
1846 Record.push_back(
N->getDebugInfoForProfiling());
1847 Record.push_back((
unsigned)
N->getNameTableKind());
1848 Record.push_back(
N->getRangesBaseAddress());
1856void ModuleBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
1859 const uint64_t HasUnitFlag = 1 << 1;
1860 const uint64_t HasSPFlagsFlag = 1 << 2;
1861 Record.push_back(
uint64_t(
N->isDistinct()) | HasUnitFlag | HasSPFlagsFlag);
1866 Record.push_back(
N->getLine());
1868 Record.push_back(
N->getScopeLine());
1870 Record.push_back(
N->getSPFlags());
1871 Record.push_back(
N->getVirtualIndex());
1872 Record.push_back(
N->getFlags());
1877 Record.push_back(
N->getThisAdjustment());
1889 Record.push_back(
N->isDistinct());
1892 Record.push_back(
N->getLine());
1893 Record.push_back(
N->getColumn());
1899void ModuleBitcodeWriter::writeDILexicalBlockFile(
1902 Record.push_back(
N->isDistinct());
1905 Record.push_back(
N->getDiscriminator());
1911void ModuleBitcodeWriter::writeDICommonBlock(
const DICommonBlock *
N,
1914 Record.push_back(
N->isDistinct());
1919 Record.push_back(
N->getLineNo());
1925void ModuleBitcodeWriter::writeDINamespace(
const DINamespace *
N,
1928 Record.push_back(
N->isDistinct() |
N->getExportSymbols() << 1);
1936void ModuleBitcodeWriter::writeDIMacro(
const DIMacro *
N,
1939 Record.push_back(
N->isDistinct());
1940 Record.push_back(
N->getMacinfoType());
1941 Record.push_back(
N->getLine());
1949void ModuleBitcodeWriter::writeDIMacroFile(
const DIMacroFile *
N,
1952 Record.push_back(
N->isDistinct());
1953 Record.push_back(
N->getMacinfoType());
1954 Record.push_back(
N->getLine());
1962void ModuleBitcodeWriter::writeDIArgList(
const DIArgList *
N,
1965 Record.reserve(
N->getArgs().size());
1973void ModuleBitcodeWriter::writeDIModule(
const DIModule *
N,
1976 Record.push_back(
N->isDistinct());
1977 for (
auto &
I :
N->operands())
1979 Record.push_back(
N->getLineNo());
1980 Record.push_back(
N->getIsDecl());
1986void ModuleBitcodeWriter::writeDIAssignID(
const DIAssignID *
N,
1990 Record.push_back(
N->isDistinct());
1995void ModuleBitcodeWriter::writeDITemplateTypeParameter(
1998 Record.push_back(
N->isDistinct());
2001 Record.push_back(
N->isDefault());
2007void ModuleBitcodeWriter::writeDITemplateValueParameter(
2010 Record.push_back(
N->isDistinct());
2011 Record.push_back(
N->getTag());
2014 Record.push_back(
N->isDefault());
2021void ModuleBitcodeWriter::writeDIGlobalVariable(
2030 Record.push_back(
N->getLine());
2032 Record.push_back(
N->isLocalToUnit());
2033 Record.push_back(
N->isDefinition());
2036 Record.push_back(
N->getAlignInBits());
2043void ModuleBitcodeWriter::writeDILocalVariable(
2059 const uint64_t HasAlignmentFlag = 1 << 1;
2064 Record.push_back(
N->getLine());
2066 Record.push_back(
N->getArg());
2067 Record.push_back(
N->getFlags());
2068 Record.push_back(
N->getAlignInBits());
2075void ModuleBitcodeWriter::writeDILabel(
2082 Record.push_back(
N->getLine());
2088void ModuleBitcodeWriter::writeDIExpression(
const DIExpression *
N,
2091 Record.reserve(
N->getElements().size() + 1);
2094 Record.append(
N->elements_begin(),
N->elements_end());
2100void ModuleBitcodeWriter::writeDIGlobalVariableExpression(
2103 Record.push_back(
N->isDistinct());
2114 Record.push_back(
N->isDistinct());
2117 Record.push_back(
N->getLine());
2120 Record.push_back(
N->getAttributes());
2127void ModuleBitcodeWriter::writeDIImportedEntity(
2130 Record.push_back(
N->isDistinct());
2131 Record.push_back(
N->getTag());
2134 Record.push_back(
N->getLine());
2143unsigned ModuleBitcodeWriter::createNamedMetadataAbbrev() {
2144 auto Abbv = std::make_shared<BitCodeAbbrev>();
2151void ModuleBitcodeWriter::writeNamedMetadata(
2153 if (
M.named_metadata_empty())
2156 unsigned Abbrev = createNamedMetadataAbbrev();
2160 Record.append(Str.bytes_begin(), Str.bytes_end());
2165 for (
const MDNode *
N : NMD.operands())
2172unsigned ModuleBitcodeWriter::createMetadataStringsAbbrev() {
2173 auto Abbv = std::make_shared<BitCodeAbbrev>();
2185void ModuleBitcodeWriter::writeMetadataStrings(
2187 if (Strings.empty())
2192 Record.push_back(Strings.size());
2199 W.EmitVBR(cast<MDString>(MD)->getLength(), 6);
2208 Blob.
append(cast<MDString>(MD)->getString());
2217#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,
2218#include "llvm/IR/Metadata.def"
2222void ModuleBitcodeWriter::writeMetadataRecords(
2224 std::vector<unsigned> *MDAbbrevs, std::vector<uint64_t> *IndexPos) {
2229#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
2230#include "llvm/IR/Metadata.def"
2235 if (
const MDNode *
N = dyn_cast<MDNode>(MD)) {
2236 assert(
N->isResolved() &&
"Expected forward references to be resolved");
2238 switch (
N->getMetadataID()) {
2241#define HANDLE_MDNODE_LEAF(CLASS) \
2242 case Metadata::CLASS##Kind: \
2244 write##CLASS(cast<CLASS>(N), Record, \
2245 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
2247 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
2249#include "llvm/IR/Metadata.def"
2252 writeValueAsMetadata(cast<ValueAsMetadata>(MD),
Record);
2256void ModuleBitcodeWriter::writeModuleMetadata() {
2257 if (!VE.
hasMDs() &&
M.named_metadata_empty())
2265 std::vector<unsigned> MDAbbrevs;
2268 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
2269 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
2270 createGenericDINodeAbbrev();
2272 auto Abbv = std::make_shared<BitCodeAbbrev>();
2276 unsigned OffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2278 Abbv = std::make_shared<BitCodeAbbrev>();
2282 unsigned IndexAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2304 std::vector<uint64_t> IndexPos;
2319 uint64_t PreviousValue = IndexOffsetRecordBitPos;
2320 for (
auto &Elt : IndexPos) {
2321 auto EltDelta = Elt - PreviousValue;
2322 PreviousValue = Elt;
2331 writeNamedMetadata(
Record);
2333 auto AddDeclAttachedMetadata = [&](
const GlobalObject &GO) {
2336 pushGlobalMetadataAttachment(
Record, GO);
2340 if (
F.isDeclaration() &&
F.hasMetadata())
2341 AddDeclAttachedMetadata(
F);
2345 if (GV.hasMetadata())
2346 AddDeclAttachedMetadata(GV);
2351void ModuleBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
2362void ModuleBitcodeWriter::pushGlobalMetadataAttachment(
2367 for (
const auto &
I : MDs) {
2373void ModuleBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
2378 if (
F.hasMetadata()) {
2379 pushGlobalMetadataAttachment(
Record,
F);
2390 I.getAllMetadataOtherThanDebugLoc(MDs);
2393 if (MDs.
empty())
continue;
2397 for (
unsigned i = 0, e = MDs.
size(); i != e; ++i) {
2398 Record.push_back(MDs[i].first);
2408void ModuleBitcodeWriter::writeModuleMetadataKinds() {
2416 if (
Names.empty())
return;
2420 for (
unsigned MDKindID = 0, e =
Names.size(); MDKindID != e; ++MDKindID) {
2421 Record.push_back(MDKindID);
2432void ModuleBitcodeWriter::writeOperandBundleTags() {
2440 M.getOperandBundleTags(Tags);
2449 for (
auto Tag : Tags) {
2459void ModuleBitcodeWriter::writeSyncScopeNames() {
2461 M.getContext().getSyncScopeNames(SSNs);
2468 for (
auto SSN : SSNs) {
2469 Record.append(SSN.begin(), SSN.end());
2477void ModuleBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
2479 if (FirstVal == LastVal)
return;
2483 unsigned AggregateAbbrev = 0;
2484 unsigned String8Abbrev = 0;
2485 unsigned CString7Abbrev = 0;
2486 unsigned CString6Abbrev = 0;
2490 auto Abbv = std::make_shared<BitCodeAbbrev>();
2494 AggregateAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2497 Abbv = std::make_shared<BitCodeAbbrev>();
2501 String8Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2503 Abbv = std::make_shared<BitCodeAbbrev>();
2507 CString7Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2509 Abbv = std::make_shared<BitCodeAbbrev>();
2513 CString6Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2519 Type *LastTy =
nullptr;
2520 for (
unsigned i = FirstVal; i != LastVal; ++i) {
2521 const Value *
V = Vals[i].first;
2523 if (
V->getType() != LastTy) {
2524 LastTy =
V->getType();
2527 CONSTANTS_SETTYPE_ABBREV);
2531 if (
const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
2534 unsigned(
IA->hasSideEffects()) |
unsigned(
IA->isAlignStack()) << 1 |
2535 unsigned(
IA->getDialect() & 1) << 2 |
unsigned(
IA->canThrow()) << 3);
2538 const std::string &AsmStr =
IA->getAsmString();
2539 Record.push_back(AsmStr.size());
2540 Record.append(AsmStr.begin(), AsmStr.end());
2543 const std::string &ConstraintStr =
IA->getConstraintString();
2544 Record.push_back(ConstraintStr.size());
2545 Record.append(ConstraintStr.begin(), ConstraintStr.end());
2551 unsigned Code = -1U;
2552 unsigned AbbrevToUse = 0;
2553 if (
C->isNullValue()) {
2555 }
else if (isa<PoisonValue>(
C)) {
2557 }
else if (isa<UndefValue>(
C)) {
2560 if (
IV->getBitWidth() <= 64) {
2564 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2569 }
else if (
const ConstantFP *CFP = dyn_cast<ConstantFP>(
C)) {
2571 Type *Ty = CFP->getType();
2574 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2578 APInt api = CFP->getValueAPF().bitcastToAPInt();
2580 Record.push_back((p[1] << 48) | (p[0] >> 16));
2581 Record.push_back(p[0] & 0xffffLL);
2583 APInt api = CFP->getValueAPF().bitcastToAPInt();
2588 assert(0 &&
"Unknown FP type!");
2590 }
else if (isa<ConstantDataSequential>(
C) &&
2591 cast<ConstantDataSequential>(
C)->isString()) {
2594 unsigned NumElts = Str->getNumElements();
2596 if (Str->isCString()) {
2601 AbbrevToUse = String8Abbrev;
2605 for (
unsigned i = 0; i != NumElts; ++i) {
2606 unsigned char V = Str->getElementAsInteger(i);
2608 isCStr7 &= (
V & 128) == 0;
2614 AbbrevToUse = CString6Abbrev;
2616 AbbrevToUse = CString7Abbrev;
2618 dyn_cast<ConstantDataSequential>(
C)) {
2620 Type *EltTy = CDS->getElementType();
2621 if (isa<IntegerType>(EltTy)) {
2622 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i)
2623 Record.push_back(CDS->getElementAsInteger(i));
2625 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i)
2627 CDS->getElementAsAPFloat(i).bitcastToAPInt().getLimitedValue());
2629 }
else if (isa<ConstantAggregate>(
C)) {
2631 for (
const Value *Op :
C->operands())
2633 AbbrevToUse = AggregateAbbrev;
2634 }
else if (
const ConstantExpr *CE = dyn_cast<ConstantExpr>(
C)) {
2635 switch (
CE->getOpcode()) {
2642 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2644 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
2654 case Instruction::FNeg: {
2655 assert(
CE->getNumOperands() == 1 &&
"Unknown constant expr!");
2664 case Instruction::GetElementPtr: {
2666 const auto *GO = cast<GEPOperator>(
C);
2668 if (std::optional<unsigned>
Idx = GO->getInRangeIndex()) {
2670 Record.push_back((*
Idx << 1) | GO->isInBounds());
2671 }
else if (GO->isInBounds())
2673 for (
unsigned i = 0, e =
CE->getNumOperands(); i != e; ++i) {
2679 case Instruction::ExtractElement:
2686 case Instruction::InsertElement:
2693 case Instruction::ShuffleVector:
2698 if (
C->getType() ==
C->getOperand(0)->getType()) {
2708 case Instruction::ICmp:
2709 case Instruction::FCmp:
2714 Record.push_back(
CE->getPredicate());
2717 }
else if (
const BlockAddress *BA = dyn_cast<BlockAddress>(
C)) {
2722 }
else if (
const auto *Equiv = dyn_cast<DSOLocalEquivalent>(
C)) {
2726 }
else if (
const auto *
NC = dyn_cast<NoCFIValue>(
C)) {
2743void ModuleBitcodeWriter::writeModuleConstants() {
2748 for (
unsigned i = 0, e = Vals.size(); i != e; ++i) {
2749 if (!isa<GlobalValue>(Vals[i].first)) {
2750 writeConstants(i, Vals.size(),
true);
2764bool ModuleBitcodeWriter::pushValueAndType(
const Value *V,
unsigned InstID,
2769 if (
ValID >= InstID) {
2776void ModuleBitcodeWriter::writeOperandBundles(
const CallBase &CS,
2783 Record.push_back(
C.getOperandBundleTagID(Bundle.getTagName()));
2785 for (
auto &Input : Bundle.Inputs)
2786 pushValueAndType(Input, InstID,
Record);
2795void ModuleBitcodeWriter::pushValue(
const Value *V,
unsigned InstID,
2801void ModuleBitcodeWriter::pushValueSigned(
const Value *V,
unsigned InstID,
2804 int64_t diff = ((int32_t)InstID - (int32_t)
ValID);
2809void ModuleBitcodeWriter::writeInstruction(
const Instruction &
I,
2813 unsigned AbbrevToUse = 0;
2815 switch (
I.getOpcode()) {
2819 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2820 AbbrevToUse = FUNCTION_INST_CAST_ABBREV;
2824 assert(isa<BinaryOperator>(
I) &&
"Unknown instruction!");
2826 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2827 AbbrevToUse = FUNCTION_INST_BINOP_ABBREV;
2828 pushValue(
I.getOperand(1), InstID, Vals);
2832 if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV)
2833 AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV;
2838 case Instruction::FNeg: {
2840 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2841 AbbrevToUse = FUNCTION_INST_UNOP_ABBREV;
2845 if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV)
2846 AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV;
2851 case Instruction::GetElementPtr: {
2853 AbbrevToUse = FUNCTION_INST_GEP_ABBREV;
2854 auto &GEPInst = cast<GetElementPtrInst>(
I);
2857 for (
unsigned i = 0, e =
I.getNumOperands(); i != e; ++i)
2858 pushValueAndType(
I.getOperand(i), InstID, Vals);
2861 case Instruction::ExtractValue: {
2863 pushValueAndType(
I.getOperand(0), InstID, Vals);
2868 case Instruction::InsertValue: {
2870 pushValueAndType(
I.getOperand(0), InstID, Vals);
2871 pushValueAndType(
I.getOperand(1), InstID, Vals);
2876 case Instruction::Select: {
2878 pushValueAndType(
I.getOperand(1), InstID, Vals);
2879 pushValue(
I.getOperand(2), InstID, Vals);
2880 pushValueAndType(
I.getOperand(0), InstID, Vals);
2886 case Instruction::ExtractElement:
2888 pushValueAndType(
I.getOperand(0), InstID, Vals);
2889 pushValueAndType(
I.getOperand(1), InstID, Vals);
2891 case Instruction::InsertElement:
2893 pushValueAndType(
I.getOperand(0), InstID, Vals);
2894 pushValue(
I.getOperand(1), InstID, Vals);
2895 pushValueAndType(
I.getOperand(2), InstID, Vals);
2897 case Instruction::ShuffleVector:
2899 pushValueAndType(
I.getOperand(0), InstID, Vals);
2900 pushValue(
I.getOperand(1), InstID, Vals);
2901 pushValue(cast<ShuffleVectorInst>(
I).getShuffleMaskForBitcode(), InstID,
2904 case Instruction::ICmp:
2905 case Instruction::FCmp: {
2908 pushValueAndType(
I.getOperand(0), InstID, Vals);
2909 pushValue(
I.getOperand(1), InstID, Vals);
2917 case Instruction::Ret:
2920 unsigned NumOperands =
I.getNumOperands();
2921 if (NumOperands == 0)
2922 AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV;
2923 else if (NumOperands == 1) {
2924 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
2925 AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV;
2927 for (
unsigned i = 0, e = NumOperands; i !=
e; ++i)
2928 pushValueAndType(
I.getOperand(i), InstID, Vals);
2932 case Instruction::Br:
2943 case Instruction::Switch:
2948 pushValue(
SI.getCondition(), InstID, Vals);
2950 for (
auto Case :
SI.cases()) {
2956 case Instruction::IndirectBr:
2960 pushValue(
I.getOperand(0), InstID, Vals);
2961 for (
unsigned i = 1, e =
I.getNumOperands(); i != e; ++i)
2965 case Instruction::Invoke: {
2971 writeOperandBundles(*II, InstID);
2980 pushValueAndType(
Callee, InstID, Vals);
2983 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
2984 pushValue(
I.getOperand(i), InstID, Vals);
2987 if (FTy->isVarArg()) {
2988 for (
unsigned i = FTy->getNumParams(), e = II->
arg_size(); i != e; ++i)
2989 pushValueAndType(
I.getOperand(i), InstID, Vals);
2993 case Instruction::Resume:
2995 pushValueAndType(
I.getOperand(0), InstID, Vals);
2997 case Instruction::CleanupRet: {
2999 const auto &CRI = cast<CleanupReturnInst>(
I);
3000 pushValue(CRI.getCleanupPad(), InstID, Vals);
3001 if (CRI.hasUnwindDest())
3005 case Instruction::CatchRet: {
3007 const auto &CRI = cast<CatchReturnInst>(
I);
3008 pushValue(CRI.getCatchPad(), InstID, Vals);
3012 case Instruction::CleanupPad:
3013 case Instruction::CatchPad: {
3014 const auto &FuncletPad = cast<FuncletPadInst>(
I);
3017 pushValue(FuncletPad.getParentPad(), InstID, Vals);
3019 unsigned NumArgOperands = FuncletPad.arg_size();
3021 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op)
3022 pushValueAndType(FuncletPad.getArgOperand(Op), InstID, Vals);
3025 case Instruction::CatchSwitch: {
3027 const auto &CatchSwitch = cast<CatchSwitchInst>(
I);
3029 pushValue(CatchSwitch.getParentPad(), InstID, Vals);
3031 unsigned NumHandlers = CatchSwitch.getNumHandlers();
3033 for (
const BasicBlock *CatchPadBB : CatchSwitch.handlers())
3036 if (CatchSwitch.hasUnwindDest())
3040 case Instruction::CallBr: {
3046 writeOperandBundles(*CBI, InstID);
3061 pushValueAndType(
Callee, InstID, Vals);
3064 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3065 pushValue(
I.getOperand(i), InstID, Vals);
3068 if (FTy->isVarArg()) {
3069 for (
unsigned i = FTy->getNumParams(), e = CBI->
arg_size(); i != e; ++i)
3070 pushValueAndType(
I.getOperand(i), InstID, Vals);
3074 case Instruction::Unreachable:
3076 AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;
3079 case Instruction::PHI: {
3080 const PHINode &PN = cast<PHINode>(
I);
3097 Stream.
EmitRecord(Code, Vals64, AbbrevToUse);
3102 case Instruction::LandingPad: {
3113 pushValueAndType(LP.
getClause(
I), InstID, Vals);
3118 case Instruction::Alloca: {
3126 unsigned EncodedAlign = getEncodedAlign(AI.
getAlign());
3127 Bitfield::set<APV::AlignLower>(
3128 Record, EncodedAlign & ((1 << APV::AlignLower::Bits) - 1));
3129 Bitfield::set<APV::AlignUpper>(
Record,
3130 EncodedAlign >> APV::AlignLower::Bits);
3132 Bitfield::set<APV::ExplicitType>(
Record,
true);
3137 if (AS !=
M.getDataLayout().getAllocaAddrSpace())
3142 case Instruction::Load:
3143 if (cast<LoadInst>(
I).isAtomic()) {
3145 pushValueAndType(
I.getOperand(0), InstID, Vals);
3148 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3149 AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;
3153 Vals.
push_back(cast<LoadInst>(
I).isVolatile());
3154 if (cast<LoadInst>(
I).isAtomic()) {
3156 Vals.
push_back(getEncodedSyncScopeID(cast<LoadInst>(
I).getSyncScopeID()));
3159 case Instruction::Store:
3160 if (cast<StoreInst>(
I).isAtomic())
3164 pushValueAndType(
I.getOperand(1), InstID, Vals);
3165 pushValueAndType(
I.getOperand(0), InstID, Vals);
3167 Vals.
push_back(cast<StoreInst>(
I).isVolatile());
3168 if (cast<StoreInst>(
I).isAtomic()) {
3171 getEncodedSyncScopeID(cast<StoreInst>(
I).getSyncScopeID()));
3174 case Instruction::AtomicCmpXchg:
3176 pushValueAndType(
I.getOperand(0), InstID, Vals);
3177 pushValueAndType(
I.getOperand(1), InstID, Vals);
3178 pushValue(
I.getOperand(2), InstID, Vals);
3179 Vals.
push_back(cast<AtomicCmpXchgInst>(
I).isVolatile());
3183 getEncodedSyncScopeID(cast<AtomicCmpXchgInst>(
I).getSyncScopeID()));
3186 Vals.
push_back(cast<AtomicCmpXchgInst>(
I).isWeak());
3189 case Instruction::AtomicRMW:
3191 pushValueAndType(
I.getOperand(0), InstID, Vals);
3192 pushValueAndType(
I.getOperand(1), InstID, Vals);
3195 Vals.
push_back(cast<AtomicRMWInst>(
I).isVolatile());
3198 getEncodedSyncScopeID(cast<AtomicRMWInst>(
I).getSyncScopeID()));
3201 case Instruction::Fence:
3204 Vals.
push_back(getEncodedSyncScopeID(cast<FenceInst>(
I).getSyncScopeID()));
3206 case Instruction::Call: {
3211 writeOperandBundles(CI, InstID);
3231 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
3233 if (FTy->getParamType(i)->isLabelTy())
3240 if (FTy->isVarArg()) {
3241 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
3246 case Instruction::VAArg:
3249 pushValue(
I.getOperand(0), InstID, Vals);
3252 case Instruction::Freeze:
3254 pushValueAndType(
I.getOperand(0), InstID, Vals);
3264void ModuleBitcodeWriter::writeGlobalValueSymbolTable(
3270 VSTOffset -= bitcodeStartBit();
3271 assert((VSTOffset & 31) == 0 &&
"VST block not 32-bit aligned");
3275 Stream.
BackpatchWord(VSTOffsetPlaceholder, VSTOffset / 32 + 1);
3279 auto Abbv = std::make_shared<BitCodeAbbrev>();
3283 unsigned FnEntryAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
3288 if (
F.isDeclaration())
3295 uint64_t BitcodeIndex = FunctionToBitcodeIndex[&
F] - bitcodeStartBit();
3296 assert((BitcodeIndex & 31) == 0 &&
"function block not 32-bit aligned");
3300 Record[1] = BitcodeIndex / 32 + 1;
3309void ModuleBitcodeWriter::writeFunctionLevelValueSymbolTable(
3324 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
3330 if (isa<BasicBlock>(
Name.getValue())) {
3333 AbbrevToUse = VST_BBENTRY_6_ABBREV;
3337 AbbrevToUse = VST_ENTRY_6_ABBREV;
3339 AbbrevToUse = VST_ENTRY_7_ABBREV;
3342 for (
const auto P :
Name.getKey())
3346 Stream.
EmitRecord(Code, NameVals, AbbrevToUse);
3353void ModuleBitcodeWriter::writeUseList(
UseListOrder &&Order) {
3354 assert(Order.Shuffle.size() >= 2 &&
"Shuffle too small");
3356 if (isa<BasicBlock>(Order.V))
3366void ModuleBitcodeWriter::writeUseListBlock(
const Function *
F) {
3368 "Expected to be preserving use-list order");
3370 auto hasMore = [&]() {
3386void ModuleBitcodeWriter::writeFunction(
3405 unsigned CstStart, CstEnd;
3407 writeConstants(CstStart, CstEnd,
false);
3410 writeFunctionMetadata(
F);
3413 unsigned InstID = CstEnd;
3415 bool NeedsMetadataAttachment =
F.hasMetadata();
3423 writeInstruction(
I, InstID, Vals);
3425 if (!
I.getType()->isVoidTy())
3429 NeedsMetadataAttachment |=
I.hasMetadataOtherThanDebugLoc();
3456 while (!Worklist.empty()) {
3457 Value *
V = Worklist.pop_back_val();
3458 for (
User *U :
V->users()) {
3459 if (
auto *
I = dyn_cast<Instruction>(U)) {
3463 }
else if (isa<Constant>(U) && !isa<GlobalValue>(U) &&
3464 Visited.insert(U).second)
3465 Worklist.push_back(U);
3471 if (!BlockAddressUsers.
empty()) {
3480 if (
auto *Symtab =
F.getValueSymbolTable())
3481 writeFunctionLevelValueSymbolTable(*Symtab);
3483 if (NeedsMetadataAttachment)
3484 writeFunctionMetadataAttachment(
F);
3486 writeUseListBlock(&
F);
3492void ModuleBitcodeWriter::writeBlockInfo() {
3499 auto Abbv = std::make_shared<BitCodeAbbrev>();
3510 auto Abbv = std::make_shared<BitCodeAbbrev>();
3520 auto Abbv = std::make_shared<BitCodeAbbrev>();
3530 auto Abbv = std::make_shared<BitCodeAbbrev>();
3536 VST_BBENTRY_6_ABBREV)
3541 auto Abbv = std::make_shared<BitCodeAbbrev>();
3546 CONSTANTS_SETTYPE_ABBREV)
3551 auto Abbv = std::make_shared<BitCodeAbbrev>();
3555 CONSTANTS_INTEGER_ABBREV)
3560 auto Abbv = std::make_shared<BitCodeAbbrev>();
3568 CONSTANTS_CE_CAST_Abbrev)
3572 auto Abbv = std::make_shared<BitCodeAbbrev>();
3575 CONSTANTS_NULL_Abbrev)
3582 auto Abbv = std::make_shared<BitCodeAbbrev>();
3590 FUNCTION_INST_LOAD_ABBREV)
3594 auto Abbv = std::make_shared<BitCodeAbbrev>();
3599 FUNCTION_INST_UNOP_ABBREV)
3603 auto Abbv = std::make_shared<BitCodeAbbrev>();
3609 FUNCTION_INST_UNOP_FLAGS_ABBREV)
3613 auto Abbv = std::make_shared<BitCodeAbbrev>();
3619 FUNCTION_INST_BINOP_ABBREV)
3623 auto Abbv = std::make_shared<BitCodeAbbrev>();
3630 FUNCTION_INST_BINOP_FLAGS_ABBREV)
3634 auto Abbv = std::make_shared<BitCodeAbbrev>();
3641 FUNCTION_INST_CAST_ABBREV)
3646 auto Abbv = std::make_shared<BitCodeAbbrev>();
3649 FUNCTION_INST_RET_VOID_ABBREV)
3653 auto Abbv = std::make_shared<BitCodeAbbrev>();
3657 FUNCTION_INST_RET_VAL_ABBREV)
3661 auto Abbv = std::make_shared<BitCodeAbbrev>();
3664 FUNCTION_INST_UNREACHABLE_ABBREV)
3668 auto Abbv = std::make_shared<BitCodeAbbrev>();
3676 FUNCTION_INST_GEP_ABBREV)
3685void IndexBitcodeWriter::writeModStrings() {
3691 auto Abbv = std::make_shared<BitCodeAbbrev>();
3696 unsigned Abbrev8Bit = Stream.
EmitAbbrev(std::move(Abbv));
3699 Abbv = std::make_shared<BitCodeAbbrev>();
3704 unsigned Abbrev7Bit = Stream.
EmitAbbrev(std::move(Abbv));
3707 Abbv = std::make_shared<BitCodeAbbrev>();
3712 unsigned Abbrev6Bit = Stream.
EmitAbbrev(std::move(Abbv));
3715 Abbv = std::make_shared<BitCodeAbbrev>();
3722 unsigned AbbrevHash = Stream.
EmitAbbrev(std::move(Abbv));
3726 [&](
const StringMapEntry<std::pair<uint64_t, ModuleHash>> &MPSE) {
3728 const auto &
Value = MPSE.getValue();
3730 unsigned AbbrevToUse = Abbrev8Bit;
3732 AbbrevToUse = Abbrev6Bit;
3734 AbbrevToUse = Abbrev7Bit;
3743 const auto &Hash =
Value.second;
3745 Vals.
assign(Hash.begin(), Hash.end());
3757template <
typename Fn>
3761 if (!FS->type_tests().empty())
3766 auto WriteVFuncIdVec = [&](
uint64_t Ty,
3771 for (
auto &VF : VFs) {
3772 Record.push_back(VF.GUID);
3773 Record.push_back(VF.Offset);
3779 FS->type_test_assume_vcalls());
3781 FS->type_checked_load_vcalls());
3783 auto WriteConstVCallVec = [&](
uint64_t Ty,
3785 for (
auto &VC : VCs) {
3787 Record.push_back(VC.VFunc.GUID);
3788 Record.push_back(VC.VFunc.Offset);
3795 FS->type_test_assume_const_vcalls());
3797 FS->type_checked_load_const_vcalls());
3801 assert(Range.getLower().getNumWords() == 1);
3802 assert(Range.getUpper().getNumWords() == 1);
3807 if (!FS->paramAccesses().empty()) {
3809 for (
auto &
Arg : FS->paramAccesses()) {
3810 size_t UndoSize =
Record.size();
3812 WriteRange(
Arg.Use);
3814 for (
auto &Call :
Arg.Calls) {
3815 Record.push_back(Call.ParamNo);
3816 std::optional<unsigned> ValueID = GetValueID(Call.Callee);
3823 Record.push_back(*ValueID);
3824 WriteRange(Call.Offsets);
3835 std::set<GlobalValue::GUID> &ReferencedTypeIds) {
3836 if (!FS->type_tests().empty())
3837 for (
auto &TT : FS->type_tests())
3838 ReferencedTypeIds.insert(TT);
3840 auto GetReferencedTypesFromVFuncIdVec =
3842 for (
auto &VF : VFs)
3843 ReferencedTypeIds.insert(VF.GUID);
3846 GetReferencedTypesFromVFuncIdVec(FS->type_test_assume_vcalls());
3847 GetReferencedTypesFromVFuncIdVec(FS->type_checked_load_vcalls());
3849 auto GetReferencedTypesFromConstVCallVec =
3851 for (
auto &VC : VCs)
3852 ReferencedTypeIds.insert(VC.VFunc.GUID);
3855 GetReferencedTypesFromConstVCallVec(FS->type_test_assume_const_vcalls());
3856 GetReferencedTypesFromConstVCallVec(FS->type_checked_load_const_vcalls());
3887 const std::string &Id,
3892 NameVals.
push_back(Summary.TTRes.TheKind);
3893 NameVals.
push_back(Summary.TTRes.SizeM1BitWidth);
3894 NameVals.
push_back(Summary.TTRes.AlignLog2);
3895 NameVals.
push_back(Summary.TTRes.SizeM1);
3896 NameVals.
push_back(Summary.TTRes.BitMask);
3897 NameVals.
push_back(Summary.TTRes.InlineBits);
3899 for (
auto &W : Summary.WPDRes)
3911 for (
auto &
P : Summary) {
3919 unsigned AllocAbbrev,
bool PerModule,
3920 std::function<
unsigned(
const ValueInfo &VI)> GetValueID,
3921 std::function<
unsigned(
unsigned)> GetStackIndex) {
3924 for (
auto &CI : FS->callsites()) {
3928 assert(!PerModule || (CI.Clones.size() == 1 && CI.Clones[0] == 0));
3929 Record.push_back(GetValueID(CI.Callee));
3931 Record.push_back(CI.StackIdIndices.size());
3932 Record.push_back(CI.Clones.size());
3934 for (
auto Id : CI.StackIdIndices)
3935 Record.push_back(GetStackIndex(Id));
3937 for (
auto V : CI.Clones)
3945 for (
auto &AI : FS->allocs()) {
3949 assert(!PerModule || (AI.Versions.size() == 1 && AI.Versions[0] == 0));
3951 Record.push_back(AI.MIBs.size());
3952 Record.push_back(AI.Versions.size());
3954 for (
auto &MIB : AI.MIBs) {
3955 Record.push_back((uint8_t)MIB.AllocType);
3956 Record.push_back(MIB.StackIdIndices.size());
3957 for (
auto Id : MIB.StackIdIndices)
3958 Record.push_back(GetStackIndex(Id));
3961 for (
auto V : AI.Versions)
3971void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
3973 unsigned ValueID,
unsigned FSCallsAbbrev,
unsigned FSCallsProfileAbbrev,
3974 unsigned CallsiteAbbrev,
unsigned AllocAbbrev,
const Function &
F) {
3980 Stream, FS, [&](
const ValueInfo &VI) -> std::optional<unsigned> {
3985 Stream, FS, CallsiteAbbrev, AllocAbbrev,
3987 [&](
const ValueInfo &VI) {
return getValueId(VI); },
3988 [&](
unsigned I) {
return I; });
3990 auto SpecialRefCnts =
FS->specialRefCounts();
3995 NameVals.
push_back(SpecialRefCnts.first);
3996 NameVals.
push_back(SpecialRefCnts.second);
3998 for (
auto &RI :
FS->refs())
4001 bool HasProfileData =
4003 for (
auto &ECI :
FS->calls()) {
4004 NameVals.
push_back(getValueId(ECI.first));
4006 NameVals.
push_back(
static_cast<uint8_t
>(ECI.second.Hotness));
4008 NameVals.
push_back(ECI.second.RelBlockFreq);
4011 unsigned FSAbbrev = (HasProfileData ? FSCallsProfileAbbrev : FSCallsAbbrev);
4024void ModuleBitcodeWriterBase::writeModuleLevelReferences(
4026 unsigned FSModRefsAbbrev,
unsigned FSModVTableRefsAbbrev) {
4027 auto VI =
Index->getValueInfo(
V.getGUID());
4028 if (!VI ||
VI.getSummaryList().empty()) {
4034 auto *
Summary =
VI.getSummaryList()[0].get();
4040 auto VTableFuncs =
VS->vTableFuncs();
4041 if (!VTableFuncs.empty())
4044 unsigned SizeBeforeRefs = NameVals.
size();
4045 for (
auto &RI :
VS->refs())
4051 if (VTableFuncs.empty())
4056 for (
auto &
P : VTableFuncs) {
4062 FSModVTableRefsAbbrev);
4069void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
4072 bool IsThinLTO =
true;
4074 mdconst::extract_or_null<ConstantInt>(
M.getModuleFlag(
"ThinLTO")))
4075 IsThinLTO = MD->getZExtValue();
4087 if (
Index->enableSplitLTOUnit())
4096 for (
const auto &GVI : valueIds()) {
4101 if (!
Index->stackIds().empty()) {
4102 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4107 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4112 auto Abbv = std::make_shared<BitCodeAbbrev>();
4124 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4127 Abbv = std::make_shared<BitCodeAbbrev>();
4142 unsigned FSCallsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4145 Abbv = std::make_shared<BitCodeAbbrev>();
4151 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4154 Abbv = std::make_shared<BitCodeAbbrev>();
4162 unsigned FSModVTableRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4165 Abbv = std::make_shared<BitCodeAbbrev>();
4170 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4173 Abbv = std::make_shared<BitCodeAbbrev>();
4180 unsigned TypeIdCompatibleVtableAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4182 Abbv = std::make_shared<BitCodeAbbrev>();
4188 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4190 Abbv = std::make_shared<BitCodeAbbrev>();
4195 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4207 if (!VI ||
VI.getSummaryList().empty()) {
4213 auto *
Summary =
VI.getSummaryList()[0].get();
4214 writePerModuleFunctionSummaryRecord(NameVals, Summary, VE.
getValueID(&
F),
4215 FSCallsAbbrev, FSCallsProfileAbbrev,
4216 CallsiteAbbrev, AllocAbbrev,
F);
4222 writeModuleLevelReferences(
G, NameVals, FSModRefsAbbrev,
4223 FSModVTableRefsAbbrev);
4226 auto *Aliasee =
A.getAliaseeObject();
4229 if (!Aliasee->hasName() || isa<GlobalIFunc>(Aliasee))
4242 for (
auto &S :
Index->typeIdCompatibleVtableMap()) {
4246 TypeIdCompatibleVtableAbbrev);
4250 if (
Index->getBlockCount())
4258void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
4267 for (
const auto &GVI : valueIds()) {
4272 if (!StackIdIndices.empty()) {
4273 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4278 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4281 std::vector<uint64_t> StackIds;
4282 for (
auto &
I : StackIdIndices)
4283 StackIds.push_back(
Index.getStackIdAtIndex(
I));
4288 auto Abbv = std::make_shared<BitCodeAbbrev>();
4302 unsigned FSCallsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4305 Abbv = std::make_shared<BitCodeAbbrev>();
4319 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));