24#include "llvm/Config/llvm-config.h"
54#include "llvm/IR/IntrinsicsAArch64.h"
55#include "llvm/IR/IntrinsicsARM.h"
88#include <system_error>
98 "Print the global id for each value when reading the module summary"));
103 "Expand constant expressions to instructions for testing purposes"));
108 SWITCH_INST_MAGIC = 0x4B5
121 "file too small to contain bitcode header");
122 for (
unsigned C : {
'B',
'C'})
126 "file doesn't start with bitcode header");
128 return Res.takeError();
129 for (
unsigned C : {0x0, 0xC, 0xE, 0xD})
133 "file doesn't start with bitcode header");
135 return Res.takeError();
140 const unsigned char *BufPtr = (
const unsigned char *)Buffer.
getBufferStart();
141 const unsigned char *BufEnd = BufPtr + Buffer.
getBufferSize();
144 return error(
"Invalid bitcode signature");
150 return error(
"Invalid bitcode wrapper header");
154 return std::move(Err);
156 return std::move(Stream);
160template <
typename StrTy>
173 if (
F.isMaterializable())
176 I.setMetadata(LLVMContext::MD_tbaa,
nullptr);
184 return std::move(Err);
189 std::string ProducerIdentification;
196 switch (Entry.Kind) {
199 return error(
"Malformed block");
201 return ProducerIdentification;
212 switch (MaybeBitCode.
get()) {
214 return error(
"Invalid value");
222 Twine(
"Incompatible epoch: Bitcode '") +
Twine(epoch) +
241 switch (Entry.Kind) {
244 return error(
"Malformed block");
252 return std::move(Err);
264 return std::move(Err);
275 switch (Entry.Kind) {
278 return error(
"Malformed block");
290 switch (MaybeRecord.
get()) {
296 return error(
"Invalid section name record");
301 Segment = Segment.trim();
302 Section = Section.trim();
304 if (Segment ==
"__DATA" && Section.starts_with(
"__objc_catlist"))
306 if (Segment ==
"__OBJC" && Section.starts_with(
"__category"))
308 if (Segment ==
"__TEXT" && Section.starts_with(
"__swift"))
326 switch (Entry.Kind) {
328 return error(
"Malformed block");
338 return std::move(Err);
351 return std::move(Err);
364 switch (Entry.Kind) {
367 return error(
"Malformed block");
379 switch (MaybeRecord.
get()) {
384 return error(
"Invalid triple record");
403 switch (Entry.Kind) {
405 return error(
"Malformed block");
415 return std::move(Err);
422 return Skipped.takeError();
429class BitcodeReaderBase {
431 BitcodeReaderBase(BitstreamCursor Stream, StringRef Strtab)
432 : Stream(std::
move(Stream)), Strtab(Strtab) {
433 this->Stream.setBlockInfo(&BlockInfo);
436 BitstreamBlockInfo BlockInfo;
437 BitstreamCursor Stream;
442 bool UseStrtab =
false;
444 Expected<unsigned> parseVersionRecord(ArrayRef<uint64_t> Record);
449 std::pair<StringRef, ArrayRef<uint64_t>>
450 readNameFromStrtab(ArrayRef<uint64_t> Record);
452 Error readBlockInfo();
455 std::string ProducerIdentification;
462Error BitcodeReaderBase::error(
const Twine &Message) {
463 std::string FullMsg = Message.
str();
464 if (!ProducerIdentification.empty())
465 FullMsg +=
" (Producer: '" + ProducerIdentification +
"' Reader: 'LLVM " +
466 LLVM_VERSION_STRING
"')";
467 return ::error(FullMsg);
471BitcodeReaderBase::parseVersionRecord(ArrayRef<uint64_t> Record) {
473 return error(
"Invalid version record");
474 unsigned ModuleVersion =
Record[0];
475 if (ModuleVersion > 2)
476 return error(
"Invalid value");
477 UseStrtab = ModuleVersion >= 2;
478 return ModuleVersion;
481std::pair<StringRef, ArrayRef<uint64_t>>
482BitcodeReaderBase::readNameFromStrtab(ArrayRef<uint64_t> Record) {
486 if (Record[0] + Record[1] > Strtab.
size())
488 return {StringRef(Strtab.
data() + Record[0], Record[1]),
Record.slice(2)};
499class BitcodeConstant final :
public Value,
500 TrailingObjects<BitcodeConstant, unsigned> {
501 friend TrailingObjects;
504 static constexpr uint8_t SubclassID = 255;
512 static constexpr uint8_t ConstantStructOpcode = 255;
513 static constexpr uint8_t ConstantArrayOpcode = 254;
514 static constexpr uint8_t ConstantVectorOpcode = 253;
515 static constexpr uint8_t NoCFIOpcode = 252;
516 static constexpr uint8_t DSOLocalEquivalentOpcode = 251;
517 static constexpr uint8_t BlockAddressOpcode = 250;
518 static constexpr uint8_t ConstantPtrAuthOpcode = 249;
519 static constexpr uint8_t FirstSpecialOpcode = ConstantPtrAuthOpcode;
526 unsigned BlockAddressBB = 0;
527 Type *SrcElemTy =
nullptr;
528 std::optional<ConstantRange>
InRange;
530 ExtraInfo(uint8_t Opcode, uint8_t Flags = 0,
Type *SrcElemTy =
nullptr,
531 std::optional<ConstantRange>
InRange = std::nullopt)
532 : Opcode(Opcode),
Flags(
Flags), SrcElemTy(SrcElemTy),
535 ExtraInfo(uint8_t Opcode, uint8_t Flags,
unsigned BlockAddressBB)
536 : Opcode(Opcode),
Flags(
Flags), BlockAddressBB(BlockAddressBB) {}
541 unsigned NumOperands;
542 unsigned BlockAddressBB;
544 std::optional<ConstantRange>
InRange;
547 BitcodeConstant(
Type *Ty,
const ExtraInfo &Info, ArrayRef<unsigned> OpIDs)
549 NumOperands(OpIDs.
size()), BlockAddressBB(
Info.BlockAddressBB),
554 BitcodeConstant &operator=(
const BitcodeConstant &) =
delete;
558 const ExtraInfo &Info,
559 ArrayRef<unsigned> OpIDs) {
560 void *Mem =
A.Allocate(totalSizeToAlloc<unsigned>(OpIDs.
size()),
561 alignof(BitcodeConstant));
562 return new (Mem) BitcodeConstant(Ty, Info, OpIDs);
565 static bool classof(
const Value *V) {
return V->getValueID() == SubclassID; }
567 ArrayRef<unsigned> getOperandIDs()
const {
568 return ArrayRef(getTrailingObjects(), NumOperands);
571 std::optional<ConstantRange> getInRange()
const {
572 assert(Opcode == Instruction::GetElementPtr);
581class BitcodeReader :
public BitcodeReaderBase,
public GVMaterializer {
583 Module *TheModule =
nullptr;
584 std::optional<Triple> TargetTriple;
586 uint64_t NextUnreadBit = 0;
588 uint64_t LastFunctionBlockBit = 0;
589 bool SeenValueSymbolTable =
false;
590 uint64_t VSTOffset = 0;
592 std::vector<std::string> SectionTable;
593 std::vector<std::string> GCTable;
595 std::vector<Type *> TypeList;
599 DenseMap<unsigned, SmallVector<unsigned, 1>> ContainedTypeIDs;
606 DenseMap<std::pair<Type *, unsigned>,
unsigned> VirtualTypeIDs;
607 DenseMap<Function *, unsigned> FunctionTypeIDs;
612 BitcodeReaderValueList ValueList;
613 std::optional<MetadataLoader> MDLoader;
614 std::vector<Comdat *> ComdatList;
615 DenseSet<GlobalObject *> ImplicitComdatObjects;
618 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInits;
619 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInits;
621 struct FunctionOperandInfo {
623 unsigned PersonalityFn;
627 std::vector<FunctionOperandInfo> FunctionOperands;
631 std::vector<AttributeList> MAttributes;
634 std::map<unsigned, AttributeList> MAttributeGroups;
638 std::vector<BasicBlock*> FunctionBBs;
642 std::vector<Function*> FunctionsWithBodies;
646 DenseMap<Function *, Function *> UpgradedIntrinsics;
651 bool SeenFirstFunctionBody =
false;
655 DenseMap<Function*, uint64_t> DeferredFunctionInfo;
660 std::vector<uint64_t> DeferredMetadataInfo;
665 DenseMap<Function *, std::vector<BasicBlock *>> BasicBlockFwdRefs;
666 std::deque<Function *> BasicBlockFwdRefQueue;
673 std::vector<Function *> BackwardRefFunctions;
681 bool UseRelativeIDs =
false;
685 bool WillMaterializeAllForwardRefs =
false;
689 bool SeenDebugIntrinsic =
false;
690 bool SeenDebugRecord =
false;
693 TBAAVerifier TBAAVerifyHelper;
695 std::vector<std::string> BundleTags;
698 std::optional<ValueTypeCallbackTy> ValueTypeCallback;
701 std::vector<GlobalValue::GUID> GUIDList;
707 bool SkipDebugIntrinsicUpgrade =
false;
710 BitcodeReader(BitstreamCursor Stream, StringRef Strtab,
711 StringRef ProducerIdentification, LLVMContext &
Context);
713 Error materializeForwardReferencedFunctions();
715 Error materialize(GlobalValue *GV)
override;
716 Error materializeModule()
override;
717 std::vector<StructType *> getIdentifiedStructTypes()
const override;
721 Error parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
722 bool IsImporting, ParserCallbacks Callbacks = {});
724 static uint64_t decodeSignRotatedValue(uint64_t V);
727 Error materializeMetadata()
override;
729 void setStripDebugInfo()
override;
732 std::vector<StructType *> IdentifiedStructTypes;
733 StructType *createIdentifiedStructType(LLVMContext &
Context, StringRef Name);
734 StructType *createIdentifiedStructType(LLVMContext &
Context);
736 static constexpr unsigned InvalidTypeID = ~0
u;
738 Type *getTypeByID(
unsigned ID);
739 Type *getPtrElementTypeByID(
unsigned ID);
740 unsigned getContainedTypeID(
unsigned ID,
unsigned Idx = 0);
741 unsigned getVirtualTypeID(
Type *Ty, ArrayRef<unsigned> ContainedTypeIDs = {});
744 Expected<Value *> materializeValue(
unsigned ValID, BasicBlock *InsertBB);
745 Expected<Constant *> getValueForInitializer(
unsigned ID);
747 Value *getFnValueByID(
unsigned ID,
Type *Ty,
unsigned TyID,
748 BasicBlock *ConstExprInsertBB) {
755 return MDLoader->getMetadataFwdRefOrLoad(
ID);
759 if (
ID >= FunctionBBs.size())
return nullptr;
760 return FunctionBBs[
ID];
764 if (i-1 < MAttributes.size())
765 return MAttributes[i-1];
766 return AttributeList();
772 bool getValueTypePair(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
773 unsigned InstNum,
Value *&ResVal,
unsigned &
TypeID,
774 BasicBlock *ConstExprInsertBB) {
775 if (Slot ==
Record.size())
return true;
776 unsigned ValNo = (unsigned)Record[Slot++];
779 ValNo = InstNum - ValNo;
780 if (ValNo < InstNum) {
784 ResVal = getFnValueByID(ValNo,
nullptr,
TypeID, ConstExprInsertBB);
786 "Incorrect type ID stored for value");
787 return ResVal ==
nullptr;
789 if (Slot ==
Record.size())
792 TypeID = (unsigned)Record[Slot++];
793 ResVal = getFnValueByID(ValNo, getTypeByID(
TypeID),
TypeID,
795 return ResVal ==
nullptr;
798 bool getValueOrMetadata(
const SmallVectorImpl<uint64_t> &Record,
799 unsigned &Slot,
unsigned InstNum,
Value *&ResVal,
800 BasicBlock *ConstExprInsertBB) {
801 if (Slot ==
Record.size())
806 return getValueTypePair(Record, --Slot, InstNum, ResVal, TypeId,
809 if (Slot ==
Record.size())
811 unsigned ValNo = InstNum - (unsigned)Record[Slot++];
819 bool popValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
820 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
821 BasicBlock *ConstExprInsertBB) {
822 if (
getValue(Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
830 bool getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
831 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
832 BasicBlock *ConstExprInsertBB) {
833 ResVal =
getValue(Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
834 return ResVal ==
nullptr;
839 Value *
getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
840 unsigned InstNum,
Type *Ty,
unsigned TyID,
841 BasicBlock *ConstExprInsertBB) {
842 if (Slot ==
Record.size())
return nullptr;
843 unsigned ValNo = (unsigned)Record[Slot];
846 ValNo = InstNum - ValNo;
847 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
851 Value *getValueSigned(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
852 unsigned InstNum,
Type *Ty,
unsigned TyID,
853 BasicBlock *ConstExprInsertBB) {
854 if (Slot ==
Record.size())
return nullptr;
855 unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]);
858 ValNo = InstNum - ValNo;
859 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
862 Expected<ConstantRange> readConstantRange(ArrayRef<uint64_t> Record,
865 if (
Record.size() - OpNum < 2)
866 return error(
"Too few records for range");
868 unsigned LowerActiveWords =
Record[OpNum];
869 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
870 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
871 return error(
"Too few records for range");
874 OpNum += LowerActiveWords;
877 OpNum += UpperActiveWords;
880 int64_t
Start = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
881 int64_t End = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
882 return ConstantRange(APInt(
BitWidth, Start,
true),
887 Expected<ConstantRange>
888 readBitWidthAndConstantRange(ArrayRef<uint64_t> Record,
unsigned &OpNum) {
889 if (
Record.size() - OpNum < 1)
890 return error(
"Too few records for range");
892 return readConstantRange(Record, OpNum,
BitWidth);
896 const Triple &getTargetTriple() {
898 BitstreamCursor TripleStream(Stream.getBitcodeBytes());
899 if (Expected<std::string> TripleStr =
readTriple(TripleStream))
900 TargetTriple.emplace(std::move(*TripleStr));
903 TargetTriple.emplace();
906 return *TargetTriple;
912 Error propagateAttributeTypes(CallBase *CB, ArrayRef<unsigned> ArgsTys);
917 Error parseAlignmentValue(uint64_t
Exponent, MaybeAlign &Alignment);
918 Error parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind);
920 ParserCallbacks Callbacks = {});
922 Error parseComdatRecord(ArrayRef<uint64_t> Record);
923 Error parseGlobalVarRecord(ArrayRef<uint64_t> Record);
924 Error parseFunctionRecord(ArrayRef<uint64_t> Record);
925 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
926 ArrayRef<uint64_t> Record);
928 Error parseAttributeBlock();
929 Error parseAttributeGroupBlock();
930 Error parseTypeTable();
931 Error parseTypeTableBody();
932 Error parseOperandBundleTags();
933 Error parseSyncScopeNames();
935 Expected<Value *> recordValue(SmallVectorImpl<uint64_t> &Record,
936 unsigned NameIndex, Triple &TT);
937 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta, Function *
F,
938 ArrayRef<uint64_t> Record);
940 Error parseGlobalValueSymbolTable();
941 Error parseConstants();
942 Error rememberAndSkipFunctionBodies();
943 Error rememberAndSkipFunctionBody();
945 Error rememberAndSkipMetadata();
947 Error parseFunctionBody(Function *
F);
948 Error globalCleanup();
949 Error resolveGlobalAndIndirectSymbolInits();
950 Error parseUseLists();
951 Error findFunctionInStream(
953 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator);
960class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
962 ModuleSummaryIndex &TheIndex;
966 bool SeenGlobalValSummary =
false;
969 bool SeenValueSymbolTable =
false;
973 uint64_t VSTOffset = 0;
983 DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
984 ValueIdToValueInfoMap;
990 DenseMap<uint64_t, StringRef> ModuleIdMap;
993 std::string SourceFileName;
997 StringRef ModulePath;
1001 std::function<bool(StringRef)> IsPrevailing =
nullptr;
1004 std::function<void(ValueInfo)> OnValueInfo =
nullptr;
1008 std::vector<uint64_t> StackIds;
1012 std::vector<uint64_t> RadixArray;
1017 std::vector<unsigned> StackIdToIndex;
1020 std::vector<uint64_t> DefinedGUIDs;
1023 ModuleSummaryIndexBitcodeReader(
1024 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
1025 StringRef ModulePath,
1026 std::function<
bool(StringRef)> IsPrevailing =
nullptr,
1027 std::function<
void(ValueInfo)> OnValueInfo =
nullptr);
1032 void setValueGUID(uint64_t ValueID, StringRef
ValueName,
1034 StringRef SourceFileName);
1035 Error parseValueSymbolTable(
1037 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
1040 makeCallList(ArrayRef<uint64_t> Record,
bool IsOldProfileFormat,
1041 bool HasProfile,
bool HasRelBF);
1042 Error parseEntireSummary(
unsigned ID);
1043 Error parseModuleStringTable();
1044 void parseTypeIdCompatibleVtableSummaryRecord(ArrayRef<uint64_t> Record);
1045 void parseTypeIdCompatibleVtableInfo(ArrayRef<uint64_t> Record,
size_t &Slot,
1047 std::vector<FunctionSummary::ParamAccess>
1048 parseParamAccesses(ArrayRef<uint64_t> Record);
1049 SmallVector<unsigned> parseAllocInfoContext(ArrayRef<uint64_t> Record,
1053 static constexpr unsigned UninitializedStackIdIndex =
1054 std::numeric_limits<unsigned>::max();
1056 unsigned getStackIdIndex(
unsigned LocalIndex) {
1057 unsigned &
Index = StackIdToIndex[LocalIndex];
1060 if (Index == UninitializedStackIdIndex)
1065 template <
bool AllowNullValueInfo = false>
1066 std::pair<ValueInfo, GlobalValue::GUID>
1067 getValueInfoFromValueId(
unsigned ValueId);
1069 void addThisModule();
1085 return std::error_code();
1091 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1092 ValueList(this->Stream.SizeInBytes(),
1094 return materializeValue(
ValID, InsertBB);
1096 this->ProducerIdentification = std::string(ProducerIdentification);
1099Error BitcodeReader::materializeForwardReferencedFunctions() {
1100 if (WillMaterializeAllForwardRefs)
1104 WillMaterializeAllForwardRefs =
true;
1106 while (!BasicBlockFwdRefQueue.empty()) {
1107 Function *
F = BasicBlockFwdRefQueue.front();
1108 BasicBlockFwdRefQueue.pop_front();
1109 assert(
F &&
"Expected valid function");
1110 if (!BasicBlockFwdRefs.
count(
F))
1118 if (!
F->isMaterializable())
1119 return error(
"Never resolved function from blockaddress");
1122 if (
Error Err = materialize(
F))
1125 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1127 for (Function *
F : BackwardRefFunctions)
1128 if (
Error Err = materialize(
F))
1130 BackwardRefFunctions.clear();
1133 WillMaterializeAllForwardRefs =
false;
1198 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1199 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1200 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1201 Flags.NoInline = (RawFlags >> 4) & 0x1;
1202 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1203 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1204 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1205 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1206 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1222 bool NoRenameOnPromotion = ((RawFlags >> 11) & 1);
1223 RawFlags = RawFlags >> 4;
1224 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1228 bool Live = (RawFlags & 0x2) || Version < 3;
1229 bool Local = (RawFlags & 0x4);
1230 bool AutoHide = (RawFlags & 0x8);
1233 Live,
Local, AutoHide, IK,
1234 NoRenameOnPromotion);
1240 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1241 (RawFlags & 0x4) ?
true :
false,
1245static std::pair<CalleeInfo::HotnessType, bool>
1249 bool HasTailCall = (RawFlags & 0x8);
1250 return {Hotness, HasTailCall};
1255 bool &HasTailCall) {
1256 static constexpr unsigned RelBlockFreqBits = 28;
1257 static constexpr uint64_t RelBlockFreqMask = (1 << RelBlockFreqBits) - 1;
1258 RelBF = RawFlags & RelBlockFreqMask;
1259 HasTailCall = (RawFlags & (1 << RelBlockFreqBits));
1284 case 0:
return false;
1285 case 1:
return true;
1347 bool IsFP = Ty->isFPOrFPVectorTy();
1349 if (!IsFP && !Ty->isIntOrIntVectorTy())
1356 return IsFP ? Instruction::FNeg : -1;
1361 bool IsFP = Ty->isFPOrFPVectorTy();
1363 if (!IsFP && !Ty->isIntOrIntVectorTy())
1370 return IsFP ? Instruction::FAdd : Instruction::Add;
1372 return IsFP ? Instruction::FSub : Instruction::Sub;
1374 return IsFP ? Instruction::FMul : Instruction::Mul;
1376 return IsFP ? -1 : Instruction::UDiv;
1378 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1380 return IsFP ? -1 : Instruction::URem;
1382 return IsFP ? Instruction::FRem : Instruction::SRem;
1384 return IsFP ? -1 : Instruction::Shl;
1386 return IsFP ? -1 : Instruction::LShr;
1388 return IsFP ? -1 : Instruction::AShr;
1390 return IsFP ? -1 : Instruction::And;
1392 return IsFP ? -1 : Instruction::Or;
1394 return IsFP ? -1 : Instruction::Xor;
1399 bool &IsElementwise) {
1497Type *BitcodeReader::getTypeByID(
unsigned ID) {
1499 if (
ID >= TypeList.size())
1502 if (
Type *Ty = TypeList[
ID])
1507 return TypeList[
ID] = createIdentifiedStructType(
Context);
1510unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1511 auto It = ContainedTypeIDs.
find(
ID);
1512 if (It == ContainedTypeIDs.
end())
1513 return InvalidTypeID;
1515 if (Idx >= It->second.size())
1516 return InvalidTypeID;
1518 return It->second[Idx];
1521Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1522 if (
ID >= TypeList.size())
1529 return getTypeByID(getContainedTypeID(
ID, 0));
1532unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1533 ArrayRef<unsigned> ChildTypeIDs) {
1534 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1535 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1536 auto It = VirtualTypeIDs.
find(CacheKey);
1537 if (It != VirtualTypeIDs.
end()) {
1543 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1544 "Incorrect cached contained type IDs");
1548 unsigned TypeID = TypeList.size();
1549 TypeList.push_back(Ty);
1550 if (!ChildTypeIDs.
empty())
1571 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1585 if (Opcode == Instruction::GetElementPtr)
1589 case Instruction::FNeg:
1590 case Instruction::Select:
1591 case Instruction::ICmp:
1592 case Instruction::FCmp:
1599Expected<Value *> BitcodeReader::materializeValue(
unsigned StartValID,
1600 BasicBlock *InsertBB) {
1602 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1604 return ValueList[StartValID];
1606 SmallDenseMap<unsigned, Value *> MaterializedValues;
1607 SmallVector<unsigned> Worklist;
1609 while (!Worklist.
empty()) {
1610 unsigned ValID = Worklist.
back();
1611 if (MaterializedValues.
count(ValID)) {
1617 if (ValID >= ValueList.
size() || !ValueList[ValID])
1618 return error(
"Invalid value ID");
1620 Value *
V = ValueList[ValID];
1623 MaterializedValues.
insert({ValID,
V});
1631 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1632 auto It = MaterializedValues.
find(OpID);
1633 if (It != MaterializedValues.
end())
1634 Ops.push_back(It->second);
1641 if (
Ops.size() != BC->getOperandIDs().size())
1643 std::reverse(
Ops.begin(),
Ops.end());
1660 switch (BC->Opcode) {
1661 case BitcodeConstant::ConstantPtrAuthOpcode: {
1664 return error(
"ptrauth key operand must be ConstantInt");
1668 return error(
"ptrauth disc operand must be ConstantInt");
1671 ConstOps.
size() > 4 ? ConstOps[4]
1676 "ptrauth deactivation symbol operand must be a pointer");
1679 DeactivationSymbol);
1682 case BitcodeConstant::NoCFIOpcode: {
1685 return error(
"no_cfi operand must be GlobalValue");
1689 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1692 return error(
"dso_local operand must be GlobalValue");
1696 case BitcodeConstant::BlockAddressOpcode: {
1699 return error(
"blockaddress operand must be a function");
1704 unsigned BBID = BC->BlockAddressBB;
1707 return error(
"Invalid ID");
1710 for (
size_t I = 0,
E = BBID;
I !=
E; ++
I) {
1712 return error(
"Invalid ID");
1719 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1721 BasicBlockFwdRefQueue.push_back(Fn);
1722 if (FwdBBs.size() < BBID + 1)
1723 FwdBBs.resize(BBID + 1);
1731 case BitcodeConstant::ConstantStructOpcode: {
1733 if (
ST->getNumElements() != ConstOps.
size())
1734 return error(
"Invalid number of elements in struct initializer");
1736 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1737 if (
Op->getType() != Ty)
1738 return error(
"Incorrect type in struct initializer");
1743 case BitcodeConstant::ConstantArrayOpcode: {
1745 if (AT->getNumElements() != ConstOps.
size())
1746 return error(
"Invalid number of elements in array initializer");
1748 for (Constant *
Op : ConstOps)
1749 if (
Op->getType() != AT->getElementType())
1750 return error(
"Incorrect type in array initializer");
1755 case BitcodeConstant::ConstantVectorOpcode: {
1757 if (VT->getNumElements() != ConstOps.size())
1758 return error(
"Invalid number of elements in vector initializer");
1760 for (Constant *
Op : ConstOps)
1761 if (
Op->getType() != VT->getElementType())
1762 return error(
"Incorrect type in vector initializer");
1767 case Instruction::GetElementPtr:
1769 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1772 case Instruction::ExtractElement:
1775 case Instruction::InsertElement:
1779 case Instruction::ShuffleVector: {
1780 SmallVector<int, 16>
Mask;
1792 MaterializedValues.
insert({ValID,
C});
1798 return error(Twine(
"Value referenced by initializer is an unsupported "
1799 "constant expression of type ") +
1800 BC->getOpcodeName());
1806 BC->getType(),
"constexpr", InsertBB);
1809 "constexpr", InsertBB);
1812 Ops[1],
"constexpr", InsertBB);
1815 I->setHasNoSignedWrap();
1817 I->setHasNoUnsignedWrap();
1823 switch (BC->Opcode) {
1824 case BitcodeConstant::ConstantVectorOpcode: {
1825 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1828 Value *Idx = ConstantInt::get(IdxTy, Pair.index());
1835 case BitcodeConstant::ConstantStructOpcode:
1836 case BitcodeConstant::ConstantArrayOpcode: {
1840 "constexpr.ins", InsertBB);
1844 case Instruction::ICmp:
1845 case Instruction::FCmp:
1848 "constexpr", InsertBB);
1850 case Instruction::GetElementPtr:
1856 case Instruction::Select:
1859 case Instruction::ExtractElement:
1862 case Instruction::InsertElement:
1866 case Instruction::ShuffleVector:
1867 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1875 MaterializedValues.
insert({ValID,
I});
1879 return MaterializedValues[StartValID];
1882Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1883 Expected<Value *> MaybeV = materializeValue(
ID,
nullptr);
1891StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1894 IdentifiedStructTypes.push_back(Ret);
1898StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1900 IdentifiedStructTypes.push_back(Ret);
1916 case Attribute::ZExt:
return 1 << 0;
1917 case Attribute::SExt:
return 1 << 1;
1918 case Attribute::NoReturn:
return 1 << 2;
1919 case Attribute::InReg:
return 1 << 3;
1920 case Attribute::StructRet:
return 1 << 4;
1921 case Attribute::NoUnwind:
return 1 << 5;
1922 case Attribute::NoAlias:
return 1 << 6;
1923 case Attribute::ByVal:
return 1 << 7;
1924 case Attribute::Nest:
return 1 << 8;
1925 case Attribute::ReadNone:
return 1 << 9;
1926 case Attribute::ReadOnly:
return 1 << 10;
1927 case Attribute::NoInline:
return 1 << 11;
1928 case Attribute::AlwaysInline:
return 1 << 12;
1929 case Attribute::OptimizeForSize:
return 1 << 13;
1930 case Attribute::StackProtect:
return 1 << 14;
1931 case Attribute::StackProtectReq:
return 1 << 15;
1932 case Attribute::Alignment:
return 31 << 16;
1934 case Attribute::NoRedZone:
return 1 << 22;
1935 case Attribute::NoImplicitFloat:
return 1 << 23;
1936 case Attribute::Naked:
return 1 << 24;
1937 case Attribute::InlineHint:
return 1 << 25;
1938 case Attribute::StackAlignment:
return 7 << 26;
1939 case Attribute::ReturnsTwice:
return 1 << 29;
1940 case Attribute::UWTable:
return 1 << 30;
1941 case Attribute::NonLazyBind:
return 1U << 31;
1942 case Attribute::SanitizeAddress:
return 1ULL << 32;
1943 case Attribute::MinSize:
return 1ULL << 33;
1944 case Attribute::NoDuplicate:
return 1ULL << 34;
1945 case Attribute::StackProtectStrong:
return 1ULL << 35;
1946 case Attribute::SanitizeThread:
return 1ULL << 36;
1947 case Attribute::SanitizeMemory:
return 1ULL << 37;
1948 case Attribute::NoBuiltin:
return 1ULL << 38;
1949 case Attribute::Returned:
return 1ULL << 39;
1950 case Attribute::Cold:
return 1ULL << 40;
1951 case Attribute::Builtin:
return 1ULL << 41;
1952 case Attribute::OptimizeNone:
return 1ULL << 42;
1953 case Attribute::InAlloca:
return 1ULL << 43;
1954 case Attribute::NonNull:
return 1ULL << 44;
1955 case Attribute::JumpTable:
return 1ULL << 45;
1956 case Attribute::Convergent:
return 1ULL << 46;
1957 case Attribute::SafeStack:
return 1ULL << 47;
1958 case Attribute::NoRecurse:
return 1ULL << 48;
1961 case Attribute::SwiftSelf:
return 1ULL << 51;
1962 case Attribute::SwiftError:
return 1ULL << 52;
1963 case Attribute::WriteOnly:
return 1ULL << 53;
1964 case Attribute::Speculatable:
return 1ULL << 54;
1965 case Attribute::StrictFP:
return 1ULL << 55;
1966 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1967 case Attribute::NoCfCheck:
return 1ULL << 57;
1968 case Attribute::OptForFuzzing:
return 1ULL << 58;
1969 case Attribute::ShadowCallStack:
return 1ULL << 59;
1970 case Attribute::SpeculativeLoadHardening:
1972 case Attribute::ImmArg:
1974 case Attribute::WillReturn:
1976 case Attribute::NoFree:
1992 if (
I == Attribute::Alignment)
1993 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1994 else if (
I == Attribute::StackAlignment)
1995 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1997 B.addTypeAttr(
I,
nullptr);
2011 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
2013 "Alignment must be a power of two.");
2016 B.addAlignmentAttr(Alignment);
2018 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
2019 (EncodedAttrs & 0xffff);
2021 if (AttrIdx == AttributeList::FunctionIndex) {
2024 if (Attrs & (1ULL << 9)) {
2026 Attrs &= ~(1ULL << 9);
2029 if (Attrs & (1ULL << 10)) {
2031 Attrs &= ~(1ULL << 10);
2034 if (Attrs & (1ULL << 49)) {
2036 Attrs &= ~(1ULL << 49);
2039 if (Attrs & (1ULL << 50)) {
2041 Attrs &= ~(1ULL << 50);
2044 if (Attrs & (1ULL << 53)) {
2046 Attrs &= ~(1ULL << 53);
2050 B.addMemoryAttr(ME);
2054 if (Attrs & (1ULL << 21)) {
2055 Attrs &= ~(1ULL << 21);
2062Error BitcodeReader::parseAttributeBlock() {
2066 if (!MAttributes.empty())
2067 return error(
"Invalid multiple blocks");
2069 SmallVector<uint64_t, 64>
Record;
2078 BitstreamEntry
Entry = MaybeEntry.
get();
2080 switch (
Entry.Kind) {
2083 return error(
"Malformed block");
2096 switch (MaybeRecord.
get()) {
2102 return error(
"Invalid parameter attribute record");
2104 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2110 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2114 for (uint64_t Val : Record)
2115 Attrs.push_back(MAttributeGroups[Val]);
2117 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2130 return Attribute::Alignment;
2132 return Attribute::AlwaysInline;
2134 return Attribute::Builtin;
2136 return Attribute::ByVal;
2138 return Attribute::InAlloca;
2140 return Attribute::Cold;
2142 return Attribute::Convergent;
2144 return Attribute::DisableSanitizerInstrumentation;
2146 return Attribute::ElementType;
2148 return Attribute::FnRetThunkExtern;
2150 return Attribute::Flatten;
2152 return Attribute::InlineHint;
2154 return Attribute::InReg;
2156 return Attribute::JumpTable;
2158 return Attribute::Memory;
2160 return Attribute::NoFPClass;
2162 return Attribute::MinSize;
2164 return Attribute::Naked;
2166 return Attribute::Nest;
2168 return Attribute::NoAlias;
2170 return Attribute::NoBuiltin;
2172 return Attribute::NoCallback;
2174 return Attribute::NoDivergenceSource;
2176 return Attribute::NoDuplicate;
2178 return Attribute::NoFree;
2180 return Attribute::NoImplicitFloat;
2182 return Attribute::NoInline;
2184 return Attribute::NoRecurse;
2186 return Attribute::NoMerge;
2188 return Attribute::NonLazyBind;
2190 return Attribute::NonNull;
2192 return Attribute::Dereferenceable;
2194 return Attribute::DereferenceableOrNull;
2196 return Attribute::AllocAlign;
2198 return Attribute::AllocKind;
2200 return Attribute::AllocSize;
2202 return Attribute::AllocatedPointer;
2204 return Attribute::NoRedZone;
2206 return Attribute::NoReturn;
2208 return Attribute::NoSync;
2210 return Attribute::NoCfCheck;
2212 return Attribute::NoProfile;
2214 return Attribute::SkipProfile;
2216 return Attribute::NoUnwind;
2218 return Attribute::NoSanitizeBounds;
2220 return Attribute::NoSanitizeCoverage;
2222 return Attribute::NullPointerIsValid;
2224 return Attribute::OptimizeForDebugging;
2226 return Attribute::OptForFuzzing;
2228 return Attribute::OptimizeForSize;
2230 return Attribute::OptimizeNone;
2232 return Attribute::ReadNone;
2234 return Attribute::ReadOnly;
2236 return Attribute::Returned;
2238 return Attribute::ReturnsTwice;
2240 return Attribute::SExt;
2242 return Attribute::Speculatable;
2244 return Attribute::StackAlignment;
2246 return Attribute::StackProtect;
2248 return Attribute::StackProtectReq;
2250 return Attribute::StackProtectStrong;
2252 return Attribute::SafeStack;
2254 return Attribute::ShadowCallStack;
2256 return Attribute::StrictFP;
2258 return Attribute::StructRet;
2260 return Attribute::SanitizeAddress;
2262 return Attribute::SanitizeHWAddress;
2264 return Attribute::SanitizeThread;
2266 return Attribute::SanitizeType;
2268 return Attribute::SanitizeMemory;
2270 return Attribute::SanitizeNumericalStability;
2272 return Attribute::SanitizeRealtime;
2274 return Attribute::SanitizeRealtimeBlocking;
2276 return Attribute::SanitizeAllocToken;
2278 return Attribute::SpeculativeLoadHardening;
2280 return Attribute::SwiftError;
2282 return Attribute::SwiftSelf;
2284 return Attribute::SwiftAsync;
2286 return Attribute::UWTable;
2288 return Attribute::VScaleRange;
2290 return Attribute::WillReturn;
2292 return Attribute::WriteOnly;
2294 return Attribute::ZExt;
2296 return Attribute::ImmArg;
2298 return Attribute::SanitizeMemTag;
2300 return Attribute::Preallocated;
2302 return Attribute::NoUndef;
2304 return Attribute::ByRef;
2306 return Attribute::MustProgress;
2308 return Attribute::Hot;
2310 return Attribute::PresplitCoroutine;
2312 return Attribute::Writable;
2314 return Attribute::CoroDestroyOnlyWhenComplete;
2316 return Attribute::DeadOnUnwind;
2318 return Attribute::Range;
2320 return Attribute::Initializes;
2322 return Attribute::CoroElideSafe;
2324 return Attribute::NoExt;
2326 return Attribute::Captures;
2328 return Attribute::DeadOnReturn;
2330 return Attribute::NoCreateUndefOrPoison;
2332 return Attribute::DenormalFPEnv;
2334 return Attribute::NoOutline;
2336 return Attribute::NoIPA;
2341 MaybeAlign &Alignment) {
2344 if (
Exponent > Value::MaxAlignmentExponent + 1)
2345 return error(
"Invalid alignment value");
2350Error BitcodeReader::parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind) {
2352 if (*Kind == Attribute::None)
2353 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2358 switch (EncodedKind) {
2382Error BitcodeReader::parseAttributeGroupBlock() {
2386 if (!MAttributeGroups.empty())
2387 return error(
"Invalid multiple blocks");
2389 SmallVector<uint64_t, 64>
Record;
2396 BitstreamEntry
Entry = MaybeEntry.
get();
2398 switch (
Entry.Kind) {
2401 return error(
"Malformed block");
2414 switch (MaybeRecord.
get()) {
2419 return error(
"Invalid grp record");
2421 uint64_t GrpID =
Record[0];
2422 uint64_t Idx =
Record[1];
2426 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2427 if (Record[i] == 0) {
2428 Attribute::AttrKind
Kind;
2429 uint64_t EncodedKind =
Record[++i];
2430 if (Idx == AttributeList::FunctionIndex &&
2439 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2445 if (Kind == Attribute::ByVal)
2446 B.addByValAttr(
nullptr);
2447 else if (Kind == Attribute::StructRet)
2448 B.addStructRetAttr(
nullptr);
2449 else if (Kind == Attribute::InAlloca)
2450 B.addInAllocaAttr(
nullptr);
2451 else if (Kind == Attribute::UWTable)
2452 B.addUWTableAttr(UWTableKind::Default);
2453 else if (Kind == Attribute::DeadOnReturn)
2454 B.addDeadOnReturnAttr(DeadOnReturnInfo());
2455 else if (Attribute::isEnumAttrKind(Kind))
2456 B.addAttribute(Kind);
2458 return error(
"Not an enum attribute");
2459 }
else if (Record[i] == 1) {
2460 Attribute::AttrKind
Kind;
2461 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2463 if (!Attribute::isIntAttrKind(Kind))
2464 return error(
"Not an int attribute");
2465 if (Kind == Attribute::Alignment)
2466 B.addAlignmentAttr(Record[++i]);
2467 else if (Kind == Attribute::StackAlignment)
2468 B.addStackAlignmentAttr(Record[++i]);
2469 else if (Kind == Attribute::Dereferenceable)
2470 B.addDereferenceableAttr(Record[++i]);
2471 else if (Kind == Attribute::DereferenceableOrNull)
2472 B.addDereferenceableOrNullAttr(Record[++i]);
2473 else if (Kind == Attribute::DeadOnReturn)
2474 B.addDeadOnReturnAttr(
2476 else if (Kind == Attribute::AllocSize)
2477 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2478 else if (Kind == Attribute::VScaleRange)
2479 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2480 else if (Kind == Attribute::UWTable)
2482 else if (Kind == Attribute::AllocKind)
2483 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2484 else if (Kind == Attribute::Memory) {
2485 uint64_t EncodedME =
Record[++i];
2486 const uint8_t
Version = (EncodedME >> 56);
2500 if (getTargetTriple().isAArch64())
2505 B.addMemoryAttr(ME);
2510 EncodedME & 0x00FFFFFFFFFFFFFFULL);
2513 if (
Version == 1 && getTargetTriple().isAArch64())
2515 IRMemLocation::TargetMem0,
2516 ME.
getModRef(IRMemLocation::InaccessibleMem)) |
2518 IRMemLocation::TargetMem1,
2519 ME.
getModRef(IRMemLocation::InaccessibleMem));
2520 B.addMemoryAttr(ME);
2522 }
else if (Kind == Attribute::Captures)
2524 else if (Kind == Attribute::NoFPClass)
2527 else if (Kind == Attribute::DenormalFPEnv) {
2528 B.addDenormalFPEnvAttr(
2531 }
else if (Record[i] == 3 || Record[i] == 4) {
2533 SmallString<64> KindStr;
2534 SmallString<64> ValStr;
2536 while (Record[i] != 0 && i != e)
2538 assert(Record[i] == 0 &&
"Kind string not null terminated");
2543 while (Record[i] != 0 && i != e)
2545 assert(Record[i] == 0 &&
"Value string not null terminated");
2548 B.addAttribute(KindStr.
str(), ValStr.
str());
2549 }
else if (Record[i] == 5 || Record[i] == 6) {
2550 bool HasType =
Record[i] == 6;
2551 Attribute::AttrKind
Kind;
2552 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2554 if (!Attribute::isTypeAttrKind(Kind))
2555 return error(
"Not a type attribute");
2557 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2558 }
else if (Record[i] == 7) {
2559 Attribute::AttrKind
Kind;
2562 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2564 if (!Attribute::isConstantRangeAttrKind(Kind))
2565 return error(
"Not a ConstantRange attribute");
2567 Expected<ConstantRange> MaybeCR =
2568 readBitWidthAndConstantRange(Record, i);
2573 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2574 }
else if (Record[i] == 8) {
2575 Attribute::AttrKind
Kind;
2578 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2580 if (!Attribute::isConstantRangeListAttrKind(Kind))
2581 return error(
"Not a constant range list attribute");
2585 return error(
"Too few records for constant range list");
2586 unsigned RangeSize =
Record[i++];
2588 for (
unsigned Idx = 0; Idx < RangeSize; ++Idx) {
2589 Expected<ConstantRange> MaybeCR =
2590 readConstantRange(Record, i,
BitWidth);
2598 return error(
"Invalid (unordered or overlapping) range list");
2599 B.addConstantRangeListAttr(Kind, Val);
2601 return error(
"Invalid attribute group entry");
2606 B.addMemoryAttr(ME);
2609 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2616Error BitcodeReader::parseTypeTable() {
2620 return parseTypeTableBody();
2623Error BitcodeReader::parseTypeTableBody() {
2624 if (!TypeList.empty())
2625 return error(
"Invalid multiple blocks");
2627 SmallVector<uint64_t, 64>
Record;
2628 unsigned NumRecords = 0;
2637 BitstreamEntry
Entry = MaybeEntry.
get();
2639 switch (
Entry.Kind) {
2642 return error(
"Malformed block");
2644 if (NumRecords != TypeList.size())
2645 return error(
"Malformed block");
2654 Type *ResultTy =
nullptr;
2655 SmallVector<unsigned> ContainedIDs;
2659 switch (MaybeRecord.
get()) {
2661 return error(
"Invalid value");
2666 return error(
"Invalid numentry record");
2667 TypeList.resize(Record[0]);
2670 ResultTy = Type::getVoidTy(
Context);
2673 ResultTy = Type::getHalfTy(
Context);
2676 ResultTy = Type::getBFloatTy(
Context);
2679 ResultTy = Type::getFloatTy(
Context);
2682 ResultTy = Type::getDoubleTy(
Context);
2685 ResultTy = Type::getX86_FP80Ty(
Context);
2688 ResultTy = Type::getFP128Ty(
Context);
2691 ResultTy = Type::getPPC_FP128Ty(
Context);
2694 ResultTy = Type::getLabelTy(
Context);
2697 ResultTy = Type::getMetadataTy(
Context);
2705 ResultTy = Type::getX86_AMXTy(
Context);
2708 ResultTy = Type::getTokenTy(
Context);
2712 return error(
"Invalid record");
2714 uint64_t NumBits =
Record[0];
2717 return error(
"Bitwidth for byte type out of range");
2723 return error(
"Invalid integer record");
2725 uint64_t NumBits =
Record[0];
2728 return error(
"Bitwidth for integer type out of range");
2735 return error(
"Invalid pointer record");
2739 ResultTy = getTypeByID(Record[0]);
2741 !PointerType::isValidElementType(ResultTy))
2742 return error(
"Invalid type");
2749 return error(
"Invalid opaque pointer record");
2758 return error(
"Invalid function record");
2760 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2761 if (
Type *
T = getTypeByID(Record[i]))
2767 ResultTy = getTypeByID(Record[2]);
2768 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2769 return error(
"Invalid type");
2772 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2778 return error(
"Invalid function record");
2780 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2781 if (
Type *
T = getTypeByID(Record[i])) {
2782 if (!FunctionType::isValidArgumentType(
T))
2783 return error(
"Invalid function argument type");
2790 ResultTy = getTypeByID(Record[1]);
2791 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2792 return error(
"Invalid type");
2795 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2800 return error(
"Invalid anon struct record");
2802 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2803 if (
Type *
T = getTypeByID(Record[i]))
2809 return error(
"Invalid type");
2816 return error(
"Invalid struct name record");
2821 return error(
"Invalid named struct record");
2823 if (NumRecords >= TypeList.size())
2824 return error(
"Invalid TYPE table");
2830 TypeList[NumRecords] =
nullptr;
2832 Res = createIdentifiedStructType(
Context, TypeName);
2836 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2837 if (
Type *
T = getTypeByID(Record[i]))
2843 return error(
"Invalid named struct record");
2852 return error(
"Invalid opaque type record");
2854 if (NumRecords >= TypeList.size())
2855 return error(
"Invalid TYPE table");
2861 TypeList[NumRecords] =
nullptr;
2863 Res = createIdentifiedStructType(
Context, TypeName);
2870 return error(
"Invalid target extension type record");
2872 if (NumRecords >= TypeList.size())
2873 return error(
"Invalid TYPE table");
2875 if (Record[0] >=
Record.size())
2876 return error(
"Too many type parameters");
2878 unsigned NumTys =
Record[0];
2880 SmallVector<unsigned, 8> IntParams;
2881 for (
unsigned i = 0; i < NumTys; i++) {
2882 if (
Type *
T = getTypeByID(Record[i + 1]))
2885 return error(
"Invalid type");
2888 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2889 if (Record[i] > UINT_MAX)
2890 return error(
"Integer parameter too large");
2895 if (
auto E = TTy.takeError())
2903 return error(
"Invalid array type record");
2904 ResultTy = getTypeByID(Record[1]);
2905 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2906 return error(
"Invalid type");
2908 ResultTy = ArrayType::get(ResultTy, Record[0]);
2913 return error(
"Invalid vector type record");
2915 return error(
"Invalid vector length");
2916 ResultTy = getTypeByID(Record[1]);
2917 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2918 return error(
"Invalid type");
2921 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2925 if (NumRecords >= TypeList.size())
2926 return error(
"Invalid TYPE table");
2927 if (TypeList[NumRecords])
2929 "Invalid TYPE table: Only named structs can be forward referenced");
2930 assert(ResultTy &&
"Didn't read a type?");
2931 TypeList[NumRecords] = ResultTy;
2932 if (!ContainedIDs.
empty())
2933 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2938Error BitcodeReader::parseOperandBundleTags() {
2942 if (!BundleTags.empty())
2943 return error(
"Invalid multiple blocks");
2945 SmallVector<uint64_t, 64>
Record;
2951 BitstreamEntry
Entry = MaybeEntry.
get();
2953 switch (
Entry.Kind) {
2956 return error(
"Malformed block");
2970 return error(
"Invalid operand bundle record");
2973 BundleTags.emplace_back();
2975 return error(
"Invalid operand bundle record");
2980Error BitcodeReader::parseSyncScopeNames() {
2985 return error(
"Invalid multiple synchronization scope names blocks");
2987 SmallVector<uint64_t, 64>
Record;
2992 BitstreamEntry
Entry = MaybeEntry.
get();
2994 switch (
Entry.Kind) {
2997 return error(
"Malformed block");
3000 return error(
"Invalid empty synchronization scope names block");
3014 return error(
"Invalid sync scope record");
3016 SmallString<16> SSN;
3018 return error(
"Invalid sync scope record");
3026Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
3027 unsigned NameIndex, Triple &TT) {
3030 return error(
"Invalid record");
3031 unsigned ValueID =
Record[0];
3032 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3033 return error(
"Invalid record");
3034 Value *
V = ValueList[ValueID];
3037 if (NameStr.contains(0))
3038 return error(
"Invalid value name");
3039 V->setName(NameStr);
3041 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
3054 return std::move(JumpFailed);
3060 return error(
"Expected value symbol table subblock");
3064void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
3066 ArrayRef<uint64_t> Record) {
3070 uint64_t FuncWordOffset =
Record[1] - 1;
3071 uint64_t FuncBitOffset = FuncWordOffset * 32;
3072 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
3076 if (FuncBitOffset > LastFunctionBlockBit)
3077 LastFunctionBlockBit = FuncBitOffset;
3081Error BitcodeReader::parseGlobalValueSymbolTable() {
3082 unsigned FuncBitcodeOffsetDelta =
3088 SmallVector<uint64_t, 64>
Record;
3093 BitstreamEntry
Entry = MaybeEntry.
get();
3095 switch (
Entry.Kind) {
3098 return error(
"Malformed block");
3109 switch (MaybeRecord.
get()) {
3111 unsigned ValueID =
Record[0];
3112 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3113 return error(
"Invalid value reference in symbol table");
3114 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3124Error BitcodeReader::parseValueSymbolTable(uint64_t
Offset) {
3125 uint64_t CurrentBit;
3131 if (!MaybeCurrentBit)
3133 CurrentBit = MaybeCurrentBit.
get();
3136 if (
Error Err = parseGlobalValueSymbolTable())
3157 unsigned FuncBitcodeOffsetDelta =
3163 SmallVector<uint64_t, 64>
Record;
3174 BitstreamEntry
Entry = MaybeEntry.
get();
3176 switch (
Entry.Kind) {
3179 return error(
"Malformed block");
3195 switch (MaybeRecord.
get()) {
3199 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3207 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3215 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3220 return error(
"Invalid bbentry record");
3223 return error(
"Invalid bbentry record");
3235uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {
3245Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3246 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3247 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3248 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3250 GlobalInitWorklist.swap(GlobalInits);
3251 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3252 FunctionOperandWorklist.swap(FunctionOperands);
3254 while (!GlobalInitWorklist.empty()) {
3255 unsigned ValID = GlobalInitWorklist.back().second;
3256 if (ValID >= ValueList.
size()) {
3258 GlobalInits.push_back(GlobalInitWorklist.back());
3260 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3263 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3265 GlobalInitWorklist.pop_back();
3268 while (!IndirectSymbolInitWorklist.empty()) {
3269 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3270 if (ValID >= ValueList.
size()) {
3271 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3273 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3277 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3280 return error(
"Alias and aliasee types don't match");
3285 return error(
"Expected an alias or an ifunc");
3288 IndirectSymbolInitWorklist.pop_back();
3291 while (!FunctionOperandWorklist.empty()) {
3292 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3293 if (
Info.PersonalityFn) {
3294 unsigned ValID =
Info.PersonalityFn - 1;
3295 if (ValID < ValueList.
size()) {
3296 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3299 Info.F->setPersonalityFn(MaybeC.
get());
3300 Info.PersonalityFn = 0;
3304 unsigned ValID =
Info.Prefix - 1;
3305 if (ValID < ValueList.
size()) {
3306 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3309 Info.F->setPrefixData(MaybeC.
get());
3313 if (
Info.Prologue) {
3314 unsigned ValID =
Info.Prologue - 1;
3315 if (ValID < ValueList.
size()) {
3316 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3319 Info.F->setPrologueData(MaybeC.
get());
3323 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3324 FunctionOperands.push_back(Info);
3325 FunctionOperandWorklist.pop_back();
3334 BitcodeReader::decodeSignRotatedValue);
3336 return APInt(TypeBits, Words);
3339Error BitcodeReader::parseConstants() {
3347 unsigned Int32TyID = getVirtualTypeID(CurTy);
3348 unsigned CurTyID = Int32TyID;
3349 Type *CurElemTy =
nullptr;
3350 unsigned NextCstNo = ValueList.
size();
3358 switch (Entry.Kind) {
3361 return error(
"Malformed block");
3363 if (NextCstNo != ValueList.
size())
3364 return error(
"Invalid constant reference");
3375 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
3378 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3388 return error(
"Invalid settype record");
3389 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3390 return error(
"Invalid settype record");
3391 if (TypeList[Record[0]] == VoidType)
3392 return error(
"Invalid constant type");
3394 CurTy = TypeList[CurTyID];
3395 CurElemTy = getPtrElementTypeByID(CurTyID);
3399 return error(
"Invalid type for a constant null value");
3402 return error(
"Invalid type for a constant null value");
3407 return error(
"Invalid integer const record");
3412 return error(
"Invalid wide integer const record");
3415 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3416 V = ConstantInt::get(CurTy, VInt);
3421 return error(
"Invalid byte const record");
3422 V = ConstantByte::get(CurTy, decodeSignRotatedValue(Record[0]),
3427 return error(
"Invalid wide byte const record");
3430 APInt VByte =
readWideAPInt(Record, ScalarTy->getBitWidth());
3431 V = ConstantByte::get(CurTy, VByte);
3436 return error(
"Invalid float const record");
3439 if (ScalarTy->isHalfTy())
3440 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3441 APInt(16, (uint16_t)Record[0])));
3442 else if (ScalarTy->isBFloatTy())
3443 V = ConstantFP::get(
3444 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3445 else if (ScalarTy->isFloatTy())
3446 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3447 APInt(32, (uint32_t)Record[0])));
3448 else if (ScalarTy->isDoubleTy())
3449 V = ConstantFP::get(
3450 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3451 else if (ScalarTy->isX86_FP80Ty()) {
3453 uint64_t Rearrange[2];
3454 Rearrange[0] = (
Record[1] & 0xffffLL) | (Record[0] << 16);
3455 Rearrange[1] =
Record[0] >> 48;
3456 V = ConstantFP::get(
3457 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3458 }
else if (ScalarTy->isFP128Ty())
3459 V = ConstantFP::get(CurTy,
3460 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3461 else if (ScalarTy->isPPC_FP128Ty())
3462 V = ConstantFP::get(
3463 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3471 return error(
"Invalid aggregate record");
3473 SmallVector<unsigned, 16> Elts;
3477 V = BitcodeConstant::create(
3478 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3480 V = BitcodeConstant::create(
Alloc, CurTy,
3481 BitcodeConstant::ConstantArrayOpcode, Elts);
3483 V = BitcodeConstant::create(
3484 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3493 return error(
"Invalid string record");
3503 return error(
"Invalid data record");
3507 return error(
"Invalid type for value");
3510 SmallString<128> RawData;
3512 for (uint64_t Val : Record) {
3513 const char *Src =
reinterpret_cast<const char *
>(&Val);
3515 Src +=
sizeof(uint64_t) - EltBytes;
3516 RawData.
append(Src, Src + EltBytes);
3521 : ConstantDataArray::getRaw(RawData.str(),
Record.
size(), EltTy);
3526 return error(
"Invalid unary op constexpr record");
3531 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3537 return error(
"Invalid binary op constexpr record");
3543 if (
Record.size() >= 4) {
3544 if (
Opc == Instruction::Add ||
3545 Opc == Instruction::Sub ||
3546 Opc == Instruction::Mul ||
3547 Opc == Instruction::Shl) {
3552 }
else if (
Opc == Instruction::SDiv ||
3553 Opc == Instruction::UDiv ||
3554 Opc == Instruction::LShr ||
3555 Opc == Instruction::AShr) {
3560 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3561 {(unsigned)Record[1], (
unsigned)
Record[2]});
3567 return error(
"Invalid cast constexpr record");
3572 unsigned OpTyID =
Record[1];
3573 Type *OpTy = getTypeByID(OpTyID);
3575 return error(
"Invalid cast constexpr record");
3576 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3588 return error(
"Constant GEP record must have at least two elements");
3590 Type *PointeeType =
nullptr;
3594 PointeeType = getTypeByID(Record[OpNum++]);
3597 std::optional<ConstantRange>
InRange;
3601 unsigned InRangeIndex =
Op >> 1;
3607 Expected<ConstantRange> MaybeInRange =
3608 readBitWidthAndConstantRange(Record, OpNum);
3617 SmallVector<unsigned, 16> Elts;
3618 unsigned BaseTypeID =
Record[OpNum];
3619 while (OpNum !=
Record.size()) {
3620 unsigned ElTyID =
Record[OpNum++];
3621 Type *ElTy = getTypeByID(ElTyID);
3623 return error(
"Invalid getelementptr constexpr record");
3627 if (Elts.
size() < 1)
3628 return error(
"Invalid gep with no operands");
3632 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3633 BaseType = getTypeByID(BaseTypeID);
3638 return error(
"GEP base operand must be pointer or vector of pointer");
3641 PointeeType = getPtrElementTypeByID(BaseTypeID);
3643 return error(
"Missing element type for old-style constant GEP");
3646 V = BitcodeConstant::create(
3648 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3654 return error(
"Invalid select constexpr record");
3656 V = BitcodeConstant::create(
3657 Alloc, CurTy, Instruction::Select,
3658 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3664 return error(
"Invalid extractelement constexpr record");
3665 unsigned OpTyID =
Record[0];
3669 return error(
"Invalid extractelement constexpr record");
3671 if (
Record.size() == 4) {
3672 unsigned IdxTyID =
Record[2];
3673 Type *IdxTy = getTypeByID(IdxTyID);
3675 return error(
"Invalid extractelement constexpr record");
3681 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3682 {(unsigned)Record[1], IdxRecord});
3688 if (
Record.size() < 3 || !OpTy)
3689 return error(
"Invalid insertelement constexpr record");
3691 if (
Record.size() == 4) {
3692 unsigned IdxTyID =
Record[2];
3693 Type *IdxTy = getTypeByID(IdxTyID);
3695 return error(
"Invalid insertelement constexpr record");
3701 V = BitcodeConstant::create(
3702 Alloc, CurTy, Instruction::InsertElement,
3703 {(unsigned)Record[0], (
unsigned)
Record[1], IdxRecord});
3708 if (
Record.size() < 3 || !OpTy)
3709 return error(
"Invalid shufflevector constexpr record");
3710 V = BitcodeConstant::create(
3711 Alloc, CurTy, Instruction::ShuffleVector,
3712 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3719 if (
Record.size() < 4 || !RTy || !OpTy)
3720 return error(
"Invalid shufflevector constexpr record");
3721 V = BitcodeConstant::create(
3722 Alloc, CurTy, Instruction::ShuffleVector,
3723 {(unsigned)Record[1], (
unsigned)
Record[2], (unsigned)Record[3]});
3728 return error(
"Invalid cmp constexpt record");
3729 unsigned OpTyID =
Record[0];
3730 Type *OpTy = getTypeByID(OpTyID);
3732 return error(
"Invalid cmp constexpr record");
3733 V = BitcodeConstant::create(
3736 : Instruction::ICmp),
3737 (uint8_t)Record[3]},
3738 {(unsigned)Record[1], (
unsigned)
Record[2]});
3745 return error(
"Invalid inlineasm record");
3746 std::string AsmStr, ConstrStr;
3747 bool HasSideEffects =
Record[0] & 1;
3748 bool IsAlignStack =
Record[0] >> 1;
3749 unsigned AsmStrSize =
Record[1];
3750 if (2+AsmStrSize >=
Record.size())
3751 return error(
"Invalid inlineasm record");
3752 unsigned ConstStrSize =
Record[2+AsmStrSize];
3753 if (3+AsmStrSize+ConstStrSize >
Record.size())
3754 return error(
"Invalid inlineasm record");
3756 for (
unsigned i = 0; i != AsmStrSize; ++i)
3757 AsmStr += (
char)
Record[2+i];
3758 for (
unsigned i = 0; i != ConstStrSize; ++i)
3759 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3762 return error(
"Missing element type for old-style inlineasm");
3764 HasSideEffects, IsAlignStack);
3771 return error(
"Invalid inlineasm record");
3772 std::string AsmStr, ConstrStr;
3773 bool HasSideEffects =
Record[0] & 1;
3774 bool IsAlignStack = (
Record[0] >> 1) & 1;
3775 unsigned AsmDialect =
Record[0] >> 2;
3776 unsigned AsmStrSize =
Record[1];
3777 if (2+AsmStrSize >=
Record.size())
3778 return error(
"Invalid inlineasm record");
3779 unsigned ConstStrSize =
Record[2+AsmStrSize];
3780 if (3+AsmStrSize+ConstStrSize >
Record.size())
3781 return error(
"Invalid inlineasm record");
3783 for (
unsigned i = 0; i != AsmStrSize; ++i)
3784 AsmStr += (
char)
Record[2+i];
3785 for (
unsigned i = 0; i != ConstStrSize; ++i)
3786 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3789 return error(
"Missing element type for old-style inlineasm");
3791 HasSideEffects, IsAlignStack,
3798 return error(
"Invalid inlineasm record");
3800 std::string AsmStr, ConstrStr;
3801 bool HasSideEffects =
Record[OpNum] & 1;
3802 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3803 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3804 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3806 unsigned AsmStrSize =
Record[OpNum];
3808 if (OpNum + AsmStrSize >=
Record.size())
3809 return error(
"Invalid inlineasm record");
3810 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3811 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3812 return error(
"Invalid inlineasm record");
3814 for (
unsigned i = 0; i != AsmStrSize; ++i)
3815 AsmStr += (
char)
Record[OpNum + i];
3817 for (
unsigned i = 0; i != ConstStrSize; ++i)
3818 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3821 return error(
"Missing element type for old-style inlineasm");
3823 HasSideEffects, IsAlignStack,
3830 return error(
"Invalid inlineasm record");
3835 return error(
"Invalid inlineasm record");
3836 std::string AsmStr, ConstrStr;
3837 bool HasSideEffects =
Record[OpNum] & 1;
3838 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3839 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3840 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3842 unsigned AsmStrSize =
Record[OpNum];
3844 if (OpNum + AsmStrSize >=
Record.size())
3845 return error(
"Invalid inlineasm record");
3846 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3847 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3848 return error(
"Invalid inlineasm record");
3850 for (
unsigned i = 0; i != AsmStrSize; ++i)
3851 AsmStr += (
char)
Record[OpNum + i];
3853 for (
unsigned i = 0; i != ConstStrSize; ++i)
3854 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3856 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3862 return error(
"Invalid blockaddress record");
3863 unsigned FnTyID =
Record[0];
3864 Type *FnTy = getTypeByID(FnTyID);
3866 return error(
"Invalid blockaddress record");
3867 V = BitcodeConstant::create(
3869 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3875 return error(
"Invalid dso_local record");
3876 unsigned GVTyID =
Record[0];
3877 Type *GVTy = getTypeByID(GVTyID);
3879 return error(
"Invalid dso_local record");
3880 V = BitcodeConstant::create(
3881 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3886 return error(
"Invalid no_cfi record");
3887 unsigned GVTyID =
Record[0];
3888 Type *GVTy = getTypeByID(GVTyID);
3890 return error(
"Invalid no_cfi record");
3891 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3897 return error(
"Invalid ptrauth record");
3899 V = BitcodeConstant::create(
Alloc, CurTy,
3900 BitcodeConstant::ConstantPtrAuthOpcode,
3901 {(unsigned)Record[0], (
unsigned)
Record[1],
3902 (unsigned)Record[2], (
unsigned)
Record[3]});
3907 return error(
"Invalid ptrauth record");
3909 V = BitcodeConstant::create(
3910 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3911 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2],
3912 (
unsigned)
Record[3], (unsigned)Record[4]});
3917 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3924Error BitcodeReader::parseUseLists() {
3929 SmallVector<uint64_t, 64>
Record;
3935 BitstreamEntry
Entry = MaybeEntry.
get();
3937 switch (
Entry.Kind) {
3940 return error(
"Malformed block");
3954 switch (MaybeRecord.
get()) {
3962 if (RecordLength < 3)
3964 return error(
"Invalid uselist record");
3965 unsigned ID =
Record.pop_back_val();
3969 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3970 V = FunctionBBs[
ID];
3974 if (!
V->hasUseList())
3977 unsigned NumUses = 0;
3978 SmallDenseMap<const Use *, unsigned, 16> Order;
3979 for (
const Use &U :
V->materialized_uses()) {
3980 if (++NumUses >
Record.size())
3982 Order[&
U] =
Record[NumUses - 1];
3989 V->sortUseList([&](
const Use &L,
const Use &R) {
4000Error BitcodeReader::rememberAndSkipMetadata() {
4003 DeferredMetadataInfo.push_back(CurBit);
4011Error BitcodeReader::materializeMetadata() {
4012 for (uint64_t BitPos : DeferredMetadataInfo) {
4016 if (
Error Err = MDLoader->parseModuleMetadata())
4025 NamedMDNode *LinkerOpts =
4027 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
4034 DeferredMetadataInfo.clear();
4038void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
4042Error BitcodeReader::rememberAndSkipFunctionBody() {
4044 if (FunctionsWithBodies.empty())
4045 return error(
"Insufficient function protos");
4047 Function *Fn = FunctionsWithBodies.back();
4048 FunctionsWithBodies.pop_back();
4053 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
4054 "Mismatch between VST and scanned function offsets");
4055 DeferredFunctionInfo[Fn] = CurBit;
4063Error BitcodeReader::globalCleanup() {
4065 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4067 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
4068 return error(
"Malformed global initializer set");
4072 for (Function &
F : *TheModule) {
4073 MDLoader->upgradeDebugIntrinsics(
F);
4077 !SkipDebugIntrinsicUpgrade))
4078 UpgradedIntrinsics[&
F] = NewFn;
4084 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4085 for (GlobalVariable &GV : TheModule->globals())
4087 UpgradedVariables.emplace_back(&GV, Upgraded);
4088 for (
auto &Pair : UpgradedVariables) {
4089 Pair.first->eraseFromParent();
4090 TheModule->insertGlobalVariable(Pair.second);
4093 for (
size_t ValueID = 0; ValueID < GUIDList.size(); ValueID++) {
4094 const auto GUID = GUIDList[ValueID];
4098 const auto *
Value = ValueList[ValueID];
4099 TheModule->insertGUID(
Value, GUID);
4104 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4105 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4113Error BitcodeReader::rememberAndSkipFunctionBodies() {
4118 return error(
"Could not find function in stream");
4120 if (!SeenFirstFunctionBody)
4121 return error(
"Trying to materialize functions before seeing function blocks");
4125 assert(SeenValueSymbolTable);
4128 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4131 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4133 switch (
Entry.Kind) {
4135 return error(
"Expect SubBlock");
4139 return error(
"Expect function block");
4141 if (
Error Err = rememberAndSkipFunctionBody())
4150Error BitcodeReaderBase::readBlockInfo() {
4151 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4153 if (!MaybeNewBlockInfo)
4155 std::optional<BitstreamBlockInfo> NewBlockInfo =
4156 std::move(MaybeNewBlockInfo.
get());
4158 return error(
"Malformed block");
4159 BlockInfo = std::move(*NewBlockInfo);
4163Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4167 std::tie(Name, Record) = readNameFromStrtab(Record);
4170 return error(
"Invalid comdat record");
4172 std::string OldFormatName;
4175 return error(
"Invalid comdat record");
4176 unsigned ComdatNameSize =
Record[1];
4177 if (ComdatNameSize >
Record.size() - 2)
4178 return error(
"Comdat name size too large");
4179 OldFormatName.reserve(ComdatNameSize);
4180 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4181 OldFormatName += (
char)
Record[2 + i];
4182 Name = OldFormatName;
4184 Comdat *
C = TheModule->getOrInsertComdat(Name);
4185 C->setSelectionKind(SK);
4186 ComdatList.push_back(
C);
4200 Meta.NoAddress =
true;
4202 Meta.NoHWAddress =
true;
4206 Meta.IsDynInit =
true;
4210Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4218 std::tie(Name, Record) = readNameFromStrtab(Record);
4221 return error(
"Invalid global variable record");
4222 unsigned TyID =
Record[0];
4223 Type *Ty = getTypeByID(TyID);
4225 return error(
"Invalid global variable record");
4227 bool explicitType =
Record[1] & 2;
4233 return error(
"Invalid type for value");
4235 TyID = getContainedTypeID(TyID);
4236 Ty = getTypeByID(TyID);
4238 return error(
"Missing element type for old-style global");
4241 uint64_t RawLinkage =
Record[3];
4243 MaybeAlign Alignment;
4244 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4248 if (Record[5] - 1 >= SectionTable.size())
4249 return error(
"Invalid ID");
4258 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4266 bool ExternallyInitialized =
false;
4268 ExternallyInitialized =
Record[9];
4270 GlobalVariable *NewGV =
4280 if (
Record.size() > 10) {
4292 if (
unsigned InitID = Record[2])
4293 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4295 if (
Record.size() > 11) {
4296 if (
unsigned ComdatID = Record[11]) {
4297 if (ComdatID > ComdatList.size())
4298 return error(
"Invalid global variable comdat ID");
4299 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4302 ImplicitComdatObjects.
insert(NewGV);
4305 if (
Record.size() > 12) {
4310 if (
Record.size() > 13) {
4319 if (
Record.size() > 16 && Record[16]) {
4320 llvm::GlobalValue::SanitizerMetadata
Meta =
4325 if (
Record.size() > 17 && Record[17]) {
4329 return error(
"Invalid global variable code model");
4335void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4336 if (ValueTypeCallback) {
4337 (*ValueTypeCallback)(
4338 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4339 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4343Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4349 std::tie(Name, Record) = readNameFromStrtab(Record);
4352 return error(
"Invalid function record");
4353 unsigned FTyID =
Record[0];
4354 Type *FTy = getTypeByID(FTyID);
4356 return error(
"Invalid function record");
4358 FTyID = getContainedTypeID(FTyID, 0);
4359 FTy = getTypeByID(FTyID);
4361 return error(
"Missing element type for old-style function");
4365 return error(
"Invalid type for value");
4366 auto CC =
static_cast<CallingConv::ID
>(
Record[1]);
4367 if (CC & ~CallingConv::MaxID)
4368 return error(
"Invalid calling convention ID");
4370 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4376 AddrSpace, Name, TheModule);
4379 "Incorrect fully specified type provided for function");
4380 FunctionTypeIDs[
Func] = FTyID;
4382 Func->setCallingConv(CC);
4383 bool isProto =
Record[2];
4384 uint64_t RawLinkage =
Record[3];
4387 callValueTypeCallback(Func, FTyID);
4392 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4393 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4394 Attribute::InAlloca}) {
4395 if (!
Func->hasParamAttribute(i, Kind))
4398 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4401 Func->removeParamAttr(i, Kind);
4403 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4404 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4406 return error(
"Missing param element type for attribute upgrade");
4410 case Attribute::ByVal:
4411 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4413 case Attribute::StructRet:
4414 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4416 case Attribute::InAlloca:
4417 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4423 Func->addParamAttr(i, NewAttr);
4427 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4428 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4429 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4430 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4432 return error(
"Missing param element type for x86_intrcc upgrade");
4434 Func->addParamAttr(0, NewAttr);
4437 MaybeAlign Alignment;
4438 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4441 Func->setAlignment(*Alignment);
4443 if (Record[6] - 1 >= SectionTable.size())
4444 return error(
"Invalid ID");
4445 Func->setSection(SectionTable[Record[6] - 1]);
4449 if (!
Func->hasLocalLinkage())
4451 if (
Record.size() > 8 && Record[8]) {
4452 if (Record[8] - 1 >= GCTable.size())
4453 return error(
"Invalid ID");
4454 Func->setGC(GCTable[Record[8] - 1]);
4459 Func->setUnnamedAddr(UnnamedAddr);
4461 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4463 OperandInfo.Prologue =
Record[10];
4465 if (
Record.size() > 11) {
4467 if (!
Func->hasLocalLinkage()) {
4474 if (
Record.size() > 12) {
4475 if (
unsigned ComdatID = Record[12]) {
4476 if (ComdatID > ComdatList.size())
4477 return error(
"Invalid function comdat ID");
4478 Func->setComdat(ComdatList[ComdatID - 1]);
4481 ImplicitComdatObjects.
insert(Func);
4485 OperandInfo.Prefix =
Record[13];
4488 OperandInfo.PersonalityFn =
Record[14];
4490 if (
Record.size() > 15) {
4500 Record[17] + Record[18] <= Strtab.
size()) {
4501 Func->setPartition(StringRef(Strtab.
data() + Record[17], Record[18]));
4504 if (
Record.size() > 19) {
4505 MaybeAlign PrefAlignment;
4506 if (
Error Err = parseAlignmentValue(Record[19], PrefAlignment))
4508 Func->setPreferredAlignment(PrefAlignment);
4511 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4513 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4514 FunctionOperands.push_back(OperandInfo);
4519 Func->setIsMaterializable(
true);
4520 FunctionsWithBodies.push_back(Func);
4521 DeferredFunctionInfo[
Func] = 0;
4526Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4527 unsigned BitCode, ArrayRef<uint64_t> Record) {
4537 std::tie(Name, Record) = readNameFromStrtab(Record);
4540 if (
Record.size() < (3 + (
unsigned)NewRecord))
4541 return error(
"Invalid global indirect symbol record");
4546 return error(
"Invalid global indirect symbol record");
4552 return error(
"Invalid type for value");
4553 AddrSpace = PTy->getAddressSpace();
4555 Ty = getTypeByID(
TypeID);
4557 return error(
"Missing element type for old-style indirect symbol");
4559 AddrSpace =
Record[OpNum++];
4562 auto Val =
Record[OpNum++];
4571 nullptr, TheModule);
4575 if (OpNum !=
Record.size()) {
4576 auto VisInd = OpNum++;
4582 if (OpNum !=
Record.size()) {
4583 auto S =
Record[OpNum++];
4590 if (OpNum !=
Record.size())
4592 if (OpNum !=
Record.size())
4595 if (OpNum !=
Record.size())
4600 if (OpNum + 1 <
Record.size()) {
4602 if (Record[OpNum] + Record[OpNum + 1] > Strtab.
size())
4603 return error(
"Malformed partition, too large.");
4605 StringRef(Strtab.
data() + Record[OpNum], Record[OpNum + 1]));
4609 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4613Error BitcodeReader::parseModule(uint64_t ResumeBit,
4614 bool ShouldLazyLoadMetadata,
4615 ParserCallbacks Callbacks) {
4616 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4623 SmallVector<uint64_t, 64>
Record;
4627 bool ResolvedDataLayout =
false;
4632 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4635 Module::GlobalAsmProperties Props;
4637 auto ResolveDataLayout = [&]() ->
Error {
4638 if (ResolvedDataLayout)
4642 ResolvedDataLayout =
true;
4646 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4650 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4651 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4652 TentativeDataLayoutStr = *LayoutOverride;
4660 TheModule->setDataLayout(MaybeDL.
get());
4666 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4669 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4671 switch (
Entry.Kind) {
4673 return error(
"Malformed block");
4675 if (
Error Err = ResolveDataLayout())
4677 return globalCleanup();
4686 if (
Error Err = readBlockInfo())
4690 if (
Error Err = parseAttributeBlock())
4694 if (
Error Err = parseAttributeGroupBlock())
4698 if (
Error Err = parseTypeTable())
4702 if (!SeenValueSymbolTable) {
4708 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4709 if (
Error Err = parseValueSymbolTable())
4711 SeenValueSymbolTable =
true;
4721 if (
Error Err = parseConstants())
4723 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4727 if (ShouldLazyLoadMetadata) {
4728 if (
Error Err = rememberAndSkipMetadata())
4732 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4733 if (
Error Err = MDLoader->parseModuleMetadata())
4737 if (
Error Err = MDLoader->parseMetadataKinds())
4741 if (
Error Err = ResolveDataLayout())
4746 if (!SeenFirstFunctionBody) {
4747 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4748 if (
Error Err = globalCleanup())
4750 SeenFirstFunctionBody =
true;
4753 if (VSTOffset > 0) {
4757 if (!SeenValueSymbolTable) {
4758 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4760 SeenValueSymbolTable =
true;
4782 if (
Error Err = rememberAndSkipFunctionBody())
4789 if (SeenValueSymbolTable) {
4793 return globalCleanup();
4797 if (
Error Err = parseUseLists())
4801 if (
Error Err = parseOperandBundleTags())
4805 if (
Error Err = parseSyncScopeNames())
4817 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
4820 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4823 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4826 UseRelativeIDs = *VersionOrErr >= 1;
4830 if (ResolvedDataLayout)
4831 return error(
"target triple too late in module");
4834 return error(
"Invalid triple record");
4835 TheModule->setTargetTriple(Triple(std::move(S)));
4839 if (ResolvedDataLayout)
4840 return error(
"datalayout too late in module");
4842 return error(
"Invalid data layout record");
4848 return error(
"Invalid module asm record");
4849 size_t SepPos = Str.find(
'\0');
4850 if (SepPos == std::string::npos)
4851 return error(
"Invalid module asm record");
4852 if (!Props.
set(StringRef(Str.data(), SepPos), Str.substr(SepPos + 1)))
4853 return error(
"Unknown module asm property");
4859 return error(
"Invalid asm record");
4860 TheModule->appendModuleInlineAsm(Module::GlobalAsmFragment(S, Props));
4868 return error(
"Invalid deplib record");
4875 return error(
"Invalid section name record");
4876 SectionTable.push_back(S);
4882 return error(
"Invalid gcname record");
4883 GCTable.push_back(S);
4887 if (
Error Err = parseComdatRecord(Record))
4896 if (
Error Err = parseGlobalVarRecord(Record))
4900 if (
Error Err = ResolveDataLayout())
4902 if (
Error Err = parseFunctionRecord(Record))
4908 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4914 return error(
"Invalid vstoffset record");
4918 VSTOffset =
Record[0] - 1;
4923 GUIDList.reserve(GUIDList.size() +
Record.size() / 2);
4924 for (
size_t i = 0; i <
Record.size(); i += 2)
4925 GUIDList.push_back(Record[i] << 32 | Record[i + 1]);
4931 return error(
"Invalid source filename record");
4932 TheModule->setSourceFileName(
ValueName);
4938 this->ValueTypeCallback = std::nullopt;
4942Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4944 ParserCallbacks Callbacks) {
4946 MetadataLoaderCallbacks MDCallbacks;
4947 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4949 return getContainedTypeID(
I, J);
4952 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4954 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4957Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4959 return error(
"Load/Store operand is not a pointer type");
4960 if (!PointerType::isLoadableOrStorableType(ValType))
4961 return error(
"Cannot load/store from pointer");
4965Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4966 ArrayRef<unsigned> ArgTyIDs) {
4968 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4969 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4970 Attribute::InAlloca}) {
4971 if (!
Attrs.hasParamAttr(i, Kind) ||
4972 Attrs.getParamAttr(i, Kind).getValueAsType())
4975 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4977 return error(
"Missing element type for typed attribute upgrade");
4981 case Attribute::ByVal:
4982 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4984 case Attribute::StructRet:
4985 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4987 case Attribute::InAlloca:
4988 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
5001 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
5005 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
5006 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
5008 return error(
"Missing element type for inline asm upgrade");
5011 Attribute::get(
Context, Attribute::ElementType, ElemTy));
5019 case Intrinsic::preserve_array_access_index:
5020 case Intrinsic::preserve_struct_access_index:
5021 case Intrinsic::aarch64_ldaxr:
5022 case Intrinsic::aarch64_ldxr:
5023 case Intrinsic::aarch64_stlxr:
5024 case Intrinsic::aarch64_stxr:
5025 case Intrinsic::arm_ldaex:
5026 case Intrinsic::arm_ldrex:
5027 case Intrinsic::arm_stlex:
5028 case Intrinsic::arm_strex: {
5031 case Intrinsic::aarch64_stlxr:
5032 case Intrinsic::aarch64_stxr:
5033 case Intrinsic::arm_stlex:
5034 case Intrinsic::arm_strex:
5041 if (!
Attrs.getParamElementType(ArgNo)) {
5042 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
5044 return error(
"Missing element type for elementtype upgrade");
5059Error BitcodeReader::parseFunctionBody(Function *
F) {
5064 if (MDLoader->hasFwdRefs())
5065 return error(
"Invalid function metadata: incoming forward references");
5067 InstructionList.
clear();
5068 unsigned ModuleValueListSize = ValueList.
size();
5069 unsigned ModuleMDLoaderSize = MDLoader->size();
5073 unsigned FTyID = FunctionTypeIDs[
F];
5074 for (Argument &
I :
F->args()) {
5075 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
5076 assert(
I.getType() == getTypeByID(ArgTyID) &&
5077 "Incorrect fully specified type for Function Argument");
5081 unsigned NextValueNo = ValueList.
size();
5083 unsigned CurBBNo = 0;
5088 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
5092 auto getLastInstruction = [&]() -> Instruction * {
5093 if (CurBB && !CurBB->
empty())
5094 return &CurBB->
back();
5095 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
5096 !FunctionBBs[CurBBNo - 1]->
empty())
5097 return &FunctionBBs[CurBBNo - 1]->back();
5101 std::vector<OperandBundleDef> OperandBundles;
5104 SmallVector<uint64_t, 64>
Record;
5107 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
5110 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
5112 switch (
Entry.Kind) {
5114 return error(
"Malformed block");
5116 goto OutOfRecordLoop;
5125 if (
Error Err = parseConstants())
5127 NextValueNo = ValueList.
size();
5130 if (
Error Err = parseValueSymbolTable())
5134 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5138 assert(DeferredMetadataInfo.empty() &&
5139 "Must read all module-level metadata before function-level");
5140 if (
Error Err = MDLoader->parseFunctionMetadata())
5144 if (
Error Err = parseUseLists())
5158 unsigned ResTypeID = InvalidTypeID;
5159 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
5162 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5164 return error(
"Invalid value");
5166 if (
Record.empty() || Record[0] == 0)
5167 return error(
"Invalid declareblocks record");
5169 FunctionBBs.resize(Record[0]);
5172 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5173 if (BBFRI == BasicBlockFwdRefs.
end()) {
5174 for (BasicBlock *&BB : FunctionBBs)
5177 auto &BBRefs = BBFRI->second;
5179 if (BBRefs.size() > FunctionBBs.size())
5180 return error(
"Invalid ID");
5181 assert(!BBRefs.empty() &&
"Unexpected empty array");
5182 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5183 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5185 if (
I < RE && BBRefs[
I]) {
5186 BBRefs[
I]->insertInto(
F);
5187 FunctionBBs[
I] = BBRefs[
I];
5193 BasicBlockFwdRefs.
erase(BBFRI);
5196 CurBB = FunctionBBs[0];
5203 return error(
"Invalid blockaddr users record");
5217 for (uint64_t ValID : Record)
5219 BackwardRefFunctions.push_back(
F);
5221 return error(
"Invalid blockaddr users record");
5228 I = getLastInstruction();
5231 return error(
"Invalid debug_loc_again record");
5232 I->setDebugLoc(LastLoc);
5237 I = getLastInstruction();
5239 return error(
"Invalid debug loc record");
5244 uint64_t AtomGroup =
Record.size() == 7 ?
Record[5] : 0;
5247 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5250 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5252 return error(
"Invalid debug loc record");
5256 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5258 return error(
"Invalid debug loc record");
5261 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5262 isImplicitCode, AtomGroup, AtomRank);
5263 I->setDebugLoc(LastLoc);
5271 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5273 return error(
"Invalid unary operator record");
5277 return error(
"Invalid unary operator record");
5281 if (OpNum <
Record.size()) {
5285 I->setFastMathFlags(FMF);
5294 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5298 return error(
"Invalid binary operator record");
5302 return error(
"Invalid binary operator record");
5306 if (OpNum <
Record.size()) {
5307 if (
Opc == Instruction::Add ||
5308 Opc == Instruction::Sub ||
5309 Opc == Instruction::Mul ||
5310 Opc == Instruction::Shl) {
5315 }
else if (
Opc == Instruction::SDiv ||
5316 Opc == Instruction::UDiv ||
5317 Opc == Instruction::LShr ||
5318 Opc == Instruction::AShr) {
5321 }
else if (
Opc == Instruction::Or) {
5327 I->setFastMathFlags(FMF);
5336 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5337 OpNum + 1 >
Record.size())
5338 return error(
"Invalid cast record");
5340 ResTypeID =
Record[OpNum++];
5341 Type *ResTy = getTypeByID(ResTypeID);
5344 if (
Opc == -1 || !ResTy)
5345 return error(
"Invalid cast record");
5350 assert(CurBB &&
"No current BB?");
5356 return error(
"Invalid cast");
5360 if (OpNum <
Record.size()) {
5361 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5364 }
else if (
Opc == Instruction::Trunc) {
5376 I->setFastMathFlags(FMF);
5395 Ty = getTypeByID(TyID);
5399 TyID = InvalidTypeID;
5404 unsigned BasePtrTypeID;
5405 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5407 return error(
"Invalid gep record");
5410 TyID = getContainedTypeID(BasePtrTypeID);
5411 if (
BasePtr->getType()->isVectorTy())
5412 TyID = getContainedTypeID(TyID);
5413 Ty = getTypeByID(TyID);
5416 SmallVector<Value*, 16> GEPIdx;
5417 while (OpNum !=
Record.size()) {
5420 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5421 return error(
"Invalid gep record");
5432 unsigned SubType = 0;
5433 if (GTI.isStruct()) {
5435 Idx->getType()->isVectorTy()
5437 :
cast<ConstantInt>(Idx);
5440 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5447 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5448 if (
I->getType()->isVectorTy())
5449 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5452 GEP->setNoWrapFlags(NW);
5461 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5462 return error(
"Invalid extractvalue record");
5465 unsigned RecSize =
Record.size();
5466 if (OpNum == RecSize)
5467 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5469 SmallVector<unsigned, 4> EXTRACTVALIdx;
5470 ResTypeID = AggTypeID;
5471 for (; OpNum != RecSize; ++OpNum) {
5476 if (!IsStruct && !IsArray)
5477 return error(
"EXTRACTVAL: Invalid type");
5478 if ((
unsigned)Index != Index)
5479 return error(
"Invalid value");
5481 return error(
"EXTRACTVAL: Invalid struct index");
5483 return error(
"EXTRACTVAL: Invalid array index");
5484 EXTRACTVALIdx.
push_back((
unsigned)Index);
5488 ResTypeID = getContainedTypeID(ResTypeID, Index);
5491 ResTypeID = getContainedTypeID(ResTypeID);
5505 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5506 return error(
"Invalid insertvalue record");
5509 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5510 return error(
"Invalid insertvalue record");
5512 unsigned RecSize =
Record.size();
5513 if (OpNum == RecSize)
5514 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5516 SmallVector<unsigned, 4> INSERTVALIdx;
5518 for (; OpNum != RecSize; ++OpNum) {
5523 if (!IsStruct && !IsArray)
5524 return error(
"INSERTVAL: Invalid type");
5525 if ((
unsigned)Index != Index)
5526 return error(
"Invalid value");
5528 return error(
"INSERTVAL: Invalid struct index");
5530 return error(
"INSERTVAL: Invalid array index");
5532 INSERTVALIdx.
push_back((
unsigned)Index);
5540 return error(
"Inserted value type doesn't match aggregate type");
5543 ResTypeID = AggTypeID;
5555 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5557 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5559 popValue(Record, OpNum, NextValueNo, CondType,
5560 getVirtualTypeID(CondType),
Cond, CurBB))
5561 return error(
"Invalid select record");
5574 unsigned ValTypeID, CondTypeID;
5575 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5577 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5579 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5580 return error(
"Invalid vector select record");
5583 if (VectorType* vector_type =
5586 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5587 return error(
"Invalid type for value");
5591 return error(
"Invalid type for value");
5595 ResTypeID = ValTypeID;
5600 I->setFastMathFlags(FMF);
5608 unsigned VecTypeID, IdxTypeID;
5609 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5610 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5611 return error(
"Invalid extractelement record");
5613 return error(
"Invalid type for value");
5615 ResTypeID = getContainedTypeID(VecTypeID);
5622 Value *Vec, *Elt, *Idx;
5623 unsigned VecTypeID, IdxTypeID;
5624 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5625 return error(
"Invalid insertelement record");
5627 return error(
"Invalid type for value");
5628 if (popValue(Record, OpNum, NextValueNo,
5630 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5631 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5632 return error(
"Invalid insert element record");
5634 ResTypeID = VecTypeID;
5642 unsigned Vec1TypeID;
5643 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5645 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5647 return error(
"Invalid shufflevector record");
5649 unsigned MaskTypeID;
5650 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5651 return error(
"Invalid shufflevector record");
5653 return error(
"Invalid type for value");
5655 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5657 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5672 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5673 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5675 return error(
"Invalid comparison record");
5677 if (OpNum >=
Record.size())
5679 "Invalid record: operand number exceeded available operands");
5684 if (IsFP &&
Record.size() > OpNum+1)
5689 return error(
"Invalid fcmp predicate");
5690 I =
new FCmpInst(PredVal,
LHS,
RHS);
5693 return error(
"Invalid icmp predicate");
5694 I =
new ICmpInst(PredVal,
LHS,
RHS);
5695 if (
Record.size() > OpNum + 1 &&
5700 if (OpNum + 1 !=
Record.size())
5701 return error(
"Invalid comparison record");
5703 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5705 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5708 I->setFastMathFlags(FMF);
5725 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5726 return error(
"Invalid ret record");
5727 if (OpNum !=
Record.size())
5728 return error(
"Invalid ret record");
5736 return error(
"Invalid br record");
5737 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5739 return error(
"Invalid br record");
5741 if (
Record.size() == 1) {
5746 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5749 getVirtualTypeID(CondType), CurBB);
5750 if (!FalseDest || !
Cond)
5751 return error(
"Invalid br record");
5759 return error(
"Invalid cleanupret record");
5762 Value *CleanupPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5763 getVirtualTypeID(TokenTy), CurBB);
5765 return error(
"Invalid cleanupret record");
5767 if (
Record.size() == 2) {
5768 UnwindDest = getBasicBlock(Record[Idx++]);
5770 return error(
"Invalid cleanupret record");
5779 return error(
"Invalid catchret record");
5782 Value *CatchPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5783 getVirtualTypeID(TokenTy), CurBB);
5785 return error(
"Invalid catchret record");
5786 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5788 return error(
"Invalid catchret record");
5797 return error(
"Invalid catchswitch record");
5802 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5803 getVirtualTypeID(TokenTy), CurBB);
5805 return error(
"Invalid catchswitch record");
5807 unsigned NumHandlers =
Record[Idx++];
5810 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5811 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5813 return error(
"Invalid catchswitch record");
5818 if (Idx + 1 ==
Record.size()) {
5819 UnwindDest = getBasicBlock(Record[Idx++]);
5821 return error(
"Invalid catchswitch record");
5824 if (
Record.size() != Idx)
5825 return error(
"Invalid catchswitch record");
5829 for (BasicBlock *Handler : Handlers)
5830 CatchSwitch->addHandler(Handler);
5832 ResTypeID = getVirtualTypeID(
I->getType());
5840 return error(
"Invalid catchpad/cleanuppad record");
5845 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5846 getVirtualTypeID(TokenTy), CurBB);
5848 return error(
"Invalid catchpad/cleanuppad record");
5850 unsigned NumArgOperands =
Record[Idx++];
5852 SmallVector<Value *, 2>
Args;
5853 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5856 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5857 return error(
"Invalid catchpad/cleanuppad record");
5858 Args.push_back(Val);
5861 if (
Record.size() != Idx)
5862 return error(
"Invalid catchpad/cleanuppad record");
5868 ResTypeID = getVirtualTypeID(
I->getType());
5874 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5880 unsigned OpTyID =
Record[1];
5881 Type *OpTy = getTypeByID(OpTyID);
5887 return error(
"Invalid switch record");
5889 unsigned NumCases =
Record[4];
5894 unsigned CurIdx = 5;
5895 for (
unsigned i = 0; i != NumCases; ++i) {
5897 unsigned NumItems =
Record[CurIdx++];
5898 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5899 bool isSingleNumber =
Record[CurIdx++];
5902 unsigned ActiveWords = 1;
5903 if (ValueBitWidth > 64)
5904 ActiveWords =
Record[CurIdx++];
5907 CurIdx += ActiveWords;
5909 if (!isSingleNumber) {
5911 if (ValueBitWidth > 64)
5912 ActiveWords =
Record[CurIdx++];
5915 CurIdx += ActiveWords;
5926 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5927 for (ConstantInt *Cst : CaseVals)
5928 SI->addCase(Cst, DestBB);
5937 return error(
"Invalid switch record");
5938 unsigned OpTyID =
Record[0];
5939 Type *OpTy = getTypeByID(OpTyID);
5943 return error(
"Invalid switch record");
5944 unsigned NumCases = (
Record.size()-3)/2;
5947 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5949 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
5950 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
5951 if (!CaseVal || !DestBB) {
5953 return error(
"Invalid switch record");
5955 SI->addCase(CaseVal, DestBB);
5962 return error(
"Invalid indirectbr record");
5963 unsigned OpTyID =
Record[0];
5964 Type *OpTy = getTypeByID(OpTyID);
5967 return error(
"Invalid indirectbr record");
5968 unsigned NumDests =
Record.size()-2;
5971 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5972 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
5976 return error(
"Invalid indirectbr record");
5986 return error(
"Invalid invoke record");
5989 unsigned CCInfo =
Record[OpNum++];
5990 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
5991 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
5993 unsigned FTyID = InvalidTypeID;
5994 FunctionType *FTy =
nullptr;
5995 if ((CCInfo >> 13) & 1) {
5999 return error(
"Explicit invoke type is not a function type");
6003 unsigned CalleeTypeID;
6004 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6006 return error(
"Invalid invoke record");
6010 return error(
"Callee is not a pointer");
6012 FTyID = getContainedTypeID(CalleeTypeID);
6015 return error(
"Callee is not of pointer to function type");
6017 if (
Record.size() < FTy->getNumParams() + OpNum)
6018 return error(
"Insufficient operands to call");
6020 SmallVector<Value*, 16>
Ops;
6021 SmallVector<unsigned, 16> ArgTyIDs;
6022 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6023 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6024 Ops.push_back(
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6028 return error(
"Invalid invoke record");
6031 if (!FTy->isVarArg()) {
6032 if (
Record.size() != OpNum)
6033 return error(
"Invalid invoke record");
6036 while (OpNum !=
Record.size()) {
6039 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6040 return error(
"Invalid invoke record");
6047 if (!OperandBundles.empty())
6052 ResTypeID = getContainedTypeID(FTyID);
6053 OperandBundles.clear();
6056 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
6067 Value *Val =
nullptr;
6069 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
6070 return error(
"Invalid resume record");
6079 unsigned CCInfo =
Record[OpNum++];
6081 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
6082 unsigned NumIndirectDests =
Record[OpNum++];
6083 SmallVector<BasicBlock *, 16> IndirectDests;
6084 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
6085 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
6087 unsigned FTyID = InvalidTypeID;
6088 FunctionType *FTy =
nullptr;
6093 return error(
"Explicit call type is not a function type");
6097 unsigned CalleeTypeID;
6098 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6100 return error(
"Invalid callbr record");
6104 return error(
"Callee is not a pointer type");
6106 FTyID = getContainedTypeID(CalleeTypeID);
6109 return error(
"Callee is not of pointer to function type");
6111 if (
Record.size() < FTy->getNumParams() + OpNum)
6112 return error(
"Insufficient operands to call");
6114 SmallVector<Value*, 16>
Args;
6115 SmallVector<unsigned, 16> ArgTyIDs;
6117 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6119 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6120 if (FTy->getParamType(i)->isLabelTy())
6121 Arg = getBasicBlock(Record[OpNum]);
6123 Arg =
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6126 return error(
"Invalid callbr record");
6127 Args.push_back(Arg);
6132 if (!FTy->isVarArg()) {
6133 if (OpNum !=
Record.size())
6134 return error(
"Invalid callbr record");
6136 while (OpNum !=
Record.size()) {
6139 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6140 return error(
"Invalid callbr record");
6147 if (!OperandBundles.empty())
6152 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6155 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6160 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6161 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6162 unsigned LabelNo = ArgNo - FirstBlockArg;
6164 if (!BA || BA->getFunction() !=
F ||
6165 LabelNo > IndirectDests.
size() ||
6166 BA->getBasicBlock() != IndirectDests[LabelNo])
6167 return error(
"callbr argument does not match indirect dest");
6172 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6176 for (
Value *Arg : Args)
6179 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6182 std::string Constraints =
IA->getConstraintString().str();
6185 for (
const auto &CI : ConstraintInfo) {
6187 if (ArgNo >= FirstBlockArg)
6188 Constraints.insert(Pos,
"!");
6193 Pos = Constraints.find(
',', Pos);
6194 if (Pos == std::string::npos)
6200 IA->hasSideEffects(),
IA->isAlignStack(),
6201 IA->getDialect(),
IA->canThrow());
6207 ResTypeID = getContainedTypeID(FTyID);
6208 OperandBundles.clear();
6225 return error(
"Invalid phi record");
6227 unsigned TyID =
Record[0];
6228 Type *Ty = getTypeByID(TyID);
6230 return error(
"Invalid phi record");
6235 size_t NumArgs = (
Record.size() - 1) / 2;
6239 return error(
"Invalid phi record");
6243 SmallDenseMap<BasicBlock *, Value *>
Args;
6244 for (
unsigned i = 0; i != NumArgs; i++) {
6245 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6248 return error(
"Invalid phi BB");
6255 auto It =
Args.find(BB);
6257 if (It !=
Args.end()) {
6271 if (!PhiConstExprBB)
6273 EdgeBB = PhiConstExprBB;
6281 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6283 V =
getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6287 return error(
"Invalid phi record");
6290 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6291 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6292 PhiConstExprBB =
nullptr;
6295 Args.insert({BB,
V});
6301 if (
Record.size() % 2 == 0) {
6305 I->setFastMathFlags(FMF);
6317 return error(
"Invalid landingpad record");
6321 return error(
"Invalid landingpad record");
6323 ResTypeID =
Record[Idx++];
6324 Type *Ty = getTypeByID(ResTypeID);
6326 return error(
"Invalid landingpad record");
6328 Value *PersFn =
nullptr;
6329 unsigned PersFnTypeID;
6330 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6332 return error(
"Invalid landingpad record");
6334 if (!
F->hasPersonalityFn())
6337 return error(
"Personality function mismatch");
6340 bool IsCleanup = !!
Record[Idx++];
6341 unsigned NumClauses =
Record[Idx++];
6344 for (
unsigned J = 0; J != NumClauses; ++J) {
6350 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6353 return error(
"Invalid landingpad record");
6358 "Catch clause has a invalid type!");
6361 "Filter clause has invalid type!");
6372 return error(
"Invalid alloca record");
6373 using APV = AllocaPackedValues;
6374 const uint64_t Rec =
Record[3];
6377 unsigned TyID =
Record[0];
6378 Type *Ty = getTypeByID(TyID);
6380 TyID = getContainedTypeID(TyID);
6381 Ty = getTypeByID(TyID);
6383 return error(
"Missing element type for old-style alloca");
6385 unsigned OpTyID =
Record[1];
6386 Type *OpTy = getTypeByID(OpTyID);
6387 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6392 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6396 return error(
"Invalid alloca record");
6398 const DataLayout &
DL = TheModule->getDataLayout();
6399 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6401 SmallPtrSet<Type *, 4> Visited;
6402 if (!Align && !Ty->
isSized(&Visited))
6403 return error(
"alloca of unsized type");
6405 Align =
DL.getPrefTypeAlign(Ty);
6407 if (!
Size->getType()->isIntegerTy())
6408 return error(
"alloca element count must have integer type");
6410 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6414 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6422 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6423 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6424 return error(
"Invalid load record");
6427 return error(
"Load operand is not a pointer type");
6430 if (OpNum + 3 ==
Record.size()) {
6431 ResTypeID =
Record[OpNum++];
6432 Ty = getTypeByID(ResTypeID);
6434 ResTypeID = getContainedTypeID(OpTypeID);
6435 Ty = getTypeByID(ResTypeID);
6439 return error(
"Missing load type");
6441 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6445 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6447 SmallPtrSet<Type *, 4> Visited;
6448 if (!Align && !Ty->
isSized(&Visited))
6449 return error(
"load of unsized type");
6451 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6452 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6461 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6462 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size() &&
6463 OpNum + 6 !=
Record.size()))
6464 return error(
"Invalid load atomic record");
6467 return error(
"Load operand is not a pointer type");
6470 if (
Record.size() >= OpNum + 5) {
6471 ResTypeID =
Record[OpNum++];
6472 Ty = getTypeByID(ResTypeID);
6474 ResTypeID = getContainedTypeID(OpTypeID);
6475 Ty = getTypeByID(ResTypeID);
6479 return error(
"Missing atomic load type");
6481 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6485 if (Ordering == AtomicOrdering::NotAtomic ||
6486 Ordering == AtomicOrdering::Release ||
6487 Ordering == AtomicOrdering::AcquireRelease)
6488 return error(
"Invalid load atomic record");
6489 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6490 return error(
"Invalid load atomic record");
6491 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6492 bool IsElementwise =
Record.size() > OpNum + 4 &&
Record[OpNum + 4];
6495 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6498 return error(
"Alignment missing from atomic load");
6501 LoadStoreInstProperties{
Record[OpNum + 1] != 0, *
Align,
6511 unsigned PtrTypeID, ValTypeID;
6512 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6513 return error(
"Invalid store record");
6516 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6517 return error(
"Invalid store record");
6519 ValTypeID = getContainedTypeID(PtrTypeID);
6520 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6521 ValTypeID, Val, CurBB))
6522 return error(
"Invalid store record");
6525 if (OpNum + 2 !=
Record.size())
6526 return error(
"Invalid store record");
6531 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6533 SmallPtrSet<Type *, 4> Visited;
6535 return error(
"store of unsized type");
6537 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6538 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6547 unsigned PtrTypeID, ValTypeID;
6548 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6550 return error(
"Invalid store atomic record");
6552 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6553 return error(
"Invalid store atomic record");
6555 ValTypeID = getContainedTypeID(PtrTypeID);
6556 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6557 ValTypeID, Val, CurBB))
6558 return error(
"Invalid store atomic record");
6561 if (OpNum + 4 !=
Record.size())
6562 return error(
"Invalid store atomic record");
6567 if (Ordering == AtomicOrdering::NotAtomic ||
6568 Ordering == AtomicOrdering::Acquire ||
6569 Ordering == AtomicOrdering::AcquireRelease)
6570 return error(
"Invalid store atomic record");
6571 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6572 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6573 return error(
"Invalid store atomic record");
6576 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6579 return error(
"Alignment missing from atomic store");
6580 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align, Ordering, SSID);
6587 const size_t NumRecords =
Record.size();
6589 Value *Ptr =
nullptr;
6591 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6592 return error(
"Invalid cmpxchg record");
6595 return error(
"Cmpxchg operand is not a pointer type");
6598 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6599 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6600 CmpTypeID, Cmp, CurBB))
6601 return error(
"Invalid cmpxchg record");
6604 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6606 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6607 return error(
"Invalid cmpxchg record");
6611 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6612 SuccessOrdering == AtomicOrdering::Unordered)
6613 return error(
"Invalid cmpxchg record");
6615 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6617 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6625 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6626 FailureOrdering == AtomicOrdering::Unordered)
6627 return error(
"Invalid cmpxchg record");
6629 const Align Alignment(
6630 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6632 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6633 FailureOrdering, SSID);
6636 if (NumRecords < 8) {
6640 I->insertInto(CurBB, CurBB->
end());
6642 ResTypeID = CmpTypeID;
6645 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6646 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6655 const size_t NumRecords =
Record.size();
6657 Value *Ptr =
nullptr;
6659 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6660 return error(
"Invalid cmpxchg record");
6663 return error(
"Cmpxchg operand is not a pointer type");
6667 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6668 return error(
"Invalid cmpxchg record");
6670 Value *Val =
nullptr;
6671 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6673 return error(
"Invalid cmpxchg record");
6675 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6676 return error(
"Invalid cmpxchg record");
6678 const bool IsVol =
Record[OpNum];
6683 return error(
"Invalid cmpxchg success ordering");
6685 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6687 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6693 return error(
"Invalid cmpxchg failure ordering");
6695 const bool IsWeak =
Record[OpNum + 4];
6697 MaybeAlign Alignment;
6699 if (NumRecords == (OpNum + 6)) {
6700 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6705 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6707 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6708 FailureOrdering, SSID);
6712 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6713 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6722 const size_t NumRecords =
Record.size();
6725 Value *Ptr =
nullptr;
6727 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6728 return error(
"Invalid atomicrmw record");
6731 return error(
"Invalid atomicrmw record");
6733 Value *Val =
nullptr;
6734 unsigned ValTypeID = InvalidTypeID;
6736 ValTypeID = getContainedTypeID(PtrTypeID);
6737 if (popValue(Record, OpNum, NextValueNo,
6738 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6739 return error(
"Invalid atomicrmw record");
6741 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6742 return error(
"Invalid atomicrmw record");
6745 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6746 return error(
"Invalid atomicrmw record");
6748 bool IsElementwise =
false;
6753 return error(
"Invalid atomicrmw record");
6755 const bool IsVol =
Record[OpNum + 1];
6758 if (Ordering == AtomicOrdering::NotAtomic ||
6759 Ordering == AtomicOrdering::Unordered)
6760 return error(
"Invalid atomicrmw record");
6762 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6764 MaybeAlign Alignment;
6766 if (NumRecords == (OpNum + 5)) {
6767 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6773 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6775 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID,
6777 ResTypeID = ValTypeID;
6785 return error(
"Invalid fence record");
6787 if (Ordering == AtomicOrdering::NotAtomic ||
6788 Ordering == AtomicOrdering::Unordered ||
6789 Ordering == AtomicOrdering::Monotonic)
6790 return error(
"Invalid fence record");
6792 I =
new FenceInst(
Context, Ordering, SSID);
6799 SeenDebugRecord =
true;
6802 return error(
"Invalid dbg record: missing instruction");
6805 Inst->
getParent()->insertDbgRecordBefore(
6816 SeenDebugRecord =
true;
6819 return error(
"Invalid dbg record: missing instruction");
6836 DILocalVariable *Var =
6838 DIExpression *Expr =
6851 unsigned SlotBefore =
Slot;
6852 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6853 return error(
"Invalid dbg record: invalid value");
6855 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6858 RawLocation = getFnMetadataByID(Record[Slot++]);
6861 DbgVariableRecord *DVR =
nullptr;
6865 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6866 DbgVariableRecord::LocationType::Value);
6869 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6870 DbgVariableRecord::LocationType::Declare);
6873 DVR =
new DbgVariableRecord(
6874 RawLocation, Var, Expr, DIL,
6875 DbgVariableRecord::LocationType::DeclareValue);
6879 DIExpression *AddrExpr =
6881 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6882 DVR =
new DbgVariableRecord(RawLocation, Var, Expr,
ID, Addr, AddrExpr,
6895 return error(
"Invalid call record");
6899 unsigned CCInfo =
Record[OpNum++];
6905 return error(
"Fast math flags indicator set for call with no FMF");
6908 unsigned FTyID = InvalidTypeID;
6909 FunctionType *FTy =
nullptr;
6914 return error(
"Explicit call type is not a function type");
6918 unsigned CalleeTypeID;
6919 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6921 return error(
"Invalid call record");
6925 return error(
"Callee is not a pointer type");
6927 FTyID = getContainedTypeID(CalleeTypeID);
6930 return error(
"Callee is not of pointer to function type");
6932 if (
Record.size() < FTy->getNumParams() + OpNum)
6933 return error(
"Insufficient operands to call");
6935 SmallVector<Value*, 16>
Args;
6936 SmallVector<unsigned, 16> ArgTyIDs;
6938 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6939 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6940 if (FTy->getParamType(i)->isLabelTy())
6941 Args.push_back(getBasicBlock(Record[OpNum]));
6944 FTy->getParamType(i), ArgTyID, CurBB));
6947 return error(
"Invalid call record");
6951 if (!FTy->isVarArg()) {
6952 if (OpNum !=
Record.size())
6953 return error(
"Invalid call record");
6955 while (OpNum !=
Record.size()) {
6958 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6959 return error(
"Invalid call record");
6966 if (!OperandBundles.empty())
6970 ResTypeID = getContainedTypeID(FTyID);
6971 OperandBundles.clear();
6985 SeenDebugIntrinsic =
true;
6992 return error(
"Fast-math-flags specified for call without "
6993 "floating-point scalar or vector return type");
6994 I->setFastMathFlags(FMF);
7000 return error(
"Invalid va_arg record");
7001 unsigned OpTyID =
Record[0];
7002 Type *OpTy = getTypeByID(OpTyID);
7005 Type *ResTy = getTypeByID(ResTypeID);
7006 if (!OpTy || !
Op || !ResTy)
7007 return error(
"Invalid va_arg record");
7008 I =
new VAArgInst(
Op, ResTy);
7018 if (
Record.empty() || Record[0] >= BundleTags.size())
7019 return error(
"Invalid operand bundle record");
7021 std::vector<Value *> Inputs;
7024 while (OpNum !=
Record.size()) {
7026 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
7027 return error(
"Invalid operand bundle record");
7028 Inputs.push_back(
Op);
7031 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
7039 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
7040 return error(
"Invalid freeze record");
7041 if (OpNum !=
Record.size())
7042 return error(
"Invalid freeze record");
7044 I =
new FreezeInst(
Op);
7045 ResTypeID = OpTypeID;
7055 return error(
"Invalid instruction with no BB");
7057 if (!OperandBundles.empty()) {
7059 return error(
"Operand bundles found with no consumer");
7061 I->insertInto(CurBB, CurBB->
end());
7064 if (
I->isTerminator()) {
7066 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
7070 if (!
I->getType()->isVoidTy()) {
7071 assert(
I->getType() == getTypeByID(ResTypeID) &&
7072 "Incorrect result type ID");
7080 if (!OperandBundles.empty())
7081 return error(
"Operand bundles found with no consumer");
7085 if (!
A->getParent()) {
7087 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
7093 return error(
"Never resolved value found in function");
7098 if (MDLoader->hasFwdRefs())
7099 return error(
"Invalid function metadata: outgoing forward refs");
7104 for (
const auto &Pair : ConstExprEdgeBBs) {
7115 ValueList.
shrinkTo(ModuleValueListSize);
7116 MDLoader->shrinkTo(ModuleMDLoaderSize);
7117 std::vector<BasicBlock*>().swap(FunctionBBs);
7122Error BitcodeReader::findFunctionInStream(
7124 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
7125 while (DeferredFunctionInfoIterator->second == 0) {
7130 assert(VSTOffset == 0 || !
F->hasName());
7133 if (
Error Err = rememberAndSkipFunctionBodies())
7139SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7142 if (Val >= SSIDs.
size())
7151Error BitcodeReader::materialize(GlobalValue *GV) {
7154 if (!
F || !
F->isMaterializable())
7157 auto DFII = DeferredFunctionInfo.
find(
F);
7158 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7161 if (DFII->second == 0)
7162 if (
Error Err = findFunctionInStream(
F, DFII))
7166 if (
Error Err = materializeMetadata())
7173 if (
Error Err = parseFunctionBody(
F))
7175 F->setIsMaterializable(
false);
7179 if (SeenDebugIntrinsic && SeenDebugRecord)
7180 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7186 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7187 F->setSubprogram(SP);
7190 if (!MDLoader->isStrippingTBAA()) {
7192 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7195 MDLoader->setStripTBAA(
true);
7202 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7203 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7209 unsigned ExpectedNumOperands = 0;
7211 ExpectedNumOperands = 2;
7213 ExpectedNumOperands =
SI->getNumSuccessors();
7215 ExpectedNumOperands = 1;
7219 ExpectedNumOperands = 2;
7226 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7227 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7233 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7234 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7236 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7237 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7238 CI->getArgOperand(ArgNo)->getType(),
7239 CI->getParamAttributes(ArgNo)));
7242 if (Function *OldFn = CI->getCalledFunction()) {
7243 auto It = UpgradedIntrinsics.
find(OldFn);
7244 if (It != UpgradedIntrinsics.
end())
7248 BC && BC->getSrcTy() == BC->getDestTy() &&
7254 CI && CI->isMustTailCall() && CI->getNextNode() == BC) {
7255 BC->replaceAllUsesWith(CI);
7256 BC->eraseFromParent();
7266 return materializeForwardReferencedFunctions();
7269Error BitcodeReader::materializeModule() {
7270 if (
Error Err = materializeMetadata())
7274 WillMaterializeAllForwardRefs =
true;
7278 for (Function &
F : *TheModule) {
7279 if (
Error Err = materialize(&
F))
7285 if (LastFunctionBlockBit || NextUnreadBit)
7287 ? LastFunctionBlockBit
7293 if (!BasicBlockFwdRefs.
empty())
7294 return error(
"Never resolved function from blockaddress");
7300 for (
auto &[OldFn, NewFn] : UpgradedIntrinsics) {
7301 for (User *U : OldFn->users()) {
7305 if (OldFn != NewFn) {
7306 if (!OldFn->use_empty())
7307 OldFn->replaceAllUsesWith(NewFn);
7308 OldFn->eraseFromParent();
7311 UpgradedIntrinsics.clear();
7326std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7327 return IdentifiedStructTypes;
7330ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7331 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7332 StringRef ModulePath, std::function<
bool(StringRef)> IsPrevailing,
7333 std::function<
void(ValueInfo)> OnValueInfo)
7334 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7335 ModulePath(ModulePath), IsPrevailing(IsPrevailing),
7336 OnValueInfo(OnValueInfo) {}
7338void ModuleSummaryIndexBitcodeReader::addThisModule() {
7343ModuleSummaryIndexBitcodeReader::getThisModule() {
7347template <
bool AllowNullValueInfo>
7348std::pair<ValueInfo, GlobalValue::GUID>
7349ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7350 auto VGI = ValueIdToValueInfoMap[ValueId];
7357 assert(AllowNullValueInfo || std::get<0>(VGI));
7361void ModuleSummaryIndexBitcodeReader::setValueGUID(
7363 StringRef SourceFileName) {
7365 if (ValueID < DefinedGUIDs.size())
7366 ValueGUID = DefinedGUIDs[ValueID];
7373 auto OriginalNameID = ValueGUID;
7377 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7385 ValueIdToValueInfoMap[ValueID] = std::make_pair(VI, OriginalNameID);
7393Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7395 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7402 if (!MaybeCurrentBit)
7404 uint64_t CurrentBit = MaybeCurrentBit.
get();
7409 SmallVector<uint64_t, 64>
Record;
7418 BitstreamEntry
Entry = MaybeEntry.
get();
7420 switch (
Entry.Kind) {
7423 return error(
"Malformed block");
7439 switch (MaybeRecord.
get()) {
7444 return error(
"Invalid vst_code_entry record");
7445 unsigned ValueID =
Record[0];
7447 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7448 assert(VLI != ValueIdToLinkageMap.
end() &&
7449 "No linkage found for VST entry?");
7458 return error(
"Invalid vst_code_fnentry record");
7459 unsigned ValueID =
Record[0];
7461 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7462 assert(VLI != ValueIdToLinkageMap.
end() &&
7463 "No linkage found for VST entry?");
7471 unsigned ValueID =
Record[0];
7475 ValueIdToValueInfoMap[ValueID] =
7486Error ModuleSummaryIndexBitcodeReader::parseModule() {
7490 SmallVector<uint64_t, 64>
Record;
7491 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7492 unsigned ValueId = 0;
7496 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
7499 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7501 switch (
Entry.Kind) {
7503 return error(
"Malformed block");
7515 if (
Error Err = readBlockInfo())
7521 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7522 !SeenGlobalValSummary) &&
7523 "Expected early VST parse via VSTOffset record");
7530 if (!SourceFileName.
empty())
7532 assert(!SeenValueSymbolTable &&
7533 "Already read VST when parsing summary block?");
7538 if (VSTOffset > 0) {
7539 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7541 SeenValueSymbolTable =
true;
7543 SeenGlobalValSummary =
true;
7544 if (
Error Err = parseEntireSummary(
Entry.ID))
7548 if (
Error Err = parseModuleStringTable())
7556 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7559 switch (MaybeBitCode.
get()) {
7563 if (
Error Err = parseVersionRecord(Record).takeError())
7571 return error(
"Invalid source filename record");
7578 return error(
"Invalid hash length " + Twine(
Record.size()));
7579 auto &Hash = getThisModule()->second;
7581 for (
auto &Val : Record) {
7582 assert(!(Val >> 32) &&
"Unexpected high bits set");
7590 return error(
"Invalid vstoffset record");
7594 VSTOffset =
Record[0] - 1;
7599 DefinedGUIDs.reserve(DefinedGUIDs.size() +
Record.size() / 2);
7600 for (
size_t i = 0; i <
Record.size(); i += 2)
7601 DefinedGUIDs.push_back(Record[i] << 32 | Record[i + 1]);
7611 ArrayRef<uint64_t> GVRecord;
7612 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7613 if (GVRecord.
size() <= 3)
7614 return error(
"Invalid global record");
7615 uint64_t RawLinkage = GVRecord[3];
7618 ValueIdToLinkageMap[ValueId++] =
Linkage;
7622 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7633ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7636 for (uint64_t RefValueId : Record)
7637 Ret.
push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7642ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7643 bool IsOldProfileFormat,
7644 bool HasProfile,
bool HasRelBF) {
7648 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7653 for (
unsigned I = 0,
E =
Record.size();
I !=
E; ++
I) {
7655 bool HasTailCall =
false;
7657 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7658 if (IsOldProfileFormat) {
7662 }
else if (HasProfile)
7663 std::tie(Hotness, HasTailCall) =
7697 static_cast<size_t>(
Record[Slot + 1])};
7720 while (Slot <
Record.size())
7724std::vector<FunctionSummary::ParamAccess>
7725ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7726 auto ReadRange = [&]() {
7728 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7730 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7737 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7738 while (!
Record.empty()) {
7739 PendingParamAccesses.emplace_back();
7740 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7742 ParamAccess.
Use = ReadRange();
7747 std::get<0>(getValueInfoFromValueId(
Record.consume_front()));
7748 Call.Offsets = ReadRange();
7751 return PendingParamAccesses;
7754void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7755 ArrayRef<uint64_t> Record,
size_t &Slot,
7758 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7762void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7763 ArrayRef<uint64_t> Record) {
7771 while (Slot <
Record.size())
7772 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7775SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7776 ArrayRef<uint64_t> Record,
unsigned &
I) {
7777 SmallVector<unsigned> StackIdList;
7781 if (RadixArray.empty()) {
7782 unsigned NumStackEntries =
Record[
I++];
7784 StackIdList.
reserve(NumStackEntries);
7785 for (
unsigned J = 0; J < NumStackEntries; J++) {
7786 assert(Record[
I] < StackIds.size());
7787 StackIdList.
push_back(getStackIdIndex(Record[
I++]));
7790 unsigned RadixIndex =
Record[
I++];
7796 assert(RadixIndex < RadixArray.size());
7797 unsigned NumStackIds = RadixArray[RadixIndex++];
7798 StackIdList.
reserve(NumStackIds);
7799 while (NumStackIds--) {
7800 assert(RadixIndex < RadixArray.size());
7801 unsigned Elem = RadixArray[RadixIndex];
7802 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7803 RadixIndex = RadixIndex - Elem;
7804 assert(RadixIndex < RadixArray.size());
7805 Elem = RadixArray[RadixIndex];
7807 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7810 StackIdList.
push_back(getStackIdIndex(Elem));
7820 unsigned FirstWORef = Refs.
size() - WOCnt;
7821 unsigned RefNo = FirstWORef - ROCnt;
7822 for (; RefNo < FirstWORef; ++RefNo)
7823 Refs[RefNo].setReadOnly();
7824 for (; RefNo < Refs.
size(); ++RefNo)
7825 Refs[RefNo].setWriteOnly();
7830Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7833 SmallVector<uint64_t, 64>
Record;
7840 BitstreamEntry
Entry = MaybeEntry.
get();
7843 return error(
"Invalid Summary Block: record for version expected");
7848 return error(
"Invalid Summary Block: version expected");
7851 const bool IsOldProfileFormat =
Version == 1;
7854 const bool MemProfAfterFunctionSummary =
Version >= 13;
7856 return error(
"Invalid summary version " + Twine(
Version) +
" in module '" +
7857 ModulePath +
"'. Version should be in the range [1-" +
7863 GlobalValueSummary *LastSeenSummary =
nullptr;
7873 FunctionSummary *CurrentPrevailingFS =
nullptr;
7878 std::vector<GlobalValue::GUID> PendingTypeTests;
7879 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7880 PendingTypeCheckedLoadVCalls;
7881 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7882 PendingTypeCheckedLoadConstVCalls;
7883 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7885 std::vector<CallsiteInfo> PendingCallsites;
7886 std::vector<AllocInfo> PendingAllocs;
7887 std::vector<uint64_t> PendingContextIds;
7893 BitstreamEntry
Entry = MaybeEntry.
get();
7895 switch (
Entry.Kind) {
7898 return error(
"Malformed block");
7914 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7917 unsigned BitCode = MaybeBitCode.
get();
7927 uint64_t ValueID =
Record[0];
7934 ValueIdToValueInfoMap[ValueID] =
7952 unsigned ValueID =
Record[0];
7953 uint64_t RawFlags =
Record[1];
7954 unsigned InstCount =
Record[2];
7955 uint64_t RawFunFlags = 0;
7956 unsigned NumRefs =
Record[3];
7957 unsigned NumRORefs = 0, NumWORefs = 0;
7958 int RefListStartIndex = 4;
7962 RefListStartIndex = 5;
7965 RefListStartIndex = 6;
7968 RefListStartIndex = 7;
7979 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7981 "Record size inconsistent with number of references");
7983 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7988 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7989 IsOldProfileFormat, HasProfile, HasRelBF);
7991 auto [
VI,
GUID] = getValueInfoFromValueId(ValueID);
7998 IsPrevailing(
VI.name());
8004 assert(!MemProfAfterFunctionSummary ||
8005 (PendingCallsites.empty() && PendingAllocs.empty()));
8006 if (!IsPrevailingSym && !MemProfAfterFunctionSummary) {
8007 PendingCallsites.clear();
8008 PendingAllocs.clear();
8011 auto FS = std::make_unique<FunctionSummary>(
8013 std::move(Calls), std::move(PendingTypeTests),
8014 std::move(PendingTypeTestAssumeVCalls),
8015 std::move(PendingTypeCheckedLoadVCalls),
8016 std::move(PendingTypeTestAssumeConstVCalls),
8017 std::move(PendingTypeCheckedLoadConstVCalls),
8018 std::move(PendingParamAccesses), std::move(PendingCallsites),
8019 std::move(PendingAllocs));
8020 FS->setModulePath(getThisModule()->first());
8021 FS->setOriginalName(GUID);
8024 if (MemProfAfterFunctionSummary) {
8025 if (IsPrevailingSym)
8026 CurrentPrevailingFS =
FS.get();
8028 CurrentPrevailingFS =
nullptr;
8037 unsigned ValueID =
Record[0];
8038 uint64_t RawFlags =
Record[1];
8039 unsigned AliaseeID =
Record[2];
8041 auto AS = std::make_unique<AliasSummary>(Flags);
8047 AS->setModulePath(getThisModule()->first());
8049 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
8051 if (!AliaseeInModule)
8052 return error(
"Alias expects aliasee summary to be parsed");
8053 AS->setAliasee(AliaseeVI, AliaseeInModule);
8055 auto GUID = getValueInfoFromValueId(ValueID);
8056 AS->setOriginalName(std::get<1>(GUID));
8062 unsigned ValueID =
Record[0];
8063 uint64_t RawFlags =
Record[1];
8064 unsigned RefArrayStart = 2;
8065 GlobalVarSummary::GVarFlags GVF(
false,
8075 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8077 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8078 FS->setModulePath(getThisModule()->first());
8079 auto GUID = getValueInfoFromValueId(ValueID);
8080 FS->setOriginalName(std::get<1>(GUID));
8088 unsigned ValueID =
Record[0];
8089 uint64_t RawFlags =
Record[1];
8091 unsigned NumRefs =
Record[3];
8092 unsigned RefListStartIndex = 4;
8093 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
8096 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8098 for (
unsigned I = VTableListStartIndex,
E =
Record.size();
I !=
E; ++
I) {
8099 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
8104 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8105 VS->setModulePath(getThisModule()->first());
8106 VS->setVTableFuncs(VTableFuncs);
8107 auto GUID = getValueInfoFromValueId(ValueID);
8108 VS->setOriginalName(std::get<1>(GUID));
8120 unsigned ValueID =
Record[0];
8121 uint64_t ModuleId =
Record[1];
8122 uint64_t RawFlags =
Record[2];
8123 unsigned InstCount =
Record[3];
8124 uint64_t RawFunFlags = 0;
8125 unsigned NumRefs =
Record[4];
8126 unsigned NumRORefs = 0, NumWORefs = 0;
8127 int RefListStartIndex = 5;
8131 RefListStartIndex = 6;
8132 size_t NumRefsIndex = 5;
8134 unsigned NumRORefsOffset = 1;
8135 RefListStartIndex = 7;
8138 RefListStartIndex = 8;
8140 RefListStartIndex = 9;
8142 NumRORefsOffset = 2;
8145 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
8147 NumRefs =
Record[NumRefsIndex];
8151 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8153 "Record size inconsistent with number of references");
8155 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8158 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8159 IsOldProfileFormat, HasProfile,
false);
8160 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8162 auto FS = std::make_unique<FunctionSummary>(
8164 std::move(Edges), std::move(PendingTypeTests),
8165 std::move(PendingTypeTestAssumeVCalls),
8166 std::move(PendingTypeCheckedLoadVCalls),
8167 std::move(PendingTypeTestAssumeConstVCalls),
8168 std::move(PendingTypeCheckedLoadConstVCalls),
8169 std::move(PendingParamAccesses), std::move(PendingCallsites),
8170 std::move(PendingAllocs));
8171 LastSeenSummary =
FS.get();
8172 if (MemProfAfterFunctionSummary)
8173 CurrentPrevailingFS =
FS.get();
8174 LastSeenGUID =
VI.getGUID();
8175 FS->setModulePath(ModuleIdMap[ModuleId]);
8183 unsigned ValueID =
Record[0];
8184 uint64_t ModuleId =
Record[1];
8185 uint64_t RawFlags =
Record[2];
8186 unsigned AliaseeValueId =
Record[3];
8188 auto AS = std::make_unique<AliasSummary>(Flags);
8189 LastSeenSummary = AS.get();
8190 AS->setModulePath(ModuleIdMap[ModuleId]);
8192 auto AliaseeVI = std::get<0>(
8193 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(AliaseeValueId));
8195 auto AliaseeInModule =
8197 AS->setAliasee(AliaseeVI, AliaseeInModule);
8199 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8200 LastSeenGUID =
VI.getGUID();
8206 unsigned ValueID =
Record[0];
8207 uint64_t ModuleId =
Record[1];
8208 uint64_t RawFlags =
Record[2];
8209 unsigned RefArrayStart = 3;
8210 GlobalVarSummary::GVarFlags GVF(
false,
8220 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8222 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8223 LastSeenSummary =
FS.get();
8224 FS->setModulePath(ModuleIdMap[ModuleId]);
8225 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8226 LastSeenGUID =
VI.getGUID();
8232 uint64_t OriginalName =
Record[0];
8233 if (!LastSeenSummary)
8234 return error(
"Name attachment that does not follow a combined record");
8238 LastSeenSummary =
nullptr;
8243 assert(PendingTypeTests.empty());
8248 assert(PendingTypeTestAssumeVCalls.empty());
8249 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8250 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8254 assert(PendingTypeCheckedLoadVCalls.empty());
8255 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8256 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8260 PendingTypeTestAssumeConstVCalls.push_back(
8265 PendingTypeCheckedLoadConstVCalls.push_back(
8272 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8273 StringRef
Name(Strtab.
data() + Record[
I],
8274 static_cast<size_t>(Record[
I + 1]));
8277 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, GUID);
8280 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8282 StringRef
Name(Strtab.
data() + Record[
I + 1],
8283 static_cast<size_t>(Record[
I + 2]));
8284 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8293 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8294 StringRef
Name(Strtab.
data() + Record[
I],
8295 static_cast<size_t>(Record[
I + 1]));
8298 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, GUID);
8301 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8303 StringRef
Name(Strtab.
data() + Record[
I + 1],
8304 static_cast<size_t>(Record[
I + 2]));
8305 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8316 parseTypeIdCompatibleVtableSummaryRecord(Record);
8324 PendingParamAccesses = parseParamAccesses(Record);
8331 assert(StackIds.empty());
8333 StackIds = ArrayRef<uint64_t>(Record);
8339 StackIds.reserve(
Record.size() / 2);
8340 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8341 StackIds.push_back(*R << 32 | *(R + 1));
8343 assert(StackIdToIndex.empty());
8345 StackIdToIndex.resize(StackIds.size(), UninitializedStackIdIndex);
8350 RadixArray = ArrayRef<uint64_t>(Record);
8357 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8359 unsigned ValueID =
Record[0];
8360 SmallVector<unsigned> StackIdList;
8362 assert(R < StackIds.size());
8363 StackIdList.
push_back(getStackIdIndex(R));
8365 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8366 if (MemProfAfterFunctionSummary)
8368 CallsiteInfo({
VI, std::move(StackIdList)}));
8370 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8377 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8378 auto RecordIter =
Record.begin();
8379 unsigned ValueID = *RecordIter++;
8380 unsigned NumStackIds = *RecordIter++;
8381 unsigned NumVersions = *RecordIter++;
8382 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8383 SmallVector<unsigned> StackIdList;
8384 for (
unsigned J = 0; J < NumStackIds; J++) {
8385 assert(*RecordIter < StackIds.size());
8386 StackIdList.
push_back(getStackIdIndex(*RecordIter++));
8388 SmallVector<unsigned> Versions;
8389 for (
unsigned J = 0; J < NumVersions; J++)
8391 ValueInfo
VI = std::get<0>(
8392 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8393 if (MemProfAfterFunctionSummary)
8395 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8397 PendingCallsites.push_back(
8398 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8405 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8410 PendingContextIds.reserve(
Record.size() / 2);
8411 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8412 PendingContextIds.push_back(*R << 32 | *(R + 1));
8419 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS) {
8420 PendingContextIds.clear();
8424 std::vector<MIBInfo> MIBs;
8425 unsigned NumMIBs = 0;
8428 unsigned MIBsRead = 0;
8429 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8433 auto StackIdList = parseAllocInfoContext(Record,
I);
8434 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8440 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8442 assert(!PendingContextIds.empty() &&
8443 "Missing context ids for alloc sizes");
8444 unsigned ContextIdIndex = 0;
8450 while (MIBsRead++ < NumMIBs) {
8452 unsigned NumContextSizeInfoEntries =
Record[
I++];
8454 std::vector<ContextTotalSize> ContextSizes;
8455 ContextSizes.reserve(NumContextSizeInfoEntries);
8456 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8457 assert(ContextIdIndex < PendingContextIds.size());
8459 if (PendingContextIds[ContextIdIndex] == 0) {
8468 ContextSizes.push_back(
8469 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8471 AllContextSizes.push_back(std::move(ContextSizes));
8473 PendingContextIds.clear();
8475 AllocInfo AI(std::move(MIBs));
8476 if (!AllContextSizes.empty()) {
8477 assert(AI.MIBs.size() == AllContextSizes.size());
8478 AI.ContextSizeInfos = std::move(AllContextSizes);
8481 if (MemProfAfterFunctionSummary)
8482 CurrentPrevailingFS->
addAlloc(std::move(AI));
8484 PendingAllocs.push_back(std::move(AI));
8492 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8494 std::vector<MIBInfo> MIBs;
8495 unsigned NumMIBs =
Record[
I++];
8496 unsigned NumVersions =
Record[
I++];
8497 unsigned MIBsRead = 0;
8498 while (MIBsRead++ < NumMIBs) {
8501 SmallVector<unsigned> StackIdList;
8503 StackIdList = parseAllocInfoContext(Record,
I);
8504 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8507 SmallVector<uint8_t> Versions;
8508 for (
unsigned J = 0; J < NumVersions; J++)
8511 AllocInfo AI(std::move(Versions), std::move(MIBs));
8512 if (MemProfAfterFunctionSummary)
8513 CurrentPrevailingFS->
addAlloc(std::move(AI));
8515 PendingAllocs.push_back(std::move(AI));
8525Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8529 SmallVector<uint64_t, 64>
Record;
8531 SmallString<128> ModulePath;
8538 BitstreamEntry
Entry = MaybeEntry.
get();
8540 switch (
Entry.Kind) {
8543 return error(
"Malformed block");
8555 switch (MaybeRecord.
get()) {
8560 uint64_t ModuleId =
Record[0];
8563 return error(
"Invalid code_entry record");
8565 LastSeenModule = TheIndex.
addModule(ModulePath);
8566 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8574 return error(
"Invalid hash length " + Twine(
Record.size()));
8575 if (!LastSeenModule)
8576 return error(
"Invalid hash that does not follow a module path");
8578 for (
auto &Val : Record) {
8579 assert(!(Val >> 32) &&
"Unexpected high bits set");
8580 LastSeenModule->
second[Pos++] = Val;
8583 LastSeenModule =
nullptr;
8596class BitcodeErrorCategoryType :
public std::error_category {
8597 const char *
name()
const noexcept
override {
8598 return "llvm.bitcode";
8601 std::string message(
int IE)
const override {
8604 case BitcodeError::CorruptedBitcode:
8605 return "Corrupted bitcode";
8614 static BitcodeErrorCategoryType ErrorCategory;
8615 return ErrorCategory;
8619 unsigned Block,
unsigned RecordID) {
8621 return std::move(Err);
8630 switch (Entry.Kind) {
8635 return error(
"Malformed block");
8639 return std::move(Err);
8649 if (MaybeRecord.
get() == RecordID)
8660Expected<std::vector<BitcodeModule>>
8664 return FOrErr.takeError();
8665 return std::move(FOrErr->Mods);
8690 switch (Entry.Kind) {
8693 return error(
"Malformed block");
8696 uint64_t IdentificationBit = -1ull;
8700 return std::move(Err);
8706 Entry = MaybeEntry.
get();
8711 return error(
"Malformed block");
8717 return std::move(Err);
8736 if (!
I.Strtab.empty())
8743 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8744 F.StrtabForSymtab = *Strtab;
8760 if (
F.Symtab.empty())
8761 F.Symtab = *SymtabOrErr;
8766 return std::move(Err);
8771 return std::move(E);
8786BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8787 bool ShouldLazyLoadMetadata,
bool IsImporting,
8791 std::string ProducerIdentification;
8792 if (IdentificationBit != -1ull) {
8794 return std::move(JumpFailed);
8797 return std::move(
E);
8801 return std::move(JumpFailed);
8802 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8805 std::unique_ptr<Module>
M =
8806 std::make_unique<Module>(ModuleIdentifier,
Context);
8807 M->setMaterializer(R);
8810 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8811 IsImporting, Callbacks))
8812 return std::move(Err);
8814 if (MaterializeAll) {
8816 if (
Error Err =
M->materializeAll())
8817 return std::move(Err);
8820 if (
Error Err =
R->materializeForwardReferencedFunctions())
8821 return std::move(Err);
8824 return std::move(M);
8827Expected<std::unique_ptr<Module>>
8830 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8840 std::function<
bool(
StringRef)> IsPrevailing,
8841 std::function<
void(
ValueInfo)> OnValueInfo) {
8846 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8847 ModulePath, IsPrevailing, OnValueInfo);
8848 return R.parseModule();
8855 return std::move(JumpFailed);
8857 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8858 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8859 ModuleIdentifier, 0);
8861 if (
Error Err = R.parseModule())
8862 return std::move(Err);
8864 return std::move(Index);
8870 return std::move(Err);
8876 return std::move(
E);
8878 switch (Entry.Kind) {
8881 return error(
"Malformed block");
8884 return std::make_pair(
false,
false);
8896 switch (MaybeBitCode.
get()) {
8902 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8904 bool EnableSplitLTOUnit = Flags & 0x8;
8905 bool UnifiedLTO = Flags & 0x200;
8906 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8917 return std::move(JumpFailed);
8920 return std::move(Err);
8925 return std::move(E);
8927 switch (Entry.Kind) {
8929 return error(
"Malformed block");
8940 return Flags.takeError();
8950 return std::move(Err);
8957 return StreamFailed.takeError();
8967 if (MsOrErr->size() != 1)
8968 return error(
"Expected a single module");
8970 return (*MsOrErr)[0];
8973Expected<std::unique_ptr<Module>>
8975 bool ShouldLazyLoadMetadata,
bool IsImporting,
8981 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8986 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8987 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8989 IsImporting, Callbacks);
8991 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8997 return getModuleImpl(Context,
true,
false,
false, Callbacks);
9009 return BM->parseModule(Context, Callbacks);
9042 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
9051 return BM->getSummary();
9059 return BM->getLTOInfo();
9064 bool IgnoreEmptyThinLTOIndexFile) {
9069 if (IgnoreEmptyThinLTOIndexFile && !(*FileOrErr)->getBufferSize())
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
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
Expand Atomic instructions
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static void getDecodedRelBFCallEdgeInfo(uint64_t RawFlags, uint64_t &RelBF, bool &HasTailCall)
static void upgradeDLLImportExportLinkage(GlobalValue *GV, unsigned Val)
static cl::opt< bool > PrintSummaryGUIDs("print-summary-global-ids", cl::init(false), cl::Hidden, cl::desc("Print the global id for each value when reading the module summary"))
static AtomicOrdering getDecodedOrdering(unsigned Val)
static std::pair< CalleeInfo::HotnessType, bool > getDecodedHotnessCallEdgeInfo(uint64_t RawFlags)
static FunctionSummary::FFlags getDecodedFFlags(uint64_t RawFlags)
static std::optional< CodeModel::Model > getDecodedCodeModel(unsigned Val)
static void setSpecialRefs(SmallVectorImpl< ValueInfo > &Refs, unsigned ROCnt, unsigned WOCnt)
static bool getDecodedDSOLocal(unsigned Val)
static bool convertToString(ArrayRef< uint64_t > Record, unsigned Idx, StrTy &Result)
Convert a string from a record into an std::string, return true on failure.
static GlobalVariable::UnnamedAddr getDecodedUnnamedAddrType(unsigned Val)
static void stripTBAA(Module *M)
static int getDecodedUnaryOpcode(unsigned Val, Type *Ty)
static Expected< std::string > readTriple(BitstreamCursor &Stream)
static void parseWholeProgramDevirtResolutionByArg(ArrayRef< uint64_t > Record, size_t &Slot, WholeProgramDevirtResolution &Wpd)
static uint64_t getRawAttributeMask(Attribute::AttrKind Val)
static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags, uint64_t Version)
static GlobalVarSummary::GVarFlags getDecodedGVarFlags(uint64_t RawFlags)
static Attribute::AttrKind getAttrFromCode(uint64_t Code)
static Expected< uint64_t > jumpToValueSymbolTable(uint64_t Offset, BitstreamCursor &Stream)
Helper to note and return the current location, and jump to the given offset.
static Expected< bool > hasObjCCategoryInModule(BitstreamCursor &Stream)
static GlobalValue::DLLStorageClassTypes getDecodedDLLStorageClass(unsigned Val)
static GEPNoWrapFlags toGEPNoWrapFlags(uint64_t Flags)
static void decodeLLVMAttributesForBitcode(AttrBuilder &B, uint64_t EncodedAttrs, uint64_t AttrIdx)
This fills an AttrBuilder object with the LLVM attributes that have been decoded from the given integ...
static AtomicRMWInst::BinOp getDecodedRMWOperation(unsigned Val, bool &IsElementwise)
static void parseTypeIdSummaryRecord(ArrayRef< uint64_t > Record, StringRef Strtab, ModuleSummaryIndex &TheIndex)
static void addRawAttributeValue(AttrBuilder &B, uint64_t Val)
static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val)
static bool hasImplicitComdat(size_t Val)
static GlobalValue::LinkageTypes getDecodedLinkage(unsigned Val)
static Error hasInvalidBitcodeHeader(BitstreamCursor &Stream)
static Expected< std::string > readIdentificationCode(BitstreamCursor &Stream)
static int getDecodedBinaryOpcode(unsigned Val, Type *Ty)
static Expected< BitcodeModule > getSingleModule(MemoryBufferRef Buffer)
static Expected< bool > hasObjCCategory(BitstreamCursor &Stream)
static GlobalVariable::ThreadLocalMode getDecodedThreadLocalMode(unsigned Val)
static void parseWholeProgramDevirtResolution(ArrayRef< uint64_t > Record, StringRef Strtab, size_t &Slot, TypeIdSummary &TypeId)
static void inferDSOLocal(GlobalValue *GV)
static FastMathFlags getDecodedFastMathFlags(unsigned Val)
GlobalValue::SanitizerMetadata deserializeSanitizerMetadata(unsigned V)
static Expected< BitstreamCursor > initStream(MemoryBufferRef Buffer)
static cl::opt< bool > ExpandConstantExprs("expand-constant-exprs", cl::Hidden, cl::desc("Expand constant expressions to instructions for testing purposes"))
static bool upgradeOldMemoryAttribute(MemoryEffects &ME, uint64_t EncodedKind)
static Expected< StringRef > readBlobInRecord(BitstreamCursor &Stream, unsigned Block, unsigned RecordID)
static Expected< std::string > readIdentificationBlock(BitstreamCursor &Stream)
Read the "IDENTIFICATION_BLOCK_ID" block, do some basic enforcement on the "epoch" encoded in the bit...
static Expected< std::pair< bool, bool > > getEnableSplitLTOUnitAndUnifiedFlag(BitstreamCursor &Stream, unsigned ID)
static bool isConstExprSupported(const BitcodeConstant *BC)
static int getDecodedCastOpcode(unsigned Val)
static Expected< std::string > readModuleTriple(BitstreamCursor &Stream)
static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static StringRef getOpcodeName(uint8_t Opcode, uint8_t OpcodeBase)
This file defines the DenseMap class.
Provides ErrorOr<T> smart pointer.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Module.h This file contains the declarations for the Module class.
static constexpr Value * getValue(Ty &ValueOrUse)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Machine Check Debug Module
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines the SmallString class.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
PointerType * getType() const
Overload to return most specific pointer type.
void setUsedWithInAlloca(bool V)
Specify whether this alloca is used to represent the arguments to a call.
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.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
static bool isValidFailureOrdering(AtomicOrdering Ordering)
static AtomicOrdering getStrongestFailureOrdering(AtomicOrdering SuccessOrdering)
Returns the strongest permitted ordering on failure, given the desired ordering on success.
static bool isValidSuccessOrdering(AtomicOrdering Ordering)
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ 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.
static bool isTypeAttrKind(AttrKind Kind)
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.
LLVM Basic Block Representation.
const Instruction & back() const
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI void replacePhiUsesWith(BasicBlock *Old, BasicBlock *New)
Update all phi nodes in this basic block to refer to basic block New instead of basic block Old.
LLVM_ABI SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
void moveBefore(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it into the function that MovePos lives ...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Represents a module in a bitcode file.
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getSummary()
Parse the specified bitcode buffer, returning the module summary index.
LLVM_ABI Expected< BitcodeLTOInfo > getLTOInfo()
Returns information about the module to be used for LTO: whether to compile with ThinLTO,...
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
LLVM_ABI Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(StringRef)> IsPrevailing=nullptr, std::function< void(ValueInfo)> OnValueInfo=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata, bool IsImporting, ParserCallbacks Callbacks={})
Read the bitcode module and prepare for lazy deserialization of function bodies.
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
void push_back(Value *V, unsigned TypeID)
void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV)
Error assignValue(unsigned Idx, Value *V, unsigned TypeID)
void shrinkTo(unsigned N)
unsigned getTypeID(unsigned ValNo) const
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
ArrayRef< uint8_t > getBitcodeBytes() const
Expected< word_t > Read(unsigned NumBits)
Expected< BitstreamEntry > advance(unsigned Flags=0)
Advance the current bitstream, returning the next entry in the stream.
Expected< BitstreamEntry > advanceSkippingSubblocks(unsigned Flags=0)
This is a convenience function for clients that don't expect any subblocks.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP=nullptr)
Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
Error SkipBlock()
Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body of this block.
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
uint64_t getCurrentByteNo() const
LLVM_ABI Expected< std::optional< BitstreamBlockInfo > > ReadBlockInfoBlock(bool ReadBlockInfoNames=false)
Read and return a block info block from the bitstream.
unsigned getAbbrevIDWidth() const
Return the number of bits used to encode an abbrev #.
bool canSkipToPos(size_t pos) const
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
@ MIN_BYTE_BITS
Minimum number of bits that can be specified.
@ MAX_BYTE_BITS
Maximum number of bits that can be specified Note that bit width is stored in the Type classes Subcla...
static LLVM_ABI ByteType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing a ByteType.
bool isInlineAsm() const
Check if this call is an inline asm statement.
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CaptureInfo createFromIntValue(uint32_t Data)
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
bool isFPPredicate() const
bool isIntPredicate() const
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
static CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
static LLVM_ABI bool isElementTypeCompatible(Type *Ty)
Return true if a ConstantDataSequential can be formed with a vector or array of the specified element...
static Constant * getRaw(StringRef Data, uint64_t NumElements, Type *ElementTy)
getRaw() constructor - Return a constant with vector type with an element count and element type matc...
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static LLVM_ABI bool isSupportedBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is supported.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI bool isSupportedCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is supported.
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
static LLVM_ABI bool isOrderedRanges(ArrayRef< ConstantRange > RangesRef)
LLVM_ABI bool isUpperSignWrapped() const
Return true if the (exclusive) upper bound wraps around the signed domain.
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
static LLVM_ABI Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
static DeadOnReturnInfo createFromIntValue(uint64_t Data)
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Base class for error info classes.
virtual std::string message() const
Return the error message as a string.
virtual std::error_code convertToErrorCode() const =0
Convert this error to a std::error_code.
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
Convenience struct for specifying and reasoning about fast-math flags.
void setFast(bool B=true)
void setAllowContract(bool B=true)
void setAllowReciprocal(bool B=true)
void setNoSignedZeros(bool B=true)
void setNoNaNs(bool B=true)
void setAllowReassoc(bool B=true)
Flag setters.
void setApproxFunc(bool B=true)
void setNoInfs(bool B=true)
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
void addCallsite(CallsiteInfo &&Callsite)
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
void addAlloc(AllocInfo &&Alloc)
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
BasicBlockListType::iterator iterator
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags noUnsignedSignedWrap()
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
static LLVM_ABI GlobalIFunc * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Resolver, Module *Parent)
If a parent module is specified, the ifunc is automatically inserted into the end of the specified mo...
LLVM_ABI void setComdat(Comdat *C)
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
void setOriginalName(GlobalValue::GUID Name)
Initialize the original name hash in this summary.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
static bool isLocalLinkage(LinkageTypes Linkage)
void setUnnamedAddr(UnnamedAddr Val)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
bool hasLocalLinkage() const
bool hasDefaultVisibility() const
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
void setDLLStorageClass(DLLStorageClassTypes C)
void setThreadLocalMode(ThreadLocalMode Val)
bool hasExternalWeakLinkage() const
DLLStorageClassTypes
Storage classes of global values for PE targets.
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
void setDSOLocal(bool Local)
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
static LLVM_ABI std::string getGlobalIdentifier(StringRef Name, GlobalValue::LinkageTypes Linkage, StringRef FileName)
Return the modified name for a global value suitable to be used as the key for a global lookup (e....
void setVisibility(VisibilityTypes V)
LLVM_ABI void setSanitizerMetadata(SanitizerMetadata Meta)
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.
LLVM_ABI void setPartition(StringRef Part)
void setAttributes(AttributeSet A)
Set attribute list for this global.
LLVM_ABI void setCodeModel(CodeModel::Model CM)
Change the code model for this global.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
LLVM_ABI void addDestination(BasicBlock *Dest)
Add a destination.
static IndirectBrInst * Create(Value *Address, unsigned NumDests, InsertPosition InsertBefore=nullptr)
unsigned getNumDestinations() const
return the number of possible destinations in this indirectbr instruction.
static LLVM_ABI InlineAsm * get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack=false, AsmDialect asmDialect=AD_ATT, bool canThrow=false)
InlineAsm::get - Return the specified uniqued inline asm string.
std::vector< ConstraintInfo > ConstraintInfoVector
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB)
Replace specified successor OldBB to point at the provided block.
const char * getOpcodeName() const
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This is an important class for using LLVM in a threaded context.
static LLVM_ABI LandingPadInst * Create(Type *RetTy, unsigned NumReservedClauses, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedClauses is a hint for the number of incoming clauses that this landingpad w...
LLVM_ABI void addClause(Constant *ClauseVal)
Add a catch or filter clause to the landing pad.
void setCleanup(bool V)
Indicate that this landingpad instruction is a cleanup.
LLVM_ABI StringRef getString() const
ValueT lookup(const KeyT &Key) const
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
size_t getBufferSize() const
StringRef getBufferIdentifier() const
const char * getBufferStart() const
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
static MemoryEffectsBase readOnly()
MemoryEffectsBase getWithModRef(Location Loc, ModRefInfo MR) const
Get new MemoryEffectsBase with modified ModRefInfo for Loc.
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
ModRefInfo getModRef(Location Loc) const
Get ModRefInfo for the given Location.
static MemoryEffectsBase errnoMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase createFromIntValue(uint32_t Data)
static MemoryEffectsBase writeOnly()
static MemoryEffectsBase otherMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase none()
static MemoryEffectsBase unknown()
Class to hold module path string table and global value map, and encapsulate methods for operating on...
TypeIdSummary & getOrInsertTypeIdSummary(StringRef TypeId)
Return an existing or new TypeIdSummary entry for TypeId.
ModulePathStringTableTy::value_type ModuleInfo
ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID)
Return a ValueInfo for GUID.
static constexpr uint64_t BitcodeSummaryVersion
StringRef saveString(StringRef String)
LLVM_ABI void setFlags(uint64_t Flags)
CfiFunctionIndex & cfiFunctionDecls()
void addBlockCount(uint64_t C)
ModuleInfo * addModule(StringRef ModPath, ModuleHash Hash=ModuleHash{{0}})
Add a new module with the given Hash, mapped to the given ModID, and return a reference to the module...
void addGlobalValueSummary(const GlobalValue &GV, std::unique_ptr< GlobalValueSummary > Summary)
Add a global value summary for a value.
CfiFunctionIndex & cfiFunctionDefs()
GlobalValueSummary * findSummaryInModule(ValueInfo VI, StringRef ModuleId) const
Find the summary for ValueInfo VI in module ModuleId, or nullptr if not found.
unsigned addOrGetStackIdIndex(uint64_t StackId)
ModuleInfo * getModule(StringRef ModPath)
Return module entry for module with the given ModPath.
void addOriginalName(GlobalValue::GUID ValueGUID, GlobalValue::GUID OrigGUID)
Add an original name for the value of the given GUID.
TypeIdCompatibleVtableInfo & getOrInsertTypeIdCompatibleVtableSummary(StringRef TypeId)
Return an existing or new TypeIdCompatibleVtableMap entry for TypeId.
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
NamedMDNode * getNamedMetadata(StringRef Name) const
Return the first NamedMDNode in the module with the specified name.
NamedMDNode * getOrInsertNamedMetadata(StringRef Name)
Return the named MDNode in the module with the specified name.
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
static ResumeInst * Create(Value *Exn, InsertPosition InsertBefore=nullptr)
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
ArrayRef< int > getShuffleMask() const
void append(StringRef RHS)
Append from a StringRef.
StringRef str() const
Explicit conversion to StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
constexpr bool empty() const
Check if the string is empty.
constexpr size_t size() const
Get the string size.
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
LLVM_ABI void setName(StringRef Name)
Change the name of this type to the specified name, or to a name with a suffix if there is a collisio...
LLVM_ABI Error setBodyOrError(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type or return an error if it would make the type recursive.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
LLVM_ABI bool visitTBAAMetadata(const Instruction *I, const MDNode *MD)
Visit an instruction, or a TBAA node itself as part of a metadata, and return true if it is valid,...
@ HasZeroInit
zeroinitializer is valid for this target extension type.
static LLVM_ABI Expected< TargetExtType * > getOrError(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters,...
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI Type * getStructElementType(unsigned N) const
bool isVectorTy() const
True if this is an instance of VectorType.
bool isArrayTy() const
True if this is an instance of ArrayType.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
bool isLabelTy() const
Return true if this is 'label'.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
Type * getArrayElementType() const
LLVM_ABI unsigned getStructNumElements() const
LLVM_ABI uint64_t getArrayNumElements() const
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isStructTy() const
True if this is an instance of StructType.
bool isByteOrByteVectorTy() const
Return true if this is a byte type or a vector of byte types.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
bool isVoidTy() const
Return true if this is 'void'.
bool isMetadataTy() const
Return true if this is 'metadata'.
static LLVM_ABI UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
const ParentTy * getParent() const
self_iterator getIterator()
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 Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
constexpr uint8_t RecordLength
Length of the parts of a physical GOFF record.
@ BasicBlock
Various leaf nodes.
LLVM_ABI AttributeList getAttributes(LLVMContext &C, ID id, FunctionType *FT)
Return the attributes for an intrinsic.
@ SingleThread
Synchronized with respect to signal handlers executing in the same thread.
@ System
Synchronized with respect to all concurrently executing threads.
@ TYPE_CODE_OPAQUE_POINTER
@ 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_CE_INBOUNDS_GEP
@ CST_CODE_INLINEASM_OLD3
@ CST_CODE_CE_GEP_WITH_INRANGE_INDEX_OLD
@ CST_CODE_DSO_LOCAL_EQUIVALENT
@ CST_CODE_INLINEASM_OLD2
@ CST_CODE_CE_GEP_WITH_INRANGE
@ VST_CODE_COMBINED_ENTRY
@ 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_INACCESSIBLEMEM_ONLY
@ 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_INACCESSIBLEMEM_OR_ARGMEMONLY
@ 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_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
@ BLOCKINFO_BLOCK_ID
BLOCKINFO_BLOCK is used to define metadata about blocks, for example, standard abbrevs that should be...
@ MODULE_CODE_SOURCE_FILENAME
@ MODULE_CODE_SECTIONNAME
@ MODULE_CODE_ASM_PROPERTY
@ FUNC_CODE_INST_ATOMICRMW_OLD
@ FUNC_CODE_INST_CATCHRET
@ FUNC_CODE_INST_LANDINGPAD
@ FUNC_CODE_INST_EXTRACTVAL
@ FUNC_CODE_INST_CATCHPAD
@ FUNC_CODE_INST_CATCHSWITCH
@ FUNC_CODE_INST_INBOUNDS_GEP_OLD
@ FUNC_CODE_INST_STOREATOMIC_OLD
@ FUNC_CODE_INST_CLEANUPRET
@ FUNC_CODE_INST_LANDINGPAD_OLD
@ 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_STORE_OLD
@ FUNC_CODE_INST_UNREACHABLE
@ FUNC_CODE_INST_CMPXCHG_OLD
@ FUNC_CODE_DEBUG_RECORD_DECLARE
@ FUNC_CODE_OPERAND_BUNDLE
@ PARAMATTR_CODE_ENTRY_OLD
@ PARAMATTR_GRP_CODE_ENTRY
initializer< Ty > init(const Ty &Val)
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
NodeAddr< FuncNode * > Func
friend class Instruction
Iterator for Instructions in a `BasicBlock.
constexpr bool IsBigEndianHost
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.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
StringMapEntry< Value * > ValueName
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
LLVM_ABI const std::error_category & BitcodeErrorCategory()
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.
LLVM_ABI Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
LLVM_ABI void UpgradeInlineAsmString(std::string *AsmStr)
Upgrade comment in call to inline asm that represents an objc retain release marker.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
std::error_code make_error_code(BitcodeError E)
LLVM_ABI bool stripDebugInfo(Function &F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Expected< bool > isBitcodeContainingObjCCategory(MemoryBufferRef Buffer)
Return true if Buffer contains a bitcode file with ObjC code (category or class) in it.
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI void UpgradeAttributes(AttrBuilder &B)
Upgrade attributes that changed format or kind.
LLVM_ABI Expected< std::string > getBitcodeTargetTriple(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the triple information.
LLVM_ABI std::unique_ptr< Module > parseModule(const uint8_t *Data, size_t Size, LLVMContext &Context)
Fuzzer friendly interface for the llvm bitcode parser.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI Expected< BitcodeFileContents > getBitcodeFileContents(MemoryBufferRef Buffer)
Returns the contents of a bitcode file.
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
LLVM_ABI bool UpgradeCFIFunctionsMetadata(Module &M)
Upgrade the cfi.functions metadata node by calculating and inserting the GUID for each function entry...
LLVM_ABI void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
auto uninitialized_copy(R &&Src, IterTy Dst)
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
bool isa_and_nonnull(const Y &Val)
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
LLVM_ABI void UpgradeOperandBundles(std::vector< OperandBundleDef > &OperandBundles)
Upgrade operand bundles (without knowing about their user instruction).
LLVM_ABI Constant * UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy)
This is an auto-upgrade for bitcast constant expression between pointers with different address space...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndex(MemoryBufferRef Buffer)
Parse the specified bitcode buffer, returning the module summary index.
auto dyn_cast_or_null(const Y &Val)
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
LLVM_ABI Expected< std::string > getBitcodeProducerString(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the producer string information.
auto reverse(ContainerTy &&C)
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyBitcodeModule(MemoryBufferRef Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Read the header of the specified bitcode buffer and prepare for lazy deserialization of function bodi...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
detail::ValueMatchesPoly< M > HasValue(M Matcher)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI std::string UpgradeDataLayoutString(StringRef DL, StringRef Triple)
Upgrade the datalayout string by adding a section for address space pointers.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
LLVM_ABI Expected< BitcodeLTOInfo > getBitcodeLTOInfo(MemoryBufferRef Buffer)
Returns LTO information for the specified bitcode file.
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_ABI GlobalVariable * UpgradeGlobalVariable(GlobalVariable *GV)
This checks for global variables which should be upgraded.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
AtomicOrdering
Atomic ordering for LLVM's memory model.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
@ ArgMem
Access to memory via argument pointers.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
LLVM_ABI Instruction * UpgradeBitCastInst(unsigned Opc, Value *V, Type *DestTy, Instruction *&Temp)
This is an auto-upgrade for bitcast between pointers with different address spaces: the instruction i...
MaybeAlign decodeMaybeAlign(unsigned Value)
Dual operation of the encode function above.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr, const unsigned char *&BufEnd, bool VerifyBufferSize)
SkipBitcodeWrapperHeader - Some systems wrap bc files with a special header for padding or other reas...
bool isBitcodeWrapper(const unsigned char *BufPtr, const unsigned char *BufEnd)
isBitcodeWrapper - Return true if the given bytes are the magic bytes for an LLVM IR bitcode wrapper.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI APInt readWideAPInt(ArrayRef< uint64_t > Vals, unsigned TypeBits)
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
LLVM_ABI void UpgradeFunctionAttributes(Function &F)
Correct any IR that is relying on old function attribute behavior.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
LLVM_ABI Error readModuleSummaryIndex(MemoryBufferRef Buffer, ModuleSummaryIndex &CombinedIndex)
Parse the specified bitcode buffer and merge the index into CombinedIndex.
void consumeError(Error Err)
Consume a Error without doing anything.
LLVM_ABI void UpgradeARCRuntime(Module &M)
Convert calls to ARC runtime functions to intrinsic calls and upgrade the old retain release marker t...
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndexForFile(StringRef Path, bool IgnoreEmptyThinLTOIndexFile=false)
Parse the module summary index out of an IR file and return the module summary index object if found,...
LLVM_ABI Expected< std::unique_ptr< Module > > getOwningLazyBitcodeModule(std::unique_ptr< MemoryBuffer > &&Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Like getLazyBitcodeModule, except that the module takes ownership of the memory buffer if successful.
LLVM_ABI std::error_code errorToErrorCodeAndEmitErrors(LLVMContext &Ctx, Error Err)
Implement std::hash so that hash_code can be used in STL containers.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Basic information extracted from a bitcode module to be used for LTO.
static Bitfield::Type get(StorageType Packed)
Unpacks the field from the Packed value.
When advancing through a bitstream cursor, each advance can discover a few different kinds of entries...
static constexpr DenormalFPEnv createFromIntValue(uint32_t Data)
Flags specific to function summaries.
static constexpr uint32_t RangeWidth
std::vector< Call > Calls
In the per-module summary, it summarizes the byte offset applied to each pointer parameter before pas...
ConstantRange Use
The range contains byte offsets from the parameter pointer which accessed by the function.
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
static LLVM_ABI const char * BranchWeights
LLVM_ABI bool set(StringRef Name, std::string Value)
Set a property using a string name.
std::optional< ValueTypeCallbackTy > ValueType
The ValueType callback is called for every function definition or declaration and allows accessing th...
std::optional< DataLayoutCallbackFuncTy > DataLayout
std::optional< MDTypeCallbackTy > MDType
The MDType callback is called for every value in metadata.
bool SkipDebugIntrinsicUpgrade
If true, do not auto-upgrade debug intrinsic calls (llvm.dbg.
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
Kind
Specifies which kind of type check we should emit for this byte array.
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
ValID - Represents a reference of a definition of some sort with no type.
Struct that holds a reference to a particular GUID in a global value summary.
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