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;
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),
234 for (
const auto &GUIDSummaryLists :
235 Index->sortedGlobalValueSummariesRange())
237 for (
auto &Summary : GUIDSummaryLists.second.getSummaryList())
243 for (auto &CallEdge : FS->calls())
244 if (!CallEdge.first.haveGVs() || !CallEdge.first.getValue())
245 assignValueId(CallEdge.first.getGUID());
251 for (auto &RefEdge : FS->refs())
252 if (!RefEdge.haveGVs() || !RefEdge.getValue())
253 assignValueId(RefEdge.getGUID());
258 void writePerModuleGlobalValueSummary();
259 void writeGUIDList();
262 void writePerModuleFunctionSummaryRecord(
263 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
264 unsigned ValueID,
unsigned FSCallsProfileAbbrev,
unsigned CallsiteAbbrev,
265 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
const Function &
F,
266 DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
268 void writeModuleLevelReferences(
const GlobalVariable &V,
269 SmallVector<uint64_t, 64> &NameVals,
270 unsigned FSModRefsAbbrev,
271 unsigned FSModVTableRefsAbbrev);
274 GUIDToValueIdMap[ValGUID] = ++GlobalValueId;
278 const auto &VMI = GUIDToValueIdMap.find(ValGUID);
281 assert(VMI != GUIDToValueIdMap.end() &&
282 "GUID does not have assigned value Id");
287 unsigned getValueId(ValueInfo VI) {
288 if (!
VI.haveGVs() || !
VI.getValue())
289 return getValueId(
VI.getGUID());
293 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
297class ModuleBitcodeWriter :
public ModuleBitcodeWriterBase {
313 ModuleBitcodeWriter(
const Module &M, StringTableBuilder &StrtabBuilder,
314 BitstreamWriter &Stream,
bool ShouldPreserveUseListOrder,
315 const ModuleSummaryIndex *Index,
bool GenerateHash,
317 : ModuleBitcodeWriterBase(
M, StrtabBuilder, Stream,
318 ShouldPreserveUseListOrder,
Index),
319 GenerateHash(GenerateHash), ModHash(ModHash),
320 BitcodeStartBit(Stream.GetCurrentBitNo()) {}
326 uint64_t bitcodeStartBit() {
return BitcodeStartBit; }
328 size_t addToStrtab(StringRef Str);
330 void writeAttributeGroupTable();
331 void writeAttributeTable();
332 void writeTypeTable();
334 void writeValueSymbolTableForwardDecl();
335 void writeModuleInfo();
336 void writeValueAsMetadata(
const ValueAsMetadata *MD,
337 SmallVectorImpl<uint64_t> &Record);
338 void writeMDTuple(
const MDTuple *
N, SmallVectorImpl<uint64_t> &Record,
340 unsigned createDILocationAbbrev();
341 void writeDILocation(
const DILocation *
N, SmallVectorImpl<uint64_t> &Record,
343 unsigned createGenericDINodeAbbrev();
345 SmallVectorImpl<uint64_t> &Record,
unsigned &Abbrev);
346 void writeDISubrange(
const DISubrange *
N, SmallVectorImpl<uint64_t> &Record,
349 SmallVectorImpl<uint64_t> &Record,
352 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
356 SmallVectorImpl<uint64_t> &Record,
359 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
361 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
363 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
365 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
367 SmallVectorImpl<uint64_t> &Record,
369 void writeDIFile(
const DIFile *
N, SmallVectorImpl<uint64_t> &Record,
372 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
374 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
376 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
378 SmallVectorImpl<uint64_t> &Record,
381 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
384 void writeDIMacro(
const DIMacro *
N, SmallVectorImpl<uint64_t> &Record,
388 void writeDIArgList(
const DIArgList *
N, SmallVectorImpl<uint64_t> &Record);
389 void writeDIModule(
const DIModule *
N, SmallVectorImpl<uint64_t> &Record,
391 void writeDIAssignID(
const DIAssignID *
N, SmallVectorImpl<uint64_t> &Record,
394 SmallVectorImpl<uint64_t> &Record,
397 SmallVectorImpl<uint64_t> &Record,
400 SmallVectorImpl<uint64_t> &Record,
403 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
405 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
407 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
409 SmallVectorImpl<uint64_t> &Record,
412 SmallVectorImpl<uint64_t> &Record,
unsigned Abbrev);
413 void writeDIProperty(
const DIProperty *
N, SmallVectorImpl<uint64_t> &Record,
416 SmallVectorImpl<uint64_t> &Record,
418 unsigned createNamedMetadataAbbrev();
419 void writeNamedMetadata(SmallVectorImpl<uint64_t> &Record);
420 unsigned createMetadataStringsAbbrev();
422 SmallVectorImpl<uint64_t> &Record);
424 SmallVectorImpl<uint64_t> &Record,
425 std::vector<unsigned> *MDAbbrevs =
nullptr,
426 std::vector<uint64_t> *IndexPos =
nullptr);
427 void writeModuleMetadata();
428 void writeFunctionMetadata(
const Function &
F);
429 void writeFunctionMetadataAttachment(
const Function &
F);
430 void pushGlobalMetadataAttachment(SmallVectorImpl<uint64_t> &Record,
431 const GlobalObject &GO);
432 void writeModuleMetadataKinds();
433 void writeOperandBundleTags();
434 void writeSyncScopeNames();
435 void writeConstants(
unsigned FirstVal,
unsigned LastVal,
bool isGlobal);
436 void writeModuleConstants();
437 bool pushValueAndType(
const Value *V,
unsigned InstID,
438 SmallVectorImpl<unsigned> &Vals);
439 bool pushValueOrMetadata(
const Value *V,
unsigned InstID,
440 SmallVectorImpl<unsigned> &Vals);
441 void writeOperandBundles(
const CallBase &CB,
unsigned InstID);
442 void pushValue(
const Value *V,
unsigned InstID,
443 SmallVectorImpl<unsigned> &Vals);
444 void pushValueSigned(
const Value *V,
unsigned InstID,
445 SmallVectorImpl<uint64_t> &Vals);
446 void writeInstruction(
const Instruction &
I,
unsigned InstID,
447 SmallVectorImpl<unsigned> &Vals);
448 void writeFunctionLevelValueSymbolTable(
const ValueSymbolTable &VST);
449 void writeGlobalValueSymbolTable(
450 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
451 void writeUseList(UseListOrder &&Order);
452 void writeUseListBlock(
const Function *
F);
455 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
456 void writeBlockInfo();
457 void writeModuleHash(StringRef View);
460 return unsigned(SSID);
463 unsigned getEncodedAlign(MaybeAlign Alignment) {
return encode(Alignment); }
467class IndexBitcodeWriter :
public BitcodeWriterBase {
469 const ModuleSummaryIndex &
Index;
482 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
486 std::vector<uint64_t> StackIds;
491 DenseMap<unsigned, unsigned> StackIdIndicesToIndex;
494 unsigned GlobalValueId = 0;
498 DenseMap<StringRef, uint64_t> ModuleIdMap;
508 BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder,
509 const ModuleSummaryIndex &Index,
512 : BitcodeWriterBase(Stream, StrtabBuilder),
Index(
Index),
513 DecSummaries(DecSummaries),
514 ModuleToSummariesForIndex(ModuleToSummariesForIndex) {
518 auto RecordStackIdReference = [&](
unsigned StackIdIndex) {
523 StackIdIndicesToIndex.
insert({StackIdIndex, StackIds.size()});
525 StackIds.push_back(
Index.getStackIdAtIndex(StackIdIndex));
532 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
533 GUIDToValueIdMap[
I.first] = ++GlobalValueId;
545 for (
auto &CI :
FS->callsites()) {
556 if (CI.StackIdIndices.empty()) {
557 GUIDToValueIdMap[CI.Callee.getGUID()] = ++GlobalValueId;
560 for (
auto Idx : CI.StackIdIndices)
561 RecordStackIdReference(Idx);
564 for (
auto &AI :
FS->allocs())
565 for (
auto &MIB : AI.MIBs)
566 for (
auto Idx : MIB.StackIdIndices)
567 RecordStackIdReference(Idx);
573 using GVInfo = std::pair<GlobalValue::GUID, GlobalValueSummary *>;
578 template<
typename Functor>
579 void forEachSummary(Functor Callback) {
580 if (ModuleToSummariesForIndex) {
581 for (
auto &M : *ModuleToSummariesForIndex)
582 for (
auto &Summary :
M.second) {
588 Callback({AS->getAliaseeGUID(), &AS->getAliasee()},
true);
592 for (
const auto &Summaries :
Index.sortedGlobalValueSummariesRange())
593 for (
auto &Summary : Summaries.second.getSummaryList())
602 template <
typename Functor>
void forEachModule(Functor Callback) {
603 if (ModuleToSummariesForIndex) {
604 for (
const auto &M : *ModuleToSummariesForIndex) {
605 const auto &MPI =
Index.modulePaths().find(
M.first);
606 if (MPI ==
Index.modulePaths().end()) {
610 assert(ModuleToSummariesForIndex->size() == 1);
620 std::vector<StringRef> ModulePaths;
621 for (
auto &[ModPath,
_] :
Index.modulePaths())
622 ModulePaths.push_back(ModPath);
624 for (
auto &ModPath : ModulePaths)
633 void writeModStrings();
634 void writeCombinedGlobalValueSummary();
637 auto VMI = GUIDToValueIdMap.find(ValGUID);
638 if (VMI == GUIDToValueIdMap.end())
643 std::map<GlobalValue::GUID, unsigned> &valueIds() {
return GUIDToValueIdMap; }
678 case Instruction::Add:
680 case Instruction::Sub:
682 case Instruction::Mul:
685 case Instruction::FDiv:
688 case Instruction::FRem:
700 unsigned Encoding = 0;
701 switch (
I.getOperation()) {
774 if (
I.isElementwise())
809 case Attribute::Alignment:
811 case Attribute::AllocAlign:
813 case Attribute::AllocSize:
815 case Attribute::AlwaysInline:
817 case Attribute::Builtin:
819 case Attribute::ByVal:
821 case Attribute::Convergent:
823 case Attribute::InAlloca:
825 case Attribute::Cold:
827 case Attribute::DisableSanitizerInstrumentation:
829 case Attribute::FnRetThunkExtern:
831 case Attribute::Flatten:
835 case Attribute::ElementType:
837 case Attribute::HybridPatchable:
839 case Attribute::InlineHint:
841 case Attribute::InReg:
843 case Attribute::JumpTable:
845 case Attribute::MinSize:
847 case Attribute::AllocatedPointer:
849 case Attribute::AllocKind:
851 case Attribute::Memory:
853 case Attribute::NoFPClass:
855 case Attribute::Naked:
857 case Attribute::Nest:
859 case Attribute::NoAlias:
861 case Attribute::NoBuiltin:
863 case Attribute::NoCallback:
865 case Attribute::NoDivergenceSource:
867 case Attribute::NoDuplicate:
869 case Attribute::NoFree:
871 case Attribute::NoFreeObj:
873 case Attribute::NoImplicitFloat:
875 case Attribute::NoInline:
877 case Attribute::NoRecurse:
879 case Attribute::NoMerge:
881 case Attribute::NonLazyBind:
883 case Attribute::NonNull:
885 case Attribute::Dereferenceable:
887 case Attribute::DereferenceableOrNull:
889 case Attribute::NoRedZone:
891 case Attribute::NoReturn:
893 case Attribute::NoSync:
895 case Attribute::NoCfCheck:
897 case Attribute::NoProfile:
899 case Attribute::SkipProfile:
901 case Attribute::NoUnwind:
903 case Attribute::NoSanitizeBounds:
905 case Attribute::NoSanitizeCoverage:
907 case Attribute::NullPointerIsValid:
909 case Attribute::OptimizeForDebugging:
911 case Attribute::OptForFuzzing:
913 case Attribute::OptimizeForSize:
915 case Attribute::OptimizeNone:
917 case Attribute::ReadNone:
919 case Attribute::ReadOnly:
921 case Attribute::Returned:
923 case Attribute::ReturnsTwice:
925 case Attribute::SExt:
927 case Attribute::Speculatable:
929 case Attribute::StackAlignment:
931 case Attribute::StackProtect:
933 case Attribute::StackProtectReq:
935 case Attribute::StackProtectStrong:
937 case Attribute::SafeStack:
939 case Attribute::ShadowCallStack:
941 case Attribute::StrictFP:
943 case Attribute::StructRet:
945 case Attribute::SanitizeAddress:
947 case Attribute::SanitizeAllocToken:
949 case Attribute::SanitizeHWAddress:
951 case Attribute::SanitizeThread:
953 case Attribute::SanitizeType:
955 case Attribute::SanitizeMemory:
957 case Attribute::SanitizeNumericalStability:
959 case Attribute::SanitizeRealtime:
961 case Attribute::SanitizeRealtimeBlocking:
963 case Attribute::SpeculativeLoadHardening:
965 case Attribute::SwiftError:
967 case Attribute::SwiftSelf:
969 case Attribute::SwiftAsync:
971 case Attribute::UWTable:
973 case Attribute::VScaleRange:
975 case Attribute::WillReturn:
977 case Attribute::WriteOnly:
979 case Attribute::ZExt:
981 case Attribute::ImmArg:
983 case Attribute::SanitizeMemTag:
985 case Attribute::Preallocated:
987 case Attribute::NoUndef:
989 case Attribute::ByRef:
991 case Attribute::MustProgress:
993 case Attribute::PresplitCoroutine:
995 case Attribute::Writable:
997 case Attribute::CoroDestroyOnlyWhenComplete:
999 case Attribute::CoroElideSafe:
1001 case Attribute::DeadOnUnwind:
1003 case Attribute::Range:
1005 case Attribute::Initializes:
1007 case Attribute::NoExt:
1009 case Attribute::Captures:
1011 case Attribute::DeadOnReturn:
1013 case Attribute::NoCreateUndefOrPoison:
1015 case Attribute::DenormalFPEnv:
1017 case Attribute::NoOutline:
1019 case Attribute::NoIPA:
1034 if ((int64_t)V >= 0)
1045 unsigned NumWords =
A.getActiveWords();
1046 const uint64_t *RawData =
A.getRawData();
1047 for (
unsigned i = 0; i < NumWords; i++)
1067void ModuleBitcodeWriter::writeAttributeGroupTable() {
1068 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
1070 if (AttrGrps.empty())
return;
1074 SmallVector<uint64_t, 64>
Record;
1076 unsigned AttrListIndex = Pair.first;
1077 AttributeSet AS = Pair.second;
1079 Record.push_back(AttrListIndex);
1082 if (Attr.isEnumAttribute()) {
1085 }
else if (Attr.isIntAttribute()) {
1087 Attribute::AttrKind
Kind = Attr.getKindAsEnum();
1089 if (Kind == Attribute::Memory) {
1094 Record.push_back(Attr.getValueAsInt());
1096 }
else if (Attr.isStringAttribute()) {
1097 StringRef
Kind = Attr.getKindAsString();
1098 StringRef Val = Attr.getValueAsString();
1107 }
else if (Attr.isTypeAttribute()) {
1108 Type *Ty = Attr.getValueAsType();
1109 Record.push_back(Ty ? 6 : 5);
1113 }
else if (Attr.isConstantRangeAttribute()) {
1119 assert(Attr.isConstantRangeListAttribute());
1125 for (
auto &CR : Val)
1137void ModuleBitcodeWriter::writeAttributeTable() {
1139 if (
Attrs.empty())
return;
1143 SmallVector<uint64_t, 64>
Record;
1144 for (
const AttributeList &AL : Attrs) {
1145 for (
unsigned i :
AL.indexes()) {
1146 AttributeSet AS =
AL.getAttributes(i);
1159void ModuleBitcodeWriter::writeTypeTable() {
1163 SmallVector<uint64_t, 64> TypeVals;
1168 auto Abbv = std::make_shared<BitCodeAbbrev>();
1170 Abbv->Add(BitCodeAbbrevOp(0));
1171 unsigned OpaquePtrAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1174 Abbv = std::make_shared<BitCodeAbbrev>();
1179 unsigned FunctionAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1182 Abbv = std::make_shared<BitCodeAbbrev>();
1187 unsigned StructAnonAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1190 Abbv = std::make_shared<BitCodeAbbrev>();
1194 unsigned StructNameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1197 Abbv = std::make_shared<BitCodeAbbrev>();
1202 unsigned StructNamedAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1205 Abbv = std::make_shared<BitCodeAbbrev>();
1209 unsigned ArrayAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1217 for (
Type *
T : TypeList) {
1218 int AbbrevToUse = 0;
1221 switch (
T->getTypeID()) {
1231 case Type::MetadataTyID:
1236 case Type::ByteTyID:
1241 case Type::IntegerTyID:
1246 case Type::PointerTyID: {
1253 AbbrevToUse = OpaquePtrAbbrev;
1256 case Type::FunctionTyID: {
1262 for (
unsigned i = 0, e = FT->getNumParams(); i != e; ++i)
1264 AbbrevToUse = FunctionAbbrev;
1267 case Type::StructTyID: {
1272 for (
Type *ET :
ST->elements())
1275 if (
ST->isLiteral()) {
1277 AbbrevToUse = StructAnonAbbrev;
1279 if (
ST->isOpaque()) {
1283 AbbrevToUse = StructNamedAbbrev;
1287 if (!
ST->getName().empty())
1293 case Type::ArrayTyID: {
1297 TypeVals.
push_back(AT->getNumElements());
1299 AbbrevToUse = ArrayAbbrev;
1302 case Type::FixedVectorTyID:
1303 case Type::ScalableVectorTyID: {
1308 TypeVals.
push_back(VT->getElementCount().getKnownMinValue());
1314 case Type::TargetExtTyID: {
1320 for (
Type *InnerTy :
TET->type_params())
1325 case Type::TypedPointerTyID:
1330 Stream.
EmitRecord(Code, TypeVals, AbbrevToUse);
1371 RawFlags |= Flags.ReadNone;
1372 RawFlags |= (Flags.ReadOnly << 1);
1373 RawFlags |= (Flags.NoRecurse << 2);
1374 RawFlags |= (Flags.ReturnDoesNotAlias << 3);
1375 RawFlags |= (Flags.NoInline << 4);
1376 RawFlags |= (Flags.AlwaysInline << 5);
1377 RawFlags |= (Flags.NoUnwind << 6);
1378 RawFlags |= (Flags.MayThrow << 7);
1379 RawFlags |= (Flags.HasUnknownCall << 8);
1380 RawFlags |= (Flags.MustBeUnreachable << 9);
1387 bool ImportAsDecl =
false) {
1390 RawFlags |= Flags.NotEligibleToImport;
1391 RawFlags |= (Flags.Live << 1);
1392 RawFlags |= (Flags.DSOLocal << 2);
1393 RawFlags |= (Flags.CanAutoHide << 3);
1398 RawFlags = (RawFlags << 4) | Flags.Linkage;
1400 RawFlags |= (Flags.Visibility << 8);
1402 unsigned ImportType = Flags.ImportType | ImportAsDecl;
1403 RawFlags |= (ImportType << 10);
1405 RawFlags |= (Flags.NoRenameOnPromotion << 11);
1411 uint64_t RawFlags = Flags.MaybeReadOnly | (Flags.MaybeWriteOnly << 1) |
1412 (Flags.Constant << 2) | Flags.VCallVisibility << 3;
1455 switch (
C.getSelectionKind()) {
1479size_t ModuleBitcodeWriter::addToStrtab(StringRef Str) {
1482 return StrtabBuilder.
add(Str);
1485void ModuleBitcodeWriter::writeComdats() {
1500void ModuleBitcodeWriter::writeValueSymbolTableForwardDecl() {
1505 auto Abbv = std::make_shared<BitCodeAbbrev>();
1511 unsigned VSTOffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1527 bool isChar6 =
true;
1528 for (
char C : Str) {
1531 if ((
unsigned char)
C & 128)
1540static_assert(
sizeof(GlobalValue::SanitizerMetadata) <=
sizeof(unsigned),
1541 "Sanitizer Metadata is too large for naive serialization.");
1544 return Meta.NoAddress | (
Meta.NoHWAddress << 1) |
1545 (
Meta.Memtag << 2) | (
Meta.IsDynInit << 3);
1551void ModuleBitcodeWriter::writeModuleInfo() {
1553 if (!
M.getTargetTriple().empty())
1555 M.getTargetTriple().str(), 0 );
1556 const std::string &
DL =
M.getDataLayoutStr();
1560 for (
const Module::GlobalAsmFragment &Frag :
M.getModuleInlineAsm()) {
1562 Frag.Props.getAsStrings();
1575 std::map<std::string, unsigned> SectionMap;
1576 std::map<std::string, unsigned> GCMap;
1577 MaybeAlign MaxGVarAlignment;
1578 unsigned MaxGlobalType = 0;
1579 for (
const GlobalVariable &GV :
M.globals()) {
1580 if (MaybeAlign
A = GV.getAlign())
1581 MaxGVarAlignment = !MaxGVarAlignment ? *
A : std::max(*MaxGVarAlignment, *
A);
1582 MaxGlobalType = std::max(MaxGlobalType, VE.
getTypeID(GV.getValueType()));
1583 if (GV.hasSection()) {
1585 unsigned &
Entry = SectionMap[std::string(GV.getSection())];
1589 Entry = SectionMap.size();
1594 if (
F.hasSection()) {
1596 unsigned &
Entry = SectionMap[std::string(
F.getSection())];
1600 Entry = SectionMap.size();
1605 unsigned &
Entry = GCMap[
F.getGC()];
1609 Entry = GCMap.size();
1615 unsigned SimpleGVarAbbrev = 0;
1616 if (!
M.global_empty()) {
1618 auto Abbv = std::make_shared<BitCodeAbbrev>();
1629 if (!MaxGVarAlignment)
1630 Abbv->Add(BitCodeAbbrevOp(0));
1632 unsigned MaxEncAlignment = getEncodedAlign(MaxGVarAlignment);
1636 if (SectionMap.empty())
1637 Abbv->Add(BitCodeAbbrevOp(0));
1642 SimpleGVarAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1656 auto Abbv = std::make_shared<BitCodeAbbrev>();
1659 Abbv->Add(AbbrevOpToUse);
1660 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
1662 for (
const auto P :
M.getSourceFileName())
1673 for (
const GlobalVariable &GV :
M.globals()) {
1674 unsigned AbbrevToUse = 0;
1680 Vals.
push_back(addToStrtab(GV.getName()));
1683 Vals.
push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant());
1687 Vals.
push_back(getEncodedAlign(GV.getAlign()));
1688 Vals.
push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1690 if (GV.isThreadLocal() ||
1692 GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||
1693 GV.isExternallyInitialized() ||
1695 GV.hasComdat() || GV.hasAttributes() || GV.isDSOLocal() ||
1696 GV.hasPartition() || GV.hasSanitizerMetadata() || GV.getCodeModel()) {
1700 Vals.
push_back(GV.isExternallyInitialized());
1704 auto AL = GV.getAttributesAsList(AttributeList::FunctionIndex);
1708 Vals.
push_back(addToStrtab(GV.getPartition()));
1709 Vals.
push_back(GV.getPartition().size());
1712 GV.getSanitizerMetadata())
1716 AbbrevToUse = SimpleGVarAbbrev;
1737 Vals.
push_back(getEncodedAlign(
F.getAlign()));
1738 Vals.
push_back(
F.hasSection() ? SectionMap[std::string(
F.getSection())]
1750 F.hasPersonalityFn() ? (VE.
getValueID(
F.getPersonalityFn()) + 1) : 0);
1754 Vals.
push_back(addToStrtab(
F.getPartition()));
1756 Vals.
push_back(getEncodedAlign(
F.getPreferredAlignment()));
1758 unsigned AbbrevToUse = 0;
1764 for (
const GlobalAlias &
A :
M.aliases()) {
1771 Vals.
push_back(
A.getType()->getAddressSpace());
1779 Vals.
push_back(addToStrtab(
A.getPartition()));
1782 unsigned AbbrevToUse = 0;
1788 for (
const GlobalIFunc &
I :
M.ifuncs()) {
1794 Vals.
push_back(
I.getType()->getAddressSpace());
1799 Vals.
push_back(addToStrtab(
I.getPartition()));
1805 writeValueSymbolTableForwardDecl();
1812 if (OBO->hasNoSignedWrap())
1814 if (OBO->hasNoUnsignedWrap())
1820 if (PDI->isDisjoint())
1823 if (FPMO->hasAllowReassoc())
1825 if (FPMO->hasNoNaNs())
1827 if (FPMO->hasNoInfs())
1829 if (FPMO->hasNoSignedZeros())
1831 if (FPMO->hasAllowReciprocal())
1833 if (FPMO->hasAllowContract())
1835 if (FPMO->hasApproxFunc())
1841 if (NNI->hasNonNeg())
1845 if (NNI->hasNonNeg())
1848 if (TI->hasNoSignedWrap())
1850 if (TI->hasNoUnsignedWrap())
1853 if (
GEP->isInBounds())
1855 if (
GEP->hasNoUnsignedSignedWrap())
1857 if (
GEP->hasNoUnsignedWrap())
1860 if (ICmp->hasSameSign())
1867void ModuleBitcodeWriter::writeValueAsMetadata(
1868 const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
1877void ModuleBitcodeWriter::writeMDTuple(
const MDTuple *
N,
1878 SmallVectorImpl<uint64_t> &Record,
1880 for (
const MDOperand &MDO :
N->operands()) {
1883 "Unexpected function-local metadata");
1892unsigned ModuleBitcodeWriter::createDILocationAbbrev() {
1895 auto Abbv = std::make_shared<BitCodeAbbrev>();
1908void ModuleBitcodeWriter::writeDILocation(
const DILocation *
N,
1909 SmallVectorImpl<uint64_t> &Record,
1912 Abbrev = createDILocationAbbrev();
1914 Record.push_back(
N->isDistinct());
1915 Record.push_back(
N->getLine());
1916 Record.push_back(
N->getColumn());
1919 Record.push_back(
N->isImplicitCode());
1920 Record.push_back(
N->getAtomGroup());
1921 Record.push_back(
N->getAtomRank());
1926unsigned ModuleBitcodeWriter::createGenericDINodeAbbrev() {
1929 auto Abbv = std::make_shared<BitCodeAbbrev>();
1940void ModuleBitcodeWriter::writeGenericDINode(
const GenericDINode *
N,
1941 SmallVectorImpl<uint64_t> &Record,
1944 Abbrev = createGenericDINodeAbbrev();
1946 Record.push_back(
N->isDistinct());
1947 Record.push_back(
N->getTag());
1950 for (
auto &
I :
N->operands())
1957void ModuleBitcodeWriter::writeDISubrange(
const DISubrange *
N,
1958 SmallVectorImpl<uint64_t> &Record,
1971void ModuleBitcodeWriter::writeDIGenericSubrange(
1972 const DIGenericSubrange *
N, SmallVectorImpl<uint64_t> &Record,
1984void ModuleBitcodeWriter::writeDIEnumerator(
const DIEnumerator *
N,
1985 SmallVectorImpl<uint64_t> &Record,
1988 Record.push_back(IsBigInt | (
N->isUnsigned() << 1) |
N->isDistinct());
1989 Record.push_back(
N->getValue().getBitWidth());
1997void ModuleBitcodeWriter::writeDIBasicType(
const DIBasicType *
N,
1998 SmallVectorImpl<uint64_t> &Record,
2000 const unsigned SizeIsMetadata = 0x2;
2001 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2002 Record.push_back(
N->getTag());
2005 Record.push_back(
N->getAlignInBits());
2006 Record.push_back(
N->getEncoding());
2007 Record.push_back(
N->getFlags());
2008 Record.push_back(
N->getNumExtraInhabitants());
2009 Record.push_back(
N->getDataSizeInBits());
2011 Record.push_back(
N->getLine());
2018void ModuleBitcodeWriter::writeDIFixedPointType(
2019 const DIFixedPointType *
N, SmallVectorImpl<uint64_t> &Record,
2021 const unsigned SizeIsMetadata = 0x2;
2022 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2023 Record.push_back(
N->getTag());
2026 Record.push_back(
N->getAlignInBits());
2027 Record.push_back(
N->getEncoding());
2028 Record.push_back(
N->getFlags());
2029 Record.push_back(
N->getKind());
2030 Record.push_back(
N->getFactorRaw());
2032 auto WriteWideInt = [&](
const APInt &
Value) {
2037 Record.push_back(Encoded);
2041 WriteWideInt(
N->getNumeratorRaw());
2042 WriteWideInt(
N->getDenominatorRaw());
2045 Record.push_back(
N->getLine());
2052void ModuleBitcodeWriter::writeDIStringType(
const DIStringType *
N,
2053 SmallVectorImpl<uint64_t> &Record,
2055 const unsigned SizeIsMetadata = 0x2;
2056 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2057 Record.push_back(
N->getTag());
2063 Record.push_back(
N->getAlignInBits());
2064 Record.push_back(
N->getEncoding());
2070void ModuleBitcodeWriter::writeDIDerivedType(
const DIDerivedType *
N,
2071 SmallVectorImpl<uint64_t> &Record,
2073 const unsigned SizeIsMetadata = 0x2;
2074 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2075 Record.push_back(
N->getTag());
2078 Record.push_back(
N->getLine());
2082 Record.push_back(
N->getAlignInBits());
2084 Record.push_back(
N->getFlags());
2089 if (
const auto &DWARFAddressSpace =
N->getDWARFAddressSpace())
2090 Record.push_back(*DWARFAddressSpace + 1);
2096 if (
auto PtrAuthData =
N->getPtrAuthData())
2097 Record.push_back(PtrAuthData->RawData);
2105void ModuleBitcodeWriter::writeDISubrangeType(
const DISubrangeType *
N,
2106 SmallVectorImpl<uint64_t> &Record,
2108 const unsigned SizeIsMetadata = 0x2;
2109 Record.push_back(SizeIsMetadata | (
unsigned)
N->isDistinct());
2112 Record.push_back(
N->getLine());
2115 Record.push_back(
N->getAlignInBits());
2116 Record.push_back(
N->getFlags());
2127void ModuleBitcodeWriter::writeDICompositeType(
2128 const DICompositeType *
N, SmallVectorImpl<uint64_t> &Record,
2130 const unsigned IsNotUsedInOldTypeRef = 0x2;
2131 const unsigned SizeIsMetadata = 0x4;
2132 Record.push_back(SizeIsMetadata | IsNotUsedInOldTypeRef |
2133 (
unsigned)
N->isDistinct());
2134 Record.push_back(
N->getTag());
2137 Record.push_back(
N->getLine());
2141 Record.push_back(
N->getAlignInBits());
2143 Record.push_back(
N->getFlags());
2145 Record.push_back(
N->getRuntimeLang());
2155 Record.push_back(
N->getNumExtraInhabitants());
2165void ModuleBitcodeWriter::writeDISubroutineType(
2166 const DISubroutineType *
N, SmallVectorImpl<uint64_t> &Record,
2168 const unsigned HasNoOldTypeRefs = 0x2;
2169 Record.push_back(HasNoOldTypeRefs | (
unsigned)
N->isDistinct());
2170 Record.push_back(
N->getFlags());
2178void ModuleBitcodeWriter::writeDIFile(
const DIFile *
N,
2179 SmallVectorImpl<uint64_t> &Record,
2181 Record.push_back(
N->isDistinct());
2184 if (
N->getRawChecksum()) {
2185 Record.push_back(
N->getRawChecksum()->Kind);
2193 auto Source =
N->getRawSource();
2201void ModuleBitcodeWriter::writeDICompileUnit(
const DICompileUnit *
N,
2202 SmallVectorImpl<uint64_t> &Record,
2204 assert(
N->isDistinct() &&
"Expected distinct compile units");
2207 auto Lang =
N->getSourceLanguage();
2208 Record.push_back(Lang.getName());
2211 if (Lang.hasVersionedName())
2216 Record.push_back(
N->isOptimized());
2218 Record.push_back(
N->getRuntimeVersion());
2220 Record.push_back(
N->getEmissionKind());
2226 Record.push_back(
N->getDWOId());
2228 Record.push_back(
N->getSplitDebugInlining());
2229 Record.push_back(
N->getDebugInfoForProfiling());
2230 Record.push_back((
unsigned)
N->getNameTableKind());
2231 Record.push_back(
N->getRangesBaseAddress());
2234 Record.push_back(Lang.hasVersionedName() ? Lang.getVersion() : 0);
2235 Record.push_back(Lang.getDialect());
2241void ModuleBitcodeWriter::writeDISubprogram(
const DISubprogram *
N,
2242 SmallVectorImpl<uint64_t> &Record,
2244 const uint64_t HasUnitFlag = 1 << 1;
2245 const uint64_t HasSPFlagsFlag = 1 << 2;
2246 Record.push_back(
uint64_t(
N->isDistinct()) | HasUnitFlag | HasSPFlagsFlag);
2251 Record.push_back(
N->getLine());
2253 Record.push_back(
N->getScopeLine());
2255 Record.push_back(
N->getSPFlags());
2256 Record.push_back(
N->getVirtualIndex());
2257 Record.push_back(
N->getFlags());
2262 Record.push_back(
N->getThisAdjustment());
2266 Record.push_back(
N->getKeyInstructionsEnabled());
2272void ModuleBitcodeWriter::writeDILexicalBlock(
const DILexicalBlock *
N,
2273 SmallVectorImpl<uint64_t> &Record,
2275 Record.push_back(
N->isDistinct());
2278 Record.push_back(
N->getLine());
2279 Record.push_back(
N->getColumn());
2285void ModuleBitcodeWriter::writeDILexicalBlockFile(
2286 const DILexicalBlockFile *
N, SmallVectorImpl<uint64_t> &Record,
2288 Record.push_back(
N->isDistinct());
2291 Record.push_back(
N->getDiscriminator());
2297void ModuleBitcodeWriter::writeDICommonBlock(
const DICommonBlock *
N,
2298 SmallVectorImpl<uint64_t> &Record,
2300 Record.push_back(
N->isDistinct());
2305 Record.push_back(
N->getLineNo());
2311void ModuleBitcodeWriter::writeDINamespace(
const DINamespace *
N,
2312 SmallVectorImpl<uint64_t> &Record,
2314 Record.push_back(
N->isDistinct() |
N->getExportSymbols() << 1);
2322void ModuleBitcodeWriter::writeDIMacro(
const DIMacro *
N,
2323 SmallVectorImpl<uint64_t> &Record,
2325 Record.push_back(
N->isDistinct());
2326 Record.push_back(
N->getMacinfoType());
2327 Record.push_back(
N->getLine());
2335void ModuleBitcodeWriter::writeDIMacroFile(
const DIMacroFile *
N,
2336 SmallVectorImpl<uint64_t> &Record,
2338 Record.push_back(
N->isDistinct());
2339 Record.push_back(
N->getMacinfoType());
2340 Record.push_back(
N->getLine());
2348void ModuleBitcodeWriter::writeDIArgList(
const DIArgList *
N,
2349 SmallVectorImpl<uint64_t> &Record) {
2350 Record.reserve(
N->getArgs().size());
2351 for (ValueAsMetadata *MD :
N->getArgs())
2358void ModuleBitcodeWriter::writeDIModule(
const DIModule *
N,
2359 SmallVectorImpl<uint64_t> &Record,
2361 Record.push_back(
N->isDistinct());
2362 for (
auto &
I :
N->operands())
2364 Record.push_back(
N->getLineNo());
2365 Record.push_back(
N->getIsDecl());
2371void ModuleBitcodeWriter::writeDIAssignID(
const DIAssignID *
N,
2372 SmallVectorImpl<uint64_t> &Record,
2375 Record.push_back(
N->isDistinct());
2380void ModuleBitcodeWriter::writeDITemplateTypeParameter(
2381 const DITemplateTypeParameter *
N, SmallVectorImpl<uint64_t> &Record,
2383 Record.push_back(
N->isDistinct());
2386 Record.push_back(
N->isDefault());
2392void ModuleBitcodeWriter::writeDITemplateValueParameter(
2393 const DITemplateValueParameter *
N, SmallVectorImpl<uint64_t> &Record,
2395 Record.push_back(
N->isDistinct());
2396 Record.push_back(
N->getTag());
2399 Record.push_back(
N->isDefault());
2406void ModuleBitcodeWriter::writeDIGlobalVariable(
2407 const DIGlobalVariable *
N, SmallVectorImpl<uint64_t> &Record,
2415 Record.push_back(
N->getLine());
2417 Record.push_back(
N->isLocalToUnit());
2418 Record.push_back(
N->isDefinition());
2421 Record.push_back(
N->getAlignInBits());
2428void ModuleBitcodeWriter::writeDILocalVariable(
2429 const DILocalVariable *
N, SmallVectorImpl<uint64_t> &Record,
2444 const uint64_t HasAlignmentFlag = 1 << 1;
2449 Record.push_back(
N->getLine());
2451 Record.push_back(
N->getArg());
2452 Record.push_back(
N->getFlags());
2453 Record.push_back(
N->getAlignInBits());
2460void ModuleBitcodeWriter::writeDILabel(
2461 const DILabel *
N, SmallVectorImpl<uint64_t> &Record,
2468 Record.push_back(
N->getLine());
2469 Record.push_back(
N->getColumn());
2470 Record.push_back(
N->getCoroSuspendIdx().has_value()
2471 ? (
uint64_t)
N->getCoroSuspendIdx().value()
2472 : std::numeric_limits<uint64_t>::max());
2478void ModuleBitcodeWriter::writeDIExpression(
const DIExpression *
N,
2479 SmallVectorImpl<uint64_t> &Record,
2481 Record.reserve(
N->getElements().size() + 1);
2484 Record.append(
N->elements_begin(),
N->elements_end());
2490void ModuleBitcodeWriter::writeDIGlobalVariableExpression(
2491 const DIGlobalVariableExpression *
N, SmallVectorImpl<uint64_t> &Record,
2493 Record.push_back(
N->isDistinct());
2501void ModuleBitcodeWriter::writeDIObjCProperty(
const DIObjCProperty *
N,
2502 SmallVectorImpl<uint64_t> &Record,
2504 Record.push_back(
N->isDistinct());
2507 Record.push_back(
N->getLine());
2510 Record.push_back(
N->getAttributes());
2517void ModuleBitcodeWriter::writeDIProperty(
const DIProperty *
N,
2518 SmallVectorImpl<uint64_t> &Record,
2520 Record.push_back(
N->isDistinct());
2523 Record.push_back(
N->getLine());
2531void ModuleBitcodeWriter::writeDIImportedEntity(
2532 const DIImportedEntity *
N, SmallVectorImpl<uint64_t> &Record,
2534 Record.push_back(
N->isDistinct());
2535 Record.push_back(
N->getTag());
2538 Record.push_back(
N->getLine());
2547unsigned ModuleBitcodeWriter::createNamedMetadataAbbrev() {
2548 auto Abbv = std::make_shared<BitCodeAbbrev>();
2555void ModuleBitcodeWriter::writeNamedMetadata(
2556 SmallVectorImpl<uint64_t> &Record) {
2557 if (
M.named_metadata_empty())
2560 unsigned Abbrev = createNamedMetadataAbbrev();
2561 for (
const NamedMDNode &NMD :
M.named_metadata()) {
2563 StringRef Str = NMD.getName();
2564 Record.append(Str.bytes_begin(), Str.bytes_end());
2569 for (
const MDNode *
N : NMD.operands())
2576unsigned ModuleBitcodeWriter::createMetadataStringsAbbrev() {
2577 auto Abbv = std::make_shared<BitCodeAbbrev>();
2589void ModuleBitcodeWriter::writeMetadataStrings(
2591 if (Strings.
empty())
2599 SmallString<256> Blob;
2601 BitstreamWriter
W(Blob);
2621#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,
2622#include "llvm/IR/Metadata.def"
2626void ModuleBitcodeWriter::writeMetadataRecords(
2628 std::vector<unsigned> *MDAbbrevs, std::vector<uint64_t> *IndexPos) {
2633#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
2634#include "llvm/IR/Metadata.def"
2640 assert(
N->isResolved() &&
"Expected forward references to be resolved");
2642 switch (
N->getMetadataID()) {
2645#define HANDLE_MDNODE_LEAF(CLASS) \
2646 case Metadata::CLASS##Kind: \
2648 write##CLASS(cast<CLASS>(N), Record, \
2649 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
2651 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
2653#include "llvm/IR/Metadata.def"
2664void ModuleBitcodeWriter::writeModuleMetadata() {
2665 if (!VE.
hasMDs() &&
M.named_metadata_empty())
2669 SmallVector<uint64_t, 64>
Record;
2673 std::vector<unsigned> MDAbbrevs;
2676 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
2677 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
2678 createGenericDINodeAbbrev();
2680 auto Abbv = std::make_shared<BitCodeAbbrev>();
2684 unsigned OffsetAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2686 Abbv = std::make_shared<BitCodeAbbrev>();
2690 unsigned IndexAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2712 std::vector<uint64_t> IndexPos;
2716 writeMetadataRecords(VE.
getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);
2727 uint64_t PreviousValue = IndexOffsetRecordBitPos;
2728 for (
auto &Elt : IndexPos) {
2729 auto EltDelta = Elt - PreviousValue;
2730 PreviousValue = Elt;
2739 writeNamedMetadata(Record);
2741 auto AddDeclAttachedMetadata = [&](
const GlobalObject &GO) {
2742 SmallVector<uint64_t, 4>
Record;
2744 pushGlobalMetadataAttachment(Record, GO);
2748 if (
F.isDeclaration() &&
F.hasMetadata())
2749 AddDeclAttachedMetadata(
F);
2750 for (
const GlobalIFunc &GI :
M.ifuncs())
2751 if (GI.hasMetadata())
2752 AddDeclAttachedMetadata(GI);
2755 for (
const GlobalVariable &GV :
M.globals())
2756 if (GV.hasMetadata())
2757 AddDeclAttachedMetadata(GV);
2762void ModuleBitcodeWriter::writeFunctionMetadata(
const Function &
F) {
2767 SmallVector<uint64_t, 64>
Record;
2773void ModuleBitcodeWriter::pushGlobalMetadataAttachment(
2774 SmallVectorImpl<uint64_t> &Record,
const GlobalObject &GO) {
2778 for (
const auto &
I : MDs) {
2784void ModuleBitcodeWriter::writeFunctionMetadataAttachment(
const Function &
F) {
2787 SmallVector<uint64_t, 64>
Record;
2789 if (
F.hasMetadata()) {
2790 pushGlobalMetadataAttachment(Record,
F);
2798 for (
const BasicBlock &BB :
F)
2799 for (
const Instruction &
I : BB) {
2801 I.getAllMetadataOtherThanDebugLoc(MDs);
2804 if (MDs.
empty())
continue;
2808 for (
const auto &[ID, MD] : MDs) {
2819void ModuleBitcodeWriter::writeModuleMetadataKinds() {
2820 SmallVector<uint64_t, 64>
Record;
2825 M.getMDKindNames(Names);
2827 if (Names.
empty())
return;
2831 for (
unsigned MDKindID = 0, e = Names.
size(); MDKindID != e; ++MDKindID) {
2832 Record.push_back(MDKindID);
2833 StringRef KName = Names[MDKindID];
2843void ModuleBitcodeWriter::writeOperandBundleTags() {
2851 M.getOperandBundleTags(Tags);
2858 SmallVector<uint64_t, 64>
Record;
2860 for (
auto Tag : Tags) {
2870void ModuleBitcodeWriter::writeSyncScopeNames() {
2872 M.getContext().getSyncScopeNames(SSNs);
2878 SmallVector<uint64_t, 64>
Record;
2879 for (
auto SSN : SSNs) {
2880 Record.append(SSN.begin(), SSN.end());
2888void ModuleBitcodeWriter::writeConstants(
unsigned FirstVal,
unsigned LastVal,
2890 if (FirstVal == LastVal)
return;
2894 unsigned AggregateAbbrev = 0;
2895 unsigned String8Abbrev = 0;
2896 unsigned CString7Abbrev = 0;
2897 unsigned CString6Abbrev = 0;
2901 auto Abbv = std::make_shared<BitCodeAbbrev>();
2905 AggregateAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
2908 Abbv = std::make_shared<BitCodeAbbrev>();
2912 String8Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2914 Abbv = std::make_shared<BitCodeAbbrev>();
2918 CString7Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2920 Abbv = std::make_shared<BitCodeAbbrev>();
2924 CString6Abbrev = Stream.
EmitAbbrev(std::move(Abbv));
2927 SmallVector<uint64_t, 64>
Record;
2930 Type *LastTy =
nullptr;
2931 for (
unsigned i = FirstVal; i != LastVal; ++i) {
2932 const Value *
V = Vals[i].first;
2934 if (
V->getType() != LastTy) {
2935 LastTy =
V->getType();
2938 CONSTANTS_SETTYPE_ABBREV);
2945 unsigned(
IA->hasSideEffects()) |
unsigned(
IA->isAlignStack()) << 1 |
2946 unsigned(
IA->getDialect() & 1) << 2 |
unsigned(
IA->canThrow()) << 3);
2949 StringRef AsmStr =
IA->getAsmString();
2954 StringRef ConstraintStr =
IA->getConstraintString();
2962 unsigned Code = -1U;
2963 unsigned AbbrevToUse = 0;
2964 if (
C->isNullValue()) {
2971 if (
IV->getBitWidth() <= 64) {
2975 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2981 if (BV->getBitWidth() <= 64) {
2985 AbbrevToUse = CONSTANTS_BYTE_ABBREV;
2995 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2999 APInt api = CFP->getValueAPF().bitcastToAPInt();
3001 Record.push_back((p[1] << 48) | (p[0] >> 16));
3002 Record.push_back(p[0] & 0xffffLL);
3004 APInt api = CFP->getValueAPF().bitcastToAPInt();
3009 assert(0 &&
"Unknown FP type!");
3015 uint64_t NumElts = Str->getNumElements();
3017 if (Str->isCString()) {
3022 AbbrevToUse = String8Abbrev;
3026 for (
uint64_t i = 0; i != NumElts; ++i) {
3027 unsigned char V = Str->getElementAsInteger(i);
3029 isCStr7 &= (
V & 128) == 0;
3035 AbbrevToUse = CString6Abbrev;
3037 AbbrevToUse = CString7Abbrev;
3038 }
else if (
const ConstantDataSequential *CDS =
3041 Type *EltTy = CDS->getElementType();
3043 for (
uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
3044 Record.push_back(CDS->getElementAsInteger(i));
3046 for (
uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
3048 CDS->getElementAsAPFloat(i).bitcastToAPInt().getLimitedValue());
3052 for (
const Value *
Op :
C->operands())
3054 AbbrevToUse = AggregateAbbrev;
3056 switch (
CE->getOpcode()) {
3063 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
3065 assert(
CE->getNumOperands() == 2 &&
"Unknown constant expr!");
3075 case Instruction::FNeg: {
3076 assert(
CE->getNumOperands() == 1 &&
"Unknown constant expr!");
3085 case Instruction::GetElementPtr: {
3090 if (std::optional<ConstantRange>
Range = GO->getInRange()) {
3094 for (
const Value *
Op :
CE->operands()) {
3100 case Instruction::ExtractElement:
3107 case Instruction::InsertElement:
3114 case Instruction::ShuffleVector:
3119 if (
C->getType() ==
C->getOperand(0)->getType()) {
3156 Stream.
EmitRecord(Code, Record, AbbrevToUse);
3163void ModuleBitcodeWriter::writeModuleConstants() {
3168 for (
unsigned i = 0, e = Vals.size(); i != e; ++i) {
3170 writeConstants(i, Vals.size(),
true);
3184bool ModuleBitcodeWriter::pushValueAndType(
const Value *V,
unsigned InstID,
3185 SmallVectorImpl<unsigned> &Vals) {
3189 if (ValID >= InstID) {
3196bool ModuleBitcodeWriter::pushValueOrMetadata(
const Value *V,
unsigned InstID,
3197 SmallVectorImpl<unsigned> &Vals) {
3198 bool IsMetadata =
V->getType()->isMetadataTy();
3206 return pushValueAndType(V, InstID, Vals);
3209void ModuleBitcodeWriter::writeOperandBundles(
const CallBase &CS,
3216 Record.push_back(
C.getOperandBundleTagID(Bundle.getTagName()));
3218 for (
auto &Input : Bundle.Inputs)
3219 pushValueOrMetadata(Input, InstID, Record);
3228void ModuleBitcodeWriter::pushValue(
const Value *V,
unsigned InstID,
3229 SmallVectorImpl<unsigned> &Vals) {
3234void ModuleBitcodeWriter::pushValueSigned(
const Value *V,
unsigned InstID,
3235 SmallVectorImpl<uint64_t> &Vals) {
3237 int64_t diff = ((int32_t)InstID - (int32_t)ValID);
3242void ModuleBitcodeWriter::writeInstruction(
const Instruction &
I,
3244 SmallVectorImpl<unsigned> &Vals) {
3246 unsigned AbbrevToUse = 0;
3248 switch (
I.getOpcode()) {
3252 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3253 AbbrevToUse = FUNCTION_INST_CAST_ABBREV;
3258 if (AbbrevToUse == FUNCTION_INST_CAST_ABBREV)
3259 AbbrevToUse = FUNCTION_INST_CAST_FLAGS_ABBREV;
3265 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3266 AbbrevToUse = FUNCTION_INST_BINOP_ABBREV;
3267 pushValue(
I.getOperand(1), InstID, Vals);
3271 if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV)
3272 AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV;
3277 case Instruction::FNeg: {
3279 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3280 AbbrevToUse = FUNCTION_INST_UNOP_ABBREV;
3284 if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV)
3285 AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV;
3290 case Instruction::GetElementPtr: {
3292 AbbrevToUse = FUNCTION_INST_GEP_ABBREV;
3296 for (
const Value *
Op :
I.operands())
3297 pushValueAndType(
Op, InstID, Vals);
3300 case Instruction::ExtractValue: {
3302 pushValueAndType(
I.getOperand(0), InstID, Vals);
3307 case Instruction::InsertValue: {
3309 pushValueAndType(
I.getOperand(0), InstID, Vals);
3310 pushValueAndType(
I.getOperand(1), InstID, Vals);
3315 case Instruction::Select: {
3317 pushValueAndType(
I.getOperand(1), InstID, Vals);
3318 pushValue(
I.getOperand(2), InstID, Vals);
3319 pushValueAndType(
I.getOperand(0), InstID, Vals);
3325 case Instruction::ExtractElement:
3327 pushValueAndType(
I.getOperand(0), InstID, Vals);
3328 pushValueAndType(
I.getOperand(1), InstID, Vals);
3330 case Instruction::InsertElement:
3332 pushValueAndType(
I.getOperand(0), InstID, Vals);
3333 pushValue(
I.getOperand(1), InstID, Vals);
3334 pushValueAndType(
I.getOperand(2), InstID, Vals);
3336 case Instruction::ShuffleVector:
3338 pushValueAndType(
I.getOperand(0), InstID, Vals);
3339 pushValue(
I.getOperand(1), InstID, Vals);
3343 case Instruction::ICmp:
3344 case Instruction::FCmp: {
3347 AbbrevToUse = FUNCTION_INST_CMP_ABBREV;
3348 if (pushValueAndType(
I.getOperand(0), InstID, Vals))
3350 pushValue(
I.getOperand(1), InstID, Vals);
3356 AbbrevToUse = FUNCTION_INST_CMP_FLAGS_ABBREV;
3361 case Instruction::Ret:
3364 unsigned NumOperands =
I.getNumOperands();
3365 if (NumOperands == 0)
3366 AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV;
3367 else if (NumOperands == 1) {
3368 if (!pushValueAndType(
I.getOperand(0), InstID, Vals))
3369 AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV;
3371 for (
const Value *
Op :
I.operands())
3372 pushValueAndType(
Op, InstID, Vals);
3376 case Instruction::UncondBr: {
3378 AbbrevToUse = FUNCTION_INST_BR_UNCOND_ABBREV;
3382 case Instruction::CondBr: {
3384 AbbrevToUse = FUNCTION_INST_BR_COND_ABBREV;
3388 pushValue(
II.getCondition(), InstID, Vals);
3390 case Instruction::Switch:
3395 pushValue(
SI.getCondition(), InstID, Vals);
3397 for (
auto Case :
SI.cases()) {
3403 case Instruction::IndirectBr:
3407 pushValue(
I.getOperand(0), InstID, Vals);
3412 case Instruction::Invoke: {
3415 FunctionType *FTy =
II->getFunctionType();
3417 if (
II->hasOperandBundles())
3418 writeOperandBundles(*
II, InstID);
3427 pushValueAndType(Callee, InstID, Vals);
3430 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3431 pushValue(
I.getOperand(i), InstID, Vals);
3434 if (FTy->isVarArg()) {
3435 for (
unsigned i = FTy->getNumParams(), e =
II->arg_size(); i != e; ++i)
3436 pushValueAndType(
I.getOperand(i), InstID, Vals);
3440 case Instruction::Resume:
3442 pushValueAndType(
I.getOperand(0), InstID, Vals);
3444 case Instruction::CleanupRet: {
3447 pushValue(CRI.getCleanupPad(), InstID, Vals);
3448 if (CRI.hasUnwindDest())
3452 case Instruction::CatchRet: {
3455 pushValue(CRI.getCatchPad(), InstID, Vals);
3459 case Instruction::CleanupPad:
3460 case Instruction::CatchPad: {
3464 pushValue(FuncletPad.getParentPad(), InstID, Vals);
3466 unsigned NumArgOperands = FuncletPad.arg_size();
3468 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op)
3469 pushValueAndType(FuncletPad.getArgOperand(
Op), InstID, Vals);
3472 case Instruction::CatchSwitch: {
3476 pushValue(CatchSwitch.getParentPad(), InstID, Vals);
3478 unsigned NumHandlers = CatchSwitch.getNumHandlers();
3480 for (
const BasicBlock *CatchPadBB : CatchSwitch.handlers())
3483 if (CatchSwitch.hasUnwindDest())
3487 case Instruction::CallBr: {
3493 writeOperandBundles(*CBI, InstID);
3508 pushValueAndType(Callee, InstID, Vals);
3511 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3512 pushValue(
I.getOperand(i), InstID, Vals);
3515 if (FTy->isVarArg()) {
3516 for (
unsigned i = FTy->getNumParams(), e = CBI->
arg_size(); i != e; ++i)
3517 pushValueAndType(
I.getOperand(i), InstID, Vals);
3521 case Instruction::Unreachable:
3523 AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;
3526 case Instruction::PHI: {
3544 Stream.
EmitRecord(Code, Vals64, AbbrevToUse);
3549 case Instruction::LandingPad: {
3560 pushValueAndType(LP.
getClause(
I), InstID, Vals);
3565 case Instruction::Alloca: {
3571 using APV = AllocaPackedValues;
3573 unsigned EncodedAlign = getEncodedAlign(AI.
getAlign());
3575 Record, EncodedAlign & ((1 << APV::AlignLower::Bits) - 1));
3577 EncodedAlign >> APV::AlignLower::Bits);
3584 if (AS !=
M.getDataLayout().getAllocaAddrSpace())
3589 case Instruction::Load: {
3591 if (LI.isAtomic()) {
3593 pushValueAndType(LI.getOperand(0), InstID, Vals);
3596 if (!pushValueAndType(LI.getOperand(0), InstID, Vals))
3597 AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;
3600 Vals.
push_back(getEncodedAlign(LI.getAlign()));
3602 if (LI.isAtomic()) {
3604 Vals.
push_back(getEncodedSyncScopeID(LI.getSyncScopeID()));
3605 if (LI.isElementwise())
3611 case Instruction::Store: {
3613 if (
SI.isAtomic()) {
3617 AbbrevToUse = FUNCTION_INST_STORE_ABBREV;
3619 if (pushValueAndType(
I.getOperand(1), InstID, Vals))
3621 if (pushValueAndType(
I.getOperand(0), InstID, Vals))
3625 if (
SI.isAtomic()) {
3627 Vals.
push_back(getEncodedSyncScopeID(
SI.getSyncScopeID()));
3628 if (
SI.isElementwise())
3634 case Instruction::AtomicCmpXchg:
3636 pushValueAndType(
I.getOperand(0), InstID, Vals);
3637 pushValueAndType(
I.getOperand(1), InstID, Vals);
3638 pushValue(
I.getOperand(2), InstID, Vals);
3649 case Instruction::AtomicRMW:
3651 pushValueAndType(
I.getOperand(0), InstID, Vals);
3652 pushValueAndType(
I.getOperand(1), InstID, Vals);
3660 case Instruction::Fence:
3665 case Instruction::Call: {
3670 writeOperandBundles(CI, InstID);
3690 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3694 if (FTy->isVarArg()) {
3695 for (
unsigned i = FTy->getNumParams(), e = CI.
arg_size(); i != e; ++i)
3700 case Instruction::VAArg:
3703 pushValue(
I.getOperand(0), InstID, Vals);
3706 case Instruction::Freeze:
3708 pushValueAndType(
I.getOperand(0), InstID, Vals);
3718void ModuleBitcodeWriter::writeGlobalValueSymbolTable(
3719 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3724 VSTOffset -= bitcodeStartBit();
3725 assert((VSTOffset & 31) == 0 &&
"VST block not 32-bit aligned");
3729 Stream.
BackpatchWord(VSTOffsetPlaceholder, VSTOffset / 32 + 1);
3733 auto Abbv = std::make_shared<BitCodeAbbrev>();
3737 unsigned FnEntryAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
3742 if (
F.isDeclaration())
3749 uint64_t BitcodeIndex = FunctionToBitcodeIndex[&
F] - bitcodeStartBit();
3750 assert((BitcodeIndex & 31) == 0 &&
"function block not 32-bit aligned");
3754 Record[1] = BitcodeIndex / 32 + 1;
3763void ModuleBitcodeWriter::writeFunctionLevelValueSymbolTable(
3764 const ValueSymbolTable &VST) {
3772 SmallVector<uint64_t, 64> NameVals;
3778 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
3787 AbbrevToUse = VST_BBENTRY_6_ABBREV;
3791 AbbrevToUse = VST_ENTRY_6_ABBREV;
3793 AbbrevToUse = VST_ENTRY_7_ABBREV;
3796 for (
const auto P :
Name.getKey())
3800 Stream.
EmitRecord(Code, NameVals, AbbrevToUse);
3807void ModuleBitcodeWriter::writeUseList(UseListOrder &&Order) {
3808 assert(Order.Shuffle.size() >= 2 &&
"Shuffle too small");
3815 SmallVector<uint64_t, 64>
Record(Order.Shuffle.begin(), Order.Shuffle.end());
3820void ModuleBitcodeWriter::writeUseListBlock(
const Function *
F) {
3822 "Expected to be preserving use-list order");
3824 auto hasMore = [&]() {
3840void ModuleBitcodeWriter::writeFunction(
3842 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3859 unsigned CstStart, CstEnd;
3861 writeConstants(CstStart, CstEnd,
false);
3864 writeFunctionMetadata(
F);
3867 unsigned InstID = CstEnd;
3869 bool NeedsMetadataAttachment =
F.hasMetadata();
3871 DILocation *LastDL =
nullptr;
3872 SmallSetVector<Function *, 4> BlockAddressUsers;
3875 for (
const BasicBlock &BB :
F) {
3876 for (
const Instruction &
I : BB) {
3877 writeInstruction(
I, InstID, Vals);
3879 if (!
I.getType()->isVoidTy())
3883 NeedsMetadataAttachment |=
I.hasMetadataOtherThanDebugLoc();
3886 if (DILocation *
DL =
I.getDebugLoc()) {
3899 FUNCTION_DEBUG_LOC_ABBREV);
3909 if (
I.hasDbgRecords()) {
3913 auto PushValueOrMetadata = [&Vals, InstID,
3916 "RawLocation unexpectedly null in DbgVariableRecord");
3918 SmallVector<unsigned, 2> ValAndType;
3922 if (!pushValueAndType(VAM->getValue(), InstID, ValAndType)) {
3936 for (DbgRecord &DR :
I.DebugMarker->getDbgRecordRange()) {
3962 FUNCTION_DEBUG_RECORD_VALUE_ABBREV);
3986 SmallPtrSet<Value *, 8> Visited{BA};
3987 while (!Worklist.
empty()) {
3989 for (User *U :
V->users()) {
3995 Visited.
insert(U).second)
4002 if (!BlockAddressUsers.
empty()) {
4011 if (
auto *Symtab =
F.getValueSymbolTable())
4012 writeFunctionLevelValueSymbolTable(*Symtab);
4014 if (NeedsMetadataAttachment)
4015 writeFunctionMetadataAttachment(
F);
4017 writeUseListBlock(&
F);
4023void ModuleBitcodeWriter::writeBlockInfo() {
4036 auto Abbv = std::make_shared<BitCodeAbbrev>();
4047 auto Abbv = std::make_shared<BitCodeAbbrev>();
4057 auto Abbv = std::make_shared<BitCodeAbbrev>();
4067 auto Abbv = std::make_shared<BitCodeAbbrev>();
4073 VST_BBENTRY_6_ABBREV)
4078 auto Abbv = std::make_shared<BitCodeAbbrev>();
4080 Abbv->Add(TypeAbbrevOp);
4082 CONSTANTS_SETTYPE_ABBREV)
4087 auto Abbv = std::make_shared<BitCodeAbbrev>();
4091 CONSTANTS_INTEGER_ABBREV)
4096 auto Abbv = std::make_shared<BitCodeAbbrev>();
4100 CONSTANTS_BYTE_ABBREV)
4105 auto Abbv = std::make_shared<BitCodeAbbrev>();
4113 CONSTANTS_CE_CAST_Abbrev)
4117 auto Abbv = std::make_shared<BitCodeAbbrev>();
4120 CONSTANTS_NULL_Abbrev)
4127 auto Abbv = std::make_shared<BitCodeAbbrev>();
4129 Abbv->Add(ValAbbrevOp);
4130 Abbv->Add(TypeAbbrevOp);
4134 FUNCTION_INST_LOAD_ABBREV)
4138 auto Abbv = std::make_shared<BitCodeAbbrev>();
4140 Abbv->Add(ValAbbrevOp);
4141 Abbv->Add(ValAbbrevOp);
4145 FUNCTION_INST_STORE_ABBREV)
4149 auto Abbv = std::make_shared<BitCodeAbbrev>();
4151 Abbv->Add(ValAbbrevOp);
4154 FUNCTION_INST_UNOP_ABBREV)
4158 auto Abbv = std::make_shared<BitCodeAbbrev>();
4160 Abbv->Add(ValAbbrevOp);
4164 FUNCTION_INST_UNOP_FLAGS_ABBREV)
4168 auto Abbv = std::make_shared<BitCodeAbbrev>();
4170 Abbv->Add(ValAbbrevOp);
4171 Abbv->Add(ValAbbrevOp);
4174 FUNCTION_INST_BINOP_ABBREV)
4178 auto Abbv = std::make_shared<BitCodeAbbrev>();
4180 Abbv->Add(ValAbbrevOp);
4181 Abbv->Add(ValAbbrevOp);
4185 FUNCTION_INST_BINOP_FLAGS_ABBREV)
4189 auto Abbv = std::make_shared<BitCodeAbbrev>();
4191 Abbv->Add(ValAbbrevOp);
4192 Abbv->Add(TypeAbbrevOp);
4195 FUNCTION_INST_CAST_ABBREV)
4199 auto Abbv = std::make_shared<BitCodeAbbrev>();
4201 Abbv->Add(ValAbbrevOp);
4202 Abbv->Add(TypeAbbrevOp);
4206 FUNCTION_INST_CAST_FLAGS_ABBREV)
4211 auto Abbv = std::make_shared<BitCodeAbbrev>();
4214 FUNCTION_INST_RET_VOID_ABBREV)
4218 auto Abbv = std::make_shared<BitCodeAbbrev>();
4220 Abbv->Add(ValAbbrevOp);
4222 FUNCTION_INST_RET_VAL_ABBREV)
4226 auto Abbv = std::make_shared<BitCodeAbbrev>();
4229 Abbv->Add(ValAbbrevOp);
4231 FUNCTION_INST_BR_UNCOND_ABBREV)
4235 auto Abbv = std::make_shared<BitCodeAbbrev>();
4238 Abbv->Add(ValAbbrevOp);
4239 Abbv->Add(ValAbbrevOp);
4240 Abbv->Add(ValAbbrevOp);
4242 FUNCTION_INST_BR_COND_ABBREV)
4246 auto Abbv = std::make_shared<BitCodeAbbrev>();
4249 FUNCTION_INST_UNREACHABLE_ABBREV)
4253 auto Abbv = std::make_shared<BitCodeAbbrev>();
4256 Abbv->Add(TypeAbbrevOp);
4258 Abbv->Add(ValAbbrevOp);
4260 FUNCTION_INST_GEP_ABBREV)
4264 auto Abbv = std::make_shared<BitCodeAbbrev>();
4266 Abbv->Add(ValAbbrevOp);
4267 Abbv->Add(ValAbbrevOp);
4270 FUNCTION_INST_CMP_ABBREV)
4274 auto Abbv = std::make_shared<BitCodeAbbrev>();
4276 Abbv->Add(ValAbbrevOp);
4277 Abbv->Add(ValAbbrevOp);
4281 FUNCTION_INST_CMP_FLAGS_ABBREV)
4285 auto Abbv = std::make_shared<BitCodeAbbrev>();
4290 Abbv->Add(ValAbbrevOp);
4292 FUNCTION_DEBUG_RECORD_VALUE_ABBREV)
4296 auto Abbv = std::make_shared<BitCodeAbbrev>();
4307 FUNCTION_DEBUG_LOC_ABBREV)
4315void IndexBitcodeWriter::writeModStrings() {
4321 auto Abbv = std::make_shared<BitCodeAbbrev>();
4326 unsigned Abbrev8Bit = Stream.
EmitAbbrev(std::move(Abbv));
4329 Abbv = std::make_shared<BitCodeAbbrev>();
4334 unsigned Abbrev7Bit = Stream.
EmitAbbrev(std::move(Abbv));
4337 Abbv = std::make_shared<BitCodeAbbrev>();
4342 unsigned Abbrev6Bit = Stream.
EmitAbbrev(std::move(Abbv));
4345 Abbv = std::make_shared<BitCodeAbbrev>();
4352 unsigned AbbrevHash = Stream.
EmitAbbrev(std::move(Abbv));
4355 forEachModule([&](
const StringMapEntry<ModuleHash> &MPSE) {
4357 const auto &Hash = MPSE.
getValue();
4359 unsigned AbbrevToUse = Abbrev8Bit;
4361 AbbrevToUse = Abbrev6Bit;
4363 AbbrevToUse = Abbrev7Bit;
4365 auto ModuleId = ModuleIdMap.
size();
4366 ModuleIdMap[
Key] = ModuleId;
4376 Vals.
assign(Hash.begin(), Hash.end());
4388template <
typename Fn>
4392 if (!FS->type_tests().empty())
4397 auto WriteVFuncIdVec = [&](
uint64_t Ty,
4402 for (
auto &VF : VFs) {
4403 Record.push_back(VF.GUID);
4404 Record.push_back(VF.Offset);
4410 FS->type_test_assume_vcalls());
4412 FS->type_checked_load_vcalls());
4414 auto WriteConstVCallVec = [&](
uint64_t Ty,
4416 for (
auto &VC : VCs) {
4418 Record.push_back(VC.VFunc.GUID);
4419 Record.push_back(VC.VFunc.Offset);
4426 FS->type_test_assume_const_vcalls());
4428 FS->type_checked_load_const_vcalls());
4438 if (!FS->paramAccesses().empty()) {
4440 for (
auto &Arg : FS->paramAccesses()) {
4441 size_t UndoSize =
Record.size();
4442 Record.push_back(Arg.ParamNo);
4443 WriteRange(Arg.Use);
4444 Record.push_back(Arg.Calls.size());
4445 for (
auto &
Call : Arg.Calls) {
4447 std::optional<unsigned> ValueID = GetValueID(
Call.Callee);
4454 Record.push_back(*ValueID);
4455 WriteRange(
Call.Offsets);
4466 std::set<GlobalValue::GUID> &ReferencedTypeIds) {
4467 if (!FS->type_tests().empty())
4468 for (
auto &TT : FS->type_tests())
4469 ReferencedTypeIds.insert(TT);
4471 auto GetReferencedTypesFromVFuncIdVec =
4473 for (
auto &VF : VFs)
4474 ReferencedTypeIds.insert(VF.GUID);
4477 GetReferencedTypesFromVFuncIdVec(FS->type_test_assume_vcalls());
4478 GetReferencedTypesFromVFuncIdVec(FS->type_checked_load_vcalls());
4480 auto GetReferencedTypesFromConstVCallVec =
4482 for (
auto &VC : VCs)
4483 ReferencedTypeIds.insert(VC.VFunc.GUID);
4486 GetReferencedTypesFromConstVCallVec(FS->type_test_assume_const_vcalls());
4487 GetReferencedTypesFromConstVCallVec(FS->type_checked_load_const_vcalls());
4523 NameVals.
push_back(Summary.TTRes.TheKind);
4524 NameVals.
push_back(Summary.TTRes.SizeM1BitWidth);
4525 NameVals.
push_back(Summary.TTRes.AlignLog2);
4526 NameVals.
push_back(Summary.TTRes.SizeM1);
4527 NameVals.
push_back(Summary.TTRes.BitMask);
4528 NameVals.
push_back(Summary.TTRes.InlineBits);
4530 for (
auto &W : Summary.WPDRes)
4542 for (
auto &
P : Summary) {
4544 NameVals.
push_back(
VE.getValueID(
P.VTableVI.getValue()));
4558 static_assert(std::is_same_v<LinearFrameId, unsigned>);
4559 for (
auto &AI : FS->allocs()) {
4560 for (
auto &MIB : AI.MIBs) {
4562 StackIdIndices.
reserve(MIB.StackIdIndices.size());
4563 for (
auto Id : MIB.StackIdIndices)
4564 StackIdIndices.
push_back(GetStackIndex(Id));
4566 CallStacks.insert({CallStacks.size(), StackIdIndices});
4579 assert(!CallStacks.empty());
4585 Builder.
build(std::move(CallStacks),
nullptr,
4589 return Builder.takeCallStackPos();
4594 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
bool PerModule,
4595 std::function<
unsigned(
const ValueInfo &VI)> GetValueID,
4596 std::function<
unsigned(
unsigned)> GetStackIndex,
4597 bool WriteContextSizeInfoIndex,
4602 for (
auto &CI : FS->callsites()) {
4606 assert(!PerModule || (CI.Clones.size() == 1 && CI.Clones[0] == 0));
4607 Record.push_back(GetValueID(CI.Callee));
4609 Record.push_back(CI.StackIdIndices.size());
4610 Record.push_back(CI.Clones.size());
4612 for (
auto Id : CI.StackIdIndices)
4613 Record.push_back(GetStackIndex(Id));
4621 for (
auto &AI : FS->allocs()) {
4625 assert(!PerModule || (AI.Versions.size() == 1 && AI.Versions[0] == 0));
4626 Record.push_back(AI.MIBs.size());
4628 Record.push_back(AI.Versions.size());
4629 for (
auto &MIB : AI.MIBs) {
4636 assert(CallStackCount <= CallStackPos.
size());
4637 Record.push_back(CallStackPos[CallStackCount++]);
4642 assert(AI.ContextSizeInfos.empty() ||
4643 AI.ContextSizeInfos.size() == AI.MIBs.size());
4645 if (WriteContextSizeInfoIndex && !AI.ContextSizeInfos.empty()) {
4653 ContextIds.
reserve(AI.ContextSizeInfos.size() * 2);
4654 for (
auto &Infos : AI.ContextSizeInfos) {
4655 Record.push_back(Infos.size());
4656 for (
auto [FullStackId, TotalSize] : Infos) {
4663 Record.push_back(TotalSize);
4681void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
4682 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
4683 unsigned ValueID,
unsigned FSCallsProfileAbbrev,
unsigned CallsiteAbbrev,
4684 unsigned AllocAbbrev,
unsigned ContextIdAbbvId,
const Function &
F,
4685 DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
4692 Stream, FS, [&](
const ValueInfo &VI) -> std::optional<unsigned> {
4696 auto SpecialRefCnts =
FS->specialRefCounts();
4701 NameVals.
push_back(SpecialRefCnts.first);
4702 NameVals.
push_back(SpecialRefCnts.second);
4704 for (
auto &RI :
FS->refs())
4707 for (
auto &ECI :
FS->calls()) {
4708 NameVals.
push_back(getValueId(ECI.first));
4717 Stream, FS, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,
4719 [&](
const ValueInfo &VI) {
return getValueId(VI); },
4720 [&](
unsigned I) {
return I; },
4721 true, CallStackPos, CallStackCount);
4726void ModuleBitcodeWriterBase::writeModuleLevelReferences(
4727 const GlobalVariable &V, SmallVector<uint64_t, 64> &NameVals,
4728 unsigned FSModRefsAbbrev,
unsigned FSModVTableRefsAbbrev) {
4733 auto VI =
Index->getValueInfo(GUID);
4734 if (!VI ||
VI.getSummaryList().empty()) {
4740 auto *
Summary =
VI.getSummaryList()[0].get();
4746 auto VTableFuncs =
VS->vTableFuncs();
4747 if (!VTableFuncs.empty())
4750 unsigned SizeBeforeRefs = NameVals.
size();
4751 for (
auto &RI :
VS->refs())
4757 if (VTableFuncs.empty())
4762 for (
auto &
P : VTableFuncs) {
4768 FSModVTableRefsAbbrev);
4775void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
4778 bool IsThinLTO =
true;
4781 IsThinLTO = MD->getZExtValue();
4793 if (
Index->enableSplitLTOUnit())
4795 if (
Index->hasUnifiedLTO())
4805 auto Abbv = std::make_shared<BitCodeAbbrev>();
4811 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4813 for (
const auto &GVI : valueIds()) {
4815 ArrayRef<uint32_t>{GVI.second,
4816 static_cast<uint32_t
>(GVI.first >> 32),
4817 static_cast<uint32_t
>(GVI.first)},
4821 if (!
Index->stackIds().empty()) {
4822 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4829 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
4830 SmallVector<uint32_t> Vals;
4832 for (
auto Id :
Index->stackIds()) {
4833 Vals.
push_back(
static_cast<uint32_t
>(Id >> 32));
4834 Vals.
push_back(
static_cast<uint32_t
>(Id));
4839 unsigned ContextIdAbbvId = 0;
4842 auto ContextIdAbbv = std::make_shared<BitCodeAbbrev>();
4854 ContextIdAbbvId = Stream.
EmitAbbrev(std::move(ContextIdAbbv));
4858 Abbv = std::make_shared<BitCodeAbbrev>();
4870 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4873 Abbv = std::make_shared<BitCodeAbbrev>();
4879 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4882 Abbv = std::make_shared<BitCodeAbbrev>();
4890 unsigned FSModVTableRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4893 Abbv = std::make_shared<BitCodeAbbrev>();
4898 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4901 Abbv = std::make_shared<BitCodeAbbrev>();
4908 unsigned TypeIdCompatibleVtableAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4910 Abbv = std::make_shared<BitCodeAbbrev>();
4916 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4918 Abbv = std::make_shared<BitCodeAbbrev>();
4925 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4927 Abbv = std::make_shared<BitCodeAbbrev>();
4932 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
4939 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
4950 ValueInfo
VI =
Index->getValueInfo(GUID);
4951 if (!VI ||
VI.getSummaryList().empty()) {
4954 if (!
F.isDeclaration())
4956 " to have an associated value info.");
4959 auto *
Summary =
VI.getSummaryList()[0].get();
4962 FS, [](
unsigned I) {
return I; }, CallStacks);
4966 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
4967 if (!CallStacks.
empty()) {
4975 SmallVector<uint64_t, 64> NameVals;
4986 ValueInfo
VI =
Index->getValueInfo(GUID);
4987 if (!VI ||
VI.getSummaryList().empty()) {
4993 auto *
Summary =
VI.getSummaryList()[0].get();
4994 writePerModuleFunctionSummaryRecord(NameVals, Summary, VE.
getValueID(&
F),
4995 FSCallsProfileAbbrev, CallsiteAbbrev,
4996 AllocAbbrev, ContextIdAbbvId,
F,
4997 CallStackPos, CallStackCount);
5002 for (
const GlobalVariable &
G :
M.globals())
5003 writeModuleLevelReferences(
G, NameVals, FSModRefsAbbrev,
5004 FSModVTableRefsAbbrev);
5006 for (
const GlobalAlias &
A :
M.aliases()) {
5007 auto *Aliasee =
A.getAliaseeObject();
5023 for (
auto &S :
Index->typeIdCompatibleVtableMap()) {
5027 TypeIdCompatibleVtableAbbrev);
5031 if (
Index->getBlockCount())
5033 ArrayRef<uint64_t>{
Index->getBlockCount()});
5038void ModuleBitcodeWriterBase::writeGUIDList() {
5040 const size_t Max = Vals.size();
5042 std::vector<GlobalValue::GUID> GUIDs(Max, 0);
5043 for (
const GlobalValue &GV :
M.global_values()) {
5044 auto MaybeGUID = GV.getGUIDIfAssigned();
5047 auto GUID = *MaybeGUID;
5050 GUIDs[ValueID] =
GUID;
5053 auto Abbv = std::make_shared<BitCodeAbbrev>();
5057 unsigned GUIDListAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5059 SmallVector<uint32_t> RecordVals;
5061 for (
auto GUID : GUIDs) {
5062 RecordVals.
push_back(
static_cast<uint32_t
>(GUID >> 32));
5063 RecordVals.
push_back(
static_cast<uint32_t
>(GUID));
5070void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
5079 auto Abbv = std::make_shared<BitCodeAbbrev>();
5085 unsigned ValueGuidAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5087 for (
const auto &GVI : valueIds()) {
5089 ArrayRef<uint32_t>{GVI.second,
5090 static_cast<uint32_t
>(GVI.first >> 32),
5091 static_cast<uint32_t
>(GVI.first)},
5097 if (!StackIds.empty()) {
5098 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
5105 unsigned StackIdAbbvId = Stream.
EmitAbbrev(std::move(StackIdAbbv));
5106 SmallVector<uint32_t> Vals;
5107 Vals.
reserve(StackIds.size() * 2);
5108 for (
auto Id : StackIds) {
5109 Vals.
push_back(
static_cast<uint32_t
>(Id >> 32));
5110 Vals.
push_back(
static_cast<uint32_t
>(Id));
5116 Abbv = std::make_shared<BitCodeAbbrev>();
5130 unsigned FSCallsProfileAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5133 Abbv = std::make_shared<BitCodeAbbrev>();
5140 unsigned FSModRefsAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5143 Abbv = std::make_shared<BitCodeAbbrev>();
5149 unsigned FSAliasAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5151 Abbv = std::make_shared<BitCodeAbbrev>();
5159 unsigned CallsiteAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5161 Abbv = std::make_shared<BitCodeAbbrev>();
5172 unsigned AllocAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5174 auto shouldImportValueAsDecl = [&](GlobalValueSummary *GVS) ->
bool {
5175 if (DecSummaries ==
nullptr)
5177 return DecSummaries->
count(GVS);
5185 DenseMap<const GlobalValueSummary *, unsigned> SummaryToValueIdMap;
5187 SmallVector<uint64_t, 64> NameVals;
5191 std::set<GlobalValue::GUID> ReferencedTypeIds;
5195 auto MaybeEmitOriginalName = [&](GlobalValueSummary &S) {
5205 NameVals.
push_back(S.getOriginalName());
5210 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
5212 Abbv = std::make_shared<BitCodeAbbrev>();
5217 unsigned RadixAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5224 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
5225 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
5231 GlobalValueSummary *S =
I.second;
5244 return StackIdIndicesToIndex[
I];
5250 if (!CallStacks.
empty()) {
5260 DenseSet<GlobalValue::GUID> DefOrUseGUIDs;
5261 forEachSummary([&](GVInfo
I,
bool IsAliasee) {
5262 GlobalValueSummary *S =
I.second;
5264 DefOrUseGUIDs.
insert(
I.first);
5265 for (
const ValueInfo &VI : S->
refs())
5266 DefOrUseGUIDs.
insert(
VI.getGUID());
5268 auto ValueId = getValueId(
I.first);
5270 SummaryToValueIdMap[S] = *ValueId;
5288 NameVals.
push_back(ModuleIdMap[
VS->modulePath()]);
5292 for (
auto &RI :
VS->refs()) {
5293 auto RefValueId = getValueId(RI.getGUID());
5303 MaybeEmitOriginalName(*S);
5307 auto GetValueId = [&](
const ValueInfo &
VI) -> std::optional<unsigned> {
5309 return std::nullopt;
5310 return getValueId(
VI.getGUID());
5319 NameVals.
push_back(ModuleIdMap[
FS->modulePath()]);
5332 unsigned Count = 0, RORefCnt = 0, WORefCnt = 0;
5333 for (
auto &RI :
FS->refs()) {
5334 auto RefValueId = getValueId(RI.getGUID());
5338 if (RI.isReadOnly())
5340 else if (RI.isWriteOnly())
5344 NameVals[6] =
Count;
5345 NameVals[7] = RORefCnt;
5346 NameVals[8] = WORefCnt;
5348 for (
auto &EI :
FS->calls()) {
5351 std::optional<unsigned> CallValueId = GetValueId(EI.first);
5360 FSCallsProfileAbbrev);
5364 Stream, FS, CallsiteAbbrev, AllocAbbrev, 0,
5367 [&](
const ValueInfo &VI) ->
unsigned {
5368 std::optional<unsigned> ValueID = GetValueId(VI);
5383 return StackIdIndicesToIndex[
I];
5385 false, CallStackPos, CallStackCount);
5387 MaybeEmitOriginalName(*S);
5390 for (
auto *AS : Aliases) {
5391 auto AliasValueId = SummaryToValueIdMap[AS];
5400 auto AliaseeValueId =
5407 MaybeEmitOriginalName(*AS);
5415 auto EmitCfiFunctions = [&](
const CfiFunctionIndex &CfiIndex,
5417 if (CfiIndex.
empty())
5421 for (StringRef Name : Names)
5424 if (Functions.
empty())
5427 for (
const auto &Record : Functions) {
5442 for (
auto &
T : ReferencedTypeIds) {
5443 auto TidIter =
Index.typeIds().equal_range(
T);
5444 for (
const auto &[GUID, TypeIdPair] :
make_range(TidIter)) {
5452 if (
Index.getBlockCount())
5454 ArrayRef<uint64_t>{
Index.getBlockCount()});
5465 auto Abbv = std::make_shared<BitCodeAbbrev>();
5469 auto StringAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5471 "LLVM" LLVM_VERSION_STRING, StringAbbrev);
5474 Abbv = std::make_shared<BitCodeAbbrev>();
5477 auto EpochAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5483void ModuleBitcodeWriter::writeModuleHash(StringRef View) {
5488 Hasher.
update(ArrayRef<uint8_t>(
5489 reinterpret_cast<const uint8_t *
>(
View.data()),
View.size()));
5490 std::array<uint8_t, 20> Hash = Hasher.
result();
5491 for (
int Pos = 0; Pos < 20; Pos += 4) {
5504void ModuleBitcodeWriter::write() {
5512 writeModuleVersion();
5521 writeAttributeGroupTable();
5524 writeAttributeTable();
5533 writeModuleConstants();
5536 writeModuleMetadataKinds();
5539 writeModuleMetadata();
5543 writeUseListBlock(
nullptr);
5545 writeOperandBundleTags();
5546 writeSyncScopeNames();
5549 DenseMap<const Function *, uint64_t> FunctionToBitcodeIndex;
5551 if (!
F.isDeclaration())
5552 writeFunction(
F, FunctionToBitcodeIndex);
5557 writePerModuleGlobalValueSummary();
5559 writeGlobalValueSymbolTable(FunctionToBitcodeIndex);
5587 unsigned CPUType = ~0U;
5594 DARWIN_CPU_ARCH_ABI64 = 0x01000000,
5595 DARWIN_CPU_TYPE_X86 = 7,
5596 DARWIN_CPU_TYPE_ARM = 12,
5597 DARWIN_CPU_TYPE_POWERPC = 18
5602 CPUType = DARWIN_CPU_TYPE_X86 | DARWIN_CPU_ARCH_ABI64;
5604 CPUType = DARWIN_CPU_TYPE_X86;
5606 CPUType = DARWIN_CPU_TYPE_POWERPC;
5608 CPUType = DARWIN_CPU_TYPE_POWERPC | DARWIN_CPU_ARCH_ABI64;
5610 CPUType = DARWIN_CPU_TYPE_ARM;
5614 "Expected header size to be reserved");
5619 unsigned Position = 0;
5627 while (Buffer.
size() & 15)
5634 Stream.
Emit((
unsigned)
'B', 8);
5635 Stream.
Emit((
unsigned)
'C', 8);
5636 Stream.
Emit(0x0, 4);
5637 Stream.
Emit(0xC, 4);
5638 Stream.
Emit(0xE, 4);
5639 Stream.
Emit(0xD, 4);
5657 auto Abbv = std::make_shared<BitCodeAbbrev>();
5660 auto AbbrevNo = Stream->
EmitAbbrev(std::move(Abbv));
5668 assert(!WroteStrtab && !WroteSymtab);
5674 if (M->getModuleInlineAsm().empty())
5678 const Triple TT(M->getTargetTriple());
5680 if (!
T || !
T->hasMCAsmParser())
5702 std::vector<char> Strtab;
5703 StrtabBuilder.finalizeInOrder();
5704 Strtab.resize(StrtabBuilder.getSize());
5705 StrtabBuilder.write((
uint8_t *)Strtab.data());
5708 {Strtab.data(), Strtab.size()});
5719 bool ShouldPreserveUseListOrder,
5728 assert(M.isMaterialized());
5729 Mods.push_back(
const_cast<Module *
>(&M));
5731 ModuleBitcodeWriter ModuleWriter(M, StrtabBuilder, *Stream,
5732 ShouldPreserveUseListOrder, Index,
5733 GenerateHash, ModHash);
5734 ModuleWriter.write();
5741 IndexBitcodeWriter IndexWriter(*Stream, StrtabBuilder, *Index, DecSummaries,
5742 ModuleToSummariesForIndex);
5743 IndexWriter.write();
5748 bool ShouldPreserveUseListOrder,
5752 Writer.writeModule(M, ShouldPreserveUseListOrder, Index, GenerateHash,
5754 Writer.writeSymtab();
5755 Writer.writeStrtab();
5757 Triple TT(M.getTargetTriple());
5758 if (TT.isOSDarwin() || TT.isOSBinFormatMachO()) {
5776void IndexBitcodeWriter::write() {
5779 writeModuleVersion();
5785 writeCombinedGlobalValueSummary();
5802 Writer.
writeIndex(&Index, ModuleToSummariesForIndex, DecSummaries);
5811class ThinLinkBitcodeWriter :
public ModuleBitcodeWriterBase {
5821 : ModuleBitcodeWriterBase(M, StrtabBuilder, Stream,
5823 ModHash(&ModHash) {}
5828 void writeSimplifiedModuleInfo();
5838void ThinLinkBitcodeWriter::writeSimplifiedModuleInfo() {
5850 auto Abbv = std::make_shared<BitCodeAbbrev>();
5853 Abbv->Add(AbbrevOpToUse);
5854 unsigned FilenameAbbrev = Stream.
EmitAbbrev(std::move(Abbv));
5856 for (
const auto P :
M.getSourceFileName())
5922void ThinLinkBitcodeWriter::write() {
5925 writeModuleVersion();
5927 writeSimplifiedModuleInfo();
5929 writePerModuleGlobalValueSummary();
5946 assert(M.isMaterialized());
5947 Mods.push_back(
const_cast<Module *
>(&M));
5949 ThinLinkBitcodeWriter ThinLinkWriter(M, StrtabBuilder, *Stream, Index,
5951 ThinLinkWriter.write();
5972 switch (
T.getObjectFormat()) {
5974 return "__LLVM,__bitcode";
5999 switch (
T.getObjectFormat()) {
6001 return "__LLVM,__cmdline";
6027 const std::vector<uint8_t> &CmdArgs) {
6032 Type *UsedElementType = Used ? Used->getValueType()->getArrayElementType()
6034 for (
auto *GV : UsedGlobals) {
6035 if (GV->getName() !=
"llvm.embedded.module" &&
6036 GV->getName() !=
"llvm.cmdline")
6041 Used->eraseFromParent();
6046 Triple T(M.getTargetTriple());
6075 M.getGlobalVariable(
"llvm.embedded.module",
true)) {
6076 assert(Old->hasZeroLiveUses() &&
6077 "llvm.embedded.module can only be used once in llvm.compiler.used");
6079 Old->eraseFromParent();
6081 GV->
setName(
"llvm.embedded.module");
6099 assert(Old->hasZeroLiveUses() &&
6100 "llvm.cmdline can only be used once in llvm.compiler.used");
6102 Old->eraseFromParent();
6108 if (UsedArray.
empty())
6116 NewUsed->setSection(
"llvm.metadata");
for(const MachineOperand &MO :llvm::drop_begin(OldMI.operands(), Desc.getNumOperands()))
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 writeDIProperty(raw_ostream &Out, const DIProperty *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< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
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.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
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.
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
@ MODULE_CODE_ASM_PROPERTY
@ 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.
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.
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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
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.
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
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.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
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,...
SmallPtrSet< GlobalValueSummary *, 0 > GVSummaryPtrSet
A set of global value summary pointers.
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 ...
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
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