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."));
119 cl::desc(
"Preserve use-list order when writing LLVM bitcode."));
134 VST_BBENTRY_6_ABBREV,
138 CONSTANTS_INTEGER_ABBREV,
139 CONSTANTS_CE_CAST_Abbrev,
140 CONSTANTS_NULL_Abbrev,
144 FUNCTION_INST_STORE_ABBREV,
145 FUNCTION_INST_UNOP_ABBREV,
146 FUNCTION_INST_UNOP_FLAGS_ABBREV,
147 FUNCTION_INST_BINOP_ABBREV,
148 FUNCTION_INST_BINOP_FLAGS_ABBREV,
149 FUNCTION_INST_CAST_ABBREV,
150 FUNCTION_INST_CAST_FLAGS_ABBREV,
151 FUNCTION_INST_RET_VOID_ABBREV,
152 FUNCTION_INST_RET_VAL_ABBREV,
153 FUNCTION_INST_BR_UNCOND_ABBREV,
154 FUNCTION_INST_BR_COND_ABBREV,
155 FUNCTION_INST_UNREACHABLE_ABBREV,
156 FUNCTION_INST_GEP_ABBREV,
157 FUNCTION_INST_CMP_ABBREV,
158 FUNCTION_INST_CMP_FLAGS_ABBREV,
159 FUNCTION_DEBUG_RECORD_VALUE_ABBREV,
160 FUNCTION_DEBUG_LOC_ABBREV,
165class BitcodeWriterBase {
168 BitstreamWriter &Stream;
170 StringTableBuilder &StrtabBuilder;
175 BitcodeWriterBase(BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder)
176 : Stream(Stream), StrtabBuilder(StrtabBuilder) {}
179 void writeModuleVersion();
182void BitcodeWriterBase::writeModuleVersion() {
189class ModuleBitcodeWriterBase :
public BitcodeWriterBase {
198 const ModuleSummaryIndex *Index;
203 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
206 unsigned GlobalValueId;
210 uint64_t VSTOffsetPlaceholder = 0;
215 ModuleBitcodeWriterBase(
const Module &M, StringTableBuilder &StrtabBuilder,
216 BitstreamWriter &Stream,
217 bool ShouldPreserveUseListOrder,
218 const ModuleSummaryIndex *Index)
219 : BitcodeWriterBase(Stream, StrtabBuilder),
M(
M),
222 : ShouldPreserveUseListOrder),
232 for (
const auto &GUIDSummaryLists : *Index)
234 for (
auto &Summary : GUIDSummaryLists.second.getSummaryList())
240 for (auto &CallEdge : FS->calls())
241 if (!CallEdge.first.haveGVs() || !CallEdge.first.getValue())
242 assignValueId(CallEdge.first.getGUID());
248 for (auto &RefEdge : FS->refs())
249 if (!RefEdge.haveGVs() || !RefEdge.getValue())
250 assignValueId(RefEdge.getGUID());
255 void writePerModuleGlobalValueSummary();
258 void writePerModuleFunctionSummaryRecord(
259 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
260 unsigned ValueID,
unsigned FSCallsProfileAbbrev,
unsigned CallsiteAbbrev,
261 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
const Function &
F,
262 DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
264 void writeModuleLevelReferences(
const GlobalVariable &V,
265 SmallVector<uint64_t, 64> &NameVals,
266 unsigned FSModRefsAbbrev,
267 unsigned FSModVTableRefsAbbrev);
270 GUIDToValueIdMap[ValGUID] = ++GlobalValueId;
274 const auto &VMI = GUIDToValueIdMap.find(ValGUID);
277 assert(VMI != GUIDToValueIdMap.end() &&
278 "GUID does not have assigned value Id");
283 unsigned getValueId(ValueInfo VI) {
284 if (!
VI.haveGVs() || !
VI.getValue())
285 return getValueId(
VI.getGUID());
289 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
293class ModuleBitcodeWriter :
public ModuleBitcodeWriterBase {
304 uint64_t BitcodeStartBit;
309 ModuleBitcodeWriter(
const Module &M, StringTableBuilder &StrtabBuilder,
310 BitstreamWriter &Stream,
bool ShouldPreserveUseListOrder,
311 const ModuleSummaryIndex *Index,
bool GenerateHash,
313 : ModuleBitcodeWriterBase(
M, StrtabBuilder, Stream,
314 ShouldPreserveUseListOrder,
Index),
315 GenerateHash(GenerateHash), ModHash(ModHash),
316 BitcodeStartBit(Stream.GetCurrentBitNo()) {}
322 uint64_t bitcodeStartBit() {
return BitcodeStartBit; }
324 size_t addToStrtab(StringRef Str);
326 void writeAttributeGroupTable();
327 void writeAttributeTable();
328 void writeTypeTable();
330 void writeValueSymbolTableForwardDecl();
331 void writeModuleInfo();
332 void writeValueAsMetadata(
const ValueAsMetadata *MD,
333 SmallVectorImpl<uint64_t> &Record);
334 void writeMDTuple(
const MDTuple *
N, SmallVectorImpl<uint64_t> &Record,
336 unsigned createDILocationAbbrev();
337 void writeDILocation(
const DILocation *
N, SmallVectorImpl<uint64_t> &Record,
339 unsigned createGenericDINodeAbbrev();
341 SmallVectorImpl<uint64_t> &Record,
unsigned &Abbrev);
342 void writeDISubrange(
const DISubrange *
N, SmallVectorImpl<uint64_t> &Record,
345 SmallVectorImpl<uint64_t> &Record,
348 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
352 SmallVectorImpl<uint64_t> &Record,
355 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
357 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
359 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
361 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
363 SmallVectorImpl<uint64_t> &Record,
365 void writeDIFile(
const DIFile *
N, SmallVectorImpl<uint64_t> &Record,
368 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
370 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
372 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
374 SmallVectorImpl<uint64_t> &Record,
377 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
380 void writeDIMacro(
const DIMacro *
N, SmallVectorImpl<uint64_t> &Record,
384 void writeDIArgList(
const DIArgList *
N, SmallVectorImpl<uint64_t> &Record);
385 void writeDIModule(
const DIModule *
N, SmallVectorImpl<uint64_t> &Record,
387 void writeDIAssignID(
const DIAssignID *
N, SmallVectorImpl<uint64_t> &Record,
390 SmallVectorImpl<uint64_t> &Record,
393 SmallVectorImpl<uint64_t> &Record,
396 SmallVectorImpl<uint64_t> &Record,
399 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
401 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
403 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
405 SmallVectorImpl<uint64_t> &Record,
408 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
410 SmallVectorImpl<uint64_t> &Record,
412 unsigned createNamedMetadataAbbrev();
413 void writeNamedMetadata(SmallVectorImpl<uint64_t> &Record);
414 unsigned createMetadataStringsAbbrev();
416 SmallVectorImpl<uint64_t> &Record);
418 SmallVectorImpl<uint64_t> &Record,
419 std::vector<unsigned> *MDAbbrevs =
nullptr,
420 std::vector<uint64_t> *IndexPos =
nullptr);
421 void writeModuleMetadata();
422 void writeFunctionMetadata(
const Function &
F);
423 void writeFunctionMetadataAttachment(
const Function &
F);
424 void pushGlobalMetadataAttachment(SmallVectorImpl<uint64_t> &Record,
425 const GlobalObject &GO);
426 void writeModuleMetadataKinds();
427 void writeOperandBundleTags();
428 void writeSyncScopeNames();
429 void writeConstants(
unsigned FirstVal,
unsigned LastVal,
bool isGlobal);
430 void writeModuleConstants();
431 bool pushValueAndType(
const Value *V,
unsigned InstID,
432 SmallVectorImpl<unsigned> &Vals);
433 bool pushValueOrMetadata(
const Value *V,
unsigned InstID,
434 SmallVectorImpl<unsigned> &Vals);
435 void writeOperandBundles(
const CallBase &CB,
unsigned InstID);
436 void pushValue(
const Value *V,
unsigned InstID,
437 SmallVectorImpl<unsigned> &Vals);
438 void pushValueSigned(
const Value *V,
unsigned InstID,
439 SmallVectorImpl<uint64_t> &Vals);
440 void writeInstruction(
const Instruction &
I,
unsigned InstID,
441 SmallVectorImpl<unsigned> &Vals);
442 void writeFunctionLevelValueSymbolTable(
const ValueSymbolTable &VST);
443 void writeGlobalValueSymbolTable(
444 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
445 void writeUseList(UseListOrder &&Order);
446 void writeUseListBlock(
const Function *
F);
448 writeFunction(
const Function &
F,
449 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
450 void writeBlockInfo();
451 void writeModuleHash(StringRef View);
454 return unsigned(SSID);
457 unsigned getEncodedAlign(MaybeAlign Alignment) {
return encode(Alignment); }
461class IndexBitcodeWriter :
public BitcodeWriterBase {
463 const ModuleSummaryIndex &
Index;
476 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
480 std::vector<uint64_t> StackIds;
485 DenseMap<unsigned, unsigned> StackIdIndicesToIndex;
488 unsigned GlobalValueId = 0;
492 DenseMap<StringRef, uint64_t> ModuleIdMap;
502 BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder,
503 const ModuleSummaryIndex &Index,
506 : BitcodeWriterBase(Stream, StrtabBuilder),
Index(
Index),
507 DecSummaries(DecSummaries),
508 ModuleToSummariesForIndex(ModuleToSummariesForIndex) {
512 auto RecordStackIdReference = [&](
unsigned StackIdIndex) {
517 StackIdIndicesToIndex.
insert({StackIdIndex, StackIds.size()});
519 StackIds.push_back(
Index.getStackIdAtIndex(StackIdIndex));
526 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
527 GUIDToValueIdMap[
I.first] = ++GlobalValueId;
539 for (
auto &CI :
FS->callsites()) {
550 if (CI.StackIdIndices.empty()) {
551 GUIDToValueIdMap[CI.Callee.getGUID()] = ++GlobalValueId;
554 for (
auto Idx : CI.StackIdIndices)
555 RecordStackIdReference(Idx);
558 for (
auto &AI :
FS->allocs())
559 for (
auto &MIB : AI.MIBs)
560 for (
auto Idx : MIB.StackIdIndices)
561 RecordStackIdReference(Idx);
567 using GVInfo = std::pair<GlobalValue::GUID, GlobalValueSummary *>;
572 template<
typename Functor>
573 void forEachSummary(Functor Callback) {
574 if (ModuleToSummariesForIndex) {
575 for (
auto &M : *ModuleToSummariesForIndex)
576 for (
auto &Summary :
M.second) {
582 Callback({AS->getAliaseeGUID(), &AS->getAliasee()},
true);
585 for (
auto &Summaries : Index)
586 for (
auto &Summary : Summaries.second.getSummaryList())
595 template <
typename Functor>
void forEachModule(Functor Callback) {
596 if (ModuleToSummariesForIndex) {
597 for (
const auto &M : *ModuleToSummariesForIndex) {
598 const auto &MPI =
Index.modulePaths().find(
M.first);
599 if (MPI ==
Index.modulePaths().end()) {
603 assert(ModuleToSummariesForIndex->size() == 1);
613 std::vector<StringRef> ModulePaths;
614 for (
auto &[ModPath,
_] :
Index.modulePaths())
615 ModulePaths.push_back(ModPath);
617 for (
auto &ModPath : ModulePaths)
626 void writeModStrings();
627 void writeCombinedGlobalValueSummary();
630 auto VMI = GUIDToValueIdMap.find(ValGUID);
631 if (VMI == GUIDToValueIdMap.end())
636 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
671 case Instruction::Add:
673 case Instruction::Sub:
675 case Instruction::Mul:
678 case Instruction::FDiv:
681 case Instruction::FRem:
755 case Attribute::Alignment:
757 case Attribute::AllocAlign:
759 case Attribute::AllocSize:
761 case Attribute::AlwaysInline:
763 case Attribute::Builtin:
765 case Attribute::ByVal:
767 case Attribute::Convergent:
769 case Attribute::InAlloca:
771 case Attribute::Cold:
773 case Attribute::DisableSanitizerInstrumentation:
775 case Attribute::FnRetThunkExtern:
779 case Attribute::ElementType:
781 case Attribute::HybridPatchable:
783 case Attribute::InlineHint:
785 case Attribute::InReg:
787 case Attribute::JumpTable:
789 case Attribute::MinSize:
791 case Attribute::AllocatedPointer:
793 case Attribute::AllocKind:
795 case Attribute::Memory:
797 case Attribute::NoFPClass:
799 case Attribute::Naked:
801 case Attribute::Nest:
803 case Attribute::NoAlias:
805 case Attribute::NoBuiltin:
807 case Attribute::NoCallback:
809 case Attribute::NoDivergenceSource:
811 case Attribute::NoDuplicate:
813 case Attribute::NoFree:
815 case Attribute::NoImplicitFloat:
817 case Attribute::NoInline:
819 case Attribute::NoRecurse:
821 case Attribute::NoMerge:
823 case Attribute::NonLazyBind:
825 case Attribute::NonNull:
827 case Attribute::Dereferenceable:
829 case Attribute::DereferenceableOrNull:
831 case Attribute::NoRedZone:
833 case Attribute::NoReturn:
835 case Attribute::NoSync:
837 case Attribute::NoCfCheck:
839 case Attribute::NoProfile:
841 case Attribute::SkipProfile:
843 case Attribute::NoUnwind:
845 case Attribute::NoSanitizeBounds:
847 case Attribute::NoSanitizeCoverage:
849 case Attribute::NullPointerIsValid:
851 case Attribute::OptimizeForDebugging:
853 case Attribute::OptForFuzzing:
855 case Attribute::OptimizeForSize:
857 case Attribute::OptimizeNone:
859 case Attribute::ReadNone:
861 case Attribute::ReadOnly:
863 case Attribute::Returned:
865 case Attribute::ReturnsTwice:
867 case Attribute::SExt:
869 case Attribute::Speculatable:
871 case Attribute::StackAlignment:
873 case Attribute::StackProtect:
875 case Attribute::StackProtectReq:
877 case Attribute::StackProtectStrong:
879 case Attribute::SafeStack:
881 case Attribute::ShadowCallStack:
883 case Attribute::StrictFP:
885 case Attribute::StructRet:
887 case Attribute::SanitizeAddress:
889 case Attribute::SanitizeAllocToken:
891 case Attribute::SanitizeHWAddress:
893 case Attribute::SanitizeThread:
895 case Attribute::SanitizeType:
897 case Attribute::SanitizeMemory:
899 case Attribute::SanitizeNumericalStability:
901 case Attribute::SanitizeRealtime:
903 case Attribute::SanitizeRealtimeBlocking:
905 case Attribute::SpeculativeLoadHardening:
907 case Attribute::SwiftError:
909 case Attribute::SwiftSelf:
911 case Attribute::SwiftAsync:
913 case Attribute::UWTable:
915 case Attribute::VScaleRange:
917 case Attribute::WillReturn:
919 case Attribute::WriteOnly:
921 case Attribute::ZExt:
923 case Attribute::ImmArg:
925 case Attribute::SanitizeMemTag:
927 case Attribute::Preallocated:
929 case Attribute::NoUndef:
931 case Attribute::ByRef:
933 case Attribute::MustProgress:
935 case Attribute::PresplitCoroutine:
937 case Attribute::Writable:
939 case Attribute::CoroDestroyOnlyWhenComplete:
941 case Attribute::CoroElideSafe:
943 case Attribute::DeadOnUnwind:
945 case Attribute::Range:
947 case Attribute::Initializes:
949 case Attribute::NoExt:
951 case Attribute::Captures:
953 case Attribute::DeadOnReturn:
955 case Attribute::NoCreateUndefOrPoison:
957 case Attribute::DenormalFPEnv:
959 case Attribute::NoOutline:
985 unsigned NumWords =
A.getActiveWords();
986 const uint64_t *RawData =
A.getRawData();
987 for (
unsigned i = 0; i < NumWords; i++)
1007void ModuleBitcodeWriter::writeAttributeGroupTable() {
1008 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
1010 if (AttrGrps.empty())
return;
1014 SmallVector<uint64_t, 64>
Record;
1016 unsigned AttrListIndex = Pair.first;
1017 AttributeSet AS = Pair.second;
1019 Record.push_back(AttrListIndex);
1022 if (Attr.isEnumAttribute()) {
1025 }
else if (Attr.isIntAttribute()) {
1027 Attribute::AttrKind
Kind = Attr.getKindAsEnum();
1029 if (Kind == Attribute::Memory) {
1034 Record.push_back(Attr.getValueAsInt());
1036 }
else if (Attr.isStringAttribute()) {
1037 StringRef
Kind = Attr.getKindAsString();
1038 StringRef Val = Attr.getValueAsString();
1047 }
else if (Attr.isTypeAttribute()) {
1048 Type *Ty = Attr.getValueAsType();
1049 Record.push_back(Ty ? 6 : 5);
1053 }
else if (Attr.isConstantRangeAttribute()) {
1059 assert(Attr.isConstantRangeListAttribute());
1065 for (
auto &CR : Val)
1077void ModuleBitcodeWriter::writeAttributeTable() {
1079 if (
Attrs.empty())
return;
1083 SmallVector<uint64_t, 64>
Record;
1084 for (
const AttributeList &AL : Attrs) {
1085 for (
unsigned i :
AL.indexes()) {
1086 AttributeSet AS =
AL.getAttributes(i);
1099void ModuleBitcodeWriter::writeTypeTable() {
1103 SmallVector<uint64_t, 64> TypeVals;
1108 auto Abbv = std::make_shared<BitCodeAbbrev>();
1110 Abbv->Add(BitCodeAbbrevOp(0));
1111 unsigned OpaquePtrAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1114 Abbv = std::make_shared<BitCodeAbbrev>();
1119 unsigned FunctionAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1122 Abbv = std::make_shared<BitCodeAbbrev>();
1127 unsigned StructAnonAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1130 Abbv = std::make_shared<BitCodeAbbrev>();
1134 unsigned StructNameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1137 Abbv = std::make_shared<BitCodeAbbrev>();
1142 unsigned StructNamedAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1145 Abbv = std::make_shared<BitCodeAbbrev>();
1149 unsigned ArrayAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1157 for (
Type *
T : TypeList) {
1158 int AbbrevToUse = 0;
1161 switch (
T->getTypeID()) {
1171 case Type::MetadataTyID:
1176 case Type::IntegerTyID:
1181 case Type::PointerTyID: {
1188 AbbrevToUse = OpaquePtrAbbrev;
1191 case Type::FunctionTyID: {
1197 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i)
1199 AbbrevToUse = FunctionAbbrev;
1202 case Type::StructTyID: {
1207 for (
Type *ET :
ST->elements())
1210 if (
ST->isLiteral()) {
1212 AbbrevToUse = StructAnonAbbrev;
1214 if (
ST->isOpaque()) {
1218 AbbrevToUse = StructNamedAbbrev;
1222 if (!
ST->getName().empty())
1228 case Type::ArrayTyID: {
1232 TypeVals.
push_back(AT->getNumElements());
1234 AbbrevToUse = ArrayAbbrev;
1237 case Type::FixedVectorTyID:
1238 case Type::ScalableVectorTyID: {
1243 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1249 case Type::TargetExtTyID: {
1255 for (
Type *InnerTy :
TET->type_params())
1260 case Type::TypedPointerTyID:
1265 Stream.
EmitRecord(Code, TypeVals, AbbrevToUse);
1306 RawFlags |= Flags.ReadNone;
1307 RawFlags |= (Flags.ReadOnly << 1);
1308 RawFlags |= (Flags.NoRecurse << 2);
1309 RawFlags |= (Flags.ReturnDoesNotAlias << 3);
1310 RawFlags |= (Flags.NoInline << 4);
1311 RawFlags |= (Flags.AlwaysInline << 5);
1312 RawFlags |= (Flags.NoUnwind << 6);
1313 RawFlags |= (Flags.MayThrow << 7);
1314 RawFlags |= (Flags.HasUnknownCall << 8);
1315 RawFlags |= (Flags.MustBeUnreachable << 9);
1322 bool ImportAsDecl =
false) {
1325 RawFlags |= Flags.NotEligibleToImport;
1326 RawFlags |= (Flags.Live << 1);
1327 RawFlags |= (Flags.DSOLocal << 2);
1328 RawFlags |= (Flags.CanAutoHide << 3);
1333 RawFlags = (RawFlags << 4) | Flags.Linkage;
1335 RawFlags |= (Flags.Visibility << 8);
1337 unsigned ImportType = Flags.ImportType | ImportAsDecl;
1338 RawFlags |= (ImportType << 10);
1340 RawFlags |= (Flags.NoRenameOnPromotion << 11);
1346 uint64_t RawFlags = Flags.MaybeReadOnly | (Flags.MaybeWriteOnly << 1) |
1347 (Flags.Constant << 2) | Flags.VCallVisibility << 3;
1390 switch (
C.getSelectionKind()) {
1414size_t ModuleBitcodeWriter::addToStrtab(StringRef Str) {
1417 return StrtabBuilder.
add(Str);
1420void ModuleBitcodeWriter::writeComdats() {
1435void ModuleBitcodeWriter::writeValueSymbolTableForwardDecl() {
1440 auto Abbv = std::make_shared<BitCodeAbbrev>();
1446 unsigned VSTOffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1462 bool isChar6 =
true;
1463 for (
char C : Str) {
1466 if ((
unsigned char)
C & 128)
1475static_assert(
sizeof(GlobalValue::SanitizerMetadata) <=
sizeof(unsigned),
1476 "Sanitizer Metadata is too large for naive serialization.");
1479 return Meta.NoAddress | (
Meta.NoHWAddress << 1) |
1480 (
Meta.Memtag << 2) | (
Meta.IsDynInit << 3);
1486void ModuleBitcodeWriter::writeModuleInfo() {
1488 if (!
M.getTargetTriple().empty())
1490 M.getTargetTriple().str(), 0 );
1491 const std::string &
DL =
M.getDataLayoutStr();
1494 if (!
M.getModuleInlineAsm().empty())
1500 std::map<std::string, unsigned> SectionMap;
1501 std::map<std::string, unsigned> GCMap;
1502 MaybeAlign MaxGVarAlignment;
1503 unsigned MaxGlobalType = 0;
1504 for (
const GlobalVariable &GV :
M.globals()) {
1505 if (MaybeAlign
A = GV.getAlign())
1506 MaxGVarAlignment = !MaxGVarAlignment ? *
A : std::max(*MaxGVarAlignment, *
A);
1507 MaxGlobalType = std::max(MaxGlobalType, VE.
getTypeID(GV.getValueType()));
1508 if (GV.hasSection()) {
1510 unsigned &
Entry = SectionMap[std::string(GV.getSection())];
1514 Entry = SectionMap.size();
1518 for (
const Function &
F : M) {
1519 if (
F.hasSection()) {
1521 unsigned &
Entry = SectionMap[std::string(
F.getSection())];
1525 Entry = SectionMap.size();
1530 unsigned &
Entry = GCMap[
F.getGC()];
1534 Entry = GCMap.size();
1540 unsigned SimpleGVarAbbrev = 0;
1541 if (!
M.global_empty()) {
1543 auto Abbv = std::make_shared<BitCodeAbbrev>();
1554 if (!MaxGVarAlignment)
1555 Abbv->Add(BitCodeAbbrevOp(0));
1557 unsigned MaxEncAlignment = getEncodedAlign(MaxGVarAlignment);
1561 if (SectionMap.empty())
1562 Abbv->Add(BitCodeAbbrevOp(0));
1567 SimpleGVarAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1581 auto Abbv = std::make_shared<BitCodeAbbrev>();
1584 Abbv->Add(AbbrevOpToUse);
1585 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1587 for (
const auto P :
M.getSourceFileName())
1596 for (
const GlobalVariable &GV :
M.globals()) {
1597 unsigned AbbrevToUse = 0;
1603 Vals.
push_back(addToStrtab(GV.getName()));
1606 Vals.
push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant());
1610 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1611 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1613 if (GV.isThreadLocal() ||
1615 GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||
1616 GV.isExternallyInitialized() ||
1618 GV.hasComdat() || GV.hasAttributes() || GV.isDSOLocal() ||
1619 GV.hasPartition() || GV.hasSanitizerMetadata() || GV.getCodeModel()) {
1623 Vals.
push_back(GV.isExternallyInitialized());
1627 auto AL = GV.getAttributesAsList(AttributeList::FunctionIndex);
1631 Vals.
push_back(addToStrtab(GV.getPartition()));
1632 Vals.
push_back(GV.getPartition().size());
1635 GV.getSanitizerMetadata())
1639 AbbrevToUse = SimpleGVarAbbrev;
1647 for (
const Function &
F : M) {
1660 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1661 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1673 F.hasPersonalityFn() ? (VE.
getValueID(
F.getPersonalityFn()) + 1) : 0);
1677 Vals.
push_back(addToStrtab(
F.getPartition()));
1679 Vals.
push_back(getEncodedAlign(
F.getPreferredAlignment()));
1681 unsigned AbbrevToUse = 0;
1687 for (
const GlobalAlias &
A :
M.aliases()) {
1694 Vals.
push_back(
A.getType()->getAddressSpace());
1702 Vals.
push_back(addToStrtab(
A.getPartition()));
1705 unsigned AbbrevToUse = 0;
1711 for (
const GlobalIFunc &
I :
M.ifuncs()) {
1717 Vals.
push_back(
I.getType()->getAddressSpace());
1722 Vals.
push_back(addToStrtab(
I.getPartition()));
1728 writeValueSymbolTableForwardDecl();
1735 if (OBO->hasNoSignedWrap())
1737 if (OBO->hasNoUnsignedWrap())
1743 if (PDI->isDisjoint())
1746 if (FPMO->hasAllowReassoc())
1748 if (FPMO->hasNoNaNs())
1750 if (FPMO->hasNoInfs())
1752 if (FPMO->hasNoSignedZeros())
1754 if (FPMO->hasAllowReciprocal())
1756 if (FPMO->hasAllowContract())
1758 if (FPMO->hasApproxFunc())
1761 if (NNI->hasNonNeg())
1764 if (TI->hasNoSignedWrap())
1766 if (TI->hasNoUnsignedWrap())
1769 if (
GEP->isInBounds())
1771 if (
GEP->hasNoUnsignedSignedWrap())
1773 if (
GEP->hasNoUnsignedWrap())
1776 if (ICmp->hasSameSign())
1783void ModuleBitcodeWriter::writeValueAsMetadata(
1784 const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
1793void ModuleBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1794 SmallVectorImpl<uint64_t> &Record,
1796 for (
const MDOperand &MDO :
N->operands()) {
1799 "Unexpected function-local metadata");
1808unsigned ModuleBitcodeWriter::createDILocationAbbrev() {
1811 auto Abbv = std::make_shared<BitCodeAbbrev>();
1824void ModuleBitcodeWriter::writeDILocation(
const DILocation *
N,
1825 SmallVectorImpl<uint64_t> &Record,
1828 Abbrev = createDILocationAbbrev();
1830 Record.push_back(
N->isDistinct());
1831 Record.push_back(
N->getLine());
1832 Record.push_back(
N->getColumn());
1835 Record.push_back(
N->isImplicitCode());
1836 Record.push_back(
N->getAtomGroup());
1837 Record.push_back(
N->getAtomRank());
1842unsigned ModuleBitcodeWriter::createGenericDINodeAbbrev() {
1845 auto Abbv = std::make_shared<BitCodeAbbrev>();
1856void ModuleBitcodeWriter::writeGenericDINode(
const GenericDINode *
N,
1857 SmallVectorImpl<uint64_t> &Record,
1860 Abbrev = createGenericDINodeAbbrev();
1862 Record.push_back(
N->isDistinct());
1863 Record.push_back(
N->getTag());
1866 for (
auto &
I :
N->operands())
1873void ModuleBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1874 SmallVectorImpl<uint64_t> &Record,
1876 const uint64_t
Version = 2 << 1;
1887void ModuleBitcodeWriter::writeDIGenericSubrange(
1888 const DIGenericSubrange *
N, SmallVectorImpl<uint64_t> &Record,
1890 Record.push_back((uint64_t)
N->isDistinct());
1900void ModuleBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1901 SmallVectorImpl<uint64_t> &Record,
1903 const uint64_t IsBigInt = 1 << 2;
1904 Record.push_back(IsBigInt | (
N->isUnsigned() << 1) |
N->isDistinct());
1905 Record.push_back(
N->getValue().getBitWidth());
1913void ModuleBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1914 SmallVectorImpl<uint64_t> &Record,
1916 const unsigned SizeIsMetadata = 0x2;
1917 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1918 Record.push_back(
N->getTag());
1921 Record.push_back(
N->getAlignInBits());
1922 Record.push_back(
N->getEncoding());
1923 Record.push_back(
N->getFlags());
1924 Record.push_back(
N->getNumExtraInhabitants());
1925 Record.push_back(
N->getDataSizeInBits());
1931void ModuleBitcodeWriter::writeDIFixedPointType(
1932 const DIFixedPointType *
N, SmallVectorImpl<uint64_t> &Record,
1934 const unsigned SizeIsMetadata = 0x2;
1935 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1936 Record.push_back(
N->getTag());
1939 Record.push_back(
N->getAlignInBits());
1940 Record.push_back(
N->getEncoding());
1941 Record.push_back(
N->getFlags());
1942 Record.push_back(
N->getKind());
1943 Record.push_back(
N->getFactorRaw());
1945 auto WriteWideInt = [&](
const APInt &
Value) {
1948 uint64_t NumWords =
Value.getActiveWords();
1949 uint64_t
Encoded = (NumWords << 32) |
Value.getBitWidth();
1950 Record.push_back(Encoded);
1954 WriteWideInt(
N->getNumeratorRaw());
1955 WriteWideInt(
N->getDenominatorRaw());
1961void ModuleBitcodeWriter::writeDIStringType(
const DIStringType *
N,
1962 SmallVectorImpl<uint64_t> &Record,
1964 const unsigned SizeIsMetadata = 0x2;
1965 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1966 Record.push_back(
N->getTag());
1972 Record.push_back(
N->getAlignInBits());
1973 Record.push_back(
N->getEncoding());
1979void ModuleBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
1980 SmallVectorImpl<uint64_t> &Record,
1982 const unsigned SizeIsMetadata = 0x2;
1983 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1984 Record.push_back(
N->getTag());
1987 Record.push_back(
N->getLine());
1991 Record.push_back(
N->getAlignInBits());
1993 Record.push_back(
N->getFlags());
1998 if (
const auto &DWARFAddressSpace =
N->getDWARFAddressSpace())
1999 Record.push_back(*DWARFAddressSpace + 1);
2005 if (
auto PtrAuthData =
N->getPtrAuthData())
2006 Record.push_back(PtrAuthData->RawData);
2014void ModuleBitcodeWriter::writeDISubrangeType(
const DISubrangeType *
N,
2015 SmallVectorImpl<uint64_t> &Record,
2017 const unsigned SizeIsMetadata = 0x2;
2018 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2021 Record.push_back(
N->getLine());
2024 Record.push_back(
N->getAlignInBits());
2025 Record.push_back(
N->getFlags());
2036void ModuleBitcodeWriter::writeDICompositeType(
2037 const DICompositeType *
N, SmallVectorImpl<uint64_t> &Record,
2039 const unsigned IsNotUsedInOldTypeRef = 0x2;
2040 const unsigned SizeIsMetadata = 0x4;
2041 Record.push_back(SizeIsMetadata | IsNotUsedInOldTypeRef |
2042 (
unsigned)
N->isDistinct());
2043 Record.push_back(
N->getTag());
2046 Record.push_back(
N->getLine());
2050 Record.push_back(
N->getAlignInBits());
2052 Record.push_back(
N->getFlags());
2054 Record.push_back(
N->getRuntimeLang());
2064 Record.push_back(
N->getNumExtraInhabitants());
2074void ModuleBitcodeWriter::writeDISubroutineType(
2075 const DISubroutineType *
N, SmallVectorImpl<uint64_t> &Record,
2077 const unsigned HasNoOldTypeRefs = 0x2;
2078 Record.push_back(HasNoOldTypeRefs | (
unsigned)
N->isDistinct());
2079 Record.push_back(
N->getFlags());
2087void ModuleBitcodeWriter::writeDIFile(
const DIFile *
N,
2088 SmallVectorImpl<uint64_t> &Record,
2090 Record.push_back(
N->isDistinct());
2093 if (
N->getRawChecksum()) {
2094 Record.push_back(
N->getRawChecksum()->Kind);
2102 auto Source =
N->getRawSource();
2110void ModuleBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
2111 SmallVectorImpl<uint64_t> &Record,
2113 assert(
N->isDistinct() &&
"Expected distinct compile units");
2116 auto Lang =
N->getSourceLanguage();
2117 Record.push_back(Lang.getName());
2120 if (Lang.hasVersionedName())
2121 Record.back() ^= (uint64_t(1) << 63);
2125 Record.push_back(
N->isOptimized());
2127 Record.push_back(
N->getRuntimeVersion());
2129 Record.push_back(
N->getEmissionKind());
2135 Record.push_back(
N->getDWOId());
2137 Record.push_back(
N->getSplitDebugInlining());
2138 Record.push_back(
N->getDebugInfoForProfiling());
2139 Record.push_back((
unsigned)
N->getNameTableKind());
2140 Record.push_back(
N->getRangesBaseAddress());
2143 Record.push_back(Lang.hasVersionedName() ? Lang.getVersion() : 0);
2149void ModuleBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
2150 SmallVectorImpl<uint64_t> &Record,
2152 const uint64_t HasUnitFlag = 1 << 1;
2153 const uint64_t HasSPFlagsFlag = 1 << 2;
2154 Record.push_back(uint64_t(
N->isDistinct()) | HasUnitFlag | HasSPFlagsFlag);
2159 Record.push_back(
N->getLine());
2161 Record.push_back(
N->getScopeLine());
2163 Record.push_back(
N->getSPFlags());
2164 Record.push_back(
N->getVirtualIndex());
2165 Record.push_back(
N->getFlags());
2170 Record.push_back(
N->getThisAdjustment());
2174 Record.push_back(
N->getKeyInstructionsEnabled());
2180void ModuleBitcodeWriter::writeDILexicalBlock(
const DILexicalBlock *
N,
2181 SmallVectorImpl<uint64_t> &Record,
2183 Record.push_back(
N->isDistinct());
2186 Record.push_back(
N->getLine());
2187 Record.push_back(
N->getColumn());
2193void ModuleBitcodeWriter::writeDILexicalBlockFile(
2194 const DILexicalBlockFile *
N, SmallVectorImpl<uint64_t> &Record,
2196 Record.push_back(
N->isDistinct());
2199 Record.push_back(
N->getDiscriminator());
2205void ModuleBitcodeWriter::writeDICommonBlock(
const DICommonBlock *
N,
2206 SmallVectorImpl<uint64_t> &Record,
2208 Record.push_back(
N->isDistinct());
2213 Record.push_back(
N->getLineNo());
2219void ModuleBitcodeWriter::writeDINamespace(
const DINamespace *
N,
2220 SmallVectorImpl<uint64_t> &Record,
2222 Record.push_back(
N->isDistinct() |
N->getExportSymbols() << 1);
2230void ModuleBitcodeWriter::writeDIMacro(
const DIMacro *
N,
2231 SmallVectorImpl<uint64_t> &Record,
2233 Record.push_back(
N->isDistinct());
2234 Record.push_back(
N->getMacinfoType());
2235 Record.push_back(
N->getLine());
2243void ModuleBitcodeWriter::writeDIMacroFile(
const DIMacroFile *
N,
2244 SmallVectorImpl<uint64_t> &Record,
2246 Record.push_back(
N->isDistinct());
2247 Record.push_back(
N->getMacinfoType());
2248 Record.push_back(
N->getLine());
2256void ModuleBitcodeWriter::writeDIArgList(
const DIArgList *
N,
2257 SmallVectorImpl<uint64_t> &Record) {
2258 Record.reserve(
N->getArgs().size());
2259 for (ValueAsMetadata *MD :
N->getArgs())
2266void ModuleBitcodeWriter::writeDIModule(
const DIModule *
N,
2267 SmallVectorImpl<uint64_t> &Record,
2269 Record.push_back(
N->isDistinct());
2270 for (
auto &
I :
N->operands())
2272 Record.push_back(
N->getLineNo());
2273 Record.push_back(
N->getIsDecl());
2279void ModuleBitcodeWriter::writeDIAssignID(
const DIAssignID *
N,
2280 SmallVectorImpl<uint64_t> &Record,
2283 Record.push_back(
N->isDistinct());
2288void ModuleBitcodeWriter::writeDITemplateTypeParameter(
2289 const DITemplateTypeParameter *
N, SmallVectorImpl<uint64_t> &Record,
2291 Record.push_back(
N->isDistinct());
2294 Record.push_back(
N->isDefault());
2300void ModuleBitcodeWriter::writeDITemplateValueParameter(
2301 const DITemplateValueParameter *
N, SmallVectorImpl<uint64_t> &Record,
2303 Record.push_back(
N->isDistinct());
2304 Record.push_back(
N->getTag());
2307 Record.push_back(
N->isDefault());
2314void ModuleBitcodeWriter::writeDIGlobalVariable(
2315 const DIGlobalVariable *
N, SmallVectorImpl<uint64_t> &Record,
2317 const uint64_t
Version = 2 << 1;
2323 Record.push_back(
N->getLine());
2325 Record.push_back(
N->isLocalToUnit());
2326 Record.push_back(
N->isDefinition());
2329 Record.push_back(
N->getAlignInBits());
2336void ModuleBitcodeWriter::writeDILocalVariable(
2337 const DILocalVariable *
N, SmallVectorImpl<uint64_t> &Record,
2352 const uint64_t HasAlignmentFlag = 1 << 1;
2353 Record.push_back((uint64_t)
N->isDistinct() | HasAlignmentFlag);
2357 Record.push_back(
N->getLine());
2359 Record.push_back(
N->getArg());
2360 Record.push_back(
N->getFlags());
2361 Record.push_back(
N->getAlignInBits());
2368void ModuleBitcodeWriter::writeDILabel(
2369 const DILabel *
N, SmallVectorImpl<uint64_t> &Record,
2371 uint64_t IsArtificialFlag = uint64_t(
N->isArtificial()) << 1;
2372 Record.push_back((uint64_t)
N->isDistinct() | IsArtificialFlag);
2376 Record.push_back(
N->getLine());
2377 Record.push_back(
N->getColumn());
2378 Record.push_back(
N->getCoroSuspendIdx().has_value()
2379 ? (uint64_t)
N->getCoroSuspendIdx().value()
2380 : std::numeric_limits<uint64_t>::max());
2386void ModuleBitcodeWriter::writeDIExpression(
const DIExpression *
N,
2387 SmallVectorImpl<uint64_t> &Record,
2389 Record.reserve(
N->getElements().size() + 1);
2390 const uint64_t
Version = 3 << 1;
2392 Record.append(
N->elements_begin(),
N->elements_end());
2398void ModuleBitcodeWriter::writeDIGlobalVariableExpression(
2399 const DIGlobalVariableExpression *
N, SmallVectorImpl<uint64_t> &Record,
2401 Record.push_back(
N->isDistinct());
2409void ModuleBitcodeWriter::writeDIObjCProperty(
const DIObjCProperty *
N,
2410 SmallVectorImpl<uint64_t> &Record,
2412 Record.push_back(
N->isDistinct());
2415 Record.push_back(
N->getLine());
2418 Record.push_back(
N->getAttributes());
2425void ModuleBitcodeWriter::writeDIImportedEntity(
2426 const DIImportedEntity *
N, SmallVectorImpl<uint64_t> &Record,
2428 Record.push_back(
N->isDistinct());
2429 Record.push_back(
N->getTag());
2432 Record.push_back(
N->getLine());
2441unsigned ModuleBitcodeWriter::createNamedMetadataAbbrev() {
2442 auto Abbv = std::make_shared<BitCodeAbbrev>();
2449void ModuleBitcodeWriter::writeNamedMetadata(
2450 SmallVectorImpl<uint64_t> &Record) {
2451 if (
M.named_metadata_empty())
2454 unsigned Abbrev = createNamedMetadataAbbrev();
2455 for (
const NamedMDNode &NMD :
M.named_metadata()) {
2457 StringRef Str = NMD.getName();
2458 Record.append(Str.bytes_begin(), Str.bytes_end());
2463 for (
const MDNode *
N : NMD.operands())
2470unsigned ModuleBitcodeWriter::createMetadataStringsAbbrev() {
2471 auto Abbv = std::make_shared<BitCodeAbbrev>();
2483void ModuleBitcodeWriter::writeMetadataStrings(
2485 if (Strings.
empty())
2493 SmallString<256> Blob;
2495 BitstreamWriter
W(Blob);
2515#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,
2516#include "llvm/IR/Metadata.def"
2520void ModuleBitcodeWriter::writeMetadataRecords(
2522 std::vector<unsigned> *MDAbbrevs, std::vector<uint64_t> *IndexPos) {
2527#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
2528#include "llvm/IR/Metadata.def"
2534 assert(
N->isResolved() &&
"Expected forward references to be resolved");
2536 switch (
N->getMetadataID()) {
2539#define HANDLE_MDNODE_LEAF(CLASS) \
2540 case Metadata::CLASS##Kind: \
2542 write##CLASS(cast<CLASS>(N), Record, \
2543 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
2545 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
2547#include "llvm/IR/Metadata.def"
2558void ModuleBitcodeWriter::writeModuleMetadata() {
2559 if (!VE.
hasMDs() &&
M.named_metadata_empty())
2563 SmallVector<uint64_t, 64>
Record;
2567 std::vector<unsigned> MDAbbrevs;
2570 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
2571 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
2572 createGenericDINodeAbbrev();
2574 auto Abbv = std::make_shared<BitCodeAbbrev>();
2578 unsigned OffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2580 Abbv = std::make_shared<BitCodeAbbrev>();
2584 unsigned IndexAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2596 uint64_t Vals[] = {0, 0};
2606 std::vector<uint64_t> IndexPos;
2610 writeMetadataRecords(VE.
getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);
2621 uint64_t PreviousValue = IndexOffsetRecordBitPos;
2622 for (
auto &Elt : IndexPos) {
2623 auto EltDelta = Elt - PreviousValue;
2624 PreviousValue = Elt;
2633 writeNamedMetadata(Record);
2635 auto AddDeclAttachedMetadata = [&](
const GlobalObject &GO) {
2636 SmallVector<uint64_t, 4>
Record;
2638 pushGlobalMetadataAttachment(Record, GO);
2641 for (
const Function &
F : M)
2642 if (
F.isDeclaration() &&
F.hasMetadata())
2643 AddDeclAttachedMetadata(
F);
2644 for (
const GlobalIFunc &GI :
M.ifuncs())
2645 if (GI.hasMetadata())
2646 AddDeclAttachedMetadata(GI);
2649 for (
const GlobalVariable &GV :
M.globals())
2650 if (GV.hasMetadata())
2651 AddDeclAttachedMetadata(GV);
2656void ModuleBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
2661 SmallVector<uint64_t, 64>
Record;
2667void ModuleBitcodeWriter::pushGlobalMetadataAttachment(
2668 SmallVectorImpl<uint64_t> &Record,
const GlobalObject &GO) {
2672 for (
const auto &
I : MDs) {
2678void ModuleBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
2681 SmallVector<uint64_t, 64>
Record;
2683 if (
F.hasMetadata()) {
2684 pushGlobalMetadataAttachment(Record,
F);
2692 for (
const BasicBlock &BB :
F)
2693 for (
const Instruction &
I : BB) {
2695 I.getAllMetadataOtherThanDebugLoc(MDs);
2698 if (MDs.
empty())
continue;
2702 for (
const auto &[
ID, MD] : MDs) {
2713void ModuleBitcodeWriter::writeModuleMetadataKinds() {
2714 SmallVector<uint64_t, 64>
Record;
2719 M.getMDKindNames(Names);
2721 if (Names.
empty())
return;
2725 for (
unsigned MDKindID = 0, e = Names.
size(); MDKindID != e; ++MDKindID) {
2726 Record.push_back(MDKindID);
2727 StringRef KName = Names[MDKindID];
2737void ModuleBitcodeWriter::writeOperandBundleTags() {
2745 M.getOperandBundleTags(Tags);
2752 SmallVector<uint64_t, 64>
Record;
2754 for (
auto Tag : Tags) {
2764void ModuleBitcodeWriter::writeSyncScopeNames() {
2766 M.getContext().getSyncScopeNames(SSNs);
2772 SmallVector<uint64_t, 64>
Record;
2773 for (
auto SSN : SSNs) {
2774 Record.append(SSN.begin(), SSN.end());
2782void ModuleBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
2784 if (FirstVal == LastVal)
return;
2788 unsigned AggregateAbbrev = 0;
2789 unsigned String8Abbrev = 0;
2790 unsigned CString7Abbrev = 0;
2791 unsigned CString6Abbrev = 0;
2795 auto Abbv = std::make_shared<BitCodeAbbrev>();
2799 AggregateAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2802 Abbv = std::make_shared<BitCodeAbbrev>();
2806 String8Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2808 Abbv = std::make_shared<BitCodeAbbrev>();
2812 CString7Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2814 Abbv = std::make_shared<BitCodeAbbrev>();
2818 CString6Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2821 SmallVector<uint64_t, 64>
Record;
2824 Type *LastTy =
nullptr;
2825 for (
unsigned i = FirstVal; i != LastVal; ++i) {
2826 const Value *
V = Vals[i].first;
2828 if (
V->getType() != LastTy) {
2829 LastTy =
V->getType();
2832 CONSTANTS_SETTYPE_ABBREV);
2839 unsigned(
IA->hasSideEffects()) |
unsigned(
IA->isAlignStack()) << 1 |
2840 unsigned(
IA->getDialect() & 1) << 2 |
unsigned(
IA->canThrow()) << 3);
2843 StringRef AsmStr =
IA->getAsmString();
2848 StringRef ConstraintStr =
IA->getConstraintString();
2856 unsigned Code = -1U;
2857 unsigned AbbrevToUse = 0;
2858 if (
C->isNullValue()) {
2865 if (
IV->getBitWidth() <= 64) {
2866 uint64_t
V =
IV->getSExtValue();
2869 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2879 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2883 APInt api = CFP->getValueAPF().bitcastToAPInt();
2885 Record.push_back((p[1] << 48) | (p[0] >> 16));
2886 Record.push_back(p[0] & 0xffffLL);
2888 APInt api = CFP->getValueAPF().bitcastToAPInt();
2893 assert(0 &&
"Unknown FP type!");
2899 uint64_t NumElts = Str->getNumElements();
2901 if (Str->isCString()) {
2906 AbbrevToUse = String8Abbrev;
2910 for (uint64_t i = 0; i != NumElts; ++i) {
2911 unsigned char V = Str->getElementAsInteger(i);
2913 isCStr7 &= (
V & 128) == 0;
2919 AbbrevToUse = CString6Abbrev;
2921 AbbrevToUse = CString7Abbrev;
2922 }
else if (
const ConstantDataSequential *CDS =
2925 Type *EltTy = CDS->getElementType();
2927 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
2928 Record.push_back(CDS->getElementAsInteger(i));
2930 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
2932 CDS->getElementAsAPFloat(i).bitcastToAPInt().getLimitedValue());
2936 for (
const Value *
Op :
C->operands())
2938 AbbrevToUse = AggregateAbbrev;
2940 switch (
CE->getOpcode()) {
2947 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2949 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
2959 case Instruction::FNeg: {
2960 assert(
CE->getNumOperands() == 1 &&
"Unknown constant expr!");
2969 case Instruction::GetElementPtr: {
2974 if (std::optional<ConstantRange>
Range = GO->getInRange()) {
2978 for (
const Value *
Op :
CE->operands()) {
2984 case Instruction::ExtractElement:
2991 case Instruction::InsertElement:
2998 case Instruction::ShuffleVector:
3003 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::UncondBr: {
3262 AbbrevToUse = FUNCTION_INST_BR_UNCOND_ABBREV;
3266 case Instruction::CondBr: {
3268 AbbrevToUse = FUNCTION_INST_BR_COND_ABBREV;
3272 pushValue(
II.getCondition(), InstID, Vals);
3274 case Instruction::Switch:
3279 pushValue(
SI.getCondition(), InstID, Vals);
3281 for (
auto Case :
SI.cases()) {
3287 case Instruction::IndirectBr:
3291 pushValue(
I.getOperand(0), InstID, Vals);
3296 case Instruction::Invoke: {
3299 FunctionType *FTy =
II->getFunctionType();
3301 if (
II->hasOperandBundles())
3302 writeOperandBundles(*
II, InstID);
3311 pushValueAndType(Callee, InstID, Vals);
3314 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3315 pushValue(
I.getOperand(i), InstID, Vals);
3318 if (FTy->isVarArg()) {
3319 for (
unsigned i = FTy->getNumParams(), e =
II->arg_size(); i != e; ++i)
3320 pushValueAndType(
I.getOperand(i), InstID, Vals);
3324 case Instruction::Resume:
3326 pushValueAndType(
I.getOperand(0), InstID, Vals);
3328 case Instruction::CleanupRet: {
3331 pushValue(CRI.getCleanupPad(), InstID, Vals);
3332 if (CRI.hasUnwindDest())
3336 case Instruction::CatchRet: {
3339 pushValue(CRI.getCatchPad(), InstID, Vals);
3343 case Instruction::CleanupPad:
3344 case Instruction::CatchPad: {
3348 pushValue(FuncletPad.getParentPad(), InstID, Vals);
3350 unsigned NumArgOperands = FuncletPad.arg_size();
3352 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op)
3353 pushValueAndType(FuncletPad.getArgOperand(
Op), InstID, Vals);
3356 case Instruction::CatchSwitch: {
3360 pushValue(CatchSwitch.getParentPad(), InstID, Vals);
3362 unsigned NumHandlers = CatchSwitch.getNumHandlers();
3364 for (
const BasicBlock *CatchPadBB : CatchSwitch.handlers())
3367 if (CatchSwitch.hasUnwindDest())
3371 case Instruction::CallBr: {
3377 writeOperandBundles(*CBI, InstID);
3392 pushValueAndType(Callee, InstID, Vals);
3395 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3396 pushValue(
I.getOperand(i), InstID, Vals);
3399 if (FTy->isVarArg()) {
3400 for (
unsigned i = FTy->getNumParams(), e = CBI->
arg_size(); i != e; ++i)
3401 pushValueAndType(
I.getOperand(i), InstID, Vals);
3405 case Instruction::Unreachable:
3407 AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;
3410 case Instruction::PHI: {
3428 Stream.
EmitRecord(Code, Vals64, AbbrevToUse);
3433 case Instruction::LandingPad: {
3444 pushValueAndType(LP.
getClause(
I), InstID, Vals);
3449 case Instruction::Alloca: {
3455 using APV = AllocaPackedValues;
3457 unsigned EncodedAlign = getEncodedAlign(AI.
getAlign());
3459 Record, EncodedAlign & ((1 << APV::AlignLower::Bits) - 1));
3461 EncodedAlign >> APV::AlignLower::Bits);
3468 if (AS !=
M.getDataLayout().getAllocaAddrSpace())
3473 case Instruction::Load:
3476 pushValueAndType(
I.getOperand(0), InstID, Vals);
3479 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3480 AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;
3490 case Instruction::Store:
3495 AbbrevToUse = FUNCTION_INST_STORE_ABBREV;
3497 if (pushValueAndType(
I.getOperand(1), InstID, Vals))
3499 if (pushValueAndType(
I.getOperand(0), InstID, Vals))
3509 case Instruction::AtomicCmpXchg:
3511 pushValueAndType(
I.getOperand(0), InstID, Vals);
3512 pushValueAndType(
I.getOperand(1), InstID, Vals);
3513 pushValue(
I.getOperand(2), InstID, Vals);
3524 case Instruction::AtomicRMW:
3526 pushValueAndType(
I.getOperand(0), InstID, Vals);
3527 pushValueAndType(
I.getOperand(1), InstID, Vals);
3536 case Instruction::Fence:
3541 case Instruction::Call: {
3546 writeOperandBundles(CI, InstID);
3566 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3570 if (FTy->isVarArg()) {
3571 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
3576 case Instruction::VAArg:
3579 pushValue(
I.getOperand(0), InstID, Vals);
3582 case Instruction::Freeze:
3584 pushValueAndType(
I.getOperand(0), InstID, Vals);
3594void ModuleBitcodeWriter::writeGlobalValueSymbolTable(
3595 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3600 VSTOffset -= bitcodeStartBit();
3601 assert((VSTOffset & 31) == 0 &&
"VST block not 32-bit aligned");
3605 Stream.
BackpatchWord(VSTOffsetPlaceholder, VSTOffset / 32 + 1);
3609 auto Abbv = std::make_shared<BitCodeAbbrev>();
3613 unsigned FnEntryAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
3615 for (
const Function &
F : M) {
3618 if (
F.isDeclaration())
3625 uint64_t BitcodeIndex = FunctionToBitcodeIndex[&
F] - bitcodeStartBit();
3626 assert((BitcodeIndex & 31) == 0 &&
"function block not 32-bit aligned");
3630 Record[1] = BitcodeIndex / 32 + 1;
3639void ModuleBitcodeWriter::writeFunctionLevelValueSymbolTable(
3640 const ValueSymbolTable &VST) {
3648 SmallVector<uint64_t, 64> NameVals;
3654 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
3663 AbbrevToUse = VST_BBENTRY_6_ABBREV;
3667 AbbrevToUse = VST_ENTRY_6_ABBREV;
3669 AbbrevToUse = VST_ENTRY_7_ABBREV;
3672 for (
const auto P :
Name.getKey())
3676 Stream.
EmitRecord(Code, NameVals, AbbrevToUse);
3683void ModuleBitcodeWriter::writeUseList(UseListOrder &&Order) {
3684 assert(Order.Shuffle.size() >= 2 &&
"Shuffle too small");
3691 SmallVector<uint64_t, 64>
Record(Order.Shuffle.begin(), Order.Shuffle.end());
3696void ModuleBitcodeWriter::writeUseListBlock(
const Function *
F) {
3698 "Expected to be preserving use-list order");
3700 auto hasMore = [&]() {
3716void ModuleBitcodeWriter::writeFunction(
3718 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3735 unsigned CstStart, CstEnd;
3737 writeConstants(CstStart, CstEnd,
false);
3740 writeFunctionMetadata(
F);
3743 unsigned InstID = CstEnd;
3745 bool NeedsMetadataAttachment =
F.hasMetadata();
3747 DILocation *LastDL =
nullptr;
3748 SmallSetVector<Function *, 4> BlockAddressUsers;
3751 for (
const BasicBlock &BB :
F) {
3752 for (
const Instruction &
I : BB) {
3753 writeInstruction(
I, InstID, Vals);
3755 if (!
I.getType()->isVoidTy())
3759 NeedsMetadataAttachment |=
I.hasMetadataOtherThanDebugLoc();
3762 if (DILocation *
DL =
I.getDebugLoc()) {
3775 FUNCTION_DEBUG_LOC_ABBREV);
3785 if (
I.hasDbgRecords()) {
3789 auto PushValueOrMetadata = [&Vals, InstID,
3792 "RawLocation unexpectedly null in DbgVariableRecord");
3794 SmallVector<unsigned, 2> ValAndType;
3798 if (!pushValueAndType(VAM->getValue(), InstID, ValAndType)) {
3812 for (DbgRecord &DR :
I.DebugMarker->getDbgRecordRange()) {
3838 FUNCTION_DEBUG_RECORD_VALUE_ABBREV);
3862 SmallPtrSet<Value *, 8> Visited{BA};
3863 while (!Worklist.
empty()) {
3865 for (User *U :
V->users()) {
3871 Visited.
insert(U).second)
3878 if (!BlockAddressUsers.
empty()) {
3887 if (
auto *Symtab =
F.getValueSymbolTable())
3888 writeFunctionLevelValueSymbolTable(*Symtab);
3890 if (NeedsMetadataAttachment)
3891 writeFunctionMetadataAttachment(
F);
3893 writeUseListBlock(&
F);
3899void ModuleBitcodeWriter::writeBlockInfo() {
3912 auto Abbv = std::make_shared<BitCodeAbbrev>();
3923 auto Abbv = std::make_shared<BitCodeAbbrev>();
3933 auto Abbv = std::make_shared<BitCodeAbbrev>();
3943 auto Abbv = std::make_shared<BitCodeAbbrev>();
3949 VST_BBENTRY_6_ABBREV)
3954 auto Abbv = std::make_shared<BitCodeAbbrev>();
3956 Abbv->Add(TypeAbbrevOp);
3958 CONSTANTS_SETTYPE_ABBREV)
3963 auto Abbv = std::make_shared<BitCodeAbbrev>();
3967 CONSTANTS_INTEGER_ABBREV)
3972 auto Abbv = std::make_shared<BitCodeAbbrev>();
3980 CONSTANTS_CE_CAST_Abbrev)
3984 auto Abbv = std::make_shared<BitCodeAbbrev>();
3987 CONSTANTS_NULL_Abbrev)
3994 auto Abbv = std::make_shared<BitCodeAbbrev>();
3996 Abbv->Add(ValAbbrevOp);
3997 Abbv->Add(TypeAbbrevOp);
4001 FUNCTION_INST_LOAD_ABBREV)
4005 auto Abbv = std::make_shared<BitCodeAbbrev>();
4007 Abbv->Add(ValAbbrevOp);
4008 Abbv->Add(ValAbbrevOp);
4012 FUNCTION_INST_STORE_ABBREV)
4016 auto Abbv = std::make_shared<BitCodeAbbrev>();
4018 Abbv->Add(ValAbbrevOp);
4021 FUNCTION_INST_UNOP_ABBREV)
4025 auto Abbv = std::make_shared<BitCodeAbbrev>();
4027 Abbv->Add(ValAbbrevOp);
4031 FUNCTION_INST_UNOP_FLAGS_ABBREV)
4035 auto Abbv = std::make_shared<BitCodeAbbrev>();
4037 Abbv->Add(ValAbbrevOp);
4038 Abbv->Add(ValAbbrevOp);
4041 FUNCTION_INST_BINOP_ABBREV)
4045 auto Abbv = std::make_shared<BitCodeAbbrev>();
4047 Abbv->Add(ValAbbrevOp);
4048 Abbv->Add(ValAbbrevOp);
4052 FUNCTION_INST_BINOP_FLAGS_ABBREV)
4056 auto Abbv = std::make_shared<BitCodeAbbrev>();
4058 Abbv->Add(ValAbbrevOp);
4059 Abbv->Add(TypeAbbrevOp);
4062 FUNCTION_INST_CAST_ABBREV)
4066 auto Abbv = std::make_shared<BitCodeAbbrev>();
4068 Abbv->Add(ValAbbrevOp);
4069 Abbv->Add(TypeAbbrevOp);
4073 FUNCTION_INST_CAST_FLAGS_ABBREV)
4078 auto Abbv = std::make_shared<BitCodeAbbrev>();
4081 FUNCTION_INST_RET_VOID_ABBREV)
4085 auto Abbv = std::make_shared<BitCodeAbbrev>();
4087 Abbv->Add(ValAbbrevOp);
4089 FUNCTION_INST_RET_VAL_ABBREV)
4093 auto Abbv = std::make_shared<BitCodeAbbrev>();
4096 Abbv->Add(ValAbbrevOp);
4098 FUNCTION_INST_BR_UNCOND_ABBREV)
4102 auto Abbv = std::make_shared<BitCodeAbbrev>();
4105 Abbv->Add(ValAbbrevOp);
4106 Abbv->Add(ValAbbrevOp);
4107 Abbv->Add(ValAbbrevOp);
4109 FUNCTION_INST_BR_COND_ABBREV)
4113 auto Abbv = std::make_shared<BitCodeAbbrev>();
4116 FUNCTION_INST_UNREACHABLE_ABBREV)
4120 auto Abbv = std::make_shared<BitCodeAbbrev>();
4123 Abbv->Add(TypeAbbrevOp);
4125 Abbv->Add(ValAbbrevOp);
4127 FUNCTION_INST_GEP_ABBREV)
4131 auto Abbv = std::make_shared<BitCodeAbbrev>();
4133 Abbv->Add(ValAbbrevOp);
4134 Abbv->Add(ValAbbrevOp);
4137 FUNCTION_INST_CMP_ABBREV)
4141 auto Abbv = std::make_shared<BitCodeAbbrev>();
4143 Abbv->Add(ValAbbrevOp);
4144 Abbv->Add(ValAbbrevOp);
4148 FUNCTION_INST_CMP_FLAGS_ABBREV)
4152 auto Abbv = std::make_shared<BitCodeAbbrev>();
4157 Abbv->Add(ValAbbrevOp);
4159 FUNCTION_DEBUG_RECORD_VALUE_ABBREV)
4163 auto Abbv = std::make_shared<BitCodeAbbrev>();
4174 FUNCTION_DEBUG_LOC_ABBREV)
4182void IndexBitcodeWriter::writeModStrings() {
4188 auto Abbv = std::make_shared<BitCodeAbbrev>();
4193 unsigned Abbrev8Bit = Stream.
EmitAbbrev(std::move(Abbv));
4196 Abbv = std::make_shared<BitCodeAbbrev>();
4201 unsigned Abbrev7Bit = Stream.
EmitAbbrev(std::move(Abbv));
4204 Abbv = std::make_shared<BitCodeAbbrev>();
4209 unsigned Abbrev6Bit = Stream.
EmitAbbrev(std::move(Abbv));
4212 Abbv = std::make_shared<BitCodeAbbrev>();
4219 unsigned AbbrevHash = Stream.
EmitAbbrev(std::move(Abbv));
4222 forEachModule([&](
const StringMapEntry<ModuleHash> &MPSE) {
4224 const auto &Hash = MPSE.
getValue();
4226 unsigned AbbrevToUse = Abbrev8Bit;
4228 AbbrevToUse = Abbrev6Bit;
4230 AbbrevToUse = Abbrev7Bit;
4232 auto ModuleId = ModuleIdMap.
size();
4233 ModuleIdMap[
Key] = ModuleId;
4242 Vals.
assign(Hash.begin(), Hash.end());
4254template <
typename Fn>
4258 if (!FS->type_tests().empty())
4263 auto WriteVFuncIdVec = [&](
uint64_t Ty,
4268 for (
auto &VF : VFs) {
4269 Record.push_back(VF.GUID);
4270 Record.push_back(VF.Offset);
4276 FS->type_test_assume_vcalls());
4278 FS->type_checked_load_vcalls());
4280 auto WriteConstVCallVec = [&](
uint64_t Ty,
4282 for (
auto &VC : VCs) {
4284 Record.push_back(VC.VFunc.GUID);
4285 Record.push_back(VC.VFunc.Offset);
4292 FS->type_test_assume_const_vcalls());
4294 FS->type_checked_load_const_vcalls());
4304 if (!FS->paramAccesses().empty()) {
4306 for (
auto &Arg : FS->paramAccesses()) {
4307 size_t UndoSize =
Record.size();
4308 Record.push_back(Arg.ParamNo);
4309 WriteRange(Arg.Use);
4310 Record.push_back(Arg.Calls.size());
4311 for (
auto &
Call : Arg.Calls) {
4313 std::optional<unsigned> ValueID = GetValueID(
Call.Callee);
4320 Record.push_back(*ValueID);
4321 WriteRange(
Call.Offsets);
4332 std::set<GlobalValue::GUID> &ReferencedTypeIds) {
4333 if (!FS->type_tests().empty())
4334 for (
auto &TT : FS->type_tests())
4335 ReferencedTypeIds.insert(TT);
4337 auto GetReferencedTypesFromVFuncIdVec =
4339 for (
auto &VF : VFs)
4340 ReferencedTypeIds.insert(VF.GUID);
4343 GetReferencedTypesFromVFuncIdVec(FS->type_test_assume_vcalls());
4344 GetReferencedTypesFromVFuncIdVec(FS->type_checked_load_vcalls());
4346 auto GetReferencedTypesFromConstVCallVec =
4348 for (
auto &VC : VCs)
4349 ReferencedTypeIds.insert(VC.VFunc.GUID);
4352 GetReferencedTypesFromConstVCallVec(FS->type_test_assume_const_vcalls());
4353 GetReferencedTypesFromConstVCallVec(FS->type_checked_load_const_vcalls());
4389 NameVals.
push_back(Summary.TTRes.TheKind);
4390 NameVals.
push_back(Summary.TTRes.SizeM1BitWidth);
4391 NameVals.
push_back(Summary.TTRes.AlignLog2);
4392 NameVals.
push_back(Summary.TTRes.SizeM1);
4393 NameVals.
push_back(Summary.TTRes.BitMask);
4394 NameVals.
push_back(Summary.TTRes.InlineBits);
4396 for (
auto &W : Summary.WPDRes)
4408 for (
auto &
P : Summary) {
4410 NameVals.
push_back(
VE.getValueID(
P.VTableVI.getValue()));
4424 static_assert(std::is_same_v<LinearFrameId, unsigned>);
4425 for (
auto &AI : FS->allocs()) {
4426 for (
auto &MIB : AI.MIBs) {
4428 StackIdIndices.
reserve(MIB.StackIdIndices.size());
4429 for (
auto Id : MIB.StackIdIndices)
4430 StackIdIndices.
push_back(GetStackIndex(Id));
4432 CallStacks.insert({CallStacks.size(), StackIdIndices});
4445 assert(!CallStacks.empty());
4451 Builder.
build(std::move(CallStacks),
nullptr,
4455 return Builder.takeCallStackPos();
4460 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
bool PerModule,
4461 std::function<
unsigned(
const ValueInfo &VI)> GetValueID,
4462 std::function<
unsigned(
unsigned)> GetStackIndex,
4463 bool WriteContextSizeInfoIndex,
4468 for (
auto &CI : FS->callsites()) {
4472 assert(!PerModule || (CI.Clones.size() == 1 && CI.Clones[0] == 0));
4473 Record.push_back(GetValueID(CI.Callee));
4475 Record.push_back(CI.StackIdIndices.size());
4476 Record.push_back(CI.Clones.size());
4478 for (
auto Id : CI.StackIdIndices)
4479 Record.push_back(GetStackIndex(Id));
4487 for (
auto &AI : FS->allocs()) {
4491 assert(!PerModule || (AI.Versions.size() == 1 && AI.Versions[0] == 0));
4492 Record.push_back(AI.MIBs.size());
4494 Record.push_back(AI.Versions.size());
4495 for (
auto &MIB : AI.MIBs) {
4502 assert(CallStackCount <= CallStackPos.
size());
4503 Record.push_back(CallStackPos[CallStackCount++]);
4508 assert(AI.ContextSizeInfos.empty() ||
4509 AI.ContextSizeInfos.size() == AI.MIBs.size());
4511 if (WriteContextSizeInfoIndex && !AI.ContextSizeInfos.empty()) {
4519 ContextIds.
reserve(AI.ContextSizeInfos.size() * 2);
4520 for (
auto &Infos : AI.ContextSizeInfos) {
4521 Record.push_back(Infos.size());
4522 for (
auto [FullStackId, TotalSize] : Infos) {
4529 Record.push_back(TotalSize);
4547void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
4548 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
4549 unsigned ValueID,
unsigned FSCallsProfileAbbrev,
unsigned CallsiteAbbrev,
4550 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
const Function &
F,
4551 DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
4558 Stream, FS, [&](
const ValueInfo &VI) -> std::optional<unsigned> {
4563 Stream, FS, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,
4565 [&](
const ValueInfo &VI) {
return getValueId(VI); },
4566 [&](
unsigned I) {
return I; },
4567 true, CallStackPos, CallStackCount);
4569 auto SpecialRefCnts =
FS->specialRefCounts();
4574 NameVals.
push_back(SpecialRefCnts.first);
4575 NameVals.
push_back(SpecialRefCnts.second);
4577 for (
auto &RI :
FS->refs())
4580 for (
auto &ECI :
FS->calls()) {
4581 NameVals.
push_back(getValueId(ECI.first));
4592void ModuleBitcodeWriterBase::writeModuleLevelReferences(
4593 const GlobalVariable &V, SmallVector<uint64_t, 64> &NameVals,
4594 unsigned FSModRefsAbbrev,
unsigned FSModVTableRefsAbbrev) {
4595 auto VI =
Index->getValueInfo(
V.getGUID());
4596 if (!VI ||
VI.getSummaryList().empty()) {
4602 auto *
Summary =
VI.getSummaryList()[0].get();
4608 auto VTableFuncs =
VS->vTableFuncs();
4609 if (!VTableFuncs.empty())
4612 unsigned SizeBeforeRefs = NameVals.
size();
4613 for (
auto &RI :
VS->refs())
4619 if (VTableFuncs.empty())
4624 for (
auto &
P : VTableFuncs) {
4630 FSModVTableRefsAbbrev);
4637void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
4640 bool IsThinLTO =
true;
4643 IsThinLTO = MD->getZExtValue();
4655 if (
Index->enableSplitLTOUnit())
4657 if (
Index->hasUnifiedLTO())
4667 auto Abbv = std::make_shared<BitCodeAbbrev>();
4673 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4675 for (
const auto &GVI : valueIds()) {
4677 ArrayRef<uint32_t>{GVI.second,
4678 static_cast<uint32_t
>(GVI.first >> 32),
4679 static_cast<uint32_t
>(GVI.first)},
4683 if (!
Index->stackIds().empty()) {
4684 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4691 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4692 SmallVector<uint32_t> Vals;
4694 for (
auto Id :
Index->stackIds()) {
4695 Vals.
push_back(
static_cast<uint32_t
>(Id >> 32));
4696 Vals.
push_back(
static_cast<uint32_t
>(Id));
4701 unsigned ContextIdAbbvId = 0;
4704 auto ContextIdAbbv = std::make_shared<BitCodeAbbrev>();
4716 ContextIdAbbvId = Stream.
EmitAbbrev(std::move(ContextIdAbbv));
4720 Abbv = std::make_shared<BitCodeAbbrev>();
4732 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4735 Abbv = std::make_shared<BitCodeAbbrev>();
4741 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4744 Abbv = std::make_shared<BitCodeAbbrev>();
4752 unsigned FSModVTableRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4755 Abbv = std::make_shared<BitCodeAbbrev>();
4760 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4763 Abbv = std::make_shared<BitCodeAbbrev>();
4770 unsigned TypeIdCompatibleVtableAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4772 Abbv = std::make_shared<BitCodeAbbrev>();
4778 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4780 Abbv = std::make_shared<BitCodeAbbrev>();
4787 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4789 Abbv = std::make_shared<BitCodeAbbrev>();
4794 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4801 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
4802 for (
const Function &
F : M) {
4808 ValueInfo
VI =
Index->getValueInfo(
F.getGUID());
4809 if (!VI ||
VI.getSummaryList().empty()) {
4815 auto *
Summary =
VI.getSummaryList()[0].get();
4818 FS, [](
unsigned I) {
return I; }, CallStacks);
4822 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
4823 if (!CallStacks.
empty()) {
4831 SmallVector<uint64_t, 64> NameVals;
4834 for (
const Function &
F : M) {
4840 ValueInfo
VI =
Index->getValueInfo(
F.getGUID());
4841 if (!VI ||
VI.getSummaryList().empty()) {
4847 auto *
Summary =
VI.getSummaryList()[0].get();
4848 writePerModuleFunctionSummaryRecord(NameVals, Summary, VE.
getValueID(&
F),
4849 FSCallsProfileAbbrev, CallsiteAbbrev,
4850 AllocAbbrev, ContextIdAbbvId,
F,
4851 CallStackPos, CallStackCount);
4856 for (
const GlobalVariable &
G :
M.globals())
4857 writeModuleLevelReferences(
G, NameVals, FSModRefsAbbrev,
4858 FSModVTableRefsAbbrev);
4860 for (
const GlobalAlias &
A :
M.aliases()) {
4861 auto *Aliasee =
A.getAliaseeObject();
4877 for (
auto &S :
Index->typeIdCompatibleVtableMap()) {
4881 TypeIdCompatibleVtableAbbrev);
4885 if (
Index->getBlockCount())
4887 ArrayRef<uint64_t>{
Index->getBlockCount()});
4893void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
4902 auto Abbv = std::make_shared<BitCodeAbbrev>();
4908 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4910 for (
const auto &GVI : valueIds()) {
4912 ArrayRef<uint32_t>{GVI.second,
4913 static_cast<uint32_t
>(GVI.first >> 32),
4914 static_cast<uint32_t
>(GVI.first)},
4920 if (!StackIds.empty()) {
4921 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4928 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4929 SmallVector<uint32_t> Vals;
4930 Vals.
reserve(StackIds.size() * 2);
4931 for (
auto Id : StackIds) {
4932 Vals.
push_back(
static_cast<uint32_t
>(Id >> 32));
4933 Vals.
push_back(
static_cast<uint32_t
>(Id));
4939 Abbv = std::make_shared<BitCodeAbbrev>();
4953 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4956 Abbv = std::make_shared<BitCodeAbbrev>();
4963 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4966 Abbv = std::make_shared<BitCodeAbbrev>();
4972 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4974 Abbv = std::make_shared<BitCodeAbbrev>();
4982 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4984 Abbv = std::make_shared<BitCodeAbbrev>();
4995 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4997 auto shouldImportValueAsDecl = [&](GlobalValueSummary *GVS) ->
bool {
4998 if (DecSummaries ==
nullptr)
5000 return DecSummaries->count(GVS);
5008 DenseMap<const GlobalValueSummary *, unsigned> SummaryToValueIdMap;
5010 SmallVector<uint64_t, 64> NameVals;
5014 std::set<GlobalValue::GUID> ReferencedTypeIds;
5018 auto MaybeEmitOriginalName = [&](GlobalValueSummary &S) {
5028 NameVals.
push_back(S.getOriginalName());
5033 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
5035 Abbv = std::make_shared<BitCodeAbbrev>();
5040 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5047 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
5048 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
5054 GlobalValueSummary *S =
I.second;
5067 return StackIdIndicesToIndex[
I];
5073 if (!CallStacks.
empty()) {
5083 DenseSet<GlobalValue::GUID> DefOrUseGUIDs;
5084 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
5085 GlobalValueSummary *S =
I.second;
5087 DefOrUseGUIDs.
insert(
I.first);
5088 for (
const ValueInfo &VI : S->
refs())
5089 DefOrUseGUIDs.
insert(
VI.getGUID());
5091 auto ValueId = getValueId(
I.first);
5093 SummaryToValueIdMap[S] = *ValueId;
5111 NameVals.
push_back(ModuleIdMap[
VS->modulePath()]);
5115 for (
auto &RI :
VS->refs()) {
5116 auto RefValueId = getValueId(RI.getGUID());
5126 MaybeEmitOriginalName(*S);
5130 auto GetValueId = [&](
const ValueInfo &
VI) -> std::optional<unsigned> {
5132 return std::nullopt;
5133 return getValueId(
VI.getGUID());
5141 Stream, FS, CallsiteAbbrev, AllocAbbrev, 0,
5144 [&](
const ValueInfo &VI) ->
unsigned {
5145 std::optional<unsigned> ValueID = GetValueId(VI);
5160 return StackIdIndicesToIndex[
I];
5162 false, CallStackPos, CallStackCount);
5166 NameVals.
push_back(ModuleIdMap[
FS->modulePath()]);
5179 unsigned Count = 0, RORefCnt = 0, WORefCnt = 0;
5180 for (
auto &RI :
FS->refs()) {
5181 auto RefValueId = getValueId(RI.getGUID());
5185 if (RI.isReadOnly())
5187 else if (RI.isWriteOnly())
5191 NameVals[6] =
Count;
5192 NameVals[7] = RORefCnt;
5193 NameVals[8] = WORefCnt;
5195 for (
auto &EI :
FS->calls()) {
5198 std::optional<unsigned> CallValueId = GetValueId(EI.first);
5207 FSCallsProfileAbbrev);
5209 MaybeEmitOriginalName(*S);
5212 for (
auto *AS : Aliases) {
5213 auto AliasValueId = SummaryToValueIdMap[AS];
5222 auto AliaseeValueId =
5229 MaybeEmitOriginalName(*AS);
5237 auto EmitCfiFunctions = [&](
const CfiFunctionIndex &CfiIndex,
5239 if (CfiIndex.
empty())
5242 auto Defs = CfiIndex.
forGuid(GUID);
5245 if (Functions.
empty())
5248 for (
const auto &S : Functions) {
5262 for (
auto &
T : ReferencedTypeIds) {
5263 auto TidIter =
Index.typeIds().equal_range(
T);
5264 for (
const auto &[GUID, TypeIdPair] :
make_range(TidIter)) {
5272 if (
Index.getBlockCount())
5274 ArrayRef<uint64_t>{
Index.getBlockCount()});
5285 auto Abbv = std::make_shared<BitCodeAbbrev>();
5289 auto StringAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5291 "LLVM" LLVM_VERSION_STRING, StringAbbrev);
5294 Abbv = std::make_shared<BitCodeAbbrev>();
5297 auto EpochAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5303void ModuleBitcodeWriter::writeModuleHash(StringRef View) {
5308 Hasher.
update(ArrayRef<uint8_t>(
5309 reinterpret_cast<const uint8_t *
>(
View.data()),
View.size()));
5310 std::array<uint8_t, 20> Hash = Hasher.
result();
5311 for (
int Pos = 0; Pos < 20; Pos += 4) {
5324void ModuleBitcodeWriter::write() {
5332 writeModuleVersion();
5341 writeAttributeGroupTable();
5344 writeAttributeTable();
5353 writeModuleConstants();
5356 writeModuleMetadataKinds();
5359 writeModuleMetadata();
5363 writeUseListBlock(
nullptr);
5365 writeOperandBundleTags();
5366 writeSyncScopeNames();
5369 DenseMap<const Function *, uint64_t> FunctionToBitcodeIndex;
5370 for (
const Function &
F : M)
5371 if (!
F.isDeclaration())
5372 writeFunction(
F, FunctionToBitcodeIndex);
5377 writePerModuleGlobalValueSummary();
5379 writeGlobalValueSymbolTable(FunctionToBitcodeIndex);
5407 unsigned CPUType = ~0U;
5414 DARWIN_CPU_ARCH_ABI64 = 0x01000000,
5415 DARWIN_CPU_TYPE_X86 = 7,
5416 DARWIN_CPU_TYPE_ARM = 12,
5417 DARWIN_CPU_TYPE_POWERPC = 18
5422 CPUType = DARWIN_CPU_TYPE_X86 | DARWIN_CPU_ARCH_ABI64;
5424 CPUType = DARWIN_CPU_TYPE_X86;
5426 CPUType = DARWIN_CPU_TYPE_POWERPC;
5428 CPUType = DARWIN_CPU_TYPE_POWERPC | DARWIN_CPU_ARCH_ABI64;
5430 CPUType = DARWIN_CPU_TYPE_ARM;
5434 "Expected header size to be reserved");
5439 unsigned Position = 0;
5447 while (Buffer.
size() & 15)
5454 Stream.
Emit((
unsigned)
'B', 8);
5455 Stream.
Emit((
unsigned)
'C', 8);
5456 Stream.
Emit(0x0, 4);
5457 Stream.
Emit(0xC, 4);
5458 Stream.
Emit(0xE, 4);
5459 Stream.
Emit(0xD, 4);
5477 auto Abbv = std::make_shared<BitCodeAbbrev>();
5480 auto AbbrevNo = Stream->
EmitAbbrev(std::move(Abbv));
5488 assert(!WroteStrtab && !WroteSymtab);
5494 if (M->getModuleInlineAsm().empty())
5498 const Triple TT(M->getTargetTriple());
5500 if (!
T || !
T->hasMCAsmParser())
5522 std::vector<char> Strtab;
5523 StrtabBuilder.finalizeInOrder();
5524 Strtab.resize(StrtabBuilder.getSize());
5525 StrtabBuilder.write((
uint8_t *)Strtab.data());
5528 {Strtab.data(), Strtab.size()});
5539 bool ShouldPreserveUseListOrder,
5548 assert(M.isMaterialized());
5549 Mods.push_back(
const_cast<Module *
>(&M));
5551 ModuleBitcodeWriter ModuleWriter(M, StrtabBuilder, *Stream,
5552 ShouldPreserveUseListOrder, Index,
5553 GenerateHash, ModHash);
5554 ModuleWriter.write();
5561 IndexBitcodeWriter IndexWriter(*Stream, StrtabBuilder, *Index, DecSummaries,
5562 ModuleToSummariesForIndex);
5563 IndexWriter.write();
5568 bool ShouldPreserveUseListOrder,
5572 Writer.writeModule(M, ShouldPreserveUseListOrder, Index, GenerateHash,
5574 Writer.writeSymtab();
5575 Writer.writeStrtab();
5577 Triple TT(M.getTargetTriple());
5578 if (TT.isOSDarwin() || TT.isOSBinFormatMachO()) {
5596void IndexBitcodeWriter::write() {
5599 writeModuleVersion();
5605 writeCombinedGlobalValueSummary();
5622 Writer.
writeIndex(&Index, ModuleToSummariesForIndex, DecSummaries);
5631class ThinLinkBitcodeWriter :
public ModuleBitcodeWriterBase {
5641 : ModuleBitcodeWriterBase(M, StrtabBuilder, Stream,
5643 ModHash(&ModHash) {}
5648 void writeSimplifiedModuleInfo();
5658void ThinLinkBitcodeWriter::writeSimplifiedModuleInfo() {
5670 auto Abbv = std::make_shared<BitCodeAbbrev>();
5673 Abbv->Add(AbbrevOpToUse);
5674 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5676 for (
const auto P :
M.getSourceFileName())
5740void ThinLinkBitcodeWriter::write() {
5743 writeModuleVersion();
5745 writeSimplifiedModuleInfo();
5747 writePerModuleGlobalValueSummary();
5764 assert(M.isMaterialized());
5765 Mods.push_back(
const_cast<Module *
>(&M));
5767 ThinLinkBitcodeWriter ThinLinkWriter(M, StrtabBuilder, *Stream, Index,
5769 ThinLinkWriter.write();
5790 switch (
T.getObjectFormat()) {
5792 return "__LLVM,__bitcode";
5817 switch (
T.getObjectFormat()) {
5819 return "__LLVM,__cmdline";
5845 const std::vector<uint8_t> &CmdArgs) {
5850 Type *UsedElementType = Used ? Used->getValueType()->getArrayElementType()
5852 for (
auto *GV : UsedGlobals) {
5853 if (GV->getName() !=
"llvm.embedded.module" &&
5854 GV->getName() !=
"llvm.cmdline")
5859 Used->eraseFromParent();
5864 Triple T(M.getTargetTriple());
5893 M.getGlobalVariable(
"llvm.embedded.module",
true)) {
5894 assert(Old->hasZeroLiveUses() &&
5895 "llvm.embedded.module can only be used once in llvm.compiler.used");
5897 Old->eraseFromParent();
5899 GV->
setName(
"llvm.embedded.module");
5917 assert(Old->hasZeroLiveUses() &&
5918 "llvm.cmdline can only be used once in llvm.compiler.used");
5920 Old->eraseFromParent();
5926 if (UsedArray.
empty())
5934 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< 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 void writeWholeProgramDevirtResolutionByArg(SmallVector< uint64_t, 64 > &NameVals, const std::vector< uint64_t > &args, const WholeProgramDevirtResolution::ByArg &ByArg)
static void emitConstantRange(SmallVectorImpl< uint64_t > &Record, const ConstantRange &CR, bool EmitBitWidth)
static StringEncoding getStringEncoding(StringRef Str)
Determine the encoding to use for the given string name and length.
static uint64_t getEncodedGVarFlags(GlobalVarSummary::GVarFlags Flags)
static const char * getSectionNameForCommandline(const Triple &T)
static cl::opt< unsigned > IndexThreshold("bitcode-mdindex-threshold", cl::Hidden, cl::init(25), cl::desc("Number of metadatas above which we emit an index " "to enable lazy-loading"))
static void writeTypeIdSummaryRecord(SmallVector< uint64_t, 64 > &NameVals, StringTableBuilder &StrtabBuilder, StringRef Id, const TypeIdSummary &Summary)
static void writeFunctionTypeMetadataRecords(BitstreamWriter &Stream, FunctionSummary *FS, Fn GetValueID)
Write the function type metadata related records that need to appear before a function summary entry ...
static uint64_t getEncodedHotnessCallEdgeInfo(const CalleeInfo &CI)
static void emitWideAPInt(SmallVectorImpl< uint64_t > &Vals, const APInt &A)
static void writeStringRecord(BitstreamWriter &Stream, unsigned Code, StringRef Str, unsigned AbbrevToUse)
static void writeWholeProgramDevirtResolution(SmallVector< uint64_t, 64 > &NameVals, StringTableBuilder &StrtabBuilder, uint64_t Id, const WholeProgramDevirtResolution &Wpd)
static unsigned getEncodedDLLStorageClass(const GlobalValue &GV)
static void writeInt32ToBuffer(uint32_t Value, SmallVectorImpl< char > &Buffer, uint32_t &Position)
static const char * getSectionNameForBitcode(const Triple &T)
static cl::opt< bool > CombinedIndexMemProfContext("combined-index-memprof-context", cl::Hidden, cl::init(true), cl::desc(""))
static unsigned getEncodedBinaryOpcode(unsigned Opcode)
static uint64_t getEncodedFFlags(FunctionSummary::FFlags Flags)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
static MaybeAlign getAlign(Value *Ptr)
Module.h This file contains the declarations for the Module class.
static cl::opt< LTOBitcodeEmbedding > EmbedBitcode("lto-embed-bitcode", cl::init(LTOBitcodeEmbedding::DoNotEmbed), cl::values(clEnumValN(LTOBitcodeEmbedding::DoNotEmbed, "none", "Do not embed"), clEnumValN(LTOBitcodeEmbedding::EmbedOptimized, "optimized", "Embed after all optimization passes"), clEnumValN(LTOBitcodeEmbedding::EmbedPostMergePreOptimized, "post-merge-pre-opt", "Embed post merge, but before optimizations")), cl::desc("Embed LLVM bitcode in object files produced by LTO"))
Machine Check Debug Module
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
static const uint32_t IV[8]
Class for arbitrary precision integers.
unsigned getActiveWords() const
Compute the number of active words in the value of this APInt.
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
int64_t getSExtValue() const
Get sign extended value.
const GlobalValueSummary & getAliasee() const
bool isSwiftError() const
Return true if this alloca is used as a swifterror argument to a call.
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
bool isUsedWithInAlloca() const
Return true if this alloca is used as an inalloca argument to a call.
unsigned getAddressSpace() const
Return the address space for the allocation.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
bool empty() const
empty - Check if the array is empty.
Class to represent array types.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
bool hasAttributes() const
Return true if attributes exists in this set.
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
@ None
No attributes have been set.
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
@ EndAttrKinds
Sentinel value useful for loops.
BitCodeAbbrevOp - This describes one or more operands in an abbreviation.
static bool isChar6(char C)
isChar6 - Return true if this character is legal in the Char6 encoding.
LLVM_ABI void writeThinLinkBitcode(const Module &M, const ModuleSummaryIndex &Index, const ModuleHash &ModHash)
Write the specified thin link bitcode file (i.e., the minimized bitcode file) to the buffer specified...
LLVM_ABI void writeIndex(const ModuleSummaryIndex *Index, const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex, const GVSummaryPtrSet *DecSummaries)
LLVM_ABI void copyStrtab(StringRef Strtab)
Copy the string table for another module into this bitcode file.
LLVM_ABI void writeStrtab()
Write the bitcode file's string table.
LLVM_ABI ~BitcodeWriter()
LLVM_ABI void writeSymtab()
Attempt to write a symbol table to the bitcode file.
LLVM_ABI void writeModule(const Module &M, bool ShouldPreserveUseListOrder=false, const ModuleSummaryIndex *Index=nullptr, bool GenerateHash=false, ModuleHash *ModHash=nullptr)
Write the specified module to the buffer specified at construction time.
LLVM_ABI BitcodeWriter(SmallVectorImpl< char > &Buffer)
Create a BitcodeWriter that writes to Buffer.
unsigned EmitAbbrev(std::shared_ptr< BitCodeAbbrev > Abbv)
Emits the abbreviation Abbv to the stream.
void markAndBlockFlushing()
For scenarios where the user wants to access a section of the stream to (for example) compute some ch...
StringRef getMarkedBufferAndResumeFlushing()
resumes flushing, but does not flush, and returns the section in the internal buffer starting from th...
void EmitRecord(unsigned Code, const Container &Vals, unsigned Abbrev=0)
EmitRecord - Emit the specified record to the stream, using an abbrev if we have one to compress the ...
void Emit(uint32_t Val, unsigned NumBits)
void EmitRecordWithBlob(unsigned Abbrev, const Container &Vals, StringRef Blob)
EmitRecordWithBlob - Emit the specified record to the stream, using an abbrev that includes a blob at...
unsigned EmitBlockInfoAbbrev(unsigned BlockID, std::shared_ptr< BitCodeAbbrev > Abbv)
EmitBlockInfoAbbrev - Emit a DEFINE_ABBREV record for the specified BlockID.
void EnterBlockInfoBlock()
EnterBlockInfoBlock - Start emitting the BLOCKINFO_BLOCK.
void BackpatchWord(uint64_t BitNo, unsigned Val)
void BackpatchWord64(uint64_t BitNo, uint64_t Val)
void EnterSubblock(unsigned BlockID, unsigned CodeLen)
uint64_t GetCurrentBitNo() const
Retrieve the current position in the stream, in bits.
void EmitRecordWithAbbrev(unsigned Abbrev, const Container &Vals)
EmitRecordWithAbbrev - Emit a record with the specified abbreviation.
static LLVM_ABI BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
OperandBundleUse getOperandBundleAt(unsigned Index) const
Return the operand bundle at a specific index.
unsigned getNumOperandBundles() const
Return the number of operand bundles associated with this User.
CallingConv::ID getCallingConv() const
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
bool hasOperandBundles() const
Return true if this User has any operand bundles.
BasicBlock * getIndirectDest(unsigned i) const
BasicBlock * getDefaultDest() const
unsigned getNumIndirectDests() const
Return the number of callbr indirect dest labels.
bool isNoTailCall() const
bool isMustTailCall() const
iterator_range< NestedIterator > forGuid(GlobalValue::GUID GUID) const
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
This class represents a range of values.
const APInt & getLower() const
Return the lower value for this range.
const APInt & getUpper() const
Return the upper value for this range.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
This is an important base class in LLVM.
DebugLoc getDebugLoc() const
LLVM_ABI DIAssignID * getAssignID() const
DIExpression * getExpression() const
DILocalVariable * getVariable() const
bool isDbgDeclareValue() const
Metadata * getRawLocation() const
Returns the metadata operand for the first location description.
bool isDbgDeclare() const
Metadata * getRawAddress() const
DIExpression * getAddressExpression() const
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Lightweight error class with error context and mandatory checking.
Function summary information to aid decisions and implementation of importing.
ForceSummaryHotnessType
Types for -force-summary-edges-cold debugging option.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
GVFlags flags() const
Get the flags for this GlobalValue (see struct GVFlags).
StringRef modulePath() const
Get the path to the module containing this function.
ArrayRef< ValueInfo > refs() const
Return the list of values referenced by this global value definition.
VisibilityTypes getVisibility() const
static bool isLocalLinkage(LinkageTypes Linkage)
LinkageTypes getLinkage() const
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
ThreadLocalMode getThreadLocalMode() const
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
UnnamedAddr getUnnamedAddr() const
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AppendingLinkage
Special purpose, only applies to global arrays.
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
DLLStorageClassTypes getDLLStorageClass() const
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
idx_iterator idx_end() const
idx_iterator idx_begin() const
bool isCleanup() const
Return 'true' if this landingpad instruction is a cleanup.
unsigned getNumClauses() const
Get the number of clauses for this landing pad.
bool isCatch(unsigned Idx) const
Return 'true' if the clause and index Idx is a catch clause.
Constant * getClause(unsigned Idx) const
Get the value of the clause at index Idx.
This class implements a map that also provides access to all stored values in a deterministic order.
size_t getBufferSize() const
const char * getBufferStart() const
const char * getBufferEnd() const
Class to hold module path string table and global value map, and encapsulate methods for operating on...
static constexpr uint64_t BitcodeSummaryVersion
A Module instance is used to store all the information related to an LLVM module.
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
LLVM_ABI void update(ArrayRef< uint8_t > Data)
Digest more data.
LLVM_ABI std::array< uint8_t, 20 > result()
Return the current raw 160-bits SHA1 for the digested data since the last call to init().
size_type size() const
Determine the number of elements in the SetVector.
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
void append(StringRef RHS)
Append from a StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
const ValueTy & getValue() const
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
constexpr size_t size() const
size - Get the string size.
Utility for building string tables with deduplicated suffixes.
LLVM_ABI size_t add(CachedHashStringRef S, uint8_t Priority=0)
Add a string to the builder.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
The instances of the Type class are immutable: once they are created, they are never changed.
bool isX86_FP80Ty() const
Return true if this is x86 long double.
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
bool isFP128Ty() const
Return true if this is 'fp128'.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
std::vector< std::pair< const Value *, unsigned > > ValueList
unsigned getTypeID(Type *T) const
unsigned getMetadataID(const Metadata *MD) const
UseListOrderStack UseListOrders
ArrayRef< const Metadata * > getNonMDStrings() const
Get the non-MDString metadata for this block.
unsigned getInstructionID(const Instruction *I) const
unsigned getAttributeListID(AttributeList PAL) const
void incorporateFunction(const Function &F)
incorporateFunction/purgeFunction - If you'd like to deal with a function, use these two methods to g...
void getFunctionConstantRange(unsigned &Start, unsigned &End) const
getFunctionConstantRange - Return the range of values that corresponds to function-local constants.
unsigned getAttributeGroupID(IndexAndAttrSet Group) const
bool hasMDs() const
Check whether the current block has any metadata to emit.
unsigned getComdatID(const Comdat *C) const
uint64_t computeBitsRequiredForTypeIndices() const
unsigned getValueID(const Value *V) const
unsigned getMetadataOrNullID(const Metadata *MD) const
const std::vector< IndexAndAttrSet > & getAttributeGroups() const
const ValueList & getValues() const
unsigned getGlobalBasicBlockID(const BasicBlock *BB) const
getGlobalBasicBlockID - This returns the function-specific ID for the specified basic block.
void setInstructionID(const Instruction *I)
const std::vector< const BasicBlock * > & getBasicBlocks() const
const std::vector< AttributeList > & getAttributeLists() const
bool shouldPreserveUseListOrder() const
const ComdatSetType & getComdats() const
std::vector< Type * > TypeList
ArrayRef< const Metadata * > getMDStrings() const
Get the MDString metadata for this block.
std::pair< unsigned, AttributeSet > IndexAndAttrSet
Attribute groups as encoded in bitcode are almost AttributeSets, but they include the AttributeList i...
const TypeList & getTypes() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
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_DENORMAL_FPENV
@ ATTR_KIND_SANITIZE_NUMERICAL_STABILITY
@ ATTR_KIND_ALLOCATED_POINTER
@ ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION
@ ATTR_KIND_CORO_ELIDE_SAFE
@ ATTR_KIND_NON_LAZY_BIND
@ ATTR_KIND_DEREFERENCEABLE
@ ATTR_KIND_OPTIMIZE_NONE
@ ATTR_KIND_HYBRID_PATCHABLE
@ ATTR_KIND_DEREFERENCEABLE_OR_NULL
@ ATTR_KIND_SANITIZE_REALTIME
@ ATTR_KIND_SPECULATIVE_LOAD_HARDENING
@ ATTR_KIND_ALWAYS_INLINE
@ ATTR_KIND_SANITIZE_TYPE
@ ATTR_KIND_PRESPLIT_COROUTINE
@ ATTR_KIND_SANITIZE_ALLOC_TOKEN
@ ATTR_KIND_NO_SANITIZE_COVERAGE
@ ATTR_KIND_NO_CREATE_UNDEF_OR_POISON
@ ATTR_KIND_DEAD_ON_RETURN
@ ATTR_KIND_SANITIZE_REALTIME_BLOCKING
@ ATTR_KIND_NO_SANITIZE_BOUNDS
@ ATTR_KIND_SANITIZE_MEMTAG
@ ATTR_KIND_CORO_ONLY_DESTROY_WHEN_COMPLETE
@ ATTR_KIND_SANITIZE_THREAD
@ ATTR_KIND_OPTIMIZE_FOR_DEBUGGING
@ SYNC_SCOPE_NAMES_BLOCK_ID
@ PARAMATTR_GROUP_BLOCK_ID
@ IDENTIFICATION_BLOCK_ID
@ GLOBALVAL_SUMMARY_BLOCK_ID
@ FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID
@ OPERAND_BUNDLE_TAGS_BLOCK_ID
@ MODULE_CODE_SOURCE_FILENAME
@ MODULE_CODE_SECTIONNAME
@ FUNC_CODE_INST_CATCHRET
@ FUNC_CODE_INST_LANDINGPAD
@ FUNC_CODE_INST_EXTRACTVAL
@ FUNC_CODE_INST_CATCHPAD
@ FUNC_CODE_INST_CATCHSWITCH
@ FUNC_CODE_INST_CLEANUPRET
@ FUNC_CODE_DEBUG_RECORD_VALUE
@ FUNC_CODE_INST_LOADATOMIC
@ FUNC_CODE_DEBUG_RECORD_ASSIGN
@ FUNC_CODE_INST_STOREATOMIC
@ FUNC_CODE_INST_ATOMICRMW
@ FUNC_CODE_DEBUG_RECORD_DECLARE_VALUE
@ FUNC_CODE_DEBUG_LOC_AGAIN
@ FUNC_CODE_INST_EXTRACTELT
@ FUNC_CODE_INST_INDIRECTBR
@ FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE
@ FUNC_CODE_INST_INSERTVAL
@ FUNC_CODE_DECLAREBLOCKS
@ FUNC_CODE_DEBUG_RECORD_LABEL
@ FUNC_CODE_INST_INSERTELT
@ FUNC_CODE_BLOCKADDR_USERS
@ FUNC_CODE_INST_CLEANUPPAD
@ FUNC_CODE_INST_SHUFFLEVEC
@ FUNC_CODE_INST_UNREACHABLE
@ FUNC_CODE_DEBUG_RECORD_DECLARE
@ FUNC_CODE_OPERAND_BUNDLE
@ FIRST_APPLICATION_ABBREV
@ PARAMATTR_GRP_CODE_ENTRY
initializer< Ty > init(const Ty &Val)
@ DW_APPLE_ENUM_KIND_invalid
Enum kind for invalid results.
LLVM_ABI Error build(ArrayRef< Module * > Mods, SmallVector< char, 0 > &Symtab, StringTableBuilder &StrtabBuilder, BumpPtrAllocator &Alloc)
Fills in Symtab and StrtabBuilder with a valid symbol and string table for Mods.
llvm::unique_function< void(llvm::Expected< T >)> Callback
A Callback<T> is a void function that accepts Expected<T>.
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)
Extract a Value from Metadata, allowing null.
LLVM_ABI bool metadataIncludesAllContextSizeInfo()
Whether the alloc memeprof metadata will include context size info for all MIBs.
template LLVM_ABI llvm::DenseMap< LinearFrameId, FrameStat > computeFrameHistogram< LinearFrameId >(llvm::MapVector< CallStackId, llvm::SmallVector< LinearFrameId > > &MemProfCallStackData)
LLVM_ABI bool metadataMayIncludeContextSizeInfo()
Whether the alloc memprof metadata may include context size info for some MIBs (but possibly not all)...
NodeAddr< CodeNode * > Code
void write32le(void *P, uint32_t V)
uint32_t read32be(const void *P)
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
FunctionAddr VTableAddr Value
StringMapEntry< Value * > ValueName
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
std::unordered_set< GlobalValueSummary * > GVSummaryPtrSet
A set of global value summary pointers.
unsigned encode(MaybeAlign A)
Returns a representation of the alignment that encodes undefined as 0.
LLVM_ABI void WriteBitcodeToFile(const Module &M, raw_ostream &Out, bool ShouldPreserveUseListOrder=false, const ModuleSummaryIndex *Index=nullptr, bool GenerateHash=false, ModuleHash *ModHash=nullptr)
Write the specified module to the specified raw output stream.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
LLVM_ABI void writeThinLinkBitcodeToFile(const Module &M, raw_ostream &Out, const ModuleSummaryIndex &Index, const ModuleHash &ModHash)
Write the specified thin link bitcode file (i.e., the minimized bitcode file) to the given raw output...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI void writeIndexToFile(const ModuleSummaryIndex &Index, raw_ostream &Out, const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex=nullptr, const GVSummaryPtrSet *DecSummaries=nullptr)
Write the specified module summary index to the given raw output stream, where it will be written in ...
LLVM_ABI void embedBitcodeInModule(Module &M, MemoryBufferRef Buf, bool EmbedBitcode, bool EmbedCmdline, const std::vector< uint8_t > &CmdArgs)
If EmbedBitcode is set, save a copy of the llvm IR as data in the __LLVM,__bitcode section (....
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
FunctionAddr VTableAddr uintptr_t uintptr_t Version
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
FunctionAddr VTableAddr Count
std::map< std::string, GVSummaryMapTy, std::less<> > ModuleToSummariesForIndexTy
Map of a module name to the GUIDs and summaries we will import from that module.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
AtomicOrdering
Atomic ordering for LLVM's memory model.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt copy(R &&Range, OutputIt Out)
constexpr unsigned BitWidth
LLVM_ABI Error write(MCStreamer &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue, Dwarf64StrOffsetsPromotion StrOffsetsOptValue)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
bool isBitcode(const unsigned char *BufPtr, const unsigned char *BufEnd)
isBitcode - Return true if the given bytes are the magic bytes for LLVM IR bitcode,...
void consumeError(Error Err)
Consume a Error without doing anything.
LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
This struct is a compact representation of a valid (non-zero power of two) alignment.
static void set(StorageType &Packed, typename Bitfield::Type Value)
Sets the typed value in the provided Packed value.
Class to accumulate and hold information about a callee.
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