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;
701 std::vector<GlobalValue::GUID> GUIDList;
704 BitcodeReader(BitstreamCursor Stream, StringRef Strtab,
705 StringRef ProducerIdentification, LLVMContext &
Context);
707 Error materializeForwardReferencedFunctions();
709 Error materialize(GlobalValue *GV)
override;
710 Error materializeModule()
override;
711 std::vector<StructType *> getIdentifiedStructTypes()
const override;
715 Error parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
716 bool IsImporting, ParserCallbacks Callbacks = {});
718 static uint64_t decodeSignRotatedValue(uint64_t V);
721 Error materializeMetadata()
override;
723 void setStripDebugInfo()
override;
726 std::vector<StructType *> IdentifiedStructTypes;
727 StructType *createIdentifiedStructType(LLVMContext &
Context, StringRef Name);
728 StructType *createIdentifiedStructType(LLVMContext &
Context);
730 static constexpr unsigned InvalidTypeID = ~0
u;
732 Type *getTypeByID(
unsigned ID);
733 Type *getPtrElementTypeByID(
unsigned ID);
734 unsigned getContainedTypeID(
unsigned ID,
unsigned Idx = 0);
735 unsigned getVirtualTypeID(
Type *Ty, ArrayRef<unsigned> ContainedTypeIDs = {});
738 Expected<Value *> materializeValue(
unsigned ValID, BasicBlock *InsertBB);
739 Expected<Constant *> getValueForInitializer(
unsigned ID);
741 Value *getFnValueByID(
unsigned ID,
Type *Ty,
unsigned TyID,
742 BasicBlock *ConstExprInsertBB) {
749 return MDLoader->getMetadataFwdRefOrLoad(
ID);
753 if (
ID >= FunctionBBs.size())
return nullptr;
754 return FunctionBBs[
ID];
758 if (i-1 < MAttributes.size())
759 return MAttributes[i-1];
760 return AttributeList();
766 bool getValueTypePair(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
767 unsigned InstNum,
Value *&ResVal,
unsigned &
TypeID,
768 BasicBlock *ConstExprInsertBB) {
769 if (Slot ==
Record.size())
return true;
770 unsigned ValNo = (unsigned)Record[Slot++];
773 ValNo = InstNum - ValNo;
774 if (ValNo < InstNum) {
778 ResVal = getFnValueByID(ValNo,
nullptr,
TypeID, ConstExprInsertBB);
780 "Incorrect type ID stored for value");
781 return ResVal ==
nullptr;
783 if (Slot ==
Record.size())
786 TypeID = (unsigned)Record[Slot++];
787 ResVal = getFnValueByID(ValNo, getTypeByID(
TypeID),
TypeID,
789 return ResVal ==
nullptr;
792 bool getValueOrMetadata(
const SmallVectorImpl<uint64_t> &Record,
793 unsigned &Slot,
unsigned InstNum,
Value *&ResVal,
794 BasicBlock *ConstExprInsertBB) {
795 if (Slot ==
Record.size())
800 return getValueTypePair(Record, --Slot, InstNum, ResVal, TypeId,
803 if (Slot ==
Record.size())
805 unsigned ValNo = InstNum - (unsigned)Record[Slot++];
813 bool popValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
814 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
815 BasicBlock *ConstExprInsertBB) {
816 if (
getValue(Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
824 bool getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
825 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
826 BasicBlock *ConstExprInsertBB) {
827 ResVal =
getValue(Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
828 return ResVal ==
nullptr;
833 Value *
getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
834 unsigned InstNum,
Type *Ty,
unsigned TyID,
835 BasicBlock *ConstExprInsertBB) {
836 if (Slot ==
Record.size())
return nullptr;
837 unsigned ValNo = (unsigned)Record[Slot];
840 ValNo = InstNum - ValNo;
841 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
845 Value *getValueSigned(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
846 unsigned InstNum,
Type *Ty,
unsigned TyID,
847 BasicBlock *ConstExprInsertBB) {
848 if (Slot ==
Record.size())
return nullptr;
849 unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]);
852 ValNo = InstNum - ValNo;
853 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
856 Expected<ConstantRange> readConstantRange(ArrayRef<uint64_t> Record,
859 if (
Record.size() - OpNum < 2)
860 return error(
"Too few records for range");
862 unsigned LowerActiveWords =
Record[OpNum];
863 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
864 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
865 return error(
"Too few records for range");
868 OpNum += LowerActiveWords;
871 OpNum += UpperActiveWords;
874 int64_t
Start = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
875 int64_t End = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
876 return ConstantRange(APInt(
BitWidth, Start,
true),
881 Expected<ConstantRange>
882 readBitWidthAndConstantRange(ArrayRef<uint64_t> Record,
unsigned &OpNum) {
883 if (
Record.size() - OpNum < 1)
884 return error(
"Too few records for range");
886 return readConstantRange(Record, OpNum,
BitWidth);
892 Error propagateAttributeTypes(CallBase *CB, ArrayRef<unsigned> ArgsTys);
897 Error parseAlignmentValue(uint64_t
Exponent, MaybeAlign &Alignment);
898 Error parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind);
900 ParserCallbacks Callbacks = {});
902 Error parseComdatRecord(ArrayRef<uint64_t> Record);
903 Error parseGlobalVarRecord(ArrayRef<uint64_t> Record);
904 Error parseFunctionRecord(ArrayRef<uint64_t> Record);
905 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
906 ArrayRef<uint64_t> Record);
908 Error parseAttributeBlock();
909 Error parseAttributeGroupBlock();
910 Error parseTypeTable();
911 Error parseTypeTableBody();
912 Error parseOperandBundleTags();
913 Error parseSyncScopeNames();
915 Expected<Value *> recordValue(SmallVectorImpl<uint64_t> &Record,
916 unsigned NameIndex, Triple &TT);
917 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta, Function *
F,
918 ArrayRef<uint64_t> Record);
920 Error parseGlobalValueSymbolTable();
921 Error parseConstants();
922 Error rememberAndSkipFunctionBodies();
923 Error rememberAndSkipFunctionBody();
925 Error rememberAndSkipMetadata();
927 Error parseFunctionBody(Function *
F);
928 Error globalCleanup();
929 Error resolveGlobalAndIndirectSymbolInits();
930 Error parseUseLists();
931 Error findFunctionInStream(
933 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator);
940class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
942 ModuleSummaryIndex &TheIndex;
946 bool SeenGlobalValSummary =
false;
949 bool SeenValueSymbolTable =
false;
953 uint64_t VSTOffset = 0;
963 DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
964 ValueIdToValueInfoMap;
970 DenseMap<uint64_t, StringRef> ModuleIdMap;
973 std::string SourceFileName;
977 StringRef ModulePath;
981 std::function<bool(StringRef)> IsPrevailing =
nullptr;
984 std::function<void(ValueInfo)> OnValueInfo =
nullptr;
988 std::vector<uint64_t> StackIds;
992 std::vector<uint64_t> RadixArray;
997 std::vector<unsigned> StackIdToIndex;
1000 std::vector<uint64_t> DefinedGUIDs;
1003 ModuleSummaryIndexBitcodeReader(
1004 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
1005 StringRef ModulePath,
1006 std::function<
bool(StringRef)> IsPrevailing =
nullptr,
1007 std::function<
void(ValueInfo)> OnValueInfo =
nullptr);
1012 void setValueGUID(uint64_t ValueID, StringRef
ValueName,
1014 StringRef SourceFileName);
1015 Error parseValueSymbolTable(
1017 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
1020 makeCallList(ArrayRef<uint64_t> Record,
bool IsOldProfileFormat,
1021 bool HasProfile,
bool HasRelBF);
1022 Error parseEntireSummary(
unsigned ID);
1023 Error parseModuleStringTable();
1024 void parseTypeIdCompatibleVtableSummaryRecord(ArrayRef<uint64_t> Record);
1025 void parseTypeIdCompatibleVtableInfo(ArrayRef<uint64_t> Record,
size_t &Slot,
1027 std::vector<FunctionSummary::ParamAccess>
1028 parseParamAccesses(ArrayRef<uint64_t> Record);
1029 SmallVector<unsigned> parseAllocInfoContext(ArrayRef<uint64_t> Record,
1033 static constexpr unsigned UninitializedStackIdIndex =
1034 std::numeric_limits<unsigned>::max();
1036 unsigned getStackIdIndex(
unsigned LocalIndex) {
1037 unsigned &
Index = StackIdToIndex[LocalIndex];
1040 if (Index == UninitializedStackIdIndex)
1045 template <
bool AllowNullValueInfo = false>
1046 std::pair<ValueInfo, GlobalValue::GUID>
1047 getValueInfoFromValueId(
unsigned ValueId);
1049 void addThisModule();
1065 return std::error_code();
1071 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1072 ValueList(this->Stream.SizeInBytes(),
1074 return materializeValue(
ValID, InsertBB);
1076 this->ProducerIdentification = std::string(ProducerIdentification);
1079Error BitcodeReader::materializeForwardReferencedFunctions() {
1080 if (WillMaterializeAllForwardRefs)
1084 WillMaterializeAllForwardRefs =
true;
1086 while (!BasicBlockFwdRefQueue.empty()) {
1087 Function *
F = BasicBlockFwdRefQueue.front();
1088 BasicBlockFwdRefQueue.pop_front();
1089 assert(
F &&
"Expected valid function");
1090 if (!BasicBlockFwdRefs.
count(
F))
1098 if (!
F->isMaterializable())
1099 return error(
"Never resolved function from blockaddress");
1102 if (
Error Err = materialize(
F))
1105 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1107 for (Function *
F : BackwardRefFunctions)
1108 if (
Error Err = materialize(
F))
1110 BackwardRefFunctions.clear();
1113 WillMaterializeAllForwardRefs =
false;
1178 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1179 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1180 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1181 Flags.NoInline = (RawFlags >> 4) & 0x1;
1182 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1183 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1184 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1185 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1186 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1202 bool NoRenameOnPromotion = ((RawFlags >> 11) & 1);
1203 RawFlags = RawFlags >> 4;
1204 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1208 bool Live = (RawFlags & 0x2) || Version < 3;
1209 bool Local = (RawFlags & 0x4);
1210 bool AutoHide = (RawFlags & 0x8);
1213 Live,
Local, AutoHide, IK,
1214 NoRenameOnPromotion);
1220 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1221 (RawFlags & 0x4) ?
true :
false,
1225static std::pair<CalleeInfo::HotnessType, bool>
1229 bool HasTailCall = (RawFlags & 0x8);
1230 return {Hotness, HasTailCall};
1235 bool &HasTailCall) {
1236 static constexpr unsigned RelBlockFreqBits = 28;
1237 static constexpr uint64_t RelBlockFreqMask = (1 << RelBlockFreqBits) - 1;
1238 RelBF = RawFlags & RelBlockFreqMask;
1239 HasTailCall = (RawFlags & (1 << RelBlockFreqBits));
1264 case 0:
return false;
1265 case 1:
return true;
1327 bool IsFP = Ty->isFPOrFPVectorTy();
1329 if (!IsFP && !Ty->isIntOrIntVectorTy())
1336 return IsFP ? Instruction::FNeg : -1;
1341 bool IsFP = Ty->isFPOrFPVectorTy();
1343 if (!IsFP && !Ty->isIntOrIntVectorTy())
1350 return IsFP ? Instruction::FAdd : Instruction::Add;
1352 return IsFP ? Instruction::FSub : Instruction::Sub;
1354 return IsFP ? Instruction::FMul : Instruction::Mul;
1356 return IsFP ? -1 : Instruction::UDiv;
1358 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1360 return IsFP ? -1 : Instruction::URem;
1362 return IsFP ? Instruction::FRem : Instruction::SRem;
1364 return IsFP ? -1 : Instruction::Shl;
1366 return IsFP ? -1 : Instruction::LShr;
1368 return IsFP ? -1 : Instruction::AShr;
1370 return IsFP ? -1 : Instruction::And;
1372 return IsFP ? -1 : Instruction::Or;
1374 return IsFP ? -1 : Instruction::Xor;
1379 bool &IsElementwise) {
1477Type *BitcodeReader::getTypeByID(
unsigned ID) {
1479 if (
ID >= TypeList.size())
1482 if (
Type *Ty = TypeList[
ID])
1487 return TypeList[
ID] = createIdentifiedStructType(
Context);
1490unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1491 auto It = ContainedTypeIDs.
find(
ID);
1492 if (It == ContainedTypeIDs.
end())
1493 return InvalidTypeID;
1495 if (Idx >= It->second.size())
1496 return InvalidTypeID;
1498 return It->second[Idx];
1501Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1502 if (
ID >= TypeList.size())
1509 return getTypeByID(getContainedTypeID(
ID, 0));
1512unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1513 ArrayRef<unsigned> ChildTypeIDs) {
1514 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1515 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1516 auto It = VirtualTypeIDs.
find(CacheKey);
1517 if (It != VirtualTypeIDs.
end()) {
1523 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1524 "Incorrect cached contained type IDs");
1528 unsigned TypeID = TypeList.size();
1529 TypeList.push_back(Ty);
1530 if (!ChildTypeIDs.
empty())
1551 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1565 if (Opcode == Instruction::GetElementPtr)
1569 case Instruction::FNeg:
1570 case Instruction::Select:
1571 case Instruction::ICmp:
1572 case Instruction::FCmp:
1579Expected<Value *> BitcodeReader::materializeValue(
unsigned StartValID,
1580 BasicBlock *InsertBB) {
1582 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1584 return ValueList[StartValID];
1586 SmallDenseMap<unsigned, Value *> MaterializedValues;
1587 SmallVector<unsigned> Worklist;
1589 while (!Worklist.
empty()) {
1590 unsigned ValID = Worklist.
back();
1591 if (MaterializedValues.
count(ValID)) {
1597 if (ValID >= ValueList.
size() || !ValueList[ValID])
1598 return error(
"Invalid value ID");
1600 Value *
V = ValueList[ValID];
1603 MaterializedValues.
insert({ValID,
V});
1611 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1612 auto It = MaterializedValues.
find(OpID);
1613 if (It != MaterializedValues.
end())
1614 Ops.push_back(It->second);
1621 if (
Ops.size() != BC->getOperandIDs().size())
1623 std::reverse(
Ops.begin(),
Ops.end());
1640 switch (BC->Opcode) {
1641 case BitcodeConstant::ConstantPtrAuthOpcode: {
1644 return error(
"ptrauth key operand must be ConstantInt");
1648 return error(
"ptrauth disc operand must be ConstantInt");
1651 ConstOps.
size() > 4 ? ConstOps[4]
1656 "ptrauth deactivation symbol operand must be a pointer");
1659 DeactivationSymbol);
1662 case BitcodeConstant::NoCFIOpcode: {
1665 return error(
"no_cfi operand must be GlobalValue");
1669 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1672 return error(
"dso_local operand must be GlobalValue");
1676 case BitcodeConstant::BlockAddressOpcode: {
1679 return error(
"blockaddress operand must be a function");
1684 unsigned BBID = BC->BlockAddressBB;
1687 return error(
"Invalid ID");
1690 for (
size_t I = 0,
E = BBID;
I !=
E; ++
I) {
1692 return error(
"Invalid ID");
1699 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1701 BasicBlockFwdRefQueue.push_back(Fn);
1702 if (FwdBBs.size() < BBID + 1)
1703 FwdBBs.resize(BBID + 1);
1711 case BitcodeConstant::ConstantStructOpcode: {
1713 if (
ST->getNumElements() != ConstOps.
size())
1714 return error(
"Invalid number of elements in struct initializer");
1716 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1717 if (
Op->getType() != Ty)
1718 return error(
"Incorrect type in struct initializer");
1723 case BitcodeConstant::ConstantArrayOpcode: {
1725 if (AT->getNumElements() != ConstOps.
size())
1726 return error(
"Invalid number of elements in array initializer");
1728 for (Constant *
Op : ConstOps)
1729 if (
Op->getType() != AT->getElementType())
1730 return error(
"Incorrect type in array initializer");
1735 case BitcodeConstant::ConstantVectorOpcode: {
1737 if (VT->getNumElements() != ConstOps.size())
1738 return error(
"Invalid number of elements in vector initializer");
1740 for (Constant *
Op : ConstOps)
1741 if (
Op->getType() != VT->getElementType())
1742 return error(
"Incorrect type in vector initializer");
1747 case Instruction::GetElementPtr:
1749 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1752 case Instruction::ExtractElement:
1755 case Instruction::InsertElement:
1759 case Instruction::ShuffleVector: {
1760 SmallVector<int, 16>
Mask;
1772 MaterializedValues.
insert({ValID,
C});
1778 return error(Twine(
"Value referenced by initializer is an unsupported "
1779 "constant expression of type ") +
1780 BC->getOpcodeName());
1786 BC->getType(),
"constexpr", InsertBB);
1789 "constexpr", InsertBB);
1792 Ops[1],
"constexpr", InsertBB);
1795 I->setHasNoSignedWrap();
1797 I->setHasNoUnsignedWrap();
1803 switch (BC->Opcode) {
1804 case BitcodeConstant::ConstantVectorOpcode: {
1805 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1808 Value *Idx = ConstantInt::get(IdxTy, Pair.index());
1815 case BitcodeConstant::ConstantStructOpcode:
1816 case BitcodeConstant::ConstantArrayOpcode: {
1820 "constexpr.ins", InsertBB);
1824 case Instruction::ICmp:
1825 case Instruction::FCmp:
1828 "constexpr", InsertBB);
1830 case Instruction::GetElementPtr:
1836 case Instruction::Select:
1839 case Instruction::ExtractElement:
1842 case Instruction::InsertElement:
1846 case Instruction::ShuffleVector:
1847 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1855 MaterializedValues.
insert({ValID,
I});
1859 return MaterializedValues[StartValID];
1862Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1863 Expected<Value *> MaybeV = materializeValue(
ID,
nullptr);
1871StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1874 IdentifiedStructTypes.push_back(Ret);
1878StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1880 IdentifiedStructTypes.push_back(Ret);
1896 case Attribute::ZExt:
return 1 << 0;
1897 case Attribute::SExt:
return 1 << 1;
1898 case Attribute::NoReturn:
return 1 << 2;
1899 case Attribute::InReg:
return 1 << 3;
1900 case Attribute::StructRet:
return 1 << 4;
1901 case Attribute::NoUnwind:
return 1 << 5;
1902 case Attribute::NoAlias:
return 1 << 6;
1903 case Attribute::ByVal:
return 1 << 7;
1904 case Attribute::Nest:
return 1 << 8;
1905 case Attribute::ReadNone:
return 1 << 9;
1906 case Attribute::ReadOnly:
return 1 << 10;
1907 case Attribute::NoInline:
return 1 << 11;
1908 case Attribute::AlwaysInline:
return 1 << 12;
1909 case Attribute::OptimizeForSize:
return 1 << 13;
1910 case Attribute::StackProtect:
return 1 << 14;
1911 case Attribute::StackProtectReq:
return 1 << 15;
1912 case Attribute::Alignment:
return 31 << 16;
1914 case Attribute::NoRedZone:
return 1 << 22;
1915 case Attribute::NoImplicitFloat:
return 1 << 23;
1916 case Attribute::Naked:
return 1 << 24;
1917 case Attribute::InlineHint:
return 1 << 25;
1918 case Attribute::StackAlignment:
return 7 << 26;
1919 case Attribute::ReturnsTwice:
return 1 << 29;
1920 case Attribute::UWTable:
return 1 << 30;
1921 case Attribute::NonLazyBind:
return 1U << 31;
1922 case Attribute::SanitizeAddress:
return 1ULL << 32;
1923 case Attribute::MinSize:
return 1ULL << 33;
1924 case Attribute::NoDuplicate:
return 1ULL << 34;
1925 case Attribute::StackProtectStrong:
return 1ULL << 35;
1926 case Attribute::SanitizeThread:
return 1ULL << 36;
1927 case Attribute::SanitizeMemory:
return 1ULL << 37;
1928 case Attribute::NoBuiltin:
return 1ULL << 38;
1929 case Attribute::Returned:
return 1ULL << 39;
1930 case Attribute::Cold:
return 1ULL << 40;
1931 case Attribute::Builtin:
return 1ULL << 41;
1932 case Attribute::OptimizeNone:
return 1ULL << 42;
1933 case Attribute::InAlloca:
return 1ULL << 43;
1934 case Attribute::NonNull:
return 1ULL << 44;
1935 case Attribute::JumpTable:
return 1ULL << 45;
1936 case Attribute::Convergent:
return 1ULL << 46;
1937 case Attribute::SafeStack:
return 1ULL << 47;
1938 case Attribute::NoRecurse:
return 1ULL << 48;
1941 case Attribute::SwiftSelf:
return 1ULL << 51;
1942 case Attribute::SwiftError:
return 1ULL << 52;
1943 case Attribute::WriteOnly:
return 1ULL << 53;
1944 case Attribute::Speculatable:
return 1ULL << 54;
1945 case Attribute::StrictFP:
return 1ULL << 55;
1946 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1947 case Attribute::NoCfCheck:
return 1ULL << 57;
1948 case Attribute::OptForFuzzing:
return 1ULL << 58;
1949 case Attribute::ShadowCallStack:
return 1ULL << 59;
1950 case Attribute::SpeculativeLoadHardening:
1952 case Attribute::ImmArg:
1954 case Attribute::WillReturn:
1956 case Attribute::NoFree:
1972 if (
I == Attribute::Alignment)
1973 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1974 else if (
I == Attribute::StackAlignment)
1975 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1977 B.addTypeAttr(
I,
nullptr);
1991 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
1993 "Alignment must be a power of two.");
1996 B.addAlignmentAttr(Alignment);
1998 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
1999 (EncodedAttrs & 0xffff);
2001 if (AttrIdx == AttributeList::FunctionIndex) {
2004 if (Attrs & (1ULL << 9)) {
2006 Attrs &= ~(1ULL << 9);
2009 if (Attrs & (1ULL << 10)) {
2011 Attrs &= ~(1ULL << 10);
2014 if (Attrs & (1ULL << 49)) {
2016 Attrs &= ~(1ULL << 49);
2019 if (Attrs & (1ULL << 50)) {
2021 Attrs &= ~(1ULL << 50);
2024 if (Attrs & (1ULL << 53)) {
2026 Attrs &= ~(1ULL << 53);
2030 B.addMemoryAttr(ME);
2034 if (Attrs & (1ULL << 21)) {
2035 Attrs &= ~(1ULL << 21);
2042Error BitcodeReader::parseAttributeBlock() {
2046 if (!MAttributes.empty())
2047 return error(
"Invalid multiple blocks");
2049 SmallVector<uint64_t, 64>
Record;
2058 BitstreamEntry
Entry = MaybeEntry.
get();
2060 switch (
Entry.Kind) {
2063 return error(
"Malformed block");
2076 switch (MaybeRecord.
get()) {
2082 return error(
"Invalid parameter attribute record");
2084 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2090 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2094 for (uint64_t Val : Record)
2095 Attrs.push_back(MAttributeGroups[Val]);
2097 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2110 return Attribute::Alignment;
2112 return Attribute::AlwaysInline;
2114 return Attribute::Builtin;
2116 return Attribute::ByVal;
2118 return Attribute::InAlloca;
2120 return Attribute::Cold;
2122 return Attribute::Convergent;
2124 return Attribute::DisableSanitizerInstrumentation;
2126 return Attribute::ElementType;
2128 return Attribute::FnRetThunkExtern;
2130 return Attribute::Flatten;
2132 return Attribute::InlineHint;
2134 return Attribute::InReg;
2136 return Attribute::JumpTable;
2138 return Attribute::Memory;
2140 return Attribute::NoFPClass;
2142 return Attribute::MinSize;
2144 return Attribute::Naked;
2146 return Attribute::Nest;
2148 return Attribute::NoAlias;
2150 return Attribute::NoBuiltin;
2152 return Attribute::NoCallback;
2154 return Attribute::NoDivergenceSource;
2156 return Attribute::NoDuplicate;
2158 return Attribute::NoFree;
2160 return Attribute::NoImplicitFloat;
2162 return Attribute::NoInline;
2164 return Attribute::NoRecurse;
2166 return Attribute::NoMerge;
2168 return Attribute::NonLazyBind;
2170 return Attribute::NonNull;
2172 return Attribute::Dereferenceable;
2174 return Attribute::DereferenceableOrNull;
2176 return Attribute::AllocAlign;
2178 return Attribute::AllocKind;
2180 return Attribute::AllocSize;
2182 return Attribute::AllocatedPointer;
2184 return Attribute::NoRedZone;
2186 return Attribute::NoReturn;
2188 return Attribute::NoSync;
2190 return Attribute::NoCfCheck;
2192 return Attribute::NoProfile;
2194 return Attribute::SkipProfile;
2196 return Attribute::NoUnwind;
2198 return Attribute::NoSanitizeBounds;
2200 return Attribute::NoSanitizeCoverage;
2202 return Attribute::NullPointerIsValid;
2204 return Attribute::OptimizeForDebugging;
2206 return Attribute::OptForFuzzing;
2208 return Attribute::OptimizeForSize;
2210 return Attribute::OptimizeNone;
2212 return Attribute::ReadNone;
2214 return Attribute::ReadOnly;
2216 return Attribute::Returned;
2218 return Attribute::ReturnsTwice;
2220 return Attribute::SExt;
2222 return Attribute::Speculatable;
2224 return Attribute::StackAlignment;
2226 return Attribute::StackProtect;
2228 return Attribute::StackProtectReq;
2230 return Attribute::StackProtectStrong;
2232 return Attribute::SafeStack;
2234 return Attribute::ShadowCallStack;
2236 return Attribute::StrictFP;
2238 return Attribute::StructRet;
2240 return Attribute::SanitizeAddress;
2242 return Attribute::SanitizeHWAddress;
2244 return Attribute::SanitizeThread;
2246 return Attribute::SanitizeType;
2248 return Attribute::SanitizeMemory;
2250 return Attribute::SanitizeNumericalStability;
2252 return Attribute::SanitizeRealtime;
2254 return Attribute::SanitizeRealtimeBlocking;
2256 return Attribute::SanitizeAllocToken;
2258 return Attribute::SpeculativeLoadHardening;
2260 return Attribute::SwiftError;
2262 return Attribute::SwiftSelf;
2264 return Attribute::SwiftAsync;
2266 return Attribute::UWTable;
2268 return Attribute::VScaleRange;
2270 return Attribute::WillReturn;
2272 return Attribute::WriteOnly;
2274 return Attribute::ZExt;
2276 return Attribute::ImmArg;
2278 return Attribute::SanitizeMemTag;
2280 return Attribute::Preallocated;
2282 return Attribute::NoUndef;
2284 return Attribute::ByRef;
2286 return Attribute::MustProgress;
2288 return Attribute::Hot;
2290 return Attribute::PresplitCoroutine;
2292 return Attribute::Writable;
2294 return Attribute::CoroDestroyOnlyWhenComplete;
2296 return Attribute::DeadOnUnwind;
2298 return Attribute::Range;
2300 return Attribute::Initializes;
2302 return Attribute::CoroElideSafe;
2304 return Attribute::NoExt;
2306 return Attribute::Captures;
2308 return Attribute::DeadOnReturn;
2310 return Attribute::NoCreateUndefOrPoison;
2312 return Attribute::DenormalFPEnv;
2314 return Attribute::NoOutline;
2319 MaybeAlign &Alignment) {
2322 if (
Exponent > Value::MaxAlignmentExponent + 1)
2323 return error(
"Invalid alignment value");
2328Error BitcodeReader::parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind) {
2330 if (*Kind == Attribute::None)
2331 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2336 switch (EncodedKind) {
2360Error BitcodeReader::parseAttributeGroupBlock() {
2364 if (!MAttributeGroups.empty())
2365 return error(
"Invalid multiple blocks");
2367 SmallVector<uint64_t, 64>
Record;
2374 BitstreamEntry
Entry = MaybeEntry.
get();
2376 switch (
Entry.Kind) {
2379 return error(
"Malformed block");
2392 switch (MaybeRecord.
get()) {
2397 return error(
"Invalid grp record");
2399 uint64_t GrpID =
Record[0];
2400 uint64_t Idx =
Record[1];
2404 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2405 if (Record[i] == 0) {
2406 Attribute::AttrKind
Kind;
2407 uint64_t EncodedKind =
Record[++i];
2408 if (Idx == AttributeList::FunctionIndex &&
2417 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2423 if (Kind == Attribute::ByVal)
2424 B.addByValAttr(
nullptr);
2425 else if (Kind == Attribute::StructRet)
2426 B.addStructRetAttr(
nullptr);
2427 else if (Kind == Attribute::InAlloca)
2428 B.addInAllocaAttr(
nullptr);
2429 else if (Kind == Attribute::UWTable)
2430 B.addUWTableAttr(UWTableKind::Default);
2431 else if (Kind == Attribute::DeadOnReturn)
2432 B.addDeadOnReturnAttr(DeadOnReturnInfo());
2433 else if (Attribute::isEnumAttrKind(Kind))
2434 B.addAttribute(Kind);
2436 return error(
"Not an enum attribute");
2437 }
else if (Record[i] == 1) {
2438 Attribute::AttrKind
Kind;
2439 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2441 if (!Attribute::isIntAttrKind(Kind))
2442 return error(
"Not an int attribute");
2443 if (Kind == Attribute::Alignment)
2444 B.addAlignmentAttr(Record[++i]);
2445 else if (Kind == Attribute::StackAlignment)
2446 B.addStackAlignmentAttr(Record[++i]);
2447 else if (Kind == Attribute::Dereferenceable)
2448 B.addDereferenceableAttr(Record[++i]);
2449 else if (Kind == Attribute::DereferenceableOrNull)
2450 B.addDereferenceableOrNullAttr(Record[++i]);
2451 else if (Kind == Attribute::DeadOnReturn)
2452 B.addDeadOnReturnAttr(
2454 else if (Kind == Attribute::AllocSize)
2455 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2456 else if (Kind == Attribute::VScaleRange)
2457 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2458 else if (Kind == Attribute::UWTable)
2460 else if (Kind == Attribute::AllocKind)
2461 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2462 else if (Kind == Attribute::Memory) {
2463 uint64_t EncodedME =
Record[++i];
2464 const uint8_t
Version = (EncodedME >> 56);
2476 B.addMemoryAttr(ME);
2481 EncodedME & 0x00FFFFFFFFFFFFFFULL));
2483 }
else if (Kind == Attribute::Captures)
2485 else if (Kind == Attribute::NoFPClass)
2488 else if (Kind == Attribute::DenormalFPEnv) {
2489 B.addDenormalFPEnvAttr(
2492 }
else if (Record[i] == 3 || Record[i] == 4) {
2494 SmallString<64> KindStr;
2495 SmallString<64> ValStr;
2497 while (Record[i] != 0 && i != e)
2499 assert(Record[i] == 0 &&
"Kind string not null terminated");
2504 while (Record[i] != 0 && i != e)
2506 assert(Record[i] == 0 &&
"Value string not null terminated");
2509 B.addAttribute(KindStr.
str(), ValStr.
str());
2510 }
else if (Record[i] == 5 || Record[i] == 6) {
2511 bool HasType =
Record[i] == 6;
2512 Attribute::AttrKind
Kind;
2513 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2515 if (!Attribute::isTypeAttrKind(Kind))
2516 return error(
"Not a type attribute");
2518 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2519 }
else if (Record[i] == 7) {
2520 Attribute::AttrKind
Kind;
2523 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2525 if (!Attribute::isConstantRangeAttrKind(Kind))
2526 return error(
"Not a ConstantRange attribute");
2528 Expected<ConstantRange> MaybeCR =
2529 readBitWidthAndConstantRange(Record, i);
2534 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2535 }
else if (Record[i] == 8) {
2536 Attribute::AttrKind
Kind;
2539 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2541 if (!Attribute::isConstantRangeListAttrKind(Kind))
2542 return error(
"Not a constant range list attribute");
2546 return error(
"Too few records for constant range list");
2547 unsigned RangeSize =
Record[i++];
2549 for (
unsigned Idx = 0; Idx < RangeSize; ++Idx) {
2550 Expected<ConstantRange> MaybeCR =
2551 readConstantRange(Record, i,
BitWidth);
2559 return error(
"Invalid (unordered or overlapping) range list");
2560 B.addConstantRangeListAttr(Kind, Val);
2562 return error(
"Invalid attribute group entry");
2567 B.addMemoryAttr(ME);
2570 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2577Error BitcodeReader::parseTypeTable() {
2581 return parseTypeTableBody();
2584Error BitcodeReader::parseTypeTableBody() {
2585 if (!TypeList.empty())
2586 return error(
"Invalid multiple blocks");
2588 SmallVector<uint64_t, 64>
Record;
2589 unsigned NumRecords = 0;
2598 BitstreamEntry
Entry = MaybeEntry.
get();
2600 switch (
Entry.Kind) {
2603 return error(
"Malformed block");
2605 if (NumRecords != TypeList.size())
2606 return error(
"Malformed block");
2615 Type *ResultTy =
nullptr;
2616 SmallVector<unsigned> ContainedIDs;
2620 switch (MaybeRecord.
get()) {
2622 return error(
"Invalid value");
2627 return error(
"Invalid numentry record");
2628 TypeList.resize(Record[0]);
2631 ResultTy = Type::getVoidTy(
Context);
2634 ResultTy = Type::getHalfTy(
Context);
2637 ResultTy = Type::getBFloatTy(
Context);
2640 ResultTy = Type::getFloatTy(
Context);
2643 ResultTy = Type::getDoubleTy(
Context);
2646 ResultTy = Type::getX86_FP80Ty(
Context);
2649 ResultTy = Type::getFP128Ty(
Context);
2652 ResultTy = Type::getPPC_FP128Ty(
Context);
2655 ResultTy = Type::getLabelTy(
Context);
2658 ResultTy = Type::getMetadataTy(
Context);
2666 ResultTy = Type::getX86_AMXTy(
Context);
2669 ResultTy = Type::getTokenTy(
Context);
2673 return error(
"Invalid record");
2675 uint64_t NumBits =
Record[0];
2678 return error(
"Bitwidth for byte type out of range");
2684 return error(
"Invalid integer record");
2686 uint64_t NumBits =
Record[0];
2689 return error(
"Bitwidth for integer type out of range");
2696 return error(
"Invalid pointer record");
2700 ResultTy = getTypeByID(Record[0]);
2702 !PointerType::isValidElementType(ResultTy))
2703 return error(
"Invalid type");
2710 return error(
"Invalid opaque pointer record");
2719 return error(
"Invalid function record");
2721 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2722 if (
Type *
T = getTypeByID(Record[i]))
2728 ResultTy = getTypeByID(Record[2]);
2729 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2730 return error(
"Invalid type");
2733 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2739 return error(
"Invalid function record");
2741 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2742 if (
Type *
T = getTypeByID(Record[i])) {
2743 if (!FunctionType::isValidArgumentType(
T))
2744 return error(
"Invalid function argument type");
2751 ResultTy = getTypeByID(Record[1]);
2752 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2753 return error(
"Invalid type");
2756 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2761 return error(
"Invalid anon struct record");
2763 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2764 if (
Type *
T = getTypeByID(Record[i]))
2770 return error(
"Invalid type");
2777 return error(
"Invalid struct name record");
2782 return error(
"Invalid named struct record");
2784 if (NumRecords >= TypeList.size())
2785 return error(
"Invalid TYPE table");
2791 TypeList[NumRecords] =
nullptr;
2793 Res = createIdentifiedStructType(
Context, TypeName);
2797 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2798 if (
Type *
T = getTypeByID(Record[i]))
2804 return error(
"Invalid named struct record");
2813 return error(
"Invalid opaque type record");
2815 if (NumRecords >= TypeList.size())
2816 return error(
"Invalid TYPE table");
2822 TypeList[NumRecords] =
nullptr;
2824 Res = createIdentifiedStructType(
Context, TypeName);
2831 return error(
"Invalid target extension type record");
2833 if (NumRecords >= TypeList.size())
2834 return error(
"Invalid TYPE table");
2836 if (Record[0] >=
Record.size())
2837 return error(
"Too many type parameters");
2839 unsigned NumTys =
Record[0];
2841 SmallVector<unsigned, 8> IntParams;
2842 for (
unsigned i = 0; i < NumTys; i++) {
2843 if (
Type *
T = getTypeByID(Record[i + 1]))
2846 return error(
"Invalid type");
2849 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2850 if (Record[i] > UINT_MAX)
2851 return error(
"Integer parameter too large");
2856 if (
auto E = TTy.takeError())
2864 return error(
"Invalid array type record");
2865 ResultTy = getTypeByID(Record[1]);
2866 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2867 return error(
"Invalid type");
2869 ResultTy = ArrayType::get(ResultTy, Record[0]);
2874 return error(
"Invalid vector type record");
2876 return error(
"Invalid vector length");
2877 ResultTy = getTypeByID(Record[1]);
2878 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2879 return error(
"Invalid type");
2882 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2886 if (NumRecords >= TypeList.size())
2887 return error(
"Invalid TYPE table");
2888 if (TypeList[NumRecords])
2890 "Invalid TYPE table: Only named structs can be forward referenced");
2891 assert(ResultTy &&
"Didn't read a type?");
2892 TypeList[NumRecords] = ResultTy;
2893 if (!ContainedIDs.
empty())
2894 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2899Error BitcodeReader::parseOperandBundleTags() {
2903 if (!BundleTags.empty())
2904 return error(
"Invalid multiple blocks");
2906 SmallVector<uint64_t, 64>
Record;
2912 BitstreamEntry
Entry = MaybeEntry.
get();
2914 switch (
Entry.Kind) {
2917 return error(
"Malformed block");
2931 return error(
"Invalid operand bundle record");
2934 BundleTags.emplace_back();
2936 return error(
"Invalid operand bundle record");
2941Error BitcodeReader::parseSyncScopeNames() {
2946 return error(
"Invalid multiple synchronization scope names blocks");
2948 SmallVector<uint64_t, 64>
Record;
2953 BitstreamEntry
Entry = MaybeEntry.
get();
2955 switch (
Entry.Kind) {
2958 return error(
"Malformed block");
2961 return error(
"Invalid empty synchronization scope names block");
2975 return error(
"Invalid sync scope record");
2977 SmallString<16> SSN;
2979 return error(
"Invalid sync scope record");
2987Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
2988 unsigned NameIndex, Triple &TT) {
2991 return error(
"Invalid record");
2992 unsigned ValueID =
Record[0];
2993 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2994 return error(
"Invalid record");
2995 Value *
V = ValueList[ValueID];
2998 if (NameStr.contains(0))
2999 return error(
"Invalid value name");
3000 V->setName(NameStr);
3002 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
3015 return std::move(JumpFailed);
3021 return error(
"Expected value symbol table subblock");
3025void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
3027 ArrayRef<uint64_t> Record) {
3031 uint64_t FuncWordOffset =
Record[1] - 1;
3032 uint64_t FuncBitOffset = FuncWordOffset * 32;
3033 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
3037 if (FuncBitOffset > LastFunctionBlockBit)
3038 LastFunctionBlockBit = FuncBitOffset;
3042Error BitcodeReader::parseGlobalValueSymbolTable() {
3043 unsigned FuncBitcodeOffsetDelta =
3049 SmallVector<uint64_t, 64>
Record;
3054 BitstreamEntry
Entry = MaybeEntry.
get();
3056 switch (
Entry.Kind) {
3059 return error(
"Malformed block");
3070 switch (MaybeRecord.
get()) {
3072 unsigned ValueID =
Record[0];
3073 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3074 return error(
"Invalid value reference in symbol table");
3075 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3085Error BitcodeReader::parseValueSymbolTable(uint64_t
Offset) {
3086 uint64_t CurrentBit;
3092 if (!MaybeCurrentBit)
3094 CurrentBit = MaybeCurrentBit.
get();
3097 if (
Error Err = parseGlobalValueSymbolTable())
3118 unsigned FuncBitcodeOffsetDelta =
3124 SmallVector<uint64_t, 64>
Record;
3135 BitstreamEntry
Entry = MaybeEntry.
get();
3137 switch (
Entry.Kind) {
3140 return error(
"Malformed block");
3156 switch (MaybeRecord.
get()) {
3160 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3168 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3176 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3181 return error(
"Invalid bbentry record");
3184 return error(
"Invalid bbentry record");
3196uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {
3206Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3207 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3208 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3209 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3211 GlobalInitWorklist.swap(GlobalInits);
3212 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3213 FunctionOperandWorklist.swap(FunctionOperands);
3215 while (!GlobalInitWorklist.empty()) {
3216 unsigned ValID = GlobalInitWorklist.back().second;
3217 if (ValID >= ValueList.
size()) {
3219 GlobalInits.push_back(GlobalInitWorklist.back());
3221 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3224 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3226 GlobalInitWorklist.pop_back();
3229 while (!IndirectSymbolInitWorklist.empty()) {
3230 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3231 if (ValID >= ValueList.
size()) {
3232 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3234 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3238 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3241 return error(
"Alias and aliasee types don't match");
3246 return error(
"Expected an alias or an ifunc");
3249 IndirectSymbolInitWorklist.pop_back();
3252 while (!FunctionOperandWorklist.empty()) {
3253 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3254 if (
Info.PersonalityFn) {
3255 unsigned ValID =
Info.PersonalityFn - 1;
3256 if (ValID < ValueList.
size()) {
3257 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3260 Info.F->setPersonalityFn(MaybeC.
get());
3261 Info.PersonalityFn = 0;
3265 unsigned ValID =
Info.Prefix - 1;
3266 if (ValID < ValueList.
size()) {
3267 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3270 Info.F->setPrefixData(MaybeC.
get());
3274 if (
Info.Prologue) {
3275 unsigned ValID =
Info.Prologue - 1;
3276 if (ValID < ValueList.
size()) {
3277 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3280 Info.F->setPrologueData(MaybeC.
get());
3284 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3285 FunctionOperands.push_back(Info);
3286 FunctionOperandWorklist.pop_back();
3295 BitcodeReader::decodeSignRotatedValue);
3297 return APInt(TypeBits, Words);
3300Error BitcodeReader::parseConstants() {
3308 unsigned Int32TyID = getVirtualTypeID(CurTy);
3309 unsigned CurTyID = Int32TyID;
3310 Type *CurElemTy =
nullptr;
3311 unsigned NextCstNo = ValueList.
size();
3319 switch (Entry.Kind) {
3322 return error(
"Malformed block");
3324 if (NextCstNo != ValueList.
size())
3325 return error(
"Invalid constant reference");
3336 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
3339 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3349 return error(
"Invalid settype record");
3350 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3351 return error(
"Invalid settype record");
3352 if (TypeList[Record[0]] == VoidType)
3353 return error(
"Invalid constant type");
3355 CurTy = TypeList[CurTyID];
3356 CurElemTy = getPtrElementTypeByID(CurTyID);
3360 return error(
"Invalid type for a constant null value");
3363 return error(
"Invalid type for a constant null value");
3368 return error(
"Invalid integer const record");
3373 return error(
"Invalid wide integer const record");
3376 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3377 V = ConstantInt::get(CurTy, VInt);
3382 return error(
"Invalid byte const record");
3383 V = ConstantByte::get(CurTy, decodeSignRotatedValue(Record[0]));
3387 return error(
"Invalid wide byte const record");
3390 APInt VByte =
readWideAPInt(Record, ScalarTy->getBitWidth());
3391 V = ConstantByte::get(CurTy, VByte);
3396 return error(
"Invalid float const record");
3399 if (ScalarTy->isHalfTy())
3400 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3401 APInt(16, (uint16_t)Record[0])));
3402 else if (ScalarTy->isBFloatTy())
3403 V = ConstantFP::get(
3404 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3405 else if (ScalarTy->isFloatTy())
3406 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3407 APInt(32, (uint32_t)Record[0])));
3408 else if (ScalarTy->isDoubleTy())
3409 V = ConstantFP::get(
3410 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3411 else if (ScalarTy->isX86_FP80Ty()) {
3413 uint64_t Rearrange[2];
3414 Rearrange[0] = (
Record[1] & 0xffffLL) | (Record[0] << 16);
3415 Rearrange[1] =
Record[0] >> 48;
3416 V = ConstantFP::get(
3417 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3418 }
else if (ScalarTy->isFP128Ty())
3419 V = ConstantFP::get(CurTy,
3420 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3421 else if (ScalarTy->isPPC_FP128Ty())
3422 V = ConstantFP::get(
3423 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3431 return error(
"Invalid aggregate record");
3433 SmallVector<unsigned, 16> Elts;
3437 V = BitcodeConstant::create(
3438 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3440 V = BitcodeConstant::create(
Alloc, CurTy,
3441 BitcodeConstant::ConstantArrayOpcode, Elts);
3443 V = BitcodeConstant::create(
3444 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3453 return error(
"Invalid string record");
3463 return error(
"Invalid data record");
3467 return error(
"Invalid type for value");
3470 SmallString<128> RawData;
3472 for (uint64_t Val : Record) {
3473 const char *Src =
reinterpret_cast<const char *
>(&Val);
3475 Src +=
sizeof(uint64_t) - EltBytes;
3476 RawData.
append(Src, Src + EltBytes);
3481 : ConstantDataArray::getRaw(RawData.str(),
Record.
size(), EltTy);
3486 return error(
"Invalid unary op constexpr record");
3491 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3497 return error(
"Invalid binary op constexpr record");
3503 if (
Record.size() >= 4) {
3504 if (
Opc == Instruction::Add ||
3505 Opc == Instruction::Sub ||
3506 Opc == Instruction::Mul ||
3507 Opc == Instruction::Shl) {
3512 }
else if (
Opc == Instruction::SDiv ||
3513 Opc == Instruction::UDiv ||
3514 Opc == Instruction::LShr ||
3515 Opc == Instruction::AShr) {
3520 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3521 {(unsigned)Record[1], (
unsigned)
Record[2]});
3527 return error(
"Invalid cast constexpr record");
3532 unsigned OpTyID =
Record[1];
3533 Type *OpTy = getTypeByID(OpTyID);
3535 return error(
"Invalid cast constexpr record");
3536 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3548 return error(
"Constant GEP record must have at least two elements");
3550 Type *PointeeType =
nullptr;
3554 PointeeType = getTypeByID(Record[OpNum++]);
3557 std::optional<ConstantRange>
InRange;
3561 unsigned InRangeIndex =
Op >> 1;
3567 Expected<ConstantRange> MaybeInRange =
3568 readBitWidthAndConstantRange(Record, OpNum);
3577 SmallVector<unsigned, 16> Elts;
3578 unsigned BaseTypeID =
Record[OpNum];
3579 while (OpNum !=
Record.size()) {
3580 unsigned ElTyID =
Record[OpNum++];
3581 Type *ElTy = getTypeByID(ElTyID);
3583 return error(
"Invalid getelementptr constexpr record");
3587 if (Elts.
size() < 1)
3588 return error(
"Invalid gep with no operands");
3592 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3593 BaseType = getTypeByID(BaseTypeID);
3598 return error(
"GEP base operand must be pointer or vector of pointer");
3601 PointeeType = getPtrElementTypeByID(BaseTypeID);
3603 return error(
"Missing element type for old-style constant GEP");
3606 V = BitcodeConstant::create(
3608 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3614 return error(
"Invalid select constexpr record");
3616 V = BitcodeConstant::create(
3617 Alloc, CurTy, Instruction::Select,
3618 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3624 return error(
"Invalid extractelement constexpr record");
3625 unsigned OpTyID =
Record[0];
3629 return error(
"Invalid extractelement constexpr record");
3631 if (
Record.size() == 4) {
3632 unsigned IdxTyID =
Record[2];
3633 Type *IdxTy = getTypeByID(IdxTyID);
3635 return error(
"Invalid extractelement constexpr record");
3641 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3642 {(unsigned)Record[1], IdxRecord});
3648 if (
Record.size() < 3 || !OpTy)
3649 return error(
"Invalid insertelement constexpr record");
3651 if (
Record.size() == 4) {
3652 unsigned IdxTyID =
Record[2];
3653 Type *IdxTy = getTypeByID(IdxTyID);
3655 return error(
"Invalid insertelement constexpr record");
3661 V = BitcodeConstant::create(
3662 Alloc, CurTy, Instruction::InsertElement,
3663 {(unsigned)Record[0], (
unsigned)
Record[1], IdxRecord});
3668 if (
Record.size() < 3 || !OpTy)
3669 return error(
"Invalid shufflevector constexpr record");
3670 V = BitcodeConstant::create(
3671 Alloc, CurTy, Instruction::ShuffleVector,
3672 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3679 if (
Record.size() < 4 || !RTy || !OpTy)
3680 return error(
"Invalid shufflevector constexpr record");
3681 V = BitcodeConstant::create(
3682 Alloc, CurTy, Instruction::ShuffleVector,
3683 {(unsigned)Record[1], (
unsigned)
Record[2], (unsigned)Record[3]});
3688 return error(
"Invalid cmp constexpt record");
3689 unsigned OpTyID =
Record[0];
3690 Type *OpTy = getTypeByID(OpTyID);
3692 return error(
"Invalid cmp constexpr record");
3693 V = BitcodeConstant::create(
3696 : Instruction::ICmp),
3697 (uint8_t)Record[3]},
3698 {(unsigned)Record[1], (
unsigned)
Record[2]});
3705 return error(
"Invalid inlineasm record");
3706 std::string AsmStr, ConstrStr;
3707 bool HasSideEffects =
Record[0] & 1;
3708 bool IsAlignStack =
Record[0] >> 1;
3709 unsigned AsmStrSize =
Record[1];
3710 if (2+AsmStrSize >=
Record.size())
3711 return error(
"Invalid inlineasm record");
3712 unsigned ConstStrSize =
Record[2+AsmStrSize];
3713 if (3+AsmStrSize+ConstStrSize >
Record.size())
3714 return error(
"Invalid inlineasm record");
3716 for (
unsigned i = 0; i != AsmStrSize; ++i)
3717 AsmStr += (
char)
Record[2+i];
3718 for (
unsigned i = 0; i != ConstStrSize; ++i)
3719 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3722 return error(
"Missing element type for old-style inlineasm");
3724 HasSideEffects, IsAlignStack);
3731 return error(
"Invalid inlineasm record");
3732 std::string AsmStr, ConstrStr;
3733 bool HasSideEffects =
Record[0] & 1;
3734 bool IsAlignStack = (
Record[0] >> 1) & 1;
3735 unsigned AsmDialect =
Record[0] >> 2;
3736 unsigned AsmStrSize =
Record[1];
3737 if (2+AsmStrSize >=
Record.size())
3738 return error(
"Invalid inlineasm record");
3739 unsigned ConstStrSize =
Record[2+AsmStrSize];
3740 if (3+AsmStrSize+ConstStrSize >
Record.size())
3741 return error(
"Invalid inlineasm record");
3743 for (
unsigned i = 0; i != AsmStrSize; ++i)
3744 AsmStr += (
char)
Record[2+i];
3745 for (
unsigned i = 0; i != ConstStrSize; ++i)
3746 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3749 return error(
"Missing element type for old-style inlineasm");
3751 HasSideEffects, IsAlignStack,
3758 return error(
"Invalid inlineasm record");
3760 std::string AsmStr, ConstrStr;
3761 bool HasSideEffects =
Record[OpNum] & 1;
3762 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3763 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3764 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3766 unsigned AsmStrSize =
Record[OpNum];
3768 if (OpNum + AsmStrSize >=
Record.size())
3769 return error(
"Invalid inlineasm record");
3770 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3771 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3772 return error(
"Invalid inlineasm record");
3774 for (
unsigned i = 0; i != AsmStrSize; ++i)
3775 AsmStr += (
char)
Record[OpNum + i];
3777 for (
unsigned i = 0; i != ConstStrSize; ++i)
3778 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3781 return error(
"Missing element type for old-style inlineasm");
3783 HasSideEffects, IsAlignStack,
3790 return error(
"Invalid inlineasm record");
3795 return error(
"Invalid inlineasm record");
3796 std::string AsmStr, ConstrStr;
3797 bool HasSideEffects =
Record[OpNum] & 1;
3798 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3799 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3800 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3802 unsigned AsmStrSize =
Record[OpNum];
3804 if (OpNum + AsmStrSize >=
Record.size())
3805 return error(
"Invalid inlineasm record");
3806 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3807 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3808 return error(
"Invalid inlineasm record");
3810 for (
unsigned i = 0; i != AsmStrSize; ++i)
3811 AsmStr += (
char)
Record[OpNum + i];
3813 for (
unsigned i = 0; i != ConstStrSize; ++i)
3814 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3816 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3822 return error(
"Invalid blockaddress record");
3823 unsigned FnTyID =
Record[0];
3824 Type *FnTy = getTypeByID(FnTyID);
3826 return error(
"Invalid blockaddress record");
3827 V = BitcodeConstant::create(
3829 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3835 return error(
"Invalid dso_local record");
3836 unsigned GVTyID =
Record[0];
3837 Type *GVTy = getTypeByID(GVTyID);
3839 return error(
"Invalid dso_local record");
3840 V = BitcodeConstant::create(
3841 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3846 return error(
"Invalid no_cfi record");
3847 unsigned GVTyID =
Record[0];
3848 Type *GVTy = getTypeByID(GVTyID);
3850 return error(
"Invalid no_cfi record");
3851 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3857 return error(
"Invalid ptrauth record");
3859 V = BitcodeConstant::create(
Alloc, CurTy,
3860 BitcodeConstant::ConstantPtrAuthOpcode,
3861 {(unsigned)Record[0], (
unsigned)
Record[1],
3862 (unsigned)Record[2], (
unsigned)
Record[3]});
3867 return error(
"Invalid ptrauth record");
3869 V = BitcodeConstant::create(
3870 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3871 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2],
3872 (
unsigned)
Record[3], (unsigned)Record[4]});
3877 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3884Error BitcodeReader::parseUseLists() {
3889 SmallVector<uint64_t, 64>
Record;
3895 BitstreamEntry
Entry = MaybeEntry.
get();
3897 switch (
Entry.Kind) {
3900 return error(
"Malformed block");
3914 switch (MaybeRecord.
get()) {
3922 if (RecordLength < 3)
3924 return error(
"Invalid uselist record");
3925 unsigned ID =
Record.pop_back_val();
3929 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3930 V = FunctionBBs[
ID];
3934 if (!
V->hasUseList())
3937 unsigned NumUses = 0;
3938 SmallDenseMap<const Use *, unsigned, 16> Order;
3939 for (
const Use &U :
V->materialized_uses()) {
3940 if (++NumUses >
Record.size())
3942 Order[&
U] =
Record[NumUses - 1];
3949 V->sortUseList([&](
const Use &L,
const Use &R) {
3960Error BitcodeReader::rememberAndSkipMetadata() {
3963 DeferredMetadataInfo.push_back(CurBit);
3971Error BitcodeReader::materializeMetadata() {
3972 for (uint64_t BitPos : DeferredMetadataInfo) {
3976 if (
Error Err = MDLoader->parseModuleMetadata())
3985 NamedMDNode *LinkerOpts =
3987 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
3992 DeferredMetadataInfo.clear();
3996void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
4000Error BitcodeReader::rememberAndSkipFunctionBody() {
4002 if (FunctionsWithBodies.empty())
4003 return error(
"Insufficient function protos");
4005 Function *Fn = FunctionsWithBodies.back();
4006 FunctionsWithBodies.pop_back();
4011 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
4012 "Mismatch between VST and scanned function offsets");
4013 DeferredFunctionInfo[Fn] = CurBit;
4021Error BitcodeReader::globalCleanup() {
4023 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4025 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
4026 return error(
"Malformed global initializer set");
4030 for (Function &
F : *TheModule) {
4031 MDLoader->upgradeDebugIntrinsics(
F);
4034 UpgradedIntrinsics[&
F] = NewFn;
4040 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4041 for (GlobalVariable &GV : TheModule->globals())
4043 UpgradedVariables.emplace_back(&GV, Upgraded);
4044 for (
auto &Pair : UpgradedVariables) {
4045 Pair.first->eraseFromParent();
4046 TheModule->insertGlobalVariable(Pair.second);
4049 for (
size_t ValueID = 0; ValueID < GUIDList.size(); ValueID++) {
4050 const auto GUID = GUIDList[ValueID];
4054 const auto *
Value = ValueList[ValueID];
4055 TheModule->insertGUID(
Value, GUID);
4060 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4061 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4069Error BitcodeReader::rememberAndSkipFunctionBodies() {
4074 return error(
"Could not find function in stream");
4076 if (!SeenFirstFunctionBody)
4077 return error(
"Trying to materialize functions before seeing function blocks");
4081 assert(SeenValueSymbolTable);
4084 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4087 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4089 switch (
Entry.Kind) {
4091 return error(
"Expect SubBlock");
4095 return error(
"Expect function block");
4097 if (
Error Err = rememberAndSkipFunctionBody())
4106Error BitcodeReaderBase::readBlockInfo() {
4107 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4109 if (!MaybeNewBlockInfo)
4111 std::optional<BitstreamBlockInfo> NewBlockInfo =
4112 std::move(MaybeNewBlockInfo.
get());
4114 return error(
"Malformed block");
4115 BlockInfo = std::move(*NewBlockInfo);
4119Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4123 std::tie(Name, Record) = readNameFromStrtab(Record);
4126 return error(
"Invalid comdat record");
4128 std::string OldFormatName;
4131 return error(
"Invalid comdat record");
4132 unsigned ComdatNameSize =
Record[1];
4133 if (ComdatNameSize >
Record.size() - 2)
4134 return error(
"Comdat name size too large");
4135 OldFormatName.reserve(ComdatNameSize);
4136 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4137 OldFormatName += (
char)
Record[2 + i];
4138 Name = OldFormatName;
4140 Comdat *
C = TheModule->getOrInsertComdat(Name);
4141 C->setSelectionKind(SK);
4142 ComdatList.push_back(
C);
4156 Meta.NoAddress =
true;
4158 Meta.NoHWAddress =
true;
4162 Meta.IsDynInit =
true;
4166Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4174 std::tie(Name, Record) = readNameFromStrtab(Record);
4177 return error(
"Invalid global variable record");
4178 unsigned TyID =
Record[0];
4179 Type *Ty = getTypeByID(TyID);
4181 return error(
"Invalid global variable record");
4183 bool explicitType =
Record[1] & 2;
4189 return error(
"Invalid type for value");
4191 TyID = getContainedTypeID(TyID);
4192 Ty = getTypeByID(TyID);
4194 return error(
"Missing element type for old-style global");
4197 uint64_t RawLinkage =
Record[3];
4199 MaybeAlign Alignment;
4200 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4204 if (Record[5] - 1 >= SectionTable.size())
4205 return error(
"Invalid ID");
4214 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4222 bool ExternallyInitialized =
false;
4224 ExternallyInitialized =
Record[9];
4226 GlobalVariable *NewGV =
4236 if (
Record.size() > 10) {
4248 if (
unsigned InitID = Record[2])
4249 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4251 if (
Record.size() > 11) {
4252 if (
unsigned ComdatID = Record[11]) {
4253 if (ComdatID > ComdatList.size())
4254 return error(
"Invalid global variable comdat ID");
4255 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4258 ImplicitComdatObjects.
insert(NewGV);
4261 if (
Record.size() > 12) {
4266 if (
Record.size() > 13) {
4275 if (
Record.size() > 16 && Record[16]) {
4276 llvm::GlobalValue::SanitizerMetadata
Meta =
4281 if (
Record.size() > 17 && Record[17]) {
4285 return error(
"Invalid global variable code model");
4291void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4292 if (ValueTypeCallback) {
4293 (*ValueTypeCallback)(
4294 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4295 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4299Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4305 std::tie(Name, Record) = readNameFromStrtab(Record);
4308 return error(
"Invalid function record");
4309 unsigned FTyID =
Record[0];
4310 Type *FTy = getTypeByID(FTyID);
4312 return error(
"Invalid function record");
4314 FTyID = getContainedTypeID(FTyID, 0);
4315 FTy = getTypeByID(FTyID);
4317 return error(
"Missing element type for old-style function");
4321 return error(
"Invalid type for value");
4322 auto CC =
static_cast<CallingConv::ID
>(
Record[1]);
4323 if (CC & ~CallingConv::MaxID)
4324 return error(
"Invalid calling convention ID");
4326 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4332 AddrSpace, Name, TheModule);
4335 "Incorrect fully specified type provided for function");
4336 FunctionTypeIDs[
Func] = FTyID;
4338 Func->setCallingConv(CC);
4339 bool isProto =
Record[2];
4340 uint64_t RawLinkage =
Record[3];
4343 callValueTypeCallback(Func, FTyID);
4348 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4349 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4350 Attribute::InAlloca}) {
4351 if (!
Func->hasParamAttribute(i, Kind))
4354 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4357 Func->removeParamAttr(i, Kind);
4359 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4360 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4362 return error(
"Missing param element type for attribute upgrade");
4366 case Attribute::ByVal:
4367 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4369 case Attribute::StructRet:
4370 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4372 case Attribute::InAlloca:
4373 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4379 Func->addParamAttr(i, NewAttr);
4383 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4384 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4385 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4386 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4388 return error(
"Missing param element type for x86_intrcc upgrade");
4390 Func->addParamAttr(0, NewAttr);
4393 MaybeAlign Alignment;
4394 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4397 Func->setAlignment(*Alignment);
4399 if (Record[6] - 1 >= SectionTable.size())
4400 return error(
"Invalid ID");
4401 Func->setSection(SectionTable[Record[6] - 1]);
4405 if (!
Func->hasLocalLinkage())
4407 if (
Record.size() > 8 && Record[8]) {
4408 if (Record[8] - 1 >= GCTable.size())
4409 return error(
"Invalid ID");
4410 Func->setGC(GCTable[Record[8] - 1]);
4415 Func->setUnnamedAddr(UnnamedAddr);
4417 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4419 OperandInfo.Prologue =
Record[10];
4421 if (
Record.size() > 11) {
4423 if (!
Func->hasLocalLinkage()) {
4430 if (
Record.size() > 12) {
4431 if (
unsigned ComdatID = Record[12]) {
4432 if (ComdatID > ComdatList.size())
4433 return error(
"Invalid function comdat ID");
4434 Func->setComdat(ComdatList[ComdatID - 1]);
4437 ImplicitComdatObjects.
insert(Func);
4441 OperandInfo.Prefix =
Record[13];
4444 OperandInfo.PersonalityFn =
Record[14];
4446 if (
Record.size() > 15) {
4456 Record[17] + Record[18] <= Strtab.
size()) {
4457 Func->setPartition(StringRef(Strtab.
data() + Record[17], Record[18]));
4460 if (
Record.size() > 19) {
4461 MaybeAlign PrefAlignment;
4462 if (
Error Err = parseAlignmentValue(Record[19], PrefAlignment))
4464 Func->setPreferredAlignment(PrefAlignment);
4467 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4469 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4470 FunctionOperands.push_back(OperandInfo);
4475 Func->setIsMaterializable(
true);
4476 FunctionsWithBodies.push_back(Func);
4477 DeferredFunctionInfo[
Func] = 0;
4482Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4483 unsigned BitCode, ArrayRef<uint64_t> Record) {
4493 std::tie(Name, Record) = readNameFromStrtab(Record);
4496 if (
Record.size() < (3 + (
unsigned)NewRecord))
4497 return error(
"Invalid global indirect symbol record");
4502 return error(
"Invalid global indirect symbol record");
4508 return error(
"Invalid type for value");
4509 AddrSpace = PTy->getAddressSpace();
4511 Ty = getTypeByID(
TypeID);
4513 return error(
"Missing element type for old-style indirect symbol");
4515 AddrSpace =
Record[OpNum++];
4518 auto Val =
Record[OpNum++];
4527 nullptr, TheModule);
4531 if (OpNum !=
Record.size()) {
4532 auto VisInd = OpNum++;
4538 if (OpNum !=
Record.size()) {
4539 auto S =
Record[OpNum++];
4546 if (OpNum !=
Record.size())
4548 if (OpNum !=
Record.size())
4551 if (OpNum !=
Record.size())
4556 if (OpNum + 1 <
Record.size()) {
4558 if (Record[OpNum] + Record[OpNum + 1] > Strtab.
size())
4559 return error(
"Malformed partition, too large.");
4561 StringRef(Strtab.
data() + Record[OpNum], Record[OpNum + 1]));
4565 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4569Error BitcodeReader::parseModule(uint64_t ResumeBit,
4570 bool ShouldLazyLoadMetadata,
4571 ParserCallbacks Callbacks) {
4572 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4579 SmallVector<uint64_t, 64>
Record;
4583 bool ResolvedDataLayout =
false;
4588 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4590 auto ResolveDataLayout = [&]() ->
Error {
4591 if (ResolvedDataLayout)
4595 ResolvedDataLayout =
true;
4599 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4603 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4604 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4605 TentativeDataLayoutStr = *LayoutOverride;
4613 TheModule->setDataLayout(MaybeDL.
get());
4619 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4622 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4624 switch (
Entry.Kind) {
4626 return error(
"Malformed block");
4628 if (
Error Err = ResolveDataLayout())
4630 return globalCleanup();
4639 if (
Error Err = readBlockInfo())
4643 if (
Error Err = parseAttributeBlock())
4647 if (
Error Err = parseAttributeGroupBlock())
4651 if (
Error Err = parseTypeTable())
4655 if (!SeenValueSymbolTable) {
4661 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4662 if (
Error Err = parseValueSymbolTable())
4664 SeenValueSymbolTable =
true;
4674 if (
Error Err = parseConstants())
4676 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4680 if (ShouldLazyLoadMetadata) {
4681 if (
Error Err = rememberAndSkipMetadata())
4685 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4686 if (
Error Err = MDLoader->parseModuleMetadata())
4690 if (
Error Err = MDLoader->parseMetadataKinds())
4694 if (
Error Err = ResolveDataLayout())
4699 if (!SeenFirstFunctionBody) {
4700 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4701 if (
Error Err = globalCleanup())
4703 SeenFirstFunctionBody =
true;
4706 if (VSTOffset > 0) {
4710 if (!SeenValueSymbolTable) {
4711 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4713 SeenValueSymbolTable =
true;
4735 if (
Error Err = rememberAndSkipFunctionBody())
4742 if (SeenValueSymbolTable) {
4746 return globalCleanup();
4750 if (
Error Err = parseUseLists())
4754 if (
Error Err = parseOperandBundleTags())
4758 if (
Error Err = parseSyncScopeNames())
4770 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
4773 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4776 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4779 UseRelativeIDs = *VersionOrErr >= 1;
4783 if (ResolvedDataLayout)
4784 return error(
"target triple too late in module");
4787 return error(
"Invalid triple record");
4788 TheModule->setTargetTriple(Triple(std::move(S)));
4792 if (ResolvedDataLayout)
4793 return error(
"datalayout too late in module");
4795 return error(
"Invalid data layout record");
4801 return error(
"Invalid asm record");
4802 TheModule->setModuleInlineAsm(S);
4809 return error(
"Invalid deplib record");
4816 return error(
"Invalid section name record");
4817 SectionTable.push_back(S);
4823 return error(
"Invalid gcname record");
4824 GCTable.push_back(S);
4828 if (
Error Err = parseComdatRecord(Record))
4837 if (
Error Err = parseGlobalVarRecord(Record))
4841 if (
Error Err = ResolveDataLayout())
4843 if (
Error Err = parseFunctionRecord(Record))
4849 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4855 return error(
"Invalid vstoffset record");
4859 VSTOffset =
Record[0] - 1;
4864 GUIDList.reserve(GUIDList.size() +
Record.size() / 2);
4865 for (
size_t i = 0; i <
Record.size(); i += 2)
4866 GUIDList.push_back(Record[i] << 32 | Record[i + 1]);
4872 return error(
"Invalid source filename record");
4873 TheModule->setSourceFileName(
ValueName);
4879 this->ValueTypeCallback = std::nullopt;
4883Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4885 ParserCallbacks Callbacks) {
4887 MetadataLoaderCallbacks MDCallbacks;
4888 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4890 return getContainedTypeID(
I, J);
4893 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4894 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4897Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4899 return error(
"Load/Store operand is not a pointer type");
4900 if (!PointerType::isLoadableOrStorableType(ValType))
4901 return error(
"Cannot load/store from pointer");
4905Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4906 ArrayRef<unsigned> ArgTyIDs) {
4908 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4909 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4910 Attribute::InAlloca}) {
4911 if (!
Attrs.hasParamAttr(i, Kind) ||
4912 Attrs.getParamAttr(i, Kind).getValueAsType())
4915 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4917 return error(
"Missing element type for typed attribute upgrade");
4921 case Attribute::ByVal:
4922 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4924 case Attribute::StructRet:
4925 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4927 case Attribute::InAlloca:
4928 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4941 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
4945 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
4946 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4948 return error(
"Missing element type for inline asm upgrade");
4951 Attribute::get(
Context, Attribute::ElementType, ElemTy));
4959 case Intrinsic::preserve_array_access_index:
4960 case Intrinsic::preserve_struct_access_index:
4961 case Intrinsic::aarch64_ldaxr:
4962 case Intrinsic::aarch64_ldxr:
4963 case Intrinsic::aarch64_stlxr:
4964 case Intrinsic::aarch64_stxr:
4965 case Intrinsic::arm_ldaex:
4966 case Intrinsic::arm_ldrex:
4967 case Intrinsic::arm_stlex:
4968 case Intrinsic::arm_strex: {
4971 case Intrinsic::aarch64_stlxr:
4972 case Intrinsic::aarch64_stxr:
4973 case Intrinsic::arm_stlex:
4974 case Intrinsic::arm_strex:
4981 if (!
Attrs.getParamElementType(ArgNo)) {
4982 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4984 return error(
"Missing element type for elementtype upgrade");
4999Error BitcodeReader::parseFunctionBody(Function *
F) {
5004 if (MDLoader->hasFwdRefs())
5005 return error(
"Invalid function metadata: incoming forward references");
5007 InstructionList.
clear();
5008 unsigned ModuleValueListSize = ValueList.
size();
5009 unsigned ModuleMDLoaderSize = MDLoader->size();
5013 unsigned FTyID = FunctionTypeIDs[
F];
5014 for (Argument &
I :
F->args()) {
5015 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
5016 assert(
I.getType() == getTypeByID(ArgTyID) &&
5017 "Incorrect fully specified type for Function Argument");
5021 unsigned NextValueNo = ValueList.
size();
5023 unsigned CurBBNo = 0;
5028 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
5032 auto getLastInstruction = [&]() -> Instruction * {
5033 if (CurBB && !CurBB->
empty())
5034 return &CurBB->
back();
5035 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
5036 !FunctionBBs[CurBBNo - 1]->
empty())
5037 return &FunctionBBs[CurBBNo - 1]->back();
5041 std::vector<OperandBundleDef> OperandBundles;
5044 SmallVector<uint64_t, 64>
Record;
5047 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
5050 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
5052 switch (
Entry.Kind) {
5054 return error(
"Malformed block");
5056 goto OutOfRecordLoop;
5065 if (
Error Err = parseConstants())
5067 NextValueNo = ValueList.
size();
5070 if (
Error Err = parseValueSymbolTable())
5074 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5078 assert(DeferredMetadataInfo.empty() &&
5079 "Must read all module-level metadata before function-level");
5080 if (
Error Err = MDLoader->parseFunctionMetadata())
5084 if (
Error Err = parseUseLists())
5098 unsigned ResTypeID = InvalidTypeID;
5099 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
5102 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5104 return error(
"Invalid value");
5106 if (
Record.empty() || Record[0] == 0)
5107 return error(
"Invalid declareblocks record");
5109 FunctionBBs.resize(Record[0]);
5112 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5113 if (BBFRI == BasicBlockFwdRefs.
end()) {
5114 for (BasicBlock *&BB : FunctionBBs)
5117 auto &BBRefs = BBFRI->second;
5119 if (BBRefs.size() > FunctionBBs.size())
5120 return error(
"Invalid ID");
5121 assert(!BBRefs.empty() &&
"Unexpected empty array");
5122 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5123 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5125 if (
I < RE && BBRefs[
I]) {
5126 BBRefs[
I]->insertInto(
F);
5127 FunctionBBs[
I] = BBRefs[
I];
5133 BasicBlockFwdRefs.
erase(BBFRI);
5136 CurBB = FunctionBBs[0];
5143 return error(
"Invalid blockaddr users record");
5157 for (uint64_t ValID : Record)
5159 BackwardRefFunctions.push_back(
F);
5161 return error(
"Invalid blockaddr users record");
5168 I = getLastInstruction();
5171 return error(
"Invalid debug_loc_again record");
5172 I->setDebugLoc(LastLoc);
5177 I = getLastInstruction();
5179 return error(
"Invalid debug loc record");
5184 uint64_t AtomGroup =
Record.size() == 7 ?
Record[5] : 0;
5187 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5190 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5192 return error(
"Invalid debug loc record");
5196 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5198 return error(
"Invalid debug loc record");
5201 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5202 isImplicitCode, AtomGroup, AtomRank);
5203 I->setDebugLoc(LastLoc);
5211 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5213 return error(
"Invalid unary operator record");
5217 return error(
"Invalid unary operator record");
5221 if (OpNum <
Record.size()) {
5225 I->setFastMathFlags(FMF);
5234 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5238 return error(
"Invalid binary operator record");
5242 return error(
"Invalid binary operator record");
5246 if (OpNum <
Record.size()) {
5247 if (
Opc == Instruction::Add ||
5248 Opc == Instruction::Sub ||
5249 Opc == Instruction::Mul ||
5250 Opc == Instruction::Shl) {
5255 }
else if (
Opc == Instruction::SDiv ||
5256 Opc == Instruction::UDiv ||
5257 Opc == Instruction::LShr ||
5258 Opc == Instruction::AShr) {
5261 }
else if (
Opc == Instruction::Or) {
5267 I->setFastMathFlags(FMF);
5276 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5277 OpNum + 1 >
Record.size())
5278 return error(
"Invalid cast record");
5280 ResTypeID =
Record[OpNum++];
5281 Type *ResTy = getTypeByID(ResTypeID);
5284 if (
Opc == -1 || !ResTy)
5285 return error(
"Invalid cast record");
5290 assert(CurBB &&
"No current BB?");
5296 return error(
"Invalid cast");
5300 if (OpNum <
Record.size()) {
5301 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5304 }
else if (
Opc == Instruction::Trunc) {
5313 I->setFastMathFlags(FMF);
5332 Ty = getTypeByID(TyID);
5336 TyID = InvalidTypeID;
5341 unsigned BasePtrTypeID;
5342 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5344 return error(
"Invalid gep record");
5347 TyID = getContainedTypeID(BasePtrTypeID);
5348 if (
BasePtr->getType()->isVectorTy())
5349 TyID = getContainedTypeID(TyID);
5350 Ty = getTypeByID(TyID);
5353 SmallVector<Value*, 16> GEPIdx;
5354 while (OpNum !=
Record.size()) {
5357 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5358 return error(
"Invalid gep record");
5369 unsigned SubType = 0;
5370 if (GTI.isStruct()) {
5372 Idx->getType()->isVectorTy()
5374 :
cast<ConstantInt>(Idx);
5377 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5384 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5385 if (
I->getType()->isVectorTy())
5386 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5389 GEP->setNoWrapFlags(NW);
5398 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5399 return error(
"Invalid extractvalue record");
5402 unsigned RecSize =
Record.size();
5403 if (OpNum == RecSize)
5404 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5406 SmallVector<unsigned, 4> EXTRACTVALIdx;
5407 ResTypeID = AggTypeID;
5408 for (; OpNum != RecSize; ++OpNum) {
5413 if (!IsStruct && !IsArray)
5414 return error(
"EXTRACTVAL: Invalid type");
5415 if ((
unsigned)Index != Index)
5416 return error(
"Invalid value");
5418 return error(
"EXTRACTVAL: Invalid struct index");
5420 return error(
"EXTRACTVAL: Invalid array index");
5421 EXTRACTVALIdx.
push_back((
unsigned)Index);
5425 ResTypeID = getContainedTypeID(ResTypeID, Index);
5428 ResTypeID = getContainedTypeID(ResTypeID);
5442 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5443 return error(
"Invalid insertvalue record");
5446 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5447 return error(
"Invalid insertvalue record");
5449 unsigned RecSize =
Record.size();
5450 if (OpNum == RecSize)
5451 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5453 SmallVector<unsigned, 4> INSERTVALIdx;
5455 for (; OpNum != RecSize; ++OpNum) {
5460 if (!IsStruct && !IsArray)
5461 return error(
"INSERTVAL: Invalid type");
5462 if ((
unsigned)Index != Index)
5463 return error(
"Invalid value");
5465 return error(
"INSERTVAL: Invalid struct index");
5467 return error(
"INSERTVAL: Invalid array index");
5469 INSERTVALIdx.
push_back((
unsigned)Index);
5477 return error(
"Inserted value type doesn't match aggregate type");
5480 ResTypeID = AggTypeID;
5492 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5494 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5496 popValue(Record, OpNum, NextValueNo, CondType,
5497 getVirtualTypeID(CondType),
Cond, CurBB))
5498 return error(
"Invalid select record");
5511 unsigned ValTypeID, CondTypeID;
5512 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5514 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5516 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5517 return error(
"Invalid vector select record");
5520 if (VectorType* vector_type =
5523 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5524 return error(
"Invalid type for value");
5528 return error(
"Invalid type for value");
5532 ResTypeID = ValTypeID;
5537 I->setFastMathFlags(FMF);
5545 unsigned VecTypeID, IdxTypeID;
5546 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5547 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5548 return error(
"Invalid extractelement record");
5550 return error(
"Invalid type for value");
5552 ResTypeID = getContainedTypeID(VecTypeID);
5559 Value *Vec, *Elt, *Idx;
5560 unsigned VecTypeID, IdxTypeID;
5561 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5562 return error(
"Invalid insertelement record");
5564 return error(
"Invalid type for value");
5565 if (popValue(Record, OpNum, NextValueNo,
5567 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5568 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5569 return error(
"Invalid insert element record");
5571 ResTypeID = VecTypeID;
5579 unsigned Vec1TypeID;
5580 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5582 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5584 return error(
"Invalid shufflevector record");
5586 unsigned MaskTypeID;
5587 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5588 return error(
"Invalid shufflevector record");
5590 return error(
"Invalid type for value");
5592 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5594 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5609 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5610 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5612 return error(
"Invalid comparison record");
5614 if (OpNum >=
Record.size())
5616 "Invalid record: operand number exceeded available operands");
5621 if (IsFP &&
Record.size() > OpNum+1)
5626 return error(
"Invalid fcmp predicate");
5627 I =
new FCmpInst(PredVal,
LHS,
RHS);
5630 return error(
"Invalid icmp predicate");
5631 I =
new ICmpInst(PredVal,
LHS,
RHS);
5632 if (
Record.size() > OpNum + 1 &&
5637 if (OpNum + 1 !=
Record.size())
5638 return error(
"Invalid comparison record");
5640 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5642 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5645 I->setFastMathFlags(FMF);
5662 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5663 return error(
"Invalid ret record");
5664 if (OpNum !=
Record.size())
5665 return error(
"Invalid ret record");
5673 return error(
"Invalid br record");
5674 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5676 return error(
"Invalid br record");
5678 if (
Record.size() == 1) {
5683 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5686 getVirtualTypeID(CondType), CurBB);
5687 if (!FalseDest || !
Cond)
5688 return error(
"Invalid br record");
5696 return error(
"Invalid cleanupret record");
5699 Value *CleanupPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5700 getVirtualTypeID(TokenTy), CurBB);
5702 return error(
"Invalid cleanupret record");
5704 if (
Record.size() == 2) {
5705 UnwindDest = getBasicBlock(Record[Idx++]);
5707 return error(
"Invalid cleanupret record");
5716 return error(
"Invalid catchret record");
5719 Value *CatchPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5720 getVirtualTypeID(TokenTy), CurBB);
5722 return error(
"Invalid catchret record");
5723 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5725 return error(
"Invalid catchret record");
5734 return error(
"Invalid catchswitch record");
5739 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5740 getVirtualTypeID(TokenTy), CurBB);
5742 return error(
"Invalid catchswitch record");
5744 unsigned NumHandlers =
Record[Idx++];
5747 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5748 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5750 return error(
"Invalid catchswitch record");
5755 if (Idx + 1 ==
Record.size()) {
5756 UnwindDest = getBasicBlock(Record[Idx++]);
5758 return error(
"Invalid catchswitch record");
5761 if (
Record.size() != Idx)
5762 return error(
"Invalid catchswitch record");
5766 for (BasicBlock *Handler : Handlers)
5767 CatchSwitch->addHandler(Handler);
5769 ResTypeID = getVirtualTypeID(
I->getType());
5777 return error(
"Invalid catchpad/cleanuppad record");
5782 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5783 getVirtualTypeID(TokenTy), CurBB);
5785 return error(
"Invalid catchpad/cleanuppad record");
5787 unsigned NumArgOperands =
Record[Idx++];
5789 SmallVector<Value *, 2>
Args;
5790 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5793 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5794 return error(
"Invalid catchpad/cleanuppad record");
5795 Args.push_back(Val);
5798 if (
Record.size() != Idx)
5799 return error(
"Invalid catchpad/cleanuppad record");
5805 ResTypeID = getVirtualTypeID(
I->getType());
5811 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5817 unsigned OpTyID =
Record[1];
5818 Type *OpTy = getTypeByID(OpTyID);
5824 return error(
"Invalid switch record");
5826 unsigned NumCases =
Record[4];
5831 unsigned CurIdx = 5;
5832 for (
unsigned i = 0; i != NumCases; ++i) {
5834 unsigned NumItems =
Record[CurIdx++];
5835 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5836 bool isSingleNumber =
Record[CurIdx++];
5839 unsigned ActiveWords = 1;
5840 if (ValueBitWidth > 64)
5841 ActiveWords =
Record[CurIdx++];
5844 CurIdx += ActiveWords;
5846 if (!isSingleNumber) {
5848 if (ValueBitWidth > 64)
5849 ActiveWords =
Record[CurIdx++];
5852 CurIdx += ActiveWords;
5863 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5864 for (ConstantInt *Cst : CaseVals)
5865 SI->addCase(Cst, DestBB);
5874 return error(
"Invalid switch record");
5875 unsigned OpTyID =
Record[0];
5876 Type *OpTy = getTypeByID(OpTyID);
5880 return error(
"Invalid switch record");
5881 unsigned NumCases = (
Record.size()-3)/2;
5884 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5886 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
5887 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
5888 if (!CaseVal || !DestBB) {
5890 return error(
"Invalid switch record");
5892 SI->addCase(CaseVal, DestBB);
5899 return error(
"Invalid indirectbr record");
5900 unsigned OpTyID =
Record[0];
5901 Type *OpTy = getTypeByID(OpTyID);
5904 return error(
"Invalid indirectbr record");
5905 unsigned NumDests =
Record.size()-2;
5908 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5909 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
5913 return error(
"Invalid indirectbr record");
5923 return error(
"Invalid invoke record");
5926 unsigned CCInfo =
Record[OpNum++];
5927 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
5928 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
5930 unsigned FTyID = InvalidTypeID;
5931 FunctionType *FTy =
nullptr;
5932 if ((CCInfo >> 13) & 1) {
5936 return error(
"Explicit invoke type is not a function type");
5940 unsigned CalleeTypeID;
5941 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5943 return error(
"Invalid invoke record");
5947 return error(
"Callee is not a pointer");
5949 FTyID = getContainedTypeID(CalleeTypeID);
5952 return error(
"Callee is not of pointer to function type");
5954 if (
Record.size() < FTy->getNumParams() + OpNum)
5955 return error(
"Insufficient operands to call");
5957 SmallVector<Value*, 16>
Ops;
5958 SmallVector<unsigned, 16> ArgTyIDs;
5959 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5960 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5961 Ops.push_back(
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
5965 return error(
"Invalid invoke record");
5968 if (!FTy->isVarArg()) {
5969 if (
Record.size() != OpNum)
5970 return error(
"Invalid invoke record");
5973 while (OpNum !=
Record.size()) {
5976 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5977 return error(
"Invalid invoke record");
5984 if (!OperandBundles.empty())
5989 ResTypeID = getContainedTypeID(FTyID);
5990 OperandBundles.clear();
5993 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
6004 Value *Val =
nullptr;
6006 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
6007 return error(
"Invalid resume record");
6016 unsigned CCInfo =
Record[OpNum++];
6018 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
6019 unsigned NumIndirectDests =
Record[OpNum++];
6020 SmallVector<BasicBlock *, 16> IndirectDests;
6021 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
6022 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
6024 unsigned FTyID = InvalidTypeID;
6025 FunctionType *FTy =
nullptr;
6030 return error(
"Explicit call type is not a function type");
6034 unsigned CalleeTypeID;
6035 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6037 return error(
"Invalid callbr record");
6041 return error(
"Callee is not a pointer type");
6043 FTyID = getContainedTypeID(CalleeTypeID);
6046 return error(
"Callee is not of pointer to function type");
6048 if (
Record.size() < FTy->getNumParams() + OpNum)
6049 return error(
"Insufficient operands to call");
6051 SmallVector<Value*, 16>
Args;
6052 SmallVector<unsigned, 16> ArgTyIDs;
6054 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6056 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6057 if (FTy->getParamType(i)->isLabelTy())
6058 Arg = getBasicBlock(Record[OpNum]);
6060 Arg =
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6063 return error(
"Invalid callbr record");
6064 Args.push_back(Arg);
6069 if (!FTy->isVarArg()) {
6070 if (OpNum !=
Record.size())
6071 return error(
"Invalid callbr record");
6073 while (OpNum !=
Record.size()) {
6076 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6077 return error(
"Invalid callbr record");
6084 if (!OperandBundles.empty())
6089 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6092 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6097 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6098 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6099 unsigned LabelNo = ArgNo - FirstBlockArg;
6101 if (!BA || BA->getFunction() !=
F ||
6102 LabelNo > IndirectDests.
size() ||
6103 BA->getBasicBlock() != IndirectDests[LabelNo])
6104 return error(
"callbr argument does not match indirect dest");
6109 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6113 for (
Value *Arg : Args)
6116 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6119 std::string Constraints =
IA->getConstraintString().str();
6122 for (
const auto &CI : ConstraintInfo) {
6124 if (ArgNo >= FirstBlockArg)
6125 Constraints.insert(Pos,
"!");
6130 Pos = Constraints.find(
',', Pos);
6131 if (Pos == std::string::npos)
6137 IA->hasSideEffects(),
IA->isAlignStack(),
6138 IA->getDialect(),
IA->canThrow());
6144 ResTypeID = getContainedTypeID(FTyID);
6145 OperandBundles.clear();
6162 return error(
"Invalid phi record");
6164 unsigned TyID =
Record[0];
6165 Type *Ty = getTypeByID(TyID);
6167 return error(
"Invalid phi record");
6172 size_t NumArgs = (
Record.size() - 1) / 2;
6176 return error(
"Invalid phi record");
6180 SmallDenseMap<BasicBlock *, Value *>
Args;
6181 for (
unsigned i = 0; i != NumArgs; i++) {
6182 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6185 return error(
"Invalid phi BB");
6192 auto It =
Args.find(BB);
6194 if (It !=
Args.end()) {
6208 if (!PhiConstExprBB)
6210 EdgeBB = PhiConstExprBB;
6218 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6220 V =
getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6224 return error(
"Invalid phi record");
6227 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6228 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6229 PhiConstExprBB =
nullptr;
6232 Args.insert({BB,
V});
6238 if (
Record.size() % 2 == 0) {
6242 I->setFastMathFlags(FMF);
6254 return error(
"Invalid landingpad record");
6258 return error(
"Invalid landingpad record");
6260 ResTypeID =
Record[Idx++];
6261 Type *Ty = getTypeByID(ResTypeID);
6263 return error(
"Invalid landingpad record");
6265 Value *PersFn =
nullptr;
6266 unsigned PersFnTypeID;
6267 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6269 return error(
"Invalid landingpad record");
6271 if (!
F->hasPersonalityFn())
6274 return error(
"Personality function mismatch");
6277 bool IsCleanup = !!
Record[Idx++];
6278 unsigned NumClauses =
Record[Idx++];
6281 for (
unsigned J = 0; J != NumClauses; ++J) {
6287 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6290 return error(
"Invalid landingpad record");
6295 "Catch clause has a invalid type!");
6298 "Filter clause has invalid type!");
6309 return error(
"Invalid alloca record");
6310 using APV = AllocaPackedValues;
6311 const uint64_t Rec =
Record[3];
6314 unsigned TyID =
Record[0];
6315 Type *Ty = getTypeByID(TyID);
6317 TyID = getContainedTypeID(TyID);
6318 Ty = getTypeByID(TyID);
6320 return error(
"Missing element type for old-style alloca");
6322 unsigned OpTyID =
Record[1];
6323 Type *OpTy = getTypeByID(OpTyID);
6324 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6329 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6333 return error(
"Invalid alloca record");
6335 const DataLayout &
DL = TheModule->getDataLayout();
6336 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6338 SmallPtrSet<Type *, 4> Visited;
6339 if (!Align && !Ty->
isSized(&Visited))
6340 return error(
"alloca of unsized type");
6342 Align =
DL.getPrefTypeAlign(Ty);
6344 if (!
Size->getType()->isIntegerTy())
6345 return error(
"alloca element count must have integer type");
6347 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6351 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6359 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6360 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6361 return error(
"Invalid load record");
6364 return error(
"Load operand is not a pointer type");
6367 if (OpNum + 3 ==
Record.size()) {
6368 ResTypeID =
Record[OpNum++];
6369 Ty = getTypeByID(ResTypeID);
6371 ResTypeID = getContainedTypeID(OpTypeID);
6372 Ty = getTypeByID(ResTypeID);
6376 return error(
"Missing load type");
6378 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6382 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6384 SmallPtrSet<Type *, 4> Visited;
6385 if (!Align && !Ty->
isSized(&Visited))
6386 return error(
"load of unsized type");
6388 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6389 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6398 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6399 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size()))
6400 return error(
"Invalid load atomic record");
6403 return error(
"Load operand is not a pointer type");
6406 if (OpNum + 5 ==
Record.size()) {
6407 ResTypeID =
Record[OpNum++];
6408 Ty = getTypeByID(ResTypeID);
6410 ResTypeID = getContainedTypeID(OpTypeID);
6411 Ty = getTypeByID(ResTypeID);
6415 return error(
"Missing atomic load type");
6417 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6421 if (Ordering == AtomicOrdering::NotAtomic ||
6422 Ordering == AtomicOrdering::Release ||
6423 Ordering == AtomicOrdering::AcquireRelease)
6424 return error(
"Invalid load atomic record");
6425 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6426 return error(
"Invalid load atomic record");
6427 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6430 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6433 return error(
"Alignment missing from atomic load");
6434 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align, Ordering, SSID);
6442 unsigned PtrTypeID, ValTypeID;
6443 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6444 return error(
"Invalid store record");
6447 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6448 return error(
"Invalid store record");
6450 ValTypeID = getContainedTypeID(PtrTypeID);
6451 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6452 ValTypeID, Val, CurBB))
6453 return error(
"Invalid store record");
6456 if (OpNum + 2 !=
Record.size())
6457 return error(
"Invalid store record");
6462 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6464 SmallPtrSet<Type *, 4> Visited;
6466 return error(
"store of unsized type");
6468 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6469 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6478 unsigned PtrTypeID, ValTypeID;
6479 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6481 return error(
"Invalid store atomic record");
6483 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6484 return error(
"Invalid store atomic record");
6486 ValTypeID = getContainedTypeID(PtrTypeID);
6487 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6488 ValTypeID, Val, CurBB))
6489 return error(
"Invalid store atomic record");
6492 if (OpNum + 4 !=
Record.size())
6493 return error(
"Invalid store atomic record");
6498 if (Ordering == AtomicOrdering::NotAtomic ||
6499 Ordering == AtomicOrdering::Acquire ||
6500 Ordering == AtomicOrdering::AcquireRelease)
6501 return error(
"Invalid store atomic record");
6502 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6503 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6504 return error(
"Invalid store atomic record");
6507 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6510 return error(
"Alignment missing from atomic store");
6511 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align, Ordering, SSID);
6518 const size_t NumRecords =
Record.size();
6520 Value *Ptr =
nullptr;
6522 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6523 return error(
"Invalid cmpxchg record");
6526 return error(
"Cmpxchg operand is not a pointer type");
6529 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6530 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6531 CmpTypeID, Cmp, CurBB))
6532 return error(
"Invalid cmpxchg record");
6535 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6537 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6538 return error(
"Invalid cmpxchg record");
6542 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6543 SuccessOrdering == AtomicOrdering::Unordered)
6544 return error(
"Invalid cmpxchg record");
6546 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6548 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6556 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6557 FailureOrdering == AtomicOrdering::Unordered)
6558 return error(
"Invalid cmpxchg record");
6560 const Align Alignment(
6561 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6563 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6564 FailureOrdering, SSID);
6567 if (NumRecords < 8) {
6571 I->insertInto(CurBB, CurBB->
end());
6573 ResTypeID = CmpTypeID;
6576 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6577 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6586 const size_t NumRecords =
Record.size();
6588 Value *Ptr =
nullptr;
6590 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6591 return error(
"Invalid cmpxchg record");
6594 return error(
"Cmpxchg operand is not a pointer type");
6598 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6599 return error(
"Invalid cmpxchg record");
6601 Value *Val =
nullptr;
6602 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6604 return error(
"Invalid cmpxchg record");
6606 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6607 return error(
"Invalid cmpxchg record");
6609 const bool IsVol =
Record[OpNum];
6614 return error(
"Invalid cmpxchg success ordering");
6616 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6618 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6624 return error(
"Invalid cmpxchg failure ordering");
6626 const bool IsWeak =
Record[OpNum + 4];
6628 MaybeAlign Alignment;
6630 if (NumRecords == (OpNum + 6)) {
6631 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6636 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6638 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6639 FailureOrdering, SSID);
6643 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6644 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6653 const size_t NumRecords =
Record.size();
6656 Value *Ptr =
nullptr;
6658 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6659 return error(
"Invalid atomicrmw record");
6662 return error(
"Invalid atomicrmw record");
6664 Value *Val =
nullptr;
6665 unsigned ValTypeID = InvalidTypeID;
6667 ValTypeID = getContainedTypeID(PtrTypeID);
6668 if (popValue(Record, OpNum, NextValueNo,
6669 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6670 return error(
"Invalid atomicrmw record");
6672 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6673 return error(
"Invalid atomicrmw record");
6676 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6677 return error(
"Invalid atomicrmw record");
6679 bool IsElementwise =
false;
6684 return error(
"Invalid atomicrmw record");
6686 const bool IsVol =
Record[OpNum + 1];
6689 if (Ordering == AtomicOrdering::NotAtomic ||
6690 Ordering == AtomicOrdering::Unordered)
6691 return error(
"Invalid atomicrmw record");
6693 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6695 MaybeAlign Alignment;
6697 if (NumRecords == (OpNum + 5)) {
6698 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6704 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6706 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID,
6708 ResTypeID = ValTypeID;
6716 return error(
"Invalid fence record");
6718 if (Ordering == AtomicOrdering::NotAtomic ||
6719 Ordering == AtomicOrdering::Unordered ||
6720 Ordering == AtomicOrdering::Monotonic)
6721 return error(
"Invalid fence record");
6723 I =
new FenceInst(
Context, Ordering, SSID);
6730 SeenDebugRecord =
true;
6733 return error(
"Invalid dbg record: missing instruction");
6736 Inst->
getParent()->insertDbgRecordBefore(
6747 SeenDebugRecord =
true;
6750 return error(
"Invalid dbg record: missing instruction");
6767 DILocalVariable *Var =
6769 DIExpression *Expr =
6782 unsigned SlotBefore =
Slot;
6783 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6784 return error(
"Invalid dbg record: invalid value");
6786 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6789 RawLocation = getFnMetadataByID(Record[Slot++]);
6792 DbgVariableRecord *DVR =
nullptr;
6796 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6797 DbgVariableRecord::LocationType::Value);
6800 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6801 DbgVariableRecord::LocationType::Declare);
6804 DVR =
new DbgVariableRecord(
6805 RawLocation, Var, Expr, DIL,
6806 DbgVariableRecord::LocationType::DeclareValue);
6810 DIExpression *AddrExpr =
6812 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6813 DVR =
new DbgVariableRecord(RawLocation, Var, Expr,
ID, Addr, AddrExpr,
6826 return error(
"Invalid call record");
6830 unsigned CCInfo =
Record[OpNum++];
6836 return error(
"Fast math flags indicator set for call with no FMF");
6839 unsigned FTyID = InvalidTypeID;
6840 FunctionType *FTy =
nullptr;
6845 return error(
"Explicit call type is not a function type");
6849 unsigned CalleeTypeID;
6850 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6852 return error(
"Invalid call record");
6856 return error(
"Callee is not a pointer type");
6858 FTyID = getContainedTypeID(CalleeTypeID);
6861 return error(
"Callee is not of pointer to function type");
6863 if (
Record.size() < FTy->getNumParams() + OpNum)
6864 return error(
"Insufficient operands to call");
6866 SmallVector<Value*, 16>
Args;
6867 SmallVector<unsigned, 16> ArgTyIDs;
6869 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6870 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6871 if (FTy->getParamType(i)->isLabelTy())
6872 Args.push_back(getBasicBlock(Record[OpNum]));
6875 FTy->getParamType(i), ArgTyID, CurBB));
6878 return error(
"Invalid call record");
6882 if (!FTy->isVarArg()) {
6883 if (OpNum !=
Record.size())
6884 return error(
"Invalid call record");
6886 while (OpNum !=
Record.size()) {
6889 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6890 return error(
"Invalid call record");
6897 if (!OperandBundles.empty())
6901 ResTypeID = getContainedTypeID(FTyID);
6902 OperandBundles.clear();
6916 SeenDebugIntrinsic =
true;
6923 return error(
"Fast-math-flags specified for call without "
6924 "floating-point scalar or vector return type");
6925 I->setFastMathFlags(FMF);
6931 return error(
"Invalid va_arg record");
6932 unsigned OpTyID =
Record[0];
6933 Type *OpTy = getTypeByID(OpTyID);
6936 Type *ResTy = getTypeByID(ResTypeID);
6937 if (!OpTy || !
Op || !ResTy)
6938 return error(
"Invalid va_arg record");
6939 I =
new VAArgInst(
Op, ResTy);
6949 if (
Record.empty() || Record[0] >= BundleTags.size())
6950 return error(
"Invalid operand bundle record");
6952 std::vector<Value *> Inputs;
6955 while (OpNum !=
Record.size()) {
6957 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
6958 return error(
"Invalid operand bundle record");
6959 Inputs.push_back(
Op);
6962 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
6970 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6971 return error(
"Invalid freeze record");
6972 if (OpNum !=
Record.size())
6973 return error(
"Invalid freeze record");
6975 I =
new FreezeInst(
Op);
6976 ResTypeID = OpTypeID;
6986 return error(
"Invalid instruction with no BB");
6988 if (!OperandBundles.empty()) {
6990 return error(
"Operand bundles found with no consumer");
6992 I->insertInto(CurBB, CurBB->
end());
6995 if (
I->isTerminator()) {
6997 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
7001 if (!
I->getType()->isVoidTy()) {
7002 assert(
I->getType() == getTypeByID(ResTypeID) &&
7003 "Incorrect result type ID");
7011 if (!OperandBundles.empty())
7012 return error(
"Operand bundles found with no consumer");
7016 if (!
A->getParent()) {
7018 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
7024 return error(
"Never resolved value found in function");
7029 if (MDLoader->hasFwdRefs())
7030 return error(
"Invalid function metadata: outgoing forward refs");
7035 for (
const auto &Pair : ConstExprEdgeBBs) {
7046 ValueList.
shrinkTo(ModuleValueListSize);
7047 MDLoader->shrinkTo(ModuleMDLoaderSize);
7048 std::vector<BasicBlock*>().swap(FunctionBBs);
7053Error BitcodeReader::findFunctionInStream(
7055 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
7056 while (DeferredFunctionInfoIterator->second == 0) {
7061 assert(VSTOffset == 0 || !
F->hasName());
7064 if (
Error Err = rememberAndSkipFunctionBodies())
7070SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7073 if (Val >= SSIDs.
size())
7082Error BitcodeReader::materialize(GlobalValue *GV) {
7085 if (!
F || !
F->isMaterializable())
7088 auto DFII = DeferredFunctionInfo.
find(
F);
7089 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7092 if (DFII->second == 0)
7093 if (
Error Err = findFunctionInStream(
F, DFII))
7097 if (
Error Err = materializeMetadata())
7104 if (
Error Err = parseFunctionBody(
F))
7106 F->setIsMaterializable(
false);
7110 if (SeenDebugIntrinsic && SeenDebugRecord)
7111 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7117 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7118 F->setSubprogram(SP);
7121 if (!MDLoader->isStrippingTBAA()) {
7123 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7126 MDLoader->setStripTBAA(
true);
7133 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7134 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7140 unsigned ExpectedNumOperands = 0;
7142 ExpectedNumOperands = 2;
7144 ExpectedNumOperands =
SI->getNumSuccessors();
7146 ExpectedNumOperands = 1;
7150 ExpectedNumOperands = 2;
7157 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7158 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7164 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7165 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7167 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7168 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7169 CI->getArgOperand(ArgNo)->getType(),
7170 CI->getParamAttributes(ArgNo)));
7173 if (Function *OldFn = CI->getCalledFunction()) {
7174 auto It = UpgradedIntrinsics.find(OldFn);
7175 if (It != UpgradedIntrinsics.end())
7186 return materializeForwardReferencedFunctions();
7189Error BitcodeReader::materializeModule() {
7190 if (
Error Err = materializeMetadata())
7194 WillMaterializeAllForwardRefs =
true;
7198 for (Function &
F : *TheModule) {
7199 if (
Error Err = materialize(&
F))
7205 if (LastFunctionBlockBit || NextUnreadBit)
7207 ? LastFunctionBlockBit
7213 if (!BasicBlockFwdRefs.
empty())
7214 return error(
"Never resolved function from blockaddress");
7220 for (
auto &
I : UpgradedIntrinsics) {
7221 for (
auto *U :
I.first->users()) {
7225 if (
I.first !=
I.second) {
7226 if (!
I.first->use_empty())
7227 I.first->replaceAllUsesWith(
I.second);
7228 I.first->eraseFromParent();
7231 UpgradedIntrinsics.clear();
7246std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7247 return IdentifiedStructTypes;
7250ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7251 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7252 StringRef ModulePath, std::function<
bool(StringRef)> IsPrevailing,
7253 std::function<
void(ValueInfo)> OnValueInfo)
7254 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7255 ModulePath(ModulePath), IsPrevailing(IsPrevailing),
7256 OnValueInfo(OnValueInfo) {}
7258void ModuleSummaryIndexBitcodeReader::addThisModule() {
7263ModuleSummaryIndexBitcodeReader::getThisModule() {
7267template <
bool AllowNullValueInfo>
7268std::pair<ValueInfo, GlobalValue::GUID>
7269ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7270 auto VGI = ValueIdToValueInfoMap[ValueId];
7277 assert(AllowNullValueInfo || std::get<0>(VGI));
7281void ModuleSummaryIndexBitcodeReader::setValueGUID(
7283 StringRef SourceFileName) {
7285 if (ValueID < DefinedGUIDs.size())
7286 ValueGUID = DefinedGUIDs[ValueID];
7293 auto OriginalNameID = ValueGUID;
7297 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7305 ValueIdToValueInfoMap[ValueID] = std::make_pair(VI, OriginalNameID);
7313Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7315 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7322 if (!MaybeCurrentBit)
7324 uint64_t CurrentBit = MaybeCurrentBit.
get();
7329 SmallVector<uint64_t, 64>
Record;
7338 BitstreamEntry
Entry = MaybeEntry.
get();
7340 switch (
Entry.Kind) {
7343 return error(
"Malformed block");
7359 switch (MaybeRecord.
get()) {
7364 return error(
"Invalid vst_code_entry record");
7365 unsigned ValueID =
Record[0];
7367 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7368 assert(VLI != ValueIdToLinkageMap.
end() &&
7369 "No linkage found for VST entry?");
7378 return error(
"Invalid vst_code_fnentry record");
7379 unsigned ValueID =
Record[0];
7381 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7382 assert(VLI != ValueIdToLinkageMap.
end() &&
7383 "No linkage found for VST entry?");
7391 unsigned ValueID =
Record[0];
7395 ValueIdToValueInfoMap[ValueID] =
7406Error ModuleSummaryIndexBitcodeReader::parseModule() {
7410 SmallVector<uint64_t, 64>
Record;
7411 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7412 unsigned ValueId = 0;
7416 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
7419 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7421 switch (
Entry.Kind) {
7423 return error(
"Malformed block");
7435 if (
Error Err = readBlockInfo())
7441 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7442 !SeenGlobalValSummary) &&
7443 "Expected early VST parse via VSTOffset record");
7450 if (!SourceFileName.
empty())
7452 assert(!SeenValueSymbolTable &&
7453 "Already read VST when parsing summary block?");
7458 if (VSTOffset > 0) {
7459 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7461 SeenValueSymbolTable =
true;
7463 SeenGlobalValSummary =
true;
7464 if (
Error Err = parseEntireSummary(
Entry.ID))
7468 if (
Error Err = parseModuleStringTable())
7476 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7479 switch (MaybeBitCode.
get()) {
7483 if (
Error Err = parseVersionRecord(Record).takeError())
7491 return error(
"Invalid source filename record");
7498 return error(
"Invalid hash length " + Twine(
Record.size()).str());
7499 auto &Hash = getThisModule()->second;
7501 for (
auto &Val : Record) {
7502 assert(!(Val >> 32) &&
"Unexpected high bits set");
7510 return error(
"Invalid vstoffset record");
7514 VSTOffset =
Record[0] - 1;
7519 DefinedGUIDs.reserve(DefinedGUIDs.size() +
Record.size() / 2);
7520 for (
size_t i = 0; i <
Record.size(); i += 2)
7521 DefinedGUIDs.push_back(Record[i] << 32 | Record[i + 1]);
7531 ArrayRef<uint64_t> GVRecord;
7532 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7533 if (GVRecord.
size() <= 3)
7534 return error(
"Invalid global record");
7535 uint64_t RawLinkage = GVRecord[3];
7538 ValueIdToLinkageMap[ValueId++] =
Linkage;
7542 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7553ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7556 for (uint64_t RefValueId : Record)
7557 Ret.
push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7562ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7563 bool IsOldProfileFormat,
7564 bool HasProfile,
bool HasRelBF) {
7568 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7573 for (
unsigned I = 0,
E =
Record.size();
I !=
E; ++
I) {
7575 bool HasTailCall =
false;
7577 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7578 if (IsOldProfileFormat) {
7582 }
else if (HasProfile)
7583 std::tie(Hotness, HasTailCall) =
7617 static_cast<size_t>(
Record[Slot + 1])};
7640 while (Slot <
Record.size())
7644std::vector<FunctionSummary::ParamAccess>
7645ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7646 auto ReadRange = [&]() {
7648 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7650 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7657 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7658 while (!
Record.empty()) {
7659 PendingParamAccesses.emplace_back();
7660 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7662 ParamAccess.
Use = ReadRange();
7667 std::get<0>(getValueInfoFromValueId(
Record.consume_front()));
7668 Call.Offsets = ReadRange();
7671 return PendingParamAccesses;
7674void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7675 ArrayRef<uint64_t> Record,
size_t &Slot,
7678 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7682void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7683 ArrayRef<uint64_t> Record) {
7691 while (Slot <
Record.size())
7692 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7695SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7696 ArrayRef<uint64_t> Record,
unsigned &
I) {
7697 SmallVector<unsigned> StackIdList;
7701 if (RadixArray.empty()) {
7702 unsigned NumStackEntries =
Record[
I++];
7704 StackIdList.
reserve(NumStackEntries);
7705 for (
unsigned J = 0; J < NumStackEntries; J++) {
7706 assert(Record[
I] < StackIds.size());
7707 StackIdList.
push_back(getStackIdIndex(Record[
I++]));
7710 unsigned RadixIndex =
Record[
I++];
7716 assert(RadixIndex < RadixArray.size());
7717 unsigned NumStackIds = RadixArray[RadixIndex++];
7718 StackIdList.
reserve(NumStackIds);
7719 while (NumStackIds--) {
7720 assert(RadixIndex < RadixArray.size());
7721 unsigned Elem = RadixArray[RadixIndex];
7722 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7723 RadixIndex = RadixIndex - Elem;
7724 assert(RadixIndex < RadixArray.size());
7725 Elem = RadixArray[RadixIndex];
7727 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7730 StackIdList.
push_back(getStackIdIndex(Elem));
7740 unsigned FirstWORef = Refs.
size() - WOCnt;
7741 unsigned RefNo = FirstWORef - ROCnt;
7742 for (; RefNo < FirstWORef; ++RefNo)
7743 Refs[RefNo].setReadOnly();
7744 for (; RefNo < Refs.
size(); ++RefNo)
7745 Refs[RefNo].setWriteOnly();
7750Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7753 SmallVector<uint64_t, 64>
Record;
7760 BitstreamEntry
Entry = MaybeEntry.
get();
7763 return error(
"Invalid Summary Block: record for version expected");
7768 return error(
"Invalid Summary Block: version expected");
7771 const bool IsOldProfileFormat =
Version == 1;
7774 const bool MemProfAfterFunctionSummary =
Version >= 13;
7776 return error(
"Invalid summary version " + Twine(
Version) +
7777 ". Version should be in the range [1-" +
7784 GlobalValueSummary *LastSeenSummary =
nullptr;
7794 FunctionSummary *CurrentPrevailingFS =
nullptr;
7799 std::vector<GlobalValue::GUID> PendingTypeTests;
7800 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7801 PendingTypeCheckedLoadVCalls;
7802 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7803 PendingTypeCheckedLoadConstVCalls;
7804 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7806 std::vector<CallsiteInfo> PendingCallsites;
7807 std::vector<AllocInfo> PendingAllocs;
7808 std::vector<uint64_t> PendingContextIds;
7814 BitstreamEntry
Entry = MaybeEntry.
get();
7816 switch (
Entry.Kind) {
7819 return error(
"Malformed block");
7835 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7838 unsigned BitCode = MaybeBitCode.
get();
7848 uint64_t ValueID =
Record[0];
7855 ValueIdToValueInfoMap[ValueID] =
7873 unsigned ValueID =
Record[0];
7874 uint64_t RawFlags =
Record[1];
7875 unsigned InstCount =
Record[2];
7876 uint64_t RawFunFlags = 0;
7877 unsigned NumRefs =
Record[3];
7878 unsigned NumRORefs = 0, NumWORefs = 0;
7879 int RefListStartIndex = 4;
7883 RefListStartIndex = 5;
7886 RefListStartIndex = 6;
7889 RefListStartIndex = 7;
7900 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7902 "Record size inconsistent with number of references");
7904 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7909 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7910 IsOldProfileFormat, HasProfile, HasRelBF);
7912 auto [
VI,
GUID] = getValueInfoFromValueId(ValueID);
7919 IsPrevailing(
VI.name());
7925 assert(!MemProfAfterFunctionSummary ||
7926 (PendingCallsites.empty() && PendingAllocs.empty()));
7927 if (!IsPrevailingSym && !MemProfAfterFunctionSummary) {
7928 PendingCallsites.clear();
7929 PendingAllocs.clear();
7932 auto FS = std::make_unique<FunctionSummary>(
7934 std::move(Calls), std::move(PendingTypeTests),
7935 std::move(PendingTypeTestAssumeVCalls),
7936 std::move(PendingTypeCheckedLoadVCalls),
7937 std::move(PendingTypeTestAssumeConstVCalls),
7938 std::move(PendingTypeCheckedLoadConstVCalls),
7939 std::move(PendingParamAccesses), std::move(PendingCallsites),
7940 std::move(PendingAllocs));
7941 FS->setModulePath(getThisModule()->first());
7942 FS->setOriginalName(GUID);
7945 if (MemProfAfterFunctionSummary) {
7946 if (IsPrevailingSym)
7947 CurrentPrevailingFS =
FS.get();
7949 CurrentPrevailingFS =
nullptr;
7958 unsigned ValueID =
Record[0];
7959 uint64_t RawFlags =
Record[1];
7960 unsigned AliaseeID =
Record[2];
7962 auto AS = std::make_unique<AliasSummary>(Flags);
7968 AS->setModulePath(getThisModule()->first());
7970 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
7972 if (!AliaseeInModule)
7973 return error(
"Alias expects aliasee summary to be parsed");
7974 AS->setAliasee(AliaseeVI, AliaseeInModule);
7976 auto GUID = getValueInfoFromValueId(ValueID);
7977 AS->setOriginalName(std::get<1>(GUID));
7983 unsigned ValueID =
Record[0];
7984 uint64_t RawFlags =
Record[1];
7985 unsigned RefArrayStart = 2;
7986 GlobalVarSummary::GVarFlags GVF(
false,
7996 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
7998 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7999 FS->setModulePath(getThisModule()->first());
8000 auto GUID = getValueInfoFromValueId(ValueID);
8001 FS->setOriginalName(std::get<1>(GUID));
8009 unsigned ValueID =
Record[0];
8010 uint64_t RawFlags =
Record[1];
8012 unsigned NumRefs =
Record[3];
8013 unsigned RefListStartIndex = 4;
8014 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
8017 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8019 for (
unsigned I = VTableListStartIndex,
E =
Record.size();
I !=
E; ++
I) {
8020 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
8025 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8026 VS->setModulePath(getThisModule()->first());
8027 VS->setVTableFuncs(VTableFuncs);
8028 auto GUID = getValueInfoFromValueId(ValueID);
8029 VS->setOriginalName(std::get<1>(GUID));
8041 unsigned ValueID =
Record[0];
8042 uint64_t ModuleId =
Record[1];
8043 uint64_t RawFlags =
Record[2];
8044 unsigned InstCount =
Record[3];
8045 uint64_t RawFunFlags = 0;
8046 unsigned NumRefs =
Record[4];
8047 unsigned NumRORefs = 0, NumWORefs = 0;
8048 int RefListStartIndex = 5;
8052 RefListStartIndex = 6;
8053 size_t NumRefsIndex = 5;
8055 unsigned NumRORefsOffset = 1;
8056 RefListStartIndex = 7;
8059 RefListStartIndex = 8;
8061 RefListStartIndex = 9;
8063 NumRORefsOffset = 2;
8066 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
8068 NumRefs =
Record[NumRefsIndex];
8072 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8074 "Record size inconsistent with number of references");
8076 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8079 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8080 IsOldProfileFormat, HasProfile,
false);
8081 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8083 auto FS = std::make_unique<FunctionSummary>(
8085 std::move(Edges), std::move(PendingTypeTests),
8086 std::move(PendingTypeTestAssumeVCalls),
8087 std::move(PendingTypeCheckedLoadVCalls),
8088 std::move(PendingTypeTestAssumeConstVCalls),
8089 std::move(PendingTypeCheckedLoadConstVCalls),
8090 std::move(PendingParamAccesses), std::move(PendingCallsites),
8091 std::move(PendingAllocs));
8092 LastSeenSummary =
FS.get();
8093 if (MemProfAfterFunctionSummary)
8094 CurrentPrevailingFS =
FS.get();
8095 LastSeenGUID =
VI.getGUID();
8096 FS->setModulePath(ModuleIdMap[ModuleId]);
8104 unsigned ValueID =
Record[0];
8105 uint64_t ModuleId =
Record[1];
8106 uint64_t RawFlags =
Record[2];
8107 unsigned AliaseeValueId =
Record[3];
8109 auto AS = std::make_unique<AliasSummary>(Flags);
8110 LastSeenSummary = AS.get();
8111 AS->setModulePath(ModuleIdMap[ModuleId]);
8113 auto AliaseeVI = std::get<0>(
8114 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(AliaseeValueId));
8116 auto AliaseeInModule =
8118 AS->setAliasee(AliaseeVI, AliaseeInModule);
8120 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8121 LastSeenGUID =
VI.getGUID();
8127 unsigned ValueID =
Record[0];
8128 uint64_t ModuleId =
Record[1];
8129 uint64_t RawFlags =
Record[2];
8130 unsigned RefArrayStart = 3;
8131 GlobalVarSummary::GVarFlags GVF(
false,
8141 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8143 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8144 LastSeenSummary =
FS.get();
8145 FS->setModulePath(ModuleIdMap[ModuleId]);
8146 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8147 LastSeenGUID =
VI.getGUID();
8153 uint64_t OriginalName =
Record[0];
8154 if (!LastSeenSummary)
8155 return error(
"Name attachment that does not follow a combined record");
8159 LastSeenSummary =
nullptr;
8164 assert(PendingTypeTests.empty());
8169 assert(PendingTypeTestAssumeVCalls.empty());
8170 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8171 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8175 assert(PendingTypeCheckedLoadVCalls.empty());
8176 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8177 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8181 PendingTypeTestAssumeConstVCalls.push_back(
8186 PendingTypeCheckedLoadConstVCalls.push_back(
8192 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8194 static_cast<size_t>(Record[
I + 1]));
8200 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8202 static_cast<size_t>(Record[
I + 1]));
8211 parseTypeIdCompatibleVtableSummaryRecord(Record);
8219 PendingParamAccesses = parseParamAccesses(Record);
8226 assert(StackIds.empty());
8228 StackIds = ArrayRef<uint64_t>(Record);
8234 StackIds.reserve(
Record.size() / 2);
8235 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8236 StackIds.push_back(*R << 32 | *(R + 1));
8238 assert(StackIdToIndex.empty());
8240 StackIdToIndex.resize(StackIds.size(), UninitializedStackIdIndex);
8245 RadixArray = ArrayRef<uint64_t>(Record);
8252 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8254 unsigned ValueID =
Record[0];
8255 SmallVector<unsigned> StackIdList;
8257 assert(R < StackIds.size());
8258 StackIdList.
push_back(getStackIdIndex(R));
8260 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8261 if (MemProfAfterFunctionSummary)
8263 CallsiteInfo({
VI, std::move(StackIdList)}));
8265 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8272 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8273 auto RecordIter =
Record.begin();
8274 unsigned ValueID = *RecordIter++;
8275 unsigned NumStackIds = *RecordIter++;
8276 unsigned NumVersions = *RecordIter++;
8277 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8278 SmallVector<unsigned> StackIdList;
8279 for (
unsigned J = 0; J < NumStackIds; J++) {
8280 assert(*RecordIter < StackIds.size());
8281 StackIdList.
push_back(getStackIdIndex(*RecordIter++));
8283 SmallVector<unsigned> Versions;
8284 for (
unsigned J = 0; J < NumVersions; J++)
8286 ValueInfo
VI = std::get<0>(
8287 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8288 if (MemProfAfterFunctionSummary)
8290 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8292 PendingCallsites.push_back(
8293 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8300 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8305 PendingContextIds.reserve(
Record.size() / 2);
8306 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8307 PendingContextIds.push_back(*R << 32 | *(R + 1));
8314 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS) {
8315 PendingContextIds.clear();
8319 std::vector<MIBInfo> MIBs;
8320 unsigned NumMIBs = 0;
8323 unsigned MIBsRead = 0;
8324 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8328 auto StackIdList = parseAllocInfoContext(Record,
I);
8329 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8335 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8337 assert(!PendingContextIds.empty() &&
8338 "Missing context ids for alloc sizes");
8339 unsigned ContextIdIndex = 0;
8345 while (MIBsRead++ < NumMIBs) {
8347 unsigned NumContextSizeInfoEntries =
Record[
I++];
8349 std::vector<ContextTotalSize> ContextSizes;
8350 ContextSizes.reserve(NumContextSizeInfoEntries);
8351 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8352 assert(ContextIdIndex < PendingContextIds.size());
8354 if (PendingContextIds[ContextIdIndex] == 0) {
8363 ContextSizes.push_back(
8364 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8366 AllContextSizes.push_back(std::move(ContextSizes));
8368 PendingContextIds.clear();
8370 AllocInfo AI(std::move(MIBs));
8371 if (!AllContextSizes.empty()) {
8372 assert(AI.MIBs.size() == AllContextSizes.size());
8373 AI.ContextSizeInfos = std::move(AllContextSizes);
8376 if (MemProfAfterFunctionSummary)
8377 CurrentPrevailingFS->
addAlloc(std::move(AI));
8379 PendingAllocs.push_back(std::move(AI));
8387 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8389 std::vector<MIBInfo> MIBs;
8390 unsigned NumMIBs =
Record[
I++];
8391 unsigned NumVersions =
Record[
I++];
8392 unsigned MIBsRead = 0;
8393 while (MIBsRead++ < NumMIBs) {
8396 SmallVector<unsigned> StackIdList;
8398 StackIdList = parseAllocInfoContext(Record,
I);
8399 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8402 SmallVector<uint8_t> Versions;
8403 for (
unsigned J = 0; J < NumVersions; J++)
8406 AllocInfo AI(std::move(Versions), std::move(MIBs));
8407 if (MemProfAfterFunctionSummary)
8408 CurrentPrevailingFS->
addAlloc(std::move(AI));
8410 PendingAllocs.push_back(std::move(AI));
8420Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8424 SmallVector<uint64_t, 64>
Record;
8426 SmallString<128> ModulePath;
8433 BitstreamEntry
Entry = MaybeEntry.
get();
8435 switch (
Entry.Kind) {
8438 return error(
"Malformed block");
8450 switch (MaybeRecord.
get()) {
8455 uint64_t ModuleId =
Record[0];
8458 return error(
"Invalid code_entry record");
8460 LastSeenModule = TheIndex.
addModule(ModulePath);
8461 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8469 return error(
"Invalid hash length " + Twine(
Record.size()).str());
8470 if (!LastSeenModule)
8471 return error(
"Invalid hash that does not follow a module path");
8473 for (
auto &Val : Record) {
8474 assert(!(Val >> 32) &&
"Unexpected high bits set");
8475 LastSeenModule->
second[Pos++] = Val;
8478 LastSeenModule =
nullptr;
8491class BitcodeErrorCategoryType :
public std::error_category {
8492 const char *
name()
const noexcept
override {
8493 return "llvm.bitcode";
8496 std::string message(
int IE)
const override {
8499 case BitcodeError::CorruptedBitcode:
8500 return "Corrupted bitcode";
8509 static BitcodeErrorCategoryType ErrorCategory;
8510 return ErrorCategory;
8514 unsigned Block,
unsigned RecordID) {
8516 return std::move(Err);
8525 switch (Entry.Kind) {
8530 return error(
"Malformed block");
8534 return std::move(Err);
8544 if (MaybeRecord.
get() == RecordID)
8555Expected<std::vector<BitcodeModule>>
8559 return FOrErr.takeError();
8560 return std::move(FOrErr->Mods);
8585 switch (Entry.Kind) {
8588 return error(
"Malformed block");
8591 uint64_t IdentificationBit = -1ull;
8595 return std::move(Err);
8601 Entry = MaybeEntry.
get();
8606 return error(
"Malformed block");
8612 return std::move(Err);
8631 if (!
I.Strtab.empty())
8638 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8639 F.StrtabForSymtab = *Strtab;
8655 if (
F.Symtab.empty())
8656 F.Symtab = *SymtabOrErr;
8661 return std::move(Err);
8666 return std::move(E);
8681BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8682 bool ShouldLazyLoadMetadata,
bool IsImporting,
8686 std::string ProducerIdentification;
8687 if (IdentificationBit != -1ull) {
8689 return std::move(JumpFailed);
8692 return std::move(
E);
8696 return std::move(JumpFailed);
8697 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8700 std::unique_ptr<Module>
M =
8701 std::make_unique<Module>(ModuleIdentifier,
Context);
8702 M->setMaterializer(R);
8705 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8706 IsImporting, Callbacks))
8707 return std::move(Err);
8709 if (MaterializeAll) {
8711 if (
Error Err =
M->materializeAll())
8712 return std::move(Err);
8715 if (
Error Err =
R->materializeForwardReferencedFunctions())
8716 return std::move(Err);
8719 return std::move(M);
8722Expected<std::unique_ptr<Module>>
8725 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8735 std::function<
bool(
StringRef)> IsPrevailing,
8736 std::function<
void(
ValueInfo)> OnValueInfo) {
8741 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8742 ModulePath, IsPrevailing, OnValueInfo);
8743 return R.parseModule();
8750 return std::move(JumpFailed);
8752 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8753 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8754 ModuleIdentifier, 0);
8756 if (
Error Err = R.parseModule())
8757 return std::move(Err);
8759 return std::move(Index);
8765 return std::move(Err);
8771 return std::move(
E);
8773 switch (Entry.Kind) {
8776 return error(
"Malformed block");
8779 return std::make_pair(
false,
false);
8791 switch (MaybeBitCode.
get()) {
8797 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8799 bool EnableSplitLTOUnit = Flags & 0x8;
8800 bool UnifiedLTO = Flags & 0x200;
8801 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8812 return std::move(JumpFailed);
8815 return std::move(Err);
8820 return std::move(E);
8822 switch (Entry.Kind) {
8824 return error(
"Malformed block");
8835 return Flags.takeError();
8845 return std::move(Err);
8852 return StreamFailed.takeError();
8862 if (MsOrErr->size() != 1)
8863 return error(
"Expected a single module");
8865 return (*MsOrErr)[0];
8868Expected<std::unique_ptr<Module>>
8870 bool ShouldLazyLoadMetadata,
bool IsImporting,
8876 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8881 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8882 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8884 IsImporting, Callbacks);
8886 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8892 return getModuleImpl(Context,
true,
false,
false, Callbacks);
8904 return BM->parseModule(Context, Callbacks);
8937 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
8946 return BM->getSummary();
8954 return BM->getLTOInfo();
8959 bool IgnoreEmptyThinLTOIndexFile) {
8964 if (IgnoreEmptyThinLTOIndexFile && !(*FileOrErr)->getBufferSize())
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static void getDecodedRelBFCallEdgeInfo(uint64_t RawFlags, uint64_t &RelBF, bool &HasTailCall)
static void upgradeDLLImportExportLinkage(GlobalValue *GV, unsigned Val)
static cl::opt< bool > PrintSummaryGUIDs("print-summary-global-ids", cl::init(false), cl::Hidden, cl::desc("Print the global id for each value when reading the module summary"))
static AtomicOrdering getDecodedOrdering(unsigned Val)
static std::pair< CalleeInfo::HotnessType, bool > getDecodedHotnessCallEdgeInfo(uint64_t RawFlags)
static FunctionSummary::FFlags getDecodedFFlags(uint64_t RawFlags)
static std::optional< CodeModel::Model > getDecodedCodeModel(unsigned Val)
static void setSpecialRefs(SmallVectorImpl< ValueInfo > &Refs, unsigned ROCnt, unsigned WOCnt)
static bool getDecodedDSOLocal(unsigned Val)
static bool convertToString(ArrayRef< uint64_t > Record, unsigned Idx, StrTy &Result)
Convert a string from a record into an std::string, return true on failure.
static GlobalVariable::UnnamedAddr getDecodedUnnamedAddrType(unsigned Val)
static void stripTBAA(Module *M)
static int getDecodedUnaryOpcode(unsigned Val, Type *Ty)
static Expected< std::string > readTriple(BitstreamCursor &Stream)
static void parseWholeProgramDevirtResolutionByArg(ArrayRef< uint64_t > Record, size_t &Slot, WholeProgramDevirtResolution &Wpd)
static uint64_t getRawAttributeMask(Attribute::AttrKind Val)
static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags, uint64_t Version)
static GlobalVarSummary::GVarFlags getDecodedGVarFlags(uint64_t RawFlags)
static Attribute::AttrKind getAttrFromCode(uint64_t Code)
static Expected< uint64_t > jumpToValueSymbolTable(uint64_t Offset, BitstreamCursor &Stream)
Helper to note and return the current location, and jump to the given offset.
static Expected< bool > hasObjCCategoryInModule(BitstreamCursor &Stream)
static GlobalValue::DLLStorageClassTypes getDecodedDLLStorageClass(unsigned Val)
static GEPNoWrapFlags toGEPNoWrapFlags(uint64_t Flags)
static void decodeLLVMAttributesForBitcode(AttrBuilder &B, uint64_t EncodedAttrs, uint64_t AttrIdx)
This fills an AttrBuilder object with the LLVM attributes that have been decoded from the given integ...
static AtomicRMWInst::BinOp getDecodedRMWOperation(unsigned Val, bool &IsElementwise)
static void parseTypeIdSummaryRecord(ArrayRef< uint64_t > Record, StringRef Strtab, ModuleSummaryIndex &TheIndex)
static void addRawAttributeValue(AttrBuilder &B, uint64_t Val)
static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val)
static bool hasImplicitComdat(size_t Val)
static GlobalValue::LinkageTypes getDecodedLinkage(unsigned Val)
static Error hasInvalidBitcodeHeader(BitstreamCursor &Stream)
static Expected< std::string > readIdentificationCode(BitstreamCursor &Stream)
static int getDecodedBinaryOpcode(unsigned Val, Type *Ty)
static Expected< BitcodeModule > getSingleModule(MemoryBufferRef Buffer)
static Expected< bool > hasObjCCategory(BitstreamCursor &Stream)
static GlobalVariable::ThreadLocalMode getDecodedThreadLocalMode(unsigned Val)
static void parseWholeProgramDevirtResolution(ArrayRef< uint64_t > Record, StringRef Strtab, size_t &Slot, TypeIdSummary &TypeId)
static void inferDSOLocal(GlobalValue *GV)
static FastMathFlags getDecodedFastMathFlags(unsigned Val)
GlobalValue::SanitizerMetadata deserializeSanitizerMetadata(unsigned V)
static Expected< BitstreamCursor > initStream(MemoryBufferRef Buffer)
static cl::opt< bool > ExpandConstantExprs("expand-constant-exprs", cl::Hidden, cl::desc("Expand constant expressions to instructions for testing purposes"))
static bool upgradeOldMemoryAttribute(MemoryEffects &ME, uint64_t EncodedKind)
static Expected< StringRef > readBlobInRecord(BitstreamCursor &Stream, unsigned Block, unsigned RecordID)
static Expected< std::string > readIdentificationBlock(BitstreamCursor &Stream)
Read the "IDENTIFICATION_BLOCK_ID" block, do some basic enforcement on the "epoch" encoded in the bit...
static Expected< std::pair< bool, bool > > getEnableSplitLTOUnitAndUnifiedFlag(BitstreamCursor &Stream, unsigned ID)
static bool isConstExprSupported(const BitcodeConstant *BC)
static int getDecodedCastOpcode(unsigned Val)
static Expected< std::string > readModuleTriple(BitstreamCursor &Stream)
static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static StringRef getOpcodeName(uint8_t Opcode, uint8_t OpcodeBase)
This file defines the DenseMap class.
Provides ErrorOr<T> smart pointer.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Module.h This file contains the declarations for the Module class.
static constexpr Value * getValue(Ty &ValueOrUse)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Machine Check Debug Module
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines the SmallString class.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
PointerType * getType() const
Overload to return most specific pointer type.
void setUsedWithInAlloca(bool V)
Specify whether this alloca is used to represent the arguments to a call.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
static bool isValidFailureOrdering(AtomicOrdering Ordering)
static AtomicOrdering getStrongestFailureOrdering(AtomicOrdering SuccessOrdering)
Returns the strongest permitted ordering on failure, given the desired ordering on success.
static bool isValidSuccessOrdering(AtomicOrdering Ordering)
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
static bool isTypeAttrKind(AttrKind Kind)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
@ None
No attributes have been set.
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
@ EndAttrKinds
Sentinel value useful for loops.
LLVM Basic Block Representation.
const Instruction & back() const
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI void replacePhiUsesWith(BasicBlock *Old, BasicBlock *New)
Update all phi nodes in this basic block to refer to basic block New instead of basic block Old.
LLVM_ABI SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
void moveBefore(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it into the function that MovePos lives ...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Represents a module in a bitcode file.
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getSummary()
Parse the specified bitcode buffer, returning the module summary index.
LLVM_ABI Expected< BitcodeLTOInfo > getLTOInfo()
Returns information about the module to be used for LTO: whether to compile with ThinLTO,...
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
LLVM_ABI Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(StringRef)> IsPrevailing=nullptr, std::function< void(ValueInfo)> OnValueInfo=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata, bool IsImporting, ParserCallbacks Callbacks={})
Read the bitcode module and prepare for lazy deserialization of function bodies.
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
void push_back(Value *V, unsigned TypeID)
void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV)
Error assignValue(unsigned Idx, Value *V, unsigned TypeID)
void shrinkTo(unsigned N)
unsigned getTypeID(unsigned ValNo) const
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
ArrayRef< uint8_t > getBitcodeBytes() const
Expected< word_t > Read(unsigned NumBits)
Expected< BitstreamEntry > advance(unsigned Flags=0)
Advance the current bitstream, returning the next entry in the stream.
Expected< BitstreamEntry > advanceSkippingSubblocks(unsigned Flags=0)
This is a convenience function for clients that don't expect any subblocks.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP=nullptr)
Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
Error SkipBlock()
Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body of this block.
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
uint64_t getCurrentByteNo() const
LLVM_ABI Expected< std::optional< BitstreamBlockInfo > > ReadBlockInfoBlock(bool ReadBlockInfoNames=false)
Read and return a block info block from the bitstream.
unsigned getAbbrevIDWidth() const
Return the number of bits used to encode an abbrev #.
bool canSkipToPos(size_t pos) const
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
@ MIN_BYTE_BITS
Minimum number of bits that can be specified.
@ MAX_BYTE_BITS
Maximum number of bits that can be specified Note that bit width is stored in the Type classes Subcla...
static LLVM_ABI ByteType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing a ByteType.
bool isInlineAsm() const
Check if this call is an inline asm statement.
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CaptureInfo createFromIntValue(uint32_t Data)
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
void emplace(Args &&...A)
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
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.
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.
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.
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
Kind
Specifies which kind of type check we should emit for this byte array.
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
ValID - Represents a reference of a definition of some sort with no type.
Struct that holds a reference to a particular GUID in a global value summary.
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...
std::string SingleImplName