31#include "llvm/Config/llvm-config.h"
91 cl::desc(
"Number of metadatas above which we emit an index "
92 "to enable lazy-loading"));
95 cl::desc(
"The threshold (unit M) for flushing LLVM bitcode."));
99 cl::desc(
"Write relative block frequency to function summary "));
117 VST_BBENTRY_6_ABBREV,
121 CONSTANTS_INTEGER_ABBREV,
122 CONSTANTS_CE_CAST_Abbrev,
123 CONSTANTS_NULL_Abbrev,
127 FUNCTION_INST_UNOP_ABBREV,
128 FUNCTION_INST_UNOP_FLAGS_ABBREV,
129 FUNCTION_INST_BINOP_ABBREV,
130 FUNCTION_INST_BINOP_FLAGS_ABBREV,
131 FUNCTION_INST_CAST_ABBREV,
132 FUNCTION_INST_CAST_FLAGS_ABBREV,
133 FUNCTION_INST_RET_VOID_ABBREV,
134 FUNCTION_INST_RET_VAL_ABBREV,
135 FUNCTION_INST_UNREACHABLE_ABBREV,
136 FUNCTION_INST_GEP_ABBREV,
137 FUNCTION_DEBUG_RECORD_VALUE_ABBREV,
142class BitcodeWriterBase {
153 : Stream(Stream), StrtabBuilder(StrtabBuilder) {}
156 void writeModuleVersion();
159void BitcodeWriterBase::writeModuleVersion() {
166class ModuleBitcodeWriterBase :
public BitcodeWriterBase {
180 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
183 unsigned GlobalValueId;
194 bool ShouldPreserveUseListOrder,
196 : BitcodeWriterBase(Stream, StrtabBuilder),
M(
M),
206 for (
const auto &GUIDSummaryLists : *Index)
208 for (
auto &Summary : GUIDSummaryLists.second.SummaryList)
209 if (
auto FS = dyn_cast<FunctionSummary>(
Summary.get())) {
214 for (
auto &CallEdge :
FS->calls())
215 if (!CallEdge.first.haveGVs() || !CallEdge.first.getValue())
216 assignValueId(CallEdge.first.getGUID());
222 for (
auto &RefEdge :
FS->refs())
223 if (!RefEdge.haveGVs() || !RefEdge.getValue())
224 assignValueId(RefEdge.getGUID());
229 void writePerModuleGlobalValueSummary();
232 void writePerModuleFunctionSummaryRecord(
234 unsigned ValueID,
unsigned FSCallsAbbrev,
unsigned FSCallsProfileAbbrev,
235 unsigned CallsiteAbbrev,
unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
240 unsigned FSModRefsAbbrev,
241 unsigned FSModVTableRefsAbbrev);
244 GUIDToValueIdMap[ValGUID] = ++GlobalValueId;
248 const auto &VMI = GUIDToValueIdMap.find(ValGUID);
251 assert(VMI != GUIDToValueIdMap.end() &&
252 "GUID does not have assigned value Id");
258 if (!
VI.haveGVs() || !
VI.getValue())
259 return getValueId(
VI.getGUID());
263 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
267class ModuleBitcodeWriter :
public ModuleBitcodeWriterBase {
287 : ModuleBitcodeWriterBase(
M, StrtabBuilder, Stream,
288 ShouldPreserveUseListOrder,
Index),
289 GenerateHash(GenerateHash), ModHash(ModHash),
290 BitcodeStartBit(Stream.GetCurrentBitNo()) {}
296 uint64_t bitcodeStartBit() {
return BitcodeStartBit; }
300 void writeAttributeGroupTable();
301 void writeAttributeTable();
302 void writeTypeTable();
304 void writeValueSymbolTableForwardDecl();
305 void writeModuleInfo();
310 unsigned createDILocationAbbrev();
313 unsigned createGenericDINodeAbbrev();
381 unsigned createNamedMetadataAbbrev();
383 unsigned createMetadataStringsAbbrev();
388 std::vector<unsigned> *MDAbbrevs =
nullptr,
389 std::vector<uint64_t> *IndexPos =
nullptr);
390 void writeModuleMetadata();
391 void writeFunctionMetadata(
const Function &
F);
392 void writeFunctionMetadataAttachment(
const Function &
F);
395 void writeModuleMetadataKinds();
396 void writeOperandBundleTags();
397 void writeSyncScopeNames();
398 void writeConstants(
unsigned FirstVal,
unsigned LastVal,
bool isGlobal);
399 void writeModuleConstants();
400 bool pushValueAndType(
const Value *V,
unsigned InstID,
402 bool pushValueOrMetadata(
const Value *V,
unsigned InstID,
404 void writeOperandBundles(
const CallBase &CB,
unsigned InstID);
405 void pushValue(
const Value *V,
unsigned InstID,
407 void pushValueSigned(
const Value *V,
unsigned InstID,
409 void writeInstruction(
const Instruction &
I,
unsigned InstID,
412 void writeGlobalValueSymbolTable(
415 void writeUseListBlock(
const Function *
F);
419 void writeBlockInfo();
426 unsigned getEncodedAlign(
MaybeAlign Alignment) {
return encode(Alignment); }
430class IndexBitcodeWriter :
public BitcodeWriterBase {
445 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
449 std::vector<uint64_t> StackIds;
457 unsigned GlobalValueId = 0;
475 : BitcodeWriterBase(Stream, StrtabBuilder),
Index(
Index),
476 DecSummaries(DecSummaries),
477 ModuleToSummariesForIndex(ModuleToSummariesForIndex) {
481 auto RecordStackIdReference = [&](
unsigned StackIdIndex) {
486 StackIdIndicesToIndex.
insert({StackIdIndex, StackIds.size()});
488 StackIds.push_back(
Index.getStackIdAtIndex(StackIdIndex));
495 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
496 GUIDToValueIdMap[
I.first] = ++GlobalValueId;
499 auto *
FS = dyn_cast<FunctionSummary>(
I.second);
505 for (
auto &CI :
FS->callsites()) {
516 if (CI.StackIdIndices.empty()) {
517 GUIDToValueIdMap[CI.Callee.getGUID()] = ++GlobalValueId;
520 for (
auto Idx : CI.StackIdIndices)
521 RecordStackIdReference(
Idx);
523 for (
auto &AI :
FS->allocs())
524 for (
auto &MIB : AI.MIBs)
525 for (
auto Idx : MIB.StackIdIndices)
526 RecordStackIdReference(
Idx);
531 using GVInfo = std::pair<GlobalValue::GUID, GlobalValueSummary *>;
536 template<
typename Functor>
537 void forEachSummary(Functor Callback) {
538 if (ModuleToSummariesForIndex) {
539 for (
auto &M : *ModuleToSummariesForIndex)
540 for (
auto &Summary :
M.second) {
541 Callback(Summary,
false);
545 if (
auto *AS = dyn_cast<AliasSummary>(
Summary.getSecond()))
546 Callback({AS->getAliaseeGUID(), &AS->getAliasee()},
true);
549 for (
auto &Summaries : Index)
550 for (
auto &Summary : Summaries.second.SummaryList)
551 Callback({Summaries.first,
Summary.get()},
false);
559 template <
typename Functor>
void forEachModule(Functor Callback) {
560 if (ModuleToSummariesForIndex) {
561 for (
const auto &M : *ModuleToSummariesForIndex) {
562 const auto &MPI =
Index.modulePaths().find(
M.first);
563 if (MPI ==
Index.modulePaths().end()) {
567 assert(ModuleToSummariesForIndex->size() == 1);
577 std::vector<StringRef> ModulePaths;
578 for (
auto &[ModPath,
_] :
Index.modulePaths())
579 ModulePaths.push_back(ModPath);
580 llvm::sort(ModulePaths.begin(), ModulePaths.end());
581 for (
auto &ModPath : ModulePaths)
582 Callback(*
Index.modulePaths().find(ModPath));
590 void writeModStrings();
591 void writeCombinedGlobalValueSummary();
594 auto VMI = GUIDToValueIdMap.find(ValGUID);
595 if (VMI == GUIDToValueIdMap.end())
600 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
634 case Instruction::Add:
636 case Instruction::Sub:
638 case Instruction::Mul:
641 case Instruction::FDiv:
644 case Instruction::FRem:
714 case Attribute::Alignment:
716 case Attribute::AllocAlign:
718 case Attribute::AllocSize:
720 case Attribute::AlwaysInline:
722 case Attribute::Builtin:
724 case Attribute::ByVal:
726 case Attribute::Convergent:
728 case Attribute::InAlloca:
730 case Attribute::Cold:
732 case Attribute::DisableSanitizerInstrumentation:
734 case Attribute::FnRetThunkExtern:
738 case Attribute::ElementType:
740 case Attribute::HybridPatchable:
742 case Attribute::InlineHint:
744 case Attribute::InReg:
746 case Attribute::JumpTable:
748 case Attribute::MinSize:
750 case Attribute::AllocatedPointer:
752 case Attribute::AllocKind:
754 case Attribute::Memory:
756 case Attribute::NoFPClass:
758 case Attribute::Naked:
760 case Attribute::Nest:
762 case Attribute::NoAlias:
764 case Attribute::NoBuiltin:
766 case Attribute::NoCallback:
768 case Attribute::NoCapture:
770 case Attribute::NoDivergenceSource:
772 case Attribute::NoDuplicate:
774 case Attribute::NoFree:
776 case Attribute::NoImplicitFloat:
778 case Attribute::NoInline:
780 case Attribute::NoRecurse:
782 case Attribute::NoMerge:
784 case Attribute::NonLazyBind:
786 case Attribute::NonNull:
788 case Attribute::Dereferenceable:
790 case Attribute::DereferenceableOrNull:
792 case Attribute::NoRedZone:
794 case Attribute::NoReturn:
796 case Attribute::NoSync:
798 case Attribute::NoCfCheck:
800 case Attribute::NoProfile:
802 case Attribute::SkipProfile:
804 case Attribute::NoUnwind:
806 case Attribute::NoSanitizeBounds:
808 case Attribute::NoSanitizeCoverage:
810 case Attribute::NullPointerIsValid:
812 case Attribute::OptimizeForDebugging:
814 case Attribute::OptForFuzzing:
816 case Attribute::OptimizeForSize:
818 case Attribute::OptimizeNone:
820 case Attribute::ReadNone:
822 case Attribute::ReadOnly:
824 case Attribute::Returned:
826 case Attribute::ReturnsTwice:
828 case Attribute::SExt:
830 case Attribute::Speculatable:
832 case Attribute::StackAlignment:
834 case Attribute::StackProtect:
836 case Attribute::StackProtectReq:
838 case Attribute::StackProtectStrong:
840 case Attribute::SafeStack:
842 case Attribute::ShadowCallStack:
844 case Attribute::StrictFP:
846 case Attribute::StructRet:
848 case Attribute::SanitizeAddress:
850 case Attribute::SanitizeHWAddress:
852 case Attribute::SanitizeThread:
854 case Attribute::SanitizeType:
856 case Attribute::SanitizeMemory:
858 case Attribute::SanitizeNumericalStability:
860 case Attribute::SanitizeRealtime:
862 case Attribute::SanitizeRealtimeBlocking:
864 case Attribute::SpeculativeLoadHardening:
866 case Attribute::SwiftError:
868 case Attribute::SwiftSelf:
870 case Attribute::SwiftAsync:
872 case Attribute::UWTable:
874 case Attribute::VScaleRange:
876 case Attribute::WillReturn:
878 case Attribute::WriteOnly:
880 case Attribute::ZExt:
882 case Attribute::ImmArg:
884 case Attribute::SanitizeMemTag:
886 case Attribute::Preallocated:
888 case Attribute::NoUndef:
890 case Attribute::ByRef:
892 case Attribute::MustProgress:
894 case Attribute::PresplitCoroutine:
896 case Attribute::Writable:
898 case Attribute::CoroDestroyOnlyWhenComplete:
900 case Attribute::CoroElideSafe:
902 case Attribute::DeadOnUnwind:
904 case Attribute::Range:
906 case Attribute::Initializes:
908 case Attribute::NoExt:
910 case Attribute::Captures:
936 unsigned NumWords =
A.getActiveWords();
937 const uint64_t *RawData =
A.getRawData();
938 for (
unsigned i = 0; i < NumWords; i++)
958void ModuleBitcodeWriter::writeAttributeGroupTable() {
959 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
961 if (AttrGrps.empty())
return;
967 unsigned AttrListIndex = Pair.first;
970 Record.push_back(AttrListIndex);
973 if (Attr.isEnumAttribute()) {
976 }
else if (Attr.isIntAttribute()) {
979 Record.push_back(Attr.getValueAsInt());
980 }
else if (Attr.isStringAttribute()) {
991 }
else if (Attr.isTypeAttribute()) {
992 Type *Ty = Attr.getValueAsType();
993 Record.push_back(Ty ? 6 : 5);
997 }
else if (Attr.isConstantRangeAttribute()) {
1003 assert(Attr.isConstantRangeListAttribute());
1009 for (
auto &CR : Val)
1021void ModuleBitcodeWriter::writeAttributeTable() {
1023 if (
Attrs.empty())
return;
1029 for (
unsigned i :
AL.indexes()) {
1043void ModuleBitcodeWriter::writeTypeTable() {
1052 auto Abbv = std::make_shared<BitCodeAbbrev>();
1055 unsigned OpaquePtrAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1058 Abbv = std::make_shared<BitCodeAbbrev>();
1063 unsigned FunctionAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1066 Abbv = std::make_shared<BitCodeAbbrev>();
1071 unsigned StructAnonAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1074 Abbv = std::make_shared<BitCodeAbbrev>();
1078 unsigned StructNameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1081 Abbv = std::make_shared<BitCodeAbbrev>();
1086 unsigned StructNamedAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1089 Abbv = std::make_shared<BitCodeAbbrev>();
1093 unsigned ArrayAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1101 for (
Type *
T : TypeList) {
1102 int AbbrevToUse = 0;
1105 switch (
T->getTypeID()) {
1132 AbbrevToUse = OpaquePtrAbbrev;
1141 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i)
1143 AbbrevToUse = FunctionAbbrev;
1151 for (
Type *ET :
ST->elements())
1154 if (
ST->isLiteral()) {
1156 AbbrevToUse = StructAnonAbbrev;
1158 if (
ST->isOpaque()) {
1162 AbbrevToUse = StructNamedAbbrev;
1166 if (!
ST->getName().empty())
1176 TypeVals.
push_back(AT->getNumElements());
1178 AbbrevToUse = ArrayAbbrev;
1187 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1189 if (isa<ScalableVectorType>(VT))
1199 for (
Type *InnerTy :
TET->type_params())
1201 for (
unsigned IntParam :
TET->int_params())
1210 Stream.
EmitRecord(Code, TypeVals, AbbrevToUse);
1251 RawFlags |= Flags.ReadNone;
1252 RawFlags |= (Flags.ReadOnly << 1);
1253 RawFlags |= (Flags.NoRecurse << 2);
1254 RawFlags |= (Flags.ReturnDoesNotAlias << 3);
1255 RawFlags |= (Flags.NoInline << 4);
1256 RawFlags |= (Flags.AlwaysInline << 5);
1257 RawFlags |= (Flags.NoUnwind << 6);
1258 RawFlags |= (Flags.MayThrow << 7);
1259 RawFlags |= (Flags.HasUnknownCall << 8);
1260 RawFlags |= (Flags.MustBeUnreachable << 9);
1267 bool ImportAsDecl =
false) {
1270 RawFlags |= Flags.NotEligibleToImport;
1271 RawFlags |= (Flags.Live << 1);
1272 RawFlags |= (Flags.DSOLocal << 2);
1273 RawFlags |= (Flags.CanAutoHide << 3);
1278 RawFlags = (RawFlags << 4) | Flags.Linkage;
1280 RawFlags |= (Flags.Visibility << 8);
1282 unsigned ImportType = Flags.ImportType | ImportAsDecl;
1283 RawFlags |= (ImportType << 10);
1289 uint64_t RawFlags = Flags.MaybeReadOnly | (Flags.MaybeWriteOnly << 1) |
1290 (Flags.Constant << 2) | Flags.VCallVisibility << 3;
1332 case GlobalVariable::NotThreadLocal:
return 0;
1333 case GlobalVariable::GeneralDynamicTLSModel:
return 1;
1334 case GlobalVariable::LocalDynamicTLSModel:
return 2;
1335 case GlobalVariable::InitialExecTLSModel:
return 3;
1336 case GlobalVariable::LocalExecTLSModel:
return 4;
1342 switch (
C.getSelectionKind()) {
1359 case GlobalValue::UnnamedAddr::None:
return 0;
1360 case GlobalValue::UnnamedAddr::Local:
return 2;
1361 case GlobalValue::UnnamedAddr::Global:
return 1;
1366size_t ModuleBitcodeWriter::addToStrtab(
StringRef Str) {
1369 return StrtabBuilder.
add(Str);
1372void ModuleBitcodeWriter::writeComdats() {
1387void ModuleBitcodeWriter::writeValueSymbolTableForwardDecl() {
1392 auto Abbv = std::make_shared<BitCodeAbbrev>();
1398 unsigned VSTOffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1414 bool isChar6 =
true;
1415 for (
char C : Str) {
1418 if ((
unsigned char)
C & 128)
1428 "Sanitizer Metadata is too large for naive serialization.");
1431 return Meta.NoAddress | (
Meta.NoHWAddress << 1) |
1432 (
Meta.Memtag << 2) | (
Meta.IsDynInit << 3);
1438void ModuleBitcodeWriter::writeModuleInfo() {
1440 if (!
M.getTargetTriple().empty())
1443 const std::string &
DL =
M.getDataLayoutStr();
1446 if (!
M.getModuleInlineAsm().empty())
1452 std::map<std::string, unsigned> SectionMap;
1453 std::map<std::string, unsigned> GCMap;
1455 unsigned MaxGlobalType = 0;
1456 const auto UpdateMaxAlignment = [&MaxAlignment](
const MaybeAlign A) {
1458 MaxAlignment = !MaxAlignment ? *
A : std::max(*MaxAlignment, *
A);
1461 UpdateMaxAlignment(GV.getAlign());
1462 MaxGlobalType = std::max(MaxGlobalType, VE.
getTypeID(GV.getValueType()));
1463 if (GV.hasSection()) {
1465 unsigned &
Entry = SectionMap[std::string(GV.getSection())];
1469 Entry = SectionMap.size();
1474 UpdateMaxAlignment(
F.getAlign());
1475 if (
F.hasSection()) {
1477 unsigned &
Entry = SectionMap[std::string(
F.getSection())];
1481 Entry = SectionMap.size();
1486 unsigned &
Entry = GCMap[
F.getGC()];
1490 Entry = GCMap.size();
1496 unsigned SimpleGVarAbbrev = 0;
1497 if (!
M.global_empty()) {
1499 auto Abbv = std::make_shared<BitCodeAbbrev>();
1513 unsigned MaxEncAlignment = getEncodedAlign(MaxAlignment);
1517 if (SectionMap.empty())
1523 SimpleGVarAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1537 auto Abbv = std::make_shared<BitCodeAbbrev>();
1540 Abbv->Add(AbbrevOpToUse);
1541 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1543 for (
const auto P :
M.getSourceFileName())
1553 unsigned AbbrevToUse = 0;
1559 Vals.
push_back(addToStrtab(GV.getName()));
1562 Vals.
push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant());
1566 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1567 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1569 if (GV.isThreadLocal() ||
1571 GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||
1572 GV.isExternallyInitialized() ||
1574 GV.hasComdat() || GV.hasAttributes() || GV.isDSOLocal() ||
1575 GV.hasPartition() || GV.hasSanitizerMetadata() || GV.getCodeModel()) {
1579 Vals.
push_back(GV.isExternallyInitialized());
1587 Vals.
push_back(addToStrtab(GV.getPartition()));
1588 Vals.
push_back(GV.getPartition().size());
1591 GV.getSanitizerMetadata())
1595 AbbrevToUse = SimpleGVarAbbrev;
1615 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1616 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1628 F.hasPersonalityFn() ? (VE.
getValueID(
F.getPersonalityFn()) + 1) : 0);
1632 Vals.
push_back(addToStrtab(
F.getPartition()));
1635 unsigned AbbrevToUse = 0;
1648 Vals.
push_back(
A.getType()->getAddressSpace());
1656 Vals.
push_back(addToStrtab(
A.getPartition()));
1659 unsigned AbbrevToUse = 0;
1671 Vals.
push_back(
I.getType()->getAddressSpace());
1676 Vals.
push_back(addToStrtab(
I.getPartition()));
1682 writeValueSymbolTableForwardDecl();
1688 if (
const auto *OBO = dyn_cast<OverflowingBinaryOperator>(V)) {
1689 if (OBO->hasNoSignedWrap())
1691 if (OBO->hasNoUnsignedWrap())
1693 }
else if (
const auto *PEO = dyn_cast<PossiblyExactOperator>(V)) {
1696 }
else if (
const auto *PDI = dyn_cast<PossiblyDisjointInst>(V)) {
1697 if (PDI->isDisjoint())
1699 }
else if (
const auto *FPMO = dyn_cast<FPMathOperator>(V)) {
1700 if (FPMO->hasAllowReassoc())
1702 if (FPMO->hasNoNaNs())
1704 if (FPMO->hasNoInfs())
1706 if (FPMO->hasNoSignedZeros())
1708 if (FPMO->hasAllowReciprocal())
1710 if (FPMO->hasAllowContract())
1712 if (FPMO->hasApproxFunc())
1714 }
else if (
const auto *NNI = dyn_cast<PossiblyNonNegInst>(V)) {
1715 if (NNI->hasNonNeg())
1717 }
else if (
const auto *TI = dyn_cast<TruncInst>(V)) {
1718 if (TI->hasNoSignedWrap())
1720 if (TI->hasNoUnsignedWrap())
1722 }
else if (
const auto *
GEP = dyn_cast<GEPOperator>(V)) {
1723 if (
GEP->isInBounds())
1725 if (
GEP->hasNoUnsignedSignedWrap())
1727 if (
GEP->hasNoUnsignedWrap())
1729 }
else if (
const auto *ICmp = dyn_cast<ICmpInst>(V)) {
1730 if (ICmp->hasSameSign())
1737void ModuleBitcodeWriter::writeValueAsMetadata(
1747void ModuleBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1752 assert(!(MD && isa<LocalAsMetadata>(MD)) &&
1753 "Unexpected function-local metadata");
1762unsigned ModuleBitcodeWriter::createDILocationAbbrev() {
1765 auto Abbv = std::make_shared<BitCodeAbbrev>();
1776void ModuleBitcodeWriter::writeDILocation(
const DILocation *
N,
1780 Abbrev = createDILocationAbbrev();
1782 Record.push_back(
N->isDistinct());
1783 Record.push_back(
N->getLine());
1784 Record.push_back(
N->getColumn());
1787 Record.push_back(
N->isImplicitCode());
1793unsigned ModuleBitcodeWriter::createGenericDINodeAbbrev() {
1796 auto Abbv = std::make_shared<BitCodeAbbrev>();
1807void ModuleBitcodeWriter::writeGenericDINode(
const GenericDINode *
N,
1811 Abbrev = createGenericDINodeAbbrev();
1813 Record.push_back(
N->isDistinct());
1814 Record.push_back(
N->getTag());
1817 for (
auto &
I :
N->operands())
1824void ModuleBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1838void ModuleBitcodeWriter::writeDIGenericSubrange(
1851void ModuleBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1855 Record.push_back(IsBigInt | (
N->isUnsigned() << 1) |
N->isDistinct());
1856 Record.push_back(
N->getValue().getBitWidth());
1864void ModuleBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1867 Record.push_back(
N->isDistinct());
1868 Record.push_back(
N->getTag());
1870 Record.push_back(
N->getSizeInBits());
1871 Record.push_back(
N->getAlignInBits());
1872 Record.push_back(
N->getEncoding());
1873 Record.push_back(
N->getFlags());
1874 Record.push_back(
N->getNumExtraInhabitants());
1880void ModuleBitcodeWriter::writeDIStringType(
const DIStringType *
N,
1883 Record.push_back(
N->isDistinct());
1884 Record.push_back(
N->getTag());
1889 Record.push_back(
N->getSizeInBits());
1890 Record.push_back(
N->getAlignInBits());
1891 Record.push_back(
N->getEncoding());
1897void ModuleBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
1900 Record.push_back(
N->isDistinct());
1901 Record.push_back(
N->getTag());
1904 Record.push_back(
N->getLine());
1907 Record.push_back(
N->getSizeInBits());
1908 Record.push_back(
N->getAlignInBits());
1909 Record.push_back(
N->getOffsetInBits());
1910 Record.push_back(
N->getFlags());
1915 if (
const auto &DWARFAddressSpace =
N->getDWARFAddressSpace())
1916 Record.push_back(*DWARFAddressSpace + 1);
1922 if (
auto PtrAuthData =
N->getPtrAuthData())
1923 Record.push_back(PtrAuthData->RawData);
1931void ModuleBitcodeWriter::writeDICompositeType(
1934 const unsigned IsNotUsedInOldTypeRef = 0x2;
1935 Record.push_back(IsNotUsedInOldTypeRef | (
unsigned)
N->isDistinct());
1936 Record.push_back(
N->getTag());
1939 Record.push_back(
N->getLine());
1942 Record.push_back(
N->getSizeInBits());
1943 Record.push_back(
N->getAlignInBits());
1944 Record.push_back(
N->getOffsetInBits());
1945 Record.push_back(
N->getFlags());
1947 Record.push_back(
N->getRuntimeLang());
1957 Record.push_back(
N->getNumExtraInhabitants());
1964void ModuleBitcodeWriter::writeDISubroutineType(
1967 const unsigned HasNoOldTypeRefs = 0x2;
1968 Record.push_back(HasNoOldTypeRefs | (
unsigned)
N->isDistinct());
1969 Record.push_back(
N->getFlags());
1977void ModuleBitcodeWriter::writeDIFile(
const DIFile *
N,
1980 Record.push_back(
N->isDistinct());
1983 if (
N->getRawChecksum()) {
1984 Record.push_back(
N->getRawChecksum()->Kind);
1992 auto Source =
N->getRawSource();
2000void ModuleBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
2003 assert(
N->isDistinct() &&
"Expected distinct compile units");
2005 Record.push_back(
N->getSourceLanguage());
2008 Record.push_back(
N->isOptimized());
2010 Record.push_back(
N->getRuntimeVersion());
2012 Record.push_back(
N->getEmissionKind());
2018 Record.push_back(
N->getDWOId());
2020 Record.push_back(
N->getSplitDebugInlining());
2021 Record.push_back(
N->getDebugInfoForProfiling());
2022 Record.push_back((
unsigned)
N->getNameTableKind());
2023 Record.push_back(
N->getRangesBaseAddress());
2031void ModuleBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
2034 const uint64_t HasUnitFlag = 1 << 1;
2035 const uint64_t HasSPFlagsFlag = 1 << 2;
2036 Record.push_back(
uint64_t(
N->isDistinct()) | HasUnitFlag | HasSPFlagsFlag);
2041 Record.push_back(
N->getLine());
2043 Record.push_back(
N->getScopeLine());
2045 Record.push_back(
N->getSPFlags());
2046 Record.push_back(
N->getVirtualIndex());
2047 Record.push_back(
N->getFlags());
2052 Record.push_back(
N->getThisAdjustment());
2064 Record.push_back(
N->isDistinct());
2067 Record.push_back(
N->getLine());
2068 Record.push_back(
N->getColumn());
2074void ModuleBitcodeWriter::writeDILexicalBlockFile(
2077 Record.push_back(
N->isDistinct());
2080 Record.push_back(
N->getDiscriminator());
2086void ModuleBitcodeWriter::writeDICommonBlock(
const DICommonBlock *
N,
2089 Record.push_back(
N->isDistinct());
2094 Record.push_back(
N->getLineNo());
2100void ModuleBitcodeWriter::writeDINamespace(
const DINamespace *
N,
2103 Record.push_back(
N->isDistinct() |
N->getExportSymbols() << 1);
2111void ModuleBitcodeWriter::writeDIMacro(
const DIMacro *
N,
2114 Record.push_back(
N->isDistinct());
2115 Record.push_back(
N->getMacinfoType());
2116 Record.push_back(
N->getLine());
2124void ModuleBitcodeWriter::writeDIMacroFile(
const DIMacroFile *
N,
2127 Record.push_back(
N->isDistinct());
2128 Record.push_back(
N->getMacinfoType());
2129 Record.push_back(
N->getLine());
2137void ModuleBitcodeWriter::writeDIArgList(
const DIArgList *
N,
2139 Record.reserve(
N->getArgs().size());
2147void ModuleBitcodeWriter::writeDIModule(
const DIModule *
N,
2150 Record.push_back(
N->isDistinct());
2151 for (
auto &
I :
N->operands())
2153 Record.push_back(
N->getLineNo());
2154 Record.push_back(
N->getIsDecl());
2160void ModuleBitcodeWriter::writeDIAssignID(
const DIAssignID *
N,
2164 Record.push_back(
N->isDistinct());
2169void ModuleBitcodeWriter::writeDITemplateTypeParameter(
2172 Record.push_back(
N->isDistinct());
2175 Record.push_back(
N->isDefault());
2181void ModuleBitcodeWriter::writeDITemplateValueParameter(
2184 Record.push_back(
N->isDistinct());
2185 Record.push_back(
N->getTag());
2188 Record.push_back(
N->isDefault());
2195void ModuleBitcodeWriter::writeDIGlobalVariable(
2204 Record.push_back(
N->getLine());
2206 Record.push_back(
N->isLocalToUnit());
2207 Record.push_back(
N->isDefinition());
2210 Record.push_back(
N->getAlignInBits());
2217void ModuleBitcodeWriter::writeDILocalVariable(
2233 const uint64_t HasAlignmentFlag = 1 << 1;
2238 Record.push_back(
N->getLine());
2240 Record.push_back(
N->getArg());
2241 Record.push_back(
N->getFlags());
2242 Record.push_back(
N->getAlignInBits());
2249void ModuleBitcodeWriter::writeDILabel(
2256 Record.push_back(
N->getLine());
2262void ModuleBitcodeWriter::writeDIExpression(
const DIExpression *
N,
2265 Record.reserve(
N->getElements().size() + 1);
2268 Record.append(
N->elements_begin(),
N->elements_end());
2274void ModuleBitcodeWriter::writeDIGlobalVariableExpression(
2277 Record.push_back(
N->isDistinct());
2288 Record.push_back(
N->isDistinct());
2291 Record.push_back(
N->getLine());
2294 Record.push_back(
N->getAttributes());
2301void ModuleBitcodeWriter::writeDIImportedEntity(
2304 Record.push_back(
N->isDistinct());
2305 Record.push_back(
N->getTag());
2308 Record.push_back(
N->getLine());
2317unsigned ModuleBitcodeWriter::createNamedMetadataAbbrev() {
2318 auto Abbv = std::make_shared<BitCodeAbbrev>();
2325void ModuleBitcodeWriter::writeNamedMetadata(
2327 if (
M.named_metadata_empty())
2330 unsigned Abbrev = createNamedMetadataAbbrev();
2334 Record.append(Str.bytes_begin(), Str.bytes_end());
2339 for (
const MDNode *
N : NMD.operands())
2346unsigned ModuleBitcodeWriter::createMetadataStringsAbbrev() {
2347 auto Abbv = std::make_shared<BitCodeAbbrev>();
2359void ModuleBitcodeWriter::writeMetadataStrings(
2361 if (Strings.empty())
2366 Record.push_back(Strings.size());
2373 W.EmitVBR(cast<MDString>(MD)->getLength(), 6);
2382 Blob.
append(cast<MDString>(MD)->getString());
2391#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,
2392#include "llvm/IR/Metadata.def"
2396void ModuleBitcodeWriter::writeMetadataRecords(
2398 std::vector<unsigned> *MDAbbrevs, std::vector<uint64_t> *IndexPos) {
2403#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
2404#include "llvm/IR/Metadata.def"
2409 if (
const MDNode *
N = dyn_cast<MDNode>(MD)) {
2410 assert(
N->isResolved() &&
"Expected forward references to be resolved");
2412 switch (
N->getMetadataID()) {
2415#define HANDLE_MDNODE_LEAF(CLASS) \
2416 case Metadata::CLASS##Kind: \
2418 write##CLASS(cast<CLASS>(N), Record, \
2419 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
2421 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
2423#include "llvm/IR/Metadata.def"
2426 if (
auto *
AL = dyn_cast<DIArgList>(MD)) {
2430 writeValueAsMetadata(cast<ValueAsMetadata>(MD),
Record);
2434void ModuleBitcodeWriter::writeModuleMetadata() {
2435 if (!VE.
hasMDs() &&
M.named_metadata_empty())
2443 std::vector<unsigned> MDAbbrevs;
2446 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
2447 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
2448 createGenericDINodeAbbrev();
2450 auto Abbv = std::make_shared<BitCodeAbbrev>();
2454 unsigned OffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2456 Abbv = std::make_shared<BitCodeAbbrev>();
2460 unsigned IndexAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2482 std::vector<uint64_t> IndexPos;
2497 uint64_t PreviousValue = IndexOffsetRecordBitPos;
2498 for (
auto &Elt : IndexPos) {
2499 auto EltDelta = Elt - PreviousValue;
2500 PreviousValue = Elt;
2509 writeNamedMetadata(
Record);
2511 auto AddDeclAttachedMetadata = [&](
const GlobalObject &GO) {
2514 pushGlobalMetadataAttachment(
Record, GO);
2518 if (
F.isDeclaration() &&
F.hasMetadata())
2519 AddDeclAttachedMetadata(
F);
2523 if (GV.hasMetadata())
2524 AddDeclAttachedMetadata(GV);
2529void ModuleBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
2540void ModuleBitcodeWriter::pushGlobalMetadataAttachment(
2545 for (
const auto &
I : MDs) {
2551void ModuleBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
2556 if (
F.hasMetadata()) {
2557 pushGlobalMetadataAttachment(
Record,
F);
2568 I.getAllMetadataOtherThanDebugLoc(MDs);
2571 if (MDs.
empty())
continue;
2575 for (
unsigned i = 0, e = MDs.
size(); i != e; ++i) {
2576 Record.push_back(MDs[i].first);
2586void ModuleBitcodeWriter::writeModuleMetadataKinds() {
2592 M.getMDKindNames(Names);
2594 if (Names.
empty())
return;
2598 for (
unsigned MDKindID = 0, e = Names.
size(); MDKindID != e; ++MDKindID) {
2599 Record.push_back(MDKindID);
2610void ModuleBitcodeWriter::writeOperandBundleTags() {
2618 M.getOperandBundleTags(Tags);
2627 for (
auto Tag : Tags) {
2637void ModuleBitcodeWriter::writeSyncScopeNames() {
2639 M.getContext().getSyncScopeNames(SSNs);
2646 for (
auto SSN : SSNs) {
2647 Record.append(SSN.begin(), SSN.end());
2655void ModuleBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
2657 if (FirstVal == LastVal)
return;
2661 unsigned AggregateAbbrev = 0;
2662 unsigned String8Abbrev = 0;
2663 unsigned CString7Abbrev = 0;
2664 unsigned CString6Abbrev = 0;
2668 auto Abbv = std::make_shared<BitCodeAbbrev>();
2672 AggregateAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2675 Abbv = std::make_shared<BitCodeAbbrev>();
2679 String8Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2681 Abbv = std::make_shared<BitCodeAbbrev>();
2685 CString7Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2687 Abbv = std::make_shared<BitCodeAbbrev>();
2691 CString6Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2697 Type *LastTy =
nullptr;
2698 for (
unsigned i = FirstVal; i != LastVal; ++i) {
2699 const Value *
V = Vals[i].first;
2701 if (
V->getType() != LastTy) {
2702 LastTy =
V->getType();
2705 CONSTANTS_SETTYPE_ABBREV);
2709 if (
const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
2712 unsigned(
IA->hasSideEffects()) |
unsigned(
IA->isAlignStack()) << 1 |
2713 unsigned(
IA->getDialect() & 1) << 2 |
unsigned(
IA->canThrow()) << 3);
2716 const std::string &AsmStr =
IA->getAsmString();
2717 Record.push_back(AsmStr.size());
2718 Record.append(AsmStr.begin(), AsmStr.end());
2721 const std::string &ConstraintStr =
IA->getConstraintString();
2722 Record.push_back(ConstraintStr.size());
2723 Record.append(ConstraintStr.begin(), ConstraintStr.end());
2729 unsigned Code = -1U;
2730 unsigned AbbrevToUse = 0;
2731 if (
C->isNullValue()) {
2733 }
else if (isa<PoisonValue>(
C)) {
2735 }
else if (isa<UndefValue>(
C)) {
2738 if (
IV->getBitWidth() <= 64) {
2742 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2747 }
else if (
const ConstantFP *CFP = dyn_cast<ConstantFP>(
C)) {
2752 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2756 APInt api = CFP->getValueAPF().bitcastToAPInt();
2758 Record.push_back((p[1] << 48) | (p[0] >> 16));
2759 Record.push_back(p[0] & 0xffffLL);
2761 APInt api = CFP->getValueAPF().bitcastToAPInt();
2766 assert(0 &&
"Unknown FP type!");
2768 }
else if (isa<ConstantDataSequential>(
C) &&
2769 cast<ConstantDataSequential>(
C)->isString()) {
2772 unsigned NumElts = Str->getNumElements();
2774 if (Str->isCString()) {
2779 AbbrevToUse = String8Abbrev;
2783 for (
unsigned i = 0; i != NumElts; ++i) {
2784 unsigned char V = Str->getElementAsInteger(i);
2786 isCStr7 &= (
V & 128) == 0;
2792 AbbrevToUse = CString6Abbrev;
2794 AbbrevToUse = CString7Abbrev;
2796 dyn_cast<ConstantDataSequential>(
C)) {
2798 Type *EltTy = CDS->getElementType();
2799 if (isa<IntegerType>(EltTy)) {
2800 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i)
2801 Record.push_back(CDS->getElementAsInteger(i));
2803 for (
unsigned i = 0, e = CDS->getNumElements(); i != e; ++i)
2805 CDS->getElementAsAPFloat(i).bitcastToAPInt().getLimitedValue());
2807 }
else if (isa<ConstantAggregate>(
C)) {
2809 for (
const Value *
Op :
C->operands())
2811 AbbrevToUse = AggregateAbbrev;
2812 }
else if (
const ConstantExpr *CE = dyn_cast<ConstantExpr>(
C)) {
2813 switch (
CE->getOpcode()) {
2820 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2822 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
2832 case Instruction::FNeg: {
2833 assert(
CE->getNumOperands() == 1 &&
"Unknown constant expr!");
2842 case Instruction::GetElementPtr: {
2844 const auto *GO = cast<GEPOperator>(
C);
2847 if (std::optional<ConstantRange>
Range = GO->getInRange()) {
2851 for (
const Value *
Op :
CE->operands()) {
2857 case Instruction::ExtractElement:
2864 case Instruction::InsertElement:
2871 case Instruction::ShuffleVector:
2876 if (
C->getType() ==
C->getOperand(0)->getType()) {
2887 }
else if (
const BlockAddress *BA = dyn_cast<BlockAddress>(
C)) {
2892 }
else if (
const auto *Equiv = dyn_cast<DSOLocalEquivalent>(
C)) {
2896 }
else if (
const auto *
NC = dyn_cast<NoCFIValue>(
C)) {
2900 }
else if (
const auto *CPA = dyn_cast<ConstantPtrAuth>(
C)) {
2919void ModuleBitcodeWriter::writeModuleConstants() {
2924 for (
unsigned i = 0, e = Vals.size(); i != e; ++i) {
2925 if (!isa<GlobalValue>(Vals[i].first)) {
2926 writeConstants(i, Vals.size(),
true);
2940bool ModuleBitcodeWriter::pushValueAndType(
const Value *V,
unsigned InstID,
2945 if (
ValID >= InstID) {
2952bool ModuleBitcodeWriter::pushValueOrMetadata(
const Value *V,
unsigned InstID,
2954 bool IsMetadata =
V->getType()->isMetadataTy();
2957 Metadata *MD = cast<MetadataAsValue>(V)->getMetadata();
2962 return pushValueAndType(V, InstID, Vals);
2965void ModuleBitcodeWriter::writeOperandBundles(
const CallBase &CS,
2972 Record.push_back(
C.getOperandBundleTagID(Bundle.getTagName()));
2974 for (
auto &Input : Bundle.Inputs)
2975 pushValueOrMetadata(Input, InstID,
Record);
2984void ModuleBitcodeWriter::pushValue(
const Value *V,
unsigned InstID,
2990void ModuleBitcodeWriter::pushValueSigned(
const Value *V,
unsigned InstID,
2993 int64_t diff = ((int32_t)InstID - (int32_t)
ValID);
2998void ModuleBitcodeWriter::writeInstruction(
const Instruction &
I,
3002 unsigned AbbrevToUse = 0;
3004 switch (
I.getOpcode()) {
3008 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3009 AbbrevToUse = FUNCTION_INST_CAST_ABBREV;
3014 if (AbbrevToUse == FUNCTION_INST_CAST_ABBREV)
3015 AbbrevToUse = FUNCTION_INST_CAST_FLAGS_ABBREV;
3019 assert(isa<BinaryOperator>(
I) &&
"Unknown instruction!");
3021 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3022 AbbrevToUse = FUNCTION_INST_BINOP_ABBREV;
3023 pushValue(
I.getOperand(1), InstID, Vals);
3027 if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV)
3028 AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV;
3033 case Instruction::FNeg: {
3035 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3036 AbbrevToUse = FUNCTION_INST_UNOP_ABBREV;
3040 if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV)
3041 AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV;
3046 case Instruction::GetElementPtr: {
3048 AbbrevToUse = FUNCTION_INST_GEP_ABBREV;
3049 auto &GEPInst = cast<GetElementPtrInst>(
I);
3052 for (
const Value *
Op :
I.operands())
3053 pushValueAndType(
Op, InstID, Vals);
3056 case Instruction::ExtractValue: {
3058 pushValueAndType(
I.getOperand(0), InstID, Vals);
3063 case Instruction::InsertValue: {
3065 pushValueAndType(
I.getOperand(0), InstID, Vals);
3066 pushValueAndType(
I.getOperand(1), InstID, Vals);
3071 case Instruction::Select: {
3073 pushValueAndType(
I.getOperand(1), InstID, Vals);
3074 pushValue(
I.getOperand(2), InstID, Vals);
3075 pushValueAndType(
I.getOperand(0), InstID, Vals);
3081 case Instruction::ExtractElement:
3083 pushValueAndType(
I.getOperand(0), InstID, Vals);
3084 pushValueAndType(
I.getOperand(1), InstID, Vals);
3086 case Instruction::InsertElement:
3088 pushValueAndType(
I.getOperand(0), InstID, Vals);
3089 pushValue(
I.getOperand(1), InstID, Vals);
3090 pushValueAndType(
I.getOperand(2), InstID, Vals);
3092 case Instruction::ShuffleVector:
3094 pushValueAndType(
I.getOperand(0), InstID, Vals);
3095 pushValue(
I.getOperand(1), InstID, Vals);
3096 pushValue(cast<ShuffleVectorInst>(
I).getShuffleMaskForBitcode(), InstID,
3099 case Instruction::ICmp:
3100 case Instruction::FCmp: {
3103 pushValueAndType(
I.getOperand(0), InstID, Vals);
3104 pushValue(
I.getOperand(1), InstID, Vals);
3112 case Instruction::Ret:
3115 unsigned NumOperands =
I.getNumOperands();
3116 if (NumOperands == 0)
3117 AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV;
3118 else if (NumOperands == 1) {
3119 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3120 AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV;
3122 for (
const Value *
Op :
I.operands())
3123 pushValueAndType(
Op, InstID, Vals);
3127 case Instruction::Br:
3132 if (
II.isConditional()) {
3134 pushValue(
II.getCondition(), InstID, Vals);
3138 case Instruction::Switch:
3143 pushValue(
SI.getCondition(), InstID, Vals);
3145 for (
auto Case :
SI.cases()) {
3151 case Instruction::IndirectBr:
3155 pushValue(
I.getOperand(0), InstID, Vals);
3160 case Instruction::Invoke: {
3165 if (
II->hasOperandBundles())
3166 writeOperandBundles(*
II, InstID);
3175 pushValueAndType(Callee, InstID, Vals);
3178 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3179 pushValue(
I.getOperand(i), InstID, Vals);
3182 if (FTy->isVarArg()) {
3183 for (
unsigned i = FTy->getNumParams(), e =
II->arg_size(); i != e; ++i)
3184 pushValueAndType(
I.getOperand(i), InstID, Vals);
3188 case Instruction::Resume:
3190 pushValueAndType(
I.getOperand(0), InstID, Vals);
3192 case Instruction::CleanupRet: {
3194 const auto &CRI = cast<CleanupReturnInst>(
I);
3195 pushValue(CRI.getCleanupPad(), InstID, Vals);
3196 if (CRI.hasUnwindDest())
3200 case Instruction::CatchRet: {
3202 const auto &CRI = cast<CatchReturnInst>(
I);
3203 pushValue(CRI.getCatchPad(), InstID, Vals);
3207 case Instruction::CleanupPad:
3208 case Instruction::CatchPad: {
3209 const auto &FuncletPad = cast<FuncletPadInst>(
I);
3212 pushValue(FuncletPad.getParentPad(), InstID, Vals);
3214 unsigned NumArgOperands = FuncletPad.arg_size();
3216 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op)
3217 pushValueAndType(FuncletPad.getArgOperand(
Op), InstID, Vals);
3220 case Instruction::CatchSwitch: {
3222 const auto &CatchSwitch = cast<CatchSwitchInst>(
I);
3224 pushValue(CatchSwitch.getParentPad(), InstID, Vals);
3226 unsigned NumHandlers = CatchSwitch.getNumHandlers();
3228 for (
const BasicBlock *CatchPadBB : CatchSwitch.handlers())
3231 if (CatchSwitch.hasUnwindDest())
3235 case Instruction::CallBr: {
3241 writeOperandBundles(*CBI, InstID);
3256 pushValueAndType(Callee, InstID, Vals);
3259 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3260 pushValue(
I.getOperand(i), InstID, Vals);
3263 if (FTy->isVarArg()) {
3264 for (
unsigned i = FTy->getNumParams(), e = CBI->
arg_size(); i != e; ++i)
3265 pushValueAndType(
I.getOperand(i), InstID, Vals);
3269 case Instruction::Unreachable:
3271 AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;
3274 case Instruction::PHI: {
3275 const PHINode &PN = cast<PHINode>(
I);
3292 Stream.
EmitRecord(Code, Vals64, AbbrevToUse);
3297 case Instruction::LandingPad: {
3308 pushValueAndType(LP.
getClause(
I), InstID, Vals);
3313 case Instruction::Alloca: {
3321 unsigned EncodedAlign = getEncodedAlign(AI.
getAlign());
3322 Bitfield::set<APV::AlignLower>(
3323 Record, EncodedAlign & ((1 << APV::AlignLower::Bits) - 1));
3324 Bitfield::set<APV::AlignUpper>(
Record,
3325 EncodedAlign >> APV::AlignLower::Bits);
3327 Bitfield::set<APV::ExplicitType>(
Record,
true);
3332 if (AS !=
M.getDataLayout().getAllocaAddrSpace())
3337 case Instruction::Load:
3338 if (cast<LoadInst>(
I).isAtomic()) {
3340 pushValueAndType(
I.getOperand(0), InstID, Vals);
3343 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3344 AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;
3348 Vals.
push_back(cast<LoadInst>(
I).isVolatile());
3349 if (cast<LoadInst>(
I).isAtomic()) {
3351 Vals.
push_back(getEncodedSyncScopeID(cast<LoadInst>(
I).getSyncScopeID()));
3354 case Instruction::Store:
3355 if (cast<StoreInst>(
I).isAtomic())
3359 pushValueAndType(
I.getOperand(1), InstID, Vals);
3360 pushValueAndType(
I.getOperand(0), InstID, Vals);
3362 Vals.
push_back(cast<StoreInst>(
I).isVolatile());
3363 if (cast<StoreInst>(
I).isAtomic()) {
3366 getEncodedSyncScopeID(cast<StoreInst>(
I).getSyncScopeID()));
3369 case Instruction::AtomicCmpXchg:
3371 pushValueAndType(
I.getOperand(0), InstID, Vals);
3372 pushValueAndType(
I.getOperand(1), InstID, Vals);
3373 pushValue(
I.getOperand(2), InstID, Vals);
3374 Vals.
push_back(cast<AtomicCmpXchgInst>(
I).isVolatile());
3378 getEncodedSyncScopeID(cast<AtomicCmpXchgInst>(
I).getSyncScopeID()));
3381 Vals.
push_back(cast<AtomicCmpXchgInst>(
I).isWeak());
3384 case Instruction::AtomicRMW:
3386 pushValueAndType(
I.getOperand(0), InstID, Vals);
3387 pushValueAndType(
I.getOperand(1), InstID, Vals);
3390 Vals.
push_back(cast<AtomicRMWInst>(
I).isVolatile());
3393 getEncodedSyncScopeID(cast<AtomicRMWInst>(
I).getSyncScopeID()));
3396 case Instruction::Fence:
3399 Vals.
push_back(getEncodedSyncScopeID(cast<FenceInst>(
I).getSyncScopeID()));
3401 case Instruction::Call: {
3406 writeOperandBundles(CI, InstID);
3426 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
3428 if (FTy->getParamType(i)->isLabelTy())
3435 if (FTy->isVarArg()) {
3436 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
3441 case Instruction::VAArg:
3444 pushValue(
I.getOperand(0), InstID, Vals);
3447 case Instruction::Freeze:
3449 pushValueAndType(
I.getOperand(0), InstID, Vals);
3459void ModuleBitcodeWriter::writeGlobalValueSymbolTable(
3465 VSTOffset -= bitcodeStartBit();
3466 assert((VSTOffset & 31) == 0 &&
"VST block not 32-bit aligned");
3470 Stream.
BackpatchWord(VSTOffsetPlaceholder, VSTOffset / 32 + 1);
3474 auto Abbv = std::make_shared<BitCodeAbbrev>();
3478 unsigned FnEntryAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
3483 if (
F.isDeclaration())
3490 uint64_t BitcodeIndex = FunctionToBitcodeIndex[&
F] - bitcodeStartBit();
3491 assert((BitcodeIndex & 31) == 0 &&
"function block not 32-bit aligned");
3495 Record[1] = BitcodeIndex / 32 + 1;
3504void ModuleBitcodeWriter::writeFunctionLevelValueSymbolTable(
3519 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
3525 if (isa<BasicBlock>(
Name.getValue())) {
3528 AbbrevToUse = VST_BBENTRY_6_ABBREV;
3532 AbbrevToUse = VST_ENTRY_6_ABBREV;
3534 AbbrevToUse = VST_ENTRY_7_ABBREV;
3537 for (
const auto P :
Name.getKey())
3541 Stream.
EmitRecord(Code, NameVals, AbbrevToUse);
3548void ModuleBitcodeWriter::writeUseList(
UseListOrder &&Order) {
3549 assert(Order.Shuffle.size() >= 2 &&
"Shuffle too small");
3551 if (isa<BasicBlock>(Order.V))
3561void ModuleBitcodeWriter::writeUseListBlock(
const Function *
F) {
3563 "Expected to be preserving use-list order");
3565 auto hasMore = [&]() {
3581void ModuleBitcodeWriter::writeFunction(
3600 unsigned CstStart, CstEnd;
3602 writeConstants(CstStart, CstEnd,
false);
3605 writeFunctionMetadata(
F);
3608 unsigned InstID = CstEnd;
3610 bool NeedsMetadataAttachment =
F.hasMetadata();
3618 writeInstruction(
I, InstID, Vals);
3620 if (!
I.getType()->isVoidTy())
3624 NeedsMetadataAttachment |=
I.hasMetadataOtherThanDebugLoc();
3651 auto PushValueOrMetadata = [&Vals, InstID,
3654 "RawLocation unexpectedly null in DbgVariableRecord");
3660 if (!pushValueAndType(VAM->getValue(), InstID, ValAndType)) {
3674 for (
DbgRecord &DR :
I.DebugMarker->getDbgRecordRange()) {
3700 FUNCTION_DEBUG_RECORD_VALUE_ABBREV);
3722 while (!Worklist.empty()) {
3723 Value *
V = Worklist.pop_back_val();
3724 for (
User *U :
V->users()) {
3725 if (
auto *
I = dyn_cast<Instruction>(U)) {
3729 }
else if (isa<Constant>(U) && !isa<GlobalValue>(U) &&
3730 Visited.insert(U).second)
3731 Worklist.push_back(U);
3737 if (!BlockAddressUsers.
empty()) {
3746 if (
auto *Symtab =
F.getValueSymbolTable())
3747 writeFunctionLevelValueSymbolTable(*Symtab);
3749 if (NeedsMetadataAttachment)
3750 writeFunctionMetadataAttachment(
F);
3752 writeUseListBlock(&
F);
3758void ModuleBitcodeWriter::writeBlockInfo() {
3765 auto Abbv = std::make_shared<BitCodeAbbrev>();
3776 auto Abbv = std::make_shared<BitCodeAbbrev>();
3786 auto Abbv = std::make_shared<BitCodeAbbrev>();
3796 auto Abbv = std::make_shared<BitCodeAbbrev>();
3802 VST_BBENTRY_6_ABBREV)
3807 auto Abbv = std::make_shared<BitCodeAbbrev>();
3812 CONSTANTS_SETTYPE_ABBREV)
3817 auto Abbv = std::make_shared<BitCodeAbbrev>();
3821 CONSTANTS_INTEGER_ABBREV)
3826 auto Abbv = std::make_shared<BitCodeAbbrev>();
3834 CONSTANTS_CE_CAST_Abbrev)
3838 auto Abbv = std::make_shared<BitCodeAbbrev>();
3841 CONSTANTS_NULL_Abbrev)
3848 auto Abbv = std::make_shared<BitCodeAbbrev>();
3856 FUNCTION_INST_LOAD_ABBREV)
3860 auto Abbv = std::make_shared<BitCodeAbbrev>();
3865 FUNCTION_INST_UNOP_ABBREV)
3869 auto Abbv = std::make_shared<BitCodeAbbrev>();
3875 FUNCTION_INST_UNOP_FLAGS_ABBREV)
3879 auto Abbv = std::make_shared<BitCodeAbbrev>();
3885 FUNCTION_INST_BINOP_ABBREV)
3889 auto Abbv = std::make_shared<BitCodeAbbrev>();
3896 FUNCTION_INST_BINOP_FLAGS_ABBREV)
3900 auto Abbv = std::make_shared<BitCodeAbbrev>();
3907 FUNCTION_INST_CAST_ABBREV)
3911 auto Abbv = std::make_shared<BitCodeAbbrev>();
3919 FUNCTION_INST_CAST_FLAGS_ABBREV)
3924 auto Abbv = std::make_shared<BitCodeAbbrev>();
3927 FUNCTION_INST_RET_VOID_ABBREV)
3931 auto Abbv = std::make_shared<BitCodeAbbrev>();
3935 FUNCTION_INST_RET_VAL_ABBREV)
3939 auto Abbv = std::make_shared<BitCodeAbbrev>();
3942 FUNCTION_INST_UNREACHABLE_ABBREV)
3946 auto Abbv = std::make_shared<BitCodeAbbrev>();
3954 FUNCTION_INST_GEP_ABBREV)
3958 auto Abbv = std::make_shared<BitCodeAbbrev>();
3965 FUNCTION_DEBUG_RECORD_VALUE_ABBREV)
3973void IndexBitcodeWriter::writeModStrings() {
3979 auto Abbv = std::make_shared<BitCodeAbbrev>();
3984 unsigned Abbrev8Bit = Stream.
EmitAbbrev(std::move(Abbv));
3987 Abbv = std::make_shared<BitCodeAbbrev>();
3992 unsigned Abbrev7Bit = Stream.
EmitAbbrev(std::move(Abbv));
3995 Abbv = std::make_shared<BitCodeAbbrev>();
4000 unsigned Abbrev6Bit = Stream.
EmitAbbrev(std::move(Abbv));
4003 Abbv = std::make_shared<BitCodeAbbrev>();
4010 unsigned AbbrevHash = Stream.
EmitAbbrev(std::move(Abbv));
4015 const auto &Hash = MPSE.
getValue();
4017 unsigned AbbrevToUse = Abbrev8Bit;
4019 AbbrevToUse = Abbrev6Bit;
4021 AbbrevToUse = Abbrev7Bit;
4023 auto ModuleId = ModuleIdMap.
size();
4024 ModuleIdMap[
Key] = ModuleId;
4033 Vals.
assign(Hash.begin(), Hash.end());
4045template <
typename Fn>
4049 if (!FS->type_tests().empty())
4054 auto WriteVFuncIdVec = [&](
uint64_t Ty,
4059 for (
auto &VF : VFs) {
4060 Record.push_back(VF.GUID);
4061 Record.push_back(VF.Offset);
4067 FS->type_test_assume_vcalls());
4069 FS->type_checked_load_vcalls());
4071 auto WriteConstVCallVec = [&](
uint64_t Ty,
4073 for (
auto &VC : VCs) {
4075 Record.push_back(VC.VFunc.GUID);
4076 Record.push_back(VC.VFunc.Offset);
4083 FS->type_test_assume_const_vcalls());
4085 FS->type_checked_load_const_vcalls());
4095 if (!FS->paramAccesses().empty()) {
4097 for (
auto &Arg : FS->paramAccesses()) {
4098 size_t UndoSize =
Record.size();
4099 Record.push_back(Arg.ParamNo);
4100 WriteRange(Arg.Use);
4101 Record.push_back(Arg.Calls.size());
4102 for (
auto &Call : Arg.Calls) {
4103 Record.push_back(Call.ParamNo);
4104 std::optional<unsigned> ValueID = GetValueID(Call.Callee);
4111 Record.push_back(*ValueID);
4112 WriteRange(Call.Offsets);
4123 std::set<GlobalValue::GUID> &ReferencedTypeIds) {
4124 if (!FS->type_tests().empty())
4125 for (
auto &TT : FS->type_tests())
4126 ReferencedTypeIds.insert(TT);
4128 auto GetReferencedTypesFromVFuncIdVec =
4130 for (
auto &VF : VFs)
4131 ReferencedTypeIds.insert(VF.GUID);
4134 GetReferencedTypesFromVFuncIdVec(FS->type_test_assume_vcalls());
4135 GetReferencedTypesFromVFuncIdVec(FS->type_checked_load_vcalls());
4137 auto GetReferencedTypesFromConstVCallVec =
4139 for (
auto &VC : VCs)
4140 ReferencedTypeIds.insert(VC.VFunc.GUID);
4143 GetReferencedTypesFromConstVCallVec(FS->type_test_assume_const_vcalls());
4144 GetReferencedTypesFromConstVCallVec(FS->type_checked_load_const_vcalls());
4180 NameVals.
push_back(Summary.TTRes.TheKind);
4181 NameVals.
push_back(Summary.TTRes.SizeM1BitWidth);
4182 NameVals.
push_back(Summary.TTRes.AlignLog2);
4183 NameVals.
push_back(Summary.TTRes.SizeM1);
4184 NameVals.
push_back(Summary.TTRes.BitMask);
4185 NameVals.
push_back(Summary.TTRes.InlineBits);
4187 for (
auto &W : Summary.WPDRes)
4199 for (
auto &
P : Summary) {
4215 static_assert(std::is_same_v<LinearFrameId, unsigned>);
4216 for (
auto &AI : FS->allocs()) {
4217 for (
auto &MIB : AI.MIBs) {
4219 StackIdIndices.
reserve(MIB.StackIdIndices.size());
4220 for (
auto Id : MIB.StackIdIndices)
4221 StackIdIndices.
push_back(GetStackIndex(Id));
4223 CallStacks.insert({CallStacks.size(), StackIdIndices});
4236 assert(!CallStacks.empty());
4242 Builder.
build(std::move(CallStacks),
nullptr,
4251 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
bool PerModule,
4252 std::function<
unsigned(
const ValueInfo &VI)> GetValueID,
4253 std::function<
unsigned(
unsigned)> GetStackIndex,
4254 bool WriteContextSizeInfoIndex,
4259 for (
auto &CI : FS->callsites()) {
4263 assert(!PerModule || (CI.Clones.size() == 1 && CI.Clones[0] == 0));
4264 Record.push_back(GetValueID(CI.Callee));
4266 Record.push_back(CI.StackIdIndices.size());
4267 Record.push_back(CI.Clones.size());
4269 for (
auto Id : CI.StackIdIndices)
4270 Record.push_back(GetStackIndex(Id));
4272 for (
auto V : CI.Clones)
4280 for (
auto &AI : FS->allocs()) {
4284 assert(!PerModule || (AI.Versions.size() == 1 && AI.Versions[0] == 0));
4285 Record.push_back(AI.MIBs.size());
4287 Record.push_back(AI.Versions.size());
4288 for (
auto &MIB : AI.MIBs) {
4291 assert(CallStackCount <= CallStackPos.
size());
4292 Record.push_back(CallStackPos[CallStackCount++]);
4295 for (
auto V : AI.Versions)
4298 assert(AI.ContextSizeInfos.empty() ||
4299 AI.ContextSizeInfos.size() == AI.MIBs.size());
4301 if (WriteContextSizeInfoIndex && !AI.ContextSizeInfos.empty()) {
4309 ContextIds.
reserve(AI.ContextSizeInfos.size() * 2);
4310 for (
auto &Infos : AI.ContextSizeInfos) {
4311 Record.push_back(Infos.size());
4312 for (
auto [FullStackId, TotalSize] : Infos) {
4319 Record.push_back(TotalSize);
4334void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
4336 unsigned ValueID,
unsigned FSCallsRelBFAbbrev,
4337 unsigned FSCallsProfileAbbrev,
unsigned CallsiteAbbrev,
4338 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
const Function &
F,
4346 Stream, FS, [&](
const ValueInfo &VI) -> std::optional<unsigned> {
4351 Stream, FS, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,
4353 [&](
const ValueInfo &VI) {
return getValueId(VI); },
4354 [&](
unsigned I) {
return I; },
4355 true, CallStackPos, CallStackCount);
4357 auto SpecialRefCnts =
FS->specialRefCounts();
4362 NameVals.
push_back(SpecialRefCnts.first);
4363 NameVals.
push_back(SpecialRefCnts.second);
4365 for (
auto &RI :
FS->refs())
4368 const bool UseRelBFRecord =
4371 for (
auto &ECI :
FS->calls()) {
4372 NameVals.
push_back(getValueId(ECI.first));
4380 (UseRelBFRecord ? FSCallsRelBFAbbrev : FSCallsProfileAbbrev);
4391void ModuleBitcodeWriterBase::writeModuleLevelReferences(
4393 unsigned FSModRefsAbbrev,
unsigned FSModVTableRefsAbbrev) {
4394 auto VI =
Index->getValueInfo(
V.getGUID());
4395 if (!VI ||
VI.getSummaryList().empty()) {
4401 auto *
Summary =
VI.getSummaryList()[0].get();
4407 auto VTableFuncs =
VS->vTableFuncs();
4408 if (!VTableFuncs.empty())
4411 unsigned SizeBeforeRefs = NameVals.
size();
4412 for (
auto &RI :
VS->refs())
4418 if (VTableFuncs.empty())
4423 for (
auto &
P : VTableFuncs) {
4429 FSModVTableRefsAbbrev);
4436void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
4439 bool IsThinLTO =
true;
4441 mdconst::extract_or_null<ConstantInt>(
M.getModuleFlag(
"ThinLTO")))
4442 IsThinLTO = MD->getZExtValue();
4454 if (
Index->enableSplitLTOUnit())
4456 if (
Index->hasUnifiedLTO())
4466 auto Abbv = std::make_shared<BitCodeAbbrev>();
4472 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4474 for (
const auto &GVI : valueIds()) {
4477 static_cast<uint32_t>(GVI.first >> 32),
4482 if (!
Index->stackIds().empty()) {
4483 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4490 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4493 for (
auto Id :
Index->stackIds()) {
4501 auto ContextIdAbbv = std::make_shared<BitCodeAbbrev>();
4507 unsigned ContextIdAbbvId = Stream.
EmitAbbrev(std::move(ContextIdAbbv));
4510 Abbv = std::make_shared<BitCodeAbbrev>();
4522 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4525 Abbv = std::make_shared<BitCodeAbbrev>();
4537 unsigned FSCallsRelBFAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4540 Abbv = std::make_shared<BitCodeAbbrev>();
4546 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4549 Abbv = std::make_shared<BitCodeAbbrev>();
4557 unsigned FSModVTableRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4560 Abbv = std::make_shared<BitCodeAbbrev>();
4565 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4568 Abbv = std::make_shared<BitCodeAbbrev>();
4575 unsigned TypeIdCompatibleVtableAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4577 Abbv = std::make_shared<BitCodeAbbrev>();
4583 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4585 Abbv = std::make_shared<BitCodeAbbrev>();
4592 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4594 Abbv = std::make_shared<BitCodeAbbrev>();
4599 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4614 if (!VI ||
VI.getSummaryList().empty()) {
4620 auto *
Summary =
VI.getSummaryList()[0].get();
4623 FS, [](
unsigned I) {
return I; }, CallStacks);
4628 if (!CallStacks.
empty()) {
4646 if (!VI ||
VI.getSummaryList().empty()) {
4652 auto *
Summary =
VI.getSummaryList()[0].get();
4653 writePerModuleFunctionSummaryRecord(
4654 NameVals, Summary, VE.
getValueID(&
F), FSCallsRelBFAbbrev,
4655 FSCallsProfileAbbrev, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,
F,
4656 CallStackPos, CallStackCount);
4662 writeModuleLevelReferences(
G, NameVals, FSModRefsAbbrev,
4663 FSModVTableRefsAbbrev);
4666 auto *Aliasee =
A.getAliaseeObject();
4669 if (!Aliasee->hasName() || isa<GlobalIFunc>(Aliasee))
4682 for (
auto &S :
Index->typeIdCompatibleVtableMap()) {
4686 TypeIdCompatibleVtableAbbrev);
4690 if (
Index->getBlockCount())
4698void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
4707 auto Abbv = std::make_shared<BitCodeAbbrev>();
4713 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4715 for (
const auto &GVI : valueIds()) {
4718 static_cast<uint32_t>(GVI.first >> 32),
4725 if (!StackIds.empty()) {
4726 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4733 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4735 Vals.
reserve(StackIds.size() * 2);
4736 for (
auto Id : StackIds) {
4744 Abbv = std::make_shared<BitCodeAbbrev>();
4758 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4761 Abbv = std::make_shared<BitCodeAbbrev>();
4768 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4771 Abbv = std::make_shared<BitCodeAbbrev>();
4777 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4779 Abbv = std::make_shared<BitCodeAbbrev>();
4787 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4789 Abbv = std::make_shared<BitCodeAbbrev>();
4798 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4800 Abbv = std::make_shared<BitCodeAbbrev>();
4805 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4808 if (DecSummaries ==
nullptr)
4810 return DecSummaries->count(GVS);
4824 std::set<GlobalValue::GUID> ReferencedTypeIds;
4838 NameVals.
push_back(S.getOriginalName());
4849 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
4852 auto *
FS = dyn_cast<FunctionSummary>(S);
4863 return StackIdIndicesToIndex[
I];
4870 if (!CallStacks.
empty()) {
4879 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
4882 DefOrUseGUIDs.
insert(
I.first);
4884 DefOrUseGUIDs.
insert(
VI.getGUID());
4886 auto ValueId = getValueId(
I.first);
4888 SummaryToValueIdMap[S] = *ValueId;
4896 if (
auto *AS = dyn_cast<AliasSummary>(S)) {
4903 if (
auto *VS = dyn_cast<GlobalVarSummary>(S)) {
4906 NameVals.
push_back(ModuleIdMap[
VS->modulePath()]);
4910 for (
auto &RI :
VS->refs()) {
4911 auto RefValueId = getValueId(RI.getGUID());
4921 MaybeEmitOriginalName(*S);
4925 auto GetValueId = [&](
const ValueInfo &
VI) -> std::optional<unsigned> {
4927 return std::nullopt;
4928 return getValueId(
VI.getGUID());
4931 auto *
FS = cast<FunctionSummary>(S);
4936 Stream, FS, CallsiteAbbrev, AllocAbbrev, 0,
4940 std::optional<unsigned> ValueID = GetValueId(VI);
4955 return StackIdIndicesToIndex[
I];
4957 false, CallStackPos, CallStackCount);
4961 NameVals.
push_back(ModuleIdMap[
FS->modulePath()]);
4974 unsigned Count = 0, RORefCnt = 0, WORefCnt = 0;
4975 for (
auto &RI :
FS->refs()) {
4976 auto RefValueId = getValueId(RI.getGUID());
4980 if (RI.isReadOnly())
4982 else if (RI.isWriteOnly())
4986 NameVals[6] = Count;
4987 NameVals[7] = RORefCnt;
4988 NameVals[8] = WORefCnt;
4990 for (
auto &EI :
FS->calls()) {
4993 std::optional<unsigned> CallValueId = GetValueId(EI.first);
5002 FSCallsProfileAbbrev);
5004 MaybeEmitOriginalName(*S);
5007 for (
auto *AS : Aliases) {
5008 auto AliasValueId = SummaryToValueIdMap[AS];
5015 auto AliaseeValueId = SummaryToValueIdMap[&AS->
getAliasee()];
5022 MaybeEmitOriginalName(*AS);
5024 if (
auto *FS = dyn_cast<FunctionSummary>(&AS->
getAliasee()))
5028 if (!
Index.cfiFunctionDefs().empty()) {
5029 for (
auto &S :
Index.cfiFunctionDefs()) {
5036 if (!NameVals.
empty()) {
5042 if (!
Index.cfiFunctionDecls().empty()) {
5043 for (
auto &S :
Index.cfiFunctionDecls()) {
5050 if (!NameVals.
empty()) {
5058 for (
auto &
T : ReferencedTypeIds) {
5059 auto TidIter =
Index.typeIds().equal_range(
T);
5060 for (
const auto &[GUID, TypeIdPair] :
make_range(TidIter)) {
5068 if (
Index.getBlockCount())
5081 auto Abbv = std::make_shared<BitCodeAbbrev>();
5085 auto StringAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5087 "LLVM" LLVM_VERSION_STRING, StringAbbrev);
5090 Abbv = std::make_shared<BitCodeAbbrev>();
5093 auto EpochAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5099void ModuleBitcodeWriter::writeModuleHash(
StringRef View) {
5106 std::array<uint8_t, 20> Hash = Hasher.result();
5107 for (
int Pos = 0; Pos < 20; Pos += 4) {
5120void ModuleBitcodeWriter::write() {
5128 writeModuleVersion();
5137 writeAttributeGroupTable();
5140 writeAttributeTable();
5149 writeModuleConstants();
5152 writeModuleMetadataKinds();
5155 writeModuleMetadata();
5159 writeUseListBlock(
nullptr);
5161 writeOperandBundleTags();
5162 writeSyncScopeNames();
5167 if (!
F.isDeclaration())
5168 writeFunction(
F, FunctionToBitcodeIndex);
5173 writePerModuleGlobalValueSummary();
5175 writeGlobalValueSymbolTable(FunctionToBitcodeIndex);
5203 unsigned CPUType = ~0U;
5210 DARWIN_CPU_ARCH_ABI64 = 0x01000000,
5211 DARWIN_CPU_TYPE_X86 = 7,
5212 DARWIN_CPU_TYPE_ARM = 12,
5213 DARWIN_CPU_TYPE_POWERPC = 18
5218 CPUType = DARWIN_CPU_TYPE_X86 | DARWIN_CPU_ARCH_ABI64;
5220 CPUType = DARWIN_CPU_TYPE_X86;
5222 CPUType = DARWIN_CPU_TYPE_POWERPC;
5224 CPUType = DARWIN_CPU_TYPE_POWERPC | DARWIN_CPU_ARCH_ABI64;
5226 CPUType = DARWIN_CPU_TYPE_ARM;
5230 "Expected header size to be reserved");
5235 unsigned Position = 0;
5243 while (Buffer.
size() & 15)
5250 Stream.
Emit((
unsigned)
'B', 8);
5251 Stream.
Emit((
unsigned)
'C', 8);
5252 Stream.
Emit(0x0, 4);
5253 Stream.
Emit(0xC, 4);
5254 Stream.
Emit(0xE, 4);
5255 Stream.
Emit(0xD, 4);
5273 auto Abbv = std::make_shared<BitCodeAbbrev>();
5276 auto AbbrevNo = Stream->
EmitAbbrev(std::move(Abbv));
5284 assert(!WroteStrtab && !WroteSymtab);
5290 if (M->getModuleInlineAsm().empty())
5294 const Triple TT(M->getTargetTriple());
5296 if (!
T || !
T->hasMCAsmParser())
5318 std::vector<char> Strtab;
5320 Strtab.resize(StrtabBuilder.
getSize());
5324 {Strtab.data(), Strtab.size()});
5335 bool ShouldPreserveUseListOrder,
5344 assert(M.isMaterialized());
5345 Mods.push_back(
const_cast<Module *
>(&M));
5347 ModuleBitcodeWriter ModuleWriter(M, StrtabBuilder, *Stream,
5348 ShouldPreserveUseListOrder, Index,
5349 GenerateHash, ModHash);
5350 ModuleWriter.write();
5357 IndexBitcodeWriter IndexWriter(*Stream, StrtabBuilder, *Index, DecSummaries,
5358 ModuleToSummariesForIndex);
5359 IndexWriter.write();
5364 bool ShouldPreserveUseListOrder,
5368 Writer.writeModule(M, ShouldPreserveUseListOrder, Index, GenerateHash,
5370 Writer.writeSymtab();
5371 Writer.writeStrtab();
5373 Triple TT(M.getTargetTriple());
5374 if (TT.isOSDarwin() || TT.isOSBinFormatMachO()) {
5392void IndexBitcodeWriter::write() {
5395 writeModuleVersion();
5401 writeCombinedGlobalValueSummary();
5418 Writer.
writeIndex(&Index, ModuleToSummariesForIndex, DecSummaries);
5427class ThinLinkBitcodeWriter :
public ModuleBitcodeWriterBase {
5437 : ModuleBitcodeWriterBase(M, StrtabBuilder, Stream,
5439 ModHash(&ModHash) {}
5444 void writeSimplifiedModuleInfo();
5454void ThinLinkBitcodeWriter::writeSimplifiedModuleInfo() {
5466 auto Abbv = std::make_shared<BitCodeAbbrev>();
5469 Abbv->Add(AbbrevOpToUse);
5470 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5472 for (
const auto P :
M.getSourceFileName())
5536void ThinLinkBitcodeWriter::write() {
5539 writeModuleVersion();
5541 writeSimplifiedModuleInfo();
5543 writePerModuleGlobalValueSummary();
5560 assert(M.isMaterialized());
5561 Mods.push_back(
const_cast<Module *
>(&M));
5563 ThinLinkBitcodeWriter ThinLinkWriter(M, StrtabBuilder, *Stream, Index,
5565 ThinLinkWriter.write();
5586 switch (
T.getObjectFormat()) {
5588 return "__LLVM,__bitcode";
5613 switch (
T.getObjectFormat()) {
5615 return "__LLVM,__cmdline";
5641 const std::vector<uint8_t> &CmdArgs) {
5646 Type *UsedElementType = Used ? Used->getValueType()->getArrayElementType()
5648 for (
auto *GV : UsedGlobals) {
5649 if (GV->getName() !=
"llvm.embedded.module" &&
5650 GV->getName() !=
"llvm.cmdline")
5655 Used->eraseFromParent();
5660 Triple T(M.getTargetTriple());
5689 M.getGlobalVariable(
"llvm.embedded.module",
true)) {
5690 assert(Old->hasZeroLiveUses() &&
5691 "llvm.embedded.module can only be used once in llvm.compiler.used");
5693 Old->eraseFromParent();
5695 GV->
setName(
"llvm.embedded.module");
5713 assert(Old->hasZeroLiveUses() &&
5714 "llvm.cmdline can only be used once in llvm.compiler.used");
5716 Old->eraseFromParent();
5722 if (UsedArray.
empty())
5730 NewUsed->setSection(
"llvm.metadata");
This file defines the StringMap class.
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static void writeDIMacro(raw_ostream &Out, const DIMacro *N, AsmWriterContext &WriterCtx)
static void writeDIGlobalVariableExpression(raw_ostream &Out, const DIGlobalVariableExpression *N, AsmWriterContext &WriterCtx)
static void writeDICompositeType(raw_ostream &Out, const DICompositeType *N, AsmWriterContext &WriterCtx)
static void writeDIStringType(raw_ostream &Out, const DIStringType *N, AsmWriterContext &WriterCtx)
static void writeDIGlobalVariable(raw_ostream &Out, const DIGlobalVariable *N, AsmWriterContext &WriterCtx)
static void writeDIModule(raw_ostream &Out, const DIModule *N, AsmWriterContext &WriterCtx)
static void writeDIFile(raw_ostream &Out, const DIFile *N, AsmWriterContext &)
static void writeDISubroutineType(raw_ostream &Out, const DISubroutineType *N, AsmWriterContext &WriterCtx)
static void writeDILabel(raw_ostream &Out, const DILabel *N, AsmWriterContext &WriterCtx)
static void writeDIDerivedType(raw_ostream &Out, const DIDerivedType *N, AsmWriterContext &WriterCtx)
static void writeDIImportedEntity(raw_ostream &Out, const DIImportedEntity *N, AsmWriterContext &WriterCtx)
static void writeDIObjCProperty(raw_ostream &Out, const DIObjCProperty *N, AsmWriterContext &WriterCtx)
static void writeDISubprogram(raw_ostream &Out, const DISubprogram *N, AsmWriterContext &WriterCtx)
static void writeDILocation(raw_ostream &Out, const DILocation *DL, AsmWriterContext &WriterCtx)
static void writeDINamespace(raw_ostream &Out, const DINamespace *N, AsmWriterContext &WriterCtx)
static void writeDICommonBlock(raw_ostream &Out, const DICommonBlock *N, AsmWriterContext &WriterCtx)
static void writeDIBasicType(raw_ostream &Out, const DIBasicType *N, AsmWriterContext &)
static void writeGenericDINode(raw_ostream &Out, const GenericDINode *N, AsmWriterContext &WriterCtx)
static void writeDILocalVariable(raw_ostream &Out, const DILocalVariable *N, AsmWriterContext &WriterCtx)
static void writeDITemplateTypeParameter(raw_ostream &Out, const DITemplateTypeParameter *N, AsmWriterContext &WriterCtx)
static void writeDICompileUnit(raw_ostream &Out, const DICompileUnit *N, AsmWriterContext &WriterCtx)
static void writeDIGenericSubrange(raw_ostream &Out, const DIGenericSubrange *N, AsmWriterContext &WriterCtx)
static void writeDISubrange(raw_ostream &Out, const DISubrange *N, AsmWriterContext &WriterCtx)
static void writeDILexicalBlockFile(raw_ostream &Out, const DILexicalBlockFile *N, AsmWriterContext &WriterCtx)
static void writeDIEnumerator(raw_ostream &Out, const DIEnumerator *N, AsmWriterContext &)
static void writeMDTuple(raw_ostream &Out, const MDTuple *Node, AsmWriterContext &WriterCtx)
static void writeDIExpression(raw_ostream &Out, const DIExpression *N, AsmWriterContext &WriterCtx)
static void writeDIAssignID(raw_ostream &Out, const DIAssignID *DL, AsmWriterContext &WriterCtx)
static void writeDILexicalBlock(raw_ostream &Out, const DILexicalBlock *N, AsmWriterContext &WriterCtx)
static void writeDIArgList(raw_ostream &Out, const DIArgList *N, AsmWriterContext &WriterCtx, bool FromValue=false)
static void writeDITemplateValueParameter(raw_ostream &Out, const DITemplateValueParameter *N, AsmWriterContext &WriterCtx)
static void writeDIMacroFile(raw_ostream &Out, const DIMacroFile *N, AsmWriterContext &WriterCtx)
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static void writeFunctionHeapProfileRecords(BitstreamWriter &Stream, FunctionSummary *FS, unsigned CallsiteAbbrev, unsigned AllocAbbrev, unsigned ContextIdAbbvId, bool PerModule, std::function< unsigned(const ValueInfo &VI)> GetValueID, std::function< unsigned(unsigned)> GetStackIndex, bool WriteContextSizeInfoIndex, DenseMap< CallStackId, LinearCallStackId > &CallStackPos, CallStackId &CallStackCount)
static unsigned serializeSanitizerMetadata(const GlobalValue::SanitizerMetadata &Meta)
static void writeTypeIdCompatibleVtableSummaryRecord(SmallVector< uint64_t, 64 > &NameVals, StringTableBuilder &StrtabBuilder, StringRef Id, const TypeIdCompatibleVtableInfo &Summary, ValueEnumerator &VE)
static void getReferencedTypeIds(FunctionSummary *FS, std::set< GlobalValue::GUID > &ReferencedTypeIds)
Collect type IDs from type tests used by function.
static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind)
static void collectMemProfCallStacks(FunctionSummary *FS, std::function< LinearFrameId(unsigned)> GetStackIndex, MapVector< CallStackId, llvm::SmallVector< LinearFrameId > > &CallStacks)
static unsigned getEncodedUnaryOpcode(unsigned Opcode)
static void emitSignedInt64(SmallVectorImpl< uint64_t > &Vals, uint64_t V)
static unsigned getEncodedVisibility(const GlobalValue &GV)
static uint64_t getOptimizationFlags(const Value *V)
static unsigned getEncodedLinkage(const GlobalValue::LinkageTypes Linkage)
static unsigned getEncodedRMWOperation(AtomicRMWInst::BinOp Op)
static unsigned getEncodedThreadLocalMode(const GlobalValue &GV)
static DenseMap< CallStackId, LinearCallStackId > writeMemoryProfileRadixTree(MapVector< CallStackId, llvm::SmallVector< LinearFrameId > > &&CallStacks, BitstreamWriter &Stream, unsigned RadixAbbrev)
static void writeIdentificationBlock(BitstreamWriter &Stream)
Create the "IDENTIFICATION_BLOCK_ID" containing a single string with the current llvm version,...
static unsigned getEncodedCastOpcode(unsigned Opcode)
static cl::opt< bool > WriteRelBFToSummary("write-relbf-to-summary", cl::Hidden, cl::init(false), cl::desc("Write relative block frequency to function summary "))
static cl::opt< uint32_t > FlushThreshold("bitcode-flush-threshold", cl::Hidden, cl::init(512), cl::desc("The threshold (unit M) for flushing LLVM bitcode."))
static unsigned getEncodedOrdering(AtomicOrdering Ordering)
static unsigned getEncodedUnnamedAddr(const GlobalValue &GV)
bool WriteNewDbgInfoFormatToBitcode
static unsigned getEncodedComdatSelectionKind(const Comdat &C)
static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags, bool ImportAsDecl=false)
static void emitDarwinBCHeaderAndTrailer(SmallVectorImpl< char > &Buffer, const Triple &TT)
If generating a bc file on darwin, we have to emit a header and trailer to make it compatible with th...
static void writeBitcodeHeader(BitstreamWriter &Stream)
Helper to write the header common to all bitcode files.
llvm::cl::opt< bool > UseNewDbgInfoFormat
static uint64_t getEncodedRelBFCallEdgeInfo(const CalleeInfo &CI)
static void writeWholeProgramDevirtResolutionByArg(SmallVector< uint64_t, 64 > &NameVals, const std::vector< uint64_t > &args, const WholeProgramDevirtResolution::ByArg &ByArg)
static void emitConstantRange(SmallVectorImpl< uint64_t > &Record, const ConstantRange &CR, bool EmitBitWidth)
static StringEncoding getStringEncoding(StringRef Str)
Determine the encoding to use for the given string name and length.
static uint64_t getEncodedGVarFlags(GlobalVarSummary::GVarFlags Flags)
static const char * getSectionNameForCommandline(const Triple &T)
static cl::opt< unsigned > IndexThreshold("bitcode-mdindex-threshold", cl::Hidden, cl::init(25), cl::desc("Number of metadatas above which we emit an index " "to enable lazy-loading"))
static void writeTypeIdSummaryRecord(SmallVector< uint64_t, 64 > &NameVals, StringTableBuilder &StrtabBuilder, StringRef Id, const TypeIdSummary &Summary)
static void writeFunctionTypeMetadataRecords(BitstreamWriter &Stream, FunctionSummary *FS, Fn GetValueID)
Write the function type metadata related records that need to appear before a function summary entry ...
static uint64_t getEncodedHotnessCallEdgeInfo(const CalleeInfo &CI)
static void emitWideAPInt(SmallVectorImpl< uint64_t > &Vals, const APInt &A)
static void writeStringRecord(BitstreamWriter &Stream, unsigned Code, StringRef Str, unsigned AbbrevToUse)
static void writeWholeProgramDevirtResolution(SmallVector< uint64_t, 64 > &NameVals, StringTableBuilder &StrtabBuilder, uint64_t Id, const WholeProgramDevirtResolution &Wpd)
static unsigned getEncodedDLLStorageClass(const GlobalValue &GV)
static void writeInt32ToBuffer(uint32_t Value, SmallVectorImpl< char > &Buffer, uint32_t &Position)
static const char * getSectionNameForBitcode(const Triple &T)
static unsigned getEncodedBinaryOpcode(unsigned Opcode)
static uint64_t getEncodedFFlags(FunctionSummary::FFlags Flags)
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...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
static MaybeAlign getAlign(Value *Ptr)
Module.h This file contains the declarations for the Module class.
static cl::opt< LTOBitcodeEmbedding > EmbedBitcode("lto-embed-bitcode", cl::init(LTOBitcodeEmbedding::DoNotEmbed), cl::values(clEnumValN(LTOBitcodeEmbedding::DoNotEmbed, "none", "Do not embed"), clEnumValN(LTOBitcodeEmbedding::EmbedOptimized, "optimized", "Embed after all optimization passes"), clEnumValN(LTOBitcodeEmbedding::EmbedPostMergePreOptimized, "post-merge-pre-opt", "Embed post merge, but before optimizations")), cl::desc("Embed LLVM bitcode in object files produced by LTO"))
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
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.
unsigned getNumWords() const
Get the number of words.
unsigned getActiveWords() const
Compute the number of active words in the value of this APInt.
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.
Alias summary information.
const GlobalValueSummary & getAliasee() const
an instruction to allocate memory on the stack
bool isSwiftError() const
Return true if this alloca is used as a swifterror argument to a call.
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.
unsigned getAddressSpace() const
Return the address space for the allocation.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
Class to represent array types.
static ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ UIncWrap
Increment one up to a maximum value.
@ 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.
@ UDecWrap
Decrement one until a minimum value or zero.
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.
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.
void writeThinLinkBitcode(const Module &M, const ModuleSummaryIndex &Index, const ModuleHash &ModHash)
Write the specified thin link bitcode file (i.e., the minimized bitcode file) to the buffer specified...
void writeIndex(const ModuleSummaryIndex *Index, const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex, const GVSummaryPtrSet *DecSummaries)
void copyStrtab(StringRef Strtab)
Copy the string table for another module into this bitcode file.
void writeStrtab()
Write the bitcode file's string table.
void writeSymtab()
Attempt to write a symbol table to the bitcode file.
void writeModule(const Module &M, bool ShouldPreserveUseListOrder=false, const ModuleSummaryIndex *Index=nullptr, bool GenerateHash=false, ModuleHash *ModHash=nullptr)
Write the specified module to the buffer specified at construction time.
BitcodeWriter(SmallVectorImpl< char > &Buffer)
Create a BitcodeWriter that writes to Buffer.
unsigned EmitAbbrev(std::shared_ptr< BitCodeAbbrev > Abbv)
Emits the abbreviation Abbv to the stream.
void markAndBlockFlushing()
For scenarios where the user wants to access a section of the stream to (for example) compute some ch...
StringRef getMarkedBufferAndResumeFlushing()
resumes flushing, but does not flush, and returns the section in the internal buffer starting from th...
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 BackpatchWord(uint64_t BitNo, unsigned Val)
void BackpatchWord64(uint64_t BitNo, uint64_t Val)
void EnterSubblock(unsigned BlockID, unsigned CodeLen)
uint64_t GetCurrentBitNo() const
Retrieve the current position in the stream, in bits.
void EmitRecordWithAbbrev(unsigned Abbrev, const Container &Vals)
EmitRecordWithAbbrev - Emit a record with the specified abbreviation.
The address of a basic block.
static BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
Conditional or Unconditional Branch instruction.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
OperandBundleUse getOperandBundleAt(unsigned Index) const
Return the operand bundle at a specific index.
unsigned getNumOperandBundles() const
Return the number of operand bundles associated with this User.
CallingConv::ID getCallingConv() const
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
bool hasOperandBundles() const
Return true if this User has any operand bundles.
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
BasicBlock * getIndirectDest(unsigned i) const
BasicBlock * getDefaultDest() const
unsigned getNumIndirectDests() const
Return the number of callbr indirect dest labels.
This class represents a function call, abstracting a target machine's calling convention.
bool isNoTailCall() const
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.
static Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
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.
static Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
ConstantFP - Floating Point Values [float, double].
This is the shared class of boolean and integer constants.
This class represents a range of values.
const APInt & getLower() const
Return the lower value for this range.
const APInt & getUpper() const
Return the upper value for this range.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
ConstantRange sextOrTrunc(uint32_t BitWidth) const
Make this range have the bit width given by BitWidth.
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.
Records a position in IR for a source label (DILabel).
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
DIAssignID * getAssignID() const
DIExpression * getExpression() const
DILocalVariable * getVariable() const
Metadata * getRawLocation() const
Returns the metadata operand for the first location description.
bool isDbgDeclare() const
Metadata * getRawAddress() const
DIExpression * getAddressExpression() const
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Implements a dense probed hash-table based set.
Lightweight error class with error context and mandatory checking.
Function summary information to aid decisions and implementation of importing.
ForceSummaryHotnessType
Types for -force-summary-edges-cold debugging option.
Generic tagged DWARF-like metadata node.
void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalObject.
void setSection(StringRef S)
Change the section for this global.
Function and variable summary information to aid decisions and implementation of importing.
GVFlags flags() const
Get the flags for this GlobalValue (see struct GVFlags).
StringRef modulePath() const
Get the path to the module containing this function.
ArrayRef< ValueInfo > refs() const
Return the list of values referenced by this global value definition.
VisibilityTypes getVisibility() const
static bool isLocalLinkage(LinkageTypes Linkage)
LinkageTypes getLinkage() const
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
ThreadLocalMode getThreadLocalMode() const
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
UnnamedAddr getUnnamedAddr() const
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
Global variable summary information to aid decisions and implementation of importing.
This instruction inserts a struct field of array element value into an aggregate value.
idx_iterator idx_end() const
idx_iterator idx_begin() const
This is an important class for using LLVM in a threaded context.
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.
Tracking metadata reference owned by Metadata.
This class implements a map that also provides access to all stored values in a deterministic order.
size_t getBufferSize() const
const char * getBufferStart() const
const char * getBufferEnd() const
Class to hold module path string table and global value map, and encapsulate methods for operating on...
static constexpr uint64_t BitcodeSummaryVersion
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.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
A class that wrap the SHA1 algorithm.
size_type size() const
Determine the number of elements in the SetVector.
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void append(StringRef RHS)
Append from a StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
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)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
const ValueTy & getValue() const
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.
void finalizeInOrder()
Finalize the string table without reording it.
void write(raw_ostream &OS) const
size_t add(CachedHashStringRef S)
Add a string to the builder.
Class to represent struct types.
Class to represent target extensions types, which are generally unintrospectable from target-independ...
Target - Wrapper for Target specific information.
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.
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat 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.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
unsigned getTypeID(Type *T) const
unsigned getMetadataID(const Metadata *MD) const
UseListOrderStack UseListOrders
std::vector< std::pair< const Value *, unsigned > > ValueList
ArrayRef< const Metadata * > getNonMDStrings() const
Get the non-MDString metadata for this block.
unsigned getInstructionID(const Instruction *I) const
unsigned getAttributeListID(AttributeList PAL) const
void incorporateFunction(const Function &F)
incorporateFunction/purgeFunction - If you'd like to deal with a function, use these two methods to g...
void getFunctionConstantRange(unsigned &Start, unsigned &End) const
getFunctionConstantRange - Return the range of values that corresponds to function-local constants.
unsigned getAttributeGroupID(IndexAndAttrSet Group) const
bool hasMDs() const
Check whether the current block has any metadata to emit.
unsigned getComdatID(const Comdat *C) const
uint64_t computeBitsRequiredForTypeIndices() const
unsigned getValueID(const Value *V) const
unsigned getMetadataOrNullID(const Metadata *MD) const
const std::vector< IndexAndAttrSet > & getAttributeGroups() const
const ValueList & getValues() const
unsigned getGlobalBasicBlockID(const BasicBlock *BB) const
getGlobalBasicBlockID - This returns the function-specific ID for the specified basic block.
void setInstructionID(const Instruction *I)
const std::vector< const BasicBlock * > & getBasicBlocks() const
const std::vector< AttributeList > & getAttributeLists() const
bool shouldPreserveUseListOrder() const
const ComdatSetType & getComdats() const
std::vector< Type * > TypeList
ArrayRef< const Metadata * > getMDStrings() const
Get the MDString metadata for this block.
std::pair< unsigned, AttributeSet > IndexAndAttrSet
Attribute groups as encoded in bitcode are almost AttributeSets, but they include the AttributeList i...
const TypeList & getTypes() const
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 setName(const Twine &Name)
Change the name of the value.
LLVMContext & getContext() const
All values hold a context through their type.
void takeName(Value *V)
Transfer the name from V to this value.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
void build(llvm::MapVector< CallStackId, llvm::SmallVector< FrameIdTy > > &&MemProfCallStackData, const llvm::DenseMap< FrameIdTy, LinearFrameId > *MemProfFrameIndexes, llvm::DenseMap< FrameIdTy, FrameStat > &FrameHistogram)
ArrayRef< LinearFrameId > getRadixArray() const
llvm::DenseMap< CallStackId, LinearCallStackId > takeCallStackPos()
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & write(unsigned char C)
A raw_ostream that writes to an std::string.
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)
@ TYPE_CODE_OPAQUE_POINTER
@ METADATA_TEMPLATE_VALUE
@ METADATA_LEXICAL_BLOCK_FILE
@ METADATA_SUBROUTINE_TYPE
@ METADATA_GLOBAL_DECL_ATTACHMENT
@ METADATA_IMPORTED_ENTITY
@ METADATA_GENERIC_SUBRANGE
@ METADATA_COMPOSITE_TYPE
@ METADATA_GLOBAL_VAR_EXPR
@ FS_CONTEXT_RADIX_TREE_ARRAY
@ FS_COMBINED_GLOBALVAR_INIT_REFS
@ FS_TYPE_CHECKED_LOAD_VCALLS
@ FS_COMBINED_ORIGINAL_NAME
@ FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_CONST_VCALL
@ FS_PERMODULE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_VCALLS
@ FS_COMBINED_CALLSITE_INFO
@ FS_PERMODULE_CALLSITE_INFO
@ FS_PERMODULE_ALLOC_INFO
@ FS_TYPE_CHECKED_LOAD_CONST_VCALL
@ IDENTIFICATION_CODE_EPOCH
@ IDENTIFICATION_CODE_STRING
@ CST_CODE_DSO_LOCAL_EQUIVALENT
@ CST_CODE_CE_GEP_WITH_INRANGE
@ 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_FNRETTHUNK_EXTERN
@ ATTR_KIND_NO_DIVERGENCE_SOURCE
@ ATTR_KIND_SANITIZE_ADDRESS
@ ATTR_KIND_NO_IMPLICIT_FLOAT
@ ATTR_KIND_DEAD_ON_UNWIND
@ ATTR_KIND_STACK_ALIGNMENT
@ ATTR_KIND_STACK_PROTECT_REQ
@ ATTR_KIND_NULL_POINTER_IS_VALID
@ ATTR_KIND_SANITIZE_HWADDRESS
@ ATTR_KIND_RETURNS_TWICE
@ ATTR_KIND_SHADOWCALLSTACK
@ ATTR_KIND_OPT_FOR_FUZZING
@ ATTR_KIND_SANITIZE_NUMERICAL_STABILITY
@ ATTR_KIND_ALLOCATED_POINTER
@ ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION
@ ATTR_KIND_CORO_ELIDE_SAFE
@ ATTR_KIND_NON_LAZY_BIND
@ ATTR_KIND_DEREFERENCEABLE
@ ATTR_KIND_OPTIMIZE_NONE
@ ATTR_KIND_HYBRID_PATCHABLE
@ ATTR_KIND_DEREFERENCEABLE_OR_NULL
@ ATTR_KIND_SANITIZE_REALTIME
@ ATTR_KIND_SPECULATIVE_LOAD_HARDENING
@ ATTR_KIND_ALWAYS_INLINE
@ ATTR_KIND_SANITIZE_TYPE
@ ATTR_KIND_PRESPLIT_COROUTINE
@ ATTR_KIND_NO_SANITIZE_COVERAGE
@ ATTR_KIND_SANITIZE_REALTIME_BLOCKING
@ ATTR_KIND_NO_SANITIZE_BOUNDS
@ ATTR_KIND_SANITIZE_MEMTAG
@ ATTR_KIND_CORO_ONLY_DESTROY_WHEN_COMPLETE
@ ATTR_KIND_SANITIZE_THREAD
@ ATTR_KIND_OPTIMIZE_FOR_DEBUGGING
@ SYNC_SCOPE_NAMES_BLOCK_ID
@ PARAMATTR_GROUP_BLOCK_ID
@ IDENTIFICATION_BLOCK_ID
@ GLOBALVAL_SUMMARY_BLOCK_ID
@ FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID
@ OPERAND_BUNDLE_TAGS_BLOCK_ID
@ MODULE_CODE_SOURCE_FILENAME
@ MODULE_CODE_SECTIONNAME
@ FUNC_CODE_INST_CATCHRET
@ FUNC_CODE_INST_LANDINGPAD
@ FUNC_CODE_INST_EXTRACTVAL
@ FUNC_CODE_INST_CATCHPAD
@ FUNC_CODE_INST_CATCHSWITCH
@ FUNC_CODE_INST_CLEANUPRET
@ FUNC_CODE_DEBUG_RECORD_VALUE
@ FUNC_CODE_INST_LOADATOMIC
@ FUNC_CODE_DEBUG_RECORD_ASSIGN
@ FUNC_CODE_INST_STOREATOMIC
@ FUNC_CODE_INST_ATOMICRMW
@ FUNC_CODE_DEBUG_LOC_AGAIN
@ FUNC_CODE_INST_EXTRACTELT
@ FUNC_CODE_INST_INDIRECTBR
@ FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE
@ FUNC_CODE_INST_INSERTVAL
@ FUNC_CODE_DECLAREBLOCKS
@ FUNC_CODE_DEBUG_RECORD_LABEL
@ FUNC_CODE_INST_INSERTELT
@ FUNC_CODE_BLOCKADDR_USERS
@ FUNC_CODE_INST_CLEANUPPAD
@ FUNC_CODE_INST_SHUFFLEVEC
@ FUNC_CODE_INST_UNREACHABLE
@ FUNC_CODE_DEBUG_RECORD_DECLARE
@ FUNC_CODE_OPERAND_BUNDLE
@ FIRST_APPLICATION_ABBREV
@ PARAMATTR_GRP_CODE_ENTRY
initializer< Ty > init(const Ty &Val)
Error build(ArrayRef< Module * > Mods, SmallVector< char, 0 > &Symtab, StringTableBuilder &StrtabBuilder, BumpPtrAllocator &Alloc)
Fills in Symtab and StrtabBuilder with a valid symbol and string table for Mods.
template llvm::DenseMap< LinearFrameId, FrameStat > computeFrameHistogram< LinearFrameId >(llvm::MapVector< CallStackId, llvm::SmallVector< LinearFrameId > > &MemProfCallStackData)
NodeAddr< CodeNode * > Code
void write32le(void *P, uint32_t V)
uint32_t read32be(const void *P)
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
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.
void WriteBitcodeToFile(const Module &M, raw_ostream &Out, bool ShouldPreserveUseListOrder=false, const ModuleSummaryIndex *Index=nullptr, bool GenerateHash=false, ModuleHash *ModHash=nullptr)
Write the specified module to the specified raw output stream.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
void writeThinLinkBitcodeToFile(const Module &M, raw_ostream &Out, const ModuleSummaryIndex &Index, const ModuleHash &ModHash)
Write the specified thin link bitcode file (i.e., the minimized bitcode file) to the given raw output...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
void writeIndexToFile(const ModuleSummaryIndex &Index, raw_ostream &Out, const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex=nullptr, const GVSummaryPtrSet *DecSummaries=nullptr)
Write the specified module summary index to the given raw output stream, where it will be written in ...
void embedBitcodeInModule(Module &M, MemoryBufferRef Buf, bool EmbedBitcode, bool EmbedCmdline, const std::vector< uint8_t > &CmdArgs)
If EmbedBitcode is set, save a copy of the llvm IR as data in the __LLVM,__bitcode section (....
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Error write(MCStreamer &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue)
void sort(IteratorTy Start, IteratorTy End)
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
AtomicOrdering
Atomic ordering for LLVM's memory model.
std::unordered_set< GlobalValueSummary * > GVSummaryPtrSet
A set of global value summary pointers.
DWARFExpression::Operation Op
std::map< std::string, GVSummaryMapTy, std::less<> > ModuleToSummariesForIndexTy
Map of a module name to the GUIDs and summaries we will import from that module.
OutputIt copy(R &&Range, OutputIt Out)
constexpr unsigned BitWidth
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
bool isBitcode(const unsigned char *BufPtr, const unsigned char *BufEnd)
isBitcode - Return true if the given bytes are the magic bytes for LLVM IR bitcode,...
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
void consumeError(Error Err)
Consume a Error without doing anything.
GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
This struct is a compact representation of a valid (non-zero power of two) alignment.
Class to accumulate and hold information about a callee.
static constexpr unsigned RelBlockFreqBits
The value stored in RelBlockFreq has to be interpreted as the digits of a scaled number with a scale ...
Flags specific to function summaries.
static constexpr uint32_t RangeWidth
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
static const Target * lookupTarget(StringRef Triple, std::string &Error)
lookupTarget - Lookup a target based on a target triple.
Structure to hold a use-list order.
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.
uint64_t Info
Additional information for the resolution:
enum llvm::WholeProgramDevirtResolution::ByArg::Kind TheKind
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...
std::string SingleImplName