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:
1769 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1772 case Instruction::ExtractElement:
1775 case Instruction::InsertElement:
1779 case Instruction::ShuffleVector: {
1780 SmallVector<int, 16>
Mask;
1792 MaterializedValues.
insert({ValID,
C});
1798 return error(Twine(
"Value referenced by initializer is an unsupported "
1799 "constant expression of type ") +
1800 BC->getOpcodeName());
1806 BC->getType(),
"constexpr", InsertBB);
1809 "constexpr", InsertBB);
1812 Ops[1],
"constexpr", InsertBB);
1815 I->setHasNoSignedWrap();
1817 I->setHasNoUnsignedWrap();
1823 switch (BC->Opcode) {
1824 case BitcodeConstant::ConstantVectorOpcode: {
1825 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1828 Value *Idx = ConstantInt::get(IdxTy, Pair.index());
1835 case BitcodeConstant::ConstantStructOpcode:
1836 case BitcodeConstant::ConstantArrayOpcode: {
1840 "constexpr.ins", InsertBB);
1844 case Instruction::ICmp:
1845 case Instruction::FCmp:
1848 "constexpr", InsertBB);
1850 case Instruction::GetElementPtr:
1856 case Instruction::Select:
1859 case Instruction::ExtractElement:
1862 case Instruction::InsertElement:
1866 case Instruction::ShuffleVector:
1867 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1875 MaterializedValues.
insert({ValID,
I});
1879 return MaterializedValues[StartValID];
1882Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1883 Expected<Value *> MaybeV = materializeValue(ID,
nullptr);
1891StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1894 IdentifiedStructTypes.push_back(Ret);
1898StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1900 IdentifiedStructTypes.push_back(Ret);
1916 case Attribute::ZExt:
return 1 << 0;
1917 case Attribute::SExt:
return 1 << 1;
1918 case Attribute::NoReturn:
return 1 << 2;
1919 case Attribute::InReg:
return 1 << 3;
1920 case Attribute::StructRet:
return 1 << 4;
1921 case Attribute::NoUnwind:
return 1 << 5;
1922 case Attribute::NoAlias:
return 1 << 6;
1923 case Attribute::ByVal:
return 1 << 7;
1924 case Attribute::Nest:
return 1 << 8;
1925 case Attribute::ReadNone:
return 1 << 9;
1926 case Attribute::ReadOnly:
return 1 << 10;
1927 case Attribute::NoInline:
return 1 << 11;
1928 case Attribute::AlwaysInline:
return 1 << 12;
1929 case Attribute::OptimizeForSize:
return 1 << 13;
1930 case Attribute::StackProtect:
return 1 << 14;
1931 case Attribute::StackProtectReq:
return 1 << 15;
1932 case Attribute::Alignment:
return 31 << 16;
1934 case Attribute::NoRedZone:
return 1 << 22;
1935 case Attribute::NoImplicitFloat:
return 1 << 23;
1936 case Attribute::Naked:
return 1 << 24;
1937 case Attribute::InlineHint:
return 1 << 25;
1938 case Attribute::StackAlignment:
return 7 << 26;
1939 case Attribute::ReturnsTwice:
return 1 << 29;
1940 case Attribute::UWTable:
return 1 << 30;
1941 case Attribute::NonLazyBind:
return 1U << 31;
1942 case Attribute::SanitizeAddress:
return 1ULL << 32;
1943 case Attribute::MinSize:
return 1ULL << 33;
1944 case Attribute::NoDuplicate:
return 1ULL << 34;
1945 case Attribute::StackProtectStrong:
return 1ULL << 35;
1946 case Attribute::SanitizeThread:
return 1ULL << 36;
1947 case Attribute::SanitizeMemory:
return 1ULL << 37;
1948 case Attribute::NoBuiltin:
return 1ULL << 38;
1949 case Attribute::Returned:
return 1ULL << 39;
1950 case Attribute::Cold:
return 1ULL << 40;
1951 case Attribute::Builtin:
return 1ULL << 41;
1952 case Attribute::OptimizeNone:
return 1ULL << 42;
1953 case Attribute::InAlloca:
return 1ULL << 43;
1954 case Attribute::NonNull:
return 1ULL << 44;
1955 case Attribute::JumpTable:
return 1ULL << 45;
1956 case Attribute::Convergent:
return 1ULL << 46;
1957 case Attribute::SafeStack:
return 1ULL << 47;
1958 case Attribute::NoRecurse:
return 1ULL << 48;
1961 case Attribute::SwiftSelf:
return 1ULL << 51;
1962 case Attribute::SwiftError:
return 1ULL << 52;
1963 case Attribute::WriteOnly:
return 1ULL << 53;
1964 case Attribute::Speculatable:
return 1ULL << 54;
1965 case Attribute::StrictFP:
return 1ULL << 55;
1966 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1967 case Attribute::NoCfCheck:
return 1ULL << 57;
1968 case Attribute::OptForFuzzing:
return 1ULL << 58;
1969 case Attribute::ShadowCallStack:
return 1ULL << 59;
1970 case Attribute::SpeculativeLoadHardening:
1972 case Attribute::ImmArg:
1974 case Attribute::WillReturn:
1976 case Attribute::NoFree:
1992 if (
I == Attribute::Alignment)
1993 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1994 else if (
I == Attribute::StackAlignment)
1995 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1997 B.addTypeAttr(
I,
nullptr);
2011 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
2013 "Alignment must be a power of two.");
2016 B.addAlignmentAttr(Alignment);
2018 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
2019 (EncodedAttrs & 0xffff);
2021 if (AttrIdx == AttributeList::FunctionIndex) {
2024 if (Attrs & (1ULL << 9)) {
2026 Attrs &= ~(1ULL << 9);
2029 if (Attrs & (1ULL << 10)) {
2031 Attrs &= ~(1ULL << 10);
2034 if (Attrs & (1ULL << 49)) {
2036 Attrs &= ~(1ULL << 49);
2039 if (Attrs & (1ULL << 50)) {
2041 Attrs &= ~(1ULL << 50);
2044 if (Attrs & (1ULL << 53)) {
2046 Attrs &= ~(1ULL << 53);
2050 B.addMemoryAttr(ME);
2054 if (Attrs & (1ULL << 21)) {
2055 Attrs &= ~(1ULL << 21);
2062Error BitcodeReader::parseAttributeBlock() {
2066 if (!MAttributes.empty())
2067 return error(
"Invalid multiple blocks");
2069 SmallVector<uint64_t, 64>
Record;
2078 BitstreamEntry
Entry = MaybeEntry.
get();
2080 switch (
Entry.Kind) {
2083 return error(
"Malformed block");
2096 switch (MaybeRecord.
get()) {
2102 return error(
"Invalid parameter attribute record");
2104 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2110 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2115 Attrs.push_back(MAttributeGroups[Val]);
2117 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2130 return Attribute::Alignment;
2132 return Attribute::AlwaysInline;
2134 return Attribute::Builtin;
2136 return Attribute::ByVal;
2138 return Attribute::InAlloca;
2140 return Attribute::Cold;
2142 return Attribute::Convergent;
2144 return Attribute::DisableSanitizerInstrumentation;
2146 return Attribute::ElementType;
2148 return Attribute::FnRetThunkExtern;
2150 return Attribute::Flatten;
2152 return Attribute::InlineHint;
2154 return Attribute::InReg;
2156 return Attribute::JumpTable;
2158 return Attribute::Memory;
2160 return Attribute::NoFPClass;
2162 return Attribute::MinSize;
2164 return Attribute::Naked;
2166 return Attribute::Nest;
2168 return Attribute::NoAlias;
2170 return Attribute::NoBuiltin;
2172 return Attribute::NoCallback;
2174 return Attribute::NoDivergenceSource;
2176 return Attribute::NoDuplicate;
2178 return Attribute::NoFree;
2180 return Attribute::NoFreeObj;
2182 return Attribute::NoImplicitFloat;
2184 return Attribute::NoInline;
2186 return Attribute::NoRecurse;
2188 return Attribute::NoMerge;
2190 return Attribute::NonLazyBind;
2192 return Attribute::NonNull;
2194 return Attribute::Dereferenceable;
2196 return Attribute::DereferenceableOrNull;
2198 return Attribute::AllocAlign;
2200 return Attribute::AllocKind;
2202 return Attribute::AllocSize;
2204 return Attribute::AllocatedPointer;
2206 return Attribute::NoRedZone;
2208 return Attribute::NoReturn;
2210 return Attribute::NoSync;
2212 return Attribute::NoCfCheck;
2214 return Attribute::NoProfile;
2216 return Attribute::SkipProfile;
2218 return Attribute::NoUnwind;
2220 return Attribute::NoSanitizeBounds;
2222 return Attribute::NoSanitizeCoverage;
2224 return Attribute::NullPointerIsValid;
2226 return Attribute::OptimizeForDebugging;
2228 return Attribute::OptForFuzzing;
2230 return Attribute::OptimizeForSize;
2232 return Attribute::OptimizeNone;
2234 return Attribute::ReadNone;
2236 return Attribute::ReadOnly;
2238 return Attribute::Returned;
2240 return Attribute::ReturnsTwice;
2242 return Attribute::SExt;
2244 return Attribute::Speculatable;
2246 return Attribute::StackAlignment;
2248 return Attribute::StackProtect;
2250 return Attribute::StackProtectReq;
2252 return Attribute::StackProtectStrong;
2254 return Attribute::SafeStack;
2256 return Attribute::ShadowCallStack;
2258 return Attribute::StrictFP;
2260 return Attribute::StructRet;
2262 return Attribute::SanitizeAddress;
2264 return Attribute::SanitizeHWAddress;
2266 return Attribute::SanitizeThread;
2268 return Attribute::SanitizeType;
2270 return Attribute::SanitizeMemory;
2272 return Attribute::SanitizeNumericalStability;
2274 return Attribute::SanitizeRealtime;
2276 return Attribute::SanitizeRealtimeBlocking;
2278 return Attribute::SanitizeAllocToken;
2280 return Attribute::SpeculativeLoadHardening;
2282 return Attribute::SwiftError;
2284 return Attribute::SwiftSelf;
2286 return Attribute::SwiftAsync;
2288 return Attribute::UWTable;
2290 return Attribute::VScaleRange;
2292 return Attribute::WillReturn;
2294 return Attribute::WriteOnly;
2296 return Attribute::ZExt;
2298 return Attribute::ImmArg;
2300 return Attribute::SanitizeMemTag;
2302 return Attribute::Preallocated;
2304 return Attribute::NoUndef;
2306 return Attribute::ByRef;
2308 return Attribute::MustProgress;
2310 return Attribute::Hot;
2312 return Attribute::PresplitCoroutine;
2314 return Attribute::Writable;
2316 return Attribute::CoroDestroyOnlyWhenComplete;
2318 return Attribute::DeadOnUnwind;
2320 return Attribute::Range;
2322 return Attribute::Initializes;
2324 return Attribute::CoroElideSafe;
2326 return Attribute::NoExt;
2328 return Attribute::Captures;
2330 return Attribute::DeadOnReturn;
2332 return Attribute::NoCreateUndefOrPoison;
2334 return Attribute::DenormalFPEnv;
2336 return Attribute::NoOutline;
2338 return Attribute::NoIPA;
2343 MaybeAlign &Alignment) {
2346 if (
Exponent > Value::MaxAlignmentExponent + 1)
2347 return error(
"Invalid alignment value");
2352Error BitcodeReader::parseAttrKind(
uint64_t Code, Attribute::AttrKind *Kind) {
2354 if (*Kind == Attribute::None)
2355 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2360 switch (EncodedKind) {
2384Error BitcodeReader::parseAttributeGroupBlock() {
2388 if (!MAttributeGroups.empty())
2389 return error(
"Invalid multiple blocks");
2391 SmallVector<uint64_t, 64>
Record;
2398 BitstreamEntry
Entry = MaybeEntry.
get();
2400 switch (
Entry.Kind) {
2403 return error(
"Malformed block");
2416 switch (MaybeRecord.
get()) {
2421 return error(
"Invalid grp record");
2428 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2429 if (Record[i] == 0) {
2430 Attribute::AttrKind
Kind;
2432 if (Idx == AttributeList::FunctionIndex &&
2441 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2447 if (Kind == Attribute::ByVal)
2448 B.addByValAttr(
nullptr);
2449 else if (Kind == Attribute::StructRet)
2450 B.addStructRetAttr(
nullptr);
2451 else if (Kind == Attribute::InAlloca)
2452 B.addInAllocaAttr(
nullptr);
2453 else if (Kind == Attribute::UWTable)
2454 B.addUWTableAttr(UWTableKind::Default);
2455 else if (Kind == Attribute::DeadOnReturn)
2456 B.addDeadOnReturnAttr(DeadOnReturnInfo());
2457 else if (Attribute::isEnumAttrKind(Kind))
2458 B.addAttribute(Kind);
2460 return error(
"Not an enum attribute");
2461 }
else if (Record[i] == 1) {
2462 Attribute::AttrKind
Kind;
2463 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2465 if (!Attribute::isIntAttrKind(Kind))
2466 return error(
"Not an int attribute");
2467 if (Kind == Attribute::Alignment)
2468 B.addAlignmentAttr(Record[++i]);
2469 else if (Kind == Attribute::StackAlignment)
2470 B.addStackAlignmentAttr(Record[++i]);
2471 else if (Kind == Attribute::Dereferenceable)
2472 B.addDereferenceableAttr(Record[++i]);
2473 else if (Kind == Attribute::DereferenceableOrNull)
2474 B.addDereferenceableOrNullAttr(Record[++i]);
2475 else if (Kind == Attribute::DeadOnReturn)
2476 B.addDeadOnReturnAttr(
2478 else if (Kind == Attribute::AllocSize)
2479 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2480 else if (Kind == Attribute::VScaleRange)
2481 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2482 else if (Kind == Attribute::UWTable)
2484 else if (Kind == Attribute::AllocKind)
2485 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2486 else if (Kind == Attribute::Memory) {
2488 const uint8_t
Version = (EncodedME >> 56);
2502 if (getTargetTriple().isAArch64())
2507 B.addMemoryAttr(ME);
2512 EncodedME & 0x00FFFFFFFFFFFFFFULL);
2515 if (
Version == 1 && getTargetTriple().isAArch64())
2517 IRMemLocation::TargetMem0,
2518 ME.
getModRef(IRMemLocation::InaccessibleMem)) |
2520 IRMemLocation::TargetMem1,
2521 ME.
getModRef(IRMemLocation::InaccessibleMem));
2522 B.addMemoryAttr(ME);
2524 }
else if (Kind == Attribute::Captures)
2526 else if (Kind == Attribute::NoFPClass)
2529 else if (Kind == Attribute::DenormalFPEnv) {
2530 B.addDenormalFPEnvAttr(
2533 }
else if (Record[i] == 3 || Record[i] == 4) {
2535 SmallString<64> KindStr;
2536 SmallString<64> ValStr;
2538 while (Record[i] != 0 && i != e)
2540 assert(Record[i] == 0 &&
"Kind string not null terminated");
2545 while (Record[i] != 0 && i != e)
2547 assert(Record[i] == 0 &&
"Value string not null terminated");
2550 B.addAttribute(KindStr.
str(), ValStr.
str());
2551 }
else if (Record[i] == 5 || Record[i] == 6) {
2552 bool HasType =
Record[i] == 6;
2553 Attribute::AttrKind
Kind;
2554 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2556 if (!Attribute::isTypeAttrKind(Kind))
2557 return error(
"Not a type attribute");
2559 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2560 }
else if (Record[i] == 7) {
2561 Attribute::AttrKind
Kind;
2564 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2566 if (!Attribute::isConstantRangeAttrKind(Kind))
2567 return error(
"Not a ConstantRange attribute");
2569 Expected<ConstantRange> MaybeCR =
2570 readBitWidthAndConstantRange(Record, i);
2575 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2576 }
else if (Record[i] == 8) {
2577 Attribute::AttrKind
Kind;
2580 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2582 if (!Attribute::isConstantRangeListAttrKind(Kind))
2583 return error(
"Not a constant range list attribute");
2587 return error(
"Too few records for constant range list");
2588 unsigned RangeSize =
Record[i++];
2590 for (
unsigned Idx = 0; Idx < RangeSize; ++Idx) {
2591 Expected<ConstantRange> MaybeCR =
2592 readConstantRange(Record, i,
BitWidth);
2600 return error(
"Invalid (unordered or overlapping) range list");
2601 B.addConstantRangeListAttr(Kind, Val);
2603 return error(
"Invalid attribute group entry");
2608 B.addMemoryAttr(ME);
2611 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2618Error BitcodeReader::parseTypeTable() {
2622 return parseTypeTableBody();
2625Error BitcodeReader::parseTypeTableBody() {
2626 if (!TypeList.empty())
2627 return error(
"Invalid multiple blocks");
2629 SmallVector<uint64_t, 64>
Record;
2630 unsigned NumRecords = 0;
2639 BitstreamEntry
Entry = MaybeEntry.
get();
2641 switch (
Entry.Kind) {
2644 return error(
"Malformed block");
2646 if (NumRecords != TypeList.size())
2647 return error(
"Malformed block");
2656 Type *ResultTy =
nullptr;
2657 SmallVector<unsigned> ContainedIDs;
2661 switch (MaybeRecord.
get()) {
2663 return error(
"Invalid value");
2668 return error(
"Invalid numentry record");
2669 TypeList.resize(Record[0]);
2672 ResultTy = Type::getVoidTy(
Context);
2675 ResultTy = Type::getHalfTy(
Context);
2678 ResultTy = Type::getBFloatTy(
Context);
2681 ResultTy = Type::getFloatTy(
Context);
2684 ResultTy = Type::getDoubleTy(
Context);
2687 ResultTy = Type::getX86_FP80Ty(
Context);
2690 ResultTy = Type::getFP128Ty(
Context);
2693 ResultTy = Type::getPPC_FP128Ty(
Context);
2696 ResultTy = Type::getLabelTy(
Context);
2699 ResultTy = Type::getMetadataTy(
Context);
2707 ResultTy = Type::getX86_AMXTy(
Context);
2710 ResultTy = Type::getTokenTy(
Context);
2714 return error(
"Invalid record");
2719 return error(
"Bitwidth for byte type out of range");
2725 return error(
"Invalid integer record");
2730 return error(
"Bitwidth for integer type out of range");
2737 return error(
"Invalid pointer record");
2741 ResultTy = getTypeByID(Record[0]);
2743 !PointerType::isValidElementType(ResultTy))
2744 return error(
"Invalid type");
2751 return error(
"Invalid opaque pointer record");
2760 return error(
"Invalid function record");
2762 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2763 if (
Type *
T = getTypeByID(Record[i]))
2769 ResultTy = getTypeByID(Record[2]);
2770 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2771 return error(
"Invalid type");
2774 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2780 return error(
"Invalid function record");
2782 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2783 if (
Type *
T = getTypeByID(Record[i])) {
2784 if (!FunctionType::isValidArgumentType(
T))
2785 return error(
"Invalid function argument type");
2792 ResultTy = getTypeByID(Record[1]);
2793 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2794 return error(
"Invalid type");
2797 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2802 return error(
"Invalid anon struct record");
2804 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2805 if (
Type *
T = getTypeByID(Record[i]))
2811 return error(
"Invalid type");
2818 return error(
"Invalid struct name record");
2823 return error(
"Invalid named struct record");
2825 if (NumRecords >= TypeList.size())
2826 return error(
"Invalid TYPE table");
2832 TypeList[NumRecords] =
nullptr;
2834 Res = createIdentifiedStructType(
Context, TypeName);
2838 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2839 if (
Type *
T = getTypeByID(Record[i]))
2845 return error(
"Invalid named struct record");
2854 return error(
"Invalid opaque type record");
2856 if (NumRecords >= TypeList.size())
2857 return error(
"Invalid TYPE table");
2863 TypeList[NumRecords] =
nullptr;
2865 Res = createIdentifiedStructType(
Context, TypeName);
2872 return error(
"Invalid target extension type record");
2874 if (NumRecords >= TypeList.size())
2875 return error(
"Invalid TYPE table");
2877 if (Record[0] >=
Record.size())
2878 return error(
"Too many type parameters");
2880 unsigned NumTys =
Record[0];
2882 SmallVector<unsigned, 8> IntParams;
2883 for (
unsigned i = 0; i < NumTys; i++) {
2884 if (
Type *
T = getTypeByID(Record[i + 1]))
2887 return error(
"Invalid type");
2890 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2891 if (Record[i] > UINT_MAX)
2892 return error(
"Integer parameter too large");
2897 if (
auto E = TTy.takeError())
2905 return error(
"Invalid array type record");
2906 ResultTy = getTypeByID(Record[1]);
2907 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2908 return error(
"Invalid type");
2910 ResultTy = ArrayType::get(ResultTy, Record[0]);
2915 return error(
"Invalid vector type record");
2917 return error(
"Invalid vector length");
2918 ResultTy = getTypeByID(Record[1]);
2919 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2920 return error(
"Invalid type");
2923 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2927 if (NumRecords >= TypeList.size())
2928 return error(
"Invalid TYPE table");
2929 if (TypeList[NumRecords])
2931 "Invalid TYPE table: Only named structs can be forward referenced");
2932 assert(ResultTy &&
"Didn't read a type?");
2933 TypeList[NumRecords] = ResultTy;
2934 if (!ContainedIDs.
empty())
2935 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2940Error BitcodeReader::parseOperandBundleTags() {
2944 if (!BundleTags.empty())
2945 return error(
"Invalid multiple blocks");
2947 SmallVector<uint64_t, 64>
Record;
2953 BitstreamEntry
Entry = MaybeEntry.
get();
2955 switch (
Entry.Kind) {
2958 return error(
"Malformed block");
2972 return error(
"Invalid operand bundle record");
2975 BundleTags.emplace_back();
2977 return error(
"Invalid operand bundle record");
2982Error BitcodeReader::parseSyncScopeNames() {
2987 return error(
"Invalid multiple synchronization scope names blocks");
2989 SmallVector<uint64_t, 64>
Record;
2994 BitstreamEntry
Entry = MaybeEntry.
get();
2996 switch (
Entry.Kind) {
2999 return error(
"Malformed block");
3002 return error(
"Invalid empty synchronization scope names block");
3016 return error(
"Invalid sync scope record");
3018 SmallString<16> SSN;
3020 return error(
"Invalid sync scope record");
3028Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
3029 unsigned NameIndex, Triple &TT) {
3032 return error(
"Invalid record");
3033 unsigned ValueID =
Record[0];
3034 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3035 return error(
"Invalid record");
3036 Value *
V = ValueList[ValueID];
3039 if (NameStr.contains(0))
3040 return error(
"Invalid value name");
3041 V->setName(NameStr);
3043 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
3056 return std::move(JumpFailed);
3062 return error(
"Expected value symbol table subblock");
3066void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
3068 ArrayRef<uint64_t> Record) {
3073 uint64_t FuncBitOffset = FuncWordOffset * 32;
3074 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
3078 if (FuncBitOffset > LastFunctionBlockBit)
3079 LastFunctionBlockBit = FuncBitOffset;
3083Error BitcodeReader::parseGlobalValueSymbolTable() {
3084 unsigned FuncBitcodeOffsetDelta =
3090 SmallVector<uint64_t, 64>
Record;
3095 BitstreamEntry
Entry = MaybeEntry.
get();
3097 switch (
Entry.Kind) {
3100 return error(
"Malformed block");
3111 switch (MaybeRecord.
get()) {
3113 unsigned ValueID =
Record[0];
3114 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3115 return error(
"Invalid value reference in symbol table");
3116 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3133 if (!MaybeCurrentBit)
3135 CurrentBit = MaybeCurrentBit.
get();
3138 if (
Error Err = parseGlobalValueSymbolTable())
3159 unsigned FuncBitcodeOffsetDelta =
3165 SmallVector<uint64_t, 64>
Record;
3176 BitstreamEntry
Entry = MaybeEntry.
get();
3178 switch (
Entry.Kind) {
3181 return error(
"Malformed block");
3197 switch (MaybeRecord.
get()) {
3201 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3209 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3217 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3222 return error(
"Invalid bbentry record");
3225 return error(
"Invalid bbentry record");
3247Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3248 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3249 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3250 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3252 GlobalInitWorklist.swap(GlobalInits);
3253 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3254 FunctionOperandWorklist.swap(FunctionOperands);
3256 while (!GlobalInitWorklist.empty()) {
3257 unsigned ValID = GlobalInitWorklist.back().second;
3258 if (ValID >= ValueList.
size()) {
3260 GlobalInits.push_back(GlobalInitWorklist.back());
3262 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3265 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3267 GlobalInitWorklist.pop_back();
3270 while (!IndirectSymbolInitWorklist.empty()) {
3271 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3272 if (ValID >= ValueList.
size()) {
3273 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3275 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3279 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3282 return error(
"Alias and aliasee types don't match");
3287 return error(
"Expected an alias or an ifunc");
3290 IndirectSymbolInitWorklist.pop_back();
3293 while (!FunctionOperandWorklist.empty()) {
3294 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3295 if (
Info.PersonalityFn) {
3296 unsigned ValID =
Info.PersonalityFn - 1;
3297 if (ValID < ValueList.
size()) {
3298 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3301 Info.F->setPersonalityFn(MaybeC.
get());
3302 Info.PersonalityFn = 0;
3306 unsigned ValID =
Info.Prefix - 1;
3307 if (ValID < ValueList.
size()) {
3308 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3311 Info.F->setPrefixData(MaybeC.
get());
3315 if (
Info.Prologue) {
3316 unsigned ValID =
Info.Prologue - 1;
3317 if (ValID < ValueList.
size()) {
3318 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3321 Info.F->setPrologueData(MaybeC.
get());
3325 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3326 FunctionOperands.push_back(Info);
3327 FunctionOperandWorklist.pop_back();
3336 BitcodeReader::decodeSignRotatedValue);
3338 return APInt(TypeBits, Words);
3341Error BitcodeReader::parseConstants() {
3349 unsigned Int32TyID = getVirtualTypeID(CurTy);
3350 unsigned CurTyID = Int32TyID;
3351 Type *CurElemTy =
nullptr;
3352 unsigned NextCstNo = ValueList.
size();
3360 switch (Entry.Kind) {
3363 return error(
"Malformed block");
3365 if (NextCstNo != ValueList.
size())
3366 return error(
"Invalid constant reference");
3377 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
3380 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3390 return error(
"Invalid settype record");
3391 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3392 return error(
"Invalid settype record");
3393 if (TypeList[Record[0]] == VoidType)
3394 return error(
"Invalid constant type");
3396 CurTy = TypeList[CurTyID];
3397 CurElemTy = getPtrElementTypeByID(CurTyID);
3401 return error(
"Invalid type for a constant null value");
3404 return error(
"Invalid type for a constant null value");
3409 return error(
"Invalid integer const record");
3414 return error(
"Invalid wide integer const record");
3417 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3418 V = ConstantInt::get(CurTy, VInt);
3423 return error(
"Invalid byte const record");
3424 V = ConstantByte::get(CurTy, decodeSignRotatedValue(Record[0]),
3429 return error(
"Invalid wide byte const record");
3432 APInt VByte =
readWideAPInt(Record, ScalarTy->getBitWidth());
3433 V = ConstantByte::get(CurTy, VByte);
3438 return error(
"Invalid float const record");
3441 if (ScalarTy->isHalfTy())
3442 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3443 APInt(16, (uint16_t)Record[0])));
3444 else if (ScalarTy->isBFloatTy())
3445 V = ConstantFP::get(
3446 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3447 else if (ScalarTy->isFloatTy())
3448 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3449 APInt(32, (uint32_t)Record[0])));
3450 else if (ScalarTy->isDoubleTy())
3451 V = ConstantFP::get(
3452 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3453 else if (ScalarTy->isX86_FP80Ty()) {
3456 Rearrange[0] = (
Record[1] & 0xffffLL) | (Record[0] << 16);
3457 Rearrange[1] =
Record[0] >> 48;
3458 V = ConstantFP::get(
3459 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3460 }
else if (ScalarTy->isFP128Ty())
3461 V = ConstantFP::get(CurTy,
3462 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3463 else if (ScalarTy->isPPC_FP128Ty())
3464 V = ConstantFP::get(
3465 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3473 return error(
"Invalid aggregate record");
3475 SmallVector<unsigned, 16> Elts;
3479 V = BitcodeConstant::create(
3480 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3482 V = BitcodeConstant::create(
Alloc, CurTy,
3483 BitcodeConstant::ConstantArrayOpcode, Elts);
3485 V = BitcodeConstant::create(
3486 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3495 return error(
"Invalid string record");
3505 return error(
"Invalid data record");
3509 return error(
"Invalid type for value");
3512 SmallString<128> RawData;
3515 const char *Src =
reinterpret_cast<const char *
>(&Val);
3517 Src +=
sizeof(
uint64_t) - EltBytes;
3518 RawData.
append(Src, Src + EltBytes);
3523 : ConstantDataArray::getRaw(RawData.str(),
Record.
size(), EltTy);
3528 return error(
"Invalid unary op constexpr record");
3533 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3539 return error(
"Invalid binary op constexpr record");
3545 if (
Record.size() >= 4) {
3546 if (
Opc == Instruction::Add ||
3547 Opc == Instruction::Sub ||
3548 Opc == Instruction::Mul ||
3549 Opc == Instruction::Shl) {
3554 }
else if (
Opc == Instruction::SDiv ||
3555 Opc == Instruction::UDiv ||
3556 Opc == Instruction::LShr ||
3557 Opc == Instruction::AShr) {
3562 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3563 {(unsigned)Record[1], (
unsigned)
Record[2]});
3569 return error(
"Invalid cast constexpr record");
3574 unsigned OpTyID =
Record[1];
3575 Type *OpTy = getTypeByID(OpTyID);
3577 return error(
"Invalid cast constexpr record");
3578 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3590 return error(
"Constant GEP record must have at least two elements");
3592 Type *PointeeType =
nullptr;
3596 PointeeType = getTypeByID(Record[OpNum++]);
3599 std::optional<ConstantRange>
InRange;
3603 unsigned InRangeIndex =
Op >> 1;
3609 Expected<ConstantRange> MaybeInRange =
3610 readBitWidthAndConstantRange(Record, OpNum);
3619 SmallVector<unsigned, 16> Elts;
3620 unsigned BaseTypeID =
Record[OpNum];
3621 while (OpNum !=
Record.size()) {
3622 unsigned ElTyID =
Record[OpNum++];
3623 Type *ElTy = getTypeByID(ElTyID);
3625 return error(
"Invalid getelementptr constexpr record");
3629 if (Elts.
size() < 1)
3630 return error(
"Invalid gep with no operands");
3634 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3635 BaseType = getTypeByID(BaseTypeID);
3640 return error(
"GEP base operand must be pointer or vector of pointer");
3643 PointeeType = getPtrElementTypeByID(BaseTypeID);
3645 return error(
"Missing element type for old-style constant GEP");
3648 V = BitcodeConstant::create(
3650 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3656 return error(
"Invalid select constexpr record");
3658 V = BitcodeConstant::create(
3659 Alloc, CurTy, Instruction::Select,
3660 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3666 return error(
"Invalid extractelement constexpr record");
3667 unsigned OpTyID =
Record[0];
3671 return error(
"Invalid extractelement constexpr record");
3673 if (
Record.size() == 4) {
3674 unsigned IdxTyID =
Record[2];
3675 Type *IdxTy = getTypeByID(IdxTyID);
3677 return error(
"Invalid extractelement constexpr record");
3683 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3684 {(unsigned)Record[1], IdxRecord});
3690 if (
Record.size() < 3 || !OpTy)
3691 return error(
"Invalid insertelement constexpr record");
3693 if (
Record.size() == 4) {
3694 unsigned IdxTyID =
Record[2];
3695 Type *IdxTy = getTypeByID(IdxTyID);
3697 return error(
"Invalid insertelement constexpr record");
3703 V = BitcodeConstant::create(
3704 Alloc, CurTy, Instruction::InsertElement,
3705 {(unsigned)Record[0], (
unsigned)
Record[1], IdxRecord});
3710 if (
Record.size() < 3 || !OpTy)
3711 return error(
"Invalid shufflevector constexpr record");
3712 V = BitcodeConstant::create(
3713 Alloc, CurTy, Instruction::ShuffleVector,
3714 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3721 if (
Record.size() < 4 || !RTy || !OpTy)
3722 return error(
"Invalid shufflevector constexpr record");
3723 V = BitcodeConstant::create(
3724 Alloc, CurTy, Instruction::ShuffleVector,
3725 {(unsigned)Record[1], (
unsigned)
Record[2], (unsigned)Record[3]});
3730 return error(
"Invalid cmp constexpt record");
3731 unsigned OpTyID =
Record[0];
3732 Type *OpTy = getTypeByID(OpTyID);
3734 return error(
"Invalid cmp constexpr record");
3735 V = BitcodeConstant::create(
3738 : Instruction::ICmp),
3739 (uint8_t)Record[3]},
3740 {(unsigned)Record[1], (
unsigned)
Record[2]});
3747 return error(
"Invalid inlineasm record");
3748 std::string AsmStr, ConstrStr;
3749 bool HasSideEffects =
Record[0] & 1;
3750 bool IsAlignStack =
Record[0] >> 1;
3751 unsigned AsmStrSize =
Record[1];
3752 if (2+AsmStrSize >=
Record.size())
3753 return error(
"Invalid inlineasm record");
3754 unsigned ConstStrSize =
Record[2+AsmStrSize];
3755 if (3+AsmStrSize+ConstStrSize >
Record.size())
3756 return error(
"Invalid inlineasm record");
3758 for (
unsigned i = 0; i != AsmStrSize; ++i)
3759 AsmStr += (
char)
Record[2+i];
3760 for (
unsigned i = 0; i != ConstStrSize; ++i)
3761 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3764 return error(
"Missing element type for old-style inlineasm");
3766 HasSideEffects, IsAlignStack);
3773 return error(
"Invalid inlineasm record");
3774 std::string AsmStr, ConstrStr;
3775 bool HasSideEffects =
Record[0] & 1;
3776 bool IsAlignStack = (
Record[0] >> 1) & 1;
3777 unsigned AsmDialect =
Record[0] >> 2;
3778 unsigned AsmStrSize =
Record[1];
3779 if (2+AsmStrSize >=
Record.size())
3780 return error(
"Invalid inlineasm record");
3781 unsigned ConstStrSize =
Record[2+AsmStrSize];
3782 if (3+AsmStrSize+ConstStrSize >
Record.size())
3783 return error(
"Invalid inlineasm record");
3785 for (
unsigned i = 0; i != AsmStrSize; ++i)
3786 AsmStr += (
char)
Record[2+i];
3787 for (
unsigned i = 0; i != ConstStrSize; ++i)
3788 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3791 return error(
"Missing element type for old-style inlineasm");
3793 HasSideEffects, IsAlignStack,
3800 return error(
"Invalid inlineasm record");
3802 std::string AsmStr, ConstrStr;
3803 bool HasSideEffects =
Record[OpNum] & 1;
3804 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3805 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3806 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3808 unsigned AsmStrSize =
Record[OpNum];
3810 if (OpNum + AsmStrSize >=
Record.size())
3811 return error(
"Invalid inlineasm record");
3812 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3813 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3814 return error(
"Invalid inlineasm record");
3816 for (
unsigned i = 0; i != AsmStrSize; ++i)
3817 AsmStr += (
char)
Record[OpNum + i];
3819 for (
unsigned i = 0; i != ConstStrSize; ++i)
3820 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3823 return error(
"Missing element type for old-style inlineasm");
3825 HasSideEffects, IsAlignStack,
3832 return error(
"Invalid inlineasm record");
3837 return error(
"Invalid inlineasm record");
3838 std::string AsmStr, ConstrStr;
3839 bool HasSideEffects =
Record[OpNum] & 1;
3840 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3841 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3842 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3844 unsigned AsmStrSize =
Record[OpNum];
3846 if (OpNum + AsmStrSize >=
Record.size())
3847 return error(
"Invalid inlineasm record");
3848 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3849 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3850 return error(
"Invalid inlineasm record");
3852 for (
unsigned i = 0; i != AsmStrSize; ++i)
3853 AsmStr += (
char)
Record[OpNum + i];
3855 for (
unsigned i = 0; i != ConstStrSize; ++i)
3856 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3858 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3864 return error(
"Invalid blockaddress record");
3865 unsigned FnTyID =
Record[0];
3866 Type *FnTy = getTypeByID(FnTyID);
3868 return error(
"Invalid blockaddress record");
3869 V = BitcodeConstant::create(
3871 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3877 return error(
"Invalid dso_local record");
3878 unsigned GVTyID =
Record[0];
3879 Type *GVTy = getTypeByID(GVTyID);
3881 return error(
"Invalid dso_local record");
3882 V = BitcodeConstant::create(
3883 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3888 return error(
"Invalid no_cfi record");
3889 unsigned GVTyID =
Record[0];
3890 Type *GVTy = getTypeByID(GVTyID);
3892 return error(
"Invalid no_cfi record");
3893 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3899 return error(
"Invalid ptrauth record");
3901 V = BitcodeConstant::create(
Alloc, CurTy,
3902 BitcodeConstant::ConstantPtrAuthOpcode,
3903 {(unsigned)Record[0], (
unsigned)
Record[1],
3904 (unsigned)Record[2], (
unsigned)
Record[3]});
3909 return error(
"Invalid ptrauth record");
3911 V = BitcodeConstant::create(
3912 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3913 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2],
3914 (
unsigned)
Record[3], (unsigned)Record[4]});
3919 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3926Error BitcodeReader::parseUseLists() {
3931 SmallVector<uint64_t, 64>
Record;
3937 BitstreamEntry
Entry = MaybeEntry.
get();
3939 switch (
Entry.Kind) {
3942 return error(
"Malformed block");
3956 switch (MaybeRecord.
get()) {
3964 if (RecordLength < 3)
3966 return error(
"Invalid uselist record");
3967 unsigned ID =
Record.pop_back_val();
3971 assert(ID < FunctionBBs.size() &&
"Basic block not found");
3972 V = FunctionBBs[
ID];
3976 if (!
V->hasUseList())
3979 unsigned NumUses = 0;
3980 SmallDenseMap<const Use *, unsigned, 16> Order;
3981 for (
const Use &U :
V->materialized_uses()) {
3982 if (++NumUses >
Record.size())
3984 Order[&
U] =
Record[NumUses - 1];
3991 V->sortUseList([&](
const Use &L,
const Use &R) {
4002Error BitcodeReader::rememberAndSkipMetadata() {
4005 DeferredMetadataInfo.push_back(CurBit);
4013Error BitcodeReader::materializeMetadata() {
4014 for (
uint64_t BitPos : DeferredMetadataInfo) {
4018 if (
Error Err = MDLoader->parseModuleMetadata())
4027 NamedMDNode *LinkerOpts =
4029 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
4036 DeferredMetadataInfo.clear();
4040void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
4044Error BitcodeReader::rememberAndSkipFunctionBody() {
4046 if (FunctionsWithBodies.empty())
4047 return error(
"Insufficient function protos");
4049 Function *Fn = FunctionsWithBodies.back();
4050 FunctionsWithBodies.pop_back();
4055 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
4056 "Mismatch between VST and scanned function offsets");
4057 DeferredFunctionInfo[Fn] = CurBit;
4065Error BitcodeReader::globalCleanup() {
4067 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4069 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
4070 return error(
"Malformed global initializer set");
4075 MDLoader->upgradeDebugIntrinsics(
F);
4079 !SkipDebugIntrinsicUpgrade))
4080 UpgradedIntrinsics[&
F] = NewFn;
4086 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4087 for (GlobalVariable &GV : TheModule->globals())
4089 UpgradedVariables.emplace_back(&GV, Upgraded);
4090 for (
auto &Pair : UpgradedVariables) {
4091 Pair.first->eraseFromParent();
4092 TheModule->insertGlobalVariable(Pair.second);
4095 for (
size_t ValueID = 0; ValueID < GUIDList.size(); ValueID++) {
4096 const auto GUID = GUIDList[ValueID];
4100 const auto *
Value = ValueList[ValueID];
4101 TheModule->insertGUID(
Value, GUID);
4106 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4107 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4115Error BitcodeReader::rememberAndSkipFunctionBodies() {
4120 return error(
"Could not find function in stream");
4122 if (!SeenFirstFunctionBody)
4123 return error(
"Trying to materialize functions before seeing function blocks");
4127 assert(SeenValueSymbolTable);
4130 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4133 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4135 switch (
Entry.Kind) {
4137 return error(
"Expect SubBlock");
4141 return error(
"Expect function block");
4143 if (
Error Err = rememberAndSkipFunctionBody())
4152Error BitcodeReaderBase::readBlockInfo() {
4153 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4155 if (!MaybeNewBlockInfo)
4157 std::optional<BitstreamBlockInfo> NewBlockInfo =
4158 std::move(MaybeNewBlockInfo.
get());
4160 return error(
"Malformed block");
4161 BlockInfo = std::move(*NewBlockInfo);
4165Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4169 std::tie(Name, Record) = readNameFromStrtab(Record);
4172 return error(
"Invalid comdat record");
4174 std::string OldFormatName;
4177 return error(
"Invalid comdat record");
4178 unsigned ComdatNameSize =
Record[1];
4179 if (ComdatNameSize >
Record.size() - 2)
4180 return error(
"Comdat name size too large");
4181 OldFormatName.reserve(ComdatNameSize);
4182 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4183 OldFormatName += (
char)
Record[2 + i];
4184 Name = OldFormatName;
4186 Comdat *
C = TheModule->getOrInsertComdat(Name);
4187 C->setSelectionKind(SK);
4188 ComdatList.push_back(
C);
4202 Meta.NoAddress =
true;
4204 Meta.NoHWAddress =
true;
4208 Meta.IsDynInit =
true;
4212Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4220 std::tie(Name, Record) = readNameFromStrtab(Record);
4223 return error(
"Invalid global variable record");
4224 unsigned TyID =
Record[0];
4225 Type *Ty = getTypeByID(TyID);
4227 return error(
"Invalid global variable record");
4229 bool explicitType =
Record[1] & 2;
4235 return error(
"Invalid type for value");
4237 TyID = getContainedTypeID(TyID);
4238 Ty = getTypeByID(TyID);
4240 return error(
"Missing element type for old-style global");
4246 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4250 if (Record[5] - 1 >= SectionTable.size())
4251 return error(
"Invalid ID");
4260 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4268 bool ExternallyInitialized =
false;
4270 ExternallyInitialized =
Record[9];
4272 GlobalVariable *NewGV =
4282 if (
Record.size() > 10) {
4294 if (
unsigned InitID = Record[2])
4295 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4297 if (
Record.size() > 11) {
4298 if (
unsigned ComdatID = Record[11]) {
4299 if (ComdatID > ComdatList.size())
4300 return error(
"Invalid global variable comdat ID");
4301 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4304 ImplicitComdatObjects.
insert(NewGV);
4307 if (
Record.size() > 12) {
4312 if (
Record.size() > 13) {
4321 if (
Record.size() > 16 && Record[16]) {
4322 llvm::GlobalValue::SanitizerMetadata
Meta =
4327 if (
Record.size() > 17 && Record[17]) {
4331 return error(
"Invalid global variable code model");
4337void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4338 if (ValueTypeCallback) {
4339 (*ValueTypeCallback)(
4340 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4341 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4345Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4351 std::tie(Name, Record) = readNameFromStrtab(Record);
4354 return error(
"Invalid function record");
4355 unsigned FTyID =
Record[0];
4356 Type *FTy = getTypeByID(FTyID);
4358 return error(
"Invalid function record");
4360 FTyID = getContainedTypeID(FTyID, 0);
4361 FTy = getTypeByID(FTyID);
4363 return error(
"Missing element type for old-style function");
4367 return error(
"Invalid type for value");
4368 auto CC =
static_cast<CallingConv::ID
>(
Record[1]);
4369 if (CC & ~CallingConv::MaxID)
4370 return error(
"Invalid calling convention ID");
4372 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4378 AddrSpace, Name, TheModule);
4381 "Incorrect fully specified type provided for function");
4382 FunctionTypeIDs[
Func] = FTyID;
4384 Func->setCallingConv(CC);
4385 bool isProto =
Record[2];
4389 callValueTypeCallback(Func, FTyID);
4394 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4395 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4396 Attribute::InAlloca}) {
4397 if (!
Func->hasParamAttribute(i, Kind))
4400 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4403 Func->removeParamAttr(i, Kind);
4405 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4406 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4408 return error(
"Missing param element type for attribute upgrade");
4412 case Attribute::ByVal:
4413 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4415 case Attribute::StructRet:
4416 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4418 case Attribute::InAlloca:
4419 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4425 Func->addParamAttr(i, NewAttr);
4429 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4430 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4431 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4432 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4434 return error(
"Missing param element type for x86_intrcc upgrade");
4436 Func->addParamAttr(0, NewAttr);
4440 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4443 Func->setAlignment(*Alignment);
4445 if (Record[6] - 1 >= SectionTable.size())
4446 return error(
"Invalid ID");
4447 Func->setSection(SectionTable[Record[6] - 1]);
4451 if (!
Func->hasLocalLinkage())
4453 if (
Record.size() > 8 && Record[8]) {
4454 if (Record[8] - 1 >= GCTable.size())
4455 return error(
"Invalid ID");
4456 Func->setGC(GCTable[Record[8] - 1]);
4461 Func->setUnnamedAddr(UnnamedAddr);
4463 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4465 OperandInfo.Prologue =
Record[10];
4467 if (
Record.size() > 11) {
4469 if (!
Func->hasLocalLinkage()) {
4476 if (
Record.size() > 12) {
4477 if (
unsigned ComdatID = Record[12]) {
4478 if (ComdatID > ComdatList.size())
4479 return error(
"Invalid function comdat ID");
4480 Func->setComdat(ComdatList[ComdatID - 1]);
4483 ImplicitComdatObjects.
insert(Func);
4487 OperandInfo.Prefix =
Record[13];
4490 OperandInfo.PersonalityFn =
Record[14];
4492 if (
Record.size() > 15) {
4502 Record[17] + Record[18] <= Strtab.
size()) {
4503 Func->setPartition(StringRef(Strtab.
data() + Record[17], Record[18]));
4506 if (
Record.size() > 19) {
4507 MaybeAlign PrefAlignment;
4508 if (
Error Err = parseAlignmentValue(Record[19], PrefAlignment))
4510 Func->setPreferredAlignment(PrefAlignment);
4513 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4515 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4516 FunctionOperands.push_back(OperandInfo);
4521 Func->setIsMaterializable(
true);
4522 FunctionsWithBodies.push_back(Func);
4523 DeferredFunctionInfo[
Func] = 0;
4528Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4529 unsigned BitCode, ArrayRef<uint64_t> Record) {
4539 std::tie(Name, Record) = readNameFromStrtab(Record);
4542 if (
Record.size() < (3 + (
unsigned)NewRecord))
4543 return error(
"Invalid global indirect symbol record");
4548 return error(
"Invalid global indirect symbol record");
4554 return error(
"Invalid type for value");
4555 AddrSpace = PTy->getAddressSpace();
4557 Ty = getTypeByID(
TypeID);
4559 return error(
"Missing element type for old-style indirect symbol");
4561 AddrSpace =
Record[OpNum++];
4564 auto Val =
Record[OpNum++];
4573 nullptr, TheModule);
4577 if (OpNum !=
Record.size()) {
4578 auto VisInd = OpNum++;
4584 if (OpNum !=
Record.size()) {
4585 auto S =
Record[OpNum++];
4592 if (OpNum !=
Record.size())
4594 if (OpNum !=
Record.size())
4597 if (OpNum !=
Record.size())
4602 if (OpNum + 1 <
Record.size()) {
4604 if (Record[OpNum] + Record[OpNum + 1] > Strtab.
size())
4605 return error(
"Malformed partition, too large.");
4607 StringRef(Strtab.
data() + Record[OpNum], Record[OpNum + 1]));
4611 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4616 bool ShouldLazyLoadMetadata,
4617 ParserCallbacks Callbacks) {
4618 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4625 SmallVector<uint64_t, 64>
Record;
4629 bool ResolvedDataLayout =
false;
4634 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4637 Module::GlobalAsmProperties Props;
4639 auto ResolveDataLayout = [&]() ->
Error {
4640 if (ResolvedDataLayout)
4644 ResolvedDataLayout =
true;
4648 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4652 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4653 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4654 TentativeDataLayoutStr = *LayoutOverride;
4662 TheModule->setDataLayout(MaybeDL.
get());
4668 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4671 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4673 switch (
Entry.Kind) {
4675 return error(
"Malformed block");
4677 if (
Error Err = ResolveDataLayout())
4679 return globalCleanup();
4688 if (
Error Err = readBlockInfo())
4692 if (
Error Err = parseAttributeBlock())
4696 if (
Error Err = parseAttributeGroupBlock())
4700 if (
Error Err = parseTypeTable())
4704 if (!SeenValueSymbolTable) {
4710 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4711 if (
Error Err = parseValueSymbolTable())
4713 SeenValueSymbolTable =
true;
4723 if (
Error Err = parseConstants())
4725 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4729 if (ShouldLazyLoadMetadata) {
4730 if (
Error Err = rememberAndSkipMetadata())
4734 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4735 if (
Error Err = MDLoader->parseModuleMetadata())
4739 if (
Error Err = MDLoader->parseMetadataKinds())
4743 if (
Error Err = ResolveDataLayout())
4748 if (!SeenFirstFunctionBody) {
4749 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4750 if (
Error Err = globalCleanup())
4752 SeenFirstFunctionBody =
true;
4755 if (VSTOffset > 0) {
4759 if (!SeenValueSymbolTable) {
4760 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4762 SeenValueSymbolTable =
true;
4784 if (
Error Err = rememberAndSkipFunctionBody())
4791 if (SeenValueSymbolTable) {
4795 return globalCleanup();
4799 if (
Error Err = parseUseLists())
4803 if (
Error Err = parseOperandBundleTags())
4807 if (
Error Err = parseSyncScopeNames())
4819 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
4822 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4825 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4828 UseRelativeIDs = *VersionOrErr >= 1;
4832 if (ResolvedDataLayout)
4833 return error(
"target triple too late in module");
4836 return error(
"Invalid triple record");
4837 TheModule->setTargetTriple(Triple(std::move(S)));
4841 if (ResolvedDataLayout)
4842 return error(
"datalayout too late in module");
4844 return error(
"Invalid data layout record");
4850 return error(
"Invalid module asm record");
4851 size_t SepPos = Str.find(
'\0');
4852 if (SepPos == std::string::npos)
4853 return error(
"Invalid module asm record");
4854 if (!Props.
set(StringRef(Str.data(), SepPos), Str.substr(SepPos + 1)))
4855 return error(
"Unknown module asm property");
4861 return error(
"Invalid asm record");
4862 TheModule->appendModuleInlineAsm(Module::GlobalAsmFragment(S, Props));
4870 return error(
"Invalid deplib record");
4877 return error(
"Invalid section name record");
4878 SectionTable.push_back(S);
4884 return error(
"Invalid gcname record");
4885 GCTable.push_back(S);
4889 if (
Error Err = parseComdatRecord(Record))
4898 if (
Error Err = parseGlobalVarRecord(Record))
4902 if (
Error Err = ResolveDataLayout())
4904 if (
Error Err = parseFunctionRecord(Record))
4910 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4916 return error(
"Invalid vstoffset record");
4920 VSTOffset =
Record[0] - 1;
4925 GUIDList.reserve(GUIDList.size() +
Record.size() / 2);
4926 for (
size_t i = 0; i <
Record.size(); i += 2)
4927 GUIDList.push_back(Record[i] << 32 | Record[i + 1]);
4933 return error(
"Invalid source filename record");
4934 TheModule->setSourceFileName(
ValueName);
4940 this->ValueTypeCallback = std::nullopt;
4944Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4946 ParserCallbacks Callbacks) {
4948 MetadataLoaderCallbacks MDCallbacks;
4949 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(ID); };
4951 return getContainedTypeID(
I, J);
4954 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4956 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4959Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4961 return error(
"Load/Store operand is not a pointer type");
4962 if (!PointerType::isLoadableOrStorableType(ValType))
4963 return error(
"Cannot load/store from pointer");
4967Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4968 ArrayRef<unsigned> ArgTyIDs) {
4970 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4971 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4972 Attribute::InAlloca}) {
4973 if (!
Attrs.hasParamAttr(i, Kind) ||
4974 Attrs.getParamAttr(i, Kind).getValueAsType())
4977 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4979 return error(
"Missing element type for typed attribute upgrade");
4983 case Attribute::ByVal:
4984 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4986 case Attribute::StructRet:
4987 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4989 case Attribute::InAlloca:
4990 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
5003 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
5007 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
5008 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
5010 return error(
"Missing element type for inline asm upgrade");
5013 Attribute::get(
Context, Attribute::ElementType, ElemTy));
5021 case Intrinsic::preserve_array_access_index:
5022 case Intrinsic::preserve_struct_access_index:
5023 case Intrinsic::aarch64_ldaxr:
5024 case Intrinsic::aarch64_ldxr:
5025 case Intrinsic::aarch64_stlxr:
5026 case Intrinsic::aarch64_stxr:
5027 case Intrinsic::arm_ldaex:
5028 case Intrinsic::arm_ldrex:
5029 case Intrinsic::arm_stlex:
5030 case Intrinsic::arm_strex: {
5033 case Intrinsic::aarch64_stlxr:
5034 case Intrinsic::aarch64_stxr:
5035 case Intrinsic::arm_stlex:
5036 case Intrinsic::arm_strex:
5043 if (!
Attrs.getParamElementType(ArgNo)) {
5044 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
5046 return error(
"Missing element type for elementtype upgrade");
5066 if (MDLoader->hasFwdRefs())
5067 return error(
"Invalid function metadata: incoming forward references");
5069 InstructionList.
clear();
5070 unsigned ModuleValueListSize = ValueList.
size();
5071 unsigned ModuleMDLoaderSize = MDLoader->size();
5075 unsigned FTyID = FunctionTypeIDs[
F];
5076 for (Argument &
I :
F->args()) {
5077 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
5078 assert(
I.getType() == getTypeByID(ArgTyID) &&
5079 "Incorrect fully specified type for Function Argument");
5083 unsigned NextValueNo = ValueList.
size();
5085 unsigned CurBBNo = 0;
5090 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
5094 auto getLastInstruction = [&]() -> Instruction * {
5095 if (CurBB && !CurBB->
empty())
5096 return &CurBB->
back();
5097 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
5098 !FunctionBBs[CurBBNo - 1]->
empty())
5099 return &FunctionBBs[CurBBNo - 1]->back();
5103 std::vector<OperandBundleDef> OperandBundles;
5106 SmallVector<uint64_t, 64>
Record;
5109 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
5112 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
5114 switch (
Entry.Kind) {
5116 return error(
"Malformed block");
5118 goto OutOfRecordLoop;
5127 if (
Error Err = parseConstants())
5129 NextValueNo = ValueList.
size();
5132 if (
Error Err = parseValueSymbolTable())
5136 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5140 assert(DeferredMetadataInfo.empty() &&
5141 "Must read all module-level metadata before function-level");
5142 if (
Error Err = MDLoader->parseFunctionMetadata())
5146 if (
Error Err = parseUseLists())
5160 unsigned ResTypeID = InvalidTypeID;
5161 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
5164 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5166 return error(
"Invalid value");
5168 if (
Record.empty() || Record[0] == 0)
5169 return error(
"Invalid declareblocks record");
5171 FunctionBBs.resize(Record[0]);
5174 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5175 if (BBFRI == BasicBlockFwdRefs.
end()) {
5176 for (BasicBlock *&BB : FunctionBBs)
5179 auto &BBRefs = BBFRI->second;
5181 if (BBRefs.size() > FunctionBBs.size())
5182 return error(
"Invalid ID");
5183 assert(!BBRefs.empty() &&
"Unexpected empty array");
5184 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5185 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5187 if (
I < RE && BBRefs[
I]) {
5188 BBRefs[
I]->insertInto(
F);
5189 FunctionBBs[
I] = BBRefs[
I];
5195 BasicBlockFwdRefs.
erase(BBFRI);
5198 CurBB = FunctionBBs[0];
5205 return error(
"Invalid blockaddr users record");
5221 BackwardRefFunctions.push_back(
F);
5223 return error(
"Invalid blockaddr users record");
5230 I = getLastInstruction();
5233 return error(
"Invalid debug_loc_again record");
5234 I->setDebugLoc(LastLoc);
5239 I = getLastInstruction();
5241 return error(
"Invalid debug loc record");
5249 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5252 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5254 return error(
"Invalid debug loc record");
5258 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5260 return error(
"Invalid debug loc record");
5263 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5264 isImplicitCode, AtomGroup, AtomRank);
5265 I->setDebugLoc(LastLoc);
5273 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5275 return error(
"Invalid unary operator record");
5279 return error(
"Invalid unary operator record");
5283 if (OpNum <
Record.size()) {
5287 I->setFastMathFlags(FMF);
5296 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5300 return error(
"Invalid binary operator record");
5304 return error(
"Invalid binary operator record");
5308 if (OpNum <
Record.size()) {
5309 if (
Opc == Instruction::Add ||
5310 Opc == Instruction::Sub ||
5311 Opc == Instruction::Mul ||
5312 Opc == Instruction::Shl) {
5317 }
else if (
Opc == Instruction::SDiv ||
5318 Opc == Instruction::UDiv ||
5319 Opc == Instruction::LShr ||
5320 Opc == Instruction::AShr) {
5323 }
else if (
Opc == Instruction::Or) {
5329 I->setFastMathFlags(FMF);
5338 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5339 OpNum + 1 >
Record.size())
5340 return error(
"Invalid cast record");
5342 ResTypeID =
Record[OpNum++];
5343 Type *ResTy = getTypeByID(ResTypeID);
5346 if (
Opc == -1 || !ResTy)
5347 return error(
"Invalid cast record");
5352 assert(CurBB &&
"No current BB?");
5358 return error(
"Invalid cast");
5362 if (OpNum <
Record.size()) {
5363 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5366 }
else if (
Opc == Instruction::Trunc) {
5378 I->setFastMathFlags(FMF);
5397 Ty = getTypeByID(TyID);
5401 TyID = InvalidTypeID;
5406 unsigned BasePtrTypeID;
5407 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5409 return error(
"Invalid gep record");
5412 TyID = getContainedTypeID(BasePtrTypeID);
5413 if (
BasePtr->getType()->isVectorTy())
5414 TyID = getContainedTypeID(TyID);
5415 Ty = getTypeByID(TyID);
5418 SmallVector<Value*, 16> GEPIdx;
5419 while (OpNum !=
Record.size()) {
5422 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5423 return error(
"Invalid gep record");
5434 unsigned SubType = 0;
5435 if (GTI.isStruct()) {
5437 Idx->getType()->isVectorTy()
5439 :
cast<ConstantInt>(Idx);
5442 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5449 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5450 if (
I->getType()->isVectorTy())
5451 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5454 GEP->setNoWrapFlags(NW);
5463 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5464 return error(
"Invalid extractvalue record");
5467 unsigned RecSize =
Record.size();
5468 if (OpNum == RecSize)
5469 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5471 SmallVector<unsigned, 4> EXTRACTVALIdx;
5472 ResTypeID = AggTypeID;
5473 for (; OpNum != RecSize; ++OpNum) {
5478 if (!IsStruct && !IsArray)
5479 return error(
"EXTRACTVAL: Invalid type");
5480 if ((
unsigned)Index != Index)
5481 return error(
"Invalid value");
5483 return error(
"EXTRACTVAL: Invalid struct index");
5485 return error(
"EXTRACTVAL: Invalid array index");
5486 EXTRACTVALIdx.
push_back((
unsigned)Index);
5490 ResTypeID = getContainedTypeID(ResTypeID, Index);
5493 ResTypeID = getContainedTypeID(ResTypeID);
5507 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5508 return error(
"Invalid insertvalue record");
5511 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5512 return error(
"Invalid insertvalue record");
5514 unsigned RecSize =
Record.size();
5515 if (OpNum == RecSize)
5516 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5518 SmallVector<unsigned, 4> INSERTVALIdx;
5520 for (; OpNum != RecSize; ++OpNum) {
5525 if (!IsStruct && !IsArray)
5526 return error(
"INSERTVAL: Invalid type");
5527 if ((
unsigned)Index != Index)
5528 return error(
"Invalid value");
5530 return error(
"INSERTVAL: Invalid struct index");
5532 return error(
"INSERTVAL: Invalid array index");
5534 INSERTVALIdx.
push_back((
unsigned)Index);
5542 return error(
"Inserted value type doesn't match aggregate type");
5545 ResTypeID = AggTypeID;
5557 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5559 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5561 popValue(Record, OpNum, NextValueNo, CondType,
5562 getVirtualTypeID(CondType),
Cond, CurBB))
5563 return error(
"Invalid select record");
5576 unsigned ValTypeID, CondTypeID;
5577 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5579 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5581 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5582 return error(
"Invalid vector select record");
5585 if (VectorType* vector_type =
5588 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5589 return error(
"Invalid type for value");
5593 return error(
"Invalid type for value");
5597 ResTypeID = ValTypeID;
5602 I->setFastMathFlags(FMF);
5610 unsigned VecTypeID, IdxTypeID;
5611 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5612 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5613 return error(
"Invalid extractelement record");
5615 return error(
"Invalid type for value");
5617 ResTypeID = getContainedTypeID(VecTypeID);
5624 Value *Vec, *Elt, *Idx;
5625 unsigned VecTypeID, IdxTypeID;
5626 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5627 return error(
"Invalid insertelement record");
5629 return error(
"Invalid type for value");
5630 if (popValue(Record, OpNum, NextValueNo,
5632 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5633 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5634 return error(
"Invalid insert element record");
5636 ResTypeID = VecTypeID;
5644 unsigned Vec1TypeID;
5645 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5647 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5649 return error(
"Invalid shufflevector record");
5651 unsigned MaskTypeID;
5652 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5653 return error(
"Invalid shufflevector record");
5655 return error(
"Invalid type for value");
5657 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5659 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5674 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5675 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5677 return error(
"Invalid comparison record");
5679 if (OpNum >=
Record.size())
5681 "Invalid record: operand number exceeded available operands");
5686 if (IsFP &&
Record.size() > OpNum+1)
5691 return error(
"Invalid fcmp predicate");
5692 I =
new FCmpInst(PredVal,
LHS,
RHS);
5695 return error(
"Invalid icmp predicate");
5696 I =
new ICmpInst(PredVal,
LHS,
RHS);
5697 if (
Record.size() > OpNum + 1 &&
5702 if (OpNum + 1 !=
Record.size())
5703 return error(
"Invalid comparison record");
5705 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5707 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5710 I->setFastMathFlags(FMF);
5727 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5728 return error(
"Invalid ret record");
5729 if (OpNum !=
Record.size())
5730 return error(
"Invalid ret record");
5738 return error(
"Invalid br record");
5739 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5741 return error(
"Invalid br record");
5743 if (
Record.size() == 1) {
5748 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5751 getVirtualTypeID(CondType), CurBB);
5752 if (!FalseDest || !
Cond)
5753 return error(
"Invalid br record");
5761 return error(
"Invalid cleanupret record");
5764 Value *CleanupPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5765 getVirtualTypeID(TokenTy), CurBB);
5767 return error(
"Invalid cleanupret record");
5769 if (
Record.size() == 2) {
5770 UnwindDest = getBasicBlock(Record[Idx++]);
5772 return error(
"Invalid cleanupret record");
5781 return error(
"Invalid catchret record");
5784 Value *CatchPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5785 getVirtualTypeID(TokenTy), CurBB);
5787 return error(
"Invalid catchret record");
5788 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5790 return error(
"Invalid catchret record");
5799 return error(
"Invalid catchswitch record");
5804 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5805 getVirtualTypeID(TokenTy), CurBB);
5807 return error(
"Invalid catchswitch record");
5809 unsigned NumHandlers =
Record[Idx++];
5812 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5813 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5815 return error(
"Invalid catchswitch record");
5820 if (Idx + 1 ==
Record.size()) {
5821 UnwindDest = getBasicBlock(Record[Idx++]);
5823 return error(
"Invalid catchswitch record");
5826 if (
Record.size() != Idx)
5827 return error(
"Invalid catchswitch record");
5831 for (BasicBlock *Handler : Handlers)
5832 CatchSwitch->addHandler(Handler);
5834 ResTypeID = getVirtualTypeID(
I->getType());
5842 return error(
"Invalid catchpad/cleanuppad record");
5847 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5848 getVirtualTypeID(TokenTy), CurBB);
5850 return error(
"Invalid catchpad/cleanuppad record");
5852 unsigned NumArgOperands =
Record[Idx++];
5854 SmallVector<Value *, 2>
Args;
5855 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5858 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5859 return error(
"Invalid catchpad/cleanuppad record");
5860 Args.push_back(Val);
5863 if (
Record.size() != Idx)
5864 return error(
"Invalid catchpad/cleanuppad record");
5870 ResTypeID = getVirtualTypeID(
I->getType());
5876 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5882 unsigned OpTyID =
Record[1];
5883 Type *OpTy = getTypeByID(OpTyID);
5889 return error(
"Invalid switch record");
5891 unsigned NumCases =
Record[4];
5896 unsigned CurIdx = 5;
5897 for (
unsigned i = 0; i != NumCases; ++i) {
5899 unsigned NumItems =
Record[CurIdx++];
5900 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5901 bool isSingleNumber =
Record[CurIdx++];
5904 unsigned ActiveWords = 1;
5905 if (ValueBitWidth > 64)
5906 ActiveWords =
Record[CurIdx++];
5909 CurIdx += ActiveWords;
5911 if (!isSingleNumber) {
5913 if (ValueBitWidth > 64)
5914 ActiveWords =
Record[CurIdx++];
5917 CurIdx += ActiveWords;
5928 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5929 for (ConstantInt *Cst : CaseVals)
5930 SI->addCase(Cst, DestBB);
5939 return error(
"Invalid switch record");
5940 unsigned OpTyID =
Record[0];
5941 Type *OpTy = getTypeByID(OpTyID);
5945 return error(
"Invalid switch record");
5946 unsigned NumCases = (
Record.size()-3)/2;
5949 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5951 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
5952 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
5953 if (!CaseVal || !DestBB) {
5955 return error(
"Invalid switch record");
5957 SI->addCase(CaseVal, DestBB);
5964 return error(
"Invalid indirectbr record");
5965 unsigned OpTyID =
Record[0];
5966 Type *OpTy = getTypeByID(OpTyID);
5969 return error(
"Invalid indirectbr record");
5970 unsigned NumDests =
Record.size()-2;
5973 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5974 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
5978 return error(
"Invalid indirectbr record");
5988 return error(
"Invalid invoke record");
5991 unsigned CCInfo =
Record[OpNum++];
5992 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
5993 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
5995 unsigned FTyID = InvalidTypeID;
5996 FunctionType *FTy =
nullptr;
5997 if ((CCInfo >> 13) & 1) {
6001 return error(
"Explicit invoke type is not a function type");
6005 unsigned CalleeTypeID;
6006 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6008 return error(
"Invalid invoke record");
6012 return error(
"Callee is not a pointer");
6014 FTyID = getContainedTypeID(CalleeTypeID);
6017 return error(
"Callee is not of pointer to function type");
6019 if (
Record.size() < FTy->getNumParams() + OpNum)
6020 return error(
"Insufficient operands to call");
6022 SmallVector<Value*, 16>
Ops;
6023 SmallVector<unsigned, 16> ArgTyIDs;
6024 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6025 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6026 Ops.push_back(
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6030 return error(
"Invalid invoke record");
6033 if (!FTy->isVarArg()) {
6034 if (
Record.size() != OpNum)
6035 return error(
"Invalid invoke record");
6038 while (OpNum !=
Record.size()) {
6041 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6042 return error(
"Invalid invoke record");
6049 if (!OperandBundles.empty())
6054 ResTypeID = getContainedTypeID(FTyID);
6055 OperandBundles.clear();
6058 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
6069 Value *Val =
nullptr;
6071 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
6072 return error(
"Invalid resume record");
6081 unsigned CCInfo =
Record[OpNum++];
6083 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
6084 unsigned NumIndirectDests =
Record[OpNum++];
6085 SmallVector<BasicBlock *, 16> IndirectDests;
6086 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
6087 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
6089 unsigned FTyID = InvalidTypeID;
6090 FunctionType *FTy =
nullptr;
6095 return error(
"Explicit call type is not a function type");
6099 unsigned CalleeTypeID;
6100 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6102 return error(
"Invalid callbr record");
6106 return error(
"Callee is not a pointer type");
6108 FTyID = getContainedTypeID(CalleeTypeID);
6111 return error(
"Callee is not of pointer to function type");
6113 if (
Record.size() < FTy->getNumParams() + OpNum)
6114 return error(
"Insufficient operands to call");
6116 SmallVector<Value*, 16>
Args;
6117 SmallVector<unsigned, 16> ArgTyIDs;
6119 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6121 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6122 if (FTy->getParamType(i)->isLabelTy())
6123 Arg = getBasicBlock(Record[OpNum]);
6125 Arg =
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6128 return error(
"Invalid callbr record");
6129 Args.push_back(Arg);
6134 if (!FTy->isVarArg()) {
6135 if (OpNum !=
Record.size())
6136 return error(
"Invalid callbr record");
6138 while (OpNum !=
Record.size()) {
6141 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6142 return error(
"Invalid callbr record");
6149 if (!OperandBundles.empty())
6154 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6157 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6162 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6163 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6164 unsigned LabelNo = ArgNo - FirstBlockArg;
6166 if (!BA || BA->getFunction() !=
F ||
6167 LabelNo > IndirectDests.
size() ||
6168 BA->getBasicBlock() != IndirectDests[LabelNo])
6169 return error(
"callbr argument does not match indirect dest");
6174 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6178 for (
Value *Arg : Args)
6181 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6184 std::string Constraints =
IA->getConstraintString().str();
6187 for (
const auto &CI : ConstraintInfo) {
6189 if (ArgNo >= FirstBlockArg)
6190 Constraints.insert(Pos,
"!");
6195 Pos = Constraints.find(
',', Pos);
6196 if (Pos == std::string::npos)
6202 IA->hasSideEffects(),
IA->isAlignStack(),
6203 IA->getDialect(),
IA->canThrow());
6209 ResTypeID = getContainedTypeID(FTyID);
6210 OperandBundles.clear();
6227 return error(
"Invalid phi record");
6229 unsigned TyID =
Record[0];
6230 Type *Ty = getTypeByID(TyID);
6232 return error(
"Invalid phi record");
6237 size_t NumArgs = (
Record.size() - 1) / 2;
6241 return error(
"Invalid phi record");
6245 SmallDenseMap<BasicBlock *, Value *>
Args;
6246 for (
unsigned i = 0; i != NumArgs; i++) {
6247 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6250 return error(
"Invalid phi BB");
6257 auto It =
Args.find(BB);
6259 if (It !=
Args.end()) {
6273 if (!PhiConstExprBB)
6275 EdgeBB = PhiConstExprBB;
6283 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6285 V =
getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6289 return error(
"Invalid phi record");
6292 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6293 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6294 PhiConstExprBB =
nullptr;
6297 Args.insert({BB,
V});
6303 if (
Record.size() % 2 == 0) {
6307 I->setFastMathFlags(FMF);
6319 return error(
"Invalid landingpad record");
6323 return error(
"Invalid landingpad record");
6325 ResTypeID =
Record[Idx++];
6326 Type *Ty = getTypeByID(ResTypeID);
6328 return error(
"Invalid landingpad record");
6330 Value *PersFn =
nullptr;
6331 unsigned PersFnTypeID;
6332 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6334 return error(
"Invalid landingpad record");
6336 if (!
F->hasPersonalityFn())
6339 return error(
"Personality function mismatch");
6342 bool IsCleanup = !!
Record[Idx++];
6343 unsigned NumClauses =
Record[Idx++];
6346 for (
unsigned J = 0; J != NumClauses; ++J) {
6352 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6355 return error(
"Invalid landingpad record");
6360 "Catch clause has a invalid type!");
6363 "Filter clause has invalid type!");
6374 return error(
"Invalid alloca record");
6375 using APV = AllocaPackedValues;
6379 unsigned TyID =
Record[0];
6380 Type *Ty = getTypeByID(TyID);
6382 TyID = getContainedTypeID(TyID);
6383 Ty = getTypeByID(TyID);
6385 return error(
"Missing element type for old-style alloca");
6387 unsigned OpTyID =
Record[1];
6388 Type *OpTy = getTypeByID(OpTyID);
6389 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6394 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6398 return error(
"Invalid alloca record");
6400 const DataLayout &
DL = TheModule->getDataLayout();
6401 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6403 SmallPtrSet<Type *, 4> Visited;
6404 if (!Align && !Ty->
isSized(&Visited))
6405 return error(
"alloca of unsized type");
6407 Align =
DL.getPrefTypeAlign(Ty);
6409 if (!
Size->getType()->isIntegerTy())
6410 return error(
"alloca element count must have integer type");
6412 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6416 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6424 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6425 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6426 return error(
"Invalid load record");
6429 return error(
"Load operand is not a pointer type");
6432 if (OpNum + 3 ==
Record.size()) {
6433 ResTypeID =
Record[OpNum++];
6434 Ty = getTypeByID(ResTypeID);
6436 ResTypeID = getContainedTypeID(OpTypeID);
6437 Ty = getTypeByID(ResTypeID);
6441 return error(
"Missing load type");
6443 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6447 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6449 SmallPtrSet<Type *, 4> Visited;
6450 if (!Align && !Ty->
isSized(&Visited))
6451 return error(
"load of unsized type");
6453 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6454 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6463 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6464 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size() &&
6465 OpNum + 6 !=
Record.size()))
6466 return error(
"Invalid load atomic record");
6469 return error(
"Load operand is not a pointer type");
6472 if (
Record.size() >= OpNum + 5) {
6473 ResTypeID =
Record[OpNum++];
6474 Ty = getTypeByID(ResTypeID);
6476 ResTypeID = getContainedTypeID(OpTypeID);
6477 Ty = getTypeByID(ResTypeID);
6481 return error(
"Missing atomic load type");
6483 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6487 if (Ordering == AtomicOrdering::NotAtomic ||
6488 Ordering == AtomicOrdering::Release ||
6489 Ordering == AtomicOrdering::AcquireRelease)
6490 return error(
"Invalid load atomic record");
6491 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6492 return error(
"Invalid load atomic record");
6493 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6494 bool IsElementwise =
Record.size() > OpNum + 4 &&
Record[OpNum + 4];
6497 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6500 return error(
"Alignment missing from atomic load");
6503 LoadStoreInstProperties{
Record[OpNum + 1] != 0, *
Align,
6513 unsigned PtrTypeID, ValTypeID;
6514 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6515 return error(
"Invalid store record");
6518 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6519 return error(
"Invalid store record");
6521 ValTypeID = getContainedTypeID(PtrTypeID);
6522 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6523 ValTypeID, Val, CurBB))
6524 return error(
"Invalid store record");
6527 if (OpNum + 2 !=
Record.size())
6528 return error(
"Invalid store record");
6533 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6535 SmallPtrSet<Type *, 4> Visited;
6537 return error(
"store of unsized type");
6539 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6540 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6550 unsigned PtrTypeID, ValTypeID;
6551 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6553 return error(
"Invalid store atomic record");
6555 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6556 return error(
"Invalid store atomic record");
6558 ValTypeID = getContainedTypeID(PtrTypeID);
6559 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6560 ValTypeID, Val, CurBB))
6561 return error(
"Invalid store atomic record");
6564 if (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size())
6565 return error(
"Invalid store atomic record");
6570 if (Ordering == AtomicOrdering::NotAtomic ||
6571 Ordering == AtomicOrdering::Acquire ||
6572 Ordering == AtomicOrdering::AcquireRelease)
6573 return error(
"Invalid store atomic record");
6574 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6575 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6576 return error(
"Invalid store atomic record");
6579 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6582 return error(
"Alignment missing from atomic store");
6584 bool IsElementwise =
Record.size() > OpNum + 4 &&
Record[OpNum + 4];
6588 LoadStoreInstProperties{
Record[OpNum + 1] != 0, *
Align,
6597 const size_t NumRecords =
Record.size();
6599 Value *Ptr =
nullptr;
6601 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6602 return error(
"Invalid cmpxchg record");
6605 return error(
"Cmpxchg operand is not a pointer type");
6608 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6609 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6610 CmpTypeID, Cmp, CurBB))
6611 return error(
"Invalid cmpxchg record");
6614 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6616 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6617 return error(
"Invalid cmpxchg record");
6621 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6622 SuccessOrdering == AtomicOrdering::Unordered)
6623 return error(
"Invalid cmpxchg record");
6625 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6627 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6635 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6636 FailureOrdering == AtomicOrdering::Unordered)
6637 return error(
"Invalid cmpxchg record");
6640 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6642 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6643 FailureOrdering, SSID);
6646 if (NumRecords < 8) {
6650 I->insertInto(CurBB, CurBB->
end());
6652 ResTypeID = CmpTypeID;
6655 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6656 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6665 const size_t NumRecords =
Record.size();
6667 Value *Ptr =
nullptr;
6669 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6670 return error(
"Invalid cmpxchg record");
6673 return error(
"Cmpxchg operand is not a pointer type");
6677 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6678 return error(
"Invalid cmpxchg record");
6680 Value *Val =
nullptr;
6681 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6683 return error(
"Invalid cmpxchg record");
6685 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6686 return error(
"Invalid cmpxchg record");
6688 const bool IsVol =
Record[OpNum];
6693 return error(
"Invalid cmpxchg success ordering");
6695 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6697 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6703 return error(
"Invalid cmpxchg failure ordering");
6705 const bool IsWeak =
Record[OpNum + 4];
6709 if (NumRecords == (OpNum + 6)) {
6710 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6715 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6717 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6718 FailureOrdering, SSID);
6722 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6723 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6732 const size_t NumRecords =
Record.size();
6735 Value *Ptr =
nullptr;
6737 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6738 return error(
"Invalid atomicrmw record");
6741 return error(
"Invalid atomicrmw record");
6743 Value *Val =
nullptr;
6744 unsigned ValTypeID = InvalidTypeID;
6746 ValTypeID = getContainedTypeID(PtrTypeID);
6747 if (popValue(Record, OpNum, NextValueNo,
6748 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6749 return error(
"Invalid atomicrmw record");
6751 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6752 return error(
"Invalid atomicrmw record");
6755 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6756 return error(
"Invalid atomicrmw record");
6758 bool IsElementwise =
false;
6763 return error(
"Invalid atomicrmw record");
6765 const bool IsVol =
Record[OpNum + 1];
6768 if (Ordering == AtomicOrdering::NotAtomic ||
6769 Ordering == AtomicOrdering::Unordered)
6770 return error(
"Invalid atomicrmw record");
6772 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6776 if (NumRecords == (OpNum + 5)) {
6777 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6783 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6785 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID,
6787 ResTypeID = ValTypeID;
6795 return error(
"Invalid fence record");
6797 if (Ordering == AtomicOrdering::NotAtomic ||
6798 Ordering == AtomicOrdering::Unordered ||
6799 Ordering == AtomicOrdering::Monotonic)
6800 return error(
"Invalid fence record");
6802 I =
new FenceInst(
Context, Ordering, SSID);
6809 SeenDebugRecord =
true;
6812 return error(
"Invalid dbg record: missing instruction");
6815 Inst->
getParent()->insertDbgRecordBefore(
6826 SeenDebugRecord =
true;
6829 return error(
"Invalid dbg record: missing instruction");
6846 DILocalVariable *Var =
6848 DIExpression *Expr =
6861 unsigned SlotBefore =
Slot;
6862 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6863 return error(
"Invalid dbg record: invalid value");
6865 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6868 RawLocation = getFnMetadataByID(Record[Slot++]);
6871 DbgVariableRecord *DVR =
nullptr;
6875 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6876 DbgVariableRecord::LocationType::Value);
6879 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6880 DbgVariableRecord::LocationType::Declare);
6883 DVR =
new DbgVariableRecord(
6884 RawLocation, Var, Expr, DIL,
6885 DbgVariableRecord::LocationType::DeclareValue);
6889 DIExpression *AddrExpr =
6891 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6892 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, ID, Addr, AddrExpr,
6905 return error(
"Invalid call record");
6909 unsigned CCInfo =
Record[OpNum++];
6915 return error(
"Fast math flags indicator set for call with no FMF");
6918 unsigned FTyID = InvalidTypeID;
6919 FunctionType *FTy =
nullptr;
6924 return error(
"Explicit call type is not a function type");
6928 unsigned CalleeTypeID;
6929 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6931 return error(
"Invalid call record");
6935 return error(
"Callee is not a pointer type");
6937 FTyID = getContainedTypeID(CalleeTypeID);
6940 return error(
"Callee is not of pointer to function type");
6942 if (
Record.size() < FTy->getNumParams() + OpNum)
6943 return error(
"Insufficient operands to call");
6945 SmallVector<Value*, 16>
Args;
6946 SmallVector<unsigned, 16> ArgTyIDs;
6948 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6949 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6950 if (FTy->getParamType(i)->isLabelTy())
6951 Args.push_back(getBasicBlock(Record[OpNum]));
6954 FTy->getParamType(i), ArgTyID, CurBB));
6957 return error(
"Invalid call record");
6961 if (!FTy->isVarArg()) {
6962 if (OpNum !=
Record.size())
6963 return error(
"Invalid call record");
6965 while (OpNum !=
Record.size()) {
6968 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6969 return error(
"Invalid call record");
6976 if (!OperandBundles.empty())
6980 ResTypeID = getContainedTypeID(FTyID);
6981 OperandBundles.clear();
6995 SeenDebugIntrinsic =
true;
7002 return error(
"Fast-math-flags specified for call without "
7003 "floating-point scalar or vector return type");
7004 I->setFastMathFlags(FMF);
7010 return error(
"Invalid va_arg record");
7011 unsigned OpTyID =
Record[0];
7012 Type *OpTy = getTypeByID(OpTyID);
7015 Type *ResTy = getTypeByID(ResTypeID);
7016 if (!OpTy || !
Op || !ResTy)
7017 return error(
"Invalid va_arg record");
7018 I =
new VAArgInst(
Op, ResTy);
7028 if (
Record.empty() || Record[0] >= BundleTags.size())
7029 return error(
"Invalid operand bundle record");
7031 std::vector<Value *> Inputs;
7034 while (OpNum !=
Record.size()) {
7036 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
7037 return error(
"Invalid operand bundle record");
7038 Inputs.push_back(
Op);
7041 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
7049 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
7050 return error(
"Invalid freeze record");
7051 if (OpNum !=
Record.size())
7052 return error(
"Invalid freeze record");
7054 I =
new FreezeInst(
Op);
7055 ResTypeID = OpTypeID;
7065 return error(
"Invalid instruction with no BB");
7067 if (!OperandBundles.empty()) {
7069 return error(
"Operand bundles found with no consumer");
7071 I->insertInto(CurBB, CurBB->
end());
7074 if (
I->isTerminator()) {
7076 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
7080 if (!
I->getType()->isVoidTy()) {
7081 assert(
I->getType() == getTypeByID(ResTypeID) &&
7082 "Incorrect result type ID");
7090 if (!OperandBundles.empty())
7091 return error(
"Operand bundles found with no consumer");
7095 if (!
A->getParent()) {
7097 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
7103 return error(
"Never resolved value found in function");
7108 if (MDLoader->hasFwdRefs())
7109 return error(
"Invalid function metadata: outgoing forward refs");
7114 for (
const auto &Pair : ConstExprEdgeBBs) {
7125 ValueList.
shrinkTo(ModuleValueListSize);
7126 MDLoader->shrinkTo(ModuleMDLoaderSize);
7127 std::vector<BasicBlock*>().swap(FunctionBBs);
7132Error BitcodeReader::findFunctionInStream(
7134 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
7135 while (DeferredFunctionInfoIterator->second == 0) {
7140 assert(VSTOffset == 0 || !
F->hasName());
7143 if (
Error Err = rememberAndSkipFunctionBodies())
7149SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7152 if (Val >= SSIDs.
size())
7161Error BitcodeReader::materialize(GlobalValue *GV) {
7164 if (!
F || !
F->isMaterializable())
7167 auto DFII = DeferredFunctionInfo.
find(
F);
7168 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7171 if (DFII->second == 0)
7172 if (
Error Err = findFunctionInStream(
F, DFII))
7176 if (
Error Err = materializeMetadata())
7183 if (
Error Err = parseFunctionBody(
F))
7185 F->setIsMaterializable(
false);
7189 if (SeenDebugIntrinsic && SeenDebugRecord)
7190 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7196 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7197 F->setSubprogram(SP);
7200 if (!MDLoader->isStrippingTBAA()) {
7202 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7205 MDLoader->setStripTBAA(
true);
7212 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7213 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7219 unsigned ExpectedNumOperands = 0;
7221 ExpectedNumOperands = 2;
7223 ExpectedNumOperands =
SI->getNumSuccessors();
7225 ExpectedNumOperands = 1;
7229 ExpectedNumOperands = 2;
7236 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7237 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7243 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7244 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7246 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7247 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7248 CI->getArgOperand(ArgNo)->getType(),
7249 CI->getParamAttributes(ArgNo)));
7252 if (
Function *OldFn = CI->getCalledFunction()) {
7253 auto It = UpgradedIntrinsics.
find(OldFn);
7254 if (It != UpgradedIntrinsics.
end())
7258 BC && BC->getSrcTy() == BC->getDestTy() &&
7264 CI && CI->isMustTailCall() && CI->getNextNode() == BC) {
7265 BC->replaceAllUsesWith(CI);
7266 BC->eraseFromParent();
7276 return materializeForwardReferencedFunctions();
7279Error BitcodeReader::materializeModule() {
7280 if (
Error Err = materializeMetadata())
7284 WillMaterializeAllForwardRefs =
true;
7289 if (
Error Err = materialize(&
F))
7295 if (LastFunctionBlockBit || NextUnreadBit)
7297 ? LastFunctionBlockBit
7303 if (!BasicBlockFwdRefs.
empty())
7304 return error(
"Never resolved function from blockaddress");
7310 for (
auto &[OldFn, NewFn] : UpgradedIntrinsics) {
7311 for (User *U : OldFn->users()) {
7315 if (OldFn != NewFn) {
7316 if (!OldFn->use_empty())
7317 OldFn->replaceAllUsesWith(NewFn);
7318 OldFn->eraseFromParent();
7321 UpgradedIntrinsics.clear();
7336std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7337 return IdentifiedStructTypes;
7340ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7341 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7342 StringRef ModulePath, std::function<
bool(StringRef)> IsPrevailing,
7343 std::function<
void(ValueInfo)> OnValueInfo)
7344 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7345 ModulePath(ModulePath), IsPrevailing(IsPrevailing),
7346 OnValueInfo(OnValueInfo) {}
7348void ModuleSummaryIndexBitcodeReader::addThisModule() {
7353ModuleSummaryIndexBitcodeReader::getThisModule() {
7357template <
bool AllowNullValueInfo>
7358std::pair<ValueInfo, GlobalValue::GUID>
7359ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7360 auto VGI = ValueIdToValueInfoMap[ValueId];
7367 assert(AllowNullValueInfo || std::get<0>(VGI));
7371void ModuleSummaryIndexBitcodeReader::setValueGUID(
7373 StringRef SourceFileName) {
7375 if (ValueID < DefinedGUIDs.size())
7376 ValueGUID = DefinedGUIDs[ValueID];
7383 auto OriginalNameID = ValueGUID;
7387 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7395 ValueIdToValueInfoMap[ValueID] = std::make_pair(VI, OriginalNameID);
7403Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7405 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7412 if (!MaybeCurrentBit)
7419 SmallVector<uint64_t, 64>
Record;
7428 BitstreamEntry
Entry = MaybeEntry.
get();
7430 switch (
Entry.Kind) {
7433 return error(
"Malformed block");
7449 switch (MaybeRecord.
get()) {
7454 return error(
"Invalid vst_code_entry record");
7455 unsigned ValueID =
Record[0];
7457 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7458 assert(VLI != ValueIdToLinkageMap.
end() &&
7459 "No linkage found for VST entry?");
7468 return error(
"Invalid vst_code_fnentry record");
7469 unsigned ValueID =
Record[0];
7471 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7472 assert(VLI != ValueIdToLinkageMap.
end() &&
7473 "No linkage found for VST entry?");
7481 unsigned ValueID =
Record[0];
7485 ValueIdToValueInfoMap[ValueID] =
7496Error ModuleSummaryIndexBitcodeReader::parseModule() {
7500 SmallVector<uint64_t, 64>
Record;
7501 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7502 unsigned ValueId = 0;
7506 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
7509 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7511 switch (
Entry.Kind) {
7513 return error(
"Malformed block");
7525 if (
Error Err = readBlockInfo())
7531 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7532 !SeenGlobalValSummary) &&
7533 "Expected early VST parse via VSTOffset record");
7540 if (!SourceFileName.
empty())
7542 assert(!SeenValueSymbolTable &&
7543 "Already read VST when parsing summary block?");
7548 if (VSTOffset > 0) {
7549 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7551 SeenValueSymbolTable =
true;
7553 SeenGlobalValSummary =
true;
7554 if (
Error Err = parseEntireSummary(
Entry.ID))
7558 if (
Error Err = parseModuleStringTable())
7566 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7569 switch (MaybeBitCode.
get()) {
7573 if (
Error Err = parseVersionRecord(Record).takeError())
7581 return error(
"Invalid source filename record");
7588 return error(
"Invalid hash length " + Twine(
Record.size()));
7589 auto &Hash = getThisModule()->second;
7591 for (
auto &Val : Record) {
7592 assert(!(Val >> 32) &&
"Unexpected high bits set");
7600 return error(
"Invalid vstoffset record");
7604 VSTOffset =
Record[0] - 1;
7609 DefinedGUIDs.reserve(DefinedGUIDs.size() +
Record.size() / 2);
7610 for (
size_t i = 0; i <
Record.size(); i += 2)
7611 DefinedGUIDs.push_back(Record[i] << 32 | Record[i + 1]);
7621 ArrayRef<uint64_t> GVRecord;
7622 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7623 if (GVRecord.
size() <= 3)
7624 return error(
"Invalid global record");
7628 ValueIdToLinkageMap[ValueId++] =
Linkage;
7632 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7643ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7647 Ret.
push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7652ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7653 bool IsOldProfileFormat,
7654 bool HasProfile,
bool HasRelBF) {
7658 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7663 for (
unsigned I = 0,
E =
Record.size();
I !=
E; ++
I) {
7665 bool HasTailCall =
false;
7667 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7668 if (IsOldProfileFormat) {
7672 }
else if (HasProfile)
7673 std::tie(Hotness, HasTailCall) =
7707 static_cast<size_t>(
Record[Slot + 1])};
7730 while (Slot <
Record.size())
7734std::vector<FunctionSummary::ParamAccess>
7735ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7736 auto ReadRange = [&]() {
7738 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7740 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7747 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7748 while (!
Record.empty()) {
7749 PendingParamAccesses.emplace_back();
7750 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7752 ParamAccess.
Use = ReadRange();
7757 std::get<0>(getValueInfoFromValueId(
Record.consume_front()));
7758 Call.Offsets = ReadRange();
7761 return PendingParamAccesses;
7764void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7765 ArrayRef<uint64_t> Record,
size_t &Slot,
7768 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7772void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7773 ArrayRef<uint64_t> Record) {
7781 while (Slot <
Record.size())
7782 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7785SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7786 ArrayRef<uint64_t> Record,
unsigned &
I) {
7787 SmallVector<unsigned> StackIdList;
7791 if (RadixArray.empty()) {
7792 unsigned NumStackEntries =
Record[
I++];
7794 StackIdList.
reserve(NumStackEntries);
7795 for (
unsigned J = 0; J < NumStackEntries; J++) {
7796 assert(Record[
I] < StackIds.size());
7797 StackIdList.
push_back(getStackIdIndex(Record[
I++]));
7800 unsigned RadixIndex =
Record[
I++];
7806 assert(RadixIndex < RadixArray.size());
7807 unsigned NumStackIds = RadixArray[RadixIndex++];
7808 StackIdList.
reserve(NumStackIds);
7809 while (NumStackIds--) {
7810 assert(RadixIndex < RadixArray.size());
7811 unsigned Elem = RadixArray[RadixIndex];
7812 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7813 RadixIndex = RadixIndex - Elem;
7814 assert(RadixIndex < RadixArray.size());
7815 Elem = RadixArray[RadixIndex];
7817 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7820 StackIdList.
push_back(getStackIdIndex(Elem));
7830 unsigned FirstWORef = Refs.
size() - WOCnt;
7831 unsigned RefNo = FirstWORef - ROCnt;
7832 for (; RefNo < FirstWORef; ++RefNo)
7833 Refs[RefNo].setReadOnly();
7834 for (; RefNo < Refs.
size(); ++RefNo)
7835 Refs[RefNo].setWriteOnly();
7840Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7843 SmallVector<uint64_t, 64>
Record;
7850 BitstreamEntry
Entry = MaybeEntry.
get();
7853 return error(
"Invalid Summary Block: record for version expected");
7858 return error(
"Invalid Summary Block: version expected");
7861 const bool IsOldProfileFormat =
Version == 1;
7864 const bool MemProfAfterFunctionSummary =
Version >= 13;
7866 return error(
"Invalid summary version " + Twine(
Version) +
" in module '" +
7867 ModulePath +
"'. Version should be in the range [1-" +
7873 GlobalValueSummary *LastSeenSummary =
nullptr;
7883 FunctionSummary *CurrentPrevailingFS =
nullptr;
7888 std::vector<GlobalValue::GUID> PendingTypeTests;
7889 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7890 PendingTypeCheckedLoadVCalls;
7891 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7892 PendingTypeCheckedLoadConstVCalls;
7893 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7895 std::vector<CallsiteInfo> PendingCallsites;
7896 std::vector<AllocInfo> PendingAllocs;
7897 std::vector<uint64_t> PendingContextIds;
7903 BitstreamEntry
Entry = MaybeEntry.
get();
7905 switch (
Entry.Kind) {
7908 return error(
"Malformed block");
7924 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7927 unsigned BitCode = MaybeBitCode.
get();
7944 ValueIdToValueInfoMap[ValueID] =
7962 unsigned ValueID =
Record[0];
7964 unsigned InstCount =
Record[2];
7966 unsigned NumRefs =
Record[3];
7967 unsigned NumRORefs = 0, NumWORefs = 0;
7968 int RefListStartIndex = 4;
7972 RefListStartIndex = 5;
7975 RefListStartIndex = 6;
7978 RefListStartIndex = 7;
7989 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7991 "Record size inconsistent with number of references");
7993 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7998 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7999 IsOldProfileFormat, HasProfile, HasRelBF);
8001 auto [
VI,
GUID] = getValueInfoFromValueId(ValueID);
8008 IsPrevailing(
VI.name());
8014 assert(!MemProfAfterFunctionSummary ||
8015 (PendingCallsites.empty() && PendingAllocs.empty()));
8016 if (!IsPrevailingSym && !MemProfAfterFunctionSummary) {
8017 PendingCallsites.clear();
8018 PendingAllocs.clear();
8021 auto FS = std::make_unique<FunctionSummary>(
8023 std::move(Calls), std::move(PendingTypeTests),
8024 std::move(PendingTypeTestAssumeVCalls),
8025 std::move(PendingTypeCheckedLoadVCalls),
8026 std::move(PendingTypeTestAssumeConstVCalls),
8027 std::move(PendingTypeCheckedLoadConstVCalls),
8028 std::move(PendingParamAccesses), std::move(PendingCallsites),
8029 std::move(PendingAllocs));
8030 FS->setModulePath(getThisModule()->first());
8031 FS->setOriginalName(GUID);
8034 if (MemProfAfterFunctionSummary) {
8035 if (IsPrevailingSym)
8036 CurrentPrevailingFS =
FS.get();
8038 CurrentPrevailingFS =
nullptr;
8047 unsigned ValueID =
Record[0];
8049 unsigned AliaseeID =
Record[2];
8051 auto AS = std::make_unique<AliasSummary>(Flags);
8057 AS->setModulePath(getThisModule()->first());
8059 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
8061 if (!AliaseeInModule)
8062 return error(
"Alias expects aliasee summary to be parsed");
8063 AS->setAliasee(AliaseeVI, AliaseeInModule);
8065 auto GUID = getValueInfoFromValueId(ValueID);
8066 AS->setOriginalName(std::get<1>(GUID));
8072 unsigned ValueID =
Record[0];
8074 unsigned RefArrayStart = 2;
8075 GlobalVarSummary::GVarFlags GVF(
false,
8085 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8087 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8088 FS->setModulePath(getThisModule()->first());
8089 auto GUID = getValueInfoFromValueId(ValueID);
8090 FS->setOriginalName(std::get<1>(GUID));
8098 unsigned ValueID =
Record[0];
8101 unsigned NumRefs =
Record[3];
8102 unsigned RefListStartIndex = 4;
8103 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
8106 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8108 for (
unsigned I = VTableListStartIndex,
E =
Record.size();
I !=
E; ++
I) {
8109 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
8114 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8115 VS->setModulePath(getThisModule()->first());
8116 VS->setVTableFuncs(VTableFuncs);
8117 auto GUID = getValueInfoFromValueId(ValueID);
8118 VS->setOriginalName(std::get<1>(GUID));
8130 unsigned ValueID =
Record[0];
8133 unsigned InstCount =
Record[3];
8135 unsigned NumRefs =
Record[4];
8136 unsigned NumRORefs = 0, NumWORefs = 0;
8137 int RefListStartIndex = 5;
8141 RefListStartIndex = 6;
8142 size_t NumRefsIndex = 5;
8144 unsigned NumRORefsOffset = 1;
8145 RefListStartIndex = 7;
8148 RefListStartIndex = 8;
8150 RefListStartIndex = 9;
8152 NumRORefsOffset = 2;
8155 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
8157 NumRefs =
Record[NumRefsIndex];
8161 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8163 "Record size inconsistent with number of references");
8165 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8168 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8169 IsOldProfileFormat, HasProfile,
false);
8170 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8172 auto FS = std::make_unique<FunctionSummary>(
8174 std::move(Edges), std::move(PendingTypeTests),
8175 std::move(PendingTypeTestAssumeVCalls),
8176 std::move(PendingTypeCheckedLoadVCalls),
8177 std::move(PendingTypeTestAssumeConstVCalls),
8178 std::move(PendingTypeCheckedLoadConstVCalls),
8179 std::move(PendingParamAccesses), std::move(PendingCallsites),
8180 std::move(PendingAllocs));
8181 LastSeenSummary =
FS.get();
8182 if (MemProfAfterFunctionSummary)
8183 CurrentPrevailingFS =
FS.get();
8184 LastSeenGUID =
VI.getGUID();
8185 FS->setModulePath(ModuleIdMap[ModuleId]);
8193 unsigned ValueID =
Record[0];
8196 unsigned AliaseeValueId =
Record[3];
8198 auto AS = std::make_unique<AliasSummary>(Flags);
8199 LastSeenSummary = AS.get();
8200 AS->setModulePath(ModuleIdMap[ModuleId]);
8202 auto AliaseeVI = std::get<0>(
8203 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(AliaseeValueId));
8205 auto AliaseeInModule =
8207 AS->setAliasee(AliaseeVI, AliaseeInModule);
8209 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8210 LastSeenGUID =
VI.getGUID();
8216 unsigned ValueID =
Record[0];
8219 unsigned RefArrayStart = 3;
8220 GlobalVarSummary::GVarFlags GVF(
false,
8230 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8232 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8233 LastSeenSummary =
FS.get();
8234 FS->setModulePath(ModuleIdMap[ModuleId]);
8235 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8236 LastSeenGUID =
VI.getGUID();
8243 if (!LastSeenSummary)
8244 return error(
"Name attachment that does not follow a combined record");
8248 LastSeenSummary =
nullptr;
8253 assert(PendingTypeTests.empty());
8258 assert(PendingTypeTestAssumeVCalls.empty());
8259 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8260 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8264 assert(PendingTypeCheckedLoadVCalls.empty());
8265 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8266 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8270 PendingTypeTestAssumeConstVCalls.push_back(
8275 PendingTypeCheckedLoadConstVCalls.push_back(
8282 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8283 StringRef
Name(Strtab.
data() + Record[
I],
8284 static_cast<size_t>(Record[
I + 1]));
8287 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, GUID);
8290 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8292 StringRef
Name(Strtab.
data() + Record[
I + 1],
8293 static_cast<size_t>(Record[
I + 2]));
8294 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8303 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8304 StringRef
Name(Strtab.
data() + Record[
I],
8305 static_cast<size_t>(Record[
I + 1]));
8308 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, GUID);
8311 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8313 StringRef
Name(Strtab.
data() + Record[
I + 1],
8314 static_cast<size_t>(Record[
I + 2]));
8315 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8326 parseTypeIdCompatibleVtableSummaryRecord(Record);
8334 PendingParamAccesses = parseParamAccesses(Record);
8341 assert(StackIds.empty());
8343 StackIds = ArrayRef<uint64_t>(Record);
8349 StackIds.reserve(
Record.size() / 2);
8350 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8351 StackIds.push_back(*R << 32 | *(R + 1));
8353 assert(StackIdToIndex.empty());
8355 StackIdToIndex.resize(StackIds.size(), UninitializedStackIdIndex);
8360 RadixArray = ArrayRef<uint64_t>(Record);
8367 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8369 unsigned ValueID =
Record[0];
8370 SmallVector<unsigned> StackIdList;
8372 assert(R < StackIds.size());
8373 StackIdList.
push_back(getStackIdIndex(R));
8375 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8376 if (MemProfAfterFunctionSummary)
8378 CallsiteInfo({
VI, std::move(StackIdList)}));
8380 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8387 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8388 auto RecordIter =
Record.begin();
8389 unsigned ValueID = *RecordIter++;
8390 unsigned NumStackIds = *RecordIter++;
8391 unsigned NumVersions = *RecordIter++;
8392 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8393 SmallVector<unsigned> StackIdList;
8394 for (
unsigned J = 0; J < NumStackIds; J++) {
8395 assert(*RecordIter < StackIds.size());
8396 StackIdList.
push_back(getStackIdIndex(*RecordIter++));
8398 SmallVector<unsigned> Versions;
8399 for (
unsigned J = 0; J < NumVersions; J++)
8401 ValueInfo
VI = std::get<0>(
8402 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8403 if (MemProfAfterFunctionSummary)
8405 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8407 PendingCallsites.push_back(
8408 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8415 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8420 PendingContextIds.reserve(
Record.size() / 2);
8421 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8422 PendingContextIds.push_back(*R << 32 | *(R + 1));
8429 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS) {
8430 PendingContextIds.clear();
8434 std::vector<MIBInfo> MIBs;
8435 unsigned NumMIBs = 0;
8438 unsigned MIBsRead = 0;
8439 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8443 auto StackIdList = parseAllocInfoContext(Record,
I);
8444 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8450 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8452 assert(!PendingContextIds.empty() &&
8453 "Missing context ids for alloc sizes");
8454 unsigned ContextIdIndex = 0;
8460 while (MIBsRead++ < NumMIBs) {
8462 unsigned NumContextSizeInfoEntries =
Record[
I++];
8464 std::vector<ContextTotalSize> ContextSizes;
8465 ContextSizes.reserve(NumContextSizeInfoEntries);
8466 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8467 assert(ContextIdIndex < PendingContextIds.size());
8469 if (PendingContextIds[ContextIdIndex] == 0) {
8478 ContextSizes.push_back(
8479 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8481 AllContextSizes.push_back(std::move(ContextSizes));
8483 PendingContextIds.clear();
8485 AllocInfo AI(std::move(MIBs));
8486 if (!AllContextSizes.empty()) {
8487 assert(AI.MIBs.size() == AllContextSizes.size());
8488 AI.ContextSizeInfos = std::move(AllContextSizes);
8491 if (MemProfAfterFunctionSummary)
8492 CurrentPrevailingFS->
addAlloc(std::move(AI));
8494 PendingAllocs.push_back(std::move(AI));
8502 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8504 std::vector<MIBInfo> MIBs;
8505 unsigned NumMIBs =
Record[
I++];
8506 unsigned NumVersions =
Record[
I++];
8507 unsigned MIBsRead = 0;
8508 while (MIBsRead++ < NumMIBs) {
8511 SmallVector<unsigned> StackIdList;
8513 StackIdList = parseAllocInfoContext(Record,
I);
8514 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8517 SmallVector<uint8_t> Versions;
8518 for (
unsigned J = 0; J < NumVersions; J++)
8521 AllocInfo AI(std::move(Versions), std::move(MIBs));
8522 if (MemProfAfterFunctionSummary)
8523 CurrentPrevailingFS->
addAlloc(std::move(AI));
8525 PendingAllocs.push_back(std::move(AI));
8535Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8539 SmallVector<uint64_t, 64>
Record;
8541 SmallString<128> ModulePath;
8548 BitstreamEntry
Entry = MaybeEntry.
get();
8550 switch (
Entry.Kind) {
8553 return error(
"Malformed block");
8565 switch (MaybeRecord.
get()) {
8573 return error(
"Invalid code_entry record");
8575 LastSeenModule = TheIndex.
addModule(ModulePath);
8576 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8584 return error(
"Invalid hash length " + Twine(
Record.size()));
8585 if (!LastSeenModule)
8586 return error(
"Invalid hash that does not follow a module path");
8588 for (
auto &Val : Record) {
8589 assert(!(Val >> 32) &&
"Unexpected high bits set");
8590 LastSeenModule->
second[Pos++] = Val;
8593 LastSeenModule =
nullptr;
8606class BitcodeErrorCategoryType :
public std::error_category {
8607 const char *
name()
const noexcept
override {
8608 return "llvm.bitcode";
8611 std::string message(
int IE)
const override {
8614 case BitcodeError::CorruptedBitcode:
8615 return "Corrupted bitcode";
8624 static BitcodeErrorCategoryType ErrorCategory;
8625 return ErrorCategory;
8629 unsigned Block,
unsigned RecordID) {
8631 return std::move(Err);
8640 switch (Entry.Kind) {
8645 return error(
"Malformed block");
8649 return std::move(Err);
8659 if (MaybeRecord.
get() == RecordID)
8670Expected<std::vector<BitcodeModule>>
8674 return FOrErr.takeError();
8675 return std::move(FOrErr->Mods);
8700 switch (Entry.Kind) {
8703 return error(
"Malformed block");
8706 uint64_t IdentificationBit = -1ull;
8710 return std::move(Err);
8716 Entry = MaybeEntry.
get();
8721 return error(
"Malformed block");
8727 return std::move(Err);
8746 if (!
I.Strtab.empty())
8753 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8754 F.StrtabForSymtab = *Strtab;
8770 if (
F.Symtab.empty())
8771 F.Symtab = *SymtabOrErr;
8776 return std::move(Err);
8781 return std::move(E);
8796BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8797 bool ShouldLazyLoadMetadata,
bool IsImporting,
8801 std::string ProducerIdentification;
8802 if (IdentificationBit != -1ull) {
8804 return std::move(JumpFailed);
8807 return std::move(
E);
8811 return std::move(JumpFailed);
8812 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8815 std::unique_ptr<Module>
M =
8816 std::make_unique<Module>(ModuleIdentifier,
Context);
8817 M->setMaterializer(R);
8820 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8821 IsImporting, Callbacks))
8822 return std::move(Err);
8824 if (MaterializeAll) {
8826 if (
Error Err =
M->materializeAll())
8827 return std::move(Err);
8830 if (
Error Err =
R->materializeForwardReferencedFunctions())
8831 return std::move(Err);
8834 return std::move(M);
8837Expected<std::unique_ptr<Module>>
8840 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8850 std::function<
bool(
StringRef)> IsPrevailing,
8851 std::function<
void(
ValueInfo)> OnValueInfo) {
8856 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8857 ModulePath, IsPrevailing, OnValueInfo);
8858 return R.parseModule();
8865 return std::move(JumpFailed);
8867 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8868 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8869 ModuleIdentifier, 0);
8871 if (
Error Err = R.parseModule())
8872 return std::move(Err);
8874 return std::move(Index);
8880 return std::move(Err);
8886 return std::move(
E);
8888 switch (Entry.Kind) {
8891 return error(
"Malformed block");
8894 return std::make_pair(
false,
false);
8906 switch (MaybeBitCode.
get()) {
8912 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8914 bool EnableSplitLTOUnit = Flags & 0x8;
8915 bool UnifiedLTO = Flags & 0x200;
8916 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8927 return std::move(JumpFailed);
8930 return std::move(Err);
8935 return std::move(E);
8937 switch (Entry.Kind) {
8939 return error(
"Malformed block");
8950 return Flags.takeError();
8960 return std::move(Err);
8967 return StreamFailed.takeError();
8977 if (MsOrErr->size() != 1)
8978 return error(
"Expected a single module");
8980 return (*MsOrErr)[0];
8983Expected<std::unique_ptr<Module>>
8985 bool ShouldLazyLoadMetadata,
bool IsImporting,
8991 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8996 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8997 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8999 IsImporting, Callbacks);
9001 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
9007 return getModuleImpl(Context,
true,
false,
false, Callbacks);
9019 return BM->parseModule(Context, Callbacks);
9052 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
9061 return BM->getSummary();
9069 return BM->getLTOInfo();
9074 bool IgnoreEmptyThinLTOIndexFile) {
9079 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")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static StringRef getOpcodeName(uint8_t Opcode, uint8_t OpcodeBase)
This file defines the DenseMap class.
Provides ErrorOr<T> smart pointer.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Module.h This file contains the declarations for the Module class.
static constexpr Value * getValue(Ty &ValueOrUse)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Machine Check Debug Module
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines the SmallString class.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
PointerType * getType() const
Overload to return most specific pointer type.
void setUsedWithInAlloca(bool V)
Specify whether this alloca is used to represent the arguments to a call.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
static bool isValidFailureOrdering(AtomicOrdering Ordering)
static AtomicOrdering getStrongestFailureOrdering(AtomicOrdering SuccessOrdering)
Returns the strongest permitted ordering on failure, given the desired ordering on success.
static bool isValidSuccessOrdering(AtomicOrdering Ordering)
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
static bool isTypeAttrKind(AttrKind Kind)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
@ None
No attributes have been set.
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
@ EndAttrKinds
Sentinel value useful for loops.
LLVM Basic Block Representation.
const Instruction & back() const
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI void replacePhiUsesWith(BasicBlock *Old, BasicBlock *New)
Update all phi nodes in this basic block to refer to basic block New instead of basic block Old.
LLVM_ABI SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
void moveBefore(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it into the function that MovePos lives ...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Represents a module in a bitcode file.
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getSummary()
Parse the specified bitcode buffer, returning the module summary index.
LLVM_ABI Expected< BitcodeLTOInfo > getLTOInfo()
Returns information about the module to be used for LTO: whether to compile with ThinLTO,...
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
LLVM_ABI Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(StringRef)> IsPrevailing=nullptr, std::function< void(ValueInfo)> OnValueInfo=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata, bool IsImporting, ParserCallbacks Callbacks={})
Read the bitcode module and prepare for lazy deserialization of function bodies.
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
void push_back(Value *V, unsigned TypeID)
void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV)
Error assignValue(unsigned Idx, Value *V, unsigned TypeID)
void shrinkTo(unsigned N)
unsigned getTypeID(unsigned ValNo) const
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
ArrayRef< uint8_t > getBitcodeBytes() const
Expected< word_t > Read(unsigned NumBits)
Expected< BitstreamEntry > advance(unsigned Flags=0)
Advance the current bitstream, returning the next entry in the stream.
Expected< BitstreamEntry > advanceSkippingSubblocks(unsigned Flags=0)
This is a convenience function for clients that don't expect any subblocks.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP=nullptr)
Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
Error SkipBlock()
Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body of this block.
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
uint64_t getCurrentByteNo() const
LLVM_ABI Expected< std::optional< BitstreamBlockInfo > > ReadBlockInfoBlock(bool ReadBlockInfoNames=false)
Read and return a block info block from the bitstream.
unsigned getAbbrevIDWidth() const
Return the number of bits used to encode an abbrev #.
bool canSkipToPos(size_t pos) const
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
@ MIN_BYTE_BITS
Minimum number of bits that can be specified.
@ MAX_BYTE_BITS
Maximum number of bits that can be specified Note that bit width is stored in the Type classes Subcla...
static LLVM_ABI ByteType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing a ByteType.
bool isInlineAsm() const
Check if this call is an inline asm statement.
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CaptureInfo createFromIntValue(uint32_t Data)
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
bool isFPPredicate() const
bool isIntPredicate() const
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
static CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
static LLVM_ABI bool isElementTypeCompatible(Type *Ty)
Return true if a ConstantDataSequential can be formed with a vector or array of the specified element...
static Constant * getRaw(StringRef Data, uint64_t NumElements, Type *ElementTy)
getRaw() constructor - Return a constant with vector type with an element count and element type matc...
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static LLVM_ABI bool isSupportedBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is supported.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI bool isSupportedCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is supported.
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
static LLVM_ABI bool isOrderedRanges(ArrayRef< ConstantRange > RangesRef)
LLVM_ABI bool isUpperSignWrapped() const
Return true if the (exclusive) upper bound wraps around the signed domain.
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
static LLVM_ABI Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
static DeadOnReturnInfo createFromIntValue(uint64_t Data)
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Base class for error info classes.
virtual std::string message() const
Return the error message as a string.
virtual std::error_code convertToErrorCode() const =0
Convert this error to a std::error_code.
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
Convenience struct for specifying and reasoning about fast-math flags.
void setFast(bool B=true)
void setAllowContract(bool B=true)
void setAllowReciprocal(bool B=true)
void setNoSignedZeros(bool B=true)
void setNoNaNs(bool B=true)
void setAllowReassoc(bool B=true)
Flag setters.
void setApproxFunc(bool B=true)
void setNoInfs(bool B=true)
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
void addCallsite(CallsiteInfo &&Callsite)
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
void addAlloc(AllocInfo &&Alloc)
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
BasicBlockListType::iterator iterator
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags noUnsignedSignedWrap()
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
static LLVM_ABI GlobalIFunc * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Resolver, Module *Parent)
If a parent module is specified, the ifunc is automatically inserted into the end of the specified mo...
LLVM_ABI void setComdat(Comdat *C)
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
void setOriginalName(GlobalValue::GUID Name)
Initialize the original name hash in this summary.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
static bool isLocalLinkage(LinkageTypes Linkage)
void setUnnamedAddr(UnnamedAddr Val)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
bool hasLocalLinkage() const
bool hasDefaultVisibility() const
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
void setDLLStorageClass(DLLStorageClassTypes C)
void setThreadLocalMode(ThreadLocalMode Val)
bool hasExternalWeakLinkage() const
DLLStorageClassTypes
Storage classes of global values for PE targets.
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
void setDSOLocal(bool Local)
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
static LLVM_ABI std::string getGlobalIdentifier(StringRef Name, GlobalValue::LinkageTypes Linkage, StringRef FileName)
Return the modified name for a global value suitable to be used as the key for a global lookup (e....
void setVisibility(VisibilityTypes V)
LLVM_ABI void setSanitizerMetadata(SanitizerMetadata Meta)
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AppendingLinkage
Special purpose, only applies to global arrays.
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
LLVM_ABI void setPartition(StringRef Part)
void setAttributes(AttributeSet A)
Set attribute list for this global.
LLVM_ABI void setCodeModel(CodeModel::Model CM)
Change the code model for this global.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
LLVM_ABI void addDestination(BasicBlock *Dest)
Add a destination.
static IndirectBrInst * Create(Value *Address, unsigned NumDests, InsertPosition InsertBefore=nullptr)
unsigned getNumDestinations() const
return the number of possible destinations in this indirectbr instruction.
static LLVM_ABI InlineAsm * get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack=false, AsmDialect asmDialect=AD_ATT, bool canThrow=false)
InlineAsm::get - Return the specified uniqued inline asm string.
std::vector< ConstraintInfo > ConstraintInfoVector
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB)
Replace specified successor OldBB to point at the provided block.
const char * getOpcodeName() const
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This is an important class for using LLVM in a threaded context.
static LLVM_ABI LandingPadInst * Create(Type *RetTy, unsigned NumReservedClauses, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedClauses is a hint for the number of incoming clauses that this landingpad w...
LLVM_ABI void addClause(Constant *ClauseVal)
Add a catch or filter clause to the landing pad.
void setCleanup(bool V)
Indicate that this landingpad instruction is a cleanup.
LLVM_ABI StringRef getString() const
ValueT lookup(const KeyT &Key) const
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
size_t getBufferSize() const
StringRef getBufferIdentifier() const
const char * getBufferStart() const
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
static MemoryEffectsBase readOnly()
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
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isStructTy() const
True if this is an instance of StructType.
bool isByteOrByteVectorTy() const
Return true if this is a byte type or a vector of byte types.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
bool isVoidTy() const
Return true if this is 'void'.
bool isMetadataTy() const
Return true if this is 'metadata'.
static LLVM_ABI UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
const ParentTy * getParent() const
self_iterator getIterator()
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
constexpr uint8_t RecordLength
Length of the parts of a physical GOFF record.
@ BasicBlock
Various leaf nodes.
LLVM_ABI AttributeList getAttributes(LLVMContext &C, ID id, FunctionType *FT)
Return the attributes for an intrinsic.
@ SingleThread
Synchronized with respect to signal handlers executing in the same thread.
@ System
Synchronized with respect to all concurrently executing threads.
@ TYPE_CODE_OPAQUE_POINTER
@ FS_CONTEXT_RADIX_TREE_ARRAY
@ FS_COMBINED_GLOBALVAR_INIT_REFS
@ FS_TYPE_CHECKED_LOAD_VCALLS
@ FS_COMBINED_ORIGINAL_NAME
@ FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_CONST_VCALL
@ FS_PERMODULE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_VCALLS
@ FS_COMBINED_ALLOC_INFO_NO_CONTEXT
@ FS_COMBINED_CALLSITE_INFO
@ FS_PERMODULE_CALLSITE_INFO
@ FS_PERMODULE_ALLOC_INFO
@ FS_TYPE_CHECKED_LOAD_CONST_VCALL
@ IDENTIFICATION_CODE_EPOCH
@ IDENTIFICATION_CODE_STRING
@ CST_CODE_CE_INBOUNDS_GEP
@ CST_CODE_INLINEASM_OLD3
@ CST_CODE_CE_GEP_WITH_INRANGE_INDEX_OLD
@ CST_CODE_DSO_LOCAL_EQUIVALENT
@ CST_CODE_INLINEASM_OLD2
@ CST_CODE_CE_GEP_WITH_INRANGE
@ VST_CODE_COMBINED_ENTRY
@ COMDAT_SELECTION_KIND_LARGEST
@ COMDAT_SELECTION_KIND_ANY
@ COMDAT_SELECTION_KIND_SAME_SIZE
@ COMDAT_SELECTION_KIND_EXACT_MATCH
@ COMDAT_SELECTION_KIND_NO_DUPLICATES
@ ATTR_KIND_STACK_PROTECT
@ ATTR_KIND_STACK_PROTECT_STRONG
@ ATTR_KIND_SANITIZE_MEMORY
@ ATTR_KIND_OPTIMIZE_FOR_SIZE
@ ATTR_KIND_INACCESSIBLEMEM_ONLY
@ ATTR_KIND_FNRETTHUNK_EXTERN
@ ATTR_KIND_NO_DIVERGENCE_SOURCE
@ ATTR_KIND_SANITIZE_ADDRESS
@ ATTR_KIND_NO_IMPLICIT_FLOAT
@ ATTR_KIND_DEAD_ON_UNWIND
@ ATTR_KIND_STACK_ALIGNMENT
@ ATTR_KIND_INACCESSIBLEMEM_OR_ARGMEMONLY
@ ATTR_KIND_STACK_PROTECT_REQ
@ ATTR_KIND_NULL_POINTER_IS_VALID
@ ATTR_KIND_SANITIZE_HWADDRESS
@ ATTR_KIND_RETURNS_TWICE
@ ATTR_KIND_SHADOWCALLSTACK
@ ATTR_KIND_OPT_FOR_FUZZING
@ ATTR_KIND_DENORMAL_FPENV
@ ATTR_KIND_SANITIZE_NUMERICAL_STABILITY
@ ATTR_KIND_ALLOCATED_POINTER
@ ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION
@ ATTR_KIND_CORO_ELIDE_SAFE
@ ATTR_KIND_NON_LAZY_BIND
@ ATTR_KIND_DEREFERENCEABLE
@ ATTR_KIND_OPTIMIZE_NONE
@ ATTR_KIND_DEREFERENCEABLE_OR_NULL
@ ATTR_KIND_SANITIZE_REALTIME
@ ATTR_KIND_SPECULATIVE_LOAD_HARDENING
@ ATTR_KIND_ALWAYS_INLINE
@ ATTR_KIND_SANITIZE_TYPE
@ ATTR_KIND_PRESPLIT_COROUTINE
@ ATTR_KIND_SANITIZE_ALLOC_TOKEN
@ ATTR_KIND_NO_SANITIZE_COVERAGE
@ ATTR_KIND_NO_CREATE_UNDEF_OR_POISON
@ ATTR_KIND_DEAD_ON_RETURN
@ ATTR_KIND_SANITIZE_REALTIME_BLOCKING
@ ATTR_KIND_NO_SANITIZE_BOUNDS
@ ATTR_KIND_SANITIZE_MEMTAG
@ ATTR_KIND_CORO_ONLY_DESTROY_WHEN_COMPLETE
@ ATTR_KIND_SANITIZE_THREAD
@ ATTR_KIND_OPTIMIZE_FOR_DEBUGGING
@ SYNC_SCOPE_NAMES_BLOCK_ID
@ PARAMATTR_GROUP_BLOCK_ID
@ IDENTIFICATION_BLOCK_ID
@ GLOBALVAL_SUMMARY_BLOCK_ID
@ FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID
@ OPERAND_BUNDLE_TAGS_BLOCK_ID
@ BLOCKINFO_BLOCK_ID
BLOCKINFO_BLOCK is used to define metadata about blocks, for example, standard abbrevs that should be...
@ MODULE_CODE_SOURCE_FILENAME
@ MODULE_CODE_SECTIONNAME
@ 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_ATOMICRMW
@ FUNC_CODE_DEBUG_RECORD_DECLARE_VALUE
@ FUNC_CODE_DEBUG_LOC_AGAIN
@ FUNC_CODE_INST_EXTRACTELT
@ FUNC_CODE_INST_INDIRECTBR
@ FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE
@ FUNC_CODE_INST_INSERTVAL
@ FUNC_CODE_DECLAREBLOCKS
@ FUNC_CODE_DEBUG_RECORD_LABEL
@ FUNC_CODE_INST_INSERTELT
@ FUNC_CODE_BLOCKADDR_USERS
@ FUNC_CODE_INST_CLEANUPPAD
@ FUNC_CODE_INST_SHUFFLEVEC
@ FUNC_CODE_INST_STORE_OLD
@ FUNC_CODE_INST_UNREACHABLE
@ FUNC_CODE_INST_CMPXCHG_OLD
@ FUNC_CODE_DEBUG_RECORD_DECLARE
@ FUNC_CODE_OPERAND_BUNDLE
@ PARAMATTR_CODE_ENTRY_OLD
@ PARAMATTR_GRP_CODE_ENTRY
initializer< Ty > init(const Ty &Val)
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
NodeAddr< FuncNode * > Func
friend class Instruction
Iterator for Instructions in a `BasicBlock.
constexpr bool IsBigEndianHost
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
StringMapEntry< Value * > ValueName
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
LLVM_ABI const std::error_category & BitcodeErrorCategory()
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
LLVM_ABI void UpgradeInlineAsmString(std::string *AsmStr)
Upgrade comment in call to inline asm that represents an objc retain release marker.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
std::error_code make_error_code(BitcodeError E)
LLVM_ABI bool stripDebugInfo(Function &F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Expected< bool > isBitcodeContainingObjCCategory(MemoryBufferRef Buffer)
Return true if Buffer contains a bitcode file with ObjC code (category or class) in it.
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI void UpgradeAttributes(AttrBuilder &B)
Upgrade attributes that changed format or kind.
LLVM_ABI Expected< std::string > getBitcodeTargetTriple(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the triple information.
LLVM_ABI std::unique_ptr< Module > parseModule(const uint8_t *Data, size_t Size, LLVMContext &Context)
Fuzzer friendly interface for the llvm bitcode parser.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI Expected< BitcodeFileContents > getBitcodeFileContents(MemoryBufferRef Buffer)
Returns the contents of a bitcode file.
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
LLVM_ABI bool UpgradeCFIFunctionsMetadata(Module &M)
Upgrade the cfi.functions metadata node by calculating and inserting the GUID for each function entry...
LLVM_ABI void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
auto uninitialized_copy(R &&Src, IterTy Dst)
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
bool isa_and_nonnull(const Y &Val)
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
LLVM_ABI void UpgradeOperandBundles(std::vector< OperandBundleDef > &OperandBundles)
Upgrade operand bundles (without knowing about their user instruction).
LLVM_ABI Constant * UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy)
This is an auto-upgrade for bitcast constant expression between pointers with different address space...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndex(MemoryBufferRef Buffer)
Parse the specified bitcode buffer, returning the module summary index.
auto dyn_cast_or_null(const Y &Val)
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
LLVM_ABI Expected< std::string > getBitcodeProducerString(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the producer string information.
auto reverse(ContainerTy &&C)
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyBitcodeModule(MemoryBufferRef Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Read the header of the specified bitcode buffer and prepare for lazy deserialization of function bodi...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
detail::ValueMatchesPoly< M > HasValue(M Matcher)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI std::string UpgradeDataLayoutString(StringRef DL, StringRef Triple)
Upgrade the datalayout string by adding a section for address space pointers.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
LLVM_ABI Expected< BitcodeLTOInfo > getBitcodeLTOInfo(MemoryBufferRef Buffer)
Returns LTO information for the specified bitcode file.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI GlobalVariable * UpgradeGlobalVariable(GlobalVariable *GV)
This checks for global variables which should be upgraded.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
AtomicOrdering
Atomic ordering for LLVM's memory model.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
@ ArgMem
Access to memory via argument pointers.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
LLVM_ABI Instruction * UpgradeBitCastInst(unsigned Opc, Value *V, Type *DestTy, Instruction *&Temp)
This is an auto-upgrade for bitcast between pointers with different address spaces: the instruction i...
MaybeAlign decodeMaybeAlign(unsigned Value)
Dual operation of the encode function above.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr, const unsigned char *&BufEnd, bool VerifyBufferSize)
SkipBitcodeWrapperHeader - Some systems wrap bc files with a special header for padding or other reas...
bool isBitcodeWrapper(const unsigned char *BufPtr, const unsigned char *BufEnd)
isBitcodeWrapper - Return true if the given bytes are the magic bytes for an LLVM IR bitcode wrapper.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI APInt readWideAPInt(ArrayRef< uint64_t > Vals, unsigned TypeBits)
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
LLVM_ABI void UpgradeFunctionAttributes(Function &F)
Correct any IR that is relying on old function attribute behavior.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
LLVM_ABI Error readModuleSummaryIndex(MemoryBufferRef Buffer, ModuleSummaryIndex &CombinedIndex)
Parse the specified bitcode buffer and merge the index into CombinedIndex.
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