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) {
489 if (
Record.size() < 2 || Record[0] > Strtab.
size() ||
490 Record[1] > Strtab.
size() - Record[0])
492 return {StringRef(Strtab.
data() + Record[0], Record[1]),
Record.slice(2)};
503class BitcodeConstant final :
public Value,
504 TrailingObjects<BitcodeConstant, unsigned> {
505 friend TrailingObjects;
508 static constexpr uint8_t SubclassID = 255;
516 static constexpr uint8_t ConstantStructOpcode = 255;
517 static constexpr uint8_t ConstantArrayOpcode = 254;
518 static constexpr uint8_t ConstantVectorOpcode = 253;
519 static constexpr uint8_t NoCFIOpcode = 252;
520 static constexpr uint8_t DSOLocalEquivalentOpcode = 251;
521 static constexpr uint8_t BlockAddressOpcode = 250;
522 static constexpr uint8_t ConstantPtrAuthOpcode = 249;
523 static constexpr uint8_t FirstSpecialOpcode = ConstantPtrAuthOpcode;
530 unsigned BlockAddressBB = 0;
531 Type *SrcElemTy =
nullptr;
532 std::optional<ConstantRange>
InRange;
534 ExtraInfo(uint8_t Opcode, uint8_t Flags = 0,
Type *SrcElemTy =
nullptr,
535 std::optional<ConstantRange>
InRange = std::nullopt)
536 : Opcode(Opcode),
Flags(
Flags), SrcElemTy(SrcElemTy),
539 ExtraInfo(uint8_t Opcode, uint8_t Flags,
unsigned BlockAddressBB)
540 : Opcode(Opcode),
Flags(
Flags), BlockAddressBB(BlockAddressBB) {}
545 unsigned NumOperands;
546 unsigned BlockAddressBB;
548 std::optional<ConstantRange>
InRange;
551 BitcodeConstant(
Type *Ty,
const ExtraInfo &Info, ArrayRef<unsigned> OpIDs)
553 NumOperands(OpIDs.
size()), BlockAddressBB(
Info.BlockAddressBB),
558 BitcodeConstant &operator=(
const BitcodeConstant &) =
delete;
562 const ExtraInfo &Info,
563 ArrayRef<unsigned> OpIDs) {
564 void *Mem =
A.Allocate(totalSizeToAlloc<unsigned>(OpIDs.
size()),
565 alignof(BitcodeConstant));
566 return new (Mem) BitcodeConstant(Ty, Info, OpIDs);
569 static bool classof(
const Value *V) {
return V->getValueID() == SubclassID; }
571 ArrayRef<unsigned> getOperandIDs()
const {
572 return ArrayRef(getTrailingObjects(), NumOperands);
575 std::optional<ConstantRange> getInRange()
const {
576 assert(Opcode == Instruction::GetElementPtr);
585class BitcodeReader :
public BitcodeReaderBase,
public GVMaterializer {
587 Module *TheModule =
nullptr;
588 std::optional<Triple> TargetTriple;
593 bool SeenValueSymbolTable =
false;
596 std::vector<std::string> SectionTable;
597 std::vector<std::string> GCTable;
599 std::vector<Type *> TypeList;
603 DenseMap<unsigned, SmallVector<unsigned, 1>> ContainedTypeIDs;
610 DenseMap<std::pair<Type *, unsigned>,
unsigned> VirtualTypeIDs;
611 DenseMap<Function *, unsigned> FunctionTypeIDs;
616 BitcodeReaderValueList ValueList;
617 std::optional<MetadataLoader> MDLoader;
618 std::vector<Comdat *> ComdatList;
619 DenseSet<GlobalObject *> ImplicitComdatObjects;
622 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInits;
623 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInits;
625 struct FunctionOperandInfo {
627 unsigned PersonalityFn;
631 std::vector<FunctionOperandInfo> FunctionOperands;
635 std::vector<AttributeList> MAttributes;
638 std::map<unsigned, AttributeList> MAttributeGroups;
642 std::vector<BasicBlock*> FunctionBBs;
646 std::vector<Function*> FunctionsWithBodies;
650 DenseMap<Function *, Function *> UpgradedIntrinsics;
655 bool SeenFirstFunctionBody =
false;
659 DenseMap<Function*, uint64_t> DeferredFunctionInfo;
664 std::vector<uint64_t> DeferredMetadataInfo;
669 DenseMap<Function *, std::vector<BasicBlock *>> BasicBlockFwdRefs;
670 std::deque<Function *> BasicBlockFwdRefQueue;
677 std::vector<Function *> BackwardRefFunctions;
685 bool UseRelativeIDs =
false;
689 bool WillMaterializeAllForwardRefs =
false;
693 bool SeenDebugIntrinsic =
false;
694 bool SeenDebugRecord =
false;
697 TBAAVerifier TBAAVerifyHelper;
699 std::vector<std::string> BundleTags;
702 std::optional<ValueTypeCallbackTy> ValueTypeCallback;
705 std::vector<GlobalValue::GUID> GUIDList;
711 bool SkipDebugIntrinsicUpgrade =
false;
714 BitcodeReader(BitstreamCursor Stream, StringRef Strtab,
715 StringRef ProducerIdentification, LLVMContext &
Context);
717 Error materializeForwardReferencedFunctions();
719 Error materialize(GlobalValue *GV)
override;
720 Error materializeModule()
override;
721 std::vector<StructType *> getIdentifiedStructTypes()
const override;
725 Error parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
726 bool IsImporting, ParserCallbacks Callbacks = {});
731 Error materializeMetadata()
override;
733 void setStripDebugInfo()
override;
736 std::vector<StructType *> IdentifiedStructTypes;
737 StructType *createIdentifiedStructType(LLVMContext &
Context, StringRef Name);
738 StructType *createIdentifiedStructType(LLVMContext &
Context);
740 static constexpr unsigned InvalidTypeID = ~0
u;
742 Type *getTypeByID(
unsigned ID);
743 Type *getPtrElementTypeByID(
unsigned ID);
744 unsigned getContainedTypeID(
unsigned ID,
unsigned Idx = 0);
745 unsigned getVirtualTypeID(
Type *Ty, ArrayRef<unsigned> ContainedTypeIDs = {});
748 Expected<Value *> materializeValue(
unsigned ValID, BasicBlock *InsertBB);
749 Expected<Constant *> getValueForInitializer(
unsigned ID);
751 Value *getFnValueByID(
unsigned ID,
Type *Ty,
unsigned TyID,
752 BasicBlock *ConstExprInsertBB) {
758 Metadata *getFnMetadataByID(
unsigned ID) {
759 return MDLoader->getMetadataFwdRefOrLoad(ID);
762 BasicBlock *getBasicBlock(
unsigned ID)
const {
763 if (ID >= FunctionBBs.size())
return nullptr;
764 return FunctionBBs[
ID];
768 if (i-1 < MAttributes.size())
769 return MAttributes[i-1];
770 return AttributeList();
776 bool getValueTypePair(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
777 unsigned InstNum,
Value *&ResVal,
unsigned &
TypeID,
778 BasicBlock *ConstExprInsertBB) {
779 if (Slot ==
Record.size())
return true;
780 unsigned ValNo = (unsigned)Record[Slot++];
783 ValNo = InstNum - ValNo;
784 if (ValNo < InstNum) {
788 ResVal = getFnValueByID(ValNo,
nullptr,
TypeID, ConstExprInsertBB);
790 "Incorrect type ID stored for value");
791 return ResVal ==
nullptr;
793 if (Slot ==
Record.size())
796 TypeID = (unsigned)Record[Slot++];
797 ResVal = getFnValueByID(ValNo, getTypeByID(
TypeID),
TypeID,
799 return ResVal ==
nullptr;
802 bool getValueOrMetadata(
const SmallVectorImpl<uint64_t> &Record,
803 unsigned &Slot,
unsigned InstNum,
Value *&ResVal,
804 BasicBlock *ConstExprInsertBB) {
805 if (Slot ==
Record.size())
810 return getValueTypePair(Record, --Slot, InstNum, ResVal, TypeId,
813 if (Slot ==
Record.size())
815 unsigned ValNo = InstNum - (unsigned)Record[Slot++];
823 bool popValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
824 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
825 BasicBlock *ConstExprInsertBB) {
826 if (
getValue(Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
834 bool getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
835 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
836 BasicBlock *ConstExprInsertBB) {
837 ResVal =
getValue(Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
838 return ResVal ==
nullptr;
843 Value *
getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
844 unsigned InstNum,
Type *Ty,
unsigned TyID,
845 BasicBlock *ConstExprInsertBB) {
846 if (Slot ==
Record.size())
return nullptr;
847 unsigned ValNo = (unsigned)Record[Slot];
850 ValNo = InstNum - ValNo;
851 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
855 Value *getValueSigned(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
856 unsigned InstNum,
Type *Ty,
unsigned TyID,
857 BasicBlock *ConstExprInsertBB) {
858 if (Slot ==
Record.size())
return nullptr;
859 unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]);
862 ValNo = InstNum - ValNo;
863 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
866 Expected<ConstantRange> readConstantRange(ArrayRef<uint64_t> Record,
869 if (
Record.size() - OpNum < 2)
870 return error(
"Too few records for range");
872 unsigned LowerActiveWords =
Record[OpNum];
873 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
874 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
875 return error(
"Too few records for range");
878 OpNum += LowerActiveWords;
881 OpNum += UpperActiveWords;
884 int64_t
Start = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
885 int64_t
End = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
886 return ConstantRange(APInt(
BitWidth, Start,
true),
891 Expected<ConstantRange>
892 readBitWidthAndConstantRange(ArrayRef<uint64_t> Record,
unsigned &OpNum) {
893 if (
Record.size() - OpNum < 1)
894 return error(
"Too few records for range");
896 return readConstantRange(Record, OpNum,
BitWidth);
900 const Triple &getTargetTriple() {
902 BitstreamCursor TripleStream(Stream.getBitcodeBytes());
903 if (Expected<std::string> TripleStr =
readTriple(TripleStream))
904 TargetTriple.emplace(std::move(*TripleStr));
907 TargetTriple.emplace();
910 return *TargetTriple;
916 Error propagateAttributeTypes(CallBase *CB, ArrayRef<unsigned> ArgsTys);
922 Error parseAttrKind(
uint64_t Code, Attribute::AttrKind *Kind);
924 ParserCallbacks Callbacks = {});
926 Error parseComdatRecord(ArrayRef<uint64_t> Record);
927 Error parseGlobalVarRecord(ArrayRef<uint64_t> Record);
928 Error parseFunctionRecord(ArrayRef<uint64_t> Record);
929 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
930 ArrayRef<uint64_t> Record);
932 Error parseAttributeBlock();
933 Error parseAttributeGroupBlock();
934 Error parseTypeTable();
935 Error parseTypeTableBody();
936 Error parseOperandBundleTags();
937 Error parseSyncScopeNames();
939 Expected<Value *> recordValue(SmallVectorImpl<uint64_t> &Record,
940 unsigned NameIndex, Triple &TT);
941 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
Function *
F,
942 ArrayRef<uint64_t> Record);
944 Error parseGlobalValueSymbolTable();
945 Error parseConstants();
946 Error rememberAndSkipFunctionBodies();
947 Error rememberAndSkipFunctionBody();
949 Error rememberAndSkipMetadata();
952 Error globalCleanup();
953 Error resolveGlobalAndIndirectSymbolInits();
954 Error parseUseLists();
955 Error findFunctionInStream(
957 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator);
964class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
966 ModuleSummaryIndex &TheIndex;
970 bool SeenGlobalValSummary =
false;
973 bool SeenValueSymbolTable =
false;
987 DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
988 ValueIdToValueInfoMap;
994 DenseMap<uint64_t, StringRef> ModuleIdMap;
997 std::string SourceFileName;
1001 StringRef ModulePath;
1005 std::function<bool(StringRef)> IsPrevailing =
nullptr;
1008 std::function<void(ValueInfo)> OnValueInfo =
nullptr;
1012 std::vector<uint64_t> StackIds;
1016 std::vector<uint64_t> RadixArray;
1021 std::vector<unsigned> StackIdToIndex;
1024 std::vector<uint64_t> DefinedGUIDs;
1027 ModuleSummaryIndexBitcodeReader(
1028 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
1029 StringRef ModulePath,
1030 std::function<
bool(StringRef)> IsPrevailing =
nullptr,
1031 std::function<
void(ValueInfo)> OnValueInfo =
nullptr);
1038 StringRef SourceFileName);
1039 Error parseValueSymbolTable(
1041 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
1044 makeCallList(ArrayRef<uint64_t> Record,
bool IsOldProfileFormat,
1045 bool HasProfile,
bool HasRelBF);
1046 Error parseEntireSummary(
unsigned ID);
1047 Error parseModuleStringTable();
1048 void parseTypeIdCompatibleVtableSummaryRecord(ArrayRef<uint64_t> Record);
1049 void parseTypeIdCompatibleVtableInfo(ArrayRef<uint64_t> Record,
size_t &Slot,
1051 std::vector<FunctionSummary::ParamAccess>
1052 parseParamAccesses(ArrayRef<uint64_t> Record);
1053 SmallVector<unsigned> parseAllocInfoContext(ArrayRef<uint64_t> Record,
1057 static constexpr unsigned UninitializedStackIdIndex =
1058 std::numeric_limits<unsigned>::max();
1060 unsigned getStackIdIndex(
unsigned LocalIndex) {
1061 unsigned &
Index = StackIdToIndex[LocalIndex];
1064 if (Index == UninitializedStackIdIndex)
1069 template <
bool AllowNullValueInfo = false>
1070 std::pair<ValueInfo, GlobalValue::GUID>
1071 getValueInfoFromValueId(
unsigned ValueId);
1073 void addThisModule();
1089 return std::error_code();
1095 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1096 ValueList(this->Stream.SizeInBytes(),
1098 return materializeValue(
ValID, InsertBB);
1100 this->ProducerIdentification = std::string(ProducerIdentification);
1103Error BitcodeReader::materializeForwardReferencedFunctions() {
1104 if (WillMaterializeAllForwardRefs)
1108 WillMaterializeAllForwardRefs =
true;
1110 while (!BasicBlockFwdRefQueue.empty()) {
1111 Function *
F = BasicBlockFwdRefQueue.front();
1112 BasicBlockFwdRefQueue.pop_front();
1113 assert(
F &&
"Expected valid function");
1114 if (!BasicBlockFwdRefs.
count(
F))
1122 if (!
F->isMaterializable())
1123 return error(
"Never resolved function from blockaddress");
1126 if (
Error Err = materialize(
F))
1129 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1131 for (
Function *
F : BackwardRefFunctions)
1132 if (
Error Err = materialize(
F))
1134 BackwardRefFunctions.clear();
1137 WillMaterializeAllForwardRefs =
false;
1202 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1203 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1204 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1205 Flags.NoInline = (RawFlags >> 4) & 0x1;
1206 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1207 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1208 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1209 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1210 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1226 bool NoRenameOnPromotion = ((RawFlags >> 11) & 1);
1227 RawFlags = RawFlags >> 4;
1228 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1232 bool Live = (RawFlags & 0x2) || Version < 3;
1233 bool Local = (RawFlags & 0x4);
1234 bool AutoHide = (RawFlags & 0x8);
1237 Live,
Local, AutoHide, IK,
1238 NoRenameOnPromotion);
1244 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1245 (RawFlags & 0x4) ?
true :
false,
1252 bool HasTailCall = (RawFlags & 0x8);
1253 bool HasIndirectCall = (RawFlags & 0x10);
1254 return CalleeInfo(Hotness, HasTailCall, HasIndirectCall);
1259 bool &HasTailCall) {
1260 static constexpr unsigned RelBlockFreqBits = 28;
1261 static constexpr uint64_t RelBlockFreqMask = (1 << RelBlockFreqBits) - 1;
1262 RelBF = RawFlags & RelBlockFreqMask;
1263 HasTailCall = (RawFlags & (1 << RelBlockFreqBits));
1288 case 0:
return false;
1289 case 1:
return true;
1351 bool IsFP = Ty->isFPOrFPVectorTy();
1353 if (!IsFP && !Ty->isIntOrIntVectorTy())
1360 return IsFP ? Instruction::FNeg : -1;
1365 bool IsFP = Ty->isFPOrFPVectorTy();
1367 if (!IsFP && !Ty->isIntOrIntVectorTy())
1374 return IsFP ? Instruction::FAdd : Instruction::Add;
1376 return IsFP ? Instruction::FSub : Instruction::Sub;
1378 return IsFP ? Instruction::FMul : Instruction::Mul;
1380 return IsFP ? -1 : Instruction::UDiv;
1382 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1384 return IsFP ? -1 : Instruction::URem;
1386 return IsFP ? Instruction::FRem : Instruction::SRem;
1388 return IsFP ? -1 : Instruction::Shl;
1390 return IsFP ? -1 : Instruction::LShr;
1392 return IsFP ? -1 : Instruction::AShr;
1394 return IsFP ? -1 : Instruction::And;
1396 return IsFP ? -1 : Instruction::Or;
1398 return IsFP ? -1 : Instruction::Xor;
1403 bool &IsElementwise) {
1501Type *BitcodeReader::getTypeByID(
unsigned ID) {
1503 if (ID >= TypeList.size())
1506 if (
Type *Ty = TypeList[ID])
1511 return TypeList[
ID] = createIdentifiedStructType(
Context);
1514unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1515 auto It = ContainedTypeIDs.
find(ID);
1516 if (It == ContainedTypeIDs.
end())
1517 return InvalidTypeID;
1519 if (Idx >= It->second.size())
1520 return InvalidTypeID;
1522 return It->second[
Idx];
1525Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1526 if (ID >= TypeList.size())
1533 return getTypeByID(getContainedTypeID(ID, 0));
1536unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1537 ArrayRef<unsigned> ChildTypeIDs) {
1538 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1539 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1540 auto It = VirtualTypeIDs.
find(CacheKey);
1541 if (It != VirtualTypeIDs.
end()) {
1547 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1548 "Incorrect cached contained type IDs");
1552 unsigned TypeID = TypeList.size();
1553 TypeList.push_back(Ty);
1554 if (!ChildTypeIDs.
empty())
1575 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1589 if (Opcode == Instruction::GetElementPtr)
1593 case Instruction::FNeg:
1594 case Instruction::Select:
1595 case Instruction::ICmp:
1596 case Instruction::FCmp:
1603Expected<Value *> BitcodeReader::materializeValue(
unsigned StartValID,
1604 BasicBlock *InsertBB) {
1606 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1608 return ValueList[StartValID];
1610 SmallDenseMap<unsigned, Value *> MaterializedValues;
1611 SmallVector<unsigned> Worklist;
1613 while (!Worklist.
empty()) {
1614 unsigned ValID = Worklist.
back();
1615 if (MaterializedValues.
count(ValID)) {
1621 if (ValID >= ValueList.
size() || !ValueList[ValID])
1622 return error(
"Invalid value ID");
1624 Value *
V = ValueList[ValID];
1627 MaterializedValues.
insert({ValID,
V});
1635 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1636 auto It = MaterializedValues.
find(OpID);
1637 if (It != MaterializedValues.
end())
1638 Ops.push_back(It->second);
1645 if (
Ops.size() != BC->getOperandIDs().size())
1647 std::reverse(
Ops.begin(),
Ops.end());
1664 switch (BC->Opcode) {
1665 case BitcodeConstant::ConstantPtrAuthOpcode: {
1668 return error(
"ptrauth key operand must be ConstantInt");
1672 return error(
"ptrauth disc operand must be ConstantInt");
1675 ConstOps.
size() > 4 ? ConstOps[4]
1680 "ptrauth deactivation symbol operand must be a pointer");
1683 DeactivationSymbol);
1686 case BitcodeConstant::NoCFIOpcode: {
1689 return error(
"no_cfi operand must be GlobalValue");
1693 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1696 return error(
"dso_local operand must be GlobalValue");
1700 case BitcodeConstant::BlockAddressOpcode: {
1703 return error(
"blockaddress operand must be a function");
1708 unsigned BBID = BC->BlockAddressBB;
1711 return error(
"Invalid ID");
1714 for (
size_t I = 0,
E = BBID;
I !=
E; ++
I) {
1716 return error(
"Invalid ID");
1723 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1725 BasicBlockFwdRefQueue.push_back(Fn);
1726 if (FwdBBs.size() < BBID + 1)
1727 FwdBBs.resize(BBID + 1);
1735 case BitcodeConstant::ConstantStructOpcode: {
1737 if (
ST->getNumElements() != ConstOps.
size())
1738 return error(
"Invalid number of elements in struct initializer");
1740 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1741 if (
Op->getType() != Ty)
1742 return error(
"Incorrect type in struct initializer");
1747 case BitcodeConstant::ConstantArrayOpcode: {
1749 if (AT->getNumElements() != ConstOps.
size())
1750 return error(
"Invalid number of elements in array initializer");
1752 for (Constant *
Op : ConstOps)
1753 if (
Op->getType() != AT->getElementType())
1754 return error(
"Incorrect type in array initializer");
1759 case BitcodeConstant::ConstantVectorOpcode: {
1761 if (VT->getNumElements() != ConstOps.size())
1762 return error(
"Invalid number of elements in vector initializer");
1764 for (Constant *
Op : ConstOps)
1765 if (
Op->getType() != VT->getElementType())
1766 return error(
"Incorrect type in vector initializer");
1771 case Instruction::GetElementPtr:
1774 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1778 case Instruction::ExtractElement:
1781 case Instruction::InsertElement:
1785 case Instruction::ShuffleVector: {
1786 SmallVector<int, 16>
Mask;
1798 MaterializedValues.
insert({ValID,
C});
1804 return error(Twine(
"Value referenced by initializer is an unsupported "
1805 "constant expression of type ") +
1806 BC->getOpcodeName());
1812 BC->getType(),
"constexpr", InsertBB);
1815 "constexpr", InsertBB);
1818 Ops[1],
"constexpr", InsertBB);
1821 I->setHasNoSignedWrap();
1823 I->setHasNoUnsignedWrap();
1829 switch (BC->Opcode) {
1830 case BitcodeConstant::ConstantVectorOpcode: {
1831 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1834 Value *
Idx = ConstantInt::get(IdxTy, Pair.index());
1841 case BitcodeConstant::ConstantStructOpcode:
1842 case BitcodeConstant::ConstantArrayOpcode: {
1846 "constexpr.ins", InsertBB);
1850 case Instruction::ICmp:
1851 case Instruction::FCmp:
1854 "constexpr", InsertBB);
1856 case Instruction::GetElementPtr:
1862 case Instruction::Select:
1865 case Instruction::ExtractElement:
1868 case Instruction::InsertElement:
1872 case Instruction::ShuffleVector:
1873 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1881 MaterializedValues.
insert({ValID,
I});
1885 return MaterializedValues[StartValID];
1888Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1889 Expected<Value *> MaybeV = materializeValue(ID,
nullptr);
1897StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1900 IdentifiedStructTypes.push_back(Ret);
1904StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1906 IdentifiedStructTypes.push_back(Ret);
1922 case Attribute::ZExt:
return 1 << 0;
1923 case Attribute::SExt:
return 1 << 1;
1924 case Attribute::NoReturn:
return 1 << 2;
1925 case Attribute::InReg:
return 1 << 3;
1926 case Attribute::StructRet:
return 1 << 4;
1927 case Attribute::NoUnwind:
return 1 << 5;
1928 case Attribute::NoAlias:
return 1 << 6;
1929 case Attribute::ByVal:
return 1 << 7;
1930 case Attribute::Nest:
return 1 << 8;
1931 case Attribute::ReadNone:
return 1 << 9;
1932 case Attribute::ReadOnly:
return 1 << 10;
1933 case Attribute::NoInline:
return 1 << 11;
1934 case Attribute::AlwaysInline:
return 1 << 12;
1935 case Attribute::OptimizeForSize:
return 1 << 13;
1936 case Attribute::StackProtect:
return 1 << 14;
1937 case Attribute::StackProtectReq:
return 1 << 15;
1938 case Attribute::Alignment:
return 31 << 16;
1940 case Attribute::NoRedZone:
return 1 << 22;
1941 case Attribute::NoImplicitFloat:
return 1 << 23;
1942 case Attribute::Naked:
return 1 << 24;
1943 case Attribute::InlineHint:
return 1 << 25;
1944 case Attribute::StackAlignment:
return 7 << 26;
1945 case Attribute::ReturnsTwice:
return 1 << 29;
1946 case Attribute::UWTable:
return 1 << 30;
1947 case Attribute::NonLazyBind:
return 1U << 31;
1948 case Attribute::SanitizeAddress:
return 1ULL << 32;
1949 case Attribute::MinSize:
return 1ULL << 33;
1950 case Attribute::NoDuplicate:
return 1ULL << 34;
1951 case Attribute::StackProtectStrong:
return 1ULL << 35;
1952 case Attribute::SanitizeThread:
return 1ULL << 36;
1953 case Attribute::SanitizeMemory:
return 1ULL << 37;
1954 case Attribute::NoBuiltin:
return 1ULL << 38;
1955 case Attribute::Returned:
return 1ULL << 39;
1956 case Attribute::Cold:
return 1ULL << 40;
1957 case Attribute::Builtin:
return 1ULL << 41;
1958 case Attribute::OptimizeNone:
return 1ULL << 42;
1959 case Attribute::InAlloca:
return 1ULL << 43;
1960 case Attribute::NonNull:
return 1ULL << 44;
1961 case Attribute::JumpTable:
return 1ULL << 45;
1962 case Attribute::Convergent:
return 1ULL << 46;
1963 case Attribute::SafeStack:
return 1ULL << 47;
1964 case Attribute::NoRecurse:
return 1ULL << 48;
1967 case Attribute::SwiftSelf:
return 1ULL << 51;
1968 case Attribute::SwiftError:
return 1ULL << 52;
1969 case Attribute::WriteOnly:
return 1ULL << 53;
1970 case Attribute::Speculatable:
return 1ULL << 54;
1971 case Attribute::StrictFP:
return 1ULL << 55;
1972 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1973 case Attribute::NoCfCheck:
return 1ULL << 57;
1974 case Attribute::OptForFuzzing:
return 1ULL << 58;
1975 case Attribute::ShadowCallStack:
return 1ULL << 59;
1976 case Attribute::SpeculativeLoadHardening:
1978 case Attribute::ImmArg:
1980 case Attribute::WillReturn:
1982 case Attribute::NoFree:
1998 if (
I == Attribute::Alignment)
1999 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
2000 else if (
I == Attribute::StackAlignment)
2001 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
2003 B.addTypeAttr(
I,
nullptr);
2017 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
2019 "Alignment must be a power of two.");
2022 B.addAlignmentAttr(Alignment);
2024 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
2025 (EncodedAttrs & 0xffff);
2027 if (AttrIdx == AttributeList::FunctionIndex) {
2030 if (Attrs & (1ULL << 9)) {
2032 Attrs &= ~(1ULL << 9);
2035 if (Attrs & (1ULL << 10)) {
2037 Attrs &= ~(1ULL << 10);
2040 if (Attrs & (1ULL << 49)) {
2042 Attrs &= ~(1ULL << 49);
2045 if (Attrs & (1ULL << 50)) {
2047 Attrs &= ~(1ULL << 50);
2050 if (Attrs & (1ULL << 53)) {
2052 Attrs &= ~(1ULL << 53);
2056 B.addMemoryAttr(ME);
2060 if (Attrs & (1ULL << 21)) {
2061 Attrs &= ~(1ULL << 21);
2068Error BitcodeReader::parseAttributeBlock() {
2072 if (!MAttributes.empty())
2073 return error(
"Invalid multiple blocks");
2075 SmallVector<uint64_t, 64>
Record;
2084 BitstreamEntry
Entry = MaybeEntry.
get();
2086 switch (
Entry.Kind) {
2089 return error(
"Malformed block");
2102 switch (MaybeRecord.
get()) {
2108 return error(
"Invalid parameter attribute record");
2110 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2116 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2121 Attrs.push_back(MAttributeGroups[Val]);
2123 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2136 return Attribute::Alignment;
2138 return Attribute::AlwaysInline;
2140 return Attribute::Builtin;
2142 return Attribute::ByVal;
2144 return Attribute::InAlloca;
2146 return Attribute::Cold;
2148 return Attribute::Convergent;
2150 return Attribute::DisableSanitizerInstrumentation;
2152 return Attribute::ElementType;
2154 return Attribute::FnRetThunkExtern;
2156 return Attribute::Flatten;
2158 return Attribute::HybridPatchable;
2160 return Attribute::InlineHint;
2162 return Attribute::InReg;
2164 return Attribute::JumpTable;
2166 return Attribute::Memory;
2168 return Attribute::NoFPClass;
2170 return Attribute::MinSize;
2172 return Attribute::Naked;
2174 return Attribute::Nest;
2176 return Attribute::NoAlias;
2178 return Attribute::NoBuiltin;
2180 return Attribute::NoCallback;
2182 return Attribute::NoDivergenceSource;
2184 return Attribute::NoDuplicate;
2186 return Attribute::NoFree;
2188 return Attribute::NoFreeObj;
2190 return Attribute::NoImplicitFloat;
2192 return Attribute::NoInline;
2194 return Attribute::NoRecurse;
2196 return Attribute::NoMerge;
2198 return Attribute::NonLazyBind;
2200 return Attribute::NonNull;
2202 return Attribute::Dereferenceable;
2204 return Attribute::DereferenceableOrNull;
2206 return Attribute::AllocAlign;
2208 return Attribute::AllocKind;
2210 return Attribute::AllocSize;
2212 return Attribute::AllocatedPointer;
2214 return Attribute::NoRedZone;
2216 return Attribute::NoReturn;
2218 return Attribute::NoSync;
2220 return Attribute::NoCfCheck;
2222 return Attribute::NoProfile;
2224 return Attribute::SkipProfile;
2226 return Attribute::NoUnwind;
2228 return Attribute::NoSanitizeBounds;
2230 return Attribute::NoSanitizeCoverage;
2232 return Attribute::NullPointerIsValid;
2234 return Attribute::OptimizeForDebugging;
2236 return Attribute::OptForFuzzing;
2238 return Attribute::OptimizeForSize;
2240 return Attribute::OptimizeNone;
2242 return Attribute::ReadNone;
2244 return Attribute::ReadOnly;
2246 return Attribute::Returned;
2248 return Attribute::ReturnsTwice;
2250 return Attribute::SExt;
2252 return Attribute::Speculatable;
2254 return Attribute::StackAlignment;
2256 return Attribute::StackProtect;
2258 return Attribute::StackProtectReq;
2260 return Attribute::StackProtectStrong;
2262 return Attribute::SafeStack;
2264 return Attribute::ShadowCallStack;
2266 return Attribute::StrictFP;
2268 return Attribute::StructRet;
2270 return Attribute::SanitizeAddress;
2272 return Attribute::SanitizeHWAddress;
2274 return Attribute::SanitizeThread;
2276 return Attribute::SanitizeConcurrency;
2278 return Attribute::SanitizeType;
2280 return Attribute::SanitizeMemory;
2282 return Attribute::SanitizeNumericalStability;
2284 return Attribute::SanitizeRealtime;
2286 return Attribute::SanitizeRealtimeBlocking;
2288 return Attribute::SanitizeAllocToken;
2290 return Attribute::SpeculativeLoadHardening;
2292 return Attribute::SwiftError;
2294 return Attribute::SwiftSelf;
2296 return Attribute::SwiftAsync;
2298 return Attribute::UWTable;
2300 return Attribute::VScaleRange;
2302 return Attribute::WillReturn;
2304 return Attribute::WriteOnly;
2306 return Attribute::ZExt;
2308 return Attribute::ImmArg;
2310 return Attribute::SanitizeMemTag;
2312 return Attribute::Preallocated;
2314 return Attribute::NoUndef;
2316 return Attribute::ByRef;
2318 return Attribute::MustProgress;
2320 return Attribute::Hot;
2322 return Attribute::PresplitCoroutine;
2324 return Attribute::Writable;
2326 return Attribute::CoroDestroyOnlyWhenComplete;
2328 return Attribute::DeadOnUnwind;
2330 return Attribute::Range;
2332 return Attribute::Initializes;
2334 return Attribute::CoroElideSafe;
2336 return Attribute::NoExt;
2338 return Attribute::Captures;
2340 return Attribute::DeadOnReturn;
2342 return Attribute::NoCreateUndefOrPoison;
2344 return Attribute::DenormalFPEnv;
2346 return Attribute::NoOutline;
2348 return Attribute::NoIPA;
2353 MaybeAlign &Alignment) {
2356 if (
Exponent > Value::MaxAlignmentExponent + 1)
2357 return error(
"Invalid alignment value");
2362Error BitcodeReader::parseAttrKind(
uint64_t Code, Attribute::AttrKind *Kind) {
2364 if (*Kind == Attribute::None)
2365 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2370 switch (EncodedKind) {
2394Error BitcodeReader::parseAttributeGroupBlock() {
2398 if (!MAttributeGroups.empty())
2399 return error(
"Invalid multiple blocks");
2401 SmallVector<uint64_t, 64>
Record;
2408 BitstreamEntry
Entry = MaybeEntry.
get();
2410 switch (
Entry.Kind) {
2413 return error(
"Malformed block");
2426 switch (MaybeRecord.
get()) {
2431 return error(
"Invalid grp record");
2438 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2439 if (Record[i] == 0) {
2440 Attribute::AttrKind
Kind;
2442 if (Idx == AttributeList::FunctionIndex &&
2451 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2457 if (Kind == Attribute::ByVal)
2458 B.addByValAttr(
nullptr);
2459 else if (Kind == Attribute::StructRet)
2460 B.addStructRetAttr(
nullptr);
2461 else if (Kind == Attribute::InAlloca)
2462 B.addInAllocaAttr(
nullptr);
2463 else if (Kind == Attribute::UWTable)
2464 B.addUWTableAttr(UWTableKind::Default);
2465 else if (Kind == Attribute::DeadOnReturn)
2466 B.addDeadOnReturnAttr(DeadOnReturnInfo());
2467 else if (Attribute::isEnumAttrKind(Kind))
2468 B.addAttribute(Kind);
2470 return error(
"Not an enum attribute");
2471 }
else if (Record[i] == 1) {
2472 Attribute::AttrKind
Kind;
2473 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2475 if (!Attribute::isIntAttrKind(Kind))
2476 return error(
"Not an int attribute");
2477 if (Kind == Attribute::Alignment)
2478 B.addAlignmentAttr(Record[++i]);
2479 else if (Kind == Attribute::StackAlignment)
2480 B.addStackAlignmentAttr(Record[++i]);
2481 else if (Kind == Attribute::Dereferenceable)
2482 B.addDereferenceableAttr(Record[++i]);
2483 else if (Kind == Attribute::DereferenceableOrNull)
2484 B.addDereferenceableOrNullAttr(Record[++i]);
2485 else if (Kind == Attribute::DeadOnReturn)
2486 B.addDeadOnReturnAttr(
2488 else if (Kind == Attribute::AllocSize)
2489 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2490 else if (Kind == Attribute::VScaleRange)
2491 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2492 else if (Kind == Attribute::UWTable)
2494 else if (Kind == Attribute::AllocKind)
2495 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2496 else if (Kind == Attribute::Memory) {
2498 const uint8_t
Version = (EncodedME >> 56);
2512 if (getTargetTriple().isAArch64())
2517 B.addMemoryAttr(ME);
2522 EncodedME & 0x00FFFFFFFFFFFFFFULL);
2525 if (
Version == 1 && getTargetTriple().isAArch64())
2527 IRMemLocation::TargetMem0,
2528 ME.
getModRef(IRMemLocation::InaccessibleMem)) |
2530 IRMemLocation::TargetMem1,
2531 ME.
getModRef(IRMemLocation::InaccessibleMem));
2532 B.addMemoryAttr(ME);
2534 }
else if (Kind == Attribute::Captures)
2536 else if (Kind == Attribute::NoFPClass)
2539 else if (Kind == Attribute::DenormalFPEnv) {
2540 B.addDenormalFPEnvAttr(
2543 }
else if (Record[i] == 3 || Record[i] == 4) {
2545 SmallString<64> KindStr;
2546 SmallString<64> ValStr;
2548 while (Record[i] != 0 && i != e)
2550 assert(Record[i] == 0 &&
"Kind string not null terminated");
2555 while (Record[i] != 0 && i != e)
2557 assert(Record[i] == 0 &&
"Value string not null terminated");
2560 B.addAttribute(KindStr.
str(), ValStr.
str());
2561 }
else if (Record[i] == 5 || Record[i] == 6) {
2562 bool HasType =
Record[i] == 6;
2563 Attribute::AttrKind
Kind;
2564 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2566 if (!Attribute::isTypeAttrKind(Kind))
2567 return error(
"Not a type attribute");
2569 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2570 }
else if (Record[i] == 7) {
2571 Attribute::AttrKind
Kind;
2574 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2576 if (!Attribute::isConstantRangeAttrKind(Kind))
2577 return error(
"Not a ConstantRange attribute");
2579 Expected<ConstantRange> MaybeCR =
2580 readBitWidthAndConstantRange(Record, i);
2585 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2586 }
else if (Record[i] == 8) {
2587 Attribute::AttrKind
Kind;
2590 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2592 if (!Attribute::isConstantRangeListAttrKind(Kind))
2593 return error(
"Not a constant range list attribute");
2597 return error(
"Too few records for constant range list");
2598 unsigned RangeSize =
Record[i++];
2600 for (
unsigned Idx = 0;
Idx < RangeSize; ++
Idx) {
2601 Expected<ConstantRange> MaybeCR =
2602 readConstantRange(Record, i,
BitWidth);
2610 return error(
"Invalid (unordered or overlapping) range list");
2611 B.addConstantRangeListAttr(Kind, Val);
2613 return error(
"Invalid attribute group entry");
2618 B.addMemoryAttr(ME);
2621 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2628Error BitcodeReader::parseTypeTable() {
2632 return parseTypeTableBody();
2635Error BitcodeReader::parseTypeTableBody() {
2636 if (!TypeList.empty())
2637 return error(
"Invalid multiple blocks");
2639 SmallVector<uint64_t, 64>
Record;
2640 unsigned NumRecords = 0;
2649 BitstreamEntry
Entry = MaybeEntry.
get();
2651 switch (
Entry.Kind) {
2654 return error(
"Malformed block");
2656 if (NumRecords != TypeList.size())
2657 return error(
"Malformed block");
2666 Type *ResultTy =
nullptr;
2667 SmallVector<unsigned> ContainedIDs;
2671 switch (MaybeRecord.
get()) {
2673 return error(
"Invalid value");
2678 return error(
"Invalid numentry record");
2679 TypeList.resize(Record[0]);
2682 ResultTy = Type::getVoidTy(
Context);
2685 ResultTy = Type::getHalfTy(
Context);
2688 ResultTy = Type::getBFloatTy(
Context);
2691 ResultTy = Type::getFloatTy(
Context);
2694 ResultTy = Type::getDoubleTy(
Context);
2697 ResultTy = Type::getX86_FP80Ty(
Context);
2700 ResultTy = Type::getFP128Ty(
Context);
2703 ResultTy = Type::getPPC_FP128Ty(
Context);
2706 ResultTy = Type::getLabelTy(
Context);
2709 ResultTy = Type::getMetadataTy(
Context);
2717 ResultTy = Type::getX86_AMXTy(
Context);
2720 ResultTy = Type::getTokenTy(
Context);
2724 return error(
"Invalid record");
2729 return error(
"Bitwidth for byte type out of range");
2735 return error(
"Invalid integer record");
2740 return error(
"Bitwidth for integer type out of range");
2747 return error(
"Invalid pointer record");
2751 ResultTy = getTypeByID(Record[0]);
2753 !PointerType::isValidElementType(ResultTy))
2754 return error(
"Invalid type");
2761 return error(
"Invalid opaque pointer record");
2770 return error(
"Invalid function record");
2772 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2773 if (
Type *
T = getTypeByID(Record[i]))
2779 ResultTy = getTypeByID(Record[2]);
2780 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2781 return error(
"Invalid type");
2784 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2790 return error(
"Invalid function record");
2792 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2793 if (
Type *
T = getTypeByID(Record[i])) {
2794 if (!FunctionType::isValidArgumentType(
T))
2795 return error(
"Invalid function argument type");
2802 ResultTy = getTypeByID(Record[1]);
2803 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2804 return error(
"Invalid type");
2807 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2812 return error(
"Invalid anon struct record");
2814 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2815 if (
Type *
T = getTypeByID(Record[i]))
2821 return error(
"Invalid type");
2828 return error(
"Invalid struct name record");
2833 return error(
"Invalid named struct record");
2835 if (NumRecords >= TypeList.size())
2836 return error(
"Invalid TYPE table");
2842 TypeList[NumRecords] =
nullptr;
2844 Res = createIdentifiedStructType(
Context, TypeName);
2848 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2849 if (
Type *
T = getTypeByID(Record[i]))
2855 return error(
"Invalid named struct record");
2864 return error(
"Invalid opaque type record");
2866 if (NumRecords >= TypeList.size())
2867 return error(
"Invalid TYPE table");
2873 TypeList[NumRecords] =
nullptr;
2875 Res = createIdentifiedStructType(
Context, TypeName);
2882 return error(
"Invalid target extension type record");
2884 if (NumRecords >= TypeList.size())
2885 return error(
"Invalid TYPE table");
2887 if (Record[0] >=
Record.size())
2888 return error(
"Too many type parameters");
2890 unsigned NumTys =
Record[0];
2892 SmallVector<unsigned, 8> IntParams;
2893 for (
unsigned i = 0; i < NumTys; i++) {
2894 if (
Type *
T = getTypeByID(Record[i + 1]))
2897 return error(
"Invalid type");
2900 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2901 if (Record[i] > UINT_MAX)
2902 return error(
"Integer parameter too large");
2907 if (
auto E = TTy.takeError())
2915 return error(
"Invalid array type record");
2916 ResultTy = getTypeByID(Record[1]);
2917 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2918 return error(
"Invalid type");
2920 ResultTy = ArrayType::get(ResultTy, Record[0]);
2925 return error(
"Invalid vector type record");
2927 return error(
"Invalid vector length");
2928 ResultTy = getTypeByID(Record[1]);
2929 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2930 return error(
"Invalid type");
2933 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2937 if (NumRecords >= TypeList.size())
2938 return error(
"Invalid TYPE table");
2939 if (TypeList[NumRecords])
2941 "Invalid TYPE table: Only named structs can be forward referenced");
2942 assert(ResultTy &&
"Didn't read a type?");
2943 TypeList[NumRecords] = ResultTy;
2944 if (!ContainedIDs.
empty())
2945 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2950Error BitcodeReader::parseOperandBundleTags() {
2954 if (!BundleTags.empty())
2955 return error(
"Invalid multiple blocks");
2957 SmallVector<uint64_t, 64>
Record;
2963 BitstreamEntry
Entry = MaybeEntry.
get();
2965 switch (
Entry.Kind) {
2968 return error(
"Malformed block");
2982 return error(
"Invalid operand bundle record");
2985 BundleTags.emplace_back();
2987 return error(
"Invalid operand bundle record");
2992Error BitcodeReader::parseSyncScopeNames() {
2997 return error(
"Invalid multiple synchronization scope names blocks");
2999 SmallVector<uint64_t, 64>
Record;
3004 BitstreamEntry
Entry = MaybeEntry.
get();
3006 switch (
Entry.Kind) {
3009 return error(
"Malformed block");
3012 return error(
"Invalid empty synchronization scope names block");
3026 return error(
"Invalid sync scope record");
3028 SmallString<16> SSN;
3030 return error(
"Invalid sync scope record");
3038Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
3039 unsigned NameIndex, Triple &TT) {
3042 return error(
"Invalid record");
3043 unsigned ValueID =
Record[0];
3044 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3045 return error(
"Invalid record");
3046 Value *
V = ValueList[ValueID];
3049 if (NameStr.contains(0))
3050 return error(
"Invalid value name");
3051 V->setName(NameStr);
3053 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
3066 return std::move(JumpFailed);
3072 return error(
"Expected value symbol table subblock");
3076void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
3078 ArrayRef<uint64_t> Record) {
3083 uint64_t FuncBitOffset = FuncWordOffset * 32;
3084 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
3088 if (FuncBitOffset > LastFunctionBlockBit)
3089 LastFunctionBlockBit = FuncBitOffset;
3093Error BitcodeReader::parseGlobalValueSymbolTable() {
3094 unsigned FuncBitcodeOffsetDelta =
3100 SmallVector<uint64_t, 64>
Record;
3105 BitstreamEntry
Entry = MaybeEntry.
get();
3107 switch (
Entry.Kind) {
3110 return error(
"Malformed block");
3121 switch (MaybeRecord.
get()) {
3123 unsigned ValueID =
Record[0];
3124 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3125 return error(
"Invalid value reference in symbol table");
3126 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3143 if (!MaybeCurrentBit)
3145 CurrentBit = MaybeCurrentBit.
get();
3148 if (
Error Err = parseGlobalValueSymbolTable())
3169 unsigned FuncBitcodeOffsetDelta =
3175 SmallVector<uint64_t, 64>
Record;
3186 BitstreamEntry
Entry = MaybeEntry.
get();
3188 switch (
Entry.Kind) {
3191 return error(
"Malformed block");
3207 switch (MaybeRecord.
get()) {
3211 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3219 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3227 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3232 return error(
"Invalid bbentry record");
3235 return error(
"Invalid bbentry record");
3257Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3258 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3259 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3260 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3262 GlobalInitWorklist.swap(GlobalInits);
3263 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3264 FunctionOperandWorklist.swap(FunctionOperands);
3266 while (!GlobalInitWorklist.empty()) {
3267 unsigned ValID = GlobalInitWorklist.back().second;
3268 if (ValID >= ValueList.
size()) {
3270 GlobalInits.push_back(GlobalInitWorklist.back());
3272 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3275 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3277 GlobalInitWorklist.pop_back();
3280 while (!IndirectSymbolInitWorklist.empty()) {
3281 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3282 if (ValID >= ValueList.
size()) {
3283 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3285 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3289 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3292 return error(
"Alias and aliasee types don't match");
3297 return error(
"Expected an alias or an ifunc");
3300 IndirectSymbolInitWorklist.pop_back();
3303 while (!FunctionOperandWorklist.empty()) {
3304 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3305 if (
Info.PersonalityFn) {
3306 unsigned ValID =
Info.PersonalityFn - 1;
3307 if (ValID < ValueList.
size()) {
3308 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3311 Info.F->setPersonalityFn(MaybeC.
get());
3312 Info.PersonalityFn = 0;
3316 unsigned ValID =
Info.Prefix - 1;
3317 if (ValID < ValueList.
size()) {
3318 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3321 Info.F->setPrefixData(MaybeC.
get());
3325 if (
Info.Prologue) {
3326 unsigned ValID =
Info.Prologue - 1;
3327 if (ValID < ValueList.
size()) {
3328 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3331 Info.F->setPrologueData(MaybeC.
get());
3335 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3336 FunctionOperands.push_back(Info);
3337 FunctionOperandWorklist.pop_back();
3346 BitcodeReader::decodeSignRotatedValue);
3348 return APInt(TypeBits, Words);
3351Error BitcodeReader::parseConstants() {
3359 unsigned Int32TyID = getVirtualTypeID(CurTy);
3360 unsigned CurTyID = Int32TyID;
3361 Type *CurElemTy =
nullptr;
3362 unsigned NextCstNo = ValueList.
size();
3370 switch (Entry.Kind) {
3373 return error(
"Malformed block");
3375 if (NextCstNo != ValueList.
size())
3376 return error(
"Invalid constant reference");
3387 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
3390 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3400 return error(
"Invalid settype record");
3401 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3402 return error(
"Invalid settype record");
3403 if (TypeList[Record[0]] == VoidType)
3404 return error(
"Invalid constant type");
3406 CurTy = TypeList[CurTyID];
3407 CurElemTy = getPtrElementTypeByID(CurTyID);
3411 return error(
"Invalid type for a constant null value");
3414 return error(
"Invalid type for a constant null value");
3419 return error(
"Invalid integer const record");
3424 return error(
"Invalid wide integer const record");
3427 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3428 V = ConstantInt::get(CurTy, VInt);
3433 return error(
"Invalid byte const record");
3434 V = ConstantByte::get(CurTy, decodeSignRotatedValue(Record[0]),
3439 return error(
"Invalid wide byte const record");
3442 APInt VByte =
readWideAPInt(Record, ScalarTy->getBitWidth());
3443 V = ConstantByte::get(CurTy, VByte);
3448 return error(
"Invalid float const record");
3451 if (ScalarTy->isHalfTy())
3452 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3453 APInt(16, (uint16_t)Record[0])));
3454 else if (ScalarTy->isBFloatTy())
3455 V = ConstantFP::get(
3456 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3457 else if (ScalarTy->isFloatTy())
3458 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3459 APInt(32, (uint32_t)Record[0])));
3460 else if (ScalarTy->isDoubleTy())
3461 V = ConstantFP::get(
3462 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3463 else if (ScalarTy->isX86_FP80Ty()) {
3466 Rearrange[0] = (
Record[1] & 0xffffLL) | (Record[0] << 16);
3467 Rearrange[1] =
Record[0] >> 48;
3468 V = ConstantFP::get(
3469 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3470 }
else if (ScalarTy->isFP128Ty())
3471 V = ConstantFP::get(CurTy,
3472 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3473 else if (ScalarTy->isPPC_FP128Ty())
3474 V = ConstantFP::get(
3475 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3483 return error(
"Invalid aggregate record");
3485 SmallVector<unsigned, 16> Elts;
3489 V = BitcodeConstant::create(
3490 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3492 V = BitcodeConstant::create(
Alloc, CurTy,
3493 BitcodeConstant::ConstantArrayOpcode, Elts);
3495 V = BitcodeConstant::create(
3496 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3505 return error(
"Invalid string record");
3515 return error(
"Invalid data record");
3519 return error(
"Invalid type for value");
3522 SmallString<128> RawData;
3525 const char *Src =
reinterpret_cast<const char *
>(&Val);
3527 Src +=
sizeof(
uint64_t) - EltBytes;
3528 RawData.
append(Src, Src + EltBytes);
3533 : ConstantDataArray::getRaw(RawData.str(),
Record.
size(), EltTy);
3538 return error(
"Invalid unary op constexpr record");
3543 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3549 return error(
"Invalid binary op constexpr record");
3555 if (
Record.size() >= 4) {
3556 if (
Opc == Instruction::Add ||
3557 Opc == Instruction::Sub ||
3558 Opc == Instruction::Mul ||
3559 Opc == Instruction::Shl) {
3564 }
else if (
Opc == Instruction::SDiv ||
3565 Opc == Instruction::UDiv ||
3566 Opc == Instruction::LShr ||
3567 Opc == Instruction::AShr) {
3572 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3573 {(unsigned)Record[1], (
unsigned)
Record[2]});
3579 return error(
"Invalid cast constexpr record");
3584 unsigned OpTyID =
Record[1];
3585 Type *OpTy = getTypeByID(OpTyID);
3587 return error(
"Invalid cast constexpr record");
3588 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3600 return error(
"Constant GEP record must have at least two elements");
3602 Type *PointeeType =
nullptr;
3606 PointeeType = getTypeByID(Record[OpNum++]);
3609 std::optional<ConstantRange>
InRange;
3613 unsigned InRangeIndex =
Op >> 1;
3619 Expected<ConstantRange> MaybeInRange =
3620 readBitWidthAndConstantRange(Record, OpNum);
3629 SmallVector<unsigned, 16> Elts;
3630 unsigned BaseTypeID =
Record[OpNum];
3631 while (OpNum !=
Record.size()) {
3632 unsigned ElTyID =
Record[OpNum++];
3633 Type *ElTy = getTypeByID(ElTyID);
3635 return error(
"Invalid getelementptr constexpr record");
3639 if (Elts.
size() < 1)
3640 return error(
"Invalid gep with no operands");
3644 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3645 BaseType = getTypeByID(BaseTypeID);
3650 return error(
"GEP base operand must be pointer or vector of pointer");
3653 PointeeType = getPtrElementTypeByID(BaseTypeID);
3655 return error(
"Missing element type for old-style constant GEP");
3658 V = BitcodeConstant::create(
3660 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3666 return error(
"Invalid select constexpr record");
3668 V = BitcodeConstant::create(
3669 Alloc, CurTy, Instruction::Select,
3670 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3676 return error(
"Invalid extractelement constexpr record");
3677 unsigned OpTyID =
Record[0];
3681 return error(
"Invalid extractelement constexpr record");
3683 if (
Record.size() == 4) {
3684 unsigned IdxTyID =
Record[2];
3685 Type *IdxTy = getTypeByID(IdxTyID);
3687 return error(
"Invalid extractelement constexpr record");
3693 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3694 {(unsigned)Record[1], IdxRecord});
3700 if (
Record.size() < 3 || !OpTy)
3701 return error(
"Invalid insertelement constexpr record");
3703 if (
Record.size() == 4) {
3704 unsigned IdxTyID =
Record[2];
3705 Type *IdxTy = getTypeByID(IdxTyID);
3707 return error(
"Invalid insertelement constexpr record");
3713 V = BitcodeConstant::create(
3714 Alloc, CurTy, Instruction::InsertElement,
3715 {(unsigned)Record[0], (
unsigned)
Record[1], IdxRecord});
3720 if (
Record.size() < 3 || !OpTy)
3721 return error(
"Invalid shufflevector constexpr record");
3722 V = BitcodeConstant::create(
3723 Alloc, CurTy, Instruction::ShuffleVector,
3724 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3731 if (
Record.size() < 4 || !RTy || !OpTy)
3732 return error(
"Invalid shufflevector constexpr record");
3733 V = BitcodeConstant::create(
3734 Alloc, CurTy, Instruction::ShuffleVector,
3735 {(unsigned)Record[1], (
unsigned)
Record[2], (unsigned)Record[3]});
3740 return error(
"Invalid cmp constexpt record");
3741 unsigned OpTyID =
Record[0];
3742 Type *OpTy = getTypeByID(OpTyID);
3744 return error(
"Invalid cmp constexpr record");
3745 V = BitcodeConstant::create(
3748 : Instruction::ICmp),
3749 (uint8_t)Record[3]},
3750 {(unsigned)Record[1], (
unsigned)
Record[2]});
3757 return error(
"Invalid inlineasm record");
3758 std::string AsmStr, ConstrStr;
3759 bool HasSideEffects =
Record[0] & 1;
3760 bool IsAlignStack =
Record[0] >> 1;
3761 unsigned AsmStrSize =
Record[1];
3762 if (2+AsmStrSize >=
Record.size())
3763 return error(
"Invalid inlineasm record");
3764 unsigned ConstStrSize =
Record[2+AsmStrSize];
3765 if (3+AsmStrSize+ConstStrSize >
Record.size())
3766 return error(
"Invalid inlineasm record");
3768 for (
unsigned i = 0; i != AsmStrSize; ++i)
3769 AsmStr += (
char)
Record[2+i];
3770 for (
unsigned i = 0; i != ConstStrSize; ++i)
3771 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3774 return error(
"Missing element type for old-style inlineasm");
3776 HasSideEffects, IsAlignStack);
3783 return error(
"Invalid inlineasm record");
3784 std::string AsmStr, ConstrStr;
3785 bool HasSideEffects =
Record[0] & 1;
3786 bool IsAlignStack = (
Record[0] >> 1) & 1;
3787 unsigned AsmDialect =
Record[0] >> 2;
3788 unsigned AsmStrSize =
Record[1];
3789 if (2+AsmStrSize >=
Record.size())
3790 return error(
"Invalid inlineasm record");
3791 unsigned ConstStrSize =
Record[2+AsmStrSize];
3792 if (3+AsmStrSize+ConstStrSize >
Record.size())
3793 return error(
"Invalid inlineasm record");
3795 for (
unsigned i = 0; i != AsmStrSize; ++i)
3796 AsmStr += (
char)
Record[2+i];
3797 for (
unsigned i = 0; i != ConstStrSize; ++i)
3798 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3801 return error(
"Missing element type for old-style inlineasm");
3803 HasSideEffects, IsAlignStack,
3810 return error(
"Invalid inlineasm record");
3812 std::string AsmStr, ConstrStr;
3813 bool HasSideEffects =
Record[OpNum] & 1;
3814 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3815 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3816 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3818 unsigned AsmStrSize =
Record[OpNum];
3820 if (OpNum + AsmStrSize >=
Record.size())
3821 return error(
"Invalid inlineasm record");
3822 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3823 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3824 return error(
"Invalid inlineasm record");
3826 for (
unsigned i = 0; i != AsmStrSize; ++i)
3827 AsmStr += (
char)
Record[OpNum + i];
3829 for (
unsigned i = 0; i != ConstStrSize; ++i)
3830 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3833 return error(
"Missing element type for old-style inlineasm");
3835 HasSideEffects, IsAlignStack,
3842 return error(
"Invalid inlineasm record");
3847 return error(
"Invalid inlineasm record");
3848 std::string AsmStr, ConstrStr;
3849 bool HasSideEffects =
Record[OpNum] & 1;
3850 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3851 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3852 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3854 unsigned AsmStrSize =
Record[OpNum];
3856 if (OpNum + AsmStrSize >=
Record.size())
3857 return error(
"Invalid inlineasm record");
3858 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3859 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3860 return error(
"Invalid inlineasm record");
3862 for (
unsigned i = 0; i != AsmStrSize; ++i)
3863 AsmStr += (
char)
Record[OpNum + i];
3865 for (
unsigned i = 0; i != ConstStrSize; ++i)
3866 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3868 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3874 return error(
"Invalid blockaddress record");
3875 unsigned FnTyID =
Record[0];
3876 Type *FnTy = getTypeByID(FnTyID);
3878 return error(
"Invalid blockaddress record");
3879 V = BitcodeConstant::create(
3881 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3887 return error(
"Invalid dso_local record");
3888 unsigned GVTyID =
Record[0];
3889 Type *GVTy = getTypeByID(GVTyID);
3891 return error(
"Invalid dso_local record");
3892 V = BitcodeConstant::create(
3893 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3898 return error(
"Invalid no_cfi record");
3899 unsigned GVTyID =
Record[0];
3900 Type *GVTy = getTypeByID(GVTyID);
3902 return error(
"Invalid no_cfi record");
3903 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3909 return error(
"Invalid ptrauth record");
3911 V = BitcodeConstant::create(
Alloc, CurTy,
3912 BitcodeConstant::ConstantPtrAuthOpcode,
3913 {(unsigned)Record[0], (
unsigned)
Record[1],
3914 (unsigned)Record[2], (
unsigned)
Record[3]});
3919 return error(
"Invalid ptrauth record");
3921 V = BitcodeConstant::create(
3922 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3923 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2],
3924 (
unsigned)
Record[3], (unsigned)Record[4]});
3929 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3936Error BitcodeReader::parseUseLists() {
3941 SmallVector<uint64_t, 64>
Record;
3947 BitstreamEntry
Entry = MaybeEntry.
get();
3949 switch (
Entry.Kind) {
3952 return error(
"Malformed block");
3966 switch (MaybeRecord.
get()) {
3974 if (RecordLength < 3)
3976 return error(
"Invalid uselist record");
3977 unsigned ID =
Record.pop_back_val();
3981 assert(ID < FunctionBBs.size() &&
"Basic block not found");
3982 V = FunctionBBs[
ID];
3986 if (!
V->hasUseList())
3989 unsigned NumUses = 0;
3990 SmallDenseMap<const Use *, unsigned, 16> Order;
3991 for (
const Use &U :
V->materialized_uses()) {
3992 if (++NumUses >
Record.size())
3994 Order[&
U] =
Record[NumUses - 1];
4001 V->sortUseList([&](
const Use &L,
const Use &R) {
4012Error BitcodeReader::rememberAndSkipMetadata() {
4015 DeferredMetadataInfo.push_back(CurBit);
4023Error BitcodeReader::materializeMetadata() {
4024 for (
uint64_t BitPos : DeferredMetadataInfo) {
4028 if (
Error Err = MDLoader->parseModuleMetadata())
4037 NamedMDNode *LinkerOpts =
4039 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
4046 DeferredMetadataInfo.clear();
4050void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
4054Error BitcodeReader::rememberAndSkipFunctionBody() {
4056 if (FunctionsWithBodies.empty())
4057 return error(
"Insufficient function protos");
4059 Function *Fn = FunctionsWithBodies.back();
4060 FunctionsWithBodies.pop_back();
4065 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
4066 "Mismatch between VST and scanned function offsets");
4067 DeferredFunctionInfo[Fn] = CurBit;
4075Error BitcodeReader::globalCleanup() {
4077 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4079 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
4080 return error(
"Malformed global initializer set");
4085 MDLoader->upgradeDebugIntrinsics(
F);
4089 !SkipDebugIntrinsicUpgrade))
4090 UpgradedIntrinsics[&
F] = NewFn;
4096 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4097 for (GlobalVariable &GV : TheModule->globals())
4099 UpgradedVariables.emplace_back(&GV, Upgraded);
4100 for (
auto &Pair : UpgradedVariables) {
4101 Pair.first->eraseFromParent();
4102 TheModule->insertGlobalVariable(Pair.second);
4105 for (
size_t ValueID = 0; ValueID < GUIDList.size(); ValueID++) {
4106 const auto GUID = GUIDList[ValueID];
4110 const auto *
Value = ValueList[ValueID];
4111 TheModule->insertGUID(
Value, GUID);
4116 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4117 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4125Error BitcodeReader::rememberAndSkipFunctionBodies() {
4130 return error(
"Could not find function in stream");
4132 if (!SeenFirstFunctionBody)
4133 return error(
"Trying to materialize functions before seeing function blocks");
4137 assert(SeenValueSymbolTable);
4140 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4143 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4145 switch (
Entry.Kind) {
4147 return error(
"Expect SubBlock");
4151 return error(
"Expect function block");
4153 if (
Error Err = rememberAndSkipFunctionBody())
4162Error BitcodeReaderBase::readBlockInfo() {
4163 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4165 if (!MaybeNewBlockInfo)
4167 std::optional<BitstreamBlockInfo> NewBlockInfo =
4168 std::move(MaybeNewBlockInfo.
get());
4170 return error(
"Malformed block");
4171 BlockInfo = std::move(*NewBlockInfo);
4175Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4179 std::tie(Name, Record) = readNameFromStrtab(Record);
4182 return error(
"Invalid comdat record");
4184 std::string OldFormatName;
4187 return error(
"Invalid comdat record");
4188 unsigned ComdatNameSize =
Record[1];
4189 if (ComdatNameSize >
Record.size() - 2)
4190 return error(
"Comdat name size too large");
4191 OldFormatName.reserve(ComdatNameSize);
4192 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4193 OldFormatName += (
char)
Record[2 + i];
4194 Name = OldFormatName;
4196 Comdat *
C = TheModule->getOrInsertComdat(Name);
4197 C->setSelectionKind(SK);
4198 ComdatList.push_back(
C);
4212 Meta.NoAddress =
true;
4214 Meta.NoHWAddress =
true;
4218 Meta.IsDynInit =
true;
4222Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4230 std::tie(Name, Record) = readNameFromStrtab(Record);
4233 return error(
"Invalid global variable record");
4234 unsigned TyID =
Record[0];
4235 Type *Ty = getTypeByID(TyID);
4237 return error(
"Invalid global variable record");
4239 bool explicitType =
Record[1] & 2;
4245 return error(
"Invalid type for value");
4247 TyID = getContainedTypeID(TyID);
4248 Ty = getTypeByID(TyID);
4250 return error(
"Missing element type for old-style global");
4256 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4260 if (Record[5] - 1 >= SectionTable.size())
4261 return error(
"Invalid ID");
4270 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4278 bool ExternallyInitialized =
false;
4280 ExternallyInitialized =
Record[9];
4282 GlobalVariable *NewGV =
4292 if (
Record.size() > 10) {
4304 if (
unsigned InitID = Record[2])
4305 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4307 if (
Record.size() > 11) {
4308 if (
unsigned ComdatID = Record[11]) {
4309 if (ComdatID > ComdatList.size())
4310 return error(
"Invalid global variable comdat ID");
4311 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4314 ImplicitComdatObjects.
insert(NewGV);
4317 if (
Record.size() > 12) {
4322 if (
Record.size() > 13) {
4331 if (
Record.size() > 16 && Record[16]) {
4332 llvm::GlobalValue::SanitizerMetadata
Meta =
4337 if (
Record.size() > 17 && Record[17]) {
4341 return error(
"Invalid global variable code model");
4347void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4348 if (ValueTypeCallback) {
4349 (*ValueTypeCallback)(
4350 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4351 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4355Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4361 std::tie(Name, Record) = readNameFromStrtab(Record);
4364 return error(
"Invalid function record");
4365 unsigned FTyID =
Record[0];
4366 Type *FTy = getTypeByID(FTyID);
4368 return error(
"Invalid function record");
4370 FTyID = getContainedTypeID(FTyID, 0);
4371 FTy = getTypeByID(FTyID);
4373 return error(
"Missing element type for old-style function");
4377 return error(
"Invalid type for value");
4378 auto CC =
static_cast<CallingConv::ID
>(
Record[1]);
4379 if (
CC & ~CallingConv::MaxID)
4380 return error(
"Invalid calling convention ID");
4382 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4388 AddrSpace, Name, TheModule);
4391 "Incorrect fully specified type provided for function");
4392 FunctionTypeIDs[
Func] = FTyID;
4394 Func->setCallingConv(
CC);
4395 bool isProto =
Record[2];
4399 callValueTypeCallback(Func, FTyID);
4404 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4405 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4406 Attribute::InAlloca}) {
4407 if (!
Func->hasParamAttribute(i, Kind))
4410 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4413 Func->removeParamAttr(i, Kind);
4415 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4416 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4418 return error(
"Missing param element type for attribute upgrade");
4422 case Attribute::ByVal:
4423 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4425 case Attribute::StructRet:
4426 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4428 case Attribute::InAlloca:
4429 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4435 Func->addParamAttr(i, NewAttr);
4439 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4440 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4441 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4442 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4444 return error(
"Missing param element type for x86_intrcc upgrade");
4446 Func->addParamAttr(0, NewAttr);
4450 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4453 Func->setAlignment(*Alignment);
4455 if (Record[6] - 1 >= SectionTable.size())
4456 return error(
"Invalid ID");
4457 Func->setSection(SectionTable[Record[6] - 1]);
4461 if (!
Func->hasLocalLinkage())
4463 if (
Record.size() > 8 && Record[8]) {
4464 if (Record[8] - 1 >= GCTable.size())
4465 return error(
"Invalid ID");
4466 Func->setGC(GCTable[Record[8] - 1]);
4471 Func->setUnnamedAddr(UnnamedAddr);
4473 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4475 OperandInfo.Prologue =
Record[10];
4477 if (
Record.size() > 11) {
4479 if (!
Func->hasLocalLinkage()) {
4486 if (
Record.size() > 12) {
4487 if (
unsigned ComdatID = Record[12]) {
4488 if (ComdatID > ComdatList.size())
4489 return error(
"Invalid function comdat ID");
4490 Func->setComdat(ComdatList[ComdatID - 1]);
4493 ImplicitComdatObjects.
insert(Func);
4497 OperandInfo.Prefix =
Record[13];
4500 OperandInfo.PersonalityFn =
Record[14];
4502 if (
Record.size() > 15) {
4512 Record[17] + Record[18] <= Strtab.
size()) {
4513 Func->setPartition(StringRef(Strtab.
data() + Record[17], Record[18]));
4516 if (
Record.size() > 19) {
4517 MaybeAlign PrefAlignment;
4518 if (
Error Err = parseAlignmentValue(Record[19], PrefAlignment))
4520 Func->setPreferredAlignment(PrefAlignment);
4523 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4525 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4526 FunctionOperands.push_back(OperandInfo);
4531 Func->setIsMaterializable(
true);
4532 FunctionsWithBodies.push_back(Func);
4533 DeferredFunctionInfo[
Func] = 0;
4538Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4539 unsigned BitCode, ArrayRef<uint64_t> Record) {
4549 std::tie(Name, Record) = readNameFromStrtab(Record);
4552 if (
Record.size() < (3 + (
unsigned)NewRecord))
4553 return error(
"Invalid global indirect symbol record");
4558 return error(
"Invalid global indirect symbol record");
4564 return error(
"Invalid type for value");
4565 AddrSpace = PTy->getAddressSpace();
4567 Ty = getTypeByID(
TypeID);
4569 return error(
"Missing element type for old-style indirect symbol");
4571 AddrSpace =
Record[OpNum++];
4574 auto Val =
Record[OpNum++];
4583 nullptr, TheModule);
4587 if (OpNum !=
Record.size()) {
4588 auto VisInd = OpNum++;
4594 if (OpNum !=
Record.size()) {
4595 auto S =
Record[OpNum++];
4602 if (OpNum !=
Record.size())
4604 if (OpNum !=
Record.size())
4607 if (OpNum !=
Record.size())
4612 if (OpNum + 1 <
Record.size()) {
4614 if (Record[OpNum] + Record[OpNum + 1] > Strtab.
size())
4615 return error(
"Malformed partition, too large.");
4617 StringRef(Strtab.
data() + Record[OpNum], Record[OpNum + 1]));
4621 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4626 bool ShouldLazyLoadMetadata,
4627 ParserCallbacks Callbacks) {
4628 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4635 SmallVector<uint64_t, 64>
Record;
4639 bool ResolvedDataLayout =
false;
4644 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4647 Module::GlobalAsmProperties Props;
4649 auto ResolveDataLayout = [&]() ->
Error {
4650 if (ResolvedDataLayout)
4654 ResolvedDataLayout =
true;
4658 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4662 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4663 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4664 TentativeDataLayoutStr = *LayoutOverride;
4672 TheModule->setDataLayout(MaybeDL.
get());
4678 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4681 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4683 switch (
Entry.Kind) {
4685 return error(
"Malformed block");
4687 if (
Error Err = ResolveDataLayout())
4689 return globalCleanup();
4698 if (
Error Err = readBlockInfo())
4702 if (
Error Err = parseAttributeBlock())
4706 if (
Error Err = parseAttributeGroupBlock())
4710 if (
Error Err = parseTypeTable())
4714 if (!SeenValueSymbolTable) {
4720 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4721 if (
Error Err = parseValueSymbolTable())
4723 SeenValueSymbolTable =
true;
4733 if (
Error Err = parseConstants())
4735 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4739 if (ShouldLazyLoadMetadata) {
4740 if (
Error Err = rememberAndSkipMetadata())
4744 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4745 if (
Error Err = MDLoader->parseModuleMetadata())
4749 if (
Error Err = MDLoader->parseMetadataKinds())
4753 if (
Error Err = ResolveDataLayout())
4758 if (!SeenFirstFunctionBody) {
4759 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4760 if (
Error Err = globalCleanup())
4762 SeenFirstFunctionBody =
true;
4765 if (VSTOffset > 0) {
4769 if (!SeenValueSymbolTable) {
4770 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4772 SeenValueSymbolTable =
true;
4794 if (
Error Err = rememberAndSkipFunctionBody())
4801 if (SeenValueSymbolTable) {
4805 return globalCleanup();
4809 if (
Error Err = parseUseLists())
4813 if (
Error Err = parseOperandBundleTags())
4817 if (
Error Err = parseSyncScopeNames())
4829 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
4832 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4835 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4838 UseRelativeIDs = *VersionOrErr >= 1;
4842 if (ResolvedDataLayout)
4843 return error(
"target triple too late in module");
4846 return error(
"Invalid triple record");
4847 TheModule->setTargetTriple(Triple(std::move(S)));
4851 if (ResolvedDataLayout)
4852 return error(
"datalayout too late in module");
4854 return error(
"Invalid data layout record");
4860 return error(
"Invalid module asm record");
4861 size_t SepPos = Str.find(
'\0');
4862 if (SepPos == std::string::npos)
4863 return error(
"Invalid module asm record");
4864 if (!Props.
set(StringRef(Str.data(), SepPos), Str.substr(SepPos + 1)))
4865 return error(
"Unknown module asm property");
4871 return error(
"Invalid asm record");
4872 TheModule->appendModuleInlineAsm(Module::GlobalAsmFragment(S, Props));
4880 return error(
"Invalid deplib record");
4887 return error(
"Invalid section name record");
4888 SectionTable.push_back(S);
4894 return error(
"Invalid gcname record");
4895 GCTable.push_back(S);
4899 if (
Error Err = parseComdatRecord(Record))
4908 if (
Error Err = parseGlobalVarRecord(Record))
4912 if (
Error Err = ResolveDataLayout())
4914 if (
Error Err = parseFunctionRecord(Record))
4920 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4926 return error(
"Invalid vstoffset record");
4930 VSTOffset =
Record[0] - 1;
4935 GUIDList.reserve(GUIDList.size() +
Record.size() / 2);
4936 for (
size_t i = 0; i <
Record.size(); i += 2)
4937 GUIDList.push_back(Record[i] << 32 | Record[i + 1]);
4943 return error(
"Invalid source filename record");
4944 TheModule->setSourceFileName(
ValueName);
4950 this->ValueTypeCallback = std::nullopt;
4954Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4956 ParserCallbacks Callbacks) {
4958 MetadataLoaderCallbacks MDCallbacks;
4959 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(ID); };
4961 return getContainedTypeID(
I, J);
4964 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4966 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4969Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4971 return error(
"Load/Store operand is not a pointer type");
4972 if (!PointerType::isLoadableOrStorableType(ValType))
4973 return error(
"Cannot load/store from pointer");
4977Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4978 ArrayRef<unsigned> ArgTyIDs) {
4980 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4981 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4982 Attribute::InAlloca}) {
4983 if (!
Attrs.hasParamAttr(i, Kind) ||
4984 Attrs.getParamAttr(i, Kind).getValueAsType())
4987 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4989 return error(
"Missing element type for typed attribute upgrade");
4993 case Attribute::ByVal:
4994 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4996 case Attribute::StructRet:
4997 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4999 case Attribute::InAlloca:
5000 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
5013 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
5017 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
5018 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
5020 return error(
"Missing element type for inline asm upgrade");
5023 Attribute::get(
Context, Attribute::ElementType, ElemTy));
5031 case Intrinsic::preserve_array_access_index:
5032 case Intrinsic::preserve_struct_access_index:
5033 case Intrinsic::aarch64_ldaxr:
5034 case Intrinsic::aarch64_ldxr:
5035 case Intrinsic::aarch64_stlxr:
5036 case Intrinsic::aarch64_stxr:
5037 case Intrinsic::arm_ldaex:
5038 case Intrinsic::arm_ldrex:
5039 case Intrinsic::arm_stlex:
5040 case Intrinsic::arm_strex: {
5043 case Intrinsic::aarch64_stlxr:
5044 case Intrinsic::aarch64_stxr:
5045 case Intrinsic::arm_stlex:
5046 case Intrinsic::arm_strex:
5053 if (!
Attrs.getParamElementType(ArgNo)) {
5054 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
5056 return error(
"Missing element type for elementtype upgrade");
5076 if (MDLoader->hasFwdRefs())
5077 return error(
"Invalid function metadata: incoming forward references");
5079 InstructionList.
clear();
5080 unsigned ModuleValueListSize = ValueList.
size();
5081 unsigned ModuleMDLoaderSize = MDLoader->size();
5085 unsigned FTyID = FunctionTypeIDs[
F];
5086 for (Argument &
I :
F->args()) {
5087 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
5088 assert(
I.getType() == getTypeByID(ArgTyID) &&
5089 "Incorrect fully specified type for Function Argument");
5093 unsigned NextValueNo = ValueList.
size();
5095 unsigned CurBBNo = 0;
5100 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
5104 auto getLastInstruction = [&]() -> Instruction * {
5105 if (CurBB && !CurBB->
empty())
5106 return &CurBB->
back();
5107 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
5108 !FunctionBBs[CurBBNo - 1]->
empty())
5109 return &FunctionBBs[CurBBNo - 1]->back();
5113 std::vector<OperandBundleDef> OperandBundles;
5116 SmallVector<uint64_t, 64>
Record;
5119 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
5122 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
5124 switch (
Entry.Kind) {
5126 return error(
"Malformed block");
5128 goto OutOfRecordLoop;
5137 if (
Error Err = parseConstants())
5139 NextValueNo = ValueList.
size();
5142 if (
Error Err = parseValueSymbolTable())
5146 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5150 assert(DeferredMetadataInfo.empty() &&
5151 "Must read all module-level metadata before function-level");
5152 if (
Error Err = MDLoader->parseFunctionMetadata())
5156 if (
Error Err = parseUseLists())
5170 unsigned ResTypeID = InvalidTypeID;
5171 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
5174 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5176 return error(
"Invalid value");
5178 if (
Record.empty() || Record[0] == 0)
5179 return error(
"Invalid declareblocks record");
5181 FunctionBBs.resize(Record[0]);
5184 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5185 if (BBFRI == BasicBlockFwdRefs.
end()) {
5186 for (BasicBlock *&BB : FunctionBBs)
5189 auto &BBRefs = BBFRI->second;
5191 if (BBRefs.size() > FunctionBBs.size())
5192 return error(
"Invalid ID");
5193 assert(!BBRefs.empty() &&
"Unexpected empty array");
5194 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5195 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5197 if (
I < RE && BBRefs[
I]) {
5198 BBRefs[
I]->insertInto(
F);
5199 FunctionBBs[
I] = BBRefs[
I];
5205 BasicBlockFwdRefs.
erase(BBFRI);
5208 CurBB = FunctionBBs[0];
5215 return error(
"Invalid blockaddr users record");
5231 BackwardRefFunctions.push_back(
F);
5233 return error(
"Invalid blockaddr users record");
5240 I = getLastInstruction();
5243 return error(
"Invalid debug_loc_again record");
5244 I->setDebugLoc(LastLoc);
5249 I = getLastInstruction();
5251 return error(
"Invalid debug loc record");
5259 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5262 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5264 return error(
"Invalid debug loc record");
5268 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5270 return error(
"Invalid debug loc record");
5273 if (
Record.size() >= 8 && Record[7])
5274 IRLayers = MDLoader->getMetadataFwdRefOrLoad(Record[7] - 1);
5276 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5277 isImplicitCode, AtomGroup, AtomRank, IRLayers);
5278 I->setDebugLoc(LastLoc);
5286 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5288 return error(
"Invalid unary operator record");
5292 return error(
"Invalid unary operator record");
5296 if (OpNum <
Record.size()) {
5300 I->setFastMathFlags(FMF);
5309 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5313 return error(
"Invalid binary operator record");
5317 return error(
"Invalid binary operator record");
5321 if (OpNum <
Record.size()) {
5322 if (
Opc == Instruction::Add ||
5323 Opc == Instruction::Sub ||
5324 Opc == Instruction::Mul ||
5325 Opc == Instruction::Shl) {
5330 }
else if (
Opc == Instruction::SDiv ||
5331 Opc == Instruction::UDiv ||
5332 Opc == Instruction::LShr ||
5333 Opc == Instruction::AShr) {
5336 }
else if (
Opc == Instruction::Or) {
5342 I->setFastMathFlags(FMF);
5351 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5352 OpNum + 1 >
Record.size())
5353 return error(
"Invalid cast record");
5355 ResTypeID =
Record[OpNum++];
5356 Type *ResTy = getTypeByID(ResTypeID);
5359 if (
Opc == -1 || !ResTy)
5360 return error(
"Invalid cast record");
5365 assert(CurBB &&
"No current BB?");
5371 return error(
"Invalid cast");
5375 if (OpNum <
Record.size()) {
5376 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5379 }
else if (
Opc == Instruction::Trunc) {
5384 }
else if (
Opc == Instruction::AddrSpaceCast) {
5394 I->setFastMathFlags(FMF);
5413 Ty = getTypeByID(TyID);
5417 TyID = InvalidTypeID;
5422 unsigned BasePtrTypeID;
5423 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5425 return error(
"Invalid gep record");
5428 TyID = getContainedTypeID(BasePtrTypeID);
5429 if (
BasePtr->getType()->isVectorTy())
5430 TyID = getContainedTypeID(TyID);
5431 Ty = getTypeByID(TyID);
5434 SmallVector<Value*, 16> GEPIdx;
5435 while (OpNum !=
Record.size()) {
5438 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5439 return error(
"Invalid gep record");
5450 unsigned SubType = 0;
5451 if (GTI.isStruct()) {
5453 Idx->getType()->isVectorTy()
5458 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5465 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5466 if (
I->getType()->isVectorTy())
5467 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5470 GEP->setNoWrapFlags(NW);
5479 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5480 return error(
"Invalid extractvalue record");
5483 unsigned RecSize =
Record.size();
5484 if (OpNum == RecSize)
5485 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5487 SmallVector<unsigned, 4> EXTRACTVALIdx;
5488 ResTypeID = AggTypeID;
5489 for (; OpNum != RecSize; ++OpNum) {
5494 if (!IsStruct && !IsArray)
5495 return error(
"EXTRACTVAL: Invalid type");
5496 if ((
unsigned)Index != Index)
5497 return error(
"Invalid value");
5499 return error(
"EXTRACTVAL: Invalid struct index");
5501 return error(
"EXTRACTVAL: Invalid array index");
5502 EXTRACTVALIdx.
push_back((
unsigned)Index);
5506 ResTypeID = getContainedTypeID(ResTypeID, Index);
5509 ResTypeID = getContainedTypeID(ResTypeID);
5523 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5524 return error(
"Invalid insertvalue record");
5527 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5528 return error(
"Invalid insertvalue record");
5530 unsigned RecSize =
Record.size();
5531 if (OpNum == RecSize)
5532 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5534 SmallVector<unsigned, 4> INSERTVALIdx;
5536 for (; OpNum != RecSize; ++OpNum) {
5541 if (!IsStruct && !IsArray)
5542 return error(
"INSERTVAL: Invalid type");
5543 if ((
unsigned)Index != Index)
5544 return error(
"Invalid value");
5546 return error(
"INSERTVAL: Invalid struct index");
5548 return error(
"INSERTVAL: Invalid array index");
5550 INSERTVALIdx.
push_back((
unsigned)Index);
5558 return error(
"Inserted value type doesn't match aggregate type");
5561 ResTypeID = AggTypeID;
5573 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5575 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5577 popValue(Record, OpNum, NextValueNo, CondType,
5578 getVirtualTypeID(CondType),
Cond, CurBB))
5579 return error(
"Invalid select record");
5592 unsigned ValTypeID, CondTypeID;
5593 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5595 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5597 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5598 return error(
"Invalid vector select record");
5601 if (VectorType* vector_type =
5604 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5605 return error(
"Invalid type for value");
5609 return error(
"Invalid type for value");
5613 ResTypeID = ValTypeID;
5618 I->setFastMathFlags(FMF);
5626 unsigned VecTypeID, IdxTypeID;
5627 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5628 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5629 return error(
"Invalid extractelement record");
5631 return error(
"Invalid type for value");
5633 ResTypeID = getContainedTypeID(VecTypeID);
5641 unsigned VecTypeID, IdxTypeID;
5642 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5643 return error(
"Invalid insertelement record");
5645 return error(
"Invalid type for value");
5646 if (popValue(Record, OpNum, NextValueNo,
5648 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5649 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5650 return error(
"Invalid insert element record");
5652 ResTypeID = VecTypeID;
5660 unsigned BaseTypeID, ValTypeID, OffsetTypeID;
5661 if (getValueTypePair(Record, OpNum, NextValueNo,
Base, BaseTypeID,
5663 getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB) ||
5664 getValueTypePair(Record, OpNum, NextValueNo,
Offset, OffsetTypeID,
5666 return error(
"Invalid bitinsert record");
5667 if (
const char *Reason =
5669 return error(Reason);
5671 ResTypeID = BaseTypeID;
5679 return error(
"Record is empty for bitextract");
5683 return error(
"Invalid bitextract result type");
5685 unsigned SrcTypeID, OffsetTypeID;
5686 if (getValueTypePair(Record, OpNum, NextValueNo, Src, SrcTypeID, CurBB) ||
5687 getValueTypePair(Record, OpNum, NextValueNo,
Offset, OffsetTypeID,
5689 return error(
"Invalid bitextract record");
5690 if (
const char *Reason =
5692 return error(Reason);
5702 unsigned Vec1TypeID;
5703 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5705 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5707 return error(
"Invalid shufflevector record");
5709 unsigned MaskTypeID;
5710 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5711 return error(
"Invalid shufflevector record");
5713 return error(
"Invalid type for value");
5715 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5717 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5732 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5733 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5735 return error(
"Invalid comparison record");
5737 if (OpNum >=
Record.size())
5739 "Invalid record: operand number exceeded available operands");
5744 if (IsFP &&
Record.size() > OpNum+1)
5749 return error(
"Invalid fcmp predicate");
5750 I =
new FCmpInst(PredVal,
LHS,
RHS);
5753 return error(
"Invalid icmp predicate");
5754 I =
new ICmpInst(PredVal,
LHS,
RHS);
5755 if (
Record.size() > OpNum + 1 &&
5760 if (OpNum + 1 !=
Record.size())
5761 return error(
"Invalid comparison record");
5763 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5765 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5768 I->setFastMathFlags(FMF);
5785 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5786 return error(
"Invalid ret record");
5787 if (OpNum !=
Record.size())
5788 return error(
"Invalid ret record");
5796 return error(
"Invalid br record");
5797 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5799 return error(
"Invalid br record");
5801 if (
Record.size() == 1) {
5806 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5809 getVirtualTypeID(CondType), CurBB);
5810 if (!FalseDest || !
Cond)
5811 return error(
"Invalid br record");
5819 return error(
"Invalid cleanupret record");
5822 Value *CleanupPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5823 getVirtualTypeID(TokenTy), CurBB);
5825 return error(
"Invalid cleanupret record");
5827 if (
Record.size() == 2) {
5828 UnwindDest = getBasicBlock(Record[Idx++]);
5830 return error(
"Invalid cleanupret record");
5839 return error(
"Invalid catchret record");
5842 Value *CatchPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5843 getVirtualTypeID(TokenTy), CurBB);
5845 return error(
"Invalid catchret record");
5846 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5848 return error(
"Invalid catchret record");
5857 return error(
"Invalid catchswitch record");
5862 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5863 getVirtualTypeID(TokenTy), CurBB);
5865 return error(
"Invalid catchswitch record");
5870 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5871 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5873 return error(
"Invalid catchswitch record");
5878 if (Idx + 1 ==
Record.size()) {
5879 UnwindDest = getBasicBlock(Record[Idx++]);
5881 return error(
"Invalid catchswitch record");
5884 if (
Record.size() != Idx)
5885 return error(
"Invalid catchswitch record");
5889 for (BasicBlock *Handler : Handlers)
5890 CatchSwitch->addHandler(Handler);
5892 ResTypeID = getVirtualTypeID(
I->getType());
5900 return error(
"Invalid catchpad/cleanuppad record");
5905 Value *ParentPad =
getValue(Record, Idx++, NextValueNo, TokenTy,
5906 getVirtualTypeID(TokenTy), CurBB);
5908 return error(
"Invalid catchpad/cleanuppad record");
5910 unsigned NumArgOperands =
Record[
Idx++];
5912 SmallVector<Value *, 2>
Args;
5913 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5916 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5917 return error(
"Invalid catchpad/cleanuppad record");
5918 Args.push_back(Val);
5921 if (
Record.size() != Idx)
5922 return error(
"Invalid catchpad/cleanuppad record");
5928 ResTypeID = getVirtualTypeID(
I->getType());
5934 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5940 unsigned OpTyID =
Record[1];
5941 Type *OpTy = getTypeByID(OpTyID);
5947 return error(
"Invalid switch record");
5949 unsigned NumCases =
Record[4];
5954 unsigned CurIdx = 5;
5955 for (
unsigned i = 0; i != NumCases; ++i) {
5957 unsigned NumItems =
Record[CurIdx++];
5958 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5959 bool isSingleNumber =
Record[CurIdx++];
5962 unsigned ActiveWords = 1;
5963 if (ValueBitWidth > 64)
5964 ActiveWords =
Record[CurIdx++];
5967 CurIdx += ActiveWords;
5969 if (!isSingleNumber) {
5971 if (ValueBitWidth > 64)
5972 ActiveWords =
Record[CurIdx++];
5975 CurIdx += ActiveWords;
5986 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5987 for (ConstantInt *Cst : CaseVals)
5988 SI->addCase(Cst, DestBB);
5997 return error(
"Invalid switch record");
5998 unsigned OpTyID =
Record[0];
5999 Type *OpTy = getTypeByID(OpTyID);
6003 return error(
"Invalid switch record");
6004 unsigned NumCases = (
Record.size()-3)/2;
6007 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
6009 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
6010 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
6011 if (!CaseVal || !DestBB) {
6013 return error(
"Invalid switch record");
6015 SI->addCase(CaseVal, DestBB);
6022 return error(
"Invalid indirectbr record");
6023 unsigned OpTyID =
Record[0];
6024 Type *OpTy = getTypeByID(OpTyID);
6027 return error(
"Invalid indirectbr record");
6028 unsigned NumDests =
Record.size()-2;
6031 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
6032 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
6036 return error(
"Invalid indirectbr record");
6046 return error(
"Invalid invoke record");
6049 unsigned CCInfo =
Record[OpNum++];
6050 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
6051 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
6053 unsigned FTyID = InvalidTypeID;
6054 FunctionType *FTy =
nullptr;
6055 if ((CCInfo >> 13) & 1) {
6059 return error(
"Explicit invoke type is not a function type");
6063 unsigned CalleeTypeID;
6064 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6066 return error(
"Invalid invoke record");
6070 return error(
"Callee is not a pointer");
6072 FTyID = getContainedTypeID(CalleeTypeID);
6075 return error(
"Callee is not of pointer to function type");
6077 if (
Record.size() < FTy->getNumParams() + OpNum)
6078 return error(
"Insufficient operands to call");
6080 SmallVector<Value*, 16>
Ops;
6081 SmallVector<unsigned, 16> ArgTyIDs;
6082 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6083 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6084 Ops.push_back(
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6088 return error(
"Invalid invoke record");
6091 if (!FTy->isVarArg()) {
6092 if (
Record.size() != OpNum)
6093 return error(
"Invalid invoke record");
6096 while (OpNum !=
Record.size()) {
6099 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6100 return error(
"Invalid invoke record");
6107 if (!OperandBundles.empty())
6112 ResTypeID = getContainedTypeID(FTyID);
6113 OperandBundles.clear();
6116 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
6127 Value *Val =
nullptr;
6129 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
6130 return error(
"Invalid resume record");
6139 unsigned CCInfo =
Record[OpNum++];
6141 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
6142 unsigned NumIndirectDests =
Record[OpNum++];
6143 SmallVector<BasicBlock *, 16> IndirectDests;
6144 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
6145 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
6147 unsigned FTyID = InvalidTypeID;
6148 FunctionType *FTy =
nullptr;
6153 return error(
"Explicit call type is not a function type");
6157 unsigned CalleeTypeID;
6158 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6160 return error(
"Invalid callbr record");
6164 return error(
"Callee is not a pointer type");
6166 FTyID = getContainedTypeID(CalleeTypeID);
6169 return error(
"Callee is not of pointer to function type");
6171 if (
Record.size() < FTy->getNumParams() + OpNum)
6172 return error(
"Insufficient operands to call");
6174 SmallVector<Value*, 16>
Args;
6175 SmallVector<unsigned, 16> ArgTyIDs;
6177 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6179 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6180 if (FTy->getParamType(i)->isLabelTy())
6181 Arg = getBasicBlock(Record[OpNum]);
6183 Arg =
getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6186 return error(
"Invalid callbr record");
6187 Args.push_back(Arg);
6192 if (!FTy->isVarArg()) {
6193 if (OpNum !=
Record.size())
6194 return error(
"Invalid callbr record");
6196 while (OpNum !=
Record.size()) {
6199 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6200 return error(
"Invalid callbr record");
6207 if (!OperandBundles.empty())
6212 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6215 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6220 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6221 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6222 unsigned LabelNo = ArgNo - FirstBlockArg;
6224 if (!BA || BA->getFunction() !=
F ||
6225 LabelNo > IndirectDests.
size() ||
6226 BA->getBasicBlock() != IndirectDests[LabelNo])
6227 return error(
"callbr argument does not match indirect dest");
6232 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6236 for (
Value *Arg : Args)
6239 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6242 std::string Constraints =
IA->getConstraintString().str();
6245 for (
const auto &CI : ConstraintInfo) {
6247 if (ArgNo >= FirstBlockArg)
6248 Constraints.insert(Pos,
"!");
6253 Pos = Constraints.find(
',', Pos);
6254 if (Pos == std::string::npos)
6260 IA->hasSideEffects(),
IA->isAlignStack(),
6261 IA->getDialect(),
IA->canThrow());
6267 ResTypeID = getContainedTypeID(FTyID);
6268 OperandBundles.clear();
6285 return error(
"Invalid phi record");
6287 unsigned TyID =
Record[0];
6288 Type *Ty = getTypeByID(TyID);
6290 return error(
"Invalid phi record");
6295 size_t NumArgs = (
Record.size() - 1) / 2;
6299 return error(
"Invalid phi record");
6303 SmallDenseMap<BasicBlock *, Value *>
Args;
6304 for (
unsigned i = 0; i != NumArgs; i++) {
6305 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6308 return error(
"Invalid phi BB");
6315 auto It =
Args.find(BB);
6317 if (It !=
Args.end()) {
6331 if (!PhiConstExprBB)
6333 EdgeBB = PhiConstExprBB;
6341 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6343 V =
getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6347 return error(
"Invalid phi record");
6350 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6351 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6352 PhiConstExprBB =
nullptr;
6355 Args.insert({BB,
V});
6361 if (
Record.size() % 2 == 0) {
6365 I->setFastMathFlags(FMF);
6377 return error(
"Invalid landingpad record");
6381 return error(
"Invalid landingpad record");
6384 Type *Ty = getTypeByID(ResTypeID);
6386 return error(
"Invalid landingpad record");
6388 Value *PersFn =
nullptr;
6389 unsigned PersFnTypeID;
6390 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6392 return error(
"Invalid landingpad record");
6394 if (!
F->hasPersonalityFn())
6397 return error(
"Personality function mismatch");
6404 for (
unsigned J = 0; J != NumClauses; ++J) {
6410 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6413 return error(
"Invalid landingpad record");
6418 "Catch clause has a invalid type!");
6421 "Filter clause has invalid type!");
6432 return error(
"Invalid alloca record");
6433 using APV = AllocaPackedValues;
6437 unsigned TyID =
Record[0];
6438 Type *Ty = getTypeByID(TyID);
6440 TyID = getContainedTypeID(TyID);
6441 Ty = getTypeByID(TyID);
6443 return error(
"Missing element type for old-style alloca");
6445 unsigned OpTyID =
Record[1];
6446 Type *OpTy = getTypeByID(OpTyID);
6447 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6452 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6456 return error(
"Invalid alloca record");
6458 const DataLayout &
DL = TheModule->getDataLayout();
6459 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6462 return error(
"alloca of unsized type");
6464 Align =
DL.getPrefTypeAlign(Ty);
6466 if (!
Size->getType()->isIntegerTy())
6467 return error(
"alloca element count must have integer type");
6469 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6473 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6481 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6482 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6483 return error(
"Invalid load record");
6486 return error(
"Load operand is not a pointer type");
6489 if (OpNum + 3 ==
Record.size()) {
6490 ResTypeID =
Record[OpNum++];
6491 Ty = getTypeByID(ResTypeID);
6493 ResTypeID = getContainedTypeID(OpTypeID);
6494 Ty = getTypeByID(ResTypeID);
6498 return error(
"Missing load type");
6500 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6504 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6507 return error(
"load of unsized type");
6509 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6510 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6519 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6520 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size() &&
6521 OpNum + 6 !=
Record.size()))
6522 return error(
"Invalid load atomic record");
6525 return error(
"Load operand is not a pointer type");
6528 if (
Record.size() >= OpNum + 5) {
6529 ResTypeID =
Record[OpNum++];
6530 Ty = getTypeByID(ResTypeID);
6532 ResTypeID = getContainedTypeID(OpTypeID);
6533 Ty = getTypeByID(ResTypeID);
6537 return error(
"Missing atomic load type");
6539 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6543 if (Ordering == AtomicOrdering::NotAtomic ||
6544 Ordering == AtomicOrdering::Release ||
6545 Ordering == AtomicOrdering::AcquireRelease)
6546 return error(
"Invalid load atomic record");
6547 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6548 return error(
"Invalid load atomic record");
6549 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6550 bool IsElementwise =
Record.size() > OpNum + 4 &&
Record[OpNum + 4];
6553 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6556 return error(
"Alignment missing from atomic load");
6559 LoadStoreInstProperties{
Record[OpNum + 1] != 0, *
Align,
6569 unsigned PtrTypeID, ValTypeID;
6570 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6571 return error(
"Invalid store record");
6574 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6575 return error(
"Invalid store record");
6577 ValTypeID = getContainedTypeID(PtrTypeID);
6578 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6579 ValTypeID, Val, CurBB))
6580 return error(
"Invalid store record");
6583 if (OpNum + 2 !=
Record.size())
6584 return error(
"Invalid store record");
6589 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6592 return error(
"store of unsized type");
6594 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6595 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6605 unsigned PtrTypeID, ValTypeID;
6606 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6608 return error(
"Invalid store atomic record");
6610 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6611 return error(
"Invalid store atomic record");
6613 ValTypeID = getContainedTypeID(PtrTypeID);
6614 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6615 ValTypeID, Val, CurBB))
6616 return error(
"Invalid store atomic record");
6619 if (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size())
6620 return error(
"Invalid store atomic record");
6625 if (Ordering == AtomicOrdering::NotAtomic ||
6626 Ordering == AtomicOrdering::Acquire ||
6627 Ordering == AtomicOrdering::AcquireRelease)
6628 return error(
"Invalid store atomic record");
6629 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6630 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6631 return error(
"Invalid store atomic record");
6634 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6637 return error(
"Alignment missing from atomic store");
6639 bool IsElementwise =
Record.size() > OpNum + 4 &&
Record[OpNum + 4];
6643 LoadStoreInstProperties{
Record[OpNum + 1] != 0, *
Align,
6652 const size_t NumRecords =
Record.size();
6654 Value *Ptr =
nullptr;
6656 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6657 return error(
"Invalid cmpxchg record");
6660 return error(
"Cmpxchg operand is not a pointer type");
6663 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6664 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6665 CmpTypeID, Cmp, CurBB))
6666 return error(
"Invalid cmpxchg record");
6669 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6671 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6672 return error(
"Invalid cmpxchg record");
6676 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6677 SuccessOrdering == AtomicOrdering::Unordered)
6678 return error(
"Invalid cmpxchg record");
6680 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6682 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6690 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6691 FailureOrdering == AtomicOrdering::Unordered)
6692 return error(
"Invalid cmpxchg record");
6695 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6697 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6698 FailureOrdering, SSID);
6701 if (NumRecords < 8) {
6705 I->insertInto(CurBB, CurBB->
end());
6707 ResTypeID = CmpTypeID;
6710 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6711 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6720 const size_t NumRecords =
Record.size();
6722 Value *Ptr =
nullptr;
6724 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6725 return error(
"Invalid cmpxchg record");
6728 return error(
"Cmpxchg operand is not a pointer type");
6732 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6733 return error(
"Invalid cmpxchg record");
6735 Value *Val =
nullptr;
6736 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6738 return error(
"Invalid cmpxchg record");
6740 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6741 return error(
"Invalid cmpxchg record");
6743 const bool IsVol =
Record[OpNum];
6748 return error(
"Invalid cmpxchg success ordering");
6750 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6752 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6758 return error(
"Invalid cmpxchg failure ordering");
6760 const bool IsWeak =
Record[OpNum + 4];
6764 if (NumRecords == (OpNum + 6)) {
6765 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6770 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6772 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6773 FailureOrdering, SSID);
6777 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6778 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6787 const size_t NumRecords =
Record.size();
6790 Value *Ptr =
nullptr;
6792 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6793 return error(
"Invalid atomicrmw record");
6796 return error(
"Invalid atomicrmw record");
6798 Value *Val =
nullptr;
6799 unsigned ValTypeID = InvalidTypeID;
6801 ValTypeID = getContainedTypeID(PtrTypeID);
6802 if (popValue(Record, OpNum, NextValueNo,
6803 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6804 return error(
"Invalid atomicrmw record");
6806 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6807 return error(
"Invalid atomicrmw record");
6810 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6811 return error(
"Invalid atomicrmw record");
6813 bool IsElementwise =
false;
6818 return error(
"Invalid atomicrmw record");
6820 const bool IsVol =
Record[OpNum + 1];
6823 if (Ordering == AtomicOrdering::NotAtomic ||
6824 Ordering == AtomicOrdering::Unordered)
6825 return error(
"Invalid atomicrmw record");
6827 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6831 if (NumRecords == (OpNum + 5)) {
6832 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6838 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6840 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID,
6842 ResTypeID = ValTypeID;
6850 return error(
"Invalid fence record");
6852 if (Ordering == AtomicOrdering::NotAtomic ||
6853 Ordering == AtomicOrdering::Unordered ||
6854 Ordering == AtomicOrdering::Monotonic)
6855 return error(
"Invalid fence record");
6857 I =
new FenceInst(
Context, Ordering, SSID);
6864 SeenDebugRecord =
true;
6867 return error(
"Invalid dbg record: missing instruction");
6870 Inst->
getParent()->insertDbgRecordBefore(
6881 SeenDebugRecord =
true;
6884 return error(
"Invalid dbg record: missing instruction");
6901 DILocalVariable *Var =
6903 DIExpression *Expr =
6916 unsigned SlotBefore =
Slot;
6917 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6918 return error(
"Invalid dbg record: invalid value");
6920 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6923 RawLocation = getFnMetadataByID(Record[Slot++]);
6926 DbgVariableRecord *DVR =
nullptr;
6930 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6931 DbgVariableRecord::LocationType::Value);
6934 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6935 DbgVariableRecord::LocationType::Declare);
6938 DVR =
new DbgVariableRecord(
6939 RawLocation, Var, Expr, DIL,
6940 DbgVariableRecord::LocationType::DeclareValue);
6944 DIExpression *AddrExpr =
6946 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6947 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, ID, Addr, AddrExpr,
6960 return error(
"Invalid call record");
6964 unsigned CCInfo =
Record[OpNum++];
6970 return error(
"Fast math flags indicator set for call with no FMF");
6973 unsigned FTyID = InvalidTypeID;
6974 FunctionType *FTy =
nullptr;
6979 return error(
"Explicit call type is not a function type");
6983 unsigned CalleeTypeID;
6984 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6986 return error(
"Invalid call record");
6990 return error(
"Callee is not a pointer type");
6992 FTyID = getContainedTypeID(CalleeTypeID);
6995 return error(
"Callee is not of pointer to function type");
6997 if (
Record.size() < FTy->getNumParams() + OpNum)
6998 return error(
"Insufficient operands to call");
7000 SmallVector<Value*, 16>
Args;
7001 SmallVector<unsigned, 16> ArgTyIDs;
7003 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
7004 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
7005 if (FTy->getParamType(i)->isLabelTy())
7006 Args.push_back(getBasicBlock(Record[OpNum]));
7009 FTy->getParamType(i), ArgTyID, CurBB));
7012 return error(
"Invalid call record");
7016 if (!FTy->isVarArg()) {
7017 if (OpNum !=
Record.size())
7018 return error(
"Invalid call record");
7020 while (OpNum !=
Record.size()) {
7023 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
7024 return error(
"Invalid call record");
7031 if (!OperandBundles.empty())
7035 ResTypeID = getContainedTypeID(FTyID);
7036 OperandBundles.clear();
7050 SeenDebugIntrinsic =
true;
7053 if (
auto *ListAsValue =
7066 return error(
"Fast-math-flags specified for call without "
7067 "floating-point scalar or vector return type");
7068 I->setFastMathFlags(FMF);
7074 return error(
"Invalid va_arg record");
7075 unsigned OpTyID =
Record[0];
7076 Type *OpTy = getTypeByID(OpTyID);
7079 Type *ResTy = getTypeByID(ResTypeID);
7080 if (!OpTy || !
Op || !ResTy)
7081 return error(
"Invalid va_arg record");
7082 I =
new VAArgInst(
Op, ResTy);
7092 if (
Record.empty() || Record[0] >= BundleTags.size())
7093 return error(
"Invalid operand bundle record");
7095 std::vector<Value *> Inputs;
7098 while (OpNum !=
Record.size()) {
7100 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
7101 return error(
"Invalid operand bundle record");
7102 Inputs.push_back(
Op);
7105 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
7113 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
7114 return error(
"Invalid freeze record");
7115 if (OpNum !=
Record.size())
7116 return error(
"Invalid freeze record");
7118 I =
new FreezeInst(
Op);
7119 ResTypeID = OpTypeID;
7129 return error(
"Invalid instruction with no BB");
7131 if (!OperandBundles.empty()) {
7133 return error(
"Operand bundles found with no consumer");
7135 I->insertInto(CurBB, CurBB->
end());
7138 if (
I->isTerminator()) {
7140 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
7144 if (!
I->getType()->isVoidTy()) {
7145 assert(
I->getType() == getTypeByID(ResTypeID) &&
7146 "Incorrect result type ID");
7154 if (!OperandBundles.empty())
7155 return error(
"Operand bundles found with no consumer");
7159 if (!
A->getParent()) {
7161 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
7167 return error(
"Never resolved value found in function");
7172 if (MDLoader->hasFwdRefs())
7173 return error(
"Invalid function metadata: outgoing forward refs");
7178 for (
const auto &Pair : ConstExprEdgeBBs) {
7189 ValueList.
shrinkTo(ModuleValueListSize);
7190 MDLoader->shrinkTo(ModuleMDLoaderSize);
7191 std::vector<BasicBlock*>().swap(FunctionBBs);
7196Error BitcodeReader::findFunctionInStream(
7198 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
7199 while (DeferredFunctionInfoIterator->second == 0) {
7204 assert(VSTOffset == 0 || !
F->hasName());
7207 if (
Error Err = rememberAndSkipFunctionBodies())
7213SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7216 if (Val >= SSIDs.
size())
7225Error BitcodeReader::materialize(GlobalValue *GV) {
7228 if (!
F || !
F->isMaterializable())
7231 auto DFII = DeferredFunctionInfo.
find(
F);
7232 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7235 if (DFII->second == 0)
7236 if (
Error Err = findFunctionInStream(
F, DFII))
7240 if (
Error Err = materializeMetadata())
7247 if (
Error Err = parseFunctionBody(
F))
7249 F->setIsMaterializable(
false);
7253 if (SeenDebugIntrinsic && SeenDebugRecord)
7254 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7260 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7261 F->setSubprogram(SP);
7264 if (!MDLoader->isStrippingTBAA()) {
7266 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7269 MDLoader->setStripTBAA(
true);
7276 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7277 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7283 unsigned ExpectedNumOperands = 0;
7285 ExpectedNumOperands = 2;
7287 ExpectedNumOperands =
SI->getNumSuccessors();
7289 ExpectedNumOperands = 1;
7293 ExpectedNumOperands = 2;
7300 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7301 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7307 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7308 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7310 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7311 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7312 CI->getArgOperand(ArgNo)->getType(),
7313 CI->getParamAttributes(ArgNo)));
7316 if (
Function *OldFn = CI->getCalledFunction()) {
7317 auto It = UpgradedIntrinsics.
find(OldFn);
7318 if (It != UpgradedIntrinsics.
end())
7322 BC && BC->getSrcTy() == BC->getDestTy() &&
7328 CI && CI->isMustTailCall() && CI->getNextNode() == BC) {
7329 BC->replaceAllUsesWith(CI);
7330 BC->eraseFromParent();
7340 return materializeForwardReferencedFunctions();
7343Error BitcodeReader::materializeModule() {
7344 if (
Error Err = materializeMetadata())
7348 WillMaterializeAllForwardRefs =
true;
7353 if (
Error Err = materialize(&
F))
7359 if (LastFunctionBlockBit || NextUnreadBit)
7361 ? LastFunctionBlockBit
7367 if (!BasicBlockFwdRefs.
empty())
7368 return error(
"Never resolved function from blockaddress");
7374 for (
auto &[OldFn, NewFn] : UpgradedIntrinsics) {
7375 for (User *U : OldFn->users()) {
7379 if (OldFn != NewFn) {
7380 if (!OldFn->use_empty())
7381 OldFn->replaceAllUsesWith(NewFn);
7382 OldFn->eraseFromParent();
7385 UpgradedIntrinsics.clear();
7400std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7401 return IdentifiedStructTypes;
7404ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7405 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7406 StringRef ModulePath, std::function<
bool(StringRef)> IsPrevailing,
7407 std::function<
void(ValueInfo)> OnValueInfo)
7408 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7409 ModulePath(ModulePath), IsPrevailing(IsPrevailing),
7410 OnValueInfo(OnValueInfo) {}
7412void ModuleSummaryIndexBitcodeReader::addThisModule() {
7417ModuleSummaryIndexBitcodeReader::getThisModule() {
7421template <
bool AllowNullValueInfo>
7422std::pair<ValueInfo, GlobalValue::GUID>
7423ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7424 auto VGI = ValueIdToValueInfoMap[ValueId];
7431 assert(AllowNullValueInfo || std::get<0>(VGI));
7435void ModuleSummaryIndexBitcodeReader::setValueGUID(
7437 StringRef SourceFileName) {
7439 if (ValueID < DefinedGUIDs.size())
7440 ValueGUID = DefinedGUIDs[ValueID];
7447 auto OriginalNameID = ValueGUID;
7451 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7459 ValueIdToValueInfoMap[ValueID] = std::make_pair(VI, OriginalNameID);
7467Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7469 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7476 if (!MaybeCurrentBit)
7483 SmallVector<uint64_t, 64>
Record;
7492 BitstreamEntry
Entry = MaybeEntry.
get();
7494 switch (
Entry.Kind) {
7497 return error(
"Malformed block");
7513 switch (MaybeRecord.
get()) {
7518 return error(
"Invalid vst_code_entry record");
7519 unsigned ValueID =
Record[0];
7521 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7522 assert(VLI != ValueIdToLinkageMap.
end() &&
7523 "No linkage found for VST entry?");
7532 return error(
"Invalid vst_code_fnentry record");
7533 unsigned ValueID =
Record[0];
7535 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7536 assert(VLI != ValueIdToLinkageMap.
end() &&
7537 "No linkage found for VST entry?");
7545 unsigned ValueID =
Record[0];
7549 ValueIdToValueInfoMap[ValueID] =
7560Error ModuleSummaryIndexBitcodeReader::parseModule() {
7564 SmallVector<uint64_t, 64>
Record;
7565 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7566 unsigned ValueId = 0;
7570 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
7573 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7575 switch (
Entry.Kind) {
7577 return error(
"Malformed block");
7589 if (
Error Err = readBlockInfo())
7595 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7596 !SeenGlobalValSummary) &&
7597 "Expected early VST parse via VSTOffset record");
7604 if (!SourceFileName.
empty())
7606 assert(!SeenValueSymbolTable &&
7607 "Already read VST when parsing summary block?");
7612 if (VSTOffset > 0) {
7613 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7615 SeenValueSymbolTable =
true;
7617 SeenGlobalValSummary =
true;
7618 if (
Error Err = parseEntireSummary(
Entry.ID))
7622 if (
Error Err = parseModuleStringTable())
7630 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7633 switch (MaybeBitCode.
get()) {
7637 if (
Error Err = parseVersionRecord(Record).takeError())
7645 return error(
"Invalid source filename record");
7652 return error(
"Invalid hash length " + Twine(
Record.size()));
7653 auto &Hash = getThisModule()->second;
7655 for (
auto &Val : Record) {
7656 assert(!(Val >> 32) &&
"Unexpected high bits set");
7664 return error(
"Invalid vstoffset record");
7668 VSTOffset =
Record[0] - 1;
7673 DefinedGUIDs.reserve(DefinedGUIDs.size() +
Record.size() / 2);
7674 for (
size_t i = 0; i <
Record.size(); i += 2)
7675 DefinedGUIDs.push_back(Record[i] << 32 | Record[i + 1]);
7685 ArrayRef<uint64_t> GVRecord;
7686 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7687 if (GVRecord.
size() <= 3)
7688 return error(
"Invalid global record");
7692 ValueIdToLinkageMap[ValueId++] =
Linkage;
7696 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7707ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7711 Ret.
push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7716ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7717 bool IsOldProfileFormat,
7718 bool HasProfile,
bool HasRelBF) {
7722 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7727 for (
unsigned I = 0,
E =
Record.size();
I !=
E; ++
I) {
7729 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7730 if (IsOldProfileFormat) {
7734 }
else if (HasProfile)
7737 else if (HasRelBF) {
7739 bool HasTailCall =
false;
7741 Info.setHasTailCall(HasTailCall);
7771 static_cast<size_t>(
Record[Slot + 1])};
7794 while (Slot <
Record.size())
7798std::vector<FunctionSummary::ParamAccess>
7799ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7800 auto ReadRange = [&]() {
7802 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7804 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7811 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7812 while (!
Record.empty()) {
7813 PendingParamAccesses.emplace_back();
7814 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7816 ParamAccess.
Use = ReadRange();
7821 std::get<0>(getValueInfoFromValueId(
Record.consume_front()));
7822 Call.Offsets = ReadRange();
7825 return PendingParamAccesses;
7828void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7829 ArrayRef<uint64_t> Record,
size_t &Slot,
7832 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7836void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7837 ArrayRef<uint64_t> Record) {
7845 while (Slot <
Record.size())
7846 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7849SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7850 ArrayRef<uint64_t> Record,
unsigned &
I) {
7851 SmallVector<unsigned> StackIdList;
7855 if (RadixArray.empty()) {
7856 unsigned NumStackEntries =
Record[
I++];
7858 StackIdList.
reserve(NumStackEntries);
7859 for (
unsigned J = 0; J < NumStackEntries; J++) {
7860 assert(Record[
I] < StackIds.size());
7861 StackIdList.
push_back(getStackIdIndex(Record[
I++]));
7864 unsigned RadixIndex =
Record[
I++];
7870 assert(RadixIndex < RadixArray.size());
7871 unsigned NumStackIds = RadixArray[RadixIndex++];
7872 StackIdList.
reserve(NumStackIds);
7873 while (NumStackIds--) {
7874 assert(RadixIndex < RadixArray.size());
7875 unsigned Elem = RadixArray[RadixIndex];
7876 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7877 RadixIndex = RadixIndex - Elem;
7878 assert(RadixIndex < RadixArray.size());
7879 Elem = RadixArray[RadixIndex];
7881 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7884 StackIdList.
push_back(getStackIdIndex(Elem));
7894 unsigned FirstWORef = Refs.
size() - WOCnt;
7895 unsigned RefNo = FirstWORef - ROCnt;
7896 for (; RefNo < FirstWORef; ++RefNo)
7897 Refs[RefNo].setReadOnly();
7898 for (; RefNo < Refs.
size(); ++RefNo)
7899 Refs[RefNo].setWriteOnly();
7904Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7907 SmallVector<uint64_t, 64>
Record;
7914 BitstreamEntry
Entry = MaybeEntry.
get();
7917 return error(
"Invalid Summary Block: record for version expected");
7922 return error(
"Invalid Summary Block: version expected");
7925 const bool IsOldProfileFormat =
Version == 1;
7928 const bool MemProfAfterFunctionSummary =
Version >= 13;
7930 return error(
"Invalid summary version " + Twine(
Version) +
" in module '" +
7931 ModulePath +
"'. Version should be in the range [1-" +
7937 GlobalValueSummary *LastSeenSummary =
nullptr;
7947 FunctionSummary *CurrentPrevailingFS =
nullptr;
7952 std::vector<GlobalValue::GUID> PendingTypeTests;
7953 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7954 PendingTypeCheckedLoadVCalls;
7955 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7956 PendingTypeCheckedLoadConstVCalls;
7957 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7959 std::vector<CallsiteInfo> PendingCallsites;
7960 std::vector<AllocInfo> PendingAllocs;
7961 std::vector<uint64_t> PendingContextIds;
7967 BitstreamEntry
Entry = MaybeEntry.
get();
7969 switch (
Entry.Kind) {
7972 return error(
"Malformed block");
7988 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7991 unsigned BitCode = MaybeBitCode.
get();
8008 ValueIdToValueInfoMap[ValueID] =
8026 unsigned ValueID =
Record[0];
8028 unsigned InstCount =
Record[2];
8030 unsigned NumRefs =
Record[3];
8031 unsigned NumRORefs = 0, NumWORefs = 0;
8032 int RefListStartIndex = 4;
8036 RefListStartIndex = 5;
8039 RefListStartIndex = 6;
8042 RefListStartIndex = 7;
8053 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8055 "Record size inconsistent with number of references");
8057 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8062 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8063 IsOldProfileFormat, HasProfile, HasRelBF);
8065 auto [
VI,
GUID] = getValueInfoFromValueId(ValueID);
8072 IsPrevailing(
VI.name());
8078 assert(!MemProfAfterFunctionSummary ||
8079 (PendingCallsites.empty() && PendingAllocs.empty()));
8080 if (!IsPrevailingSym && !MemProfAfterFunctionSummary) {
8081 PendingCallsites.clear();
8082 PendingAllocs.clear();
8085 auto FS = std::make_unique<FunctionSummary>(
8087 std::move(Calls), std::move(PendingTypeTests),
8088 std::move(PendingTypeTestAssumeVCalls),
8089 std::move(PendingTypeCheckedLoadVCalls),
8090 std::move(PendingTypeTestAssumeConstVCalls),
8091 std::move(PendingTypeCheckedLoadConstVCalls),
8092 std::move(PendingParamAccesses), std::move(PendingCallsites),
8093 std::move(PendingAllocs));
8094 FS->setModulePath(getThisModule()->first());
8095 FS->setOriginalName(GUID);
8098 if (MemProfAfterFunctionSummary) {
8099 if (IsPrevailingSym)
8100 CurrentPrevailingFS =
FS.get();
8102 CurrentPrevailingFS =
nullptr;
8111 unsigned ValueID =
Record[0];
8113 unsigned AliaseeID =
Record[2];
8115 auto AS = std::make_unique<AliasSummary>(Flags);
8121 AS->setModulePath(getThisModule()->first());
8123 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
8125 if (!AliaseeInModule)
8126 return error(
"Alias expects aliasee summary to be parsed");
8127 AS->setAliasee(AliaseeVI, AliaseeInModule);
8129 auto GUID = getValueInfoFromValueId(ValueID);
8130 AS->setOriginalName(std::get<1>(GUID));
8136 unsigned ValueID =
Record[0];
8138 unsigned RefArrayStart = 2;
8139 GlobalVarSummary::GVarFlags GVF(
false,
8149 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8151 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8152 FS->setModulePath(getThisModule()->first());
8153 auto GUID = getValueInfoFromValueId(ValueID);
8154 FS->setOriginalName(std::get<1>(GUID));
8162 unsigned ValueID =
Record[0];
8165 unsigned NumRefs =
Record[3];
8166 unsigned RefListStartIndex = 4;
8167 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
8170 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8172 for (
unsigned I = VTableListStartIndex,
E =
Record.size();
I !=
E; ++
I) {
8173 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
8178 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8179 VS->setModulePath(getThisModule()->first());
8180 VS->setVTableFuncs(VTableFuncs);
8181 auto GUID = getValueInfoFromValueId(ValueID);
8182 VS->setOriginalName(std::get<1>(GUID));
8194 unsigned ValueID =
Record[0];
8197 unsigned InstCount =
Record[3];
8199 unsigned NumRefs =
Record[4];
8200 unsigned NumRORefs = 0, NumWORefs = 0;
8201 int RefListStartIndex = 5;
8205 RefListStartIndex = 6;
8206 size_t NumRefsIndex = 5;
8208 unsigned NumRORefsOffset = 1;
8209 RefListStartIndex = 7;
8212 RefListStartIndex = 8;
8214 RefListStartIndex = 9;
8216 NumRORefsOffset = 2;
8219 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
8221 NumRefs =
Record[NumRefsIndex];
8225 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8227 "Record size inconsistent with number of references");
8229 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8232 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8233 IsOldProfileFormat, HasProfile,
false);
8234 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8236 auto FS = std::make_unique<FunctionSummary>(
8238 std::move(Edges), std::move(PendingTypeTests),
8239 std::move(PendingTypeTestAssumeVCalls),
8240 std::move(PendingTypeCheckedLoadVCalls),
8241 std::move(PendingTypeTestAssumeConstVCalls),
8242 std::move(PendingTypeCheckedLoadConstVCalls),
8243 std::move(PendingParamAccesses), std::move(PendingCallsites),
8244 std::move(PendingAllocs));
8245 LastSeenSummary =
FS.get();
8246 if (MemProfAfterFunctionSummary)
8247 CurrentPrevailingFS =
FS.get();
8248 LastSeenGUID =
VI.getGUID();
8249 FS->setModulePath(ModuleIdMap[ModuleId]);
8257 unsigned ValueID =
Record[0];
8260 unsigned AliaseeValueId =
Record[3];
8262 auto AS = std::make_unique<AliasSummary>(Flags);
8263 LastSeenSummary = AS.get();
8264 AS->setModulePath(ModuleIdMap[ModuleId]);
8266 auto AliaseeVI = std::get<0>(
8267 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(AliaseeValueId));
8269 auto AliaseeInModule =
8271 AS->setAliasee(AliaseeVI, AliaseeInModule);
8273 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8274 LastSeenGUID =
VI.getGUID();
8280 unsigned ValueID =
Record[0];
8283 unsigned RefArrayStart = 3;
8284 GlobalVarSummary::GVarFlags GVF(
false,
8294 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8296 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8297 LastSeenSummary =
FS.get();
8298 FS->setModulePath(ModuleIdMap[ModuleId]);
8299 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8300 LastSeenGUID =
VI.getGUID();
8307 if (!LastSeenSummary)
8308 return error(
"Name attachment that does not follow a combined record");
8312 LastSeenSummary =
nullptr;
8317 assert(PendingTypeTests.empty());
8322 assert(PendingTypeTestAssumeVCalls.empty());
8323 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8324 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8328 assert(PendingTypeCheckedLoadVCalls.empty());
8329 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8330 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8334 PendingTypeTestAssumeConstVCalls.push_back(
8339 PendingTypeCheckedLoadConstVCalls.push_back(
8346 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8347 StringRef
Name(Strtab.
data() + Record[
I],
8348 static_cast<size_t>(Record[
I + 1]));
8351 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, GUID);
8354 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8356 StringRef
Name(Strtab.
data() + Record[
I + 1],
8357 static_cast<size_t>(Record[
I + 2]));
8358 CfiFunctionDefs.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8367 for (
unsigned I = 0;
I !=
Record.size();
I += 2) {
8368 StringRef
Name(Strtab.
data() + Record[
I],
8369 static_cast<size_t>(Record[
I + 1]));
8372 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, GUID);
8375 for (
unsigned I = 0;
I !=
Record.size();
I += 3) {
8377 StringRef
Name(Strtab.
data() + Record[
I + 1],
8378 static_cast<size_t>(Record[
I + 2]));
8379 CfiFunctionDecls.addSymbolWithThinLTOGUID(Name, ThinLTOGUID);
8390 parseTypeIdCompatibleVtableSummaryRecord(Record);
8398 PendingParamAccesses = parseParamAccesses(Record);
8405 assert(StackIds.empty());
8407 StackIds = ArrayRef<uint64_t>(Record);
8413 StackIds.reserve(
Record.size() / 2);
8414 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8415 StackIds.push_back(*R << 32 | *(R + 1));
8417 assert(StackIdToIndex.empty());
8419 StackIdToIndex.resize(StackIds.size(), UninitializedStackIdIndex);
8424 RadixArray = ArrayRef<uint64_t>(Record);
8431 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8433 unsigned ValueID =
Record[0];
8434 SmallVector<unsigned> StackIdList;
8436 assert(R < StackIds.size());
8437 StackIdList.
push_back(getStackIdIndex(R));
8439 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8440 if (MemProfAfterFunctionSummary)
8442 CallsiteInfo({
VI, std::move(StackIdList)}));
8444 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8451 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8452 auto RecordIter =
Record.begin();
8453 unsigned ValueID = *RecordIter++;
8454 unsigned NumStackIds = *RecordIter++;
8455 unsigned NumVersions = *RecordIter++;
8456 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8457 SmallVector<unsigned> StackIdList;
8458 for (
unsigned J = 0; J < NumStackIds; J++) {
8459 assert(*RecordIter < StackIds.size());
8460 StackIdList.
push_back(getStackIdIndex(*RecordIter++));
8462 SmallVector<unsigned> Versions;
8463 for (
unsigned J = 0; J < NumVersions; J++)
8465 ValueInfo
VI = std::get<0>(
8466 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8467 if (MemProfAfterFunctionSummary)
8469 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8471 PendingCallsites.push_back(
8472 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8479 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8484 PendingContextIds.reserve(
Record.size() / 2);
8485 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8486 PendingContextIds.push_back(*R << 32 | *(R + 1));
8493 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS) {
8494 PendingContextIds.clear();
8498 std::vector<MIBInfo> MIBs;
8499 unsigned NumMIBs = 0;
8502 unsigned MIBsRead = 0;
8503 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8507 auto StackIdList = parseAllocInfoContext(Record,
I);
8508 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8514 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8516 assert(!PendingContextIds.empty() &&
8517 "Missing context ids for alloc sizes");
8518 unsigned ContextIdIndex = 0;
8524 while (MIBsRead++ < NumMIBs) {
8526 unsigned NumContextSizeInfoEntries =
Record[
I++];
8528 std::vector<ContextTotalSize> ContextSizes;
8529 ContextSizes.reserve(NumContextSizeInfoEntries);
8530 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8531 assert(ContextIdIndex < PendingContextIds.size());
8533 if (PendingContextIds[ContextIdIndex] == 0) {
8542 ContextSizes.push_back(
8543 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8545 AllContextSizes.push_back(std::move(ContextSizes));
8547 PendingContextIds.clear();
8549 AllocInfo AI(std::move(MIBs));
8550 if (!AllContextSizes.empty()) {
8551 assert(AI.MIBs.size() == AllContextSizes.size());
8552 AI.ContextSizeInfos = std::move(AllContextSizes);
8555 if (MemProfAfterFunctionSummary)
8556 CurrentPrevailingFS->
addAlloc(std::move(AI));
8558 PendingAllocs.push_back(std::move(AI));
8566 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8568 std::vector<MIBInfo> MIBs;
8569 unsigned NumMIBs =
Record[
I++];
8570 unsigned NumVersions =
Record[
I++];
8571 unsigned MIBsRead = 0;
8572 while (MIBsRead++ < NumMIBs) {
8575 SmallVector<unsigned> StackIdList;
8577 StackIdList = parseAllocInfoContext(Record,
I);
8578 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8581 SmallVector<uint8_t> Versions;
8582 for (
unsigned J = 0; J < NumVersions; J++)
8585 AllocInfo AI(std::move(Versions), std::move(MIBs));
8586 if (MemProfAfterFunctionSummary)
8587 CurrentPrevailingFS->
addAlloc(std::move(AI));
8589 PendingAllocs.push_back(std::move(AI));
8599Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8603 SmallVector<uint64_t, 64>
Record;
8605 SmallString<128> ModulePath;
8612 BitstreamEntry
Entry = MaybeEntry.
get();
8614 switch (
Entry.Kind) {
8617 return error(
"Malformed block");
8629 switch (MaybeRecord.
get()) {
8637 return error(
"Invalid code_entry record");
8639 LastSeenModule = TheIndex.
addModule(ModulePath);
8640 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8648 return error(
"Invalid hash length " + Twine(
Record.size()));
8649 if (!LastSeenModule)
8650 return error(
"Invalid hash that does not follow a module path");
8652 for (
auto &Val : Record) {
8653 assert(!(Val >> 32) &&
"Unexpected high bits set");
8654 LastSeenModule->
second[Pos++] = Val;
8657 LastSeenModule =
nullptr;
8670class BitcodeErrorCategoryType :
public std::error_category {
8671 const char *
name()
const noexcept
override {
8672 return "llvm.bitcode";
8675 std::string message(
int IE)
const override {
8678 case BitcodeError::CorruptedBitcode:
8679 return "Corrupted bitcode";
8688 static BitcodeErrorCategoryType ErrorCategory;
8689 return ErrorCategory;
8693 unsigned Block,
unsigned RecordID) {
8695 return std::move(Err);
8704 switch (Entry.Kind) {
8709 return error(
"Malformed block");
8713 return std::move(Err);
8723 if (MaybeRecord.
get() == RecordID)
8734Expected<std::vector<BitcodeModule>>
8738 return FOrErr.takeError();
8739 return std::move(FOrErr->Mods);
8764 switch (Entry.Kind) {
8767 return error(
"Malformed block");
8770 uint64_t IdentificationBit = -1ull;
8774 return std::move(Err);
8780 Entry = MaybeEntry.
get();
8785 return error(
"Malformed block");
8791 return std::move(Err);
8810 if (!
I.Strtab.empty())
8817 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8818 F.StrtabForSymtab = *Strtab;
8834 if (
F.Symtab.empty())
8835 F.Symtab = *SymtabOrErr;
8840 return std::move(Err);
8845 return std::move(E);
8860BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8861 bool ShouldLazyLoadMetadata,
bool IsImporting,
8865 std::string ProducerIdentification;
8866 if (IdentificationBit != -1ull) {
8868 return std::move(JumpFailed);
8871 return std::move(
E);
8875 return std::move(JumpFailed);
8876 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8879 std::unique_ptr<Module>
M =
8880 std::make_unique<Module>(ModuleIdentifier,
Context);
8881 M->setMaterializer(R);
8884 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8885 IsImporting, Callbacks))
8886 return std::move(Err);
8888 if (MaterializeAll) {
8890 if (
Error Err =
M->materializeAll())
8891 return std::move(Err);
8894 if (
Error Err =
R->materializeForwardReferencedFunctions())
8895 return std::move(Err);
8898 return std::move(M);
8901Expected<std::unique_ptr<Module>>
8904 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8914 std::function<
bool(
StringRef)> IsPrevailing,
8915 std::function<
void(
ValueInfo)> OnValueInfo) {
8920 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8921 ModulePath, IsPrevailing, OnValueInfo);
8922 return R.parseModule();
8929 return std::move(JumpFailed);
8931 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8932 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8933 ModuleIdentifier, 0);
8935 if (
Error Err = R.parseModule())
8936 return std::move(Err);
8938 return std::move(Index);
8944 return std::move(Err);
8950 return std::move(
E);
8952 switch (Entry.Kind) {
8955 return error(
"Malformed block");
8958 return std::make_pair(
false,
false);
8970 switch (MaybeBitCode.
get()) {
8976 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8978 bool EnableSplitLTOUnit = Flags & 0x8;
8979 bool UnifiedLTO = Flags & 0x200;
8980 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8991 return std::move(JumpFailed);
8994 return std::move(Err);
8999 return std::move(E);
9001 switch (Entry.Kind) {
9003 return error(
"Malformed block");
9014 return Flags.takeError();
9024 return std::move(Err);
9031 return StreamFailed.takeError();
9041 if (MsOrErr->size() != 1)
9042 return error(
"Expected a single module");
9044 return (*MsOrErr)[0];
9047Expected<std::unique_ptr<Module>>
9049 bool ShouldLazyLoadMetadata,
bool IsImporting,
9055 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
9060 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
9061 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
9063 IsImporting, Callbacks);
9065 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
9071 return getModuleImpl(Context,
true,
false,
false, Callbacks);
9083 return BM->parseModule(Context, Callbacks);
9116 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
9125 return BM->getSummary();
9133 return BM->getLTOInfo();
9138 bool IgnoreEmptyThinLTOIndexFile) {
9143 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 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 CalleeInfo getDecodedHotnessCallEdgeInfo(uint64_t RawFlags)
static GlobalVarSummary::GVarFlags getDecodedGVarFlags(uint64_t RawFlags)
static Attribute::AttrKind getAttrFromCode(uint64_t Code)
static Expected< uint64_t > jumpToValueSymbolTable(uint64_t Offset, BitstreamCursor &Stream)
Helper to note and return the current location, and jump to the given offset.
static Expected< bool > hasObjCCategoryInModule(BitstreamCursor &Stream)
static GlobalValue::DLLStorageClassTypes getDecodedDLLStorageClass(unsigned Val)
static GEPNoWrapFlags toGEPNoWrapFlags(uint64_t Flags)
static void decodeLLVMAttributesForBitcode(AttrBuilder &B, uint64_t EncodedAttrs, uint64_t AttrIdx)
This fills an AttrBuilder object with the LLVM attributes that have been decoded from the given integ...
static AtomicRMWInst::BinOp getDecodedRMWOperation(unsigned Val, bool &IsElementwise)
static void parseTypeIdSummaryRecord(ArrayRef< uint64_t > Record, StringRef Strtab, ModuleSummaryIndex &TheIndex)
static void addRawAttributeValue(AttrBuilder &B, uint64_t Val)
static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val)
static bool hasImplicitComdat(size_t Val)
static GlobalValue::LinkageTypes getDecodedLinkage(unsigned Val)
static Error hasInvalidBitcodeHeader(BitstreamCursor &Stream)
static Expected< std::string > readIdentificationCode(BitstreamCursor &Stream)
static int getDecodedBinaryOpcode(unsigned Val, Type *Ty)
static Expected< BitcodeModule > getSingleModule(MemoryBufferRef Buffer)
static Expected< bool > hasObjCCategory(BitstreamCursor &Stream)
static GlobalVariable::ThreadLocalMode getDecodedThreadLocalMode(unsigned Val)
static void parseWholeProgramDevirtResolution(ArrayRef< uint64_t > Record, StringRef Strtab, size_t &Slot, TypeIdSummary &TypeId)
static void inferDSOLocal(GlobalValue *GV)
static FastMathFlags getDecodedFastMathFlags(unsigned Val)
GlobalValue::SanitizerMetadata deserializeSanitizerMetadata(unsigned V)
static Expected< BitstreamCursor > initStream(MemoryBufferRef Buffer)
static cl::opt< bool > ExpandConstantExprs("expand-constant-exprs", cl::Hidden, cl::desc("Expand constant expressions to instructions for testing purposes"))
static bool upgradeOldMemoryAttribute(MemoryEffects &ME, uint64_t EncodedKind)
static Expected< StringRef > readBlobInRecord(BitstreamCursor &Stream, unsigned Block, unsigned RecordID)
static Expected< std::string > readIdentificationBlock(BitstreamCursor &Stream)
Read the "IDENTIFICATION_BLOCK_ID" block, do some basic enforcement on the "epoch" encoded in the bit...
static Expected< std::pair< bool, bool > > getEnableSplitLTOUnitAndUnifiedFlag(BitstreamCursor &Stream, unsigned ID)
static bool isConstExprSupported(const BitcodeConstant *BC)
static int getDecodedCastOpcode(unsigned Val)
static Expected< std::string > readModuleTriple(BitstreamCursor &Stream)
static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_PUSH
#define LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_POP
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static StringRef getOpcodeName(uint8_t Opcode, uint8_t OpcodeBase)
This file defines the DenseMap class.
Provides ErrorOr<T> smart pointer.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Module.h This file contains the declarations for the Module class.
static constexpr Value * getValue(Ty &ValueOrUse)
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Machine Check Debug Module
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
This file contains the declarations for profiling metadata utility functions.
SmallVector< MachineOperand, 4 > Cond
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines the SmallString class.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
PointerType * getType() const
Overload to return most specific pointer type.
void setUsedWithInAlloca(bool V)
Specify whether this alloca is used to represent the arguments to a call.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
static bool isValidFailureOrdering(AtomicOrdering Ordering)
static AtomicOrdering getStrongestFailureOrdering(AtomicOrdering SuccessOrdering)
Returns the strongest permitted ordering on failure, given the desired ordering on success.
static bool isValidSuccessOrdering(AtomicOrdering Ordering)
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
static bool isTypeAttrKind(AttrKind Kind)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
@ None
No attributes have been set.
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
@ EndAttrKinds
Sentinel value useful for loops.
LLVM Basic Block Representation.
const Instruction & back() const
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
LLVM_ABI void replacePhiUsesWith(BasicBlock *Old, BasicBlock *New)
Update all phi nodes in this basic block to refer to basic block New instead of basic block Old.
LLVM_ABI SymbolTableList< BasicBlock >::iterator eraseFromParent()
Unlink 'this' from the containing function and delete it.
void moveBefore(BasicBlock *MovePos)
Unlink this basic block from its current function and insert it into the function that MovePos lives ...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static LLVM_ABI const char * areInvalidOperands(Value *Base, Value *Val, Value *Offset)
Return a string if the specified operands are invalid for a bitinsert operation, otherwise return nul...
static BitInsertInst * Create(Value *Base, Value *Val, Value *Offset, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Represents a module in a bitcode file.
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getSummary()
Parse the specified bitcode buffer, returning the module summary index.
LLVM_ABI Expected< BitcodeLTOInfo > getLTOInfo()
Returns information about the module to be used for LTO: whether to compile with ThinLTO,...
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
LLVM_ABI Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(StringRef)> IsPrevailing=nullptr, std::function< void(ValueInfo)> OnValueInfo=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata, bool IsImporting, ParserCallbacks Callbacks={})
Read the bitcode module and prepare for lazy deserialization of function bodies.
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
void push_back(Value *V, unsigned TypeID)
void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV)
Error assignValue(unsigned Idx, Value *V, unsigned TypeID)
void shrinkTo(unsigned N)
unsigned getTypeID(unsigned ValNo) const
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
ArrayRef< uint8_t > getBitcodeBytes() const
Expected< word_t > Read(unsigned NumBits)
Expected< BitstreamEntry > advance(unsigned Flags=0)
Advance the current bitstream, returning the next entry in the stream.
Expected< BitstreamEntry > advanceSkippingSubblocks(unsigned Flags=0)
This is a convenience function for clients that don't expect any subblocks.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP=nullptr)
Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
Error SkipBlock()
Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body of this block.
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
uint64_t getCurrentByteNo() const
LLVM_ABI Expected< std::optional< BitstreamBlockInfo > > ReadBlockInfoBlock(bool ReadBlockInfoNames=false)
Read and return a block info block from the bitstream.
unsigned getAbbrevIDWidth() const
Return the number of bits used to encode an abbrev #.
bool canSkipToPos(size_t pos) const
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
@ MIN_BYTE_BITS
Minimum number of bits that can be specified.
@ MAX_BYTE_BITS
Maximum number of bits that can be specified Note that bit width is stored in the Type classes Subcla...
static LLVM_ABI ByteType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing a ByteType.
bool isInlineAsm() const
Check if this call is an inline asm statement.
Value * getCalledOperand() const
void setAttributes(AttributeList A)
Set the attributes for this call.
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CaptureInfo createFromIntValue(uint32_t Data)
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
static LLVM_ABI CmpInst * Create(OtherOps Op, Predicate Pred, Value *S1, Value *S2, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Construct a compare instruction, given the opcode, the predicate and the two operands.
bool isFPPredicate() const
bool isIntPredicate() const
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
static CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
static LLVM_ABI bool isElementTypeCompatible(Type *Ty)
Return true if a ConstantDataSequential can be formed with a vector or array of the specified element...
static Constant * getRaw(StringRef Data, uint64_t NumElements, Type *ElementTy)
getRaw() constructor - Return a constant with vector type with an element count and element type matc...
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_SUPPRESS_DEPRECATED_DECLARATIONS_PUSH Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static LLVM_ABI bool isSupportedBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is supported.
static LLVM_ABI bool isSupportedCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is supported.
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
static LLVM_ABI bool isOrderedRanges(ArrayRef< ConstantRange > RangesRef)
LLVM_ABI bool isUpperSignWrapped() const
Return true if the (exclusive) upper bound wraps around the signed domain.
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
static LLVM_ABI Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
static DeadOnReturnInfo createFromIntValue(uint64_t Data)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Base class for error info classes.
virtual std::string message() const
Return the error message as a string.
virtual std::error_code convertToErrorCode() const =0
Convert this error to a std::error_code.
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
Convenience struct for specifying and reasoning about fast-math flags.
void setFast(bool B=true)
void setAllowContract(bool B=true)
void setAllowReciprocal(bool B=true)
void setNoSignedZeros(bool B=true)
void setNoNaNs(bool B=true)
void setAllowReassoc(bool B=true)
Flag setters.
void setApproxFunc(bool B=true)
void setNoInfs(bool B=true)
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
void addCallsite(CallsiteInfo &&Callsite)
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
void addAlloc(AllocInfo &&Alloc)
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
BasicBlockListType::iterator iterator
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags noUnsignedSignedWrap()
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
static LLVM_ABI GlobalIFunc * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Resolver, Module *Parent)
If a parent module is specified, the ifunc is automatically inserted into the end of the specified mo...
LLVM_ABI void setComdat(Comdat *C)
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
void setOriginalName(GlobalValue::GUID Name)
Initialize the original name hash in this summary.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
static bool isLocalLinkage(LinkageTypes Linkage)
void setUnnamedAddr(UnnamedAddr Val)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
bool hasLocalLinkage() const
bool hasDefaultVisibility() const
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
void setDLLStorageClass(DLLStorageClassTypes C)
void setThreadLocalMode(ThreadLocalMode Val)
bool hasExternalWeakLinkage() const
DLLStorageClassTypes
Storage classes of global values for PE targets.
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
void setDSOLocal(bool Local)
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
static LLVM_ABI std::string getGlobalIdentifier(StringRef Name, GlobalValue::LinkageTypes Linkage, StringRef FileName)
Return the modified name for a global value suitable to be used as the key for a global lookup (e....
void setVisibility(VisibilityTypes V)
LLVM_ABI void setSanitizerMetadata(SanitizerMetadata Meta)
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AppendingLinkage
Special purpose, only applies to global arrays.
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
LLVM_ABI void setPartition(StringRef Part)
void setAttributes(AttributeSet A)
Set attribute list for this global.
LLVM_ABI void setCodeModel(CodeModel::Model CM)
Change the code model for this global.
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
LLVM_ABI void addDestination(BasicBlock *Dest)
Add a destination.
static IndirectBrInst * Create(Value *Address, unsigned NumDests, InsertPosition InsertBefore=nullptr)
unsigned getNumDestinations() const
return the number of possible destinations in this indirectbr instruction.
static LLVM_ABI InlineAsm * get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack=false, AsmDialect asmDialect=AD_ATT, bool canThrow=false)
InlineAsm::get - Return the specified uniqued inline asm string.
std::vector< ConstraintInfo > ConstraintInfoVector
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB)
Replace specified successor OldBB to point at the provided block.
const char * getOpcodeName() const
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
@ MIN_INT_BITS
Minimum number of bits that can be specified.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This is an important class for using LLVM in a threaded context.
static LLVM_ABI LandingPadInst * Create(Type *RetTy, unsigned NumReservedClauses, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedClauses is a hint for the number of incoming clauses that this landingpad w...
LLVM_ABI void addClause(Constant *ClauseVal)
Add a catch or filter clause to the landing pad.
void setCleanup(bool V)
Indicate that this landingpad instruction is a cleanup.
LLVM_ABI StringRef getString() const
ValueT lookup(const KeyT &Key) const
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
size_t getBufferSize() const
StringRef getBufferIdentifier() const
const char * getBufferStart() const
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
static MemoryEffectsBase readOnly()
MemoryEffectsBase getWithModRef(Location Loc, ModRefInfo MR) const
Get new MemoryEffectsBase with modified ModRefInfo for Loc.
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
ModRefInfo getModRef(Location Loc) const
Get ModRefInfo for the given Location.
static MemoryEffectsBase errnoMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase createFromIntValue(uint32_t Data)
static MemoryEffectsBase writeOnly()
static MemoryEffectsBase otherMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase none()
static MemoryEffectsBase unknown()
Class to hold module path string table and global value map, and encapsulate methods for operating on...
TypeIdSummary & getOrInsertTypeIdSummary(StringRef TypeId)
Return an existing or new TypeIdSummary entry for TypeId.
ModulePathStringTableTy::value_type ModuleInfo
ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID)
Return a ValueInfo for GUID.
static constexpr uint64_t BitcodeSummaryVersion
StringRef saveString(StringRef String)
LLVM_ABI void setFlags(uint64_t Flags)
CfiFunctionIndex & cfiFunctionDecls()
void addBlockCount(uint64_t C)
ModuleInfo * addModule(StringRef ModPath, ModuleHash Hash=ModuleHash{{0}})
Add a new module with the given Hash, mapped to the given ModID, and return a reference to the module...
void addGlobalValueSummary(const GlobalValue &GV, std::unique_ptr< GlobalValueSummary > Summary)
Add a global value summary for a value.
CfiFunctionIndex & cfiFunctionDefs()
GlobalValueSummary * findSummaryInModule(ValueInfo VI, StringRef ModuleId) const
Find the summary for ValueInfo VI in module ModuleId, or nullptr if not found.
unsigned addOrGetStackIdIndex(uint64_t StackId)
ModuleInfo * getModule(StringRef ModPath)
Return module entry for module with the given ModPath.
void addOriginalName(GlobalValue::GUID ValueGUID, GlobalValue::GUID OrigGUID)
Add an original name for the value of the given GUID.
TypeIdCompatibleVtableInfo & getOrInsertTypeIdCompatibleVtableSummary(StringRef TypeId)
Return an existing or new TypeIdCompatibleVtableMap entry for TypeId.
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
NamedMDNode * getNamedMetadata(StringRef Name) const
Return the first NamedMDNode in the module with the specified name.
NamedMDNode * getOrInsertNamedMetadata(StringRef Name)
Return the named MDNode in the module with the specified name.
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
static ResumeInst * Create(Value *Exn, InsertPosition InsertBefore=nullptr)
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
ArrayRef< int > getShuffleMask() const
void append(StringRef RHS)
Append from a StringRef.
StringRef str() const
Explicit conversion to StringRef.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
constexpr bool empty() const
Check if the string is empty.
constexpr size_t size() const
Get the string size.
constexpr const char * data() const
Get a pointer to the start of the string (which may not be null terminated).
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
LLVM_ABI void setName(StringRef Name)
Change the name of this type to the specified name, or to a name with a suffix if there is a collisio...
LLVM_ABI Error setBodyOrError(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type or return an error if it would make the type recursive.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
LLVM_ABI bool visitTBAAMetadata(const Instruction *I, const MDNode *MD)
Visit an instruction, or a TBAA node itself as part of a metadata, and return true if it is valid,...
@ HasZeroInit
zeroinitializer is valid for this target extension type.
static LLVM_ABI Expected< TargetExtType * > getOrError(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters,...
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM_ABI std::string str() const
Return the twine contents as a std::string.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI Type * getStructElementType(unsigned N) const
bool isVectorTy() const
True if this is an instance of VectorType.
bool isArrayTy() const
True if this is an instance of ArrayType.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
bool isLabelTy() const
Return true if this is 'label'.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
Type * getArrayElementType() const
LLVM_ABI unsigned getStructNumElements() const
LLVM_ABI uint64_t getArrayNumElements() const
bool isSized() const
Return true if it makes sense to take the size of this type.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isStructTy() const
True if this is an instance of StructType.
bool isByteOrByteVectorTy() const
Return true if this is a byte type or a vector of byte types.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Type * getContainedType(unsigned i) const
This method is used to implement the type iterator (defined at the end of the file).
bool isVoidTy() const
Return true if this is 'void'.
bool isMetadataTy() const
Return true if this is 'metadata'.
static LLVM_ABI UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
static UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
const ParentTy * getParent() const
self_iterator getIterator()
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
constexpr uint8_t RecordLength
Length of the parts of a physical GOFF record.
@ BasicBlock
Various leaf nodes.
static const int NoAliasScopeDeclScopeArg
LLVM_ABI AttributeList getAttributes(LLVMContext &C, ID id, FunctionType *FT)
Return the attributes for an intrinsic.
@ SingleThread
Synchronized with respect to signal handlers executing in the same thread.
@ System
Synchronized with respect to all concurrently executing threads.
@ TYPE_CODE_OPAQUE_POINTER
@ FS_CONTEXT_RADIX_TREE_ARRAY
@ FS_COMBINED_GLOBALVAR_INIT_REFS
@ FS_TYPE_CHECKED_LOAD_VCALLS
@ FS_COMBINED_ORIGINAL_NAME
@ FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_CONST_VCALL
@ FS_PERMODULE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_VCALLS
@ FS_COMBINED_ALLOC_INFO_NO_CONTEXT
@ FS_COMBINED_CALLSITE_INFO
@ FS_PERMODULE_CALLSITE_INFO
@ FS_PERMODULE_ALLOC_INFO
@ FS_TYPE_CHECKED_LOAD_CONST_VCALL
@ IDENTIFICATION_CODE_EPOCH
@ IDENTIFICATION_CODE_STRING
@ CST_CODE_CE_INBOUNDS_GEP
@ CST_CODE_INLINEASM_OLD3
@ CST_CODE_CE_GEP_WITH_INRANGE_INDEX_OLD
@ CST_CODE_DSO_LOCAL_EQUIVALENT
@ CST_CODE_INLINEASM_OLD2
@ CST_CODE_CE_GEP_WITH_INRANGE
@ VST_CODE_COMBINED_ENTRY
@ COMDAT_SELECTION_KIND_LARGEST
@ COMDAT_SELECTION_KIND_ANY
@ COMDAT_SELECTION_KIND_SAME_SIZE
@ COMDAT_SELECTION_KIND_EXACT_MATCH
@ COMDAT_SELECTION_KIND_NO_DUPLICATES
@ ATTR_KIND_STACK_PROTECT
@ ATTR_KIND_STACK_PROTECT_STRONG
@ ATTR_KIND_SANITIZE_MEMORY
@ ATTR_KIND_OPTIMIZE_FOR_SIZE
@ ATTR_KIND_INACCESSIBLEMEM_ONLY
@ ATTR_KIND_FNRETTHUNK_EXTERN
@ ATTR_KIND_NO_DIVERGENCE_SOURCE
@ ATTR_KIND_SANITIZE_ADDRESS
@ ATTR_KIND_NO_IMPLICIT_FLOAT
@ ATTR_KIND_DEAD_ON_UNWIND
@ ATTR_KIND_STACK_ALIGNMENT
@ ATTR_KIND_INACCESSIBLEMEM_OR_ARGMEMONLY
@ ATTR_KIND_STACK_PROTECT_REQ
@ ATTR_KIND_NULL_POINTER_IS_VALID
@ ATTR_KIND_SANITIZE_HWADDRESS
@ ATTR_KIND_RETURNS_TWICE
@ ATTR_KIND_SHADOWCALLSTACK
@ ATTR_KIND_OPT_FOR_FUZZING
@ ATTR_KIND_DENORMAL_FPENV
@ ATTR_KIND_SANITIZE_NUMERICAL_STABILITY
@ ATTR_KIND_SANITIZE_CONCURRENCY
@ ATTR_KIND_ALLOCATED_POINTER
@ ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION
@ ATTR_KIND_CORO_ELIDE_SAFE
@ ATTR_KIND_NON_LAZY_BIND
@ ATTR_KIND_DEREFERENCEABLE
@ ATTR_KIND_OPTIMIZE_NONE
@ ATTR_KIND_HYBRID_PATCHABLE
@ ATTR_KIND_DEREFERENCEABLE_OR_NULL
@ ATTR_KIND_SANITIZE_REALTIME
@ ATTR_KIND_SPECULATIVE_LOAD_HARDENING
@ ATTR_KIND_ALWAYS_INLINE
@ ATTR_KIND_SANITIZE_TYPE
@ ATTR_KIND_PRESPLIT_COROUTINE
@ ATTR_KIND_SANITIZE_ALLOC_TOKEN
@ ATTR_KIND_NO_SANITIZE_COVERAGE
@ ATTR_KIND_NO_CREATE_UNDEF_OR_POISON
@ ATTR_KIND_DEAD_ON_RETURN
@ ATTR_KIND_SANITIZE_REALTIME_BLOCKING
@ ATTR_KIND_NO_SANITIZE_BOUNDS
@ ATTR_KIND_SANITIZE_MEMTAG
@ ATTR_KIND_CORO_ONLY_DESTROY_WHEN_COMPLETE
@ ATTR_KIND_SANITIZE_THREAD
@ ATTR_KIND_OPTIMIZE_FOR_DEBUGGING
@ SYNC_SCOPE_NAMES_BLOCK_ID
@ PARAMATTR_GROUP_BLOCK_ID
@ IDENTIFICATION_BLOCK_ID
@ GLOBALVAL_SUMMARY_BLOCK_ID
@ FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID
@ OPERAND_BUNDLE_TAGS_BLOCK_ID
@ BLOCKINFO_BLOCK_ID
BLOCKINFO_BLOCK is used to define metadata about blocks, for example, standard abbrevs that should be...
@ MODULE_CODE_SOURCE_FILENAME
@ MODULE_CODE_SECTIONNAME
@ MODULE_CODE_ASM_PROPERTY
@ FUNC_CODE_INST_ATOMICRMW_OLD
@ FUNC_CODE_INST_CATCHRET
@ FUNC_CODE_INST_LANDINGPAD
@ FUNC_CODE_INST_EXTRACTVAL
@ FUNC_CODE_INST_CATCHPAD
@ FUNC_CODE_INST_CATCHSWITCH
@ FUNC_CODE_INST_INBOUNDS_GEP_OLD
@ FUNC_CODE_INST_STOREATOMIC_OLD
@ FUNC_CODE_INST_CLEANUPRET
@ FUNC_CODE_INST_LANDINGPAD_OLD
@ FUNC_CODE_DEBUG_RECORD_VALUE
@ FUNC_CODE_INST_LOADATOMIC
@ FUNC_CODE_DEBUG_RECORD_ASSIGN
@ FUNC_CODE_INST_STOREATOMIC
@ FUNC_CODE_INST_BITEXTRACT
@ FUNC_CODE_INST_ATOMICRMW
@ FUNC_CODE_DEBUG_RECORD_DECLARE_VALUE
@ FUNC_CODE_DEBUG_LOC_AGAIN
@ FUNC_CODE_INST_EXTRACTELT
@ FUNC_CODE_INST_INDIRECTBR
@ FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE
@ FUNC_CODE_INST_INSERTVAL
@ FUNC_CODE_DECLAREBLOCKS
@ FUNC_CODE_DEBUG_RECORD_LABEL
@ FUNC_CODE_INST_INSERTELT
@ FUNC_CODE_BLOCKADDR_USERS
@ FUNC_CODE_INST_CLEANUPPAD
@ FUNC_CODE_INST_SHUFFLEVEC
@ FUNC_CODE_INST_STORE_OLD
@ FUNC_CODE_INST_UNREACHABLE
@ FUNC_CODE_INST_BITINSERT
@ FUNC_CODE_INST_CMPXCHG_OLD
@ FUNC_CODE_DEBUG_RECORD_DECLARE
@ FUNC_CODE_OPERAND_BUNDLE
@ PARAMATTR_CODE_ENTRY_OLD
@ PARAMATTR_GRP_CODE_ENTRY
initializer< Ty > init(const Ty &Val)
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
NodeAddr< FuncNode * > Func
friend class Instruction
Iterator for Instructions in a `BasicBlock.
constexpr bool IsBigEndianHost
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
StringMapEntry< Value * > ValueName
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
LLVM_ABI const std::error_category & BitcodeErrorCategory()
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
LLVM_ABI void UpgradeInlineAsmString(std::string *AsmStr)
Upgrade comment in call to inline asm that represents an objc retain release marker.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
std::error_code make_error_code(BitcodeError E)
LLVM_ABI bool stripDebugInfo(Function &F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Expected< bool > isBitcodeContainingObjCCategory(MemoryBufferRef Buffer)
Return true if Buffer contains a bitcode file with ObjC code (category or class) in it.
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI void UpgradeAttributes(AttrBuilder &B)
Upgrade attributes that changed format or kind.
LLVM_ABI Expected< std::string > getBitcodeTargetTriple(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the triple information.
LLVM_ABI std::unique_ptr< Module > parseModule(const uint8_t *Data, size_t Size, LLVMContext &Context)
Fuzzer friendly interface for the llvm bitcode parser.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI Expected< BitcodeFileContents > getBitcodeFileContents(MemoryBufferRef Buffer)
Returns the contents of a bitcode file.
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
LLVM_ABI bool UpgradeCFIFunctionsMetadata(Module &M)
Upgrade the cfi.functions metadata node by calculating and inserting the GUID for each function entry...
LLVM_ABI void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
auto uninitialized_copy(R &&Src, IterTy Dst)
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
bool isa_and_nonnull(const Y &Val)
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
LLVM_ABI void UpgradeOperandBundles(std::vector< OperandBundleDef > &OperandBundles)
Upgrade operand bundles (without knowing about their user instruction).
LLVM_ABI Constant * UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy)
This is an auto-upgrade for bitcast constant expression between pointers with different address space...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndex(MemoryBufferRef Buffer)
Parse the specified bitcode buffer, returning the module summary index.
auto dyn_cast_or_null(const Y &Val)
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
LLVM_ABI Expected< std::string > getBitcodeProducerString(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the producer string information.
auto reverse(ContainerTy &&C)
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyBitcodeModule(MemoryBufferRef Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Read the header of the specified bitcode buffer and prepare for lazy deserialization of function bodi...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
detail::ValueMatchesPoly< M > HasValue(M Matcher)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI std::string UpgradeDataLayoutString(StringRef DL, StringRef Triple)
Upgrade the datalayout string by adding a section for address space pointers.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
LLVM_ABI Expected< BitcodeLTOInfo > getBitcodeLTOInfo(MemoryBufferRef Buffer)
Returns LTO information for the specified bitcode file.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI GlobalVariable * UpgradeGlobalVariable(GlobalVariable *GV)
This checks for global variables which should be upgraded.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
AtomicOrdering
Atomic ordering for LLVM's memory model.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
@ ArgMem
Access to memory via argument pointers.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
LLVM_ABI Instruction * UpgradeBitCastInst(unsigned Opc, Value *V, Type *DestTy, Instruction *&Temp)
This is an auto-upgrade for bitcast between pointers with different address spaces: the instruction i...
MaybeAlign decodeMaybeAlign(unsigned Value)
Dual operation of the encode function above.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr, const unsigned char *&BufEnd, bool VerifyBufferSize)
SkipBitcodeWrapperHeader - Some systems wrap bc files with a special header for padding or other reas...
bool isBitcodeWrapper(const unsigned char *BufPtr, const unsigned char *BufEnd)
isBitcodeWrapper - Return true if the given bytes are the magic bytes for an LLVM IR bitcode wrapper.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI APInt readWideAPInt(ArrayRef< uint64_t > Vals, unsigned TypeBits)
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
LLVM_ABI void UpgradeFunctionAttributes(Function &F)
Correct any IR that is relying on old function attribute behavior.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
@ End
Run the machine verifier once, at the end of the pipeline.
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...
Class to accumulate and hold information about a callee.
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