24#include "llvm/Config/llvm-config.h"
54#include "llvm/IR/IntrinsicsAArch64.h"
55#include "llvm/IR/IntrinsicsARM.h"
88#include <system_error>
98 "Print the global id for each value when reading the module summary"));
103 "Expand constant expressions to instructions for testing purposes"));
108 SWITCH_INST_MAGIC = 0x4B5
121 "file too small to contain bitcode header");
122 for (
unsigned C : {
'B',
'C'})
126 "file doesn't start with bitcode header");
128 return Res.takeError();
129 for (
unsigned C : {0x0, 0xC, 0xE, 0xD})
133 "file doesn't start with bitcode header");
135 return Res.takeError();
140 const unsigned char *BufPtr = (
const unsigned char *)Buffer.
getBufferStart();
141 const unsigned char *BufEnd = BufPtr + Buffer.
getBufferSize();
144 return error(
"Invalid bitcode signature");
150 return error(
"Invalid bitcode wrapper header");
154 return std::move(Err);
156 return std::move(Stream);
160template <
typename StrTy>
173 if (
F.isMaterializable())
176 I.setMetadata(LLVMContext::MD_tbaa,
nullptr);
184 return std::move(Err);
189 std::string ProducerIdentification;
196 switch (Entry.Kind) {
199 return error(
"Malformed block");
201 return ProducerIdentification;
212 switch (MaybeBitCode.
get()) {
214 return error(
"Invalid value");
222 Twine(
"Incompatible epoch: Bitcode '") +
Twine(epoch) +
241 switch (Entry.Kind) {
244 return error(
"Malformed block");
252 return std::move(Err);
264 return std::move(Err);
275 switch (Entry.Kind) {
278 return error(
"Malformed block");
290 switch (MaybeRecord.
get()) {
296 return error(
"Invalid section name record");
301 Segment = Segment.trim();
302 Section = Section.trim();
304 if (Segment ==
"__DATA" && Section.starts_with(
"__objc_catlist"))
306 if (Segment ==
"__OBJC" && Section.starts_with(
"__category"))
308 if (Segment ==
"__TEXT" && Section.starts_with(
"__swift"))
326 switch (Entry.Kind) {
328 return error(
"Malformed block");
338 return std::move(Err);
351 return std::move(Err);
364 switch (Entry.Kind) {
367 return error(
"Malformed block");
379 switch (MaybeRecord.
get()) {
384 return error(
"Invalid triple record");
403 switch (Entry.Kind) {
405 return error(
"Malformed block");
415 return std::move(Err);
422 return Skipped.takeError();
429class BitcodeReaderBase {
431 BitcodeReaderBase(BitstreamCursor Stream, StringRef Strtab)
432 : Stream(std::
move(Stream)), Strtab(Strtab) {
433 this->Stream.setBlockInfo(&BlockInfo);
436 BitstreamBlockInfo BlockInfo;
437 BitstreamCursor Stream;
442 bool UseStrtab =
false;
444 Expected<unsigned> parseVersionRecord(ArrayRef<uint64_t> Record);
449 std::pair<StringRef, ArrayRef<uint64_t>>
450 readNameFromStrtab(ArrayRef<uint64_t> Record);
452 Error readBlockInfo();
455 std::string ProducerIdentification;
462Error BitcodeReaderBase::error(
const Twine &Message) {
463 std::string FullMsg = Message.
str();
464 if (!ProducerIdentification.empty())
465 FullMsg +=
" (Producer: '" + ProducerIdentification +
"' Reader: 'LLVM " +
466 LLVM_VERSION_STRING
"')";
467 return ::error(FullMsg);
471BitcodeReaderBase::parseVersionRecord(ArrayRef<uint64_t> Record) {
473 return error(
"Invalid version record");
474 unsigned ModuleVersion =
Record[0];
475 if (ModuleVersion > 2)
476 return error(
"Invalid value");
477 UseStrtab = ModuleVersion >= 2;
478 return ModuleVersion;
481std::pair<StringRef, ArrayRef<uint64_t>>
482BitcodeReaderBase::readNameFromStrtab(ArrayRef<uint64_t> Record) {
486 if (Record[0] + Record[1] > Strtab.
size())
488 return {StringRef(Strtab.
data() + Record[0], Record[1]),
Record.slice(2)};
499class BitcodeConstant final :
public Value,
500 TrailingObjects<BitcodeConstant, unsigned> {
501 friend TrailingObjects;
504 static constexpr uint8_t SubclassID = 255;
512 static constexpr uint8_t ConstantStructOpcode = 255;
513 static constexpr uint8_t ConstantArrayOpcode = 254;
514 static constexpr uint8_t ConstantVectorOpcode = 253;
515 static constexpr uint8_t NoCFIOpcode = 252;
516 static constexpr uint8_t DSOLocalEquivalentOpcode = 251;
517 static constexpr uint8_t BlockAddressOpcode = 250;
518 static constexpr uint8_t ConstantPtrAuthOpcode = 249;
519 static constexpr uint8_t FirstSpecialOpcode = ConstantPtrAuthOpcode;
526 unsigned BlockAddressBB = 0;
527 Type *SrcElemTy =
nullptr;
528 std::optional<ConstantRange>
InRange;
530 ExtraInfo(uint8_t Opcode, uint8_t Flags = 0,
Type *SrcElemTy =
nullptr,
531 std::optional<ConstantRange>
InRange = std::nullopt)
532 : Opcode(Opcode),
Flags(
Flags), SrcElemTy(SrcElemTy),
535 ExtraInfo(uint8_t Opcode, uint8_t Flags,
unsigned BlockAddressBB)
536 : Opcode(Opcode),
Flags(
Flags), BlockAddressBB(BlockAddressBB) {}
541 unsigned NumOperands;
542 unsigned BlockAddressBB;
544 std::optional<ConstantRange>
InRange;
547 BitcodeConstant(
Type *Ty,
const ExtraInfo &Info, ArrayRef<unsigned> OpIDs)
549 NumOperands(OpIDs.
size()), BlockAddressBB(
Info.BlockAddressBB),
554 BitcodeConstant &operator=(
const BitcodeConstant &) =
delete;
558 const ExtraInfo &Info,
559 ArrayRef<unsigned> OpIDs) {
560 void *Mem =
A.Allocate(totalSizeToAlloc<unsigned>(OpIDs.
size()),
561 alignof(BitcodeConstant));
562 return new (Mem) BitcodeConstant(Ty, Info, OpIDs);
565 static bool classof(
const Value *V) {
return V->getValueID() == SubclassID; }
567 ArrayRef<unsigned> getOperandIDs()
const {
568 return ArrayRef(getTrailingObjects(), NumOperands);
571 std::optional<ConstantRange> getInRange()
const {
572 assert(Opcode == Instruction::GetElementPtr);
581class BitcodeReader :
public BitcodeReaderBase,
public GVMaterializer {
583 Module *TheModule =
nullptr;
585 uint64_t NextUnreadBit = 0;
587 uint64_t LastFunctionBlockBit = 0;
588 bool SeenValueSymbolTable =
false;
589 uint64_t VSTOffset = 0;
591 std::vector<std::string> SectionTable;
592 std::vector<std::string> GCTable;
594 std::vector<Type *> TypeList;
598 DenseMap<unsigned, SmallVector<unsigned, 1>> ContainedTypeIDs;
605 DenseMap<std::pair<Type *, unsigned>,
unsigned> VirtualTypeIDs;
606 DenseMap<Function *, unsigned> FunctionTypeIDs;
611 BitcodeReaderValueList ValueList;
612 std::optional<MetadataLoader> MDLoader;
613 std::vector<Comdat *> ComdatList;
614 DenseSet<GlobalObject *> ImplicitComdatObjects;
617 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInits;
618 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInits;
620 struct FunctionOperandInfo {
622 unsigned PersonalityFn;
626 std::vector<FunctionOperandInfo> FunctionOperands;
630 std::vector<AttributeList> MAttributes;
633 std::map<unsigned, AttributeList> MAttributeGroups;
637 std::vector<BasicBlock*> FunctionBBs;
641 std::vector<Function*> FunctionsWithBodies;
645 DenseMap<Function *, Function *> 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;
703 bool SkipDebugIntrinsicUpgrade =
false;
706 BitcodeReader(BitstreamCursor Stream, StringRef Strtab,
707 StringRef ProducerIdentification, LLVMContext &
Context);
709 Error materializeForwardReferencedFunctions();
711 Error materialize(GlobalValue *GV)
override;
712 Error materializeModule()
override;
713 std::vector<StructType *> getIdentifiedStructTypes()
const override;
717 Error parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
718 bool IsImporting, ParserCallbacks Callbacks = {});
720 static uint64_t decodeSignRotatedValue(uint64_t V);
723 Error materializeMetadata()
override;
725 void setStripDebugInfo()
override;
728 std::vector<StructType *> IdentifiedStructTypes;
729 StructType *createIdentifiedStructType(LLVMContext &
Context, StringRef Name);
730 StructType *createIdentifiedStructType(LLVMContext &
Context);
732 static constexpr unsigned InvalidTypeID = ~0
u;
734 Type *getTypeByID(
unsigned ID);
735 Type *getPtrElementTypeByID(
unsigned ID);
736 unsigned getContainedTypeID(
unsigned ID,
unsigned Idx = 0);
737 unsigned getVirtualTypeID(
Type *Ty, ArrayRef<unsigned> ContainedTypeIDs = {});
740 Expected<Value *> materializeValue(
unsigned ValID, BasicBlock *InsertBB);
741 Expected<Constant *> getValueForInitializer(
unsigned ID);
743 Value *getFnValueByID(
unsigned ID,
Type *Ty,
unsigned TyID,
744 BasicBlock *ConstExprInsertBB) {
751 return MDLoader->getMetadataFwdRefOrLoad(
ID);
755 if (
ID >= FunctionBBs.size())
return nullptr;
756 return FunctionBBs[
ID];
760 if (i-1 < MAttributes.size())
761 return MAttributes[i-1];
762 return AttributeList();
768 bool getValueTypePair(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
769 unsigned InstNum,
Value *&ResVal,
unsigned &
TypeID,
770 BasicBlock *ConstExprInsertBB) {
771 if (Slot ==
Record.size())
return true;
772 unsigned ValNo = (unsigned)Record[Slot++];
775 ValNo = InstNum - ValNo;
776 if (ValNo < InstNum) {
780 ResVal = getFnValueByID(ValNo,
nullptr,
TypeID, ConstExprInsertBB);
782 "Incorrect type ID stored for value");
783 return ResVal ==
nullptr;
785 if (Slot ==
Record.size())
788 TypeID = (unsigned)Record[Slot++];
789 ResVal = getFnValueByID(ValNo, getTypeByID(
TypeID),
TypeID,
791 return ResVal ==
nullptr;
794 bool getValueOrMetadata(
const SmallVectorImpl<uint64_t> &Record,
795 unsigned &Slot,
unsigned InstNum,
Value *&ResVal,
796 BasicBlock *ConstExprInsertBB) {
797 if (Slot ==
Record.size())
802 return getValueTypePair(Record, --Slot, InstNum, ResVal, TypeId,
805 if (Slot ==
Record.size())
807 unsigned ValNo = InstNum - (unsigned)Record[Slot++];
815 bool popValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
816 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
817 BasicBlock *ConstExprInsertBB) {
818 if (
getValue(Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
826 bool getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
827 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
828 BasicBlock *ConstExprInsertBB) {
829 ResVal =
getValue(Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
830 return ResVal ==
nullptr;
835 Value *
getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
836 unsigned InstNum,
Type *Ty,
unsigned TyID,
837 BasicBlock *ConstExprInsertBB) {
838 if (Slot ==
Record.size())
return nullptr;
839 unsigned ValNo = (unsigned)Record[Slot];
842 ValNo = InstNum - ValNo;
843 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
847 Value *getValueSigned(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
848 unsigned InstNum,
Type *Ty,
unsigned TyID,
849 BasicBlock *ConstExprInsertBB) {
850 if (Slot ==
Record.size())
return nullptr;
851 unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]);
854 ValNo = InstNum - ValNo;
855 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
858 Expected<ConstantRange> readConstantRange(ArrayRef<uint64_t> Record,
861 if (
Record.size() - OpNum < 2)
862 return error(
"Too few records for range");
864 unsigned LowerActiveWords =
Record[OpNum];
865 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
866 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
867 return error(
"Too few records for range");
870 OpNum += LowerActiveWords;
873 OpNum += UpperActiveWords;
876 int64_t
Start = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
877 int64_t End = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
878 return ConstantRange(APInt(
BitWidth, Start,
true),
883 Expected<ConstantRange>
884 readBitWidthAndConstantRange(ArrayRef<uint64_t> Record,
unsigned &OpNum) {
885 if (
Record.size() - OpNum < 1)
886 return error(
"Too few records for range");
888 return readConstantRange(Record, OpNum,
BitWidth);
894 Error propagateAttributeTypes(CallBase *CB, ArrayRef<unsigned> ArgsTys);
899 Error parseAlignmentValue(uint64_t
Exponent, MaybeAlign &Alignment);
900 Error parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind);
902 ParserCallbacks Callbacks = {});
904 Error parseComdatRecord(ArrayRef<uint64_t> Record);
905 Error parseGlobalVarRecord(ArrayRef<uint64_t> Record);
906 Error parseFunctionRecord(ArrayRef<uint64_t> Record);
907 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
908 ArrayRef<uint64_t> Record);
910 Error parseAttributeBlock();
911 Error parseAttributeGroupBlock();
912 Error parseTypeTable();
913 Error parseTypeTableBody();
914 Error parseOperandBundleTags();
915 Error parseSyncScopeNames();
917 Expected<Value *> recordValue(SmallVectorImpl<uint64_t> &Record,
918 unsigned NameIndex, Triple &TT);
919 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta, Function *
F,
920 ArrayRef<uint64_t> Record);
922 Error parseGlobalValueSymbolTable();
923 Error parseConstants();
924 Error rememberAndSkipFunctionBodies();
925 Error rememberAndSkipFunctionBody();
927 Error rememberAndSkipMetadata();
929 Error parseFunctionBody(Function *
F);
930 Error globalCleanup();
931 Error resolveGlobalAndIndirectSymbolInits();
932 Error parseUseLists();
933 Error findFunctionInStream(
935 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator);
942class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
944 ModuleSummaryIndex &TheIndex;
948 bool SeenGlobalValSummary =
false;
951 bool SeenValueSymbolTable =
false;
955 uint64_t VSTOffset = 0;
965 DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
966 ValueIdToValueInfoMap;
972 DenseMap<uint64_t, StringRef> ModuleIdMap;
975 std::string SourceFileName;
979 StringRef ModulePath;
987 std::vector<uint64_t> StackIds;
991 std::vector<uint64_t> RadixArray;
996 std::vector<unsigned> StackIdToIndex;
999 ModuleSummaryIndexBitcodeReader(
1000 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
1001 StringRef ModulePath,
1007 void setValueGUID(uint64_t ValueID, StringRef
ValueName,
1009 StringRef SourceFileName);
1010 Error parseValueSymbolTable(
1012 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
1015 makeCallList(ArrayRef<uint64_t> Record,
bool IsOldProfileFormat,
1016 bool HasProfile,
bool HasRelBF);
1017 Error parseEntireSummary(
unsigned ID);
1018 Error parseModuleStringTable();
1019 void parseTypeIdCompatibleVtableSummaryRecord(ArrayRef<uint64_t> Record);
1020 void parseTypeIdCompatibleVtableInfo(ArrayRef<uint64_t> Record,
size_t &Slot,
1022 std::vector<FunctionSummary::ParamAccess>
1023 parseParamAccesses(ArrayRef<uint64_t> Record);
1024 SmallVector<unsigned> parseAllocInfoContext(ArrayRef<uint64_t> Record,
1028 static constexpr unsigned UninitializedStackIdIndex =
1029 std::numeric_limits<unsigned>::max();
1031 unsigned getStackIdIndex(
unsigned LocalIndex) {
1032 unsigned &
Index = StackIdToIndex[LocalIndex];
1035 if (Index == UninitializedStackIdIndex)
1040 template <
bool AllowNullValueInfo = false>
1041 std::pair<ValueInfo, GlobalValue::GUID>
1042 getValueInfoFromValueId(
unsigned ValueId);
1044 void addThisModule();
1060 return std::error_code();
1066 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1067 ValueList(this->Stream.SizeInBytes(),
1069 return materializeValue(
ValID, InsertBB);
1071 this->ProducerIdentification = std::string(ProducerIdentification);
1074Error BitcodeReader::materializeForwardReferencedFunctions() {
1075 if (WillMaterializeAllForwardRefs)
1079 WillMaterializeAllForwardRefs =
true;
1081 while (!BasicBlockFwdRefQueue.empty()) {
1082 Function *
F = BasicBlockFwdRefQueue.front();
1083 BasicBlockFwdRefQueue.pop_front();
1084 assert(
F &&
"Expected valid function");
1085 if (!BasicBlockFwdRefs.
count(
F))
1093 if (!
F->isMaterializable())
1094 return error(
"Never resolved function from blockaddress");
1097 if (
Error Err = materialize(
F))
1100 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1102 for (Function *
F : BackwardRefFunctions)
1103 if (
Error Err = materialize(
F))
1105 BackwardRefFunctions.clear();
1108 WillMaterializeAllForwardRefs =
false;
1173 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1174 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1175 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1176 Flags.NoInline = (RawFlags >> 4) & 0x1;
1177 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1178 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1179 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1180 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1181 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1197 bool NoRenameOnPromotion = ((RawFlags >> 11) & 1);
1198 RawFlags = RawFlags >> 4;
1199 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1203 bool Live = (RawFlags & 0x2) || Version < 3;
1204 bool Local = (RawFlags & 0x4);
1205 bool AutoHide = (RawFlags & 0x8);
1208 Live,
Local, AutoHide, IK,
1209 NoRenameOnPromotion);
1215 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1216 (RawFlags & 0x4) ?
true :
false,
1220static std::pair<CalleeInfo::HotnessType, bool>
1224 bool HasTailCall = (RawFlags & 0x8);
1225 return {Hotness, HasTailCall};
1230 bool &HasTailCall) {
1231 static constexpr unsigned RelBlockFreqBits = 28;
1232 static constexpr uint64_t RelBlockFreqMask = (1 << RelBlockFreqBits) - 1;
1233 RelBF = RawFlags & RelBlockFreqMask;
1234 HasTailCall = (RawFlags & (1 << RelBlockFreqBits));
1259 case 0:
return false;
1260 case 1:
return true;
1322 bool IsFP = Ty->isFPOrFPVectorTy();
1324 if (!IsFP && !Ty->isIntOrIntVectorTy())
1331 return IsFP ? Instruction::FNeg : -1;
1336 bool IsFP = Ty->isFPOrFPVectorTy();
1338 if (!IsFP && !Ty->isIntOrIntVectorTy())
1345 return IsFP ? Instruction::FAdd : Instruction::Add;
1347 return IsFP ? Instruction::FSub : Instruction::Sub;
1349 return IsFP ? Instruction::FMul : Instruction::Mul;
1351 return IsFP ? -1 : Instruction::UDiv;
1353 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1355 return IsFP ? -1 : Instruction::URem;
1357 return IsFP ? Instruction::FRem : Instruction::SRem;
1359 return IsFP ? -1 : Instruction::Shl;
1361 return IsFP ? -1 : Instruction::LShr;
1363 return IsFP ? -1 : Instruction::AShr;
1365 return IsFP ? -1 : Instruction::And;
1367 return IsFP ? -1 : Instruction::Or;
1369 return IsFP ? -1 : Instruction::Xor;
1374 bool &IsElementwise) {
1472Type *BitcodeReader::getTypeByID(
unsigned ID) {
1474 if (
ID >= TypeList.size())
1477 if (
Type *Ty = TypeList[
ID])
1482 return TypeList[
ID] = createIdentifiedStructType(
Context);
1485unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1486 auto It = ContainedTypeIDs.
find(
ID);
1487 if (It == ContainedTypeIDs.
end())
1488 return InvalidTypeID;
1490 if (Idx >= It->second.size())
1491 return InvalidTypeID;
1493 return It->second[Idx];
1496Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1497 if (
ID >= TypeList.size())
1504 return getTypeByID(getContainedTypeID(
ID, 0));
1507unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1508 ArrayRef<unsigned> ChildTypeIDs) {
1509 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1510 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1511 auto It = VirtualTypeIDs.
find(CacheKey);
1512 if (It != VirtualTypeIDs.
end()) {
1518 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1519 "Incorrect cached contained type IDs");
1523 unsigned TypeID = TypeList.size();
1524 TypeList.push_back(Ty);
1525 if (!ChildTypeIDs.
empty())
1546 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1560 if (Opcode == Instruction::GetElementPtr)
1564 case Instruction::FNeg:
1565 case Instruction::Select:
1566 case Instruction::ICmp:
1567 case Instruction::FCmp:
1574Expected<Value *> BitcodeReader::materializeValue(
unsigned StartValID,
1575 BasicBlock *InsertBB) {
1577 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1579 return ValueList[StartValID];
1581 SmallDenseMap<unsigned, Value *> MaterializedValues;
1582 SmallVector<unsigned> Worklist;
1584 while (!Worklist.
empty()) {
1585 unsigned ValID = Worklist.
back();
1586 if (MaterializedValues.
count(ValID)) {
1592 if (ValID >= ValueList.
size() || !ValueList[ValID])
1593 return error(
"Invalid value ID");
1595 Value *
V = ValueList[ValID];
1598 MaterializedValues.
insert({ValID,
V});
1606 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1607 auto It = MaterializedValues.
find(OpID);
1608 if (It != MaterializedValues.
end())
1609 Ops.push_back(It->second);
1616 if (
Ops.size() != BC->getOperandIDs().size())
1618 std::reverse(
Ops.begin(),
Ops.end());
1635 switch (BC->Opcode) {
1636 case BitcodeConstant::ConstantPtrAuthOpcode: {
1639 return error(
"ptrauth key operand must be ConstantInt");
1643 return error(
"ptrauth disc operand must be ConstantInt");
1646 ConstOps.
size() > 4 ? ConstOps[4]
1651 "ptrauth deactivation symbol operand must be a pointer");
1654 DeactivationSymbol);
1657 case BitcodeConstant::NoCFIOpcode: {
1660 return error(
"no_cfi operand must be GlobalValue");
1664 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1667 return error(
"dso_local operand must be GlobalValue");
1671 case BitcodeConstant::BlockAddressOpcode: {
1674 return error(
"blockaddress operand must be a function");
1679 unsigned BBID = BC->BlockAddressBB;
1682 return error(
"Invalid ID");
1685 for (
size_t I = 0,
E = BBID;
I !=
E; ++
I) {
1687 return error(
"Invalid ID");
1694 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1696 BasicBlockFwdRefQueue.push_back(Fn);
1697 if (FwdBBs.size() < BBID + 1)
1698 FwdBBs.resize(BBID + 1);
1706 case BitcodeConstant::ConstantStructOpcode: {
1708 if (
ST->getNumElements() != ConstOps.
size())
1709 return error(
"Invalid number of elements in struct initializer");
1711 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1712 if (
Op->getType() != Ty)
1713 return error(
"Incorrect type in struct initializer");
1718 case BitcodeConstant::ConstantArrayOpcode: {
1720 if (AT->getNumElements() != ConstOps.
size())
1721 return error(
"Invalid number of elements in array initializer");
1723 for (Constant *
Op : ConstOps)
1724 if (
Op->getType() != AT->getElementType())
1725 return error(
"Incorrect type in array initializer");
1730 case BitcodeConstant::ConstantVectorOpcode: {
1732 if (VT->getNumElements() != ConstOps.size())
1733 return error(
"Invalid number of elements in vector initializer");
1735 for (Constant *
Op : ConstOps)
1736 if (
Op->getType() != VT->getElementType())
1737 return error(
"Incorrect type in vector initializer");
1742 case Instruction::GetElementPtr:
1744 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1747 case Instruction::ExtractElement:
1750 case Instruction::InsertElement:
1754 case Instruction::ShuffleVector: {
1755 SmallVector<int, 16>
Mask;
1767 MaterializedValues.
insert({ValID,
C});
1773 return error(Twine(
"Value referenced by initializer is an unsupported "
1774 "constant expression of type ") +
1775 BC->getOpcodeName());
1781 BC->getType(),
"constexpr", InsertBB);
1784 "constexpr", InsertBB);
1787 Ops[1],
"constexpr", InsertBB);
1790 I->setHasNoSignedWrap();
1792 I->setHasNoUnsignedWrap();
1798 switch (BC->Opcode) {
1799 case BitcodeConstant::ConstantVectorOpcode: {
1800 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1803 Value *Idx = ConstantInt::get(IdxTy, Pair.index());
1810 case BitcodeConstant::ConstantStructOpcode:
1811 case BitcodeConstant::ConstantArrayOpcode: {
1815 "constexpr.ins", InsertBB);
1819 case Instruction::ICmp:
1820 case Instruction::FCmp:
1823 "constexpr", InsertBB);
1825 case Instruction::GetElementPtr:
1831 case Instruction::Select:
1834 case Instruction::ExtractElement:
1837 case Instruction::InsertElement:
1841 case Instruction::ShuffleVector:
1842 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1850 MaterializedValues.
insert({ValID,
I});
1854 return MaterializedValues[StartValID];
1857Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1858 Expected<Value *> MaybeV = materializeValue(
ID,
nullptr);
1866StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1869 IdentifiedStructTypes.push_back(Ret);
1873StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1875 IdentifiedStructTypes.push_back(Ret);
1891 case Attribute::ZExt:
return 1 << 0;
1892 case Attribute::SExt:
return 1 << 1;
1893 case Attribute::NoReturn:
return 1 << 2;
1894 case Attribute::InReg:
return 1 << 3;
1895 case Attribute::StructRet:
return 1 << 4;
1896 case Attribute::NoUnwind:
return 1 << 5;
1897 case Attribute::NoAlias:
return 1 << 6;
1898 case Attribute::ByVal:
return 1 << 7;
1899 case Attribute::Nest:
return 1 << 8;
1900 case Attribute::ReadNone:
return 1 << 9;
1901 case Attribute::ReadOnly:
return 1 << 10;
1902 case Attribute::NoInline:
return 1 << 11;
1903 case Attribute::AlwaysInline:
return 1 << 12;
1904 case Attribute::OptimizeForSize:
return 1 << 13;
1905 case Attribute::StackProtect:
return 1 << 14;
1906 case Attribute::StackProtectReq:
return 1 << 15;
1907 case Attribute::Alignment:
return 31 << 16;
1909 case Attribute::NoRedZone:
return 1 << 22;
1910 case Attribute::NoImplicitFloat:
return 1 << 23;
1911 case Attribute::Naked:
return 1 << 24;
1912 case Attribute::InlineHint:
return 1 << 25;
1913 case Attribute::StackAlignment:
return 7 << 26;
1914 case Attribute::ReturnsTwice:
return 1 << 29;
1915 case Attribute::UWTable:
return 1 << 30;
1916 case Attribute::NonLazyBind:
return 1U << 31;
1917 case Attribute::SanitizeAddress:
return 1ULL << 32;
1918 case Attribute::MinSize:
return 1ULL << 33;
1919 case Attribute::NoDuplicate:
return 1ULL << 34;
1920 case Attribute::StackProtectStrong:
return 1ULL << 35;
1921 case Attribute::SanitizeThread:
return 1ULL << 36;
1922 case Attribute::SanitizeMemory:
return 1ULL << 37;
1923 case Attribute::NoBuiltin:
return 1ULL << 38;
1924 case Attribute::Returned:
return 1ULL << 39;
1925 case Attribute::Cold:
return 1ULL << 40;
1926 case Attribute::Builtin:
return 1ULL << 41;
1927 case Attribute::OptimizeNone:
return 1ULL << 42;
1928 case Attribute::InAlloca:
return 1ULL << 43;
1929 case Attribute::NonNull:
return 1ULL << 44;
1930 case Attribute::JumpTable:
return 1ULL << 45;
1931 case Attribute::Convergent:
return 1ULL << 46;
1932 case Attribute::SafeStack:
return 1ULL << 47;
1933 case Attribute::NoRecurse:
return 1ULL << 48;
1936 case Attribute::SwiftSelf:
return 1ULL << 51;
1937 case Attribute::SwiftError:
return 1ULL << 52;
1938 case Attribute::WriteOnly:
return 1ULL << 53;
1939 case Attribute::Speculatable:
return 1ULL << 54;
1940 case Attribute::StrictFP:
return 1ULL << 55;
1941 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1942 case Attribute::NoCfCheck:
return 1ULL << 57;
1943 case Attribute::OptForFuzzing:
return 1ULL << 58;
1944 case Attribute::ShadowCallStack:
return 1ULL << 59;
1945 case Attribute::SpeculativeLoadHardening:
1947 case Attribute::ImmArg:
1949 case Attribute::WillReturn:
1951 case Attribute::NoFree:
1967 if (
I == Attribute::Alignment)
1968 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1969 else if (
I == Attribute::StackAlignment)
1970 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1972 B.addTypeAttr(
I,
nullptr);
1986 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
1988 "Alignment must be a power of two.");
1991 B.addAlignmentAttr(Alignment);
1993 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
1994 (EncodedAttrs & 0xffff);
1996 if (AttrIdx == AttributeList::FunctionIndex) {
1999 if (Attrs & (1ULL << 9)) {
2001 Attrs &= ~(1ULL << 9);
2004 if (Attrs & (1ULL << 10)) {
2006 Attrs &= ~(1ULL << 10);
2009 if (Attrs & (1ULL << 49)) {
2011 Attrs &= ~(1ULL << 49);
2014 if (Attrs & (1ULL << 50)) {
2016 Attrs &= ~(1ULL << 50);
2019 if (Attrs & (1ULL << 53)) {
2021 Attrs &= ~(1ULL << 53);
2025 B.addMemoryAttr(ME);
2029 if (Attrs & (1ULL << 21)) {
2030 Attrs &= ~(1ULL << 21);
2037Error BitcodeReader::parseAttributeBlock() {
2041 if (!MAttributes.empty())
2042 return error(
"Invalid multiple blocks");
2044 SmallVector<uint64_t, 64>
Record;
2053 BitstreamEntry
Entry = MaybeEntry.
get();
2055 switch (
Entry.Kind) {
2058 return error(
"Malformed block");
2071 switch (MaybeRecord.
get()) {
2077 return error(
"Invalid parameter attribute record");
2079 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2085 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2089 for (uint64_t Val : Record)
2090 Attrs.push_back(MAttributeGroups[Val]);
2092 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2105 return Attribute::Alignment;
2107 return Attribute::AlwaysInline;
2109 return Attribute::Builtin;
2111 return Attribute::ByVal;
2113 return Attribute::InAlloca;
2115 return Attribute::Cold;
2117 return Attribute::Convergent;
2119 return Attribute::DisableSanitizerInstrumentation;
2121 return Attribute::ElementType;
2123 return Attribute::FnRetThunkExtern;
2125 return Attribute::Flatten;
2127 return Attribute::InlineHint;
2129 return Attribute::InReg;
2131 return Attribute::JumpTable;
2133 return Attribute::Memory;
2135 return Attribute::NoFPClass;
2137 return Attribute::MinSize;
2139 return Attribute::Naked;
2141 return Attribute::Nest;
2143 return Attribute::NoAlias;
2145 return Attribute::NoBuiltin;
2147 return Attribute::NoCallback;
2149 return Attribute::NoDivergenceSource;
2151 return Attribute::NoDuplicate;
2153 return Attribute::NoFree;
2155 return Attribute::NoImplicitFloat;
2157 return Attribute::NoInline;
2159 return Attribute::NoRecurse;
2161 return Attribute::NoMerge;
2163 return Attribute::NonLazyBind;
2165 return Attribute::NonNull;
2167 return Attribute::Dereferenceable;
2169 return Attribute::DereferenceableOrNull;
2171 return Attribute::AllocAlign;
2173 return Attribute::AllocKind;
2175 return Attribute::AllocSize;
2177 return Attribute::AllocatedPointer;
2179 return Attribute::NoRedZone;
2181 return Attribute::NoReturn;
2183 return Attribute::NoSync;
2185 return Attribute::NoCfCheck;
2187 return Attribute::NoProfile;
2189 return Attribute::SkipProfile;
2191 return Attribute::NoUnwind;
2193 return Attribute::NoSanitizeBounds;
2195 return Attribute::NoSanitizeCoverage;
2197 return Attribute::NullPointerIsValid;
2199 return Attribute::OptimizeForDebugging;
2201 return Attribute::OptForFuzzing;
2203 return Attribute::OptimizeForSize;
2205 return Attribute::OptimizeNone;
2207 return Attribute::ReadNone;
2209 return Attribute::ReadOnly;
2211 return Attribute::Returned;
2213 return Attribute::ReturnsTwice;
2215 return Attribute::SExt;
2217 return Attribute::Speculatable;
2219 return Attribute::StackAlignment;
2221 return Attribute::StackProtect;
2223 return Attribute::StackProtectReq;
2225 return Attribute::StackProtectStrong;
2227 return Attribute::SafeStack;
2229 return Attribute::ShadowCallStack;
2231 return Attribute::StrictFP;
2233 return Attribute::StructRet;
2235 return Attribute::SanitizeAddress;
2237 return Attribute::SanitizeHWAddress;
2239 return Attribute::SanitizeThread;
2241 return Attribute::SanitizeType;
2243 return Attribute::SanitizeMemory;
2245 return Attribute::SanitizeNumericalStability;
2247 return Attribute::SanitizeRealtime;
2249 return Attribute::SanitizeRealtimeBlocking;
2251 return Attribute::SanitizeAllocToken;
2253 return Attribute::SpeculativeLoadHardening;
2255 return Attribute::SwiftError;
2257 return Attribute::SwiftSelf;
2259 return Attribute::SwiftAsync;
2261 return Attribute::UWTable;
2263 return Attribute::VScaleRange;
2265 return Attribute::WillReturn;
2267 return Attribute::WriteOnly;
2269 return Attribute::ZExt;
2271 return Attribute::ImmArg;
2273 return Attribute::SanitizeMemTag;
2275 return Attribute::Preallocated;
2277 return Attribute::NoUndef;
2279 return Attribute::ByRef;
2281 return Attribute::MustProgress;
2283 return Attribute::Hot;
2285 return Attribute::PresplitCoroutine;
2287 return Attribute::Writable;
2289 return Attribute::CoroDestroyOnlyWhenComplete;
2291 return Attribute::DeadOnUnwind;
2293 return Attribute::Range;
2295 return Attribute::Initializes;
2297 return Attribute::CoroElideSafe;
2299 return Attribute::NoExt;
2301 return Attribute::Captures;
2303 return Attribute::DeadOnReturn;
2305 return Attribute::NoCreateUndefOrPoison;
2307 return Attribute::DenormalFPEnv;
2309 return Attribute::NoOutline;
2311 return Attribute::NoIPA;
2316 MaybeAlign &Alignment) {
2319 if (
Exponent > Value::MaxAlignmentExponent + 1)
2320 return error(
"Invalid alignment value");
2325Error BitcodeReader::parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind) {
2327 if (*Kind == Attribute::None)
2328 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2333 switch (EncodedKind) {
2357Error BitcodeReader::parseAttributeGroupBlock() {
2361 if (!MAttributeGroups.empty())
2362 return error(
"Invalid multiple blocks");
2364 SmallVector<uint64_t, 64>
Record;
2371 BitstreamEntry
Entry = MaybeEntry.
get();
2373 switch (
Entry.Kind) {
2376 return error(
"Malformed block");
2389 switch (MaybeRecord.
get()) {
2394 return error(
"Invalid grp record");
2396 uint64_t GrpID =
Record[0];
2397 uint64_t Idx =
Record[1];
2401 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2402 if (Record[i] == 0) {
2403 Attribute::AttrKind
Kind;
2404 uint64_t EncodedKind =
Record[++i];
2405 if (Idx == AttributeList::FunctionIndex &&
2414 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2420 if (Kind == Attribute::ByVal)
2421 B.addByValAttr(
nullptr);
2422 else if (Kind == Attribute::StructRet)
2423 B.addStructRetAttr(
nullptr);
2424 else if (Kind == Attribute::InAlloca)
2425 B.addInAllocaAttr(
nullptr);
2426 else if (Kind == Attribute::UWTable)
2427 B.addUWTableAttr(UWTableKind::Default);
2428 else if (Kind == Attribute::DeadOnReturn)
2429 B.addDeadOnReturnAttr(DeadOnReturnInfo());
2430 else if (Attribute::isEnumAttrKind(Kind))
2431 B.addAttribute(Kind);
2433 return error(
"Not an enum attribute");
2434 }
else if (Record[i] == 1) {
2435 Attribute::AttrKind
Kind;
2436 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2438 if (!Attribute::isIntAttrKind(Kind))
2439 return error(
"Not an int attribute");
2440 if (Kind == Attribute::Alignment)
2441 B.addAlignmentAttr(Record[++i]);
2442 else if (Kind == Attribute::StackAlignment)
2443 B.addStackAlignmentAttr(Record[++i]);
2444 else if (Kind == Attribute::Dereferenceable)
2445 B.addDereferenceableAttr(Record[++i]);
2446 else if (Kind == Attribute::DereferenceableOrNull)
2447 B.addDereferenceableOrNullAttr(Record[++i]);
2448 else if (Kind == Attribute::DeadOnReturn)
2449 B.addDeadOnReturnAttr(
2451 else if (Kind == Attribute::AllocSize)
2452 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2453 else if (Kind == Attribute::VScaleRange)
2454 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2455 else if (Kind == Attribute::UWTable)
2457 else if (Kind == Attribute::AllocKind)
2458 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2459 else if (Kind == Attribute::Memory) {
2460 uint64_t EncodedME =
Record[++i];
2461 const uint8_t
Version = (EncodedME >> 56);
2473 B.addMemoryAttr(ME);
2478 EncodedME & 0x00FFFFFFFFFFFFFFULL));
2480 }
else if (Kind == Attribute::Captures)
2482 else if (Kind == Attribute::NoFPClass)
2485 else if (Kind == Attribute::DenormalFPEnv) {
2486 B.addDenormalFPEnvAttr(
2489 }
else if (Record[i] == 3 || Record[i] == 4) {
2491 SmallString<64> KindStr;
2492 SmallString<64> ValStr;
2494 while (Record[i] != 0 && i != e)
2496 assert(Record[i] == 0 &&
"Kind string not null terminated");
2501 while (Record[i] != 0 && i != e)
2503 assert(Record[i] == 0 &&
"Value string not null terminated");
2506 B.addAttribute(KindStr.
str(), ValStr.
str());
2507 }
else if (Record[i] == 5 || Record[i] == 6) {
2508 bool HasType =
Record[i] == 6;
2509 Attribute::AttrKind
Kind;
2510 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2512 if (!Attribute::isTypeAttrKind(Kind))
2513 return error(
"Not a type attribute");
2515 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2516 }
else if (Record[i] == 7) {
2517 Attribute::AttrKind
Kind;
2520 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2522 if (!Attribute::isConstantRangeAttrKind(Kind))
2523 return error(
"Not a ConstantRange attribute");
2525 Expected<ConstantRange> MaybeCR =
2526 readBitWidthAndConstantRange(Record, i);
2531 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2532 }
else if (Record[i] == 8) {
2533 Attribute::AttrKind
Kind;
2536 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2538 if (!Attribute::isConstantRangeListAttrKind(Kind))
2539 return error(
"Not a constant range list attribute");
2543 return error(
"Too few records for constant range list");
2544 unsigned RangeSize =
Record[i++];
2546 for (
unsigned Idx = 0; Idx < RangeSize; ++Idx) {
2547 Expected<ConstantRange> MaybeCR =
2548 readConstantRange(Record, i,
BitWidth);
2556 return error(
"Invalid (unordered or overlapping) range list");
2557 B.addConstantRangeListAttr(Kind, Val);
2559 return error(
"Invalid attribute group entry");
2564 B.addMemoryAttr(ME);
2567 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2574Error BitcodeReader::parseTypeTable() {
2578 return parseTypeTableBody();
2581Error BitcodeReader::parseTypeTableBody() {
2582 if (!TypeList.empty())
2583 return error(
"Invalid multiple blocks");
2585 SmallVector<uint64_t, 64>
Record;
2586 unsigned NumRecords = 0;
2595 BitstreamEntry
Entry = MaybeEntry.
get();
2597 switch (
Entry.Kind) {
2600 return error(
"Malformed block");
2602 if (NumRecords != TypeList.size())
2603 return error(
"Malformed block");
2612 Type *ResultTy =
nullptr;
2613 SmallVector<unsigned> ContainedIDs;
2617 switch (MaybeRecord.
get()) {
2619 return error(
"Invalid value");
2624 return error(
"Invalid numentry record");
2625 TypeList.resize(Record[0]);
2628 ResultTy = Type::getVoidTy(
Context);
2631 ResultTy = Type::getHalfTy(
Context);
2634 ResultTy = Type::getBFloatTy(
Context);
2637 ResultTy = Type::getFloatTy(
Context);
2640 ResultTy = Type::getDoubleTy(
Context);
2643 ResultTy = Type::getX86_FP80Ty(
Context);
2646 ResultTy = Type::getFP128Ty(
Context);
2649 ResultTy = Type::getPPC_FP128Ty(
Context);
2652 ResultTy = Type::getLabelTy(
Context);
2655 ResultTy = Type::getMetadataTy(
Context);
2663 ResultTy = Type::getX86_AMXTy(
Context);
2666 ResultTy = Type::getTokenTy(
Context);
2670 return error(
"Invalid record");
2672 uint64_t NumBits =
Record[0];
2675 return error(
"Bitwidth for byte type out of range");
2681 return error(
"Invalid integer record");
2683 uint64_t NumBits =
Record[0];
2686 return error(
"Bitwidth for integer type out of range");
2693 return error(
"Invalid pointer record");
2697 ResultTy = getTypeByID(Record[0]);
2699 !PointerType::isValidElementType(ResultTy))
2700 return error(
"Invalid type");
2707 return error(
"Invalid opaque pointer record");
2716 return error(
"Invalid function record");
2718 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2719 if (
Type *
T = getTypeByID(Record[i]))
2725 ResultTy = getTypeByID(Record[2]);
2726 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2727 return error(
"Invalid type");
2730 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2736 return error(
"Invalid function record");
2738 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2739 if (
Type *
T = getTypeByID(Record[i])) {
2740 if (!FunctionType::isValidArgumentType(
T))
2741 return error(
"Invalid function argument type");
2748 ResultTy = getTypeByID(Record[1]);
2749 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2750 return error(
"Invalid type");
2753 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2758 return error(
"Invalid anon struct record");
2760 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2761 if (
Type *
T = getTypeByID(Record[i]))
2767 return error(
"Invalid type");
2774 return error(
"Invalid struct name record");
2779 return error(
"Invalid named struct record");
2781 if (NumRecords >= TypeList.size())
2782 return error(
"Invalid TYPE table");
2788 TypeList[NumRecords] =
nullptr;
2790 Res = createIdentifiedStructType(
Context, TypeName);
2794 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2795 if (
Type *
T = getTypeByID(Record[i]))
2801 return error(
"Invalid named struct record");
2810 return error(
"Invalid opaque type record");
2812 if (NumRecords >= TypeList.size())
2813 return error(
"Invalid TYPE table");
2819 TypeList[NumRecords] =
nullptr;
2821 Res = createIdentifiedStructType(
Context, TypeName);
2828 return error(
"Invalid target extension type record");
2830 if (NumRecords >= TypeList.size())
2831 return error(
"Invalid TYPE table");
2833 if (Record[0] >=
Record.size())
2834 return error(
"Too many type parameters");
2836 unsigned NumTys =
Record[0];
2838 SmallVector<unsigned, 8> IntParams;
2839 for (
unsigned i = 0; i < NumTys; i++) {
2840 if (
Type *
T = getTypeByID(Record[i + 1]))
2843 return error(
"Invalid type");
2846 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2847 if (Record[i] > UINT_MAX)
2848 return error(
"Integer parameter too large");
2853 if (
auto E = TTy.takeError())
2861 return error(
"Invalid array type record");
2862 ResultTy = getTypeByID(Record[1]);
2863 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2864 return error(
"Invalid type");
2866 ResultTy = ArrayType::get(ResultTy, Record[0]);
2871 return error(
"Invalid vector type record");
2873 return error(
"Invalid vector length");
2874 ResultTy = getTypeByID(Record[1]);
2875 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2876 return error(
"Invalid type");
2879 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2883 if (NumRecords >= TypeList.size())
2884 return error(
"Invalid TYPE table");
2885 if (TypeList[NumRecords])
2887 "Invalid TYPE table: Only named structs can be forward referenced");
2888 assert(ResultTy &&
"Didn't read a type?");
2889 TypeList[NumRecords] = ResultTy;
2890 if (!ContainedIDs.
empty())
2891 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2896Error BitcodeReader::parseOperandBundleTags() {
2900 if (!BundleTags.empty())
2901 return error(
"Invalid multiple blocks");
2903 SmallVector<uint64_t, 64>
Record;
2909 BitstreamEntry
Entry = MaybeEntry.
get();
2911 switch (
Entry.Kind) {
2914 return error(
"Malformed block");
2928 return error(
"Invalid operand bundle record");
2931 BundleTags.emplace_back();
2933 return error(
"Invalid operand bundle record");
2938Error BitcodeReader::parseSyncScopeNames() {
2943 return error(
"Invalid multiple synchronization scope names blocks");
2945 SmallVector<uint64_t, 64>
Record;
2950 BitstreamEntry
Entry = MaybeEntry.
get();
2952 switch (
Entry.Kind) {
2955 return error(
"Malformed block");
2958 return error(
"Invalid empty synchronization scope names block");
2972 return error(
"Invalid sync scope record");
2974 SmallString<16> SSN;
2976 return error(
"Invalid sync scope record");
2984Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
2985 unsigned NameIndex, Triple &TT) {
2988 return error(
"Invalid record");
2989 unsigned ValueID =
Record[0];
2990 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2991 return error(
"Invalid record");
2992 Value *
V = ValueList[ValueID];
2995 if (NameStr.contains(0))
2996 return error(
"Invalid value name");
2997 V->setName(NameStr);
2999 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
3012 return std::move(JumpFailed);
3018 return error(
"Expected value symbol table subblock");
3022void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
3024 ArrayRef<uint64_t> Record) {
3028 uint64_t FuncWordOffset =
Record[1] - 1;
3029 uint64_t FuncBitOffset = FuncWordOffset * 32;
3030 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
3034 if (FuncBitOffset > LastFunctionBlockBit)
3035 LastFunctionBlockBit = FuncBitOffset;
3039Error BitcodeReader::parseGlobalValueSymbolTable() {
3040 unsigned FuncBitcodeOffsetDelta =
3046 SmallVector<uint64_t, 64>
Record;
3051 BitstreamEntry
Entry = MaybeEntry.
get();
3053 switch (
Entry.Kind) {
3056 return error(
"Malformed block");
3067 switch (MaybeRecord.
get()) {
3069 unsigned ValueID =
Record[0];
3070 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3071 return error(
"Invalid value reference in symbol table");
3072 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3082Error BitcodeReader::parseValueSymbolTable(uint64_t
Offset) {
3083 uint64_t CurrentBit;
3089 if (!MaybeCurrentBit)
3091 CurrentBit = MaybeCurrentBit.
get();
3094 if (
Error Err = parseGlobalValueSymbolTable())
3115 unsigned FuncBitcodeOffsetDelta =
3121 SmallVector<uint64_t, 64>
Record;
3132 BitstreamEntry
Entry = MaybeEntry.
get();
3134 switch (
Entry.Kind) {
3137 return error(
"Malformed block");
3153 switch (MaybeRecord.
get()) {
3157 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3165 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3173 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3178 return error(
"Invalid bbentry record");
3181 return error(
"Invalid bbentry record");
3193uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {
3203Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3204 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3205 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3206 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3208 GlobalInitWorklist.swap(GlobalInits);
3209 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3210 FunctionOperandWorklist.swap(FunctionOperands);
3212 while (!GlobalInitWorklist.empty()) {
3213 unsigned ValID = GlobalInitWorklist.back().second;
3214 if (ValID >= ValueList.
size()) {
3216 GlobalInits.push_back(GlobalInitWorklist.back());
3218 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3221 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3223 GlobalInitWorklist.pop_back();
3226 while (!IndirectSymbolInitWorklist.empty()) {
3227 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3228 if (ValID >= ValueList.
size()) {
3229 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3231 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3235 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3238 return error(
"Alias and aliasee types don't match");
3243 return error(
"Expected an alias or an ifunc");
3246 IndirectSymbolInitWorklist.pop_back();
3249 while (!FunctionOperandWorklist.empty()) {
3250 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3251 if (
Info.PersonalityFn) {
3252 unsigned ValID =
Info.PersonalityFn - 1;
3253 if (ValID < ValueList.
size()) {
3254 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3257 Info.F->setPersonalityFn(MaybeC.
get());
3258 Info.PersonalityFn = 0;
3262 unsigned ValID =
Info.Prefix - 1;
3263 if (ValID < ValueList.
size()) {
3264 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3267 Info.F->setPrefixData(MaybeC.
get());
3271 if (
Info.Prologue) {
3272 unsigned ValID =
Info.Prologue - 1;
3273 if (ValID < ValueList.
size()) {
3274 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3277 Info.F->setPrologueData(MaybeC.
get());
3281 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3282 FunctionOperands.push_back(Info);
3283 FunctionOperandWorklist.pop_back();
3292 BitcodeReader::decodeSignRotatedValue);
3294 return APInt(TypeBits, Words);
3297Error BitcodeReader::parseConstants() {
3305 unsigned Int32TyID = getVirtualTypeID(CurTy);
3306 unsigned CurTyID = Int32TyID;
3307 Type *CurElemTy =
nullptr;
3308 unsigned NextCstNo = ValueList.
size();
3316 switch (Entry.Kind) {
3319 return error(
"Malformed block");
3321 if (NextCstNo != ValueList.
size())
3322 return error(
"Invalid constant reference");
3333 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
3336 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3346 return error(
"Invalid settype record");
3347 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3348 return error(
"Invalid settype record");
3349 if (TypeList[Record[0]] == VoidType)
3350 return error(
"Invalid constant type");
3352 CurTy = TypeList[CurTyID];
3353 CurElemTy = getPtrElementTypeByID(CurTyID);
3357 return error(
"Invalid type for a constant null value");
3360 return error(
"Invalid type for a constant null value");
3365 return error(
"Invalid integer const record");
3370 return error(
"Invalid wide integer const record");
3373 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3374 V = ConstantInt::get(CurTy, VInt);
3379 return error(
"Invalid byte const record");
3380 V = ConstantByte::get(CurTy, decodeSignRotatedValue(Record[0]),
3385 return error(
"Invalid wide byte const record");
3388 APInt VByte =
readWideAPInt(Record, ScalarTy->getBitWidth());
3389 V = ConstantByte::get(CurTy, VByte);
3394 return error(
"Invalid float const record");
3397 if (ScalarTy->isHalfTy())
3398 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3399 APInt(16, (uint16_t)Record[0])));
3400 else if (ScalarTy->isBFloatTy())
3401 V = ConstantFP::get(
3402 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3403 else if (ScalarTy->isFloatTy())
3404 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3405 APInt(32, (uint32_t)Record[0])));
3406 else if (ScalarTy->isDoubleTy())
3407 V = ConstantFP::get(
3408 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3409 else if (ScalarTy->isX86_FP80Ty()) {
3411 uint64_t Rearrange[2];
3412 Rearrange[0] = (
Record[1] & 0xffffLL) | (Record[0] << 16);
3413 Rearrange[1] =
Record[0] >> 48;
3414 V = ConstantFP::get(
3415 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3416 }
else if (ScalarTy->isFP128Ty())
3417 V = ConstantFP::get(CurTy,
3418 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3419 else if (ScalarTy->isPPC_FP128Ty())
3420 V = ConstantFP::get(
3421 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3429 return error(
"Invalid aggregate record");
3431 SmallVector<unsigned, 16> Elts;
3435 V = BitcodeConstant::create(
3436 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3438 V = BitcodeConstant::create(
Alloc, CurTy,
3439 BitcodeConstant::ConstantArrayOpcode, Elts);
3441 V = BitcodeConstant::create(
3442 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3451 return error(
"Invalid string record");
3461 return error(
"Invalid data record");
3465 return error(
"Invalid type for value");
3468 SmallString<128> RawData;
3470 for (uint64_t Val : Record) {
3471 const char *Src =
reinterpret_cast<const char *
>(&Val);
3473 Src +=
sizeof(uint64_t) - EltBytes;
3474 RawData.
append(Src, Src + EltBytes);
3479 : ConstantDataArray::getRaw(RawData.str(),
Record.
size(), EltTy);
3484 return error(
"Invalid unary op constexpr record");
3489 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3495 return error(
"Invalid binary op constexpr record");
3501 if (
Record.size() >= 4) {
3502 if (
Opc == Instruction::Add ||
3503 Opc == Instruction::Sub ||
3504 Opc == Instruction::Mul ||
3505 Opc == Instruction::Shl) {
3510 }
else if (
Opc == Instruction::SDiv ||
3511 Opc == Instruction::UDiv ||
3512 Opc == Instruction::LShr ||
3513 Opc == Instruction::AShr) {
3518 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3519 {(unsigned)Record[1], (
unsigned)
Record[2]});
3525 return error(
"Invalid cast constexpr record");
3530 unsigned OpTyID =
Record[1];
3531 Type *OpTy = getTypeByID(OpTyID);
3533 return error(
"Invalid cast constexpr record");
3534 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3546 return error(
"Constant GEP record must have at least two elements");
3548 Type *PointeeType =
nullptr;
3552 PointeeType = getTypeByID(Record[OpNum++]);
3555 std::optional<ConstantRange>
InRange;
3559 unsigned InRangeIndex =
Op >> 1;
3565 Expected<ConstantRange> MaybeInRange =
3566 readBitWidthAndConstantRange(Record, OpNum);
3575 SmallVector<unsigned, 16> Elts;
3576 unsigned BaseTypeID =
Record[OpNum];
3577 while (OpNum !=
Record.size()) {
3578 unsigned ElTyID =
Record[OpNum++];
3579 Type *ElTy = getTypeByID(ElTyID);
3581 return error(
"Invalid getelementptr constexpr record");
3585 if (Elts.
size() < 1)
3586 return error(
"Invalid gep with no operands");
3590 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3591 BaseType = getTypeByID(BaseTypeID);
3596 return error(
"GEP base operand must be pointer or vector of pointer");
3599 PointeeType = getPtrElementTypeByID(BaseTypeID);
3601 return error(
"Missing element type for old-style constant GEP");
3604 V = BitcodeConstant::create(
3606 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3612 return error(
"Invalid select constexpr record");
3614 V = BitcodeConstant::create(
3615 Alloc, CurTy, Instruction::Select,
3616 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3622 return error(
"Invalid extractelement constexpr record");
3623 unsigned OpTyID =
Record[0];
3627 return error(
"Invalid extractelement constexpr record");
3629 if (
Record.size() == 4) {
3630 unsigned IdxTyID =
Record[2];
3631 Type *IdxTy = getTypeByID(IdxTyID);
3633 return error(
"Invalid extractelement constexpr record");
3639 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3640 {(unsigned)Record[1], IdxRecord});
3646 if (
Record.size() < 3 || !OpTy)
3647 return error(
"Invalid insertelement constexpr record");
3649 if (
Record.size() == 4) {
3650 unsigned IdxTyID =
Record[2];
3651 Type *IdxTy = getTypeByID(IdxTyID);
3653 return error(
"Invalid insertelement constexpr record");
3659 V = BitcodeConstant::create(
3660 Alloc, CurTy, Instruction::InsertElement,
3661 {(unsigned)Record[0], (
unsigned)
Record[1], IdxRecord});
3666 if (
Record.size() < 3 || !OpTy)
3667 return error(
"Invalid shufflevector constexpr record");
3668 V = BitcodeConstant::create(
3669 Alloc, CurTy, Instruction::ShuffleVector,
3670 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3677 if (
Record.size() < 4 || !RTy || !OpTy)
3678 return error(
"Invalid shufflevector constexpr record");
3679 V = BitcodeConstant::create(
3680 Alloc, CurTy, Instruction::ShuffleVector,
3681 {(unsigned)Record[1], (
unsigned)
Record[2], (unsigned)Record[3]});
3686 return error(
"Invalid cmp constexpt record");
3687 unsigned OpTyID =
Record[0];
3688 Type *OpTy = getTypeByID(OpTyID);
3690 return error(
"Invalid cmp constexpr record");
3691 V = BitcodeConstant::create(
3694 : Instruction::ICmp),
3695 (uint8_t)Record[3]},
3696 {(unsigned)Record[1], (
unsigned)
Record[2]});
3703 return error(
"Invalid inlineasm record");
3704 std::string AsmStr, ConstrStr;
3705 bool HasSideEffects =
Record[0] & 1;
3706 bool IsAlignStack =
Record[0] >> 1;
3707 unsigned AsmStrSize =
Record[1];
3708 if (2+AsmStrSize >=
Record.size())
3709 return error(
"Invalid inlineasm record");
3710 unsigned ConstStrSize =
Record[2+AsmStrSize];
3711 if (3+AsmStrSize+ConstStrSize >
Record.size())
3712 return error(
"Invalid inlineasm record");
3714 for (
unsigned i = 0; i != AsmStrSize; ++i)
3715 AsmStr += (
char)
Record[2+i];
3716 for (
unsigned i = 0; i != ConstStrSize; ++i)
3717 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3720 return error(
"Missing element type for old-style inlineasm");
3722 HasSideEffects, IsAlignStack);
3729 return error(
"Invalid inlineasm record");
3730 std::string AsmStr, ConstrStr;
3731 bool HasSideEffects =
Record[0] & 1;
3732 bool IsAlignStack = (
Record[0] >> 1) & 1;
3733 unsigned AsmDialect =
Record[0] >> 2;
3734 unsigned AsmStrSize =
Record[1];
3735 if (2+AsmStrSize >=
Record.size())
3736 return error(
"Invalid inlineasm record");
3737 unsigned ConstStrSize =
Record[2+AsmStrSize];
3738 if (3+AsmStrSize+ConstStrSize >
Record.size())
3739 return error(
"Invalid inlineasm record");
3741 for (
unsigned i = 0; i != AsmStrSize; ++i)
3742 AsmStr += (
char)
Record[2+i];
3743 for (
unsigned i = 0; i != ConstStrSize; ++i)
3744 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3747 return error(
"Missing element type for old-style inlineasm");
3749 HasSideEffects, IsAlignStack,
3756 return error(
"Invalid inlineasm record");
3758 std::string AsmStr, ConstrStr;
3759 bool HasSideEffects =
Record[OpNum] & 1;
3760 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3761 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3762 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3764 unsigned AsmStrSize =
Record[OpNum];
3766 if (OpNum + AsmStrSize >=
Record.size())
3767 return error(
"Invalid inlineasm record");
3768 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3769 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3770 return error(
"Invalid inlineasm record");
3772 for (
unsigned i = 0; i != AsmStrSize; ++i)
3773 AsmStr += (
char)
Record[OpNum + i];
3775 for (
unsigned i = 0; i != ConstStrSize; ++i)
3776 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3779 return error(
"Missing element type for old-style inlineasm");
3781 HasSideEffects, IsAlignStack,
3788 return error(
"Invalid inlineasm record");
3793 return error(
"Invalid inlineasm record");
3794 std::string AsmStr, ConstrStr;
3795 bool HasSideEffects =
Record[OpNum] & 1;
3796 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3797 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3798 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3800 unsigned AsmStrSize =
Record[OpNum];
3802 if (OpNum + AsmStrSize >=
Record.size())
3803 return error(
"Invalid inlineasm record");
3804 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3805 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3806 return error(
"Invalid inlineasm record");
3808 for (
unsigned i = 0; i != AsmStrSize; ++i)
3809 AsmStr += (
char)
Record[OpNum + i];
3811 for (
unsigned i = 0; i != ConstStrSize; ++i)
3812 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3814 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3820 return error(
"Invalid blockaddress record");
3821 unsigned FnTyID =
Record[0];
3822 Type *FnTy = getTypeByID(FnTyID);
3824 return error(
"Invalid blockaddress record");
3825 V = BitcodeConstant::create(
3827 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3833 return error(
"Invalid dso_local record");
3834 unsigned GVTyID =
Record[0];
3835 Type *GVTy = getTypeByID(GVTyID);
3837 return error(
"Invalid dso_local record");
3838 V = BitcodeConstant::create(
3839 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3844 return error(
"Invalid no_cfi record");
3845 unsigned GVTyID =
Record[0];
3846 Type *GVTy = getTypeByID(GVTyID);
3848 return error(
"Invalid no_cfi record");
3849 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3855 return error(
"Invalid ptrauth record");
3857 V = BitcodeConstant::create(
Alloc, CurTy,
3858 BitcodeConstant::ConstantPtrAuthOpcode,
3859 {(unsigned)Record[0], (
unsigned)
Record[1],
3860 (unsigned)Record[2], (
unsigned)
Record[3]});
3865 return error(
"Invalid ptrauth record");
3867 V = BitcodeConstant::create(
3868 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3869 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2],
3870 (
unsigned)
Record[3], (unsigned)Record[4]});
3875 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3882Error BitcodeReader::parseUseLists() {
3887 SmallVector<uint64_t, 64>
Record;
3893 BitstreamEntry
Entry = MaybeEntry.
get();
3895 switch (
Entry.Kind) {
3898 return error(
"Malformed block");
3912 switch (MaybeRecord.
get()) {
3920 if (RecordLength < 3)
3922 return error(
"Invalid uselist record");
3923 unsigned ID =
Record.pop_back_val();
3927 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3928 V = FunctionBBs[
ID];
3932 if (!
V->hasUseList())
3935 unsigned NumUses = 0;
3936 SmallDenseMap<const Use *, unsigned, 16> Order;
3937 for (
const Use &U :
V->materialized_uses()) {
3938 if (++NumUses >
Record.size())
3940 Order[&
U] =
Record[NumUses - 1];
3947 V->sortUseList([&](
const Use &L,
const Use &R) {
3958Error BitcodeReader::rememberAndSkipMetadata() {
3961 DeferredMetadataInfo.push_back(CurBit);
3969Error BitcodeReader::materializeMetadata() {
3970 for (uint64_t BitPos : DeferredMetadataInfo) {
3974 if (
Error Err = MDLoader->parseModuleMetadata())
3983 NamedMDNode *LinkerOpts =
3985 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
3992 DeferredMetadataInfo.clear();
3996void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
4000Error BitcodeReader::rememberAndSkipFunctionBody() {
4002 if (FunctionsWithBodies.empty())
4003 return error(
"Insufficient function protos");
4005 Function *Fn = FunctionsWithBodies.back();
4006 FunctionsWithBodies.pop_back();
4011 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
4012 "Mismatch between VST and scanned function offsets");
4013 DeferredFunctionInfo[Fn] = CurBit;
4021Error BitcodeReader::globalCleanup() {
4023 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4025 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
4026 return error(
"Malformed global initializer set");
4030 for (Function &
F : *TheModule) {
4031 MDLoader->upgradeDebugIntrinsics(
F);
4035 !SkipDebugIntrinsicUpgrade))
4036 UpgradedIntrinsics[&
F] = NewFn;
4042 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4043 for (GlobalVariable &GV : TheModule->globals())
4045 UpgradedVariables.emplace_back(&GV, Upgraded);
4046 for (
auto &Pair : UpgradedVariables) {
4047 Pair.first->eraseFromParent();
4048 TheModule->insertGlobalVariable(Pair.second);
4053 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4054 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4062Error BitcodeReader::rememberAndSkipFunctionBodies() {
4067 return error(
"Could not find function in stream");
4069 if (!SeenFirstFunctionBody)
4070 return error(
"Trying to materialize functions before seeing function blocks");
4074 assert(SeenValueSymbolTable);
4077 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4080 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4082 switch (
Entry.Kind) {
4084 return error(
"Expect SubBlock");
4088 return error(
"Expect function block");
4090 if (
Error Err = rememberAndSkipFunctionBody())
4099Error BitcodeReaderBase::readBlockInfo() {
4100 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4102 if (!MaybeNewBlockInfo)
4104 std::optional<BitstreamBlockInfo> NewBlockInfo =
4105 std::move(MaybeNewBlockInfo.
get());
4107 return error(
"Malformed block");
4108 BlockInfo = std::move(*NewBlockInfo);
4112Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4116 std::tie(Name, Record) = readNameFromStrtab(Record);
4119 return error(
"Invalid comdat record");
4121 std::string OldFormatName;
4124 return error(
"Invalid comdat record");
4125 unsigned ComdatNameSize =
Record[1];
4126 if (ComdatNameSize >
Record.size() - 2)
4127 return error(
"Comdat name size too large");
4128 OldFormatName.reserve(ComdatNameSize);
4129 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4130 OldFormatName += (
char)
Record[2 + i];
4131 Name = OldFormatName;
4133 Comdat *
C = TheModule->getOrInsertComdat(Name);
4134 C->setSelectionKind(SK);
4135 ComdatList.push_back(
C);
4149 Meta.NoAddress =
true;
4151 Meta.NoHWAddress =
true;
4155 Meta.IsDynInit =
true;
4159Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4167 std::tie(Name, Record) = readNameFromStrtab(Record);
4170 return error(
"Invalid global variable record");
4171 unsigned TyID =
Record[0];
4172 Type *Ty = getTypeByID(TyID);
4174 return error(
"Invalid global variable record");
4176 bool explicitType =
Record[1] & 2;
4182 return error(
"Invalid type for value");
4184 TyID = getContainedTypeID(TyID);
4185 Ty = getTypeByID(TyID);
4187 return error(
"Missing element type for old-style global");
4190 uint64_t RawLinkage =
Record[3];
4192 MaybeAlign Alignment;
4193 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4197 if (Record[5] - 1 >= SectionTable.size())
4198 return error(
"Invalid ID");
4207 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4215 bool ExternallyInitialized =
false;
4217 ExternallyInitialized =
Record[9];
4219 GlobalVariable *NewGV =
4229 if (
Record.size() > 10) {
4241 if (
unsigned InitID = Record[2])
4242 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4244 if (
Record.size() > 11) {
4245 if (
unsigned ComdatID = Record[11]) {
4246 if (ComdatID > ComdatList.size())
4247 return error(
"Invalid global variable comdat ID");
4248 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4251 ImplicitComdatObjects.
insert(NewGV);
4254 if (
Record.size() > 12) {
4259 if (
Record.size() > 13) {
4268 if (
Record.size() > 16 && Record[16]) {
4269 llvm::GlobalValue::SanitizerMetadata
Meta =
4274 if (
Record.size() > 17 && Record[17]) {
4278 return error(
"Invalid global variable code model");
4284void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4285 if (ValueTypeCallback) {
4286 (*ValueTypeCallback)(
4287 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4288 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4292Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4298 std::tie(Name, Record) = readNameFromStrtab(Record);
4301 return error(
"Invalid function record");
4302 unsigned FTyID =
Record[0];
4303 Type *FTy = getTypeByID(FTyID);
4305 return error(
"Invalid function record");
4307 FTyID = getContainedTypeID(FTyID, 0);
4308 FTy = getTypeByID(FTyID);
4310 return error(
"Missing element type for old-style function");
4314 return error(
"Invalid type for value");
4315 auto CC =
static_cast<CallingConv::ID
>(
Record[1]);
4316 if (CC & ~CallingConv::MaxID)
4317 return error(
"Invalid calling convention ID");
4319 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4325 AddrSpace, Name, TheModule);
4328 "Incorrect fully specified type provided for function");
4329 FunctionTypeIDs[
Func] = FTyID;
4331 Func->setCallingConv(CC);
4332 bool isProto =
Record[2];
4333 uint64_t RawLinkage =
Record[3];
4336 callValueTypeCallback(Func, FTyID);
4341 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4342 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4343 Attribute::InAlloca}) {
4344 if (!
Func->hasParamAttribute(i, Kind))
4347 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4350 Func->removeParamAttr(i, Kind);
4352 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4353 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4355 return error(
"Missing param element type for attribute upgrade");
4359 case Attribute::ByVal:
4360 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4362 case Attribute::StructRet:
4363 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4365 case Attribute::InAlloca:
4366 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4372 Func->addParamAttr(i, NewAttr);
4376 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4377 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4378 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4379 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4381 return error(
"Missing param element type for x86_intrcc upgrade");
4383 Func->addParamAttr(0, NewAttr);
4386 MaybeAlign Alignment;
4387 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4390 Func->setAlignment(*Alignment);
4392 if (Record[6] - 1 >= SectionTable.size())
4393 return error(
"Invalid ID");
4394 Func->setSection(SectionTable[Record[6] - 1]);
4398 if (!
Func->hasLocalLinkage())
4400 if (
Record.size() > 8 && Record[8]) {
4401 if (Record[8] - 1 >= GCTable.size())
4402 return error(
"Invalid ID");
4403 Func->setGC(GCTable[Record[8] - 1]);
4408 Func->setUnnamedAddr(UnnamedAddr);
4410 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4412 OperandInfo.Prologue =
Record[10];
4414 if (
Record.size() > 11) {
4416 if (!
Func->hasLocalLinkage()) {
4423 if (
Record.size() > 12) {
4424 if (
unsigned ComdatID = Record[12]) {
4425 if (ComdatID > ComdatList.size())
4426 return error(
"Invalid function comdat ID");
4427 Func->setComdat(ComdatList[ComdatID - 1]);
4430 ImplicitComdatObjects.
insert(Func);
4434 OperandInfo.Prefix =
Record[13];
4437 OperandInfo.PersonalityFn =
Record[14];
4439 if (
Record.size() > 15) {
4449 Record[17] + Record[18] <= Strtab.
size()) {
4450 Func->setPartition(StringRef(Strtab.
data() + Record[17], Record[18]));
4453 if (
Record.size() > 19) {
4454 MaybeAlign PrefAlignment;
4455 if (
Error Err = parseAlignmentValue(Record[19], PrefAlignment))
4457 Func->setPreferredAlignment(PrefAlignment);
4460 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4462 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4463 FunctionOperands.push_back(OperandInfo);
4468 Func->setIsMaterializable(
true);
4469 FunctionsWithBodies.push_back(Func);
4470 DeferredFunctionInfo[
Func] = 0;
4475Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4476 unsigned BitCode, ArrayRef<uint64_t> Record) {
4486 std::tie(Name, Record) = readNameFromStrtab(Record);
4489 if (
Record.size() < (3 + (
unsigned)NewRecord))
4490 return error(
"Invalid global indirect symbol record");
4495 return error(
"Invalid global indirect symbol record");
4501 return error(
"Invalid type for value");
4502 AddrSpace = PTy->getAddressSpace();
4504 Ty = getTypeByID(
TypeID);
4506 return error(
"Missing element type for old-style indirect symbol");
4508 AddrSpace =
Record[OpNum++];
4511 auto Val =
Record[OpNum++];
4520 nullptr, TheModule);
4524 if (OpNum !=
Record.size()) {
4525 auto VisInd = OpNum++;
4531 if (OpNum !=
Record.size()) {
4532 auto S =
Record[OpNum++];
4539 if (OpNum !=
Record.size())
4541 if (OpNum !=
Record.size())
4544 if (OpNum !=
Record.size())
4549 if (OpNum + 1 <
Record.size()) {
4551 if (Record[OpNum] + Record[OpNum + 1] > Strtab.
size())
4552 return error(
"Malformed partition, too large.");
4554 StringRef(Strtab.
data() + Record[OpNum], Record[OpNum + 1]));
4558 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4562Error BitcodeReader::parseModule(uint64_t ResumeBit,
4563 bool ShouldLazyLoadMetadata,
4564 ParserCallbacks Callbacks) {
4565 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4572 SmallVector<uint64_t, 64>
Record;
4576 bool ResolvedDataLayout =
false;
4581 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4583 auto ResolveDataLayout = [&]() ->
Error {
4584 if (ResolvedDataLayout)
4588 ResolvedDataLayout =
true;
4592 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4596 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4597 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4598 TentativeDataLayoutStr = *LayoutOverride;
4606 TheModule->setDataLayout(MaybeDL.
get());
4612 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4615 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4617 switch (
Entry.Kind) {
4619 return error(
"Malformed block");
4621 if (
Error Err = ResolveDataLayout())
4623 return globalCleanup();
4632 if (
Error Err = readBlockInfo())
4636 if (
Error Err = parseAttributeBlock())
4640 if (
Error Err = parseAttributeGroupBlock())
4644 if (
Error Err = parseTypeTable())
4648 if (!SeenValueSymbolTable) {
4654 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4655 if (
Error Err = parseValueSymbolTable())
4657 SeenValueSymbolTable =
true;
4667 if (
Error Err = parseConstants())
4669 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4673 if (ShouldLazyLoadMetadata) {
4674 if (
Error Err = rememberAndSkipMetadata())
4678 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4679 if (
Error Err = MDLoader->parseModuleMetadata())
4683 if (
Error Err = MDLoader->parseMetadataKinds())
4687 if (
Error Err = ResolveDataLayout())
4692 if (!SeenFirstFunctionBody) {
4693 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4694 if (
Error Err = globalCleanup())
4696 SeenFirstFunctionBody =
true;
4699 if (VSTOffset > 0) {
4703 if (!SeenValueSymbolTable) {
4704 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4706 SeenValueSymbolTable =
true;
4728 if (
Error Err = rememberAndSkipFunctionBody())
4735 if (SeenValueSymbolTable) {
4739 return globalCleanup();
4743 if (
Error Err = parseUseLists())
4747 if (
Error Err = parseOperandBundleTags())
4751 if (
Error Err = parseSyncScopeNames())
4763 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
4766 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4769 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4772 UseRelativeIDs = *VersionOrErr >= 1;
4776 if (ResolvedDataLayout)
4777 return error(
"target triple too late in module");
4780 return error(
"Invalid triple record");
4781 TheModule->setTargetTriple(Triple(std::move(S)));
4785 if (ResolvedDataLayout)
4786 return error(
"datalayout too late in module");
4788 return error(
"Invalid data layout record");
4794 return error(
"Invalid asm record");
4795 TheModule->setModuleInlineAsm(S);
4802 return error(
"Invalid deplib record");
4809 return error(
"Invalid section name record");
4810 SectionTable.push_back(S);
4816 return error(
"Invalid gcname record");
4817 GCTable.push_back(S);
4821 if (
Error Err = parseComdatRecord(Record))
4830 if (
Error Err = parseGlobalVarRecord(Record))
4834 if (
Error Err = ResolveDataLayout())
4836 if (
Error Err = parseFunctionRecord(Record))
4842 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4848 return error(
"Invalid vstoffset record");
4852 VSTOffset =
Record[0] - 1;
4858 return error(
"Invalid source filename record");
4859 TheModule->setSourceFileName(
ValueName);
4864 this->ValueTypeCallback = std::nullopt;
4868Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4870 ParserCallbacks Callbacks) {
4872 MetadataLoaderCallbacks MDCallbacks;
4873 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4875 return getContainedTypeID(
I, J);
4878 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4880 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4883Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4885 return error(
"Load/Store operand is not a pointer type");
4886 if (!PointerType::isLoadableOrStorableType(ValType))
4887 return error(
"Cannot load/store from pointer");
4891Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4892 ArrayRef<unsigned> ArgTyIDs) {
4894 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4895 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4896 Attribute::InAlloca}) {
4897 if (!
Attrs.hasParamAttr(i, Kind) ||
4898 Attrs.getParamAttr(i, Kind).getValueAsType())
4901 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4903 return error(
"Missing element type for typed attribute upgrade");
4907 case Attribute::ByVal:
4908 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4910 case Attribute::StructRet:
4911 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4913 case Attribute::InAlloca:
4914 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4927 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
4931 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
4932 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4934 return error(
"Missing element type for inline asm upgrade");
4937 Attribute::get(
Context, Attribute::ElementType, ElemTy));
4945 case Intrinsic::preserve_array_access_index:
4946 case Intrinsic::preserve_struct_access_index:
4947 case Intrinsic::aarch64_ldaxr:
4948 case Intrinsic::aarch64_ldxr:
4949 case Intrinsic::aarch64_stlxr:
4950 case Intrinsic::aarch64_stxr:
4951 case Intrinsic::arm_ldaex:
4952 case Intrinsic::arm_ldrex:
4953 case Intrinsic::arm_stlex:
4954 case Intrinsic::arm_strex: {
4957 case Intrinsic::aarch64_stlxr:
4958 case Intrinsic::aarch64_stxr:
4959 case Intrinsic::arm_stlex:
4960 case Intrinsic::arm_strex:
4967 if (!
Attrs.getParamElementType(ArgNo)) {
4968 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4970 return error(
"Missing element type for elementtype upgrade");
4985Error BitcodeReader::parseFunctionBody(Function *
F) {
4990 if (MDLoader->hasFwdRefs())
4991 return error(
"Invalid function metadata: incoming forward references");
4993 InstructionList.
clear();
4994 unsigned ModuleValueListSize = ValueList.
size();
4995 unsigned ModuleMDLoaderSize = MDLoader->size();
4999 unsigned FTyID = FunctionTypeIDs[
F];
5000 for (Argument &
I :
F->args()) {
5001 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
5002 assert(
I.getType() == getTypeByID(ArgTyID) &&
5003 "Incorrect fully specified type for Function Argument");
5007 unsigned NextValueNo = ValueList.
size();
5009 unsigned CurBBNo = 0;
5014 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
5018 auto getLastInstruction = [&]() -> Instruction * {
5019 if (CurBB && !CurBB->
empty())
5020 return &CurBB->
back();
5021 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
5022 !FunctionBBs[CurBBNo - 1]->
empty())
5023 return &FunctionBBs[CurBBNo - 1]->back();
5027 std::vector<OperandBundleDef> OperandBundles;
5030 SmallVector<uint64_t, 64>
Record;
5033 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
5036 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
5038 switch (
Entry.Kind) {
5040 return error(
"Malformed block");
5042 goto OutOfRecordLoop;
5051 if (
Error Err = parseConstants())
5053 NextValueNo = ValueList.
size();
5056 if (
Error Err = parseValueSymbolTable())
5060 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5064 assert(DeferredMetadataInfo.empty() &&
5065 "Must read all module-level metadata before function-level");
5066 if (
Error Err = MDLoader->parseFunctionMetadata())
5070 if (
Error Err = parseUseLists())
5084 unsigned ResTypeID = InvalidTypeID;
5085 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
5088 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5090 return error(
"Invalid value");
5092 if (
Record.empty() || Record[0] == 0)
5093 return error(
"Invalid declareblocks record");
5095 FunctionBBs.resize(Record[0]);
5098 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5099 if (BBFRI == BasicBlockFwdRefs.
end()) {
5100 for (BasicBlock *&BB : FunctionBBs)
5103 auto &BBRefs = BBFRI->second;
5105 if (BBRefs.size() > FunctionBBs.size())
5106 return error(
"Invalid ID");
5107 assert(!BBRefs.empty() &&
"Unexpected empty array");
5108 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5109 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5111 if (
I < RE && BBRefs[
I]) {
5112 BBRefs[
I]->insertInto(
F);
5113 FunctionBBs[
I] = BBRefs[
I];
5119 BasicBlockFwdRefs.
erase(BBFRI);
5122 CurBB = FunctionBBs[0];
5129 return error(
"Invalid blockaddr users record");
5143 for (uint64_t ValID : Record)
5145 BackwardRefFunctions.push_back(
F);
5147 return error(
"Invalid blockaddr users record");
5154 I = getLastInstruction();
5157 return error(
"Invalid debug_loc_again record");
5158 I->setDebugLoc(LastLoc);
5163 I = getLastInstruction();
5165 return error(
"Invalid debug loc record");
5170 uint64_t AtomGroup =
Record.size() == 7 ?
Record[5] : 0;
5173 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5176 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5178 return error(
"Invalid debug loc record");
5182 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5184 return error(
"Invalid debug loc record");
5187 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5188 isImplicitCode, AtomGroup, AtomRank);
5189 I->setDebugLoc(LastLoc);
5197 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5199 return error(
"Invalid unary operator record");
5203 return error(
"Invalid unary operator record");
5207 if (OpNum <
Record.size()) {
5211 I->setFastMathFlags(FMF);
5220 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5224 return error(
"Invalid binary operator record");
5228 return error(
"Invalid binary operator record");
5232 if (OpNum <
Record.size()) {
5233 if (
Opc == Instruction::Add ||
5234 Opc == Instruction::Sub ||
5235 Opc == Instruction::Mul ||
5236 Opc == Instruction::Shl) {
5241 }
else if (
Opc == Instruction::SDiv ||
5242 Opc == Instruction::UDiv ||
5243 Opc == Instruction::LShr ||
5244 Opc == Instruction::AShr) {
5247 }
else if (
Opc == Instruction::Or) {
5253 I->setFastMathFlags(FMF);
5262 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5263 OpNum + 1 >
Record.size())
5264 return error(
"Invalid cast record");
5266 ResTypeID =
Record[OpNum++];
5267 Type *ResTy = getTypeByID(ResTypeID);
5270 if (
Opc == -1 || !ResTy)
5271 return error(
"Invalid cast record");
5276 assert(CurBB &&
"No current BB?");
5282 return error(
"Invalid cast");
5286 if (OpNum <
Record.size()) {
5287 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5290 }
else if (
Opc == Instruction::Trunc) {
5302 I->setFastMathFlags(FMF);
5321 Ty = getTypeByID(TyID);
5325 TyID = InvalidTypeID;
5330 unsigned BasePtrTypeID;
5331 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5333 return error(
"Invalid gep record");
5336 TyID = getContainedTypeID(BasePtrTypeID);
5337 if (
BasePtr->getType()->isVectorTy())
5338 TyID = getContainedTypeID(TyID);
5339 Ty = getTypeByID(TyID);
5342 SmallVector<Value*, 16> GEPIdx;
5343 while (OpNum !=
Record.size()) {
5346 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5347 return error(
"Invalid gep record");
5358 unsigned SubType = 0;
5359 if (GTI.isStruct()) {
5361 Idx->getType()->isVectorTy()
5363 :
cast<ConstantInt>(Idx);
5366 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5373 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5374 if (
I->getType()->isVectorTy())
5375 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5378 GEP->setNoWrapFlags(NW);
5387 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5388 return error(
"Invalid extractvalue record");
5391 unsigned RecSize =
Record.size();
5392 if (OpNum == RecSize)
5393 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5395 SmallVector<unsigned, 4> EXTRACTVALIdx;
5396 ResTypeID = AggTypeID;
5397 for (; OpNum != RecSize; ++OpNum) {
5402 if (!IsStruct && !IsArray)
5403 return error(
"EXTRACTVAL: Invalid type");
5404 if ((
unsigned)Index != Index)
5405 return error(
"Invalid value");
5407 return error(
"EXTRACTVAL: Invalid struct index");
5409 return error(
"EXTRACTVAL: Invalid array index");
5410 EXTRACTVALIdx.
push_back((
unsigned)Index);
5414 ResTypeID = getContainedTypeID(ResTypeID, Index);
5417 ResTypeID = getContainedTypeID(ResTypeID);
5431 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5432 return error(
"Invalid insertvalue record");
5435 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5436 return error(
"Invalid insertvalue record");
5438 unsigned RecSize =
Record.size();
5439 if (OpNum == RecSize)
5440 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5442 SmallVector<unsigned, 4> INSERTVALIdx;
5444 for (; OpNum != RecSize; ++OpNum) {
5449 if (!IsStruct && !IsArray)
5450 return error(
"INSERTVAL: Invalid type");
5451 if ((
unsigned)Index != Index)
5452 return error(
"Invalid value");
5454 return error(
"INSERTVAL: Invalid struct index");
5456 return error(
"INSERTVAL: Invalid array index");
5458 INSERTVALIdx.
push_back((
unsigned)Index);
5466 return error(
"Inserted value type doesn't match aggregate type");
5469 ResTypeID = AggTypeID;
5481 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5483 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5485 popValue(Record, OpNum, NextValueNo, CondType,
5486 getVirtualTypeID(CondType),
Cond, CurBB))
5487 return error(
"Invalid select record");
5500 unsigned ValTypeID, CondTypeID;
5501 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5503 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5505 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5506 return error(
"Invalid vector select record");
5509 if (VectorType* vector_type =
5512 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5513 return error(
"Invalid type for value");
5517 return error(
"Invalid type for value");
5521 ResTypeID = ValTypeID;
5526 I->setFastMathFlags(FMF);
5534 unsigned VecTypeID, IdxTypeID;
5535 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5536 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5537 return error(
"Invalid extractelement record");
5539 return error(
"Invalid type for value");
5541 ResTypeID = getContainedTypeID(VecTypeID);
5548 Value *Vec, *Elt, *Idx;
5549 unsigned VecTypeID, IdxTypeID;
5550 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5551 return error(
"Invalid insertelement record");
5553 return error(
"Invalid type for value");
5554 if (popValue(Record, OpNum, NextValueNo,
5556 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5557 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5558 return error(
"Invalid insert element record");
5560 ResTypeID = VecTypeID;
5568 unsigned Vec1TypeID;
5569 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5571 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5573 return error(
"Invalid shufflevector record");
5575 unsigned MaskTypeID;
5576 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5577 return error(
"Invalid shufflevector record");
5579 return error(
"Invalid type for value");
5581 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5583 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5598 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5599 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5601 return error(
"Invalid comparison record");
5603 if (OpNum >=
Record.size())
5605 "Invalid record: operand number exceeded available operands");
5610 if (IsFP &&
Record.size() > OpNum+1)
5615 return error(
"Invalid fcmp predicate");
5616 I =
new FCmpInst(PredVal,
LHS,
RHS);
5619 return error(
"Invalid icmp predicate");
5620 I =
new ICmpInst(PredVal,
LHS,
RHS);
5621 if (
Record.size() > OpNum + 1 &&
5626 if (OpNum + 1 !=
Record.size())
5627 return error(
"Invalid comparison record");
5629 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5631 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5634 I->setFastMathFlags(FMF);
5651 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5652 return error(
"Invalid ret record");
5653 if (OpNum !=
Record.size())
5654 return error(
"Invalid ret record");
5662 return error(
"Invalid br record");
5663 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5665 return error(
"Invalid br record");
5667 if (
Record.size() == 1) {
5672 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5675 getVirtualTypeID(CondType), CurBB);
5676 if (!FalseDest || !
Cond)
5677 return error(
"Invalid br record");
5685 return error(
"Invalid cleanupret record");
5688 Value *CleanupPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5689 getVirtualTypeID(TokenTy), CurBB);
5691 return error(
"Invalid cleanupret record");
5693 if (
Record.size() == 2) {
5694 UnwindDest = getBasicBlock(Record[Idx++]);
5696 return error(
"Invalid cleanupret record");
5705 return error(
"Invalid catchret record");
5708 Value *CatchPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5709 getVirtualTypeID(TokenTy), CurBB);
5711 return error(
"Invalid catchret record");
5712 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5714 return error(
"Invalid catchret record");
5723 return error(
"Invalid catchswitch record");
5728 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5729 getVirtualTypeID(TokenTy), CurBB);
5731 return error(
"Invalid catchswitch record");
5733 unsigned NumHandlers =
Record[Idx++];
5736 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5737 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5739 return error(
"Invalid catchswitch record");
5744 if (Idx + 1 ==
Record.size()) {
5745 UnwindDest = getBasicBlock(Record[Idx++]);
5747 return error(
"Invalid catchswitch record");
5750 if (
Record.size() != Idx)
5751 return error(
"Invalid catchswitch record");
5755 for (BasicBlock *Handler : Handlers)
5756 CatchSwitch->addHandler(Handler);
5758 ResTypeID = getVirtualTypeID(
I->getType());
5766 return error(
"Invalid catchpad/cleanuppad record");
5771 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5772 getVirtualTypeID(TokenTy), CurBB);
5774 return error(
"Invalid catchpad/cleanuppad record");
5776 unsigned NumArgOperands =
Record[Idx++];
5778 SmallVector<Value *, 2>
Args;
5779 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5782 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5783 return error(
"Invalid catchpad/cleanuppad record");
5784 Args.push_back(Val);
5787 if (
Record.size() != Idx)
5788 return error(
"Invalid catchpad/cleanuppad record");
5794 ResTypeID = getVirtualTypeID(
I->getType());
5800 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5806 unsigned OpTyID =
Record[1];
5807 Type *OpTy = getTypeByID(OpTyID);
5813 return error(
"Invalid switch record");
5815 unsigned NumCases =
Record[4];
5820 unsigned CurIdx = 5;
5821 for (
unsigned i = 0; i != NumCases; ++i) {
5823 unsigned NumItems =
Record[CurIdx++];
5824 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5825 bool isSingleNumber =
Record[CurIdx++];
5828 unsigned ActiveWords = 1;
5829 if (ValueBitWidth > 64)
5830 ActiveWords =
Record[CurIdx++];
5833 CurIdx += ActiveWords;
5835 if (!isSingleNumber) {
5837 if (ValueBitWidth > 64)
5838 ActiveWords =
Record[CurIdx++];
5841 CurIdx += ActiveWords;
5852 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5853 for (ConstantInt *Cst : CaseVals)
5854 SI->addCase(Cst, DestBB);
5863 return error(
"Invalid switch record");
5864 unsigned OpTyID =
Record[0];
5865 Type *OpTy = getTypeByID(OpTyID);
5869 return error(
"Invalid switch record");
5870 unsigned NumCases = (
Record.size()-3)/2;
5873 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5875 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
5876 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
5877 if (!CaseVal || !DestBB) {
5879 return error(
"Invalid switch record");
5881 SI->addCase(CaseVal, DestBB);
5888 return error(
"Invalid indirectbr record");
5889 unsigned OpTyID =
Record[0];
5890 Type *OpTy = getTypeByID(OpTyID);
5893 return error(
"Invalid indirectbr record");
5894 unsigned NumDests =
Record.size()-2;
5897 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5898 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
5902 return error(
"Invalid indirectbr record");
5912 return error(
"Invalid invoke record");
5915 unsigned CCInfo =
Record[OpNum++];
5916 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
5917 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
5919 unsigned FTyID = InvalidTypeID;
5920 FunctionType *FTy =
nullptr;
5921 if ((CCInfo >> 13) & 1) {
5925 return error(
"Explicit invoke type is not a function type");
5929 unsigned CalleeTypeID;
5930 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5932 return error(
"Invalid invoke record");
5936 return error(
"Callee is not a pointer");
5938 FTyID = getContainedTypeID(CalleeTypeID);
5941 return error(
"Callee is not of pointer to function type");
5943 if (
Record.size() < FTy->getNumParams() + OpNum)
5944 return error(
"Insufficient operands to call");
5946 SmallVector<Value*, 16>
Ops;
5947 SmallVector<unsigned, 16> ArgTyIDs;
5948 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5949 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5950 Ops.push_back(
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
5954 return error(
"Invalid invoke record");
5957 if (!FTy->isVarArg()) {
5958 if (
Record.size() != OpNum)
5959 return error(
"Invalid invoke record");
5962 while (OpNum !=
Record.size()) {
5965 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5966 return error(
"Invalid invoke record");
5973 if (!OperandBundles.empty())
5978 ResTypeID = getContainedTypeID(FTyID);
5979 OperandBundles.clear();
5982 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
5993 Value *Val =
nullptr;
5995 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
5996 return error(
"Invalid resume record");
6005 unsigned CCInfo =
Record[OpNum++];
6007 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
6008 unsigned NumIndirectDests =
Record[OpNum++];
6009 SmallVector<BasicBlock *, 16> IndirectDests;
6010 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
6011 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
6013 unsigned FTyID = InvalidTypeID;
6014 FunctionType *FTy =
nullptr;
6019 return error(
"Explicit call type is not a function type");
6023 unsigned CalleeTypeID;
6024 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6026 return error(
"Invalid callbr record");
6030 return error(
"Callee is not a pointer type");
6032 FTyID = getContainedTypeID(CalleeTypeID);
6035 return error(
"Callee is not of pointer to function type");
6037 if (
Record.size() < FTy->getNumParams() + OpNum)
6038 return error(
"Insufficient operands to call");
6040 SmallVector<Value*, 16>
Args;
6041 SmallVector<unsigned, 16> ArgTyIDs;
6043 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6045 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6046 if (FTy->getParamType(i)->isLabelTy())
6047 Arg = getBasicBlock(Record[OpNum]);
6049 Arg =
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6052 return error(
"Invalid callbr record");
6053 Args.push_back(Arg);
6058 if (!FTy->isVarArg()) {
6059 if (OpNum !=
Record.size())
6060 return error(
"Invalid callbr record");
6062 while (OpNum !=
Record.size()) {
6065 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6066 return error(
"Invalid callbr record");
6073 if (!OperandBundles.empty())
6078 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6081 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6086 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6087 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6088 unsigned LabelNo = ArgNo - FirstBlockArg;
6090 if (!BA || BA->getFunction() !=
F ||
6091 LabelNo > IndirectDests.
size() ||
6092 BA->getBasicBlock() != IndirectDests[LabelNo])
6093 return error(
"callbr argument does not match indirect dest");
6098 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6102 for (
Value *Arg : Args)
6105 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6108 std::string Constraints =
IA->getConstraintString().str();
6111 for (
const auto &CI : ConstraintInfo) {
6113 if (ArgNo >= FirstBlockArg)
6114 Constraints.insert(Pos,
"!");
6119 Pos = Constraints.find(
',', Pos);
6120 if (Pos == std::string::npos)
6126 IA->hasSideEffects(),
IA->isAlignStack(),
6127 IA->getDialect(),
IA->canThrow());
6133 ResTypeID = getContainedTypeID(FTyID);
6134 OperandBundles.clear();
6151 return error(
"Invalid phi record");
6153 unsigned TyID =
Record[0];
6154 Type *Ty = getTypeByID(TyID);
6156 return error(
"Invalid phi record");
6161 size_t NumArgs = (
Record.size() - 1) / 2;
6165 return error(
"Invalid phi record");
6169 SmallDenseMap<BasicBlock *, Value *>
Args;
6170 for (
unsigned i = 0; i != NumArgs; i++) {
6171 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6174 return error(
"Invalid phi BB");
6181 auto It =
Args.find(BB);
6183 if (It !=
Args.end()) {
6197 if (!PhiConstExprBB)
6199 EdgeBB = PhiConstExprBB;
6207 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6209 V =
getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6213 return error(
"Invalid phi record");
6216 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6217 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6218 PhiConstExprBB =
nullptr;
6221 Args.insert({BB,
V});
6227 if (
Record.size() % 2 == 0) {
6231 I->setFastMathFlags(FMF);
6243 return error(
"Invalid landingpad record");
6247 return error(
"Invalid landingpad record");
6249 ResTypeID =
Record[Idx++];
6250 Type *Ty = getTypeByID(ResTypeID);
6252 return error(
"Invalid landingpad record");
6254 Value *PersFn =
nullptr;
6255 unsigned PersFnTypeID;
6256 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6258 return error(
"Invalid landingpad record");
6260 if (!
F->hasPersonalityFn())
6263 return error(
"Personality function mismatch");
6266 bool IsCleanup = !!
Record[Idx++];
6267 unsigned NumClauses =
Record[Idx++];
6270 for (
unsigned J = 0; J != NumClauses; ++J) {
6276 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6279 return error(
"Invalid landingpad record");
6284 "Catch clause has a invalid type!");
6287 "Filter clause has invalid type!");
6298 return error(
"Invalid alloca record");
6299 using APV = AllocaPackedValues;
6300 const uint64_t Rec =
Record[3];
6303 unsigned TyID =
Record[0];
6304 Type *Ty = getTypeByID(TyID);
6306 TyID = getContainedTypeID(TyID);
6307 Ty = getTypeByID(TyID);
6309 return error(
"Missing element type for old-style alloca");
6311 unsigned OpTyID =
Record[1];
6312 Type *OpTy = getTypeByID(OpTyID);
6313 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6318 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6322 return error(
"Invalid alloca record");
6324 const DataLayout &
DL = TheModule->getDataLayout();
6325 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6327 SmallPtrSet<Type *, 4> Visited;
6328 if (!Align && !Ty->
isSized(&Visited))
6329 return error(
"alloca of unsized type");
6331 Align =
DL.getPrefTypeAlign(Ty);
6333 if (!
Size->getType()->isIntegerTy())
6334 return error(
"alloca element count must have integer type");
6336 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6340 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6348 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6349 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6350 return error(
"Invalid load record");
6353 return error(
"Load operand is not a pointer type");
6356 if (OpNum + 3 ==
Record.size()) {
6357 ResTypeID =
Record[OpNum++];
6358 Ty = getTypeByID(ResTypeID);
6360 ResTypeID = getContainedTypeID(OpTypeID);
6361 Ty = getTypeByID(ResTypeID);
6365 return error(
"Missing load type");
6367 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6371 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6373 SmallPtrSet<Type *, 4> Visited;
6374 if (!Align && !Ty->
isSized(&Visited))
6375 return error(
"load of unsized type");
6377 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6378 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6387 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6388 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size()))
6389 return error(
"Invalid load atomic record");
6392 return error(
"Load operand is not a pointer type");
6395 if (OpNum + 5 ==
Record.size()) {
6396 ResTypeID =
Record[OpNum++];
6397 Ty = getTypeByID(ResTypeID);
6399 ResTypeID = getContainedTypeID(OpTypeID);
6400 Ty = getTypeByID(ResTypeID);
6404 return error(
"Missing atomic load type");
6406 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6410 if (Ordering == AtomicOrdering::NotAtomic ||
6411 Ordering == AtomicOrdering::Release ||
6412 Ordering == AtomicOrdering::AcquireRelease)
6413 return error(
"Invalid load atomic record");
6414 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6415 return error(
"Invalid load atomic record");
6416 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6419 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6422 return error(
"Alignment missing from atomic load");
6423 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align, Ordering, SSID);
6431 unsigned PtrTypeID, ValTypeID;
6432 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6433 return error(
"Invalid store record");
6436 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6437 return error(
"Invalid store record");
6439 ValTypeID = getContainedTypeID(PtrTypeID);
6440 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6441 ValTypeID, Val, CurBB))
6442 return error(
"Invalid store record");
6445 if (OpNum + 2 !=
Record.size())
6446 return error(
"Invalid store record");
6451 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6453 SmallPtrSet<Type *, 4> Visited;
6455 return error(
"store of unsized type");
6457 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6458 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6467 unsigned PtrTypeID, ValTypeID;
6468 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6470 return error(
"Invalid store atomic record");
6472 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6473 return error(
"Invalid store atomic record");
6475 ValTypeID = getContainedTypeID(PtrTypeID);
6476 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6477 ValTypeID, Val, CurBB))
6478 return error(
"Invalid store atomic record");
6481 if (OpNum + 4 !=
Record.size())
6482 return error(
"Invalid store atomic record");
6487 if (Ordering == AtomicOrdering::NotAtomic ||
6488 Ordering == AtomicOrdering::Acquire ||
6489 Ordering == AtomicOrdering::AcquireRelease)
6490 return error(
"Invalid store atomic record");
6491 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6492 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6493 return error(
"Invalid store atomic record");
6496 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6499 return error(
"Alignment missing from atomic store");
6500 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align, Ordering, SSID);
6507 const size_t NumRecords =
Record.size();
6509 Value *Ptr =
nullptr;
6511 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6512 return error(
"Invalid cmpxchg record");
6515 return error(
"Cmpxchg operand is not a pointer type");
6518 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6519 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6520 CmpTypeID, Cmp, CurBB))
6521 return error(
"Invalid cmpxchg record");
6524 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6526 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6527 return error(
"Invalid cmpxchg record");
6531 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6532 SuccessOrdering == AtomicOrdering::Unordered)
6533 return error(
"Invalid cmpxchg record");
6535 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6537 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6545 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6546 FailureOrdering == AtomicOrdering::Unordered)
6547 return error(
"Invalid cmpxchg record");
6549 const Align Alignment(
6550 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6552 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6553 FailureOrdering, SSID);
6556 if (NumRecords < 8) {
6560 I->insertInto(CurBB, CurBB->
end());
6562 ResTypeID = CmpTypeID;
6565 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6566 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6575 const size_t NumRecords =
Record.size();
6577 Value *Ptr =
nullptr;
6579 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6580 return error(
"Invalid cmpxchg record");
6583 return error(
"Cmpxchg operand is not a pointer type");
6587 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6588 return error(
"Invalid cmpxchg record");
6590 Value *Val =
nullptr;
6591 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6593 return error(
"Invalid cmpxchg record");
6595 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6596 return error(
"Invalid cmpxchg record");
6598 const bool IsVol =
Record[OpNum];
6603 return error(
"Invalid cmpxchg success ordering");
6605 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6607 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6613 return error(
"Invalid cmpxchg failure ordering");
6615 const bool IsWeak =
Record[OpNum + 4];
6617 MaybeAlign Alignment;
6619 if (NumRecords == (OpNum + 6)) {
6620 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6625 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6627 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6628 FailureOrdering, SSID);
6632 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6633 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6642 const size_t NumRecords =
Record.size();
6645 Value *Ptr =
nullptr;
6647 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6648 return error(
"Invalid atomicrmw record");
6651 return error(
"Invalid atomicrmw record");
6653 Value *Val =
nullptr;
6654 unsigned ValTypeID = InvalidTypeID;
6656 ValTypeID = getContainedTypeID(PtrTypeID);
6657 if (popValue(Record, OpNum, NextValueNo,
6658 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6659 return error(
"Invalid atomicrmw record");
6661 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6662 return error(
"Invalid atomicrmw record");
6665 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6666 return error(
"Invalid atomicrmw record");
6668 bool IsElementwise =
false;
6673 return error(
"Invalid atomicrmw record");
6675 const bool IsVol =
Record[OpNum + 1];
6678 if (Ordering == AtomicOrdering::NotAtomic ||
6679 Ordering == AtomicOrdering::Unordered)
6680 return error(
"Invalid atomicrmw record");
6682 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6684 MaybeAlign Alignment;
6686 if (NumRecords == (OpNum + 5)) {
6687 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6693 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6695 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID,
6697 ResTypeID = ValTypeID;
6705 return error(
"Invalid fence record");
6707 if (Ordering == AtomicOrdering::NotAtomic ||
6708 Ordering == AtomicOrdering::Unordered ||
6709 Ordering == AtomicOrdering::Monotonic)
6710 return error(
"Invalid fence record");
6712 I =
new FenceInst(
Context, Ordering, SSID);
6719 SeenDebugRecord =
true;
6722 return error(
"Invalid dbg record: missing instruction");
6725 Inst->
getParent()->insertDbgRecordBefore(
6736 SeenDebugRecord =
true;
6739 return error(
"Invalid dbg record: missing instruction");
6756 DILocalVariable *Var =
6758 DIExpression *Expr =
6771 unsigned SlotBefore =
Slot;
6772 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6773 return error(
"Invalid dbg record: invalid value");
6775 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6778 RawLocation = getFnMetadataByID(Record[Slot++]);
6781 DbgVariableRecord *DVR =
nullptr;
6785 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6786 DbgVariableRecord::LocationType::Value);
6789 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6790 DbgVariableRecord::LocationType::Declare);
6793 DVR =
new DbgVariableRecord(
6794 RawLocation, Var, Expr, DIL,
6795 DbgVariableRecord::LocationType::DeclareValue);
6799 DIExpression *AddrExpr =
6801 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6802 DVR =
new DbgVariableRecord(RawLocation, Var, Expr,
ID, Addr, AddrExpr,
6815 return error(
"Invalid call record");
6819 unsigned CCInfo =
Record[OpNum++];
6825 return error(
"Fast math flags indicator set for call with no FMF");
6828 unsigned FTyID = InvalidTypeID;
6829 FunctionType *FTy =
nullptr;
6834 return error(
"Explicit call type is not a function type");
6838 unsigned CalleeTypeID;
6839 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6841 return error(
"Invalid call record");
6845 return error(
"Callee is not a pointer type");
6847 FTyID = getContainedTypeID(CalleeTypeID);
6850 return error(
"Callee is not of pointer to function type");
6852 if (
Record.size() < FTy->getNumParams() + OpNum)
6853 return error(
"Insufficient operands to call");
6855 SmallVector<Value*, 16>
Args;
6856 SmallVector<unsigned, 16> ArgTyIDs;
6858 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6859 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6860 if (FTy->getParamType(i)->isLabelTy())
6861 Args.push_back(getBasicBlock(Record[OpNum]));
6864 FTy->getParamType(i), ArgTyID, CurBB));
6867 return error(
"Invalid call record");
6871 if (!FTy->isVarArg()) {
6872 if (OpNum !=
Record.size())
6873 return error(
"Invalid call record");
6875 while (OpNum !=
Record.size()) {
6878 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6879 return error(
"Invalid call record");
6886 if (!OperandBundles.empty())
6890 ResTypeID = getContainedTypeID(FTyID);
6891 OperandBundles.clear();
6905 SeenDebugIntrinsic =
true;
6912 return error(
"Fast-math-flags specified for call without "
6913 "floating-point scalar or vector return type");
6914 I->setFastMathFlags(FMF);
6920 return error(
"Invalid va_arg record");
6921 unsigned OpTyID =
Record[0];
6922 Type *OpTy = getTypeByID(OpTyID);
6925 Type *ResTy = getTypeByID(ResTypeID);
6926 if (!OpTy || !
Op || !ResTy)
6927 return error(
"Invalid va_arg record");
6928 I =
new VAArgInst(
Op, ResTy);
6938 if (
Record.empty() || Record[0] >= BundleTags.size())
6939 return error(
"Invalid operand bundle record");
6941 std::vector<Value *> Inputs;
6944 while (OpNum !=
Record.size()) {
6946 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
6947 return error(
"Invalid operand bundle record");
6948 Inputs.push_back(
Op);
6951 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
6959 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6960 return error(
"Invalid freeze record");
6961 if (OpNum !=
Record.size())
6962 return error(
"Invalid freeze record");
6964 I =
new FreezeInst(
Op);
6965 ResTypeID = OpTypeID;
6975 return error(
"Invalid instruction with no BB");
6977 if (!OperandBundles.empty()) {
6979 return error(
"Operand bundles found with no consumer");
6981 I->insertInto(CurBB, CurBB->
end());
6984 if (
I->isTerminator()) {
6986 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
6990 if (!
I->getType()->isVoidTy()) {
6991 assert(
I->getType() == getTypeByID(ResTypeID) &&
6992 "Incorrect result type ID");
7000 if (!OperandBundles.empty())
7001 return error(
"Operand bundles found with no consumer");
7005 if (!
A->getParent()) {
7007 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
7013 return error(
"Never resolved value found in function");
7018 if (MDLoader->hasFwdRefs())
7019 return error(
"Invalid function metadata: outgoing forward refs");
7024 for (
const auto &Pair : ConstExprEdgeBBs) {
7035 ValueList.
shrinkTo(ModuleValueListSize);
7036 MDLoader->shrinkTo(ModuleMDLoaderSize);
7037 std::vector<BasicBlock*>().swap(FunctionBBs);
7042Error BitcodeReader::findFunctionInStream(
7044 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
7045 while (DeferredFunctionInfoIterator->second == 0) {
7050 assert(VSTOffset == 0 || !
F->hasName());
7053 if (
Error Err = rememberAndSkipFunctionBodies())
7059SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7062 if (Val >= SSIDs.
size())
7071Error BitcodeReader::materialize(GlobalValue *GV) {
7074 if (!
F || !
F->isMaterializable())
7077 auto DFII = DeferredFunctionInfo.
find(
F);
7078 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7081 if (DFII->second == 0)
7082 if (
Error Err = findFunctionInStream(
F, DFII))
7086 if (
Error Err = materializeMetadata())
7093 if (
Error Err = parseFunctionBody(
F))
7095 F->setIsMaterializable(
false);
7099 if (SeenDebugIntrinsic && SeenDebugRecord)
7100 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7106 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7107 F->setSubprogram(SP);
7110 if (!MDLoader->isStrippingTBAA()) {
7112 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7115 MDLoader->setStripTBAA(
true);
7122 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7123 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7129 unsigned ExpectedNumOperands = 0;
7131 ExpectedNumOperands = 2;
7133 ExpectedNumOperands =
SI->getNumSuccessors();
7135 ExpectedNumOperands = 1;
7139 ExpectedNumOperands = 2;
7146 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7147 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7153 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7154 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7156 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7157 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7158 CI->getArgOperand(ArgNo)->getType(),
7159 CI->getParamAttributes(ArgNo)));
7162 if (Function *OldFn = CI->getCalledFunction()) {
7163 auto It = UpgradedIntrinsics.
find(OldFn);
7164 if (It != UpgradedIntrinsics.
end())
7168 BC && BC->getSrcTy() == BC->getDestTy() &&
7174 CI && CI->isMustTailCall() && CI->getNextNode() == BC) {
7175 BC->replaceAllUsesWith(CI);
7176 BC->eraseFromParent();
7186 return materializeForwardReferencedFunctions();
7189Error BitcodeReader::materializeModule() {
7190 if (
Error Err = materializeMetadata())
7194 WillMaterializeAllForwardRefs =
true;
7198 for (Function &
F : *TheModule) {
7199 if (
Error Err = materialize(&
F))
7205 if (LastFunctionBlockBit || NextUnreadBit)
7207 ? LastFunctionBlockBit
7213 if (!BasicBlockFwdRefs.
empty())
7214 return error(
"Never resolved function from blockaddress");
7220 for (
auto &[OldFn, NewFn] : UpgradedIntrinsics) {
7221 for (User *U : OldFn->users()) {
7225 if (OldFn != NewFn) {
7226 if (!OldFn->use_empty())
7227 OldFn->replaceAllUsesWith(NewFn);
7228 OldFn->eraseFromParent();
7231 UpgradedIntrinsics.clear();
7246std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7247 return IdentifiedStructTypes;
7250ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7251 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7253 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7254 ModulePath(ModulePath), IsPrevailing(IsPrevailing) {}
7256void ModuleSummaryIndexBitcodeReader::addThisModule() {
7261ModuleSummaryIndexBitcodeReader::getThisModule() {
7265template <
bool AllowNullValueInfo>
7266std::pair<ValueInfo, GlobalValue::GUID>
7267ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7268 auto VGI = ValueIdToValueInfoMap[ValueId];
7275 assert(AllowNullValueInfo || std::get<0>(VGI));
7279void ModuleSummaryIndexBitcodeReader::setValueGUID(
7281 StringRef SourceFileName) {
7282 std::string GlobalId =
7285 auto OriginalNameID = ValueGUID;
7289 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7295 ValueIdToValueInfoMap[ValueID] = std::make_pair(
7304Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7306 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7313 if (!MaybeCurrentBit)
7315 uint64_t CurrentBit = MaybeCurrentBit.
get();
7320 SmallVector<uint64_t, 64>
Record;
7329 BitstreamEntry
Entry = MaybeEntry.
get();
7331 switch (
Entry.Kind) {
7334 return error(
"Malformed block");
7350 switch (MaybeRecord.
get()) {
7355 return error(
"Invalid vst_code_entry record");
7356 unsigned ValueID =
Record[0];
7358 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7359 assert(VLI != ValueIdToLinkageMap.
end() &&
7360 "No linkage found for VST entry?");
7369 return error(
"Invalid vst_code_fnentry record");
7370 unsigned ValueID =
Record[0];
7372 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7373 assert(VLI != ValueIdToLinkageMap.
end() &&
7374 "No linkage found for VST entry?");
7382 unsigned ValueID =
Record[0];
7386 ValueIdToValueInfoMap[ValueID] =
7397Error ModuleSummaryIndexBitcodeReader::parseModule() {
7401 SmallVector<uint64_t, 64>
Record;
7402 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7403 unsigned ValueId = 0;
7407 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
7410 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7412 switch (
Entry.Kind) {
7414 return error(
"Malformed block");
7426 if (
Error Err = readBlockInfo())
7432 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7433 !SeenGlobalValSummary) &&
7434 "Expected early VST parse via VSTOffset record");
7441 if (!SourceFileName.
empty())
7443 assert(!SeenValueSymbolTable &&
7444 "Already read VST when parsing summary block?");
7449 if (VSTOffset > 0) {
7450 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7452 SeenValueSymbolTable =
true;
7454 SeenGlobalValSummary =
true;
7455 if (
Error Err = parseEntireSummary(
Entry.ID))
7459 if (
Error Err = parseModuleStringTable())
7467 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7470 switch (MaybeBitCode.
get()) {
7474 if (
Error Err = parseVersionRecord(Record).takeError())
7482 return error(
"Invalid source filename record");
7489 return error(
"Invalid hash length " + Twine(
Record.size()));
7490 auto &Hash = getThisModule()->second;
7492 for (
auto &Val : Record) {
7493 assert(!(Val >> 32) &&
"Unexpected high bits set");
7501 return error(
"Invalid vstoffset record");
7505 VSTOffset =
Record[0] - 1;
7515 ArrayRef<uint64_t> GVRecord;
7516 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7517 if (GVRecord.
size() <= 3)
7518 return error(
"Invalid global record");
7519 uint64_t RawLinkage = GVRecord[3];
7522 ValueIdToLinkageMap[ValueId++] =
Linkage;
7526 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7537ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7540 for (uint64_t RefValueId : Record)
7541 Ret.
push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7546ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7547 bool IsOldProfileFormat,
7548 bool HasProfile,
bool HasRelBF) {
7552 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7557 for (
unsigned I = 0,
E =
Record.size();
I !=
E; ++
I) {
7559 bool HasTailCall =
false;
7561 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7562 if (IsOldProfileFormat) {
7566 }
else if (HasProfile)
7567 std::tie(Hotness, HasTailCall) =
7601 static_cast<size_t>(
Record[Slot + 1])};
7624 while (Slot <
Record.size())
7628std::vector<FunctionSummary::ParamAccess>
7629ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7630 auto ReadRange = [&]() {
7632 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7634 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7641 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7642 while (!
Record.empty()) {
7643 PendingParamAccesses.emplace_back();
7644 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7646 ParamAccess.
Use = ReadRange();
7651 std::get<0>(getValueInfoFromValueId(
Record.consume_front()));
7652 Call.Offsets = ReadRange();
7655 return PendingParamAccesses;
7658void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7659 ArrayRef<uint64_t> Record,
size_t &Slot,
7662 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7666void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7667 ArrayRef<uint64_t> Record) {
7675 while (Slot <
Record.size())
7676 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7679SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7680 ArrayRef<uint64_t> Record,
unsigned &
I) {
7681 SmallVector<unsigned> StackIdList;
7685 if (RadixArray.empty()) {
7686 unsigned NumStackEntries =
Record[
I++];
7688 StackIdList.
reserve(NumStackEntries);
7689 for (
unsigned J = 0; J < NumStackEntries; J++) {
7690 assert(Record[
I] < StackIds.size());
7691 StackIdList.
push_back(getStackIdIndex(Record[
I++]));
7694 unsigned RadixIndex =
Record[
I++];
7700 assert(RadixIndex < RadixArray.size());
7701 unsigned NumStackIds = RadixArray[RadixIndex++];
7702 StackIdList.
reserve(NumStackIds);
7703 while (NumStackIds--) {
7704 assert(RadixIndex < RadixArray.size());
7705 unsigned Elem = RadixArray[RadixIndex];
7706 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7707 RadixIndex = RadixIndex - Elem;
7708 assert(RadixIndex < RadixArray.size());
7709 Elem = RadixArray[RadixIndex];
7711 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7714 StackIdList.
push_back(getStackIdIndex(Elem));
7724 unsigned FirstWORef = Refs.
size() - WOCnt;
7725 unsigned RefNo = FirstWORef - ROCnt;
7726 for (; RefNo < FirstWORef; ++RefNo)
7727 Refs[RefNo].setReadOnly();
7728 for (; RefNo < Refs.
size(); ++RefNo)
7729 Refs[RefNo].setWriteOnly();
7734Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7737 SmallVector<uint64_t, 64>
Record;
7744 BitstreamEntry
Entry = MaybeEntry.
get();
7747 return error(
"Invalid Summary Block: record for version expected");
7752 return error(
"Invalid Summary Block: version expected");
7755 const bool IsOldProfileFormat =
Version == 1;
7758 const bool MemProfAfterFunctionSummary =
Version >= 13;
7760 return error(
"Invalid summary version " + Twine(
Version) +
" in module '" +
7761 ModulePath +
"'. Version should be in the range [1-" +
7767 GlobalValueSummary *LastSeenSummary =
nullptr;
7777 FunctionSummary *CurrentPrevailingFS =
nullptr;
7782 std::vector<GlobalValue::GUID> PendingTypeTests;
7783 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7784 PendingTypeCheckedLoadVCalls;
7785 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7786 PendingTypeCheckedLoadConstVCalls;
7787 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7789 std::vector<CallsiteInfo> PendingCallsites;
7790 std::vector<AllocInfo> PendingAllocs;
7791 std::vector<uint64_t> PendingContextIds;
7797 BitstreamEntry
Entry = MaybeEntry.
get();
7799 switch (
Entry.Kind) {
7802 return error(
"Malformed block");
7818 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7821 unsigned BitCode = MaybeBitCode.
get();
7831 uint64_t ValueID =
Record[0];
7838 ValueIdToValueInfoMap[ValueID] =
7856 unsigned ValueID =
Record[0];
7857 uint64_t RawFlags =
Record[1];
7858 unsigned InstCount =
Record[2];
7859 uint64_t RawFunFlags = 0;
7860 unsigned NumRefs =
Record[3];
7861 unsigned NumRORefs = 0, NumWORefs = 0;
7862 int RefListStartIndex = 4;
7866 RefListStartIndex = 5;
7869 RefListStartIndex = 6;
7872 RefListStartIndex = 7;
7883 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7885 "Record size inconsistent with number of references");
7887 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7892 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7893 IsOldProfileFormat, HasProfile, HasRelBF);
7895 auto [
VI,
GUID] = getValueInfoFromValueId(ValueID);
7902 IsPrevailing(
VI.getGUID());
7908 assert(!MemProfAfterFunctionSummary ||
7909 (PendingCallsites.empty() && PendingAllocs.empty()));
7910 if (!IsPrevailingSym && !MemProfAfterFunctionSummary) {
7911 PendingCallsites.clear();
7912 PendingAllocs.clear();
7915 auto FS = std::make_unique<FunctionSummary>(
7917 std::move(Calls), std::move(PendingTypeTests),
7918 std::move(PendingTypeTestAssumeVCalls),
7919 std::move(PendingTypeCheckedLoadVCalls),
7920 std::move(PendingTypeTestAssumeConstVCalls),
7921 std::move(PendingTypeCheckedLoadConstVCalls),
7922 std::move(PendingParamAccesses), std::move(PendingCallsites),
7923 std::move(PendingAllocs));
7924 FS->setModulePath(getThisModule()->first());
7925 FS->setOriginalName(GUID);
7928 if (MemProfAfterFunctionSummary) {
7929 if (IsPrevailingSym)
7930 CurrentPrevailingFS =
FS.get();
7932 CurrentPrevailingFS =
nullptr;
7941 unsigned ValueID =
Record[0];
7942 uint64_t RawFlags =
Record[1];
7943 unsigned AliaseeID =
Record[2];
7945 auto AS = std::make_unique<AliasSummary>(Flags);
7951 AS->setModulePath(getThisModule()->first());
7953 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
7955 if (!AliaseeInModule)
7956 return error(
"Alias expects aliasee summary to be parsed");
7957 AS->setAliasee(AliaseeVI, AliaseeInModule);
7959 auto GUID = getValueInfoFromValueId(ValueID);
7960 AS->setOriginalName(std::get<1>(GUID));
7966 unsigned ValueID =
Record[0];
7967 uint64_t RawFlags =
Record[1];
7968 unsigned RefArrayStart = 2;
7969 GlobalVarSummary::GVarFlags GVF(
false,
7979 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
7981 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7982 FS->setModulePath(getThisModule()->first());
7983 auto GUID = getValueInfoFromValueId(ValueID);
7984 FS->setOriginalName(std::get<1>(GUID));
7992 unsigned ValueID =
Record[0];
7993 uint64_t RawFlags =
Record[1];
7995 unsigned NumRefs =
Record[3];
7996 unsigned RefListStartIndex = 4;
7997 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
8000 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8002 for (
unsigned I = VTableListStartIndex,
E =
Record.size();
I !=
E; ++
I) {
8003 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
8008 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8009 VS->setModulePath(getThisModule()->first());
8010 VS->setVTableFuncs(VTableFuncs);
8011 auto GUID = getValueInfoFromValueId(ValueID);
8012 VS->setOriginalName(std::get<1>(GUID));
8024 unsigned ValueID =
Record[0];
8025 uint64_t ModuleId =
Record[1];
8026 uint64_t RawFlags =
Record[2];
8027 unsigned InstCount =
Record[3];
8028 uint64_t RawFunFlags = 0;
8029 unsigned NumRefs =
Record[4];
8030 unsigned NumRORefs = 0, NumWORefs = 0;
8031 int RefListStartIndex = 5;
8035 RefListStartIndex = 6;
8036 size_t NumRefsIndex = 5;
8038 unsigned NumRORefsOffset = 1;
8039 RefListStartIndex = 7;
8042 RefListStartIndex = 8;
8044 RefListStartIndex = 9;
8046 NumRORefsOffset = 2;
8049 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
8051 NumRefs =
Record[NumRefsIndex];
8055 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8057 "Record size inconsistent with number of references");
8059 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8062 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8063 IsOldProfileFormat, HasProfile,
false);
8064 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8066 auto FS = std::make_unique<FunctionSummary>(
8068 std::move(Edges), std::move(PendingTypeTests),
8069 std::move(PendingTypeTestAssumeVCalls),
8070 std::move(PendingTypeCheckedLoadVCalls),
8071 std::move(PendingTypeTestAssumeConstVCalls),
8072 std::move(PendingTypeCheckedLoadConstVCalls),
8073 std::move(PendingParamAccesses), std::move(PendingCallsites),
8074 std::move(PendingAllocs));
8075 LastSeenSummary =
FS.get();
8076 if (MemProfAfterFunctionSummary)
8077 CurrentPrevailingFS =
FS.get();
8078 LastSeenGUID =
VI.getGUID();
8079 FS->setModulePath(ModuleIdMap[ModuleId]);
8087 unsigned ValueID =
Record[0];
8088 uint64_t ModuleId =
Record[1];
8089 uint64_t RawFlags =
Record[2];
8090 unsigned AliaseeValueId =
Record[3];
8092 auto AS = std::make_unique<AliasSummary>(Flags);
8093 LastSeenSummary = AS.get();
8094 AS->setModulePath(ModuleIdMap[ModuleId]);
8096 auto AliaseeVI = std::get<0>(
8097 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(AliaseeValueId));
8099 auto AliaseeInModule =
8101 AS->setAliasee(AliaseeVI, AliaseeInModule);
8103 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8104 LastSeenGUID =
VI.getGUID();
8110 unsigned ValueID =
Record[0];
8111 uint64_t ModuleId =
Record[1];
8112 uint64_t RawFlags =
Record[2];
8113 unsigned RefArrayStart = 3;
8114 GlobalVarSummary::GVarFlags GVF(
false,
8124 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8126 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8127 LastSeenSummary =
FS.get();
8128 FS->setModulePath(ModuleIdMap[ModuleId]);
8129 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8130 LastSeenGUID =
VI.getGUID();
8136 uint64_t OriginalName =
Record[0];
8137 if (!LastSeenSummary)
8138 return error(
"Name attachment that does not follow a combined record");
8142 LastSeenSummary =
nullptr;
8147 assert(PendingTypeTests.empty());
8152 assert(PendingTypeTestAssumeVCalls.empty());
8153 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8154 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8158 assert(PendingTypeCheckedLoadVCalls.empty());
8159 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8160 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8164 PendingTypeTestAssumeConstVCalls.push_back(
8169 PendingTypeCheckedLoadConstVCalls.push_back(
8176 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8177 StringRef
Name(Strtab.
data() + Record[
I],
8178 static_cast<size_t>(Record[
I + 1]));
8181 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, GUID);
8184 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8186 StringRef
Name(Strtab.
data() + Record[
I + 1],
8187 static_cast<size_t>(Record[
I + 2]));
8188 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8197 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8198 StringRef
Name(Strtab.
data() + Record[
I],
8199 static_cast<size_t>(Record[
I + 1]));
8202 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, GUID);
8205 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8207 StringRef
Name(Strtab.
data() + Record[
I + 1],
8208 static_cast<size_t>(Record[
I + 2]));
8209 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8220 parseTypeIdCompatibleVtableSummaryRecord(Record);
8228 PendingParamAccesses = parseParamAccesses(Record);
8235 assert(StackIds.empty());
8237 StackIds = ArrayRef<uint64_t>(Record);
8243 StackIds.reserve(
Record.size() / 2);
8244 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8245 StackIds.push_back(*R << 32 | *(R + 1));
8247 assert(StackIdToIndex.empty());
8249 StackIdToIndex.resize(StackIds.size(), UninitializedStackIdIndex);
8254 RadixArray = ArrayRef<uint64_t>(Record);
8261 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8263 unsigned ValueID =
Record[0];
8264 SmallVector<unsigned> StackIdList;
8266 assert(R < StackIds.size());
8267 StackIdList.
push_back(getStackIdIndex(R));
8269 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8270 if (MemProfAfterFunctionSummary)
8272 CallsiteInfo({
VI, std::move(StackIdList)}));
8274 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8281 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8282 auto RecordIter =
Record.begin();
8283 unsigned ValueID = *RecordIter++;
8284 unsigned NumStackIds = *RecordIter++;
8285 unsigned NumVersions = *RecordIter++;
8286 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8287 SmallVector<unsigned> StackIdList;
8288 for (
unsigned J = 0; J < NumStackIds; J++) {
8289 assert(*RecordIter < StackIds.size());
8290 StackIdList.
push_back(getStackIdIndex(*RecordIter++));
8292 SmallVector<unsigned> Versions;
8293 for (
unsigned J = 0; J < NumVersions; J++)
8295 ValueInfo
VI = std::get<0>(
8296 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8297 if (MemProfAfterFunctionSummary)
8299 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8301 PendingCallsites.push_back(
8302 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8309 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8314 PendingContextIds.reserve(
Record.size() / 2);
8315 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8316 PendingContextIds.push_back(*R << 32 | *(R + 1));
8323 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS) {
8324 PendingContextIds.clear();
8328 std::vector<MIBInfo> MIBs;
8329 unsigned NumMIBs = 0;
8332 unsigned MIBsRead = 0;
8333 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8337 auto StackIdList = parseAllocInfoContext(Record,
I);
8338 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8344 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8346 assert(!PendingContextIds.empty() &&
8347 "Missing context ids for alloc sizes");
8348 unsigned ContextIdIndex = 0;
8354 while (MIBsRead++ < NumMIBs) {
8356 unsigned NumContextSizeInfoEntries =
Record[
I++];
8358 std::vector<ContextTotalSize> ContextSizes;
8359 ContextSizes.reserve(NumContextSizeInfoEntries);
8360 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8361 assert(ContextIdIndex < PendingContextIds.size());
8363 if (PendingContextIds[ContextIdIndex] == 0) {
8372 ContextSizes.push_back(
8373 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8375 AllContextSizes.push_back(std::move(ContextSizes));
8377 PendingContextIds.clear();
8379 AllocInfo AI(std::move(MIBs));
8380 if (!AllContextSizes.empty()) {
8381 assert(AI.MIBs.size() == AllContextSizes.size());
8382 AI.ContextSizeInfos = std::move(AllContextSizes);
8385 if (MemProfAfterFunctionSummary)
8386 CurrentPrevailingFS->
addAlloc(std::move(AI));
8388 PendingAllocs.push_back(std::move(AI));
8396 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8398 std::vector<MIBInfo> MIBs;
8399 unsigned NumMIBs =
Record[
I++];
8400 unsigned NumVersions =
Record[
I++];
8401 unsigned MIBsRead = 0;
8402 while (MIBsRead++ < NumMIBs) {
8405 SmallVector<unsigned> StackIdList;
8407 StackIdList = parseAllocInfoContext(Record,
I);
8408 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8411 SmallVector<uint8_t> Versions;
8412 for (
unsigned J = 0; J < NumVersions; J++)
8415 AllocInfo AI(std::move(Versions), std::move(MIBs));
8416 if (MemProfAfterFunctionSummary)
8417 CurrentPrevailingFS->
addAlloc(std::move(AI));
8419 PendingAllocs.push_back(std::move(AI));
8429Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8433 SmallVector<uint64_t, 64>
Record;
8435 SmallString<128> ModulePath;
8442 BitstreamEntry
Entry = MaybeEntry.
get();
8444 switch (
Entry.Kind) {
8447 return error(
"Malformed block");
8459 switch (MaybeRecord.
get()) {
8464 uint64_t ModuleId =
Record[0];
8467 return error(
"Invalid code_entry record");
8469 LastSeenModule = TheIndex.
addModule(ModulePath);
8470 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8478 return error(
"Invalid hash length " + Twine(
Record.size()));
8479 if (!LastSeenModule)
8480 return error(
"Invalid hash that does not follow a module path");
8482 for (
auto &Val : Record) {
8483 assert(!(Val >> 32) &&
"Unexpected high bits set");
8484 LastSeenModule->
second[Pos++] = Val;
8487 LastSeenModule =
nullptr;
8500class BitcodeErrorCategoryType :
public std::error_category {
8501 const char *
name()
const noexcept
override {
8502 return "llvm.bitcode";
8505 std::string message(
int IE)
const override {
8508 case BitcodeError::CorruptedBitcode:
8509 return "Corrupted bitcode";
8518 static BitcodeErrorCategoryType ErrorCategory;
8519 return ErrorCategory;
8523 unsigned Block,
unsigned RecordID) {
8525 return std::move(Err);
8534 switch (Entry.Kind) {
8539 return error(
"Malformed block");
8543 return std::move(Err);
8553 if (MaybeRecord.
get() == RecordID)
8564Expected<std::vector<BitcodeModule>>
8568 return FOrErr.takeError();
8569 return std::move(FOrErr->Mods);
8594 switch (Entry.Kind) {
8597 return error(
"Malformed block");
8600 uint64_t IdentificationBit = -1ull;
8604 return std::move(Err);
8610 Entry = MaybeEntry.
get();
8615 return error(
"Malformed block");
8621 return std::move(Err);
8640 if (!
I.Strtab.empty())
8647 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8648 F.StrtabForSymtab = *Strtab;
8664 if (
F.Symtab.empty())
8665 F.Symtab = *SymtabOrErr;
8670 return std::move(Err);
8675 return std::move(E);
8690BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8691 bool ShouldLazyLoadMetadata,
bool IsImporting,
8695 std::string ProducerIdentification;
8696 if (IdentificationBit != -1ull) {
8698 return std::move(JumpFailed);
8701 return std::move(
E);
8705 return std::move(JumpFailed);
8706 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8709 std::unique_ptr<Module>
M =
8710 std::make_unique<Module>(ModuleIdentifier,
Context);
8711 M->setMaterializer(R);
8714 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8715 IsImporting, Callbacks))
8716 return std::move(Err);
8718 if (MaterializeAll) {
8720 if (
Error Err =
M->materializeAll())
8721 return std::move(Err);
8724 if (
Error Err =
R->materializeForwardReferencedFunctions())
8725 return std::move(Err);
8728 return std::move(M);
8731Expected<std::unique_ptr<Module>>
8734 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8749 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8750 ModulePath, IsPrevailing);
8751 return R.parseModule();
8758 return std::move(JumpFailed);
8760 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8761 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8762 ModuleIdentifier, 0);
8764 if (
Error Err = R.parseModule())
8765 return std::move(Err);
8767 return std::move(Index);
8773 return std::move(Err);
8779 return std::move(
E);
8781 switch (Entry.Kind) {
8784 return error(
"Malformed block");
8787 return std::make_pair(
false,
false);
8799 switch (MaybeBitCode.
get()) {
8805 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8807 bool EnableSplitLTOUnit = Flags & 0x8;
8808 bool UnifiedLTO = Flags & 0x200;
8809 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8820 return std::move(JumpFailed);
8823 return std::move(Err);
8828 return std::move(E);
8830 switch (Entry.Kind) {
8832 return error(
"Malformed block");
8843 return Flags.takeError();
8853 return std::move(Err);
8860 return StreamFailed.takeError();
8870 if (MsOrErr->size() != 1)
8871 return error(
"Expected a single module");
8873 return (*MsOrErr)[0];
8876Expected<std::unique_ptr<Module>>
8878 bool ShouldLazyLoadMetadata,
bool IsImporting,
8884 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8889 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8890 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8892 IsImporting, Callbacks);
8894 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8900 return getModuleImpl(Context,
true,
false,
false, Callbacks);
8912 return BM->parseModule(Context, Callbacks);
8945 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
8954 return BM->getSummary();
8962 return BM->getLTOInfo();
8967 bool IgnoreEmptyThinLTOIndexFile) {
8972 if (IgnoreEmptyThinLTOIndexFile && !(*FileOrErr)->getBufferSize())
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static void getDecodedRelBFCallEdgeInfo(uint64_t RawFlags, uint64_t &RelBF, bool &HasTailCall)
static void upgradeDLLImportExportLinkage(GlobalValue *GV, unsigned Val)
static cl::opt< bool > PrintSummaryGUIDs("print-summary-global-ids", cl::init(false), cl::Hidden, cl::desc("Print the global id for each value when reading the module summary"))
static AtomicOrdering getDecodedOrdering(unsigned Val)
static std::pair< CalleeInfo::HotnessType, bool > getDecodedHotnessCallEdgeInfo(uint64_t RawFlags)
static FunctionSummary::FFlags getDecodedFFlags(uint64_t RawFlags)
static std::optional< CodeModel::Model > getDecodedCodeModel(unsigned Val)
static void setSpecialRefs(SmallVectorImpl< ValueInfo > &Refs, unsigned ROCnt, unsigned WOCnt)
static bool getDecodedDSOLocal(unsigned Val)
static bool convertToString(ArrayRef< uint64_t > Record, unsigned Idx, StrTy &Result)
Convert a string from a record into an std::string, return true on failure.
static GlobalVariable::UnnamedAddr getDecodedUnnamedAddrType(unsigned Val)
static void stripTBAA(Module *M)
static int getDecodedUnaryOpcode(unsigned Val, Type *Ty)
static Expected< std::string > readTriple(BitstreamCursor &Stream)
static void parseWholeProgramDevirtResolutionByArg(ArrayRef< uint64_t > Record, size_t &Slot, WholeProgramDevirtResolution &Wpd)
static uint64_t getRawAttributeMask(Attribute::AttrKind Val)
static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags, uint64_t Version)
static GlobalVarSummary::GVarFlags getDecodedGVarFlags(uint64_t RawFlags)
static Attribute::AttrKind getAttrFromCode(uint64_t Code)
static Expected< uint64_t > jumpToValueSymbolTable(uint64_t Offset, BitstreamCursor &Stream)
Helper to note and return the current location, and jump to the given offset.
static Expected< bool > hasObjCCategoryInModule(BitstreamCursor &Stream)
static GlobalValue::DLLStorageClassTypes getDecodedDLLStorageClass(unsigned Val)
static GEPNoWrapFlags toGEPNoWrapFlags(uint64_t Flags)
static void decodeLLVMAttributesForBitcode(AttrBuilder &B, uint64_t EncodedAttrs, uint64_t AttrIdx)
This fills an AttrBuilder object with the LLVM attributes that have been decoded from the given integ...
static AtomicRMWInst::BinOp getDecodedRMWOperation(unsigned Val, bool &IsElementwise)
static void parseTypeIdSummaryRecord(ArrayRef< uint64_t > Record, StringRef Strtab, ModuleSummaryIndex &TheIndex)
static void addRawAttributeValue(AttrBuilder &B, uint64_t Val)
static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val)
static bool hasImplicitComdat(size_t Val)
static GlobalValue::LinkageTypes getDecodedLinkage(unsigned Val)
static Error hasInvalidBitcodeHeader(BitstreamCursor &Stream)
static Expected< std::string > readIdentificationCode(BitstreamCursor &Stream)
static int getDecodedBinaryOpcode(unsigned Val, Type *Ty)
static Expected< BitcodeModule > getSingleModule(MemoryBufferRef Buffer)
static Expected< bool > hasObjCCategory(BitstreamCursor &Stream)
static GlobalVariable::ThreadLocalMode getDecodedThreadLocalMode(unsigned Val)
static void parseWholeProgramDevirtResolution(ArrayRef< uint64_t > Record, StringRef Strtab, size_t &Slot, TypeIdSummary &TypeId)
static void inferDSOLocal(GlobalValue *GV)
static FastMathFlags getDecodedFastMathFlags(unsigned Val)
GlobalValue::SanitizerMetadata deserializeSanitizerMetadata(unsigned V)
static Expected< BitstreamCursor > initStream(MemoryBufferRef Buffer)
static cl::opt< bool > ExpandConstantExprs("expand-constant-exprs", cl::Hidden, cl::desc("Expand constant expressions to instructions for testing purposes"))
static bool upgradeOldMemoryAttribute(MemoryEffects &ME, uint64_t EncodedKind)
static Expected< StringRef > readBlobInRecord(BitstreamCursor &Stream, unsigned Block, unsigned RecordID)
static Expected< std::string > readIdentificationBlock(BitstreamCursor &Stream)
Read the "IDENTIFICATION_BLOCK_ID" block, do some basic enforcement on the "epoch" encoded in the bit...
static Expected< std::pair< bool, bool > > getEnableSplitLTOUnitAndUnifiedFlag(BitstreamCursor &Stream, unsigned ID)
static bool isConstExprSupported(const BitcodeConstant *BC)
static int getDecodedCastOpcode(unsigned Val)
static Expected< std::string > readModuleTriple(BitstreamCursor &Stream)
static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static StringRef getOpcodeName(uint8_t Opcode, uint8_t OpcodeBase)
This file defines the DenseMap class.
Provides ErrorOr<T> smart pointer.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Module.h This file contains the declarations for the Module class.
static constexpr Value * getValue(Ty &ValueOrUse)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Machine Check Debug Module
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines the SmallString class.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
PointerType * getType() const
Overload to return most specific pointer type.
void setUsedWithInAlloca(bool V)
Specify whether this alloca is used to represent the arguments to a call.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
static bool isValidFailureOrdering(AtomicOrdering Ordering)
static AtomicOrdering getStrongestFailureOrdering(AtomicOrdering SuccessOrdering)
Returns the strongest permitted ordering on failure, given the desired ordering on success.
static bool isValidSuccessOrdering(AtomicOrdering Ordering)
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
static bool isTypeAttrKind(AttrKind Kind)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
@ None
No attributes have been set.
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
@ EndAttrKinds
Sentinel value useful for loops.
LLVM Basic Block Representation.
const Instruction & back() const
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI void replacePhiUsesWith(BasicBlock *Old, BasicBlock *New)
Update all phi nodes in this basic block to refer to basic block New instead of basic block Old.
LLVM_ABI SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
void moveBefore(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it into the function that MovePos lives ...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Represents a module in a bitcode file.
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getSummary()
Parse the specified bitcode buffer, returning the module summary index.
LLVM_ABI Expected< BitcodeLTOInfo > getLTOInfo()
Returns information about the module to be used for LTO: whether to compile with ThinLTO,...
LLVM_ABI Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(GlobalValue::GUID)> IsPrevailing=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata, bool IsImporting, ParserCallbacks Callbacks={})
Read the bitcode module and prepare for lazy deserialization of function bodies.
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
void push_back(Value *V, unsigned TypeID)
void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV)
Error assignValue(unsigned Idx, Value *V, unsigned TypeID)
void shrinkTo(unsigned N)
unsigned getTypeID(unsigned ValNo) const
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
ArrayRef< uint8_t > getBitcodeBytes() const
Expected< word_t > Read(unsigned NumBits)
Expected< BitstreamEntry > advance(unsigned Flags=0)
Advance the current bitstream, returning the next entry in the stream.
Expected< BitstreamEntry > advanceSkippingSubblocks(unsigned Flags=0)
This is a convenience function for clients that don't expect any subblocks.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP=nullptr)
Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
Error SkipBlock()
Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body of this block.
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
uint64_t getCurrentByteNo() const
LLVM_ABI Expected< std::optional< BitstreamBlockInfo > > ReadBlockInfoBlock(bool ReadBlockInfoNames=false)
Read and return a block info block from the bitstream.
unsigned getAbbrevIDWidth() const
Return the number of bits used to encode an abbrev #.
bool canSkipToPos(size_t pos) const
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
@ MIN_BYTE_BITS
Minimum number of bits that can be specified.
@ MAX_BYTE_BITS
Maximum number of bits that can be specified Note that bit width is stored in the Type classes Subcla...
static LLVM_ABI ByteType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing a ByteType.
bool isInlineAsm() const
Check if this call is an inline asm statement.
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CaptureInfo createFromIntValue(uint32_t Data)
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
bool isFPPredicate() const
bool isIntPredicate() const
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
static CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
static LLVM_ABI bool isElementTypeCompatible(Type *Ty)
Return true if a ConstantDataSequential can be formed with a vector or array of the specified element...
static Constant * getRaw(StringRef Data, uint64_t NumElements, Type *ElementTy)
getRaw() constructor - Return a constant with vector type with an element count and element type matc...
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static LLVM_ABI bool isSupportedBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is supported.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI bool isSupportedCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is supported.
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
static LLVM_ABI bool isOrderedRanges(ArrayRef< ConstantRange > RangesRef)
LLVM_ABI bool isUpperSignWrapped() const
Return true if the (exclusive) upper bound wraps around the signed domain.
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
static LLVM_ABI Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
static DeadOnReturnInfo createFromIntValue(uint64_t Data)
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Base class for error info classes.
virtual std::string message() const
Return the error message as a string.
virtual std::error_code convertToErrorCode() const =0
Convert this error to a std::error_code.
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
Convenience struct for specifying and reasoning about fast-math flags.
void setFast(bool B=true)
void setAllowContract(bool B=true)
void setAllowReciprocal(bool B=true)
void setNoSignedZeros(bool B=true)
void setNoNaNs(bool B=true)
void setAllowReassoc(bool B=true)
Flag setters.
void setApproxFunc(bool B=true)
void setNoInfs(bool B=true)
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
void addCallsite(CallsiteInfo &&Callsite)
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
void addAlloc(AllocInfo &&Alloc)
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
BasicBlockListType::iterator iterator
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags noUnsignedSignedWrap()
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
static LLVM_ABI GlobalIFunc * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Resolver, Module *Parent)
If a parent module is specified, the ifunc is automatically inserted into the end of the specified mo...
LLVM_ABI void setComdat(Comdat *C)
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
void setOriginalName(GlobalValue::GUID Name)
Initialize the original name hash in this summary.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
static bool isLocalLinkage(LinkageTypes Linkage)
void setUnnamedAddr(UnnamedAddr Val)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
bool hasLocalLinkage() const
bool hasDefaultVisibility() const
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
void setDLLStorageClass(DLLStorageClassTypes C)
void setThreadLocalMode(ThreadLocalMode Val)
bool hasExternalWeakLinkage() const
DLLStorageClassTypes
Storage classes of global values for PE targets.
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
void setDSOLocal(bool Local)
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
static LLVM_ABI std::string getGlobalIdentifier(StringRef Name, GlobalValue::LinkageTypes Linkage, StringRef FileName)
Return the modified name for a global value suitable to be used as the key for a global lookup (e....
void setVisibility(VisibilityTypes V)
LLVM_ABI void setSanitizerMetadata(SanitizerMetadata Meta)
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AppendingLinkage
Special purpose, only applies to global arrays.
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
LLVM_ABI void setPartition(StringRef Part)
void setAttributes(AttributeSet A)
Set attribute list for this global.
LLVM_ABI void setCodeModel(CodeModel::Model CM)
Change the code model for this global.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
LLVM_ABI void addDestination(BasicBlock *Dest)
Add a destination.
static IndirectBrInst * Create(Value *Address, unsigned NumDests, InsertPosition InsertBefore=nullptr)
unsigned getNumDestinations() const
return the number of possible destinations in this indirectbr instruction.
static LLVM_ABI InlineAsm * get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack=false, AsmDialect asmDialect=AD_ATT, bool canThrow=false)
InlineAsm::get - Return the specified uniqued inline asm string.
std::vector< ConstraintInfo > ConstraintInfoVector
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB)
Replace specified successor OldBB to point at the provided block.
const char * getOpcodeName() const
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This is an important class for using LLVM in a threaded context.
static LLVM_ABI LandingPadInst * Create(Type *RetTy, unsigned NumReservedClauses, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedClauses is a hint for the number of incoming clauses that this landingpad w...
LLVM_ABI void addClause(Constant *ClauseVal)
Add a catch or filter clause to the landing pad.
void setCleanup(bool V)
Indicate that this landingpad instruction is a cleanup.
LLVM_ABI StringRef getString() const
ValueT lookup(const KeyT &Key) const
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
size_t getBufferSize() const
StringRef getBufferIdentifier() const
const char * getBufferStart() const
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
static MemoryEffectsBase readOnly()
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase errnoMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase createFromIntValue(uint32_t Data)
static MemoryEffectsBase writeOnly()
static MemoryEffectsBase otherMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase none()
static MemoryEffectsBase unknown()
Class to hold module path string table and global value map, and encapsulate methods for operating on...
TypeIdSummary & getOrInsertTypeIdSummary(StringRef TypeId)
Return an existing or new TypeIdSummary entry for TypeId.
ModulePathStringTableTy::value_type ModuleInfo
ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID)
Return a ValueInfo for GUID.
static constexpr uint64_t BitcodeSummaryVersion
StringRef saveString(StringRef String)
LLVM_ABI void setFlags(uint64_t Flags)
CfiFunctionIndex & cfiFunctionDecls()
void addBlockCount(uint64_t C)
ModuleInfo * addModule(StringRef ModPath, ModuleHash Hash=ModuleHash{{0}})
Add a new module with the given Hash, mapped to the given ModID, and return a reference to the module...
void addGlobalValueSummary(const GlobalValue &GV, std::unique_ptr< GlobalValueSummary > Summary)
Add a global value summary for a value.
CfiFunctionIndex & cfiFunctionDefs()
GlobalValueSummary * findSummaryInModule(ValueInfo VI, StringRef ModuleId) const
Find the summary for ValueInfo VI in module ModuleId, or nullptr if not found.
unsigned addOrGetStackIdIndex(uint64_t StackId)
ModuleInfo * getModule(StringRef ModPath)
Return module entry for module with the given ModPath.
void addOriginalName(GlobalValue::GUID ValueGUID, GlobalValue::GUID OrigGUID)
Add an original name for the value of the given GUID.
TypeIdCompatibleVtableInfo & getOrInsertTypeIdCompatibleVtableSummary(StringRef TypeId)
Return an existing or new TypeIdCompatibleVtableMap entry for TypeId.
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
NamedMDNode * getNamedMetadata(StringRef Name) const
Return the first NamedMDNode in the module with the specified name.
NamedMDNode * getOrInsertNamedMetadata(StringRef Name)
Return the named MDNode in the module with the specified name.
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
static ResumeInst * Create(Value *Exn, InsertPosition InsertBefore=nullptr)
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
ArrayRef< int > getShuffleMask() const
void append(StringRef RHS)
Append from a StringRef.
StringRef str() const
Explicit conversion to StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
constexpr bool empty() const
Check if the string is empty.
constexpr size_t size() const
Get the string size.
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
LLVM_ABI void setName(StringRef Name)
Change the name of this type to the specified name, or to a name with a suffix if there is a collisio...
LLVM_ABI Error setBodyOrError(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type or return an error if it would make the type recursive.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
LLVM_ABI bool visitTBAAMetadata(const Instruction *I, const MDNode *MD)
Visit an instruction, or a TBAA node itself as part of a metadata, and return true if it is valid,...
@ HasZeroInit
zeroinitializer is valid for this target extension type.
static LLVM_ABI Expected< TargetExtType * > getOrError(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters,...
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI Type * getStructElementType(unsigned N) const
bool isVectorTy() const
True if this is an instance of VectorType.
bool isArrayTy() const
True if this is an instance of ArrayType.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
bool isLabelTy() const
Return true if this is 'label'.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
Type * getArrayElementType() const
LLVM_ABI unsigned getStructNumElements() const
LLVM_ABI uint64_t getArrayNumElements() const
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isStructTy() const
True if this is an instance of StructType.
bool isByteOrByteVectorTy() const
Return true if this is a byte type or a vector of byte types.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
bool isVoidTy() const
Return true if this is 'void'.
bool isMetadataTy() const
Return true if this is 'metadata'.
static LLVM_ABI UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
const ParentTy * getParent() const
self_iterator getIterator()
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
constexpr uint8_t RecordLength
Length of the parts of a physical GOFF record.
@ BasicBlock
Various leaf nodes.
LLVM_ABI AttributeList getAttributes(LLVMContext &C, ID id, FunctionType *FT)
Return the attributes for an intrinsic.
@ SingleThread
Synchronized with respect to signal handlers executing in the same thread.
@ System
Synchronized with respect to all concurrently executing threads.
@ TYPE_CODE_OPAQUE_POINTER
@ FS_CONTEXT_RADIX_TREE_ARRAY
@ FS_COMBINED_GLOBALVAR_INIT_REFS
@ FS_TYPE_CHECKED_LOAD_VCALLS
@ FS_COMBINED_ORIGINAL_NAME
@ FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_CONST_VCALL
@ FS_PERMODULE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_VCALLS
@ FS_COMBINED_ALLOC_INFO_NO_CONTEXT
@ FS_COMBINED_CALLSITE_INFO
@ FS_PERMODULE_CALLSITE_INFO
@ FS_PERMODULE_ALLOC_INFO
@ FS_TYPE_CHECKED_LOAD_CONST_VCALL
@ IDENTIFICATION_CODE_EPOCH
@ IDENTIFICATION_CODE_STRING
@ CST_CODE_CE_INBOUNDS_GEP
@ CST_CODE_INLINEASM_OLD3
@ CST_CODE_CE_GEP_WITH_INRANGE_INDEX_OLD
@ CST_CODE_DSO_LOCAL_EQUIVALENT
@ CST_CODE_INLINEASM_OLD2
@ CST_CODE_CE_GEP_WITH_INRANGE
@ VST_CODE_COMBINED_ENTRY
@ COMDAT_SELECTION_KIND_LARGEST
@ COMDAT_SELECTION_KIND_ANY
@ COMDAT_SELECTION_KIND_SAME_SIZE
@ COMDAT_SELECTION_KIND_EXACT_MATCH
@ COMDAT_SELECTION_KIND_NO_DUPLICATES
@ ATTR_KIND_STACK_PROTECT
@ ATTR_KIND_STACK_PROTECT_STRONG
@ ATTR_KIND_SANITIZE_MEMORY
@ ATTR_KIND_OPTIMIZE_FOR_SIZE
@ ATTR_KIND_INACCESSIBLEMEM_ONLY
@ ATTR_KIND_FNRETTHUNK_EXTERN
@ ATTR_KIND_NO_DIVERGENCE_SOURCE
@ ATTR_KIND_SANITIZE_ADDRESS
@ ATTR_KIND_NO_IMPLICIT_FLOAT
@ ATTR_KIND_DEAD_ON_UNWIND
@ ATTR_KIND_STACK_ALIGNMENT
@ ATTR_KIND_INACCESSIBLEMEM_OR_ARGMEMONLY
@ ATTR_KIND_STACK_PROTECT_REQ
@ ATTR_KIND_NULL_POINTER_IS_VALID
@ ATTR_KIND_SANITIZE_HWADDRESS
@ ATTR_KIND_RETURNS_TWICE
@ ATTR_KIND_SHADOWCALLSTACK
@ ATTR_KIND_OPT_FOR_FUZZING
@ ATTR_KIND_DENORMAL_FPENV
@ ATTR_KIND_SANITIZE_NUMERICAL_STABILITY
@ ATTR_KIND_ALLOCATED_POINTER
@ ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION
@ ATTR_KIND_CORO_ELIDE_SAFE
@ ATTR_KIND_NON_LAZY_BIND
@ ATTR_KIND_DEREFERENCEABLE
@ ATTR_KIND_OPTIMIZE_NONE
@ ATTR_KIND_DEREFERENCEABLE_OR_NULL
@ ATTR_KIND_SANITIZE_REALTIME
@ ATTR_KIND_SPECULATIVE_LOAD_HARDENING
@ ATTR_KIND_ALWAYS_INLINE
@ ATTR_KIND_SANITIZE_TYPE
@ ATTR_KIND_PRESPLIT_COROUTINE
@ ATTR_KIND_SANITIZE_ALLOC_TOKEN
@ ATTR_KIND_NO_SANITIZE_COVERAGE
@ ATTR_KIND_NO_CREATE_UNDEF_OR_POISON
@ ATTR_KIND_DEAD_ON_RETURN
@ ATTR_KIND_SANITIZE_REALTIME_BLOCKING
@ ATTR_KIND_NO_SANITIZE_BOUNDS
@ ATTR_KIND_SANITIZE_MEMTAG
@ ATTR_KIND_CORO_ONLY_DESTROY_WHEN_COMPLETE
@ ATTR_KIND_SANITIZE_THREAD
@ ATTR_KIND_OPTIMIZE_FOR_DEBUGGING
@ SYNC_SCOPE_NAMES_BLOCK_ID
@ PARAMATTR_GROUP_BLOCK_ID
@ IDENTIFICATION_BLOCK_ID
@ GLOBALVAL_SUMMARY_BLOCK_ID
@ FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID
@ OPERAND_BUNDLE_TAGS_BLOCK_ID
@ BLOCKINFO_BLOCK_ID
BLOCKINFO_BLOCK is used to define metadata about blocks, for example, standard abbrevs that should be...
@ MODULE_CODE_SOURCE_FILENAME
@ MODULE_CODE_SECTIONNAME
@ FUNC_CODE_INST_ATOMICRMW_OLD
@ FUNC_CODE_INST_CATCHRET
@ FUNC_CODE_INST_LANDINGPAD
@ FUNC_CODE_INST_EXTRACTVAL
@ FUNC_CODE_INST_CATCHPAD
@ FUNC_CODE_INST_CATCHSWITCH
@ FUNC_CODE_INST_INBOUNDS_GEP_OLD
@ FUNC_CODE_INST_STOREATOMIC_OLD
@ FUNC_CODE_INST_CLEANUPRET
@ FUNC_CODE_INST_LANDINGPAD_OLD
@ FUNC_CODE_DEBUG_RECORD_VALUE
@ FUNC_CODE_INST_LOADATOMIC
@ FUNC_CODE_DEBUG_RECORD_ASSIGN
@ FUNC_CODE_INST_STOREATOMIC
@ FUNC_CODE_INST_ATOMICRMW
@ FUNC_CODE_DEBUG_RECORD_DECLARE_VALUE
@ FUNC_CODE_DEBUG_LOC_AGAIN
@ FUNC_CODE_INST_EXTRACTELT
@ FUNC_CODE_INST_INDIRECTBR
@ FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE
@ FUNC_CODE_INST_INSERTVAL
@ FUNC_CODE_DECLAREBLOCKS
@ FUNC_CODE_DEBUG_RECORD_LABEL
@ FUNC_CODE_INST_INSERTELT
@ FUNC_CODE_BLOCKADDR_USERS
@ FUNC_CODE_INST_CLEANUPPAD
@ FUNC_CODE_INST_SHUFFLEVEC
@ FUNC_CODE_INST_STORE_OLD
@ FUNC_CODE_INST_UNREACHABLE
@ FUNC_CODE_INST_CMPXCHG_OLD
@ FUNC_CODE_DEBUG_RECORD_DECLARE
@ FUNC_CODE_OPERAND_BUNDLE
@ PARAMATTR_CODE_ENTRY_OLD
@ PARAMATTR_GRP_CODE_ENTRY
initializer< Ty > init(const Ty &Val)
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
NodeAddr< FuncNode * > Func
friend class Instruction
Iterator for Instructions in a `BasicBlock.
constexpr bool IsBigEndianHost
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
StringMapEntry< Value * > ValueName
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
LLVM_ABI const std::error_category & BitcodeErrorCategory()
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
LLVM_ABI void UpgradeInlineAsmString(std::string *AsmStr)
Upgrade comment in call to inline asm that represents an objc retain release marker.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
std::error_code make_error_code(BitcodeError E)
LLVM_ABI bool stripDebugInfo(Function &F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Expected< bool > isBitcodeContainingObjCCategory(MemoryBufferRef Buffer)
Return true if Buffer contains a bitcode file with ObjC code (category or class) in it.
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI void UpgradeAttributes(AttrBuilder &B)
Upgrade attributes that changed format or kind.
LLVM_ABI Expected< std::string > getBitcodeTargetTriple(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the triple information.
LLVM_ABI std::unique_ptr< Module > parseModule(const uint8_t *Data, size_t Size, LLVMContext &Context)
Fuzzer friendly interface for the llvm bitcode parser.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI Expected< BitcodeFileContents > getBitcodeFileContents(MemoryBufferRef Buffer)
Returns the contents of a bitcode file.
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
LLVM_ABI bool UpgradeCFIFunctionsMetadata(Module &M)
Upgrade the cfi.functions metadata node by calculating and inserting the GUID for each function entry...
LLVM_ABI void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
auto uninitialized_copy(R &&Src, IterTy Dst)
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
bool isa_and_nonnull(const Y &Val)
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
LLVM_ABI void UpgradeOperandBundles(std::vector< OperandBundleDef > &OperandBundles)
Upgrade operand bundles (without knowing about their user instruction).
LLVM_ABI Constant * UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy)
This is an auto-upgrade for bitcast constant expression between pointers with different address space...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndex(MemoryBufferRef Buffer)
Parse the specified bitcode buffer, returning the module summary index.
auto dyn_cast_or_null(const Y &Val)
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
LLVM_ABI Expected< std::string > getBitcodeProducerString(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the producer string information.
auto reverse(ContainerTy &&C)
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyBitcodeModule(MemoryBufferRef Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Read the header of the specified bitcode buffer and prepare for lazy deserialization of function bodi...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
detail::ValueMatchesPoly< M > HasValue(M Matcher)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI std::string UpgradeDataLayoutString(StringRef DL, StringRef Triple)
Upgrade the datalayout string by adding a section for address space pointers.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
LLVM_ABI Expected< BitcodeLTOInfo > getBitcodeLTOInfo(MemoryBufferRef Buffer)
Returns LTO information for the specified bitcode file.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI GlobalVariable * UpgradeGlobalVariable(GlobalVariable *GV)
This checks for global variables which should be upgraded.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
AtomicOrdering
Atomic ordering for LLVM's memory model.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
@ ArgMem
Access to memory via argument pointers.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
LLVM_ABI Instruction * UpgradeBitCastInst(unsigned Opc, Value *V, Type *DestTy, Instruction *&Temp)
This is an auto-upgrade for bitcast between pointers with different address spaces: the instruction i...
MaybeAlign decodeMaybeAlign(unsigned Value)
Dual operation of the encode function above.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr, const unsigned char *&BufEnd, bool VerifyBufferSize)
SkipBitcodeWrapperHeader - Some systems wrap bc files with a special header for padding or other reas...
bool isBitcodeWrapper(const unsigned char *BufPtr, const unsigned char *BufEnd)
isBitcodeWrapper - Return true if the given bytes are the magic bytes for an LLVM IR bitcode wrapper.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI APInt readWideAPInt(ArrayRef< uint64_t > Vals, unsigned TypeBits)
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
LLVM_ABI void UpgradeFunctionAttributes(Function &F)
Correct any IR that is relying on old function attribute behavior.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
LLVM_ABI Error readModuleSummaryIndex(MemoryBufferRef Buffer, ModuleSummaryIndex &CombinedIndex)
Parse the specified bitcode buffer and merge the index into CombinedIndex.
LLVM_ABI void UpgradeARCRuntime(Module &M)
Convert calls to ARC runtime functions to intrinsic calls and upgrade the old retain release marker t...
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndexForFile(StringRef Path, bool IgnoreEmptyThinLTOIndexFile=false)
Parse the module summary index out of an IR file and return the module summary index object if found,...
LLVM_ABI Expected< std::unique_ptr< Module > > getOwningLazyBitcodeModule(std::unique_ptr< MemoryBuffer > &&Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Like getLazyBitcodeModule, except that the module takes ownership of the memory buffer if successful.
LLVM_ABI std::error_code errorToErrorCodeAndEmitErrors(LLVMContext &Ctx, Error Err)
Implement std::hash so that hash_code can be used in STL containers.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Basic information extracted from a bitcode module to be used for LTO.
static Bitfield::Type get(StorageType Packed)
Unpacks the field from the Packed value.
When advancing through a bitstream cursor, each advance can discover a few different kinds of entries...
static constexpr DenormalFPEnv createFromIntValue(uint32_t Data)
Flags specific to function summaries.
static constexpr uint32_t RangeWidth
std::vector< Call > Calls
In the per-module summary, it summarizes the byte offset applied to each pointer parameter before pas...
ConstantRange Use
The range contains byte offsets from the parameter pointer which accessed by the function.
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
static LLVM_ABI const char * BranchWeights
std::optional< ValueTypeCallbackTy > ValueType
The ValueType callback is called for every function definition or declaration and allows accessing th...
std::optional< DataLayoutCallbackFuncTy > DataLayout
std::optional< MDTypeCallbackTy > MDType
The MDType callback is called for every value in metadata.
bool SkipDebugIntrinsicUpgrade
If true, do not auto-upgrade debug intrinsic calls (llvm.dbg.
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
Kind
Specifies which kind of type check we should emit for this byte array.
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
ValID - Represents a reference of a definition of some sort with no type.
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...
std::string SingleImplName