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_BYTE_ABBREV,
140 CONSTANTS_CE_CAST_Abbrev,
141 CONSTANTS_NULL_Abbrev,
145 FUNCTION_INST_STORE_ABBREV,
146 FUNCTION_INST_UNOP_ABBREV,
147 FUNCTION_INST_UNOP_FLAGS_ABBREV,
148 FUNCTION_INST_BINOP_ABBREV,
149 FUNCTION_INST_BINOP_FLAGS_ABBREV,
150 FUNCTION_INST_CAST_ABBREV,
151 FUNCTION_INST_CAST_FLAGS_ABBREV,
152 FUNCTION_INST_RET_VOID_ABBREV,
153 FUNCTION_INST_RET_VAL_ABBREV,
154 FUNCTION_INST_BR_UNCOND_ABBREV,
155 FUNCTION_INST_BR_COND_ABBREV,
156 FUNCTION_INST_UNREACHABLE_ABBREV,
157 FUNCTION_INST_GEP_ABBREV,
158 FUNCTION_INST_CMP_ABBREV,
159 FUNCTION_INST_CMP_FLAGS_ABBREV,
160 FUNCTION_DEBUG_RECORD_VALUE_ABBREV,
161 FUNCTION_DEBUG_LOC_ABBREV,
166class BitcodeWriterBase {
169 BitstreamWriter &Stream;
171 StringTableBuilder &StrtabBuilder;
176 BitcodeWriterBase(BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder)
177 : Stream(Stream), StrtabBuilder(StrtabBuilder) {}
180 void writeModuleVersion();
183void BitcodeWriterBase::writeModuleVersion() {
190class ModuleBitcodeWriterBase :
public BitcodeWriterBase {
199 const ModuleSummaryIndex *Index;
204 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
207 unsigned GlobalValueId;
211 uint64_t VSTOffsetPlaceholder = 0;
216 ModuleBitcodeWriterBase(
const Module &M, StringTableBuilder &StrtabBuilder,
217 BitstreamWriter &Stream,
218 bool ShouldPreserveUseListOrder,
219 const ModuleSummaryIndex *Index)
220 : BitcodeWriterBase(Stream, StrtabBuilder),
M(
M),
223 : ShouldPreserveUseListOrder),
233 for (
const auto &GUIDSummaryLists : *Index)
235 for (
auto &Summary : GUIDSummaryLists.second.getSummaryList())
241 for (auto &CallEdge : FS->calls())
242 if (!CallEdge.first.haveGVs() || !CallEdge.first.getValue())
243 assignValueId(CallEdge.first.getGUID());
249 for (auto &RefEdge : FS->refs())
250 if (!RefEdge.haveGVs() || !RefEdge.getValue())
251 assignValueId(RefEdge.getGUID());
256 void writePerModuleGlobalValueSummary();
259 void writePerModuleFunctionSummaryRecord(
260 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
261 unsigned ValueID,
unsigned FSCallsProfileAbbrev,
unsigned CallsiteAbbrev,
262 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
const Function &
F,
263 DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
265 void writeModuleLevelReferences(
const GlobalVariable &V,
266 SmallVector<uint64_t, 64> &NameVals,
267 unsigned FSModRefsAbbrev,
268 unsigned FSModVTableRefsAbbrev);
271 GUIDToValueIdMap[ValGUID] = ++GlobalValueId;
275 const auto &VMI = GUIDToValueIdMap.find(ValGUID);
278 assert(VMI != GUIDToValueIdMap.end() &&
279 "GUID does not have assigned value Id");
284 unsigned getValueId(ValueInfo VI) {
285 if (!
VI.haveGVs() || !
VI.getValue())
286 return getValueId(
VI.getGUID());
290 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
294class ModuleBitcodeWriter :
public ModuleBitcodeWriterBase {
305 uint64_t BitcodeStartBit;
310 ModuleBitcodeWriter(
const Module &M, StringTableBuilder &StrtabBuilder,
311 BitstreamWriter &Stream,
bool ShouldPreserveUseListOrder,
312 const ModuleSummaryIndex *Index,
bool GenerateHash,
314 : ModuleBitcodeWriterBase(
M, StrtabBuilder, Stream,
315 ShouldPreserveUseListOrder,
Index),
316 GenerateHash(GenerateHash), ModHash(ModHash),
317 BitcodeStartBit(Stream.GetCurrentBitNo()) {}
323 uint64_t bitcodeStartBit() {
return BitcodeStartBit; }
325 size_t addToStrtab(StringRef Str);
327 void writeAttributeGroupTable();
328 void writeAttributeTable();
329 void writeTypeTable();
331 void writeValueSymbolTableForwardDecl();
332 void writeModuleInfo();
333 void writeValueAsMetadata(
const ValueAsMetadata *MD,
334 SmallVectorImpl<uint64_t> &Record);
335 void writeMDTuple(
const MDTuple *
N, SmallVectorImpl<uint64_t> &Record,
337 unsigned createDILocationAbbrev();
338 void writeDILocation(
const DILocation *
N, SmallVectorImpl<uint64_t> &Record,
340 unsigned createGenericDINodeAbbrev();
342 SmallVectorImpl<uint64_t> &Record,
unsigned &Abbrev);
343 void writeDISubrange(
const DISubrange *
N, SmallVectorImpl<uint64_t> &Record,
346 SmallVectorImpl<uint64_t> &Record,
349 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
353 SmallVectorImpl<uint64_t> &Record,
356 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
358 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
360 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
362 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
364 SmallVectorImpl<uint64_t> &Record,
366 void writeDIFile(
const DIFile *
N, SmallVectorImpl<uint64_t> &Record,
369 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
371 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
373 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
375 SmallVectorImpl<uint64_t> &Record,
378 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
381 void writeDIMacro(
const DIMacro *
N, SmallVectorImpl<uint64_t> &Record,
385 void writeDIArgList(
const DIArgList *
N, SmallVectorImpl<uint64_t> &Record);
386 void writeDIModule(
const DIModule *
N, SmallVectorImpl<uint64_t> &Record,
388 void writeDIAssignID(
const DIAssignID *
N, SmallVectorImpl<uint64_t> &Record,
391 SmallVectorImpl<uint64_t> &Record,
394 SmallVectorImpl<uint64_t> &Record,
397 SmallVectorImpl<uint64_t> &Record,
400 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
402 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
404 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
406 SmallVectorImpl<uint64_t> &Record,
409 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
411 SmallVectorImpl<uint64_t> &Record,
413 unsigned createNamedMetadataAbbrev();
414 void writeNamedMetadata(SmallVectorImpl<uint64_t> &Record);
415 unsigned createMetadataStringsAbbrev();
417 SmallVectorImpl<uint64_t> &Record);
419 SmallVectorImpl<uint64_t> &Record,
420 std::vector<unsigned> *MDAbbrevs =
nullptr,
421 std::vector<uint64_t> *IndexPos =
nullptr);
422 void writeModuleMetadata();
423 void writeFunctionMetadata(
const Function &
F);
424 void writeFunctionMetadataAttachment(
const Function &
F);
425 void pushGlobalMetadataAttachment(SmallVectorImpl<uint64_t> &Record,
426 const GlobalObject &GO);
427 void writeModuleMetadataKinds();
428 void writeOperandBundleTags();
429 void writeSyncScopeNames();
430 void writeConstants(
unsigned FirstVal,
unsigned LastVal,
bool isGlobal);
431 void writeModuleConstants();
432 bool pushValueAndType(
const Value *V,
unsigned InstID,
433 SmallVectorImpl<unsigned> &Vals);
434 bool pushValueOrMetadata(
const Value *V,
unsigned InstID,
435 SmallVectorImpl<unsigned> &Vals);
436 void writeOperandBundles(
const CallBase &CB,
unsigned InstID);
437 void pushValue(
const Value *V,
unsigned InstID,
438 SmallVectorImpl<unsigned> &Vals);
439 void pushValueSigned(
const Value *V,
unsigned InstID,
440 SmallVectorImpl<uint64_t> &Vals);
441 void writeInstruction(
const Instruction &
I,
unsigned InstID,
442 SmallVectorImpl<unsigned> &Vals);
443 void writeFunctionLevelValueSymbolTable(
const ValueSymbolTable &VST);
444 void writeGlobalValueSymbolTable(
445 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
446 void writeUseList(UseListOrder &&Order);
447 void writeUseListBlock(
const Function *
F);
449 writeFunction(
const Function &
F,
450 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
451 void writeBlockInfo();
452 void writeModuleHash(StringRef View);
455 return unsigned(SSID);
458 unsigned getEncodedAlign(MaybeAlign Alignment) {
return encode(Alignment); }
462class IndexBitcodeWriter :
public BitcodeWriterBase {
464 const ModuleSummaryIndex &
Index;
477 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
481 std::vector<uint64_t> StackIds;
486 DenseMap<unsigned, unsigned> StackIdIndicesToIndex;
489 unsigned GlobalValueId = 0;
493 DenseMap<StringRef, uint64_t> ModuleIdMap;
503 BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder,
504 const ModuleSummaryIndex &Index,
507 : BitcodeWriterBase(Stream, StrtabBuilder),
Index(
Index),
508 DecSummaries(DecSummaries),
509 ModuleToSummariesForIndex(ModuleToSummariesForIndex) {
513 auto RecordStackIdReference = [&](
unsigned StackIdIndex) {
518 StackIdIndicesToIndex.
insert({StackIdIndex, StackIds.size()});
520 StackIds.push_back(
Index.getStackIdAtIndex(StackIdIndex));
527 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
528 GUIDToValueIdMap[
I.first] = ++GlobalValueId;
540 for (
auto &CI :
FS->callsites()) {
551 if (CI.StackIdIndices.empty()) {
552 GUIDToValueIdMap[CI.Callee.getGUID()] = ++GlobalValueId;
555 for (
auto Idx : CI.StackIdIndices)
556 RecordStackIdReference(Idx);
559 for (
auto &AI :
FS->allocs())
560 for (
auto &MIB : AI.MIBs)
561 for (
auto Idx : MIB.StackIdIndices)
562 RecordStackIdReference(Idx);
568 using GVInfo = std::pair<GlobalValue::GUID, GlobalValueSummary *>;
573 template<
typename Functor>
574 void forEachSummary(Functor Callback) {
575 if (ModuleToSummariesForIndex) {
576 for (
auto &M : *ModuleToSummariesForIndex)
577 for (
auto &Summary :
M.second) {
583 Callback({AS->getAliaseeGUID(), &AS->getAliasee()},
true);
586 for (
auto &Summaries : Index)
587 for (
auto &Summary : Summaries.second.getSummaryList())
596 template <
typename Functor>
void forEachModule(Functor Callback) {
597 if (ModuleToSummariesForIndex) {
598 for (
const auto &M : *ModuleToSummariesForIndex) {
599 const auto &MPI =
Index.modulePaths().find(
M.first);
600 if (MPI ==
Index.modulePaths().end()) {
604 assert(ModuleToSummariesForIndex->size() == 1);
614 std::vector<StringRef> ModulePaths;
615 for (
auto &[ModPath,
_] :
Index.modulePaths())
616 ModulePaths.push_back(ModPath);
618 for (
auto &ModPath : ModulePaths)
627 void writeModStrings();
628 void writeCombinedGlobalValueSummary();
631 auto VMI = GUIDToValueIdMap.find(ValGUID);
632 if (VMI == GUIDToValueIdMap.end())
637 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
672 case Instruction::Add:
674 case Instruction::Sub:
676 case Instruction::Mul:
679 case Instruction::FDiv:
682 case Instruction::FRem:
694 unsigned Encoding = 0;
695 switch (
I.getOperation()) {
768 if (
I.isElementwise())
803 case Attribute::Alignment:
805 case Attribute::AllocAlign:
807 case Attribute::AllocSize:
809 case Attribute::AlwaysInline:
811 case Attribute::Builtin:
813 case Attribute::ByVal:
815 case Attribute::Convergent:
817 case Attribute::InAlloca:
819 case Attribute::Cold:
821 case Attribute::DisableSanitizerInstrumentation:
823 case Attribute::FnRetThunkExtern:
825 case Attribute::Flatten:
829 case Attribute::ElementType:
831 case Attribute::HybridPatchable:
833 case Attribute::InlineHint:
835 case Attribute::InReg:
837 case Attribute::JumpTable:
839 case Attribute::MinSize:
841 case Attribute::AllocatedPointer:
843 case Attribute::AllocKind:
845 case Attribute::Memory:
847 case Attribute::NoFPClass:
849 case Attribute::Naked:
851 case Attribute::Nest:
853 case Attribute::NoAlias:
855 case Attribute::NoBuiltin:
857 case Attribute::NoCallback:
859 case Attribute::NoDivergenceSource:
861 case Attribute::NoDuplicate:
863 case Attribute::NoFree:
865 case Attribute::NoImplicitFloat:
867 case Attribute::NoInline:
869 case Attribute::NoRecurse:
871 case Attribute::NoMerge:
873 case Attribute::NonLazyBind:
875 case Attribute::NonNull:
877 case Attribute::Dereferenceable:
879 case Attribute::DereferenceableOrNull:
881 case Attribute::NoRedZone:
883 case Attribute::NoReturn:
885 case Attribute::NoSync:
887 case Attribute::NoCfCheck:
889 case Attribute::NoProfile:
891 case Attribute::SkipProfile:
893 case Attribute::NoUnwind:
895 case Attribute::NoSanitizeBounds:
897 case Attribute::NoSanitizeCoverage:
899 case Attribute::NullPointerIsValid:
901 case Attribute::OptimizeForDebugging:
903 case Attribute::OptForFuzzing:
905 case Attribute::OptimizeForSize:
907 case Attribute::OptimizeNone:
909 case Attribute::ReadNone:
911 case Attribute::ReadOnly:
913 case Attribute::Returned:
915 case Attribute::ReturnsTwice:
917 case Attribute::SExt:
919 case Attribute::Speculatable:
921 case Attribute::StackAlignment:
923 case Attribute::StackProtect:
925 case Attribute::StackProtectReq:
927 case Attribute::StackProtectStrong:
929 case Attribute::SafeStack:
931 case Attribute::ShadowCallStack:
933 case Attribute::StrictFP:
935 case Attribute::StructRet:
937 case Attribute::SanitizeAddress:
939 case Attribute::SanitizeAllocToken:
941 case Attribute::SanitizeHWAddress:
943 case Attribute::SanitizeThread:
945 case Attribute::SanitizeType:
947 case Attribute::SanitizeMemory:
949 case Attribute::SanitizeNumericalStability:
951 case Attribute::SanitizeRealtime:
953 case Attribute::SanitizeRealtimeBlocking:
955 case Attribute::SpeculativeLoadHardening:
957 case Attribute::SwiftError:
959 case Attribute::SwiftSelf:
961 case Attribute::SwiftAsync:
963 case Attribute::UWTable:
965 case Attribute::VScaleRange:
967 case Attribute::WillReturn:
969 case Attribute::WriteOnly:
971 case Attribute::ZExt:
973 case Attribute::ImmArg:
975 case Attribute::SanitizeMemTag:
977 case Attribute::Preallocated:
979 case Attribute::NoUndef:
981 case Attribute::ByRef:
983 case Attribute::MustProgress:
985 case Attribute::PresplitCoroutine:
987 case Attribute::Writable:
989 case Attribute::CoroDestroyOnlyWhenComplete:
991 case Attribute::CoroElideSafe:
993 case Attribute::DeadOnUnwind:
995 case Attribute::Range:
997 case Attribute::Initializes:
999 case Attribute::NoExt:
1001 case Attribute::Captures:
1003 case Attribute::DeadOnReturn:
1005 case Attribute::NoCreateUndefOrPoison:
1007 case Attribute::DenormalFPEnv:
1009 case Attribute::NoOutline:
1024 if ((int64_t)V >= 0)
1035 unsigned NumWords =
A.getActiveWords();
1036 const uint64_t *RawData =
A.getRawData();
1037 for (
unsigned i = 0; i < NumWords; i++)
1057void ModuleBitcodeWriter::writeAttributeGroupTable() {
1058 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
1060 if (AttrGrps.empty())
return;
1064 SmallVector<uint64_t, 64>
Record;
1066 unsigned AttrListIndex = Pair.first;
1067 AttributeSet AS = Pair.second;
1069 Record.push_back(AttrListIndex);
1072 if (Attr.isEnumAttribute()) {
1075 }
else if (Attr.isIntAttribute()) {
1077 Attribute::AttrKind
Kind = Attr.getKindAsEnum();
1079 if (Kind == Attribute::Memory) {
1084 Record.push_back(Attr.getValueAsInt());
1086 }
else if (Attr.isStringAttribute()) {
1087 StringRef
Kind = Attr.getKindAsString();
1088 StringRef Val = Attr.getValueAsString();
1097 }
else if (Attr.isTypeAttribute()) {
1098 Type *Ty = Attr.getValueAsType();
1099 Record.push_back(Ty ? 6 : 5);
1103 }
else if (Attr.isConstantRangeAttribute()) {
1109 assert(Attr.isConstantRangeListAttribute());
1115 for (
auto &CR : Val)
1127void ModuleBitcodeWriter::writeAttributeTable() {
1129 if (
Attrs.empty())
return;
1133 SmallVector<uint64_t, 64>
Record;
1134 for (
const AttributeList &AL : Attrs) {
1135 for (
unsigned i :
AL.indexes()) {
1136 AttributeSet AS =
AL.getAttributes(i);
1149void ModuleBitcodeWriter::writeTypeTable() {
1153 SmallVector<uint64_t, 64> TypeVals;
1158 auto Abbv = std::make_shared<BitCodeAbbrev>();
1160 Abbv->Add(BitCodeAbbrevOp(0));
1161 unsigned OpaquePtrAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1164 Abbv = std::make_shared<BitCodeAbbrev>();
1169 unsigned FunctionAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1172 Abbv = std::make_shared<BitCodeAbbrev>();
1177 unsigned StructAnonAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1180 Abbv = std::make_shared<BitCodeAbbrev>();
1184 unsigned StructNameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1187 Abbv = std::make_shared<BitCodeAbbrev>();
1192 unsigned StructNamedAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1195 Abbv = std::make_shared<BitCodeAbbrev>();
1199 unsigned ArrayAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1207 for (
Type *
T : TypeList) {
1208 int AbbrevToUse = 0;
1211 switch (
T->getTypeID()) {
1221 case Type::MetadataTyID:
1226 case Type::ByteTyID:
1231 case Type::IntegerTyID:
1236 case Type::PointerTyID: {
1243 AbbrevToUse = OpaquePtrAbbrev;
1246 case Type::FunctionTyID: {
1252 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i)
1254 AbbrevToUse = FunctionAbbrev;
1257 case Type::StructTyID: {
1262 for (
Type *ET :
ST->elements())
1265 if (
ST->isLiteral()) {
1267 AbbrevToUse = StructAnonAbbrev;
1269 if (
ST->isOpaque()) {
1273 AbbrevToUse = StructNamedAbbrev;
1277 if (!
ST->getName().empty())
1283 case Type::ArrayTyID: {
1287 TypeVals.
push_back(AT->getNumElements());
1289 AbbrevToUse = ArrayAbbrev;
1292 case Type::FixedVectorTyID:
1293 case Type::ScalableVectorTyID: {
1298 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1304 case Type::TargetExtTyID: {
1310 for (
Type *InnerTy :
TET->type_params())
1315 case Type::TypedPointerTyID:
1320 Stream.
EmitRecord(Code, TypeVals, AbbrevToUse);
1361 RawFlags |= Flags.ReadNone;
1362 RawFlags |= (Flags.ReadOnly << 1);
1363 RawFlags |= (Flags.NoRecurse << 2);
1364 RawFlags |= (Flags.ReturnDoesNotAlias << 3);
1365 RawFlags |= (Flags.NoInline << 4);
1366 RawFlags |= (Flags.AlwaysInline << 5);
1367 RawFlags |= (Flags.NoUnwind << 6);
1368 RawFlags |= (Flags.MayThrow << 7);
1369 RawFlags |= (Flags.HasUnknownCall << 8);
1370 RawFlags |= (Flags.MustBeUnreachable << 9);
1377 bool ImportAsDecl =
false) {
1380 RawFlags |= Flags.NotEligibleToImport;
1381 RawFlags |= (Flags.Live << 1);
1382 RawFlags |= (Flags.DSOLocal << 2);
1383 RawFlags |= (Flags.CanAutoHide << 3);
1388 RawFlags = (RawFlags << 4) | Flags.Linkage;
1390 RawFlags |= (Flags.Visibility << 8);
1392 unsigned ImportType = Flags.ImportType | ImportAsDecl;
1393 RawFlags |= (ImportType << 10);
1395 RawFlags |= (Flags.NoRenameOnPromotion << 11);
1401 uint64_t RawFlags = Flags.MaybeReadOnly | (Flags.MaybeWriteOnly << 1) |
1402 (Flags.Constant << 2) | Flags.VCallVisibility << 3;
1445 switch (
C.getSelectionKind()) {
1469size_t ModuleBitcodeWriter::addToStrtab(StringRef Str) {
1472 return StrtabBuilder.
add(Str);
1475void ModuleBitcodeWriter::writeComdats() {
1490void ModuleBitcodeWriter::writeValueSymbolTableForwardDecl() {
1495 auto Abbv = std::make_shared<BitCodeAbbrev>();
1501 unsigned VSTOffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1517 bool isChar6 =
true;
1518 for (
char C : Str) {
1521 if ((
unsigned char)
C & 128)
1530static_assert(
sizeof(GlobalValue::SanitizerMetadata) <=
sizeof(unsigned),
1531 "Sanitizer Metadata is too large for naive serialization.");
1534 return Meta.NoAddress | (
Meta.NoHWAddress << 1) |
1535 (
Meta.Memtag << 2) | (
Meta.IsDynInit << 3);
1541void ModuleBitcodeWriter::writeModuleInfo() {
1543 if (!
M.getTargetTriple().empty())
1545 M.getTargetTriple().str(), 0 );
1546 const std::string &
DL =
M.getDataLayoutStr();
1549 if (!
M.getModuleInlineAsm().empty())
1555 std::map<std::string, unsigned> SectionMap;
1556 std::map<std::string, unsigned> GCMap;
1557 MaybeAlign MaxGVarAlignment;
1558 unsigned MaxGlobalType = 0;
1559 for (
const GlobalVariable &GV :
M.globals()) {
1560 if (MaybeAlign
A = GV.getAlign())
1561 MaxGVarAlignment = !MaxGVarAlignment ? *
A : std::max(*MaxGVarAlignment, *
A);
1562 MaxGlobalType = std::max(MaxGlobalType, VE.
getTypeID(GV.getValueType()));
1563 if (GV.hasSection()) {
1565 unsigned &
Entry = SectionMap[std::string(GV.getSection())];
1569 Entry = SectionMap.size();
1573 for (
const Function &
F : M) {
1574 if (
F.hasSection()) {
1576 unsigned &
Entry = SectionMap[std::string(
F.getSection())];
1580 Entry = SectionMap.size();
1585 unsigned &
Entry = GCMap[
F.getGC()];
1589 Entry = GCMap.size();
1595 unsigned SimpleGVarAbbrev = 0;
1596 if (!
M.global_empty()) {
1598 auto Abbv = std::make_shared<BitCodeAbbrev>();
1609 if (!MaxGVarAlignment)
1610 Abbv->Add(BitCodeAbbrevOp(0));
1612 unsigned MaxEncAlignment = getEncodedAlign(MaxGVarAlignment);
1616 if (SectionMap.empty())
1617 Abbv->Add(BitCodeAbbrevOp(0));
1622 SimpleGVarAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1636 auto Abbv = std::make_shared<BitCodeAbbrev>();
1639 Abbv->Add(AbbrevOpToUse);
1640 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1642 for (
const auto P :
M.getSourceFileName())
1651 for (
const GlobalVariable &GV :
M.globals()) {
1652 unsigned AbbrevToUse = 0;
1658 Vals.
push_back(addToStrtab(GV.getName()));
1661 Vals.
push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant());
1665 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1666 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1668 if (GV.isThreadLocal() ||
1670 GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||
1671 GV.isExternallyInitialized() ||
1673 GV.hasComdat() || GV.hasAttributes() || GV.isDSOLocal() ||
1674 GV.hasPartition() || GV.hasSanitizerMetadata() || GV.getCodeModel()) {
1678 Vals.
push_back(GV.isExternallyInitialized());
1682 auto AL = GV.getAttributesAsList(AttributeList::FunctionIndex);
1686 Vals.
push_back(addToStrtab(GV.getPartition()));
1687 Vals.
push_back(GV.getPartition().size());
1690 GV.getSanitizerMetadata())
1694 AbbrevToUse = SimpleGVarAbbrev;
1702 for (
const Function &
F : M) {
1715 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1716 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1728 F.hasPersonalityFn() ? (VE.
getValueID(
F.getPersonalityFn()) + 1) : 0);
1732 Vals.
push_back(addToStrtab(
F.getPartition()));
1734 Vals.
push_back(getEncodedAlign(
F.getPreferredAlignment()));
1736 unsigned AbbrevToUse = 0;
1742 for (
const GlobalAlias &
A :
M.aliases()) {
1749 Vals.
push_back(
A.getType()->getAddressSpace());
1757 Vals.
push_back(addToStrtab(
A.getPartition()));
1760 unsigned AbbrevToUse = 0;
1766 for (
const GlobalIFunc &
I :
M.ifuncs()) {
1772 Vals.
push_back(
I.getType()->getAddressSpace());
1777 Vals.
push_back(addToStrtab(
I.getPartition()));
1783 writeValueSymbolTableForwardDecl();
1790 if (OBO->hasNoSignedWrap())
1792 if (OBO->hasNoUnsignedWrap())
1798 if (PDI->isDisjoint())
1801 if (FPMO->hasAllowReassoc())
1803 if (FPMO->hasNoNaNs())
1805 if (FPMO->hasNoInfs())
1807 if (FPMO->hasNoSignedZeros())
1809 if (FPMO->hasAllowReciprocal())
1811 if (FPMO->hasAllowContract())
1813 if (FPMO->hasApproxFunc())
1819 if (NNI->hasNonNeg())
1823 if (NNI->hasNonNeg())
1826 if (TI->hasNoSignedWrap())
1828 if (TI->hasNoUnsignedWrap())
1831 if (
GEP->isInBounds())
1833 if (
GEP->hasNoUnsignedSignedWrap())
1835 if (
GEP->hasNoUnsignedWrap())
1838 if (ICmp->hasSameSign())
1845void ModuleBitcodeWriter::writeValueAsMetadata(
1846 const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
1855void ModuleBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1856 SmallVectorImpl<uint64_t> &Record,
1858 for (
const MDOperand &MDO :
N->operands()) {
1861 "Unexpected function-local metadata");
1870unsigned ModuleBitcodeWriter::createDILocationAbbrev() {
1873 auto Abbv = std::make_shared<BitCodeAbbrev>();
1886void ModuleBitcodeWriter::writeDILocation(
const DILocation *
N,
1887 SmallVectorImpl<uint64_t> &Record,
1890 Abbrev = createDILocationAbbrev();
1892 Record.push_back(
N->isDistinct());
1893 Record.push_back(
N->getLine());
1894 Record.push_back(
N->getColumn());
1897 Record.push_back(
N->isImplicitCode());
1898 Record.push_back(
N->getAtomGroup());
1899 Record.push_back(
N->getAtomRank());
1904unsigned ModuleBitcodeWriter::createGenericDINodeAbbrev() {
1907 auto Abbv = std::make_shared<BitCodeAbbrev>();
1918void ModuleBitcodeWriter::writeGenericDINode(
const GenericDINode *
N,
1919 SmallVectorImpl<uint64_t> &Record,
1922 Abbrev = createGenericDINodeAbbrev();
1924 Record.push_back(
N->isDistinct());
1925 Record.push_back(
N->getTag());
1928 for (
auto &
I :
N->operands())
1935void ModuleBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1936 SmallVectorImpl<uint64_t> &Record,
1938 const uint64_t
Version = 2 << 1;
1949void ModuleBitcodeWriter::writeDIGenericSubrange(
1950 const DIGenericSubrange *
N, SmallVectorImpl<uint64_t> &Record,
1952 Record.push_back((uint64_t)
N->isDistinct());
1962void ModuleBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1963 SmallVectorImpl<uint64_t> &Record,
1965 const uint64_t IsBigInt = 1 << 2;
1966 Record.push_back(IsBigInt | (
N->isUnsigned() << 1) |
N->isDistinct());
1967 Record.push_back(
N->getValue().getBitWidth());
1975void ModuleBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1976 SmallVectorImpl<uint64_t> &Record,
1978 const unsigned SizeIsMetadata = 0x2;
1979 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
1980 Record.push_back(
N->getTag());
1983 Record.push_back(
N->getAlignInBits());
1984 Record.push_back(
N->getEncoding());
1985 Record.push_back(
N->getFlags());
1986 Record.push_back(
N->getNumExtraInhabitants());
1987 Record.push_back(
N->getDataSizeInBits());
1989 Record.push_back(
N->getLine());
1996void ModuleBitcodeWriter::writeDIFixedPointType(
1997 const DIFixedPointType *
N, SmallVectorImpl<uint64_t> &Record,
1999 const unsigned SizeIsMetadata = 0x2;
2000 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2001 Record.push_back(
N->getTag());
2004 Record.push_back(
N->getAlignInBits());
2005 Record.push_back(
N->getEncoding());
2006 Record.push_back(
N->getFlags());
2007 Record.push_back(
N->getKind());
2008 Record.push_back(
N->getFactorRaw());
2010 auto WriteWideInt = [&](
const APInt &
Value) {
2013 uint64_t NumWords =
Value.getActiveWords();
2014 uint64_t
Encoded = (NumWords << 32) |
Value.getBitWidth();
2015 Record.push_back(Encoded);
2019 WriteWideInt(
N->getNumeratorRaw());
2020 WriteWideInt(
N->getDenominatorRaw());
2023 Record.push_back(
N->getLine());
2030void ModuleBitcodeWriter::writeDIStringType(
const DIStringType *
N,
2031 SmallVectorImpl<uint64_t> &Record,
2033 const unsigned SizeIsMetadata = 0x2;
2034 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2035 Record.push_back(
N->getTag());
2041 Record.push_back(
N->getAlignInBits());
2042 Record.push_back(
N->getEncoding());
2048void ModuleBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
2049 SmallVectorImpl<uint64_t> &Record,
2051 const unsigned SizeIsMetadata = 0x2;
2052 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2053 Record.push_back(
N->getTag());
2056 Record.push_back(
N->getLine());
2060 Record.push_back(
N->getAlignInBits());
2062 Record.push_back(
N->getFlags());
2067 if (
const auto &DWARFAddressSpace =
N->getDWARFAddressSpace())
2068 Record.push_back(*DWARFAddressSpace + 1);
2074 if (
auto PtrAuthData =
N->getPtrAuthData())
2075 Record.push_back(PtrAuthData->RawData);
2083void ModuleBitcodeWriter::writeDISubrangeType(
const DISubrangeType *
N,
2084 SmallVectorImpl<uint64_t> &Record,
2086 const unsigned SizeIsMetadata = 0x2;
2087 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2090 Record.push_back(
N->getLine());
2093 Record.push_back(
N->getAlignInBits());
2094 Record.push_back(
N->getFlags());
2105void ModuleBitcodeWriter::writeDICompositeType(
2106 const DICompositeType *
N, SmallVectorImpl<uint64_t> &Record,
2108 const unsigned IsNotUsedInOldTypeRef = 0x2;
2109 const unsigned SizeIsMetadata = 0x4;
2110 Record.push_back(SizeIsMetadata | IsNotUsedInOldTypeRef |
2111 (
unsigned)
N->isDistinct());
2112 Record.push_back(
N->getTag());
2115 Record.push_back(
N->getLine());
2119 Record.push_back(
N->getAlignInBits());
2121 Record.push_back(
N->getFlags());
2123 Record.push_back(
N->getRuntimeLang());
2133 Record.push_back(
N->getNumExtraInhabitants());
2143void ModuleBitcodeWriter::writeDISubroutineType(
2144 const DISubroutineType *
N, SmallVectorImpl<uint64_t> &Record,
2146 const unsigned HasNoOldTypeRefs = 0x2;
2147 Record.push_back(HasNoOldTypeRefs | (
unsigned)
N->isDistinct());
2148 Record.push_back(
N->getFlags());
2156void ModuleBitcodeWriter::writeDIFile(
const DIFile *
N,
2157 SmallVectorImpl<uint64_t> &Record,
2159 Record.push_back(
N->isDistinct());
2162 if (
N->getRawChecksum()) {
2163 Record.push_back(
N->getRawChecksum()->Kind);
2171 auto Source =
N->getRawSource();
2179void ModuleBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
2180 SmallVectorImpl<uint64_t> &Record,
2182 assert(
N->isDistinct() &&
"Expected distinct compile units");
2185 auto Lang =
N->getSourceLanguage();
2186 Record.push_back(Lang.getName());
2189 if (Lang.hasVersionedName())
2190 Record.back() ^= (uint64_t(1) << 63);
2194 Record.push_back(
N->isOptimized());
2196 Record.push_back(
N->getRuntimeVersion());
2198 Record.push_back(
N->getEmissionKind());
2204 Record.push_back(
N->getDWOId());
2206 Record.push_back(
N->getSplitDebugInlining());
2207 Record.push_back(
N->getDebugInfoForProfiling());
2208 Record.push_back((
unsigned)
N->getNameTableKind());
2209 Record.push_back(
N->getRangesBaseAddress());
2212 Record.push_back(Lang.hasVersionedName() ? Lang.getVersion() : 0);
2213 Record.push_back(Lang.getDialect());
2219void ModuleBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
2220 SmallVectorImpl<uint64_t> &Record,
2222 const uint64_t HasUnitFlag = 1 << 1;
2223 const uint64_t HasSPFlagsFlag = 1 << 2;
2224 Record.push_back(uint64_t(
N->isDistinct()) | HasUnitFlag | HasSPFlagsFlag);
2229 Record.push_back(
N->getLine());
2231 Record.push_back(
N->getScopeLine());
2233 Record.push_back(
N->getSPFlags());
2234 Record.push_back(
N->getVirtualIndex());
2235 Record.push_back(
N->getFlags());
2240 Record.push_back(
N->getThisAdjustment());
2244 Record.push_back(
N->getKeyInstructionsEnabled());
2250void ModuleBitcodeWriter::writeDILexicalBlock(
const DILexicalBlock *
N,
2251 SmallVectorImpl<uint64_t> &Record,
2253 Record.push_back(
N->isDistinct());
2256 Record.push_back(
N->getLine());
2257 Record.push_back(
N->getColumn());
2263void ModuleBitcodeWriter::writeDILexicalBlockFile(
2264 const DILexicalBlockFile *
N, SmallVectorImpl<uint64_t> &Record,
2266 Record.push_back(
N->isDistinct());
2269 Record.push_back(
N->getDiscriminator());
2275void ModuleBitcodeWriter::writeDICommonBlock(
const DICommonBlock *
N,
2276 SmallVectorImpl<uint64_t> &Record,
2278 Record.push_back(
N->isDistinct());
2283 Record.push_back(
N->getLineNo());
2289void ModuleBitcodeWriter::writeDINamespace(
const DINamespace *
N,
2290 SmallVectorImpl<uint64_t> &Record,
2292 Record.push_back(
N->isDistinct() |
N->getExportSymbols() << 1);
2300void ModuleBitcodeWriter::writeDIMacro(
const DIMacro *
N,
2301 SmallVectorImpl<uint64_t> &Record,
2303 Record.push_back(
N->isDistinct());
2304 Record.push_back(
N->getMacinfoType());
2305 Record.push_back(
N->getLine());
2313void ModuleBitcodeWriter::writeDIMacroFile(
const DIMacroFile *
N,
2314 SmallVectorImpl<uint64_t> &Record,
2316 Record.push_back(
N->isDistinct());
2317 Record.push_back(
N->getMacinfoType());
2318 Record.push_back(
N->getLine());
2326void ModuleBitcodeWriter::writeDIArgList(
const DIArgList *
N,
2327 SmallVectorImpl<uint64_t> &Record) {
2328 Record.reserve(
N->getArgs().size());
2329 for (ValueAsMetadata *MD :
N->getArgs())
2336void ModuleBitcodeWriter::writeDIModule(
const DIModule *
N,
2337 SmallVectorImpl<uint64_t> &Record,
2339 Record.push_back(
N->isDistinct());
2340 for (
auto &
I :
N->operands())
2342 Record.push_back(
N->getLineNo());
2343 Record.push_back(
N->getIsDecl());
2349void ModuleBitcodeWriter::writeDIAssignID(
const DIAssignID *
N,
2350 SmallVectorImpl<uint64_t> &Record,
2353 Record.push_back(
N->isDistinct());
2358void ModuleBitcodeWriter::writeDITemplateTypeParameter(
2359 const DITemplateTypeParameter *
N, SmallVectorImpl<uint64_t> &Record,
2361 Record.push_back(
N->isDistinct());
2364 Record.push_back(
N->isDefault());
2370void ModuleBitcodeWriter::writeDITemplateValueParameter(
2371 const DITemplateValueParameter *
N, SmallVectorImpl<uint64_t> &Record,
2373 Record.push_back(
N->isDistinct());
2374 Record.push_back(
N->getTag());
2377 Record.push_back(
N->isDefault());
2384void ModuleBitcodeWriter::writeDIGlobalVariable(
2385 const DIGlobalVariable *
N, SmallVectorImpl<uint64_t> &Record,
2387 const uint64_t
Version = 2 << 1;
2393 Record.push_back(
N->getLine());
2395 Record.push_back(
N->isLocalToUnit());
2396 Record.push_back(
N->isDefinition());
2399 Record.push_back(
N->getAlignInBits());
2406void ModuleBitcodeWriter::writeDILocalVariable(
2407 const DILocalVariable *
N, SmallVectorImpl<uint64_t> &Record,
2422 const uint64_t HasAlignmentFlag = 1 << 1;
2423 Record.push_back((uint64_t)
N->isDistinct() | HasAlignmentFlag);
2427 Record.push_back(
N->getLine());
2429 Record.push_back(
N->getArg());
2430 Record.push_back(
N->getFlags());
2431 Record.push_back(
N->getAlignInBits());
2438void ModuleBitcodeWriter::writeDILabel(
2439 const DILabel *
N, SmallVectorImpl<uint64_t> &Record,
2441 uint64_t IsArtificialFlag = uint64_t(
N->isArtificial()) << 1;
2442 Record.push_back((uint64_t)
N->isDistinct() | IsArtificialFlag);
2446 Record.push_back(
N->getLine());
2447 Record.push_back(
N->getColumn());
2448 Record.push_back(
N->getCoroSuspendIdx().has_value()
2449 ? (uint64_t)
N->getCoroSuspendIdx().value()
2450 : std::numeric_limits<uint64_t>::max());
2456void ModuleBitcodeWriter::writeDIExpression(
const DIExpression *
N,
2457 SmallVectorImpl<uint64_t> &Record,
2459 Record.reserve(
N->getElements().size() + 1);
2460 const uint64_t
Version = 3 << 1;
2462 Record.append(
N->elements_begin(),
N->elements_end());
2468void ModuleBitcodeWriter::writeDIGlobalVariableExpression(
2469 const DIGlobalVariableExpression *
N, SmallVectorImpl<uint64_t> &Record,
2471 Record.push_back(
N->isDistinct());
2479void ModuleBitcodeWriter::writeDIObjCProperty(
const DIObjCProperty *
N,
2480 SmallVectorImpl<uint64_t> &Record,
2482 Record.push_back(
N->isDistinct());
2485 Record.push_back(
N->getLine());
2488 Record.push_back(
N->getAttributes());
2495void ModuleBitcodeWriter::writeDIImportedEntity(
2496 const DIImportedEntity *
N, SmallVectorImpl<uint64_t> &Record,
2498 Record.push_back(
N->isDistinct());
2499 Record.push_back(
N->getTag());
2502 Record.push_back(
N->getLine());
2511unsigned ModuleBitcodeWriter::createNamedMetadataAbbrev() {
2512 auto Abbv = std::make_shared<BitCodeAbbrev>();
2519void ModuleBitcodeWriter::writeNamedMetadata(
2520 SmallVectorImpl<uint64_t> &Record) {
2521 if (
M.named_metadata_empty())
2524 unsigned Abbrev = createNamedMetadataAbbrev();
2525 for (
const NamedMDNode &NMD :
M.named_metadata()) {
2527 StringRef Str = NMD.getName();
2528 Record.append(Str.bytes_begin(), Str.bytes_end());
2533 for (
const MDNode *
N : NMD.operands())
2540unsigned ModuleBitcodeWriter::createMetadataStringsAbbrev() {
2541 auto Abbv = std::make_shared<BitCodeAbbrev>();
2553void ModuleBitcodeWriter::writeMetadataStrings(
2555 if (Strings.
empty())
2563 SmallString<256> Blob;
2565 BitstreamWriter
W(Blob);
2585#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,
2586#include "llvm/IR/Metadata.def"
2590void ModuleBitcodeWriter::writeMetadataRecords(
2592 std::vector<unsigned> *MDAbbrevs, std::vector<uint64_t> *IndexPos) {
2597#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
2598#include "llvm/IR/Metadata.def"
2604 assert(
N->isResolved() &&
"Expected forward references to be resolved");
2606 switch (
N->getMetadataID()) {
2609#define HANDLE_MDNODE_LEAF(CLASS) \
2610 case Metadata::CLASS##Kind: \
2612 write##CLASS(cast<CLASS>(N), Record, \
2613 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
2615 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
2617#include "llvm/IR/Metadata.def"
2628void ModuleBitcodeWriter::writeModuleMetadata() {
2629 if (!VE.
hasMDs() &&
M.named_metadata_empty())
2633 SmallVector<uint64_t, 64>
Record;
2637 std::vector<unsigned> MDAbbrevs;
2640 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
2641 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
2642 createGenericDINodeAbbrev();
2644 auto Abbv = std::make_shared<BitCodeAbbrev>();
2648 unsigned OffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2650 Abbv = std::make_shared<BitCodeAbbrev>();
2654 unsigned IndexAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2666 uint64_t Vals[] = {0, 0};
2676 std::vector<uint64_t> IndexPos;
2680 writeMetadataRecords(VE.
getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);
2691 uint64_t PreviousValue = IndexOffsetRecordBitPos;
2692 for (
auto &Elt : IndexPos) {
2693 auto EltDelta = Elt - PreviousValue;
2694 PreviousValue = Elt;
2703 writeNamedMetadata(Record);
2705 auto AddDeclAttachedMetadata = [&](
const GlobalObject &GO) {
2706 SmallVector<uint64_t, 4>
Record;
2708 pushGlobalMetadataAttachment(Record, GO);
2711 for (
const Function &
F : M)
2712 if (
F.isDeclaration() &&
F.hasMetadata())
2713 AddDeclAttachedMetadata(
F);
2714 for (
const GlobalIFunc &GI :
M.ifuncs())
2715 if (GI.hasMetadata())
2716 AddDeclAttachedMetadata(GI);
2719 for (
const GlobalVariable &GV :
M.globals())
2720 if (GV.hasMetadata())
2721 AddDeclAttachedMetadata(GV);
2726void ModuleBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
2731 SmallVector<uint64_t, 64>
Record;
2737void ModuleBitcodeWriter::pushGlobalMetadataAttachment(
2738 SmallVectorImpl<uint64_t> &Record,
const GlobalObject &GO) {
2742 for (
const auto &
I : MDs) {
2748void ModuleBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
2751 SmallVector<uint64_t, 64>
Record;
2753 if (
F.hasMetadata()) {
2754 pushGlobalMetadataAttachment(Record,
F);
2762 for (
const BasicBlock &BB :
F)
2763 for (
const Instruction &
I : BB) {
2765 I.getAllMetadataOtherThanDebugLoc(MDs);
2768 if (MDs.
empty())
continue;
2772 for (
const auto &[
ID, MD] : MDs) {
2783void ModuleBitcodeWriter::writeModuleMetadataKinds() {
2784 SmallVector<uint64_t, 64>
Record;
2789 M.getMDKindNames(Names);
2791 if (Names.
empty())
return;
2795 for (
unsigned MDKindID = 0, e = Names.
size(); MDKindID != e; ++MDKindID) {
2796 Record.push_back(MDKindID);
2797 StringRef KName = Names[MDKindID];
2807void ModuleBitcodeWriter::writeOperandBundleTags() {
2815 M.getOperandBundleTags(Tags);
2822 SmallVector<uint64_t, 64>
Record;
2824 for (
auto Tag : Tags) {
2834void ModuleBitcodeWriter::writeSyncScopeNames() {
2836 M.getContext().getSyncScopeNames(SSNs);
2842 SmallVector<uint64_t, 64>
Record;
2843 for (
auto SSN : SSNs) {
2844 Record.append(SSN.begin(), SSN.end());
2852void ModuleBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
2854 if (FirstVal == LastVal)
return;
2858 unsigned AggregateAbbrev = 0;
2859 unsigned String8Abbrev = 0;
2860 unsigned CString7Abbrev = 0;
2861 unsigned CString6Abbrev = 0;
2865 auto Abbv = std::make_shared<BitCodeAbbrev>();
2869 AggregateAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2872 Abbv = std::make_shared<BitCodeAbbrev>();
2876 String8Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2878 Abbv = std::make_shared<BitCodeAbbrev>();
2882 CString7Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2884 Abbv = std::make_shared<BitCodeAbbrev>();
2888 CString6Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2891 SmallVector<uint64_t, 64>
Record;
2894 Type *LastTy =
nullptr;
2895 for (
unsigned i = FirstVal; i != LastVal; ++i) {
2896 const Value *
V = Vals[i].first;
2898 if (
V->getType() != LastTy) {
2899 LastTy =
V->getType();
2902 CONSTANTS_SETTYPE_ABBREV);
2909 unsigned(
IA->hasSideEffects()) |
unsigned(
IA->isAlignStack()) << 1 |
2910 unsigned(
IA->getDialect() & 1) << 2 |
unsigned(
IA->canThrow()) << 3);
2913 StringRef AsmStr =
IA->getAsmString();
2918 StringRef ConstraintStr =
IA->getConstraintString();
2926 unsigned Code = -1U;
2927 unsigned AbbrevToUse = 0;
2928 if (
C->isNullValue()) {
2935 if (
IV->getBitWidth() <= 64) {
2936 uint64_t
V =
IV->getSExtValue();
2939 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2945 if (BV->getBitWidth() <= 64) {
2946 uint64_t
V = BV->getSExtValue();
2949 AbbrevToUse = CONSTANTS_BYTE_ABBREV;
2959 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2963 APInt api = CFP->getValueAPF().bitcastToAPInt();
2965 Record.push_back((p[1] << 48) | (p[0] >> 16));
2966 Record.push_back(p[0] & 0xffffLL);
2968 APInt api = CFP->getValueAPF().bitcastToAPInt();
2973 assert(0 &&
"Unknown FP type!");
2979 uint64_t NumElts = Str->getNumElements();
2981 if (Str->isCString()) {
2986 AbbrevToUse = String8Abbrev;
2990 for (uint64_t i = 0; i != NumElts; ++i) {
2991 unsigned char V = Str->getElementAsInteger(i);
2993 isCStr7 &= (
V & 128) == 0;
2999 AbbrevToUse = CString6Abbrev;
3001 AbbrevToUse = CString7Abbrev;
3002 }
else if (
const ConstantDataSequential *CDS =
3005 Type *EltTy = CDS->getElementType();
3007 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
3008 Record.push_back(CDS->getElementAsInteger(i));
3010 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
3012 CDS->getElementAsAPFloat(i).bitcastToAPInt().getLimitedValue());
3016 for (
const Value *
Op :
C->operands())
3018 AbbrevToUse = AggregateAbbrev;
3020 switch (
CE->getOpcode()) {
3027 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
3029 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
3039 case Instruction::FNeg: {
3040 assert(
CE->getNumOperands() == 1 &&
"Unknown constant expr!");
3049 case Instruction::GetElementPtr: {
3054 if (std::optional<ConstantRange>
Range = GO->getInRange()) {
3058 for (
const Value *
Op :
CE->operands()) {
3064 case Instruction::ExtractElement:
3071 case Instruction::InsertElement:
3078 case Instruction::ShuffleVector:
3083 if (
C->getType() ==
C->getOperand(0)->getType()) {
3120 Stream.
EmitRecord(Code, Record, AbbrevToUse);
3127void ModuleBitcodeWriter::writeModuleConstants() {
3132 for (
unsigned i = 0, e = Vals.size(); i != e; ++i) {
3134 writeConstants(i, Vals.size(),
true);
3148bool ModuleBitcodeWriter::pushValueAndType(
const Value *V,
unsigned InstID,
3149 SmallVectorImpl<unsigned> &Vals) {
3153 if (ValID >= InstID) {
3160bool ModuleBitcodeWriter::pushValueOrMetadata(
const Value *V,
unsigned InstID,
3161 SmallVectorImpl<unsigned> &Vals) {
3162 bool IsMetadata =
V->getType()->isMetadataTy();
3170 return pushValueAndType(V, InstID, Vals);
3173void ModuleBitcodeWriter::writeOperandBundles(
const CallBase &CS,
3180 Record.push_back(
C.getOperandBundleTagID(Bundle.getTagName()));
3182 for (
auto &Input : Bundle.Inputs)
3183 pushValueOrMetadata(Input, InstID, Record);
3192void ModuleBitcodeWriter::pushValue(
const Value *V,
unsigned InstID,
3193 SmallVectorImpl<unsigned> &Vals) {
3198void ModuleBitcodeWriter::pushValueSigned(
const Value *V,
unsigned InstID,
3199 SmallVectorImpl<uint64_t> &Vals) {
3201 int64_t diff = ((int32_t)InstID - (int32_t)ValID);
3206void ModuleBitcodeWriter::writeInstruction(
const Instruction &
I,
3208 SmallVectorImpl<unsigned> &Vals) {
3210 unsigned AbbrevToUse = 0;
3212 switch (
I.getOpcode()) {
3216 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3217 AbbrevToUse = FUNCTION_INST_CAST_ABBREV;
3222 if (AbbrevToUse == FUNCTION_INST_CAST_ABBREV)
3223 AbbrevToUse = FUNCTION_INST_CAST_FLAGS_ABBREV;
3229 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3230 AbbrevToUse = FUNCTION_INST_BINOP_ABBREV;
3231 pushValue(
I.getOperand(1), InstID, Vals);
3235 if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV)
3236 AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV;
3241 case Instruction::FNeg: {
3243 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3244 AbbrevToUse = FUNCTION_INST_UNOP_ABBREV;
3248 if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV)
3249 AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV;
3254 case Instruction::GetElementPtr: {
3256 AbbrevToUse = FUNCTION_INST_GEP_ABBREV;
3260 for (
const Value *
Op :
I.operands())
3261 pushValueAndType(
Op, InstID, Vals);
3264 case Instruction::ExtractValue: {
3266 pushValueAndType(
I.getOperand(0), InstID, Vals);
3271 case Instruction::InsertValue: {
3273 pushValueAndType(
I.getOperand(0), InstID, Vals);
3274 pushValueAndType(
I.getOperand(1), InstID, Vals);
3279 case Instruction::Select: {
3281 pushValueAndType(
I.getOperand(1), InstID, Vals);
3282 pushValue(
I.getOperand(2), InstID, Vals);
3283 pushValueAndType(
I.getOperand(0), InstID, Vals);
3289 case Instruction::ExtractElement:
3291 pushValueAndType(
I.getOperand(0), InstID, Vals);
3292 pushValueAndType(
I.getOperand(1), InstID, Vals);
3294 case Instruction::InsertElement:
3296 pushValueAndType(
I.getOperand(0), InstID, Vals);
3297 pushValue(
I.getOperand(1), InstID, Vals);
3298 pushValueAndType(
I.getOperand(2), InstID, Vals);
3300 case Instruction::ShuffleVector:
3302 pushValueAndType(
I.getOperand(0), InstID, Vals);
3303 pushValue(
I.getOperand(1), InstID, Vals);
3307 case Instruction::ICmp:
3308 case Instruction::FCmp: {
3311 AbbrevToUse = FUNCTION_INST_CMP_ABBREV;
3312 if (pushValueAndType(
I.getOperand(0), InstID, Vals))
3314 pushValue(
I.getOperand(1), InstID, Vals);
3320 AbbrevToUse = FUNCTION_INST_CMP_FLAGS_ABBREV;
3325 case Instruction::Ret:
3328 unsigned NumOperands =
I.getNumOperands();
3329 if (NumOperands == 0)
3330 AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV;
3331 else if (NumOperands == 1) {
3332 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3333 AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV;
3335 for (
const Value *
Op :
I.operands())
3336 pushValueAndType(
Op, InstID, Vals);
3340 case Instruction::UncondBr: {
3342 AbbrevToUse = FUNCTION_INST_BR_UNCOND_ABBREV;
3346 case Instruction::CondBr: {
3348 AbbrevToUse = FUNCTION_INST_BR_COND_ABBREV;
3352 pushValue(
II.getCondition(), InstID, Vals);
3354 case Instruction::Switch:
3359 pushValue(
SI.getCondition(), InstID, Vals);
3361 for (
auto Case :
SI.cases()) {
3367 case Instruction::IndirectBr:
3371 pushValue(
I.getOperand(0), InstID, Vals);
3376 case Instruction::Invoke: {
3379 FunctionType *FTy =
II->getFunctionType();
3381 if (
II->hasOperandBundles())
3382 writeOperandBundles(*
II, InstID);
3391 pushValueAndType(Callee, InstID, Vals);
3394 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3395 pushValue(
I.getOperand(i), InstID, Vals);
3398 if (FTy->isVarArg()) {
3399 for (
unsigned i = FTy->getNumParams(), e =
II->arg_size(); i != e; ++i)
3400 pushValueAndType(
I.getOperand(i), InstID, Vals);
3404 case Instruction::Resume:
3406 pushValueAndType(
I.getOperand(0), InstID, Vals);
3408 case Instruction::CleanupRet: {
3411 pushValue(CRI.getCleanupPad(), InstID, Vals);
3412 if (CRI.hasUnwindDest())
3416 case Instruction::CatchRet: {
3419 pushValue(CRI.getCatchPad(), InstID, Vals);
3423 case Instruction::CleanupPad:
3424 case Instruction::CatchPad: {
3428 pushValue(FuncletPad.getParentPad(), InstID, Vals);
3430 unsigned NumArgOperands = FuncletPad.arg_size();
3432 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op)
3433 pushValueAndType(FuncletPad.getArgOperand(
Op), InstID, Vals);
3436 case Instruction::CatchSwitch: {
3440 pushValue(CatchSwitch.getParentPad(), InstID, Vals);
3442 unsigned NumHandlers = CatchSwitch.getNumHandlers();
3444 for (
const BasicBlock *CatchPadBB : CatchSwitch.handlers())
3447 if (CatchSwitch.hasUnwindDest())
3451 case Instruction::CallBr: {
3457 writeOperandBundles(*CBI, InstID);
3472 pushValueAndType(Callee, InstID, Vals);
3475 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3476 pushValue(
I.getOperand(i), InstID, Vals);
3479 if (FTy->isVarArg()) {
3480 for (
unsigned i = FTy->getNumParams(), e = CBI->
arg_size(); i != e; ++i)
3481 pushValueAndType(
I.getOperand(i), InstID, Vals);
3485 case Instruction::Unreachable:
3487 AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;
3490 case Instruction::PHI: {
3508 Stream.
EmitRecord(Code, Vals64, AbbrevToUse);
3513 case Instruction::LandingPad: {
3524 pushValueAndType(LP.
getClause(
I), InstID, Vals);
3529 case Instruction::Alloca: {
3535 using APV = AllocaPackedValues;
3537 unsigned EncodedAlign = getEncodedAlign(AI.
getAlign());
3539 Record, EncodedAlign & ((1 << APV::AlignLower::Bits) - 1));
3541 EncodedAlign >> APV::AlignLower::Bits);
3548 if (AS !=
M.getDataLayout().getAllocaAddrSpace())
3553 case Instruction::Load:
3556 pushValueAndType(
I.getOperand(0), InstID, Vals);
3559 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3560 AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;
3570 case Instruction::Store:
3575 AbbrevToUse = FUNCTION_INST_STORE_ABBREV;
3577 if (pushValueAndType(
I.getOperand(1), InstID, Vals))
3579 if (pushValueAndType(
I.getOperand(0), InstID, Vals))
3589 case Instruction::AtomicCmpXchg:
3591 pushValueAndType(
I.getOperand(0), InstID, Vals);
3592 pushValueAndType(
I.getOperand(1), InstID, Vals);
3593 pushValue(
I.getOperand(2), InstID, Vals);
3604 case Instruction::AtomicRMW:
3606 pushValueAndType(
I.getOperand(0), InstID, Vals);
3607 pushValueAndType(
I.getOperand(1), InstID, Vals);
3615 case Instruction::Fence:
3620 case Instruction::Call: {
3625 writeOperandBundles(CI, InstID);
3645 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3649 if (FTy->isVarArg()) {
3650 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
3655 case Instruction::VAArg:
3658 pushValue(
I.getOperand(0), InstID, Vals);
3661 case Instruction::Freeze:
3663 pushValueAndType(
I.getOperand(0), InstID, Vals);
3673void ModuleBitcodeWriter::writeGlobalValueSymbolTable(
3674 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3679 VSTOffset -= bitcodeStartBit();
3680 assert((VSTOffset & 31) == 0 &&
"VST block not 32-bit aligned");
3684 Stream.
BackpatchWord(VSTOffsetPlaceholder, VSTOffset / 32 + 1);
3688 auto Abbv = std::make_shared<BitCodeAbbrev>();
3692 unsigned FnEntryAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
3694 for (
const Function &
F : M) {
3697 if (
F.isDeclaration())
3704 uint64_t BitcodeIndex = FunctionToBitcodeIndex[&
F] - bitcodeStartBit();
3705 assert((BitcodeIndex & 31) == 0 &&
"function block not 32-bit aligned");
3709 Record[1] = BitcodeIndex / 32 + 1;
3718void ModuleBitcodeWriter::writeFunctionLevelValueSymbolTable(
3719 const ValueSymbolTable &VST) {
3727 SmallVector<uint64_t, 64> NameVals;
3733 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
3742 AbbrevToUse = VST_BBENTRY_6_ABBREV;
3746 AbbrevToUse = VST_ENTRY_6_ABBREV;
3748 AbbrevToUse = VST_ENTRY_7_ABBREV;
3751 for (
const auto P :
Name.getKey())
3755 Stream.
EmitRecord(Code, NameVals, AbbrevToUse);
3762void ModuleBitcodeWriter::writeUseList(UseListOrder &&Order) {
3763 assert(Order.Shuffle.size() >= 2 &&
"Shuffle too small");
3770 SmallVector<uint64_t, 64>
Record(Order.Shuffle.begin(), Order.Shuffle.end());
3775void ModuleBitcodeWriter::writeUseListBlock(
const Function *
F) {
3777 "Expected to be preserving use-list order");
3779 auto hasMore = [&]() {
3795void ModuleBitcodeWriter::writeFunction(
3797 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3814 unsigned CstStart, CstEnd;
3816 writeConstants(CstStart, CstEnd,
false);
3819 writeFunctionMetadata(
F);
3822 unsigned InstID = CstEnd;
3824 bool NeedsMetadataAttachment =
F.hasMetadata();
3826 DILocation *LastDL =
nullptr;
3827 SmallSetVector<Function *, 4> BlockAddressUsers;
3830 for (
const BasicBlock &BB :
F) {
3831 for (
const Instruction &
I : BB) {
3832 writeInstruction(
I, InstID, Vals);
3834 if (!
I.getType()->isVoidTy())
3838 NeedsMetadataAttachment |=
I.hasMetadataOtherThanDebugLoc();
3841 if (DILocation *
DL =
I.getDebugLoc()) {
3854 FUNCTION_DEBUG_LOC_ABBREV);
3864 if (
I.hasDbgRecords()) {
3868 auto PushValueOrMetadata = [&Vals, InstID,
3871 "RawLocation unexpectedly null in DbgVariableRecord");
3873 SmallVector<unsigned, 2> ValAndType;
3877 if (!pushValueAndType(VAM->getValue(), InstID, ValAndType)) {
3891 for (DbgRecord &DR :
I.DebugMarker->getDbgRecordRange()) {
3917 FUNCTION_DEBUG_RECORD_VALUE_ABBREV);
3941 SmallPtrSet<Value *, 8> Visited{BA};
3942 while (!Worklist.
empty()) {
3944 for (User *U :
V->users()) {
3950 Visited.
insert(U).second)
3957 if (!BlockAddressUsers.
empty()) {
3966 if (
auto *Symtab =
F.getValueSymbolTable())
3967 writeFunctionLevelValueSymbolTable(*Symtab);
3969 if (NeedsMetadataAttachment)
3970 writeFunctionMetadataAttachment(
F);
3972 writeUseListBlock(&
F);
3978void ModuleBitcodeWriter::writeBlockInfo() {
3991 auto Abbv = std::make_shared<BitCodeAbbrev>();
4002 auto Abbv = std::make_shared<BitCodeAbbrev>();
4012 auto Abbv = std::make_shared<BitCodeAbbrev>();
4022 auto Abbv = std::make_shared<BitCodeAbbrev>();
4028 VST_BBENTRY_6_ABBREV)
4033 auto Abbv = std::make_shared<BitCodeAbbrev>();
4035 Abbv->Add(TypeAbbrevOp);
4037 CONSTANTS_SETTYPE_ABBREV)
4042 auto Abbv = std::make_shared<BitCodeAbbrev>();
4046 CONSTANTS_INTEGER_ABBREV)
4051 auto Abbv = std::make_shared<BitCodeAbbrev>();
4055 CONSTANTS_BYTE_ABBREV)
4060 auto Abbv = std::make_shared<BitCodeAbbrev>();
4068 CONSTANTS_CE_CAST_Abbrev)
4072 auto Abbv = std::make_shared<BitCodeAbbrev>();
4075 CONSTANTS_NULL_Abbrev)
4082 auto Abbv = std::make_shared<BitCodeAbbrev>();
4084 Abbv->Add(ValAbbrevOp);
4085 Abbv->Add(TypeAbbrevOp);
4089 FUNCTION_INST_LOAD_ABBREV)
4093 auto Abbv = std::make_shared<BitCodeAbbrev>();
4095 Abbv->Add(ValAbbrevOp);
4096 Abbv->Add(ValAbbrevOp);
4100 FUNCTION_INST_STORE_ABBREV)
4104 auto Abbv = std::make_shared<BitCodeAbbrev>();
4106 Abbv->Add(ValAbbrevOp);
4109 FUNCTION_INST_UNOP_ABBREV)
4113 auto Abbv = std::make_shared<BitCodeAbbrev>();
4115 Abbv->Add(ValAbbrevOp);
4119 FUNCTION_INST_UNOP_FLAGS_ABBREV)
4123 auto Abbv = std::make_shared<BitCodeAbbrev>();
4125 Abbv->Add(ValAbbrevOp);
4126 Abbv->Add(ValAbbrevOp);
4129 FUNCTION_INST_BINOP_ABBREV)
4133 auto Abbv = std::make_shared<BitCodeAbbrev>();
4135 Abbv->Add(ValAbbrevOp);
4136 Abbv->Add(ValAbbrevOp);
4140 FUNCTION_INST_BINOP_FLAGS_ABBREV)
4144 auto Abbv = std::make_shared<BitCodeAbbrev>();
4146 Abbv->Add(ValAbbrevOp);
4147 Abbv->Add(TypeAbbrevOp);
4150 FUNCTION_INST_CAST_ABBREV)
4154 auto Abbv = std::make_shared<BitCodeAbbrev>();
4156 Abbv->Add(ValAbbrevOp);
4157 Abbv->Add(TypeAbbrevOp);
4161 FUNCTION_INST_CAST_FLAGS_ABBREV)
4166 auto Abbv = std::make_shared<BitCodeAbbrev>();
4169 FUNCTION_INST_RET_VOID_ABBREV)
4173 auto Abbv = std::make_shared<BitCodeAbbrev>();
4175 Abbv->Add(ValAbbrevOp);
4177 FUNCTION_INST_RET_VAL_ABBREV)
4181 auto Abbv = std::make_shared<BitCodeAbbrev>();
4184 Abbv->Add(ValAbbrevOp);
4186 FUNCTION_INST_BR_UNCOND_ABBREV)
4190 auto Abbv = std::make_shared<BitCodeAbbrev>();
4193 Abbv->Add(ValAbbrevOp);
4194 Abbv->Add(ValAbbrevOp);
4195 Abbv->Add(ValAbbrevOp);
4197 FUNCTION_INST_BR_COND_ABBREV)
4201 auto Abbv = std::make_shared<BitCodeAbbrev>();
4204 FUNCTION_INST_UNREACHABLE_ABBREV)
4208 auto Abbv = std::make_shared<BitCodeAbbrev>();
4211 Abbv->Add(TypeAbbrevOp);
4213 Abbv->Add(ValAbbrevOp);
4215 FUNCTION_INST_GEP_ABBREV)
4219 auto Abbv = std::make_shared<BitCodeAbbrev>();
4221 Abbv->Add(ValAbbrevOp);
4222 Abbv->Add(ValAbbrevOp);
4225 FUNCTION_INST_CMP_ABBREV)
4229 auto Abbv = std::make_shared<BitCodeAbbrev>();
4231 Abbv->Add(ValAbbrevOp);
4232 Abbv->Add(ValAbbrevOp);
4236 FUNCTION_INST_CMP_FLAGS_ABBREV)
4240 auto Abbv = std::make_shared<BitCodeAbbrev>();
4245 Abbv->Add(ValAbbrevOp);
4247 FUNCTION_DEBUG_RECORD_VALUE_ABBREV)
4251 auto Abbv = std::make_shared<BitCodeAbbrev>();
4262 FUNCTION_DEBUG_LOC_ABBREV)
4270void IndexBitcodeWriter::writeModStrings() {
4276 auto Abbv = std::make_shared<BitCodeAbbrev>();
4281 unsigned Abbrev8Bit = Stream.
EmitAbbrev(std::move(Abbv));
4284 Abbv = std::make_shared<BitCodeAbbrev>();
4289 unsigned Abbrev7Bit = Stream.
EmitAbbrev(std::move(Abbv));
4292 Abbv = std::make_shared<BitCodeAbbrev>();
4297 unsigned Abbrev6Bit = Stream.
EmitAbbrev(std::move(Abbv));
4300 Abbv = std::make_shared<BitCodeAbbrev>();
4307 unsigned AbbrevHash = Stream.
EmitAbbrev(std::move(Abbv));
4310 forEachModule([&](
const StringMapEntry<ModuleHash> &MPSE) {
4312 const auto &Hash = MPSE.
getValue();
4314 unsigned AbbrevToUse = Abbrev8Bit;
4316 AbbrevToUse = Abbrev6Bit;
4318 AbbrevToUse = Abbrev7Bit;
4320 auto ModuleId = ModuleIdMap.
size();
4321 ModuleIdMap[
Key] = ModuleId;
4331 Vals.
assign(Hash.begin(), Hash.end());
4343template <
typename Fn>
4347 if (!FS->type_tests().empty())
4352 auto WriteVFuncIdVec = [&](
uint64_t Ty,
4357 for (
auto &VF : VFs) {
4358 Record.push_back(VF.GUID);
4359 Record.push_back(VF.Offset);
4365 FS->type_test_assume_vcalls());
4367 FS->type_checked_load_vcalls());
4369 auto WriteConstVCallVec = [&](
uint64_t Ty,
4371 for (
auto &VC : VCs) {
4373 Record.push_back(VC.VFunc.GUID);
4374 Record.push_back(VC.VFunc.Offset);
4381 FS->type_test_assume_const_vcalls());
4383 FS->type_checked_load_const_vcalls());
4393 if (!FS->paramAccesses().empty()) {
4395 for (
auto &Arg : FS->paramAccesses()) {
4396 size_t UndoSize =
Record.size();
4397 Record.push_back(Arg.ParamNo);
4398 WriteRange(Arg.Use);
4399 Record.push_back(Arg.Calls.size());
4400 for (
auto &
Call : Arg.Calls) {
4402 std::optional<unsigned> ValueID = GetValueID(
Call.Callee);
4409 Record.push_back(*ValueID);
4410 WriteRange(
Call.Offsets);
4421 std::set<GlobalValue::GUID> &ReferencedTypeIds) {
4422 if (!FS->type_tests().empty())
4423 for (
auto &TT : FS->type_tests())
4424 ReferencedTypeIds.insert(TT);
4426 auto GetReferencedTypesFromVFuncIdVec =
4428 for (
auto &VF : VFs)
4429 ReferencedTypeIds.insert(VF.GUID);
4432 GetReferencedTypesFromVFuncIdVec(FS->type_test_assume_vcalls());
4433 GetReferencedTypesFromVFuncIdVec(FS->type_checked_load_vcalls());
4435 auto GetReferencedTypesFromConstVCallVec =
4437 for (
auto &VC : VCs)
4438 ReferencedTypeIds.insert(VC.VFunc.GUID);
4441 GetReferencedTypesFromConstVCallVec(FS->type_test_assume_const_vcalls());
4442 GetReferencedTypesFromConstVCallVec(FS->type_checked_load_const_vcalls());
4478 NameVals.
push_back(Summary.TTRes.TheKind);
4479 NameVals.
push_back(Summary.TTRes.SizeM1BitWidth);
4480 NameVals.
push_back(Summary.TTRes.AlignLog2);
4481 NameVals.
push_back(Summary.TTRes.SizeM1);
4482 NameVals.
push_back(Summary.TTRes.BitMask);
4483 NameVals.
push_back(Summary.TTRes.InlineBits);
4485 for (
auto &W : Summary.WPDRes)
4497 for (
auto &
P : Summary) {
4499 NameVals.
push_back(
VE.getValueID(
P.VTableVI.getValue()));
4513 static_assert(std::is_same_v<LinearFrameId, unsigned>);
4514 for (
auto &AI : FS->allocs()) {
4515 for (
auto &MIB : AI.MIBs) {
4517 StackIdIndices.
reserve(MIB.StackIdIndices.size());
4518 for (
auto Id : MIB.StackIdIndices)
4519 StackIdIndices.
push_back(GetStackIndex(Id));
4521 CallStacks.insert({CallStacks.size(), StackIdIndices});
4534 assert(!CallStacks.empty());
4540 Builder.
build(std::move(CallStacks),
nullptr,
4544 return Builder.takeCallStackPos();
4549 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
bool PerModule,
4550 std::function<
unsigned(
const ValueInfo &VI)> GetValueID,
4551 std::function<
unsigned(
unsigned)> GetStackIndex,
4552 bool WriteContextSizeInfoIndex,
4557 for (
auto &CI : FS->callsites()) {
4561 assert(!PerModule || (CI.Clones.size() == 1 && CI.Clones[0] == 0));
4562 Record.push_back(GetValueID(CI.Callee));
4564 Record.push_back(CI.StackIdIndices.size());
4565 Record.push_back(CI.Clones.size());
4567 for (
auto Id : CI.StackIdIndices)
4568 Record.push_back(GetStackIndex(Id));
4576 for (
auto &AI : FS->allocs()) {
4580 assert(!PerModule || (AI.Versions.size() == 1 && AI.Versions[0] == 0));
4581 Record.push_back(AI.MIBs.size());
4583 Record.push_back(AI.Versions.size());
4584 for (
auto &MIB : AI.MIBs) {
4591 assert(CallStackCount <= CallStackPos.
size());
4592 Record.push_back(CallStackPos[CallStackCount++]);
4597 assert(AI.ContextSizeInfos.empty() ||
4598 AI.ContextSizeInfos.size() == AI.MIBs.size());
4600 if (WriteContextSizeInfoIndex && !AI.ContextSizeInfos.empty()) {
4608 ContextIds.
reserve(AI.ContextSizeInfos.size() * 2);
4609 for (
auto &Infos : AI.ContextSizeInfos) {
4610 Record.push_back(Infos.size());
4611 for (
auto [FullStackId, TotalSize] : Infos) {
4618 Record.push_back(TotalSize);
4636void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
4637 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
4638 unsigned ValueID,
unsigned FSCallsProfileAbbrev,
unsigned CallsiteAbbrev,
4639 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
const Function &
F,
4640 DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
4647 Stream, FS, [&](
const ValueInfo &VI) -> std::optional<unsigned> {
4651 auto SpecialRefCnts =
FS->specialRefCounts();
4656 NameVals.
push_back(SpecialRefCnts.first);
4657 NameVals.
push_back(SpecialRefCnts.second);
4659 for (
auto &RI :
FS->refs())
4662 for (
auto &ECI :
FS->calls()) {
4663 NameVals.
push_back(getValueId(ECI.first));
4672 Stream, FS, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,
4674 [&](
const ValueInfo &VI) {
return getValueId(VI); },
4675 [&](
unsigned I) {
return I; },
4676 true, CallStackPos, CallStackCount);
4681void ModuleBitcodeWriterBase::writeModuleLevelReferences(
4682 const GlobalVariable &V, SmallVector<uint64_t, 64> &NameVals,
4683 unsigned FSModRefsAbbrev,
unsigned FSModVTableRefsAbbrev) {
4684 auto VI =
Index->getValueInfo(
V.getGUID());
4685 if (!VI ||
VI.getSummaryList().empty()) {
4691 auto *
Summary =
VI.getSummaryList()[0].get();
4697 auto VTableFuncs =
VS->vTableFuncs();
4698 if (!VTableFuncs.empty())
4701 unsigned SizeBeforeRefs = NameVals.
size();
4702 for (
auto &RI :
VS->refs())
4708 if (VTableFuncs.empty())
4713 for (
auto &
P : VTableFuncs) {
4719 FSModVTableRefsAbbrev);
4726void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
4729 bool IsThinLTO =
true;
4732 IsThinLTO = MD->getZExtValue();
4744 if (
Index->enableSplitLTOUnit())
4746 if (
Index->hasUnifiedLTO())
4756 auto Abbv = std::make_shared<BitCodeAbbrev>();
4762 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4764 for (
const auto &GVI : valueIds()) {
4766 ArrayRef<uint32_t>{GVI.second,
4767 static_cast<uint32_t
>(GVI.first >> 32),
4768 static_cast<uint32_t
>(GVI.first)},
4772 if (!
Index->stackIds().empty()) {
4773 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4780 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4781 SmallVector<uint32_t> Vals;
4783 for (
auto Id :
Index->stackIds()) {
4784 Vals.
push_back(
static_cast<uint32_t
>(Id >> 32));
4785 Vals.
push_back(
static_cast<uint32_t
>(Id));
4790 unsigned ContextIdAbbvId = 0;
4793 auto ContextIdAbbv = std::make_shared<BitCodeAbbrev>();
4805 ContextIdAbbvId = Stream.
EmitAbbrev(std::move(ContextIdAbbv));
4809 Abbv = std::make_shared<BitCodeAbbrev>();
4821 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4824 Abbv = std::make_shared<BitCodeAbbrev>();
4830 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4833 Abbv = std::make_shared<BitCodeAbbrev>();
4841 unsigned FSModVTableRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4844 Abbv = std::make_shared<BitCodeAbbrev>();
4849 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4852 Abbv = std::make_shared<BitCodeAbbrev>();
4859 unsigned TypeIdCompatibleVtableAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4861 Abbv = std::make_shared<BitCodeAbbrev>();
4867 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4869 Abbv = std::make_shared<BitCodeAbbrev>();
4876 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4878 Abbv = std::make_shared<BitCodeAbbrev>();
4883 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4890 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
4891 for (
const Function &
F : M) {
4897 ValueInfo
VI =
Index->getValueInfo(
F.getGUID());
4898 if (!VI ||
VI.getSummaryList().empty()) {
4904 auto *
Summary =
VI.getSummaryList()[0].get();
4907 FS, [](
unsigned I) {
return I; }, CallStacks);
4911 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
4912 if (!CallStacks.
empty()) {
4920 SmallVector<uint64_t, 64> NameVals;
4923 for (
const Function &
F : M) {
4929 ValueInfo
VI =
Index->getValueInfo(
F.getGUID());
4930 if (!VI ||
VI.getSummaryList().empty()) {
4936 auto *
Summary =
VI.getSummaryList()[0].get();
4937 writePerModuleFunctionSummaryRecord(NameVals, Summary, VE.
getValueID(&
F),
4938 FSCallsProfileAbbrev, CallsiteAbbrev,
4939 AllocAbbrev, ContextIdAbbvId,
F,
4940 CallStackPos, CallStackCount);
4945 for (
const GlobalVariable &
G :
M.globals())
4946 writeModuleLevelReferences(
G, NameVals, FSModRefsAbbrev,
4947 FSModVTableRefsAbbrev);
4949 for (
const GlobalAlias &
A :
M.aliases()) {
4950 auto *Aliasee =
A.getAliaseeObject();
4966 for (
auto &S :
Index->typeIdCompatibleVtableMap()) {
4970 TypeIdCompatibleVtableAbbrev);
4974 if (
Index->getBlockCount())
4976 ArrayRef<uint64_t>{
Index->getBlockCount()});
4982void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
4991 auto Abbv = std::make_shared<BitCodeAbbrev>();
4997 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4999 for (
const auto &GVI : valueIds()) {
5001 ArrayRef<uint32_t>{GVI.second,
5002 static_cast<uint32_t
>(GVI.first >> 32),
5003 static_cast<uint32_t
>(GVI.first)},
5009 if (!StackIds.empty()) {
5010 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
5017 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
5018 SmallVector<uint32_t> Vals;
5019 Vals.
reserve(StackIds.size() * 2);
5020 for (
auto Id : StackIds) {
5021 Vals.
push_back(
static_cast<uint32_t
>(Id >> 32));
5022 Vals.
push_back(
static_cast<uint32_t
>(Id));
5028 Abbv = std::make_shared<BitCodeAbbrev>();
5042 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5045 Abbv = std::make_shared<BitCodeAbbrev>();
5052 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5055 Abbv = std::make_shared<BitCodeAbbrev>();
5061 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5063 Abbv = std::make_shared<BitCodeAbbrev>();
5071 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5073 Abbv = std::make_shared<BitCodeAbbrev>();
5084 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5086 auto shouldImportValueAsDecl = [&](GlobalValueSummary *GVS) ->
bool {
5087 if (DecSummaries ==
nullptr)
5089 return DecSummaries->count(GVS);
5097 DenseMap<const GlobalValueSummary *, unsigned> SummaryToValueIdMap;
5099 SmallVector<uint64_t, 64> NameVals;
5103 std::set<GlobalValue::GUID> ReferencedTypeIds;
5107 auto MaybeEmitOriginalName = [&](GlobalValueSummary &S) {
5117 NameVals.
push_back(S.getOriginalName());
5122 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
5124 Abbv = std::make_shared<BitCodeAbbrev>();
5129 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5136 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
5137 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
5143 GlobalValueSummary *S =
I.second;
5156 return StackIdIndicesToIndex[
I];
5162 if (!CallStacks.
empty()) {
5172 DenseSet<GlobalValue::GUID> DefOrUseGUIDs;
5173 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
5174 GlobalValueSummary *S =
I.second;
5176 DefOrUseGUIDs.
insert(
I.first);
5177 for (
const ValueInfo &VI : S->
refs())
5178 DefOrUseGUIDs.
insert(
VI.getGUID());
5180 auto ValueId = getValueId(
I.first);
5182 SummaryToValueIdMap[S] = *ValueId;
5200 NameVals.
push_back(ModuleIdMap[
VS->modulePath()]);
5204 for (
auto &RI :
VS->refs()) {
5205 auto RefValueId = getValueId(RI.getGUID());
5215 MaybeEmitOriginalName(*S);
5219 auto GetValueId = [&](
const ValueInfo &
VI) -> std::optional<unsigned> {
5221 return std::nullopt;
5222 return getValueId(
VI.getGUID());
5231 NameVals.
push_back(ModuleIdMap[
FS->modulePath()]);
5244 unsigned Count = 0, RORefCnt = 0, WORefCnt = 0;
5245 for (
auto &RI :
FS->refs()) {
5246 auto RefValueId = getValueId(RI.getGUID());
5250 if (RI.isReadOnly())
5252 else if (RI.isWriteOnly())
5256 NameVals[6] =
Count;
5257 NameVals[7] = RORefCnt;
5258 NameVals[8] = WORefCnt;
5260 for (
auto &EI :
FS->calls()) {
5263 std::optional<unsigned> CallValueId = GetValueId(EI.first);
5272 FSCallsProfileAbbrev);
5276 Stream, FS, CallsiteAbbrev, AllocAbbrev, 0,
5279 [&](
const ValueInfo &VI) ->
unsigned {
5280 std::optional<unsigned> ValueID = GetValueId(VI);
5295 return StackIdIndicesToIndex[
I];
5297 false, CallStackPos, CallStackCount);
5299 MaybeEmitOriginalName(*S);
5302 for (
auto *AS : Aliases) {
5303 auto AliasValueId = SummaryToValueIdMap[AS];
5312 auto AliaseeValueId =
5319 MaybeEmitOriginalName(*AS);
5327 auto EmitCfiFunctions = [&](
const CfiFunctionIndex &CfiIndex,
5329 if (CfiIndex.
empty())
5333 for (StringRef Name : Names)
5336 if (Functions.
empty())
5339 for (
const auto &Record : Functions) {
5354 for (
auto &
T : ReferencedTypeIds) {
5355 auto TidIter =
Index.typeIds().equal_range(
T);
5356 for (
const auto &[GUID, TypeIdPair] :
make_range(TidIter)) {
5364 if (
Index.getBlockCount())
5366 ArrayRef<uint64_t>{
Index.getBlockCount()});
5377 auto Abbv = std::make_shared<BitCodeAbbrev>();
5381 auto StringAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5383 "LLVM" LLVM_VERSION_STRING, StringAbbrev);
5386 Abbv = std::make_shared<BitCodeAbbrev>();
5389 auto EpochAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5395void ModuleBitcodeWriter::writeModuleHash(StringRef View) {
5400 Hasher.
update(ArrayRef<uint8_t>(
5401 reinterpret_cast<const uint8_t *
>(
View.data()),
View.size()));
5402 std::array<uint8_t, 20> Hash = Hasher.
result();
5403 for (
int Pos = 0; Pos < 20; Pos += 4) {
5416void ModuleBitcodeWriter::write() {
5424 writeModuleVersion();
5433 writeAttributeGroupTable();
5436 writeAttributeTable();
5445 writeModuleConstants();
5448 writeModuleMetadataKinds();
5451 writeModuleMetadata();
5455 writeUseListBlock(
nullptr);
5457 writeOperandBundleTags();
5458 writeSyncScopeNames();
5461 DenseMap<const Function *, uint64_t> FunctionToBitcodeIndex;
5462 for (
const Function &
F : M)
5463 if (!
F.isDeclaration())
5464 writeFunction(
F, FunctionToBitcodeIndex);
5469 writePerModuleGlobalValueSummary();
5471 writeGlobalValueSymbolTable(FunctionToBitcodeIndex);
5499 unsigned CPUType = ~0U;
5506 DARWIN_CPU_ARCH_ABI64 = 0x01000000,
5507 DARWIN_CPU_TYPE_X86 = 7,
5508 DARWIN_CPU_TYPE_ARM = 12,
5509 DARWIN_CPU_TYPE_POWERPC = 18
5514 CPUType = DARWIN_CPU_TYPE_X86 | DARWIN_CPU_ARCH_ABI64;
5516 CPUType = DARWIN_CPU_TYPE_X86;
5518 CPUType = DARWIN_CPU_TYPE_POWERPC;
5520 CPUType = DARWIN_CPU_TYPE_POWERPC | DARWIN_CPU_ARCH_ABI64;
5522 CPUType = DARWIN_CPU_TYPE_ARM;
5526 "Expected header size to be reserved");
5531 unsigned Position = 0;
5539 while (Buffer.
size() & 15)
5546 Stream.
Emit((
unsigned)
'B', 8);
5547 Stream.
Emit((
unsigned)
'C', 8);
5548 Stream.
Emit(0x0, 4);
5549 Stream.
Emit(0xC, 4);
5550 Stream.
Emit(0xE, 4);
5551 Stream.
Emit(0xD, 4);
5569 auto Abbv = std::make_shared<BitCodeAbbrev>();
5572 auto AbbrevNo = Stream->
EmitAbbrev(std::move(Abbv));
5580 assert(!WroteStrtab && !WroteSymtab);
5586 if (M->getModuleInlineAsm().empty())
5590 const Triple TT(M->getTargetTriple());
5592 if (!
T || !
T->hasMCAsmParser())
5614 std::vector<char> Strtab;
5615 StrtabBuilder.finalizeInOrder();
5616 Strtab.resize(StrtabBuilder.getSize());
5617 StrtabBuilder.write((
uint8_t *)Strtab.data());
5620 {Strtab.data(), Strtab.size()});
5631 bool ShouldPreserveUseListOrder,
5640 assert(M.isMaterialized());
5641 Mods.push_back(
const_cast<Module *
>(&M));
5643 ModuleBitcodeWriter ModuleWriter(M, StrtabBuilder, *Stream,
5644 ShouldPreserveUseListOrder, Index,
5645 GenerateHash, ModHash);
5646 ModuleWriter.write();
5653 IndexBitcodeWriter IndexWriter(*Stream, StrtabBuilder, *Index, DecSummaries,
5654 ModuleToSummariesForIndex);
5655 IndexWriter.write();
5660 bool ShouldPreserveUseListOrder,
5664 Writer.writeModule(M, ShouldPreserveUseListOrder, Index, GenerateHash,
5666 Writer.writeSymtab();
5667 Writer.writeStrtab();
5669 Triple TT(M.getTargetTriple());
5670 if (TT.isOSDarwin() || TT.isOSBinFormatMachO()) {
5688void IndexBitcodeWriter::write() {
5691 writeModuleVersion();
5697 writeCombinedGlobalValueSummary();
5714 Writer.
writeIndex(&Index, ModuleToSummariesForIndex, DecSummaries);
5723class ThinLinkBitcodeWriter :
public ModuleBitcodeWriterBase {
5733 : ModuleBitcodeWriterBase(M, StrtabBuilder, Stream,
5735 ModHash(&ModHash) {}
5740 void writeSimplifiedModuleInfo();
5750void ThinLinkBitcodeWriter::writeSimplifiedModuleInfo() {
5762 auto Abbv = std::make_shared<BitCodeAbbrev>();
5765 Abbv->Add(AbbrevOpToUse);
5766 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5768 for (
const auto P :
M.getSourceFileName())
5832void ThinLinkBitcodeWriter::write() {
5835 writeModuleVersion();
5837 writeSimplifiedModuleInfo();
5839 writePerModuleGlobalValueSummary();
5856 assert(M.isMaterialized());
5857 Mods.push_back(
const_cast<Module *
>(&M));
5859 ThinLinkBitcodeWriter ThinLinkWriter(M, StrtabBuilder, *Stream, Index,
5861 ThinLinkWriter.write();
5882 switch (
T.getObjectFormat()) {
5884 return "__LLVM,__bitcode";
5909 switch (
T.getObjectFormat()) {
5911 return "__LLVM,__cmdline";
5937 const std::vector<uint8_t> &CmdArgs) {
5942 Type *UsedElementType = Used ? Used->getValueType()->getArrayElementType()
5944 for (
auto *GV : UsedGlobals) {
5945 if (GV->getName() !=
"llvm.embedded.module" &&
5946 GV->getName() !=
"llvm.cmdline")
5951 Used->eraseFromParent();
5956 Triple T(M.getTargetTriple());
5985 M.getGlobalVariable(
"llvm.embedded.module",
true)) {
5986 assert(Old->hasZeroLiveUses() &&
5987 "llvm.embedded.module can only be used once in llvm.compiler.used");
5989 Old->eraseFromParent();
5991 GV->
setName(
"llvm.embedded.module");
6009 assert(Old->hasZeroLiveUses() &&
6010 "llvm.cmdline can only be used once in llvm.compiler.used");
6012 Old->eraseFromParent();
6018 if (UsedArray.
empty())
6026 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 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 unsigned getEncodedRMWOperation(const AtomicRMWInst &I)
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.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool empty() const
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.
an instruction that atomically reads a memory location, combines it with another value,...
@ 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
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
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
auto getNamesForGUID(GlobalValue::GUID GUID) const
get the name(s) associated with a given ThinLTO GUID.
@ 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
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
constexpr size_t size() const
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
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 Error write(DWPWriter &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue, Dwarf64StrOffsetsPromotion StrOffsetsOptValue, raw_pwrite_stream *OS=nullptr)
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 LLVM_ABI const Target * lookupTarget(const Triple &TheTriple, 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