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;
584 std::optional<Triple> TargetTriple;
589 bool SeenValueSymbolTable =
false;
592 std::vector<std::string> SectionTable;
593 std::vector<std::string> GCTable;
595 std::vector<Type *> TypeList;
599 DenseMap<unsigned, SmallVector<unsigned, 1>> ContainedTypeIDs;
606 DenseMap<std::pair<Type *, unsigned>,
unsigned> VirtualTypeIDs;
607 DenseMap<Function *, unsigned> FunctionTypeIDs;
612 BitcodeReaderValueList ValueList;
613 std::optional<MetadataLoader> MDLoader;
614 std::vector<Comdat *> ComdatList;
615 DenseSet<GlobalObject *> ImplicitComdatObjects;
618 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInits;
619 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInits;
621 struct FunctionOperandInfo {
623 unsigned PersonalityFn;
627 std::vector<FunctionOperandInfo> FunctionOperands;
631 std::vector<AttributeList> MAttributes;
634 std::map<unsigned, AttributeList> MAttributeGroups;
638 std::vector<BasicBlock*> FunctionBBs;
642 std::vector<Function*> FunctionsWithBodies;
646 DenseMap<Function *, Function *> UpgradedIntrinsics;
651 bool SeenFirstFunctionBody =
false;
655 DenseMap<Function*, uint64_t> DeferredFunctionInfo;
660 std::vector<uint64_t> DeferredMetadataInfo;
665 DenseMap<Function *, std::vector<BasicBlock *>> BasicBlockFwdRefs;
666 std::deque<Function *> BasicBlockFwdRefQueue;
673 std::vector<Function *> BackwardRefFunctions;
681 bool UseRelativeIDs =
false;
685 bool WillMaterializeAllForwardRefs =
false;
689 bool SeenDebugIntrinsic =
false;
690 bool SeenDebugRecord =
false;
693 TBAAVerifier TBAAVerifyHelper;
695 std::vector<std::string> BundleTags;
698 std::optional<ValueTypeCallbackTy> ValueTypeCallback;
701 std::vector<GlobalValue::GUID> GUIDList;
707 bool SkipDebugIntrinsicUpgrade =
false;
710 BitcodeReader(BitstreamCursor Stream, StringRef Strtab,
711 StringRef ProducerIdentification, LLVMContext &
Context);
713 Error materializeForwardReferencedFunctions();
715 Error materialize(GlobalValue *GV)
override;
716 Error materializeModule()
override;
717 std::vector<StructType *> getIdentifiedStructTypes()
const override;
721 Error parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
722 bool IsImporting, ParserCallbacks Callbacks = {});
727 Error materializeMetadata()
override;
729 void setStripDebugInfo()
override;
732 std::vector<StructType *> IdentifiedStructTypes;
733 StructType *createIdentifiedStructType(LLVMContext &
Context, StringRef Name);
734 StructType *createIdentifiedStructType(LLVMContext &
Context);
736 static constexpr unsigned InvalidTypeID = ~0
u;
738 Type *getTypeByID(
unsigned ID);
739 Type *getPtrElementTypeByID(
unsigned ID);
740 unsigned getContainedTypeID(
unsigned ID,
unsigned Idx = 0);
741 unsigned getVirtualTypeID(
Type *Ty, ArrayRef<unsigned> ContainedTypeIDs = {});
744 Expected<Value *> materializeValue(
unsigned ValID, BasicBlock *InsertBB);
745 Expected<Constant *> getValueForInitializer(
unsigned ID);
747 Value *getFnValueByID(
unsigned ID,
Type *Ty,
unsigned TyID,
748 BasicBlock *ConstExprInsertBB) {
754 Metadata *getFnMetadataByID(
unsigned ID) {
755 return MDLoader->getMetadataFwdRefOrLoad(ID);
758 BasicBlock *getBasicBlock(
unsigned ID)
const {
759 if (ID >= FunctionBBs.size())
return nullptr;
760 return FunctionBBs[
ID];
764 if (i-1 < MAttributes.size())
765 return MAttributes[i-1];
766 return AttributeList();
772 bool getValueTypePair(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
773 unsigned InstNum,
Value *&ResVal,
unsigned &
TypeID,
774 BasicBlock *ConstExprInsertBB) {
775 if (Slot ==
Record.size())
return true;
776 unsigned ValNo = (unsigned)Record[Slot++];
779 ValNo = InstNum - ValNo;
780 if (ValNo < InstNum) {
784 ResVal = getFnValueByID(ValNo,
nullptr,
TypeID, ConstExprInsertBB);
786 "Incorrect type ID stored for value");
787 return ResVal ==
nullptr;
789 if (Slot ==
Record.size())
792 TypeID = (unsigned)Record[Slot++];
793 ResVal = getFnValueByID(ValNo, getTypeByID(
TypeID),
TypeID,
795 return ResVal ==
nullptr;
798 bool getValueOrMetadata(
const SmallVectorImpl<uint64_t> &Record,
799 unsigned &Slot,
unsigned InstNum,
Value *&ResVal,
800 BasicBlock *ConstExprInsertBB) {
801 if (Slot ==
Record.size())
806 return getValueTypePair(Record, --Slot, InstNum, ResVal, TypeId,
809 if (Slot ==
Record.size())
811 unsigned ValNo = InstNum - (unsigned)Record[Slot++];
819 bool popValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
820 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
821 BasicBlock *ConstExprInsertBB) {
822 if (
getValue(Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
830 bool getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
831 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
832 BasicBlock *ConstExprInsertBB) {
833 ResVal =
getValue(Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
834 return ResVal ==
nullptr;
839 Value *
getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
840 unsigned InstNum,
Type *Ty,
unsigned TyID,
841 BasicBlock *ConstExprInsertBB) {
842 if (Slot ==
Record.size())
return nullptr;
843 unsigned ValNo = (unsigned)Record[Slot];
846 ValNo = InstNum - ValNo;
847 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
851 Value *getValueSigned(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
852 unsigned InstNum,
Type *Ty,
unsigned TyID,
853 BasicBlock *ConstExprInsertBB) {
854 if (Slot ==
Record.size())
return nullptr;
855 unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]);
858 ValNo = InstNum - ValNo;
859 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
862 Expected<ConstantRange> readConstantRange(ArrayRef<uint64_t> Record,
865 if (
Record.size() - OpNum < 2)
866 return error(
"Too few records for range");
868 unsigned LowerActiveWords =
Record[OpNum];
869 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
870 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
871 return error(
"Too few records for range");
874 OpNum += LowerActiveWords;
877 OpNum += UpperActiveWords;
880 int64_t
Start = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
881 int64_t End = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
882 return ConstantRange(APInt(
BitWidth, Start,
true),
887 Expected<ConstantRange>
888 readBitWidthAndConstantRange(ArrayRef<uint64_t> Record,
unsigned &OpNum) {
889 if (
Record.size() - OpNum < 1)
890 return error(
"Too few records for range");
892 return readConstantRange(Record, OpNum,
BitWidth);
896 const Triple &getTargetTriple() {
898 BitstreamCursor TripleStream(Stream.getBitcodeBytes());
899 if (Expected<std::string> TripleStr =
readTriple(TripleStream))
900 TargetTriple.emplace(std::move(*TripleStr));
903 TargetTriple.emplace();
906 return *TargetTriple;
912 Error propagateAttributeTypes(CallBase *CB, ArrayRef<unsigned> ArgsTys);
918 Error parseAttrKind(
uint64_t Code, Attribute::AttrKind *Kind);
920 ParserCallbacks Callbacks = {});
922 Error parseComdatRecord(ArrayRef<uint64_t> Record);
923 Error parseGlobalVarRecord(ArrayRef<uint64_t> Record);
924 Error parseFunctionRecord(ArrayRef<uint64_t> Record);
925 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
926 ArrayRef<uint64_t> Record);
928 Error parseAttributeBlock();
929 Error parseAttributeGroupBlock();
930 Error parseTypeTable();
931 Error parseTypeTableBody();
932 Error parseOperandBundleTags();
933 Error parseSyncScopeNames();
935 Expected<Value *> recordValue(SmallVectorImpl<uint64_t> &Record,
936 unsigned NameIndex, Triple &TT);
937 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
Function *
F,
938 ArrayRef<uint64_t> Record);
940 Error parseGlobalValueSymbolTable();
941 Error parseConstants();
942 Error rememberAndSkipFunctionBodies();
943 Error rememberAndSkipFunctionBody();
945 Error rememberAndSkipMetadata();
948 Error globalCleanup();
949 Error resolveGlobalAndIndirectSymbolInits();
950 Error parseUseLists();
951 Error findFunctionInStream(
953 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator);
960class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
962 ModuleSummaryIndex &TheIndex;
966 bool SeenGlobalValSummary =
false;
969 bool SeenValueSymbolTable =
false;
983 DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
984 ValueIdToValueInfoMap;
990 DenseMap<uint64_t, StringRef> ModuleIdMap;
993 std::string SourceFileName;
997 StringRef ModulePath;
1001 std::function<bool(StringRef)> IsPrevailing =
nullptr;
1004 std::function<void(ValueInfo)> OnValueInfo =
nullptr;
1008 std::vector<uint64_t> StackIds;
1012 std::vector<uint64_t> RadixArray;
1017 std::vector<unsigned> StackIdToIndex;
1020 std::vector<uint64_t> DefinedGUIDs;
1023 ModuleSummaryIndexBitcodeReader(
1024 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
1025 StringRef ModulePath,
1026 std::function<
bool(StringRef)> IsPrevailing =
nullptr,
1027 std::function<
void(ValueInfo)> OnValueInfo =
nullptr);
1034 StringRef SourceFileName);
1035 Error parseValueSymbolTable(
1037 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
1040 makeCallList(ArrayRef<uint64_t> Record,
bool IsOldProfileFormat,
1041 bool HasProfile,
bool HasRelBF);
1042 Error parseEntireSummary(
unsigned ID);
1043 Error parseModuleStringTable();
1044 void parseTypeIdCompatibleVtableSummaryRecord(ArrayRef<uint64_t> Record);
1045 void parseTypeIdCompatibleVtableInfo(ArrayRef<uint64_t> Record,
size_t &Slot,
1047 std::vector<FunctionSummary::ParamAccess>
1048 parseParamAccesses(ArrayRef<uint64_t> Record);
1049 SmallVector<unsigned> parseAllocInfoContext(ArrayRef<uint64_t> Record,
1053 static constexpr unsigned UninitializedStackIdIndex =
1054 std::numeric_limits<unsigned>::max();
1056 unsigned getStackIdIndex(
unsigned LocalIndex) {
1057 unsigned &
Index = StackIdToIndex[LocalIndex];
1060 if (Index == UninitializedStackIdIndex)
1065 template <
bool AllowNullValueInfo = false>
1066 std::pair<ValueInfo, GlobalValue::GUID>
1067 getValueInfoFromValueId(
unsigned ValueId);
1069 void addThisModule();
1085 return std::error_code();
1091 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1092 ValueList(this->Stream.SizeInBytes(),
1094 return materializeValue(
ValID, InsertBB);
1096 this->ProducerIdentification = std::string(ProducerIdentification);
1099Error BitcodeReader::materializeForwardReferencedFunctions() {
1100 if (WillMaterializeAllForwardRefs)
1104 WillMaterializeAllForwardRefs =
true;
1106 while (!BasicBlockFwdRefQueue.empty()) {
1107 Function *
F = BasicBlockFwdRefQueue.front();
1108 BasicBlockFwdRefQueue.pop_front();
1109 assert(
F &&
"Expected valid function");
1110 if (!BasicBlockFwdRefs.
count(
F))
1118 if (!
F->isMaterializable())
1119 return error(
"Never resolved function from blockaddress");
1122 if (
Error Err = materialize(
F))
1125 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1127 for (
Function *
F : BackwardRefFunctions)
1128 if (
Error Err = materialize(
F))
1130 BackwardRefFunctions.clear();
1133 WillMaterializeAllForwardRefs =
false;
1198 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1199 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1200 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1201 Flags.NoInline = (RawFlags >> 4) & 0x1;
1202 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1203 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1204 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1205 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1206 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1222 bool NoRenameOnPromotion = ((RawFlags >> 11) & 1);
1223 RawFlags = RawFlags >> 4;
1224 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1228 bool Live = (RawFlags & 0x2) || Version < 3;
1229 bool Local = (RawFlags & 0x4);
1230 bool AutoHide = (RawFlags & 0x8);
1233 Live,
Local, AutoHide, IK,
1234 NoRenameOnPromotion);
1240 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1241 (RawFlags & 0x4) ?
true :
false,
1245static std::pair<CalleeInfo::HotnessType, bool>
1249 bool HasTailCall = (RawFlags & 0x8);
1250 return {Hotness, HasTailCall};
1255 bool &HasTailCall) {
1256 static constexpr unsigned RelBlockFreqBits = 28;
1257 static constexpr uint64_t RelBlockFreqMask = (1 << RelBlockFreqBits) - 1;
1258 RelBF = RawFlags & RelBlockFreqMask;
1259 HasTailCall = (RawFlags & (1 << RelBlockFreqBits));
1284 case 0:
return false;
1285 case 1:
return true;
1347 bool IsFP = Ty->isFPOrFPVectorTy();
1349 if (!IsFP && !Ty->isIntOrIntVectorTy())
1356 return IsFP ? Instruction::FNeg : -1;
1361 bool IsFP = Ty->isFPOrFPVectorTy();
1363 if (!IsFP && !Ty->isIntOrIntVectorTy())
1370 return IsFP ? Instruction::FAdd : Instruction::Add;
1372 return IsFP ? Instruction::FSub : Instruction::Sub;
1374 return IsFP ? Instruction::FMul : Instruction::Mul;
1376 return IsFP ? -1 : Instruction::UDiv;
1378 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1380 return IsFP ? -1 : Instruction::URem;
1382 return IsFP ? Instruction::FRem : Instruction::SRem;
1384 return IsFP ? -1 : Instruction::Shl;
1386 return IsFP ? -1 : Instruction::LShr;
1388 return IsFP ? -1 : Instruction::AShr;
1390 return IsFP ? -1 : Instruction::And;
1392 return IsFP ? -1 : Instruction::Or;
1394 return IsFP ? -1 : Instruction::Xor;
1399 bool &IsElementwise) {
1497Type *BitcodeReader::getTypeByID(
unsigned ID) {
1499 if (ID >= TypeList.size())
1502 if (
Type *Ty = TypeList[ID])
1507 return TypeList[
ID] = createIdentifiedStructType(
Context);
1510unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1511 auto It = ContainedTypeIDs.
find(ID);
1512 if (It == ContainedTypeIDs.
end())
1513 return InvalidTypeID;
1515 if (Idx >= It->second.size())
1516 return InvalidTypeID;
1518 return It->second[Idx];
1521Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1522 if (ID >= TypeList.size())
1529 return getTypeByID(getContainedTypeID(ID, 0));
1532unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1533 ArrayRef<unsigned> ChildTypeIDs) {
1534 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1535 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1536 auto It = VirtualTypeIDs.
find(CacheKey);
1537 if (It != VirtualTypeIDs.
end()) {
1543 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1544 "Incorrect cached contained type IDs");
1548 unsigned TypeID = TypeList.size();
1549 TypeList.push_back(Ty);
1550 if (!ChildTypeIDs.
empty())
1571 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1585 if (Opcode == Instruction::GetElementPtr)
1589 case Instruction::FNeg:
1590 case Instruction::Select:
1591 case Instruction::ICmp:
1592 case Instruction::FCmp:
1599Expected<Value *> BitcodeReader::materializeValue(
unsigned StartValID,
1600 BasicBlock *InsertBB) {
1602 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1604 return ValueList[StartValID];
1606 SmallDenseMap<unsigned, Value *> MaterializedValues;
1607 SmallVector<unsigned> Worklist;
1609 while (!Worklist.
empty()) {
1610 unsigned ValID = Worklist.
back();
1611 if (MaterializedValues.
count(ValID)) {
1617 if (ValID >= ValueList.
size() || !ValueList[ValID])
1618 return error(
"Invalid value ID");
1620 Value *
V = ValueList[ValID];
1623 MaterializedValues.
insert({ValID,
V});
1631 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1632 auto It = MaterializedValues.
find(OpID);
1633 if (It != MaterializedValues.
end())
1634 Ops.push_back(It->second);
1641 if (
Ops.size() != BC->getOperandIDs().size())
1643 std::reverse(
Ops.begin(),
Ops.end());
1660 switch (BC->Opcode) {
1661 case BitcodeConstant::ConstantPtrAuthOpcode: {
1664 return error(
"ptrauth key operand must be ConstantInt");
1668 return error(
"ptrauth disc operand must be ConstantInt");
1671 ConstOps.
size() > 4 ? ConstOps[4]
1676 "ptrauth deactivation symbol operand must be a pointer");
1679 DeactivationSymbol);
1682 case BitcodeConstant::NoCFIOpcode: {
1685 return error(
"no_cfi operand must be GlobalValue");
1689 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1692 return error(
"dso_local operand must be GlobalValue");
1696 case BitcodeConstant::BlockAddressOpcode: {
1699 return error(
"blockaddress operand must be a function");
1704 unsigned BBID = BC->BlockAddressBB;
1707 return error(
"Invalid ID");
1710 for (
size_t I = 0,
E = BBID;
I !=
E; ++
I) {
1712 return error(
"Invalid ID");
1719 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1721 BasicBlockFwdRefQueue.push_back(Fn);
1722 if (FwdBBs.size() < BBID + 1)
1723 FwdBBs.resize(BBID + 1);
1731 case BitcodeConstant::ConstantStructOpcode: {
1733 if (
ST->getNumElements() != ConstOps.
size())
1734 return error(
"Invalid number of elements in struct initializer");
1736 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1737 if (
Op->getType() != Ty)
1738 return error(
"Incorrect type in struct initializer");
1743 case BitcodeConstant::ConstantArrayOpcode: {
1745 if (AT->getNumElements() != ConstOps.
size())
1746 return error(
"Invalid number of elements in array initializer");
1748 for (Constant *
Op : ConstOps)
1749 if (
Op->getType() != AT->getElementType())
1750 return error(
"Incorrect type in array initializer");
1755 case BitcodeConstant::ConstantVectorOpcode: {
1757 if (VT->getNumElements() != ConstOps.size())
1758 return error(
"Invalid number of elements in vector initializer");
1760 for (Constant *
Op : ConstOps)
1761 if (
Op->getType() != VT->getElementType())
1762 return error(
"Incorrect type in vector initializer");
1767 case Instruction::GetElementPtr:
1770 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1774 case Instruction::ExtractElement:
1777 case Instruction::InsertElement:
1781 case Instruction::ShuffleVector: {
1782 SmallVector<int, 16>
Mask;
1794 MaterializedValues.
insert({ValID,
C});
1800 return error(Twine(
"Value referenced by initializer is an unsupported "
1801 "constant expression of type ") +
1802 BC->getOpcodeName());
1808 BC->getType(),
"constexpr", InsertBB);
1811 "constexpr", InsertBB);
1814 Ops[1],
"constexpr", InsertBB);
1817 I->setHasNoSignedWrap();
1819 I->setHasNoUnsignedWrap();
1825 switch (BC->Opcode) {
1826 case BitcodeConstant::ConstantVectorOpcode: {
1827 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1830 Value *Idx = ConstantInt::get(IdxTy, Pair.index());
1837 case BitcodeConstant::ConstantStructOpcode:
1838 case BitcodeConstant::ConstantArrayOpcode: {
1842 "constexpr.ins", InsertBB);
1846 case Instruction::ICmp:
1847 case Instruction::FCmp:
1850 "constexpr", InsertBB);
1852 case Instruction::GetElementPtr:
1858 case Instruction::Select:
1861 case Instruction::ExtractElement:
1864 case Instruction::InsertElement:
1868 case Instruction::ShuffleVector:
1869 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1877 MaterializedValues.
insert({ValID,
I});
1881 return MaterializedValues[StartValID];
1884Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1885 Expected<Value *> MaybeV = materializeValue(ID,
nullptr);
1893StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1896 IdentifiedStructTypes.push_back(Ret);
1900StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1902 IdentifiedStructTypes.push_back(Ret);
1918 case Attribute::ZExt:
return 1 << 0;
1919 case Attribute::SExt:
return 1 << 1;
1920 case Attribute::NoReturn:
return 1 << 2;
1921 case Attribute::InReg:
return 1 << 3;
1922 case Attribute::StructRet:
return 1 << 4;
1923 case Attribute::NoUnwind:
return 1 << 5;
1924 case Attribute::NoAlias:
return 1 << 6;
1925 case Attribute::ByVal:
return 1 << 7;
1926 case Attribute::Nest:
return 1 << 8;
1927 case Attribute::ReadNone:
return 1 << 9;
1928 case Attribute::ReadOnly:
return 1 << 10;
1929 case Attribute::NoInline:
return 1 << 11;
1930 case Attribute::AlwaysInline:
return 1 << 12;
1931 case Attribute::OptimizeForSize:
return 1 << 13;
1932 case Attribute::StackProtect:
return 1 << 14;
1933 case Attribute::StackProtectReq:
return 1 << 15;
1934 case Attribute::Alignment:
return 31 << 16;
1936 case Attribute::NoRedZone:
return 1 << 22;
1937 case Attribute::NoImplicitFloat:
return 1 << 23;
1938 case Attribute::Naked:
return 1 << 24;
1939 case Attribute::InlineHint:
return 1 << 25;
1940 case Attribute::StackAlignment:
return 7 << 26;
1941 case Attribute::ReturnsTwice:
return 1 << 29;
1942 case Attribute::UWTable:
return 1 << 30;
1943 case Attribute::NonLazyBind:
return 1U << 31;
1944 case Attribute::SanitizeAddress:
return 1ULL << 32;
1945 case Attribute::MinSize:
return 1ULL << 33;
1946 case Attribute::NoDuplicate:
return 1ULL << 34;
1947 case Attribute::StackProtectStrong:
return 1ULL << 35;
1948 case Attribute::SanitizeThread:
return 1ULL << 36;
1949 case Attribute::SanitizeMemory:
return 1ULL << 37;
1950 case Attribute::NoBuiltin:
return 1ULL << 38;
1951 case Attribute::Returned:
return 1ULL << 39;
1952 case Attribute::Cold:
return 1ULL << 40;
1953 case Attribute::Builtin:
return 1ULL << 41;
1954 case Attribute::OptimizeNone:
return 1ULL << 42;
1955 case Attribute::InAlloca:
return 1ULL << 43;
1956 case Attribute::NonNull:
return 1ULL << 44;
1957 case Attribute::JumpTable:
return 1ULL << 45;
1958 case Attribute::Convergent:
return 1ULL << 46;
1959 case Attribute::SafeStack:
return 1ULL << 47;
1960 case Attribute::NoRecurse:
return 1ULL << 48;
1963 case Attribute::SwiftSelf:
return 1ULL << 51;
1964 case Attribute::SwiftError:
return 1ULL << 52;
1965 case Attribute::WriteOnly:
return 1ULL << 53;
1966 case Attribute::Speculatable:
return 1ULL << 54;
1967 case Attribute::StrictFP:
return 1ULL << 55;
1968 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1969 case Attribute::NoCfCheck:
return 1ULL << 57;
1970 case Attribute::OptForFuzzing:
return 1ULL << 58;
1971 case Attribute::ShadowCallStack:
return 1ULL << 59;
1972 case Attribute::SpeculativeLoadHardening:
1974 case Attribute::ImmArg:
1976 case Attribute::WillReturn:
1978 case Attribute::NoFree:
1994 if (
I == Attribute::Alignment)
1995 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1996 else if (
I == Attribute::StackAlignment)
1997 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1999 B.addTypeAttr(
I,
nullptr);
2013 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
2015 "Alignment must be a power of two.");
2018 B.addAlignmentAttr(Alignment);
2020 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
2021 (EncodedAttrs & 0xffff);
2023 if (AttrIdx == AttributeList::FunctionIndex) {
2026 if (Attrs & (1ULL << 9)) {
2028 Attrs &= ~(1ULL << 9);
2031 if (Attrs & (1ULL << 10)) {
2033 Attrs &= ~(1ULL << 10);
2036 if (Attrs & (1ULL << 49)) {
2038 Attrs &= ~(1ULL << 49);
2041 if (Attrs & (1ULL << 50)) {
2043 Attrs &= ~(1ULL << 50);
2046 if (Attrs & (1ULL << 53)) {
2048 Attrs &= ~(1ULL << 53);
2052 B.addMemoryAttr(ME);
2056 if (Attrs & (1ULL << 21)) {
2057 Attrs &= ~(1ULL << 21);
2064Error BitcodeReader::parseAttributeBlock() {
2068 if (!MAttributes.empty())
2069 return error(
"Invalid multiple blocks");
2071 SmallVector<uint64_t, 64>
Record;
2080 BitstreamEntry
Entry = MaybeEntry.
get();
2082 switch (
Entry.Kind) {
2085 return error(
"Malformed block");
2098 switch (MaybeRecord.
get()) {
2104 return error(
"Invalid parameter attribute record");
2106 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2112 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2117 Attrs.push_back(MAttributeGroups[Val]);
2119 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2132 return Attribute::Alignment;
2134 return Attribute::AlwaysInline;
2136 return Attribute::Builtin;
2138 return Attribute::ByVal;
2140 return Attribute::InAlloca;
2142 return Attribute::Cold;
2144 return Attribute::Convergent;
2146 return Attribute::DisableSanitizerInstrumentation;
2148 return Attribute::ElementType;
2150 return Attribute::FnRetThunkExtern;
2152 return Attribute::Flatten;
2154 return Attribute::HybridPatchable;
2156 return Attribute::InlineHint;
2158 return Attribute::InReg;
2160 return Attribute::JumpTable;
2162 return Attribute::Memory;
2164 return Attribute::NoFPClass;
2166 return Attribute::MinSize;
2168 return Attribute::Naked;
2170 return Attribute::Nest;
2172 return Attribute::NoAlias;
2174 return Attribute::NoBuiltin;
2176 return Attribute::NoCallback;
2178 return Attribute::NoDivergenceSource;
2180 return Attribute::NoDuplicate;
2182 return Attribute::NoFree;
2184 return Attribute::NoFreeObj;
2186 return Attribute::NoImplicitFloat;
2188 return Attribute::NoInline;
2190 return Attribute::NoRecurse;
2192 return Attribute::NoMerge;
2194 return Attribute::NonLazyBind;
2196 return Attribute::NonNull;
2198 return Attribute::Dereferenceable;
2200 return Attribute::DereferenceableOrNull;
2202 return Attribute::AllocAlign;
2204 return Attribute::AllocKind;
2206 return Attribute::AllocSize;
2208 return Attribute::AllocatedPointer;
2210 return Attribute::NoRedZone;
2212 return Attribute::NoReturn;
2214 return Attribute::NoSync;
2216 return Attribute::NoCfCheck;
2218 return Attribute::NoProfile;
2220 return Attribute::SkipProfile;
2222 return Attribute::NoUnwind;
2224 return Attribute::NoSanitizeBounds;
2226 return Attribute::NoSanitizeCoverage;
2228 return Attribute::NullPointerIsValid;
2230 return Attribute::OptimizeForDebugging;
2232 return Attribute::OptForFuzzing;
2234 return Attribute::OptimizeForSize;
2236 return Attribute::OptimizeNone;
2238 return Attribute::ReadNone;
2240 return Attribute::ReadOnly;
2242 return Attribute::Returned;
2244 return Attribute::ReturnsTwice;
2246 return Attribute::SExt;
2248 return Attribute::Speculatable;
2250 return Attribute::StackAlignment;
2252 return Attribute::StackProtect;
2254 return Attribute::StackProtectReq;
2256 return Attribute::StackProtectStrong;
2258 return Attribute::SafeStack;
2260 return Attribute::ShadowCallStack;
2262 return Attribute::StrictFP;
2264 return Attribute::StructRet;
2266 return Attribute::SanitizeAddress;
2268 return Attribute::SanitizeHWAddress;
2270 return Attribute::SanitizeThread;
2272 return Attribute::SanitizeType;
2274 return Attribute::SanitizeMemory;
2276 return Attribute::SanitizeNumericalStability;
2278 return Attribute::SanitizeRealtime;
2280 return Attribute::SanitizeRealtimeBlocking;
2282 return Attribute::SanitizeAllocToken;
2284 return Attribute::SpeculativeLoadHardening;
2286 return Attribute::SwiftError;
2288 return Attribute::SwiftSelf;
2290 return Attribute::SwiftAsync;
2292 return Attribute::UWTable;
2294 return Attribute::VScaleRange;
2296 return Attribute::WillReturn;
2298 return Attribute::WriteOnly;
2300 return Attribute::ZExt;
2302 return Attribute::ImmArg;
2304 return Attribute::SanitizeMemTag;
2306 return Attribute::Preallocated;
2308 return Attribute::NoUndef;
2310 return Attribute::ByRef;
2312 return Attribute::MustProgress;
2314 return Attribute::Hot;
2316 return Attribute::PresplitCoroutine;
2318 return Attribute::Writable;
2320 return Attribute::CoroDestroyOnlyWhenComplete;
2322 return Attribute::DeadOnUnwind;
2324 return Attribute::Range;
2326 return Attribute::Initializes;
2328 return Attribute::CoroElideSafe;
2330 return Attribute::NoExt;
2332 return Attribute::Captures;
2334 return Attribute::DeadOnReturn;
2336 return Attribute::NoCreateUndefOrPoison;
2338 return Attribute::DenormalFPEnv;
2340 return Attribute::NoOutline;
2342 return Attribute::NoIPA;
2347 MaybeAlign &Alignment) {
2350 if (
Exponent > Value::MaxAlignmentExponent + 1)
2351 return error(
"Invalid alignment value");
2356Error BitcodeReader::parseAttrKind(
uint64_t Code, Attribute::AttrKind *Kind) {
2358 if (*Kind == Attribute::None)
2359 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2364 switch (EncodedKind) {
2388Error BitcodeReader::parseAttributeGroupBlock() {
2392 if (!MAttributeGroups.empty())
2393 return error(
"Invalid multiple blocks");
2395 SmallVector<uint64_t, 64>
Record;
2402 BitstreamEntry
Entry = MaybeEntry.
get();
2404 switch (
Entry.Kind) {
2407 return error(
"Malformed block");
2420 switch (MaybeRecord.
get()) {
2425 return error(
"Invalid grp record");
2432 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2433 if (Record[i] == 0) {
2434 Attribute::AttrKind
Kind;
2436 if (Idx == AttributeList::FunctionIndex &&
2445 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2451 if (Kind == Attribute::ByVal)
2452 B.addByValAttr(
nullptr);
2453 else if (Kind == Attribute::StructRet)
2454 B.addStructRetAttr(
nullptr);
2455 else if (Kind == Attribute::InAlloca)
2456 B.addInAllocaAttr(
nullptr);
2457 else if (Kind == Attribute::UWTable)
2458 B.addUWTableAttr(UWTableKind::Default);
2459 else if (Kind == Attribute::DeadOnReturn)
2460 B.addDeadOnReturnAttr(DeadOnReturnInfo());
2461 else if (Attribute::isEnumAttrKind(Kind))
2462 B.addAttribute(Kind);
2464 return error(
"Not an enum attribute");
2465 }
else if (Record[i] == 1) {
2466 Attribute::AttrKind
Kind;
2467 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2469 if (!Attribute::isIntAttrKind(Kind))
2470 return error(
"Not an int attribute");
2471 if (Kind == Attribute::Alignment)
2472 B.addAlignmentAttr(Record[++i]);
2473 else if (Kind == Attribute::StackAlignment)
2474 B.addStackAlignmentAttr(Record[++i]);
2475 else if (Kind == Attribute::Dereferenceable)
2476 B.addDereferenceableAttr(Record[++i]);
2477 else if (Kind == Attribute::DereferenceableOrNull)
2478 B.addDereferenceableOrNullAttr(Record[++i]);
2479 else if (Kind == Attribute::DeadOnReturn)
2480 B.addDeadOnReturnAttr(
2482 else if (Kind == Attribute::AllocSize)
2483 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2484 else if (Kind == Attribute::VScaleRange)
2485 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2486 else if (Kind == Attribute::UWTable)
2488 else if (Kind == Attribute::AllocKind)
2489 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2490 else if (Kind == Attribute::Memory) {
2492 const uint8_t
Version = (EncodedME >> 56);
2506 if (getTargetTriple().isAArch64())
2511 B.addMemoryAttr(ME);
2516 EncodedME & 0x00FFFFFFFFFFFFFFULL);
2519 if (
Version == 1 && getTargetTriple().isAArch64())
2521 IRMemLocation::TargetMem0,
2522 ME.
getModRef(IRMemLocation::InaccessibleMem)) |
2524 IRMemLocation::TargetMem1,
2525 ME.
getModRef(IRMemLocation::InaccessibleMem));
2526 B.addMemoryAttr(ME);
2528 }
else if (Kind == Attribute::Captures)
2530 else if (Kind == Attribute::NoFPClass)
2533 else if (Kind == Attribute::DenormalFPEnv) {
2534 B.addDenormalFPEnvAttr(
2537 }
else if (Record[i] == 3 || Record[i] == 4) {
2539 SmallString<64> KindStr;
2540 SmallString<64> ValStr;
2542 while (Record[i] != 0 && i != e)
2544 assert(Record[i] == 0 &&
"Kind string not null terminated");
2549 while (Record[i] != 0 && i != e)
2551 assert(Record[i] == 0 &&
"Value string not null terminated");
2554 B.addAttribute(KindStr.
str(), ValStr.
str());
2555 }
else if (Record[i] == 5 || Record[i] == 6) {
2556 bool HasType =
Record[i] == 6;
2557 Attribute::AttrKind
Kind;
2558 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2560 if (!Attribute::isTypeAttrKind(Kind))
2561 return error(
"Not a type attribute");
2563 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2564 }
else if (Record[i] == 7) {
2565 Attribute::AttrKind
Kind;
2568 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2570 if (!Attribute::isConstantRangeAttrKind(Kind))
2571 return error(
"Not a ConstantRange attribute");
2573 Expected<ConstantRange> MaybeCR =
2574 readBitWidthAndConstantRange(Record, i);
2579 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2580 }
else if (Record[i] == 8) {
2581 Attribute::AttrKind
Kind;
2584 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2586 if (!Attribute::isConstantRangeListAttrKind(Kind))
2587 return error(
"Not a constant range list attribute");
2591 return error(
"Too few records for constant range list");
2592 unsigned RangeSize =
Record[i++];
2594 for (
unsigned Idx = 0; Idx < RangeSize; ++Idx) {
2595 Expected<ConstantRange> MaybeCR =
2596 readConstantRange(Record, i,
BitWidth);
2604 return error(
"Invalid (unordered or overlapping) range list");
2605 B.addConstantRangeListAttr(Kind, Val);
2607 return error(
"Invalid attribute group entry");
2612 B.addMemoryAttr(ME);
2615 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2622Error BitcodeReader::parseTypeTable() {
2626 return parseTypeTableBody();
2629Error BitcodeReader::parseTypeTableBody() {
2630 if (!TypeList.empty())
2631 return error(
"Invalid multiple blocks");
2633 SmallVector<uint64_t, 64>
Record;
2634 unsigned NumRecords = 0;
2643 BitstreamEntry
Entry = MaybeEntry.
get();
2645 switch (
Entry.Kind) {
2648 return error(
"Malformed block");
2650 if (NumRecords != TypeList.size())
2651 return error(
"Malformed block");
2660 Type *ResultTy =
nullptr;
2661 SmallVector<unsigned> ContainedIDs;
2665 switch (MaybeRecord.
get()) {
2667 return error(
"Invalid value");
2672 return error(
"Invalid numentry record");
2673 TypeList.resize(Record[0]);
2676 ResultTy = Type::getVoidTy(
Context);
2679 ResultTy = Type::getHalfTy(
Context);
2682 ResultTy = Type::getBFloatTy(
Context);
2685 ResultTy = Type::getFloatTy(
Context);
2688 ResultTy = Type::getDoubleTy(
Context);
2691 ResultTy = Type::getX86_FP80Ty(
Context);
2694 ResultTy = Type::getFP128Ty(
Context);
2697 ResultTy = Type::getPPC_FP128Ty(
Context);
2700 ResultTy = Type::getLabelTy(
Context);
2703 ResultTy = Type::getMetadataTy(
Context);
2711 ResultTy = Type::getX86_AMXTy(
Context);
2714 ResultTy = Type::getTokenTy(
Context);
2718 return error(
"Invalid record");
2723 return error(
"Bitwidth for byte type out of range");
2729 return error(
"Invalid integer record");
2734 return error(
"Bitwidth for integer type out of range");
2741 return error(
"Invalid pointer record");
2745 ResultTy = getTypeByID(Record[0]);
2747 !PointerType::isValidElementType(ResultTy))
2748 return error(
"Invalid type");
2755 return error(
"Invalid opaque pointer record");
2764 return error(
"Invalid function record");
2766 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2767 if (
Type *
T = getTypeByID(Record[i]))
2773 ResultTy = getTypeByID(Record[2]);
2774 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2775 return error(
"Invalid type");
2778 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2784 return error(
"Invalid function record");
2786 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2787 if (
Type *
T = getTypeByID(Record[i])) {
2788 if (!FunctionType::isValidArgumentType(
T))
2789 return error(
"Invalid function argument type");
2796 ResultTy = getTypeByID(Record[1]);
2797 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2798 return error(
"Invalid type");
2801 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2806 return error(
"Invalid anon struct record");
2808 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2809 if (
Type *
T = getTypeByID(Record[i]))
2815 return error(
"Invalid type");
2822 return error(
"Invalid struct name record");
2827 return error(
"Invalid named struct record");
2829 if (NumRecords >= TypeList.size())
2830 return error(
"Invalid TYPE table");
2836 TypeList[NumRecords] =
nullptr;
2838 Res = createIdentifiedStructType(
Context, TypeName);
2842 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2843 if (
Type *
T = getTypeByID(Record[i]))
2849 return error(
"Invalid named struct record");
2858 return error(
"Invalid opaque type record");
2860 if (NumRecords >= TypeList.size())
2861 return error(
"Invalid TYPE table");
2867 TypeList[NumRecords] =
nullptr;
2869 Res = createIdentifiedStructType(
Context, TypeName);
2876 return error(
"Invalid target extension type record");
2878 if (NumRecords >= TypeList.size())
2879 return error(
"Invalid TYPE table");
2881 if (Record[0] >=
Record.size())
2882 return error(
"Too many type parameters");
2884 unsigned NumTys =
Record[0];
2886 SmallVector<unsigned, 8> IntParams;
2887 for (
unsigned i = 0; i < NumTys; i++) {
2888 if (
Type *
T = getTypeByID(Record[i + 1]))
2891 return error(
"Invalid type");
2894 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2895 if (Record[i] > UINT_MAX)
2896 return error(
"Integer parameter too large");
2901 if (
auto E = TTy.takeError())
2909 return error(
"Invalid array type record");
2910 ResultTy = getTypeByID(Record[1]);
2911 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2912 return error(
"Invalid type");
2914 ResultTy = ArrayType::get(ResultTy, Record[0]);
2919 return error(
"Invalid vector type record");
2921 return error(
"Invalid vector length");
2922 ResultTy = getTypeByID(Record[1]);
2923 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2924 return error(
"Invalid type");
2927 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2931 if (NumRecords >= TypeList.size())
2932 return error(
"Invalid TYPE table");
2933 if (TypeList[NumRecords])
2935 "Invalid TYPE table: Only named structs can be forward referenced");
2936 assert(ResultTy &&
"Didn't read a type?");
2937 TypeList[NumRecords] = ResultTy;
2938 if (!ContainedIDs.
empty())
2939 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2944Error BitcodeReader::parseOperandBundleTags() {
2948 if (!BundleTags.empty())
2949 return error(
"Invalid multiple blocks");
2951 SmallVector<uint64_t, 64>
Record;
2957 BitstreamEntry
Entry = MaybeEntry.
get();
2959 switch (
Entry.Kind) {
2962 return error(
"Malformed block");
2976 return error(
"Invalid operand bundle record");
2979 BundleTags.emplace_back();
2981 return error(
"Invalid operand bundle record");
2986Error BitcodeReader::parseSyncScopeNames() {
2991 return error(
"Invalid multiple synchronization scope names blocks");
2993 SmallVector<uint64_t, 64>
Record;
2998 BitstreamEntry
Entry = MaybeEntry.
get();
3000 switch (
Entry.Kind) {
3003 return error(
"Malformed block");
3006 return error(
"Invalid empty synchronization scope names block");
3020 return error(
"Invalid sync scope record");
3022 SmallString<16> SSN;
3024 return error(
"Invalid sync scope record");
3032Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
3033 unsigned NameIndex, Triple &TT) {
3036 return error(
"Invalid record");
3037 unsigned ValueID =
Record[0];
3038 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3039 return error(
"Invalid record");
3040 Value *
V = ValueList[ValueID];
3043 if (NameStr.contains(0))
3044 return error(
"Invalid value name");
3045 V->setName(NameStr);
3047 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
3060 return std::move(JumpFailed);
3066 return error(
"Expected value symbol table subblock");
3070void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
3072 ArrayRef<uint64_t> Record) {
3077 uint64_t FuncBitOffset = FuncWordOffset * 32;
3078 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
3082 if (FuncBitOffset > LastFunctionBlockBit)
3083 LastFunctionBlockBit = FuncBitOffset;
3087Error BitcodeReader::parseGlobalValueSymbolTable() {
3088 unsigned FuncBitcodeOffsetDelta =
3094 SmallVector<uint64_t, 64>
Record;
3099 BitstreamEntry
Entry = MaybeEntry.
get();
3101 switch (
Entry.Kind) {
3104 return error(
"Malformed block");
3115 switch (MaybeRecord.
get()) {
3117 unsigned ValueID =
Record[0];
3118 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3119 return error(
"Invalid value reference in symbol table");
3120 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3137 if (!MaybeCurrentBit)
3139 CurrentBit = MaybeCurrentBit.
get();
3142 if (
Error Err = parseGlobalValueSymbolTable())
3163 unsigned FuncBitcodeOffsetDelta =
3169 SmallVector<uint64_t, 64>
Record;
3180 BitstreamEntry
Entry = MaybeEntry.
get();
3182 switch (
Entry.Kind) {
3185 return error(
"Malformed block");
3201 switch (MaybeRecord.
get()) {
3205 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3213 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3221 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3226 return error(
"Invalid bbentry record");
3229 return error(
"Invalid bbentry record");
3251Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3252 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3253 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3254 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3256 GlobalInitWorklist.swap(GlobalInits);
3257 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3258 FunctionOperandWorklist.swap(FunctionOperands);
3260 while (!GlobalInitWorklist.empty()) {
3261 unsigned ValID = GlobalInitWorklist.back().second;
3262 if (ValID >= ValueList.
size()) {
3264 GlobalInits.push_back(GlobalInitWorklist.back());
3266 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3269 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3271 GlobalInitWorklist.pop_back();
3274 while (!IndirectSymbolInitWorklist.empty()) {
3275 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3276 if (ValID >= ValueList.
size()) {
3277 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3279 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3283 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3286 return error(
"Alias and aliasee types don't match");
3291 return error(
"Expected an alias or an ifunc");
3294 IndirectSymbolInitWorklist.pop_back();
3297 while (!FunctionOperandWorklist.empty()) {
3298 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3299 if (
Info.PersonalityFn) {
3300 unsigned ValID =
Info.PersonalityFn - 1;
3301 if (ValID < ValueList.
size()) {
3302 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3305 Info.F->setPersonalityFn(MaybeC.
get());
3306 Info.PersonalityFn = 0;
3310 unsigned ValID =
Info.Prefix - 1;
3311 if (ValID < ValueList.
size()) {
3312 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3315 Info.F->setPrefixData(MaybeC.
get());
3319 if (
Info.Prologue) {
3320 unsigned ValID =
Info.Prologue - 1;
3321 if (ValID < ValueList.
size()) {
3322 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3325 Info.F->setPrologueData(MaybeC.
get());
3329 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3330 FunctionOperands.push_back(Info);
3331 FunctionOperandWorklist.pop_back();
3340 BitcodeReader::decodeSignRotatedValue);
3342 return APInt(TypeBits, Words);
3345Error BitcodeReader::parseConstants() {
3353 unsigned Int32TyID = getVirtualTypeID(CurTy);
3354 unsigned CurTyID = Int32TyID;
3355 Type *CurElemTy =
nullptr;
3356 unsigned NextCstNo = ValueList.
size();
3364 switch (Entry.Kind) {
3367 return error(
"Malformed block");
3369 if (NextCstNo != ValueList.
size())
3370 return error(
"Invalid constant reference");
3381 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
3384 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3394 return error(
"Invalid settype record");
3395 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3396 return error(
"Invalid settype record");
3397 if (TypeList[Record[0]] == VoidType)
3398 return error(
"Invalid constant type");
3400 CurTy = TypeList[CurTyID];
3401 CurElemTy = getPtrElementTypeByID(CurTyID);
3405 return error(
"Invalid type for a constant null value");
3408 return error(
"Invalid type for a constant null value");
3413 return error(
"Invalid integer const record");
3418 return error(
"Invalid wide integer const record");
3421 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3422 V = ConstantInt::get(CurTy, VInt);
3427 return error(
"Invalid byte const record");
3428 V = ConstantByte::get(CurTy, decodeSignRotatedValue(Record[0]),
3433 return error(
"Invalid wide byte const record");
3436 APInt VByte =
readWideAPInt(Record, ScalarTy->getBitWidth());
3437 V = ConstantByte::get(CurTy, VByte);
3442 return error(
"Invalid float const record");
3445 if (ScalarTy->isHalfTy())
3446 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3447 APInt(16, (uint16_t)Record[0])));
3448 else if (ScalarTy->isBFloatTy())
3449 V = ConstantFP::get(
3450 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3451 else if (ScalarTy->isFloatTy())
3452 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3453 APInt(32, (uint32_t)Record[0])));
3454 else if (ScalarTy->isDoubleTy())
3455 V = ConstantFP::get(
3456 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3457 else if (ScalarTy->isX86_FP80Ty()) {
3460 Rearrange[0] = (
Record[1] & 0xffffLL) | (Record[0] << 16);
3461 Rearrange[1] =
Record[0] >> 48;
3462 V = ConstantFP::get(
3463 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3464 }
else if (ScalarTy->isFP128Ty())
3465 V = ConstantFP::get(CurTy,
3466 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3467 else if (ScalarTy->isPPC_FP128Ty())
3468 V = ConstantFP::get(
3469 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3477 return error(
"Invalid aggregate record");
3479 SmallVector<unsigned, 16> Elts;
3483 V = BitcodeConstant::create(
3484 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3486 V = BitcodeConstant::create(
Alloc, CurTy,
3487 BitcodeConstant::ConstantArrayOpcode, Elts);
3489 V = BitcodeConstant::create(
3490 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3499 return error(
"Invalid string record");
3509 return error(
"Invalid data record");
3513 return error(
"Invalid type for value");
3516 SmallString<128> RawData;
3519 const char *Src =
reinterpret_cast<const char *
>(&Val);
3521 Src +=
sizeof(
uint64_t) - EltBytes;
3522 RawData.
append(Src, Src + EltBytes);
3527 : ConstantDataArray::getRaw(RawData.str(),
Record.
size(), EltTy);
3532 return error(
"Invalid unary op constexpr record");
3537 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3543 return error(
"Invalid binary op constexpr record");
3549 if (
Record.size() >= 4) {
3550 if (
Opc == Instruction::Add ||
3551 Opc == Instruction::Sub ||
3552 Opc == Instruction::Mul ||
3553 Opc == Instruction::Shl) {
3558 }
else if (
Opc == Instruction::SDiv ||
3559 Opc == Instruction::UDiv ||
3560 Opc == Instruction::LShr ||
3561 Opc == Instruction::AShr) {
3566 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3567 {(unsigned)Record[1], (
unsigned)
Record[2]});
3573 return error(
"Invalid cast constexpr record");
3578 unsigned OpTyID =
Record[1];
3579 Type *OpTy = getTypeByID(OpTyID);
3581 return error(
"Invalid cast constexpr record");
3582 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3594 return error(
"Constant GEP record must have at least two elements");
3596 Type *PointeeType =
nullptr;
3600 PointeeType = getTypeByID(Record[OpNum++]);
3603 std::optional<ConstantRange>
InRange;
3607 unsigned InRangeIndex =
Op >> 1;
3613 Expected<ConstantRange> MaybeInRange =
3614 readBitWidthAndConstantRange(Record, OpNum);
3623 SmallVector<unsigned, 16> Elts;
3624 unsigned BaseTypeID =
Record[OpNum];
3625 while (OpNum !=
Record.size()) {
3626 unsigned ElTyID =
Record[OpNum++];
3627 Type *ElTy = getTypeByID(ElTyID);
3629 return error(
"Invalid getelementptr constexpr record");
3633 if (Elts.
size() < 1)
3634 return error(
"Invalid gep with no operands");
3638 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3639 BaseType = getTypeByID(BaseTypeID);
3644 return error(
"GEP base operand must be pointer or vector of pointer");
3647 PointeeType = getPtrElementTypeByID(BaseTypeID);
3649 return error(
"Missing element type for old-style constant GEP");
3652 V = BitcodeConstant::create(
3654 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3660 return error(
"Invalid select constexpr record");
3662 V = BitcodeConstant::create(
3663 Alloc, CurTy, Instruction::Select,
3664 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3670 return error(
"Invalid extractelement constexpr record");
3671 unsigned OpTyID =
Record[0];
3675 return error(
"Invalid extractelement constexpr record");
3677 if (
Record.size() == 4) {
3678 unsigned IdxTyID =
Record[2];
3679 Type *IdxTy = getTypeByID(IdxTyID);
3681 return error(
"Invalid extractelement constexpr record");
3687 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3688 {(unsigned)Record[1], IdxRecord});
3694 if (
Record.size() < 3 || !OpTy)
3695 return error(
"Invalid insertelement constexpr record");
3697 if (
Record.size() == 4) {
3698 unsigned IdxTyID =
Record[2];
3699 Type *IdxTy = getTypeByID(IdxTyID);
3701 return error(
"Invalid insertelement constexpr record");
3707 V = BitcodeConstant::create(
3708 Alloc, CurTy, Instruction::InsertElement,
3709 {(unsigned)Record[0], (
unsigned)
Record[1], IdxRecord});
3714 if (
Record.size() < 3 || !OpTy)
3715 return error(
"Invalid shufflevector constexpr record");
3716 V = BitcodeConstant::create(
3717 Alloc, CurTy, Instruction::ShuffleVector,
3718 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3725 if (
Record.size() < 4 || !RTy || !OpTy)
3726 return error(
"Invalid shufflevector constexpr record");
3727 V = BitcodeConstant::create(
3728 Alloc, CurTy, Instruction::ShuffleVector,
3729 {(unsigned)Record[1], (
unsigned)
Record[2], (unsigned)Record[3]});
3734 return error(
"Invalid cmp constexpt record");
3735 unsigned OpTyID =
Record[0];
3736 Type *OpTy = getTypeByID(OpTyID);
3738 return error(
"Invalid cmp constexpr record");
3739 V = BitcodeConstant::create(
3742 : Instruction::ICmp),
3743 (uint8_t)Record[3]},
3744 {(unsigned)Record[1], (
unsigned)
Record[2]});
3751 return error(
"Invalid inlineasm record");
3752 std::string AsmStr, ConstrStr;
3753 bool HasSideEffects =
Record[0] & 1;
3754 bool IsAlignStack =
Record[0] >> 1;
3755 unsigned AsmStrSize =
Record[1];
3756 if (2+AsmStrSize >=
Record.size())
3757 return error(
"Invalid inlineasm record");
3758 unsigned ConstStrSize =
Record[2+AsmStrSize];
3759 if (3+AsmStrSize+ConstStrSize >
Record.size())
3760 return error(
"Invalid inlineasm record");
3762 for (
unsigned i = 0; i != AsmStrSize; ++i)
3763 AsmStr += (
char)
Record[2+i];
3764 for (
unsigned i = 0; i != ConstStrSize; ++i)
3765 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3768 return error(
"Missing element type for old-style inlineasm");
3770 HasSideEffects, IsAlignStack);
3777 return error(
"Invalid inlineasm record");
3778 std::string AsmStr, ConstrStr;
3779 bool HasSideEffects =
Record[0] & 1;
3780 bool IsAlignStack = (
Record[0] >> 1) & 1;
3781 unsigned AsmDialect =
Record[0] >> 2;
3782 unsigned AsmStrSize =
Record[1];
3783 if (2+AsmStrSize >=
Record.size())
3784 return error(
"Invalid inlineasm record");
3785 unsigned ConstStrSize =
Record[2+AsmStrSize];
3786 if (3+AsmStrSize+ConstStrSize >
Record.size())
3787 return error(
"Invalid inlineasm record");
3789 for (
unsigned i = 0; i != AsmStrSize; ++i)
3790 AsmStr += (
char)
Record[2+i];
3791 for (
unsigned i = 0; i != ConstStrSize; ++i)
3792 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3795 return error(
"Missing element type for old-style inlineasm");
3797 HasSideEffects, IsAlignStack,
3804 return error(
"Invalid inlineasm record");
3806 std::string AsmStr, ConstrStr;
3807 bool HasSideEffects =
Record[OpNum] & 1;
3808 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3809 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3810 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3812 unsigned AsmStrSize =
Record[OpNum];
3814 if (OpNum + AsmStrSize >=
Record.size())
3815 return error(
"Invalid inlineasm record");
3816 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3817 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3818 return error(
"Invalid inlineasm record");
3820 for (
unsigned i = 0; i != AsmStrSize; ++i)
3821 AsmStr += (
char)
Record[OpNum + i];
3823 for (
unsigned i = 0; i != ConstStrSize; ++i)
3824 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3827 return error(
"Missing element type for old-style inlineasm");
3829 HasSideEffects, IsAlignStack,
3836 return error(
"Invalid inlineasm record");
3841 return error(
"Invalid inlineasm record");
3842 std::string AsmStr, ConstrStr;
3843 bool HasSideEffects =
Record[OpNum] & 1;
3844 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3845 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3846 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3848 unsigned AsmStrSize =
Record[OpNum];
3850 if (OpNum + AsmStrSize >=
Record.size())
3851 return error(
"Invalid inlineasm record");
3852 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3853 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3854 return error(
"Invalid inlineasm record");
3856 for (
unsigned i = 0; i != AsmStrSize; ++i)
3857 AsmStr += (
char)
Record[OpNum + i];
3859 for (
unsigned i = 0; i != ConstStrSize; ++i)
3860 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3862 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3868 return error(
"Invalid blockaddress record");
3869 unsigned FnTyID =
Record[0];
3870 Type *FnTy = getTypeByID(FnTyID);
3872 return error(
"Invalid blockaddress record");
3873 V = BitcodeConstant::create(
3875 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3881 return error(
"Invalid dso_local record");
3882 unsigned GVTyID =
Record[0];
3883 Type *GVTy = getTypeByID(GVTyID);
3885 return error(
"Invalid dso_local record");
3886 V = BitcodeConstant::create(
3887 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3892 return error(
"Invalid no_cfi record");
3893 unsigned GVTyID =
Record[0];
3894 Type *GVTy = getTypeByID(GVTyID);
3896 return error(
"Invalid no_cfi record");
3897 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3903 return error(
"Invalid ptrauth record");
3905 V = BitcodeConstant::create(
Alloc, CurTy,
3906 BitcodeConstant::ConstantPtrAuthOpcode,
3907 {(unsigned)Record[0], (
unsigned)
Record[1],
3908 (unsigned)Record[2], (
unsigned)
Record[3]});
3913 return error(
"Invalid ptrauth record");
3915 V = BitcodeConstant::create(
3916 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3917 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2],
3918 (
unsigned)
Record[3], (unsigned)Record[4]});
3923 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3930Error BitcodeReader::parseUseLists() {
3935 SmallVector<uint64_t, 64>
Record;
3941 BitstreamEntry
Entry = MaybeEntry.
get();
3943 switch (
Entry.Kind) {
3946 return error(
"Malformed block");
3960 switch (MaybeRecord.
get()) {
3968 if (RecordLength < 3)
3970 return error(
"Invalid uselist record");
3971 unsigned ID =
Record.pop_back_val();
3975 assert(ID < FunctionBBs.size() &&
"Basic block not found");
3976 V = FunctionBBs[
ID];
3980 if (!
V->hasUseList())
3983 unsigned NumUses = 0;
3984 SmallDenseMap<const Use *, unsigned, 16> Order;
3985 for (
const Use &U :
V->materialized_uses()) {
3986 if (++NumUses >
Record.size())
3988 Order[&
U] =
Record[NumUses - 1];
3995 V->sortUseList([&](
const Use &L,
const Use &R) {
4006Error BitcodeReader::rememberAndSkipMetadata() {
4009 DeferredMetadataInfo.push_back(CurBit);
4017Error BitcodeReader::materializeMetadata() {
4018 for (
uint64_t BitPos : DeferredMetadataInfo) {
4022 if (
Error Err = MDLoader->parseModuleMetadata())
4031 NamedMDNode *LinkerOpts =
4033 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
4040 DeferredMetadataInfo.clear();
4044void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
4048Error BitcodeReader::rememberAndSkipFunctionBody() {
4050 if (FunctionsWithBodies.empty())
4051 return error(
"Insufficient function protos");
4053 Function *Fn = FunctionsWithBodies.back();
4054 FunctionsWithBodies.pop_back();
4059 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
4060 "Mismatch between VST and scanned function offsets");
4061 DeferredFunctionInfo[Fn] = CurBit;
4069Error BitcodeReader::globalCleanup() {
4071 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4073 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
4074 return error(
"Malformed global initializer set");
4079 MDLoader->upgradeDebugIntrinsics(
F);
4083 !SkipDebugIntrinsicUpgrade))
4084 UpgradedIntrinsics[&
F] = NewFn;
4090 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4091 for (GlobalVariable &GV : TheModule->globals())
4093 UpgradedVariables.emplace_back(&GV, Upgraded);
4094 for (
auto &Pair : UpgradedVariables) {
4095 Pair.first->eraseFromParent();
4096 TheModule->insertGlobalVariable(Pair.second);
4099 for (
size_t ValueID = 0; ValueID < GUIDList.size(); ValueID++) {
4100 const auto GUID = GUIDList[ValueID];
4104 const auto *
Value = ValueList[ValueID];
4105 TheModule->insertGUID(
Value, GUID);
4110 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4111 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4119Error BitcodeReader::rememberAndSkipFunctionBodies() {
4124 return error(
"Could not find function in stream");
4126 if (!SeenFirstFunctionBody)
4127 return error(
"Trying to materialize functions before seeing function blocks");
4131 assert(SeenValueSymbolTable);
4134 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4137 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4139 switch (
Entry.Kind) {
4141 return error(
"Expect SubBlock");
4145 return error(
"Expect function block");
4147 if (
Error Err = rememberAndSkipFunctionBody())
4156Error BitcodeReaderBase::readBlockInfo() {
4157 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4159 if (!MaybeNewBlockInfo)
4161 std::optional<BitstreamBlockInfo> NewBlockInfo =
4162 std::move(MaybeNewBlockInfo.
get());
4164 return error(
"Malformed block");
4165 BlockInfo = std::move(*NewBlockInfo);
4169Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4173 std::tie(Name, Record) = readNameFromStrtab(Record);
4176 return error(
"Invalid comdat record");
4178 std::string OldFormatName;
4181 return error(
"Invalid comdat record");
4182 unsigned ComdatNameSize =
Record[1];
4183 if (ComdatNameSize >
Record.size() - 2)
4184 return error(
"Comdat name size too large");
4185 OldFormatName.reserve(ComdatNameSize);
4186 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4187 OldFormatName += (
char)
Record[2 + i];
4188 Name = OldFormatName;
4190 Comdat *
C = TheModule->getOrInsertComdat(Name);
4191 C->setSelectionKind(SK);
4192 ComdatList.push_back(
C);
4206 Meta.NoAddress =
true;
4208 Meta.NoHWAddress =
true;
4212 Meta.IsDynInit =
true;
4216Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4224 std::tie(Name, Record) = readNameFromStrtab(Record);
4227 return error(
"Invalid global variable record");
4228 unsigned TyID =
Record[0];
4229 Type *Ty = getTypeByID(TyID);
4231 return error(
"Invalid global variable record");
4233 bool explicitType =
Record[1] & 2;
4239 return error(
"Invalid type for value");
4241 TyID = getContainedTypeID(TyID);
4242 Ty = getTypeByID(TyID);
4244 return error(
"Missing element type for old-style global");
4250 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4254 if (Record[5] - 1 >= SectionTable.size())
4255 return error(
"Invalid ID");
4264 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4272 bool ExternallyInitialized =
false;
4274 ExternallyInitialized =
Record[9];
4276 GlobalVariable *NewGV =
4286 if (
Record.size() > 10) {
4298 if (
unsigned InitID = Record[2])
4299 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4301 if (
Record.size() > 11) {
4302 if (
unsigned ComdatID = Record[11]) {
4303 if (ComdatID > ComdatList.size())
4304 return error(
"Invalid global variable comdat ID");
4305 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4308 ImplicitComdatObjects.
insert(NewGV);
4311 if (
Record.size() > 12) {
4316 if (
Record.size() > 13) {
4325 if (
Record.size() > 16 && Record[16]) {
4326 llvm::GlobalValue::SanitizerMetadata
Meta =
4331 if (
Record.size() > 17 && Record[17]) {
4335 return error(
"Invalid global variable code model");
4341void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4342 if (ValueTypeCallback) {
4343 (*ValueTypeCallback)(
4344 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4345 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4349Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4355 std::tie(Name, Record) = readNameFromStrtab(Record);
4358 return error(
"Invalid function record");
4359 unsigned FTyID =
Record[0];
4360 Type *FTy = getTypeByID(FTyID);
4362 return error(
"Invalid function record");
4364 FTyID = getContainedTypeID(FTyID, 0);
4365 FTy = getTypeByID(FTyID);
4367 return error(
"Missing element type for old-style function");
4371 return error(
"Invalid type for value");
4372 auto CC =
static_cast<CallingConv::ID
>(
Record[1]);
4373 if (CC & ~CallingConv::MaxID)
4374 return error(
"Invalid calling convention ID");
4376 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4382 AddrSpace, Name, TheModule);
4385 "Incorrect fully specified type provided for function");
4386 FunctionTypeIDs[
Func] = FTyID;
4388 Func->setCallingConv(CC);
4389 bool isProto =
Record[2];
4393 callValueTypeCallback(Func, FTyID);
4398 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4399 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4400 Attribute::InAlloca}) {
4401 if (!
Func->hasParamAttribute(i, Kind))
4404 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4407 Func->removeParamAttr(i, Kind);
4409 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4410 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4412 return error(
"Missing param element type for attribute upgrade");
4416 case Attribute::ByVal:
4417 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4419 case Attribute::StructRet:
4420 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4422 case Attribute::InAlloca:
4423 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4429 Func->addParamAttr(i, NewAttr);
4433 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4434 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4435 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4436 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4438 return error(
"Missing param element type for x86_intrcc upgrade");
4440 Func->addParamAttr(0, NewAttr);
4444 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4447 Func->setAlignment(*Alignment);
4449 if (Record[6] - 1 >= SectionTable.size())
4450 return error(
"Invalid ID");
4451 Func->setSection(SectionTable[Record[6] - 1]);
4455 if (!
Func->hasLocalLinkage())
4457 if (
Record.size() > 8 && Record[8]) {
4458 if (Record[8] - 1 >= GCTable.size())
4459 return error(
"Invalid ID");
4460 Func->setGC(GCTable[Record[8] - 1]);
4465 Func->setUnnamedAddr(UnnamedAddr);
4467 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4469 OperandInfo.Prologue =
Record[10];
4471 if (
Record.size() > 11) {
4473 if (!
Func->hasLocalLinkage()) {
4480 if (
Record.size() > 12) {
4481 if (
unsigned ComdatID = Record[12]) {
4482 if (ComdatID > ComdatList.size())
4483 return error(
"Invalid function comdat ID");
4484 Func->setComdat(ComdatList[ComdatID - 1]);
4487 ImplicitComdatObjects.
insert(Func);
4491 OperandInfo.Prefix =
Record[13];
4494 OperandInfo.PersonalityFn =
Record[14];
4496 if (
Record.size() > 15) {
4506 Record[17] + Record[18] <= Strtab.
size()) {
4507 Func->setPartition(StringRef(Strtab.
data() + Record[17], Record[18]));
4510 if (
Record.size() > 19) {
4511 MaybeAlign PrefAlignment;
4512 if (
Error Err = parseAlignmentValue(Record[19], PrefAlignment))
4514 Func->setPreferredAlignment(PrefAlignment);
4517 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4519 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4520 FunctionOperands.push_back(OperandInfo);
4525 Func->setIsMaterializable(
true);
4526 FunctionsWithBodies.push_back(Func);
4527 DeferredFunctionInfo[
Func] = 0;
4532Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4533 unsigned BitCode, ArrayRef<uint64_t> Record) {
4543 std::tie(Name, Record) = readNameFromStrtab(Record);
4546 if (
Record.size() < (3 + (
unsigned)NewRecord))
4547 return error(
"Invalid global indirect symbol record");
4552 return error(
"Invalid global indirect symbol record");
4558 return error(
"Invalid type for value");
4559 AddrSpace = PTy->getAddressSpace();
4561 Ty = getTypeByID(
TypeID);
4563 return error(
"Missing element type for old-style indirect symbol");
4565 AddrSpace =
Record[OpNum++];
4568 auto Val =
Record[OpNum++];
4577 nullptr, TheModule);
4581 if (OpNum !=
Record.size()) {
4582 auto VisInd = OpNum++;
4588 if (OpNum !=
Record.size()) {
4589 auto S =
Record[OpNum++];
4596 if (OpNum !=
Record.size())
4598 if (OpNum !=
Record.size())
4601 if (OpNum !=
Record.size())
4606 if (OpNum + 1 <
Record.size()) {
4608 if (Record[OpNum] + Record[OpNum + 1] > Strtab.
size())
4609 return error(
"Malformed partition, too large.");
4611 StringRef(Strtab.
data() + Record[OpNum], Record[OpNum + 1]));
4615 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4620 bool ShouldLazyLoadMetadata,
4621 ParserCallbacks Callbacks) {
4622 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4629 SmallVector<uint64_t, 64>
Record;
4633 bool ResolvedDataLayout =
false;
4638 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4641 Module::GlobalAsmProperties Props;
4643 auto ResolveDataLayout = [&]() ->
Error {
4644 if (ResolvedDataLayout)
4648 ResolvedDataLayout =
true;
4652 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4656 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4657 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4658 TentativeDataLayoutStr = *LayoutOverride;
4666 TheModule->setDataLayout(MaybeDL.
get());
4672 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4675 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4677 switch (
Entry.Kind) {
4679 return error(
"Malformed block");
4681 if (
Error Err = ResolveDataLayout())
4683 return globalCleanup();
4692 if (
Error Err = readBlockInfo())
4696 if (
Error Err = parseAttributeBlock())
4700 if (
Error Err = parseAttributeGroupBlock())
4704 if (
Error Err = parseTypeTable())
4708 if (!SeenValueSymbolTable) {
4714 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4715 if (
Error Err = parseValueSymbolTable())
4717 SeenValueSymbolTable =
true;
4727 if (
Error Err = parseConstants())
4729 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4733 if (ShouldLazyLoadMetadata) {
4734 if (
Error Err = rememberAndSkipMetadata())
4738 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4739 if (
Error Err = MDLoader->parseModuleMetadata())
4743 if (
Error Err = MDLoader->parseMetadataKinds())
4747 if (
Error Err = ResolveDataLayout())
4752 if (!SeenFirstFunctionBody) {
4753 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4754 if (
Error Err = globalCleanup())
4756 SeenFirstFunctionBody =
true;
4759 if (VSTOffset > 0) {
4763 if (!SeenValueSymbolTable) {
4764 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4766 SeenValueSymbolTable =
true;
4788 if (
Error Err = rememberAndSkipFunctionBody())
4795 if (SeenValueSymbolTable) {
4799 return globalCleanup();
4803 if (
Error Err = parseUseLists())
4807 if (
Error Err = parseOperandBundleTags())
4811 if (
Error Err = parseSyncScopeNames())
4823 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
4826 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4829 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4832 UseRelativeIDs = *VersionOrErr >= 1;
4836 if (ResolvedDataLayout)
4837 return error(
"target triple too late in module");
4840 return error(
"Invalid triple record");
4841 TheModule->setTargetTriple(Triple(std::move(S)));
4845 if (ResolvedDataLayout)
4846 return error(
"datalayout too late in module");
4848 return error(
"Invalid data layout record");
4854 return error(
"Invalid module asm record");
4855 size_t SepPos = Str.find(
'\0');
4856 if (SepPos == std::string::npos)
4857 return error(
"Invalid module asm record");
4858 if (!Props.
set(StringRef(Str.data(), SepPos), Str.substr(SepPos + 1)))
4859 return error(
"Unknown module asm property");
4865 return error(
"Invalid asm record");
4866 TheModule->appendModuleInlineAsm(Module::GlobalAsmFragment(S, Props));
4874 return error(
"Invalid deplib record");
4881 return error(
"Invalid section name record");
4882 SectionTable.push_back(S);
4888 return error(
"Invalid gcname record");
4889 GCTable.push_back(S);
4893 if (
Error Err = parseComdatRecord(Record))
4902 if (
Error Err = parseGlobalVarRecord(Record))
4906 if (
Error Err = ResolveDataLayout())
4908 if (
Error Err = parseFunctionRecord(Record))
4914 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4920 return error(
"Invalid vstoffset record");
4924 VSTOffset =
Record[0] - 1;
4929 GUIDList.reserve(GUIDList.size() +
Record.size() / 2);
4930 for (
size_t i = 0; i <
Record.size(); i += 2)
4931 GUIDList.push_back(Record[i] << 32 | Record[i + 1]);
4937 return error(
"Invalid source filename record");
4938 TheModule->setSourceFileName(
ValueName);
4944 this->ValueTypeCallback = std::nullopt;
4948Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4950 ParserCallbacks Callbacks) {
4952 MetadataLoaderCallbacks MDCallbacks;
4953 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(ID); };
4955 return getContainedTypeID(
I, J);
4958 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4960 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4963Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4965 return error(
"Load/Store operand is not a pointer type");
4966 if (!PointerType::isLoadableOrStorableType(ValType))
4967 return error(
"Cannot load/store from pointer");
4971Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4972 ArrayRef<unsigned> ArgTyIDs) {
4974 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4975 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4976 Attribute::InAlloca}) {
4977 if (!
Attrs.hasParamAttr(i, Kind) ||
4978 Attrs.getParamAttr(i, Kind).getValueAsType())
4981 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4983 return error(
"Missing element type for typed attribute upgrade");
4987 case Attribute::ByVal:
4988 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4990 case Attribute::StructRet:
4991 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4993 case Attribute::InAlloca:
4994 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
5007 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
5011 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
5012 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
5014 return error(
"Missing element type for inline asm upgrade");
5017 Attribute::get(
Context, Attribute::ElementType, ElemTy));
5025 case Intrinsic::preserve_array_access_index:
5026 case Intrinsic::preserve_struct_access_index:
5027 case Intrinsic::aarch64_ldaxr:
5028 case Intrinsic::aarch64_ldxr:
5029 case Intrinsic::aarch64_stlxr:
5030 case Intrinsic::aarch64_stxr:
5031 case Intrinsic::arm_ldaex:
5032 case Intrinsic::arm_ldrex:
5033 case Intrinsic::arm_stlex:
5034 case Intrinsic::arm_strex: {
5037 case Intrinsic::aarch64_stlxr:
5038 case Intrinsic::aarch64_stxr:
5039 case Intrinsic::arm_stlex:
5040 case Intrinsic::arm_strex:
5047 if (!
Attrs.getParamElementType(ArgNo)) {
5048 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
5050 return error(
"Missing element type for elementtype upgrade");
5070 if (MDLoader->hasFwdRefs())
5071 return error(
"Invalid function metadata: incoming forward references");
5073 InstructionList.
clear();
5074 unsigned ModuleValueListSize = ValueList.
size();
5075 unsigned ModuleMDLoaderSize = MDLoader->size();
5079 unsigned FTyID = FunctionTypeIDs[
F];
5080 for (Argument &
I :
F->args()) {
5081 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
5082 assert(
I.getType() == getTypeByID(ArgTyID) &&
5083 "Incorrect fully specified type for Function Argument");
5087 unsigned NextValueNo = ValueList.
size();
5089 unsigned CurBBNo = 0;
5094 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
5098 auto getLastInstruction = [&]() -> Instruction * {
5099 if (CurBB && !CurBB->
empty())
5100 return &CurBB->
back();
5101 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
5102 !FunctionBBs[CurBBNo - 1]->
empty())
5103 return &FunctionBBs[CurBBNo - 1]->back();
5107 std::vector<OperandBundleDef> OperandBundles;
5110 SmallVector<uint64_t, 64>
Record;
5113 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
5116 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
5118 switch (
Entry.Kind) {
5120 return error(
"Malformed block");
5122 goto OutOfRecordLoop;
5131 if (
Error Err = parseConstants())
5133 NextValueNo = ValueList.
size();
5136 if (
Error Err = parseValueSymbolTable())
5140 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5144 assert(DeferredMetadataInfo.empty() &&
5145 "Must read all module-level metadata before function-level");
5146 if (
Error Err = MDLoader->parseFunctionMetadata())
5150 if (
Error Err = parseUseLists())
5164 unsigned ResTypeID = InvalidTypeID;
5165 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
5168 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5170 return error(
"Invalid value");
5172 if (
Record.empty() || Record[0] == 0)
5173 return error(
"Invalid declareblocks record");
5175 FunctionBBs.resize(Record[0]);
5178 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5179 if (BBFRI == BasicBlockFwdRefs.
end()) {
5180 for (BasicBlock *&BB : FunctionBBs)
5183 auto &BBRefs = BBFRI->second;
5185 if (BBRefs.size() > FunctionBBs.size())
5186 return error(
"Invalid ID");
5187 assert(!BBRefs.empty() &&
"Unexpected empty array");
5188 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5189 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5191 if (
I < RE && BBRefs[
I]) {
5192 BBRefs[
I]->insertInto(
F);
5193 FunctionBBs[
I] = BBRefs[
I];
5199 BasicBlockFwdRefs.
erase(BBFRI);
5202 CurBB = FunctionBBs[0];
5209 return error(
"Invalid blockaddr users record");
5225 BackwardRefFunctions.push_back(
F);
5227 return error(
"Invalid blockaddr users record");
5234 I = getLastInstruction();
5237 return error(
"Invalid debug_loc_again record");
5238 I->setDebugLoc(LastLoc);
5243 I = getLastInstruction();
5245 return error(
"Invalid debug loc record");
5253 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5256 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5258 return error(
"Invalid debug loc record");
5262 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5264 return error(
"Invalid debug loc record");
5267 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5268 isImplicitCode, AtomGroup, AtomRank);
5269 I->setDebugLoc(LastLoc);
5277 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5279 return error(
"Invalid unary operator record");
5283 return error(
"Invalid unary operator record");
5287 if (OpNum <
Record.size()) {
5291 I->setFastMathFlags(FMF);
5300 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5304 return error(
"Invalid binary operator record");
5308 return error(
"Invalid binary operator record");
5312 if (OpNum <
Record.size()) {
5313 if (
Opc == Instruction::Add ||
5314 Opc == Instruction::Sub ||
5315 Opc == Instruction::Mul ||
5316 Opc == Instruction::Shl) {
5321 }
else if (
Opc == Instruction::SDiv ||
5322 Opc == Instruction::UDiv ||
5323 Opc == Instruction::LShr ||
5324 Opc == Instruction::AShr) {
5327 }
else if (
Opc == Instruction::Or) {
5333 I->setFastMathFlags(FMF);
5342 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5343 OpNum + 1 >
Record.size())
5344 return error(
"Invalid cast record");
5346 ResTypeID =
Record[OpNum++];
5347 Type *ResTy = getTypeByID(ResTypeID);
5350 if (
Opc == -1 || !ResTy)
5351 return error(
"Invalid cast record");
5356 assert(CurBB &&
"No current BB?");
5362 return error(
"Invalid cast");
5366 if (OpNum <
Record.size()) {
5367 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5370 }
else if (
Opc == Instruction::Trunc) {
5375 }
else if (
Opc == Instruction::AddrSpaceCast) {
5385 I->setFastMathFlags(FMF);
5404 Ty = getTypeByID(TyID);
5408 TyID = InvalidTypeID;
5413 unsigned BasePtrTypeID;
5414 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5416 return error(
"Invalid gep record");
5419 TyID = getContainedTypeID(BasePtrTypeID);
5420 if (
BasePtr->getType()->isVectorTy())
5421 TyID = getContainedTypeID(TyID);
5422 Ty = getTypeByID(TyID);
5425 SmallVector<Value*, 16> GEPIdx;
5426 while (OpNum !=
Record.size()) {
5429 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5430 return error(
"Invalid gep record");
5441 unsigned SubType = 0;
5442 if (GTI.isStruct()) {
5444 Idx->getType()->isVectorTy()
5446 :
cast<ConstantInt>(Idx);
5449 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5456 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5457 if (
I->getType()->isVectorTy())
5458 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5461 GEP->setNoWrapFlags(NW);
5470 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5471 return error(
"Invalid extractvalue record");
5474 unsigned RecSize =
Record.size();
5475 if (OpNum == RecSize)
5476 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5478 SmallVector<unsigned, 4> EXTRACTVALIdx;
5479 ResTypeID = AggTypeID;
5480 for (; OpNum != RecSize; ++OpNum) {
5485 if (!IsStruct && !IsArray)
5486 return error(
"EXTRACTVAL: Invalid type");
5487 if ((
unsigned)Index != Index)
5488 return error(
"Invalid value");
5490 return error(
"EXTRACTVAL: Invalid struct index");
5492 return error(
"EXTRACTVAL: Invalid array index");
5493 EXTRACTVALIdx.
push_back((
unsigned)Index);
5497 ResTypeID = getContainedTypeID(ResTypeID, Index);
5500 ResTypeID = getContainedTypeID(ResTypeID);
5514 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5515 return error(
"Invalid insertvalue record");
5518 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5519 return error(
"Invalid insertvalue record");
5521 unsigned RecSize =
Record.size();
5522 if (OpNum == RecSize)
5523 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5525 SmallVector<unsigned, 4> INSERTVALIdx;
5527 for (; OpNum != RecSize; ++OpNum) {
5532 if (!IsStruct && !IsArray)
5533 return error(
"INSERTVAL: Invalid type");
5534 if ((
unsigned)Index != Index)
5535 return error(
"Invalid value");
5537 return error(
"INSERTVAL: Invalid struct index");
5539 return error(
"INSERTVAL: Invalid array index");
5541 INSERTVALIdx.
push_back((
unsigned)Index);
5549 return error(
"Inserted value type doesn't match aggregate type");
5552 ResTypeID = AggTypeID;
5564 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5566 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5568 popValue(Record, OpNum, NextValueNo, CondType,
5569 getVirtualTypeID(CondType),
Cond, CurBB))
5570 return error(
"Invalid select record");
5583 unsigned ValTypeID, CondTypeID;
5584 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5586 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5588 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5589 return error(
"Invalid vector select record");
5592 if (VectorType* vector_type =
5595 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5596 return error(
"Invalid type for value");
5600 return error(
"Invalid type for value");
5604 ResTypeID = ValTypeID;
5609 I->setFastMathFlags(FMF);
5617 unsigned VecTypeID, IdxTypeID;
5618 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5619 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5620 return error(
"Invalid extractelement record");
5622 return error(
"Invalid type for value");
5624 ResTypeID = getContainedTypeID(VecTypeID);
5631 Value *Vec, *Elt, *Idx;
5632 unsigned VecTypeID, IdxTypeID;
5633 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5634 return error(
"Invalid insertelement record");
5636 return error(
"Invalid type for value");
5637 if (popValue(Record, OpNum, NextValueNo,
5639 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5640 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5641 return error(
"Invalid insert element record");
5643 ResTypeID = VecTypeID;
5651 unsigned BaseTypeID, ValTypeID, OffsetTypeID;
5652 if (getValueTypePair(Record, OpNum, NextValueNo,
Base, BaseTypeID,
5654 getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB) ||
5655 getValueTypePair(Record, OpNum, NextValueNo,
Offset, OffsetTypeID,
5657 return error(
"Invalid bitinsert record");
5658 if (
const char *Reason =
5660 return error(Reason);
5662 ResTypeID = BaseTypeID;
5670 return error(
"Record is empty for bitextract");
5674 return error(
"Invalid bitextract result type");
5676 unsigned SrcTypeID, OffsetTypeID;
5677 if (getValueTypePair(Record, OpNum, NextValueNo, Src, SrcTypeID, CurBB) ||
5678 getValueTypePair(Record, OpNum, NextValueNo,
Offset, OffsetTypeID,
5680 return error(
"Invalid bitextract record");
5681 if (
const char *Reason =
5683 return error(Reason);
5693 unsigned Vec1TypeID;
5694 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5696 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5698 return error(
"Invalid shufflevector record");
5700 unsigned MaskTypeID;
5701 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5702 return error(
"Invalid shufflevector record");
5704 return error(
"Invalid type for value");
5706 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5708 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5723 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5724 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5726 return error(
"Invalid comparison record");
5728 if (OpNum >=
Record.size())
5730 "Invalid record: operand number exceeded available operands");
5735 if (IsFP &&
Record.size() > OpNum+1)
5740 return error(
"Invalid fcmp predicate");
5741 I =
new FCmpInst(PredVal,
LHS,
RHS);
5744 return error(
"Invalid icmp predicate");
5745 I =
new ICmpInst(PredVal,
LHS,
RHS);
5746 if (
Record.size() > OpNum + 1 &&
5751 if (OpNum + 1 !=
Record.size())
5752 return error(
"Invalid comparison record");
5754 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5756 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5759 I->setFastMathFlags(FMF);
5776 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5777 return error(
"Invalid ret record");
5778 if (OpNum !=
Record.size())
5779 return error(
"Invalid ret record");
5787 return error(
"Invalid br record");
5788 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5790 return error(
"Invalid br record");
5792 if (
Record.size() == 1) {
5797 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5800 getVirtualTypeID(CondType), CurBB);
5801 if (!FalseDest || !
Cond)
5802 return error(
"Invalid br record");
5810 return error(
"Invalid cleanupret record");
5813 Value *CleanupPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5814 getVirtualTypeID(TokenTy), CurBB);
5816 return error(
"Invalid cleanupret record");
5818 if (
Record.size() == 2) {
5819 UnwindDest = getBasicBlock(Record[Idx++]);
5821 return error(
"Invalid cleanupret record");
5830 return error(
"Invalid catchret record");
5833 Value *CatchPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5834 getVirtualTypeID(TokenTy), CurBB);
5836 return error(
"Invalid catchret record");
5837 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5839 return error(
"Invalid catchret record");
5848 return error(
"Invalid catchswitch record");
5853 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5854 getVirtualTypeID(TokenTy), CurBB);
5856 return error(
"Invalid catchswitch record");
5858 unsigned NumHandlers =
Record[Idx++];
5861 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5862 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5864 return error(
"Invalid catchswitch record");
5869 if (Idx + 1 ==
Record.size()) {
5870 UnwindDest = getBasicBlock(Record[Idx++]);
5872 return error(
"Invalid catchswitch record");
5875 if (
Record.size() != Idx)
5876 return error(
"Invalid catchswitch record");
5880 for (BasicBlock *Handler : Handlers)
5881 CatchSwitch->addHandler(Handler);
5883 ResTypeID = getVirtualTypeID(
I->getType());
5891 return error(
"Invalid catchpad/cleanuppad record");
5896 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5897 getVirtualTypeID(TokenTy), CurBB);
5899 return error(
"Invalid catchpad/cleanuppad record");
5901 unsigned NumArgOperands =
Record[Idx++];
5903 SmallVector<Value *, 2>
Args;
5904 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5907 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5908 return error(
"Invalid catchpad/cleanuppad record");
5909 Args.push_back(Val);
5912 if (
Record.size() != Idx)
5913 return error(
"Invalid catchpad/cleanuppad record");
5919 ResTypeID = getVirtualTypeID(
I->getType());
5925 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5931 unsigned OpTyID =
Record[1];
5932 Type *OpTy = getTypeByID(OpTyID);
5938 return error(
"Invalid switch record");
5940 unsigned NumCases =
Record[4];
5945 unsigned CurIdx = 5;
5946 for (
unsigned i = 0; i != NumCases; ++i) {
5948 unsigned NumItems =
Record[CurIdx++];
5949 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5950 bool isSingleNumber =
Record[CurIdx++];
5953 unsigned ActiveWords = 1;
5954 if (ValueBitWidth > 64)
5955 ActiveWords =
Record[CurIdx++];
5958 CurIdx += ActiveWords;
5960 if (!isSingleNumber) {
5962 if (ValueBitWidth > 64)
5963 ActiveWords =
Record[CurIdx++];
5966 CurIdx += ActiveWords;
5977 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5978 for (ConstantInt *Cst : CaseVals)
5979 SI->addCase(Cst, DestBB);
5988 return error(
"Invalid switch record");
5989 unsigned OpTyID =
Record[0];
5990 Type *OpTy = getTypeByID(OpTyID);
5994 return error(
"Invalid switch record");
5995 unsigned NumCases = (
Record.size()-3)/2;
5998 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
6000 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
6001 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
6002 if (!CaseVal || !DestBB) {
6004 return error(
"Invalid switch record");
6006 SI->addCase(CaseVal, DestBB);
6013 return error(
"Invalid indirectbr record");
6014 unsigned OpTyID =
Record[0];
6015 Type *OpTy = getTypeByID(OpTyID);
6018 return error(
"Invalid indirectbr record");
6019 unsigned NumDests =
Record.size()-2;
6022 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
6023 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
6027 return error(
"Invalid indirectbr record");
6037 return error(
"Invalid invoke record");
6040 unsigned CCInfo =
Record[OpNum++];
6041 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
6042 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
6044 unsigned FTyID = InvalidTypeID;
6045 FunctionType *FTy =
nullptr;
6046 if ((CCInfo >> 13) & 1) {
6050 return error(
"Explicit invoke type is not a function type");
6054 unsigned CalleeTypeID;
6055 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6057 return error(
"Invalid invoke record");
6061 return error(
"Callee is not a pointer");
6063 FTyID = getContainedTypeID(CalleeTypeID);
6066 return error(
"Callee is not of pointer to function type");
6068 if (
Record.size() < FTy->getNumParams() + OpNum)
6069 return error(
"Insufficient operands to call");
6071 SmallVector<Value*, 16>
Ops;
6072 SmallVector<unsigned, 16> ArgTyIDs;
6073 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6074 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6075 Ops.push_back(
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6079 return error(
"Invalid invoke record");
6082 if (!FTy->isVarArg()) {
6083 if (
Record.size() != OpNum)
6084 return error(
"Invalid invoke record");
6087 while (OpNum !=
Record.size()) {
6090 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6091 return error(
"Invalid invoke record");
6098 if (!OperandBundles.empty())
6103 ResTypeID = getContainedTypeID(FTyID);
6104 OperandBundles.clear();
6107 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
6118 Value *Val =
nullptr;
6120 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
6121 return error(
"Invalid resume record");
6130 unsigned CCInfo =
Record[OpNum++];
6132 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
6133 unsigned NumIndirectDests =
Record[OpNum++];
6134 SmallVector<BasicBlock *, 16> IndirectDests;
6135 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
6136 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
6138 unsigned FTyID = InvalidTypeID;
6139 FunctionType *FTy =
nullptr;
6144 return error(
"Explicit call type is not a function type");
6148 unsigned CalleeTypeID;
6149 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6151 return error(
"Invalid callbr record");
6155 return error(
"Callee is not a pointer type");
6157 FTyID = getContainedTypeID(CalleeTypeID);
6160 return error(
"Callee is not of pointer to function type");
6162 if (
Record.size() < FTy->getNumParams() + OpNum)
6163 return error(
"Insufficient operands to call");
6165 SmallVector<Value*, 16>
Args;
6166 SmallVector<unsigned, 16> ArgTyIDs;
6168 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6170 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6171 if (FTy->getParamType(i)->isLabelTy())
6172 Arg = getBasicBlock(Record[OpNum]);
6174 Arg =
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6177 return error(
"Invalid callbr record");
6178 Args.push_back(Arg);
6183 if (!FTy->isVarArg()) {
6184 if (OpNum !=
Record.size())
6185 return error(
"Invalid callbr record");
6187 while (OpNum !=
Record.size()) {
6190 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6191 return error(
"Invalid callbr record");
6198 if (!OperandBundles.empty())
6203 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6206 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6211 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6212 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6213 unsigned LabelNo = ArgNo - FirstBlockArg;
6215 if (!BA || BA->getFunction() !=
F ||
6216 LabelNo > IndirectDests.
size() ||
6217 BA->getBasicBlock() != IndirectDests[LabelNo])
6218 return error(
"callbr argument does not match indirect dest");
6223 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6227 for (
Value *Arg : Args)
6230 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6233 std::string Constraints =
IA->getConstraintString().str();
6236 for (
const auto &CI : ConstraintInfo) {
6238 if (ArgNo >= FirstBlockArg)
6239 Constraints.insert(Pos,
"!");
6244 Pos = Constraints.find(
',', Pos);
6245 if (Pos == std::string::npos)
6251 IA->hasSideEffects(),
IA->isAlignStack(),
6252 IA->getDialect(),
IA->canThrow());
6258 ResTypeID = getContainedTypeID(FTyID);
6259 OperandBundles.clear();
6276 return error(
"Invalid phi record");
6278 unsigned TyID =
Record[0];
6279 Type *Ty = getTypeByID(TyID);
6281 return error(
"Invalid phi record");
6286 size_t NumArgs = (
Record.size() - 1) / 2;
6290 return error(
"Invalid phi record");
6294 SmallDenseMap<BasicBlock *, Value *>
Args;
6295 for (
unsigned i = 0; i != NumArgs; i++) {
6296 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6299 return error(
"Invalid phi BB");
6306 auto It =
Args.find(BB);
6308 if (It !=
Args.end()) {
6322 if (!PhiConstExprBB)
6324 EdgeBB = PhiConstExprBB;
6332 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6334 V =
getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6338 return error(
"Invalid phi record");
6341 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6342 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6343 PhiConstExprBB =
nullptr;
6346 Args.insert({BB,
V});
6352 if (
Record.size() % 2 == 0) {
6356 I->setFastMathFlags(FMF);
6368 return error(
"Invalid landingpad record");
6372 return error(
"Invalid landingpad record");
6374 ResTypeID =
Record[Idx++];
6375 Type *Ty = getTypeByID(ResTypeID);
6377 return error(
"Invalid landingpad record");
6379 Value *PersFn =
nullptr;
6380 unsigned PersFnTypeID;
6381 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6383 return error(
"Invalid landingpad record");
6385 if (!
F->hasPersonalityFn())
6388 return error(
"Personality function mismatch");
6391 bool IsCleanup = !!
Record[Idx++];
6392 unsigned NumClauses =
Record[Idx++];
6395 for (
unsigned J = 0; J != NumClauses; ++J) {
6401 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6404 return error(
"Invalid landingpad record");
6409 "Catch clause has a invalid type!");
6412 "Filter clause has invalid type!");
6423 return error(
"Invalid alloca record");
6424 using APV = AllocaPackedValues;
6428 unsigned TyID =
Record[0];
6429 Type *Ty = getTypeByID(TyID);
6431 TyID = getContainedTypeID(TyID);
6432 Ty = getTypeByID(TyID);
6434 return error(
"Missing element type for old-style alloca");
6436 unsigned OpTyID =
Record[1];
6437 Type *OpTy = getTypeByID(OpTyID);
6438 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6443 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6447 return error(
"Invalid alloca record");
6449 const DataLayout &
DL = TheModule->getDataLayout();
6450 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6453 return error(
"alloca of unsized type");
6455 Align =
DL.getPrefTypeAlign(Ty);
6457 if (!
Size->getType()->isIntegerTy())
6458 return error(
"alloca element count must have integer type");
6460 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6464 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6472 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6473 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6474 return error(
"Invalid load record");
6477 return error(
"Load operand is not a pointer type");
6480 if (OpNum + 3 ==
Record.size()) {
6481 ResTypeID =
Record[OpNum++];
6482 Ty = getTypeByID(ResTypeID);
6484 ResTypeID = getContainedTypeID(OpTypeID);
6485 Ty = getTypeByID(ResTypeID);
6489 return error(
"Missing load type");
6491 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6495 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6498 return error(
"load of unsized type");
6500 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6501 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6510 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6511 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size() &&
6512 OpNum + 6 !=
Record.size()))
6513 return error(
"Invalid load atomic record");
6516 return error(
"Load operand is not a pointer type");
6519 if (
Record.size() >= OpNum + 5) {
6520 ResTypeID =
Record[OpNum++];
6521 Ty = getTypeByID(ResTypeID);
6523 ResTypeID = getContainedTypeID(OpTypeID);
6524 Ty = getTypeByID(ResTypeID);
6528 return error(
"Missing atomic load type");
6530 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6534 if (Ordering == AtomicOrdering::NotAtomic ||
6535 Ordering == AtomicOrdering::Release ||
6536 Ordering == AtomicOrdering::AcquireRelease)
6537 return error(
"Invalid load atomic record");
6538 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6539 return error(
"Invalid load atomic record");
6540 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6541 bool IsElementwise =
Record.size() > OpNum + 4 &&
Record[OpNum + 4];
6544 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6547 return error(
"Alignment missing from atomic load");
6550 LoadStoreInstProperties{
Record[OpNum + 1] != 0, *
Align,
6560 unsigned PtrTypeID, ValTypeID;
6561 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6562 return error(
"Invalid store record");
6565 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6566 return error(
"Invalid store record");
6568 ValTypeID = getContainedTypeID(PtrTypeID);
6569 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6570 ValTypeID, Val, CurBB))
6571 return error(
"Invalid store record");
6574 if (OpNum + 2 !=
Record.size())
6575 return error(
"Invalid store record");
6580 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6583 return error(
"store of unsized type");
6585 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6586 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6596 unsigned PtrTypeID, ValTypeID;
6597 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6599 return error(
"Invalid store atomic record");
6601 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6602 return error(
"Invalid store atomic record");
6604 ValTypeID = getContainedTypeID(PtrTypeID);
6605 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6606 ValTypeID, Val, CurBB))
6607 return error(
"Invalid store atomic record");
6610 if (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size())
6611 return error(
"Invalid store atomic record");
6616 if (Ordering == AtomicOrdering::NotAtomic ||
6617 Ordering == AtomicOrdering::Acquire ||
6618 Ordering == AtomicOrdering::AcquireRelease)
6619 return error(
"Invalid store atomic record");
6620 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6621 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6622 return error(
"Invalid store atomic record");
6625 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6628 return error(
"Alignment missing from atomic store");
6630 bool IsElementwise =
Record.size() > OpNum + 4 &&
Record[OpNum + 4];
6634 LoadStoreInstProperties{
Record[OpNum + 1] != 0, *
Align,
6643 const size_t NumRecords =
Record.size();
6645 Value *Ptr =
nullptr;
6647 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6648 return error(
"Invalid cmpxchg record");
6651 return error(
"Cmpxchg operand is not a pointer type");
6654 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6655 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6656 CmpTypeID, Cmp, CurBB))
6657 return error(
"Invalid cmpxchg record");
6660 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6662 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6663 return error(
"Invalid cmpxchg record");
6667 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6668 SuccessOrdering == AtomicOrdering::Unordered)
6669 return error(
"Invalid cmpxchg record");
6671 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6673 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6681 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6682 FailureOrdering == AtomicOrdering::Unordered)
6683 return error(
"Invalid cmpxchg record");
6686 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6688 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6689 FailureOrdering, SSID);
6692 if (NumRecords < 8) {
6696 I->insertInto(CurBB, CurBB->
end());
6698 ResTypeID = CmpTypeID;
6701 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6702 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6711 const size_t NumRecords =
Record.size();
6713 Value *Ptr =
nullptr;
6715 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6716 return error(
"Invalid cmpxchg record");
6719 return error(
"Cmpxchg operand is not a pointer type");
6723 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6724 return error(
"Invalid cmpxchg record");
6726 Value *Val =
nullptr;
6727 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6729 return error(
"Invalid cmpxchg record");
6731 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6732 return error(
"Invalid cmpxchg record");
6734 const bool IsVol =
Record[OpNum];
6739 return error(
"Invalid cmpxchg success ordering");
6741 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6743 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6749 return error(
"Invalid cmpxchg failure ordering");
6751 const bool IsWeak =
Record[OpNum + 4];
6755 if (NumRecords == (OpNum + 6)) {
6756 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6761 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6763 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6764 FailureOrdering, SSID);
6768 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6769 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6778 const size_t NumRecords =
Record.size();
6781 Value *Ptr =
nullptr;
6783 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6784 return error(
"Invalid atomicrmw record");
6787 return error(
"Invalid atomicrmw record");
6789 Value *Val =
nullptr;
6790 unsigned ValTypeID = InvalidTypeID;
6792 ValTypeID = getContainedTypeID(PtrTypeID);
6793 if (popValue(Record, OpNum, NextValueNo,
6794 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6795 return error(
"Invalid atomicrmw record");
6797 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6798 return error(
"Invalid atomicrmw record");
6801 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6802 return error(
"Invalid atomicrmw record");
6804 bool IsElementwise =
false;
6809 return error(
"Invalid atomicrmw record");
6811 const bool IsVol =
Record[OpNum + 1];
6814 if (Ordering == AtomicOrdering::NotAtomic ||
6815 Ordering == AtomicOrdering::Unordered)
6816 return error(
"Invalid atomicrmw record");
6818 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6822 if (NumRecords == (OpNum + 5)) {
6823 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6829 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6831 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID,
6833 ResTypeID = ValTypeID;
6841 return error(
"Invalid fence record");
6843 if (Ordering == AtomicOrdering::NotAtomic ||
6844 Ordering == AtomicOrdering::Unordered ||
6845 Ordering == AtomicOrdering::Monotonic)
6846 return error(
"Invalid fence record");
6848 I =
new FenceInst(
Context, Ordering, SSID);
6855 SeenDebugRecord =
true;
6858 return error(
"Invalid dbg record: missing instruction");
6861 Inst->
getParent()->insertDbgRecordBefore(
6872 SeenDebugRecord =
true;
6875 return error(
"Invalid dbg record: missing instruction");
6892 DILocalVariable *Var =
6894 DIExpression *Expr =
6907 unsigned SlotBefore =
Slot;
6908 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6909 return error(
"Invalid dbg record: invalid value");
6911 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6914 RawLocation = getFnMetadataByID(Record[Slot++]);
6917 DbgVariableRecord *DVR =
nullptr;
6921 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6922 DbgVariableRecord::LocationType::Value);
6925 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6926 DbgVariableRecord::LocationType::Declare);
6929 DVR =
new DbgVariableRecord(
6930 RawLocation, Var, Expr, DIL,
6931 DbgVariableRecord::LocationType::DeclareValue);
6935 DIExpression *AddrExpr =
6937 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6938 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, ID, Addr, AddrExpr,
6951 return error(
"Invalid call record");
6955 unsigned CCInfo =
Record[OpNum++];
6961 return error(
"Fast math flags indicator set for call with no FMF");
6964 unsigned FTyID = InvalidTypeID;
6965 FunctionType *FTy =
nullptr;
6970 return error(
"Explicit call type is not a function type");
6974 unsigned CalleeTypeID;
6975 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6977 return error(
"Invalid call record");
6981 return error(
"Callee is not a pointer type");
6983 FTyID = getContainedTypeID(CalleeTypeID);
6986 return error(
"Callee is not of pointer to function type");
6988 if (
Record.size() < FTy->getNumParams() + OpNum)
6989 return error(
"Insufficient operands to call");
6991 SmallVector<Value*, 16>
Args;
6992 SmallVector<unsigned, 16> ArgTyIDs;
6994 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6995 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6996 if (FTy->getParamType(i)->isLabelTy())
6997 Args.push_back(getBasicBlock(Record[OpNum]));
7000 FTy->getParamType(i), ArgTyID, CurBB));
7003 return error(
"Invalid call record");
7007 if (!FTy->isVarArg()) {
7008 if (OpNum !=
Record.size())
7009 return error(
"Invalid call record");
7011 while (OpNum !=
Record.size()) {
7014 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
7015 return error(
"Invalid call record");
7022 if (!OperandBundles.empty())
7026 ResTypeID = getContainedTypeID(FTyID);
7027 OperandBundles.clear();
7041 SeenDebugIntrinsic =
true;
7044 if (
auto *ListAsValue =
7057 return error(
"Fast-math-flags specified for call without "
7058 "floating-point scalar or vector return type");
7059 I->setFastMathFlags(FMF);
7065 return error(
"Invalid va_arg record");
7066 unsigned OpTyID =
Record[0];
7067 Type *OpTy = getTypeByID(OpTyID);
7070 Type *ResTy = getTypeByID(ResTypeID);
7071 if (!OpTy || !
Op || !ResTy)
7072 return error(
"Invalid va_arg record");
7073 I =
new VAArgInst(
Op, ResTy);
7083 if (
Record.empty() || Record[0] >= BundleTags.size())
7084 return error(
"Invalid operand bundle record");
7086 std::vector<Value *> Inputs;
7089 while (OpNum !=
Record.size()) {
7091 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
7092 return error(
"Invalid operand bundle record");
7093 Inputs.push_back(
Op);
7096 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
7104 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
7105 return error(
"Invalid freeze record");
7106 if (OpNum !=
Record.size())
7107 return error(
"Invalid freeze record");
7109 I =
new FreezeInst(
Op);
7110 ResTypeID = OpTypeID;
7120 return error(
"Invalid instruction with no BB");
7122 if (!OperandBundles.empty()) {
7124 return error(
"Operand bundles found with no consumer");
7126 I->insertInto(CurBB, CurBB->
end());
7129 if (
I->isTerminator()) {
7131 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
7135 if (!
I->getType()->isVoidTy()) {
7136 assert(
I->getType() == getTypeByID(ResTypeID) &&
7137 "Incorrect result type ID");
7145 if (!OperandBundles.empty())
7146 return error(
"Operand bundles found with no consumer");
7150 if (!
A->getParent()) {
7152 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
7158 return error(
"Never resolved value found in function");
7163 if (MDLoader->hasFwdRefs())
7164 return error(
"Invalid function metadata: outgoing forward refs");
7169 for (
const auto &Pair : ConstExprEdgeBBs) {
7180 ValueList.
shrinkTo(ModuleValueListSize);
7181 MDLoader->shrinkTo(ModuleMDLoaderSize);
7182 std::vector<BasicBlock*>().swap(FunctionBBs);
7187Error BitcodeReader::findFunctionInStream(
7189 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
7190 while (DeferredFunctionInfoIterator->second == 0) {
7195 assert(VSTOffset == 0 || !
F->hasName());
7198 if (
Error Err = rememberAndSkipFunctionBodies())
7204SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7207 if (Val >= SSIDs.
size())
7216Error BitcodeReader::materialize(GlobalValue *GV) {
7219 if (!
F || !
F->isMaterializable())
7222 auto DFII = DeferredFunctionInfo.
find(
F);
7223 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7226 if (DFII->second == 0)
7227 if (
Error Err = findFunctionInStream(
F, DFII))
7231 if (
Error Err = materializeMetadata())
7238 if (
Error Err = parseFunctionBody(
F))
7240 F->setIsMaterializable(
false);
7244 if (SeenDebugIntrinsic && SeenDebugRecord)
7245 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7251 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7252 F->setSubprogram(SP);
7255 if (!MDLoader->isStrippingTBAA()) {
7257 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7260 MDLoader->setStripTBAA(
true);
7267 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7268 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7274 unsigned ExpectedNumOperands = 0;
7276 ExpectedNumOperands = 2;
7278 ExpectedNumOperands =
SI->getNumSuccessors();
7280 ExpectedNumOperands = 1;
7284 ExpectedNumOperands = 2;
7291 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7292 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7298 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7299 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7301 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7302 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7303 CI->getArgOperand(ArgNo)->getType(),
7304 CI->getParamAttributes(ArgNo)));
7307 if (
Function *OldFn = CI->getCalledFunction()) {
7308 auto It = UpgradedIntrinsics.
find(OldFn);
7309 if (It != UpgradedIntrinsics.
end())
7313 BC && BC->getSrcTy() == BC->getDestTy() &&
7319 CI && CI->isMustTailCall() && CI->getNextNode() == BC) {
7320 BC->replaceAllUsesWith(CI);
7321 BC->eraseFromParent();
7331 return materializeForwardReferencedFunctions();
7334Error BitcodeReader::materializeModule() {
7335 if (
Error Err = materializeMetadata())
7339 WillMaterializeAllForwardRefs =
true;
7344 if (
Error Err = materialize(&
F))
7350 if (LastFunctionBlockBit || NextUnreadBit)
7352 ? LastFunctionBlockBit
7358 if (!BasicBlockFwdRefs.
empty())
7359 return error(
"Never resolved function from blockaddress");
7365 for (
auto &[OldFn, NewFn] : UpgradedIntrinsics) {
7366 for (User *U : OldFn->users()) {
7370 if (OldFn != NewFn) {
7371 if (!OldFn->use_empty())
7372 OldFn->replaceAllUsesWith(NewFn);
7373 OldFn->eraseFromParent();
7376 UpgradedIntrinsics.clear();
7391std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7392 return IdentifiedStructTypes;
7395ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7396 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7397 StringRef ModulePath, std::function<
bool(StringRef)> IsPrevailing,
7398 std::function<
void(ValueInfo)> OnValueInfo)
7399 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7400 ModulePath(ModulePath), IsPrevailing(IsPrevailing),
7401 OnValueInfo(OnValueInfo) {}
7403void ModuleSummaryIndexBitcodeReader::addThisModule() {
7408ModuleSummaryIndexBitcodeReader::getThisModule() {
7412template <
bool AllowNullValueInfo>
7413std::pair<ValueInfo, GlobalValue::GUID>
7414ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7415 auto VGI = ValueIdToValueInfoMap[ValueId];
7422 assert(AllowNullValueInfo || std::get<0>(VGI));
7426void ModuleSummaryIndexBitcodeReader::setValueGUID(
7428 StringRef SourceFileName) {
7430 if (ValueID < DefinedGUIDs.size())
7431 ValueGUID = DefinedGUIDs[ValueID];
7438 auto OriginalNameID = ValueGUID;
7442 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7450 ValueIdToValueInfoMap[ValueID] = std::make_pair(VI, OriginalNameID);
7458Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7460 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7467 if (!MaybeCurrentBit)
7474 SmallVector<uint64_t, 64>
Record;
7483 BitstreamEntry
Entry = MaybeEntry.
get();
7485 switch (
Entry.Kind) {
7488 return error(
"Malformed block");
7504 switch (MaybeRecord.
get()) {
7509 return error(
"Invalid vst_code_entry record");
7510 unsigned ValueID =
Record[0];
7512 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7513 assert(VLI != ValueIdToLinkageMap.
end() &&
7514 "No linkage found for VST entry?");
7523 return error(
"Invalid vst_code_fnentry record");
7524 unsigned ValueID =
Record[0];
7526 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7527 assert(VLI != ValueIdToLinkageMap.
end() &&
7528 "No linkage found for VST entry?");
7536 unsigned ValueID =
Record[0];
7540 ValueIdToValueInfoMap[ValueID] =
7551Error ModuleSummaryIndexBitcodeReader::parseModule() {
7555 SmallVector<uint64_t, 64>
Record;
7556 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7557 unsigned ValueId = 0;
7561 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
7564 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7566 switch (
Entry.Kind) {
7568 return error(
"Malformed block");
7580 if (
Error Err = readBlockInfo())
7586 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7587 !SeenGlobalValSummary) &&
7588 "Expected early VST parse via VSTOffset record");
7595 if (!SourceFileName.
empty())
7597 assert(!SeenValueSymbolTable &&
7598 "Already read VST when parsing summary block?");
7603 if (VSTOffset > 0) {
7604 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7606 SeenValueSymbolTable =
true;
7608 SeenGlobalValSummary =
true;
7609 if (
Error Err = parseEntireSummary(
Entry.ID))
7613 if (
Error Err = parseModuleStringTable())
7621 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7624 switch (MaybeBitCode.
get()) {
7628 if (
Error Err = parseVersionRecord(Record).takeError())
7636 return error(
"Invalid source filename record");
7643 return error(
"Invalid hash length " + Twine(
Record.size()));
7644 auto &Hash = getThisModule()->second;
7646 for (
auto &Val : Record) {
7647 assert(!(Val >> 32) &&
"Unexpected high bits set");
7655 return error(
"Invalid vstoffset record");
7659 VSTOffset =
Record[0] - 1;
7664 DefinedGUIDs.reserve(DefinedGUIDs.size() +
Record.size() / 2);
7665 for (
size_t i = 0; i <
Record.size(); i += 2)
7666 DefinedGUIDs.push_back(Record[i] << 32 | Record[i + 1]);
7676 ArrayRef<uint64_t> GVRecord;
7677 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7678 if (GVRecord.
size() <= 3)
7679 return error(
"Invalid global record");
7683 ValueIdToLinkageMap[ValueId++] =
Linkage;
7687 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7698ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7702 Ret.
push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7707ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7708 bool IsOldProfileFormat,
7709 bool HasProfile,
bool HasRelBF) {
7713 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7718 for (
unsigned I = 0,
E =
Record.size();
I !=
E; ++
I) {
7720 bool HasTailCall =
false;
7722 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7723 if (IsOldProfileFormat) {
7727 }
else if (HasProfile)
7728 std::tie(Hotness, HasTailCall) =
7762 static_cast<size_t>(
Record[Slot + 1])};
7785 while (Slot <
Record.size())
7789std::vector<FunctionSummary::ParamAccess>
7790ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7791 auto ReadRange = [&]() {
7793 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7795 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7802 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7803 while (!
Record.empty()) {
7804 PendingParamAccesses.emplace_back();
7805 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7807 ParamAccess.
Use = ReadRange();
7812 std::get<0>(getValueInfoFromValueId(
Record.consume_front()));
7813 Call.Offsets = ReadRange();
7816 return PendingParamAccesses;
7819void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7820 ArrayRef<uint64_t> Record,
size_t &Slot,
7823 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7827void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7828 ArrayRef<uint64_t> Record) {
7836 while (Slot <
Record.size())
7837 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7840SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7841 ArrayRef<uint64_t> Record,
unsigned &
I) {
7842 SmallVector<unsigned> StackIdList;
7846 if (RadixArray.empty()) {
7847 unsigned NumStackEntries =
Record[
I++];
7849 StackIdList.
reserve(NumStackEntries);
7850 for (
unsigned J = 0; J < NumStackEntries; J++) {
7851 assert(Record[
I] < StackIds.size());
7852 StackIdList.
push_back(getStackIdIndex(Record[
I++]));
7855 unsigned RadixIndex =
Record[
I++];
7861 assert(RadixIndex < RadixArray.size());
7862 unsigned NumStackIds = RadixArray[RadixIndex++];
7863 StackIdList.
reserve(NumStackIds);
7864 while (NumStackIds--) {
7865 assert(RadixIndex < RadixArray.size());
7866 unsigned Elem = RadixArray[RadixIndex];
7867 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7868 RadixIndex = RadixIndex - Elem;
7869 assert(RadixIndex < RadixArray.size());
7870 Elem = RadixArray[RadixIndex];
7872 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7875 StackIdList.
push_back(getStackIdIndex(Elem));
7885 unsigned FirstWORef = Refs.
size() - WOCnt;
7886 unsigned RefNo = FirstWORef - ROCnt;
7887 for (; RefNo < FirstWORef; ++RefNo)
7888 Refs[RefNo].setReadOnly();
7889 for (; RefNo < Refs.
size(); ++RefNo)
7890 Refs[RefNo].setWriteOnly();
7895Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7898 SmallVector<uint64_t, 64>
Record;
7905 BitstreamEntry
Entry = MaybeEntry.
get();
7908 return error(
"Invalid Summary Block: record for version expected");
7913 return error(
"Invalid Summary Block: version expected");
7916 const bool IsOldProfileFormat =
Version == 1;
7919 const bool MemProfAfterFunctionSummary =
Version >= 13;
7921 return error(
"Invalid summary version " + Twine(
Version) +
" in module '" +
7922 ModulePath +
"'. Version should be in the range [1-" +
7928 GlobalValueSummary *LastSeenSummary =
nullptr;
7938 FunctionSummary *CurrentPrevailingFS =
nullptr;
7943 std::vector<GlobalValue::GUID> PendingTypeTests;
7944 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7945 PendingTypeCheckedLoadVCalls;
7946 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7947 PendingTypeCheckedLoadConstVCalls;
7948 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7950 std::vector<CallsiteInfo> PendingCallsites;
7951 std::vector<AllocInfo> PendingAllocs;
7952 std::vector<uint64_t> PendingContextIds;
7958 BitstreamEntry
Entry = MaybeEntry.
get();
7960 switch (
Entry.Kind) {
7963 return error(
"Malformed block");
7979 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7982 unsigned BitCode = MaybeBitCode.
get();
7999 ValueIdToValueInfoMap[ValueID] =
8017 unsigned ValueID =
Record[0];
8019 unsigned InstCount =
Record[2];
8021 unsigned NumRefs =
Record[3];
8022 unsigned NumRORefs = 0, NumWORefs = 0;
8023 int RefListStartIndex = 4;
8027 RefListStartIndex = 5;
8030 RefListStartIndex = 6;
8033 RefListStartIndex = 7;
8044 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8046 "Record size inconsistent with number of references");
8048 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8053 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8054 IsOldProfileFormat, HasProfile, HasRelBF);
8056 auto [
VI,
GUID] = getValueInfoFromValueId(ValueID);
8063 IsPrevailing(
VI.name());
8069 assert(!MemProfAfterFunctionSummary ||
8070 (PendingCallsites.empty() && PendingAllocs.empty()));
8071 if (!IsPrevailingSym && !MemProfAfterFunctionSummary) {
8072 PendingCallsites.clear();
8073 PendingAllocs.clear();
8076 auto FS = std::make_unique<FunctionSummary>(
8078 std::move(Calls), std::move(PendingTypeTests),
8079 std::move(PendingTypeTestAssumeVCalls),
8080 std::move(PendingTypeCheckedLoadVCalls),
8081 std::move(PendingTypeTestAssumeConstVCalls),
8082 std::move(PendingTypeCheckedLoadConstVCalls),
8083 std::move(PendingParamAccesses), std::move(PendingCallsites),
8084 std::move(PendingAllocs));
8085 FS->setModulePath(getThisModule()->first());
8086 FS->setOriginalName(GUID);
8089 if (MemProfAfterFunctionSummary) {
8090 if (IsPrevailingSym)
8091 CurrentPrevailingFS =
FS.get();
8093 CurrentPrevailingFS =
nullptr;
8102 unsigned ValueID =
Record[0];
8104 unsigned AliaseeID =
Record[2];
8106 auto AS = std::make_unique<AliasSummary>(Flags);
8112 AS->setModulePath(getThisModule()->first());
8114 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
8116 if (!AliaseeInModule)
8117 return error(
"Alias expects aliasee summary to be parsed");
8118 AS->setAliasee(AliaseeVI, AliaseeInModule);
8120 auto GUID = getValueInfoFromValueId(ValueID);
8121 AS->setOriginalName(std::get<1>(GUID));
8127 unsigned ValueID =
Record[0];
8129 unsigned RefArrayStart = 2;
8130 GlobalVarSummary::GVarFlags GVF(
false,
8140 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8142 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8143 FS->setModulePath(getThisModule()->first());
8144 auto GUID = getValueInfoFromValueId(ValueID);
8145 FS->setOriginalName(std::get<1>(GUID));
8153 unsigned ValueID =
Record[0];
8156 unsigned NumRefs =
Record[3];
8157 unsigned RefListStartIndex = 4;
8158 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
8161 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8163 for (
unsigned I = VTableListStartIndex,
E =
Record.size();
I !=
E; ++
I) {
8164 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
8169 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8170 VS->setModulePath(getThisModule()->first());
8171 VS->setVTableFuncs(VTableFuncs);
8172 auto GUID = getValueInfoFromValueId(ValueID);
8173 VS->setOriginalName(std::get<1>(GUID));
8185 unsigned ValueID =
Record[0];
8188 unsigned InstCount =
Record[3];
8190 unsigned NumRefs =
Record[4];
8191 unsigned NumRORefs = 0, NumWORefs = 0;
8192 int RefListStartIndex = 5;
8196 RefListStartIndex = 6;
8197 size_t NumRefsIndex = 5;
8199 unsigned NumRORefsOffset = 1;
8200 RefListStartIndex = 7;
8203 RefListStartIndex = 8;
8205 RefListStartIndex = 9;
8207 NumRORefsOffset = 2;
8210 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
8212 NumRefs =
Record[NumRefsIndex];
8216 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8218 "Record size inconsistent with number of references");
8220 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8223 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8224 IsOldProfileFormat, HasProfile,
false);
8225 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8227 auto FS = std::make_unique<FunctionSummary>(
8229 std::move(Edges), std::move(PendingTypeTests),
8230 std::move(PendingTypeTestAssumeVCalls),
8231 std::move(PendingTypeCheckedLoadVCalls),
8232 std::move(PendingTypeTestAssumeConstVCalls),
8233 std::move(PendingTypeCheckedLoadConstVCalls),
8234 std::move(PendingParamAccesses), std::move(PendingCallsites),
8235 std::move(PendingAllocs));
8236 LastSeenSummary =
FS.get();
8237 if (MemProfAfterFunctionSummary)
8238 CurrentPrevailingFS =
FS.get();
8239 LastSeenGUID =
VI.getGUID();
8240 FS->setModulePath(ModuleIdMap[ModuleId]);
8248 unsigned ValueID =
Record[0];
8251 unsigned AliaseeValueId =
Record[3];
8253 auto AS = std::make_unique<AliasSummary>(Flags);
8254 LastSeenSummary = AS.get();
8255 AS->setModulePath(ModuleIdMap[ModuleId]);
8257 auto AliaseeVI = std::get<0>(
8258 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(AliaseeValueId));
8260 auto AliaseeInModule =
8262 AS->setAliasee(AliaseeVI, AliaseeInModule);
8264 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8265 LastSeenGUID =
VI.getGUID();
8271 unsigned ValueID =
Record[0];
8274 unsigned RefArrayStart = 3;
8275 GlobalVarSummary::GVarFlags GVF(
false,
8285 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8287 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8288 LastSeenSummary =
FS.get();
8289 FS->setModulePath(ModuleIdMap[ModuleId]);
8290 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8291 LastSeenGUID =
VI.getGUID();
8298 if (!LastSeenSummary)
8299 return error(
"Name attachment that does not follow a combined record");
8303 LastSeenSummary =
nullptr;
8308 assert(PendingTypeTests.empty());
8313 assert(PendingTypeTestAssumeVCalls.empty());
8314 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8315 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8319 assert(PendingTypeCheckedLoadVCalls.empty());
8320 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8321 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8325 PendingTypeTestAssumeConstVCalls.push_back(
8330 PendingTypeCheckedLoadConstVCalls.push_back(
8337 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8338 StringRef
Name(Strtab.
data() + Record[
I],
8339 static_cast<size_t>(Record[
I + 1]));
8342 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, GUID);
8345 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8347 StringRef
Name(Strtab.
data() + Record[
I + 1],
8348 static_cast<size_t>(Record[
I + 2]));
8349 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8358 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8359 StringRef
Name(Strtab.
data() + Record[
I],
8360 static_cast<size_t>(Record[
I + 1]));
8363 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, GUID);
8366 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8368 StringRef
Name(Strtab.
data() + Record[
I + 1],
8369 static_cast<size_t>(Record[
I + 2]));
8370 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8381 parseTypeIdCompatibleVtableSummaryRecord(Record);
8389 PendingParamAccesses = parseParamAccesses(Record);
8396 assert(StackIds.empty());
8398 StackIds = ArrayRef<uint64_t>(Record);
8404 StackIds.reserve(
Record.size() / 2);
8405 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8406 StackIds.push_back(*R << 32 | *(R + 1));
8408 assert(StackIdToIndex.empty());
8410 StackIdToIndex.resize(StackIds.size(), UninitializedStackIdIndex);
8415 RadixArray = ArrayRef<uint64_t>(Record);
8422 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8424 unsigned ValueID =
Record[0];
8425 SmallVector<unsigned> StackIdList;
8427 assert(R < StackIds.size());
8428 StackIdList.
push_back(getStackIdIndex(R));
8430 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8431 if (MemProfAfterFunctionSummary)
8433 CallsiteInfo({
VI, std::move(StackIdList)}));
8435 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8442 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8443 auto RecordIter =
Record.begin();
8444 unsigned ValueID = *RecordIter++;
8445 unsigned NumStackIds = *RecordIter++;
8446 unsigned NumVersions = *RecordIter++;
8447 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8448 SmallVector<unsigned> StackIdList;
8449 for (
unsigned J = 0; J < NumStackIds; J++) {
8450 assert(*RecordIter < StackIds.size());
8451 StackIdList.
push_back(getStackIdIndex(*RecordIter++));
8453 SmallVector<unsigned> Versions;
8454 for (
unsigned J = 0; J < NumVersions; J++)
8456 ValueInfo
VI = std::get<0>(
8457 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8458 if (MemProfAfterFunctionSummary)
8460 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8462 PendingCallsites.push_back(
8463 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8470 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8475 PendingContextIds.reserve(
Record.size() / 2);
8476 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8477 PendingContextIds.push_back(*R << 32 | *(R + 1));
8484 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS) {
8485 PendingContextIds.clear();
8489 std::vector<MIBInfo> MIBs;
8490 unsigned NumMIBs = 0;
8493 unsigned MIBsRead = 0;
8494 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8498 auto StackIdList = parseAllocInfoContext(Record,
I);
8499 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8505 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8507 assert(!PendingContextIds.empty() &&
8508 "Missing context ids for alloc sizes");
8509 unsigned ContextIdIndex = 0;
8515 while (MIBsRead++ < NumMIBs) {
8517 unsigned NumContextSizeInfoEntries =
Record[
I++];
8519 std::vector<ContextTotalSize> ContextSizes;
8520 ContextSizes.reserve(NumContextSizeInfoEntries);
8521 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8522 assert(ContextIdIndex < PendingContextIds.size());
8524 if (PendingContextIds[ContextIdIndex] == 0) {
8533 ContextSizes.push_back(
8534 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8536 AllContextSizes.push_back(std::move(ContextSizes));
8538 PendingContextIds.clear();
8540 AllocInfo AI(std::move(MIBs));
8541 if (!AllContextSizes.empty()) {
8542 assert(AI.MIBs.size() == AllContextSizes.size());
8543 AI.ContextSizeInfos = std::move(AllContextSizes);
8546 if (MemProfAfterFunctionSummary)
8547 CurrentPrevailingFS->
addAlloc(std::move(AI));
8549 PendingAllocs.push_back(std::move(AI));
8557 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8559 std::vector<MIBInfo> MIBs;
8560 unsigned NumMIBs =
Record[
I++];
8561 unsigned NumVersions =
Record[
I++];
8562 unsigned MIBsRead = 0;
8563 while (MIBsRead++ < NumMIBs) {
8566 SmallVector<unsigned> StackIdList;
8568 StackIdList = parseAllocInfoContext(Record,
I);
8569 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8572 SmallVector<uint8_t> Versions;
8573 for (
unsigned J = 0; J < NumVersions; J++)
8576 AllocInfo AI(std::move(Versions), std::move(MIBs));
8577 if (MemProfAfterFunctionSummary)
8578 CurrentPrevailingFS->
addAlloc(std::move(AI));
8580 PendingAllocs.push_back(std::move(AI));
8590Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8594 SmallVector<uint64_t, 64>
Record;
8596 SmallString<128> ModulePath;
8603 BitstreamEntry
Entry = MaybeEntry.
get();
8605 switch (
Entry.Kind) {
8608 return error(
"Malformed block");
8620 switch (MaybeRecord.
get()) {
8628 return error(
"Invalid code_entry record");
8630 LastSeenModule = TheIndex.
addModule(ModulePath);
8631 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8639 return error(
"Invalid hash length " + Twine(
Record.size()));
8640 if (!LastSeenModule)
8641 return error(
"Invalid hash that does not follow a module path");
8643 for (
auto &Val : Record) {
8644 assert(!(Val >> 32) &&
"Unexpected high bits set");
8645 LastSeenModule->
second[Pos++] = Val;
8648 LastSeenModule =
nullptr;
8661class BitcodeErrorCategoryType :
public std::error_category {
8662 const char *
name()
const noexcept
override {
8663 return "llvm.bitcode";
8666 std::string message(
int IE)
const override {
8669 case BitcodeError::CorruptedBitcode:
8670 return "Corrupted bitcode";
8679 static BitcodeErrorCategoryType ErrorCategory;
8680 return ErrorCategory;
8684 unsigned Block,
unsigned RecordID) {
8686 return std::move(Err);
8695 switch (Entry.Kind) {
8700 return error(
"Malformed block");
8704 return std::move(Err);
8714 if (MaybeRecord.
get() == RecordID)
8725Expected<std::vector<BitcodeModule>>
8729 return FOrErr.takeError();
8730 return std::move(FOrErr->Mods);
8755 switch (Entry.Kind) {
8758 return error(
"Malformed block");
8761 uint64_t IdentificationBit = -1ull;
8765 return std::move(Err);
8771 Entry = MaybeEntry.
get();
8776 return error(
"Malformed block");
8782 return std::move(Err);
8801 if (!
I.Strtab.empty())
8808 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8809 F.StrtabForSymtab = *Strtab;
8825 if (
F.Symtab.empty())
8826 F.Symtab = *SymtabOrErr;
8831 return std::move(Err);
8836 return std::move(E);
8851BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8852 bool ShouldLazyLoadMetadata,
bool IsImporting,
8856 std::string ProducerIdentification;
8857 if (IdentificationBit != -1ull) {
8859 return std::move(JumpFailed);
8862 return std::move(
E);
8866 return std::move(JumpFailed);
8867 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8870 std::unique_ptr<Module>
M =
8871 std::make_unique<Module>(ModuleIdentifier,
Context);
8872 M->setMaterializer(R);
8875 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8876 IsImporting, Callbacks))
8877 return std::move(Err);
8879 if (MaterializeAll) {
8881 if (
Error Err =
M->materializeAll())
8882 return std::move(Err);
8885 if (
Error Err =
R->materializeForwardReferencedFunctions())
8886 return std::move(Err);
8889 return std::move(M);
8892Expected<std::unique_ptr<Module>>
8895 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8905 std::function<
bool(
StringRef)> IsPrevailing,
8906 std::function<
void(
ValueInfo)> OnValueInfo) {
8911 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8912 ModulePath, IsPrevailing, OnValueInfo);
8913 return R.parseModule();
8920 return std::move(JumpFailed);
8922 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8923 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8924 ModuleIdentifier, 0);
8926 if (
Error Err = R.parseModule())
8927 return std::move(Err);
8929 return std::move(Index);
8935 return std::move(Err);
8941 return std::move(
E);
8943 switch (Entry.Kind) {
8946 return error(
"Malformed block");
8949 return std::make_pair(
false,
false);
8961 switch (MaybeBitCode.
get()) {
8967 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8969 bool EnableSplitLTOUnit = Flags & 0x8;
8970 bool UnifiedLTO = Flags & 0x200;
8971 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8982 return std::move(JumpFailed);
8985 return std::move(Err);
8990 return std::move(E);
8992 switch (Entry.Kind) {
8994 return error(
"Malformed block");
9005 return Flags.takeError();
9015 return std::move(Err);
9022 return StreamFailed.takeError();
9032 if (MsOrErr->size() != 1)
9033 return error(
"Expected a single module");
9035 return (*MsOrErr)[0];
9038Expected<std::unique_ptr<Module>>
9040 bool ShouldLazyLoadMetadata,
bool IsImporting,
9046 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
9051 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
9052 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
9054 IsImporting, Callbacks);
9056 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
9062 return getModuleImpl(Context,
true,
false,
false, Callbacks);
9074 return BM->parseModule(Context, Callbacks);
9107 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
9116 return BM->getSummary();
9124 return BM->getLTOInfo();
9129 bool IgnoreEmptyThinLTOIndexFile) {
9134 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< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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")
#define LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_PUSH
#define LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_POP
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.
static LLVM_ABI const char * areInvalidOperands(Value *Base, Value *Val, Value *Offset)
Return a string if the specified operands are invalid for a bitinsert operation, otherwise return nul...
static BitInsertInst * Create(Value *Base, Value *Val, Value *Offset, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Represents a module in a bitcode file.
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getSummary()
Parse the specified bitcode buffer, returning the module summary index.
LLVM_ABI Expected< BitcodeLTOInfo > getLTOInfo()
Returns information about the module to be used for LTO: whether to compile with ThinLTO,...
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
LLVM_ABI Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(StringRef)> IsPrevailing=nullptr, std::function< void(ValueInfo)> OnValueInfo=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata, bool IsImporting, ParserCallbacks Callbacks={})
Read the bitcode module and prepare for lazy deserialization of function bodies.
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
void push_back(Value *V, unsigned TypeID)
void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV)
Error assignValue(unsigned Idx, Value *V, unsigned TypeID)
void shrinkTo(unsigned N)
unsigned getTypeID(unsigned ValNo) const
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
ArrayRef< uint8_t > getBitcodeBytes() const
Expected< word_t > Read(unsigned NumBits)
Expected< BitstreamEntry > advance(unsigned Flags=0)
Advance the current bitstream, returning the next entry in the stream.
Expected< BitstreamEntry > advanceSkippingSubblocks(unsigned Flags=0)
This is a convenience function for clients that don't expect any subblocks.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP=nullptr)
Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
Error SkipBlock()
Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body of this block.
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
uint64_t getCurrentByteNo() const
LLVM_ABI Expected< std::optional< BitstreamBlockInfo > > ReadBlockInfoBlock(bool ReadBlockInfoNames=false)
Read and return a block info block from the bitstream.
unsigned getAbbrevIDWidth() const
Return the number of bits used to encode an abbrev #.
bool canSkipToPos(size_t pos) const
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
@ MIN_BYTE_BITS
Minimum number of bits that can be specified.
@ MAX_BYTE_BITS
Maximum number of bits that can be specified Note that bit width is stored in the Type classes Subcla...
static LLVM_ABI ByteType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing a ByteType.
bool isInlineAsm() const
Check if this call is an inline asm statement.
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CaptureInfo createFromIntValue(uint32_t Data)
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
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_SUPPRESS_DEPRECATED_DECLARATIONS_PUSH 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 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 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)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
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.
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()
MemoryEffectsBase getWithModRef(Location Loc, ModRefInfo MR) const
Get new MemoryEffectsBase with modified ModRefInfo for Loc.
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
ModRefInfo getModRef(Location Loc) const
Get ModRefInfo for the given Location.
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
bool isSized() const
Return true if it makes sense to take the size of this type.
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.
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.
constexpr uint8_t RecordLength
Length of the parts of a physical GOFF record.
@ BasicBlock
Various leaf nodes.
static const int NoAliasScopeDeclScopeArg
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_HYBRID_PATCHABLE
@ 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
@ MODULE_CODE_ASM_PROPERTY
@ 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_BITEXTRACT
@ 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_BITINSERT
@ FUNC_CODE_INST_CMPXCHG_OLD
@ FUNC_CODE_DEBUG_RECORD_DECLARE
@ FUNC_CODE_OPERAND_BUNDLE
@ PARAMATTR_CODE_ENTRY_OLD
@ PARAMATTR_GRP_CODE_ENTRY
initializer< Ty > init(const Ty &Val)
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
NodeAddr< FuncNode * > Func
friend class Instruction
Iterator for Instructions in a `BasicBlock.
constexpr bool IsBigEndianHost
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
StringMapEntry< Value * > ValueName
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
LLVM_ABI const std::error_category & BitcodeErrorCategory()
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
LLVM_ABI void UpgradeInlineAsmString(std::string *AsmStr)
Upgrade comment in call to inline asm that represents an objc retain release marker.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
std::error_code make_error_code(BitcodeError E)
LLVM_ABI bool stripDebugInfo(Function &F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Expected< bool > isBitcodeContainingObjCCategory(MemoryBufferRef Buffer)
Return true if Buffer contains a bitcode file with ObjC code (category or class) in it.
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI void UpgradeAttributes(AttrBuilder &B)
Upgrade attributes that changed format or kind.
LLVM_ABI Expected< std::string > getBitcodeTargetTriple(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the triple information.
LLVM_ABI std::unique_ptr< Module > parseModule(const uint8_t *Data, size_t Size, LLVMContext &Context)
Fuzzer friendly interface for the llvm bitcode parser.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI Expected< BitcodeFileContents > getBitcodeFileContents(MemoryBufferRef Buffer)
Returns the contents of a bitcode file.
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
LLVM_ABI bool UpgradeCFIFunctionsMetadata(Module &M)
Upgrade the cfi.functions metadata node by calculating and inserting the GUID for each function entry...
LLVM_ABI void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
auto uninitialized_copy(R &&Src, IterTy Dst)
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
bool isa_and_nonnull(const Y &Val)
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
LLVM_ABI void UpgradeOperandBundles(std::vector< OperandBundleDef > &OperandBundles)
Upgrade operand bundles (without knowing about their user instruction).
LLVM_ABI Constant * UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy)
This is an auto-upgrade for bitcast constant expression between pointers with different address space...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndex(MemoryBufferRef Buffer)
Parse the specified bitcode buffer, returning the module summary index.
auto dyn_cast_or_null(const Y &Val)
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
LLVM_ABI Expected< std::string > getBitcodeProducerString(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the producer string information.
auto reverse(ContainerTy &&C)
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyBitcodeModule(MemoryBufferRef Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Read the header of the specified bitcode buffer and prepare for lazy deserialization of function bodi...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
detail::ValueMatchesPoly< M > HasValue(M Matcher)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI std::string UpgradeDataLayoutString(StringRef DL, StringRef Triple)
Upgrade the datalayout string by adding a section for address space pointers.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
LLVM_ABI Expected< BitcodeLTOInfo > getBitcodeLTOInfo(MemoryBufferRef Buffer)
Returns LTO information for the specified bitcode file.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI GlobalVariable * UpgradeGlobalVariable(GlobalVariable *GV)
This checks for global variables which should be upgraded.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
AtomicOrdering
Atomic ordering for LLVM's memory model.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
@ ArgMem
Access to memory via argument pointers.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
LLVM_ABI Instruction * UpgradeBitCastInst(unsigned Opc, Value *V, Type *DestTy, Instruction *&Temp)
This is an auto-upgrade for bitcast between pointers with different address spaces: the instruction i...
MaybeAlign decodeMaybeAlign(unsigned Value)
Dual operation of the encode function above.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr, const unsigned char *&BufEnd, bool VerifyBufferSize)
SkipBitcodeWrapperHeader - Some systems wrap bc files with a special header for padding or other reas...
bool isBitcodeWrapper(const unsigned char *BufPtr, const unsigned char *BufEnd)
isBitcodeWrapper - Return true if the given bytes are the magic bytes for an LLVM IR bitcode wrapper.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI APInt readWideAPInt(ArrayRef< uint64_t > Vals, unsigned TypeBits)
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
LLVM_ABI void UpgradeFunctionAttributes(Function &F)
Correct any IR that is relying on old function attribute behavior.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
LLVM_ABI Error readModuleSummaryIndex(MemoryBufferRef Buffer, ModuleSummaryIndex &CombinedIndex)
Parse the specified bitcode buffer and merge the index into CombinedIndex.
void consumeError(Error Err)
Consume a Error without doing anything.
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
LLVM_ABI bool set(StringRef Name, std::string Value)
Set a property using a string name.
std::optional< ValueTypeCallbackTy > ValueType
The ValueType callback is called for every function definition or declaration and allows accessing th...
std::optional< DataLayoutCallbackFuncTy > DataLayout
std::optional< MDTypeCallbackTy > MDType
The MDType callback is called for every value in metadata.
bool SkipDebugIntrinsicUpgrade
If true, do not auto-upgrade debug intrinsic calls (llvm.dbg.
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
Kind
Specifies which kind of type check we should emit for this byte array.
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
ValID - Represents a reference of a definition of some sort with no type.
Struct that holds a reference to a particular GUID in a global value summary.
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...
std::string SingleImplName