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.SummaryList)
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.SummaryList)
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:
983 unsigned NumWords =
A.getActiveWords();
984 const uint64_t *RawData =
A.getRawData();
985 for (
unsigned i = 0; i < NumWords; i++)
1005void ModuleBitcodeWriter::writeAttributeGroupTable() {
1006 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
1008 if (AttrGrps.empty())
return;
1012 SmallVector<uint64_t, 64> Record;
1014 unsigned AttrListIndex = Pair.first;
1015 AttributeSet AS = Pair.second;
1020 if (Attr.isEnumAttribute()) {
1023 }
else if (Attr.isIntAttribute()) {
1025 Attribute::AttrKind
Kind = Attr.getKindAsEnum();
1027 if (Kind == Attribute::Memory) {
1034 }
else if (Attr.isStringAttribute()) {
1035 StringRef
Kind = Attr.getKindAsString();
1036 StringRef Val = Attr.getValueAsString();
1045 }
else if (Attr.isTypeAttribute()) {
1046 Type *Ty = Attr.getValueAsType();
1051 }
else if (Attr.isConstantRangeAttribute()) {
1057 assert(Attr.isConstantRangeListAttribute());
1063 for (
auto &CR : Val)
1075void ModuleBitcodeWriter::writeAttributeTable() {
1077 if (
Attrs.empty())
return;
1081 SmallVector<uint64_t, 64> Record;
1082 for (
const AttributeList &AL : Attrs) {
1083 for (
unsigned i :
AL.indexes()) {
1084 AttributeSet AS =
AL.getAttributes(i);
1097void ModuleBitcodeWriter::writeTypeTable() {
1101 SmallVector<uint64_t, 64> TypeVals;
1106 auto Abbv = std::make_shared<BitCodeAbbrev>();
1108 Abbv->Add(BitCodeAbbrevOp(0));
1109 unsigned OpaquePtrAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1112 Abbv = std::make_shared<BitCodeAbbrev>();
1117 unsigned FunctionAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1120 Abbv = std::make_shared<BitCodeAbbrev>();
1125 unsigned StructAnonAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1128 Abbv = std::make_shared<BitCodeAbbrev>();
1132 unsigned StructNameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1135 Abbv = std::make_shared<BitCodeAbbrev>();
1140 unsigned StructNamedAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1143 Abbv = std::make_shared<BitCodeAbbrev>();
1147 unsigned ArrayAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1155 for (
Type *
T : TypeList) {
1156 int AbbrevToUse = 0;
1159 switch (
T->getTypeID()) {
1169 case Type::MetadataTyID:
1174 case Type::IntegerTyID:
1179 case Type::PointerTyID: {
1186 AbbrevToUse = OpaquePtrAbbrev;
1189 case Type::FunctionTyID: {
1195 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i)
1197 AbbrevToUse = FunctionAbbrev;
1200 case Type::StructTyID: {
1205 for (
Type *ET :
ST->elements())
1208 if (
ST->isLiteral()) {
1210 AbbrevToUse = StructAnonAbbrev;
1212 if (
ST->isOpaque()) {
1216 AbbrevToUse = StructNamedAbbrev;
1220 if (!
ST->getName().empty())
1226 case Type::ArrayTyID: {
1230 TypeVals.
push_back(AT->getNumElements());
1232 AbbrevToUse = ArrayAbbrev;
1235 case Type::FixedVectorTyID:
1236 case Type::ScalableVectorTyID: {
1241 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1247 case Type::TargetExtTyID: {
1253 for (
Type *InnerTy :
TET->type_params())
1258 case Type::TypedPointerTyID:
1263 Stream.
EmitRecord(Code, TypeVals, AbbrevToUse);
1304 RawFlags |= Flags.ReadNone;
1305 RawFlags |= (Flags.ReadOnly << 1);
1306 RawFlags |= (Flags.NoRecurse << 2);
1307 RawFlags |= (Flags.ReturnDoesNotAlias << 3);
1308 RawFlags |= (Flags.NoInline << 4);
1309 RawFlags |= (Flags.AlwaysInline << 5);
1310 RawFlags |= (Flags.NoUnwind << 6);
1311 RawFlags |= (Flags.MayThrow << 7);
1312 RawFlags |= (Flags.HasUnknownCall << 8);
1313 RawFlags |= (Flags.MustBeUnreachable << 9);
1320 bool ImportAsDecl =
false) {
1323 RawFlags |= Flags.NotEligibleToImport;
1324 RawFlags |= (Flags.Live << 1);
1325 RawFlags |= (Flags.DSOLocal << 2);
1326 RawFlags |= (Flags.CanAutoHide << 3);
1331 RawFlags = (RawFlags << 4) | Flags.Linkage;
1333 RawFlags |= (Flags.Visibility << 8);
1335 unsigned ImportType = Flags.ImportType | ImportAsDecl;
1336 RawFlags |= (ImportType << 10);
1342 uint64_t RawFlags = Flags.MaybeReadOnly | (Flags.MaybeWriteOnly << 1) |
1343 (Flags.Constant << 2) | Flags.VCallVisibility << 3;
1395 switch (
C.getSelectionKind()) {
1419size_t ModuleBitcodeWriter::addToStrtab(StringRef Str) {
1422 return StrtabBuilder.
add(Str);
1425void ModuleBitcodeWriter::writeComdats() {
1440void ModuleBitcodeWriter::writeValueSymbolTableForwardDecl() {
1445 auto Abbv = std::make_shared<BitCodeAbbrev>();
1451 unsigned VSTOffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1467 bool isChar6 =
true;
1468 for (
char C : Str) {
1471 if ((
unsigned char)
C & 128)
1480static_assert(
sizeof(GlobalValue::SanitizerMetadata) <=
sizeof(unsigned),
1481 "Sanitizer Metadata is too large for naive serialization.");
1484 return Meta.NoAddress | (
Meta.NoHWAddress << 1) |
1485 (
Meta.Memtag << 2) | (
Meta.IsDynInit << 3);
1491void ModuleBitcodeWriter::writeModuleInfo() {
1493 if (!
M.getTargetTriple().empty())
1495 M.getTargetTriple().str(), 0 );
1496 const std::string &
DL =
M.getDataLayoutStr();
1499 if (!
M.getModuleInlineAsm().empty())
1505 std::map<std::string, unsigned> SectionMap;
1506 std::map<std::string, unsigned> GCMap;
1507 MaybeAlign MaxGVarAlignment;
1508 unsigned MaxGlobalType = 0;
1509 for (
const GlobalVariable &GV :
M.globals()) {
1510 if (MaybeAlign
A = GV.getAlign())
1511 MaxGVarAlignment = !MaxGVarAlignment ? *
A : std::max(*MaxGVarAlignment, *
A);
1512 MaxGlobalType = std::max(MaxGlobalType, VE.
getTypeID(GV.getValueType()));
1513 if (GV.hasSection()) {
1515 unsigned &
Entry = SectionMap[std::string(GV.getSection())];
1519 Entry = SectionMap.size();
1523 for (
const Function &
F : M) {
1524 if (
F.hasSection()) {
1526 unsigned &
Entry = SectionMap[std::string(
F.getSection())];
1530 Entry = SectionMap.size();
1535 unsigned &
Entry = GCMap[
F.getGC()];
1539 Entry = GCMap.size();
1545 unsigned SimpleGVarAbbrev = 0;
1546 if (!
M.global_empty()) {
1548 auto Abbv = std::make_shared<BitCodeAbbrev>();
1559 if (!MaxGVarAlignment)
1560 Abbv->Add(BitCodeAbbrevOp(0));
1562 unsigned MaxEncAlignment = getEncodedAlign(MaxGVarAlignment);
1566 if (SectionMap.empty())
1567 Abbv->Add(BitCodeAbbrevOp(0));
1572 SimpleGVarAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1586 auto Abbv = std::make_shared<BitCodeAbbrev>();
1589 Abbv->Add(AbbrevOpToUse);
1590 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1592 for (
const auto P :
M.getSourceFileName())
1601 for (
const GlobalVariable &GV :
M.globals()) {
1602 unsigned AbbrevToUse = 0;
1608 Vals.
push_back(addToStrtab(GV.getName()));
1611 Vals.
push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant());
1615 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1616 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1618 if (GV.isThreadLocal() ||
1620 GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||
1621 GV.isExternallyInitialized() ||
1623 GV.hasComdat() || GV.hasAttributes() || GV.isDSOLocal() ||
1624 GV.hasPartition() || GV.hasSanitizerMetadata() || GV.getCodeModel()) {
1628 Vals.
push_back(GV.isExternallyInitialized());
1632 auto AL = GV.getAttributesAsList(AttributeList::FunctionIndex);
1636 Vals.
push_back(addToStrtab(GV.getPartition()));
1637 Vals.
push_back(GV.getPartition().size());
1640 GV.getSanitizerMetadata())
1644 AbbrevToUse = SimpleGVarAbbrev;
1652 for (
const Function &
F : M) {
1664 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1665 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1677 F.hasPersonalityFn() ? (VE.
getValueID(
F.getPersonalityFn()) + 1) : 0);
1681 Vals.
push_back(addToStrtab(
F.getPartition()));
1684 unsigned AbbrevToUse = 0;
1690 for (
const GlobalAlias &
A :
M.aliases()) {
1697 Vals.
push_back(
A.getType()->getAddressSpace());
1705 Vals.
push_back(addToStrtab(
A.getPartition()));
1708 unsigned AbbrevToUse = 0;
1714 for (
const GlobalIFunc &
I :
M.ifuncs()) {
1720 Vals.
push_back(
I.getType()->getAddressSpace());
1725 Vals.
push_back(addToStrtab(
I.getPartition()));
1731 writeValueSymbolTableForwardDecl();
1738 if (OBO->hasNoSignedWrap())
1740 if (OBO->hasNoUnsignedWrap())
1746 if (PDI->isDisjoint())
1749 if (FPMO->hasAllowReassoc())
1751 if (FPMO->hasNoNaNs())
1753 if (FPMO->hasNoInfs())
1755 if (FPMO->hasNoSignedZeros())
1757 if (FPMO->hasAllowReciprocal())
1759 if (FPMO->hasAllowContract())
1761 if (FPMO->hasApproxFunc())
1764 if (NNI->hasNonNeg())
1767 if (TI->hasNoSignedWrap())
1769 if (TI->hasNoUnsignedWrap())
1772 if (
GEP->isInBounds())
1774 if (
GEP->hasNoUnsignedSignedWrap())
1776 if (
GEP->hasNoUnsignedWrap())
1779 if (ICmp->hasSameSign())
1786void ModuleBitcodeWriter::writeValueAsMetadata(
1787 const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
1796void ModuleBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1797 SmallVectorImpl<uint64_t> &Record,
1799 for (
const MDOperand &MDO :
N->operands()) {
1802 "Unexpected function-local metadata");
1811unsigned ModuleBitcodeWriter::createDILocationAbbrev() {
1814 auto Abbv = std::make_shared<BitCodeAbbrev>();
1827void ModuleBitcodeWriter::writeDILocation(
const DILocation *
N,
1828 SmallVectorImpl<uint64_t> &Record,
1831 Abbrev = createDILocationAbbrev();
1845unsigned ModuleBitcodeWriter::createGenericDINodeAbbrev() {
1848 auto Abbv = std::make_shared<BitCodeAbbrev>();
1859void ModuleBitcodeWriter::writeGenericDINode(
const GenericDINode *
N,
1860 SmallVectorImpl<uint64_t> &Record,
1863 Abbrev = createGenericDINodeAbbrev();
1869 for (
auto &
I :
N->operands())
1876void ModuleBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1877 SmallVectorImpl<uint64_t> &Record,
1879 const uint64_t
Version = 2 << 1;
1890void ModuleBitcodeWriter::writeDIGenericSubrange(
1891 const DIGenericSubrange *
N, SmallVectorImpl<uint64_t> &Record,
1903void ModuleBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1904 SmallVectorImpl<uint64_t> &Record,
1906 const uint64_t IsBigInt = 1 << 2;
1907 Record.
push_back(IsBigInt | (
N->isUnsigned() << 1) |
N->isDistinct());
1908 Record.
push_back(
N->getValue().getBitWidth());
1916void ModuleBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1917 SmallVectorImpl<uint64_t> &Record,
1919 const unsigned SizeIsMetadata = 0x2;
1920 Record.
push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1927 Record.
push_back(
N->getNumExtraInhabitants());
1933void ModuleBitcodeWriter::writeDIFixedPointType(
1934 const DIFixedPointType *
N, SmallVectorImpl<uint64_t> &Record,
1936 const unsigned SizeIsMetadata = 0x2;
1937 Record.
push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1947 auto WriteWideInt = [&](
const APInt &
Value) {
1950 uint64_t NumWords =
Value.getActiveWords();
1951 uint64_t
Encoded = (NumWords << 32) |
Value.getBitWidth();
1956 WriteWideInt(
N->getNumeratorRaw());
1957 WriteWideInt(
N->getDenominatorRaw());
1963void ModuleBitcodeWriter::writeDIStringType(
const DIStringType *
N,
1964 SmallVectorImpl<uint64_t> &Record,
1966 const unsigned SizeIsMetadata = 0x2;
1967 Record.
push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1981void ModuleBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
1982 SmallVectorImpl<uint64_t> &Record,
1984 const unsigned SizeIsMetadata = 0x2;
1985 Record.
push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2000 if (
const auto &DWARFAddressSpace =
N->getDWARFAddressSpace())
2001 Record.
push_back(*DWARFAddressSpace + 1);
2007 if (
auto PtrAuthData =
N->getPtrAuthData())
2016void ModuleBitcodeWriter::writeDISubrangeType(
const DISubrangeType *
N,
2017 SmallVectorImpl<uint64_t> &Record,
2019 const unsigned SizeIsMetadata = 0x2;
2020 Record.
push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2038void ModuleBitcodeWriter::writeDICompositeType(
2039 const DICompositeType *
N, SmallVectorImpl<uint64_t> &Record,
2041 const unsigned IsNotUsedInOldTypeRef = 0x2;
2042 const unsigned SizeIsMetadata = 0x4;
2043 Record.
push_back(SizeIsMetadata | IsNotUsedInOldTypeRef |
2044 (
unsigned)
N->isDistinct());
2066 Record.
push_back(
N->getNumExtraInhabitants());
2076void ModuleBitcodeWriter::writeDISubroutineType(
2077 const DISubroutineType *
N, SmallVectorImpl<uint64_t> &Record,
2079 const unsigned HasNoOldTypeRefs = 0x2;
2080 Record.
push_back(HasNoOldTypeRefs | (
unsigned)
N->isDistinct());
2089void ModuleBitcodeWriter::writeDIFile(
const DIFile *
N,
2090 SmallVectorImpl<uint64_t> &Record,
2095 if (
N->getRawChecksum()) {
2104 auto Source =
N->getRawSource();
2112void ModuleBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
2113 SmallVectorImpl<uint64_t> &Record,
2115 assert(
N->isDistinct() &&
"Expected distinct compile units");
2118 auto Lang =
N->getSourceLanguage();
2122 if (Lang.hasVersionedName())
2123 Record.
back() ^= (uint64_t(1) << 63);
2139 Record.
push_back(
N->getSplitDebugInlining());
2140 Record.
push_back(
N->getDebugInfoForProfiling());
2141 Record.
push_back((
unsigned)
N->getNameTableKind());
2150void ModuleBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
2151 SmallVectorImpl<uint64_t> &Record,
2153 const uint64_t HasUnitFlag = 1 << 1;
2154 const uint64_t HasSPFlagsFlag = 1 << 2;
2155 Record.
push_back(uint64_t(
N->isDistinct()) | HasUnitFlag | HasSPFlagsFlag);
2175 Record.
push_back(
N->getKeyInstructionsEnabled());
2181void ModuleBitcodeWriter::writeDILexicalBlock(
const DILexicalBlock *
N,
2182 SmallVectorImpl<uint64_t> &Record,
2194void ModuleBitcodeWriter::writeDILexicalBlockFile(
2195 const DILexicalBlockFile *
N, SmallVectorImpl<uint64_t> &Record,
2206void ModuleBitcodeWriter::writeDICommonBlock(
const DICommonBlock *
N,
2207 SmallVectorImpl<uint64_t> &Record,
2220void ModuleBitcodeWriter::writeDINamespace(
const DINamespace *
N,
2221 SmallVectorImpl<uint64_t> &Record,
2223 Record.
push_back(
N->isDistinct() |
N->getExportSymbols() << 1);
2231void ModuleBitcodeWriter::writeDIMacro(
const DIMacro *
N,
2232 SmallVectorImpl<uint64_t> &Record,
2244void ModuleBitcodeWriter::writeDIMacroFile(
const DIMacroFile *
N,
2245 SmallVectorImpl<uint64_t> &Record,
2257void ModuleBitcodeWriter::writeDIArgList(
const DIArgList *
N,
2258 SmallVectorImpl<uint64_t> &Record) {
2259 Record.
reserve(
N->getArgs().size());
2260 for (ValueAsMetadata *MD :
N->getArgs())
2267void ModuleBitcodeWriter::writeDIModule(
const DIModule *
N,
2268 SmallVectorImpl<uint64_t> &Record,
2271 for (
auto &
I :
N->operands())
2280void ModuleBitcodeWriter::writeDIAssignID(
const DIAssignID *
N,
2281 SmallVectorImpl<uint64_t> &Record,
2289void ModuleBitcodeWriter::writeDITemplateTypeParameter(
2290 const DITemplateTypeParameter *
N, SmallVectorImpl<uint64_t> &Record,
2301void ModuleBitcodeWriter::writeDITemplateValueParameter(
2302 const DITemplateValueParameter *
N, SmallVectorImpl<uint64_t> &Record,
2315void ModuleBitcodeWriter::writeDIGlobalVariable(
2316 const DIGlobalVariable *
N, SmallVectorImpl<uint64_t> &Record,
2318 const uint64_t
Version = 2 << 1;
2337void ModuleBitcodeWriter::writeDILocalVariable(
2338 const DILocalVariable *
N, SmallVectorImpl<uint64_t> &Record,
2353 const uint64_t HasAlignmentFlag = 1 << 1;
2354 Record.
push_back((uint64_t)
N->isDistinct() | HasAlignmentFlag);
2369void ModuleBitcodeWriter::writeDILabel(
2370 const DILabel *
N, SmallVectorImpl<uint64_t> &Record,
2372 uint64_t IsArtificialFlag = uint64_t(
N->isArtificial()) << 1;
2373 Record.
push_back((uint64_t)
N->isDistinct() | IsArtificialFlag);
2379 Record.
push_back(
N->getCoroSuspendIdx().has_value()
2380 ? (uint64_t)
N->getCoroSuspendIdx().value()
2381 : std::numeric_limits<uint64_t>::max());
2387void ModuleBitcodeWriter::writeDIExpression(
const DIExpression *
N,
2388 SmallVectorImpl<uint64_t> &Record,
2390 Record.
reserve(
N->getElements().size() + 1);
2391 const uint64_t
Version = 3 << 1;
2393 Record.
append(
N->elements_begin(),
N->elements_end());
2399void ModuleBitcodeWriter::writeDIGlobalVariableExpression(
2400 const DIGlobalVariableExpression *
N, SmallVectorImpl<uint64_t> &Record,
2410void ModuleBitcodeWriter::writeDIObjCProperty(
const DIObjCProperty *
N,
2411 SmallVectorImpl<uint64_t> &Record,
2426void ModuleBitcodeWriter::writeDIImportedEntity(
2427 const DIImportedEntity *
N, SmallVectorImpl<uint64_t> &Record,
2442unsigned ModuleBitcodeWriter::createNamedMetadataAbbrev() {
2443 auto Abbv = std::make_shared<BitCodeAbbrev>();
2450void ModuleBitcodeWriter::writeNamedMetadata(
2451 SmallVectorImpl<uint64_t> &Record) {
2452 if (
M.named_metadata_empty())
2455 unsigned Abbrev = createNamedMetadataAbbrev();
2456 for (
const NamedMDNode &NMD :
M.named_metadata()) {
2458 StringRef Str = NMD.getName();
2459 Record.
append(Str.bytes_begin(), Str.bytes_end());
2464 for (
const MDNode *
N : NMD.operands())
2471unsigned ModuleBitcodeWriter::createMetadataStringsAbbrev() {
2472 auto Abbv = std::make_shared<BitCodeAbbrev>();
2484void ModuleBitcodeWriter::writeMetadataStrings(
2486 if (Strings.
empty())
2494 SmallString<256> Blob;
2496 BitstreamWriter
W(Blob);
2516#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,
2517#include "llvm/IR/Metadata.def"
2521void ModuleBitcodeWriter::writeMetadataRecords(
2523 std::vector<unsigned> *MDAbbrevs, std::vector<uint64_t> *IndexPos) {
2528#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
2529#include "llvm/IR/Metadata.def"
2535 assert(
N->isResolved() &&
"Expected forward references to be resolved");
2537 switch (
N->getMetadataID()) {
2540#define HANDLE_MDNODE_LEAF(CLASS) \
2541 case Metadata::CLASS##Kind: \
2543 write##CLASS(cast<CLASS>(N), Record, \
2544 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
2546 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
2548#include "llvm/IR/Metadata.def"
2559void ModuleBitcodeWriter::writeModuleMetadata() {
2560 if (!VE.
hasMDs() &&
M.named_metadata_empty())
2564 SmallVector<uint64_t, 64> Record;
2568 std::vector<unsigned> MDAbbrevs;
2571 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
2572 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
2573 createGenericDINodeAbbrev();
2575 auto Abbv = std::make_shared<BitCodeAbbrev>();
2579 unsigned OffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2581 Abbv = std::make_shared<BitCodeAbbrev>();
2585 unsigned IndexAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2597 uint64_t Vals[] = {0, 0};
2607 std::vector<uint64_t> IndexPos;
2611 writeMetadataRecords(VE.
getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);
2622 uint64_t PreviousValue = IndexOffsetRecordBitPos;
2623 for (
auto &Elt : IndexPos) {
2624 auto EltDelta = Elt - PreviousValue;
2625 PreviousValue = Elt;
2634 writeNamedMetadata(Record);
2636 auto AddDeclAttachedMetadata = [&](
const GlobalObject &GO) {
2637 SmallVector<uint64_t, 4> Record;
2639 pushGlobalMetadataAttachment(Record, GO);
2642 for (
const Function &
F : M)
2643 if (
F.isDeclaration() &&
F.hasMetadata())
2644 AddDeclAttachedMetadata(
F);
2645 for (
const GlobalIFunc &GI :
M.ifuncs())
2646 if (GI.hasMetadata())
2647 AddDeclAttachedMetadata(GI);
2650 for (
const GlobalVariable &GV :
M.globals())
2651 if (GV.hasMetadata())
2652 AddDeclAttachedMetadata(GV);
2657void ModuleBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
2662 SmallVector<uint64_t, 64> Record;
2668void ModuleBitcodeWriter::pushGlobalMetadataAttachment(
2669 SmallVectorImpl<uint64_t> &Record,
const GlobalObject &GO) {
2673 for (
const auto &
I : MDs) {
2679void ModuleBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
2682 SmallVector<uint64_t, 64> Record;
2684 if (
F.hasMetadata()) {
2685 pushGlobalMetadataAttachment(Record,
F);
2693 for (
const BasicBlock &BB :
F)
2694 for (
const Instruction &
I : BB) {
2696 I.getAllMetadataOtherThanDebugLoc(MDs);
2699 if (MDs.
empty())
continue;
2703 for (
const auto &[
ID, MD] : MDs) {
2714void ModuleBitcodeWriter::writeModuleMetadataKinds() {
2715 SmallVector<uint64_t, 64> Record;
2720 M.getMDKindNames(Names);
2722 if (Names.
empty())
return;
2726 for (
unsigned MDKindID = 0, e = Names.
size(); MDKindID != e; ++MDKindID) {
2728 StringRef KName = Names[MDKindID];
2738void ModuleBitcodeWriter::writeOperandBundleTags() {
2746 M.getOperandBundleTags(Tags);
2753 SmallVector<uint64_t, 64> Record;
2755 for (
auto Tag : Tags) {
2765void ModuleBitcodeWriter::writeSyncScopeNames() {
2767 M.getContext().getSyncScopeNames(SSNs);
2773 SmallVector<uint64_t, 64> Record;
2774 for (
auto SSN : SSNs) {
2775 Record.
append(SSN.begin(), SSN.end());
2783void ModuleBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
2785 if (FirstVal == LastVal)
return;
2789 unsigned AggregateAbbrev = 0;
2790 unsigned String8Abbrev = 0;
2791 unsigned CString7Abbrev = 0;
2792 unsigned CString6Abbrev = 0;
2796 auto Abbv = std::make_shared<BitCodeAbbrev>();
2800 AggregateAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2803 Abbv = std::make_shared<BitCodeAbbrev>();
2807 String8Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2809 Abbv = std::make_shared<BitCodeAbbrev>();
2813 CString7Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2815 Abbv = std::make_shared<BitCodeAbbrev>();
2819 CString6Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2822 SmallVector<uint64_t, 64> Record;
2825 Type *LastTy =
nullptr;
2826 for (
unsigned i = FirstVal; i != LastVal; ++i) {
2827 const Value *
V = Vals[i].first;
2829 if (
V->getType() != LastTy) {
2830 LastTy =
V->getType();
2833 CONSTANTS_SETTYPE_ABBREV);
2840 unsigned(
IA->hasSideEffects()) |
unsigned(
IA->isAlignStack()) << 1 |
2841 unsigned(
IA->getDialect() & 1) << 2 |
unsigned(
IA->canThrow()) << 3);
2844 StringRef AsmStr =
IA->getAsmString();
2849 StringRef ConstraintStr =
IA->getConstraintString();
2857 unsigned Code = -1U;
2858 unsigned AbbrevToUse = 0;
2859 if (
C->isNullValue()) {
2866 if (
IV->getBitWidth() <= 64) {
2867 uint64_t
V =
IV->getSExtValue();
2870 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2880 Record.
push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2884 APInt api = CFP->getValueAPF().bitcastToAPInt();
2886 Record.
push_back((p[1] << 48) | (p[0] >> 16));
2889 APInt api = CFP->getValueAPF().bitcastToAPInt();
2894 assert(0 &&
"Unknown FP type!");
2900 uint64_t NumElts = Str->getNumElements();
2902 if (Str->isCString()) {
2907 AbbrevToUse = String8Abbrev;
2911 for (uint64_t i = 0; i != NumElts; ++i) {
2912 unsigned char V = Str->getElementAsInteger(i);
2914 isCStr7 &= (
V & 128) == 0;
2920 AbbrevToUse = CString6Abbrev;
2922 AbbrevToUse = CString7Abbrev;
2923 }
else if (
const ConstantDataSequential *CDS =
2926 Type *EltTy = CDS->getElementType();
2928 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
2929 Record.
push_back(CDS->getElementAsInteger(i));
2931 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
2933 CDS->getElementAsAPFloat(i).bitcastToAPInt().getLimitedValue());
2937 for (
const Value *
Op :
C->operands())
2939 AbbrevToUse = AggregateAbbrev;
2941 switch (
CE->getOpcode()) {
2948 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2950 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
2960 case Instruction::FNeg: {
2961 assert(
CE->getNumOperands() == 1 &&
"Unknown constant expr!");
2970 case Instruction::GetElementPtr: {
2975 if (std::optional<ConstantRange>
Range = GO->getInRange()) {
2979 for (
const Value *
Op :
CE->operands()) {
2985 case Instruction::ExtractElement:
2992 case Instruction::InsertElement:
2999 case Instruction::ShuffleVector:
3004 if (
C->getType() ==
C->getOperand(0)->getType()) {
3040 Stream.
EmitRecord(Code, Record, AbbrevToUse);
3047void ModuleBitcodeWriter::writeModuleConstants() {
3052 for (
unsigned i = 0, e = Vals.size(); i != e; ++i) {
3054 writeConstants(i, Vals.size(),
true);
3068bool ModuleBitcodeWriter::pushValueAndType(
const Value *V,
unsigned InstID,
3069 SmallVectorImpl<unsigned> &Vals) {
3073 if (ValID >= InstID) {
3080bool ModuleBitcodeWriter::pushValueOrMetadata(
const Value *V,
unsigned InstID,
3081 SmallVectorImpl<unsigned> &Vals) {
3082 bool IsMetadata =
V->getType()->isMetadataTy();
3090 return pushValueAndType(V, InstID, Vals);
3093void ModuleBitcodeWriter::writeOperandBundles(
const CallBase &CS,
3100 Record.
push_back(
C.getOperandBundleTagID(Bundle.getTagName()));
3102 for (
auto &Input : Bundle.Inputs)
3103 pushValueOrMetadata(Input, InstID, Record);
3112void ModuleBitcodeWriter::pushValue(
const Value *V,
unsigned InstID,
3113 SmallVectorImpl<unsigned> &Vals) {
3118void ModuleBitcodeWriter::pushValueSigned(
const Value *V,
unsigned InstID,
3119 SmallVectorImpl<uint64_t> &Vals) {
3121 int64_t diff = ((int32_t)InstID - (int32_t)ValID);
3126void ModuleBitcodeWriter::writeInstruction(
const Instruction &
I,
3128 SmallVectorImpl<unsigned> &Vals) {
3130 unsigned AbbrevToUse = 0;
3132 switch (
I.getOpcode()) {
3136 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3137 AbbrevToUse = FUNCTION_INST_CAST_ABBREV;
3142 if (AbbrevToUse == FUNCTION_INST_CAST_ABBREV)
3143 AbbrevToUse = FUNCTION_INST_CAST_FLAGS_ABBREV;
3149 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3150 AbbrevToUse = FUNCTION_INST_BINOP_ABBREV;
3151 pushValue(
I.getOperand(1), InstID, Vals);
3155 if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV)
3156 AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV;
3161 case Instruction::FNeg: {
3163 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3164 AbbrevToUse = FUNCTION_INST_UNOP_ABBREV;
3168 if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV)
3169 AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV;
3174 case Instruction::GetElementPtr: {
3176 AbbrevToUse = FUNCTION_INST_GEP_ABBREV;
3180 for (
const Value *
Op :
I.operands())
3181 pushValueAndType(
Op, InstID, Vals);
3184 case Instruction::ExtractValue: {
3186 pushValueAndType(
I.getOperand(0), InstID, Vals);
3191 case Instruction::InsertValue: {
3193 pushValueAndType(
I.getOperand(0), InstID, Vals);
3194 pushValueAndType(
I.getOperand(1), InstID, Vals);
3199 case Instruction::Select: {
3201 pushValueAndType(
I.getOperand(1), InstID, Vals);
3202 pushValue(
I.getOperand(2), InstID, Vals);
3203 pushValueAndType(
I.getOperand(0), InstID, Vals);
3209 case Instruction::ExtractElement:
3211 pushValueAndType(
I.getOperand(0), InstID, Vals);
3212 pushValueAndType(
I.getOperand(1), InstID, Vals);
3214 case Instruction::InsertElement:
3216 pushValueAndType(
I.getOperand(0), InstID, Vals);
3217 pushValue(
I.getOperand(1), InstID, Vals);
3218 pushValueAndType(
I.getOperand(2), InstID, Vals);
3220 case Instruction::ShuffleVector:
3222 pushValueAndType(
I.getOperand(0), InstID, Vals);
3223 pushValue(
I.getOperand(1), InstID, Vals);
3227 case Instruction::ICmp:
3228 case Instruction::FCmp: {
3231 AbbrevToUse = FUNCTION_INST_CMP_ABBREV;
3232 if (pushValueAndType(
I.getOperand(0), InstID, Vals))
3234 pushValue(
I.getOperand(1), InstID, Vals);
3240 AbbrevToUse = FUNCTION_INST_CMP_FLAGS_ABBREV;
3245 case Instruction::Ret:
3248 unsigned NumOperands =
I.getNumOperands();
3249 if (NumOperands == 0)
3250 AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV;
3251 else if (NumOperands == 1) {
3252 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3253 AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV;
3255 for (
const Value *
Op :
I.operands())
3256 pushValueAndType(
Op, InstID, Vals);
3260 case Instruction::Br:
3263 AbbrevToUse = FUNCTION_INST_BR_UNCOND_ABBREV;
3266 if (
II.isConditional()) {
3268 pushValue(
II.getCondition(), InstID, Vals);
3269 AbbrevToUse = FUNCTION_INST_BR_COND_ABBREV;
3273 case Instruction::Switch:
3278 pushValue(
SI.getCondition(), InstID, Vals);
3280 for (
auto Case :
SI.cases()) {
3286 case Instruction::IndirectBr:
3290 pushValue(
I.getOperand(0), InstID, Vals);
3295 case Instruction::Invoke: {
3298 FunctionType *FTy =
II->getFunctionType();
3300 if (
II->hasOperandBundles())
3301 writeOperandBundles(*
II, InstID);
3310 pushValueAndType(Callee, InstID, Vals);
3313 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3314 pushValue(
I.getOperand(i), InstID, Vals);
3317 if (FTy->isVarArg()) {
3318 for (
unsigned i = FTy->getNumParams(), e =
II->arg_size(); i != e; ++i)
3319 pushValueAndType(
I.getOperand(i), InstID, Vals);
3323 case Instruction::Resume:
3325 pushValueAndType(
I.getOperand(0), InstID, Vals);
3327 case Instruction::CleanupRet: {
3330 pushValue(CRI.getCleanupPad(), InstID, Vals);
3331 if (CRI.hasUnwindDest())
3335 case Instruction::CatchRet: {
3338 pushValue(CRI.getCatchPad(), InstID, Vals);
3342 case Instruction::CleanupPad:
3343 case Instruction::CatchPad: {
3347 pushValue(FuncletPad.getParentPad(), InstID, Vals);
3349 unsigned NumArgOperands = FuncletPad.arg_size();
3351 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op)
3352 pushValueAndType(FuncletPad.getArgOperand(
Op), InstID, Vals);
3355 case Instruction::CatchSwitch: {
3359 pushValue(CatchSwitch.getParentPad(), InstID, Vals);
3361 unsigned NumHandlers = CatchSwitch.getNumHandlers();
3363 for (
const BasicBlock *CatchPadBB : CatchSwitch.handlers())
3366 if (CatchSwitch.hasUnwindDest())
3370 case Instruction::CallBr: {
3376 writeOperandBundles(*CBI, InstID);
3391 pushValueAndType(Callee, InstID, Vals);
3394 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3395 pushValue(
I.getOperand(i), InstID, Vals);
3398 if (FTy->isVarArg()) {
3399 for (
unsigned i = FTy->getNumParams(), e = CBI->
arg_size(); i != e; ++i)
3400 pushValueAndType(
I.getOperand(i), InstID, Vals);
3404 case Instruction::Unreachable:
3406 AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;
3409 case Instruction::PHI: {
3427 Stream.
EmitRecord(Code, Vals64, AbbrevToUse);
3432 case Instruction::LandingPad: {
3443 pushValueAndType(LP.
getClause(
I), InstID, Vals);
3448 case Instruction::Alloca: {
3454 using APV = AllocaPackedValues;
3455 unsigned Record = 0;
3456 unsigned EncodedAlign = getEncodedAlign(AI.
getAlign());
3458 Record, EncodedAlign & ((1 << APV::AlignLower::Bits) - 1));
3460 EncodedAlign >> APV::AlignLower::Bits);
3467 if (AS !=
M.getDataLayout().getAllocaAddrSpace())
3472 case Instruction::Load:
3475 pushValueAndType(
I.getOperand(0), InstID, Vals);
3478 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3479 AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;
3489 case Instruction::Store:
3494 AbbrevToUse = FUNCTION_INST_STORE_ABBREV;
3496 if (pushValueAndType(
I.getOperand(1), InstID, Vals))
3498 if (pushValueAndType(
I.getOperand(0), InstID, Vals))
3508 case Instruction::AtomicCmpXchg:
3510 pushValueAndType(
I.getOperand(0), InstID, Vals);
3511 pushValueAndType(
I.getOperand(1), InstID, Vals);
3512 pushValue(
I.getOperand(2), InstID, Vals);
3523 case Instruction::AtomicRMW:
3525 pushValueAndType(
I.getOperand(0), InstID, Vals);
3526 pushValueAndType(
I.getOperand(1), InstID, Vals);
3535 case Instruction::Fence:
3540 case Instruction::Call: {
3545 writeOperandBundles(CI, InstID);
3565 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3569 if (FTy->isVarArg()) {
3570 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
3575 case Instruction::VAArg:
3578 pushValue(
I.getOperand(0), InstID, Vals);
3581 case Instruction::Freeze:
3583 pushValueAndType(
I.getOperand(0), InstID, Vals);
3593void ModuleBitcodeWriter::writeGlobalValueSymbolTable(
3594 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3599 VSTOffset -= bitcodeStartBit();
3600 assert((VSTOffset & 31) == 0 &&
"VST block not 32-bit aligned");
3604 Stream.
BackpatchWord(VSTOffsetPlaceholder, VSTOffset / 32 + 1);
3608 auto Abbv = std::make_shared<BitCodeAbbrev>();
3612 unsigned FnEntryAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
3614 for (
const Function &
F : M) {
3617 if (
F.isDeclaration())
3624 uint64_t BitcodeIndex = FunctionToBitcodeIndex[&
F] - bitcodeStartBit();
3625 assert((BitcodeIndex & 31) == 0 &&
"function block not 32-bit aligned");
3629 Record[1] = BitcodeIndex / 32 + 1;
3638void ModuleBitcodeWriter::writeFunctionLevelValueSymbolTable(
3639 const ValueSymbolTable &VST) {
3647 SmallVector<uint64_t, 64> NameVals;
3653 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
3662 AbbrevToUse = VST_BBENTRY_6_ABBREV;
3666 AbbrevToUse = VST_ENTRY_6_ABBREV;
3668 AbbrevToUse = VST_ENTRY_7_ABBREV;
3671 for (
const auto P :
Name.getKey())
3675 Stream.
EmitRecord(Code, NameVals, AbbrevToUse);
3682void ModuleBitcodeWriter::writeUseList(UseListOrder &&Order) {
3683 assert(Order.Shuffle.size() >= 2 &&
"Shuffle too small");
3690 SmallVector<uint64_t, 64> Record(Order.Shuffle.begin(), Order.Shuffle.end());
3695void ModuleBitcodeWriter::writeUseListBlock(
const Function *
F) {
3697 "Expected to be preserving use-list order");
3699 auto hasMore = [&]() {
3715void ModuleBitcodeWriter::writeFunction(
3717 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3734 unsigned CstStart, CstEnd;
3736 writeConstants(CstStart, CstEnd,
false);
3739 writeFunctionMetadata(
F);
3742 unsigned InstID = CstEnd;
3744 bool NeedsMetadataAttachment =
F.hasMetadata();
3746 DILocation *LastDL =
nullptr;
3747 SmallSetVector<Function *, 4> BlockAddressUsers;
3750 for (
const BasicBlock &BB :
F) {
3751 for (
const Instruction &
I : BB) {
3752 writeInstruction(
I, InstID, Vals);
3754 if (!
I.getType()->isVoidTy())
3758 NeedsMetadataAttachment |=
I.hasMetadataOtherThanDebugLoc();
3761 if (DILocation *
DL =
I.getDebugLoc()) {
3774 FUNCTION_DEBUG_LOC_ABBREV);
3784 if (
I.hasDbgRecords()) {
3788 auto PushValueOrMetadata = [&Vals, InstID,
3791 "RawLocation unexpectedly null in DbgVariableRecord");
3793 SmallVector<unsigned, 2> ValAndType;
3797 if (!pushValueAndType(VAM->getValue(), InstID, ValAndType)) {
3811 for (DbgRecord &DR :
I.DebugMarker->getDbgRecordRange()) {
3837 FUNCTION_DEBUG_RECORD_VALUE_ABBREV);
3858 SmallPtrSet<Value *, 8> Visited{BA};
3859 while (!Worklist.
empty()) {
3861 for (User *U :
V->users()) {
3867 Visited.
insert(U).second)
3874 if (!BlockAddressUsers.
empty()) {
3883 if (
auto *Symtab =
F.getValueSymbolTable())
3884 writeFunctionLevelValueSymbolTable(*Symtab);
3886 if (NeedsMetadataAttachment)
3887 writeFunctionMetadataAttachment(
F);
3889 writeUseListBlock(&
F);
3895void ModuleBitcodeWriter::writeBlockInfo() {
3908 auto Abbv = std::make_shared<BitCodeAbbrev>();
3919 auto Abbv = std::make_shared<BitCodeAbbrev>();
3929 auto Abbv = std::make_shared<BitCodeAbbrev>();
3939 auto Abbv = std::make_shared<BitCodeAbbrev>();
3945 VST_BBENTRY_6_ABBREV)
3950 auto Abbv = std::make_shared<BitCodeAbbrev>();
3952 Abbv->Add(TypeAbbrevOp);
3954 CONSTANTS_SETTYPE_ABBREV)
3959 auto Abbv = std::make_shared<BitCodeAbbrev>();
3963 CONSTANTS_INTEGER_ABBREV)
3968 auto Abbv = std::make_shared<BitCodeAbbrev>();
3976 CONSTANTS_CE_CAST_Abbrev)
3980 auto Abbv = std::make_shared<BitCodeAbbrev>();
3983 CONSTANTS_NULL_Abbrev)
3990 auto Abbv = std::make_shared<BitCodeAbbrev>();
3992 Abbv->Add(ValAbbrevOp);
3993 Abbv->Add(TypeAbbrevOp);
3997 FUNCTION_INST_LOAD_ABBREV)
4001 auto Abbv = std::make_shared<BitCodeAbbrev>();
4003 Abbv->Add(ValAbbrevOp);
4004 Abbv->Add(ValAbbrevOp);
4008 FUNCTION_INST_STORE_ABBREV)
4012 auto Abbv = std::make_shared<BitCodeAbbrev>();
4014 Abbv->Add(ValAbbrevOp);
4017 FUNCTION_INST_UNOP_ABBREV)
4021 auto Abbv = std::make_shared<BitCodeAbbrev>();
4023 Abbv->Add(ValAbbrevOp);
4027 FUNCTION_INST_UNOP_FLAGS_ABBREV)
4031 auto Abbv = std::make_shared<BitCodeAbbrev>();
4033 Abbv->Add(ValAbbrevOp);
4034 Abbv->Add(ValAbbrevOp);
4037 FUNCTION_INST_BINOP_ABBREV)
4041 auto Abbv = std::make_shared<BitCodeAbbrev>();
4043 Abbv->Add(ValAbbrevOp);
4044 Abbv->Add(ValAbbrevOp);
4048 FUNCTION_INST_BINOP_FLAGS_ABBREV)
4052 auto Abbv = std::make_shared<BitCodeAbbrev>();
4054 Abbv->Add(ValAbbrevOp);
4055 Abbv->Add(TypeAbbrevOp);
4058 FUNCTION_INST_CAST_ABBREV)
4062 auto Abbv = std::make_shared<BitCodeAbbrev>();
4064 Abbv->Add(ValAbbrevOp);
4065 Abbv->Add(TypeAbbrevOp);
4069 FUNCTION_INST_CAST_FLAGS_ABBREV)
4074 auto Abbv = std::make_shared<BitCodeAbbrev>();
4077 FUNCTION_INST_RET_VOID_ABBREV)
4081 auto Abbv = std::make_shared<BitCodeAbbrev>();
4083 Abbv->Add(ValAbbrevOp);
4085 FUNCTION_INST_RET_VAL_ABBREV)
4089 auto Abbv = std::make_shared<BitCodeAbbrev>();
4092 Abbv->Add(ValAbbrevOp);
4094 FUNCTION_INST_BR_UNCOND_ABBREV)
4098 auto Abbv = std::make_shared<BitCodeAbbrev>();
4101 Abbv->Add(ValAbbrevOp);
4102 Abbv->Add(ValAbbrevOp);
4103 Abbv->Add(ValAbbrevOp);
4105 FUNCTION_INST_BR_COND_ABBREV)
4109 auto Abbv = std::make_shared<BitCodeAbbrev>();
4112 FUNCTION_INST_UNREACHABLE_ABBREV)
4116 auto Abbv = std::make_shared<BitCodeAbbrev>();
4119 Abbv->Add(TypeAbbrevOp);
4121 Abbv->Add(ValAbbrevOp);
4123 FUNCTION_INST_GEP_ABBREV)
4127 auto Abbv = std::make_shared<BitCodeAbbrev>();
4129 Abbv->Add(ValAbbrevOp);
4130 Abbv->Add(ValAbbrevOp);
4133 FUNCTION_INST_CMP_ABBREV)
4137 auto Abbv = std::make_shared<BitCodeAbbrev>();
4139 Abbv->Add(ValAbbrevOp);
4140 Abbv->Add(ValAbbrevOp);
4144 FUNCTION_INST_CMP_FLAGS_ABBREV)
4148 auto Abbv = std::make_shared<BitCodeAbbrev>();
4153 Abbv->Add(ValAbbrevOp);
4155 FUNCTION_DEBUG_RECORD_VALUE_ABBREV)
4159 auto Abbv = std::make_shared<BitCodeAbbrev>();
4170 FUNCTION_DEBUG_LOC_ABBREV)
4178void IndexBitcodeWriter::writeModStrings() {
4184 auto Abbv = std::make_shared<BitCodeAbbrev>();
4189 unsigned Abbrev8Bit = Stream.
EmitAbbrev(std::move(Abbv));
4192 Abbv = std::make_shared<BitCodeAbbrev>();
4197 unsigned Abbrev7Bit = Stream.
EmitAbbrev(std::move(Abbv));
4200 Abbv = std::make_shared<BitCodeAbbrev>();
4205 unsigned Abbrev6Bit = Stream.
EmitAbbrev(std::move(Abbv));
4208 Abbv = std::make_shared<BitCodeAbbrev>();
4215 unsigned AbbrevHash = Stream.
EmitAbbrev(std::move(Abbv));
4218 forEachModule([&](
const StringMapEntry<ModuleHash> &MPSE) {
4220 const auto &Hash = MPSE.
getValue();
4222 unsigned AbbrevToUse = Abbrev8Bit;
4224 AbbrevToUse = Abbrev6Bit;
4226 AbbrevToUse = Abbrev7Bit;
4228 auto ModuleId = ModuleIdMap.
size();
4229 ModuleIdMap[
Key] = ModuleId;
4238 Vals.
assign(Hash.begin(), Hash.end());
4250template <
typename Fn>
4254 if (!FS->type_tests().empty())
4259 auto WriteVFuncIdVec = [&](
uint64_t Ty,
4264 for (
auto &VF : VFs) {
4265 Record.push_back(VF.GUID);
4266 Record.push_back(VF.Offset);
4272 FS->type_test_assume_vcalls());
4274 FS->type_checked_load_vcalls());
4276 auto WriteConstVCallVec = [&](
uint64_t Ty,
4278 for (
auto &VC : VCs) {
4280 Record.push_back(VC.VFunc.GUID);
4281 Record.push_back(VC.VFunc.Offset);
4288 FS->type_test_assume_const_vcalls());
4290 FS->type_checked_load_const_vcalls());
4300 if (!FS->paramAccesses().empty()) {
4302 for (
auto &Arg : FS->paramAccesses()) {
4303 size_t UndoSize =
Record.size();
4304 Record.push_back(Arg.ParamNo);
4305 WriteRange(Arg.Use);
4306 Record.push_back(Arg.Calls.size());
4307 for (
auto &
Call : Arg.Calls) {
4309 std::optional<unsigned> ValueID = GetValueID(
Call.Callee);
4316 Record.push_back(*ValueID);
4317 WriteRange(
Call.Offsets);
4328 std::set<GlobalValue::GUID> &ReferencedTypeIds) {
4329 if (!FS->type_tests().empty())
4330 for (
auto &TT : FS->type_tests())
4331 ReferencedTypeIds.insert(TT);
4333 auto GetReferencedTypesFromVFuncIdVec =
4335 for (
auto &VF : VFs)
4336 ReferencedTypeIds.insert(VF.GUID);
4339 GetReferencedTypesFromVFuncIdVec(FS->type_test_assume_vcalls());
4340 GetReferencedTypesFromVFuncIdVec(FS->type_checked_load_vcalls());
4342 auto GetReferencedTypesFromConstVCallVec =
4344 for (
auto &VC : VCs)
4345 ReferencedTypeIds.insert(VC.VFunc.GUID);
4348 GetReferencedTypesFromConstVCallVec(FS->type_test_assume_const_vcalls());
4349 GetReferencedTypesFromConstVCallVec(FS->type_checked_load_const_vcalls());
4385 NameVals.
push_back(Summary.TTRes.TheKind);
4386 NameVals.
push_back(Summary.TTRes.SizeM1BitWidth);
4387 NameVals.
push_back(Summary.TTRes.AlignLog2);
4388 NameVals.
push_back(Summary.TTRes.SizeM1);
4389 NameVals.
push_back(Summary.TTRes.BitMask);
4390 NameVals.
push_back(Summary.TTRes.InlineBits);
4392 for (
auto &W : Summary.WPDRes)
4404 for (
auto &
P : Summary) {
4406 NameVals.
push_back(
VE.getValueID(
P.VTableVI.getValue()));
4420 static_assert(std::is_same_v<LinearFrameId, unsigned>);
4421 for (
auto &AI : FS->allocs()) {
4422 for (
auto &MIB : AI.MIBs) {
4424 StackIdIndices.
reserve(MIB.StackIdIndices.size());
4425 for (
auto Id : MIB.StackIdIndices)
4426 StackIdIndices.
push_back(GetStackIndex(Id));
4428 CallStacks.insert({CallStacks.size(), StackIdIndices});
4441 assert(!CallStacks.empty());
4447 Builder.
build(std::move(CallStacks),
nullptr,
4451 return Builder.takeCallStackPos();
4456 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
bool PerModule,
4457 std::function<
unsigned(
const ValueInfo &VI)> GetValueID,
4458 std::function<
unsigned(
unsigned)> GetStackIndex,
4459 bool WriteContextSizeInfoIndex,
4464 for (
auto &CI : FS->callsites()) {
4468 assert(!PerModule || (CI.Clones.size() == 1 && CI.Clones[0] == 0));
4469 Record.push_back(GetValueID(CI.Callee));
4471 Record.push_back(CI.StackIdIndices.size());
4472 Record.push_back(CI.Clones.size());
4474 for (
auto Id : CI.StackIdIndices)
4475 Record.push_back(GetStackIndex(Id));
4483 for (
auto &AI : FS->allocs()) {
4487 assert(!PerModule || (AI.Versions.size() == 1 && AI.Versions[0] == 0));
4488 Record.push_back(AI.MIBs.size());
4490 Record.push_back(AI.Versions.size());
4491 for (
auto &MIB : AI.MIBs) {
4498 assert(CallStackCount <= CallStackPos.
size());
4499 Record.push_back(CallStackPos[CallStackCount++]);
4504 assert(AI.ContextSizeInfos.empty() ||
4505 AI.ContextSizeInfos.size() == AI.MIBs.size());
4507 if (WriteContextSizeInfoIndex && !AI.ContextSizeInfos.empty()) {
4515 ContextIds.
reserve(AI.ContextSizeInfos.size() * 2);
4516 for (
auto &Infos : AI.ContextSizeInfos) {
4517 Record.push_back(Infos.size());
4518 for (
auto [FullStackId, TotalSize] : Infos) {
4525 Record.push_back(TotalSize);
4543void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
4544 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
4545 unsigned ValueID,
unsigned FSCallsRelBFAbbrev,
4546 unsigned FSCallsProfileAbbrev,
unsigned CallsiteAbbrev,
4547 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
const Function &
F,
4548 DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
4555 Stream, FS, [&](
const ValueInfo &VI) -> std::optional<unsigned> {
4560 Stream, FS, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,
4562 [&](
const ValueInfo &VI) {
return getValueId(VI); },
4563 [&](
unsigned I) {
return I; },
4564 true, CallStackPos, CallStackCount);
4566 auto SpecialRefCnts =
FS->specialRefCounts();
4571 NameVals.
push_back(SpecialRefCnts.first);
4572 NameVals.
push_back(SpecialRefCnts.second);
4574 for (
auto &RI :
FS->refs())
4577 const bool UseRelBFRecord =
4580 for (
auto &ECI :
FS->calls()) {
4581 NameVals.
push_back(getValueId(ECI.first));
4589 (UseRelBFRecord ? FSCallsRelBFAbbrev : FSCallsProfileAbbrev);
4600void ModuleBitcodeWriterBase::writeModuleLevelReferences(
4601 const GlobalVariable &V, SmallVector<uint64_t, 64> &NameVals,
4602 unsigned FSModRefsAbbrev,
unsigned FSModVTableRefsAbbrev) {
4603 auto VI =
Index->getValueInfo(
V.getGUID());
4604 if (!VI ||
VI.getSummaryList().empty()) {
4610 auto *
Summary =
VI.getSummaryList()[0].get();
4616 auto VTableFuncs =
VS->vTableFuncs();
4617 if (!VTableFuncs.empty())
4620 unsigned SizeBeforeRefs = NameVals.
size();
4621 for (
auto &RI :
VS->refs())
4627 if (VTableFuncs.empty())
4632 for (
auto &
P : VTableFuncs) {
4638 FSModVTableRefsAbbrev);
4645void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
4648 bool IsThinLTO =
true;
4651 IsThinLTO = MD->getZExtValue();
4663 if (
Index->enableSplitLTOUnit())
4665 if (
Index->hasUnifiedLTO())
4675 auto Abbv = std::make_shared<BitCodeAbbrev>();
4681 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4683 for (
const auto &GVI : valueIds()) {
4685 ArrayRef<uint32_t>{GVI.second,
4686 static_cast<uint32_t
>(GVI.first >> 32),
4687 static_cast<uint32_t
>(GVI.first)},
4691 if (!
Index->stackIds().empty()) {
4692 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4699 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4700 SmallVector<uint32_t> Vals;
4702 for (
auto Id :
Index->stackIds()) {
4703 Vals.
push_back(
static_cast<uint32_t
>(Id >> 32));
4704 Vals.
push_back(
static_cast<uint32_t
>(Id));
4709 unsigned ContextIdAbbvId = 0;
4712 auto ContextIdAbbv = std::make_shared<BitCodeAbbrev>();
4724 ContextIdAbbvId = Stream.
EmitAbbrev(std::move(ContextIdAbbv));
4728 Abbv = std::make_shared<BitCodeAbbrev>();
4740 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4743 Abbv = std::make_shared<BitCodeAbbrev>();
4755 unsigned FSCallsRelBFAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4758 Abbv = std::make_shared<BitCodeAbbrev>();
4764 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4767 Abbv = std::make_shared<BitCodeAbbrev>();
4775 unsigned FSModVTableRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4778 Abbv = std::make_shared<BitCodeAbbrev>();
4783 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4786 Abbv = std::make_shared<BitCodeAbbrev>();
4793 unsigned TypeIdCompatibleVtableAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4795 Abbv = std::make_shared<BitCodeAbbrev>();
4801 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4803 Abbv = std::make_shared<BitCodeAbbrev>();
4810 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4812 Abbv = std::make_shared<BitCodeAbbrev>();
4817 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4824 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
4825 for (
const Function &
F : M) {
4831 ValueInfo
VI =
Index->getValueInfo(
F.getGUID());
4832 if (!VI ||
VI.getSummaryList().empty()) {
4838 auto *
Summary =
VI.getSummaryList()[0].get();
4841 FS, [](
unsigned I) {
return I; }, CallStacks);
4845 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
4846 if (!CallStacks.
empty()) {
4854 SmallVector<uint64_t, 64> NameVals;
4857 for (
const Function &
F : M) {
4863 ValueInfo
VI =
Index->getValueInfo(
F.getGUID());
4864 if (!VI ||
VI.getSummaryList().empty()) {
4870 auto *
Summary =
VI.getSummaryList()[0].get();
4871 writePerModuleFunctionSummaryRecord(
4872 NameVals, Summary, VE.
getValueID(&
F), FSCallsRelBFAbbrev,
4873 FSCallsProfileAbbrev, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,
F,
4874 CallStackPos, CallStackCount);
4879 for (
const GlobalVariable &
G :
M.globals())
4880 writeModuleLevelReferences(
G, NameVals, FSModRefsAbbrev,
4881 FSModVTableRefsAbbrev);
4883 for (
const GlobalAlias &
A :
M.aliases()) {
4884 auto *Aliasee =
A.getAliaseeObject();
4900 for (
auto &S :
Index->typeIdCompatibleVtableMap()) {
4904 TypeIdCompatibleVtableAbbrev);
4908 if (
Index->getBlockCount())
4910 ArrayRef<uint64_t>{
Index->getBlockCount()});
4916void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
4925 auto Abbv = std::make_shared<BitCodeAbbrev>();
4931 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4933 for (
const auto &GVI : valueIds()) {
4935 ArrayRef<uint32_t>{GVI.second,
4936 static_cast<uint32_t
>(GVI.first >> 32),
4937 static_cast<uint32_t
>(GVI.first)},
4943 if (!StackIds.empty()) {
4944 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4951 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4952 SmallVector<uint32_t> Vals;
4953 Vals.
reserve(StackIds.size() * 2);
4954 for (
auto Id : StackIds) {
4955 Vals.
push_back(
static_cast<uint32_t
>(Id >> 32));
4956 Vals.
push_back(
static_cast<uint32_t
>(Id));
4962 Abbv = std::make_shared<BitCodeAbbrev>();
4976 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4979 Abbv = std::make_shared<BitCodeAbbrev>();
4986 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4989 Abbv = std::make_shared<BitCodeAbbrev>();
4995 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4997 Abbv = std::make_shared<BitCodeAbbrev>();
5005 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5007 Abbv = std::make_shared<BitCodeAbbrev>();
5018 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5020 auto shouldImportValueAsDecl = [&](GlobalValueSummary *GVS) ->
bool {
5021 if (DecSummaries ==
nullptr)
5023 return DecSummaries->count(GVS);
5031 DenseMap<const GlobalValueSummary *, unsigned> SummaryToValueIdMap;
5033 SmallVector<uint64_t, 64> NameVals;
5037 std::set<GlobalValue::GUID> ReferencedTypeIds;
5041 auto MaybeEmitOriginalName = [&](GlobalValueSummary &S) {
5051 NameVals.
push_back(S.getOriginalName());
5056 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
5058 Abbv = std::make_shared<BitCodeAbbrev>();
5063 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5070 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
5071 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
5077 GlobalValueSummary *S =
I.second;
5090 return StackIdIndicesToIndex[
I];
5096 if (!CallStacks.
empty()) {
5106 DenseSet<GlobalValue::GUID> DefOrUseGUIDs;
5107 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
5108 GlobalValueSummary *S =
I.second;
5110 DefOrUseGUIDs.
insert(
I.first);
5111 for (
const ValueInfo &VI : S->
refs())
5112 DefOrUseGUIDs.
insert(
VI.getGUID());
5114 auto ValueId = getValueId(
I.first);
5116 SummaryToValueIdMap[S] = *ValueId;
5134 NameVals.
push_back(ModuleIdMap[
VS->modulePath()]);
5138 for (
auto &RI :
VS->refs()) {
5139 auto RefValueId = getValueId(RI.getGUID());
5149 MaybeEmitOriginalName(*S);
5153 auto GetValueId = [&](
const ValueInfo &
VI) -> std::optional<unsigned> {
5155 return std::nullopt;
5156 return getValueId(
VI.getGUID());
5164 Stream, FS, CallsiteAbbrev, AllocAbbrev, 0,
5167 [&](
const ValueInfo &VI) ->
unsigned {
5168 std::optional<unsigned> ValueID = GetValueId(VI);
5183 return StackIdIndicesToIndex[
I];
5185 false, CallStackPos, CallStackCount);
5189 NameVals.
push_back(ModuleIdMap[
FS->modulePath()]);
5202 unsigned Count = 0, RORefCnt = 0, WORefCnt = 0;
5203 for (
auto &RI :
FS->refs()) {
5204 auto RefValueId = getValueId(RI.getGUID());
5208 if (RI.isReadOnly())
5210 else if (RI.isWriteOnly())
5214 NameVals[6] =
Count;
5215 NameVals[7] = RORefCnt;
5216 NameVals[8] = WORefCnt;
5218 for (
auto &EI :
FS->calls()) {
5221 std::optional<unsigned> CallValueId = GetValueId(EI.first);
5230 FSCallsProfileAbbrev);
5232 MaybeEmitOriginalName(*S);
5235 for (
auto *AS : Aliases) {
5236 auto AliasValueId = SummaryToValueIdMap[AS];
5243 auto AliaseeValueId = SummaryToValueIdMap[&AS->
getAliasee()];
5250 MaybeEmitOriginalName(*AS);
5257 auto EmitCfiFunctions = [&](
const CfiFunctionIndex &CfiIndex,
5259 if (CfiIndex.
empty())
5262 auto Defs = CfiIndex.
forGuid(GUID);
5265 if (Functions.
empty())
5268 for (
const auto &S : Functions) {
5282 for (
auto &
T : ReferencedTypeIds) {
5283 auto TidIter =
Index.typeIds().equal_range(
T);
5284 for (
const auto &[GUID, TypeIdPair] :
make_range(TidIter)) {
5292 if (
Index.getBlockCount())
5294 ArrayRef<uint64_t>{
Index.getBlockCount()});
5305 auto Abbv = std::make_shared<BitCodeAbbrev>();
5309 auto StringAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5311 "LLVM" LLVM_VERSION_STRING, StringAbbrev);
5314 Abbv = std::make_shared<BitCodeAbbrev>();
5317 auto EpochAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5323void ModuleBitcodeWriter::writeModuleHash(StringRef View) {
5328 Hasher.
update(ArrayRef<uint8_t>(
5329 reinterpret_cast<const uint8_t *
>(
View.data()),
View.size()));
5330 std::array<uint8_t, 20> Hash = Hasher.
result();
5331 for (
int Pos = 0; Pos < 20; Pos += 4) {
5344void ModuleBitcodeWriter::write() {
5352 writeModuleVersion();
5361 writeAttributeGroupTable();
5364 writeAttributeTable();
5373 writeModuleConstants();
5376 writeModuleMetadataKinds();
5379 writeModuleMetadata();
5383 writeUseListBlock(
nullptr);
5385 writeOperandBundleTags();
5386 writeSyncScopeNames();
5389 DenseMap<const Function *, uint64_t> FunctionToBitcodeIndex;
5390 for (
const Function &
F : M)
5391 if (!
F.isDeclaration())
5392 writeFunction(
F, FunctionToBitcodeIndex);
5397 writePerModuleGlobalValueSummary();
5399 writeGlobalValueSymbolTable(FunctionToBitcodeIndex);
5427 unsigned CPUType = ~0U;
5434 DARWIN_CPU_ARCH_ABI64 = 0x01000000,
5435 DARWIN_CPU_TYPE_X86 = 7,
5436 DARWIN_CPU_TYPE_ARM = 12,
5437 DARWIN_CPU_TYPE_POWERPC = 18
5442 CPUType = DARWIN_CPU_TYPE_X86 | DARWIN_CPU_ARCH_ABI64;
5444 CPUType = DARWIN_CPU_TYPE_X86;
5446 CPUType = DARWIN_CPU_TYPE_POWERPC;
5448 CPUType = DARWIN_CPU_TYPE_POWERPC | DARWIN_CPU_ARCH_ABI64;
5450 CPUType = DARWIN_CPU_TYPE_ARM;
5454 "Expected header size to be reserved");
5459 unsigned Position = 0;
5467 while (Buffer.
size() & 15)
5474 Stream.
Emit((
unsigned)
'B', 8);
5475 Stream.
Emit((
unsigned)
'C', 8);
5476 Stream.
Emit(0x0, 4);
5477 Stream.
Emit(0xC, 4);
5478 Stream.
Emit(0xE, 4);
5479 Stream.
Emit(0xD, 4);
5497 auto Abbv = std::make_shared<BitCodeAbbrev>();
5500 auto AbbrevNo = Stream->
EmitAbbrev(std::move(Abbv));
5508 assert(!WroteStrtab && !WroteSymtab);
5514 if (M->getModuleInlineAsm().empty())
5518 const Triple TT(M->getTargetTriple());
5520 if (!
T || !
T->hasMCAsmParser())
5542 std::vector<char> Strtab;
5543 StrtabBuilder.finalizeInOrder();
5544 Strtab.resize(StrtabBuilder.getSize());
5545 StrtabBuilder.write((
uint8_t *)Strtab.data());
5548 {Strtab.data(), Strtab.size()});
5559 bool ShouldPreserveUseListOrder,
5568 assert(M.isMaterialized());
5569 Mods.push_back(
const_cast<Module *
>(&M));
5571 ModuleBitcodeWriter ModuleWriter(M, StrtabBuilder, *Stream,
5572 ShouldPreserveUseListOrder, Index,
5573 GenerateHash, ModHash);
5574 ModuleWriter.write();
5581 IndexBitcodeWriter IndexWriter(*Stream, StrtabBuilder, *Index, DecSummaries,
5582 ModuleToSummariesForIndex);
5583 IndexWriter.write();
5588 bool ShouldPreserveUseListOrder,
5592 Writer.writeModule(M, ShouldPreserveUseListOrder, Index, GenerateHash,
5594 Writer.writeSymtab();
5595 Writer.writeStrtab();
5597 Triple TT(M.getTargetTriple());
5598 if (TT.isOSDarwin() || TT.isOSBinFormatMachO()) {
5616void IndexBitcodeWriter::write() {
5619 writeModuleVersion();
5625 writeCombinedGlobalValueSummary();
5642 Writer.
writeIndex(&Index, ModuleToSummariesForIndex, DecSummaries);
5651class ThinLinkBitcodeWriter :
public ModuleBitcodeWriterBase {
5661 : ModuleBitcodeWriterBase(M, StrtabBuilder, Stream,
5663 ModHash(&ModHash) {}
5668 void writeSimplifiedModuleInfo();
5678void ThinLinkBitcodeWriter::writeSimplifiedModuleInfo() {
5690 auto Abbv = std::make_shared<BitCodeAbbrev>();
5693 Abbv->Add(AbbrevOpToUse);
5694 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5696 for (
const auto P :
M.getSourceFileName())
5760void ThinLinkBitcodeWriter::write() {
5763 writeModuleVersion();
5765 writeSimplifiedModuleInfo();
5767 writePerModuleGlobalValueSummary();
5784 assert(M.isMaterialized());
5785 Mods.push_back(
const_cast<Module *
>(&M));
5787 ThinLinkBitcodeWriter ThinLinkWriter(M, StrtabBuilder, *Stream, Index,
5789 ThinLinkWriter.write();
5810 switch (
T.getObjectFormat()) {
5812 return "__LLVM,__bitcode";
5837 switch (
T.getObjectFormat()) {
5839 return "__LLVM,__cmdline";
5865 const std::vector<uint8_t> &CmdArgs) {
5870 Type *UsedElementType = Used ? Used->getValueType()->getArrayElementType()
5872 for (
auto *GV : UsedGlobals) {
5873 if (GV->getName() !=
"llvm.embedded.module" &&
5874 GV->getName() !=
"llvm.cmdline")
5879 Used->eraseFromParent();
5884 Triple T(M.getTargetTriple());
5913 M.getGlobalVariable(
"llvm.embedded.module",
true)) {
5914 assert(Old->hasZeroLiveUses() &&
5915 "llvm.embedded.module can only be used once in llvm.compiler.used");
5917 Old->eraseFromParent();
5919 GV->
setName(
"llvm.embedded.module");
5937 assert(Old->hasZeroLiveUses() &&
5938 "llvm.cmdline can only be used once in llvm.compiler.used");
5940 Old->eraseFromParent();
5946 if (UsedArray.
empty())
5954 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
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_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_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
LLVM_ABI Error write(MCStreamer &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue)
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
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