33#include "llvm/Config/llvm-config.h"
95 cl::desc(
"Number of metadatas above which we emit an index "
96 "to enable lazy-loading"));
99 cl::desc(
"The threshold (unit M) for flushing LLVM bitcode."));
103 cl::desc(
"Write relative block frequency to function summary "));
123 cl::desc(
"Preserve use-list order when writing LLVM bitcode."));
138 VST_BBENTRY_6_ABBREV,
142 CONSTANTS_INTEGER_ABBREV,
143 CONSTANTS_CE_CAST_Abbrev,
144 CONSTANTS_NULL_Abbrev,
148 FUNCTION_INST_STORE_ABBREV,
149 FUNCTION_INST_UNOP_ABBREV,
150 FUNCTION_INST_UNOP_FLAGS_ABBREV,
151 FUNCTION_INST_BINOP_ABBREV,
152 FUNCTION_INST_BINOP_FLAGS_ABBREV,
153 FUNCTION_INST_CAST_ABBREV,
154 FUNCTION_INST_CAST_FLAGS_ABBREV,
155 FUNCTION_INST_RET_VOID_ABBREV,
156 FUNCTION_INST_RET_VAL_ABBREV,
157 FUNCTION_INST_BR_UNCOND_ABBREV,
158 FUNCTION_INST_BR_COND_ABBREV,
159 FUNCTION_INST_UNREACHABLE_ABBREV,
160 FUNCTION_INST_GEP_ABBREV,
161 FUNCTION_INST_CMP_ABBREV,
162 FUNCTION_INST_CMP_FLAGS_ABBREV,
163 FUNCTION_DEBUG_RECORD_VALUE_ABBREV,
164 FUNCTION_DEBUG_LOC_ABBREV,
169class BitcodeWriterBase {
172 BitstreamWriter &Stream;
174 StringTableBuilder &StrtabBuilder;
179 BitcodeWriterBase(BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder)
180 : Stream(Stream), StrtabBuilder(StrtabBuilder) {}
183 void writeModuleVersion();
186void BitcodeWriterBase::writeModuleVersion() {
193class ModuleBitcodeWriterBase :
public BitcodeWriterBase {
202 const ModuleSummaryIndex *Index;
207 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
210 unsigned GlobalValueId;
214 uint64_t VSTOffsetPlaceholder = 0;
219 ModuleBitcodeWriterBase(
const Module &M, StringTableBuilder &StrtabBuilder,
220 BitstreamWriter &Stream,
221 bool ShouldPreserveUseListOrder,
222 const ModuleSummaryIndex *Index)
223 : BitcodeWriterBase(Stream, StrtabBuilder),
M(
M),
226 : ShouldPreserveUseListOrder),
236 for (
const auto &GUIDSummaryLists : *Index)
238 for (
auto &Summary : GUIDSummaryLists.second.getSummaryList())
244 for (auto &CallEdge : FS->calls())
245 if (!CallEdge.first.haveGVs() || !CallEdge.first.getValue())
246 assignValueId(CallEdge.first.getGUID());
252 for (auto &RefEdge : FS->refs())
253 if (!RefEdge.haveGVs() || !RefEdge.getValue())
254 assignValueId(RefEdge.getGUID());
259 void writePerModuleGlobalValueSummary();
262 void writePerModuleFunctionSummaryRecord(
263 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
264 unsigned ValueID,
unsigned FSCallsAbbrev,
unsigned FSCallsProfileAbbrev,
265 unsigned CallsiteAbbrev,
unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
266 const Function &
F, DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
268 void writeModuleLevelReferences(
const GlobalVariable &V,
269 SmallVector<uint64_t, 64> &NameVals,
270 unsigned FSModRefsAbbrev,
271 unsigned FSModVTableRefsAbbrev);
274 GUIDToValueIdMap[ValGUID] = ++GlobalValueId;
278 const auto &VMI = GUIDToValueIdMap.find(ValGUID);
281 assert(VMI != GUIDToValueIdMap.end() &&
282 "GUID does not have assigned value Id");
287 unsigned getValueId(ValueInfo VI) {
288 if (!
VI.haveGVs() || !
VI.getValue())
289 return getValueId(
VI.getGUID());
293 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
297class ModuleBitcodeWriter :
public ModuleBitcodeWriterBase {
308 uint64_t BitcodeStartBit;
313 ModuleBitcodeWriter(
const Module &M, StringTableBuilder &StrtabBuilder,
314 BitstreamWriter &Stream,
bool ShouldPreserveUseListOrder,
315 const ModuleSummaryIndex *Index,
bool GenerateHash,
317 : ModuleBitcodeWriterBase(
M, StrtabBuilder, Stream,
318 ShouldPreserveUseListOrder,
Index),
319 GenerateHash(GenerateHash), ModHash(ModHash),
320 BitcodeStartBit(Stream.GetCurrentBitNo()) {}
326 uint64_t bitcodeStartBit() {
return BitcodeStartBit; }
328 size_t addToStrtab(StringRef Str);
330 void writeAttributeGroupTable();
331 void writeAttributeTable();
332 void writeTypeTable();
334 void writeValueSymbolTableForwardDecl();
335 void writeModuleInfo();
336 void writeValueAsMetadata(
const ValueAsMetadata *MD,
337 SmallVectorImpl<uint64_t> &Record);
338 void writeMDTuple(
const MDTuple *
N, SmallVectorImpl<uint64_t> &Record,
340 unsigned createDILocationAbbrev();
341 void writeDILocation(
const DILocation *
N, SmallVectorImpl<uint64_t> &Record,
343 unsigned createGenericDINodeAbbrev();
345 SmallVectorImpl<uint64_t> &Record,
unsigned &Abbrev);
346 void writeDISubrange(
const DISubrange *
N, SmallVectorImpl<uint64_t> &Record,
349 SmallVectorImpl<uint64_t> &Record,
352 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
356 SmallVectorImpl<uint64_t> &Record,
359 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
361 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
363 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
365 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
367 SmallVectorImpl<uint64_t> &Record,
369 void writeDIFile(
const DIFile *
N, SmallVectorImpl<uint64_t> &Record,
372 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
374 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
376 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
378 SmallVectorImpl<uint64_t> &Record,
381 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
384 void writeDIMacro(
const DIMacro *
N, SmallVectorImpl<uint64_t> &Record,
388 void writeDIArgList(
const DIArgList *
N, SmallVectorImpl<uint64_t> &Record);
389 void writeDIModule(
const DIModule *
N, SmallVectorImpl<uint64_t> &Record,
391 void writeDIAssignID(
const DIAssignID *
N, SmallVectorImpl<uint64_t> &Record,
394 SmallVectorImpl<uint64_t> &Record,
397 SmallVectorImpl<uint64_t> &Record,
400 SmallVectorImpl<uint64_t> &Record,
403 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
405 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
407 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
409 SmallVectorImpl<uint64_t> &Record,
412 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
414 SmallVectorImpl<uint64_t> &Record,
416 unsigned createNamedMetadataAbbrev();
417 void writeNamedMetadata(SmallVectorImpl<uint64_t> &Record);
418 unsigned createMetadataStringsAbbrev();
420 SmallVectorImpl<uint64_t> &Record);
422 SmallVectorImpl<uint64_t> &Record,
423 std::vector<unsigned> *MDAbbrevs =
nullptr,
424 std::vector<uint64_t> *IndexPos =
nullptr);
425 void writeModuleMetadata();
426 void writeFunctionMetadata(
const Function &
F);
427 void writeFunctionMetadataAttachment(
const Function &
F);
428 void pushGlobalMetadataAttachment(SmallVectorImpl<uint64_t> &Record,
429 const GlobalObject &GO);
430 void writeModuleMetadataKinds();
431 void writeOperandBundleTags();
432 void writeSyncScopeNames();
433 void writeConstants(
unsigned FirstVal,
unsigned LastVal,
bool isGlobal);
434 void writeModuleConstants();
435 bool pushValueAndType(
const Value *V,
unsigned InstID,
436 SmallVectorImpl<unsigned> &Vals);
437 bool pushValueOrMetadata(
const Value *V,
unsigned InstID,
438 SmallVectorImpl<unsigned> &Vals);
439 void writeOperandBundles(
const CallBase &CB,
unsigned InstID);
440 void pushValue(
const Value *V,
unsigned InstID,
441 SmallVectorImpl<unsigned> &Vals);
442 void pushValueSigned(
const Value *V,
unsigned InstID,
443 SmallVectorImpl<uint64_t> &Vals);
444 void writeInstruction(
const Instruction &
I,
unsigned InstID,
445 SmallVectorImpl<unsigned> &Vals);
446 void writeFunctionLevelValueSymbolTable(
const ValueSymbolTable &VST);
447 void writeGlobalValueSymbolTable(
448 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
449 void writeUseList(UseListOrder &&Order);
450 void writeUseListBlock(
const Function *
F);
452 writeFunction(
const Function &
F,
453 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
454 void writeBlockInfo();
455 void writeModuleHash(StringRef View);
458 return unsigned(SSID);
461 unsigned getEncodedAlign(MaybeAlign Alignment) {
return encode(Alignment); }
465class IndexBitcodeWriter :
public BitcodeWriterBase {
467 const ModuleSummaryIndex &
Index;
480 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
484 std::vector<uint64_t> StackIds;
489 DenseMap<unsigned, unsigned> StackIdIndicesToIndex;
492 unsigned GlobalValueId = 0;
496 DenseMap<StringRef, uint64_t> ModuleIdMap;
506 BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder,
507 const ModuleSummaryIndex &Index,
510 : BitcodeWriterBase(Stream, StrtabBuilder),
Index(
Index),
511 DecSummaries(DecSummaries),
512 ModuleToSummariesForIndex(ModuleToSummariesForIndex) {
516 auto RecordStackIdReference = [&](
unsigned StackIdIndex) {
521 StackIdIndicesToIndex.
insert({StackIdIndex, StackIds.size()});
523 StackIds.push_back(
Index.getStackIdAtIndex(StackIdIndex));
530 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
531 GUIDToValueIdMap[
I.first] = ++GlobalValueId;
543 for (
auto &CI :
FS->callsites()) {
554 if (CI.StackIdIndices.empty()) {
555 GUIDToValueIdMap[CI.Callee.getGUID()] = ++GlobalValueId;
558 for (
auto Idx : CI.StackIdIndices)
559 RecordStackIdReference(Idx);
562 for (
auto &AI :
FS->allocs())
563 for (
auto &MIB : AI.MIBs)
564 for (
auto Idx : MIB.StackIdIndices)
565 RecordStackIdReference(Idx);
571 using GVInfo = std::pair<GlobalValue::GUID, GlobalValueSummary *>;
576 template<
typename Functor>
577 void forEachSummary(Functor Callback) {
578 if (ModuleToSummariesForIndex) {
579 for (
auto &M : *ModuleToSummariesForIndex)
580 for (
auto &Summary :
M.second) {
586 Callback({AS->getAliaseeGUID(), &AS->getAliasee()},
true);
589 for (
auto &Summaries : Index)
590 for (
auto &Summary : Summaries.second.getSummaryList())
599 template <
typename Functor>
void forEachModule(Functor Callback) {
600 if (ModuleToSummariesForIndex) {
601 for (
const auto &M : *ModuleToSummariesForIndex) {
602 const auto &MPI =
Index.modulePaths().find(
M.first);
603 if (MPI ==
Index.modulePaths().end()) {
607 assert(ModuleToSummariesForIndex->size() == 1);
617 std::vector<StringRef> ModulePaths;
618 for (
auto &[ModPath,
_] :
Index.modulePaths())
619 ModulePaths.push_back(ModPath);
621 for (
auto &ModPath : ModulePaths)
630 void writeModStrings();
631 void writeCombinedGlobalValueSummary();
634 auto VMI = GUIDToValueIdMap.find(ValGUID);
635 if (VMI == GUIDToValueIdMap.end())
640 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
675 case Instruction::Add:
677 case Instruction::Sub:
679 case Instruction::Mul:
682 case Instruction::FDiv:
685 case Instruction::FRem:
759 case Attribute::Alignment:
761 case Attribute::AllocAlign:
763 case Attribute::AllocSize:
765 case Attribute::AlwaysInline:
767 case Attribute::Builtin:
769 case Attribute::ByVal:
771 case Attribute::Convergent:
773 case Attribute::InAlloca:
775 case Attribute::Cold:
777 case Attribute::DisableSanitizerInstrumentation:
779 case Attribute::FnRetThunkExtern:
783 case Attribute::ElementType:
785 case Attribute::HybridPatchable:
787 case Attribute::InlineHint:
789 case Attribute::InReg:
791 case Attribute::JumpTable:
793 case Attribute::MinSize:
795 case Attribute::AllocatedPointer:
797 case Attribute::AllocKind:
799 case Attribute::Memory:
801 case Attribute::NoFPClass:
803 case Attribute::Naked:
805 case Attribute::Nest:
807 case Attribute::NoAlias:
809 case Attribute::NoBuiltin:
811 case Attribute::NoCallback:
813 case Attribute::NoDivergenceSource:
815 case Attribute::NoDuplicate:
817 case Attribute::NoFree:
819 case Attribute::NoImplicitFloat:
821 case Attribute::NoInline:
823 case Attribute::NoRecurse:
825 case Attribute::NoMerge:
827 case Attribute::NonLazyBind:
829 case Attribute::NonNull:
831 case Attribute::Dereferenceable:
833 case Attribute::DereferenceableOrNull:
835 case Attribute::NoRedZone:
837 case Attribute::NoReturn:
839 case Attribute::NoSync:
841 case Attribute::NoCfCheck:
843 case Attribute::NoProfile:
845 case Attribute::SkipProfile:
847 case Attribute::NoUnwind:
849 case Attribute::NoSanitizeBounds:
851 case Attribute::NoSanitizeCoverage:
853 case Attribute::NullPointerIsValid:
855 case Attribute::OptimizeForDebugging:
857 case Attribute::OptForFuzzing:
859 case Attribute::OptimizeForSize:
861 case Attribute::OptimizeNone:
863 case Attribute::ReadNone:
865 case Attribute::ReadOnly:
867 case Attribute::Returned:
869 case Attribute::ReturnsTwice:
871 case Attribute::SExt:
873 case Attribute::Speculatable:
875 case Attribute::StackAlignment:
877 case Attribute::StackProtect:
879 case Attribute::StackProtectReq:
881 case Attribute::StackProtectStrong:
883 case Attribute::SafeStack:
885 case Attribute::ShadowCallStack:
887 case Attribute::StrictFP:
889 case Attribute::StructRet:
891 case Attribute::SanitizeAddress:
893 case Attribute::SanitizeAllocToken:
895 case Attribute::SanitizeHWAddress:
897 case Attribute::SanitizeThread:
899 case Attribute::SanitizeType:
901 case Attribute::SanitizeMemory:
903 case Attribute::SanitizeNumericalStability:
905 case Attribute::SanitizeRealtime:
907 case Attribute::SanitizeRealtimeBlocking:
909 case Attribute::SpeculativeLoadHardening:
911 case Attribute::SwiftError:
913 case Attribute::SwiftSelf:
915 case Attribute::SwiftAsync:
917 case Attribute::UWTable:
919 case Attribute::VScaleRange:
921 case Attribute::WillReturn:
923 case Attribute::WriteOnly:
925 case Attribute::ZExt:
927 case Attribute::ImmArg:
929 case Attribute::SanitizeMemTag:
931 case Attribute::Preallocated:
933 case Attribute::NoUndef:
935 case Attribute::ByRef:
937 case Attribute::MustProgress:
939 case Attribute::PresplitCoroutine:
941 case Attribute::Writable:
943 case Attribute::CoroDestroyOnlyWhenComplete:
945 case Attribute::CoroElideSafe:
947 case Attribute::DeadOnUnwind:
949 case Attribute::Range:
951 case Attribute::Initializes:
953 case Attribute::NoExt:
955 case Attribute::Captures:
957 case Attribute::DeadOnReturn:
959 case Attribute::NoCreateUndefOrPoison:
985 unsigned NumWords =
A.getActiveWords();
986 const uint64_t *RawData =
A.getRawData();
987 for (
unsigned i = 0; i < NumWords; i++)
1007void ModuleBitcodeWriter::writeAttributeGroupTable() {
1008 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
1010 if (AttrGrps.empty())
return;
1014 SmallVector<uint64_t, 64> Record;
1016 unsigned AttrListIndex = Pair.first;
1017 AttributeSet AS = Pair.second;
1022 if (Attr.isEnumAttribute()) {
1025 }
else if (Attr.isIntAttribute()) {
1027 Attribute::AttrKind
Kind = Attr.getKindAsEnum();
1029 if (Kind == Attribute::Memory) {
1036 }
else if (Attr.isStringAttribute()) {
1037 StringRef
Kind = Attr.getKindAsString();
1038 StringRef Val = Attr.getValueAsString();
1047 }
else if (Attr.isTypeAttribute()) {
1048 Type *Ty = Attr.getValueAsType();
1053 }
else if (Attr.isConstantRangeAttribute()) {
1059 assert(Attr.isConstantRangeListAttribute());
1065 for (
auto &CR : Val)
1077void ModuleBitcodeWriter::writeAttributeTable() {
1079 if (
Attrs.empty())
return;
1083 SmallVector<uint64_t, 64> Record;
1084 for (
const AttributeList &AL : Attrs) {
1085 for (
unsigned i :
AL.indexes()) {
1086 AttributeSet AS =
AL.getAttributes(i);
1099void ModuleBitcodeWriter::writeTypeTable() {
1103 SmallVector<uint64_t, 64> TypeVals;
1108 auto Abbv = std::make_shared<BitCodeAbbrev>();
1110 Abbv->Add(BitCodeAbbrevOp(0));
1111 unsigned OpaquePtrAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1114 Abbv = std::make_shared<BitCodeAbbrev>();
1119 unsigned FunctionAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1122 Abbv = std::make_shared<BitCodeAbbrev>();
1127 unsigned StructAnonAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1130 Abbv = std::make_shared<BitCodeAbbrev>();
1134 unsigned StructNameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1137 Abbv = std::make_shared<BitCodeAbbrev>();
1142 unsigned StructNamedAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1145 Abbv = std::make_shared<BitCodeAbbrev>();
1149 unsigned ArrayAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1157 for (
Type *
T : TypeList) {
1158 int AbbrevToUse = 0;
1161 switch (
T->getTypeID()) {
1171 case Type::MetadataTyID:
1176 case Type::IntegerTyID:
1181 case Type::PointerTyID: {
1188 AbbrevToUse = OpaquePtrAbbrev;
1191 case Type::FunctionTyID: {
1197 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i)
1199 AbbrevToUse = FunctionAbbrev;
1202 case Type::StructTyID: {
1207 for (
Type *ET :
ST->elements())
1210 if (
ST->isLiteral()) {
1212 AbbrevToUse = StructAnonAbbrev;
1214 if (
ST->isOpaque()) {
1218 AbbrevToUse = StructNamedAbbrev;
1222 if (!
ST->getName().empty())
1228 case Type::ArrayTyID: {
1232 TypeVals.
push_back(AT->getNumElements());
1234 AbbrevToUse = ArrayAbbrev;
1237 case Type::FixedVectorTyID:
1238 case Type::ScalableVectorTyID: {
1243 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1249 case Type::TargetExtTyID: {
1255 for (
Type *InnerTy :
TET->type_params())
1260 case Type::TypedPointerTyID:
1265 Stream.
EmitRecord(Code, TypeVals, AbbrevToUse);
1306 RawFlags |= Flags.ReadNone;
1307 RawFlags |= (Flags.ReadOnly << 1);
1308 RawFlags |= (Flags.NoRecurse << 2);
1309 RawFlags |= (Flags.ReturnDoesNotAlias << 3);
1310 RawFlags |= (Flags.NoInline << 4);
1311 RawFlags |= (Flags.AlwaysInline << 5);
1312 RawFlags |= (Flags.NoUnwind << 6);
1313 RawFlags |= (Flags.MayThrow << 7);
1314 RawFlags |= (Flags.HasUnknownCall << 8);
1315 RawFlags |= (Flags.MustBeUnreachable << 9);
1322 bool ImportAsDecl =
false) {
1325 RawFlags |= Flags.NotEligibleToImport;
1326 RawFlags |= (Flags.Live << 1);
1327 RawFlags |= (Flags.DSOLocal << 2);
1328 RawFlags |= (Flags.CanAutoHide << 3);
1333 RawFlags = (RawFlags << 4) | Flags.Linkage;
1335 RawFlags |= (Flags.Visibility << 8);
1337 unsigned ImportType = Flags.ImportType | ImportAsDecl;
1338 RawFlags |= (ImportType << 10);
1344 uint64_t RawFlags = Flags.MaybeReadOnly | (Flags.MaybeWriteOnly << 1) |
1345 (Flags.Constant << 2) | Flags.VCallVisibility << 3;
1397 switch (
C.getSelectionKind()) {
1421size_t ModuleBitcodeWriter::addToStrtab(StringRef Str) {
1424 return StrtabBuilder.
add(Str);
1427void ModuleBitcodeWriter::writeComdats() {
1442void ModuleBitcodeWriter::writeValueSymbolTableForwardDecl() {
1447 auto Abbv = std::make_shared<BitCodeAbbrev>();
1453 unsigned VSTOffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1469 bool isChar6 =
true;
1470 for (
char C : Str) {
1473 if ((
unsigned char)
C & 128)
1482static_assert(
sizeof(GlobalValue::SanitizerMetadata) <=
sizeof(unsigned),
1483 "Sanitizer Metadata is too large for naive serialization.");
1486 return Meta.NoAddress | (
Meta.NoHWAddress << 1) |
1487 (
Meta.Memtag << 2) | (
Meta.IsDynInit << 3);
1493void ModuleBitcodeWriter::writeModuleInfo() {
1495 if (!
M.getTargetTriple().empty())
1497 M.getTargetTriple().str(), 0 );
1498 const std::string &
DL =
M.getDataLayoutStr();
1501 if (!
M.getModuleInlineAsm().empty())
1507 std::map<std::string, unsigned> SectionMap;
1508 std::map<std::string, unsigned> GCMap;
1509 MaybeAlign MaxGVarAlignment;
1510 unsigned MaxGlobalType = 0;
1511 for (
const GlobalVariable &GV :
M.globals()) {
1512 if (MaybeAlign
A = GV.getAlign())
1513 MaxGVarAlignment = !MaxGVarAlignment ? *
A : std::max(*MaxGVarAlignment, *
A);
1514 MaxGlobalType = std::max(MaxGlobalType, VE.
getTypeID(GV.getValueType()));
1515 if (GV.hasSection()) {
1517 unsigned &
Entry = SectionMap[std::string(GV.getSection())];
1521 Entry = SectionMap.size();
1525 for (
const Function &
F : M) {
1526 if (
F.hasSection()) {
1528 unsigned &
Entry = SectionMap[std::string(
F.getSection())];
1532 Entry = SectionMap.size();
1537 unsigned &
Entry = GCMap[
F.getGC()];
1541 Entry = GCMap.size();
1547 unsigned SimpleGVarAbbrev = 0;
1548 if (!
M.global_empty()) {
1550 auto Abbv = std::make_shared<BitCodeAbbrev>();
1561 if (!MaxGVarAlignment)
1562 Abbv->Add(BitCodeAbbrevOp(0));
1564 unsigned MaxEncAlignment = getEncodedAlign(MaxGVarAlignment);
1568 if (SectionMap.empty())
1569 Abbv->Add(BitCodeAbbrevOp(0));
1574 SimpleGVarAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1588 auto Abbv = std::make_shared<BitCodeAbbrev>();
1591 Abbv->Add(AbbrevOpToUse);
1592 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1594 for (
const auto P :
M.getSourceFileName())
1603 for (
const GlobalVariable &GV :
M.globals()) {
1604 unsigned AbbrevToUse = 0;
1610 Vals.
push_back(addToStrtab(GV.getName()));
1613 Vals.
push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant());
1617 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1618 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1620 if (GV.isThreadLocal() ||
1622 GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||
1623 GV.isExternallyInitialized() ||
1625 GV.hasComdat() || GV.hasAttributes() || GV.isDSOLocal() ||
1626 GV.hasPartition() || GV.hasSanitizerMetadata() || GV.getCodeModel()) {
1630 Vals.
push_back(GV.isExternallyInitialized());
1634 auto AL = GV.getAttributesAsList(AttributeList::FunctionIndex);
1638 Vals.
push_back(addToStrtab(GV.getPartition()));
1639 Vals.
push_back(GV.getPartition().size());
1642 GV.getSanitizerMetadata())
1646 AbbrevToUse = SimpleGVarAbbrev;
1654 for (
const Function &
F : M) {
1666 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1667 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1679 F.hasPersonalityFn() ? (VE.
getValueID(
F.getPersonalityFn()) + 1) : 0);
1683 Vals.
push_back(addToStrtab(
F.getPartition()));
1686 unsigned AbbrevToUse = 0;
1692 for (
const GlobalAlias &
A :
M.aliases()) {
1699 Vals.
push_back(
A.getType()->getAddressSpace());
1707 Vals.
push_back(addToStrtab(
A.getPartition()));
1710 unsigned AbbrevToUse = 0;
1716 for (
const GlobalIFunc &
I :
M.ifuncs()) {
1722 Vals.
push_back(
I.getType()->getAddressSpace());
1727 Vals.
push_back(addToStrtab(
I.getPartition()));
1733 writeValueSymbolTableForwardDecl();
1740 if (OBO->hasNoSignedWrap())
1742 if (OBO->hasNoUnsignedWrap())
1748 if (PDI->isDisjoint())
1751 if (FPMO->hasAllowReassoc())
1753 if (FPMO->hasNoNaNs())
1755 if (FPMO->hasNoInfs())
1757 if (FPMO->hasNoSignedZeros())
1759 if (FPMO->hasAllowReciprocal())
1761 if (FPMO->hasAllowContract())
1763 if (FPMO->hasApproxFunc())
1766 if (NNI->hasNonNeg())
1769 if (TI->hasNoSignedWrap())
1771 if (TI->hasNoUnsignedWrap())
1774 if (
GEP->isInBounds())
1776 if (
GEP->hasNoUnsignedSignedWrap())
1778 if (
GEP->hasNoUnsignedWrap())
1781 if (ICmp->hasSameSign())
1788void ModuleBitcodeWriter::writeValueAsMetadata(
1789 const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
1798void ModuleBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1799 SmallVectorImpl<uint64_t> &Record,
1801 for (
const MDOperand &MDO :
N->operands()) {
1804 "Unexpected function-local metadata");
1813unsigned ModuleBitcodeWriter::createDILocationAbbrev() {
1816 auto Abbv = std::make_shared<BitCodeAbbrev>();
1829void ModuleBitcodeWriter::writeDILocation(
const DILocation *
N,
1830 SmallVectorImpl<uint64_t> &Record,
1833 Abbrev = createDILocationAbbrev();
1847unsigned ModuleBitcodeWriter::createGenericDINodeAbbrev() {
1850 auto Abbv = std::make_shared<BitCodeAbbrev>();
1861void ModuleBitcodeWriter::writeGenericDINode(
const GenericDINode *
N,
1862 SmallVectorImpl<uint64_t> &Record,
1865 Abbrev = createGenericDINodeAbbrev();
1871 for (
auto &
I :
N->operands())
1878void ModuleBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1879 SmallVectorImpl<uint64_t> &Record,
1881 const uint64_t
Version = 2 << 1;
1892void ModuleBitcodeWriter::writeDIGenericSubrange(
1893 const DIGenericSubrange *
N, SmallVectorImpl<uint64_t> &Record,
1905void ModuleBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1906 SmallVectorImpl<uint64_t> &Record,
1908 const uint64_t IsBigInt = 1 << 2;
1909 Record.
push_back(IsBigInt | (
N->isUnsigned() << 1) |
N->isDistinct());
1910 Record.
push_back(
N->getValue().getBitWidth());
1918void ModuleBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1919 SmallVectorImpl<uint64_t> &Record,
1921 const unsigned SizeIsMetadata = 0x2;
1922 Record.
push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1929 Record.
push_back(
N->getNumExtraInhabitants());
1936void ModuleBitcodeWriter::writeDIFixedPointType(
1937 const DIFixedPointType *
N, SmallVectorImpl<uint64_t> &Record,
1939 const unsigned SizeIsMetadata = 0x2;
1940 Record.
push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1950 auto WriteWideInt = [&](
const APInt &
Value) {
1953 uint64_t NumWords =
Value.getActiveWords();
1954 uint64_t
Encoded = (NumWords << 32) |
Value.getBitWidth();
1959 WriteWideInt(
N->getNumeratorRaw());
1960 WriteWideInt(
N->getDenominatorRaw());
1966void ModuleBitcodeWriter::writeDIStringType(
const DIStringType *
N,
1967 SmallVectorImpl<uint64_t> &Record,
1969 const unsigned SizeIsMetadata = 0x2;
1970 Record.
push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1984void ModuleBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
1985 SmallVectorImpl<uint64_t> &Record,
1987 const unsigned SizeIsMetadata = 0x2;
1988 Record.
push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2003 if (
const auto &DWARFAddressSpace =
N->getDWARFAddressSpace())
2004 Record.
push_back(*DWARFAddressSpace + 1);
2010 if (
auto PtrAuthData =
N->getPtrAuthData())
2019void ModuleBitcodeWriter::writeDISubrangeType(
const DISubrangeType *
N,
2020 SmallVectorImpl<uint64_t> &Record,
2022 const unsigned SizeIsMetadata = 0x2;
2023 Record.
push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2041void ModuleBitcodeWriter::writeDICompositeType(
2042 const DICompositeType *
N, SmallVectorImpl<uint64_t> &Record,
2044 const unsigned IsNotUsedInOldTypeRef = 0x2;
2045 const unsigned SizeIsMetadata = 0x4;
2046 Record.
push_back(SizeIsMetadata | IsNotUsedInOldTypeRef |
2047 (
unsigned)
N->isDistinct());
2069 Record.
push_back(
N->getNumExtraInhabitants());
2079void ModuleBitcodeWriter::writeDISubroutineType(
2080 const DISubroutineType *
N, SmallVectorImpl<uint64_t> &Record,
2082 const unsigned HasNoOldTypeRefs = 0x2;
2083 Record.
push_back(HasNoOldTypeRefs | (
unsigned)
N->isDistinct());
2092void ModuleBitcodeWriter::writeDIFile(
const DIFile *
N,
2093 SmallVectorImpl<uint64_t> &Record,
2098 if (
N->getRawChecksum()) {
2107 auto Source =
N->getRawSource();
2115void ModuleBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
2116 SmallVectorImpl<uint64_t> &Record,
2118 assert(
N->isDistinct() &&
"Expected distinct compile units");
2121 auto Lang =
N->getSourceLanguage();
2125 if (Lang.hasVersionedName())
2126 Record.
back() ^= (uint64_t(1) << 63);
2142 Record.
push_back(
N->getSplitDebugInlining());
2143 Record.
push_back(
N->getDebugInfoForProfiling());
2144 Record.
push_back((
unsigned)
N->getNameTableKind());
2148 Record.
push_back(Lang.hasVersionedName() ? Lang.getVersion() : 0);
2154void ModuleBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
2155 SmallVectorImpl<uint64_t> &Record,
2157 const uint64_t HasUnitFlag = 1 << 1;
2158 const uint64_t HasSPFlagsFlag = 1 << 2;
2159 Record.
push_back(uint64_t(
N->isDistinct()) | HasUnitFlag | HasSPFlagsFlag);
2179 Record.
push_back(
N->getKeyInstructionsEnabled());
2185void ModuleBitcodeWriter::writeDILexicalBlock(
const DILexicalBlock *
N,
2186 SmallVectorImpl<uint64_t> &Record,
2198void ModuleBitcodeWriter::writeDILexicalBlockFile(
2199 const DILexicalBlockFile *
N, SmallVectorImpl<uint64_t> &Record,
2210void ModuleBitcodeWriter::writeDICommonBlock(
const DICommonBlock *
N,
2211 SmallVectorImpl<uint64_t> &Record,
2224void ModuleBitcodeWriter::writeDINamespace(
const DINamespace *
N,
2225 SmallVectorImpl<uint64_t> &Record,
2227 Record.
push_back(
N->isDistinct() |
N->getExportSymbols() << 1);
2235void ModuleBitcodeWriter::writeDIMacro(
const DIMacro *
N,
2236 SmallVectorImpl<uint64_t> &Record,
2248void ModuleBitcodeWriter::writeDIMacroFile(
const DIMacroFile *
N,
2249 SmallVectorImpl<uint64_t> &Record,
2261void ModuleBitcodeWriter::writeDIArgList(
const DIArgList *
N,
2262 SmallVectorImpl<uint64_t> &Record) {
2263 Record.
reserve(
N->getArgs().size());
2264 for (ValueAsMetadata *MD :
N->getArgs())
2271void ModuleBitcodeWriter::writeDIModule(
const DIModule *
N,
2272 SmallVectorImpl<uint64_t> &Record,
2275 for (
auto &
I :
N->operands())
2284void ModuleBitcodeWriter::writeDIAssignID(
const DIAssignID *
N,
2285 SmallVectorImpl<uint64_t> &Record,
2293void ModuleBitcodeWriter::writeDITemplateTypeParameter(
2294 const DITemplateTypeParameter *
N, SmallVectorImpl<uint64_t> &Record,
2305void ModuleBitcodeWriter::writeDITemplateValueParameter(
2306 const DITemplateValueParameter *
N, SmallVectorImpl<uint64_t> &Record,
2319void ModuleBitcodeWriter::writeDIGlobalVariable(
2320 const DIGlobalVariable *
N, SmallVectorImpl<uint64_t> &Record,
2322 const uint64_t
Version = 2 << 1;
2341void ModuleBitcodeWriter::writeDILocalVariable(
2342 const DILocalVariable *
N, SmallVectorImpl<uint64_t> &Record,
2357 const uint64_t HasAlignmentFlag = 1 << 1;
2358 Record.
push_back((uint64_t)
N->isDistinct() | HasAlignmentFlag);
2373void ModuleBitcodeWriter::writeDILabel(
2374 const DILabel *
N, SmallVectorImpl<uint64_t> &Record,
2376 uint64_t IsArtificialFlag = uint64_t(
N->isArtificial()) << 1;
2377 Record.
push_back((uint64_t)
N->isDistinct() | IsArtificialFlag);
2383 Record.
push_back(
N->getCoroSuspendIdx().has_value()
2384 ? (uint64_t)
N->getCoroSuspendIdx().value()
2385 : std::numeric_limits<uint64_t>::max());
2391void ModuleBitcodeWriter::writeDIExpression(
const DIExpression *
N,
2392 SmallVectorImpl<uint64_t> &Record,
2394 Record.
reserve(
N->getElements().size() + 1);
2395 const uint64_t
Version = 3 << 1;
2397 Record.
append(
N->elements_begin(),
N->elements_end());
2403void ModuleBitcodeWriter::writeDIGlobalVariableExpression(
2404 const DIGlobalVariableExpression *
N, SmallVectorImpl<uint64_t> &Record,
2414void ModuleBitcodeWriter::writeDIObjCProperty(
const DIObjCProperty *
N,
2415 SmallVectorImpl<uint64_t> &Record,
2430void ModuleBitcodeWriter::writeDIImportedEntity(
2431 const DIImportedEntity *
N, SmallVectorImpl<uint64_t> &Record,
2446unsigned ModuleBitcodeWriter::createNamedMetadataAbbrev() {
2447 auto Abbv = std::make_shared<BitCodeAbbrev>();
2454void ModuleBitcodeWriter::writeNamedMetadata(
2455 SmallVectorImpl<uint64_t> &Record) {
2456 if (
M.named_metadata_empty())
2459 unsigned Abbrev = createNamedMetadataAbbrev();
2460 for (
const NamedMDNode &NMD :
M.named_metadata()) {
2462 StringRef Str = NMD.getName();
2463 Record.
append(Str.bytes_begin(), Str.bytes_end());
2468 for (
const MDNode *
N : NMD.operands())
2475unsigned ModuleBitcodeWriter::createMetadataStringsAbbrev() {
2476 auto Abbv = std::make_shared<BitCodeAbbrev>();
2488void ModuleBitcodeWriter::writeMetadataStrings(
2490 if (Strings.
empty())
2498 SmallString<256> Blob;
2500 BitstreamWriter
W(Blob);
2520#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,
2521#include "llvm/IR/Metadata.def"
2525void ModuleBitcodeWriter::writeMetadataRecords(
2527 std::vector<unsigned> *MDAbbrevs, std::vector<uint64_t> *IndexPos) {
2532#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
2533#include "llvm/IR/Metadata.def"
2539 assert(
N->isResolved() &&
"Expected forward references to be resolved");
2541 switch (
N->getMetadataID()) {
2544#define HANDLE_MDNODE_LEAF(CLASS) \
2545 case Metadata::CLASS##Kind: \
2547 write##CLASS(cast<CLASS>(N), Record, \
2548 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
2550 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
2552#include "llvm/IR/Metadata.def"
2563void ModuleBitcodeWriter::writeModuleMetadata() {
2564 if (!VE.
hasMDs() &&
M.named_metadata_empty())
2568 SmallVector<uint64_t, 64> Record;
2572 std::vector<unsigned> MDAbbrevs;
2575 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
2576 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
2577 createGenericDINodeAbbrev();
2579 auto Abbv = std::make_shared<BitCodeAbbrev>();
2583 unsigned OffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2585 Abbv = std::make_shared<BitCodeAbbrev>();
2589 unsigned IndexAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2601 uint64_t Vals[] = {0, 0};
2611 std::vector<uint64_t> IndexPos;
2615 writeMetadataRecords(VE.
getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);
2626 uint64_t PreviousValue = IndexOffsetRecordBitPos;
2627 for (
auto &Elt : IndexPos) {
2628 auto EltDelta = Elt - PreviousValue;
2629 PreviousValue = Elt;
2638 writeNamedMetadata(Record);
2640 auto AddDeclAttachedMetadata = [&](
const GlobalObject &GO) {
2641 SmallVector<uint64_t, 4> Record;
2643 pushGlobalMetadataAttachment(Record, GO);
2646 for (
const Function &
F : M)
2647 if (
F.isDeclaration() &&
F.hasMetadata())
2648 AddDeclAttachedMetadata(
F);
2649 for (
const GlobalIFunc &GI :
M.ifuncs())
2650 if (GI.hasMetadata())
2651 AddDeclAttachedMetadata(GI);
2654 for (
const GlobalVariable &GV :
M.globals())
2655 if (GV.hasMetadata())
2656 AddDeclAttachedMetadata(GV);
2661void ModuleBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
2666 SmallVector<uint64_t, 64> Record;
2672void ModuleBitcodeWriter::pushGlobalMetadataAttachment(
2673 SmallVectorImpl<uint64_t> &Record,
const GlobalObject &GO) {
2677 for (
const auto &
I : MDs) {
2683void ModuleBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
2686 SmallVector<uint64_t, 64> Record;
2688 if (
F.hasMetadata()) {
2689 pushGlobalMetadataAttachment(Record,
F);
2697 for (
const BasicBlock &BB :
F)
2698 for (
const Instruction &
I : BB) {
2700 I.getAllMetadataOtherThanDebugLoc(MDs);
2703 if (MDs.
empty())
continue;
2707 for (
const auto &[
ID, MD] : MDs) {
2718void ModuleBitcodeWriter::writeModuleMetadataKinds() {
2719 SmallVector<uint64_t, 64> Record;
2724 M.getMDKindNames(Names);
2726 if (Names.
empty())
return;
2730 for (
unsigned MDKindID = 0, e = Names.
size(); MDKindID != e; ++MDKindID) {
2732 StringRef KName = Names[MDKindID];
2742void ModuleBitcodeWriter::writeOperandBundleTags() {
2750 M.getOperandBundleTags(Tags);
2757 SmallVector<uint64_t, 64> Record;
2759 for (
auto Tag : Tags) {
2769void ModuleBitcodeWriter::writeSyncScopeNames() {
2771 M.getContext().getSyncScopeNames(SSNs);
2777 SmallVector<uint64_t, 64> Record;
2778 for (
auto SSN : SSNs) {
2779 Record.
append(SSN.begin(), SSN.end());
2787void ModuleBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
2789 if (FirstVal == LastVal)
return;
2793 unsigned AggregateAbbrev = 0;
2794 unsigned String8Abbrev = 0;
2795 unsigned CString7Abbrev = 0;
2796 unsigned CString6Abbrev = 0;
2800 auto Abbv = std::make_shared<BitCodeAbbrev>();
2804 AggregateAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2807 Abbv = std::make_shared<BitCodeAbbrev>();
2811 String8Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2813 Abbv = std::make_shared<BitCodeAbbrev>();
2817 CString7Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2819 Abbv = std::make_shared<BitCodeAbbrev>();
2823 CString6Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2826 SmallVector<uint64_t, 64> Record;
2829 Type *LastTy =
nullptr;
2830 for (
unsigned i = FirstVal; i != LastVal; ++i) {
2831 const Value *
V = Vals[i].first;
2833 if (
V->getType() != LastTy) {
2834 LastTy =
V->getType();
2837 CONSTANTS_SETTYPE_ABBREV);
2844 unsigned(
IA->hasSideEffects()) |
unsigned(
IA->isAlignStack()) << 1 |
2845 unsigned(
IA->getDialect() & 1) << 2 |
unsigned(
IA->canThrow()) << 3);
2848 StringRef AsmStr =
IA->getAsmString();
2853 StringRef ConstraintStr =
IA->getConstraintString();
2861 unsigned Code = -1U;
2862 unsigned AbbrevToUse = 0;
2863 if (
C->isNullValue()) {
2870 if (
IV->getBitWidth() <= 64) {
2871 uint64_t
V =
IV->getSExtValue();
2874 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2884 Record.
push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2888 APInt api = CFP->getValueAPF().bitcastToAPInt();
2890 Record.
push_back((p[1] << 48) | (p[0] >> 16));
2893 APInt api = CFP->getValueAPF().bitcastToAPInt();
2898 assert(0 &&
"Unknown FP type!");
2904 uint64_t NumElts = Str->getNumElements();
2906 if (Str->isCString()) {
2911 AbbrevToUse = String8Abbrev;
2915 for (uint64_t i = 0; i != NumElts; ++i) {
2916 unsigned char V = Str->getElementAsInteger(i);
2918 isCStr7 &= (
V & 128) == 0;
2924 AbbrevToUse = CString6Abbrev;
2926 AbbrevToUse = CString7Abbrev;
2927 }
else if (
const ConstantDataSequential *CDS =
2930 Type *EltTy = CDS->getElementType();
2932 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
2933 Record.
push_back(CDS->getElementAsInteger(i));
2935 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
2937 CDS->getElementAsAPFloat(i).bitcastToAPInt().getLimitedValue());
2941 for (
const Value *
Op :
C->operands())
2943 AbbrevToUse = AggregateAbbrev;
2945 switch (
CE->getOpcode()) {
2952 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2954 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
2964 case Instruction::FNeg: {
2965 assert(
CE->getNumOperands() == 1 &&
"Unknown constant expr!");
2974 case Instruction::GetElementPtr: {
2979 if (std::optional<ConstantRange>
Range = GO->getInRange()) {
2983 for (
const Value *
Op :
CE->operands()) {
2989 case Instruction::ExtractElement:
2996 case Instruction::InsertElement:
3003 case Instruction::ShuffleVector:
3008 if (
C->getType() ==
C->getOperand(0)->getType()) {
3044 Stream.
EmitRecord(Code, Record, AbbrevToUse);
3051void ModuleBitcodeWriter::writeModuleConstants() {
3056 for (
unsigned i = 0, e = Vals.size(); i != e; ++i) {
3058 writeConstants(i, Vals.size(),
true);
3072bool ModuleBitcodeWriter::pushValueAndType(
const Value *V,
unsigned InstID,
3073 SmallVectorImpl<unsigned> &Vals) {
3077 if (ValID >= InstID) {
3084bool ModuleBitcodeWriter::pushValueOrMetadata(
const Value *V,
unsigned InstID,
3085 SmallVectorImpl<unsigned> &Vals) {
3086 bool IsMetadata =
V->getType()->isMetadataTy();
3094 return pushValueAndType(V, InstID, Vals);
3097void ModuleBitcodeWriter::writeOperandBundles(
const CallBase &CS,
3104 Record.
push_back(
C.getOperandBundleTagID(Bundle.getTagName()));
3106 for (
auto &Input : Bundle.Inputs)
3107 pushValueOrMetadata(Input, InstID, Record);
3116void ModuleBitcodeWriter::pushValue(
const Value *V,
unsigned InstID,
3117 SmallVectorImpl<unsigned> &Vals) {
3122void ModuleBitcodeWriter::pushValueSigned(
const Value *V,
unsigned InstID,
3123 SmallVectorImpl<uint64_t> &Vals) {
3125 int64_t diff = ((int32_t)InstID - (int32_t)ValID);
3130void ModuleBitcodeWriter::writeInstruction(
const Instruction &
I,
3132 SmallVectorImpl<unsigned> &Vals) {
3134 unsigned AbbrevToUse = 0;
3136 switch (
I.getOpcode()) {
3140 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3141 AbbrevToUse = FUNCTION_INST_CAST_ABBREV;
3146 if (AbbrevToUse == FUNCTION_INST_CAST_ABBREV)
3147 AbbrevToUse = FUNCTION_INST_CAST_FLAGS_ABBREV;
3153 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3154 AbbrevToUse = FUNCTION_INST_BINOP_ABBREV;
3155 pushValue(
I.getOperand(1), InstID, Vals);
3159 if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV)
3160 AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV;
3165 case Instruction::FNeg: {
3167 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3168 AbbrevToUse = FUNCTION_INST_UNOP_ABBREV;
3172 if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV)
3173 AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV;
3178 case Instruction::GetElementPtr: {
3180 AbbrevToUse = FUNCTION_INST_GEP_ABBREV;
3184 for (
const Value *
Op :
I.operands())
3185 pushValueAndType(
Op, InstID, Vals);
3188 case Instruction::ExtractValue: {
3190 pushValueAndType(
I.getOperand(0), InstID, Vals);
3195 case Instruction::InsertValue: {
3197 pushValueAndType(
I.getOperand(0), InstID, Vals);
3198 pushValueAndType(
I.getOperand(1), InstID, Vals);
3203 case Instruction::Select: {
3205 pushValueAndType(
I.getOperand(1), InstID, Vals);
3206 pushValue(
I.getOperand(2), InstID, Vals);
3207 pushValueAndType(
I.getOperand(0), InstID, Vals);
3213 case Instruction::ExtractElement:
3215 pushValueAndType(
I.getOperand(0), InstID, Vals);
3216 pushValueAndType(
I.getOperand(1), InstID, Vals);
3218 case Instruction::InsertElement:
3220 pushValueAndType(
I.getOperand(0), InstID, Vals);
3221 pushValue(
I.getOperand(1), InstID, Vals);
3222 pushValueAndType(
I.getOperand(2), InstID, Vals);
3224 case Instruction::ShuffleVector:
3226 pushValueAndType(
I.getOperand(0), InstID, Vals);
3227 pushValue(
I.getOperand(1), InstID, Vals);
3231 case Instruction::ICmp:
3232 case Instruction::FCmp: {
3235 AbbrevToUse = FUNCTION_INST_CMP_ABBREV;
3236 if (pushValueAndType(
I.getOperand(0), InstID, Vals))
3238 pushValue(
I.getOperand(1), InstID, Vals);
3244 AbbrevToUse = FUNCTION_INST_CMP_FLAGS_ABBREV;
3249 case Instruction::Ret:
3252 unsigned NumOperands =
I.getNumOperands();
3253 if (NumOperands == 0)
3254 AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV;
3255 else if (NumOperands == 1) {
3256 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3257 AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV;
3259 for (
const Value *
Op :
I.operands())
3260 pushValueAndType(
Op, InstID, Vals);
3264 case Instruction::Br:
3267 AbbrevToUse = FUNCTION_INST_BR_UNCOND_ABBREV;
3270 if (
II.isConditional()) {
3272 pushValue(
II.getCondition(), InstID, Vals);
3273 AbbrevToUse = FUNCTION_INST_BR_COND_ABBREV;
3277 case Instruction::Switch:
3282 pushValue(
SI.getCondition(), InstID, Vals);
3284 for (
auto Case :
SI.cases()) {
3290 case Instruction::IndirectBr:
3294 pushValue(
I.getOperand(0), InstID, Vals);
3299 case Instruction::Invoke: {
3302 FunctionType *FTy =
II->getFunctionType();
3304 if (
II->hasOperandBundles())
3305 writeOperandBundles(*
II, InstID);
3314 pushValueAndType(Callee, InstID, Vals);
3317 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3318 pushValue(
I.getOperand(i), InstID, Vals);
3321 if (FTy->isVarArg()) {
3322 for (
unsigned i = FTy->getNumParams(), e =
II->arg_size(); i != e; ++i)
3323 pushValueAndType(
I.getOperand(i), InstID, Vals);
3327 case Instruction::Resume:
3329 pushValueAndType(
I.getOperand(0), InstID, Vals);
3331 case Instruction::CleanupRet: {
3334 pushValue(CRI.getCleanupPad(), InstID, Vals);
3335 if (CRI.hasUnwindDest())
3339 case Instruction::CatchRet: {
3342 pushValue(CRI.getCatchPad(), InstID, Vals);
3346 case Instruction::CleanupPad:
3347 case Instruction::CatchPad: {
3351 pushValue(FuncletPad.getParentPad(), InstID, Vals);
3353 unsigned NumArgOperands = FuncletPad.arg_size();
3355 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op)
3356 pushValueAndType(FuncletPad.getArgOperand(
Op), InstID, Vals);
3359 case Instruction::CatchSwitch: {
3363 pushValue(CatchSwitch.getParentPad(), InstID, Vals);
3365 unsigned NumHandlers = CatchSwitch.getNumHandlers();
3367 for (
const BasicBlock *CatchPadBB : CatchSwitch.handlers())
3370 if (CatchSwitch.hasUnwindDest())
3374 case Instruction::CallBr: {
3380 writeOperandBundles(*CBI, InstID);
3395 pushValueAndType(Callee, InstID, Vals);
3398 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3399 pushValue(
I.getOperand(i), InstID, Vals);
3402 if (FTy->isVarArg()) {
3403 for (
unsigned i = FTy->getNumParams(), e = CBI->
arg_size(); i != e; ++i)
3404 pushValueAndType(
I.getOperand(i), InstID, Vals);
3408 case Instruction::Unreachable:
3410 AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;
3413 case Instruction::PHI: {
3431 Stream.
EmitRecord(Code, Vals64, AbbrevToUse);
3436 case Instruction::LandingPad: {
3447 pushValueAndType(LP.
getClause(
I), InstID, Vals);
3452 case Instruction::Alloca: {
3458 using APV = AllocaPackedValues;
3459 unsigned Record = 0;
3460 unsigned EncodedAlign = getEncodedAlign(AI.
getAlign());
3462 Record, EncodedAlign & ((1 << APV::AlignLower::Bits) - 1));
3464 EncodedAlign >> APV::AlignLower::Bits);
3471 if (AS !=
M.getDataLayout().getAllocaAddrSpace())
3476 case Instruction::Load:
3479 pushValueAndType(
I.getOperand(0), InstID, Vals);
3482 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3483 AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;
3493 case Instruction::Store:
3498 AbbrevToUse = FUNCTION_INST_STORE_ABBREV;
3500 if (pushValueAndType(
I.getOperand(1), InstID, Vals))
3502 if (pushValueAndType(
I.getOperand(0), InstID, Vals))
3512 case Instruction::AtomicCmpXchg:
3514 pushValueAndType(
I.getOperand(0), InstID, Vals);
3515 pushValueAndType(
I.getOperand(1), InstID, Vals);
3516 pushValue(
I.getOperand(2), InstID, Vals);
3527 case Instruction::AtomicRMW:
3529 pushValueAndType(
I.getOperand(0), InstID, Vals);
3530 pushValueAndType(
I.getOperand(1), InstID, Vals);
3539 case Instruction::Fence:
3544 case Instruction::Call: {
3549 writeOperandBundles(CI, InstID);
3569 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3573 if (FTy->isVarArg()) {
3574 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
3579 case Instruction::VAArg:
3582 pushValue(
I.getOperand(0), InstID, Vals);
3585 case Instruction::Freeze:
3587 pushValueAndType(
I.getOperand(0), InstID, Vals);
3597void ModuleBitcodeWriter::writeGlobalValueSymbolTable(
3598 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3603 VSTOffset -= bitcodeStartBit();
3604 assert((VSTOffset & 31) == 0 &&
"VST block not 32-bit aligned");
3608 Stream.
BackpatchWord(VSTOffsetPlaceholder, VSTOffset / 32 + 1);
3612 auto Abbv = std::make_shared<BitCodeAbbrev>();
3616 unsigned FnEntryAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
3618 for (
const Function &
F : M) {
3621 if (
F.isDeclaration())
3628 uint64_t BitcodeIndex = FunctionToBitcodeIndex[&
F] - bitcodeStartBit();
3629 assert((BitcodeIndex & 31) == 0 &&
"function block not 32-bit aligned");
3633 Record[1] = BitcodeIndex / 32 + 1;
3642void ModuleBitcodeWriter::writeFunctionLevelValueSymbolTable(
3643 const ValueSymbolTable &VST) {
3651 SmallVector<uint64_t, 64> NameVals;
3657 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
3666 AbbrevToUse = VST_BBENTRY_6_ABBREV;
3670 AbbrevToUse = VST_ENTRY_6_ABBREV;
3672 AbbrevToUse = VST_ENTRY_7_ABBREV;
3675 for (
const auto P :
Name.getKey())
3679 Stream.
EmitRecord(Code, NameVals, AbbrevToUse);
3686void ModuleBitcodeWriter::writeUseList(UseListOrder &&Order) {
3687 assert(Order.Shuffle.size() >= 2 &&
"Shuffle too small");
3694 SmallVector<uint64_t, 64> Record(Order.Shuffle.begin(), Order.Shuffle.end());
3699void ModuleBitcodeWriter::writeUseListBlock(
const Function *
F) {
3701 "Expected to be preserving use-list order");
3703 auto hasMore = [&]() {
3719void ModuleBitcodeWriter::writeFunction(
3721 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3738 unsigned CstStart, CstEnd;
3740 writeConstants(CstStart, CstEnd,
false);
3743 writeFunctionMetadata(
F);
3746 unsigned InstID = CstEnd;
3748 bool NeedsMetadataAttachment =
F.hasMetadata();
3750 DILocation *LastDL =
nullptr;
3751 SmallSetVector<Function *, 4> BlockAddressUsers;
3754 for (
const BasicBlock &BB :
F) {
3755 for (
const Instruction &
I : BB) {
3756 writeInstruction(
I, InstID, Vals);
3758 if (!
I.getType()->isVoidTy())
3762 NeedsMetadataAttachment |=
I.hasMetadataOtherThanDebugLoc();
3765 if (DILocation *
DL =
I.getDebugLoc()) {
3778 FUNCTION_DEBUG_LOC_ABBREV);
3788 if (
I.hasDbgRecords()) {
3792 auto PushValueOrMetadata = [&Vals, InstID,
3795 "RawLocation unexpectedly null in DbgVariableRecord");
3797 SmallVector<unsigned, 2> ValAndType;
3801 if (!pushValueAndType(VAM->getValue(), InstID, ValAndType)) {
3815 for (DbgRecord &DR :
I.DebugMarker->getDbgRecordRange()) {
3841 FUNCTION_DEBUG_RECORD_VALUE_ABBREV);
3865 SmallPtrSet<Value *, 8> Visited{BA};
3866 while (!Worklist.
empty()) {
3868 for (User *U :
V->users()) {
3874 Visited.
insert(U).second)
3881 if (!BlockAddressUsers.
empty()) {
3890 if (
auto *Symtab =
F.getValueSymbolTable())
3891 writeFunctionLevelValueSymbolTable(*Symtab);
3893 if (NeedsMetadataAttachment)
3894 writeFunctionMetadataAttachment(
F);
3896 writeUseListBlock(&
F);
3902void ModuleBitcodeWriter::writeBlockInfo() {
3915 auto Abbv = std::make_shared<BitCodeAbbrev>();
3926 auto Abbv = std::make_shared<BitCodeAbbrev>();
3936 auto Abbv = std::make_shared<BitCodeAbbrev>();
3946 auto Abbv = std::make_shared<BitCodeAbbrev>();
3952 VST_BBENTRY_6_ABBREV)
3957 auto Abbv = std::make_shared<BitCodeAbbrev>();
3959 Abbv->Add(TypeAbbrevOp);
3961 CONSTANTS_SETTYPE_ABBREV)
3966 auto Abbv = std::make_shared<BitCodeAbbrev>();
3970 CONSTANTS_INTEGER_ABBREV)
3975 auto Abbv = std::make_shared<BitCodeAbbrev>();
3983 CONSTANTS_CE_CAST_Abbrev)
3987 auto Abbv = std::make_shared<BitCodeAbbrev>();
3990 CONSTANTS_NULL_Abbrev)
3997 auto Abbv = std::make_shared<BitCodeAbbrev>();
3999 Abbv->Add(ValAbbrevOp);
4000 Abbv->Add(TypeAbbrevOp);
4004 FUNCTION_INST_LOAD_ABBREV)
4008 auto Abbv = std::make_shared<BitCodeAbbrev>();
4010 Abbv->Add(ValAbbrevOp);
4011 Abbv->Add(ValAbbrevOp);
4015 FUNCTION_INST_STORE_ABBREV)
4019 auto Abbv = std::make_shared<BitCodeAbbrev>();
4021 Abbv->Add(ValAbbrevOp);
4024 FUNCTION_INST_UNOP_ABBREV)
4028 auto Abbv = std::make_shared<BitCodeAbbrev>();
4030 Abbv->Add(ValAbbrevOp);
4034 FUNCTION_INST_UNOP_FLAGS_ABBREV)
4038 auto Abbv = std::make_shared<BitCodeAbbrev>();
4040 Abbv->Add(ValAbbrevOp);
4041 Abbv->Add(ValAbbrevOp);
4044 FUNCTION_INST_BINOP_ABBREV)
4048 auto Abbv = std::make_shared<BitCodeAbbrev>();
4050 Abbv->Add(ValAbbrevOp);
4051 Abbv->Add(ValAbbrevOp);
4055 FUNCTION_INST_BINOP_FLAGS_ABBREV)
4059 auto Abbv = std::make_shared<BitCodeAbbrev>();
4061 Abbv->Add(ValAbbrevOp);
4062 Abbv->Add(TypeAbbrevOp);
4065 FUNCTION_INST_CAST_ABBREV)
4069 auto Abbv = std::make_shared<BitCodeAbbrev>();
4071 Abbv->Add(ValAbbrevOp);
4072 Abbv->Add(TypeAbbrevOp);
4076 FUNCTION_INST_CAST_FLAGS_ABBREV)
4081 auto Abbv = std::make_shared<BitCodeAbbrev>();
4084 FUNCTION_INST_RET_VOID_ABBREV)
4088 auto Abbv = std::make_shared<BitCodeAbbrev>();
4090 Abbv->Add(ValAbbrevOp);
4092 FUNCTION_INST_RET_VAL_ABBREV)
4096 auto Abbv = std::make_shared<BitCodeAbbrev>();
4099 Abbv->Add(ValAbbrevOp);
4101 FUNCTION_INST_BR_UNCOND_ABBREV)
4105 auto Abbv = std::make_shared<BitCodeAbbrev>();
4108 Abbv->Add(ValAbbrevOp);
4109 Abbv->Add(ValAbbrevOp);
4110 Abbv->Add(ValAbbrevOp);
4112 FUNCTION_INST_BR_COND_ABBREV)
4116 auto Abbv = std::make_shared<BitCodeAbbrev>();
4119 FUNCTION_INST_UNREACHABLE_ABBREV)
4123 auto Abbv = std::make_shared<BitCodeAbbrev>();
4126 Abbv->Add(TypeAbbrevOp);
4128 Abbv->Add(ValAbbrevOp);
4130 FUNCTION_INST_GEP_ABBREV)
4134 auto Abbv = std::make_shared<BitCodeAbbrev>();
4136 Abbv->Add(ValAbbrevOp);
4137 Abbv->Add(ValAbbrevOp);
4140 FUNCTION_INST_CMP_ABBREV)
4144 auto Abbv = std::make_shared<BitCodeAbbrev>();
4146 Abbv->Add(ValAbbrevOp);
4147 Abbv->Add(ValAbbrevOp);
4151 FUNCTION_INST_CMP_FLAGS_ABBREV)
4155 auto Abbv = std::make_shared<BitCodeAbbrev>();
4160 Abbv->Add(ValAbbrevOp);
4162 FUNCTION_DEBUG_RECORD_VALUE_ABBREV)
4166 auto Abbv = std::make_shared<BitCodeAbbrev>();
4177 FUNCTION_DEBUG_LOC_ABBREV)
4185void IndexBitcodeWriter::writeModStrings() {
4191 auto Abbv = std::make_shared<BitCodeAbbrev>();
4196 unsigned Abbrev8Bit = Stream.
EmitAbbrev(std::move(Abbv));
4199 Abbv = std::make_shared<BitCodeAbbrev>();
4204 unsigned Abbrev7Bit = Stream.
EmitAbbrev(std::move(Abbv));
4207 Abbv = std::make_shared<BitCodeAbbrev>();
4212 unsigned Abbrev6Bit = Stream.
EmitAbbrev(std::move(Abbv));
4215 Abbv = std::make_shared<BitCodeAbbrev>();
4222 unsigned AbbrevHash = Stream.
EmitAbbrev(std::move(Abbv));
4225 forEachModule([&](
const StringMapEntry<ModuleHash> &MPSE) {
4227 const auto &Hash = MPSE.
getValue();
4229 unsigned AbbrevToUse = Abbrev8Bit;
4231 AbbrevToUse = Abbrev6Bit;
4233 AbbrevToUse = Abbrev7Bit;
4235 auto ModuleId = ModuleIdMap.
size();
4236 ModuleIdMap[
Key] = ModuleId;
4245 Vals.
assign(Hash.begin(), Hash.end());
4257template <
typename Fn>
4261 if (!FS->type_tests().empty())
4266 auto WriteVFuncIdVec = [&](
uint64_t Ty,
4271 for (
auto &VF : VFs) {
4272 Record.push_back(VF.GUID);
4273 Record.push_back(VF.Offset);
4279 FS->type_test_assume_vcalls());
4281 FS->type_checked_load_vcalls());
4283 auto WriteConstVCallVec = [&](
uint64_t Ty,
4285 for (
auto &VC : VCs) {
4287 Record.push_back(VC.VFunc.GUID);
4288 Record.push_back(VC.VFunc.Offset);
4295 FS->type_test_assume_const_vcalls());
4297 FS->type_checked_load_const_vcalls());
4307 if (!FS->paramAccesses().empty()) {
4309 for (
auto &Arg : FS->paramAccesses()) {
4310 size_t UndoSize =
Record.size();
4311 Record.push_back(Arg.ParamNo);
4312 WriteRange(Arg.Use);
4313 Record.push_back(Arg.Calls.size());
4314 for (
auto &
Call : Arg.Calls) {
4316 std::optional<unsigned> ValueID = GetValueID(
Call.Callee);
4323 Record.push_back(*ValueID);
4324 WriteRange(
Call.Offsets);
4335 std::set<GlobalValue::GUID> &ReferencedTypeIds) {
4336 if (!FS->type_tests().empty())
4337 for (
auto &TT : FS->type_tests())
4338 ReferencedTypeIds.insert(TT);
4340 auto GetReferencedTypesFromVFuncIdVec =
4342 for (
auto &VF : VFs)
4343 ReferencedTypeIds.insert(VF.GUID);
4346 GetReferencedTypesFromVFuncIdVec(FS->type_test_assume_vcalls());
4347 GetReferencedTypesFromVFuncIdVec(FS->type_checked_load_vcalls());
4349 auto GetReferencedTypesFromConstVCallVec =
4351 for (
auto &VC : VCs)
4352 ReferencedTypeIds.insert(VC.VFunc.GUID);
4355 GetReferencedTypesFromConstVCallVec(FS->type_test_assume_const_vcalls());
4356 GetReferencedTypesFromConstVCallVec(FS->type_checked_load_const_vcalls());
4392 NameVals.
push_back(Summary.TTRes.TheKind);
4393 NameVals.
push_back(Summary.TTRes.SizeM1BitWidth);
4394 NameVals.
push_back(Summary.TTRes.AlignLog2);
4395 NameVals.
push_back(Summary.TTRes.SizeM1);
4396 NameVals.
push_back(Summary.TTRes.BitMask);
4397 NameVals.
push_back(Summary.TTRes.InlineBits);
4399 for (
auto &W : Summary.WPDRes)
4411 for (
auto &
P : Summary) {
4413 NameVals.
push_back(
VE.getValueID(
P.VTableVI.getValue()));
4427 static_assert(std::is_same_v<LinearFrameId, unsigned>);
4428 for (
auto &AI : FS->allocs()) {
4429 for (
auto &MIB : AI.MIBs) {
4431 StackIdIndices.
reserve(MIB.StackIdIndices.size());
4432 for (
auto Id : MIB.StackIdIndices)
4433 StackIdIndices.
push_back(GetStackIndex(Id));
4435 CallStacks.insert({CallStacks.size(), StackIdIndices});
4448 assert(!CallStacks.empty());
4454 Builder.
build(std::move(CallStacks),
nullptr,
4458 return Builder.takeCallStackPos();
4463 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
bool PerModule,
4464 std::function<
unsigned(
const ValueInfo &VI)> GetValueID,
4465 std::function<
unsigned(
unsigned)> GetStackIndex,
4466 bool WriteContextSizeInfoIndex,
4471 for (
auto &CI : FS->callsites()) {
4475 assert(!PerModule || (CI.Clones.size() == 1 && CI.Clones[0] == 0));
4476 Record.push_back(GetValueID(CI.Callee));
4478 Record.push_back(CI.StackIdIndices.size());
4479 Record.push_back(CI.Clones.size());
4481 for (
auto Id : CI.StackIdIndices)
4482 Record.push_back(GetStackIndex(Id));
4490 for (
auto &AI : FS->allocs()) {
4494 assert(!PerModule || (AI.Versions.size() == 1 && AI.Versions[0] == 0));
4495 Record.push_back(AI.MIBs.size());
4497 Record.push_back(AI.Versions.size());
4498 for (
auto &MIB : AI.MIBs) {
4505 assert(CallStackCount <= CallStackPos.
size());
4506 Record.push_back(CallStackPos[CallStackCount++]);
4511 assert(AI.ContextSizeInfos.empty() ||
4512 AI.ContextSizeInfos.size() == AI.MIBs.size());
4514 if (WriteContextSizeInfoIndex && !AI.ContextSizeInfos.empty()) {
4522 ContextIds.
reserve(AI.ContextSizeInfos.size() * 2);
4523 for (
auto &Infos : AI.ContextSizeInfos) {
4524 Record.push_back(Infos.size());
4525 for (
auto [FullStackId, TotalSize] : Infos) {
4532 Record.push_back(TotalSize);
4550void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
4551 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
4552 unsigned ValueID,
unsigned FSCallsRelBFAbbrev,
4553 unsigned FSCallsProfileAbbrev,
unsigned CallsiteAbbrev,
4554 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
const Function &
F,
4555 DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
4562 Stream, FS, [&](
const ValueInfo &VI) -> std::optional<unsigned> {
4567 Stream, FS, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,
4569 [&](
const ValueInfo &VI) {
return getValueId(VI); },
4570 [&](
unsigned I) {
return I; },
4571 true, CallStackPos, CallStackCount);
4573 auto SpecialRefCnts =
FS->specialRefCounts();
4578 NameVals.
push_back(SpecialRefCnts.first);
4579 NameVals.
push_back(SpecialRefCnts.second);
4581 for (
auto &RI :
FS->refs())
4584 const bool UseRelBFRecord =
4587 for (
auto &ECI :
FS->calls()) {
4588 NameVals.
push_back(getValueId(ECI.first));
4596 (UseRelBFRecord ? FSCallsRelBFAbbrev : FSCallsProfileAbbrev);
4607void ModuleBitcodeWriterBase::writeModuleLevelReferences(
4608 const GlobalVariable &V, SmallVector<uint64_t, 64> &NameVals,
4609 unsigned FSModRefsAbbrev,
unsigned FSModVTableRefsAbbrev) {
4610 auto VI =
Index->getValueInfo(
V.getGUID());
4611 if (!VI ||
VI.getSummaryList().empty()) {
4617 auto *
Summary =
VI.getSummaryList()[0].get();
4623 auto VTableFuncs =
VS->vTableFuncs();
4624 if (!VTableFuncs.empty())
4627 unsigned SizeBeforeRefs = NameVals.
size();
4628 for (
auto &RI :
VS->refs())
4634 if (VTableFuncs.empty())
4639 for (
auto &
P : VTableFuncs) {
4645 FSModVTableRefsAbbrev);
4652void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
4655 bool IsThinLTO =
true;
4658 IsThinLTO = MD->getZExtValue();
4670 if (
Index->enableSplitLTOUnit())
4672 if (
Index->hasUnifiedLTO())
4682 auto Abbv = std::make_shared<BitCodeAbbrev>();
4688 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4690 for (
const auto &GVI : valueIds()) {
4692 ArrayRef<uint32_t>{GVI.second,
4693 static_cast<uint32_t
>(GVI.first >> 32),
4694 static_cast<uint32_t
>(GVI.first)},
4698 if (!
Index->stackIds().empty()) {
4699 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4706 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4707 SmallVector<uint32_t> Vals;
4709 for (
auto Id :
Index->stackIds()) {
4710 Vals.
push_back(
static_cast<uint32_t
>(Id >> 32));
4711 Vals.
push_back(
static_cast<uint32_t
>(Id));
4716 unsigned ContextIdAbbvId = 0;
4719 auto ContextIdAbbv = std::make_shared<BitCodeAbbrev>();
4731 ContextIdAbbvId = Stream.
EmitAbbrev(std::move(ContextIdAbbv));
4735 Abbv = std::make_shared<BitCodeAbbrev>();
4747 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4750 Abbv = std::make_shared<BitCodeAbbrev>();
4762 unsigned FSCallsRelBFAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4765 Abbv = std::make_shared<BitCodeAbbrev>();
4771 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4774 Abbv = std::make_shared<BitCodeAbbrev>();
4782 unsigned FSModVTableRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4785 Abbv = std::make_shared<BitCodeAbbrev>();
4790 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4793 Abbv = std::make_shared<BitCodeAbbrev>();
4800 unsigned TypeIdCompatibleVtableAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4802 Abbv = std::make_shared<BitCodeAbbrev>();
4808 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4810 Abbv = std::make_shared<BitCodeAbbrev>();
4817 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4819 Abbv = std::make_shared<BitCodeAbbrev>();
4824 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4831 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
4832 for (
const Function &
F : M) {
4838 ValueInfo
VI =
Index->getValueInfo(
F.getGUID());
4839 if (!VI ||
VI.getSummaryList().empty()) {
4845 auto *
Summary =
VI.getSummaryList()[0].get();
4848 FS, [](
unsigned I) {
return I; }, CallStacks);
4852 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
4853 if (!CallStacks.
empty()) {
4861 SmallVector<uint64_t, 64> NameVals;
4864 for (
const Function &
F : M) {
4870 ValueInfo
VI =
Index->getValueInfo(
F.getGUID());
4871 if (!VI ||
VI.getSummaryList().empty()) {
4877 auto *
Summary =
VI.getSummaryList()[0].get();
4878 writePerModuleFunctionSummaryRecord(
4879 NameVals, Summary, VE.
getValueID(&
F), FSCallsRelBFAbbrev,
4880 FSCallsProfileAbbrev, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,
F,
4881 CallStackPos, CallStackCount);
4886 for (
const GlobalVariable &
G :
M.globals())
4887 writeModuleLevelReferences(
G, NameVals, FSModRefsAbbrev,
4888 FSModVTableRefsAbbrev);
4890 for (
const GlobalAlias &
A :
M.aliases()) {
4891 auto *Aliasee =
A.getAliaseeObject();
4907 for (
auto &S :
Index->typeIdCompatibleVtableMap()) {
4911 TypeIdCompatibleVtableAbbrev);
4915 if (
Index->getBlockCount())
4917 ArrayRef<uint64_t>{
Index->getBlockCount()});
4923void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
4932 auto Abbv = std::make_shared<BitCodeAbbrev>();
4938 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4940 for (
const auto &GVI : valueIds()) {
4942 ArrayRef<uint32_t>{GVI.second,
4943 static_cast<uint32_t
>(GVI.first >> 32),
4944 static_cast<uint32_t
>(GVI.first)},
4950 if (!StackIds.empty()) {
4951 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4958 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4959 SmallVector<uint32_t> Vals;
4960 Vals.
reserve(StackIds.size() * 2);
4961 for (
auto Id : StackIds) {
4962 Vals.
push_back(
static_cast<uint32_t
>(Id >> 32));
4963 Vals.
push_back(
static_cast<uint32_t
>(Id));
4969 Abbv = std::make_shared<BitCodeAbbrev>();
4983 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4986 Abbv = std::make_shared<BitCodeAbbrev>();
4993 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4996 Abbv = std::make_shared<BitCodeAbbrev>();
5002 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5004 Abbv = std::make_shared<BitCodeAbbrev>();
5012 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5014 Abbv = std::make_shared<BitCodeAbbrev>();
5025 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5027 auto shouldImportValueAsDecl = [&](GlobalValueSummary *GVS) ->
bool {
5028 if (DecSummaries ==
nullptr)
5030 return DecSummaries->count(GVS);
5038 DenseMap<const GlobalValueSummary *, unsigned> SummaryToValueIdMap;
5040 SmallVector<uint64_t, 64> NameVals;
5044 std::set<GlobalValue::GUID> ReferencedTypeIds;
5048 auto MaybeEmitOriginalName = [&](GlobalValueSummary &S) {
5058 NameVals.
push_back(S.getOriginalName());
5063 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
5065 Abbv = std::make_shared<BitCodeAbbrev>();
5070 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5077 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
5078 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
5084 GlobalValueSummary *S =
I.second;
5097 return StackIdIndicesToIndex[
I];
5103 if (!CallStacks.
empty()) {
5113 DenseSet<GlobalValue::GUID> DefOrUseGUIDs;
5114 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
5115 GlobalValueSummary *S =
I.second;
5117 DefOrUseGUIDs.
insert(
I.first);
5118 for (
const ValueInfo &VI : S->
refs())
5119 DefOrUseGUIDs.
insert(
VI.getGUID());
5121 auto ValueId = getValueId(
I.first);
5123 SummaryToValueIdMap[S] = *ValueId;
5141 NameVals.
push_back(ModuleIdMap[
VS->modulePath()]);
5145 for (
auto &RI :
VS->refs()) {
5146 auto RefValueId = getValueId(RI.getGUID());
5156 MaybeEmitOriginalName(*S);
5160 auto GetValueId = [&](
const ValueInfo &
VI) -> std::optional<unsigned> {
5162 return std::nullopt;
5163 return getValueId(
VI.getGUID());
5171 Stream, FS, CallsiteAbbrev, AllocAbbrev, 0,
5174 [&](
const ValueInfo &VI) ->
unsigned {
5175 std::optional<unsigned> ValueID = GetValueId(VI);
5190 return StackIdIndicesToIndex[
I];
5192 false, CallStackPos, CallStackCount);
5196 NameVals.
push_back(ModuleIdMap[
FS->modulePath()]);
5209 unsigned Count = 0, RORefCnt = 0, WORefCnt = 0;
5210 for (
auto &RI :
FS->refs()) {
5211 auto RefValueId = getValueId(RI.getGUID());
5215 if (RI.isReadOnly())
5217 else if (RI.isWriteOnly())
5221 NameVals[6] =
Count;
5222 NameVals[7] = RORefCnt;
5223 NameVals[8] = WORefCnt;
5225 for (
auto &EI :
FS->calls()) {
5228 std::optional<unsigned> CallValueId = GetValueId(EI.first);
5237 FSCallsProfileAbbrev);
5239 MaybeEmitOriginalName(*S);
5242 for (
auto *AS : Aliases) {
5243 auto AliasValueId = SummaryToValueIdMap[AS];
5250 auto AliaseeValueId = SummaryToValueIdMap[&AS->
getAliasee()];
5257 MaybeEmitOriginalName(*AS);
5264 auto EmitCfiFunctions = [&](
const CfiFunctionIndex &CfiIndex,
5266 if (CfiIndex.
empty())
5269 auto Defs = CfiIndex.
forGuid(GUID);
5272 if (Functions.
empty())
5275 for (
const auto &S : Functions) {
5289 for (
auto &
T : ReferencedTypeIds) {
5290 auto TidIter =
Index.typeIds().equal_range(
T);
5291 for (
const auto &[GUID, TypeIdPair] :
make_range(TidIter)) {
5299 if (
Index.getBlockCount())
5301 ArrayRef<uint64_t>{
Index.getBlockCount()});
5312 auto Abbv = std::make_shared<BitCodeAbbrev>();
5316 auto StringAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5318 "LLVM" LLVM_VERSION_STRING, StringAbbrev);
5321 Abbv = std::make_shared<BitCodeAbbrev>();
5324 auto EpochAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5330void ModuleBitcodeWriter::writeModuleHash(StringRef View) {
5335 Hasher.
update(ArrayRef<uint8_t>(
5336 reinterpret_cast<const uint8_t *
>(
View.data()),
View.size()));
5337 std::array<uint8_t, 20> Hash = Hasher.
result();
5338 for (
int Pos = 0; Pos < 20; Pos += 4) {
5351void ModuleBitcodeWriter::write() {
5359 writeModuleVersion();
5368 writeAttributeGroupTable();
5371 writeAttributeTable();
5380 writeModuleConstants();
5383 writeModuleMetadataKinds();
5386 writeModuleMetadata();
5390 writeUseListBlock(
nullptr);
5392 writeOperandBundleTags();
5393 writeSyncScopeNames();
5396 DenseMap<const Function *, uint64_t> FunctionToBitcodeIndex;
5397 for (
const Function &
F : M)
5398 if (!
F.isDeclaration())
5399 writeFunction(
F, FunctionToBitcodeIndex);
5404 writePerModuleGlobalValueSummary();
5406 writeGlobalValueSymbolTable(FunctionToBitcodeIndex);
5434 unsigned CPUType = ~0U;
5441 DARWIN_CPU_ARCH_ABI64 = 0x01000000,
5442 DARWIN_CPU_TYPE_X86 = 7,
5443 DARWIN_CPU_TYPE_ARM = 12,
5444 DARWIN_CPU_TYPE_POWERPC = 18
5449 CPUType = DARWIN_CPU_TYPE_X86 | DARWIN_CPU_ARCH_ABI64;
5451 CPUType = DARWIN_CPU_TYPE_X86;
5453 CPUType = DARWIN_CPU_TYPE_POWERPC;
5455 CPUType = DARWIN_CPU_TYPE_POWERPC | DARWIN_CPU_ARCH_ABI64;
5457 CPUType = DARWIN_CPU_TYPE_ARM;
5461 "Expected header size to be reserved");
5466 unsigned Position = 0;
5474 while (Buffer.
size() & 15)
5481 Stream.
Emit((
unsigned)
'B', 8);
5482 Stream.
Emit((
unsigned)
'C', 8);
5483 Stream.
Emit(0x0, 4);
5484 Stream.
Emit(0xC, 4);
5485 Stream.
Emit(0xE, 4);
5486 Stream.
Emit(0xD, 4);
5504 auto Abbv = std::make_shared<BitCodeAbbrev>();
5507 auto AbbrevNo = Stream->
EmitAbbrev(std::move(Abbv));
5515 assert(!WroteStrtab && !WroteSymtab);
5521 if (M->getModuleInlineAsm().empty())
5525 const Triple TT(M->getTargetTriple());
5527 if (!
T || !
T->hasMCAsmParser())
5549 std::vector<char> Strtab;
5550 StrtabBuilder.finalizeInOrder();
5551 Strtab.resize(StrtabBuilder.getSize());
5552 StrtabBuilder.write((
uint8_t *)Strtab.data());
5555 {Strtab.data(), Strtab.size()});
5566 bool ShouldPreserveUseListOrder,
5575 assert(M.isMaterialized());
5576 Mods.push_back(
const_cast<Module *
>(&M));
5578 ModuleBitcodeWriter ModuleWriter(M, StrtabBuilder, *Stream,
5579 ShouldPreserveUseListOrder, Index,
5580 GenerateHash, ModHash);
5581 ModuleWriter.write();
5588 IndexBitcodeWriter IndexWriter(*Stream, StrtabBuilder, *Index, DecSummaries,
5589 ModuleToSummariesForIndex);
5590 IndexWriter.write();
5595 bool ShouldPreserveUseListOrder,
5599 Writer.writeModule(M, ShouldPreserveUseListOrder, Index, GenerateHash,
5601 Writer.writeSymtab();
5602 Writer.writeStrtab();
5604 Triple TT(M.getTargetTriple());
5605 if (TT.isOSDarwin() || TT.isOSBinFormatMachO()) {
5623void IndexBitcodeWriter::write() {
5626 writeModuleVersion();
5632 writeCombinedGlobalValueSummary();
5649 Writer.
writeIndex(&Index, ModuleToSummariesForIndex, DecSummaries);
5658class ThinLinkBitcodeWriter :
public ModuleBitcodeWriterBase {
5668 : ModuleBitcodeWriterBase(M, StrtabBuilder, Stream,
5670 ModHash(&ModHash) {}
5675 void writeSimplifiedModuleInfo();
5685void ThinLinkBitcodeWriter::writeSimplifiedModuleInfo() {
5697 auto Abbv = std::make_shared<BitCodeAbbrev>();
5700 Abbv->Add(AbbrevOpToUse);
5701 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5703 for (
const auto P :
M.getSourceFileName())
5767void ThinLinkBitcodeWriter::write() {
5770 writeModuleVersion();
5772 writeSimplifiedModuleInfo();
5774 writePerModuleGlobalValueSummary();
5791 assert(M.isMaterialized());
5792 Mods.push_back(
const_cast<Module *
>(&M));
5794 ThinLinkBitcodeWriter ThinLinkWriter(M, StrtabBuilder, *Stream, Index,
5796 ThinLinkWriter.write();
5817 switch (
T.getObjectFormat()) {
5819 return "__LLVM,__bitcode";
5844 switch (
T.getObjectFormat()) {
5846 return "__LLVM,__cmdline";
5872 const std::vector<uint8_t> &CmdArgs) {
5877 Type *UsedElementType = Used ? Used->getValueType()->getArrayElementType()
5879 for (
auto *GV : UsedGlobals) {
5880 if (GV->getName() !=
"llvm.embedded.module" &&
5881 GV->getName() !=
"llvm.cmdline")
5886 Used->eraseFromParent();
5891 Triple T(M.getTargetTriple());
5920 M.getGlobalVariable(
"llvm.embedded.module",
true)) {
5921 assert(Old->hasZeroLiveUses() &&
5922 "llvm.embedded.module can only be used once in llvm.compiler.used");
5924 Old->eraseFromParent();
5926 GV->
setName(
"llvm.embedded.module");
5944 assert(Old->hasZeroLiveUses() &&
5945 "llvm.cmdline can only be used once in llvm.compiler.used");
5947 Old->eraseFromParent();
5953 if (UsedArray.
empty())
5961 NewUsed->setSection(
"llvm.metadata");
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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 writeDIFixedPointType(raw_ostream &Out, const DIFixedPointType *N, AsmWriterContext &WriterCtx)
static void writeDISubrangeType(raw_ostream &Out, const DISubrangeType *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 writeDIBasicType(raw_ostream &Out, const DIBasicType *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 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 cl::opt< bool > PreserveBitcodeUseListOrder("preserve-bc-uselistorder", cl::Hidden, cl::init(true), cl::desc("Preserve use-list order when writing LLVM bitcode."))
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)
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.
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 cl::opt< bool > CombinedIndexMemProfContext("combined-index-memprof-context", cl::Hidden, cl::init(true), cl::desc(""))
static unsigned getEncodedBinaryOpcode(unsigned Opcode)
static uint64_t getEncodedFFlags(FunctionSummary::FFlags Flags)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
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"))
Machine Check Debug Module
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
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 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.
const GlobalValueSummary & getAliasee() const
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 LLVM_ABI 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.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ 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.
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.
LLVM_ABI 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...
LLVM_ABI void writeIndex(const ModuleSummaryIndex *Index, const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex, const GVSummaryPtrSet *DecSummaries)
LLVM_ABI void copyStrtab(StringRef Strtab)
Copy the string table for another module into this bitcode file.
LLVM_ABI void writeStrtab()
Write the bitcode file's string table.
LLVM_ABI ~BitcodeWriter()
LLVM_ABI void writeSymtab()
Attempt to write a symbol table to the bitcode file.
LLVM_ABI 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.
LLVM_ABI 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.
static LLVM_ABI BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
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.
BasicBlock * getIndirectDest(unsigned i) const
BasicBlock * getDefaultDest() const
unsigned getNumIndirectDests() const
Return the number of callbr indirect dest labels.
bool isNoTailCall() const
bool isMustTailCall() const
iterator_range< NestedIterator > forGuid(GlobalValue::GUID GUID) 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 LLVM_ABI 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...
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
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.
This is an important base class in LLVM.
DebugLoc getDebugLoc() const
LLVM_ABI DIAssignID * getAssignID() const
DIExpression * getExpression() const
DILocalVariable * getVariable() const
bool isDbgDeclareValue() 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)
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.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
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
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
ThreadLocalMode getThreadLocalMode() const
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
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
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
idx_iterator idx_end() const
idx_iterator idx_begin() const
bool isCleanup() const
Return 'true' if this landingpad instruction is a cleanup.
unsigned getNumClauses() const
Get the number of clauses for this landing pad.
bool isCatch(unsigned Idx) const
Return 'true' if the clause and index Idx is a catch clause.
Constant * getClause(unsigned Idx) const
Get the value of the clause at index Idx.
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...
LLVM_ABI void update(ArrayRef< uint8_t > Data)
Digest more data.
LLVM_ABI std::array< uint8_t, 20 > result()
Return the current raw 160-bits SHA1 for the digested data since the last call to init().
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.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
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
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
constexpr size_t size() const
size - Get the string size.
Utility for building string tables with deduplicated suffixes.
LLVM_ABI size_t add(CachedHashStringRef S, uint8_t Priority=0)
Add a string to the builder.
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.
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
bool isFP128Ty() const
Return true if this is 'fp128'.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
std::vector< std::pair< const Value *, unsigned > > ValueList
unsigned getTypeID(Type *T) const
unsigned getMetadataID(const Metadata *MD) const
UseListOrderStack UseListOrders
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
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
std::pair< iterator, bool > insert(const ValueT &V)
void build(llvm::MapVector< CallStackId, llvm::SmallVector< FrameIdTy > > &&MemProfCallStackData, const llvm::DenseMap< FrameIdTy, LinearFrameId > *MemProfFrameIndexes, llvm::DenseMap< FrameIdTy, FrameStat > &FrameHistogram)
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.
std::string & str()
Returns the string's reference.
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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ 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_FIXED_POINT_TYPE
@ METADATA_GLOBAL_VAR_EXPR
GlobalValueSummarySymtabCodes
@ 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_ALLOC_INFO_NO_CONTEXT
@ 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_SANITIZE_ALLOC_TOKEN
@ ATTR_KIND_NO_SANITIZE_COVERAGE
@ ATTR_KIND_NO_CREATE_UNDEF_OR_POISON
@ ATTR_KIND_DEAD_ON_RETURN
@ 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_RECORD_DECLARE_VALUE
@ 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)
@ DW_APPLE_ENUM_KIND_invalid
Enum kind for invalid results.
LLVM_ABI 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.
llvm::unique_function< void(llvm::Expected< T >)> Callback
A Callback<T> is a void function that accepts Expected<T>.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)
Extract a Value from Metadata, allowing null.
LLVM_ABI bool metadataIncludesAllContextSizeInfo()
Whether the alloc memeprof metadata will include context size info for all MIBs.
template LLVM_ABI llvm::DenseMap< LinearFrameId, FrameStat > computeFrameHistogram< LinearFrameId >(llvm::MapVector< CallStackId, llvm::SmallVector< LinearFrameId > > &MemProfCallStackData)
LLVM_ABI bool metadataMayIncludeContextSizeInfo()
Whether the alloc memprof metadata may include context size info for some MIBs (but possibly not all)...
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.
FunctionAddr VTableAddr Value
StringMapEntry< Value * > ValueName
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
std::unordered_set< GlobalValueSummary * > GVSummaryPtrSet
A set of global value summary pointers.
unsigned encode(MaybeAlign A)
Returns a representation of the alignment that encodes undefined as 0.
LLVM_ABI 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,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
LLVM_ABI 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.
LLVM_ABI 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 ...
LLVM_ABI 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.
FunctionAddr VTableAddr uintptr_t uintptr_t Version
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
FunctionAddr VTableAddr Count
std::map< std::string, GVSummaryMapTy, std::less<> > ModuleToSummariesForIndexTy
Map of a module name to the GUIDs and summaries we will import from that module.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
AtomicOrdering
Atomic ordering for LLVM's memory model.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt copy(R &&Range, OutputIt Out)
constexpr unsigned BitWidth
LLVM_ABI Error write(MCStreamer &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue, Dwarf64StrOffsetsPromotion StrOffsetsOptValue)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
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,...
void consumeError(Error Err)
Consume a Error without doing anything.
LLVM_ABI 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.
static void set(StorageType &Packed, typename Bitfield::Type Value)
Sets the typed value in the provided Packed value.
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.
static const Target * lookupTarget(StringRef TripleStr, std::string &Error)
lookupTarget - Lookup a target based on a target triple.
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