24#include "llvm/Config/llvm-config.h"
54#include "llvm/IR/IntrinsicsAArch64.h"
55#include "llvm/IR/IntrinsicsARM.h"
87#include <system_error>
97 "Print the global id for each value when reading the module summary"));
102 "Expand constant expressions to instructions for testing purposes"));
107 SWITCH_INST_MAGIC = 0x4B5
120 "file too small to contain bitcode header");
121 for (
unsigned C : {
'B',
'C'})
125 "file doesn't start with bitcode header");
127 return Res.takeError();
128 for (
unsigned C : {0x0, 0xC, 0xE, 0xD})
132 "file doesn't start with bitcode header");
134 return Res.takeError();
139 const unsigned char *BufPtr = (
const unsigned char *)Buffer.
getBufferStart();
140 const unsigned char *BufEnd = BufPtr + Buffer.
getBufferSize();
143 return error(
"Invalid bitcode signature");
149 return error(
"Invalid bitcode wrapper header");
153 return std::move(Err);
155 return std::move(Stream);
159template <
typename StrTy>
172 if (
F.isMaterializable())
175 I.setMetadata(LLVMContext::MD_tbaa,
nullptr);
183 return std::move(Err);
188 std::string ProducerIdentification;
195 switch (Entry.Kind) {
198 return error(
"Malformed block");
200 return ProducerIdentification;
211 switch (MaybeBitCode.
get()) {
213 return error(
"Invalid value");
221 Twine(
"Incompatible epoch: Bitcode '") +
Twine(epoch) +
240 switch (Entry.Kind) {
243 return error(
"Malformed block");
251 return std::move(Err);
263 return std::move(Err);
274 switch (Entry.Kind) {
277 return error(
"Malformed block");
289 switch (MaybeRecord.
get()) {
295 return error(
"Invalid section name record");
300 Segment = Segment.trim();
301 Section = Section.trim();
303 if (Segment ==
"__DATA" && Section.starts_with(
"__objc_catlist"))
305 if (Segment ==
"__OBJC" && Section.starts_with(
"__category"))
307 if (Segment ==
"__TEXT" && Section.starts_with(
"__swift"))
325 switch (Entry.Kind) {
327 return error(
"Malformed block");
337 return std::move(Err);
350 return std::move(Err);
363 switch (Entry.Kind) {
366 return error(
"Malformed block");
378 switch (MaybeRecord.
get()) {
383 return error(
"Invalid triple record");
402 switch (Entry.Kind) {
404 return error(
"Malformed block");
414 return std::move(Err);
421 return Skipped.takeError();
428class BitcodeReaderBase {
430 BitcodeReaderBase(BitstreamCursor Stream, StringRef Strtab)
431 : Stream(std::
move(Stream)), Strtab(Strtab) {
432 this->Stream.setBlockInfo(&BlockInfo);
435 BitstreamBlockInfo BlockInfo;
436 BitstreamCursor Stream;
441 bool UseStrtab =
false;
443 Expected<unsigned> parseVersionRecord(ArrayRef<uint64_t> Record);
448 std::pair<StringRef, ArrayRef<uint64_t>>
449 readNameFromStrtab(ArrayRef<uint64_t> Record);
451 Error readBlockInfo();
454 std::string ProducerIdentification;
461Error BitcodeReaderBase::error(
const Twine &Message) {
462 std::string FullMsg = Message.
str();
463 if (!ProducerIdentification.empty())
464 FullMsg +=
" (Producer: '" + ProducerIdentification +
"' Reader: 'LLVM " +
465 LLVM_VERSION_STRING
"')";
466 return ::error(FullMsg);
470BitcodeReaderBase::parseVersionRecord(ArrayRef<uint64_t> Record) {
472 return error(
"Invalid version record");
473 unsigned ModuleVersion =
Record[0];
474 if (ModuleVersion > 2)
475 return error(
"Invalid value");
476 UseStrtab = ModuleVersion >= 2;
477 return ModuleVersion;
480std::pair<StringRef, ArrayRef<uint64_t>>
481BitcodeReaderBase::readNameFromStrtab(ArrayRef<uint64_t> Record) {
485 if (Record[0] + Record[1] > Strtab.
size())
487 return {StringRef(Strtab.
data() + Record[0], Record[1]),
Record.slice(2)};
498class BitcodeConstant final :
public Value,
499 TrailingObjects<BitcodeConstant, unsigned> {
500 friend TrailingObjects;
503 static constexpr uint8_t SubclassID = 255;
511 static constexpr uint8_t ConstantStructOpcode = 255;
512 static constexpr uint8_t ConstantArrayOpcode = 254;
513 static constexpr uint8_t ConstantVectorOpcode = 253;
514 static constexpr uint8_t NoCFIOpcode = 252;
515 static constexpr uint8_t DSOLocalEquivalentOpcode = 251;
516 static constexpr uint8_t BlockAddressOpcode = 250;
517 static constexpr uint8_t ConstantPtrAuthOpcode = 249;
518 static constexpr uint8_t FirstSpecialOpcode = ConstantPtrAuthOpcode;
525 unsigned BlockAddressBB = 0;
526 Type *SrcElemTy =
nullptr;
527 std::optional<ConstantRange>
InRange;
529 ExtraInfo(uint8_t Opcode, uint8_t Flags = 0,
Type *SrcElemTy =
nullptr,
530 std::optional<ConstantRange>
InRange = std::nullopt)
531 : Opcode(Opcode),
Flags(
Flags), SrcElemTy(SrcElemTy),
534 ExtraInfo(uint8_t Opcode, uint8_t Flags,
unsigned BlockAddressBB)
535 : Opcode(Opcode),
Flags(
Flags), BlockAddressBB(BlockAddressBB) {}
540 unsigned NumOperands;
541 unsigned BlockAddressBB;
543 std::optional<ConstantRange>
InRange;
546 BitcodeConstant(
Type *Ty,
const ExtraInfo &Info, ArrayRef<unsigned> OpIDs)
548 NumOperands(OpIDs.
size()), BlockAddressBB(
Info.BlockAddressBB),
553 BitcodeConstant &operator=(
const BitcodeConstant &) =
delete;
557 const ExtraInfo &Info,
558 ArrayRef<unsigned> OpIDs) {
559 void *Mem =
A.Allocate(totalSizeToAlloc<unsigned>(OpIDs.
size()),
560 alignof(BitcodeConstant));
561 return new (Mem) BitcodeConstant(Ty, Info, OpIDs);
564 static bool classof(
const Value *V) {
return V->getValueID() == SubclassID; }
566 ArrayRef<unsigned> getOperandIDs()
const {
567 return ArrayRef(getTrailingObjects(), NumOperands);
570 std::optional<ConstantRange> getInRange()
const {
571 assert(Opcode == Instruction::GetElementPtr);
580class BitcodeReader :
public BitcodeReaderBase,
public GVMaterializer {
582 Module *TheModule =
nullptr;
584 uint64_t NextUnreadBit = 0;
586 uint64_t LastFunctionBlockBit = 0;
587 bool SeenValueSymbolTable =
false;
588 uint64_t VSTOffset = 0;
590 std::vector<std::string> SectionTable;
591 std::vector<std::string> GCTable;
593 std::vector<Type *> TypeList;
597 DenseMap<unsigned, SmallVector<unsigned, 1>> ContainedTypeIDs;
604 DenseMap<std::pair<Type *, unsigned>,
unsigned> VirtualTypeIDs;
605 DenseMap<Function *, unsigned> FunctionTypeIDs;
610 BitcodeReaderValueList ValueList;
611 std::optional<MetadataLoader> MDLoader;
612 std::vector<Comdat *> ComdatList;
613 DenseSet<GlobalObject *> ImplicitComdatObjects;
616 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInits;
617 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInits;
619 struct FunctionOperandInfo {
621 unsigned PersonalityFn;
625 std::vector<FunctionOperandInfo> FunctionOperands;
629 std::vector<AttributeList> MAttributes;
632 std::map<unsigned, AttributeList> MAttributeGroups;
636 std::vector<BasicBlock*> FunctionBBs;
640 std::vector<Function*> FunctionsWithBodies;
644 using UpdatedIntrinsicMap = DenseMap<Function *, Function *>;
645 UpdatedIntrinsicMap UpgradedIntrinsics;
650 bool SeenFirstFunctionBody =
false;
654 DenseMap<Function*, uint64_t> DeferredFunctionInfo;
659 std::vector<uint64_t> DeferredMetadataInfo;
664 DenseMap<Function *, std::vector<BasicBlock *>> BasicBlockFwdRefs;
665 std::deque<Function *> BasicBlockFwdRefQueue;
672 std::vector<Function *> BackwardRefFunctions;
680 bool UseRelativeIDs =
false;
684 bool WillMaterializeAllForwardRefs =
false;
688 bool SeenDebugIntrinsic =
false;
689 bool SeenDebugRecord =
false;
692 TBAAVerifier TBAAVerifyHelper;
694 std::vector<std::string> BundleTags;
697 std::optional<ValueTypeCallbackTy> ValueTypeCallback;
700 BitcodeReader(BitstreamCursor Stream, StringRef Strtab,
701 StringRef ProducerIdentification, LLVMContext &
Context);
703 Error materializeForwardReferencedFunctions();
705 Error materialize(GlobalValue *GV)
override;
706 Error materializeModule()
override;
707 std::vector<StructType *> getIdentifiedStructTypes()
const override;
711 Error parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
712 bool IsImporting, ParserCallbacks Callbacks = {});
714 static uint64_t decodeSignRotatedValue(uint64_t V);
717 Error materializeMetadata()
override;
719 void setStripDebugInfo()
override;
722 std::vector<StructType *> IdentifiedStructTypes;
723 StructType *createIdentifiedStructType(LLVMContext &
Context, StringRef Name);
724 StructType *createIdentifiedStructType(LLVMContext &
Context);
726 static constexpr unsigned InvalidTypeID = ~0
u;
728 Type *getTypeByID(
unsigned ID);
729 Type *getPtrElementTypeByID(
unsigned ID);
730 unsigned getContainedTypeID(
unsigned ID,
unsigned Idx = 0);
731 unsigned getVirtualTypeID(
Type *Ty, ArrayRef<unsigned> ContainedTypeIDs = {});
734 Expected<Value *> materializeValue(
unsigned ValID, BasicBlock *InsertBB);
735 Expected<Constant *> getValueForInitializer(
unsigned ID);
737 Value *getFnValueByID(
unsigned ID,
Type *Ty,
unsigned TyID,
738 BasicBlock *ConstExprInsertBB) {
745 return MDLoader->getMetadataFwdRefOrLoad(
ID);
749 if (
ID >= FunctionBBs.size())
return nullptr;
750 return FunctionBBs[
ID];
754 if (i-1 < MAttributes.size())
755 return MAttributes[i-1];
756 return AttributeList();
762 bool getValueTypePair(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
763 unsigned InstNum,
Value *&ResVal,
unsigned &
TypeID,
764 BasicBlock *ConstExprInsertBB) {
765 if (Slot ==
Record.size())
return true;
766 unsigned ValNo = (unsigned)Record[Slot++];
769 ValNo = InstNum - ValNo;
770 if (ValNo < InstNum) {
774 ResVal = getFnValueByID(ValNo,
nullptr,
TypeID, ConstExprInsertBB);
776 "Incorrect type ID stored for value");
777 return ResVal ==
nullptr;
779 if (Slot ==
Record.size())
782 TypeID = (unsigned)Record[Slot++];
783 ResVal = getFnValueByID(ValNo, getTypeByID(
TypeID),
TypeID,
785 return ResVal ==
nullptr;
788 bool getValueOrMetadata(
const SmallVectorImpl<uint64_t> &Record,
789 unsigned &Slot,
unsigned InstNum,
Value *&ResVal,
790 BasicBlock *ConstExprInsertBB) {
791 if (Slot ==
Record.size())
796 return getValueTypePair(Record, --Slot, InstNum, ResVal, TypeId,
799 if (Slot ==
Record.size())
801 unsigned ValNo = InstNum - (unsigned)Record[Slot++];
809 bool popValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
810 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
811 BasicBlock *ConstExprInsertBB) {
812 if (getValue(Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
820 bool getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
821 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
822 BasicBlock *ConstExprInsertBB) {
823 ResVal = getValue(Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
824 return ResVal ==
nullptr;
829 Value *getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
830 unsigned InstNum,
Type *Ty,
unsigned TyID,
831 BasicBlock *ConstExprInsertBB) {
832 if (Slot ==
Record.size())
return nullptr;
833 unsigned ValNo = (unsigned)Record[Slot];
836 ValNo = InstNum - ValNo;
837 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
841 Value *getValueSigned(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
842 unsigned InstNum,
Type *Ty,
unsigned TyID,
843 BasicBlock *ConstExprInsertBB) {
844 if (Slot ==
Record.size())
return nullptr;
845 unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]);
848 ValNo = InstNum - ValNo;
849 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
852 Expected<ConstantRange> readConstantRange(ArrayRef<uint64_t> Record,
855 if (
Record.size() - OpNum < 2)
856 return error(
"Too few records for range");
858 unsigned LowerActiveWords =
Record[OpNum];
859 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
860 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
861 return error(
"Too few records for range");
864 OpNum += LowerActiveWords;
867 OpNum += UpperActiveWords;
870 int64_t
Start = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
871 int64_t End = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
872 return ConstantRange(APInt(
BitWidth, Start,
true),
877 Expected<ConstantRange>
878 readBitWidthAndConstantRange(ArrayRef<uint64_t> Record,
unsigned &OpNum) {
879 if (
Record.size() - OpNum < 1)
880 return error(
"Too few records for range");
882 return readConstantRange(Record, OpNum,
BitWidth);
888 Error propagateAttributeTypes(CallBase *CB, ArrayRef<unsigned> ArgsTys);
893 Error parseAlignmentValue(uint64_t
Exponent, MaybeAlign &Alignment);
894 Error parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind);
896 ParserCallbacks Callbacks = {});
898 Error parseComdatRecord(ArrayRef<uint64_t> Record);
899 Error parseGlobalVarRecord(ArrayRef<uint64_t> Record);
900 Error parseFunctionRecord(ArrayRef<uint64_t> Record);
901 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
902 ArrayRef<uint64_t> Record);
904 Error parseAttributeBlock();
905 Error parseAttributeGroupBlock();
906 Error parseTypeTable();
907 Error parseTypeTableBody();
908 Error parseOperandBundleTags();
909 Error parseSyncScopeNames();
911 Expected<Value *> recordValue(SmallVectorImpl<uint64_t> &Record,
912 unsigned NameIndex, Triple &TT);
913 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta, Function *
F,
914 ArrayRef<uint64_t> Record);
916 Error parseGlobalValueSymbolTable();
917 Error parseConstants();
918 Error rememberAndSkipFunctionBodies();
919 Error rememberAndSkipFunctionBody();
921 Error rememberAndSkipMetadata();
923 Error parseFunctionBody(Function *
F);
924 Error globalCleanup();
925 Error resolveGlobalAndIndirectSymbolInits();
926 Error parseUseLists();
927 Error findFunctionInStream(
929 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator);
936class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
938 ModuleSummaryIndex &TheIndex;
942 bool SeenGlobalValSummary =
false;
945 bool SeenValueSymbolTable =
false;
949 uint64_t VSTOffset = 0;
959 DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
960 ValueIdToValueInfoMap;
966 DenseMap<uint64_t, StringRef> ModuleIdMap;
969 std::string SourceFileName;
973 StringRef ModulePath;
981 std::vector<uint64_t> StackIds;
985 std::vector<uint64_t> RadixArray;
990 std::vector<unsigned> StackIdToIndex;
993 ModuleSummaryIndexBitcodeReader(
994 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
995 StringRef ModulePath,
1001 void setValueGUID(uint64_t ValueID, StringRef
ValueName,
1003 StringRef SourceFileName);
1004 Error parseValueSymbolTable(
1006 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
1009 makeCallList(ArrayRef<uint64_t> Record,
bool IsOldProfileFormat,
1010 bool HasProfile,
bool HasRelBF);
1011 Error parseEntireSummary(
unsigned ID);
1012 Error parseModuleStringTable();
1013 void parseTypeIdCompatibleVtableSummaryRecord(ArrayRef<uint64_t> Record);
1014 void parseTypeIdCompatibleVtableInfo(ArrayRef<uint64_t> Record,
size_t &Slot,
1016 std::vector<FunctionSummary::ParamAccess>
1017 parseParamAccesses(ArrayRef<uint64_t> Record);
1018 SmallVector<unsigned> parseAllocInfoContext(ArrayRef<uint64_t> Record,
1021 template <
bool AllowNullValueInfo = false>
1022 std::pair<ValueInfo, GlobalValue::GUID>
1023 getValueInfoFromValueId(
unsigned ValueId);
1025 void addThisModule();
1041 return std::error_code();
1047 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1048 ValueList(this->Stream.SizeInBytes(),
1050 return materializeValue(
ValID, InsertBB);
1052 this->ProducerIdentification = std::string(ProducerIdentification);
1055Error BitcodeReader::materializeForwardReferencedFunctions() {
1056 if (WillMaterializeAllForwardRefs)
1060 WillMaterializeAllForwardRefs =
true;
1062 while (!BasicBlockFwdRefQueue.empty()) {
1063 Function *
F = BasicBlockFwdRefQueue.front();
1064 BasicBlockFwdRefQueue.pop_front();
1065 assert(
F &&
"Expected valid function");
1066 if (!BasicBlockFwdRefs.
count(
F))
1074 if (!
F->isMaterializable())
1075 return error(
"Never resolved function from blockaddress");
1078 if (
Error Err = materialize(
F))
1081 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1083 for (Function *
F : BackwardRefFunctions)
1084 if (
Error Err = materialize(
F))
1086 BackwardRefFunctions.clear();
1089 WillMaterializeAllForwardRefs =
false;
1154 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1155 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1156 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1157 Flags.NoInline = (RawFlags >> 4) & 0x1;
1158 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1159 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1160 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1161 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1162 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1178 bool NoRenameOnPromotion = ((RawFlags >> 11) & 1);
1179 RawFlags = RawFlags >> 4;
1180 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1184 bool Live = (RawFlags & 0x2) || Version < 3;
1185 bool Local = (RawFlags & 0x4);
1186 bool AutoHide = (RawFlags & 0x8);
1189 Live,
Local, AutoHide, IK,
1190 NoRenameOnPromotion);
1196 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1197 (RawFlags & 0x4) ?
true :
false,
1201static std::pair<CalleeInfo::HotnessType, bool>
1205 bool HasTailCall = (RawFlags & 0x8);
1206 return {Hotness, HasTailCall};
1211 bool &HasTailCall) {
1212 static constexpr unsigned RelBlockFreqBits = 28;
1213 static constexpr uint64_t RelBlockFreqMask = (1 << RelBlockFreqBits) - 1;
1214 RelBF = RawFlags & RelBlockFreqMask;
1215 HasTailCall = (RawFlags & (1 << RelBlockFreqBits));
1240 case 0:
return false;
1241 case 1:
return true;
1303 bool IsFP = Ty->isFPOrFPVectorTy();
1305 if (!IsFP && !Ty->isIntOrIntVectorTy())
1312 return IsFP ? Instruction::FNeg : -1;
1317 bool IsFP = Ty->isFPOrFPVectorTy();
1319 if (!IsFP && !Ty->isIntOrIntVectorTy())
1326 return IsFP ? Instruction::FAdd : Instruction::Add;
1328 return IsFP ? Instruction::FSub : Instruction::Sub;
1330 return IsFP ? Instruction::FMul : Instruction::Mul;
1332 return IsFP ? -1 : Instruction::UDiv;
1334 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1336 return IsFP ? -1 : Instruction::URem;
1338 return IsFP ? Instruction::FRem : Instruction::SRem;
1340 return IsFP ? -1 : Instruction::Shl;
1342 return IsFP ? -1 : Instruction::LShr;
1344 return IsFP ? -1 : Instruction::AShr;
1346 return IsFP ? -1 : Instruction::And;
1348 return IsFP ? -1 : Instruction::Or;
1350 return IsFP ? -1 : Instruction::Xor;
1447Type *BitcodeReader::getTypeByID(
unsigned ID) {
1449 if (
ID >= TypeList.size())
1452 if (
Type *Ty = TypeList[
ID])
1457 return TypeList[
ID] = createIdentifiedStructType(
Context);
1460unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1461 auto It = ContainedTypeIDs.
find(
ID);
1462 if (It == ContainedTypeIDs.
end())
1463 return InvalidTypeID;
1465 if (Idx >= It->second.size())
1466 return InvalidTypeID;
1468 return It->second[Idx];
1471Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1472 if (
ID >= TypeList.size())
1479 return getTypeByID(getContainedTypeID(
ID, 0));
1482unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1483 ArrayRef<unsigned> ChildTypeIDs) {
1484 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1485 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1486 auto It = VirtualTypeIDs.
find(CacheKey);
1487 if (It != VirtualTypeIDs.
end()) {
1493 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1494 "Incorrect cached contained type IDs");
1498 unsigned TypeID = TypeList.size();
1499 TypeList.push_back(Ty);
1500 if (!ChildTypeIDs.
empty())
1521 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1535 if (Opcode == Instruction::GetElementPtr)
1539 case Instruction::FNeg:
1540 case Instruction::Select:
1541 case Instruction::ICmp:
1542 case Instruction::FCmp:
1549Expected<Value *> BitcodeReader::materializeValue(
unsigned StartValID,
1550 BasicBlock *InsertBB) {
1552 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1554 return ValueList[StartValID];
1556 SmallDenseMap<unsigned, Value *> MaterializedValues;
1557 SmallVector<unsigned> Worklist;
1559 while (!Worklist.
empty()) {
1560 unsigned ValID = Worklist.
back();
1561 if (MaterializedValues.
count(ValID)) {
1567 if (ValID >= ValueList.
size() || !ValueList[ValID])
1568 return error(
"Invalid value ID");
1570 Value *
V = ValueList[ValID];
1573 MaterializedValues.
insert({ValID,
V});
1581 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1582 auto It = MaterializedValues.
find(OpID);
1583 if (It != MaterializedValues.
end())
1584 Ops.push_back(It->second);
1591 if (
Ops.size() != BC->getOperandIDs().size())
1593 std::reverse(
Ops.begin(),
Ops.end());
1610 switch (BC->Opcode) {
1611 case BitcodeConstant::ConstantPtrAuthOpcode: {
1614 return error(
"ptrauth key operand must be ConstantInt");
1618 return error(
"ptrauth disc operand must be ConstantInt");
1621 ConstOps.
size() > 4 ? ConstOps[4]
1626 "ptrauth deactivation symbol operand must be a pointer");
1629 DeactivationSymbol);
1632 case BitcodeConstant::NoCFIOpcode: {
1635 return error(
"no_cfi operand must be GlobalValue");
1639 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1642 return error(
"dso_local operand must be GlobalValue");
1646 case BitcodeConstant::BlockAddressOpcode: {
1649 return error(
"blockaddress operand must be a function");
1654 unsigned BBID = BC->BlockAddressBB;
1657 return error(
"Invalid ID");
1660 for (
size_t I = 0,
E = BBID;
I !=
E; ++
I) {
1662 return error(
"Invalid ID");
1669 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1671 BasicBlockFwdRefQueue.push_back(Fn);
1672 if (FwdBBs.size() < BBID + 1)
1673 FwdBBs.resize(BBID + 1);
1681 case BitcodeConstant::ConstantStructOpcode: {
1683 if (
ST->getNumElements() != ConstOps.
size())
1684 return error(
"Invalid number of elements in struct initializer");
1686 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1687 if (
Op->getType() != Ty)
1688 return error(
"Incorrect type in struct initializer");
1693 case BitcodeConstant::ConstantArrayOpcode: {
1695 if (AT->getNumElements() != ConstOps.
size())
1696 return error(
"Invalid number of elements in array initializer");
1698 for (Constant *
Op : ConstOps)
1699 if (
Op->getType() != AT->getElementType())
1700 return error(
"Incorrect type in array initializer");
1705 case BitcodeConstant::ConstantVectorOpcode: {
1707 if (VT->getNumElements() != ConstOps.size())
1708 return error(
"Invalid number of elements in vector initializer");
1710 for (Constant *
Op : ConstOps)
1711 if (
Op->getType() != VT->getElementType())
1712 return error(
"Incorrect type in vector initializer");
1717 case Instruction::GetElementPtr:
1719 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1722 case Instruction::ExtractElement:
1725 case Instruction::InsertElement:
1729 case Instruction::ShuffleVector: {
1730 SmallVector<int, 16>
Mask;
1742 MaterializedValues.
insert({ValID,
C});
1748 return error(Twine(
"Value referenced by initializer is an unsupported "
1749 "constant expression of type ") +
1750 BC->getOpcodeName());
1756 BC->getType(),
"constexpr", InsertBB);
1759 "constexpr", InsertBB);
1762 Ops[1],
"constexpr", InsertBB);
1765 I->setHasNoSignedWrap();
1767 I->setHasNoUnsignedWrap();
1773 switch (BC->Opcode) {
1774 case BitcodeConstant::ConstantVectorOpcode: {
1775 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1778 Value *Idx = ConstantInt::get(IdxTy, Pair.index());
1785 case BitcodeConstant::ConstantStructOpcode:
1786 case BitcodeConstant::ConstantArrayOpcode: {
1790 "constexpr.ins", InsertBB);
1794 case Instruction::ICmp:
1795 case Instruction::FCmp:
1798 "constexpr", InsertBB);
1800 case Instruction::GetElementPtr:
1806 case Instruction::Select:
1809 case Instruction::ExtractElement:
1812 case Instruction::InsertElement:
1816 case Instruction::ShuffleVector:
1817 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1825 MaterializedValues.
insert({ValID,
I});
1829 return MaterializedValues[StartValID];
1832Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1833 Expected<Value *> MaybeV = materializeValue(
ID,
nullptr);
1841StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1844 IdentifiedStructTypes.push_back(Ret);
1848StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1850 IdentifiedStructTypes.push_back(Ret);
1866 case Attribute::ZExt:
return 1 << 0;
1867 case Attribute::SExt:
return 1 << 1;
1868 case Attribute::NoReturn:
return 1 << 2;
1869 case Attribute::InReg:
return 1 << 3;
1870 case Attribute::StructRet:
return 1 << 4;
1871 case Attribute::NoUnwind:
return 1 << 5;
1872 case Attribute::NoAlias:
return 1 << 6;
1873 case Attribute::ByVal:
return 1 << 7;
1874 case Attribute::Nest:
return 1 << 8;
1875 case Attribute::ReadNone:
return 1 << 9;
1876 case Attribute::ReadOnly:
return 1 << 10;
1877 case Attribute::NoInline:
return 1 << 11;
1878 case Attribute::AlwaysInline:
return 1 << 12;
1879 case Attribute::OptimizeForSize:
return 1 << 13;
1880 case Attribute::StackProtect:
return 1 << 14;
1881 case Attribute::StackProtectReq:
return 1 << 15;
1882 case Attribute::Alignment:
return 31 << 16;
1884 case Attribute::NoRedZone:
return 1 << 22;
1885 case Attribute::NoImplicitFloat:
return 1 << 23;
1886 case Attribute::Naked:
return 1 << 24;
1887 case Attribute::InlineHint:
return 1 << 25;
1888 case Attribute::StackAlignment:
return 7 << 26;
1889 case Attribute::ReturnsTwice:
return 1 << 29;
1890 case Attribute::UWTable:
return 1 << 30;
1891 case Attribute::NonLazyBind:
return 1U << 31;
1892 case Attribute::SanitizeAddress:
return 1ULL << 32;
1893 case Attribute::MinSize:
return 1ULL << 33;
1894 case Attribute::NoDuplicate:
return 1ULL << 34;
1895 case Attribute::StackProtectStrong:
return 1ULL << 35;
1896 case Attribute::SanitizeThread:
return 1ULL << 36;
1897 case Attribute::SanitizeMemory:
return 1ULL << 37;
1898 case Attribute::NoBuiltin:
return 1ULL << 38;
1899 case Attribute::Returned:
return 1ULL << 39;
1900 case Attribute::Cold:
return 1ULL << 40;
1901 case Attribute::Builtin:
return 1ULL << 41;
1902 case Attribute::OptimizeNone:
return 1ULL << 42;
1903 case Attribute::InAlloca:
return 1ULL << 43;
1904 case Attribute::NonNull:
return 1ULL << 44;
1905 case Attribute::JumpTable:
return 1ULL << 45;
1906 case Attribute::Convergent:
return 1ULL << 46;
1907 case Attribute::SafeStack:
return 1ULL << 47;
1908 case Attribute::NoRecurse:
return 1ULL << 48;
1911 case Attribute::SwiftSelf:
return 1ULL << 51;
1912 case Attribute::SwiftError:
return 1ULL << 52;
1913 case Attribute::WriteOnly:
return 1ULL << 53;
1914 case Attribute::Speculatable:
return 1ULL << 54;
1915 case Attribute::StrictFP:
return 1ULL << 55;
1916 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1917 case Attribute::NoCfCheck:
return 1ULL << 57;
1918 case Attribute::OptForFuzzing:
return 1ULL << 58;
1919 case Attribute::ShadowCallStack:
return 1ULL << 59;
1920 case Attribute::SpeculativeLoadHardening:
1922 case Attribute::ImmArg:
1924 case Attribute::WillReturn:
1926 case Attribute::NoFree:
1942 if (
I == Attribute::Alignment)
1943 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1944 else if (
I == Attribute::StackAlignment)
1945 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1947 B.addTypeAttr(
I,
nullptr);
1961 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
1963 "Alignment must be a power of two.");
1966 B.addAlignmentAttr(Alignment);
1968 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
1969 (EncodedAttrs & 0xffff);
1971 if (AttrIdx == AttributeList::FunctionIndex) {
1974 if (Attrs & (1ULL << 9)) {
1976 Attrs &= ~(1ULL << 9);
1979 if (Attrs & (1ULL << 10)) {
1981 Attrs &= ~(1ULL << 10);
1984 if (Attrs & (1ULL << 49)) {
1986 Attrs &= ~(1ULL << 49);
1989 if (Attrs & (1ULL << 50)) {
1991 Attrs &= ~(1ULL << 50);
1994 if (Attrs & (1ULL << 53)) {
1996 Attrs &= ~(1ULL << 53);
2000 B.addMemoryAttr(ME);
2004 if (Attrs & (1ULL << 21)) {
2005 Attrs &= ~(1ULL << 21);
2012Error BitcodeReader::parseAttributeBlock() {
2016 if (!MAttributes.empty())
2017 return error(
"Invalid multiple blocks");
2019 SmallVector<uint64_t, 64>
Record;
2025 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2028 BitstreamEntry
Entry = MaybeEntry.
get();
2030 switch (
Entry.Kind) {
2033 return error(
"Malformed block");
2043 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
2046 switch (MaybeRecord.
get()) {
2052 return error(
"Invalid parameter attribute record");
2054 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2060 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2064 for (uint64_t Val : Record)
2065 Attrs.push_back(MAttributeGroups[Val]);
2067 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2080 return Attribute::Alignment;
2082 return Attribute::AlwaysInline;
2084 return Attribute::Builtin;
2086 return Attribute::ByVal;
2088 return Attribute::InAlloca;
2090 return Attribute::Cold;
2092 return Attribute::Convergent;
2094 return Attribute::DisableSanitizerInstrumentation;
2096 return Attribute::ElementType;
2098 return Attribute::FnRetThunkExtern;
2100 return Attribute::InlineHint;
2102 return Attribute::InReg;
2104 return Attribute::JumpTable;
2106 return Attribute::Memory;
2108 return Attribute::NoFPClass;
2110 return Attribute::MinSize;
2112 return Attribute::Naked;
2114 return Attribute::Nest;
2116 return Attribute::NoAlias;
2118 return Attribute::NoBuiltin;
2120 return Attribute::NoCallback;
2122 return Attribute::NoDivergenceSource;
2124 return Attribute::NoDuplicate;
2126 return Attribute::NoFree;
2128 return Attribute::NoImplicitFloat;
2130 return Attribute::NoInline;
2132 return Attribute::NoRecurse;
2134 return Attribute::NoMerge;
2136 return Attribute::NonLazyBind;
2138 return Attribute::NonNull;
2140 return Attribute::Dereferenceable;
2142 return Attribute::DereferenceableOrNull;
2144 return Attribute::AllocAlign;
2146 return Attribute::AllocKind;
2148 return Attribute::AllocSize;
2150 return Attribute::AllocatedPointer;
2152 return Attribute::NoRedZone;
2154 return Attribute::NoReturn;
2156 return Attribute::NoSync;
2158 return Attribute::NoCfCheck;
2160 return Attribute::NoProfile;
2162 return Attribute::SkipProfile;
2164 return Attribute::NoUnwind;
2166 return Attribute::NoSanitizeBounds;
2168 return Attribute::NoSanitizeCoverage;
2170 return Attribute::NullPointerIsValid;
2172 return Attribute::OptimizeForDebugging;
2174 return Attribute::OptForFuzzing;
2176 return Attribute::OptimizeForSize;
2178 return Attribute::OptimizeNone;
2180 return Attribute::ReadNone;
2182 return Attribute::ReadOnly;
2184 return Attribute::Returned;
2186 return Attribute::ReturnsTwice;
2188 return Attribute::SExt;
2190 return Attribute::Speculatable;
2192 return Attribute::StackAlignment;
2194 return Attribute::StackProtect;
2196 return Attribute::StackProtectReq;
2198 return Attribute::StackProtectStrong;
2200 return Attribute::SafeStack;
2202 return Attribute::ShadowCallStack;
2204 return Attribute::StrictFP;
2206 return Attribute::StructRet;
2208 return Attribute::SanitizeAddress;
2210 return Attribute::SanitizeHWAddress;
2212 return Attribute::SanitizeThread;
2214 return Attribute::SanitizeType;
2216 return Attribute::SanitizeMemory;
2218 return Attribute::SanitizeNumericalStability;
2220 return Attribute::SanitizeRealtime;
2222 return Attribute::SanitizeRealtimeBlocking;
2224 return Attribute::SanitizeAllocToken;
2226 return Attribute::SpeculativeLoadHardening;
2228 return Attribute::SwiftError;
2230 return Attribute::SwiftSelf;
2232 return Attribute::SwiftAsync;
2234 return Attribute::UWTable;
2236 return Attribute::VScaleRange;
2238 return Attribute::WillReturn;
2240 return Attribute::WriteOnly;
2242 return Attribute::ZExt;
2244 return Attribute::ImmArg;
2246 return Attribute::SanitizeMemTag;
2248 return Attribute::Preallocated;
2250 return Attribute::NoUndef;
2252 return Attribute::ByRef;
2254 return Attribute::MustProgress;
2256 return Attribute::Hot;
2258 return Attribute::PresplitCoroutine;
2260 return Attribute::Writable;
2262 return Attribute::CoroDestroyOnlyWhenComplete;
2264 return Attribute::DeadOnUnwind;
2266 return Attribute::Range;
2268 return Attribute::Initializes;
2270 return Attribute::CoroElideSafe;
2272 return Attribute::NoExt;
2274 return Attribute::Captures;
2276 return Attribute::DeadOnReturn;
2278 return Attribute::NoCreateUndefOrPoison;
2280 return Attribute::DenormalFPEnv;
2282 return Attribute::NoOutline;
2287 MaybeAlign &Alignment) {
2290 if (
Exponent > Value::MaxAlignmentExponent + 1)
2291 return error(
"Invalid alignment value");
2296Error BitcodeReader::parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind) {
2298 if (*Kind == Attribute::None)
2299 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2304 switch (EncodedKind) {
2328Error BitcodeReader::parseAttributeGroupBlock() {
2332 if (!MAttributeGroups.empty())
2333 return error(
"Invalid multiple blocks");
2335 SmallVector<uint64_t, 64>
Record;
2339 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2342 BitstreamEntry
Entry = MaybeEntry.
get();
2344 switch (
Entry.Kind) {
2347 return error(
"Malformed block");
2357 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
2360 switch (MaybeRecord.
get()) {
2365 return error(
"Invalid grp record");
2367 uint64_t GrpID =
Record[0];
2368 uint64_t Idx =
Record[1];
2372 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2373 if (Record[i] == 0) {
2374 Attribute::AttrKind
Kind;
2375 uint64_t EncodedKind =
Record[++i];
2376 if (Idx == AttributeList::FunctionIndex &&
2385 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2391 if (Kind == Attribute::ByVal)
2392 B.addByValAttr(
nullptr);
2393 else if (Kind == Attribute::StructRet)
2394 B.addStructRetAttr(
nullptr);
2395 else if (Kind == Attribute::InAlloca)
2396 B.addInAllocaAttr(
nullptr);
2397 else if (Kind == Attribute::UWTable)
2398 B.addUWTableAttr(UWTableKind::Default);
2399 else if (Kind == Attribute::DeadOnReturn)
2400 B.addDeadOnReturnAttr(DeadOnReturnInfo());
2401 else if (Attribute::isEnumAttrKind(Kind))
2402 B.addAttribute(Kind);
2404 return error(
"Not an enum attribute");
2405 }
else if (Record[i] == 1) {
2406 Attribute::AttrKind
Kind;
2407 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2409 if (!Attribute::isIntAttrKind(Kind))
2410 return error(
"Not an int attribute");
2411 if (Kind == Attribute::Alignment)
2412 B.addAlignmentAttr(Record[++i]);
2413 else if (Kind == Attribute::StackAlignment)
2414 B.addStackAlignmentAttr(Record[++i]);
2415 else if (Kind == Attribute::Dereferenceable)
2416 B.addDereferenceableAttr(Record[++i]);
2417 else if (Kind == Attribute::DereferenceableOrNull)
2418 B.addDereferenceableOrNullAttr(Record[++i]);
2419 else if (Kind == Attribute::DeadOnReturn)
2420 B.addDeadOnReturnAttr(
2422 else if (Kind == Attribute::AllocSize)
2423 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2424 else if (Kind == Attribute::VScaleRange)
2425 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2426 else if (Kind == Attribute::UWTable)
2428 else if (Kind == Attribute::AllocKind)
2429 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2430 else if (Kind == Attribute::Memory) {
2431 uint64_t EncodedME =
Record[++i];
2432 const uint8_t
Version = (EncodedME >> 56);
2444 B.addMemoryAttr(ME);
2449 EncodedME & 0x00FFFFFFFFFFFFFFULL));
2451 }
else if (Kind == Attribute::Captures)
2453 else if (Kind == Attribute::NoFPClass)
2456 else if (Kind == Attribute::DenormalFPEnv) {
2457 B.addDenormalFPEnvAttr(
2460 }
else if (Record[i] == 3 || Record[i] == 4) {
2462 SmallString<64> KindStr;
2463 SmallString<64> ValStr;
2465 while (Record[i] != 0 && i != e)
2467 assert(Record[i] == 0 &&
"Kind string not null terminated");
2472 while (Record[i] != 0 && i != e)
2474 assert(Record[i] == 0 &&
"Value string not null terminated");
2477 B.addAttribute(KindStr.
str(), ValStr.
str());
2478 }
else if (Record[i] == 5 || Record[i] == 6) {
2479 bool HasType =
Record[i] == 6;
2480 Attribute::AttrKind
Kind;
2481 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2483 if (!Attribute::isTypeAttrKind(Kind))
2484 return error(
"Not a type attribute");
2486 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2487 }
else if (Record[i] == 7) {
2488 Attribute::AttrKind
Kind;
2491 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2493 if (!Attribute::isConstantRangeAttrKind(Kind))
2494 return error(
"Not a ConstantRange attribute");
2496 Expected<ConstantRange> MaybeCR =
2497 readBitWidthAndConstantRange(Record, i);
2502 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2503 }
else if (Record[i] == 8) {
2504 Attribute::AttrKind
Kind;
2507 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2509 if (!Attribute::isConstantRangeListAttrKind(Kind))
2510 return error(
"Not a constant range list attribute");
2514 return error(
"Too few records for constant range list");
2515 unsigned RangeSize =
Record[i++];
2517 for (
unsigned Idx = 0; Idx < RangeSize; ++Idx) {
2518 Expected<ConstantRange> MaybeCR =
2519 readConstantRange(Record, i,
BitWidth);
2527 return error(
"Invalid (unordered or overlapping) range list");
2528 B.addConstantRangeListAttr(Kind, Val);
2530 return error(
"Invalid attribute group entry");
2535 B.addMemoryAttr(ME);
2538 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2545Error BitcodeReader::parseTypeTable() {
2549 return parseTypeTableBody();
2552Error BitcodeReader::parseTypeTableBody() {
2553 if (!TypeList.empty())
2554 return error(
"Invalid multiple blocks");
2556 SmallVector<uint64_t, 64>
Record;
2557 unsigned NumRecords = 0;
2563 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2566 BitstreamEntry
Entry = MaybeEntry.
get();
2568 switch (
Entry.Kind) {
2571 return error(
"Malformed block");
2573 if (NumRecords != TypeList.size())
2574 return error(
"Malformed block");
2583 Type *ResultTy =
nullptr;
2584 SmallVector<unsigned> ContainedIDs;
2585 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
2588 switch (MaybeRecord.
get()) {
2590 return error(
"Invalid value");
2595 return error(
"Invalid numentry record");
2596 TypeList.resize(Record[0]);
2599 ResultTy = Type::getVoidTy(
Context);
2602 ResultTy = Type::getHalfTy(
Context);
2605 ResultTy = Type::getBFloatTy(
Context);
2608 ResultTy = Type::getFloatTy(
Context);
2611 ResultTy = Type::getDoubleTy(
Context);
2614 ResultTy = Type::getX86_FP80Ty(
Context);
2617 ResultTy = Type::getFP128Ty(
Context);
2620 ResultTy = Type::getPPC_FP128Ty(
Context);
2623 ResultTy = Type::getLabelTy(
Context);
2626 ResultTy = Type::getMetadataTy(
Context);
2634 ResultTy = Type::getX86_AMXTy(
Context);
2637 ResultTy = Type::getTokenTy(
Context);
2641 return error(
"Invalid integer record");
2643 uint64_t NumBits =
Record[0];
2646 return error(
"Bitwidth for integer type out of range");
2653 return error(
"Invalid pointer record");
2657 ResultTy = getTypeByID(Record[0]);
2659 !PointerType::isValidElementType(ResultTy))
2660 return error(
"Invalid type");
2667 return error(
"Invalid opaque pointer record");
2676 return error(
"Invalid function record");
2678 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2679 if (
Type *
T = getTypeByID(Record[i]))
2685 ResultTy = getTypeByID(Record[2]);
2686 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2687 return error(
"Invalid type");
2690 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2696 return error(
"Invalid function record");
2698 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2699 if (
Type *
T = getTypeByID(Record[i])) {
2700 if (!FunctionType::isValidArgumentType(
T))
2701 return error(
"Invalid function argument type");
2708 ResultTy = getTypeByID(Record[1]);
2709 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2710 return error(
"Invalid type");
2713 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2718 return error(
"Invalid anon struct record");
2720 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2721 if (
Type *
T = getTypeByID(Record[i]))
2727 return error(
"Invalid type");
2734 return error(
"Invalid struct name record");
2739 return error(
"Invalid named struct record");
2741 if (NumRecords >= TypeList.size())
2742 return error(
"Invalid TYPE table");
2748 TypeList[NumRecords] =
nullptr;
2750 Res = createIdentifiedStructType(
Context, TypeName);
2754 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2755 if (
Type *
T = getTypeByID(Record[i]))
2761 return error(
"Invalid named struct record");
2770 return error(
"Invalid opaque type record");
2772 if (NumRecords >= TypeList.size())
2773 return error(
"Invalid TYPE table");
2779 TypeList[NumRecords] =
nullptr;
2781 Res = createIdentifiedStructType(
Context, TypeName);
2788 return error(
"Invalid target extension type record");
2790 if (NumRecords >= TypeList.size())
2791 return error(
"Invalid TYPE table");
2793 if (Record[0] >=
Record.size())
2794 return error(
"Too many type parameters");
2796 unsigned NumTys =
Record[0];
2798 SmallVector<unsigned, 8> IntParams;
2799 for (
unsigned i = 0; i < NumTys; i++) {
2800 if (
Type *
T = getTypeByID(Record[i + 1]))
2803 return error(
"Invalid type");
2806 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2807 if (Record[i] > UINT_MAX)
2808 return error(
"Integer parameter too large");
2813 if (
auto E = TTy.takeError())
2821 return error(
"Invalid array type record");
2822 ResultTy = getTypeByID(Record[1]);
2823 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2824 return error(
"Invalid type");
2826 ResultTy = ArrayType::get(ResultTy, Record[0]);
2831 return error(
"Invalid vector type record");
2833 return error(
"Invalid vector length");
2834 ResultTy = getTypeByID(Record[1]);
2835 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2836 return error(
"Invalid type");
2839 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2843 if (NumRecords >= TypeList.size())
2844 return error(
"Invalid TYPE table");
2845 if (TypeList[NumRecords])
2847 "Invalid TYPE table: Only named structs can be forward referenced");
2848 assert(ResultTy &&
"Didn't read a type?");
2849 TypeList[NumRecords] = ResultTy;
2850 if (!ContainedIDs.
empty())
2851 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2856Error BitcodeReader::parseOperandBundleTags() {
2860 if (!BundleTags.empty())
2861 return error(
"Invalid multiple blocks");
2863 SmallVector<uint64_t, 64>
Record;
2866 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2869 BitstreamEntry
Entry = MaybeEntry.
get();
2871 switch (
Entry.Kind) {
2874 return error(
"Malformed block");
2884 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
2888 return error(
"Invalid operand bundle record");
2891 BundleTags.emplace_back();
2893 return error(
"Invalid operand bundle record");
2898Error BitcodeReader::parseSyncScopeNames() {
2903 return error(
"Invalid multiple synchronization scope names blocks");
2905 SmallVector<uint64_t, 64>
Record;
2907 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2910 BitstreamEntry
Entry = MaybeEntry.
get();
2912 switch (
Entry.Kind) {
2915 return error(
"Malformed block");
2918 return error(
"Invalid empty synchronization scope names block");
2928 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
2932 return error(
"Invalid sync scope record");
2934 SmallString<16> SSN;
2936 return error(
"Invalid sync scope record");
2944Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
2945 unsigned NameIndex, Triple &TT) {
2948 return error(
"Invalid record");
2949 unsigned ValueID =
Record[0];
2950 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2951 return error(
"Invalid record");
2952 Value *
V = ValueList[ValueID];
2955 if (NameStr.contains(0))
2956 return error(
"Invalid value name");
2957 V->setName(NameStr);
2959 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
2972 return std::move(JumpFailed);
2978 return error(
"Expected value symbol table subblock");
2982void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
2984 ArrayRef<uint64_t> Record) {
2988 uint64_t FuncWordOffset =
Record[1] - 1;
2989 uint64_t FuncBitOffset = FuncWordOffset * 32;
2990 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
2994 if (FuncBitOffset > LastFunctionBlockBit)
2995 LastFunctionBlockBit = FuncBitOffset;
2999Error BitcodeReader::parseGlobalValueSymbolTable() {
3000 unsigned FuncBitcodeOffsetDelta =
3006 SmallVector<uint64_t, 64>
Record;
3008 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
3011 BitstreamEntry
Entry = MaybeEntry.
get();
3013 switch (
Entry.Kind) {
3016 return error(
"Malformed block");
3024 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
3027 switch (MaybeRecord.
get()) {
3029 unsigned ValueID =
Record[0];
3030 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3031 return error(
"Invalid value reference in symbol table");
3032 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3042Error BitcodeReader::parseValueSymbolTable(uint64_t
Offset) {
3043 uint64_t CurrentBit;
3049 if (!MaybeCurrentBit)
3051 CurrentBit = MaybeCurrentBit.
get();
3054 if (
Error Err = parseGlobalValueSymbolTable())
3056 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
3075 unsigned FuncBitcodeOffsetDelta =
3081 SmallVector<uint64_t, 64>
Record;
3089 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
3092 BitstreamEntry
Entry = MaybeEntry.
get();
3094 switch (
Entry.Kind) {
3097 return error(
"Malformed block");
3100 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
3110 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
3113 switch (MaybeRecord.
get()) {
3117 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3125 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3133 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3138 return error(
"Invalid bbentry record");
3141 return error(
"Invalid bbentry record");
3153uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {
3163Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3164 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3165 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3166 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3168 GlobalInitWorklist.swap(GlobalInits);
3169 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3170 FunctionOperandWorklist.swap(FunctionOperands);
3172 while (!GlobalInitWorklist.empty()) {
3173 unsigned ValID = GlobalInitWorklist.back().second;
3174 if (ValID >= ValueList.
size()) {
3176 GlobalInits.push_back(GlobalInitWorklist.back());
3178 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3181 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3183 GlobalInitWorklist.pop_back();
3186 while (!IndirectSymbolInitWorklist.empty()) {
3187 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3188 if (ValID >= ValueList.
size()) {
3189 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3191 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3195 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3198 return error(
"Alias and aliasee types don't match");
3203 return error(
"Expected an alias or an ifunc");
3206 IndirectSymbolInitWorklist.pop_back();
3209 while (!FunctionOperandWorklist.empty()) {
3210 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3211 if (
Info.PersonalityFn) {
3212 unsigned ValID =
Info.PersonalityFn - 1;
3213 if (ValID < ValueList.
size()) {
3214 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3217 Info.F->setPersonalityFn(MaybeC.
get());
3218 Info.PersonalityFn = 0;
3222 unsigned ValID =
Info.Prefix - 1;
3223 if (ValID < ValueList.
size()) {
3224 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3227 Info.F->setPrefixData(MaybeC.
get());
3231 if (
Info.Prologue) {
3232 unsigned ValID =
Info.Prologue - 1;
3233 if (ValID < ValueList.
size()) {
3234 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3237 Info.F->setPrologueData(MaybeC.
get());
3241 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3242 FunctionOperands.push_back(Info);
3243 FunctionOperandWorklist.pop_back();
3252 BitcodeReader::decodeSignRotatedValue);
3254 return APInt(TypeBits, Words);
3257Error BitcodeReader::parseConstants() {
3265 unsigned Int32TyID = getVirtualTypeID(CurTy);
3266 unsigned CurTyID = Int32TyID;
3267 Type *CurElemTy =
nullptr;
3268 unsigned NextCstNo = ValueList.
size();
3276 switch (Entry.Kind) {
3279 return error(
"Malformed block");
3281 if (NextCstNo != ValueList.
size())
3282 return error(
"Invalid constant reference");
3293 Expected<unsigned> MaybeBitCode = Stream.readRecord(
Entry.ID, Record);
3296 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3306 return error(
"Invalid settype record");
3307 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3308 return error(
"Invalid settype record");
3309 if (TypeList[Record[0]] == VoidType)
3310 return error(
"Invalid constant type");
3312 CurTy = TypeList[CurTyID];
3313 CurElemTy = getPtrElementTypeByID(CurTyID);
3317 return error(
"Invalid type for a constant null value");
3320 return error(
"Invalid type for a constant null value");
3325 return error(
"Invalid integer const record");
3330 return error(
"Invalid wide integer const record");
3333 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3334 V = ConstantInt::get(CurTy, VInt);
3339 return error(
"Invalid float const record");
3342 if (ScalarTy->isHalfTy())
3343 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3344 APInt(16, (uint16_t)Record[0])));
3345 else if (ScalarTy->isBFloatTy())
3346 V = ConstantFP::get(
3347 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3348 else if (ScalarTy->isFloatTy())
3349 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3350 APInt(32, (uint32_t)Record[0])));
3351 else if (ScalarTy->isDoubleTy())
3352 V = ConstantFP::get(
3353 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3354 else if (ScalarTy->isX86_FP80Ty()) {
3356 uint64_t Rearrange[2];
3357 Rearrange[0] = (
Record[1] & 0xffffLL) | (Record[0] << 16);
3358 Rearrange[1] =
Record[0] >> 48;
3359 V = ConstantFP::get(
3360 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3361 }
else if (ScalarTy->isFP128Ty())
3362 V = ConstantFP::get(CurTy,
3363 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3364 else if (ScalarTy->isPPC_FP128Ty())
3365 V = ConstantFP::get(
3366 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3374 return error(
"Invalid aggregate record");
3376 SmallVector<unsigned, 16> Elts;
3380 V = BitcodeConstant::create(
3381 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3383 V = BitcodeConstant::create(
Alloc, CurTy,
3384 BitcodeConstant::ConstantArrayOpcode, Elts);
3386 V = BitcodeConstant::create(
3387 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3396 return error(
"Invalid string record");
3405 return error(
"Invalid data record");
3409 EltTy =
Array->getElementType();
3419 SmallVector<uint16_t, 16> Elts(
Record.begin(),
Record.end());
3425 SmallVector<uint32_t, 16> Elts(
Record.begin(),
Record.end());
3431 SmallVector<uint64_t, 16> Elts(
Record.begin(),
Record.end());
3437 SmallVector<uint16_t, 16> Elts(
Record.begin(),
Record.end());
3443 SmallVector<uint16_t, 16> Elts(
Record.begin(),
Record.end());
3449 SmallVector<uint32_t, 16> Elts(
Record.begin(),
Record.end());
3455 SmallVector<uint64_t, 16> Elts(
Record.begin(),
Record.end());
3461 return error(
"Invalid type for value");
3467 return error(
"Invalid unary op constexpr record");
3472 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3478 return error(
"Invalid binary op constexpr record");
3484 if (
Record.size() >= 4) {
3485 if (
Opc == Instruction::Add ||
3486 Opc == Instruction::Sub ||
3487 Opc == Instruction::Mul ||
3488 Opc == Instruction::Shl) {
3493 }
else if (
Opc == Instruction::SDiv ||
3494 Opc == Instruction::UDiv ||
3495 Opc == Instruction::LShr ||
3496 Opc == Instruction::AShr) {
3501 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3502 {(unsigned)Record[1], (
unsigned)
Record[2]});
3508 return error(
"Invalid cast constexpr record");
3513 unsigned OpTyID =
Record[1];
3514 Type *OpTy = getTypeByID(OpTyID);
3516 return error(
"Invalid cast constexpr record");
3517 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3529 return error(
"Constant GEP record must have at least two elements");
3531 Type *PointeeType =
nullptr;
3535 PointeeType = getTypeByID(Record[OpNum++]);
3538 std::optional<ConstantRange>
InRange;
3542 unsigned InRangeIndex =
Op >> 1;
3548 Expected<ConstantRange> MaybeInRange =
3549 readBitWidthAndConstantRange(Record, OpNum);
3558 SmallVector<unsigned, 16> Elts;
3559 unsigned BaseTypeID =
Record[OpNum];
3560 while (OpNum !=
Record.size()) {
3561 unsigned ElTyID =
Record[OpNum++];
3562 Type *ElTy = getTypeByID(ElTyID);
3564 return error(
"Invalid getelementptr constexpr record");
3568 if (Elts.
size() < 1)
3569 return error(
"Invalid gep with no operands");
3573 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3574 BaseType = getTypeByID(BaseTypeID);
3579 return error(
"GEP base operand must be pointer or vector of pointer");
3582 PointeeType = getPtrElementTypeByID(BaseTypeID);
3584 return error(
"Missing element type for old-style constant GEP");
3587 V = BitcodeConstant::create(
3589 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3595 return error(
"Invalid select constexpr record");
3597 V = BitcodeConstant::create(
3598 Alloc, CurTy, Instruction::Select,
3599 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3605 return error(
"Invalid extractelement constexpr record");
3606 unsigned OpTyID =
Record[0];
3610 return error(
"Invalid extractelement constexpr record");
3612 if (
Record.size() == 4) {
3613 unsigned IdxTyID =
Record[2];
3614 Type *IdxTy = getTypeByID(IdxTyID);
3616 return error(
"Invalid extractelement constexpr record");
3622 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3623 {(unsigned)Record[1], IdxRecord});
3629 if (
Record.size() < 3 || !OpTy)
3630 return error(
"Invalid insertelement constexpr record");
3632 if (
Record.size() == 4) {
3633 unsigned IdxTyID =
Record[2];
3634 Type *IdxTy = getTypeByID(IdxTyID);
3636 return error(
"Invalid insertelement constexpr record");
3642 V = BitcodeConstant::create(
3643 Alloc, CurTy, Instruction::InsertElement,
3644 {(unsigned)Record[0], (
unsigned)
Record[1], IdxRecord});
3649 if (
Record.size() < 3 || !OpTy)
3650 return error(
"Invalid shufflevector constexpr record");
3651 V = BitcodeConstant::create(
3652 Alloc, CurTy, Instruction::ShuffleVector,
3653 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3660 if (
Record.size() < 4 || !RTy || !OpTy)
3661 return error(
"Invalid shufflevector constexpr record");
3662 V = BitcodeConstant::create(
3663 Alloc, CurTy, Instruction::ShuffleVector,
3664 {(unsigned)Record[1], (
unsigned)
Record[2], (unsigned)Record[3]});
3669 return error(
"Invalid cmp constexpt record");
3670 unsigned OpTyID =
Record[0];
3671 Type *OpTy = getTypeByID(OpTyID);
3673 return error(
"Invalid cmp constexpr record");
3674 V = BitcodeConstant::create(
3677 : Instruction::ICmp),
3678 (uint8_t)Record[3]},
3679 {(unsigned)Record[1], (
unsigned)
Record[2]});
3686 return error(
"Invalid inlineasm record");
3687 std::string AsmStr, ConstrStr;
3688 bool HasSideEffects =
Record[0] & 1;
3689 bool IsAlignStack =
Record[0] >> 1;
3690 unsigned AsmStrSize =
Record[1];
3691 if (2+AsmStrSize >=
Record.size())
3692 return error(
"Invalid inlineasm record");
3693 unsigned ConstStrSize =
Record[2+AsmStrSize];
3694 if (3+AsmStrSize+ConstStrSize >
Record.size())
3695 return error(
"Invalid inlineasm record");
3697 for (
unsigned i = 0; i != AsmStrSize; ++i)
3698 AsmStr += (
char)
Record[2+i];
3699 for (
unsigned i = 0; i != ConstStrSize; ++i)
3700 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3703 return error(
"Missing element type for old-style inlineasm");
3705 HasSideEffects, IsAlignStack);
3712 return error(
"Invalid inlineasm record");
3713 std::string AsmStr, ConstrStr;
3714 bool HasSideEffects =
Record[0] & 1;
3715 bool IsAlignStack = (
Record[0] >> 1) & 1;
3716 unsigned AsmDialect =
Record[0] >> 2;
3717 unsigned AsmStrSize =
Record[1];
3718 if (2+AsmStrSize >=
Record.size())
3719 return error(
"Invalid inlineasm record");
3720 unsigned ConstStrSize =
Record[2+AsmStrSize];
3721 if (3+AsmStrSize+ConstStrSize >
Record.size())
3722 return error(
"Invalid inlineasm record");
3724 for (
unsigned i = 0; i != AsmStrSize; ++i)
3725 AsmStr += (
char)
Record[2+i];
3726 for (
unsigned i = 0; i != ConstStrSize; ++i)
3727 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3730 return error(
"Missing element type for old-style inlineasm");
3732 HasSideEffects, IsAlignStack,
3739 return error(
"Invalid inlineasm record");
3741 std::string AsmStr, ConstrStr;
3742 bool HasSideEffects =
Record[OpNum] & 1;
3743 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3744 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3745 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3747 unsigned AsmStrSize =
Record[OpNum];
3749 if (OpNum + AsmStrSize >=
Record.size())
3750 return error(
"Invalid inlineasm record");
3751 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3752 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3753 return error(
"Invalid inlineasm record");
3755 for (
unsigned i = 0; i != AsmStrSize; ++i)
3756 AsmStr += (
char)
Record[OpNum + i];
3758 for (
unsigned i = 0; i != ConstStrSize; ++i)
3759 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3762 return error(
"Missing element type for old-style inlineasm");
3764 HasSideEffects, IsAlignStack,
3771 return error(
"Invalid inlineasm record");
3776 return error(
"Invalid inlineasm record");
3777 std::string AsmStr, ConstrStr;
3778 bool HasSideEffects =
Record[OpNum] & 1;
3779 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3780 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3781 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3783 unsigned AsmStrSize =
Record[OpNum];
3785 if (OpNum + AsmStrSize >=
Record.size())
3786 return error(
"Invalid inlineasm record");
3787 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3788 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3789 return error(
"Invalid inlineasm record");
3791 for (
unsigned i = 0; i != AsmStrSize; ++i)
3792 AsmStr += (
char)
Record[OpNum + i];
3794 for (
unsigned i = 0; i != ConstStrSize; ++i)
3795 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3797 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3803 return error(
"Invalid blockaddress record");
3804 unsigned FnTyID =
Record[0];
3805 Type *FnTy = getTypeByID(FnTyID);
3807 return error(
"Invalid blockaddress record");
3808 V = BitcodeConstant::create(
3810 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3816 return error(
"Invalid dso_local record");
3817 unsigned GVTyID =
Record[0];
3818 Type *GVTy = getTypeByID(GVTyID);
3820 return error(
"Invalid dso_local record");
3821 V = BitcodeConstant::create(
3822 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3827 return error(
"Invalid no_cfi record");
3828 unsigned GVTyID =
Record[0];
3829 Type *GVTy = getTypeByID(GVTyID);
3831 return error(
"Invalid no_cfi record");
3832 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3838 return error(
"Invalid ptrauth record");
3840 V = BitcodeConstant::create(
Alloc, CurTy,
3841 BitcodeConstant::ConstantPtrAuthOpcode,
3842 {(unsigned)Record[0], (
unsigned)
Record[1],
3843 (unsigned)Record[2], (
unsigned)
Record[3]});
3848 return error(
"Invalid ptrauth record");
3850 V = BitcodeConstant::create(
3851 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3852 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2],
3853 (
unsigned)
Record[3], (unsigned)Record[4]});
3858 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3865Error BitcodeReader::parseUseLists() {
3870 SmallVector<uint64_t, 64>
Record;
3873 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
3876 BitstreamEntry
Entry = MaybeEntry.
get();
3878 switch (
Entry.Kind) {
3881 return error(
"Malformed block");
3892 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
3895 switch (MaybeRecord.
get()) {
3903 if (RecordLength < 3)
3905 return error(
"Invalid uselist record");
3906 unsigned ID =
Record.pop_back_val();
3910 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3911 V = FunctionBBs[
ID];
3915 if (!
V->hasUseList())
3918 unsigned NumUses = 0;
3919 SmallDenseMap<const Use *, unsigned, 16> Order;
3920 for (
const Use &U :
V->materialized_uses()) {
3921 if (++NumUses >
Record.size())
3923 Order[&
U] =
Record[NumUses - 1];
3930 V->sortUseList([&](
const Use &L,
const Use &R) {
3941Error BitcodeReader::rememberAndSkipMetadata() {
3943 uint64_t CurBit = Stream.GetCurrentBitNo();
3944 DeferredMetadataInfo.push_back(CurBit);
3947 if (
Error Err = Stream.SkipBlock())
3952Error BitcodeReader::materializeMetadata() {
3953 for (uint64_t BitPos : DeferredMetadataInfo) {
3955 if (
Error JumpFailed = Stream.JumpToBit(BitPos))
3957 if (
Error Err = MDLoader->parseModuleMetadata())
3966 NamedMDNode *LinkerOpts =
3968 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
3973 DeferredMetadataInfo.clear();
3977void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
3981Error BitcodeReader::rememberAndSkipFunctionBody() {
3983 if (FunctionsWithBodies.empty())
3984 return error(
"Insufficient function protos");
3986 Function *Fn = FunctionsWithBodies.back();
3987 FunctionsWithBodies.pop_back();
3990 uint64_t CurBit = Stream.GetCurrentBitNo();
3992 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
3993 "Mismatch between VST and scanned function offsets");
3994 DeferredFunctionInfo[Fn] = CurBit;
3997 if (
Error Err = Stream.SkipBlock())
4002Error BitcodeReader::globalCleanup() {
4004 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4006 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
4007 return error(
"Malformed global initializer set");
4011 for (Function &
F : *TheModule) {
4012 MDLoader->upgradeDebugIntrinsics(
F);
4015 UpgradedIntrinsics[&
F] = NewFn;
4021 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4022 for (GlobalVariable &GV : TheModule->globals())
4024 UpgradedVariables.emplace_back(&GV, Upgraded);
4025 for (
auto &Pair : UpgradedVariables) {
4026 Pair.first->eraseFromParent();
4027 TheModule->insertGlobalVariable(Pair.second);
4032 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4033 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4041Error BitcodeReader::rememberAndSkipFunctionBodies() {
4042 if (
Error JumpFailed = Stream.JumpToBit(NextUnreadBit))
4045 if (Stream.AtEndOfStream())
4046 return error(
"Could not find function in stream");
4048 if (!SeenFirstFunctionBody)
4049 return error(
"Trying to materialize functions before seeing function blocks");
4053 assert(SeenValueSymbolTable);
4056 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4059 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4061 switch (
Entry.Kind) {
4063 return error(
"Expect SubBlock");
4067 return error(
"Expect function block");
4069 if (
Error Err = rememberAndSkipFunctionBody())
4071 NextUnreadBit = Stream.GetCurrentBitNo();
4078Error BitcodeReaderBase::readBlockInfo() {
4079 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4081 if (!MaybeNewBlockInfo)
4083 std::optional<BitstreamBlockInfo> NewBlockInfo =
4084 std::move(MaybeNewBlockInfo.
get());
4086 return error(
"Malformed block");
4087 BlockInfo = std::move(*NewBlockInfo);
4091Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4095 std::tie(Name, Record) = readNameFromStrtab(Record);
4098 return error(
"Invalid comdat record");
4100 std::string OldFormatName;
4103 return error(
"Invalid comdat record");
4104 unsigned ComdatNameSize =
Record[1];
4105 if (ComdatNameSize >
Record.size() - 2)
4106 return error(
"Comdat name size too large");
4107 OldFormatName.reserve(ComdatNameSize);
4108 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4109 OldFormatName += (
char)
Record[2 + i];
4110 Name = OldFormatName;
4112 Comdat *
C = TheModule->getOrInsertComdat(Name);
4113 C->setSelectionKind(SK);
4114 ComdatList.push_back(
C);
4128 Meta.NoAddress =
true;
4130 Meta.NoHWAddress =
true;
4134 Meta.IsDynInit =
true;
4138Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4146 std::tie(Name, Record) = readNameFromStrtab(Record);
4149 return error(
"Invalid global variable record");
4150 unsigned TyID =
Record[0];
4151 Type *Ty = getTypeByID(TyID);
4153 return error(
"Invalid global variable record");
4155 bool explicitType =
Record[1] & 2;
4161 return error(
"Invalid type for value");
4163 TyID = getContainedTypeID(TyID);
4164 Ty = getTypeByID(TyID);
4166 return error(
"Missing element type for old-style global");
4169 uint64_t RawLinkage =
Record[3];
4171 MaybeAlign Alignment;
4172 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4176 if (Record[5] - 1 >= SectionTable.size())
4177 return error(
"Invalid ID");
4186 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4194 bool ExternallyInitialized =
false;
4196 ExternallyInitialized =
Record[9];
4198 GlobalVariable *NewGV =
4208 if (
Record.size() > 10) {
4220 if (
unsigned InitID = Record[2])
4221 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4223 if (
Record.size() > 11) {
4224 if (
unsigned ComdatID = Record[11]) {
4225 if (ComdatID > ComdatList.size())
4226 return error(
"Invalid global variable comdat ID");
4227 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4230 ImplicitComdatObjects.
insert(NewGV);
4233 if (
Record.size() > 12) {
4238 if (
Record.size() > 13) {
4245 NewGV->
setPartition(StringRef(Strtab.data() + Record[14], Record[15]));
4247 if (
Record.size() > 16 && Record[16]) {
4248 llvm::GlobalValue::SanitizerMetadata
Meta =
4253 if (
Record.size() > 17 && Record[17]) {
4257 return error(
"Invalid global variable code model");
4263void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4264 if (ValueTypeCallback) {
4265 (*ValueTypeCallback)(
4266 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4267 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4271Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4277 std::tie(Name, Record) = readNameFromStrtab(Record);
4280 return error(
"Invalid function record");
4281 unsigned FTyID =
Record[0];
4282 Type *FTy = getTypeByID(FTyID);
4284 return error(
"Invalid function record");
4286 FTyID = getContainedTypeID(FTyID, 0);
4287 FTy = getTypeByID(FTyID);
4289 return error(
"Missing element type for old-style function");
4293 return error(
"Invalid type for value");
4294 auto CC =
static_cast<CallingConv::ID
>(
Record[1]);
4295 if (CC & ~CallingConv::MaxID)
4296 return error(
"Invalid calling convention ID");
4298 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4304 AddrSpace, Name, TheModule);
4307 "Incorrect fully specified type provided for function");
4308 FunctionTypeIDs[
Func] = FTyID;
4310 Func->setCallingConv(CC);
4311 bool isProto =
Record[2];
4312 uint64_t RawLinkage =
Record[3];
4315 callValueTypeCallback(Func, FTyID);
4320 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4321 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4322 Attribute::InAlloca}) {
4323 if (!
Func->hasParamAttribute(i, Kind))
4326 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4329 Func->removeParamAttr(i, Kind);
4331 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4332 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4334 return error(
"Missing param element type for attribute upgrade");
4338 case Attribute::ByVal:
4339 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4341 case Attribute::StructRet:
4342 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4344 case Attribute::InAlloca:
4345 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4351 Func->addParamAttr(i, NewAttr);
4355 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4356 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4357 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4358 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4360 return error(
"Missing param element type for x86_intrcc upgrade");
4362 Func->addParamAttr(0, NewAttr);
4365 MaybeAlign Alignment;
4366 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4369 Func->setAlignment(*Alignment);
4371 if (Record[6] - 1 >= SectionTable.size())
4372 return error(
"Invalid ID");
4373 Func->setSection(SectionTable[Record[6] - 1]);
4377 if (!
Func->hasLocalLinkage())
4379 if (
Record.size() > 8 && Record[8]) {
4380 if (Record[8] - 1 >= GCTable.size())
4381 return error(
"Invalid ID");
4382 Func->setGC(GCTable[Record[8] - 1]);
4387 Func->setUnnamedAddr(UnnamedAddr);
4389 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4391 OperandInfo.Prologue =
Record[10];
4393 if (
Record.size() > 11) {
4395 if (!
Func->hasLocalLinkage()) {
4402 if (
Record.size() > 12) {
4403 if (
unsigned ComdatID = Record[12]) {
4404 if (ComdatID > ComdatList.size())
4405 return error(
"Invalid function comdat ID");
4406 Func->setComdat(ComdatList[ComdatID - 1]);
4409 ImplicitComdatObjects.
insert(Func);
4413 OperandInfo.Prefix =
Record[13];
4416 OperandInfo.PersonalityFn =
Record[14];
4418 if (
Record.size() > 15) {
4427 if (
Record.size() > 18 && Strtab.data() &&
4428 Record[17] + Record[18] <= Strtab.size()) {
4429 Func->setPartition(StringRef(Strtab.data() + Record[17], Record[18]));
4432 if (
Record.size() > 19) {
4433 MaybeAlign PrefAlignment;
4434 if (
Error Err = parseAlignmentValue(Record[19], PrefAlignment))
4436 Func->setPreferredAlignment(PrefAlignment);
4439 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4441 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4442 FunctionOperands.push_back(OperandInfo);
4447 Func->setIsMaterializable(
true);
4448 FunctionsWithBodies.push_back(Func);
4449 DeferredFunctionInfo[
Func] = 0;
4454Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4455 unsigned BitCode, ArrayRef<uint64_t> Record) {
4465 std::tie(Name, Record) = readNameFromStrtab(Record);
4468 if (
Record.size() < (3 + (
unsigned)NewRecord))
4469 return error(
"Invalid global indirect symbol record");
4474 return error(
"Invalid global indirect symbol record");
4480 return error(
"Invalid type for value");
4481 AddrSpace = PTy->getAddressSpace();
4483 Ty = getTypeByID(
TypeID);
4485 return error(
"Missing element type for old-style indirect symbol");
4487 AddrSpace =
Record[OpNum++];
4490 auto Val =
Record[OpNum++];
4499 nullptr, TheModule);
4503 if (OpNum !=
Record.size()) {
4504 auto VisInd = OpNum++;
4510 if (OpNum !=
Record.size()) {
4511 auto S =
Record[OpNum++];
4518 if (OpNum !=
Record.size())
4520 if (OpNum !=
Record.size())
4523 if (OpNum !=
Record.size())
4528 if (OpNum + 1 <
Record.size()) {
4530 if (Record[OpNum] + Record[OpNum + 1] > Strtab.size())
4531 return error(
"Malformed partition, too large.");
4533 StringRef(Strtab.data() + Record[OpNum], Record[OpNum + 1]));
4537 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4541Error BitcodeReader::parseModule(uint64_t ResumeBit,
4542 bool ShouldLazyLoadMetadata,
4543 ParserCallbacks Callbacks) {
4544 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4546 if (
Error JumpFailed = Stream.JumpToBit(ResumeBit))
4551 SmallVector<uint64_t, 64>
Record;
4555 bool ResolvedDataLayout =
false;
4560 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4562 auto ResolveDataLayout = [&]() ->
Error {
4563 if (ResolvedDataLayout)
4567 ResolvedDataLayout =
true;
4571 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4575 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4576 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4577 TentativeDataLayoutStr = *LayoutOverride;
4585 TheModule->setDataLayout(MaybeDL.
get());
4591 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4594 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4596 switch (
Entry.Kind) {
4598 return error(
"Malformed block");
4600 if (
Error Err = ResolveDataLayout())
4602 return globalCleanup();
4607 if (
Error Err = Stream.SkipBlock())
4611 if (
Error Err = readBlockInfo())
4615 if (
Error Err = parseAttributeBlock())
4619 if (
Error Err = parseAttributeGroupBlock())
4623 if (
Error Err = parseTypeTable())
4627 if (!SeenValueSymbolTable) {
4633 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4634 if (
Error Err = parseValueSymbolTable())
4636 SeenValueSymbolTable =
true;
4641 if (
Error Err = Stream.SkipBlock())
4646 if (
Error Err = parseConstants())
4648 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4652 if (ShouldLazyLoadMetadata) {
4653 if (
Error Err = rememberAndSkipMetadata())
4657 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4658 if (
Error Err = MDLoader->parseModuleMetadata())
4662 if (
Error Err = MDLoader->parseMetadataKinds())
4666 if (
Error Err = ResolveDataLayout())
4671 if (!SeenFirstFunctionBody) {
4672 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4673 if (
Error Err = globalCleanup())
4675 SeenFirstFunctionBody =
true;
4678 if (VSTOffset > 0) {
4682 if (!SeenValueSymbolTable) {
4683 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4685 SeenValueSymbolTable =
true;
4697 if (
Error Err = Stream.SkipBlock())
4707 if (
Error Err = rememberAndSkipFunctionBody())
4714 if (SeenValueSymbolTable) {
4715 NextUnreadBit = Stream.GetCurrentBitNo();
4718 return globalCleanup();
4722 if (
Error Err = parseUseLists())
4726 if (
Error Err = parseOperandBundleTags())
4730 if (
Error Err = parseSyncScopeNames())
4742 Expected<unsigned> MaybeBitCode = Stream.readRecord(
Entry.ID, Record);
4745 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4748 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4751 UseRelativeIDs = *VersionOrErr >= 1;
4755 if (ResolvedDataLayout)
4756 return error(
"target triple too late in module");
4759 return error(
"Invalid triple record");
4760 TheModule->setTargetTriple(Triple(std::move(S)));
4764 if (ResolvedDataLayout)
4765 return error(
"datalayout too late in module");
4767 return error(
"Invalid data layout record");
4773 return error(
"Invalid asm record");
4774 TheModule->setModuleInlineAsm(S);
4781 return error(
"Invalid deplib record");
4788 return error(
"Invalid section name record");
4789 SectionTable.push_back(S);
4795 return error(
"Invalid gcname record");
4796 GCTable.push_back(S);
4800 if (
Error Err = parseComdatRecord(Record))
4809 if (
Error Err = parseGlobalVarRecord(Record))
4813 if (
Error Err = ResolveDataLayout())
4815 if (
Error Err = parseFunctionRecord(Record))
4821 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4827 return error(
"Invalid vstoffset record");
4831 VSTOffset =
Record[0] - 1;
4837 return error(
"Invalid source filename record");
4838 TheModule->setSourceFileName(
ValueName);
4843 this->ValueTypeCallback = std::nullopt;
4847Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4849 ParserCallbacks Callbacks) {
4851 MetadataLoaderCallbacks MDCallbacks;
4852 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4854 return getContainedTypeID(
I, J);
4857 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4858 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4861Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4863 return error(
"Load/Store operand is not a pointer type");
4864 if (!PointerType::isLoadableOrStorableType(ValType))
4865 return error(
"Cannot load/store from pointer");
4869Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4870 ArrayRef<unsigned> ArgTyIDs) {
4872 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4873 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4874 Attribute::InAlloca}) {
4875 if (!
Attrs.hasParamAttr(i, Kind) ||
4876 Attrs.getParamAttr(i, Kind).getValueAsType())
4879 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4881 return error(
"Missing element type for typed attribute upgrade");
4885 case Attribute::ByVal:
4886 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4888 case Attribute::StructRet:
4889 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4891 case Attribute::InAlloca:
4892 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4905 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
4909 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
4910 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4912 return error(
"Missing element type for inline asm upgrade");
4915 Attribute::get(
Context, Attribute::ElementType, ElemTy));
4923 case Intrinsic::preserve_array_access_index:
4924 case Intrinsic::preserve_struct_access_index:
4925 case Intrinsic::aarch64_ldaxr:
4926 case Intrinsic::aarch64_ldxr:
4927 case Intrinsic::aarch64_stlxr:
4928 case Intrinsic::aarch64_stxr:
4929 case Intrinsic::arm_ldaex:
4930 case Intrinsic::arm_ldrex:
4931 case Intrinsic::arm_stlex:
4932 case Intrinsic::arm_strex: {
4935 case Intrinsic::aarch64_stlxr:
4936 case Intrinsic::aarch64_stxr:
4937 case Intrinsic::arm_stlex:
4938 case Intrinsic::arm_strex:
4945 if (!
Attrs.getParamElementType(ArgNo)) {
4946 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4948 return error(
"Missing element type for elementtype upgrade");
4963Error BitcodeReader::parseFunctionBody(Function *
F) {
4968 if (MDLoader->hasFwdRefs())
4969 return error(
"Invalid function metadata: incoming forward references");
4971 InstructionList.
clear();
4972 unsigned ModuleValueListSize = ValueList.
size();
4973 unsigned ModuleMDLoaderSize = MDLoader->size();
4977 unsigned FTyID = FunctionTypeIDs[
F];
4978 for (Argument &
I :
F->args()) {
4979 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
4980 assert(
I.getType() == getTypeByID(ArgTyID) &&
4981 "Incorrect fully specified type for Function Argument");
4985 unsigned NextValueNo = ValueList.
size();
4987 unsigned CurBBNo = 0;
4992 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
4996 auto getLastInstruction = [&]() -> Instruction * {
4997 if (CurBB && !CurBB->
empty())
4998 return &CurBB->
back();
4999 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
5000 !FunctionBBs[CurBBNo - 1]->
empty())
5001 return &FunctionBBs[CurBBNo - 1]->back();
5005 std::vector<OperandBundleDef> OperandBundles;
5008 SmallVector<uint64_t, 64>
Record;
5011 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
5014 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
5016 switch (
Entry.Kind) {
5018 return error(
"Malformed block");
5020 goto OutOfRecordLoop;
5025 if (
Error Err = Stream.SkipBlock())
5029 if (
Error Err = parseConstants())
5031 NextValueNo = ValueList.
size();
5034 if (
Error Err = parseValueSymbolTable())
5038 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5042 assert(DeferredMetadataInfo.empty() &&
5043 "Must read all module-level metadata before function-level");
5044 if (
Error Err = MDLoader->parseFunctionMetadata())
5048 if (
Error Err = parseUseLists())
5062 unsigned ResTypeID = InvalidTypeID;
5063 Expected<unsigned> MaybeBitCode = Stream.readRecord(
Entry.ID, Record);
5066 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5068 return error(
"Invalid value");
5070 if (
Record.empty() || Record[0] == 0)
5071 return error(
"Invalid declareblocks record");
5073 FunctionBBs.resize(Record[0]);
5076 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5077 if (BBFRI == BasicBlockFwdRefs.
end()) {
5078 for (BasicBlock *&BB : FunctionBBs)
5081 auto &BBRefs = BBFRI->second;
5083 if (BBRefs.size() > FunctionBBs.size())
5084 return error(
"Invalid ID");
5085 assert(!BBRefs.empty() &&
"Unexpected empty array");
5086 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5087 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5089 if (
I < RE && BBRefs[
I]) {
5090 BBRefs[
I]->insertInto(
F);
5091 FunctionBBs[
I] = BBRefs[
I];
5097 BasicBlockFwdRefs.
erase(BBFRI);
5100 CurBB = FunctionBBs[0];
5107 return error(
"Invalid blockaddr users record");
5121 for (uint64_t ValID : Record)
5123 BackwardRefFunctions.push_back(
F);
5125 return error(
"Invalid blockaddr users record");
5132 I = getLastInstruction();
5135 return error(
"Invalid debug_loc_again record");
5136 I->setDebugLoc(LastLoc);
5141 I = getLastInstruction();
5143 return error(
"Invalid debug loc record");
5148 uint64_t AtomGroup =
Record.size() == 7 ?
Record[5] : 0;
5151 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5154 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5156 return error(
"Invalid debug loc record");
5160 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5162 return error(
"Invalid debug loc record");
5165 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5166 isImplicitCode, AtomGroup, AtomRank);
5167 I->setDebugLoc(LastLoc);
5175 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5177 return error(
"Invalid unary operator record");
5181 return error(
"Invalid unary operator record");
5185 if (OpNum <
Record.size()) {
5189 I->setFastMathFlags(FMF);
5198 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5202 return error(
"Invalid binary operator record");
5206 return error(
"Invalid binary operator record");
5210 if (OpNum <
Record.size()) {
5211 if (
Opc == Instruction::Add ||
5212 Opc == Instruction::Sub ||
5213 Opc == Instruction::Mul ||
5214 Opc == Instruction::Shl) {
5219 }
else if (
Opc == Instruction::SDiv ||
5220 Opc == Instruction::UDiv ||
5221 Opc == Instruction::LShr ||
5222 Opc == Instruction::AShr) {
5225 }
else if (
Opc == Instruction::Or) {
5231 I->setFastMathFlags(FMF);
5240 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5241 OpNum + 1 >
Record.size())
5242 return error(
"Invalid cast record");
5244 ResTypeID =
Record[OpNum++];
5245 Type *ResTy = getTypeByID(ResTypeID);
5248 if (
Opc == -1 || !ResTy)
5249 return error(
"Invalid cast record");
5254 assert(CurBB &&
"No current BB?");
5260 return error(
"Invalid cast");
5264 if (OpNum <
Record.size()) {
5265 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5268 }
else if (
Opc == Instruction::Trunc) {
5277 I->setFastMathFlags(FMF);
5296 Ty = getTypeByID(TyID);
5300 TyID = InvalidTypeID;
5305 unsigned BasePtrTypeID;
5306 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5308 return error(
"Invalid gep record");
5311 TyID = getContainedTypeID(BasePtrTypeID);
5312 if (
BasePtr->getType()->isVectorTy())
5313 TyID = getContainedTypeID(TyID);
5314 Ty = getTypeByID(TyID);
5317 SmallVector<Value*, 16> GEPIdx;
5318 while (OpNum !=
Record.size()) {
5321 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5322 return error(
"Invalid gep record");
5333 unsigned SubType = 0;
5334 if (GTI.isStruct()) {
5336 Idx->getType()->isVectorTy()
5338 :
cast<ConstantInt>(Idx);
5341 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5348 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5349 if (
I->getType()->isVectorTy())
5350 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5353 GEP->setNoWrapFlags(NW);
5362 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5363 return error(
"Invalid extractvalue record");
5366 unsigned RecSize =
Record.size();
5367 if (OpNum == RecSize)
5368 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5370 SmallVector<unsigned, 4> EXTRACTVALIdx;
5371 ResTypeID = AggTypeID;
5372 for (; OpNum != RecSize; ++OpNum) {
5377 if (!IsStruct && !IsArray)
5378 return error(
"EXTRACTVAL: Invalid type");
5379 if ((
unsigned)Index != Index)
5380 return error(
"Invalid value");
5382 return error(
"EXTRACTVAL: Invalid struct index");
5384 return error(
"EXTRACTVAL: Invalid array index");
5385 EXTRACTVALIdx.
push_back((
unsigned)Index);
5389 ResTypeID = getContainedTypeID(ResTypeID, Index);
5392 ResTypeID = getContainedTypeID(ResTypeID);
5406 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5407 return error(
"Invalid insertvalue record");
5410 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5411 return error(
"Invalid insertvalue record");
5413 unsigned RecSize =
Record.size();
5414 if (OpNum == RecSize)
5415 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5417 SmallVector<unsigned, 4> INSERTVALIdx;
5419 for (; OpNum != RecSize; ++OpNum) {
5424 if (!IsStruct && !IsArray)
5425 return error(
"INSERTVAL: Invalid type");
5426 if ((
unsigned)Index != Index)
5427 return error(
"Invalid value");
5429 return error(
"INSERTVAL: Invalid struct index");
5431 return error(
"INSERTVAL: Invalid array index");
5433 INSERTVALIdx.
push_back((
unsigned)Index);
5441 return error(
"Inserted value type doesn't match aggregate type");
5444 ResTypeID = AggTypeID;
5456 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5458 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5460 popValue(Record, OpNum, NextValueNo, CondType,
5461 getVirtualTypeID(CondType),
Cond, CurBB))
5462 return error(
"Invalid select record");
5475 unsigned ValTypeID, CondTypeID;
5476 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5478 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5480 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5481 return error(
"Invalid vector select record");
5484 if (VectorType* vector_type =
5487 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5488 return error(
"Invalid type for value");
5492 return error(
"Invalid type for value");
5496 ResTypeID = ValTypeID;
5501 I->setFastMathFlags(FMF);
5509 unsigned VecTypeID, IdxTypeID;
5510 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5511 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5512 return error(
"Invalid extractelement record");
5514 return error(
"Invalid type for value");
5516 ResTypeID = getContainedTypeID(VecTypeID);
5523 Value *Vec, *Elt, *Idx;
5524 unsigned VecTypeID, IdxTypeID;
5525 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5526 return error(
"Invalid insertelement record");
5528 return error(
"Invalid type for value");
5529 if (popValue(Record, OpNum, NextValueNo,
5531 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5532 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5533 return error(
"Invalid insert element record");
5535 ResTypeID = VecTypeID;
5543 unsigned Vec1TypeID;
5544 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5546 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5548 return error(
"Invalid shufflevector record");
5550 unsigned MaskTypeID;
5551 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5552 return error(
"Invalid shufflevector record");
5554 return error(
"Invalid type for value");
5556 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5558 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5573 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5574 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5576 return error(
"Invalid comparison record");
5578 if (OpNum >=
Record.size())
5580 "Invalid record: operand number exceeded available operands");
5585 if (IsFP &&
Record.size() > OpNum+1)
5590 return error(
"Invalid fcmp predicate");
5591 I =
new FCmpInst(PredVal,
LHS,
RHS);
5594 return error(
"Invalid icmp predicate");
5595 I =
new ICmpInst(PredVal,
LHS,
RHS);
5596 if (
Record.size() > OpNum + 1 &&
5601 if (OpNum + 1 !=
Record.size())
5602 return error(
"Invalid comparison record");
5604 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5606 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5609 I->setFastMathFlags(FMF);
5626 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5627 return error(
"Invalid ret record");
5628 if (OpNum !=
Record.size())
5629 return error(
"Invalid ret record");
5637 return error(
"Invalid br record");
5638 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5640 return error(
"Invalid br record");
5642 if (
Record.size() == 1) {
5647 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5649 Value *
Cond = getValue(Record, 2, NextValueNo, CondType,
5650 getVirtualTypeID(CondType), CurBB);
5651 if (!FalseDest || !
Cond)
5652 return error(
"Invalid br record");
5660 return error(
"Invalid cleanupret record");
5663 Value *CleanupPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5664 getVirtualTypeID(TokenTy), CurBB);
5666 return error(
"Invalid cleanupret record");
5668 if (
Record.size() == 2) {
5669 UnwindDest = getBasicBlock(Record[Idx++]);
5671 return error(
"Invalid cleanupret record");
5680 return error(
"Invalid catchret record");
5683 Value *CatchPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5684 getVirtualTypeID(TokenTy), CurBB);
5686 return error(
"Invalid catchret record");
5687 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5689 return error(
"Invalid catchret record");
5698 return error(
"Invalid catchswitch record");
5703 Value *ParentPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5704 getVirtualTypeID(TokenTy), CurBB);
5706 return error(
"Invalid catchswitch record");
5708 unsigned NumHandlers =
Record[Idx++];
5711 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5712 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5714 return error(
"Invalid catchswitch record");
5719 if (Idx + 1 ==
Record.size()) {
5720 UnwindDest = getBasicBlock(Record[Idx++]);
5722 return error(
"Invalid catchswitch record");
5725 if (
Record.size() != Idx)
5726 return error(
"Invalid catchswitch record");
5730 for (BasicBlock *Handler : Handlers)
5731 CatchSwitch->addHandler(Handler);
5733 ResTypeID = getVirtualTypeID(
I->getType());
5741 return error(
"Invalid catchpad/cleanuppad record");
5746 Value *ParentPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5747 getVirtualTypeID(TokenTy), CurBB);
5749 return error(
"Invalid catchpad/cleanuppad record");
5751 unsigned NumArgOperands =
Record[Idx++];
5753 SmallVector<Value *, 2>
Args;
5754 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5757 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5758 return error(
"Invalid catchpad/cleanuppad record");
5759 Args.push_back(Val);
5762 if (
Record.size() != Idx)
5763 return error(
"Invalid catchpad/cleanuppad record");
5769 ResTypeID = getVirtualTypeID(
I->getType());
5775 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5781 unsigned OpTyID =
Record[1];
5782 Type *OpTy = getTypeByID(OpTyID);
5785 Value *
Cond = getValue(Record, 2, NextValueNo, OpTy, OpTyID, CurBB);
5788 return error(
"Invalid switch record");
5790 unsigned NumCases =
Record[4];
5795 unsigned CurIdx = 5;
5796 for (
unsigned i = 0; i != NumCases; ++i) {
5798 unsigned NumItems =
Record[CurIdx++];
5799 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5800 bool isSingleNumber =
Record[CurIdx++];
5803 unsigned ActiveWords = 1;
5804 if (ValueBitWidth > 64)
5805 ActiveWords =
Record[CurIdx++];
5808 CurIdx += ActiveWords;
5810 if (!isSingleNumber) {
5812 if (ValueBitWidth > 64)
5813 ActiveWords =
Record[CurIdx++];
5816 CurIdx += ActiveWords;
5827 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5828 for (ConstantInt *Cst : CaseVals)
5829 SI->addCase(Cst, DestBB);
5838 return error(
"Invalid switch record");
5839 unsigned OpTyID =
Record[0];
5840 Type *OpTy = getTypeByID(OpTyID);
5841 Value *
Cond = getValue(Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
5844 return error(
"Invalid switch record");
5845 unsigned NumCases = (
Record.size()-3)/2;
5848 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5850 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
5851 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
5852 if (!CaseVal || !DestBB) {
5854 return error(
"Invalid switch record");
5856 SI->addCase(CaseVal, DestBB);
5863 return error(
"Invalid indirectbr record");
5864 unsigned OpTyID =
Record[0];
5865 Type *OpTy = getTypeByID(OpTyID);
5866 Value *
Address = getValue(Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
5868 return error(
"Invalid indirectbr record");
5869 unsigned NumDests =
Record.size()-2;
5872 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5873 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
5877 return error(
"Invalid indirectbr record");
5887 return error(
"Invalid invoke record");
5890 unsigned CCInfo =
Record[OpNum++];
5891 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
5892 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
5894 unsigned FTyID = InvalidTypeID;
5895 FunctionType *FTy =
nullptr;
5896 if ((CCInfo >> 13) & 1) {
5900 return error(
"Explicit invoke type is not a function type");
5904 unsigned CalleeTypeID;
5905 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5907 return error(
"Invalid invoke record");
5911 return error(
"Callee is not a pointer");
5913 FTyID = getContainedTypeID(CalleeTypeID);
5916 return error(
"Callee is not of pointer to function type");
5918 if (
Record.size() < FTy->getNumParams() + OpNum)
5919 return error(
"Insufficient operands to call");
5921 SmallVector<Value*, 16>
Ops;
5922 SmallVector<unsigned, 16> ArgTyIDs;
5923 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5924 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5925 Ops.push_back(getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
5929 return error(
"Invalid invoke record");
5932 if (!FTy->isVarArg()) {
5933 if (
Record.size() != OpNum)
5934 return error(
"Invalid invoke record");
5937 while (OpNum !=
Record.size()) {
5940 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5941 return error(
"Invalid invoke record");
5948 if (!OperandBundles.empty())
5953 ResTypeID = getContainedTypeID(FTyID);
5954 OperandBundles.clear();
5957 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
5968 Value *Val =
nullptr;
5970 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
5971 return error(
"Invalid resume record");
5980 unsigned CCInfo =
Record[OpNum++];
5982 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
5983 unsigned NumIndirectDests =
Record[OpNum++];
5984 SmallVector<BasicBlock *, 16> IndirectDests;
5985 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
5986 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
5988 unsigned FTyID = InvalidTypeID;
5989 FunctionType *FTy =
nullptr;
5994 return error(
"Explicit call type is not a function type");
5998 unsigned CalleeTypeID;
5999 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6001 return error(
"Invalid callbr record");
6005 return error(
"Callee is not a pointer type");
6007 FTyID = getContainedTypeID(CalleeTypeID);
6010 return error(
"Callee is not of pointer to function type");
6012 if (
Record.size() < FTy->getNumParams() + OpNum)
6013 return error(
"Insufficient operands to call");
6015 SmallVector<Value*, 16>
Args;
6016 SmallVector<unsigned, 16> ArgTyIDs;
6018 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6020 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6021 if (FTy->getParamType(i)->isLabelTy())
6022 Arg = getBasicBlock(Record[OpNum]);
6024 Arg = getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6027 return error(
"Invalid callbr record");
6028 Args.push_back(Arg);
6033 if (!FTy->isVarArg()) {
6034 if (OpNum !=
Record.size())
6035 return error(
"Invalid callbr record");
6037 while (OpNum !=
Record.size()) {
6040 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6041 return error(
"Invalid callbr record");
6048 if (!OperandBundles.empty())
6053 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6056 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6061 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6062 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6063 unsigned LabelNo = ArgNo - FirstBlockArg;
6065 if (!BA || BA->getFunction() !=
F ||
6066 LabelNo > IndirectDests.
size() ||
6067 BA->getBasicBlock() != IndirectDests[LabelNo])
6068 return error(
"callbr argument does not match indirect dest");
6073 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6077 for (
Value *Arg : Args)
6080 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6083 std::string Constraints =
IA->getConstraintString().str();
6086 for (
const auto &CI : ConstraintInfo) {
6088 if (ArgNo >= FirstBlockArg)
6089 Constraints.insert(Pos,
"!");
6094 Pos = Constraints.find(
',', Pos);
6095 if (Pos == std::string::npos)
6101 IA->hasSideEffects(),
IA->isAlignStack(),
6102 IA->getDialect(),
IA->canThrow());
6108 ResTypeID = getContainedTypeID(FTyID);
6109 OperandBundles.clear();
6126 return error(
"Invalid phi record");
6128 unsigned TyID =
Record[0];
6129 Type *Ty = getTypeByID(TyID);
6131 return error(
"Invalid phi record");
6136 size_t NumArgs = (
Record.size() - 1) / 2;
6140 return error(
"Invalid phi record");
6144 SmallDenseMap<BasicBlock *, Value *>
Args;
6145 for (
unsigned i = 0; i != NumArgs; i++) {
6146 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6149 return error(
"Invalid phi BB");
6156 auto It =
Args.find(BB);
6158 if (It !=
Args.end()) {
6172 if (!PhiConstExprBB)
6174 EdgeBB = PhiConstExprBB;
6182 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6184 V = getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6188 return error(
"Invalid phi record");
6191 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6192 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6193 PhiConstExprBB =
nullptr;
6196 Args.insert({BB,
V});
6202 if (
Record.size() % 2 == 0) {
6206 I->setFastMathFlags(FMF);
6218 return error(
"Invalid landingpad record");
6222 return error(
"Invalid landingpad record");
6224 ResTypeID =
Record[Idx++];
6225 Type *Ty = getTypeByID(ResTypeID);
6227 return error(
"Invalid landingpad record");
6229 Value *PersFn =
nullptr;
6230 unsigned PersFnTypeID;
6231 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6233 return error(
"Invalid landingpad record");
6235 if (!
F->hasPersonalityFn())
6238 return error(
"Personality function mismatch");
6241 bool IsCleanup = !!
Record[Idx++];
6242 unsigned NumClauses =
Record[Idx++];
6245 for (
unsigned J = 0; J != NumClauses; ++J) {
6251 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6254 return error(
"Invalid landingpad record");
6259 "Catch clause has a invalid type!");
6262 "Filter clause has invalid type!");
6273 return error(
"Invalid alloca record");
6274 using APV = AllocaPackedValues;
6275 const uint64_t Rec =
Record[3];
6278 unsigned TyID =
Record[0];
6279 Type *Ty = getTypeByID(TyID);
6281 TyID = getContainedTypeID(TyID);
6282 Ty = getTypeByID(TyID);
6284 return error(
"Missing element type for old-style alloca");
6286 unsigned OpTyID =
Record[1];
6287 Type *OpTy = getTypeByID(OpTyID);
6288 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6293 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6297 return error(
"Invalid alloca record");
6299 const DataLayout &
DL = TheModule->getDataLayout();
6300 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6302 SmallPtrSet<Type *, 4> Visited;
6303 if (!Align && !Ty->
isSized(&Visited))
6304 return error(
"alloca of unsized type");
6306 Align =
DL.getPrefTypeAlign(Ty);
6308 if (!
Size->getType()->isIntegerTy())
6309 return error(
"alloca element count must have integer type");
6311 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6315 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6323 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6324 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6325 return error(
"Invalid load record");
6328 return error(
"Load operand is not a pointer type");
6331 if (OpNum + 3 ==
Record.size()) {
6332 ResTypeID =
Record[OpNum++];
6333 Ty = getTypeByID(ResTypeID);
6335 ResTypeID = getContainedTypeID(OpTypeID);
6336 Ty = getTypeByID(ResTypeID);
6340 return error(
"Missing load type");
6342 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6346 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6348 SmallPtrSet<Type *, 4> Visited;
6349 if (!Align && !Ty->
isSized(&Visited))
6350 return error(
"load of unsized type");
6352 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6353 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6362 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6363 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size()))
6364 return error(
"Invalid load atomic record");
6367 return error(
"Load operand is not a pointer type");
6370 if (OpNum + 5 ==
Record.size()) {
6371 ResTypeID =
Record[OpNum++];
6372 Ty = getTypeByID(ResTypeID);
6374 ResTypeID = getContainedTypeID(OpTypeID);
6375 Ty = getTypeByID(ResTypeID);
6379 return error(
"Missing atomic load type");
6381 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6385 if (Ordering == AtomicOrdering::NotAtomic ||
6386 Ordering == AtomicOrdering::Release ||
6387 Ordering == AtomicOrdering::AcquireRelease)
6388 return error(
"Invalid load atomic record");
6389 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6390 return error(
"Invalid load atomic record");
6391 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6394 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6397 return error(
"Alignment missing from atomic load");
6398 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align, Ordering, SSID);
6406 unsigned PtrTypeID, ValTypeID;
6407 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6408 return error(
"Invalid store record");
6411 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6412 return error(
"Invalid store record");
6414 ValTypeID = getContainedTypeID(PtrTypeID);
6415 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6416 ValTypeID, Val, CurBB))
6417 return error(
"Invalid store record");
6420 if (OpNum + 2 !=
Record.size())
6421 return error(
"Invalid store record");
6426 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6428 SmallPtrSet<Type *, 4> Visited;
6430 return error(
"store of unsized type");
6432 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6433 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6442 unsigned PtrTypeID, ValTypeID;
6443 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6445 return error(
"Invalid store atomic record");
6447 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6448 return error(
"Invalid store atomic record");
6450 ValTypeID = getContainedTypeID(PtrTypeID);
6451 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6452 ValTypeID, Val, CurBB))
6453 return error(
"Invalid store atomic record");
6456 if (OpNum + 4 !=
Record.size())
6457 return error(
"Invalid store atomic record");
6462 if (Ordering == AtomicOrdering::NotAtomic ||
6463 Ordering == AtomicOrdering::Acquire ||
6464 Ordering == AtomicOrdering::AcquireRelease)
6465 return error(
"Invalid store atomic record");
6466 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6467 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6468 return error(
"Invalid store atomic record");
6471 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6474 return error(
"Alignment missing from atomic store");
6475 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align, Ordering, SSID);
6482 const size_t NumRecords =
Record.size();
6484 Value *Ptr =
nullptr;
6486 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6487 return error(
"Invalid cmpxchg record");
6490 return error(
"Cmpxchg operand is not a pointer type");
6493 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6494 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6495 CmpTypeID, Cmp, CurBB))
6496 return error(
"Invalid cmpxchg record");
6499 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6501 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6502 return error(
"Invalid cmpxchg record");
6506 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6507 SuccessOrdering == AtomicOrdering::Unordered)
6508 return error(
"Invalid cmpxchg record");
6510 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6512 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6520 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6521 FailureOrdering == AtomicOrdering::Unordered)
6522 return error(
"Invalid cmpxchg record");
6524 const Align Alignment(
6525 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6527 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6528 FailureOrdering, SSID);
6531 if (NumRecords < 8) {
6535 I->insertInto(CurBB, CurBB->
end());
6537 ResTypeID = CmpTypeID;
6540 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6541 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6550 const size_t NumRecords =
Record.size();
6552 Value *Ptr =
nullptr;
6554 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6555 return error(
"Invalid cmpxchg record");
6558 return error(
"Cmpxchg operand is not a pointer type");
6562 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6563 return error(
"Invalid cmpxchg record");
6565 Value *Val =
nullptr;
6566 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6568 return error(
"Invalid cmpxchg record");
6570 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6571 return error(
"Invalid cmpxchg record");
6573 const bool IsVol =
Record[OpNum];
6578 return error(
"Invalid cmpxchg success ordering");
6580 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6582 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6588 return error(
"Invalid cmpxchg failure ordering");
6590 const bool IsWeak =
Record[OpNum + 4];
6592 MaybeAlign Alignment;
6594 if (NumRecords == (OpNum + 6)) {
6595 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6600 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6602 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6603 FailureOrdering, SSID);
6607 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6608 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6617 const size_t NumRecords =
Record.size();
6620 Value *Ptr =
nullptr;
6622 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6623 return error(
"Invalid atomicrmw record");
6626 return error(
"Invalid atomicrmw record");
6628 Value *Val =
nullptr;
6629 unsigned ValTypeID = InvalidTypeID;
6631 ValTypeID = getContainedTypeID(PtrTypeID);
6632 if (popValue(Record, OpNum, NextValueNo,
6633 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6634 return error(
"Invalid atomicrmw record");
6636 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6637 return error(
"Invalid atomicrmw record");
6640 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6641 return error(
"Invalid atomicrmw record");
6647 return error(
"Invalid atomicrmw record");
6649 const bool IsVol =
Record[OpNum + 1];
6652 if (Ordering == AtomicOrdering::NotAtomic ||
6653 Ordering == AtomicOrdering::Unordered)
6654 return error(
"Invalid atomicrmw record");
6656 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6658 MaybeAlign Alignment;
6660 if (NumRecords == (OpNum + 5)) {
6661 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6667 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6669 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID);
6670 ResTypeID = ValTypeID;
6678 return error(
"Invalid fence record");
6680 if (Ordering == AtomicOrdering::NotAtomic ||
6681 Ordering == AtomicOrdering::Unordered ||
6682 Ordering == AtomicOrdering::Monotonic)
6683 return error(
"Invalid fence record");
6685 I =
new FenceInst(
Context, Ordering, SSID);
6692 SeenDebugRecord =
true;
6695 return error(
"Invalid dbg record: missing instruction");
6698 Inst->
getParent()->insertDbgRecordBefore(
6709 SeenDebugRecord =
true;
6712 return error(
"Invalid dbg record: missing instruction");
6729 DILocalVariable *Var =
6731 DIExpression *Expr =
6744 unsigned SlotBefore =
Slot;
6745 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6746 return error(
"Invalid dbg record: invalid value");
6748 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6751 RawLocation = getFnMetadataByID(Record[Slot++]);
6754 DbgVariableRecord *DVR =
nullptr;
6758 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6759 DbgVariableRecord::LocationType::Value);
6762 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6763 DbgVariableRecord::LocationType::Declare);
6766 DVR =
new DbgVariableRecord(
6767 RawLocation, Var, Expr, DIL,
6768 DbgVariableRecord::LocationType::DeclareValue);
6772 DIExpression *AddrExpr =
6774 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6775 DVR =
new DbgVariableRecord(RawLocation, Var, Expr,
ID, Addr, AddrExpr,
6788 return error(
"Invalid call record");
6792 unsigned CCInfo =
Record[OpNum++];
6798 return error(
"Fast math flags indicator set for call with no FMF");
6801 unsigned FTyID = InvalidTypeID;
6802 FunctionType *FTy =
nullptr;
6807 return error(
"Explicit call type is not a function type");
6811 unsigned CalleeTypeID;
6812 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6814 return error(
"Invalid call record");
6818 return error(
"Callee is not a pointer type");
6820 FTyID = getContainedTypeID(CalleeTypeID);
6823 return error(
"Callee is not of pointer to function type");
6825 if (
Record.size() < FTy->getNumParams() + OpNum)
6826 return error(
"Insufficient operands to call");
6828 SmallVector<Value*, 16>
Args;
6829 SmallVector<unsigned, 16> ArgTyIDs;
6831 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6832 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6833 if (FTy->getParamType(i)->isLabelTy())
6834 Args.push_back(getBasicBlock(Record[OpNum]));
6836 Args.push_back(getValue(Record, OpNum, NextValueNo,
6837 FTy->getParamType(i), ArgTyID, CurBB));
6840 return error(
"Invalid call record");
6844 if (!FTy->isVarArg()) {
6845 if (OpNum !=
Record.size())
6846 return error(
"Invalid call record");
6848 while (OpNum !=
Record.size()) {
6851 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6852 return error(
"Invalid call record");
6859 if (!OperandBundles.empty())
6863 ResTypeID = getContainedTypeID(FTyID);
6864 OperandBundles.clear();
6878 SeenDebugIntrinsic =
true;
6885 return error(
"Fast-math-flags specified for call without "
6886 "floating-point scalar or vector return type");
6887 I->setFastMathFlags(FMF);
6893 return error(
"Invalid va_arg record");
6894 unsigned OpTyID =
Record[0];
6895 Type *OpTy = getTypeByID(OpTyID);
6896 Value *
Op = getValue(Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
6898 Type *ResTy = getTypeByID(ResTypeID);
6899 if (!OpTy || !
Op || !ResTy)
6900 return error(
"Invalid va_arg record");
6901 I =
new VAArgInst(
Op, ResTy);
6911 if (
Record.empty() || Record[0] >= BundleTags.size())
6912 return error(
"Invalid operand bundle record");
6914 std::vector<Value *> Inputs;
6917 while (OpNum !=
Record.size()) {
6919 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
6920 return error(
"Invalid operand bundle record");
6921 Inputs.push_back(
Op);
6924 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
6932 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6933 return error(
"Invalid freeze record");
6934 if (OpNum !=
Record.size())
6935 return error(
"Invalid freeze record");
6937 I =
new FreezeInst(
Op);
6938 ResTypeID = OpTypeID;
6948 return error(
"Invalid instruction with no BB");
6950 if (!OperandBundles.empty()) {
6952 return error(
"Operand bundles found with no consumer");
6954 I->insertInto(CurBB, CurBB->
end());
6957 if (
I->isTerminator()) {
6959 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
6963 if (!
I->getType()->isVoidTy()) {
6964 assert(
I->getType() == getTypeByID(ResTypeID) &&
6965 "Incorrect result type ID");
6973 if (!OperandBundles.empty())
6974 return error(
"Operand bundles found with no consumer");
6978 if (!
A->getParent()) {
6980 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
6986 return error(
"Never resolved value found in function");
6991 if (MDLoader->hasFwdRefs())
6992 return error(
"Invalid function metadata: outgoing forward refs");
6997 for (
const auto &Pair : ConstExprEdgeBBs) {
7008 ValueList.
shrinkTo(ModuleValueListSize);
7009 MDLoader->shrinkTo(ModuleMDLoaderSize);
7010 std::vector<BasicBlock*>().swap(FunctionBBs);
7015Error BitcodeReader::findFunctionInStream(
7017 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
7018 while (DeferredFunctionInfoIterator->second == 0) {
7023 assert(VSTOffset == 0 || !
F->hasName());
7026 if (
Error Err = rememberAndSkipFunctionBodies())
7032SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7035 if (Val >= SSIDs.
size())
7044Error BitcodeReader::materialize(GlobalValue *GV) {
7047 if (!
F || !
F->isMaterializable())
7050 DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.
find(
F);
7051 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7054 if (DFII->second == 0)
7055 if (
Error Err = findFunctionInStream(
F, DFII))
7059 if (
Error Err = materializeMetadata())
7063 if (
Error JumpFailed = Stream.JumpToBit(DFII->second))
7066 if (
Error Err = parseFunctionBody(
F))
7068 F->setIsMaterializable(
false);
7072 if (SeenDebugIntrinsic && SeenDebugRecord)
7073 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7079 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7080 F->setSubprogram(SP);
7083 if (!MDLoader->isStrippingTBAA()) {
7085 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7088 MDLoader->setStripTBAA(
true);
7095 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7096 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7102 unsigned ExpectedNumOperands = 0;
7104 ExpectedNumOperands = BI->getNumSuccessors();
7106 ExpectedNumOperands =
SI->getNumSuccessors();
7108 ExpectedNumOperands = 1;
7112 ExpectedNumOperands = 2;
7119 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7120 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7126 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7127 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7129 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7130 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7131 CI->getArgOperand(ArgNo)->getType(),
7132 CI->getParamAttributes(ArgNo)));
7135 if (Function *OldFn = CI->getCalledFunction()) {
7136 auto It = UpgradedIntrinsics.find(OldFn);
7137 if (It != UpgradedIntrinsics.end())
7148 return materializeForwardReferencedFunctions();
7151Error BitcodeReader::materializeModule() {
7152 if (
Error Err = materializeMetadata())
7156 WillMaterializeAllForwardRefs =
true;
7160 for (Function &
F : *TheModule) {
7161 if (
Error Err = materialize(&
F))
7167 if (LastFunctionBlockBit || NextUnreadBit)
7169 ? LastFunctionBlockBit
7175 if (!BasicBlockFwdRefs.
empty())
7176 return error(
"Never resolved function from blockaddress");
7182 for (
auto &
I : UpgradedIntrinsics) {
7183 for (
auto *U :
I.first->users()) {
7187 if (
I.first !=
I.second) {
7188 if (!
I.first->use_empty())
7189 I.first->replaceAllUsesWith(
I.second);
7190 I.first->eraseFromParent();
7193 UpgradedIntrinsics.clear();
7208std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7209 return IdentifiedStructTypes;
7212ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7213 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7215 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7216 ModulePath(ModulePath), IsPrevailing(IsPrevailing) {}
7218void ModuleSummaryIndexBitcodeReader::addThisModule() {
7223ModuleSummaryIndexBitcodeReader::getThisModule() {
7227template <
bool AllowNullValueInfo>
7228std::pair<ValueInfo, GlobalValue::GUID>
7229ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7230 auto VGI = ValueIdToValueInfoMap[ValueId];
7237 assert(AllowNullValueInfo || std::get<0>(VGI));
7241void ModuleSummaryIndexBitcodeReader::setValueGUID(
7243 StringRef SourceFileName) {
7244 std::string GlobalId =
7247 auto OriginalNameID = ValueGUID;
7251 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7257 ValueIdToValueInfoMap[ValueID] = std::make_pair(
7266Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7268 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7275 if (!MaybeCurrentBit)
7277 uint64_t CurrentBit = MaybeCurrentBit.
get();
7282 SmallVector<uint64_t, 64>
Record;
7288 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
7291 BitstreamEntry
Entry = MaybeEntry.
get();
7293 switch (
Entry.Kind) {
7296 return error(
"Malformed block");
7299 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
7309 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
7312 switch (MaybeRecord.
get()) {
7317 return error(
"Invalid vst_code_entry record");
7318 unsigned ValueID =
Record[0];
7320 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7321 assert(VLI != ValueIdToLinkageMap.
end() &&
7322 "No linkage found for VST entry?");
7331 return error(
"Invalid vst_code_fnentry record");
7332 unsigned ValueID =
Record[0];
7334 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7335 assert(VLI != ValueIdToLinkageMap.
end() &&
7336 "No linkage found for VST entry?");
7344 unsigned ValueID =
Record[0];
7348 ValueIdToValueInfoMap[ValueID] =
7359Error ModuleSummaryIndexBitcodeReader::parseModule() {
7363 SmallVector<uint64_t, 64>
Record;
7364 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7365 unsigned ValueId = 0;
7369 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
7372 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7374 switch (
Entry.Kind) {
7376 return error(
"Malformed block");
7383 if (
Error Err = Stream.SkipBlock())
7388 if (
Error Err = readBlockInfo())
7394 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7395 !SeenGlobalValSummary) &&
7396 "Expected early VST parse via VSTOffset record");
7397 if (
Error Err = Stream.SkipBlock())
7403 if (!SourceFileName.
empty())
7405 assert(!SeenValueSymbolTable &&
7406 "Already read VST when parsing summary block?");
7411 if (VSTOffset > 0) {
7412 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7414 SeenValueSymbolTable =
true;
7416 SeenGlobalValSummary =
true;
7417 if (
Error Err = parseEntireSummary(
Entry.ID))
7421 if (
Error Err = parseModuleStringTable())
7429 Expected<unsigned> MaybeBitCode = Stream.readRecord(
Entry.ID, Record);
7432 switch (MaybeBitCode.
get()) {
7436 if (
Error Err = parseVersionRecord(Record).takeError())
7444 return error(
"Invalid source filename record");
7451 return error(
"Invalid hash length " + Twine(
Record.size()).str());
7452 auto &Hash = getThisModule()->second;
7454 for (
auto &Val : Record) {
7455 assert(!(Val >> 32) &&
"Unexpected high bits set");
7463 return error(
"Invalid vstoffset record");
7467 VSTOffset =
Record[0] - 1;
7477 ArrayRef<uint64_t> GVRecord;
7478 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7479 if (GVRecord.
size() <= 3)
7480 return error(
"Invalid global record");
7481 uint64_t RawLinkage = GVRecord[3];
7484 ValueIdToLinkageMap[ValueId++] =
Linkage;
7488 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7499ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7502 for (uint64_t RefValueId : Record)
7503 Ret.
push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7508ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7509 bool IsOldProfileFormat,
7510 bool HasProfile,
bool HasRelBF) {
7514 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7519 for (
unsigned I = 0,
E =
Record.size();
I !=
E; ++
I) {
7521 bool HasTailCall =
false;
7523 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7524 if (IsOldProfileFormat) {
7528 }
else if (HasProfile)
7529 std::tie(Hotness, HasTailCall) =
7563 static_cast<size_t>(
Record[Slot + 1])};
7586 while (Slot <
Record.size())
7590std::vector<FunctionSummary::ParamAccess>
7591ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7592 auto ReadRange = [&]() {
7594 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7596 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7603 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7604 while (!
Record.empty()) {
7605 PendingParamAccesses.emplace_back();
7606 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7608 ParamAccess.
Use = ReadRange();
7613 std::get<0>(getValueInfoFromValueId(
Record.consume_front()));
7614 Call.Offsets = ReadRange();
7617 return PendingParamAccesses;
7620void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7621 ArrayRef<uint64_t> Record,
size_t &Slot,
7624 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7628void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7629 ArrayRef<uint64_t> Record) {
7637 while (Slot <
Record.size())
7638 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7641SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7642 ArrayRef<uint64_t> Record,
unsigned &
I) {
7643 SmallVector<unsigned> StackIdList;
7647 if (RadixArray.empty()) {
7648 unsigned NumStackEntries =
Record[
I++];
7650 StackIdList.
reserve(NumStackEntries);
7651 for (
unsigned J = 0; J < NumStackEntries; J++) {
7652 assert(Record[
I] < StackIds.size());
7653 StackIdList.
push_back(StackIdToIndex[Record[
I++]]);
7656 unsigned RadixIndex =
Record[
I++];
7662 assert(RadixIndex < RadixArray.size());
7663 unsigned NumStackIds = RadixArray[RadixIndex++];
7664 StackIdList.
reserve(NumStackIds);
7665 while (NumStackIds--) {
7666 assert(RadixIndex < RadixArray.size());
7667 unsigned Elem = RadixArray[RadixIndex];
7668 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7669 RadixIndex = RadixIndex - Elem;
7670 assert(RadixIndex < RadixArray.size());
7671 Elem = RadixArray[RadixIndex];
7673 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7676 StackIdList.
push_back(StackIdToIndex[Elem]);
7686 unsigned FirstWORef = Refs.
size() - WOCnt;
7687 unsigned RefNo = FirstWORef - ROCnt;
7688 for (; RefNo < FirstWORef; ++RefNo)
7689 Refs[RefNo].setReadOnly();
7690 for (; RefNo < Refs.
size(); ++RefNo)
7691 Refs[RefNo].setWriteOnly();
7696Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7697 if (
Error Err = Stream.EnterSubBlock(
ID))
7699 SmallVector<uint64_t, 64>
Record;
7703 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
7706 BitstreamEntry
Entry = MaybeEntry.
get();
7709 return error(
"Invalid Summary Block: record for version expected");
7710 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
7714 return error(
"Invalid Summary Block: version expected");
7717 const bool IsOldProfileFormat =
Version == 1;
7719 return error(
"Invalid summary version " + Twine(
Version) +
7720 ". Version should be in the range [1-" +
7727 GlobalValueSummary *LastSeenSummary =
nullptr;
7733 std::vector<GlobalValue::GUID> PendingTypeTests;
7734 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7735 PendingTypeCheckedLoadVCalls;
7736 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7737 PendingTypeCheckedLoadConstVCalls;
7738 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7740 std::vector<CallsiteInfo> PendingCallsites;
7741 std::vector<AllocInfo> PendingAllocs;
7742 std::vector<uint64_t> PendingContextIds;
7745 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
7748 BitstreamEntry
Entry = MaybeEntry.
get();
7750 switch (
Entry.Kind) {
7753 return error(
"Malformed block");
7769 Expected<unsigned> MaybeBitCode = Stream.readRecord(
Entry.ID, Record);
7772 switch (
unsigned BitCode = MaybeBitCode.
get()) {
7780 uint64_t ValueID =
Record[0];
7787 ValueIdToValueInfoMap[ValueID] =
7805 unsigned ValueID =
Record[0];
7806 uint64_t RawFlags =
Record[1];
7807 unsigned InstCount =
Record[2];
7808 uint64_t RawFunFlags = 0;
7809 unsigned NumRefs =
Record[3];
7810 unsigned NumRORefs = 0, NumWORefs = 0;
7811 int RefListStartIndex = 4;
7815 RefListStartIndex = 5;
7818 RefListStartIndex = 6;
7821 RefListStartIndex = 7;
7832 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7834 "Record size inconsistent with number of references");
7836 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7841 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7842 IsOldProfileFormat, HasProfile, HasRelBF);
7844 auto VIAndOriginalGUID = getValueInfoFromValueId(ValueID);
7850 !IsPrevailing(VIAndOriginalGUID.first.getGUID())) {
7851 PendingCallsites.clear();
7852 PendingAllocs.clear();
7854 auto FS = std::make_unique<FunctionSummary>(
7856 std::move(Calls), std::move(PendingTypeTests),
7857 std::move(PendingTypeTestAssumeVCalls),
7858 std::move(PendingTypeCheckedLoadVCalls),
7859 std::move(PendingTypeTestAssumeConstVCalls),
7860 std::move(PendingTypeCheckedLoadConstVCalls),
7861 std::move(PendingParamAccesses), std::move(PendingCallsites),
7862 std::move(PendingAllocs));
7863 FS->setModulePath(getThisModule()->first());
7864 FS->setOriginalName(std::get<1>(VIAndOriginalGUID));
7873 unsigned ValueID =
Record[0];
7874 uint64_t RawFlags =
Record[1];
7875 unsigned AliaseeID =
Record[2];
7877 auto AS = std::make_unique<AliasSummary>(Flags);
7883 AS->setModulePath(getThisModule()->first());
7885 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
7887 if (!AliaseeInModule)
7888 return error(
"Alias expects aliasee summary to be parsed");
7889 AS->setAliasee(AliaseeVI, AliaseeInModule);
7891 auto GUID = getValueInfoFromValueId(ValueID);
7892 AS->setOriginalName(std::get<1>(GUID));
7898 unsigned ValueID =
Record[0];
7899 uint64_t RawFlags =
Record[1];
7900 unsigned RefArrayStart = 2;
7901 GlobalVarSummary::GVarFlags GVF(
false,
7911 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
7913 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7914 FS->setModulePath(getThisModule()->first());
7915 auto GUID = getValueInfoFromValueId(ValueID);
7916 FS->setOriginalName(std::get<1>(GUID));
7924 unsigned ValueID =
Record[0];
7925 uint64_t RawFlags =
Record[1];
7927 unsigned NumRefs =
Record[3];
7928 unsigned RefListStartIndex = 4;
7929 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
7932 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7934 for (
unsigned I = VTableListStartIndex,
E =
Record.size();
I !=
E; ++
I) {
7935 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7940 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7941 VS->setModulePath(getThisModule()->first());
7942 VS->setVTableFuncs(VTableFuncs);
7943 auto GUID = getValueInfoFromValueId(ValueID);
7944 VS->setOriginalName(std::get<1>(GUID));
7956 unsigned ValueID =
Record[0];
7957 uint64_t ModuleId =
Record[1];
7958 uint64_t RawFlags =
Record[2];
7959 unsigned InstCount =
Record[3];
7960 uint64_t RawFunFlags = 0;
7961 unsigned NumRefs =
Record[4];
7962 unsigned NumRORefs = 0, NumWORefs = 0;
7963 int RefListStartIndex = 5;
7967 RefListStartIndex = 6;
7968 size_t NumRefsIndex = 5;
7970 unsigned NumRORefsOffset = 1;
7971 RefListStartIndex = 7;
7974 RefListStartIndex = 8;
7976 RefListStartIndex = 9;
7978 NumRORefsOffset = 2;
7981 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
7983 NumRefs =
Record[NumRefsIndex];
7987 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7989 "Record size inconsistent with number of references");
7991 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7994 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7995 IsOldProfileFormat, HasProfile,
false);
7996 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
7998 auto FS = std::make_unique<FunctionSummary>(
8000 std::move(Edges), std::move(PendingTypeTests),
8001 std::move(PendingTypeTestAssumeVCalls),
8002 std::move(PendingTypeCheckedLoadVCalls),
8003 std::move(PendingTypeTestAssumeConstVCalls),
8004 std::move(PendingTypeCheckedLoadConstVCalls),
8005 std::move(PendingParamAccesses), std::move(PendingCallsites),
8006 std::move(PendingAllocs));
8007 LastSeenSummary =
FS.get();
8008 LastSeenGUID =
VI.getGUID();
8009 FS->setModulePath(ModuleIdMap[ModuleId]);
8017 unsigned ValueID =
Record[0];
8018 uint64_t ModuleId =
Record[1];
8019 uint64_t RawFlags =
Record[2];
8020 unsigned AliaseeValueId =
Record[3];
8022 auto AS = std::make_unique<AliasSummary>(Flags);
8023 LastSeenSummary = AS.get();
8024 AS->setModulePath(ModuleIdMap[ModuleId]);
8026 auto AliaseeVI = std::get<0>(
8027 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(AliaseeValueId));
8029 auto AliaseeInModule =
8031 AS->setAliasee(AliaseeVI, AliaseeInModule);
8033 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8034 LastSeenGUID =
VI.getGUID();
8040 unsigned ValueID =
Record[0];
8041 uint64_t ModuleId =
Record[1];
8042 uint64_t RawFlags =
Record[2];
8043 unsigned RefArrayStart = 3;
8044 GlobalVarSummary::GVarFlags GVF(
false,
8054 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8056 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8057 LastSeenSummary =
FS.get();
8058 FS->setModulePath(ModuleIdMap[ModuleId]);
8059 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8060 LastSeenGUID =
VI.getGUID();
8066 uint64_t OriginalName =
Record[0];
8067 if (!LastSeenSummary)
8068 return error(
"Name attachment that does not follow a combined record");
8072 LastSeenSummary =
nullptr;
8077 assert(PendingTypeTests.empty());
8082 assert(PendingTypeTestAssumeVCalls.empty());
8083 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8084 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8088 assert(PendingTypeCheckedLoadVCalls.empty());
8089 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8090 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8094 PendingTypeTestAssumeConstVCalls.push_back(
8099 PendingTypeCheckedLoadConstVCalls.push_back(
8105 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8107 static_cast<size_t>(Record[
I + 1]));
8113 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8115 static_cast<size_t>(Record[
I + 1]));
8124 parseTypeIdCompatibleVtableSummaryRecord(Record);
8132 PendingParamAccesses = parseParamAccesses(Record);
8139 assert(StackIds.empty());
8141 StackIds = ArrayRef<uint64_t>(Record);
8147 StackIds.reserve(
Record.size() / 2);
8148 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8149 StackIds.push_back(*R << 32 | *(R + 1));
8151 assert(StackIdToIndex.empty());
8152 StackIdToIndex.reserve(StackIds.size());
8153 for (uint64_t StackId : StackIds)
8159 RadixArray = ArrayRef<uint64_t>(Record);
8164 unsigned ValueID =
Record[0];
8165 SmallVector<unsigned> StackIdList;
8167 assert(R < StackIds.size());
8168 StackIdList.
push_back(StackIdToIndex[R]);
8170 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8171 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8176 auto RecordIter =
Record.begin();
8177 unsigned ValueID = *RecordIter++;
8178 unsigned NumStackIds = *RecordIter++;
8179 unsigned NumVersions = *RecordIter++;
8180 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8181 SmallVector<unsigned> StackIdList;
8182 for (
unsigned J = 0; J < NumStackIds; J++) {
8183 assert(*RecordIter < StackIds.size());
8184 StackIdList.
push_back(StackIdToIndex[*RecordIter++]);
8186 SmallVector<unsigned> Versions;
8187 for (
unsigned J = 0; J < NumVersions; J++)
8189 ValueInfo
VI = std::get<0>(
8190 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8191 PendingCallsites.push_back(
8192 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8200 PendingContextIds.reserve(
Record.size() / 2);
8201 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8202 PendingContextIds.push_back(*R << 32 | *(R + 1));
8208 std::vector<MIBInfo> MIBs;
8209 unsigned NumMIBs = 0;
8212 unsigned MIBsRead = 0;
8213 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8217 auto StackIdList = parseAllocInfoContext(Record,
I);
8218 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8224 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8226 assert(!PendingContextIds.empty() &&
8227 "Missing context ids for alloc sizes");
8228 unsigned ContextIdIndex = 0;
8234 while (MIBsRead++ < NumMIBs) {
8236 unsigned NumContextSizeInfoEntries =
Record[
I++];
8238 std::vector<ContextTotalSize> ContextSizes;
8239 ContextSizes.reserve(NumContextSizeInfoEntries);
8240 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8241 assert(ContextIdIndex < PendingContextIds.size());
8243 if (PendingContextIds[ContextIdIndex] == 0) {
8252 ContextSizes.push_back(
8253 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8255 AllContextSizes.push_back(std::move(ContextSizes));
8257 PendingContextIds.clear();
8259 PendingAllocs.push_back(AllocInfo(std::move(MIBs)));
8260 if (!AllContextSizes.empty()) {
8261 assert(PendingAllocs.back().MIBs.size() == AllContextSizes.size());
8262 PendingAllocs.back().ContextSizeInfos = std::move(AllContextSizes);
8270 std::vector<MIBInfo> MIBs;
8271 unsigned NumMIBs =
Record[
I++];
8272 unsigned NumVersions =
Record[
I++];
8273 unsigned MIBsRead = 0;
8274 while (MIBsRead++ < NumMIBs) {
8277 SmallVector<unsigned> StackIdList;
8279 StackIdList = parseAllocInfoContext(Record,
I);
8280 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8283 SmallVector<uint8_t> Versions;
8284 for (
unsigned J = 0; J < NumVersions; J++)
8287 PendingAllocs.push_back(AllocInfo(std::move(Versions), std::move(MIBs)));
8297Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8301 SmallVector<uint64_t, 64>
Record;
8303 SmallString<128> ModulePath;
8307 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
8310 BitstreamEntry
Entry = MaybeEntry.
get();
8312 switch (
Entry.Kind) {
8315 return error(
"Malformed block");
8324 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
8327 switch (MaybeRecord.
get()) {
8332 uint64_t ModuleId =
Record[0];
8335 return error(
"Invalid code_entry record");
8337 LastSeenModule = TheIndex.
addModule(ModulePath);
8338 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8346 return error(
"Invalid hash length " + Twine(
Record.size()).str());
8347 if (!LastSeenModule)
8348 return error(
"Invalid hash that does not follow a module path");
8350 for (
auto &Val : Record) {
8351 assert(!(Val >> 32) &&
"Unexpected high bits set");
8352 LastSeenModule->
second[Pos++] = Val;
8355 LastSeenModule =
nullptr;
8368class BitcodeErrorCategoryType :
public std::error_category {
8369 const char *
name()
const noexcept
override {
8370 return "llvm.bitcode";
8373 std::string message(
int IE)
const override {
8376 case BitcodeError::CorruptedBitcode:
8377 return "Corrupted bitcode";
8386 static BitcodeErrorCategoryType ErrorCategory;
8387 return ErrorCategory;
8391 unsigned Block,
unsigned RecordID) {
8393 return std::move(Err);
8402 switch (Entry.Kind) {
8407 return error(
"Malformed block");
8411 return std::move(Err);
8421 if (MaybeRecord.
get() == RecordID)
8432Expected<std::vector<BitcodeModule>>
8436 return FOrErr.takeError();
8437 return std::move(FOrErr->Mods);
8462 switch (Entry.Kind) {
8465 return error(
"Malformed block");
8468 uint64_t IdentificationBit = -1ull;
8472 return std::move(Err);
8478 Entry = MaybeEntry.
get();
8483 return error(
"Malformed block");
8489 return std::move(Err);
8508 if (!
I.Strtab.empty())
8515 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8516 F.StrtabForSymtab = *Strtab;
8532 if (
F.Symtab.empty())
8533 F.Symtab = *SymtabOrErr;
8538 return std::move(Err);
8543 return std::move(E);
8558BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8559 bool ShouldLazyLoadMetadata,
bool IsImporting,
8563 std::string ProducerIdentification;
8564 if (IdentificationBit != -1ull) {
8565 if (
Error JumpFailed = Stream.JumpToBit(IdentificationBit))
8566 return std::move(JumpFailed);
8569 return std::move(
E);
8572 if (
Error JumpFailed = Stream.JumpToBit(ModuleBit))
8573 return std::move(JumpFailed);
8574 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8577 std::unique_ptr<Module>
M =
8578 std::make_unique<Module>(ModuleIdentifier,
Context);
8579 M->setMaterializer(R);
8582 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8583 IsImporting, Callbacks))
8584 return std::move(Err);
8586 if (MaterializeAll) {
8588 if (
Error Err =
M->materializeAll())
8589 return std::move(Err);
8592 if (
Error Err =
R->materializeForwardReferencedFunctions())
8593 return std::move(Err);
8596 return std::move(M);
8599Expected<std::unique_ptr<Module>>
8602 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8617 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8618 ModulePath, IsPrevailing);
8619 return R.parseModule();
8626 return std::move(JumpFailed);
8628 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8629 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8630 ModuleIdentifier, 0);
8632 if (
Error Err = R.parseModule())
8633 return std::move(Err);
8635 return std::move(Index);
8641 return std::move(Err);
8647 return std::move(
E);
8649 switch (Entry.Kind) {
8652 return error(
"Malformed block");
8655 return std::make_pair(
false,
false);
8667 switch (MaybeBitCode.
get()) {
8673 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8675 bool EnableSplitLTOUnit = Flags & 0x8;
8676 bool UnifiedLTO = Flags & 0x200;
8677 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8688 return std::move(JumpFailed);
8691 return std::move(Err);
8696 return std::move(E);
8698 switch (Entry.Kind) {
8700 return error(
"Malformed block");
8711 return Flags.takeError();
8721 return std::move(Err);
8728 return StreamFailed.takeError();
8738 if (MsOrErr->size() != 1)
8739 return error(
"Expected a single module");
8741 return (*MsOrErr)[0];
8744Expected<std::unique_ptr<Module>>
8746 bool ShouldLazyLoadMetadata,
bool IsImporting,
8752 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8757 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8758 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8760 IsImporting, Callbacks);
8762 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8768 return getModuleImpl(Context,
true,
false,
false, Callbacks);
8780 return BM->parseModule(Context, Callbacks);
8813 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
8822 return BM->getSummary();
8830 return BM->getLTOInfo();
8835 bool IgnoreEmptyThinLTOIndexFile) {
8840 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 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 AtomicRMWInst::BinOp getDecodedRMWOperation(unsigned Val)
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.
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.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
bool empty() const
empty - 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
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
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 if the block is well formed or null if the block is not well forme...
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Represents a module in a bitcode file.
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getSummary()
Parse the specified bitcode buffer, returning the module summary index.
LLVM_ABI Expected< BitcodeLTOInfo > getLTOInfo()
Returns information about the module to be used for LTO: whether to compile with ThinLTO,...
LLVM_ABI Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(GlobalValue::GUID)> IsPrevailing=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata, bool IsImporting, ParserCallbacks Callbacks={})
Read the bitcode module and prepare for lazy deserialization of function bodies.
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
void push_back(Value *V, unsigned TypeID)
void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV)
Error assignValue(unsigned Idx, Value *V, unsigned TypeID)
void shrinkTo(unsigned N)
unsigned getTypeID(unsigned ValNo) const
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
ArrayRef< uint8_t > getBitcodeBytes() const
Expected< word_t > Read(unsigned NumBits)
Expected< BitstreamEntry > advance(unsigned Flags=0)
Advance the current bitstream, returning the next entry in the stream.
Expected< BitstreamEntry > advanceSkippingSubblocks(unsigned Flags=0)
This is a convenience function for clients that don't expect any subblocks.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP=nullptr)
Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
Error SkipBlock()
Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body of this block.
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
uint64_t getCurrentByteNo() const
LLVM_ABI Expected< std::optional< BitstreamBlockInfo > > ReadBlockInfoBlock(bool ReadBlockInfoNames=false)
Read and return a block info block from the bitstream.
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.
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
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 LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
static LLVM_ABI Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of array type with a float element type taken from argument ...
static LLVM_ABI Constant * get(LLVMContext &Context, ArrayRef< uint8_t > Elts)
get() constructors - Return a constant with vector type with an element count and element type matchi...
static LLVM_ABI Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of vector type with a float element type taken from argument...
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
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
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)
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
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
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
ValueT lookup(const KeyT &Key) const
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
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.
StringRef - 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
empty - Check if the string is empty.
constexpr size_t size() const
size - Get the string size.
constexpr const char * data() const
data - 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
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
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 isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isIntegerTy() const
True if this is an instance of IntegerType.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
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 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.
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.
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