24#include "llvm/Config/llvm-config.h"
54#include "llvm/IR/IntrinsicsAArch64.h"
55#include "llvm/IR/IntrinsicsARM.h"
88#include <system_error>
98 "Print the global id for each value when reading the module summary"));
103 "Expand constant expressions to instructions for testing purposes"));
108 SWITCH_INST_MAGIC = 0x4B5
121 "file too small to contain bitcode header");
122 for (
unsigned C : {
'B',
'C'})
126 "file doesn't start with bitcode header");
128 return Res.takeError();
129 for (
unsigned C : {0x0, 0xC, 0xE, 0xD})
133 "file doesn't start with bitcode header");
135 return Res.takeError();
140 const unsigned char *BufPtr = (
const unsigned char *)Buffer.
getBufferStart();
141 const unsigned char *BufEnd = BufPtr + Buffer.
getBufferSize();
144 return error(
"Invalid bitcode signature");
150 return error(
"Invalid bitcode wrapper header");
154 return std::move(Err);
156 return std::move(Stream);
160template <
typename StrTy>
173 if (
F.isMaterializable())
176 I.setMetadata(LLVMContext::MD_tbaa,
nullptr);
184 return std::move(Err);
189 std::string ProducerIdentification;
196 switch (Entry.Kind) {
199 return error(
"Malformed block");
201 return ProducerIdentification;
212 switch (MaybeBitCode.
get()) {
214 return error(
"Invalid value");
222 Twine(
"Incompatible epoch: Bitcode '") +
Twine(epoch) +
241 switch (Entry.Kind) {
244 return error(
"Malformed block");
252 return std::move(Err);
264 return std::move(Err);
275 switch (Entry.Kind) {
278 return error(
"Malformed block");
290 switch (MaybeRecord.
get()) {
296 return error(
"Invalid section name record");
301 Segment = Segment.trim();
302 Section = Section.trim();
304 if (Segment ==
"__DATA" && Section.starts_with(
"__objc_catlist"))
306 if (Segment ==
"__OBJC" && Section.starts_with(
"__category"))
308 if (Segment ==
"__TEXT" && Section.starts_with(
"__swift"))
326 switch (Entry.Kind) {
328 return error(
"Malformed block");
338 return std::move(Err);
351 return std::move(Err);
364 switch (Entry.Kind) {
367 return error(
"Malformed block");
379 switch (MaybeRecord.
get()) {
384 return error(
"Invalid triple record");
403 switch (Entry.Kind) {
405 return error(
"Malformed block");
415 return std::move(Err);
422 return Skipped.takeError();
429class BitcodeReaderBase {
431 BitcodeReaderBase(BitstreamCursor Stream, StringRef Strtab)
432 : Stream(std::
move(Stream)), Strtab(Strtab) {
433 this->Stream.setBlockInfo(&BlockInfo);
436 BitstreamBlockInfo BlockInfo;
437 BitstreamCursor Stream;
442 bool UseStrtab =
false;
444 Expected<unsigned> parseVersionRecord(ArrayRef<uint64_t> Record);
449 std::pair<StringRef, ArrayRef<uint64_t>>
450 readNameFromStrtab(ArrayRef<uint64_t> Record);
452 Error readBlockInfo();
455 std::string ProducerIdentification;
462Error BitcodeReaderBase::error(
const Twine &Message) {
463 std::string FullMsg = Message.
str();
464 if (!ProducerIdentification.empty())
465 FullMsg +=
" (Producer: '" + ProducerIdentification +
"' Reader: 'LLVM " +
466 LLVM_VERSION_STRING
"')";
467 return ::error(FullMsg);
471BitcodeReaderBase::parseVersionRecord(ArrayRef<uint64_t> Record) {
473 return error(
"Invalid version record");
474 unsigned ModuleVersion =
Record[0];
475 if (ModuleVersion > 2)
476 return error(
"Invalid value");
477 UseStrtab = ModuleVersion >= 2;
478 return ModuleVersion;
481std::pair<StringRef, ArrayRef<uint64_t>>
482BitcodeReaderBase::readNameFromStrtab(ArrayRef<uint64_t> Record) {
486 if (Record[0] + Record[1] > Strtab.
size())
488 return {StringRef(Strtab.
data() + Record[0], Record[1]),
Record.slice(2)};
499class BitcodeConstant final :
public Value,
500 TrailingObjects<BitcodeConstant, unsigned> {
501 friend TrailingObjects;
504 static constexpr uint8_t SubclassID = 255;
512 static constexpr uint8_t ConstantStructOpcode = 255;
513 static constexpr uint8_t ConstantArrayOpcode = 254;
514 static constexpr uint8_t ConstantVectorOpcode = 253;
515 static constexpr uint8_t NoCFIOpcode = 252;
516 static constexpr uint8_t DSOLocalEquivalentOpcode = 251;
517 static constexpr uint8_t BlockAddressOpcode = 250;
518 static constexpr uint8_t ConstantPtrAuthOpcode = 249;
519 static constexpr uint8_t FirstSpecialOpcode = ConstantPtrAuthOpcode;
526 unsigned BlockAddressBB = 0;
527 Type *SrcElemTy =
nullptr;
528 std::optional<ConstantRange>
InRange;
530 ExtraInfo(uint8_t Opcode, uint8_t Flags = 0,
Type *SrcElemTy =
nullptr,
531 std::optional<ConstantRange>
InRange = std::nullopt)
532 : Opcode(Opcode),
Flags(
Flags), SrcElemTy(SrcElemTy),
535 ExtraInfo(uint8_t Opcode, uint8_t Flags,
unsigned BlockAddressBB)
536 : Opcode(Opcode),
Flags(
Flags), BlockAddressBB(BlockAddressBB) {}
541 unsigned NumOperands;
542 unsigned BlockAddressBB;
544 std::optional<ConstantRange>
InRange;
547 BitcodeConstant(
Type *Ty,
const ExtraInfo &Info, ArrayRef<unsigned> OpIDs)
549 NumOperands(OpIDs.
size()), BlockAddressBB(
Info.BlockAddressBB),
554 BitcodeConstant &operator=(
const BitcodeConstant &) =
delete;
558 const ExtraInfo &Info,
559 ArrayRef<unsigned> OpIDs) {
560 void *Mem =
A.Allocate(totalSizeToAlloc<unsigned>(OpIDs.
size()),
561 alignof(BitcodeConstant));
562 return new (Mem) BitcodeConstant(Ty, Info, OpIDs);
565 static bool classof(
const Value *V) {
return V->getValueID() == SubclassID; }
567 ArrayRef<unsigned> getOperandIDs()
const {
568 return ArrayRef(getTrailingObjects(), NumOperands);
571 std::optional<ConstantRange> getInRange()
const {
572 assert(Opcode == Instruction::GetElementPtr);
581class BitcodeReader :
public BitcodeReaderBase,
public GVMaterializer {
583 Module *TheModule =
nullptr;
585 uint64_t NextUnreadBit = 0;
587 uint64_t LastFunctionBlockBit = 0;
588 bool SeenValueSymbolTable =
false;
589 uint64_t VSTOffset = 0;
591 std::vector<std::string> SectionTable;
592 std::vector<std::string> GCTable;
594 std::vector<Type *> TypeList;
598 DenseMap<unsigned, SmallVector<unsigned, 1>> ContainedTypeIDs;
605 DenseMap<std::pair<Type *, unsigned>,
unsigned> VirtualTypeIDs;
606 DenseMap<Function *, unsigned> FunctionTypeIDs;
611 BitcodeReaderValueList ValueList;
612 std::optional<MetadataLoader> MDLoader;
613 std::vector<Comdat *> ComdatList;
614 DenseSet<GlobalObject *> ImplicitComdatObjects;
617 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInits;
618 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInits;
620 struct FunctionOperandInfo {
622 unsigned PersonalityFn;
626 std::vector<FunctionOperandInfo> FunctionOperands;
630 std::vector<AttributeList> MAttributes;
633 std::map<unsigned, AttributeList> MAttributeGroups;
637 std::vector<BasicBlock*> FunctionBBs;
641 std::vector<Function*> FunctionsWithBodies;
645 using UpdatedIntrinsicMap = DenseMap<Function *, Function *>;
646 UpdatedIntrinsicMap UpgradedIntrinsics;
651 bool SeenFirstFunctionBody =
false;
655 DenseMap<Function*, uint64_t> DeferredFunctionInfo;
660 std::vector<uint64_t> DeferredMetadataInfo;
665 DenseMap<Function *, std::vector<BasicBlock *>> BasicBlockFwdRefs;
666 std::deque<Function *> BasicBlockFwdRefQueue;
673 std::vector<Function *> BackwardRefFunctions;
681 bool UseRelativeIDs =
false;
685 bool WillMaterializeAllForwardRefs =
false;
689 bool SeenDebugIntrinsic =
false;
690 bool SeenDebugRecord =
false;
693 TBAAVerifier TBAAVerifyHelper;
695 std::vector<std::string> BundleTags;
698 std::optional<ValueTypeCallbackTy> ValueTypeCallback;
701 BitcodeReader(BitstreamCursor Stream, StringRef Strtab,
702 StringRef ProducerIdentification, LLVMContext &
Context);
704 Error materializeForwardReferencedFunctions();
706 Error materialize(GlobalValue *GV)
override;
707 Error materializeModule()
override;
708 std::vector<StructType *> getIdentifiedStructTypes()
const override;
712 Error parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
713 bool IsImporting, ParserCallbacks Callbacks = {});
715 static uint64_t decodeSignRotatedValue(uint64_t V);
718 Error materializeMetadata()
override;
720 void setStripDebugInfo()
override;
723 std::vector<StructType *> IdentifiedStructTypes;
724 StructType *createIdentifiedStructType(LLVMContext &
Context, StringRef Name);
725 StructType *createIdentifiedStructType(LLVMContext &
Context);
727 static constexpr unsigned InvalidTypeID = ~0
u;
729 Type *getTypeByID(
unsigned ID);
730 Type *getPtrElementTypeByID(
unsigned ID);
731 unsigned getContainedTypeID(
unsigned ID,
unsigned Idx = 0);
732 unsigned getVirtualTypeID(
Type *Ty, ArrayRef<unsigned> ContainedTypeIDs = {});
735 Expected<Value *> materializeValue(
unsigned ValID, BasicBlock *InsertBB);
736 Expected<Constant *> getValueForInitializer(
unsigned ID);
738 Value *getFnValueByID(
unsigned ID,
Type *Ty,
unsigned TyID,
739 BasicBlock *ConstExprInsertBB) {
746 return MDLoader->getMetadataFwdRefOrLoad(
ID);
750 if (
ID >= FunctionBBs.size())
return nullptr;
751 return FunctionBBs[
ID];
755 if (i-1 < MAttributes.size())
756 return MAttributes[i-1];
757 return AttributeList();
763 bool getValueTypePair(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
764 unsigned InstNum,
Value *&ResVal,
unsigned &
TypeID,
765 BasicBlock *ConstExprInsertBB) {
766 if (Slot ==
Record.size())
return true;
767 unsigned ValNo = (unsigned)Record[Slot++];
770 ValNo = InstNum - ValNo;
771 if (ValNo < InstNum) {
775 ResVal = getFnValueByID(ValNo,
nullptr,
TypeID, ConstExprInsertBB);
777 "Incorrect type ID stored for value");
778 return ResVal ==
nullptr;
780 if (Slot ==
Record.size())
783 TypeID = (unsigned)Record[Slot++];
784 ResVal = getFnValueByID(ValNo, getTypeByID(
TypeID),
TypeID,
786 return ResVal ==
nullptr;
789 bool getValueOrMetadata(
const SmallVectorImpl<uint64_t> &Record,
790 unsigned &Slot,
unsigned InstNum,
Value *&ResVal,
791 BasicBlock *ConstExprInsertBB) {
792 if (Slot ==
Record.size())
797 return getValueTypePair(Record, --Slot, InstNum, ResVal, TypeId,
800 if (Slot ==
Record.size())
802 unsigned ValNo = InstNum - (unsigned)Record[Slot++];
810 bool popValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
811 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
812 BasicBlock *ConstExprInsertBB) {
813 if (
getValue(Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
821 bool getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
822 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
823 BasicBlock *ConstExprInsertBB) {
824 ResVal =
getValue(Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
825 return ResVal ==
nullptr;
830 Value *
getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
831 unsigned InstNum,
Type *Ty,
unsigned TyID,
832 BasicBlock *ConstExprInsertBB) {
833 if (Slot ==
Record.size())
return nullptr;
834 unsigned ValNo = (unsigned)Record[Slot];
837 ValNo = InstNum - ValNo;
838 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
842 Value *getValueSigned(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
843 unsigned InstNum,
Type *Ty,
unsigned TyID,
844 BasicBlock *ConstExprInsertBB) {
845 if (Slot ==
Record.size())
return nullptr;
846 unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]);
849 ValNo = InstNum - ValNo;
850 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
853 Expected<ConstantRange> readConstantRange(ArrayRef<uint64_t> Record,
856 if (
Record.size() - OpNum < 2)
857 return error(
"Too few records for range");
859 unsigned LowerActiveWords =
Record[OpNum];
860 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
861 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
862 return error(
"Too few records for range");
865 OpNum += LowerActiveWords;
868 OpNum += UpperActiveWords;
871 int64_t
Start = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
872 int64_t End = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
873 return ConstantRange(APInt(
BitWidth, Start,
true),
878 Expected<ConstantRange>
879 readBitWidthAndConstantRange(ArrayRef<uint64_t> Record,
unsigned &OpNum) {
880 if (
Record.size() - OpNum < 1)
881 return error(
"Too few records for range");
883 return readConstantRange(Record, OpNum,
BitWidth);
889 Error propagateAttributeTypes(CallBase *CB, ArrayRef<unsigned> ArgsTys);
894 Error parseAlignmentValue(uint64_t
Exponent, MaybeAlign &Alignment);
895 Error parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind);
897 ParserCallbacks Callbacks = {});
899 Error parseComdatRecord(ArrayRef<uint64_t> Record);
900 Error parseGlobalVarRecord(ArrayRef<uint64_t> Record);
901 Error parseFunctionRecord(ArrayRef<uint64_t> Record);
902 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
903 ArrayRef<uint64_t> Record);
905 Error parseAttributeBlock();
906 Error parseAttributeGroupBlock();
907 Error parseTypeTable();
908 Error parseTypeTableBody();
909 Error parseOperandBundleTags();
910 Error parseSyncScopeNames();
912 Expected<Value *> recordValue(SmallVectorImpl<uint64_t> &Record,
913 unsigned NameIndex, Triple &TT);
914 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta, Function *
F,
915 ArrayRef<uint64_t> Record);
917 Error parseGlobalValueSymbolTable();
918 Error parseConstants();
919 Error rememberAndSkipFunctionBodies();
920 Error rememberAndSkipFunctionBody();
922 Error rememberAndSkipMetadata();
924 Error parseFunctionBody(Function *
F);
925 Error globalCleanup();
926 Error resolveGlobalAndIndirectSymbolInits();
927 Error parseUseLists();
928 Error findFunctionInStream(
930 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator);
937class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
939 ModuleSummaryIndex &TheIndex;
943 bool SeenGlobalValSummary =
false;
946 bool SeenValueSymbolTable =
false;
950 uint64_t VSTOffset = 0;
960 DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
961 ValueIdToValueInfoMap;
967 DenseMap<uint64_t, StringRef> ModuleIdMap;
970 std::string SourceFileName;
974 StringRef ModulePath;
982 std::vector<uint64_t> StackIds;
986 std::vector<uint64_t> RadixArray;
991 std::vector<unsigned> StackIdToIndex;
994 ModuleSummaryIndexBitcodeReader(
995 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
996 StringRef ModulePath,
1002 void setValueGUID(uint64_t ValueID, StringRef
ValueName,
1004 StringRef SourceFileName);
1005 Error parseValueSymbolTable(
1007 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
1010 makeCallList(ArrayRef<uint64_t> Record,
bool IsOldProfileFormat,
1011 bool HasProfile,
bool HasRelBF);
1012 Error parseEntireSummary(
unsigned ID);
1013 Error parseModuleStringTable();
1014 void parseTypeIdCompatibleVtableSummaryRecord(ArrayRef<uint64_t> Record);
1015 void parseTypeIdCompatibleVtableInfo(ArrayRef<uint64_t> Record,
size_t &Slot,
1017 std::vector<FunctionSummary::ParamAccess>
1018 parseParamAccesses(ArrayRef<uint64_t> Record);
1019 SmallVector<unsigned> parseAllocInfoContext(ArrayRef<uint64_t> Record,
1023 static constexpr unsigned UninitializedStackIdIndex =
1024 std::numeric_limits<unsigned>::max();
1026 unsigned getStackIdIndex(
unsigned LocalIndex) {
1027 unsigned &
Index = StackIdToIndex[LocalIndex];
1030 if (Index == UninitializedStackIdIndex)
1035 template <
bool AllowNullValueInfo = false>
1036 std::pair<ValueInfo, GlobalValue::GUID>
1037 getValueInfoFromValueId(
unsigned ValueId);
1039 void addThisModule();
1055 return std::error_code();
1061 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1062 ValueList(this->Stream.SizeInBytes(),
1064 return materializeValue(
ValID, InsertBB);
1066 this->ProducerIdentification = std::string(ProducerIdentification);
1069Error BitcodeReader::materializeForwardReferencedFunctions() {
1070 if (WillMaterializeAllForwardRefs)
1074 WillMaterializeAllForwardRefs =
true;
1076 while (!BasicBlockFwdRefQueue.empty()) {
1077 Function *
F = BasicBlockFwdRefQueue.front();
1078 BasicBlockFwdRefQueue.pop_front();
1079 assert(
F &&
"Expected valid function");
1080 if (!BasicBlockFwdRefs.
count(
F))
1088 if (!
F->isMaterializable())
1089 return error(
"Never resolved function from blockaddress");
1092 if (
Error Err = materialize(
F))
1095 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1097 for (Function *
F : BackwardRefFunctions)
1098 if (
Error Err = materialize(
F))
1100 BackwardRefFunctions.clear();
1103 WillMaterializeAllForwardRefs =
false;
1168 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1169 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1170 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1171 Flags.NoInline = (RawFlags >> 4) & 0x1;
1172 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1173 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1174 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1175 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1176 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1192 bool NoRenameOnPromotion = ((RawFlags >> 11) & 1);
1193 RawFlags = RawFlags >> 4;
1194 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1198 bool Live = (RawFlags & 0x2) || Version < 3;
1199 bool Local = (RawFlags & 0x4);
1200 bool AutoHide = (RawFlags & 0x8);
1203 Live,
Local, AutoHide, IK,
1204 NoRenameOnPromotion);
1210 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1211 (RawFlags & 0x4) ?
true :
false,
1215static std::pair<CalleeInfo::HotnessType, bool>
1219 bool HasTailCall = (RawFlags & 0x8);
1220 return {Hotness, HasTailCall};
1225 bool &HasTailCall) {
1226 static constexpr unsigned RelBlockFreqBits = 28;
1227 static constexpr uint64_t RelBlockFreqMask = (1 << RelBlockFreqBits) - 1;
1228 RelBF = RawFlags & RelBlockFreqMask;
1229 HasTailCall = (RawFlags & (1 << RelBlockFreqBits));
1254 case 0:
return false;
1255 case 1:
return true;
1317 bool IsFP = Ty->isFPOrFPVectorTy();
1319 if (!IsFP && !Ty->isIntOrIntVectorTy())
1326 return IsFP ? Instruction::FNeg : -1;
1331 bool IsFP = Ty->isFPOrFPVectorTy();
1333 if (!IsFP && !Ty->isIntOrIntVectorTy())
1340 return IsFP ? Instruction::FAdd : Instruction::Add;
1342 return IsFP ? Instruction::FSub : Instruction::Sub;
1344 return IsFP ? Instruction::FMul : Instruction::Mul;
1346 return IsFP ? -1 : Instruction::UDiv;
1348 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1350 return IsFP ? -1 : Instruction::URem;
1352 return IsFP ? Instruction::FRem : Instruction::SRem;
1354 return IsFP ? -1 : Instruction::Shl;
1356 return IsFP ? -1 : Instruction::LShr;
1358 return IsFP ? -1 : Instruction::AShr;
1360 return IsFP ? -1 : Instruction::And;
1362 return IsFP ? -1 : Instruction::Or;
1364 return IsFP ? -1 : Instruction::Xor;
1369 bool &IsElementwise) {
1467Type *BitcodeReader::getTypeByID(
unsigned ID) {
1469 if (
ID >= TypeList.size())
1472 if (
Type *Ty = TypeList[
ID])
1477 return TypeList[
ID] = createIdentifiedStructType(
Context);
1480unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1481 auto It = ContainedTypeIDs.
find(
ID);
1482 if (It == ContainedTypeIDs.
end())
1483 return InvalidTypeID;
1485 if (Idx >= It->second.size())
1486 return InvalidTypeID;
1488 return It->second[Idx];
1491Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1492 if (
ID >= TypeList.size())
1499 return getTypeByID(getContainedTypeID(
ID, 0));
1502unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1503 ArrayRef<unsigned> ChildTypeIDs) {
1504 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1505 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1506 auto It = VirtualTypeIDs.
find(CacheKey);
1507 if (It != VirtualTypeIDs.
end()) {
1513 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1514 "Incorrect cached contained type IDs");
1518 unsigned TypeID = TypeList.size();
1519 TypeList.push_back(Ty);
1520 if (!ChildTypeIDs.
empty())
1541 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1555 if (Opcode == Instruction::GetElementPtr)
1559 case Instruction::FNeg:
1560 case Instruction::Select:
1561 case Instruction::ICmp:
1562 case Instruction::FCmp:
1569Expected<Value *> BitcodeReader::materializeValue(
unsigned StartValID,
1570 BasicBlock *InsertBB) {
1572 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1574 return ValueList[StartValID];
1576 SmallDenseMap<unsigned, Value *> MaterializedValues;
1577 SmallVector<unsigned> Worklist;
1579 while (!Worklist.
empty()) {
1580 unsigned ValID = Worklist.
back();
1581 if (MaterializedValues.
count(ValID)) {
1587 if (ValID >= ValueList.
size() || !ValueList[ValID])
1588 return error(
"Invalid value ID");
1590 Value *
V = ValueList[ValID];
1593 MaterializedValues.
insert({ValID,
V});
1601 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1602 auto It = MaterializedValues.
find(OpID);
1603 if (It != MaterializedValues.
end())
1604 Ops.push_back(It->second);
1611 if (
Ops.size() != BC->getOperandIDs().size())
1613 std::reverse(
Ops.begin(),
Ops.end());
1630 switch (BC->Opcode) {
1631 case BitcodeConstant::ConstantPtrAuthOpcode: {
1634 return error(
"ptrauth key operand must be ConstantInt");
1638 return error(
"ptrauth disc operand must be ConstantInt");
1641 ConstOps.
size() > 4 ? ConstOps[4]
1646 "ptrauth deactivation symbol operand must be a pointer");
1649 DeactivationSymbol);
1652 case BitcodeConstant::NoCFIOpcode: {
1655 return error(
"no_cfi operand must be GlobalValue");
1659 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1662 return error(
"dso_local operand must be GlobalValue");
1666 case BitcodeConstant::BlockAddressOpcode: {
1669 return error(
"blockaddress operand must be a function");
1674 unsigned BBID = BC->BlockAddressBB;
1677 return error(
"Invalid ID");
1680 for (
size_t I = 0,
E = BBID;
I !=
E; ++
I) {
1682 return error(
"Invalid ID");
1689 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1691 BasicBlockFwdRefQueue.push_back(Fn);
1692 if (FwdBBs.size() < BBID + 1)
1693 FwdBBs.resize(BBID + 1);
1701 case BitcodeConstant::ConstantStructOpcode: {
1703 if (
ST->getNumElements() != ConstOps.
size())
1704 return error(
"Invalid number of elements in struct initializer");
1706 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1707 if (
Op->getType() != Ty)
1708 return error(
"Incorrect type in struct initializer");
1713 case BitcodeConstant::ConstantArrayOpcode: {
1715 if (AT->getNumElements() != ConstOps.
size())
1716 return error(
"Invalid number of elements in array initializer");
1718 for (Constant *
Op : ConstOps)
1719 if (
Op->getType() != AT->getElementType())
1720 return error(
"Incorrect type in array initializer");
1725 case BitcodeConstant::ConstantVectorOpcode: {
1727 if (VT->getNumElements() != ConstOps.size())
1728 return error(
"Invalid number of elements in vector initializer");
1730 for (Constant *
Op : ConstOps)
1731 if (
Op->getType() != VT->getElementType())
1732 return error(
"Incorrect type in vector initializer");
1737 case Instruction::GetElementPtr:
1739 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1742 case Instruction::ExtractElement:
1745 case Instruction::InsertElement:
1749 case Instruction::ShuffleVector: {
1750 SmallVector<int, 16>
Mask;
1762 MaterializedValues.
insert({ValID,
C});
1768 return error(Twine(
"Value referenced by initializer is an unsupported "
1769 "constant expression of type ") +
1770 BC->getOpcodeName());
1776 BC->getType(),
"constexpr", InsertBB);
1779 "constexpr", InsertBB);
1782 Ops[1],
"constexpr", InsertBB);
1785 I->setHasNoSignedWrap();
1787 I->setHasNoUnsignedWrap();
1793 switch (BC->Opcode) {
1794 case BitcodeConstant::ConstantVectorOpcode: {
1795 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1798 Value *Idx = ConstantInt::get(IdxTy, Pair.index());
1805 case BitcodeConstant::ConstantStructOpcode:
1806 case BitcodeConstant::ConstantArrayOpcode: {
1810 "constexpr.ins", InsertBB);
1814 case Instruction::ICmp:
1815 case Instruction::FCmp:
1818 "constexpr", InsertBB);
1820 case Instruction::GetElementPtr:
1826 case Instruction::Select:
1829 case Instruction::ExtractElement:
1832 case Instruction::InsertElement:
1836 case Instruction::ShuffleVector:
1837 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1845 MaterializedValues.
insert({ValID,
I});
1849 return MaterializedValues[StartValID];
1852Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1853 Expected<Value *> MaybeV = materializeValue(
ID,
nullptr);
1861StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1864 IdentifiedStructTypes.push_back(Ret);
1868StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1870 IdentifiedStructTypes.push_back(Ret);
1886 case Attribute::ZExt:
return 1 << 0;
1887 case Attribute::SExt:
return 1 << 1;
1888 case Attribute::NoReturn:
return 1 << 2;
1889 case Attribute::InReg:
return 1 << 3;
1890 case Attribute::StructRet:
return 1 << 4;
1891 case Attribute::NoUnwind:
return 1 << 5;
1892 case Attribute::NoAlias:
return 1 << 6;
1893 case Attribute::ByVal:
return 1 << 7;
1894 case Attribute::Nest:
return 1 << 8;
1895 case Attribute::ReadNone:
return 1 << 9;
1896 case Attribute::ReadOnly:
return 1 << 10;
1897 case Attribute::NoInline:
return 1 << 11;
1898 case Attribute::AlwaysInline:
return 1 << 12;
1899 case Attribute::OptimizeForSize:
return 1 << 13;
1900 case Attribute::StackProtect:
return 1 << 14;
1901 case Attribute::StackProtectReq:
return 1 << 15;
1902 case Attribute::Alignment:
return 31 << 16;
1904 case Attribute::NoRedZone:
return 1 << 22;
1905 case Attribute::NoImplicitFloat:
return 1 << 23;
1906 case Attribute::Naked:
return 1 << 24;
1907 case Attribute::InlineHint:
return 1 << 25;
1908 case Attribute::StackAlignment:
return 7 << 26;
1909 case Attribute::ReturnsTwice:
return 1 << 29;
1910 case Attribute::UWTable:
return 1 << 30;
1911 case Attribute::NonLazyBind:
return 1U << 31;
1912 case Attribute::SanitizeAddress:
return 1ULL << 32;
1913 case Attribute::MinSize:
return 1ULL << 33;
1914 case Attribute::NoDuplicate:
return 1ULL << 34;
1915 case Attribute::StackProtectStrong:
return 1ULL << 35;
1916 case Attribute::SanitizeThread:
return 1ULL << 36;
1917 case Attribute::SanitizeMemory:
return 1ULL << 37;
1918 case Attribute::NoBuiltin:
return 1ULL << 38;
1919 case Attribute::Returned:
return 1ULL << 39;
1920 case Attribute::Cold:
return 1ULL << 40;
1921 case Attribute::Builtin:
return 1ULL << 41;
1922 case Attribute::OptimizeNone:
return 1ULL << 42;
1923 case Attribute::InAlloca:
return 1ULL << 43;
1924 case Attribute::NonNull:
return 1ULL << 44;
1925 case Attribute::JumpTable:
return 1ULL << 45;
1926 case Attribute::Convergent:
return 1ULL << 46;
1927 case Attribute::SafeStack:
return 1ULL << 47;
1928 case Attribute::NoRecurse:
return 1ULL << 48;
1931 case Attribute::SwiftSelf:
return 1ULL << 51;
1932 case Attribute::SwiftError:
return 1ULL << 52;
1933 case Attribute::WriteOnly:
return 1ULL << 53;
1934 case Attribute::Speculatable:
return 1ULL << 54;
1935 case Attribute::StrictFP:
return 1ULL << 55;
1936 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1937 case Attribute::NoCfCheck:
return 1ULL << 57;
1938 case Attribute::OptForFuzzing:
return 1ULL << 58;
1939 case Attribute::ShadowCallStack:
return 1ULL << 59;
1940 case Attribute::SpeculativeLoadHardening:
1942 case Attribute::ImmArg:
1944 case Attribute::WillReturn:
1946 case Attribute::NoFree:
1962 if (
I == Attribute::Alignment)
1963 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1964 else if (
I == Attribute::StackAlignment)
1965 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1967 B.addTypeAttr(
I,
nullptr);
1981 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
1983 "Alignment must be a power of two.");
1986 B.addAlignmentAttr(Alignment);
1988 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
1989 (EncodedAttrs & 0xffff);
1991 if (AttrIdx == AttributeList::FunctionIndex) {
1994 if (Attrs & (1ULL << 9)) {
1996 Attrs &= ~(1ULL << 9);
1999 if (Attrs & (1ULL << 10)) {
2001 Attrs &= ~(1ULL << 10);
2004 if (Attrs & (1ULL << 49)) {
2006 Attrs &= ~(1ULL << 49);
2009 if (Attrs & (1ULL << 50)) {
2011 Attrs &= ~(1ULL << 50);
2014 if (Attrs & (1ULL << 53)) {
2016 Attrs &= ~(1ULL << 53);
2020 B.addMemoryAttr(ME);
2024 if (Attrs & (1ULL << 21)) {
2025 Attrs &= ~(1ULL << 21);
2032Error BitcodeReader::parseAttributeBlock() {
2036 if (!MAttributes.empty())
2037 return error(
"Invalid multiple blocks");
2039 SmallVector<uint64_t, 64>
Record;
2048 BitstreamEntry
Entry = MaybeEntry.
get();
2050 switch (
Entry.Kind) {
2053 return error(
"Malformed block");
2066 switch (MaybeRecord.
get()) {
2072 return error(
"Invalid parameter attribute record");
2074 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2080 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2084 for (uint64_t Val : Record)
2085 Attrs.push_back(MAttributeGroups[Val]);
2087 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2100 return Attribute::Alignment;
2102 return Attribute::AlwaysInline;
2104 return Attribute::Builtin;
2106 return Attribute::ByVal;
2108 return Attribute::InAlloca;
2110 return Attribute::Cold;
2112 return Attribute::Convergent;
2114 return Attribute::DisableSanitizerInstrumentation;
2116 return Attribute::ElementType;
2118 return Attribute::FnRetThunkExtern;
2120 return Attribute::Flatten;
2122 return Attribute::InlineHint;
2124 return Attribute::InReg;
2126 return Attribute::JumpTable;
2128 return Attribute::Memory;
2130 return Attribute::NoFPClass;
2132 return Attribute::MinSize;
2134 return Attribute::Naked;
2136 return Attribute::Nest;
2138 return Attribute::NoAlias;
2140 return Attribute::NoBuiltin;
2142 return Attribute::NoCallback;
2144 return Attribute::NoDivergenceSource;
2146 return Attribute::NoDuplicate;
2148 return Attribute::NoFree;
2150 return Attribute::NoImplicitFloat;
2152 return Attribute::NoInline;
2154 return Attribute::NoRecurse;
2156 return Attribute::NoMerge;
2158 return Attribute::NonLazyBind;
2160 return Attribute::NonNull;
2162 return Attribute::Dereferenceable;
2164 return Attribute::DereferenceableOrNull;
2166 return Attribute::AllocAlign;
2168 return Attribute::AllocKind;
2170 return Attribute::AllocSize;
2172 return Attribute::AllocatedPointer;
2174 return Attribute::NoRedZone;
2176 return Attribute::NoReturn;
2178 return Attribute::NoSync;
2180 return Attribute::NoCfCheck;
2182 return Attribute::NoProfile;
2184 return Attribute::SkipProfile;
2186 return Attribute::NoUnwind;
2188 return Attribute::NoSanitizeBounds;
2190 return Attribute::NoSanitizeCoverage;
2192 return Attribute::NullPointerIsValid;
2194 return Attribute::OptimizeForDebugging;
2196 return Attribute::OptForFuzzing;
2198 return Attribute::OptimizeForSize;
2200 return Attribute::OptimizeNone;
2202 return Attribute::ReadNone;
2204 return Attribute::ReadOnly;
2206 return Attribute::Returned;
2208 return Attribute::ReturnsTwice;
2210 return Attribute::SExt;
2212 return Attribute::Speculatable;
2214 return Attribute::StackAlignment;
2216 return Attribute::StackProtect;
2218 return Attribute::StackProtectReq;
2220 return Attribute::StackProtectStrong;
2222 return Attribute::SafeStack;
2224 return Attribute::ShadowCallStack;
2226 return Attribute::StrictFP;
2228 return Attribute::StructRet;
2230 return Attribute::SanitizeAddress;
2232 return Attribute::SanitizeHWAddress;
2234 return Attribute::SanitizeThread;
2236 return Attribute::SanitizeType;
2238 return Attribute::SanitizeMemory;
2240 return Attribute::SanitizeNumericalStability;
2242 return Attribute::SanitizeRealtime;
2244 return Attribute::SanitizeRealtimeBlocking;
2246 return Attribute::SanitizeAllocToken;
2248 return Attribute::SpeculativeLoadHardening;
2250 return Attribute::SwiftError;
2252 return Attribute::SwiftSelf;
2254 return Attribute::SwiftAsync;
2256 return Attribute::UWTable;
2258 return Attribute::VScaleRange;
2260 return Attribute::WillReturn;
2262 return Attribute::WriteOnly;
2264 return Attribute::ZExt;
2266 return Attribute::ImmArg;
2268 return Attribute::SanitizeMemTag;
2270 return Attribute::Preallocated;
2272 return Attribute::NoUndef;
2274 return Attribute::ByRef;
2276 return Attribute::MustProgress;
2278 return Attribute::Hot;
2280 return Attribute::PresplitCoroutine;
2282 return Attribute::Writable;
2284 return Attribute::CoroDestroyOnlyWhenComplete;
2286 return Attribute::DeadOnUnwind;
2288 return Attribute::Range;
2290 return Attribute::Initializes;
2292 return Attribute::CoroElideSafe;
2294 return Attribute::NoExt;
2296 return Attribute::Captures;
2298 return Attribute::DeadOnReturn;
2300 return Attribute::NoCreateUndefOrPoison;
2302 return Attribute::DenormalFPEnv;
2304 return Attribute::NoOutline;
2309 MaybeAlign &Alignment) {
2312 if (
Exponent > Value::MaxAlignmentExponent + 1)
2313 return error(
"Invalid alignment value");
2318Error BitcodeReader::parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind) {
2320 if (*Kind == Attribute::None)
2321 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2326 switch (EncodedKind) {
2350Error BitcodeReader::parseAttributeGroupBlock() {
2354 if (!MAttributeGroups.empty())
2355 return error(
"Invalid multiple blocks");
2357 SmallVector<uint64_t, 64>
Record;
2364 BitstreamEntry
Entry = MaybeEntry.
get();
2366 switch (
Entry.Kind) {
2369 return error(
"Malformed block");
2382 switch (MaybeRecord.
get()) {
2387 return error(
"Invalid grp record");
2389 uint64_t GrpID =
Record[0];
2390 uint64_t Idx =
Record[1];
2394 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2395 if (Record[i] == 0) {
2396 Attribute::AttrKind
Kind;
2397 uint64_t EncodedKind =
Record[++i];
2398 if (Idx == AttributeList::FunctionIndex &&
2407 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2413 if (Kind == Attribute::ByVal)
2414 B.addByValAttr(
nullptr);
2415 else if (Kind == Attribute::StructRet)
2416 B.addStructRetAttr(
nullptr);
2417 else if (Kind == Attribute::InAlloca)
2418 B.addInAllocaAttr(
nullptr);
2419 else if (Kind == Attribute::UWTable)
2420 B.addUWTableAttr(UWTableKind::Default);
2421 else if (Kind == Attribute::DeadOnReturn)
2422 B.addDeadOnReturnAttr(DeadOnReturnInfo());
2423 else if (Attribute::isEnumAttrKind(Kind))
2424 B.addAttribute(Kind);
2426 return error(
"Not an enum attribute");
2427 }
else if (Record[i] == 1) {
2428 Attribute::AttrKind
Kind;
2429 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2431 if (!Attribute::isIntAttrKind(Kind))
2432 return error(
"Not an int attribute");
2433 if (Kind == Attribute::Alignment)
2434 B.addAlignmentAttr(Record[++i]);
2435 else if (Kind == Attribute::StackAlignment)
2436 B.addStackAlignmentAttr(Record[++i]);
2437 else if (Kind == Attribute::Dereferenceable)
2438 B.addDereferenceableAttr(Record[++i]);
2439 else if (Kind == Attribute::DereferenceableOrNull)
2440 B.addDereferenceableOrNullAttr(Record[++i]);
2441 else if (Kind == Attribute::DeadOnReturn)
2442 B.addDeadOnReturnAttr(
2444 else if (Kind == Attribute::AllocSize)
2445 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2446 else if (Kind == Attribute::VScaleRange)
2447 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2448 else if (Kind == Attribute::UWTable)
2450 else if (Kind == Attribute::AllocKind)
2451 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2452 else if (Kind == Attribute::Memory) {
2453 uint64_t EncodedME =
Record[++i];
2454 const uint8_t
Version = (EncodedME >> 56);
2466 B.addMemoryAttr(ME);
2471 EncodedME & 0x00FFFFFFFFFFFFFFULL));
2473 }
else if (Kind == Attribute::Captures)
2475 else if (Kind == Attribute::NoFPClass)
2478 else if (Kind == Attribute::DenormalFPEnv) {
2479 B.addDenormalFPEnvAttr(
2482 }
else if (Record[i] == 3 || Record[i] == 4) {
2484 SmallString<64> KindStr;
2485 SmallString<64> ValStr;
2487 while (Record[i] != 0 && i != e)
2489 assert(Record[i] == 0 &&
"Kind string not null terminated");
2494 while (Record[i] != 0 && i != e)
2496 assert(Record[i] == 0 &&
"Value string not null terminated");
2499 B.addAttribute(KindStr.
str(), ValStr.
str());
2500 }
else if (Record[i] == 5 || Record[i] == 6) {
2501 bool HasType =
Record[i] == 6;
2502 Attribute::AttrKind
Kind;
2503 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2505 if (!Attribute::isTypeAttrKind(Kind))
2506 return error(
"Not a type attribute");
2508 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2509 }
else if (Record[i] == 7) {
2510 Attribute::AttrKind
Kind;
2513 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2515 if (!Attribute::isConstantRangeAttrKind(Kind))
2516 return error(
"Not a ConstantRange attribute");
2518 Expected<ConstantRange> MaybeCR =
2519 readBitWidthAndConstantRange(Record, i);
2524 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2525 }
else if (Record[i] == 8) {
2526 Attribute::AttrKind
Kind;
2529 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2531 if (!Attribute::isConstantRangeListAttrKind(Kind))
2532 return error(
"Not a constant range list attribute");
2536 return error(
"Too few records for constant range list");
2537 unsigned RangeSize =
Record[i++];
2539 for (
unsigned Idx = 0; Idx < RangeSize; ++Idx) {
2540 Expected<ConstantRange> MaybeCR =
2541 readConstantRange(Record, i,
BitWidth);
2549 return error(
"Invalid (unordered or overlapping) range list");
2550 B.addConstantRangeListAttr(Kind, Val);
2552 return error(
"Invalid attribute group entry");
2557 B.addMemoryAttr(ME);
2560 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2567Error BitcodeReader::parseTypeTable() {
2571 return parseTypeTableBody();
2574Error BitcodeReader::parseTypeTableBody() {
2575 if (!TypeList.empty())
2576 return error(
"Invalid multiple blocks");
2578 SmallVector<uint64_t, 64>
Record;
2579 unsigned NumRecords = 0;
2588 BitstreamEntry
Entry = MaybeEntry.
get();
2590 switch (
Entry.Kind) {
2593 return error(
"Malformed block");
2595 if (NumRecords != TypeList.size())
2596 return error(
"Malformed block");
2605 Type *ResultTy =
nullptr;
2606 SmallVector<unsigned> ContainedIDs;
2610 switch (MaybeRecord.
get()) {
2612 return error(
"Invalid value");
2617 return error(
"Invalid numentry record");
2618 TypeList.resize(Record[0]);
2621 ResultTy = Type::getVoidTy(
Context);
2624 ResultTy = Type::getHalfTy(
Context);
2627 ResultTy = Type::getBFloatTy(
Context);
2630 ResultTy = Type::getFloatTy(
Context);
2633 ResultTy = Type::getDoubleTy(
Context);
2636 ResultTy = Type::getX86_FP80Ty(
Context);
2639 ResultTy = Type::getFP128Ty(
Context);
2642 ResultTy = Type::getPPC_FP128Ty(
Context);
2645 ResultTy = Type::getLabelTy(
Context);
2648 ResultTy = Type::getMetadataTy(
Context);
2656 ResultTy = Type::getX86_AMXTy(
Context);
2659 ResultTy = Type::getTokenTy(
Context);
2663 return error(
"Invalid record");
2665 uint64_t NumBits =
Record[0];
2668 return error(
"Bitwidth for byte type out of range");
2674 return error(
"Invalid integer record");
2676 uint64_t NumBits =
Record[0];
2679 return error(
"Bitwidth for integer type out of range");
2686 return error(
"Invalid pointer record");
2690 ResultTy = getTypeByID(Record[0]);
2692 !PointerType::isValidElementType(ResultTy))
2693 return error(
"Invalid type");
2700 return error(
"Invalid opaque pointer record");
2709 return error(
"Invalid function record");
2711 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2712 if (
Type *
T = getTypeByID(Record[i]))
2718 ResultTy = getTypeByID(Record[2]);
2719 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2720 return error(
"Invalid type");
2723 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2729 return error(
"Invalid function record");
2731 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2732 if (
Type *
T = getTypeByID(Record[i])) {
2733 if (!FunctionType::isValidArgumentType(
T))
2734 return error(
"Invalid function argument type");
2741 ResultTy = getTypeByID(Record[1]);
2742 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2743 return error(
"Invalid type");
2746 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2751 return error(
"Invalid anon struct record");
2753 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2754 if (
Type *
T = getTypeByID(Record[i]))
2760 return error(
"Invalid type");
2767 return error(
"Invalid struct name record");
2772 return error(
"Invalid named struct record");
2774 if (NumRecords >= TypeList.size())
2775 return error(
"Invalid TYPE table");
2781 TypeList[NumRecords] =
nullptr;
2783 Res = createIdentifiedStructType(
Context, TypeName);
2787 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2788 if (
Type *
T = getTypeByID(Record[i]))
2794 return error(
"Invalid named struct record");
2803 return error(
"Invalid opaque type record");
2805 if (NumRecords >= TypeList.size())
2806 return error(
"Invalid TYPE table");
2812 TypeList[NumRecords] =
nullptr;
2814 Res = createIdentifiedStructType(
Context, TypeName);
2821 return error(
"Invalid target extension type record");
2823 if (NumRecords >= TypeList.size())
2824 return error(
"Invalid TYPE table");
2826 if (Record[0] >=
Record.size())
2827 return error(
"Too many type parameters");
2829 unsigned NumTys =
Record[0];
2831 SmallVector<unsigned, 8> IntParams;
2832 for (
unsigned i = 0; i < NumTys; i++) {
2833 if (
Type *
T = getTypeByID(Record[i + 1]))
2836 return error(
"Invalid type");
2839 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2840 if (Record[i] > UINT_MAX)
2841 return error(
"Integer parameter too large");
2846 if (
auto E = TTy.takeError())
2854 return error(
"Invalid array type record");
2855 ResultTy = getTypeByID(Record[1]);
2856 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2857 return error(
"Invalid type");
2859 ResultTy = ArrayType::get(ResultTy, Record[0]);
2864 return error(
"Invalid vector type record");
2866 return error(
"Invalid vector length");
2867 ResultTy = getTypeByID(Record[1]);
2868 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2869 return error(
"Invalid type");
2872 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2876 if (NumRecords >= TypeList.size())
2877 return error(
"Invalid TYPE table");
2878 if (TypeList[NumRecords])
2880 "Invalid TYPE table: Only named structs can be forward referenced");
2881 assert(ResultTy &&
"Didn't read a type?");
2882 TypeList[NumRecords] = ResultTy;
2883 if (!ContainedIDs.
empty())
2884 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2889Error BitcodeReader::parseOperandBundleTags() {
2893 if (!BundleTags.empty())
2894 return error(
"Invalid multiple blocks");
2896 SmallVector<uint64_t, 64>
Record;
2902 BitstreamEntry
Entry = MaybeEntry.
get();
2904 switch (
Entry.Kind) {
2907 return error(
"Malformed block");
2921 return error(
"Invalid operand bundle record");
2924 BundleTags.emplace_back();
2926 return error(
"Invalid operand bundle record");
2931Error BitcodeReader::parseSyncScopeNames() {
2936 return error(
"Invalid multiple synchronization scope names blocks");
2938 SmallVector<uint64_t, 64>
Record;
2943 BitstreamEntry
Entry = MaybeEntry.
get();
2945 switch (
Entry.Kind) {
2948 return error(
"Malformed block");
2951 return error(
"Invalid empty synchronization scope names block");
2965 return error(
"Invalid sync scope record");
2967 SmallString<16> SSN;
2969 return error(
"Invalid sync scope record");
2977Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
2978 unsigned NameIndex, Triple &TT) {
2981 return error(
"Invalid record");
2982 unsigned ValueID =
Record[0];
2983 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2984 return error(
"Invalid record");
2985 Value *
V = ValueList[ValueID];
2988 if (NameStr.contains(0))
2989 return error(
"Invalid value name");
2990 V->setName(NameStr);
2992 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
3005 return std::move(JumpFailed);
3011 return error(
"Expected value symbol table subblock");
3015void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
3017 ArrayRef<uint64_t> Record) {
3021 uint64_t FuncWordOffset =
Record[1] - 1;
3022 uint64_t FuncBitOffset = FuncWordOffset * 32;
3023 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
3027 if (FuncBitOffset > LastFunctionBlockBit)
3028 LastFunctionBlockBit = FuncBitOffset;
3032Error BitcodeReader::parseGlobalValueSymbolTable() {
3033 unsigned FuncBitcodeOffsetDelta =
3039 SmallVector<uint64_t, 64>
Record;
3044 BitstreamEntry
Entry = MaybeEntry.
get();
3046 switch (
Entry.Kind) {
3049 return error(
"Malformed block");
3060 switch (MaybeRecord.
get()) {
3062 unsigned ValueID =
Record[0];
3063 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3064 return error(
"Invalid value reference in symbol table");
3065 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3075Error BitcodeReader::parseValueSymbolTable(uint64_t
Offset) {
3076 uint64_t CurrentBit;
3082 if (!MaybeCurrentBit)
3084 CurrentBit = MaybeCurrentBit.
get();
3087 if (
Error Err = parseGlobalValueSymbolTable())
3108 unsigned FuncBitcodeOffsetDelta =
3114 SmallVector<uint64_t, 64>
Record;
3125 BitstreamEntry
Entry = MaybeEntry.
get();
3127 switch (
Entry.Kind) {
3130 return error(
"Malformed block");
3146 switch (MaybeRecord.
get()) {
3150 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3158 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3166 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3171 return error(
"Invalid bbentry record");
3174 return error(
"Invalid bbentry record");
3186uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {
3196Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3197 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3198 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3199 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3201 GlobalInitWorklist.swap(GlobalInits);
3202 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3203 FunctionOperandWorklist.swap(FunctionOperands);
3205 while (!GlobalInitWorklist.empty()) {
3206 unsigned ValID = GlobalInitWorklist.back().second;
3207 if (ValID >= ValueList.
size()) {
3209 GlobalInits.push_back(GlobalInitWorklist.back());
3211 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3214 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3216 GlobalInitWorklist.pop_back();
3219 while (!IndirectSymbolInitWorklist.empty()) {
3220 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3221 if (ValID >= ValueList.
size()) {
3222 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3224 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3228 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3231 return error(
"Alias and aliasee types don't match");
3236 return error(
"Expected an alias or an ifunc");
3239 IndirectSymbolInitWorklist.pop_back();
3242 while (!FunctionOperandWorklist.empty()) {
3243 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3244 if (
Info.PersonalityFn) {
3245 unsigned ValID =
Info.PersonalityFn - 1;
3246 if (ValID < ValueList.
size()) {
3247 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3250 Info.F->setPersonalityFn(MaybeC.
get());
3251 Info.PersonalityFn = 0;
3255 unsigned ValID =
Info.Prefix - 1;
3256 if (ValID < ValueList.
size()) {
3257 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3260 Info.F->setPrefixData(MaybeC.
get());
3264 if (
Info.Prologue) {
3265 unsigned ValID =
Info.Prologue - 1;
3266 if (ValID < ValueList.
size()) {
3267 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3270 Info.F->setPrologueData(MaybeC.
get());
3274 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3275 FunctionOperands.push_back(Info);
3276 FunctionOperandWorklist.pop_back();
3285 BitcodeReader::decodeSignRotatedValue);
3287 return APInt(TypeBits, Words);
3290Error BitcodeReader::parseConstants() {
3298 unsigned Int32TyID = getVirtualTypeID(CurTy);
3299 unsigned CurTyID = Int32TyID;
3300 Type *CurElemTy =
nullptr;
3301 unsigned NextCstNo = ValueList.
size();
3309 switch (Entry.Kind) {
3312 return error(
"Malformed block");
3314 if (NextCstNo != ValueList.
size())
3315 return error(
"Invalid constant reference");
3326 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
3329 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3339 return error(
"Invalid settype record");
3340 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3341 return error(
"Invalid settype record");
3342 if (TypeList[Record[0]] == VoidType)
3343 return error(
"Invalid constant type");
3345 CurTy = TypeList[CurTyID];
3346 CurElemTy = getPtrElementTypeByID(CurTyID);
3350 return error(
"Invalid type for a constant null value");
3353 return error(
"Invalid type for a constant null value");
3358 return error(
"Invalid integer const record");
3363 return error(
"Invalid wide integer const record");
3366 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3367 V = ConstantInt::get(CurTy, VInt);
3372 return error(
"Invalid byte const record");
3373 V = ConstantByte::get(CurTy, decodeSignRotatedValue(Record[0]),
3378 return error(
"Invalid wide byte const record");
3381 APInt VByte =
readWideAPInt(Record, ScalarTy->getBitWidth());
3382 V = ConstantByte::get(CurTy, VByte);
3387 return error(
"Invalid float const record");
3390 if (ScalarTy->isHalfTy())
3391 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3392 APInt(16, (uint16_t)Record[0])));
3393 else if (ScalarTy->isBFloatTy())
3394 V = ConstantFP::get(
3395 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3396 else if (ScalarTy->isFloatTy())
3397 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3398 APInt(32, (uint32_t)Record[0])));
3399 else if (ScalarTy->isDoubleTy())
3400 V = ConstantFP::get(
3401 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3402 else if (ScalarTy->isX86_FP80Ty()) {
3404 uint64_t Rearrange[2];
3405 Rearrange[0] = (
Record[1] & 0xffffLL) | (Record[0] << 16);
3406 Rearrange[1] =
Record[0] >> 48;
3407 V = ConstantFP::get(
3408 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3409 }
else if (ScalarTy->isFP128Ty())
3410 V = ConstantFP::get(CurTy,
3411 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3412 else if (ScalarTy->isPPC_FP128Ty())
3413 V = ConstantFP::get(
3414 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3422 return error(
"Invalid aggregate record");
3424 SmallVector<unsigned, 16> Elts;
3428 V = BitcodeConstant::create(
3429 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3431 V = BitcodeConstant::create(
Alloc, CurTy,
3432 BitcodeConstant::ConstantArrayOpcode, Elts);
3434 V = BitcodeConstant::create(
3435 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3444 return error(
"Invalid string record");
3454 return error(
"Invalid data record");
3458 return error(
"Invalid type for value");
3461 SmallString<128> RawData;
3463 for (uint64_t Val : Record) {
3464 const char *Src =
reinterpret_cast<const char *
>(&Val);
3466 Src +=
sizeof(uint64_t) - EltBytes;
3467 RawData.
append(Src, Src + EltBytes);
3472 : ConstantDataArray::getRaw(RawData.str(),
Record.
size(), EltTy);
3477 return error(
"Invalid unary op constexpr record");
3482 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3488 return error(
"Invalid binary op constexpr record");
3494 if (
Record.size() >= 4) {
3495 if (
Opc == Instruction::Add ||
3496 Opc == Instruction::Sub ||
3497 Opc == Instruction::Mul ||
3498 Opc == Instruction::Shl) {
3503 }
else if (
Opc == Instruction::SDiv ||
3504 Opc == Instruction::UDiv ||
3505 Opc == Instruction::LShr ||
3506 Opc == Instruction::AShr) {
3511 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3512 {(unsigned)Record[1], (
unsigned)
Record[2]});
3518 return error(
"Invalid cast constexpr record");
3523 unsigned OpTyID =
Record[1];
3524 Type *OpTy = getTypeByID(OpTyID);
3526 return error(
"Invalid cast constexpr record");
3527 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3539 return error(
"Constant GEP record must have at least two elements");
3541 Type *PointeeType =
nullptr;
3545 PointeeType = getTypeByID(Record[OpNum++]);
3548 std::optional<ConstantRange>
InRange;
3552 unsigned InRangeIndex =
Op >> 1;
3558 Expected<ConstantRange> MaybeInRange =
3559 readBitWidthAndConstantRange(Record, OpNum);
3568 SmallVector<unsigned, 16> Elts;
3569 unsigned BaseTypeID =
Record[OpNum];
3570 while (OpNum !=
Record.size()) {
3571 unsigned ElTyID =
Record[OpNum++];
3572 Type *ElTy = getTypeByID(ElTyID);
3574 return error(
"Invalid getelementptr constexpr record");
3578 if (Elts.
size() < 1)
3579 return error(
"Invalid gep with no operands");
3583 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3584 BaseType = getTypeByID(BaseTypeID);
3589 return error(
"GEP base operand must be pointer or vector of pointer");
3592 PointeeType = getPtrElementTypeByID(BaseTypeID);
3594 return error(
"Missing element type for old-style constant GEP");
3597 V = BitcodeConstant::create(
3599 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3605 return error(
"Invalid select constexpr record");
3607 V = BitcodeConstant::create(
3608 Alloc, CurTy, Instruction::Select,
3609 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3615 return error(
"Invalid extractelement constexpr record");
3616 unsigned OpTyID =
Record[0];
3620 return error(
"Invalid extractelement constexpr record");
3622 if (
Record.size() == 4) {
3623 unsigned IdxTyID =
Record[2];
3624 Type *IdxTy = getTypeByID(IdxTyID);
3626 return error(
"Invalid extractelement constexpr record");
3632 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3633 {(unsigned)Record[1], IdxRecord});
3639 if (
Record.size() < 3 || !OpTy)
3640 return error(
"Invalid insertelement constexpr record");
3642 if (
Record.size() == 4) {
3643 unsigned IdxTyID =
Record[2];
3644 Type *IdxTy = getTypeByID(IdxTyID);
3646 return error(
"Invalid insertelement constexpr record");
3652 V = BitcodeConstant::create(
3653 Alloc, CurTy, Instruction::InsertElement,
3654 {(unsigned)Record[0], (
unsigned)
Record[1], IdxRecord});
3659 if (
Record.size() < 3 || !OpTy)
3660 return error(
"Invalid shufflevector constexpr record");
3661 V = BitcodeConstant::create(
3662 Alloc, CurTy, Instruction::ShuffleVector,
3663 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3670 if (
Record.size() < 4 || !RTy || !OpTy)
3671 return error(
"Invalid shufflevector constexpr record");
3672 V = BitcodeConstant::create(
3673 Alloc, CurTy, Instruction::ShuffleVector,
3674 {(unsigned)Record[1], (
unsigned)
Record[2], (unsigned)Record[3]});
3679 return error(
"Invalid cmp constexpt record");
3680 unsigned OpTyID =
Record[0];
3681 Type *OpTy = getTypeByID(OpTyID);
3683 return error(
"Invalid cmp constexpr record");
3684 V = BitcodeConstant::create(
3687 : Instruction::ICmp),
3688 (uint8_t)Record[3]},
3689 {(unsigned)Record[1], (
unsigned)
Record[2]});
3696 return error(
"Invalid inlineasm record");
3697 std::string AsmStr, ConstrStr;
3698 bool HasSideEffects =
Record[0] & 1;
3699 bool IsAlignStack =
Record[0] >> 1;
3700 unsigned AsmStrSize =
Record[1];
3701 if (2+AsmStrSize >=
Record.size())
3702 return error(
"Invalid inlineasm record");
3703 unsigned ConstStrSize =
Record[2+AsmStrSize];
3704 if (3+AsmStrSize+ConstStrSize >
Record.size())
3705 return error(
"Invalid inlineasm record");
3707 for (
unsigned i = 0; i != AsmStrSize; ++i)
3708 AsmStr += (
char)
Record[2+i];
3709 for (
unsigned i = 0; i != ConstStrSize; ++i)
3710 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3713 return error(
"Missing element type for old-style inlineasm");
3715 HasSideEffects, IsAlignStack);
3722 return error(
"Invalid inlineasm record");
3723 std::string AsmStr, ConstrStr;
3724 bool HasSideEffects =
Record[0] & 1;
3725 bool IsAlignStack = (
Record[0] >> 1) & 1;
3726 unsigned AsmDialect =
Record[0] >> 2;
3727 unsigned AsmStrSize =
Record[1];
3728 if (2+AsmStrSize >=
Record.size())
3729 return error(
"Invalid inlineasm record");
3730 unsigned ConstStrSize =
Record[2+AsmStrSize];
3731 if (3+AsmStrSize+ConstStrSize >
Record.size())
3732 return error(
"Invalid inlineasm record");
3734 for (
unsigned i = 0; i != AsmStrSize; ++i)
3735 AsmStr += (
char)
Record[2+i];
3736 for (
unsigned i = 0; i != ConstStrSize; ++i)
3737 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3740 return error(
"Missing element type for old-style inlineasm");
3742 HasSideEffects, IsAlignStack,
3749 return error(
"Invalid inlineasm record");
3751 std::string AsmStr, ConstrStr;
3752 bool HasSideEffects =
Record[OpNum] & 1;
3753 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3754 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3755 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3757 unsigned AsmStrSize =
Record[OpNum];
3759 if (OpNum + AsmStrSize >=
Record.size())
3760 return error(
"Invalid inlineasm record");
3761 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3762 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3763 return error(
"Invalid inlineasm record");
3765 for (
unsigned i = 0; i != AsmStrSize; ++i)
3766 AsmStr += (
char)
Record[OpNum + i];
3768 for (
unsigned i = 0; i != ConstStrSize; ++i)
3769 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3772 return error(
"Missing element type for old-style inlineasm");
3774 HasSideEffects, IsAlignStack,
3781 return error(
"Invalid inlineasm record");
3786 return error(
"Invalid inlineasm record");
3787 std::string AsmStr, ConstrStr;
3788 bool HasSideEffects =
Record[OpNum] & 1;
3789 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3790 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3791 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3793 unsigned AsmStrSize =
Record[OpNum];
3795 if (OpNum + AsmStrSize >=
Record.size())
3796 return error(
"Invalid inlineasm record");
3797 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3798 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3799 return error(
"Invalid inlineasm record");
3801 for (
unsigned i = 0; i != AsmStrSize; ++i)
3802 AsmStr += (
char)
Record[OpNum + i];
3804 for (
unsigned i = 0; i != ConstStrSize; ++i)
3805 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3807 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3813 return error(
"Invalid blockaddress record");
3814 unsigned FnTyID =
Record[0];
3815 Type *FnTy = getTypeByID(FnTyID);
3817 return error(
"Invalid blockaddress record");
3818 V = BitcodeConstant::create(
3820 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3826 return error(
"Invalid dso_local record");
3827 unsigned GVTyID =
Record[0];
3828 Type *GVTy = getTypeByID(GVTyID);
3830 return error(
"Invalid dso_local record");
3831 V = BitcodeConstant::create(
3832 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3837 return error(
"Invalid no_cfi record");
3838 unsigned GVTyID =
Record[0];
3839 Type *GVTy = getTypeByID(GVTyID);
3841 return error(
"Invalid no_cfi record");
3842 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3848 return error(
"Invalid ptrauth record");
3850 V = BitcodeConstant::create(
Alloc, CurTy,
3851 BitcodeConstant::ConstantPtrAuthOpcode,
3852 {(unsigned)Record[0], (
unsigned)
Record[1],
3853 (unsigned)Record[2], (
unsigned)
Record[3]});
3858 return error(
"Invalid ptrauth record");
3860 V = BitcodeConstant::create(
3861 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3862 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2],
3863 (
unsigned)
Record[3], (unsigned)Record[4]});
3868 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3875Error BitcodeReader::parseUseLists() {
3880 SmallVector<uint64_t, 64>
Record;
3886 BitstreamEntry
Entry = MaybeEntry.
get();
3888 switch (
Entry.Kind) {
3891 return error(
"Malformed block");
3905 switch (MaybeRecord.
get()) {
3913 if (RecordLength < 3)
3915 return error(
"Invalid uselist record");
3916 unsigned ID =
Record.pop_back_val();
3920 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3921 V = FunctionBBs[
ID];
3925 if (!
V->hasUseList())
3928 unsigned NumUses = 0;
3929 SmallDenseMap<const Use *, unsigned, 16> Order;
3930 for (
const Use &U :
V->materialized_uses()) {
3931 if (++NumUses >
Record.size())
3933 Order[&
U] =
Record[NumUses - 1];
3940 V->sortUseList([&](
const Use &L,
const Use &R) {
3951Error BitcodeReader::rememberAndSkipMetadata() {
3954 DeferredMetadataInfo.push_back(CurBit);
3962Error BitcodeReader::materializeMetadata() {
3963 for (uint64_t BitPos : DeferredMetadataInfo) {
3967 if (
Error Err = MDLoader->parseModuleMetadata())
3976 NamedMDNode *LinkerOpts =
3978 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
3985 DeferredMetadataInfo.clear();
3989void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
3993Error BitcodeReader::rememberAndSkipFunctionBody() {
3995 if (FunctionsWithBodies.empty())
3996 return error(
"Insufficient function protos");
3998 Function *Fn = FunctionsWithBodies.back();
3999 FunctionsWithBodies.pop_back();
4004 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
4005 "Mismatch between VST and scanned function offsets");
4006 DeferredFunctionInfo[Fn] = CurBit;
4014Error BitcodeReader::globalCleanup() {
4016 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4018 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
4019 return error(
"Malformed global initializer set");
4023 for (Function &
F : *TheModule) {
4024 MDLoader->upgradeDebugIntrinsics(
F);
4027 UpgradedIntrinsics[&
F] = NewFn;
4033 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4034 for (GlobalVariable &GV : TheModule->globals())
4036 UpgradedVariables.emplace_back(&GV, Upgraded);
4037 for (
auto &Pair : UpgradedVariables) {
4038 Pair.first->eraseFromParent();
4039 TheModule->insertGlobalVariable(Pair.second);
4044 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4045 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4053Error BitcodeReader::rememberAndSkipFunctionBodies() {
4058 return error(
"Could not find function in stream");
4060 if (!SeenFirstFunctionBody)
4061 return error(
"Trying to materialize functions before seeing function blocks");
4065 assert(SeenValueSymbolTable);
4068 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4071 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4073 switch (
Entry.Kind) {
4075 return error(
"Expect SubBlock");
4079 return error(
"Expect function block");
4081 if (
Error Err = rememberAndSkipFunctionBody())
4090Error BitcodeReaderBase::readBlockInfo() {
4091 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4093 if (!MaybeNewBlockInfo)
4095 std::optional<BitstreamBlockInfo> NewBlockInfo =
4096 std::move(MaybeNewBlockInfo.
get());
4098 return error(
"Malformed block");
4099 BlockInfo = std::move(*NewBlockInfo);
4103Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4107 std::tie(Name, Record) = readNameFromStrtab(Record);
4110 return error(
"Invalid comdat record");
4112 std::string OldFormatName;
4115 return error(
"Invalid comdat record");
4116 unsigned ComdatNameSize =
Record[1];
4117 if (ComdatNameSize >
Record.size() - 2)
4118 return error(
"Comdat name size too large");
4119 OldFormatName.reserve(ComdatNameSize);
4120 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4121 OldFormatName += (
char)
Record[2 + i];
4122 Name = OldFormatName;
4124 Comdat *
C = TheModule->getOrInsertComdat(Name);
4125 C->setSelectionKind(SK);
4126 ComdatList.push_back(
C);
4140 Meta.NoAddress =
true;
4142 Meta.NoHWAddress =
true;
4146 Meta.IsDynInit =
true;
4150Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4158 std::tie(Name, Record) = readNameFromStrtab(Record);
4161 return error(
"Invalid global variable record");
4162 unsigned TyID =
Record[0];
4163 Type *Ty = getTypeByID(TyID);
4165 return error(
"Invalid global variable record");
4167 bool explicitType =
Record[1] & 2;
4173 return error(
"Invalid type for value");
4175 TyID = getContainedTypeID(TyID);
4176 Ty = getTypeByID(TyID);
4178 return error(
"Missing element type for old-style global");
4181 uint64_t RawLinkage =
Record[3];
4183 MaybeAlign Alignment;
4184 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4188 if (Record[5] - 1 >= SectionTable.size())
4189 return error(
"Invalid ID");
4198 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4206 bool ExternallyInitialized =
false;
4208 ExternallyInitialized =
Record[9];
4210 GlobalVariable *NewGV =
4220 if (
Record.size() > 10) {
4232 if (
unsigned InitID = Record[2])
4233 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4235 if (
Record.size() > 11) {
4236 if (
unsigned ComdatID = Record[11]) {
4237 if (ComdatID > ComdatList.size())
4238 return error(
"Invalid global variable comdat ID");
4239 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4242 ImplicitComdatObjects.
insert(NewGV);
4245 if (
Record.size() > 12) {
4250 if (
Record.size() > 13) {
4259 if (
Record.size() > 16 && Record[16]) {
4260 llvm::GlobalValue::SanitizerMetadata
Meta =
4265 if (
Record.size() > 17 && Record[17]) {
4269 return error(
"Invalid global variable code model");
4275void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4276 if (ValueTypeCallback) {
4277 (*ValueTypeCallback)(
4278 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4279 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4283Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4289 std::tie(Name, Record) = readNameFromStrtab(Record);
4292 return error(
"Invalid function record");
4293 unsigned FTyID =
Record[0];
4294 Type *FTy = getTypeByID(FTyID);
4296 return error(
"Invalid function record");
4298 FTyID = getContainedTypeID(FTyID, 0);
4299 FTy = getTypeByID(FTyID);
4301 return error(
"Missing element type for old-style function");
4305 return error(
"Invalid type for value");
4306 auto CC =
static_cast<CallingConv::ID
>(
Record[1]);
4307 if (CC & ~CallingConv::MaxID)
4308 return error(
"Invalid calling convention ID");
4310 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4316 AddrSpace, Name, TheModule);
4319 "Incorrect fully specified type provided for function");
4320 FunctionTypeIDs[
Func] = FTyID;
4322 Func->setCallingConv(CC);
4323 bool isProto =
Record[2];
4324 uint64_t RawLinkage =
Record[3];
4327 callValueTypeCallback(Func, FTyID);
4332 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4333 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4334 Attribute::InAlloca}) {
4335 if (!
Func->hasParamAttribute(i, Kind))
4338 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4341 Func->removeParamAttr(i, Kind);
4343 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4344 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4346 return error(
"Missing param element type for attribute upgrade");
4350 case Attribute::ByVal:
4351 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4353 case Attribute::StructRet:
4354 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4356 case Attribute::InAlloca:
4357 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4363 Func->addParamAttr(i, NewAttr);
4367 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4368 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4369 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4370 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4372 return error(
"Missing param element type for x86_intrcc upgrade");
4374 Func->addParamAttr(0, NewAttr);
4377 MaybeAlign Alignment;
4378 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4381 Func->setAlignment(*Alignment);
4383 if (Record[6] - 1 >= SectionTable.size())
4384 return error(
"Invalid ID");
4385 Func->setSection(SectionTable[Record[6] - 1]);
4389 if (!
Func->hasLocalLinkage())
4391 if (
Record.size() > 8 && Record[8]) {
4392 if (Record[8] - 1 >= GCTable.size())
4393 return error(
"Invalid ID");
4394 Func->setGC(GCTable[Record[8] - 1]);
4399 Func->setUnnamedAddr(UnnamedAddr);
4401 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4403 OperandInfo.Prologue =
Record[10];
4405 if (
Record.size() > 11) {
4407 if (!
Func->hasLocalLinkage()) {
4414 if (
Record.size() > 12) {
4415 if (
unsigned ComdatID = Record[12]) {
4416 if (ComdatID > ComdatList.size())
4417 return error(
"Invalid function comdat ID");
4418 Func->setComdat(ComdatList[ComdatID - 1]);
4421 ImplicitComdatObjects.
insert(Func);
4425 OperandInfo.Prefix =
Record[13];
4428 OperandInfo.PersonalityFn =
Record[14];
4430 if (
Record.size() > 15) {
4440 Record[17] + Record[18] <= Strtab.
size()) {
4441 Func->setPartition(StringRef(Strtab.
data() + Record[17], Record[18]));
4444 if (
Record.size() > 19) {
4445 MaybeAlign PrefAlignment;
4446 if (
Error Err = parseAlignmentValue(Record[19], PrefAlignment))
4448 Func->setPreferredAlignment(PrefAlignment);
4451 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4453 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4454 FunctionOperands.push_back(OperandInfo);
4459 Func->setIsMaterializable(
true);
4460 FunctionsWithBodies.push_back(Func);
4461 DeferredFunctionInfo[
Func] = 0;
4466Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4467 unsigned BitCode, ArrayRef<uint64_t> Record) {
4477 std::tie(Name, Record) = readNameFromStrtab(Record);
4480 if (
Record.size() < (3 + (
unsigned)NewRecord))
4481 return error(
"Invalid global indirect symbol record");
4486 return error(
"Invalid global indirect symbol record");
4492 return error(
"Invalid type for value");
4493 AddrSpace = PTy->getAddressSpace();
4495 Ty = getTypeByID(
TypeID);
4497 return error(
"Missing element type for old-style indirect symbol");
4499 AddrSpace =
Record[OpNum++];
4502 auto Val =
Record[OpNum++];
4511 nullptr, TheModule);
4515 if (OpNum !=
Record.size()) {
4516 auto VisInd = OpNum++;
4522 if (OpNum !=
Record.size()) {
4523 auto S =
Record[OpNum++];
4530 if (OpNum !=
Record.size())
4532 if (OpNum !=
Record.size())
4535 if (OpNum !=
Record.size())
4540 if (OpNum + 1 <
Record.size()) {
4542 if (Record[OpNum] + Record[OpNum + 1] > Strtab.
size())
4543 return error(
"Malformed partition, too large.");
4545 StringRef(Strtab.
data() + Record[OpNum], Record[OpNum + 1]));
4549 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4553Error BitcodeReader::parseModule(uint64_t ResumeBit,
4554 bool ShouldLazyLoadMetadata,
4555 ParserCallbacks Callbacks) {
4556 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4563 SmallVector<uint64_t, 64>
Record;
4567 bool ResolvedDataLayout =
false;
4572 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4574 auto ResolveDataLayout = [&]() ->
Error {
4575 if (ResolvedDataLayout)
4579 ResolvedDataLayout =
true;
4583 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4587 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4588 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4589 TentativeDataLayoutStr = *LayoutOverride;
4597 TheModule->setDataLayout(MaybeDL.
get());
4603 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4606 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4608 switch (
Entry.Kind) {
4610 return error(
"Malformed block");
4612 if (
Error Err = ResolveDataLayout())
4614 return globalCleanup();
4623 if (
Error Err = readBlockInfo())
4627 if (
Error Err = parseAttributeBlock())
4631 if (
Error Err = parseAttributeGroupBlock())
4635 if (
Error Err = parseTypeTable())
4639 if (!SeenValueSymbolTable) {
4645 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4646 if (
Error Err = parseValueSymbolTable())
4648 SeenValueSymbolTable =
true;
4658 if (
Error Err = parseConstants())
4660 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4664 if (ShouldLazyLoadMetadata) {
4665 if (
Error Err = rememberAndSkipMetadata())
4669 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4670 if (
Error Err = MDLoader->parseModuleMetadata())
4674 if (
Error Err = MDLoader->parseMetadataKinds())
4678 if (
Error Err = ResolveDataLayout())
4683 if (!SeenFirstFunctionBody) {
4684 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4685 if (
Error Err = globalCleanup())
4687 SeenFirstFunctionBody =
true;
4690 if (VSTOffset > 0) {
4694 if (!SeenValueSymbolTable) {
4695 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4697 SeenValueSymbolTable =
true;
4719 if (
Error Err = rememberAndSkipFunctionBody())
4726 if (SeenValueSymbolTable) {
4730 return globalCleanup();
4734 if (
Error Err = parseUseLists())
4738 if (
Error Err = parseOperandBundleTags())
4742 if (
Error Err = parseSyncScopeNames())
4754 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
4757 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4760 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4763 UseRelativeIDs = *VersionOrErr >= 1;
4767 if (ResolvedDataLayout)
4768 return error(
"target triple too late in module");
4771 return error(
"Invalid triple record");
4772 TheModule->setTargetTriple(Triple(std::move(S)));
4776 if (ResolvedDataLayout)
4777 return error(
"datalayout too late in module");
4779 return error(
"Invalid data layout record");
4785 return error(
"Invalid asm record");
4786 TheModule->setModuleInlineAsm(S);
4793 return error(
"Invalid deplib record");
4800 return error(
"Invalid section name record");
4801 SectionTable.push_back(S);
4807 return error(
"Invalid gcname record");
4808 GCTable.push_back(S);
4812 if (
Error Err = parseComdatRecord(Record))
4821 if (
Error Err = parseGlobalVarRecord(Record))
4825 if (
Error Err = ResolveDataLayout())
4827 if (
Error Err = parseFunctionRecord(Record))
4833 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4839 return error(
"Invalid vstoffset record");
4843 VSTOffset =
Record[0] - 1;
4849 return error(
"Invalid source filename record");
4850 TheModule->setSourceFileName(
ValueName);
4855 this->ValueTypeCallback = std::nullopt;
4859Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4861 ParserCallbacks Callbacks) {
4863 MetadataLoaderCallbacks MDCallbacks;
4864 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4866 return getContainedTypeID(
I, J);
4869 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4870 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4873Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4875 return error(
"Load/Store operand is not a pointer type");
4876 if (!PointerType::isLoadableOrStorableType(ValType))
4877 return error(
"Cannot load/store from pointer");
4881Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4882 ArrayRef<unsigned> ArgTyIDs) {
4884 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4885 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4886 Attribute::InAlloca}) {
4887 if (!
Attrs.hasParamAttr(i, Kind) ||
4888 Attrs.getParamAttr(i, Kind).getValueAsType())
4891 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4893 return error(
"Missing element type for typed attribute upgrade");
4897 case Attribute::ByVal:
4898 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4900 case Attribute::StructRet:
4901 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4903 case Attribute::InAlloca:
4904 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4917 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
4921 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
4922 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4924 return error(
"Missing element type for inline asm upgrade");
4927 Attribute::get(
Context, Attribute::ElementType, ElemTy));
4935 case Intrinsic::preserve_array_access_index:
4936 case Intrinsic::preserve_struct_access_index:
4937 case Intrinsic::aarch64_ldaxr:
4938 case Intrinsic::aarch64_ldxr:
4939 case Intrinsic::aarch64_stlxr:
4940 case Intrinsic::aarch64_stxr:
4941 case Intrinsic::arm_ldaex:
4942 case Intrinsic::arm_ldrex:
4943 case Intrinsic::arm_stlex:
4944 case Intrinsic::arm_strex: {
4947 case Intrinsic::aarch64_stlxr:
4948 case Intrinsic::aarch64_stxr:
4949 case Intrinsic::arm_stlex:
4950 case Intrinsic::arm_strex:
4957 if (!
Attrs.getParamElementType(ArgNo)) {
4958 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4960 return error(
"Missing element type for elementtype upgrade");
4975Error BitcodeReader::parseFunctionBody(Function *
F) {
4980 if (MDLoader->hasFwdRefs())
4981 return error(
"Invalid function metadata: incoming forward references");
4983 InstructionList.
clear();
4984 unsigned ModuleValueListSize = ValueList.
size();
4985 unsigned ModuleMDLoaderSize = MDLoader->size();
4989 unsigned FTyID = FunctionTypeIDs[
F];
4990 for (Argument &
I :
F->args()) {
4991 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
4992 assert(
I.getType() == getTypeByID(ArgTyID) &&
4993 "Incorrect fully specified type for Function Argument");
4997 unsigned NextValueNo = ValueList.
size();
4999 unsigned CurBBNo = 0;
5004 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
5008 auto getLastInstruction = [&]() -> Instruction * {
5009 if (CurBB && !CurBB->
empty())
5010 return &CurBB->
back();
5011 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
5012 !FunctionBBs[CurBBNo - 1]->
empty())
5013 return &FunctionBBs[CurBBNo - 1]->back();
5017 std::vector<OperandBundleDef> OperandBundles;
5020 SmallVector<uint64_t, 64>
Record;
5023 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
5026 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
5028 switch (
Entry.Kind) {
5030 return error(
"Malformed block");
5032 goto OutOfRecordLoop;
5041 if (
Error Err = parseConstants())
5043 NextValueNo = ValueList.
size();
5046 if (
Error Err = parseValueSymbolTable())
5050 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5054 assert(DeferredMetadataInfo.empty() &&
5055 "Must read all module-level metadata before function-level");
5056 if (
Error Err = MDLoader->parseFunctionMetadata())
5060 if (
Error Err = parseUseLists())
5074 unsigned ResTypeID = InvalidTypeID;
5075 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
5078 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5080 return error(
"Invalid value");
5082 if (
Record.empty() || Record[0] == 0)
5083 return error(
"Invalid declareblocks record");
5085 FunctionBBs.resize(Record[0]);
5088 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5089 if (BBFRI == BasicBlockFwdRefs.
end()) {
5090 for (BasicBlock *&BB : FunctionBBs)
5093 auto &BBRefs = BBFRI->second;
5095 if (BBRefs.size() > FunctionBBs.size())
5096 return error(
"Invalid ID");
5097 assert(!BBRefs.empty() &&
"Unexpected empty array");
5098 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5099 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5101 if (
I < RE && BBRefs[
I]) {
5102 BBRefs[
I]->insertInto(
F);
5103 FunctionBBs[
I] = BBRefs[
I];
5109 BasicBlockFwdRefs.
erase(BBFRI);
5112 CurBB = FunctionBBs[0];
5119 return error(
"Invalid blockaddr users record");
5133 for (uint64_t ValID : Record)
5135 BackwardRefFunctions.push_back(
F);
5137 return error(
"Invalid blockaddr users record");
5144 I = getLastInstruction();
5147 return error(
"Invalid debug_loc_again record");
5148 I->setDebugLoc(LastLoc);
5153 I = getLastInstruction();
5155 return error(
"Invalid debug loc record");
5160 uint64_t AtomGroup =
Record.size() == 7 ?
Record[5] : 0;
5163 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5166 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5168 return error(
"Invalid debug loc record");
5172 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5174 return error(
"Invalid debug loc record");
5177 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5178 isImplicitCode, AtomGroup, AtomRank);
5179 I->setDebugLoc(LastLoc);
5187 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5189 return error(
"Invalid unary operator record");
5193 return error(
"Invalid unary operator record");
5197 if (OpNum <
Record.size()) {
5201 I->setFastMathFlags(FMF);
5210 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5214 return error(
"Invalid binary operator record");
5218 return error(
"Invalid binary operator record");
5222 if (OpNum <
Record.size()) {
5223 if (
Opc == Instruction::Add ||
5224 Opc == Instruction::Sub ||
5225 Opc == Instruction::Mul ||
5226 Opc == Instruction::Shl) {
5231 }
else if (
Opc == Instruction::SDiv ||
5232 Opc == Instruction::UDiv ||
5233 Opc == Instruction::LShr ||
5234 Opc == Instruction::AShr) {
5237 }
else if (
Opc == Instruction::Or) {
5243 I->setFastMathFlags(FMF);
5252 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5253 OpNum + 1 >
Record.size())
5254 return error(
"Invalid cast record");
5256 ResTypeID =
Record[OpNum++];
5257 Type *ResTy = getTypeByID(ResTypeID);
5260 if (
Opc == -1 || !ResTy)
5261 return error(
"Invalid cast record");
5266 assert(CurBB &&
"No current BB?");
5272 return error(
"Invalid cast");
5276 if (OpNum <
Record.size()) {
5277 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5280 }
else if (
Opc == Instruction::Trunc) {
5292 I->setFastMathFlags(FMF);
5311 Ty = getTypeByID(TyID);
5315 TyID = InvalidTypeID;
5320 unsigned BasePtrTypeID;
5321 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5323 return error(
"Invalid gep record");
5326 TyID = getContainedTypeID(BasePtrTypeID);
5327 if (
BasePtr->getType()->isVectorTy())
5328 TyID = getContainedTypeID(TyID);
5329 Ty = getTypeByID(TyID);
5332 SmallVector<Value*, 16> GEPIdx;
5333 while (OpNum !=
Record.size()) {
5336 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5337 return error(
"Invalid gep record");
5348 unsigned SubType = 0;
5349 if (GTI.isStruct()) {
5351 Idx->getType()->isVectorTy()
5353 :
cast<ConstantInt>(Idx);
5356 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5363 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5364 if (
I->getType()->isVectorTy())
5365 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5368 GEP->setNoWrapFlags(NW);
5377 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5378 return error(
"Invalid extractvalue record");
5381 unsigned RecSize =
Record.size();
5382 if (OpNum == RecSize)
5383 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5385 SmallVector<unsigned, 4> EXTRACTVALIdx;
5386 ResTypeID = AggTypeID;
5387 for (; OpNum != RecSize; ++OpNum) {
5392 if (!IsStruct && !IsArray)
5393 return error(
"EXTRACTVAL: Invalid type");
5394 if ((
unsigned)Index != Index)
5395 return error(
"Invalid value");
5397 return error(
"EXTRACTVAL: Invalid struct index");
5399 return error(
"EXTRACTVAL: Invalid array index");
5400 EXTRACTVALIdx.
push_back((
unsigned)Index);
5404 ResTypeID = getContainedTypeID(ResTypeID, Index);
5407 ResTypeID = getContainedTypeID(ResTypeID);
5421 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5422 return error(
"Invalid insertvalue record");
5425 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5426 return error(
"Invalid insertvalue record");
5428 unsigned RecSize =
Record.size();
5429 if (OpNum == RecSize)
5430 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5432 SmallVector<unsigned, 4> INSERTVALIdx;
5434 for (; OpNum != RecSize; ++OpNum) {
5439 if (!IsStruct && !IsArray)
5440 return error(
"INSERTVAL: Invalid type");
5441 if ((
unsigned)Index != Index)
5442 return error(
"Invalid value");
5444 return error(
"INSERTVAL: Invalid struct index");
5446 return error(
"INSERTVAL: Invalid array index");
5448 INSERTVALIdx.
push_back((
unsigned)Index);
5456 return error(
"Inserted value type doesn't match aggregate type");
5459 ResTypeID = AggTypeID;
5471 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5473 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5475 popValue(Record, OpNum, NextValueNo, CondType,
5476 getVirtualTypeID(CondType),
Cond, CurBB))
5477 return error(
"Invalid select record");
5490 unsigned ValTypeID, CondTypeID;
5491 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5493 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5495 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5496 return error(
"Invalid vector select record");
5499 if (VectorType* vector_type =
5502 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5503 return error(
"Invalid type for value");
5507 return error(
"Invalid type for value");
5511 ResTypeID = ValTypeID;
5516 I->setFastMathFlags(FMF);
5524 unsigned VecTypeID, IdxTypeID;
5525 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5526 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5527 return error(
"Invalid extractelement record");
5529 return error(
"Invalid type for value");
5531 ResTypeID = getContainedTypeID(VecTypeID);
5538 Value *Vec, *Elt, *Idx;
5539 unsigned VecTypeID, IdxTypeID;
5540 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5541 return error(
"Invalid insertelement record");
5543 return error(
"Invalid type for value");
5544 if (popValue(Record, OpNum, NextValueNo,
5546 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5547 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5548 return error(
"Invalid insert element record");
5550 ResTypeID = VecTypeID;
5558 unsigned Vec1TypeID;
5559 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5561 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5563 return error(
"Invalid shufflevector record");
5565 unsigned MaskTypeID;
5566 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5567 return error(
"Invalid shufflevector record");
5569 return error(
"Invalid type for value");
5571 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5573 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5588 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5589 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5591 return error(
"Invalid comparison record");
5593 if (OpNum >=
Record.size())
5595 "Invalid record: operand number exceeded available operands");
5600 if (IsFP &&
Record.size() > OpNum+1)
5605 return error(
"Invalid fcmp predicate");
5606 I =
new FCmpInst(PredVal,
LHS,
RHS);
5609 return error(
"Invalid icmp predicate");
5610 I =
new ICmpInst(PredVal,
LHS,
RHS);
5611 if (
Record.size() > OpNum + 1 &&
5616 if (OpNum + 1 !=
Record.size())
5617 return error(
"Invalid comparison record");
5619 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5621 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5624 I->setFastMathFlags(FMF);
5641 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5642 return error(
"Invalid ret record");
5643 if (OpNum !=
Record.size())
5644 return error(
"Invalid ret record");
5652 return error(
"Invalid br record");
5653 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5655 return error(
"Invalid br record");
5657 if (
Record.size() == 1) {
5662 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5665 getVirtualTypeID(CondType), CurBB);
5666 if (!FalseDest || !
Cond)
5667 return error(
"Invalid br record");
5675 return error(
"Invalid cleanupret record");
5678 Value *CleanupPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5679 getVirtualTypeID(TokenTy), CurBB);
5681 return error(
"Invalid cleanupret record");
5683 if (
Record.size() == 2) {
5684 UnwindDest = getBasicBlock(Record[Idx++]);
5686 return error(
"Invalid cleanupret record");
5695 return error(
"Invalid catchret record");
5698 Value *CatchPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5699 getVirtualTypeID(TokenTy), CurBB);
5701 return error(
"Invalid catchret record");
5702 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5704 return error(
"Invalid catchret record");
5713 return error(
"Invalid catchswitch record");
5718 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5719 getVirtualTypeID(TokenTy), CurBB);
5721 return error(
"Invalid catchswitch record");
5723 unsigned NumHandlers =
Record[Idx++];
5726 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5727 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5729 return error(
"Invalid catchswitch record");
5734 if (Idx + 1 ==
Record.size()) {
5735 UnwindDest = getBasicBlock(Record[Idx++]);
5737 return error(
"Invalid catchswitch record");
5740 if (
Record.size() != Idx)
5741 return error(
"Invalid catchswitch record");
5745 for (BasicBlock *Handler : Handlers)
5746 CatchSwitch->addHandler(Handler);
5748 ResTypeID = getVirtualTypeID(
I->getType());
5756 return error(
"Invalid catchpad/cleanuppad record");
5761 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5762 getVirtualTypeID(TokenTy), CurBB);
5764 return error(
"Invalid catchpad/cleanuppad record");
5766 unsigned NumArgOperands =
Record[Idx++];
5768 SmallVector<Value *, 2>
Args;
5769 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5772 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5773 return error(
"Invalid catchpad/cleanuppad record");
5774 Args.push_back(Val);
5777 if (
Record.size() != Idx)
5778 return error(
"Invalid catchpad/cleanuppad record");
5784 ResTypeID = getVirtualTypeID(
I->getType());
5790 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5796 unsigned OpTyID =
Record[1];
5797 Type *OpTy = getTypeByID(OpTyID);
5803 return error(
"Invalid switch record");
5805 unsigned NumCases =
Record[4];
5810 unsigned CurIdx = 5;
5811 for (
unsigned i = 0; i != NumCases; ++i) {
5813 unsigned NumItems =
Record[CurIdx++];
5814 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5815 bool isSingleNumber =
Record[CurIdx++];
5818 unsigned ActiveWords = 1;
5819 if (ValueBitWidth > 64)
5820 ActiveWords =
Record[CurIdx++];
5823 CurIdx += ActiveWords;
5825 if (!isSingleNumber) {
5827 if (ValueBitWidth > 64)
5828 ActiveWords =
Record[CurIdx++];
5831 CurIdx += ActiveWords;
5842 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5843 for (ConstantInt *Cst : CaseVals)
5844 SI->addCase(Cst, DestBB);
5853 return error(
"Invalid switch record");
5854 unsigned OpTyID =
Record[0];
5855 Type *OpTy = getTypeByID(OpTyID);
5859 return error(
"Invalid switch record");
5860 unsigned NumCases = (
Record.size()-3)/2;
5863 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5865 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
5866 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
5867 if (!CaseVal || !DestBB) {
5869 return error(
"Invalid switch record");
5871 SI->addCase(CaseVal, DestBB);
5878 return error(
"Invalid indirectbr record");
5879 unsigned OpTyID =
Record[0];
5880 Type *OpTy = getTypeByID(OpTyID);
5883 return error(
"Invalid indirectbr record");
5884 unsigned NumDests =
Record.size()-2;
5887 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5888 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
5892 return error(
"Invalid indirectbr record");
5902 return error(
"Invalid invoke record");
5905 unsigned CCInfo =
Record[OpNum++];
5906 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
5907 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
5909 unsigned FTyID = InvalidTypeID;
5910 FunctionType *FTy =
nullptr;
5911 if ((CCInfo >> 13) & 1) {
5915 return error(
"Explicit invoke type is not a function type");
5919 unsigned CalleeTypeID;
5920 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5922 return error(
"Invalid invoke record");
5926 return error(
"Callee is not a pointer");
5928 FTyID = getContainedTypeID(CalleeTypeID);
5931 return error(
"Callee is not of pointer to function type");
5933 if (
Record.size() < FTy->getNumParams() + OpNum)
5934 return error(
"Insufficient operands to call");
5936 SmallVector<Value*, 16>
Ops;
5937 SmallVector<unsigned, 16> ArgTyIDs;
5938 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5939 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5940 Ops.push_back(
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
5944 return error(
"Invalid invoke record");
5947 if (!FTy->isVarArg()) {
5948 if (
Record.size() != OpNum)
5949 return error(
"Invalid invoke record");
5952 while (OpNum !=
Record.size()) {
5955 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5956 return error(
"Invalid invoke record");
5963 if (!OperandBundles.empty())
5968 ResTypeID = getContainedTypeID(FTyID);
5969 OperandBundles.clear();
5972 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
5983 Value *Val =
nullptr;
5985 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
5986 return error(
"Invalid resume record");
5995 unsigned CCInfo =
Record[OpNum++];
5997 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
5998 unsigned NumIndirectDests =
Record[OpNum++];
5999 SmallVector<BasicBlock *, 16> IndirectDests;
6000 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
6001 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
6003 unsigned FTyID = InvalidTypeID;
6004 FunctionType *FTy =
nullptr;
6009 return error(
"Explicit call type is not a function type");
6013 unsigned CalleeTypeID;
6014 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6016 return error(
"Invalid callbr record");
6020 return error(
"Callee is not a pointer type");
6022 FTyID = getContainedTypeID(CalleeTypeID);
6025 return error(
"Callee is not of pointer to function type");
6027 if (
Record.size() < FTy->getNumParams() + OpNum)
6028 return error(
"Insufficient operands to call");
6030 SmallVector<Value*, 16>
Args;
6031 SmallVector<unsigned, 16> ArgTyIDs;
6033 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6035 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6036 if (FTy->getParamType(i)->isLabelTy())
6037 Arg = getBasicBlock(Record[OpNum]);
6039 Arg =
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6042 return error(
"Invalid callbr record");
6043 Args.push_back(Arg);
6048 if (!FTy->isVarArg()) {
6049 if (OpNum !=
Record.size())
6050 return error(
"Invalid callbr record");
6052 while (OpNum !=
Record.size()) {
6055 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6056 return error(
"Invalid callbr record");
6063 if (!OperandBundles.empty())
6068 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6071 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6076 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6077 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6078 unsigned LabelNo = ArgNo - FirstBlockArg;
6080 if (!BA || BA->getFunction() !=
F ||
6081 LabelNo > IndirectDests.
size() ||
6082 BA->getBasicBlock() != IndirectDests[LabelNo])
6083 return error(
"callbr argument does not match indirect dest");
6088 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6092 for (
Value *Arg : Args)
6095 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6098 std::string Constraints =
IA->getConstraintString().str();
6101 for (
const auto &CI : ConstraintInfo) {
6103 if (ArgNo >= FirstBlockArg)
6104 Constraints.insert(Pos,
"!");
6109 Pos = Constraints.find(
',', Pos);
6110 if (Pos == std::string::npos)
6116 IA->hasSideEffects(),
IA->isAlignStack(),
6117 IA->getDialect(),
IA->canThrow());
6123 ResTypeID = getContainedTypeID(FTyID);
6124 OperandBundles.clear();
6141 return error(
"Invalid phi record");
6143 unsigned TyID =
Record[0];
6144 Type *Ty = getTypeByID(TyID);
6146 return error(
"Invalid phi record");
6151 size_t NumArgs = (
Record.size() - 1) / 2;
6155 return error(
"Invalid phi record");
6159 SmallDenseMap<BasicBlock *, Value *>
Args;
6160 for (
unsigned i = 0; i != NumArgs; i++) {
6161 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6164 return error(
"Invalid phi BB");
6171 auto It =
Args.find(BB);
6173 if (It !=
Args.end()) {
6187 if (!PhiConstExprBB)
6189 EdgeBB = PhiConstExprBB;
6197 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6199 V =
getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6203 return error(
"Invalid phi record");
6206 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6207 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6208 PhiConstExprBB =
nullptr;
6211 Args.insert({BB,
V});
6217 if (
Record.size() % 2 == 0) {
6221 I->setFastMathFlags(FMF);
6233 return error(
"Invalid landingpad record");
6237 return error(
"Invalid landingpad record");
6239 ResTypeID =
Record[Idx++];
6240 Type *Ty = getTypeByID(ResTypeID);
6242 return error(
"Invalid landingpad record");
6244 Value *PersFn =
nullptr;
6245 unsigned PersFnTypeID;
6246 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6248 return error(
"Invalid landingpad record");
6250 if (!
F->hasPersonalityFn())
6253 return error(
"Personality function mismatch");
6256 bool IsCleanup = !!
Record[Idx++];
6257 unsigned NumClauses =
Record[Idx++];
6260 for (
unsigned J = 0; J != NumClauses; ++J) {
6266 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6269 return error(
"Invalid landingpad record");
6274 "Catch clause has a invalid type!");
6277 "Filter clause has invalid type!");
6288 return error(
"Invalid alloca record");
6289 using APV = AllocaPackedValues;
6290 const uint64_t Rec =
Record[3];
6293 unsigned TyID =
Record[0];
6294 Type *Ty = getTypeByID(TyID);
6296 TyID = getContainedTypeID(TyID);
6297 Ty = getTypeByID(TyID);
6299 return error(
"Missing element type for old-style alloca");
6301 unsigned OpTyID =
Record[1];
6302 Type *OpTy = getTypeByID(OpTyID);
6303 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6308 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6312 return error(
"Invalid alloca record");
6314 const DataLayout &
DL = TheModule->getDataLayout();
6315 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6317 SmallPtrSet<Type *, 4> Visited;
6318 if (!Align && !Ty->
isSized(&Visited))
6319 return error(
"alloca of unsized type");
6321 Align =
DL.getPrefTypeAlign(Ty);
6323 if (!
Size->getType()->isIntegerTy())
6324 return error(
"alloca element count must have integer type");
6326 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6330 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6338 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6339 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6340 return error(
"Invalid load record");
6343 return error(
"Load operand is not a pointer type");
6346 if (OpNum + 3 ==
Record.size()) {
6347 ResTypeID =
Record[OpNum++];
6348 Ty = getTypeByID(ResTypeID);
6350 ResTypeID = getContainedTypeID(OpTypeID);
6351 Ty = getTypeByID(ResTypeID);
6355 return error(
"Missing load type");
6357 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6361 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6363 SmallPtrSet<Type *, 4> Visited;
6364 if (!Align && !Ty->
isSized(&Visited))
6365 return error(
"load of unsized type");
6367 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6368 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6377 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6378 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size()))
6379 return error(
"Invalid load atomic record");
6382 return error(
"Load operand is not a pointer type");
6385 if (OpNum + 5 ==
Record.size()) {
6386 ResTypeID =
Record[OpNum++];
6387 Ty = getTypeByID(ResTypeID);
6389 ResTypeID = getContainedTypeID(OpTypeID);
6390 Ty = getTypeByID(ResTypeID);
6394 return error(
"Missing atomic load type");
6396 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6400 if (Ordering == AtomicOrdering::NotAtomic ||
6401 Ordering == AtomicOrdering::Release ||
6402 Ordering == AtomicOrdering::AcquireRelease)
6403 return error(
"Invalid load atomic record");
6404 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6405 return error(
"Invalid load atomic record");
6406 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6409 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6412 return error(
"Alignment missing from atomic load");
6413 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align, Ordering, SSID);
6421 unsigned PtrTypeID, ValTypeID;
6422 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6423 return error(
"Invalid store record");
6426 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6427 return error(
"Invalid store record");
6429 ValTypeID = getContainedTypeID(PtrTypeID);
6430 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6431 ValTypeID, Val, CurBB))
6432 return error(
"Invalid store record");
6435 if (OpNum + 2 !=
Record.size())
6436 return error(
"Invalid store record");
6441 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6443 SmallPtrSet<Type *, 4> Visited;
6445 return error(
"store of unsized type");
6447 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6448 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6457 unsigned PtrTypeID, ValTypeID;
6458 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6460 return error(
"Invalid store atomic record");
6462 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6463 return error(
"Invalid store atomic record");
6465 ValTypeID = getContainedTypeID(PtrTypeID);
6466 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6467 ValTypeID, Val, CurBB))
6468 return error(
"Invalid store atomic record");
6471 if (OpNum + 4 !=
Record.size())
6472 return error(
"Invalid store atomic record");
6477 if (Ordering == AtomicOrdering::NotAtomic ||
6478 Ordering == AtomicOrdering::Acquire ||
6479 Ordering == AtomicOrdering::AcquireRelease)
6480 return error(
"Invalid store atomic record");
6481 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6482 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6483 return error(
"Invalid store atomic record");
6486 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6489 return error(
"Alignment missing from atomic store");
6490 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align, Ordering, SSID);
6497 const size_t NumRecords =
Record.size();
6499 Value *Ptr =
nullptr;
6501 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6502 return error(
"Invalid cmpxchg record");
6505 return error(
"Cmpxchg operand is not a pointer type");
6508 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6509 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6510 CmpTypeID, Cmp, CurBB))
6511 return error(
"Invalid cmpxchg record");
6514 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6516 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6517 return error(
"Invalid cmpxchg record");
6521 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6522 SuccessOrdering == AtomicOrdering::Unordered)
6523 return error(
"Invalid cmpxchg record");
6525 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6527 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6535 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6536 FailureOrdering == AtomicOrdering::Unordered)
6537 return error(
"Invalid cmpxchg record");
6539 const Align Alignment(
6540 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6542 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6543 FailureOrdering, SSID);
6546 if (NumRecords < 8) {
6550 I->insertInto(CurBB, CurBB->
end());
6552 ResTypeID = CmpTypeID;
6555 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6556 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6565 const size_t NumRecords =
Record.size();
6567 Value *Ptr =
nullptr;
6569 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6570 return error(
"Invalid cmpxchg record");
6573 return error(
"Cmpxchg operand is not a pointer type");
6577 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6578 return error(
"Invalid cmpxchg record");
6580 Value *Val =
nullptr;
6581 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6583 return error(
"Invalid cmpxchg record");
6585 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6586 return error(
"Invalid cmpxchg record");
6588 const bool IsVol =
Record[OpNum];
6593 return error(
"Invalid cmpxchg success ordering");
6595 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6597 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6603 return error(
"Invalid cmpxchg failure ordering");
6605 const bool IsWeak =
Record[OpNum + 4];
6607 MaybeAlign Alignment;
6609 if (NumRecords == (OpNum + 6)) {
6610 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6615 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6617 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6618 FailureOrdering, SSID);
6622 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6623 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6632 const size_t NumRecords =
Record.size();
6635 Value *Ptr =
nullptr;
6637 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6638 return error(
"Invalid atomicrmw record");
6641 return error(
"Invalid atomicrmw record");
6643 Value *Val =
nullptr;
6644 unsigned ValTypeID = InvalidTypeID;
6646 ValTypeID = getContainedTypeID(PtrTypeID);
6647 if (popValue(Record, OpNum, NextValueNo,
6648 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6649 return error(
"Invalid atomicrmw record");
6651 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6652 return error(
"Invalid atomicrmw record");
6655 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6656 return error(
"Invalid atomicrmw record");
6658 bool IsElementwise =
false;
6663 return error(
"Invalid atomicrmw record");
6665 const bool IsVol =
Record[OpNum + 1];
6668 if (Ordering == AtomicOrdering::NotAtomic ||
6669 Ordering == AtomicOrdering::Unordered)
6670 return error(
"Invalid atomicrmw record");
6672 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6674 MaybeAlign Alignment;
6676 if (NumRecords == (OpNum + 5)) {
6677 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6683 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6685 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID,
6687 ResTypeID = ValTypeID;
6695 return error(
"Invalid fence record");
6697 if (Ordering == AtomicOrdering::NotAtomic ||
6698 Ordering == AtomicOrdering::Unordered ||
6699 Ordering == AtomicOrdering::Monotonic)
6700 return error(
"Invalid fence record");
6702 I =
new FenceInst(
Context, Ordering, SSID);
6709 SeenDebugRecord =
true;
6712 return error(
"Invalid dbg record: missing instruction");
6715 Inst->
getParent()->insertDbgRecordBefore(
6726 SeenDebugRecord =
true;
6729 return error(
"Invalid dbg record: missing instruction");
6746 DILocalVariable *Var =
6748 DIExpression *Expr =
6761 unsigned SlotBefore =
Slot;
6762 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6763 return error(
"Invalid dbg record: invalid value");
6765 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6768 RawLocation = getFnMetadataByID(Record[Slot++]);
6771 DbgVariableRecord *DVR =
nullptr;
6775 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6776 DbgVariableRecord::LocationType::Value);
6779 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6780 DbgVariableRecord::LocationType::Declare);
6783 DVR =
new DbgVariableRecord(
6784 RawLocation, Var, Expr, DIL,
6785 DbgVariableRecord::LocationType::DeclareValue);
6789 DIExpression *AddrExpr =
6791 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6792 DVR =
new DbgVariableRecord(RawLocation, Var, Expr,
ID, Addr, AddrExpr,
6805 return error(
"Invalid call record");
6809 unsigned CCInfo =
Record[OpNum++];
6815 return error(
"Fast math flags indicator set for call with no FMF");
6818 unsigned FTyID = InvalidTypeID;
6819 FunctionType *FTy =
nullptr;
6824 return error(
"Explicit call type is not a function type");
6828 unsigned CalleeTypeID;
6829 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6831 return error(
"Invalid call record");
6835 return error(
"Callee is not a pointer type");
6837 FTyID = getContainedTypeID(CalleeTypeID);
6840 return error(
"Callee is not of pointer to function type");
6842 if (
Record.size() < FTy->getNumParams() + OpNum)
6843 return error(
"Insufficient operands to call");
6845 SmallVector<Value*, 16>
Args;
6846 SmallVector<unsigned, 16> ArgTyIDs;
6848 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6849 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6850 if (FTy->getParamType(i)->isLabelTy())
6851 Args.push_back(getBasicBlock(Record[OpNum]));
6854 FTy->getParamType(i), ArgTyID, CurBB));
6857 return error(
"Invalid call record");
6861 if (!FTy->isVarArg()) {
6862 if (OpNum !=
Record.size())
6863 return error(
"Invalid call record");
6865 while (OpNum !=
Record.size()) {
6868 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6869 return error(
"Invalid call record");
6876 if (!OperandBundles.empty())
6880 ResTypeID = getContainedTypeID(FTyID);
6881 OperandBundles.clear();
6895 SeenDebugIntrinsic =
true;
6902 return error(
"Fast-math-flags specified for call without "
6903 "floating-point scalar or vector return type");
6904 I->setFastMathFlags(FMF);
6910 return error(
"Invalid va_arg record");
6911 unsigned OpTyID =
Record[0];
6912 Type *OpTy = getTypeByID(OpTyID);
6915 Type *ResTy = getTypeByID(ResTypeID);
6916 if (!OpTy || !
Op || !ResTy)
6917 return error(
"Invalid va_arg record");
6918 I =
new VAArgInst(
Op, ResTy);
6928 if (
Record.empty() || Record[0] >= BundleTags.size())
6929 return error(
"Invalid operand bundle record");
6931 std::vector<Value *> Inputs;
6934 while (OpNum !=
Record.size()) {
6936 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
6937 return error(
"Invalid operand bundle record");
6938 Inputs.push_back(
Op);
6941 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
6949 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6950 return error(
"Invalid freeze record");
6951 if (OpNum !=
Record.size())
6952 return error(
"Invalid freeze record");
6954 I =
new FreezeInst(
Op);
6955 ResTypeID = OpTypeID;
6965 return error(
"Invalid instruction with no BB");
6967 if (!OperandBundles.empty()) {
6969 return error(
"Operand bundles found with no consumer");
6971 I->insertInto(CurBB, CurBB->
end());
6974 if (
I->isTerminator()) {
6976 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
6980 if (!
I->getType()->isVoidTy()) {
6981 assert(
I->getType() == getTypeByID(ResTypeID) &&
6982 "Incorrect result type ID");
6990 if (!OperandBundles.empty())
6991 return error(
"Operand bundles found with no consumer");
6995 if (!
A->getParent()) {
6997 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
7003 return error(
"Never resolved value found in function");
7008 if (MDLoader->hasFwdRefs())
7009 return error(
"Invalid function metadata: outgoing forward refs");
7014 for (
const auto &Pair : ConstExprEdgeBBs) {
7025 ValueList.
shrinkTo(ModuleValueListSize);
7026 MDLoader->shrinkTo(ModuleMDLoaderSize);
7027 std::vector<BasicBlock*>().swap(FunctionBBs);
7032Error BitcodeReader::findFunctionInStream(
7034 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
7035 while (DeferredFunctionInfoIterator->second == 0) {
7040 assert(VSTOffset == 0 || !
F->hasName());
7043 if (
Error Err = rememberAndSkipFunctionBodies())
7049SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7052 if (Val >= SSIDs.
size())
7061Error BitcodeReader::materialize(GlobalValue *GV) {
7064 if (!
F || !
F->isMaterializable())
7067 auto DFII = DeferredFunctionInfo.
find(
F);
7068 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7071 if (DFII->second == 0)
7072 if (
Error Err = findFunctionInStream(
F, DFII))
7076 if (
Error Err = materializeMetadata())
7083 if (
Error Err = parseFunctionBody(
F))
7085 F->setIsMaterializable(
false);
7089 if (SeenDebugIntrinsic && SeenDebugRecord)
7090 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7096 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7097 F->setSubprogram(SP);
7100 if (!MDLoader->isStrippingTBAA()) {
7102 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7105 MDLoader->setStripTBAA(
true);
7112 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7113 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7119 unsigned ExpectedNumOperands = 0;
7121 ExpectedNumOperands = 2;
7123 ExpectedNumOperands =
SI->getNumSuccessors();
7125 ExpectedNumOperands = 1;
7129 ExpectedNumOperands = 2;
7136 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7137 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7143 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7144 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7146 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7147 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7148 CI->getArgOperand(ArgNo)->getType(),
7149 CI->getParamAttributes(ArgNo)));
7152 if (Function *OldFn = CI->getCalledFunction()) {
7153 auto It = UpgradedIntrinsics.find(OldFn);
7154 if (It != UpgradedIntrinsics.end())
7158 BC && BC->getSrcTy() == BC->getDestTy() &&
7164 CI && CI->isMustTailCall() && CI->getNextNode() == BC) {
7165 BC->replaceAllUsesWith(CI);
7166 BC->eraseFromParent();
7176 return materializeForwardReferencedFunctions();
7179Error BitcodeReader::materializeModule() {
7180 if (
Error Err = materializeMetadata())
7184 WillMaterializeAllForwardRefs =
true;
7188 for (Function &
F : *TheModule) {
7189 if (
Error Err = materialize(&
F))
7195 if (LastFunctionBlockBit || NextUnreadBit)
7197 ? LastFunctionBlockBit
7203 if (!BasicBlockFwdRefs.
empty())
7204 return error(
"Never resolved function from blockaddress");
7210 for (
auto &
I : UpgradedIntrinsics) {
7211 for (
auto *U :
I.first->users()) {
7215 if (
I.first !=
I.second) {
7216 if (!
I.first->use_empty())
7217 I.first->replaceAllUsesWith(
I.second);
7218 I.first->eraseFromParent();
7221 UpgradedIntrinsics.clear();
7236std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7237 return IdentifiedStructTypes;
7240ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7241 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7243 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7244 ModulePath(ModulePath), IsPrevailing(IsPrevailing) {}
7246void ModuleSummaryIndexBitcodeReader::addThisModule() {
7251ModuleSummaryIndexBitcodeReader::getThisModule() {
7255template <
bool AllowNullValueInfo>
7256std::pair<ValueInfo, GlobalValue::GUID>
7257ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7258 auto VGI = ValueIdToValueInfoMap[ValueId];
7265 assert(AllowNullValueInfo || std::get<0>(VGI));
7269void ModuleSummaryIndexBitcodeReader::setValueGUID(
7271 StringRef SourceFileName) {
7272 std::string GlobalId =
7275 auto OriginalNameID = ValueGUID;
7279 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7285 ValueIdToValueInfoMap[ValueID] = std::make_pair(
7294Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7296 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7303 if (!MaybeCurrentBit)
7305 uint64_t CurrentBit = MaybeCurrentBit.
get();
7310 SmallVector<uint64_t, 64>
Record;
7319 BitstreamEntry
Entry = MaybeEntry.
get();
7321 switch (
Entry.Kind) {
7324 return error(
"Malformed block");
7340 switch (MaybeRecord.
get()) {
7345 return error(
"Invalid vst_code_entry record");
7346 unsigned ValueID =
Record[0];
7348 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7349 assert(VLI != ValueIdToLinkageMap.
end() &&
7350 "No linkage found for VST entry?");
7359 return error(
"Invalid vst_code_fnentry record");
7360 unsigned ValueID =
Record[0];
7362 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7363 assert(VLI != ValueIdToLinkageMap.
end() &&
7364 "No linkage found for VST entry?");
7372 unsigned ValueID =
Record[0];
7376 ValueIdToValueInfoMap[ValueID] =
7387Error ModuleSummaryIndexBitcodeReader::parseModule() {
7391 SmallVector<uint64_t, 64>
Record;
7392 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7393 unsigned ValueId = 0;
7397 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
7400 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7402 switch (
Entry.Kind) {
7404 return error(
"Malformed block");
7416 if (
Error Err = readBlockInfo())
7422 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7423 !SeenGlobalValSummary) &&
7424 "Expected early VST parse via VSTOffset record");
7431 if (!SourceFileName.
empty())
7433 assert(!SeenValueSymbolTable &&
7434 "Already read VST when parsing summary block?");
7439 if (VSTOffset > 0) {
7440 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7442 SeenValueSymbolTable =
true;
7444 SeenGlobalValSummary =
true;
7445 if (
Error Err = parseEntireSummary(
Entry.ID))
7449 if (
Error Err = parseModuleStringTable())
7457 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7460 switch (MaybeBitCode.
get()) {
7464 if (
Error Err = parseVersionRecord(Record).takeError())
7472 return error(
"Invalid source filename record");
7479 return error(
"Invalid hash length " + Twine(
Record.size()).str());
7480 auto &Hash = getThisModule()->second;
7482 for (
auto &Val : Record) {
7483 assert(!(Val >> 32) &&
"Unexpected high bits set");
7491 return error(
"Invalid vstoffset record");
7495 VSTOffset =
Record[0] - 1;
7505 ArrayRef<uint64_t> GVRecord;
7506 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7507 if (GVRecord.
size() <= 3)
7508 return error(
"Invalid global record");
7509 uint64_t RawLinkage = GVRecord[3];
7512 ValueIdToLinkageMap[ValueId++] =
Linkage;
7516 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7527ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7530 for (uint64_t RefValueId : Record)
7531 Ret.
push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7536ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7537 bool IsOldProfileFormat,
7538 bool HasProfile,
bool HasRelBF) {
7542 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7547 for (
unsigned I = 0,
E =
Record.size();
I !=
E; ++
I) {
7549 bool HasTailCall =
false;
7551 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7552 if (IsOldProfileFormat) {
7556 }
else if (HasProfile)
7557 std::tie(Hotness, HasTailCall) =
7591 static_cast<size_t>(
Record[Slot + 1])};
7614 while (Slot <
Record.size())
7618std::vector<FunctionSummary::ParamAccess>
7619ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7620 auto ReadRange = [&]() {
7622 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7624 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7631 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7632 while (!
Record.empty()) {
7633 PendingParamAccesses.emplace_back();
7634 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7636 ParamAccess.
Use = ReadRange();
7641 std::get<0>(getValueInfoFromValueId(
Record.consume_front()));
7642 Call.Offsets = ReadRange();
7645 return PendingParamAccesses;
7648void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7649 ArrayRef<uint64_t> Record,
size_t &Slot,
7652 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7656void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7657 ArrayRef<uint64_t> Record) {
7665 while (Slot <
Record.size())
7666 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7669SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7670 ArrayRef<uint64_t> Record,
unsigned &
I) {
7671 SmallVector<unsigned> StackIdList;
7675 if (RadixArray.empty()) {
7676 unsigned NumStackEntries =
Record[
I++];
7678 StackIdList.
reserve(NumStackEntries);
7679 for (
unsigned J = 0; J < NumStackEntries; J++) {
7680 assert(Record[
I] < StackIds.size());
7681 StackIdList.
push_back(getStackIdIndex(Record[
I++]));
7684 unsigned RadixIndex =
Record[
I++];
7690 assert(RadixIndex < RadixArray.size());
7691 unsigned NumStackIds = RadixArray[RadixIndex++];
7692 StackIdList.
reserve(NumStackIds);
7693 while (NumStackIds--) {
7694 assert(RadixIndex < RadixArray.size());
7695 unsigned Elem = RadixArray[RadixIndex];
7696 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7697 RadixIndex = RadixIndex - Elem;
7698 assert(RadixIndex < RadixArray.size());
7699 Elem = RadixArray[RadixIndex];
7701 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7704 StackIdList.
push_back(getStackIdIndex(Elem));
7714 unsigned FirstWORef = Refs.
size() - WOCnt;
7715 unsigned RefNo = FirstWORef - ROCnt;
7716 for (; RefNo < FirstWORef; ++RefNo)
7717 Refs[RefNo].setReadOnly();
7718 for (; RefNo < Refs.
size(); ++RefNo)
7719 Refs[RefNo].setWriteOnly();
7724Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7727 SmallVector<uint64_t, 64>
Record;
7734 BitstreamEntry
Entry = MaybeEntry.
get();
7737 return error(
"Invalid Summary Block: record for version expected");
7742 return error(
"Invalid Summary Block: version expected");
7745 const bool IsOldProfileFormat =
Version == 1;
7748 const bool MemProfAfterFunctionSummary =
Version >= 13;
7750 return error(
"Invalid summary version " + Twine(
Version) +
7751 ". Version should be in the range [1-" +
7758 GlobalValueSummary *LastSeenSummary =
nullptr;
7768 FunctionSummary *CurrentPrevailingFS =
nullptr;
7773 std::vector<GlobalValue::GUID> PendingTypeTests;
7774 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7775 PendingTypeCheckedLoadVCalls;
7776 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7777 PendingTypeCheckedLoadConstVCalls;
7778 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7780 std::vector<CallsiteInfo> PendingCallsites;
7781 std::vector<AllocInfo> PendingAllocs;
7782 std::vector<uint64_t> PendingContextIds;
7788 BitstreamEntry
Entry = MaybeEntry.
get();
7790 switch (
Entry.Kind) {
7793 return error(
"Malformed block");
7809 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7812 unsigned BitCode = MaybeBitCode.
get();
7822 uint64_t ValueID =
Record[0];
7829 ValueIdToValueInfoMap[ValueID] =
7847 unsigned ValueID =
Record[0];
7848 uint64_t RawFlags =
Record[1];
7849 unsigned InstCount =
Record[2];
7850 uint64_t RawFunFlags = 0;
7851 unsigned NumRefs =
Record[3];
7852 unsigned NumRORefs = 0, NumWORefs = 0;
7853 int RefListStartIndex = 4;
7857 RefListStartIndex = 5;
7860 RefListStartIndex = 6;
7863 RefListStartIndex = 7;
7874 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7876 "Record size inconsistent with number of references");
7878 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7883 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7884 IsOldProfileFormat, HasProfile, HasRelBF);
7886 auto [
VI,
GUID] = getValueInfoFromValueId(ValueID);
7893 IsPrevailing(
VI.getGUID());
7899 assert(!MemProfAfterFunctionSummary ||
7900 (PendingCallsites.empty() && PendingAllocs.empty()));
7901 if (!IsPrevailingSym && !MemProfAfterFunctionSummary) {
7902 PendingCallsites.clear();
7903 PendingAllocs.clear();
7906 auto FS = std::make_unique<FunctionSummary>(
7908 std::move(Calls), std::move(PendingTypeTests),
7909 std::move(PendingTypeTestAssumeVCalls),
7910 std::move(PendingTypeCheckedLoadVCalls),
7911 std::move(PendingTypeTestAssumeConstVCalls),
7912 std::move(PendingTypeCheckedLoadConstVCalls),
7913 std::move(PendingParamAccesses), std::move(PendingCallsites),
7914 std::move(PendingAllocs));
7915 FS->setModulePath(getThisModule()->first());
7916 FS->setOriginalName(GUID);
7919 if (MemProfAfterFunctionSummary) {
7920 if (IsPrevailingSym)
7921 CurrentPrevailingFS =
FS.get();
7923 CurrentPrevailingFS =
nullptr;
7932 unsigned ValueID =
Record[0];
7933 uint64_t RawFlags =
Record[1];
7934 unsigned AliaseeID =
Record[2];
7936 auto AS = std::make_unique<AliasSummary>(Flags);
7942 AS->setModulePath(getThisModule()->first());
7944 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
7946 if (!AliaseeInModule)
7947 return error(
"Alias expects aliasee summary to be parsed");
7948 AS->setAliasee(AliaseeVI, AliaseeInModule);
7950 auto GUID = getValueInfoFromValueId(ValueID);
7951 AS->setOriginalName(std::get<1>(GUID));
7957 unsigned ValueID =
Record[0];
7958 uint64_t RawFlags =
Record[1];
7959 unsigned RefArrayStart = 2;
7960 GlobalVarSummary::GVarFlags GVF(
false,
7970 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
7972 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7973 FS->setModulePath(getThisModule()->first());
7974 auto GUID = getValueInfoFromValueId(ValueID);
7975 FS->setOriginalName(std::get<1>(GUID));
7983 unsigned ValueID =
Record[0];
7984 uint64_t RawFlags =
Record[1];
7986 unsigned NumRefs =
Record[3];
7987 unsigned RefListStartIndex = 4;
7988 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
7991 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7993 for (
unsigned I = VTableListStartIndex,
E =
Record.size();
I !=
E; ++
I) {
7994 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7999 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8000 VS->setModulePath(getThisModule()->first());
8001 VS->setVTableFuncs(VTableFuncs);
8002 auto GUID = getValueInfoFromValueId(ValueID);
8003 VS->setOriginalName(std::get<1>(GUID));
8015 unsigned ValueID =
Record[0];
8016 uint64_t ModuleId =
Record[1];
8017 uint64_t RawFlags =
Record[2];
8018 unsigned InstCount =
Record[3];
8019 uint64_t RawFunFlags = 0;
8020 unsigned NumRefs =
Record[4];
8021 unsigned NumRORefs = 0, NumWORefs = 0;
8022 int RefListStartIndex = 5;
8026 RefListStartIndex = 6;
8027 size_t NumRefsIndex = 5;
8029 unsigned NumRORefsOffset = 1;
8030 RefListStartIndex = 7;
8033 RefListStartIndex = 8;
8035 RefListStartIndex = 9;
8037 NumRORefsOffset = 2;
8040 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
8042 NumRefs =
Record[NumRefsIndex];
8046 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8048 "Record size inconsistent with number of references");
8050 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8053 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8054 IsOldProfileFormat, HasProfile,
false);
8055 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8057 auto FS = std::make_unique<FunctionSummary>(
8059 std::move(Edges), std::move(PendingTypeTests),
8060 std::move(PendingTypeTestAssumeVCalls),
8061 std::move(PendingTypeCheckedLoadVCalls),
8062 std::move(PendingTypeTestAssumeConstVCalls),
8063 std::move(PendingTypeCheckedLoadConstVCalls),
8064 std::move(PendingParamAccesses), std::move(PendingCallsites),
8065 std::move(PendingAllocs));
8066 LastSeenSummary =
FS.get();
8067 if (MemProfAfterFunctionSummary)
8068 CurrentPrevailingFS =
FS.get();
8069 LastSeenGUID =
VI.getGUID();
8070 FS->setModulePath(ModuleIdMap[ModuleId]);
8078 unsigned ValueID =
Record[0];
8079 uint64_t ModuleId =
Record[1];
8080 uint64_t RawFlags =
Record[2];
8081 unsigned AliaseeValueId =
Record[3];
8083 auto AS = std::make_unique<AliasSummary>(Flags);
8084 LastSeenSummary = AS.get();
8085 AS->setModulePath(ModuleIdMap[ModuleId]);
8087 auto AliaseeVI = std::get<0>(
8088 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(AliaseeValueId));
8090 auto AliaseeInModule =
8092 AS->setAliasee(AliaseeVI, AliaseeInModule);
8094 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8095 LastSeenGUID =
VI.getGUID();
8101 unsigned ValueID =
Record[0];
8102 uint64_t ModuleId =
Record[1];
8103 uint64_t RawFlags =
Record[2];
8104 unsigned RefArrayStart = 3;
8105 GlobalVarSummary::GVarFlags GVF(
false,
8115 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8117 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8118 LastSeenSummary =
FS.get();
8119 FS->setModulePath(ModuleIdMap[ModuleId]);
8120 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8121 LastSeenGUID =
VI.getGUID();
8127 uint64_t OriginalName =
Record[0];
8128 if (!LastSeenSummary)
8129 return error(
"Name attachment that does not follow a combined record");
8133 LastSeenSummary =
nullptr;
8138 assert(PendingTypeTests.empty());
8143 assert(PendingTypeTestAssumeVCalls.empty());
8144 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8145 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8149 assert(PendingTypeCheckedLoadVCalls.empty());
8150 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8151 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8155 PendingTypeTestAssumeConstVCalls.push_back(
8160 PendingTypeCheckedLoadConstVCalls.push_back(
8167 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8168 StringRef
Name(Strtab.
data() + Record[
I],
8169 static_cast<size_t>(Record[
I + 1]));
8172 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, GUID);
8175 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8177 StringRef
Name(Strtab.
data() + Record[
I + 1],
8178 static_cast<size_t>(Record[
I + 2]));
8179 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8188 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8189 StringRef
Name(Strtab.
data() + Record[
I],
8190 static_cast<size_t>(Record[
I + 1]));
8193 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, GUID);
8196 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8198 StringRef
Name(Strtab.
data() + Record[
I + 1],
8199 static_cast<size_t>(Record[
I + 2]));
8200 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8211 parseTypeIdCompatibleVtableSummaryRecord(Record);
8219 PendingParamAccesses = parseParamAccesses(Record);
8226 assert(StackIds.empty());
8228 StackIds = ArrayRef<uint64_t>(Record);
8234 StackIds.reserve(
Record.size() / 2);
8235 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8236 StackIds.push_back(*R << 32 | *(R + 1));
8238 assert(StackIdToIndex.empty());
8240 StackIdToIndex.resize(StackIds.size(), UninitializedStackIdIndex);
8245 RadixArray = ArrayRef<uint64_t>(Record);
8252 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8254 unsigned ValueID =
Record[0];
8255 SmallVector<unsigned> StackIdList;
8257 assert(R < StackIds.size());
8258 StackIdList.
push_back(getStackIdIndex(R));
8260 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8261 if (MemProfAfterFunctionSummary)
8263 CallsiteInfo({
VI, std::move(StackIdList)}));
8265 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8272 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8273 auto RecordIter =
Record.begin();
8274 unsigned ValueID = *RecordIter++;
8275 unsigned NumStackIds = *RecordIter++;
8276 unsigned NumVersions = *RecordIter++;
8277 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8278 SmallVector<unsigned> StackIdList;
8279 for (
unsigned J = 0; J < NumStackIds; J++) {
8280 assert(*RecordIter < StackIds.size());
8281 StackIdList.
push_back(getStackIdIndex(*RecordIter++));
8283 SmallVector<unsigned> Versions;
8284 for (
unsigned J = 0; J < NumVersions; J++)
8286 ValueInfo
VI = std::get<0>(
8287 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8288 if (MemProfAfterFunctionSummary)
8290 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8292 PendingCallsites.push_back(
8293 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8300 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8305 PendingContextIds.reserve(
Record.size() / 2);
8306 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8307 PendingContextIds.push_back(*R << 32 | *(R + 1));
8314 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS) {
8315 PendingContextIds.clear();
8319 std::vector<MIBInfo> MIBs;
8320 unsigned NumMIBs = 0;
8323 unsigned MIBsRead = 0;
8324 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8328 auto StackIdList = parseAllocInfoContext(Record,
I);
8329 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8335 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8337 assert(!PendingContextIds.empty() &&
8338 "Missing context ids for alloc sizes");
8339 unsigned ContextIdIndex = 0;
8345 while (MIBsRead++ < NumMIBs) {
8347 unsigned NumContextSizeInfoEntries =
Record[
I++];
8349 std::vector<ContextTotalSize> ContextSizes;
8350 ContextSizes.reserve(NumContextSizeInfoEntries);
8351 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8352 assert(ContextIdIndex < PendingContextIds.size());
8354 if (PendingContextIds[ContextIdIndex] == 0) {
8363 ContextSizes.push_back(
8364 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8366 AllContextSizes.push_back(std::move(ContextSizes));
8368 PendingContextIds.clear();
8370 AllocInfo AI(std::move(MIBs));
8371 if (!AllContextSizes.empty()) {
8372 assert(AI.MIBs.size() == AllContextSizes.size());
8373 AI.ContextSizeInfos = std::move(AllContextSizes);
8376 if (MemProfAfterFunctionSummary)
8377 CurrentPrevailingFS->
addAlloc(std::move(AI));
8379 PendingAllocs.push_back(std::move(AI));
8387 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8389 std::vector<MIBInfo> MIBs;
8390 unsigned NumMIBs =
Record[
I++];
8391 unsigned NumVersions =
Record[
I++];
8392 unsigned MIBsRead = 0;
8393 while (MIBsRead++ < NumMIBs) {
8396 SmallVector<unsigned> StackIdList;
8398 StackIdList = parseAllocInfoContext(Record,
I);
8399 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8402 SmallVector<uint8_t> Versions;
8403 for (
unsigned J = 0; J < NumVersions; J++)
8406 AllocInfo AI(std::move(Versions), std::move(MIBs));
8407 if (MemProfAfterFunctionSummary)
8408 CurrentPrevailingFS->
addAlloc(std::move(AI));
8410 PendingAllocs.push_back(std::move(AI));
8420Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8424 SmallVector<uint64_t, 64>
Record;
8426 SmallString<128> ModulePath;
8433 BitstreamEntry
Entry = MaybeEntry.
get();
8435 switch (
Entry.Kind) {
8438 return error(
"Malformed block");
8450 switch (MaybeRecord.
get()) {
8455 uint64_t ModuleId =
Record[0];
8458 return error(
"Invalid code_entry record");
8460 LastSeenModule = TheIndex.
addModule(ModulePath);
8461 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8469 return error(
"Invalid hash length " + Twine(
Record.size()).str());
8470 if (!LastSeenModule)
8471 return error(
"Invalid hash that does not follow a module path");
8473 for (
auto &Val : Record) {
8474 assert(!(Val >> 32) &&
"Unexpected high bits set");
8475 LastSeenModule->
second[Pos++] = Val;
8478 LastSeenModule =
nullptr;
8491class BitcodeErrorCategoryType :
public std::error_category {
8492 const char *
name()
const noexcept
override {
8493 return "llvm.bitcode";
8496 std::string message(
int IE)
const override {
8499 case BitcodeError::CorruptedBitcode:
8500 return "Corrupted bitcode";
8509 static BitcodeErrorCategoryType ErrorCategory;
8510 return ErrorCategory;
8514 unsigned Block,
unsigned RecordID) {
8516 return std::move(Err);
8525 switch (Entry.Kind) {
8530 return error(
"Malformed block");
8534 return std::move(Err);
8544 if (MaybeRecord.
get() == RecordID)
8555Expected<std::vector<BitcodeModule>>
8559 return FOrErr.takeError();
8560 return std::move(FOrErr->Mods);
8585 switch (Entry.Kind) {
8588 return error(
"Malformed block");
8591 uint64_t IdentificationBit = -1ull;
8595 return std::move(Err);
8601 Entry = MaybeEntry.
get();
8606 return error(
"Malformed block");
8612 return std::move(Err);
8631 if (!
I.Strtab.empty())
8638 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8639 F.StrtabForSymtab = *Strtab;
8655 if (
F.Symtab.empty())
8656 F.Symtab = *SymtabOrErr;
8661 return std::move(Err);
8666 return std::move(E);
8681BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8682 bool ShouldLazyLoadMetadata,
bool IsImporting,
8686 std::string ProducerIdentification;
8687 if (IdentificationBit != -1ull) {
8689 return std::move(JumpFailed);
8692 return std::move(
E);
8696 return std::move(JumpFailed);
8697 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8700 std::unique_ptr<Module>
M =
8701 std::make_unique<Module>(ModuleIdentifier,
Context);
8702 M->setMaterializer(R);
8705 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8706 IsImporting, Callbacks))
8707 return std::move(Err);
8709 if (MaterializeAll) {
8711 if (
Error Err =
M->materializeAll())
8712 return std::move(Err);
8715 if (
Error Err =
R->materializeForwardReferencedFunctions())
8716 return std::move(Err);
8719 return std::move(M);
8722Expected<std::unique_ptr<Module>>
8725 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8740 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8741 ModulePath, IsPrevailing);
8742 return R.parseModule();
8749 return std::move(JumpFailed);
8751 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8752 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8753 ModuleIdentifier, 0);
8755 if (
Error Err = R.parseModule())
8756 return std::move(Err);
8758 return std::move(Index);
8764 return std::move(Err);
8770 return std::move(
E);
8772 switch (Entry.Kind) {
8775 return error(
"Malformed block");
8778 return std::make_pair(
false,
false);
8790 switch (MaybeBitCode.
get()) {
8796 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8798 bool EnableSplitLTOUnit = Flags & 0x8;
8799 bool UnifiedLTO = Flags & 0x200;
8800 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8811 return std::move(JumpFailed);
8814 return std::move(Err);
8819 return std::move(E);
8821 switch (Entry.Kind) {
8823 return error(
"Malformed block");
8834 return Flags.takeError();
8844 return std::move(Err);
8851 return StreamFailed.takeError();
8861 if (MsOrErr->size() != 1)
8862 return error(
"Expected a single module");
8864 return (*MsOrErr)[0];
8867Expected<std::unique_ptr<Module>>
8869 bool ShouldLazyLoadMetadata,
bool IsImporting,
8875 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8880 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8881 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8883 IsImporting, Callbacks);
8885 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8891 return getModuleImpl(Context,
true,
false,
false, Callbacks);
8903 return BM->parseModule(Context, Callbacks);
8936 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
8945 return BM->getSummary();
8953 return BM->getLTOInfo();
8958 bool IgnoreEmptyThinLTOIndexFile) {
8963 if (IgnoreEmptyThinLTOIndexFile && !(*FileOrErr)->getBufferSize())
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static void getDecodedRelBFCallEdgeInfo(uint64_t RawFlags, uint64_t &RelBF, bool &HasTailCall)
static void upgradeDLLImportExportLinkage(GlobalValue *GV, unsigned Val)
static cl::opt< bool > PrintSummaryGUIDs("print-summary-global-ids", cl::init(false), cl::Hidden, cl::desc("Print the global id for each value when reading the module summary"))
static AtomicOrdering getDecodedOrdering(unsigned Val)
static std::pair< CalleeInfo::HotnessType, bool > getDecodedHotnessCallEdgeInfo(uint64_t RawFlags)
static FunctionSummary::FFlags getDecodedFFlags(uint64_t RawFlags)
static std::optional< CodeModel::Model > getDecodedCodeModel(unsigned Val)
static void setSpecialRefs(SmallVectorImpl< ValueInfo > &Refs, unsigned ROCnt, unsigned WOCnt)
static bool getDecodedDSOLocal(unsigned Val)
static bool convertToString(ArrayRef< uint64_t > Record, unsigned Idx, StrTy &Result)
Convert a string from a record into an std::string, return true on failure.
static GlobalVariable::UnnamedAddr getDecodedUnnamedAddrType(unsigned Val)
static void stripTBAA(Module *M)
static int getDecodedUnaryOpcode(unsigned Val, Type *Ty)
static Expected< std::string > readTriple(BitstreamCursor &Stream)
static void parseWholeProgramDevirtResolutionByArg(ArrayRef< uint64_t > Record, size_t &Slot, WholeProgramDevirtResolution &Wpd)
static uint64_t getRawAttributeMask(Attribute::AttrKind Val)
static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags, uint64_t Version)
static GlobalVarSummary::GVarFlags getDecodedGVarFlags(uint64_t RawFlags)
static Attribute::AttrKind getAttrFromCode(uint64_t Code)
static Expected< uint64_t > jumpToValueSymbolTable(uint64_t Offset, BitstreamCursor &Stream)
Helper to note and return the current location, and jump to the given offset.
static Expected< bool > hasObjCCategoryInModule(BitstreamCursor &Stream)
static GlobalValue::DLLStorageClassTypes getDecodedDLLStorageClass(unsigned Val)
static GEPNoWrapFlags toGEPNoWrapFlags(uint64_t Flags)
static void decodeLLVMAttributesForBitcode(AttrBuilder &B, uint64_t EncodedAttrs, uint64_t AttrIdx)
This fills an AttrBuilder object with the LLVM attributes that have been decoded from the given integ...
static AtomicRMWInst::BinOp getDecodedRMWOperation(unsigned Val, bool &IsElementwise)
static void parseTypeIdSummaryRecord(ArrayRef< uint64_t > Record, StringRef Strtab, ModuleSummaryIndex &TheIndex)
static void addRawAttributeValue(AttrBuilder &B, uint64_t Val)
static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val)
static bool hasImplicitComdat(size_t Val)
static GlobalValue::LinkageTypes getDecodedLinkage(unsigned Val)
static Error hasInvalidBitcodeHeader(BitstreamCursor &Stream)
static Expected< std::string > readIdentificationCode(BitstreamCursor &Stream)
static int getDecodedBinaryOpcode(unsigned Val, Type *Ty)
static Expected< BitcodeModule > getSingleModule(MemoryBufferRef Buffer)
static Expected< bool > hasObjCCategory(BitstreamCursor &Stream)
static GlobalVariable::ThreadLocalMode getDecodedThreadLocalMode(unsigned Val)
static void parseWholeProgramDevirtResolution(ArrayRef< uint64_t > Record, StringRef Strtab, size_t &Slot, TypeIdSummary &TypeId)
static void inferDSOLocal(GlobalValue *GV)
static FastMathFlags getDecodedFastMathFlags(unsigned Val)
GlobalValue::SanitizerMetadata deserializeSanitizerMetadata(unsigned V)
static Expected< BitstreamCursor > initStream(MemoryBufferRef Buffer)
static cl::opt< bool > ExpandConstantExprs("expand-constant-exprs", cl::Hidden, cl::desc("Expand constant expressions to instructions for testing purposes"))
static bool upgradeOldMemoryAttribute(MemoryEffects &ME, uint64_t EncodedKind)
static Expected< StringRef > readBlobInRecord(BitstreamCursor &Stream, unsigned Block, unsigned RecordID)
static Expected< std::string > readIdentificationBlock(BitstreamCursor &Stream)
Read the "IDENTIFICATION_BLOCK_ID" block, do some basic enforcement on the "epoch" encoded in the bit...
static Expected< std::pair< bool, bool > > getEnableSplitLTOUnitAndUnifiedFlag(BitstreamCursor &Stream, unsigned ID)
static bool isConstExprSupported(const BitcodeConstant *BC)
static int getDecodedCastOpcode(unsigned Val)
static Expected< std::string > readModuleTriple(BitstreamCursor &Stream)
static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static StringRef getOpcodeName(uint8_t Opcode, uint8_t OpcodeBase)
This file defines the DenseMap class.
Provides ErrorOr<T> smart pointer.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Module.h This file contains the declarations for the Module class.
static constexpr Value * getValue(Ty &ValueOrUse)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Machine Check Debug Module
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines the SmallString class.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
PointerType * getType() const
Overload to return most specific pointer type.
void setUsedWithInAlloca(bool V)
Specify whether this alloca is used to represent the arguments to a call.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
static bool isValidFailureOrdering(AtomicOrdering Ordering)
static AtomicOrdering getStrongestFailureOrdering(AtomicOrdering SuccessOrdering)
Returns the strongest permitted ordering on failure, given the desired ordering on success.
static bool isValidSuccessOrdering(AtomicOrdering Ordering)
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
static bool isTypeAttrKind(AttrKind Kind)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
@ None
No attributes have been set.
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
@ EndAttrKinds
Sentinel value useful for loops.
LLVM Basic Block Representation.
const Instruction & back() const
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI void replacePhiUsesWith(BasicBlock *Old, BasicBlock *New)
Update all phi nodes in this basic block to refer to basic block New instead of basic block Old.
LLVM_ABI SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
void moveBefore(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it into the function that MovePos lives ...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Represents a module in a bitcode file.
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getSummary()
Parse the specified bitcode buffer, returning the module summary index.
LLVM_ABI Expected< BitcodeLTOInfo > getLTOInfo()
Returns information about the module to be used for LTO: whether to compile with ThinLTO,...
LLVM_ABI Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(GlobalValue::GUID)> IsPrevailing=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata, bool IsImporting, ParserCallbacks Callbacks={})
Read the bitcode module and prepare for lazy deserialization of function bodies.
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
void push_back(Value *V, unsigned TypeID)
void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV)
Error assignValue(unsigned Idx, Value *V, unsigned TypeID)
void shrinkTo(unsigned N)
unsigned getTypeID(unsigned ValNo) const
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
ArrayRef< uint8_t > getBitcodeBytes() const
Expected< word_t > Read(unsigned NumBits)
Expected< BitstreamEntry > advance(unsigned Flags=0)
Advance the current bitstream, returning the next entry in the stream.
Expected< BitstreamEntry > advanceSkippingSubblocks(unsigned Flags=0)
This is a convenience function for clients that don't expect any subblocks.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP=nullptr)
Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
Error SkipBlock()
Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body of this block.
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
uint64_t getCurrentByteNo() const
LLVM_ABI Expected< std::optional< BitstreamBlockInfo > > ReadBlockInfoBlock(bool ReadBlockInfoNames=false)
Read and return a block info block from the bitstream.
unsigned getAbbrevIDWidth() const
Return the number of bits used to encode an abbrev #.
bool canSkipToPos(size_t pos) const
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
@ MIN_BYTE_BITS
Minimum number of bits that can be specified.
@ MAX_BYTE_BITS
Maximum number of bits that can be specified Note that bit width is stored in the Type classes Subcla...
static LLVM_ABI ByteType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing a ByteType.
bool isInlineAsm() const
Check if this call is an inline asm statement.
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CaptureInfo createFromIntValue(uint32_t Data)
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
bool isFPPredicate() const
bool isIntPredicate() const
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
static CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
static LLVM_ABI bool isElementTypeCompatible(Type *Ty)
Return true if a ConstantDataSequential can be formed with a vector or array of the specified element...
static Constant * getRaw(StringRef Data, uint64_t NumElements, Type *ElementTy)
getRaw() constructor - Return a constant with vector type with an element count and element type matc...
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static LLVM_ABI bool isSupportedBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is supported.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI bool isSupportedCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is supported.
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
static LLVM_ABI bool isOrderedRanges(ArrayRef< ConstantRange > RangesRef)
LLVM_ABI bool isUpperSignWrapped() const
Return true if the (exclusive) upper bound wraps around the signed domain.
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
static LLVM_ABI Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
static DeadOnReturnInfo createFromIntValue(uint64_t Data)
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Base class for error info classes.
virtual std::string message() const
Return the error message as a string.
virtual std::error_code convertToErrorCode() const =0
Convert this error to a std::error_code.
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
Convenience struct for specifying and reasoning about fast-math flags.
void setFast(bool B=true)
void setAllowContract(bool B=true)
void setAllowReciprocal(bool B=true)
void setNoSignedZeros(bool B=true)
void setNoNaNs(bool B=true)
void setAllowReassoc(bool B=true)
Flag setters.
void setApproxFunc(bool B=true)
void setNoInfs(bool B=true)
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
void addCallsite(CallsiteInfo &&Callsite)
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
void addAlloc(AllocInfo &&Alloc)
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
BasicBlockListType::iterator iterator
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags noUnsignedSignedWrap()
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
static LLVM_ABI GlobalIFunc * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Resolver, Module *Parent)
If a parent module is specified, the ifunc is automatically inserted into the end of the specified mo...
LLVM_ABI void setComdat(Comdat *C)
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
void setOriginalName(GlobalValue::GUID Name)
Initialize the original name hash in this summary.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
static bool isLocalLinkage(LinkageTypes Linkage)
void setUnnamedAddr(UnnamedAddr Val)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
bool hasLocalLinkage() const
bool hasDefaultVisibility() const
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
void setDLLStorageClass(DLLStorageClassTypes C)
void setThreadLocalMode(ThreadLocalMode Val)
bool hasExternalWeakLinkage() const
DLLStorageClassTypes
Storage classes of global values for PE targets.
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
void setDSOLocal(bool Local)
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
static LLVM_ABI std::string getGlobalIdentifier(StringRef Name, GlobalValue::LinkageTypes Linkage, StringRef FileName)
Return the modified name for a global value suitable to be used as the key for a global lookup (e....
void setVisibility(VisibilityTypes V)
LLVM_ABI void setSanitizerMetadata(SanitizerMetadata Meta)
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AppendingLinkage
Special purpose, only applies to global arrays.
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
LLVM_ABI void setPartition(StringRef Part)
void setAttributes(AttributeSet A)
Set attribute list for this global.
LLVM_ABI void setCodeModel(CodeModel::Model CM)
Change the code model for this global.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
LLVM_ABI void addDestination(BasicBlock *Dest)
Add a destination.
static IndirectBrInst * Create(Value *Address, unsigned NumDests, InsertPosition InsertBefore=nullptr)
unsigned getNumDestinations() const
return the number of possible destinations in this indirectbr instruction.
static LLVM_ABI InlineAsm * get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack=false, AsmDialect asmDialect=AD_ATT, bool canThrow=false)
InlineAsm::get - Return the specified uniqued inline asm string.
std::vector< ConstraintInfo > ConstraintInfoVector
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB)
Replace specified successor OldBB to point at the provided block.
const char * getOpcodeName() const
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This is an important class for using LLVM in a threaded context.
static LLVM_ABI LandingPadInst * Create(Type *RetTy, unsigned NumReservedClauses, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedClauses is a hint for the number of incoming clauses that this landingpad w...
LLVM_ABI void addClause(Constant *ClauseVal)
Add a catch or filter clause to the landing pad.
void setCleanup(bool V)
Indicate that this landingpad instruction is a cleanup.
LLVM_ABI StringRef getString() const
ValueT lookup(const KeyT &Key) const
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
size_t getBufferSize() const
StringRef getBufferIdentifier() const
const char * getBufferStart() const
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
static MemoryEffectsBase readOnly()
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase errnoMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase createFromIntValue(uint32_t Data)
static MemoryEffectsBase writeOnly()
static MemoryEffectsBase otherMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase none()
static MemoryEffectsBase unknown()
Class to hold module path string table and global value map, and encapsulate methods for operating on...
TypeIdSummary & getOrInsertTypeIdSummary(StringRef TypeId)
Return an existing or new TypeIdSummary entry for TypeId.
ModulePathStringTableTy::value_type ModuleInfo
ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID)
Return a ValueInfo for GUID.
static constexpr uint64_t BitcodeSummaryVersion
StringRef saveString(StringRef String)
LLVM_ABI void setFlags(uint64_t Flags)
CfiFunctionIndex & cfiFunctionDecls()
void addBlockCount(uint64_t C)
ModuleInfo * addModule(StringRef ModPath, ModuleHash Hash=ModuleHash{{0}})
Add a new module with the given Hash, mapped to the given ModID, and return a reference to the module...
void addGlobalValueSummary(const GlobalValue &GV, std::unique_ptr< GlobalValueSummary > Summary)
Add a global value summary for a value.
CfiFunctionIndex & cfiFunctionDefs()
GlobalValueSummary * findSummaryInModule(ValueInfo VI, StringRef ModuleId) const
Find the summary for ValueInfo VI in module ModuleId, or nullptr if not found.
unsigned addOrGetStackIdIndex(uint64_t StackId)
ModuleInfo * getModule(StringRef ModPath)
Return module entry for module with the given ModPath.
void addOriginalName(GlobalValue::GUID ValueGUID, GlobalValue::GUID OrigGUID)
Add an original name for the value of the given GUID.
TypeIdCompatibleVtableInfo & getOrInsertTypeIdCompatibleVtableSummary(StringRef TypeId)
Return an existing or new TypeIdCompatibleVtableMap entry for TypeId.
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
NamedMDNode * getNamedMetadata(StringRef Name) const
Return the first NamedMDNode in the module with the specified name.
NamedMDNode * getOrInsertNamedMetadata(StringRef Name)
Return the named MDNode in the module with the specified name.
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
static ResumeInst * Create(Value *Exn, InsertPosition InsertBefore=nullptr)
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
ArrayRef< int > getShuffleMask() const
void append(StringRef RHS)
Append from a StringRef.
StringRef str() const
Explicit conversion to StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
constexpr bool empty() const
Check if the string is empty.
constexpr size_t size() const
Get the string size.
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
LLVM_ABI void setName(StringRef Name)
Change the name of this type to the specified name, or to a name with a suffix if there is a collisio...
LLVM_ABI Error setBodyOrError(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type or return an error if it would make the type recursive.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
LLVM_ABI bool visitTBAAMetadata(const Instruction *I, const MDNode *MD)
Visit an instruction, or a TBAA node itself as part of a metadata, and return true if it is valid,...
@ HasZeroInit
zeroinitializer is valid for this target extension type.
static LLVM_ABI Expected< TargetExtType * > getOrError(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters,...
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI Type * getStructElementType(unsigned N) const
bool isVectorTy() const
True if this is an instance of VectorType.
bool isArrayTy() const
True if this is an instance of ArrayType.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
bool isLabelTy() const
Return true if this is 'label'.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
Type * getArrayElementType() const
LLVM_ABI unsigned getStructNumElements() const
LLVM_ABI uint64_t getArrayNumElements() const
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isStructTy() const
True if this is an instance of StructType.
bool isByteOrByteVectorTy() const
Return true if this is a byte type or a vector of byte types.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
bool isVoidTy() const
Return true if this is 'void'.
bool isMetadataTy() const
Return true if this is 'metadata'.
static LLVM_ABI UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
const ParentTy * getParent() const
self_iterator getIterator()
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
constexpr uint8_t RecordLength
Length of the parts of a physical GOFF record.
@ BasicBlock
Various leaf nodes.
LLVM_ABI AttributeList getAttributes(LLVMContext &C, ID id, FunctionType *FT)
Return the attributes for an intrinsic.
@ SingleThread
Synchronized with respect to signal handlers executing in the same thread.
@ System
Synchronized with respect to all concurrently executing threads.
@ TYPE_CODE_OPAQUE_POINTER
@ FS_CONTEXT_RADIX_TREE_ARRAY
@ FS_COMBINED_GLOBALVAR_INIT_REFS
@ FS_TYPE_CHECKED_LOAD_VCALLS
@ FS_COMBINED_ORIGINAL_NAME
@ FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_CONST_VCALL
@ FS_PERMODULE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_VCALLS
@ FS_COMBINED_ALLOC_INFO_NO_CONTEXT
@ FS_COMBINED_CALLSITE_INFO
@ FS_PERMODULE_CALLSITE_INFO
@ FS_PERMODULE_ALLOC_INFO
@ FS_TYPE_CHECKED_LOAD_CONST_VCALL
@ IDENTIFICATION_CODE_EPOCH
@ IDENTIFICATION_CODE_STRING
@ CST_CODE_CE_INBOUNDS_GEP
@ CST_CODE_INLINEASM_OLD3
@ CST_CODE_CE_GEP_WITH_INRANGE_INDEX_OLD
@ CST_CODE_DSO_LOCAL_EQUIVALENT
@ CST_CODE_INLINEASM_OLD2
@ CST_CODE_CE_GEP_WITH_INRANGE
@ VST_CODE_COMBINED_ENTRY
@ COMDAT_SELECTION_KIND_LARGEST
@ COMDAT_SELECTION_KIND_ANY
@ COMDAT_SELECTION_KIND_SAME_SIZE
@ COMDAT_SELECTION_KIND_EXACT_MATCH
@ COMDAT_SELECTION_KIND_NO_DUPLICATES
@ ATTR_KIND_STACK_PROTECT
@ ATTR_KIND_STACK_PROTECT_STRONG
@ ATTR_KIND_SANITIZE_MEMORY
@ ATTR_KIND_OPTIMIZE_FOR_SIZE
@ ATTR_KIND_INACCESSIBLEMEM_ONLY
@ ATTR_KIND_FNRETTHUNK_EXTERN
@ ATTR_KIND_NO_DIVERGENCE_SOURCE
@ ATTR_KIND_SANITIZE_ADDRESS
@ ATTR_KIND_NO_IMPLICIT_FLOAT
@ ATTR_KIND_DEAD_ON_UNWIND
@ ATTR_KIND_STACK_ALIGNMENT
@ ATTR_KIND_INACCESSIBLEMEM_OR_ARGMEMONLY
@ ATTR_KIND_STACK_PROTECT_REQ
@ ATTR_KIND_NULL_POINTER_IS_VALID
@ ATTR_KIND_SANITIZE_HWADDRESS
@ ATTR_KIND_RETURNS_TWICE
@ ATTR_KIND_SHADOWCALLSTACK
@ ATTR_KIND_OPT_FOR_FUZZING
@ ATTR_KIND_DENORMAL_FPENV
@ ATTR_KIND_SANITIZE_NUMERICAL_STABILITY
@ ATTR_KIND_ALLOCATED_POINTER
@ ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION
@ ATTR_KIND_CORO_ELIDE_SAFE
@ ATTR_KIND_NON_LAZY_BIND
@ ATTR_KIND_DEREFERENCEABLE
@ ATTR_KIND_OPTIMIZE_NONE
@ ATTR_KIND_DEREFERENCEABLE_OR_NULL
@ ATTR_KIND_SANITIZE_REALTIME
@ ATTR_KIND_SPECULATIVE_LOAD_HARDENING
@ ATTR_KIND_ALWAYS_INLINE
@ ATTR_KIND_SANITIZE_TYPE
@ ATTR_KIND_PRESPLIT_COROUTINE
@ ATTR_KIND_SANITIZE_ALLOC_TOKEN
@ ATTR_KIND_NO_SANITIZE_COVERAGE
@ ATTR_KIND_NO_CREATE_UNDEF_OR_POISON
@ ATTR_KIND_DEAD_ON_RETURN
@ ATTR_KIND_SANITIZE_REALTIME_BLOCKING
@ ATTR_KIND_NO_SANITIZE_BOUNDS
@ ATTR_KIND_SANITIZE_MEMTAG
@ ATTR_KIND_CORO_ONLY_DESTROY_WHEN_COMPLETE
@ ATTR_KIND_SANITIZE_THREAD
@ ATTR_KIND_OPTIMIZE_FOR_DEBUGGING
@ SYNC_SCOPE_NAMES_BLOCK_ID
@ PARAMATTR_GROUP_BLOCK_ID
@ IDENTIFICATION_BLOCK_ID
@ GLOBALVAL_SUMMARY_BLOCK_ID
@ FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID
@ OPERAND_BUNDLE_TAGS_BLOCK_ID
@ BLOCKINFO_BLOCK_ID
BLOCKINFO_BLOCK is used to define metadata about blocks, for example, standard abbrevs that should be...
@ MODULE_CODE_SOURCE_FILENAME
@ MODULE_CODE_SECTIONNAME
@ FUNC_CODE_INST_ATOMICRMW_OLD
@ FUNC_CODE_INST_CATCHRET
@ FUNC_CODE_INST_LANDINGPAD
@ FUNC_CODE_INST_EXTRACTVAL
@ FUNC_CODE_INST_CATCHPAD
@ FUNC_CODE_INST_CATCHSWITCH
@ FUNC_CODE_INST_INBOUNDS_GEP_OLD
@ FUNC_CODE_INST_STOREATOMIC_OLD
@ FUNC_CODE_INST_CLEANUPRET
@ FUNC_CODE_INST_LANDINGPAD_OLD
@ FUNC_CODE_DEBUG_RECORD_VALUE
@ FUNC_CODE_INST_LOADATOMIC
@ FUNC_CODE_DEBUG_RECORD_ASSIGN
@ FUNC_CODE_INST_STOREATOMIC
@ FUNC_CODE_INST_ATOMICRMW
@ FUNC_CODE_DEBUG_RECORD_DECLARE_VALUE
@ FUNC_CODE_DEBUG_LOC_AGAIN
@ FUNC_CODE_INST_EXTRACTELT
@ FUNC_CODE_INST_INDIRECTBR
@ FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE
@ FUNC_CODE_INST_INSERTVAL
@ FUNC_CODE_DECLAREBLOCKS
@ FUNC_CODE_DEBUG_RECORD_LABEL
@ FUNC_CODE_INST_INSERTELT
@ FUNC_CODE_BLOCKADDR_USERS
@ FUNC_CODE_INST_CLEANUPPAD
@ FUNC_CODE_INST_SHUFFLEVEC
@ FUNC_CODE_INST_STORE_OLD
@ FUNC_CODE_INST_UNREACHABLE
@ FUNC_CODE_INST_CMPXCHG_OLD
@ FUNC_CODE_DEBUG_RECORD_DECLARE
@ FUNC_CODE_OPERAND_BUNDLE
@ PARAMATTR_CODE_ENTRY_OLD
@ PARAMATTR_GRP_CODE_ENTRY
initializer< Ty > init(const Ty &Val)
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
NodeAddr< FuncNode * > Func
friend class Instruction
Iterator for Instructions in a `BasicBlock.
constexpr bool IsBigEndianHost
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
FunctionAddr VTableAddr Value
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
StringMapEntry< Value * > ValueName
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
LLVM_ABI const std::error_category & BitcodeErrorCategory()
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
LLVM_ABI void UpgradeInlineAsmString(std::string *AsmStr)
Upgrade comment in call to inline asm that represents an objc retain release marker.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
std::error_code make_error_code(BitcodeError E)
LLVM_ABI bool stripDebugInfo(Function &F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Expected< bool > isBitcodeContainingObjCCategory(MemoryBufferRef Buffer)
Return true if Buffer contains a bitcode file with ObjC code (category or class) in it.
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI void UpgradeAttributes(AttrBuilder &B)
Upgrade attributes that changed format or kind.
LLVM_ABI Expected< std::string > getBitcodeTargetTriple(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the triple information.
LLVM_ABI std::unique_ptr< Module > parseModule(const uint8_t *Data, size_t Size, LLVMContext &Context)
Fuzzer friendly interface for the llvm bitcode parser.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI Expected< BitcodeFileContents > getBitcodeFileContents(MemoryBufferRef Buffer)
Returns the contents of a bitcode file.
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
LLVM_ABI bool UpgradeCFIFunctionsMetadata(Module &M)
Upgrade the cfi.functions metadata node by calculating and inserting the GUID for each function entry...
LLVM_ABI void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
auto uninitialized_copy(R &&Src, IterTy Dst)
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
bool isa_and_nonnull(const Y &Val)
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
LLVM_ABI void UpgradeOperandBundles(std::vector< OperandBundleDef > &OperandBundles)
Upgrade operand bundles (without knowing about their user instruction).
LLVM_ABI Constant * UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy)
This is an auto-upgrade for bitcast constant expression between pointers with different address space...
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndex(MemoryBufferRef Buffer)
Parse the specified bitcode buffer, returning the module summary index.
auto dyn_cast_or_null(const Y &Val)
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
FunctionAddr VTableAddr uintptr_t uintptr_t Version
LLVM_ABI Expected< std::string > getBitcodeProducerString(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the producer string information.
auto reverse(ContainerTy &&C)
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyBitcodeModule(MemoryBufferRef Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Read the header of the specified bitcode buffer and prepare for lazy deserialization of function bodi...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
detail::ValueMatchesPoly< M > HasValue(M Matcher)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI std::string UpgradeDataLayoutString(StringRef DL, StringRef Triple)
Upgrade the datalayout string by adding a section for address space pointers.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
LLVM_ABI Expected< BitcodeLTOInfo > getBitcodeLTOInfo(MemoryBufferRef Buffer)
Returns LTO information for the specified bitcode file.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI GlobalVariable * UpgradeGlobalVariable(GlobalVariable *GV)
This checks for global variables which should be upgraded.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
AtomicOrdering
Atomic ordering for LLVM's memory model.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
@ ArgMem
Access to memory via argument pointers.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
LLVM_ABI Instruction * UpgradeBitCastInst(unsigned Opc, Value *V, Type *DestTy, Instruction *&Temp)
This is an auto-upgrade for bitcast between pointers with different address spaces: the instruction i...
MaybeAlign decodeMaybeAlign(unsigned Value)
Dual operation of the encode function above.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr, const unsigned char *&BufEnd, bool VerifyBufferSize)
SkipBitcodeWrapperHeader - Some systems wrap bc files with a special header for padding or other reas...
bool isBitcodeWrapper(const unsigned char *BufPtr, const unsigned char *BufEnd)
isBitcodeWrapper - Return true if the given bytes are the magic bytes for an LLVM IR bitcode wrapper.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI APInt readWideAPInt(ArrayRef< uint64_t > Vals, unsigned TypeBits)
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
LLVM_ABI void UpgradeFunctionAttributes(Function &F)
Correct any IR that is relying on old function attribute behavior.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
LLVM_ABI Error readModuleSummaryIndex(MemoryBufferRef Buffer, ModuleSummaryIndex &CombinedIndex)
Parse the specified bitcode buffer and merge the index into CombinedIndex.
LLVM_ABI void UpgradeARCRuntime(Module &M)
Convert calls to ARC runtime functions to intrinsic calls and upgrade the old retain release marker t...
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndexForFile(StringRef Path, bool IgnoreEmptyThinLTOIndexFile=false)
Parse the module summary index out of an IR file and return the module summary index object if found,...
LLVM_ABI Expected< std::unique_ptr< Module > > getOwningLazyBitcodeModule(std::unique_ptr< MemoryBuffer > &&Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Like getLazyBitcodeModule, except that the module takes ownership of the memory buffer if successful.
LLVM_ABI std::error_code errorToErrorCodeAndEmitErrors(LLVMContext &Ctx, Error Err)
Implement std::hash so that hash_code can be used in STL containers.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Basic information extracted from a bitcode module to be used for LTO.
static Bitfield::Type get(StorageType Packed)
Unpacks the field from the Packed value.
When advancing through a bitstream cursor, each advance can discover a few different kinds of entries...
static constexpr DenormalFPEnv createFromIntValue(uint32_t Data)
Flags specific to function summaries.
static constexpr uint32_t RangeWidth
std::vector< Call > Calls
In the per-module summary, it summarizes the byte offset applied to each pointer parameter before pas...
ConstantRange Use
The range contains byte offsets from the parameter pointer which accessed by the function.
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
static LLVM_ABI const char * BranchWeights
std::optional< ValueTypeCallbackTy > ValueType
The ValueType callback is called for every function definition or declaration and allows accessing th...
std::optional< DataLayoutCallbackFuncTy > DataLayout
std::optional< MDTypeCallbackTy > MDType
The MDType callback is called for every value in metadata.
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