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;
585 uint64_t NextUnreadBit = 0;
587 uint64_t LastFunctionBlockBit = 0;
588 bool SeenValueSymbolTable =
false;
589 uint64_t VSTOffset = 0;
591 std::vector<std::string> SectionTable;
592 std::vector<std::string> GCTable;
594 std::vector<Type *> TypeList;
598 DenseMap<unsigned, SmallVector<unsigned, 1>> ContainedTypeIDs;
605 DenseMap<std::pair<Type *, unsigned>,
unsigned> VirtualTypeIDs;
606 DenseMap<Function *, unsigned> FunctionTypeIDs;
611 BitcodeReaderValueList ValueList;
612 std::optional<MetadataLoader> MDLoader;
613 std::vector<Comdat *> ComdatList;
614 DenseSet<GlobalObject *> ImplicitComdatObjects;
617 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInits;
618 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInits;
620 struct FunctionOperandInfo {
622 unsigned PersonalityFn;
626 std::vector<FunctionOperandInfo> FunctionOperands;
630 std::vector<AttributeList> MAttributes;
633 std::map<unsigned, AttributeList> MAttributeGroups;
637 std::vector<BasicBlock*> FunctionBBs;
641 std::vector<Function*> FunctionsWithBodies;
645 using UpdatedIntrinsicMap = DenseMap<Function *, Function *>;
646 UpdatedIntrinsicMap 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;
704 bool SkipDebugIntrinsicUpgrade =
false;
707 BitcodeReader(BitstreamCursor Stream, StringRef Strtab,
708 StringRef ProducerIdentification, LLVMContext &
Context);
710 Error materializeForwardReferencedFunctions();
712 Error materialize(GlobalValue *GV)
override;
713 Error materializeModule()
override;
714 std::vector<StructType *> getIdentifiedStructTypes()
const override;
718 Error parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
719 bool IsImporting, ParserCallbacks Callbacks = {});
721 static uint64_t decodeSignRotatedValue(uint64_t V);
724 Error materializeMetadata()
override;
726 void setStripDebugInfo()
override;
729 std::vector<StructType *> IdentifiedStructTypes;
730 StructType *createIdentifiedStructType(LLVMContext &
Context, StringRef Name);
731 StructType *createIdentifiedStructType(LLVMContext &
Context);
733 static constexpr unsigned InvalidTypeID = ~0
u;
735 Type *getTypeByID(
unsigned ID);
736 Type *getPtrElementTypeByID(
unsigned ID);
737 unsigned getContainedTypeID(
unsigned ID,
unsigned Idx = 0);
738 unsigned getVirtualTypeID(
Type *Ty, ArrayRef<unsigned> ContainedTypeIDs = {});
741 Expected<Value *> materializeValue(
unsigned ValID, BasicBlock *InsertBB);
742 Expected<Constant *> getValueForInitializer(
unsigned ID);
744 Value *getFnValueByID(
unsigned ID,
Type *Ty,
unsigned TyID,
745 BasicBlock *ConstExprInsertBB) {
752 return MDLoader->getMetadataFwdRefOrLoad(
ID);
756 if (
ID >= FunctionBBs.size())
return nullptr;
757 return FunctionBBs[
ID];
761 if (i-1 < MAttributes.size())
762 return MAttributes[i-1];
763 return AttributeList();
769 bool getValueTypePair(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
770 unsigned InstNum,
Value *&ResVal,
unsigned &
TypeID,
771 BasicBlock *ConstExprInsertBB) {
772 if (Slot ==
Record.size())
return true;
773 unsigned ValNo = (unsigned)Record[Slot++];
776 ValNo = InstNum - ValNo;
777 if (ValNo < InstNum) {
781 ResVal = getFnValueByID(ValNo,
nullptr,
TypeID, ConstExprInsertBB);
783 "Incorrect type ID stored for value");
784 return ResVal ==
nullptr;
786 if (Slot ==
Record.size())
789 TypeID = (unsigned)Record[Slot++];
790 ResVal = getFnValueByID(ValNo, getTypeByID(
TypeID),
TypeID,
792 return ResVal ==
nullptr;
795 bool getValueOrMetadata(
const SmallVectorImpl<uint64_t> &Record,
796 unsigned &Slot,
unsigned InstNum,
Value *&ResVal,
797 BasicBlock *ConstExprInsertBB) {
798 if (Slot ==
Record.size())
803 return getValueTypePair(Record, --Slot, InstNum, ResVal, TypeId,
806 if (Slot ==
Record.size())
808 unsigned ValNo = InstNum - (unsigned)Record[Slot++];
816 bool popValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
817 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
818 BasicBlock *ConstExprInsertBB) {
819 if (
getValue(Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
827 bool getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
828 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
829 BasicBlock *ConstExprInsertBB) {
830 ResVal =
getValue(Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
831 return ResVal ==
nullptr;
836 Value *
getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
837 unsigned InstNum,
Type *Ty,
unsigned TyID,
838 BasicBlock *ConstExprInsertBB) {
839 if (Slot ==
Record.size())
return nullptr;
840 unsigned ValNo = (unsigned)Record[Slot];
843 ValNo = InstNum - ValNo;
844 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
848 Value *getValueSigned(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
849 unsigned InstNum,
Type *Ty,
unsigned TyID,
850 BasicBlock *ConstExprInsertBB) {
851 if (Slot ==
Record.size())
return nullptr;
852 unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]);
855 ValNo = InstNum - ValNo;
856 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
859 Expected<ConstantRange> readConstantRange(ArrayRef<uint64_t> Record,
862 if (
Record.size() - OpNum < 2)
863 return error(
"Too few records for range");
865 unsigned LowerActiveWords =
Record[OpNum];
866 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
867 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
868 return error(
"Too few records for range");
871 OpNum += LowerActiveWords;
874 OpNum += UpperActiveWords;
877 int64_t
Start = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
878 int64_t End = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
879 return ConstantRange(APInt(
BitWidth, Start,
true),
884 Expected<ConstantRange>
885 readBitWidthAndConstantRange(ArrayRef<uint64_t> Record,
unsigned &OpNum) {
886 if (
Record.size() - OpNum < 1)
887 return error(
"Too few records for range");
889 return readConstantRange(Record, OpNum,
BitWidth);
895 Error propagateAttributeTypes(CallBase *CB, ArrayRef<unsigned> ArgsTys);
900 Error parseAlignmentValue(uint64_t
Exponent, MaybeAlign &Alignment);
901 Error parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind);
903 ParserCallbacks Callbacks = {});
905 Error parseComdatRecord(ArrayRef<uint64_t> Record);
906 Error parseGlobalVarRecord(ArrayRef<uint64_t> Record);
907 Error parseFunctionRecord(ArrayRef<uint64_t> Record);
908 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
909 ArrayRef<uint64_t> Record);
911 Error parseAttributeBlock();
912 Error parseAttributeGroupBlock();
913 Error parseTypeTable();
914 Error parseTypeTableBody();
915 Error parseOperandBundleTags();
916 Error parseSyncScopeNames();
918 Expected<Value *> recordValue(SmallVectorImpl<uint64_t> &Record,
919 unsigned NameIndex, Triple &TT);
920 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta, Function *
F,
921 ArrayRef<uint64_t> Record);
923 Error parseGlobalValueSymbolTable();
924 Error parseConstants();
925 Error rememberAndSkipFunctionBodies();
926 Error rememberAndSkipFunctionBody();
928 Error rememberAndSkipMetadata();
930 Error parseFunctionBody(Function *
F);
931 Error globalCleanup();
932 Error resolveGlobalAndIndirectSymbolInits();
933 Error parseUseLists();
934 Error findFunctionInStream(
936 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator);
943class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
945 ModuleSummaryIndex &TheIndex;
949 bool SeenGlobalValSummary =
false;
952 bool SeenValueSymbolTable =
false;
956 uint64_t VSTOffset = 0;
966 DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
967 ValueIdToValueInfoMap;
973 DenseMap<uint64_t, StringRef> ModuleIdMap;
976 std::string SourceFileName;
980 StringRef ModulePath;
988 std::vector<uint64_t> StackIds;
992 std::vector<uint64_t> RadixArray;
997 std::vector<unsigned> StackIdToIndex;
1000 ModuleSummaryIndexBitcodeReader(
1001 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
1002 StringRef ModulePath,
1008 void setValueGUID(uint64_t ValueID, StringRef
ValueName,
1010 StringRef SourceFileName);
1011 Error parseValueSymbolTable(
1013 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
1016 makeCallList(ArrayRef<uint64_t> Record,
bool IsOldProfileFormat,
1017 bool HasProfile,
bool HasRelBF);
1018 Error parseEntireSummary(
unsigned ID);
1019 Error parseModuleStringTable();
1020 void parseTypeIdCompatibleVtableSummaryRecord(ArrayRef<uint64_t> Record);
1021 void parseTypeIdCompatibleVtableInfo(ArrayRef<uint64_t> Record,
size_t &Slot,
1023 std::vector<FunctionSummary::ParamAccess>
1024 parseParamAccesses(ArrayRef<uint64_t> Record);
1025 SmallVector<unsigned> parseAllocInfoContext(ArrayRef<uint64_t> Record,
1029 static constexpr unsigned UninitializedStackIdIndex =
1030 std::numeric_limits<unsigned>::max();
1032 unsigned getStackIdIndex(
unsigned LocalIndex) {
1033 unsigned &
Index = StackIdToIndex[LocalIndex];
1036 if (Index == UninitializedStackIdIndex)
1041 template <
bool AllowNullValueInfo = false>
1042 std::pair<ValueInfo, GlobalValue::GUID>
1043 getValueInfoFromValueId(
unsigned ValueId);
1045 void addThisModule();
1061 return std::error_code();
1067 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1068 ValueList(this->Stream.SizeInBytes(),
1070 return materializeValue(
ValID, InsertBB);
1072 this->ProducerIdentification = std::string(ProducerIdentification);
1075Error BitcodeReader::materializeForwardReferencedFunctions() {
1076 if (WillMaterializeAllForwardRefs)
1080 WillMaterializeAllForwardRefs =
true;
1082 while (!BasicBlockFwdRefQueue.empty()) {
1083 Function *
F = BasicBlockFwdRefQueue.front();
1084 BasicBlockFwdRefQueue.pop_front();
1085 assert(
F &&
"Expected valid function");
1086 if (!BasicBlockFwdRefs.
count(
F))
1094 if (!
F->isMaterializable())
1095 return error(
"Never resolved function from blockaddress");
1098 if (
Error Err = materialize(
F))
1101 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1103 for (Function *
F : BackwardRefFunctions)
1104 if (
Error Err = materialize(
F))
1106 BackwardRefFunctions.clear();
1109 WillMaterializeAllForwardRefs =
false;
1174 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1175 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1176 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1177 Flags.NoInline = (RawFlags >> 4) & 0x1;
1178 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1179 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1180 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1181 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1182 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1198 bool NoRenameOnPromotion = ((RawFlags >> 11) & 1);
1199 RawFlags = RawFlags >> 4;
1200 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1204 bool Live = (RawFlags & 0x2) || Version < 3;
1205 bool Local = (RawFlags & 0x4);
1206 bool AutoHide = (RawFlags & 0x8);
1209 Live,
Local, AutoHide, IK,
1210 NoRenameOnPromotion);
1216 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1217 (RawFlags & 0x4) ?
true :
false,
1221static std::pair<CalleeInfo::HotnessType, bool>
1225 bool HasTailCall = (RawFlags & 0x8);
1226 return {Hotness, HasTailCall};
1231 bool &HasTailCall) {
1232 static constexpr unsigned RelBlockFreqBits = 28;
1233 static constexpr uint64_t RelBlockFreqMask = (1 << RelBlockFreqBits) - 1;
1234 RelBF = RawFlags & RelBlockFreqMask;
1235 HasTailCall = (RawFlags & (1 << RelBlockFreqBits));
1260 case 0:
return false;
1261 case 1:
return true;
1323 bool IsFP = Ty->isFPOrFPVectorTy();
1325 if (!IsFP && !Ty->isIntOrIntVectorTy())
1332 return IsFP ? Instruction::FNeg : -1;
1337 bool IsFP = Ty->isFPOrFPVectorTy();
1339 if (!IsFP && !Ty->isIntOrIntVectorTy())
1346 return IsFP ? Instruction::FAdd : Instruction::Add;
1348 return IsFP ? Instruction::FSub : Instruction::Sub;
1350 return IsFP ? Instruction::FMul : Instruction::Mul;
1352 return IsFP ? -1 : Instruction::UDiv;
1354 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1356 return IsFP ? -1 : Instruction::URem;
1358 return IsFP ? Instruction::FRem : Instruction::SRem;
1360 return IsFP ? -1 : Instruction::Shl;
1362 return IsFP ? -1 : Instruction::LShr;
1364 return IsFP ? -1 : Instruction::AShr;
1366 return IsFP ? -1 : Instruction::And;
1368 return IsFP ? -1 : Instruction::Or;
1370 return IsFP ? -1 : Instruction::Xor;
1375 bool &IsElementwise) {
1473Type *BitcodeReader::getTypeByID(
unsigned ID) {
1475 if (
ID >= TypeList.size())
1478 if (
Type *Ty = TypeList[
ID])
1483 return TypeList[
ID] = createIdentifiedStructType(
Context);
1486unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1487 auto It = ContainedTypeIDs.
find(
ID);
1488 if (It == ContainedTypeIDs.
end())
1489 return InvalidTypeID;
1491 if (Idx >= It->second.size())
1492 return InvalidTypeID;
1494 return It->second[Idx];
1497Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1498 if (
ID >= TypeList.size())
1505 return getTypeByID(getContainedTypeID(
ID, 0));
1508unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1509 ArrayRef<unsigned> ChildTypeIDs) {
1510 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1511 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1512 auto It = VirtualTypeIDs.
find(CacheKey);
1513 if (It != VirtualTypeIDs.
end()) {
1519 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1520 "Incorrect cached contained type IDs");
1524 unsigned TypeID = TypeList.size();
1525 TypeList.push_back(Ty);
1526 if (!ChildTypeIDs.
empty())
1547 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1561 if (Opcode == Instruction::GetElementPtr)
1565 case Instruction::FNeg:
1566 case Instruction::Select:
1567 case Instruction::ICmp:
1568 case Instruction::FCmp:
1575Expected<Value *> BitcodeReader::materializeValue(
unsigned StartValID,
1576 BasicBlock *InsertBB) {
1578 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1580 return ValueList[StartValID];
1582 SmallDenseMap<unsigned, Value *> MaterializedValues;
1583 SmallVector<unsigned> Worklist;
1585 while (!Worklist.
empty()) {
1586 unsigned ValID = Worklist.
back();
1587 if (MaterializedValues.
count(ValID)) {
1593 if (ValID >= ValueList.
size() || !ValueList[ValID])
1594 return error(
"Invalid value ID");
1596 Value *
V = ValueList[ValID];
1599 MaterializedValues.
insert({ValID,
V});
1607 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1608 auto It = MaterializedValues.
find(OpID);
1609 if (It != MaterializedValues.
end())
1610 Ops.push_back(It->second);
1617 if (
Ops.size() != BC->getOperandIDs().size())
1619 std::reverse(
Ops.begin(),
Ops.end());
1636 switch (BC->Opcode) {
1637 case BitcodeConstant::ConstantPtrAuthOpcode: {
1640 return error(
"ptrauth key operand must be ConstantInt");
1644 return error(
"ptrauth disc operand must be ConstantInt");
1647 ConstOps.
size() > 4 ? ConstOps[4]
1652 "ptrauth deactivation symbol operand must be a pointer");
1655 DeactivationSymbol);
1658 case BitcodeConstant::NoCFIOpcode: {
1661 return error(
"no_cfi operand must be GlobalValue");
1665 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1668 return error(
"dso_local operand must be GlobalValue");
1672 case BitcodeConstant::BlockAddressOpcode: {
1675 return error(
"blockaddress operand must be a function");
1680 unsigned BBID = BC->BlockAddressBB;
1683 return error(
"Invalid ID");
1686 for (
size_t I = 0,
E = BBID;
I !=
E; ++
I) {
1688 return error(
"Invalid ID");
1695 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1697 BasicBlockFwdRefQueue.push_back(Fn);
1698 if (FwdBBs.size() < BBID + 1)
1699 FwdBBs.resize(BBID + 1);
1707 case BitcodeConstant::ConstantStructOpcode: {
1709 if (
ST->getNumElements() != ConstOps.
size())
1710 return error(
"Invalid number of elements in struct initializer");
1712 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1713 if (
Op->getType() != Ty)
1714 return error(
"Incorrect type in struct initializer");
1719 case BitcodeConstant::ConstantArrayOpcode: {
1721 if (AT->getNumElements() != ConstOps.
size())
1722 return error(
"Invalid number of elements in array initializer");
1724 for (Constant *
Op : ConstOps)
1725 if (
Op->getType() != AT->getElementType())
1726 return error(
"Incorrect type in array initializer");
1731 case BitcodeConstant::ConstantVectorOpcode: {
1733 if (VT->getNumElements() != ConstOps.size())
1734 return error(
"Invalid number of elements in vector initializer");
1736 for (Constant *
Op : ConstOps)
1737 if (
Op->getType() != VT->getElementType())
1738 return error(
"Incorrect type in vector initializer");
1743 case Instruction::GetElementPtr:
1745 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1748 case Instruction::ExtractElement:
1751 case Instruction::InsertElement:
1755 case Instruction::ShuffleVector: {
1756 SmallVector<int, 16>
Mask;
1768 MaterializedValues.
insert({ValID,
C});
1774 return error(Twine(
"Value referenced by initializer is an unsupported "
1775 "constant expression of type ") +
1776 BC->getOpcodeName());
1782 BC->getType(),
"constexpr", InsertBB);
1785 "constexpr", InsertBB);
1788 Ops[1],
"constexpr", InsertBB);
1791 I->setHasNoSignedWrap();
1793 I->setHasNoUnsignedWrap();
1799 switch (BC->Opcode) {
1800 case BitcodeConstant::ConstantVectorOpcode: {
1801 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1804 Value *Idx = ConstantInt::get(IdxTy, Pair.index());
1811 case BitcodeConstant::ConstantStructOpcode:
1812 case BitcodeConstant::ConstantArrayOpcode: {
1816 "constexpr.ins", InsertBB);
1820 case Instruction::ICmp:
1821 case Instruction::FCmp:
1824 "constexpr", InsertBB);
1826 case Instruction::GetElementPtr:
1832 case Instruction::Select:
1835 case Instruction::ExtractElement:
1838 case Instruction::InsertElement:
1842 case Instruction::ShuffleVector:
1843 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1851 MaterializedValues.
insert({ValID,
I});
1855 return MaterializedValues[StartValID];
1858Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1859 Expected<Value *> MaybeV = materializeValue(
ID,
nullptr);
1867StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1870 IdentifiedStructTypes.push_back(Ret);
1874StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1876 IdentifiedStructTypes.push_back(Ret);
1892 case Attribute::ZExt:
return 1 << 0;
1893 case Attribute::SExt:
return 1 << 1;
1894 case Attribute::NoReturn:
return 1 << 2;
1895 case Attribute::InReg:
return 1 << 3;
1896 case Attribute::StructRet:
return 1 << 4;
1897 case Attribute::NoUnwind:
return 1 << 5;
1898 case Attribute::NoAlias:
return 1 << 6;
1899 case Attribute::ByVal:
return 1 << 7;
1900 case Attribute::Nest:
return 1 << 8;
1901 case Attribute::ReadNone:
return 1 << 9;
1902 case Attribute::ReadOnly:
return 1 << 10;
1903 case Attribute::NoInline:
return 1 << 11;
1904 case Attribute::AlwaysInline:
return 1 << 12;
1905 case Attribute::OptimizeForSize:
return 1 << 13;
1906 case Attribute::StackProtect:
return 1 << 14;
1907 case Attribute::StackProtectReq:
return 1 << 15;
1908 case Attribute::Alignment:
return 31 << 16;
1910 case Attribute::NoRedZone:
return 1 << 22;
1911 case Attribute::NoImplicitFloat:
return 1 << 23;
1912 case Attribute::Naked:
return 1 << 24;
1913 case Attribute::InlineHint:
return 1 << 25;
1914 case Attribute::StackAlignment:
return 7 << 26;
1915 case Attribute::ReturnsTwice:
return 1 << 29;
1916 case Attribute::UWTable:
return 1 << 30;
1917 case Attribute::NonLazyBind:
return 1U << 31;
1918 case Attribute::SanitizeAddress:
return 1ULL << 32;
1919 case Attribute::MinSize:
return 1ULL << 33;
1920 case Attribute::NoDuplicate:
return 1ULL << 34;
1921 case Attribute::StackProtectStrong:
return 1ULL << 35;
1922 case Attribute::SanitizeThread:
return 1ULL << 36;
1923 case Attribute::SanitizeMemory:
return 1ULL << 37;
1924 case Attribute::NoBuiltin:
return 1ULL << 38;
1925 case Attribute::Returned:
return 1ULL << 39;
1926 case Attribute::Cold:
return 1ULL << 40;
1927 case Attribute::Builtin:
return 1ULL << 41;
1928 case Attribute::OptimizeNone:
return 1ULL << 42;
1929 case Attribute::InAlloca:
return 1ULL << 43;
1930 case Attribute::NonNull:
return 1ULL << 44;
1931 case Attribute::JumpTable:
return 1ULL << 45;
1932 case Attribute::Convergent:
return 1ULL << 46;
1933 case Attribute::SafeStack:
return 1ULL << 47;
1934 case Attribute::NoRecurse:
return 1ULL << 48;
1937 case Attribute::SwiftSelf:
return 1ULL << 51;
1938 case Attribute::SwiftError:
return 1ULL << 52;
1939 case Attribute::WriteOnly:
return 1ULL << 53;
1940 case Attribute::Speculatable:
return 1ULL << 54;
1941 case Attribute::StrictFP:
return 1ULL << 55;
1942 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1943 case Attribute::NoCfCheck:
return 1ULL << 57;
1944 case Attribute::OptForFuzzing:
return 1ULL << 58;
1945 case Attribute::ShadowCallStack:
return 1ULL << 59;
1946 case Attribute::SpeculativeLoadHardening:
1948 case Attribute::ImmArg:
1950 case Attribute::WillReturn:
1952 case Attribute::NoFree:
1968 if (
I == Attribute::Alignment)
1969 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1970 else if (
I == Attribute::StackAlignment)
1971 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1973 B.addTypeAttr(
I,
nullptr);
1987 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
1989 "Alignment must be a power of two.");
1992 B.addAlignmentAttr(Alignment);
1994 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
1995 (EncodedAttrs & 0xffff);
1997 if (AttrIdx == AttributeList::FunctionIndex) {
2000 if (Attrs & (1ULL << 9)) {
2002 Attrs &= ~(1ULL << 9);
2005 if (Attrs & (1ULL << 10)) {
2007 Attrs &= ~(1ULL << 10);
2010 if (Attrs & (1ULL << 49)) {
2012 Attrs &= ~(1ULL << 49);
2015 if (Attrs & (1ULL << 50)) {
2017 Attrs &= ~(1ULL << 50);
2020 if (Attrs & (1ULL << 53)) {
2022 Attrs &= ~(1ULL << 53);
2026 B.addMemoryAttr(ME);
2030 if (Attrs & (1ULL << 21)) {
2031 Attrs &= ~(1ULL << 21);
2038Error BitcodeReader::parseAttributeBlock() {
2042 if (!MAttributes.empty())
2043 return error(
"Invalid multiple blocks");
2045 SmallVector<uint64_t, 64>
Record;
2054 BitstreamEntry
Entry = MaybeEntry.
get();
2056 switch (
Entry.Kind) {
2059 return error(
"Malformed block");
2072 switch (MaybeRecord.
get()) {
2078 return error(
"Invalid parameter attribute record");
2080 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2086 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2090 for (uint64_t Val : Record)
2091 Attrs.push_back(MAttributeGroups[Val]);
2093 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2106 return Attribute::Alignment;
2108 return Attribute::AlwaysInline;
2110 return Attribute::Builtin;
2112 return Attribute::ByVal;
2114 return Attribute::InAlloca;
2116 return Attribute::Cold;
2118 return Attribute::Convergent;
2120 return Attribute::DisableSanitizerInstrumentation;
2122 return Attribute::ElementType;
2124 return Attribute::FnRetThunkExtern;
2126 return Attribute::Flatten;
2128 return Attribute::InlineHint;
2130 return Attribute::InReg;
2132 return Attribute::JumpTable;
2134 return Attribute::Memory;
2136 return Attribute::NoFPClass;
2138 return Attribute::MinSize;
2140 return Attribute::Naked;
2142 return Attribute::Nest;
2144 return Attribute::NoAlias;
2146 return Attribute::NoBuiltin;
2148 return Attribute::NoCallback;
2150 return Attribute::NoDivergenceSource;
2152 return Attribute::NoDuplicate;
2154 return Attribute::NoFree;
2156 return Attribute::NoImplicitFloat;
2158 return Attribute::NoInline;
2160 return Attribute::NoRecurse;
2162 return Attribute::NoMerge;
2164 return Attribute::NonLazyBind;
2166 return Attribute::NonNull;
2168 return Attribute::Dereferenceable;
2170 return Attribute::DereferenceableOrNull;
2172 return Attribute::AllocAlign;
2174 return Attribute::AllocKind;
2176 return Attribute::AllocSize;
2178 return Attribute::AllocatedPointer;
2180 return Attribute::NoRedZone;
2182 return Attribute::NoReturn;
2184 return Attribute::NoSync;
2186 return Attribute::NoCfCheck;
2188 return Attribute::NoProfile;
2190 return Attribute::SkipProfile;
2192 return Attribute::NoUnwind;
2194 return Attribute::NoSanitizeBounds;
2196 return Attribute::NoSanitizeCoverage;
2198 return Attribute::NullPointerIsValid;
2200 return Attribute::OptimizeForDebugging;
2202 return Attribute::OptForFuzzing;
2204 return Attribute::OptimizeForSize;
2206 return Attribute::OptimizeNone;
2208 return Attribute::ReadNone;
2210 return Attribute::ReadOnly;
2212 return Attribute::Returned;
2214 return Attribute::ReturnsTwice;
2216 return Attribute::SExt;
2218 return Attribute::Speculatable;
2220 return Attribute::StackAlignment;
2222 return Attribute::StackProtect;
2224 return Attribute::StackProtectReq;
2226 return Attribute::StackProtectStrong;
2228 return Attribute::SafeStack;
2230 return Attribute::ShadowCallStack;
2232 return Attribute::StrictFP;
2234 return Attribute::StructRet;
2236 return Attribute::SanitizeAddress;
2238 return Attribute::SanitizeHWAddress;
2240 return Attribute::SanitizeThread;
2242 return Attribute::SanitizeType;
2244 return Attribute::SanitizeMemory;
2246 return Attribute::SanitizeNumericalStability;
2248 return Attribute::SanitizeRealtime;
2250 return Attribute::SanitizeRealtimeBlocking;
2252 return Attribute::SanitizeAllocToken;
2254 return Attribute::SpeculativeLoadHardening;
2256 return Attribute::SwiftError;
2258 return Attribute::SwiftSelf;
2260 return Attribute::SwiftAsync;
2262 return Attribute::UWTable;
2264 return Attribute::VScaleRange;
2266 return Attribute::WillReturn;
2268 return Attribute::WriteOnly;
2270 return Attribute::ZExt;
2272 return Attribute::ImmArg;
2274 return Attribute::SanitizeMemTag;
2276 return Attribute::Preallocated;
2278 return Attribute::NoUndef;
2280 return Attribute::ByRef;
2282 return Attribute::MustProgress;
2284 return Attribute::Hot;
2286 return Attribute::PresplitCoroutine;
2288 return Attribute::Writable;
2290 return Attribute::CoroDestroyOnlyWhenComplete;
2292 return Attribute::DeadOnUnwind;
2294 return Attribute::Range;
2296 return Attribute::Initializes;
2298 return Attribute::CoroElideSafe;
2300 return Attribute::NoExt;
2302 return Attribute::Captures;
2304 return Attribute::DeadOnReturn;
2306 return Attribute::NoCreateUndefOrPoison;
2308 return Attribute::DenormalFPEnv;
2310 return Attribute::NoOutline;
2315 MaybeAlign &Alignment) {
2318 if (
Exponent > Value::MaxAlignmentExponent + 1)
2319 return error(
"Invalid alignment value");
2324Error BitcodeReader::parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind) {
2326 if (*Kind == Attribute::None)
2327 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2332 switch (EncodedKind) {
2356Error BitcodeReader::parseAttributeGroupBlock() {
2360 if (!MAttributeGroups.empty())
2361 return error(
"Invalid multiple blocks");
2363 SmallVector<uint64_t, 64>
Record;
2370 BitstreamEntry
Entry = MaybeEntry.
get();
2372 switch (
Entry.Kind) {
2375 return error(
"Malformed block");
2388 switch (MaybeRecord.
get()) {
2393 return error(
"Invalid grp record");
2395 uint64_t GrpID =
Record[0];
2396 uint64_t Idx =
Record[1];
2400 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2401 if (Record[i] == 0) {
2402 Attribute::AttrKind
Kind;
2403 uint64_t EncodedKind =
Record[++i];
2404 if (Idx == AttributeList::FunctionIndex &&
2413 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2419 if (Kind == Attribute::ByVal)
2420 B.addByValAttr(
nullptr);
2421 else if (Kind == Attribute::StructRet)
2422 B.addStructRetAttr(
nullptr);
2423 else if (Kind == Attribute::InAlloca)
2424 B.addInAllocaAttr(
nullptr);
2425 else if (Kind == Attribute::UWTable)
2426 B.addUWTableAttr(UWTableKind::Default);
2427 else if (Kind == Attribute::DeadOnReturn)
2428 B.addDeadOnReturnAttr(DeadOnReturnInfo());
2429 else if (Attribute::isEnumAttrKind(Kind))
2430 B.addAttribute(Kind);
2432 return error(
"Not an enum attribute");
2433 }
else if (Record[i] == 1) {
2434 Attribute::AttrKind
Kind;
2435 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2437 if (!Attribute::isIntAttrKind(Kind))
2438 return error(
"Not an int attribute");
2439 if (Kind == Attribute::Alignment)
2440 B.addAlignmentAttr(Record[++i]);
2441 else if (Kind == Attribute::StackAlignment)
2442 B.addStackAlignmentAttr(Record[++i]);
2443 else if (Kind == Attribute::Dereferenceable)
2444 B.addDereferenceableAttr(Record[++i]);
2445 else if (Kind == Attribute::DereferenceableOrNull)
2446 B.addDereferenceableOrNullAttr(Record[++i]);
2447 else if (Kind == Attribute::DeadOnReturn)
2448 B.addDeadOnReturnAttr(
2450 else if (Kind == Attribute::AllocSize)
2451 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2452 else if (Kind == Attribute::VScaleRange)
2453 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2454 else if (Kind == Attribute::UWTable)
2456 else if (Kind == Attribute::AllocKind)
2457 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2458 else if (Kind == Attribute::Memory) {
2459 uint64_t EncodedME =
Record[++i];
2460 const uint8_t
Version = (EncodedME >> 56);
2472 B.addMemoryAttr(ME);
2477 EncodedME & 0x00FFFFFFFFFFFFFFULL));
2479 }
else if (Kind == Attribute::Captures)
2481 else if (Kind == Attribute::NoFPClass)
2484 else if (Kind == Attribute::DenormalFPEnv) {
2485 B.addDenormalFPEnvAttr(
2488 }
else if (Record[i] == 3 || Record[i] == 4) {
2490 SmallString<64> KindStr;
2491 SmallString<64> ValStr;
2493 while (Record[i] != 0 && i != e)
2495 assert(Record[i] == 0 &&
"Kind string not null terminated");
2500 while (Record[i] != 0 && i != e)
2502 assert(Record[i] == 0 &&
"Value string not null terminated");
2505 B.addAttribute(KindStr.
str(), ValStr.
str());
2506 }
else if (Record[i] == 5 || Record[i] == 6) {
2507 bool HasType =
Record[i] == 6;
2508 Attribute::AttrKind
Kind;
2509 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2511 if (!Attribute::isTypeAttrKind(Kind))
2512 return error(
"Not a type attribute");
2514 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2515 }
else if (Record[i] == 7) {
2516 Attribute::AttrKind
Kind;
2519 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2521 if (!Attribute::isConstantRangeAttrKind(Kind))
2522 return error(
"Not a ConstantRange attribute");
2524 Expected<ConstantRange> MaybeCR =
2525 readBitWidthAndConstantRange(Record, i);
2530 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2531 }
else if (Record[i] == 8) {
2532 Attribute::AttrKind
Kind;
2535 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2537 if (!Attribute::isConstantRangeListAttrKind(Kind))
2538 return error(
"Not a constant range list attribute");
2542 return error(
"Too few records for constant range list");
2543 unsigned RangeSize =
Record[i++];
2545 for (
unsigned Idx = 0; Idx < RangeSize; ++Idx) {
2546 Expected<ConstantRange> MaybeCR =
2547 readConstantRange(Record, i,
BitWidth);
2555 return error(
"Invalid (unordered or overlapping) range list");
2556 B.addConstantRangeListAttr(Kind, Val);
2558 return error(
"Invalid attribute group entry");
2563 B.addMemoryAttr(ME);
2566 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2573Error BitcodeReader::parseTypeTable() {
2577 return parseTypeTableBody();
2580Error BitcodeReader::parseTypeTableBody() {
2581 if (!TypeList.empty())
2582 return error(
"Invalid multiple blocks");
2584 SmallVector<uint64_t, 64>
Record;
2585 unsigned NumRecords = 0;
2594 BitstreamEntry
Entry = MaybeEntry.
get();
2596 switch (
Entry.Kind) {
2599 return error(
"Malformed block");
2601 if (NumRecords != TypeList.size())
2602 return error(
"Malformed block");
2611 Type *ResultTy =
nullptr;
2612 SmallVector<unsigned> ContainedIDs;
2616 switch (MaybeRecord.
get()) {
2618 return error(
"Invalid value");
2623 return error(
"Invalid numentry record");
2624 TypeList.resize(Record[0]);
2627 ResultTy = Type::getVoidTy(
Context);
2630 ResultTy = Type::getHalfTy(
Context);
2633 ResultTy = Type::getBFloatTy(
Context);
2636 ResultTy = Type::getFloatTy(
Context);
2639 ResultTy = Type::getDoubleTy(
Context);
2642 ResultTy = Type::getX86_FP80Ty(
Context);
2645 ResultTy = Type::getFP128Ty(
Context);
2648 ResultTy = Type::getPPC_FP128Ty(
Context);
2651 ResultTy = Type::getLabelTy(
Context);
2654 ResultTy = Type::getMetadataTy(
Context);
2662 ResultTy = Type::getX86_AMXTy(
Context);
2665 ResultTy = Type::getTokenTy(
Context);
2669 return error(
"Invalid record");
2671 uint64_t NumBits =
Record[0];
2674 return error(
"Bitwidth for byte type out of range");
2680 return error(
"Invalid integer record");
2682 uint64_t NumBits =
Record[0];
2685 return error(
"Bitwidth for integer type out of range");
2692 return error(
"Invalid pointer record");
2696 ResultTy = getTypeByID(Record[0]);
2698 !PointerType::isValidElementType(ResultTy))
2699 return error(
"Invalid type");
2706 return error(
"Invalid opaque pointer record");
2715 return error(
"Invalid function record");
2717 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2718 if (
Type *
T = getTypeByID(Record[i]))
2724 ResultTy = getTypeByID(Record[2]);
2725 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2726 return error(
"Invalid type");
2729 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2735 return error(
"Invalid function record");
2737 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2738 if (
Type *
T = getTypeByID(Record[i])) {
2739 if (!FunctionType::isValidArgumentType(
T))
2740 return error(
"Invalid function argument type");
2747 ResultTy = getTypeByID(Record[1]);
2748 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2749 return error(
"Invalid type");
2752 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2757 return error(
"Invalid anon struct record");
2759 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2760 if (
Type *
T = getTypeByID(Record[i]))
2766 return error(
"Invalid type");
2773 return error(
"Invalid struct name record");
2778 return error(
"Invalid named struct record");
2780 if (NumRecords >= TypeList.size())
2781 return error(
"Invalid TYPE table");
2787 TypeList[NumRecords] =
nullptr;
2789 Res = createIdentifiedStructType(
Context, TypeName);
2793 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2794 if (
Type *
T = getTypeByID(Record[i]))
2800 return error(
"Invalid named struct record");
2809 return error(
"Invalid opaque type record");
2811 if (NumRecords >= TypeList.size())
2812 return error(
"Invalid TYPE table");
2818 TypeList[NumRecords] =
nullptr;
2820 Res = createIdentifiedStructType(
Context, TypeName);
2827 return error(
"Invalid target extension type record");
2829 if (NumRecords >= TypeList.size())
2830 return error(
"Invalid TYPE table");
2832 if (Record[0] >=
Record.size())
2833 return error(
"Too many type parameters");
2835 unsigned NumTys =
Record[0];
2837 SmallVector<unsigned, 8> IntParams;
2838 for (
unsigned i = 0; i < NumTys; i++) {
2839 if (
Type *
T = getTypeByID(Record[i + 1]))
2842 return error(
"Invalid type");
2845 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2846 if (Record[i] > UINT_MAX)
2847 return error(
"Integer parameter too large");
2852 if (
auto E = TTy.takeError())
2860 return error(
"Invalid array type record");
2861 ResultTy = getTypeByID(Record[1]);
2862 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2863 return error(
"Invalid type");
2865 ResultTy = ArrayType::get(ResultTy, Record[0]);
2870 return error(
"Invalid vector type record");
2872 return error(
"Invalid vector length");
2873 ResultTy = getTypeByID(Record[1]);
2874 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2875 return error(
"Invalid type");
2878 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2882 if (NumRecords >= TypeList.size())
2883 return error(
"Invalid TYPE table");
2884 if (TypeList[NumRecords])
2886 "Invalid TYPE table: Only named structs can be forward referenced");
2887 assert(ResultTy &&
"Didn't read a type?");
2888 TypeList[NumRecords] = ResultTy;
2889 if (!ContainedIDs.
empty())
2890 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2895Error BitcodeReader::parseOperandBundleTags() {
2899 if (!BundleTags.empty())
2900 return error(
"Invalid multiple blocks");
2902 SmallVector<uint64_t, 64>
Record;
2908 BitstreamEntry
Entry = MaybeEntry.
get();
2910 switch (
Entry.Kind) {
2913 return error(
"Malformed block");
2927 return error(
"Invalid operand bundle record");
2930 BundleTags.emplace_back();
2932 return error(
"Invalid operand bundle record");
2937Error BitcodeReader::parseSyncScopeNames() {
2942 return error(
"Invalid multiple synchronization scope names blocks");
2944 SmallVector<uint64_t, 64>
Record;
2949 BitstreamEntry
Entry = MaybeEntry.
get();
2951 switch (
Entry.Kind) {
2954 return error(
"Malformed block");
2957 return error(
"Invalid empty synchronization scope names block");
2971 return error(
"Invalid sync scope record");
2973 SmallString<16> SSN;
2975 return error(
"Invalid sync scope record");
2983Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
2984 unsigned NameIndex, Triple &TT) {
2987 return error(
"Invalid record");
2988 unsigned ValueID =
Record[0];
2989 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2990 return error(
"Invalid record");
2991 Value *
V = ValueList[ValueID];
2994 if (NameStr.contains(0))
2995 return error(
"Invalid value name");
2996 V->setName(NameStr);
2998 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
3011 return std::move(JumpFailed);
3017 return error(
"Expected value symbol table subblock");
3021void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
3023 ArrayRef<uint64_t> Record) {
3027 uint64_t FuncWordOffset =
Record[1] - 1;
3028 uint64_t FuncBitOffset = FuncWordOffset * 32;
3029 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
3033 if (FuncBitOffset > LastFunctionBlockBit)
3034 LastFunctionBlockBit = FuncBitOffset;
3038Error BitcodeReader::parseGlobalValueSymbolTable() {
3039 unsigned FuncBitcodeOffsetDelta =
3045 SmallVector<uint64_t, 64>
Record;
3050 BitstreamEntry
Entry = MaybeEntry.
get();
3052 switch (
Entry.Kind) {
3055 return error(
"Malformed block");
3066 switch (MaybeRecord.
get()) {
3068 unsigned ValueID =
Record[0];
3069 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3070 return error(
"Invalid value reference in symbol table");
3071 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3081Error BitcodeReader::parseValueSymbolTable(uint64_t
Offset) {
3082 uint64_t CurrentBit;
3088 if (!MaybeCurrentBit)
3090 CurrentBit = MaybeCurrentBit.
get();
3093 if (
Error Err = parseGlobalValueSymbolTable())
3114 unsigned FuncBitcodeOffsetDelta =
3120 SmallVector<uint64_t, 64>
Record;
3131 BitstreamEntry
Entry = MaybeEntry.
get();
3133 switch (
Entry.Kind) {
3136 return error(
"Malformed block");
3152 switch (MaybeRecord.
get()) {
3156 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3164 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3172 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3177 return error(
"Invalid bbentry record");
3180 return error(
"Invalid bbentry record");
3192uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {
3202Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3203 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3204 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3205 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3207 GlobalInitWorklist.swap(GlobalInits);
3208 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3209 FunctionOperandWorklist.swap(FunctionOperands);
3211 while (!GlobalInitWorklist.empty()) {
3212 unsigned ValID = GlobalInitWorklist.back().second;
3213 if (ValID >= ValueList.
size()) {
3215 GlobalInits.push_back(GlobalInitWorklist.back());
3217 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3220 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3222 GlobalInitWorklist.pop_back();
3225 while (!IndirectSymbolInitWorklist.empty()) {
3226 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3227 if (ValID >= ValueList.
size()) {
3228 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3230 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3234 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3237 return error(
"Alias and aliasee types don't match");
3242 return error(
"Expected an alias or an ifunc");
3245 IndirectSymbolInitWorklist.pop_back();
3248 while (!FunctionOperandWorklist.empty()) {
3249 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3250 if (
Info.PersonalityFn) {
3251 unsigned ValID =
Info.PersonalityFn - 1;
3252 if (ValID < ValueList.
size()) {
3253 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3256 Info.F->setPersonalityFn(MaybeC.
get());
3257 Info.PersonalityFn = 0;
3261 unsigned ValID =
Info.Prefix - 1;
3262 if (ValID < ValueList.
size()) {
3263 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3266 Info.F->setPrefixData(MaybeC.
get());
3270 if (
Info.Prologue) {
3271 unsigned ValID =
Info.Prologue - 1;
3272 if (ValID < ValueList.
size()) {
3273 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3276 Info.F->setPrologueData(MaybeC.
get());
3280 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3281 FunctionOperands.push_back(Info);
3282 FunctionOperandWorklist.pop_back();
3291 BitcodeReader::decodeSignRotatedValue);
3293 return APInt(TypeBits, Words);
3296Error BitcodeReader::parseConstants() {
3304 unsigned Int32TyID = getVirtualTypeID(CurTy);
3305 unsigned CurTyID = Int32TyID;
3306 Type *CurElemTy =
nullptr;
3307 unsigned NextCstNo = ValueList.
size();
3315 switch (Entry.Kind) {
3318 return error(
"Malformed block");
3320 if (NextCstNo != ValueList.
size())
3321 return error(
"Invalid constant reference");
3332 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
3335 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3345 return error(
"Invalid settype record");
3346 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3347 return error(
"Invalid settype record");
3348 if (TypeList[Record[0]] == VoidType)
3349 return error(
"Invalid constant type");
3351 CurTy = TypeList[CurTyID];
3352 CurElemTy = getPtrElementTypeByID(CurTyID);
3356 return error(
"Invalid type for a constant null value");
3359 return error(
"Invalid type for a constant null value");
3364 return error(
"Invalid integer const record");
3369 return error(
"Invalid wide integer const record");
3372 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3373 V = ConstantInt::get(CurTy, VInt);
3378 return error(
"Invalid byte const record");
3379 V = ConstantByte::get(CurTy, decodeSignRotatedValue(Record[0]),
3384 return error(
"Invalid wide byte const record");
3387 APInt VByte =
readWideAPInt(Record, ScalarTy->getBitWidth());
3388 V = ConstantByte::get(CurTy, VByte);
3393 return error(
"Invalid float const record");
3396 if (ScalarTy->isHalfTy())
3397 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3398 APInt(16, (uint16_t)Record[0])));
3399 else if (ScalarTy->isBFloatTy())
3400 V = ConstantFP::get(
3401 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3402 else if (ScalarTy->isFloatTy())
3403 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3404 APInt(32, (uint32_t)Record[0])));
3405 else if (ScalarTy->isDoubleTy())
3406 V = ConstantFP::get(
3407 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3408 else if (ScalarTy->isX86_FP80Ty()) {
3410 uint64_t Rearrange[2];
3411 Rearrange[0] = (
Record[1] & 0xffffLL) | (Record[0] << 16);
3412 Rearrange[1] =
Record[0] >> 48;
3413 V = ConstantFP::get(
3414 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3415 }
else if (ScalarTy->isFP128Ty())
3416 V = ConstantFP::get(CurTy,
3417 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3418 else if (ScalarTy->isPPC_FP128Ty())
3419 V = ConstantFP::get(
3420 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3428 return error(
"Invalid aggregate record");
3430 SmallVector<unsigned, 16> Elts;
3434 V = BitcodeConstant::create(
3435 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3437 V = BitcodeConstant::create(
Alloc, CurTy,
3438 BitcodeConstant::ConstantArrayOpcode, Elts);
3440 V = BitcodeConstant::create(
3441 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3450 return error(
"Invalid string record");
3460 return error(
"Invalid data record");
3464 return error(
"Invalid type for value");
3467 SmallString<128> RawData;
3469 for (uint64_t Val : Record) {
3470 const char *Src =
reinterpret_cast<const char *
>(&Val);
3472 Src +=
sizeof(uint64_t) - EltBytes;
3473 RawData.
append(Src, Src + EltBytes);
3478 : ConstantDataArray::getRaw(RawData.str(),
Record.
size(), EltTy);
3483 return error(
"Invalid unary op constexpr record");
3488 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3494 return error(
"Invalid binary op constexpr record");
3500 if (
Record.size() >= 4) {
3501 if (
Opc == Instruction::Add ||
3502 Opc == Instruction::Sub ||
3503 Opc == Instruction::Mul ||
3504 Opc == Instruction::Shl) {
3509 }
else if (
Opc == Instruction::SDiv ||
3510 Opc == Instruction::UDiv ||
3511 Opc == Instruction::LShr ||
3512 Opc == Instruction::AShr) {
3517 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3518 {(unsigned)Record[1], (
unsigned)
Record[2]});
3524 return error(
"Invalid cast constexpr record");
3529 unsigned OpTyID =
Record[1];
3530 Type *OpTy = getTypeByID(OpTyID);
3532 return error(
"Invalid cast constexpr record");
3533 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3545 return error(
"Constant GEP record must have at least two elements");
3547 Type *PointeeType =
nullptr;
3551 PointeeType = getTypeByID(Record[OpNum++]);
3554 std::optional<ConstantRange>
InRange;
3558 unsigned InRangeIndex =
Op >> 1;
3564 Expected<ConstantRange> MaybeInRange =
3565 readBitWidthAndConstantRange(Record, OpNum);
3574 SmallVector<unsigned, 16> Elts;
3575 unsigned BaseTypeID =
Record[OpNum];
3576 while (OpNum !=
Record.size()) {
3577 unsigned ElTyID =
Record[OpNum++];
3578 Type *ElTy = getTypeByID(ElTyID);
3580 return error(
"Invalid getelementptr constexpr record");
3584 if (Elts.
size() < 1)
3585 return error(
"Invalid gep with no operands");
3589 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3590 BaseType = getTypeByID(BaseTypeID);
3595 return error(
"GEP base operand must be pointer or vector of pointer");
3598 PointeeType = getPtrElementTypeByID(BaseTypeID);
3600 return error(
"Missing element type for old-style constant GEP");
3603 V = BitcodeConstant::create(
3605 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3611 return error(
"Invalid select constexpr record");
3613 V = BitcodeConstant::create(
3614 Alloc, CurTy, Instruction::Select,
3615 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3621 return error(
"Invalid extractelement constexpr record");
3622 unsigned OpTyID =
Record[0];
3626 return error(
"Invalid extractelement constexpr record");
3628 if (
Record.size() == 4) {
3629 unsigned IdxTyID =
Record[2];
3630 Type *IdxTy = getTypeByID(IdxTyID);
3632 return error(
"Invalid extractelement constexpr record");
3638 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3639 {(unsigned)Record[1], IdxRecord});
3645 if (
Record.size() < 3 || !OpTy)
3646 return error(
"Invalid insertelement constexpr record");
3648 if (
Record.size() == 4) {
3649 unsigned IdxTyID =
Record[2];
3650 Type *IdxTy = getTypeByID(IdxTyID);
3652 return error(
"Invalid insertelement constexpr record");
3658 V = BitcodeConstant::create(
3659 Alloc, CurTy, Instruction::InsertElement,
3660 {(unsigned)Record[0], (
unsigned)
Record[1], IdxRecord});
3665 if (
Record.size() < 3 || !OpTy)
3666 return error(
"Invalid shufflevector constexpr record");
3667 V = BitcodeConstant::create(
3668 Alloc, CurTy, Instruction::ShuffleVector,
3669 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3676 if (
Record.size() < 4 || !RTy || !OpTy)
3677 return error(
"Invalid shufflevector constexpr record");
3678 V = BitcodeConstant::create(
3679 Alloc, CurTy, Instruction::ShuffleVector,
3680 {(unsigned)Record[1], (
unsigned)
Record[2], (unsigned)Record[3]});
3685 return error(
"Invalid cmp constexpt record");
3686 unsigned OpTyID =
Record[0];
3687 Type *OpTy = getTypeByID(OpTyID);
3689 return error(
"Invalid cmp constexpr record");
3690 V = BitcodeConstant::create(
3693 : Instruction::ICmp),
3694 (uint8_t)Record[3]},
3695 {(unsigned)Record[1], (
unsigned)
Record[2]});
3702 return error(
"Invalid inlineasm record");
3703 std::string AsmStr, ConstrStr;
3704 bool HasSideEffects =
Record[0] & 1;
3705 bool IsAlignStack =
Record[0] >> 1;
3706 unsigned AsmStrSize =
Record[1];
3707 if (2+AsmStrSize >=
Record.size())
3708 return error(
"Invalid inlineasm record");
3709 unsigned ConstStrSize =
Record[2+AsmStrSize];
3710 if (3+AsmStrSize+ConstStrSize >
Record.size())
3711 return error(
"Invalid inlineasm record");
3713 for (
unsigned i = 0; i != AsmStrSize; ++i)
3714 AsmStr += (
char)
Record[2+i];
3715 for (
unsigned i = 0; i != ConstStrSize; ++i)
3716 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3719 return error(
"Missing element type for old-style inlineasm");
3721 HasSideEffects, IsAlignStack);
3728 return error(
"Invalid inlineasm record");
3729 std::string AsmStr, ConstrStr;
3730 bool HasSideEffects =
Record[0] & 1;
3731 bool IsAlignStack = (
Record[0] >> 1) & 1;
3732 unsigned AsmDialect =
Record[0] >> 2;
3733 unsigned AsmStrSize =
Record[1];
3734 if (2+AsmStrSize >=
Record.size())
3735 return error(
"Invalid inlineasm record");
3736 unsigned ConstStrSize =
Record[2+AsmStrSize];
3737 if (3+AsmStrSize+ConstStrSize >
Record.size())
3738 return error(
"Invalid inlineasm record");
3740 for (
unsigned i = 0; i != AsmStrSize; ++i)
3741 AsmStr += (
char)
Record[2+i];
3742 for (
unsigned i = 0; i != ConstStrSize; ++i)
3743 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3746 return error(
"Missing element type for old-style inlineasm");
3748 HasSideEffects, IsAlignStack,
3755 return error(
"Invalid inlineasm record");
3757 std::string AsmStr, ConstrStr;
3758 bool HasSideEffects =
Record[OpNum] & 1;
3759 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3760 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3761 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3763 unsigned AsmStrSize =
Record[OpNum];
3765 if (OpNum + AsmStrSize >=
Record.size())
3766 return error(
"Invalid inlineasm record");
3767 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3768 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3769 return error(
"Invalid inlineasm record");
3771 for (
unsigned i = 0; i != AsmStrSize; ++i)
3772 AsmStr += (
char)
Record[OpNum + i];
3774 for (
unsigned i = 0; i != ConstStrSize; ++i)
3775 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3778 return error(
"Missing element type for old-style inlineasm");
3780 HasSideEffects, IsAlignStack,
3787 return error(
"Invalid inlineasm record");
3792 return error(
"Invalid inlineasm record");
3793 std::string AsmStr, ConstrStr;
3794 bool HasSideEffects =
Record[OpNum] & 1;
3795 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3796 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3797 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3799 unsigned AsmStrSize =
Record[OpNum];
3801 if (OpNum + AsmStrSize >=
Record.size())
3802 return error(
"Invalid inlineasm record");
3803 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3804 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3805 return error(
"Invalid inlineasm record");
3807 for (
unsigned i = 0; i != AsmStrSize; ++i)
3808 AsmStr += (
char)
Record[OpNum + i];
3810 for (
unsigned i = 0; i != ConstStrSize; ++i)
3811 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3813 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3819 return error(
"Invalid blockaddress record");
3820 unsigned FnTyID =
Record[0];
3821 Type *FnTy = getTypeByID(FnTyID);
3823 return error(
"Invalid blockaddress record");
3824 V = BitcodeConstant::create(
3826 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3832 return error(
"Invalid dso_local record");
3833 unsigned GVTyID =
Record[0];
3834 Type *GVTy = getTypeByID(GVTyID);
3836 return error(
"Invalid dso_local record");
3837 V = BitcodeConstant::create(
3838 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3843 return error(
"Invalid no_cfi record");
3844 unsigned GVTyID =
Record[0];
3845 Type *GVTy = getTypeByID(GVTyID);
3847 return error(
"Invalid no_cfi record");
3848 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3854 return error(
"Invalid ptrauth record");
3856 V = BitcodeConstant::create(
Alloc, CurTy,
3857 BitcodeConstant::ConstantPtrAuthOpcode,
3858 {(unsigned)Record[0], (
unsigned)
Record[1],
3859 (unsigned)Record[2], (
unsigned)
Record[3]});
3864 return error(
"Invalid ptrauth record");
3866 V = BitcodeConstant::create(
3867 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3868 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2],
3869 (
unsigned)
Record[3], (unsigned)Record[4]});
3874 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3881Error BitcodeReader::parseUseLists() {
3886 SmallVector<uint64_t, 64>
Record;
3892 BitstreamEntry
Entry = MaybeEntry.
get();
3894 switch (
Entry.Kind) {
3897 return error(
"Malformed block");
3911 switch (MaybeRecord.
get()) {
3919 if (RecordLength < 3)
3921 return error(
"Invalid uselist record");
3922 unsigned ID =
Record.pop_back_val();
3926 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3927 V = FunctionBBs[
ID];
3931 if (!
V->hasUseList())
3934 unsigned NumUses = 0;
3935 SmallDenseMap<const Use *, unsigned, 16> Order;
3936 for (
const Use &U :
V->materialized_uses()) {
3937 if (++NumUses >
Record.size())
3939 Order[&
U] =
Record[NumUses - 1];
3946 V->sortUseList([&](
const Use &L,
const Use &R) {
3957Error BitcodeReader::rememberAndSkipMetadata() {
3960 DeferredMetadataInfo.push_back(CurBit);
3968Error BitcodeReader::materializeMetadata() {
3969 for (uint64_t BitPos : DeferredMetadataInfo) {
3973 if (
Error Err = MDLoader->parseModuleMetadata())
3982 NamedMDNode *LinkerOpts =
3984 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
3991 DeferredMetadataInfo.clear();
3995void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
3999Error BitcodeReader::rememberAndSkipFunctionBody() {
4001 if (FunctionsWithBodies.empty())
4002 return error(
"Insufficient function protos");
4004 Function *Fn = FunctionsWithBodies.back();
4005 FunctionsWithBodies.pop_back();
4010 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
4011 "Mismatch between VST and scanned function offsets");
4012 DeferredFunctionInfo[Fn] = CurBit;
4020Error BitcodeReader::globalCleanup() {
4022 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4024 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
4025 return error(
"Malformed global initializer set");
4029 for (Function &
F : *TheModule) {
4030 MDLoader->upgradeDebugIntrinsics(
F);
4034 !SkipDebugIntrinsicUpgrade))
4035 UpgradedIntrinsics[&
F] = NewFn;
4041 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4042 for (GlobalVariable &GV : TheModule->globals())
4044 UpgradedVariables.emplace_back(&GV, Upgraded);
4045 for (
auto &Pair : UpgradedVariables) {
4046 Pair.first->eraseFromParent();
4047 TheModule->insertGlobalVariable(Pair.second);
4052 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4053 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4061Error BitcodeReader::rememberAndSkipFunctionBodies() {
4066 return error(
"Could not find function in stream");
4068 if (!SeenFirstFunctionBody)
4069 return error(
"Trying to materialize functions before seeing function blocks");
4073 assert(SeenValueSymbolTable);
4076 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4079 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4081 switch (
Entry.Kind) {
4083 return error(
"Expect SubBlock");
4087 return error(
"Expect function block");
4089 if (
Error Err = rememberAndSkipFunctionBody())
4098Error BitcodeReaderBase::readBlockInfo() {
4099 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4101 if (!MaybeNewBlockInfo)
4103 std::optional<BitstreamBlockInfo> NewBlockInfo =
4104 std::move(MaybeNewBlockInfo.
get());
4106 return error(
"Malformed block");
4107 BlockInfo = std::move(*NewBlockInfo);
4111Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4115 std::tie(Name, Record) = readNameFromStrtab(Record);
4118 return error(
"Invalid comdat record");
4120 std::string OldFormatName;
4123 return error(
"Invalid comdat record");
4124 unsigned ComdatNameSize =
Record[1];
4125 if (ComdatNameSize >
Record.size() - 2)
4126 return error(
"Comdat name size too large");
4127 OldFormatName.reserve(ComdatNameSize);
4128 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4129 OldFormatName += (
char)
Record[2 + i];
4130 Name = OldFormatName;
4132 Comdat *
C = TheModule->getOrInsertComdat(Name);
4133 C->setSelectionKind(SK);
4134 ComdatList.push_back(
C);
4148 Meta.NoAddress =
true;
4150 Meta.NoHWAddress =
true;
4154 Meta.IsDynInit =
true;
4158Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4166 std::tie(Name, Record) = readNameFromStrtab(Record);
4169 return error(
"Invalid global variable record");
4170 unsigned TyID =
Record[0];
4171 Type *Ty = getTypeByID(TyID);
4173 return error(
"Invalid global variable record");
4175 bool explicitType =
Record[1] & 2;
4181 return error(
"Invalid type for value");
4183 TyID = getContainedTypeID(TyID);
4184 Ty = getTypeByID(TyID);
4186 return error(
"Missing element type for old-style global");
4189 uint64_t RawLinkage =
Record[3];
4191 MaybeAlign Alignment;
4192 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4196 if (Record[5] - 1 >= SectionTable.size())
4197 return error(
"Invalid ID");
4206 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4214 bool ExternallyInitialized =
false;
4216 ExternallyInitialized =
Record[9];
4218 GlobalVariable *NewGV =
4228 if (
Record.size() > 10) {
4240 if (
unsigned InitID = Record[2])
4241 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4243 if (
Record.size() > 11) {
4244 if (
unsigned ComdatID = Record[11]) {
4245 if (ComdatID > ComdatList.size())
4246 return error(
"Invalid global variable comdat ID");
4247 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4250 ImplicitComdatObjects.
insert(NewGV);
4253 if (
Record.size() > 12) {
4258 if (
Record.size() > 13) {
4267 if (
Record.size() > 16 && Record[16]) {
4268 llvm::GlobalValue::SanitizerMetadata
Meta =
4273 if (
Record.size() > 17 && Record[17]) {
4277 return error(
"Invalid global variable code model");
4283void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4284 if (ValueTypeCallback) {
4285 (*ValueTypeCallback)(
4286 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4287 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4291Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4297 std::tie(Name, Record) = readNameFromStrtab(Record);
4300 return error(
"Invalid function record");
4301 unsigned FTyID =
Record[0];
4302 Type *FTy = getTypeByID(FTyID);
4304 return error(
"Invalid function record");
4306 FTyID = getContainedTypeID(FTyID, 0);
4307 FTy = getTypeByID(FTyID);
4309 return error(
"Missing element type for old-style function");
4313 return error(
"Invalid type for value");
4314 auto CC =
static_cast<CallingConv::ID
>(
Record[1]);
4315 if (CC & ~CallingConv::MaxID)
4316 return error(
"Invalid calling convention ID");
4318 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4324 AddrSpace, Name, TheModule);
4327 "Incorrect fully specified type provided for function");
4328 FunctionTypeIDs[
Func] = FTyID;
4330 Func->setCallingConv(CC);
4331 bool isProto =
Record[2];
4332 uint64_t RawLinkage =
Record[3];
4335 callValueTypeCallback(Func, FTyID);
4340 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4341 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4342 Attribute::InAlloca}) {
4343 if (!
Func->hasParamAttribute(i, Kind))
4346 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4349 Func->removeParamAttr(i, Kind);
4351 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4352 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4354 return error(
"Missing param element type for attribute upgrade");
4358 case Attribute::ByVal:
4359 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4361 case Attribute::StructRet:
4362 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4364 case Attribute::InAlloca:
4365 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4371 Func->addParamAttr(i, NewAttr);
4375 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4376 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4377 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4378 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4380 return error(
"Missing param element type for x86_intrcc upgrade");
4382 Func->addParamAttr(0, NewAttr);
4385 MaybeAlign Alignment;
4386 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4389 Func->setAlignment(*Alignment);
4391 if (Record[6] - 1 >= SectionTable.size())
4392 return error(
"Invalid ID");
4393 Func->setSection(SectionTable[Record[6] - 1]);
4397 if (!
Func->hasLocalLinkage())
4399 if (
Record.size() > 8 && Record[8]) {
4400 if (Record[8] - 1 >= GCTable.size())
4401 return error(
"Invalid ID");
4402 Func->setGC(GCTable[Record[8] - 1]);
4407 Func->setUnnamedAddr(UnnamedAddr);
4409 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4411 OperandInfo.Prologue =
Record[10];
4413 if (
Record.size() > 11) {
4415 if (!
Func->hasLocalLinkage()) {
4422 if (
Record.size() > 12) {
4423 if (
unsigned ComdatID = Record[12]) {
4424 if (ComdatID > ComdatList.size())
4425 return error(
"Invalid function comdat ID");
4426 Func->setComdat(ComdatList[ComdatID - 1]);
4429 ImplicitComdatObjects.
insert(Func);
4433 OperandInfo.Prefix =
Record[13];
4436 OperandInfo.PersonalityFn =
Record[14];
4438 if (
Record.size() > 15) {
4448 Record[17] + Record[18] <= Strtab.
size()) {
4449 Func->setPartition(StringRef(Strtab.
data() + Record[17], Record[18]));
4452 if (
Record.size() > 19) {
4453 MaybeAlign PrefAlignment;
4454 if (
Error Err = parseAlignmentValue(Record[19], PrefAlignment))
4456 Func->setPreferredAlignment(PrefAlignment);
4459 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4461 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4462 FunctionOperands.push_back(OperandInfo);
4467 Func->setIsMaterializable(
true);
4468 FunctionsWithBodies.push_back(Func);
4469 DeferredFunctionInfo[
Func] = 0;
4474Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4475 unsigned BitCode, ArrayRef<uint64_t> Record) {
4485 std::tie(Name, Record) = readNameFromStrtab(Record);
4488 if (
Record.size() < (3 + (
unsigned)NewRecord))
4489 return error(
"Invalid global indirect symbol record");
4494 return error(
"Invalid global indirect symbol record");
4500 return error(
"Invalid type for value");
4501 AddrSpace = PTy->getAddressSpace();
4503 Ty = getTypeByID(
TypeID);
4505 return error(
"Missing element type for old-style indirect symbol");
4507 AddrSpace =
Record[OpNum++];
4510 auto Val =
Record[OpNum++];
4519 nullptr, TheModule);
4523 if (OpNum !=
Record.size()) {
4524 auto VisInd = OpNum++;
4530 if (OpNum !=
Record.size()) {
4531 auto S =
Record[OpNum++];
4538 if (OpNum !=
Record.size())
4540 if (OpNum !=
Record.size())
4543 if (OpNum !=
Record.size())
4548 if (OpNum + 1 <
Record.size()) {
4550 if (Record[OpNum] + Record[OpNum + 1] > Strtab.
size())
4551 return error(
"Malformed partition, too large.");
4553 StringRef(Strtab.
data() + Record[OpNum], Record[OpNum + 1]));
4557 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4561Error BitcodeReader::parseModule(uint64_t ResumeBit,
4562 bool ShouldLazyLoadMetadata,
4563 ParserCallbacks Callbacks) {
4564 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4571 SmallVector<uint64_t, 64>
Record;
4575 bool ResolvedDataLayout =
false;
4580 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4582 auto ResolveDataLayout = [&]() ->
Error {
4583 if (ResolvedDataLayout)
4587 ResolvedDataLayout =
true;
4591 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4595 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4596 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4597 TentativeDataLayoutStr = *LayoutOverride;
4605 TheModule->setDataLayout(MaybeDL.
get());
4611 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4614 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4616 switch (
Entry.Kind) {
4618 return error(
"Malformed block");
4620 if (
Error Err = ResolveDataLayout())
4622 return globalCleanup();
4631 if (
Error Err = readBlockInfo())
4635 if (
Error Err = parseAttributeBlock())
4639 if (
Error Err = parseAttributeGroupBlock())
4643 if (
Error Err = parseTypeTable())
4647 if (!SeenValueSymbolTable) {
4653 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4654 if (
Error Err = parseValueSymbolTable())
4656 SeenValueSymbolTable =
true;
4666 if (
Error Err = parseConstants())
4668 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4672 if (ShouldLazyLoadMetadata) {
4673 if (
Error Err = rememberAndSkipMetadata())
4677 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4678 if (
Error Err = MDLoader->parseModuleMetadata())
4682 if (
Error Err = MDLoader->parseMetadataKinds())
4686 if (
Error Err = ResolveDataLayout())
4691 if (!SeenFirstFunctionBody) {
4692 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4693 if (
Error Err = globalCleanup())
4695 SeenFirstFunctionBody =
true;
4698 if (VSTOffset > 0) {
4702 if (!SeenValueSymbolTable) {
4703 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4705 SeenValueSymbolTable =
true;
4727 if (
Error Err = rememberAndSkipFunctionBody())
4734 if (SeenValueSymbolTable) {
4738 return globalCleanup();
4742 if (
Error Err = parseUseLists())
4746 if (
Error Err = parseOperandBundleTags())
4750 if (
Error Err = parseSyncScopeNames())
4762 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
4765 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4768 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4771 UseRelativeIDs = *VersionOrErr >= 1;
4775 if (ResolvedDataLayout)
4776 return error(
"target triple too late in module");
4779 return error(
"Invalid triple record");
4780 TheModule->setTargetTriple(Triple(std::move(S)));
4784 if (ResolvedDataLayout)
4785 return error(
"datalayout too late in module");
4787 return error(
"Invalid data layout record");
4793 return error(
"Invalid asm record");
4794 TheModule->setModuleInlineAsm(S);
4801 return error(
"Invalid deplib record");
4808 return error(
"Invalid section name record");
4809 SectionTable.push_back(S);
4815 return error(
"Invalid gcname record");
4816 GCTable.push_back(S);
4820 if (
Error Err = parseComdatRecord(Record))
4829 if (
Error Err = parseGlobalVarRecord(Record))
4833 if (
Error Err = ResolveDataLayout())
4835 if (
Error Err = parseFunctionRecord(Record))
4841 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4847 return error(
"Invalid vstoffset record");
4851 VSTOffset =
Record[0] - 1;
4857 return error(
"Invalid source filename record");
4858 TheModule->setSourceFileName(
ValueName);
4863 this->ValueTypeCallback = std::nullopt;
4867Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4869 ParserCallbacks Callbacks) {
4871 MetadataLoaderCallbacks MDCallbacks;
4872 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4874 return getContainedTypeID(
I, J);
4877 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4879 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4882Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4884 return error(
"Load/Store operand is not a pointer type");
4885 if (!PointerType::isLoadableOrStorableType(ValType))
4886 return error(
"Cannot load/store from pointer");
4890Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4891 ArrayRef<unsigned> ArgTyIDs) {
4893 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4894 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4895 Attribute::InAlloca}) {
4896 if (!
Attrs.hasParamAttr(i, Kind) ||
4897 Attrs.getParamAttr(i, Kind).getValueAsType())
4900 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4902 return error(
"Missing element type for typed attribute upgrade");
4906 case Attribute::ByVal:
4907 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4909 case Attribute::StructRet:
4910 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4912 case Attribute::InAlloca:
4913 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4926 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
4930 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
4931 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4933 return error(
"Missing element type for inline asm upgrade");
4936 Attribute::get(
Context, Attribute::ElementType, ElemTy));
4944 case Intrinsic::preserve_array_access_index:
4945 case Intrinsic::preserve_struct_access_index:
4946 case Intrinsic::aarch64_ldaxr:
4947 case Intrinsic::aarch64_ldxr:
4948 case Intrinsic::aarch64_stlxr:
4949 case Intrinsic::aarch64_stxr:
4950 case Intrinsic::arm_ldaex:
4951 case Intrinsic::arm_ldrex:
4952 case Intrinsic::arm_stlex:
4953 case Intrinsic::arm_strex: {
4956 case Intrinsic::aarch64_stlxr:
4957 case Intrinsic::aarch64_stxr:
4958 case Intrinsic::arm_stlex:
4959 case Intrinsic::arm_strex:
4966 if (!
Attrs.getParamElementType(ArgNo)) {
4967 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4969 return error(
"Missing element type for elementtype upgrade");
4984Error BitcodeReader::parseFunctionBody(Function *
F) {
4989 if (MDLoader->hasFwdRefs())
4990 return error(
"Invalid function metadata: incoming forward references");
4992 InstructionList.
clear();
4993 unsigned ModuleValueListSize = ValueList.
size();
4994 unsigned ModuleMDLoaderSize = MDLoader->size();
4998 unsigned FTyID = FunctionTypeIDs[
F];
4999 for (Argument &
I :
F->args()) {
5000 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
5001 assert(
I.getType() == getTypeByID(ArgTyID) &&
5002 "Incorrect fully specified type for Function Argument");
5006 unsigned NextValueNo = ValueList.
size();
5008 unsigned CurBBNo = 0;
5013 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
5017 auto getLastInstruction = [&]() -> Instruction * {
5018 if (CurBB && !CurBB->
empty())
5019 return &CurBB->
back();
5020 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
5021 !FunctionBBs[CurBBNo - 1]->
empty())
5022 return &FunctionBBs[CurBBNo - 1]->back();
5026 std::vector<OperandBundleDef> OperandBundles;
5029 SmallVector<uint64_t, 64>
Record;
5032 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
5035 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
5037 switch (
Entry.Kind) {
5039 return error(
"Malformed block");
5041 goto OutOfRecordLoop;
5050 if (
Error Err = parseConstants())
5052 NextValueNo = ValueList.
size();
5055 if (
Error Err = parseValueSymbolTable())
5059 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5063 assert(DeferredMetadataInfo.empty() &&
5064 "Must read all module-level metadata before function-level");
5065 if (
Error Err = MDLoader->parseFunctionMetadata())
5069 if (
Error Err = parseUseLists())
5083 unsigned ResTypeID = InvalidTypeID;
5084 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
5087 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5089 return error(
"Invalid value");
5091 if (
Record.empty() || Record[0] == 0)
5092 return error(
"Invalid declareblocks record");
5094 FunctionBBs.resize(Record[0]);
5097 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5098 if (BBFRI == BasicBlockFwdRefs.
end()) {
5099 for (BasicBlock *&BB : FunctionBBs)
5102 auto &BBRefs = BBFRI->second;
5104 if (BBRefs.size() > FunctionBBs.size())
5105 return error(
"Invalid ID");
5106 assert(!BBRefs.empty() &&
"Unexpected empty array");
5107 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5108 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5110 if (
I < RE && BBRefs[
I]) {
5111 BBRefs[
I]->insertInto(
F);
5112 FunctionBBs[
I] = BBRefs[
I];
5118 BasicBlockFwdRefs.
erase(BBFRI);
5121 CurBB = FunctionBBs[0];
5128 return error(
"Invalid blockaddr users record");
5142 for (uint64_t ValID : Record)
5144 BackwardRefFunctions.push_back(
F);
5146 return error(
"Invalid blockaddr users record");
5153 I = getLastInstruction();
5156 return error(
"Invalid debug_loc_again record");
5157 I->setDebugLoc(LastLoc);
5162 I = getLastInstruction();
5164 return error(
"Invalid debug loc record");
5169 uint64_t AtomGroup =
Record.size() == 7 ?
Record[5] : 0;
5172 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5175 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5177 return error(
"Invalid debug loc record");
5181 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5183 return error(
"Invalid debug loc record");
5186 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5187 isImplicitCode, AtomGroup, AtomRank);
5188 I->setDebugLoc(LastLoc);
5196 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5198 return error(
"Invalid unary operator record");
5202 return error(
"Invalid unary operator record");
5206 if (OpNum <
Record.size()) {
5210 I->setFastMathFlags(FMF);
5219 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5223 return error(
"Invalid binary operator record");
5227 return error(
"Invalid binary operator record");
5231 if (OpNum <
Record.size()) {
5232 if (
Opc == Instruction::Add ||
5233 Opc == Instruction::Sub ||
5234 Opc == Instruction::Mul ||
5235 Opc == Instruction::Shl) {
5240 }
else if (
Opc == Instruction::SDiv ||
5241 Opc == Instruction::UDiv ||
5242 Opc == Instruction::LShr ||
5243 Opc == Instruction::AShr) {
5246 }
else if (
Opc == Instruction::Or) {
5252 I->setFastMathFlags(FMF);
5261 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5262 OpNum + 1 >
Record.size())
5263 return error(
"Invalid cast record");
5265 ResTypeID =
Record[OpNum++];
5266 Type *ResTy = getTypeByID(ResTypeID);
5269 if (
Opc == -1 || !ResTy)
5270 return error(
"Invalid cast record");
5275 assert(CurBB &&
"No current BB?");
5281 return error(
"Invalid cast");
5285 if (OpNum <
Record.size()) {
5286 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5289 }
else if (
Opc == Instruction::Trunc) {
5301 I->setFastMathFlags(FMF);
5320 Ty = getTypeByID(TyID);
5324 TyID = InvalidTypeID;
5329 unsigned BasePtrTypeID;
5330 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5332 return error(
"Invalid gep record");
5335 TyID = getContainedTypeID(BasePtrTypeID);
5336 if (
BasePtr->getType()->isVectorTy())
5337 TyID = getContainedTypeID(TyID);
5338 Ty = getTypeByID(TyID);
5341 SmallVector<Value*, 16> GEPIdx;
5342 while (OpNum !=
Record.size()) {
5345 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5346 return error(
"Invalid gep record");
5357 unsigned SubType = 0;
5358 if (GTI.isStruct()) {
5360 Idx->getType()->isVectorTy()
5362 :
cast<ConstantInt>(Idx);
5365 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5372 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5373 if (
I->getType()->isVectorTy())
5374 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5377 GEP->setNoWrapFlags(NW);
5386 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5387 return error(
"Invalid extractvalue record");
5390 unsigned RecSize =
Record.size();
5391 if (OpNum == RecSize)
5392 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5394 SmallVector<unsigned, 4> EXTRACTVALIdx;
5395 ResTypeID = AggTypeID;
5396 for (; OpNum != RecSize; ++OpNum) {
5401 if (!IsStruct && !IsArray)
5402 return error(
"EXTRACTVAL: Invalid type");
5403 if ((
unsigned)Index != Index)
5404 return error(
"Invalid value");
5406 return error(
"EXTRACTVAL: Invalid struct index");
5408 return error(
"EXTRACTVAL: Invalid array index");
5409 EXTRACTVALIdx.
push_back((
unsigned)Index);
5413 ResTypeID = getContainedTypeID(ResTypeID, Index);
5416 ResTypeID = getContainedTypeID(ResTypeID);
5430 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5431 return error(
"Invalid insertvalue record");
5434 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5435 return error(
"Invalid insertvalue record");
5437 unsigned RecSize =
Record.size();
5438 if (OpNum == RecSize)
5439 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5441 SmallVector<unsigned, 4> INSERTVALIdx;
5443 for (; OpNum != RecSize; ++OpNum) {
5448 if (!IsStruct && !IsArray)
5449 return error(
"INSERTVAL: Invalid type");
5450 if ((
unsigned)Index != Index)
5451 return error(
"Invalid value");
5453 return error(
"INSERTVAL: Invalid struct index");
5455 return error(
"INSERTVAL: Invalid array index");
5457 INSERTVALIdx.
push_back((
unsigned)Index);
5465 return error(
"Inserted value type doesn't match aggregate type");
5468 ResTypeID = AggTypeID;
5480 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5482 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5484 popValue(Record, OpNum, NextValueNo, CondType,
5485 getVirtualTypeID(CondType),
Cond, CurBB))
5486 return error(
"Invalid select record");
5499 unsigned ValTypeID, CondTypeID;
5500 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5502 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5504 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5505 return error(
"Invalid vector select record");
5508 if (VectorType* vector_type =
5511 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5512 return error(
"Invalid type for value");
5516 return error(
"Invalid type for value");
5520 ResTypeID = ValTypeID;
5525 I->setFastMathFlags(FMF);
5533 unsigned VecTypeID, IdxTypeID;
5534 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5535 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5536 return error(
"Invalid extractelement record");
5538 return error(
"Invalid type for value");
5540 ResTypeID = getContainedTypeID(VecTypeID);
5547 Value *Vec, *Elt, *Idx;
5548 unsigned VecTypeID, IdxTypeID;
5549 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5550 return error(
"Invalid insertelement record");
5552 return error(
"Invalid type for value");
5553 if (popValue(Record, OpNum, NextValueNo,
5555 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5556 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5557 return error(
"Invalid insert element record");
5559 ResTypeID = VecTypeID;
5567 unsigned Vec1TypeID;
5568 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5570 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5572 return error(
"Invalid shufflevector record");
5574 unsigned MaskTypeID;
5575 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5576 return error(
"Invalid shufflevector record");
5578 return error(
"Invalid type for value");
5580 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5582 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5597 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5598 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5600 return error(
"Invalid comparison record");
5602 if (OpNum >=
Record.size())
5604 "Invalid record: operand number exceeded available operands");
5609 if (IsFP &&
Record.size() > OpNum+1)
5614 return error(
"Invalid fcmp predicate");
5615 I =
new FCmpInst(PredVal,
LHS,
RHS);
5618 return error(
"Invalid icmp predicate");
5619 I =
new ICmpInst(PredVal,
LHS,
RHS);
5620 if (
Record.size() > OpNum + 1 &&
5625 if (OpNum + 1 !=
Record.size())
5626 return error(
"Invalid comparison record");
5628 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5630 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5633 I->setFastMathFlags(FMF);
5650 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5651 return error(
"Invalid ret record");
5652 if (OpNum !=
Record.size())
5653 return error(
"Invalid ret record");
5661 return error(
"Invalid br record");
5662 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5664 return error(
"Invalid br record");
5666 if (
Record.size() == 1) {
5671 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5674 getVirtualTypeID(CondType), CurBB);
5675 if (!FalseDest || !
Cond)
5676 return error(
"Invalid br record");
5684 return error(
"Invalid cleanupret record");
5687 Value *CleanupPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5688 getVirtualTypeID(TokenTy), CurBB);
5690 return error(
"Invalid cleanupret record");
5692 if (
Record.size() == 2) {
5693 UnwindDest = getBasicBlock(Record[Idx++]);
5695 return error(
"Invalid cleanupret record");
5704 return error(
"Invalid catchret record");
5707 Value *CatchPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5708 getVirtualTypeID(TokenTy), CurBB);
5710 return error(
"Invalid catchret record");
5711 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5713 return error(
"Invalid catchret record");
5722 return error(
"Invalid catchswitch record");
5727 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5728 getVirtualTypeID(TokenTy), CurBB);
5730 return error(
"Invalid catchswitch record");
5732 unsigned NumHandlers =
Record[Idx++];
5735 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5736 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5738 return error(
"Invalid catchswitch record");
5743 if (Idx + 1 ==
Record.size()) {
5744 UnwindDest = getBasicBlock(Record[Idx++]);
5746 return error(
"Invalid catchswitch record");
5749 if (
Record.size() != Idx)
5750 return error(
"Invalid catchswitch record");
5754 for (BasicBlock *Handler : Handlers)
5755 CatchSwitch->addHandler(Handler);
5757 ResTypeID = getVirtualTypeID(
I->getType());
5765 return error(
"Invalid catchpad/cleanuppad record");
5770 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5771 getVirtualTypeID(TokenTy), CurBB);
5773 return error(
"Invalid catchpad/cleanuppad record");
5775 unsigned NumArgOperands =
Record[Idx++];
5777 SmallVector<Value *, 2>
Args;
5778 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5781 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5782 return error(
"Invalid catchpad/cleanuppad record");
5783 Args.push_back(Val);
5786 if (
Record.size() != Idx)
5787 return error(
"Invalid catchpad/cleanuppad record");
5793 ResTypeID = getVirtualTypeID(
I->getType());
5799 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5805 unsigned OpTyID =
Record[1];
5806 Type *OpTy = getTypeByID(OpTyID);
5812 return error(
"Invalid switch record");
5814 unsigned NumCases =
Record[4];
5819 unsigned CurIdx = 5;
5820 for (
unsigned i = 0; i != NumCases; ++i) {
5822 unsigned NumItems =
Record[CurIdx++];
5823 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5824 bool isSingleNumber =
Record[CurIdx++];
5827 unsigned ActiveWords = 1;
5828 if (ValueBitWidth > 64)
5829 ActiveWords =
Record[CurIdx++];
5832 CurIdx += ActiveWords;
5834 if (!isSingleNumber) {
5836 if (ValueBitWidth > 64)
5837 ActiveWords =
Record[CurIdx++];
5840 CurIdx += ActiveWords;
5851 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5852 for (ConstantInt *Cst : CaseVals)
5853 SI->addCase(Cst, DestBB);
5862 return error(
"Invalid switch record");
5863 unsigned OpTyID =
Record[0];
5864 Type *OpTy = getTypeByID(OpTyID);
5868 return error(
"Invalid switch record");
5869 unsigned NumCases = (
Record.size()-3)/2;
5872 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5874 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
5875 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
5876 if (!CaseVal || !DestBB) {
5878 return error(
"Invalid switch record");
5880 SI->addCase(CaseVal, DestBB);
5887 return error(
"Invalid indirectbr record");
5888 unsigned OpTyID =
Record[0];
5889 Type *OpTy = getTypeByID(OpTyID);
5892 return error(
"Invalid indirectbr record");
5893 unsigned NumDests =
Record.size()-2;
5896 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5897 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
5901 return error(
"Invalid indirectbr record");
5911 return error(
"Invalid invoke record");
5914 unsigned CCInfo =
Record[OpNum++];
5915 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
5916 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
5918 unsigned FTyID = InvalidTypeID;
5919 FunctionType *FTy =
nullptr;
5920 if ((CCInfo >> 13) & 1) {
5924 return error(
"Explicit invoke type is not a function type");
5928 unsigned CalleeTypeID;
5929 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5931 return error(
"Invalid invoke record");
5935 return error(
"Callee is not a pointer");
5937 FTyID = getContainedTypeID(CalleeTypeID);
5940 return error(
"Callee is not of pointer to function type");
5942 if (
Record.size() < FTy->getNumParams() + OpNum)
5943 return error(
"Insufficient operands to call");
5945 SmallVector<Value*, 16>
Ops;
5946 SmallVector<unsigned, 16> ArgTyIDs;
5947 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5948 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5949 Ops.push_back(
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
5953 return error(
"Invalid invoke record");
5956 if (!FTy->isVarArg()) {
5957 if (
Record.size() != OpNum)
5958 return error(
"Invalid invoke record");
5961 while (OpNum !=
Record.size()) {
5964 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5965 return error(
"Invalid invoke record");
5972 if (!OperandBundles.empty())
5977 ResTypeID = getContainedTypeID(FTyID);
5978 OperandBundles.clear();
5981 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
5992 Value *Val =
nullptr;
5994 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
5995 return error(
"Invalid resume record");
6004 unsigned CCInfo =
Record[OpNum++];
6006 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
6007 unsigned NumIndirectDests =
Record[OpNum++];
6008 SmallVector<BasicBlock *, 16> IndirectDests;
6009 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
6010 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
6012 unsigned FTyID = InvalidTypeID;
6013 FunctionType *FTy =
nullptr;
6018 return error(
"Explicit call type is not a function type");
6022 unsigned CalleeTypeID;
6023 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6025 return error(
"Invalid callbr record");
6029 return error(
"Callee is not a pointer type");
6031 FTyID = getContainedTypeID(CalleeTypeID);
6034 return error(
"Callee is not of pointer to function type");
6036 if (
Record.size() < FTy->getNumParams() + OpNum)
6037 return error(
"Insufficient operands to call");
6039 SmallVector<Value*, 16>
Args;
6040 SmallVector<unsigned, 16> ArgTyIDs;
6042 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6044 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6045 if (FTy->getParamType(i)->isLabelTy())
6046 Arg = getBasicBlock(Record[OpNum]);
6048 Arg =
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6051 return error(
"Invalid callbr record");
6052 Args.push_back(Arg);
6057 if (!FTy->isVarArg()) {
6058 if (OpNum !=
Record.size())
6059 return error(
"Invalid callbr record");
6061 while (OpNum !=
Record.size()) {
6064 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6065 return error(
"Invalid callbr record");
6072 if (!OperandBundles.empty())
6077 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6080 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6085 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6086 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6087 unsigned LabelNo = ArgNo - FirstBlockArg;
6089 if (!BA || BA->getFunction() !=
F ||
6090 LabelNo > IndirectDests.
size() ||
6091 BA->getBasicBlock() != IndirectDests[LabelNo])
6092 return error(
"callbr argument does not match indirect dest");
6097 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6101 for (
Value *Arg : Args)
6104 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6107 std::string Constraints =
IA->getConstraintString().str();
6110 for (
const auto &CI : ConstraintInfo) {
6112 if (ArgNo >= FirstBlockArg)
6113 Constraints.insert(Pos,
"!");
6118 Pos = Constraints.find(
',', Pos);
6119 if (Pos == std::string::npos)
6125 IA->hasSideEffects(),
IA->isAlignStack(),
6126 IA->getDialect(),
IA->canThrow());
6132 ResTypeID = getContainedTypeID(FTyID);
6133 OperandBundles.clear();
6150 return error(
"Invalid phi record");
6152 unsigned TyID =
Record[0];
6153 Type *Ty = getTypeByID(TyID);
6155 return error(
"Invalid phi record");
6160 size_t NumArgs = (
Record.size() - 1) / 2;
6164 return error(
"Invalid phi record");
6168 SmallDenseMap<BasicBlock *, Value *>
Args;
6169 for (
unsigned i = 0; i != NumArgs; i++) {
6170 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6173 return error(
"Invalid phi BB");
6180 auto It =
Args.find(BB);
6182 if (It !=
Args.end()) {
6196 if (!PhiConstExprBB)
6198 EdgeBB = PhiConstExprBB;
6206 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6208 V =
getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6212 return error(
"Invalid phi record");
6215 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6216 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6217 PhiConstExprBB =
nullptr;
6220 Args.insert({BB,
V});
6226 if (
Record.size() % 2 == 0) {
6230 I->setFastMathFlags(FMF);
6242 return error(
"Invalid landingpad record");
6246 return error(
"Invalid landingpad record");
6248 ResTypeID =
Record[Idx++];
6249 Type *Ty = getTypeByID(ResTypeID);
6251 return error(
"Invalid landingpad record");
6253 Value *PersFn =
nullptr;
6254 unsigned PersFnTypeID;
6255 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6257 return error(
"Invalid landingpad record");
6259 if (!
F->hasPersonalityFn())
6262 return error(
"Personality function mismatch");
6265 bool IsCleanup = !!
Record[Idx++];
6266 unsigned NumClauses =
Record[Idx++];
6269 for (
unsigned J = 0; J != NumClauses; ++J) {
6275 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6278 return error(
"Invalid landingpad record");
6283 "Catch clause has a invalid type!");
6286 "Filter clause has invalid type!");
6297 return error(
"Invalid alloca record");
6298 using APV = AllocaPackedValues;
6299 const uint64_t Rec =
Record[3];
6302 unsigned TyID =
Record[0];
6303 Type *Ty = getTypeByID(TyID);
6305 TyID = getContainedTypeID(TyID);
6306 Ty = getTypeByID(TyID);
6308 return error(
"Missing element type for old-style alloca");
6310 unsigned OpTyID =
Record[1];
6311 Type *OpTy = getTypeByID(OpTyID);
6312 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6317 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6321 return error(
"Invalid alloca record");
6323 const DataLayout &
DL = TheModule->getDataLayout();
6324 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6326 SmallPtrSet<Type *, 4> Visited;
6327 if (!Align && !Ty->
isSized(&Visited))
6328 return error(
"alloca of unsized type");
6330 Align =
DL.getPrefTypeAlign(Ty);
6332 if (!
Size->getType()->isIntegerTy())
6333 return error(
"alloca element count must have integer type");
6335 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6339 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6347 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6348 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6349 return error(
"Invalid load record");
6352 return error(
"Load operand is not a pointer type");
6355 if (OpNum + 3 ==
Record.size()) {
6356 ResTypeID =
Record[OpNum++];
6357 Ty = getTypeByID(ResTypeID);
6359 ResTypeID = getContainedTypeID(OpTypeID);
6360 Ty = getTypeByID(ResTypeID);
6364 return error(
"Missing load type");
6366 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6370 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6372 SmallPtrSet<Type *, 4> Visited;
6373 if (!Align && !Ty->
isSized(&Visited))
6374 return error(
"load of unsized type");
6376 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6377 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6386 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6387 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size()))
6388 return error(
"Invalid load atomic record");
6391 return error(
"Load operand is not a pointer type");
6394 if (OpNum + 5 ==
Record.size()) {
6395 ResTypeID =
Record[OpNum++];
6396 Ty = getTypeByID(ResTypeID);
6398 ResTypeID = getContainedTypeID(OpTypeID);
6399 Ty = getTypeByID(ResTypeID);
6403 return error(
"Missing atomic load type");
6405 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6409 if (Ordering == AtomicOrdering::NotAtomic ||
6410 Ordering == AtomicOrdering::Release ||
6411 Ordering == AtomicOrdering::AcquireRelease)
6412 return error(
"Invalid load atomic record");
6413 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6414 return error(
"Invalid load atomic record");
6415 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6418 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6421 return error(
"Alignment missing from atomic load");
6422 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align, Ordering, SSID);
6430 unsigned PtrTypeID, ValTypeID;
6431 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6432 return error(
"Invalid store record");
6435 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6436 return error(
"Invalid store record");
6438 ValTypeID = getContainedTypeID(PtrTypeID);
6439 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6440 ValTypeID, Val, CurBB))
6441 return error(
"Invalid store record");
6444 if (OpNum + 2 !=
Record.size())
6445 return error(
"Invalid store record");
6450 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6452 SmallPtrSet<Type *, 4> Visited;
6454 return error(
"store of unsized type");
6456 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6457 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6466 unsigned PtrTypeID, ValTypeID;
6467 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6469 return error(
"Invalid store atomic record");
6471 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6472 return error(
"Invalid store atomic record");
6474 ValTypeID = getContainedTypeID(PtrTypeID);
6475 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6476 ValTypeID, Val, CurBB))
6477 return error(
"Invalid store atomic record");
6480 if (OpNum + 4 !=
Record.size())
6481 return error(
"Invalid store atomic record");
6486 if (Ordering == AtomicOrdering::NotAtomic ||
6487 Ordering == AtomicOrdering::Acquire ||
6488 Ordering == AtomicOrdering::AcquireRelease)
6489 return error(
"Invalid store atomic record");
6490 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6491 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6492 return error(
"Invalid store atomic record");
6495 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6498 return error(
"Alignment missing from atomic store");
6499 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align, Ordering, SSID);
6506 const size_t NumRecords =
Record.size();
6508 Value *Ptr =
nullptr;
6510 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6511 return error(
"Invalid cmpxchg record");
6514 return error(
"Cmpxchg operand is not a pointer type");
6517 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6518 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6519 CmpTypeID, Cmp, CurBB))
6520 return error(
"Invalid cmpxchg record");
6523 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6525 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6526 return error(
"Invalid cmpxchg record");
6530 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6531 SuccessOrdering == AtomicOrdering::Unordered)
6532 return error(
"Invalid cmpxchg record");
6534 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6536 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6544 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6545 FailureOrdering == AtomicOrdering::Unordered)
6546 return error(
"Invalid cmpxchg record");
6548 const Align Alignment(
6549 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6551 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6552 FailureOrdering, SSID);
6555 if (NumRecords < 8) {
6559 I->insertInto(CurBB, CurBB->
end());
6561 ResTypeID = CmpTypeID;
6564 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6565 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6574 const size_t NumRecords =
Record.size();
6576 Value *Ptr =
nullptr;
6578 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6579 return error(
"Invalid cmpxchg record");
6582 return error(
"Cmpxchg operand is not a pointer type");
6586 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6587 return error(
"Invalid cmpxchg record");
6589 Value *Val =
nullptr;
6590 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6592 return error(
"Invalid cmpxchg record");
6594 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6595 return error(
"Invalid cmpxchg record");
6597 const bool IsVol =
Record[OpNum];
6602 return error(
"Invalid cmpxchg success ordering");
6604 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6606 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6612 return error(
"Invalid cmpxchg failure ordering");
6614 const bool IsWeak =
Record[OpNum + 4];
6616 MaybeAlign Alignment;
6618 if (NumRecords == (OpNum + 6)) {
6619 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6624 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6626 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6627 FailureOrdering, SSID);
6631 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6632 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6641 const size_t NumRecords =
Record.size();
6644 Value *Ptr =
nullptr;
6646 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6647 return error(
"Invalid atomicrmw record");
6650 return error(
"Invalid atomicrmw record");
6652 Value *Val =
nullptr;
6653 unsigned ValTypeID = InvalidTypeID;
6655 ValTypeID = getContainedTypeID(PtrTypeID);
6656 if (popValue(Record, OpNum, NextValueNo,
6657 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6658 return error(
"Invalid atomicrmw record");
6660 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6661 return error(
"Invalid atomicrmw record");
6664 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6665 return error(
"Invalid atomicrmw record");
6667 bool IsElementwise =
false;
6672 return error(
"Invalid atomicrmw record");
6674 const bool IsVol =
Record[OpNum + 1];
6677 if (Ordering == AtomicOrdering::NotAtomic ||
6678 Ordering == AtomicOrdering::Unordered)
6679 return error(
"Invalid atomicrmw record");
6681 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6683 MaybeAlign Alignment;
6685 if (NumRecords == (OpNum + 5)) {
6686 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6692 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6694 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID,
6696 ResTypeID = ValTypeID;
6704 return error(
"Invalid fence record");
6706 if (Ordering == AtomicOrdering::NotAtomic ||
6707 Ordering == AtomicOrdering::Unordered ||
6708 Ordering == AtomicOrdering::Monotonic)
6709 return error(
"Invalid fence record");
6711 I =
new FenceInst(
Context, Ordering, SSID);
6718 SeenDebugRecord =
true;
6721 return error(
"Invalid dbg record: missing instruction");
6724 Inst->
getParent()->insertDbgRecordBefore(
6735 SeenDebugRecord =
true;
6738 return error(
"Invalid dbg record: missing instruction");
6755 DILocalVariable *Var =
6757 DIExpression *Expr =
6770 unsigned SlotBefore =
Slot;
6771 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6772 return error(
"Invalid dbg record: invalid value");
6774 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6777 RawLocation = getFnMetadataByID(Record[Slot++]);
6780 DbgVariableRecord *DVR =
nullptr;
6784 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6785 DbgVariableRecord::LocationType::Value);
6788 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6789 DbgVariableRecord::LocationType::Declare);
6792 DVR =
new DbgVariableRecord(
6793 RawLocation, Var, Expr, DIL,
6794 DbgVariableRecord::LocationType::DeclareValue);
6798 DIExpression *AddrExpr =
6800 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6801 DVR =
new DbgVariableRecord(RawLocation, Var, Expr,
ID, Addr, AddrExpr,
6814 return error(
"Invalid call record");
6818 unsigned CCInfo =
Record[OpNum++];
6824 return error(
"Fast math flags indicator set for call with no FMF");
6827 unsigned FTyID = InvalidTypeID;
6828 FunctionType *FTy =
nullptr;
6833 return error(
"Explicit call type is not a function type");
6837 unsigned CalleeTypeID;
6838 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6840 return error(
"Invalid call record");
6844 return error(
"Callee is not a pointer type");
6846 FTyID = getContainedTypeID(CalleeTypeID);
6849 return error(
"Callee is not of pointer to function type");
6851 if (
Record.size() < FTy->getNumParams() + OpNum)
6852 return error(
"Insufficient operands to call");
6854 SmallVector<Value*, 16>
Args;
6855 SmallVector<unsigned, 16> ArgTyIDs;
6857 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6858 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6859 if (FTy->getParamType(i)->isLabelTy())
6860 Args.push_back(getBasicBlock(Record[OpNum]));
6863 FTy->getParamType(i), ArgTyID, CurBB));
6866 return error(
"Invalid call record");
6870 if (!FTy->isVarArg()) {
6871 if (OpNum !=
Record.size())
6872 return error(
"Invalid call record");
6874 while (OpNum !=
Record.size()) {
6877 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6878 return error(
"Invalid call record");
6885 if (!OperandBundles.empty())
6889 ResTypeID = getContainedTypeID(FTyID);
6890 OperandBundles.clear();
6904 SeenDebugIntrinsic =
true;
6911 return error(
"Fast-math-flags specified for call without "
6912 "floating-point scalar or vector return type");
6913 I->setFastMathFlags(FMF);
6919 return error(
"Invalid va_arg record");
6920 unsigned OpTyID =
Record[0];
6921 Type *OpTy = getTypeByID(OpTyID);
6924 Type *ResTy = getTypeByID(ResTypeID);
6925 if (!OpTy || !
Op || !ResTy)
6926 return error(
"Invalid va_arg record");
6927 I =
new VAArgInst(
Op, ResTy);
6937 if (
Record.empty() || Record[0] >= BundleTags.size())
6938 return error(
"Invalid operand bundle record");
6940 std::vector<Value *> Inputs;
6943 while (OpNum !=
Record.size()) {
6945 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
6946 return error(
"Invalid operand bundle record");
6947 Inputs.push_back(
Op);
6950 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
6958 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6959 return error(
"Invalid freeze record");
6960 if (OpNum !=
Record.size())
6961 return error(
"Invalid freeze record");
6963 I =
new FreezeInst(
Op);
6964 ResTypeID = OpTypeID;
6974 return error(
"Invalid instruction with no BB");
6976 if (!OperandBundles.empty()) {
6978 return error(
"Operand bundles found with no consumer");
6980 I->insertInto(CurBB, CurBB->
end());
6983 if (
I->isTerminator()) {
6985 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
6989 if (!
I->getType()->isVoidTy()) {
6990 assert(
I->getType() == getTypeByID(ResTypeID) &&
6991 "Incorrect result type ID");
6999 if (!OperandBundles.empty())
7000 return error(
"Operand bundles found with no consumer");
7004 if (!
A->getParent()) {
7006 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
7012 return error(
"Never resolved value found in function");
7017 if (MDLoader->hasFwdRefs())
7018 return error(
"Invalid function metadata: outgoing forward refs");
7023 for (
const auto &Pair : ConstExprEdgeBBs) {
7034 ValueList.
shrinkTo(ModuleValueListSize);
7035 MDLoader->shrinkTo(ModuleMDLoaderSize);
7036 std::vector<BasicBlock*>().swap(FunctionBBs);
7041Error BitcodeReader::findFunctionInStream(
7043 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
7044 while (DeferredFunctionInfoIterator->second == 0) {
7049 assert(VSTOffset == 0 || !
F->hasName());
7052 if (
Error Err = rememberAndSkipFunctionBodies())
7058SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7061 if (Val >= SSIDs.
size())
7070Error BitcodeReader::materialize(GlobalValue *GV) {
7073 if (!
F || !
F->isMaterializable())
7076 auto DFII = DeferredFunctionInfo.
find(
F);
7077 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7080 if (DFII->second == 0)
7081 if (
Error Err = findFunctionInStream(
F, DFII))
7085 if (
Error Err = materializeMetadata())
7092 if (
Error Err = parseFunctionBody(
F))
7094 F->setIsMaterializable(
false);
7098 if (SeenDebugIntrinsic && SeenDebugRecord)
7099 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7105 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7106 F->setSubprogram(SP);
7109 if (!MDLoader->isStrippingTBAA()) {
7111 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7114 MDLoader->setStripTBAA(
true);
7121 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7122 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7128 unsigned ExpectedNumOperands = 0;
7130 ExpectedNumOperands = 2;
7132 ExpectedNumOperands =
SI->getNumSuccessors();
7134 ExpectedNumOperands = 1;
7138 ExpectedNumOperands = 2;
7145 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7146 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7152 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7153 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7155 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7156 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7157 CI->getArgOperand(ArgNo)->getType(),
7158 CI->getParamAttributes(ArgNo)));
7161 if (Function *OldFn = CI->getCalledFunction()) {
7162 auto It = UpgradedIntrinsics.find(OldFn);
7163 if (It != UpgradedIntrinsics.end())
7167 BC && BC->getSrcTy() == BC->getDestTy() &&
7173 CI && CI->isMustTailCall() && CI->getNextNode() == BC) {
7174 BC->replaceAllUsesWith(CI);
7175 BC->eraseFromParent();
7185 return materializeForwardReferencedFunctions();
7188Error BitcodeReader::materializeModule() {
7189 if (
Error Err = materializeMetadata())
7193 WillMaterializeAllForwardRefs =
true;
7197 for (Function &
F : *TheModule) {
7198 if (
Error Err = materialize(&
F))
7204 if (LastFunctionBlockBit || NextUnreadBit)
7206 ? LastFunctionBlockBit
7212 if (!BasicBlockFwdRefs.
empty())
7213 return error(
"Never resolved function from blockaddress");
7219 for (
auto &
I : UpgradedIntrinsics) {
7220 for (
auto *U :
I.first->users()) {
7224 if (
I.first !=
I.second) {
7225 if (!
I.first->use_empty())
7226 I.first->replaceAllUsesWith(
I.second);
7227 I.first->eraseFromParent();
7230 UpgradedIntrinsics.clear();
7245std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7246 return IdentifiedStructTypes;
7249ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7250 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7252 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7253 ModulePath(ModulePath), IsPrevailing(IsPrevailing) {}
7255void ModuleSummaryIndexBitcodeReader::addThisModule() {
7260ModuleSummaryIndexBitcodeReader::getThisModule() {
7264template <
bool AllowNullValueInfo>
7265std::pair<ValueInfo, GlobalValue::GUID>
7266ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7267 auto VGI = ValueIdToValueInfoMap[ValueId];
7274 assert(AllowNullValueInfo || std::get<0>(VGI));
7278void ModuleSummaryIndexBitcodeReader::setValueGUID(
7280 StringRef SourceFileName) {
7281 std::string GlobalId =
7284 auto OriginalNameID = ValueGUID;
7288 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7294 ValueIdToValueInfoMap[ValueID] = std::make_pair(
7303Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7305 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7312 if (!MaybeCurrentBit)
7314 uint64_t CurrentBit = MaybeCurrentBit.
get();
7319 SmallVector<uint64_t, 64>
Record;
7328 BitstreamEntry
Entry = MaybeEntry.
get();
7330 switch (
Entry.Kind) {
7333 return error(
"Malformed block");
7349 switch (MaybeRecord.
get()) {
7354 return error(
"Invalid vst_code_entry record");
7355 unsigned ValueID =
Record[0];
7357 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7358 assert(VLI != ValueIdToLinkageMap.
end() &&
7359 "No linkage found for VST entry?");
7368 return error(
"Invalid vst_code_fnentry record");
7369 unsigned ValueID =
Record[0];
7371 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7372 assert(VLI != ValueIdToLinkageMap.
end() &&
7373 "No linkage found for VST entry?");
7381 unsigned ValueID =
Record[0];
7385 ValueIdToValueInfoMap[ValueID] =
7396Error ModuleSummaryIndexBitcodeReader::parseModule() {
7400 SmallVector<uint64_t, 64>
Record;
7401 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7402 unsigned ValueId = 0;
7406 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
7409 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7411 switch (
Entry.Kind) {
7413 return error(
"Malformed block");
7425 if (
Error Err = readBlockInfo())
7431 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7432 !SeenGlobalValSummary) &&
7433 "Expected early VST parse via VSTOffset record");
7440 if (!SourceFileName.
empty())
7442 assert(!SeenValueSymbolTable &&
7443 "Already read VST when parsing summary block?");
7448 if (VSTOffset > 0) {
7449 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7451 SeenValueSymbolTable =
true;
7453 SeenGlobalValSummary =
true;
7454 if (
Error Err = parseEntireSummary(
Entry.ID))
7458 if (
Error Err = parseModuleStringTable())
7466 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7469 switch (MaybeBitCode.
get()) {
7473 if (
Error Err = parseVersionRecord(Record).takeError())
7481 return error(
"Invalid source filename record");
7488 return error(
"Invalid hash length " + Twine(
Record.size()));
7489 auto &Hash = getThisModule()->second;
7491 for (
auto &Val : Record) {
7492 assert(!(Val >> 32) &&
"Unexpected high bits set");
7500 return error(
"Invalid vstoffset record");
7504 VSTOffset =
Record[0] - 1;
7514 ArrayRef<uint64_t> GVRecord;
7515 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7516 if (GVRecord.
size() <= 3)
7517 return error(
"Invalid global record");
7518 uint64_t RawLinkage = GVRecord[3];
7521 ValueIdToLinkageMap[ValueId++] =
Linkage;
7525 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7536ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7539 for (uint64_t RefValueId : Record)
7540 Ret.
push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7545ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7546 bool IsOldProfileFormat,
7547 bool HasProfile,
bool HasRelBF) {
7551 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7556 for (
unsigned I = 0,
E =
Record.size();
I !=
E; ++
I) {
7558 bool HasTailCall =
false;
7560 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7561 if (IsOldProfileFormat) {
7565 }
else if (HasProfile)
7566 std::tie(Hotness, HasTailCall) =
7600 static_cast<size_t>(
Record[Slot + 1])};
7623 while (Slot <
Record.size())
7627std::vector<FunctionSummary::ParamAccess>
7628ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7629 auto ReadRange = [&]() {
7631 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7633 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7640 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7641 while (!
Record.empty()) {
7642 PendingParamAccesses.emplace_back();
7643 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7645 ParamAccess.
Use = ReadRange();
7650 std::get<0>(getValueInfoFromValueId(
Record.consume_front()));
7651 Call.Offsets = ReadRange();
7654 return PendingParamAccesses;
7657void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7658 ArrayRef<uint64_t> Record,
size_t &Slot,
7661 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7665void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7666 ArrayRef<uint64_t> Record) {
7674 while (Slot <
Record.size())
7675 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7678SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7679 ArrayRef<uint64_t> Record,
unsigned &
I) {
7680 SmallVector<unsigned> StackIdList;
7684 if (RadixArray.empty()) {
7685 unsigned NumStackEntries =
Record[
I++];
7687 StackIdList.
reserve(NumStackEntries);
7688 for (
unsigned J = 0; J < NumStackEntries; J++) {
7689 assert(Record[
I] < StackIds.size());
7690 StackIdList.
push_back(getStackIdIndex(Record[
I++]));
7693 unsigned RadixIndex =
Record[
I++];
7699 assert(RadixIndex < RadixArray.size());
7700 unsigned NumStackIds = RadixArray[RadixIndex++];
7701 StackIdList.
reserve(NumStackIds);
7702 while (NumStackIds--) {
7703 assert(RadixIndex < RadixArray.size());
7704 unsigned Elem = RadixArray[RadixIndex];
7705 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7706 RadixIndex = RadixIndex - Elem;
7707 assert(RadixIndex < RadixArray.size());
7708 Elem = RadixArray[RadixIndex];
7710 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7713 StackIdList.
push_back(getStackIdIndex(Elem));
7723 unsigned FirstWORef = Refs.
size() - WOCnt;
7724 unsigned RefNo = FirstWORef - ROCnt;
7725 for (; RefNo < FirstWORef; ++RefNo)
7726 Refs[RefNo].setReadOnly();
7727 for (; RefNo < Refs.
size(); ++RefNo)
7728 Refs[RefNo].setWriteOnly();
7733Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7736 SmallVector<uint64_t, 64>
Record;
7743 BitstreamEntry
Entry = MaybeEntry.
get();
7746 return error(
"Invalid Summary Block: record for version expected");
7751 return error(
"Invalid Summary Block: version expected");
7754 const bool IsOldProfileFormat =
Version == 1;
7757 const bool MemProfAfterFunctionSummary =
Version >= 13;
7759 return error(
"Invalid summary version " + Twine(
Version) +
" in module '" +
7760 ModulePath +
"'. Version should be in the range [1-" +
7766 GlobalValueSummary *LastSeenSummary =
nullptr;
7776 FunctionSummary *CurrentPrevailingFS =
nullptr;
7781 std::vector<GlobalValue::GUID> PendingTypeTests;
7782 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7783 PendingTypeCheckedLoadVCalls;
7784 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7785 PendingTypeCheckedLoadConstVCalls;
7786 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7788 std::vector<CallsiteInfo> PendingCallsites;
7789 std::vector<AllocInfo> PendingAllocs;
7790 std::vector<uint64_t> PendingContextIds;
7796 BitstreamEntry
Entry = MaybeEntry.
get();
7798 switch (
Entry.Kind) {
7801 return error(
"Malformed block");
7817 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7820 unsigned BitCode = MaybeBitCode.
get();
7830 uint64_t ValueID =
Record[0];
7837 ValueIdToValueInfoMap[ValueID] =
7855 unsigned ValueID =
Record[0];
7856 uint64_t RawFlags =
Record[1];
7857 unsigned InstCount =
Record[2];
7858 uint64_t RawFunFlags = 0;
7859 unsigned NumRefs =
Record[3];
7860 unsigned NumRORefs = 0, NumWORefs = 0;
7861 int RefListStartIndex = 4;
7865 RefListStartIndex = 5;
7868 RefListStartIndex = 6;
7871 RefListStartIndex = 7;
7882 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7884 "Record size inconsistent with number of references");
7886 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7891 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7892 IsOldProfileFormat, HasProfile, HasRelBF);
7894 auto [
VI,
GUID] = getValueInfoFromValueId(ValueID);
7901 IsPrevailing(
VI.getGUID());
7907 assert(!MemProfAfterFunctionSummary ||
7908 (PendingCallsites.empty() && PendingAllocs.empty()));
7909 if (!IsPrevailingSym && !MemProfAfterFunctionSummary) {
7910 PendingCallsites.clear();
7911 PendingAllocs.clear();
7914 auto FS = std::make_unique<FunctionSummary>(
7916 std::move(Calls), std::move(PendingTypeTests),
7917 std::move(PendingTypeTestAssumeVCalls),
7918 std::move(PendingTypeCheckedLoadVCalls),
7919 std::move(PendingTypeTestAssumeConstVCalls),
7920 std::move(PendingTypeCheckedLoadConstVCalls),
7921 std::move(PendingParamAccesses), std::move(PendingCallsites),
7922 std::move(PendingAllocs));
7923 FS->setModulePath(getThisModule()->first());
7924 FS->setOriginalName(GUID);
7927 if (MemProfAfterFunctionSummary) {
7928 if (IsPrevailingSym)
7929 CurrentPrevailingFS =
FS.get();
7931 CurrentPrevailingFS =
nullptr;
7940 unsigned ValueID =
Record[0];
7941 uint64_t RawFlags =
Record[1];
7942 unsigned AliaseeID =
Record[2];
7944 auto AS = std::make_unique<AliasSummary>(Flags);
7950 AS->setModulePath(getThisModule()->first());
7952 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
7954 if (!AliaseeInModule)
7955 return error(
"Alias expects aliasee summary to be parsed");
7956 AS->setAliasee(AliaseeVI, AliaseeInModule);
7958 auto GUID = getValueInfoFromValueId(ValueID);
7959 AS->setOriginalName(std::get<1>(GUID));
7965 unsigned ValueID =
Record[0];
7966 uint64_t RawFlags =
Record[1];
7967 unsigned RefArrayStart = 2;
7968 GlobalVarSummary::GVarFlags GVF(
false,
7978 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
7980 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7981 FS->setModulePath(getThisModule()->first());
7982 auto GUID = getValueInfoFromValueId(ValueID);
7983 FS->setOriginalName(std::get<1>(GUID));
7991 unsigned ValueID =
Record[0];
7992 uint64_t RawFlags =
Record[1];
7994 unsigned NumRefs =
Record[3];
7995 unsigned RefListStartIndex = 4;
7996 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
7999 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8001 for (
unsigned I = VTableListStartIndex,
E =
Record.size();
I !=
E; ++
I) {
8002 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
8007 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8008 VS->setModulePath(getThisModule()->first());
8009 VS->setVTableFuncs(VTableFuncs);
8010 auto GUID = getValueInfoFromValueId(ValueID);
8011 VS->setOriginalName(std::get<1>(GUID));
8023 unsigned ValueID =
Record[0];
8024 uint64_t ModuleId =
Record[1];
8025 uint64_t RawFlags =
Record[2];
8026 unsigned InstCount =
Record[3];
8027 uint64_t RawFunFlags = 0;
8028 unsigned NumRefs =
Record[4];
8029 unsigned NumRORefs = 0, NumWORefs = 0;
8030 int RefListStartIndex = 5;
8034 RefListStartIndex = 6;
8035 size_t NumRefsIndex = 5;
8037 unsigned NumRORefsOffset = 1;
8038 RefListStartIndex = 7;
8041 RefListStartIndex = 8;
8043 RefListStartIndex = 9;
8045 NumRORefsOffset = 2;
8048 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
8050 NumRefs =
Record[NumRefsIndex];
8054 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8056 "Record size inconsistent with number of references");
8058 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8061 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8062 IsOldProfileFormat, HasProfile,
false);
8063 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8065 auto FS = std::make_unique<FunctionSummary>(
8067 std::move(Edges), std::move(PendingTypeTests),
8068 std::move(PendingTypeTestAssumeVCalls),
8069 std::move(PendingTypeCheckedLoadVCalls),
8070 std::move(PendingTypeTestAssumeConstVCalls),
8071 std::move(PendingTypeCheckedLoadConstVCalls),
8072 std::move(PendingParamAccesses), std::move(PendingCallsites),
8073 std::move(PendingAllocs));
8074 LastSeenSummary =
FS.get();
8075 if (MemProfAfterFunctionSummary)
8076 CurrentPrevailingFS =
FS.get();
8077 LastSeenGUID =
VI.getGUID();
8078 FS->setModulePath(ModuleIdMap[ModuleId]);
8086 unsigned ValueID =
Record[0];
8087 uint64_t ModuleId =
Record[1];
8088 uint64_t RawFlags =
Record[2];
8089 unsigned AliaseeValueId =
Record[3];
8091 auto AS = std::make_unique<AliasSummary>(Flags);
8092 LastSeenSummary = AS.get();
8093 AS->setModulePath(ModuleIdMap[ModuleId]);
8095 auto AliaseeVI = std::get<0>(
8096 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(AliaseeValueId));
8098 auto AliaseeInModule =
8100 AS->setAliasee(AliaseeVI, AliaseeInModule);
8102 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8103 LastSeenGUID =
VI.getGUID();
8109 unsigned ValueID =
Record[0];
8110 uint64_t ModuleId =
Record[1];
8111 uint64_t RawFlags =
Record[2];
8112 unsigned RefArrayStart = 3;
8113 GlobalVarSummary::GVarFlags GVF(
false,
8123 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8125 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8126 LastSeenSummary =
FS.get();
8127 FS->setModulePath(ModuleIdMap[ModuleId]);
8128 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8129 LastSeenGUID =
VI.getGUID();
8135 uint64_t OriginalName =
Record[0];
8136 if (!LastSeenSummary)
8137 return error(
"Name attachment that does not follow a combined record");
8141 LastSeenSummary =
nullptr;
8146 assert(PendingTypeTests.empty());
8151 assert(PendingTypeTestAssumeVCalls.empty());
8152 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8153 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8157 assert(PendingTypeCheckedLoadVCalls.empty());
8158 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8159 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8163 PendingTypeTestAssumeConstVCalls.push_back(
8168 PendingTypeCheckedLoadConstVCalls.push_back(
8175 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8176 StringRef
Name(Strtab.
data() + Record[
I],
8177 static_cast<size_t>(Record[
I + 1]));
8180 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, GUID);
8183 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8185 StringRef
Name(Strtab.
data() + Record[
I + 1],
8186 static_cast<size_t>(Record[
I + 2]));
8187 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8196 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8197 StringRef
Name(Strtab.
data() + Record[
I],
8198 static_cast<size_t>(Record[
I + 1]));
8201 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, GUID);
8204 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8206 StringRef
Name(Strtab.
data() + Record[
I + 1],
8207 static_cast<size_t>(Record[
I + 2]));
8208 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8219 parseTypeIdCompatibleVtableSummaryRecord(Record);
8227 PendingParamAccesses = parseParamAccesses(Record);
8234 assert(StackIds.empty());
8236 StackIds = ArrayRef<uint64_t>(Record);
8242 StackIds.reserve(
Record.size() / 2);
8243 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8244 StackIds.push_back(*R << 32 | *(R + 1));
8246 assert(StackIdToIndex.empty());
8248 StackIdToIndex.resize(StackIds.size(), UninitializedStackIdIndex);
8253 RadixArray = ArrayRef<uint64_t>(Record);
8260 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8262 unsigned ValueID =
Record[0];
8263 SmallVector<unsigned> StackIdList;
8265 assert(R < StackIds.size());
8266 StackIdList.
push_back(getStackIdIndex(R));
8268 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8269 if (MemProfAfterFunctionSummary)
8271 CallsiteInfo({
VI, std::move(StackIdList)}));
8273 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8280 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8281 auto RecordIter =
Record.begin();
8282 unsigned ValueID = *RecordIter++;
8283 unsigned NumStackIds = *RecordIter++;
8284 unsigned NumVersions = *RecordIter++;
8285 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8286 SmallVector<unsigned> StackIdList;
8287 for (
unsigned J = 0; J < NumStackIds; J++) {
8288 assert(*RecordIter < StackIds.size());
8289 StackIdList.
push_back(getStackIdIndex(*RecordIter++));
8291 SmallVector<unsigned> Versions;
8292 for (
unsigned J = 0; J < NumVersions; J++)
8294 ValueInfo
VI = std::get<0>(
8295 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8296 if (MemProfAfterFunctionSummary)
8298 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8300 PendingCallsites.push_back(
8301 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8308 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8313 PendingContextIds.reserve(
Record.size() / 2);
8314 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8315 PendingContextIds.push_back(*R << 32 | *(R + 1));
8322 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS) {
8323 PendingContextIds.clear();
8327 std::vector<MIBInfo> MIBs;
8328 unsigned NumMIBs = 0;
8331 unsigned MIBsRead = 0;
8332 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8336 auto StackIdList = parseAllocInfoContext(Record,
I);
8337 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8343 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8345 assert(!PendingContextIds.empty() &&
8346 "Missing context ids for alloc sizes");
8347 unsigned ContextIdIndex = 0;
8353 while (MIBsRead++ < NumMIBs) {
8355 unsigned NumContextSizeInfoEntries =
Record[
I++];
8357 std::vector<ContextTotalSize> ContextSizes;
8358 ContextSizes.reserve(NumContextSizeInfoEntries);
8359 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8360 assert(ContextIdIndex < PendingContextIds.size());
8362 if (PendingContextIds[ContextIdIndex] == 0) {
8371 ContextSizes.push_back(
8372 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8374 AllContextSizes.push_back(std::move(ContextSizes));
8376 PendingContextIds.clear();
8378 AllocInfo AI(std::move(MIBs));
8379 if (!AllContextSizes.empty()) {
8380 assert(AI.MIBs.size() == AllContextSizes.size());
8381 AI.ContextSizeInfos = std::move(AllContextSizes);
8384 if (MemProfAfterFunctionSummary)
8385 CurrentPrevailingFS->
addAlloc(std::move(AI));
8387 PendingAllocs.push_back(std::move(AI));
8395 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8397 std::vector<MIBInfo> MIBs;
8398 unsigned NumMIBs =
Record[
I++];
8399 unsigned NumVersions =
Record[
I++];
8400 unsigned MIBsRead = 0;
8401 while (MIBsRead++ < NumMIBs) {
8404 SmallVector<unsigned> StackIdList;
8406 StackIdList = parseAllocInfoContext(Record,
I);
8407 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8410 SmallVector<uint8_t> Versions;
8411 for (
unsigned J = 0; J < NumVersions; J++)
8414 AllocInfo AI(std::move(Versions), std::move(MIBs));
8415 if (MemProfAfterFunctionSummary)
8416 CurrentPrevailingFS->
addAlloc(std::move(AI));
8418 PendingAllocs.push_back(std::move(AI));
8428Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8432 SmallVector<uint64_t, 64>
Record;
8434 SmallString<128> ModulePath;
8441 BitstreamEntry
Entry = MaybeEntry.
get();
8443 switch (
Entry.Kind) {
8446 return error(
"Malformed block");
8458 switch (MaybeRecord.
get()) {
8463 uint64_t ModuleId =
Record[0];
8466 return error(
"Invalid code_entry record");
8468 LastSeenModule = TheIndex.
addModule(ModulePath);
8469 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8477 return error(
"Invalid hash length " + Twine(
Record.size()));
8478 if (!LastSeenModule)
8479 return error(
"Invalid hash that does not follow a module path");
8481 for (
auto &Val : Record) {
8482 assert(!(Val >> 32) &&
"Unexpected high bits set");
8483 LastSeenModule->
second[Pos++] = Val;
8486 LastSeenModule =
nullptr;
8499class BitcodeErrorCategoryType :
public std::error_category {
8500 const char *
name()
const noexcept
override {
8501 return "llvm.bitcode";
8504 std::string message(
int IE)
const override {
8507 case BitcodeError::CorruptedBitcode:
8508 return "Corrupted bitcode";
8517 static BitcodeErrorCategoryType ErrorCategory;
8518 return ErrorCategory;
8522 unsigned Block,
unsigned RecordID) {
8524 return std::move(Err);
8533 switch (Entry.Kind) {
8538 return error(
"Malformed block");
8542 return std::move(Err);
8552 if (MaybeRecord.
get() == RecordID)
8563Expected<std::vector<BitcodeModule>>
8567 return FOrErr.takeError();
8568 return std::move(FOrErr->Mods);
8593 switch (Entry.Kind) {
8596 return error(
"Malformed block");
8599 uint64_t IdentificationBit = -1ull;
8603 return std::move(Err);
8609 Entry = MaybeEntry.
get();
8614 return error(
"Malformed block");
8620 return std::move(Err);
8639 if (!
I.Strtab.empty())
8646 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8647 F.StrtabForSymtab = *Strtab;
8663 if (
F.Symtab.empty())
8664 F.Symtab = *SymtabOrErr;
8669 return std::move(Err);
8674 return std::move(E);
8689BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8690 bool ShouldLazyLoadMetadata,
bool IsImporting,
8694 std::string ProducerIdentification;
8695 if (IdentificationBit != -1ull) {
8697 return std::move(JumpFailed);
8700 return std::move(
E);
8704 return std::move(JumpFailed);
8705 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8708 std::unique_ptr<Module>
M =
8709 std::make_unique<Module>(ModuleIdentifier,
Context);
8710 M->setMaterializer(R);
8713 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8714 IsImporting, Callbacks))
8715 return std::move(Err);
8717 if (MaterializeAll) {
8719 if (
Error Err =
M->materializeAll())
8720 return std::move(Err);
8723 if (
Error Err =
R->materializeForwardReferencedFunctions())
8724 return std::move(Err);
8727 return std::move(M);
8730Expected<std::unique_ptr<Module>>
8733 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8748 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8749 ModulePath, IsPrevailing);
8750 return R.parseModule();
8757 return std::move(JumpFailed);
8759 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8760 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8761 ModuleIdentifier, 0);
8763 if (
Error Err = R.parseModule())
8764 return std::move(Err);
8766 return std::move(Index);
8772 return std::move(Err);
8778 return std::move(
E);
8780 switch (Entry.Kind) {
8783 return error(
"Malformed block");
8786 return std::make_pair(
false,
false);
8798 switch (MaybeBitCode.
get()) {
8804 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8806 bool EnableSplitLTOUnit = Flags & 0x8;
8807 bool UnifiedLTO = Flags & 0x200;
8808 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8819 return std::move(JumpFailed);
8822 return std::move(Err);
8827 return std::move(E);
8829 switch (Entry.Kind) {
8831 return error(
"Malformed block");
8842 return Flags.takeError();
8852 return std::move(Err);
8859 return StreamFailed.takeError();
8869 if (MsOrErr->size() != 1)
8870 return error(
"Expected a single module");
8872 return (*MsOrErr)[0];
8875Expected<std::unique_ptr<Module>>
8877 bool ShouldLazyLoadMetadata,
bool IsImporting,
8883 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8888 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8889 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8891 IsImporting, Callbacks);
8893 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8899 return getModuleImpl(Context,
true,
false,
false, Callbacks);
8911 return BM->parseModule(Context, Callbacks);
8944 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
8953 return BM->getSummary();
8961 return BM->getLTOInfo();
8966 bool IgnoreEmptyThinLTOIndexFile) {
8971 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 Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(GlobalValue::GUID)> IsPrevailing=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
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()
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
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
@ 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.
FunctionAddr VTableAddr Value
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...
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.
FunctionAddr VTableAddr uintptr_t uintptr_t Version
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.
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
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.
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