24#include "llvm/Config/llvm-config.h"
54#include "llvm/IR/IntrinsicsAArch64.h"
55#include "llvm/IR/IntrinsicsARM.h"
87#include <system_error>
97 "Print the global id for each value when reading the module summary"));
102 "Expand constant expressions to instructions for testing purposes"));
107 SWITCH_INST_MAGIC = 0x4B5
120 "file too small to contain bitcode header");
121 for (
unsigned C : {
'B',
'C'})
125 "file doesn't start with bitcode header");
127 return Res.takeError();
128 for (
unsigned C : {0x0, 0xC, 0xE, 0xD})
132 "file doesn't start with bitcode header");
134 return Res.takeError();
139 const unsigned char *BufPtr = (
const unsigned char *)Buffer.
getBufferStart();
140 const unsigned char *BufEnd = BufPtr + Buffer.
getBufferSize();
143 return error(
"Invalid bitcode signature");
149 return error(
"Invalid bitcode wrapper header");
153 return std::move(Err);
155 return std::move(Stream);
159template <
typename StrTy>
172 if (
F.isMaterializable())
175 I.setMetadata(LLVMContext::MD_tbaa,
nullptr);
183 return std::move(Err);
188 std::string ProducerIdentification;
195 switch (Entry.Kind) {
198 return error(
"Malformed block");
200 return ProducerIdentification;
211 switch (MaybeBitCode.
get()) {
213 return error(
"Invalid value");
221 Twine(
"Incompatible epoch: Bitcode '") +
Twine(epoch) +
240 switch (Entry.Kind) {
243 return error(
"Malformed block");
251 return std::move(Err);
263 return std::move(Err);
274 switch (Entry.Kind) {
277 return error(
"Malformed block");
289 switch (MaybeRecord.
get()) {
295 return error(
"Invalid section name record");
300 Segment = Segment.trim();
301 Section = Section.trim();
303 if (Segment ==
"__DATA" && Section.starts_with(
"__objc_catlist"))
305 if (Segment ==
"__OBJC" && Section.starts_with(
"__category"))
307 if (Segment ==
"__TEXT" && Section.starts_with(
"__swift"))
325 switch (Entry.Kind) {
327 return error(
"Malformed block");
337 return std::move(Err);
350 return std::move(Err);
363 switch (Entry.Kind) {
366 return error(
"Malformed block");
378 switch (MaybeRecord.
get()) {
383 return error(
"Invalid triple record");
402 switch (Entry.Kind) {
404 return error(
"Malformed block");
414 return std::move(Err);
421 return Skipped.takeError();
428class BitcodeReaderBase {
430 BitcodeReaderBase(BitstreamCursor Stream, StringRef Strtab)
431 : Stream(std::
move(Stream)), Strtab(Strtab) {
432 this->Stream.setBlockInfo(&BlockInfo);
435 BitstreamBlockInfo BlockInfo;
436 BitstreamCursor Stream;
441 bool UseStrtab =
false;
443 Expected<unsigned> parseVersionRecord(ArrayRef<uint64_t> Record);
448 std::pair<StringRef, ArrayRef<uint64_t>>
449 readNameFromStrtab(ArrayRef<uint64_t> Record);
451 Error readBlockInfo();
454 std::string ProducerIdentification;
461Error BitcodeReaderBase::error(
const Twine &Message) {
462 std::string FullMsg = Message.
str();
463 if (!ProducerIdentification.empty())
464 FullMsg +=
" (Producer: '" + ProducerIdentification +
"' Reader: 'LLVM " +
465 LLVM_VERSION_STRING
"')";
466 return ::error(FullMsg);
470BitcodeReaderBase::parseVersionRecord(ArrayRef<uint64_t> Record) {
472 return error(
"Invalid version record");
473 unsigned ModuleVersion =
Record[0];
474 if (ModuleVersion > 2)
475 return error(
"Invalid value");
476 UseStrtab = ModuleVersion >= 2;
477 return ModuleVersion;
480std::pair<StringRef, ArrayRef<uint64_t>>
481BitcodeReaderBase::readNameFromStrtab(ArrayRef<uint64_t> Record) {
485 if (Record[0] + Record[1] > Strtab.
size())
487 return {StringRef(Strtab.
data() + Record[0], Record[1]),
Record.slice(2)};
498class BitcodeConstant final :
public Value,
499 TrailingObjects<BitcodeConstant, unsigned> {
500 friend TrailingObjects;
503 static constexpr uint8_t SubclassID = 255;
511 static constexpr uint8_t ConstantStructOpcode = 255;
512 static constexpr uint8_t ConstantArrayOpcode = 254;
513 static constexpr uint8_t ConstantVectorOpcode = 253;
514 static constexpr uint8_t NoCFIOpcode = 252;
515 static constexpr uint8_t DSOLocalEquivalentOpcode = 251;
516 static constexpr uint8_t BlockAddressOpcode = 250;
517 static constexpr uint8_t ConstantPtrAuthOpcode = 249;
518 static constexpr uint8_t FirstSpecialOpcode = ConstantPtrAuthOpcode;
525 unsigned BlockAddressBB = 0;
526 Type *SrcElemTy =
nullptr;
527 std::optional<ConstantRange>
InRange;
529 ExtraInfo(uint8_t Opcode, uint8_t Flags = 0,
Type *SrcElemTy =
nullptr,
530 std::optional<ConstantRange>
InRange = std::nullopt)
531 : Opcode(Opcode),
Flags(
Flags), SrcElemTy(SrcElemTy),
534 ExtraInfo(uint8_t Opcode, uint8_t Flags,
unsigned BlockAddressBB)
535 : Opcode(Opcode),
Flags(
Flags), BlockAddressBB(BlockAddressBB) {}
540 unsigned NumOperands;
541 unsigned BlockAddressBB;
543 std::optional<ConstantRange>
InRange;
546 BitcodeConstant(
Type *Ty,
const ExtraInfo &Info, ArrayRef<unsigned> OpIDs)
548 NumOperands(OpIDs.
size()), BlockAddressBB(
Info.BlockAddressBB),
553 BitcodeConstant &operator=(
const BitcodeConstant &) =
delete;
557 const ExtraInfo &Info,
558 ArrayRef<unsigned> OpIDs) {
559 void *Mem =
A.Allocate(totalSizeToAlloc<unsigned>(OpIDs.
size()),
560 alignof(BitcodeConstant));
561 return new (Mem) BitcodeConstant(Ty, Info, OpIDs);
564 static bool classof(
const Value *V) {
return V->getValueID() == SubclassID; }
566 ArrayRef<unsigned> getOperandIDs()
const {
567 return ArrayRef(getTrailingObjects(), NumOperands);
570 std::optional<ConstantRange> getInRange()
const {
571 assert(Opcode == Instruction::GetElementPtr);
580class BitcodeReader :
public BitcodeReaderBase,
public GVMaterializer {
582 Module *TheModule =
nullptr;
584 uint64_t NextUnreadBit = 0;
586 uint64_t LastFunctionBlockBit = 0;
587 bool SeenValueSymbolTable =
false;
588 uint64_t VSTOffset = 0;
590 std::vector<std::string> SectionTable;
591 std::vector<std::string> GCTable;
593 std::vector<Type *> TypeList;
597 DenseMap<unsigned, SmallVector<unsigned, 1>> ContainedTypeIDs;
604 DenseMap<std::pair<Type *, unsigned>,
unsigned> VirtualTypeIDs;
605 DenseMap<Function *, unsigned> FunctionTypeIDs;
610 BitcodeReaderValueList ValueList;
611 std::optional<MetadataLoader> MDLoader;
612 std::vector<Comdat *> ComdatList;
613 DenseSet<GlobalObject *> ImplicitComdatObjects;
616 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInits;
617 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInits;
619 struct FunctionOperandInfo {
621 unsigned PersonalityFn;
625 std::vector<FunctionOperandInfo> FunctionOperands;
629 std::vector<AttributeList> MAttributes;
632 std::map<unsigned, AttributeList> MAttributeGroups;
636 std::vector<BasicBlock*> FunctionBBs;
640 std::vector<Function*> FunctionsWithBodies;
644 using UpdatedIntrinsicMap = DenseMap<Function *, Function *>;
645 UpdatedIntrinsicMap UpgradedIntrinsics;
650 bool SeenFirstFunctionBody =
false;
654 DenseMap<Function*, uint64_t> DeferredFunctionInfo;
659 std::vector<uint64_t> DeferredMetadataInfo;
664 DenseMap<Function *, std::vector<BasicBlock *>> BasicBlockFwdRefs;
665 std::deque<Function *> BasicBlockFwdRefQueue;
672 std::vector<Function *> BackwardRefFunctions;
680 bool UseRelativeIDs =
false;
684 bool WillMaterializeAllForwardRefs =
false;
688 bool SeenDebugIntrinsic =
false;
689 bool SeenDebugRecord =
false;
692 TBAAVerifier TBAAVerifyHelper;
694 std::vector<std::string> BundleTags;
697 std::optional<ValueTypeCallbackTy> ValueTypeCallback;
700 BitcodeReader(BitstreamCursor Stream, StringRef Strtab,
701 StringRef ProducerIdentification, LLVMContext &
Context);
703 Error materializeForwardReferencedFunctions();
705 Error materialize(GlobalValue *GV)
override;
706 Error materializeModule()
override;
707 std::vector<StructType *> getIdentifiedStructTypes()
const override;
711 Error parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
712 bool IsImporting, ParserCallbacks Callbacks = {});
714 static uint64_t decodeSignRotatedValue(uint64_t V);
717 Error materializeMetadata()
override;
719 void setStripDebugInfo()
override;
722 std::vector<StructType *> IdentifiedStructTypes;
723 StructType *createIdentifiedStructType(LLVMContext &
Context, StringRef Name);
724 StructType *createIdentifiedStructType(LLVMContext &
Context);
726 static constexpr unsigned InvalidTypeID = ~0
u;
728 Type *getTypeByID(
unsigned ID);
729 Type *getPtrElementTypeByID(
unsigned ID);
730 unsigned getContainedTypeID(
unsigned ID,
unsigned Idx = 0);
731 unsigned getVirtualTypeID(
Type *Ty, ArrayRef<unsigned> ContainedTypeIDs = {});
734 Expected<Value *> materializeValue(
unsigned ValID, BasicBlock *InsertBB);
735 Expected<Constant *> getValueForInitializer(
unsigned ID);
737 Value *getFnValueByID(
unsigned ID,
Type *Ty,
unsigned TyID,
738 BasicBlock *ConstExprInsertBB) {
745 return MDLoader->getMetadataFwdRefOrLoad(
ID);
749 if (
ID >= FunctionBBs.size())
return nullptr;
750 return FunctionBBs[
ID];
754 if (i-1 < MAttributes.size())
755 return MAttributes[i-1];
756 return AttributeList();
762 bool getValueTypePair(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
763 unsigned InstNum,
Value *&ResVal,
unsigned &
TypeID,
764 BasicBlock *ConstExprInsertBB) {
765 if (Slot ==
Record.size())
return true;
766 unsigned ValNo = (unsigned)Record[Slot++];
769 ValNo = InstNum - ValNo;
770 if (ValNo < InstNum) {
774 ResVal = getFnValueByID(ValNo,
nullptr,
TypeID, ConstExprInsertBB);
776 "Incorrect type ID stored for value");
777 return ResVal ==
nullptr;
779 if (Slot ==
Record.size())
782 TypeID = (unsigned)Record[Slot++];
783 ResVal = getFnValueByID(ValNo, getTypeByID(
TypeID),
TypeID,
785 return ResVal ==
nullptr;
788 bool getValueOrMetadata(
const SmallVectorImpl<uint64_t> &Record,
789 unsigned &Slot,
unsigned InstNum,
Value *&ResVal,
790 BasicBlock *ConstExprInsertBB) {
791 if (Slot ==
Record.size())
796 return getValueTypePair(Record, --Slot, InstNum, ResVal, TypeId,
799 if (Slot ==
Record.size())
801 unsigned ValNo = InstNum - (unsigned)Record[Slot++];
809 bool popValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned &Slot,
810 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
811 BasicBlock *ConstExprInsertBB) {
812 if (getValue(Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
820 bool getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
821 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
822 BasicBlock *ConstExprInsertBB) {
823 ResVal = getValue(Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
824 return ResVal ==
nullptr;
829 Value *getValue(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
830 unsigned InstNum,
Type *Ty,
unsigned TyID,
831 BasicBlock *ConstExprInsertBB) {
832 if (Slot ==
Record.size())
return nullptr;
833 unsigned ValNo = (unsigned)Record[Slot];
836 ValNo = InstNum - ValNo;
837 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
841 Value *getValueSigned(
const SmallVectorImpl<uint64_t> &Record,
unsigned Slot,
842 unsigned InstNum,
Type *Ty,
unsigned TyID,
843 BasicBlock *ConstExprInsertBB) {
844 if (Slot ==
Record.size())
return nullptr;
845 unsigned ValNo = (unsigned)decodeSignRotatedValue(Record[Slot]);
848 ValNo = InstNum - ValNo;
849 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
852 Expected<ConstantRange> readConstantRange(ArrayRef<uint64_t> Record,
855 if (
Record.size() - OpNum < 2)
856 return error(
"Too few records for range");
858 unsigned LowerActiveWords =
Record[OpNum];
859 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
860 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
861 return error(
"Too few records for range");
864 OpNum += LowerActiveWords;
867 OpNum += UpperActiveWords;
870 int64_t
Start = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
871 int64_t End = BitcodeReader::decodeSignRotatedValue(Record[OpNum++]);
872 return ConstantRange(APInt(
BitWidth, Start,
true),
877 Expected<ConstantRange>
878 readBitWidthAndConstantRange(ArrayRef<uint64_t> Record,
unsigned &OpNum) {
879 if (
Record.size() - OpNum < 1)
880 return error(
"Too few records for range");
882 return readConstantRange(Record, OpNum,
BitWidth);
888 Error propagateAttributeTypes(CallBase *CB, ArrayRef<unsigned> ArgsTys);
893 Error parseAlignmentValue(uint64_t
Exponent, MaybeAlign &Alignment);
894 Error parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind);
896 ParserCallbacks Callbacks = {});
898 Error parseComdatRecord(ArrayRef<uint64_t> Record);
899 Error parseGlobalVarRecord(ArrayRef<uint64_t> Record);
900 Error parseFunctionRecord(ArrayRef<uint64_t> Record);
901 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
902 ArrayRef<uint64_t> Record);
904 Error parseAttributeBlock();
905 Error parseAttributeGroupBlock();
906 Error parseTypeTable();
907 Error parseTypeTableBody();
908 Error parseOperandBundleTags();
909 Error parseSyncScopeNames();
911 Expected<Value *> recordValue(SmallVectorImpl<uint64_t> &Record,
912 unsigned NameIndex, Triple &TT);
913 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta, Function *
F,
914 ArrayRef<uint64_t> Record);
916 Error parseGlobalValueSymbolTable();
917 Error parseConstants();
918 Error rememberAndSkipFunctionBodies();
919 Error rememberAndSkipFunctionBody();
921 Error rememberAndSkipMetadata();
923 Error parseFunctionBody(Function *
F);
924 Error globalCleanup();
925 Error resolveGlobalAndIndirectSymbolInits();
926 Error parseUseLists();
927 Error findFunctionInStream(
929 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator);
936class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
938 ModuleSummaryIndex &TheIndex;
942 bool SeenGlobalValSummary =
false;
945 bool SeenValueSymbolTable =
false;
949 uint64_t VSTOffset = 0;
959 DenseMap<unsigned, std::pair<ValueInfo, GlobalValue::GUID>>
960 ValueIdToValueInfoMap;
966 DenseMap<uint64_t, StringRef> ModuleIdMap;
969 std::string SourceFileName;
973 StringRef ModulePath;
981 std::vector<uint64_t> StackIds;
985 std::vector<uint64_t> RadixArray;
990 std::vector<unsigned> StackIdToIndex;
993 ModuleSummaryIndexBitcodeReader(
994 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
995 StringRef ModulePath,
1001 void setValueGUID(uint64_t ValueID, StringRef
ValueName,
1003 StringRef SourceFileName);
1004 Error parseValueSymbolTable(
1006 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
1009 makeCallList(ArrayRef<uint64_t> Record,
bool IsOldProfileFormat,
1010 bool HasProfile,
bool HasRelBF);
1011 Error parseEntireSummary(
unsigned ID);
1012 Error parseModuleStringTable();
1013 void parseTypeIdCompatibleVtableSummaryRecord(ArrayRef<uint64_t> Record);
1014 void parseTypeIdCompatibleVtableInfo(ArrayRef<uint64_t> Record,
size_t &Slot,
1016 std::vector<FunctionSummary::ParamAccess>
1017 parseParamAccesses(ArrayRef<uint64_t> Record);
1018 SmallVector<unsigned> parseAllocInfoContext(ArrayRef<uint64_t> Record,
1022 static constexpr unsigned UninitializedStackIdIndex =
1023 std::numeric_limits<unsigned>::max();
1025 unsigned getStackIdIndex(
unsigned LocalIndex) {
1026 unsigned &
Index = StackIdToIndex[LocalIndex];
1029 if (Index == UninitializedStackIdIndex)
1034 template <
bool AllowNullValueInfo = false>
1035 std::pair<ValueInfo, GlobalValue::GUID>
1036 getValueInfoFromValueId(
unsigned ValueId);
1038 void addThisModule();
1054 return std::error_code();
1060 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1061 ValueList(this->Stream.SizeInBytes(),
1063 return materializeValue(
ValID, InsertBB);
1065 this->ProducerIdentification = std::string(ProducerIdentification);
1068Error BitcodeReader::materializeForwardReferencedFunctions() {
1069 if (WillMaterializeAllForwardRefs)
1073 WillMaterializeAllForwardRefs =
true;
1075 while (!BasicBlockFwdRefQueue.empty()) {
1076 Function *
F = BasicBlockFwdRefQueue.front();
1077 BasicBlockFwdRefQueue.pop_front();
1078 assert(
F &&
"Expected valid function");
1079 if (!BasicBlockFwdRefs.
count(
F))
1087 if (!
F->isMaterializable())
1088 return error(
"Never resolved function from blockaddress");
1091 if (
Error Err = materialize(
F))
1094 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1096 for (Function *
F : BackwardRefFunctions)
1097 if (
Error Err = materialize(
F))
1099 BackwardRefFunctions.clear();
1102 WillMaterializeAllForwardRefs =
false;
1167 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1168 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1169 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1170 Flags.NoInline = (RawFlags >> 4) & 0x1;
1171 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1172 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1173 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1174 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1175 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1191 bool NoRenameOnPromotion = ((RawFlags >> 11) & 1);
1192 RawFlags = RawFlags >> 4;
1193 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1197 bool Live = (RawFlags & 0x2) || Version < 3;
1198 bool Local = (RawFlags & 0x4);
1199 bool AutoHide = (RawFlags & 0x8);
1202 Live,
Local, AutoHide, IK,
1203 NoRenameOnPromotion);
1209 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1210 (RawFlags & 0x4) ?
true :
false,
1214static std::pair<CalleeInfo::HotnessType, bool>
1218 bool HasTailCall = (RawFlags & 0x8);
1219 return {Hotness, HasTailCall};
1224 bool &HasTailCall) {
1225 static constexpr unsigned RelBlockFreqBits = 28;
1226 static constexpr uint64_t RelBlockFreqMask = (1 << RelBlockFreqBits) - 1;
1227 RelBF = RawFlags & RelBlockFreqMask;
1228 HasTailCall = (RawFlags & (1 << RelBlockFreqBits));
1253 case 0:
return false;
1254 case 1:
return true;
1316 bool IsFP = Ty->isFPOrFPVectorTy();
1318 if (!IsFP && !Ty->isIntOrIntVectorTy())
1325 return IsFP ? Instruction::FNeg : -1;
1330 bool IsFP = Ty->isFPOrFPVectorTy();
1332 if (!IsFP && !Ty->isIntOrIntVectorTy())
1339 return IsFP ? Instruction::FAdd : Instruction::Add;
1341 return IsFP ? Instruction::FSub : Instruction::Sub;
1343 return IsFP ? Instruction::FMul : Instruction::Mul;
1345 return IsFP ? -1 : Instruction::UDiv;
1347 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1349 return IsFP ? -1 : Instruction::URem;
1351 return IsFP ? Instruction::FRem : Instruction::SRem;
1353 return IsFP ? -1 : Instruction::Shl;
1355 return IsFP ? -1 : Instruction::LShr;
1357 return IsFP ? -1 : Instruction::AShr;
1359 return IsFP ? -1 : Instruction::And;
1361 return IsFP ? -1 : Instruction::Or;
1363 return IsFP ? -1 : Instruction::Xor;
1460Type *BitcodeReader::getTypeByID(
unsigned ID) {
1462 if (
ID >= TypeList.size())
1465 if (
Type *Ty = TypeList[
ID])
1470 return TypeList[
ID] = createIdentifiedStructType(
Context);
1473unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1474 auto It = ContainedTypeIDs.
find(
ID);
1475 if (It == ContainedTypeIDs.
end())
1476 return InvalidTypeID;
1478 if (Idx >= It->second.size())
1479 return InvalidTypeID;
1481 return It->second[Idx];
1484Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1485 if (
ID >= TypeList.size())
1492 return getTypeByID(getContainedTypeID(
ID, 0));
1495unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1496 ArrayRef<unsigned> ChildTypeIDs) {
1497 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1498 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1499 auto It = VirtualTypeIDs.
find(CacheKey);
1500 if (It != VirtualTypeIDs.
end()) {
1506 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1507 "Incorrect cached contained type IDs");
1511 unsigned TypeID = TypeList.size();
1512 TypeList.push_back(Ty);
1513 if (!ChildTypeIDs.
empty())
1534 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1548 if (Opcode == Instruction::GetElementPtr)
1552 case Instruction::FNeg:
1553 case Instruction::Select:
1554 case Instruction::ICmp:
1555 case Instruction::FCmp:
1562Expected<Value *> BitcodeReader::materializeValue(
unsigned StartValID,
1563 BasicBlock *InsertBB) {
1565 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1567 return ValueList[StartValID];
1569 SmallDenseMap<unsigned, Value *> MaterializedValues;
1570 SmallVector<unsigned> Worklist;
1572 while (!Worklist.
empty()) {
1573 unsigned ValID = Worklist.
back();
1574 if (MaterializedValues.
count(ValID)) {
1580 if (ValID >= ValueList.
size() || !ValueList[ValID])
1581 return error(
"Invalid value ID");
1583 Value *
V = ValueList[ValID];
1586 MaterializedValues.
insert({ValID,
V});
1594 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1595 auto It = MaterializedValues.
find(OpID);
1596 if (It != MaterializedValues.
end())
1597 Ops.push_back(It->second);
1604 if (
Ops.size() != BC->getOperandIDs().size())
1606 std::reverse(
Ops.begin(),
Ops.end());
1623 switch (BC->Opcode) {
1624 case BitcodeConstant::ConstantPtrAuthOpcode: {
1627 return error(
"ptrauth key operand must be ConstantInt");
1631 return error(
"ptrauth disc operand must be ConstantInt");
1634 ConstOps.
size() > 4 ? ConstOps[4]
1639 "ptrauth deactivation symbol operand must be a pointer");
1642 DeactivationSymbol);
1645 case BitcodeConstant::NoCFIOpcode: {
1648 return error(
"no_cfi operand must be GlobalValue");
1652 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1655 return error(
"dso_local operand must be GlobalValue");
1659 case BitcodeConstant::BlockAddressOpcode: {
1662 return error(
"blockaddress operand must be a function");
1667 unsigned BBID = BC->BlockAddressBB;
1670 return error(
"Invalid ID");
1673 for (
size_t I = 0,
E = BBID;
I !=
E; ++
I) {
1675 return error(
"Invalid ID");
1682 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1684 BasicBlockFwdRefQueue.push_back(Fn);
1685 if (FwdBBs.size() < BBID + 1)
1686 FwdBBs.resize(BBID + 1);
1694 case BitcodeConstant::ConstantStructOpcode: {
1696 if (
ST->getNumElements() != ConstOps.
size())
1697 return error(
"Invalid number of elements in struct initializer");
1699 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1700 if (
Op->getType() != Ty)
1701 return error(
"Incorrect type in struct initializer");
1706 case BitcodeConstant::ConstantArrayOpcode: {
1708 if (AT->getNumElements() != ConstOps.
size())
1709 return error(
"Invalid number of elements in array initializer");
1711 for (Constant *
Op : ConstOps)
1712 if (
Op->getType() != AT->getElementType())
1713 return error(
"Incorrect type in array initializer");
1718 case BitcodeConstant::ConstantVectorOpcode: {
1720 if (VT->getNumElements() != ConstOps.size())
1721 return error(
"Invalid number of elements in vector initializer");
1723 for (Constant *
Op : ConstOps)
1724 if (
Op->getType() != VT->getElementType())
1725 return error(
"Incorrect type in vector initializer");
1730 case Instruction::GetElementPtr:
1732 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1735 case Instruction::ExtractElement:
1738 case Instruction::InsertElement:
1742 case Instruction::ShuffleVector: {
1743 SmallVector<int, 16>
Mask;
1755 MaterializedValues.
insert({ValID,
C});
1761 return error(Twine(
"Value referenced by initializer is an unsupported "
1762 "constant expression of type ") +
1763 BC->getOpcodeName());
1769 BC->getType(),
"constexpr", InsertBB);
1772 "constexpr", InsertBB);
1775 Ops[1],
"constexpr", InsertBB);
1778 I->setHasNoSignedWrap();
1780 I->setHasNoUnsignedWrap();
1786 switch (BC->Opcode) {
1787 case BitcodeConstant::ConstantVectorOpcode: {
1788 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1791 Value *Idx = ConstantInt::get(IdxTy, Pair.index());
1798 case BitcodeConstant::ConstantStructOpcode:
1799 case BitcodeConstant::ConstantArrayOpcode: {
1803 "constexpr.ins", InsertBB);
1807 case Instruction::ICmp:
1808 case Instruction::FCmp:
1811 "constexpr", InsertBB);
1813 case Instruction::GetElementPtr:
1819 case Instruction::Select:
1822 case Instruction::ExtractElement:
1825 case Instruction::InsertElement:
1829 case Instruction::ShuffleVector:
1830 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1838 MaterializedValues.
insert({ValID,
I});
1842 return MaterializedValues[StartValID];
1845Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1846 Expected<Value *> MaybeV = materializeValue(
ID,
nullptr);
1854StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1857 IdentifiedStructTypes.push_back(Ret);
1861StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1863 IdentifiedStructTypes.push_back(Ret);
1879 case Attribute::ZExt:
return 1 << 0;
1880 case Attribute::SExt:
return 1 << 1;
1881 case Attribute::NoReturn:
return 1 << 2;
1882 case Attribute::InReg:
return 1 << 3;
1883 case Attribute::StructRet:
return 1 << 4;
1884 case Attribute::NoUnwind:
return 1 << 5;
1885 case Attribute::NoAlias:
return 1 << 6;
1886 case Attribute::ByVal:
return 1 << 7;
1887 case Attribute::Nest:
return 1 << 8;
1888 case Attribute::ReadNone:
return 1 << 9;
1889 case Attribute::ReadOnly:
return 1 << 10;
1890 case Attribute::NoInline:
return 1 << 11;
1891 case Attribute::AlwaysInline:
return 1 << 12;
1892 case Attribute::OptimizeForSize:
return 1 << 13;
1893 case Attribute::StackProtect:
return 1 << 14;
1894 case Attribute::StackProtectReq:
return 1 << 15;
1895 case Attribute::Alignment:
return 31 << 16;
1897 case Attribute::NoRedZone:
return 1 << 22;
1898 case Attribute::NoImplicitFloat:
return 1 << 23;
1899 case Attribute::Naked:
return 1 << 24;
1900 case Attribute::InlineHint:
return 1 << 25;
1901 case Attribute::StackAlignment:
return 7 << 26;
1902 case Attribute::ReturnsTwice:
return 1 << 29;
1903 case Attribute::UWTable:
return 1 << 30;
1904 case Attribute::NonLazyBind:
return 1U << 31;
1905 case Attribute::SanitizeAddress:
return 1ULL << 32;
1906 case Attribute::MinSize:
return 1ULL << 33;
1907 case Attribute::NoDuplicate:
return 1ULL << 34;
1908 case Attribute::StackProtectStrong:
return 1ULL << 35;
1909 case Attribute::SanitizeThread:
return 1ULL << 36;
1910 case Attribute::SanitizeMemory:
return 1ULL << 37;
1911 case Attribute::NoBuiltin:
return 1ULL << 38;
1912 case Attribute::Returned:
return 1ULL << 39;
1913 case Attribute::Cold:
return 1ULL << 40;
1914 case Attribute::Builtin:
return 1ULL << 41;
1915 case Attribute::OptimizeNone:
return 1ULL << 42;
1916 case Attribute::InAlloca:
return 1ULL << 43;
1917 case Attribute::NonNull:
return 1ULL << 44;
1918 case Attribute::JumpTable:
return 1ULL << 45;
1919 case Attribute::Convergent:
return 1ULL << 46;
1920 case Attribute::SafeStack:
return 1ULL << 47;
1921 case Attribute::NoRecurse:
return 1ULL << 48;
1924 case Attribute::SwiftSelf:
return 1ULL << 51;
1925 case Attribute::SwiftError:
return 1ULL << 52;
1926 case Attribute::WriteOnly:
return 1ULL << 53;
1927 case Attribute::Speculatable:
return 1ULL << 54;
1928 case Attribute::StrictFP:
return 1ULL << 55;
1929 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1930 case Attribute::NoCfCheck:
return 1ULL << 57;
1931 case Attribute::OptForFuzzing:
return 1ULL << 58;
1932 case Attribute::ShadowCallStack:
return 1ULL << 59;
1933 case Attribute::SpeculativeLoadHardening:
1935 case Attribute::ImmArg:
1937 case Attribute::WillReturn:
1939 case Attribute::NoFree:
1955 if (
I == Attribute::Alignment)
1956 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1957 else if (
I == Attribute::StackAlignment)
1958 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1960 B.addTypeAttr(
I,
nullptr);
1974 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
1976 "Alignment must be a power of two.");
1979 B.addAlignmentAttr(Alignment);
1981 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
1982 (EncodedAttrs & 0xffff);
1984 if (AttrIdx == AttributeList::FunctionIndex) {
1987 if (Attrs & (1ULL << 9)) {
1989 Attrs &= ~(1ULL << 9);
1992 if (Attrs & (1ULL << 10)) {
1994 Attrs &= ~(1ULL << 10);
1997 if (Attrs & (1ULL << 49)) {
1999 Attrs &= ~(1ULL << 49);
2002 if (Attrs & (1ULL << 50)) {
2004 Attrs &= ~(1ULL << 50);
2007 if (Attrs & (1ULL << 53)) {
2009 Attrs &= ~(1ULL << 53);
2013 B.addMemoryAttr(ME);
2017 if (Attrs & (1ULL << 21)) {
2018 Attrs &= ~(1ULL << 21);
2025Error BitcodeReader::parseAttributeBlock() {
2029 if (!MAttributes.empty())
2030 return error(
"Invalid multiple blocks");
2032 SmallVector<uint64_t, 64>
Record;
2041 BitstreamEntry
Entry = MaybeEntry.
get();
2043 switch (
Entry.Kind) {
2046 return error(
"Malformed block");
2059 switch (MaybeRecord.
get()) {
2065 return error(
"Invalid parameter attribute record");
2067 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2073 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2077 for (uint64_t Val : Record)
2078 Attrs.push_back(MAttributeGroups[Val]);
2080 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2093 return Attribute::Alignment;
2095 return Attribute::AlwaysInline;
2097 return Attribute::Builtin;
2099 return Attribute::ByVal;
2101 return Attribute::InAlloca;
2103 return Attribute::Cold;
2105 return Attribute::Convergent;
2107 return Attribute::DisableSanitizerInstrumentation;
2109 return Attribute::ElementType;
2111 return Attribute::FnRetThunkExtern;
2113 return Attribute::InlineHint;
2115 return Attribute::InReg;
2117 return Attribute::JumpTable;
2119 return Attribute::Memory;
2121 return Attribute::NoFPClass;
2123 return Attribute::MinSize;
2125 return Attribute::Naked;
2127 return Attribute::Nest;
2129 return Attribute::NoAlias;
2131 return Attribute::NoBuiltin;
2133 return Attribute::NoCallback;
2135 return Attribute::NoDivergenceSource;
2137 return Attribute::NoDuplicate;
2139 return Attribute::NoFree;
2141 return Attribute::NoImplicitFloat;
2143 return Attribute::NoInline;
2145 return Attribute::NoRecurse;
2147 return Attribute::NoMerge;
2149 return Attribute::NonLazyBind;
2151 return Attribute::NonNull;
2153 return Attribute::Dereferenceable;
2155 return Attribute::DereferenceableOrNull;
2157 return Attribute::AllocAlign;
2159 return Attribute::AllocKind;
2161 return Attribute::AllocSize;
2163 return Attribute::AllocatedPointer;
2165 return Attribute::NoRedZone;
2167 return Attribute::NoReturn;
2169 return Attribute::NoSync;
2171 return Attribute::NoCfCheck;
2173 return Attribute::NoProfile;
2175 return Attribute::SkipProfile;
2177 return Attribute::NoUnwind;
2179 return Attribute::NoSanitizeBounds;
2181 return Attribute::NoSanitizeCoverage;
2183 return Attribute::NullPointerIsValid;
2185 return Attribute::OptimizeForDebugging;
2187 return Attribute::OptForFuzzing;
2189 return Attribute::OptimizeForSize;
2191 return Attribute::OptimizeNone;
2193 return Attribute::ReadNone;
2195 return Attribute::ReadOnly;
2197 return Attribute::Returned;
2199 return Attribute::ReturnsTwice;
2201 return Attribute::SExt;
2203 return Attribute::Speculatable;
2205 return Attribute::StackAlignment;
2207 return Attribute::StackProtect;
2209 return Attribute::StackProtectReq;
2211 return Attribute::StackProtectStrong;
2213 return Attribute::SafeStack;
2215 return Attribute::ShadowCallStack;
2217 return Attribute::StrictFP;
2219 return Attribute::StructRet;
2221 return Attribute::SanitizeAddress;
2223 return Attribute::SanitizeHWAddress;
2225 return Attribute::SanitizeThread;
2227 return Attribute::SanitizeType;
2229 return Attribute::SanitizeMemory;
2231 return Attribute::SanitizeNumericalStability;
2233 return Attribute::SanitizeRealtime;
2235 return Attribute::SanitizeRealtimeBlocking;
2237 return Attribute::SanitizeAllocToken;
2239 return Attribute::SpeculativeLoadHardening;
2241 return Attribute::SwiftError;
2243 return Attribute::SwiftSelf;
2245 return Attribute::SwiftAsync;
2247 return Attribute::UWTable;
2249 return Attribute::VScaleRange;
2251 return Attribute::WillReturn;
2253 return Attribute::WriteOnly;
2255 return Attribute::ZExt;
2257 return Attribute::ImmArg;
2259 return Attribute::SanitizeMemTag;
2261 return Attribute::Preallocated;
2263 return Attribute::NoUndef;
2265 return Attribute::ByRef;
2267 return Attribute::MustProgress;
2269 return Attribute::Hot;
2271 return Attribute::PresplitCoroutine;
2273 return Attribute::Writable;
2275 return Attribute::CoroDestroyOnlyWhenComplete;
2277 return Attribute::DeadOnUnwind;
2279 return Attribute::Range;
2281 return Attribute::Initializes;
2283 return Attribute::CoroElideSafe;
2285 return Attribute::NoExt;
2287 return Attribute::Captures;
2289 return Attribute::DeadOnReturn;
2291 return Attribute::NoCreateUndefOrPoison;
2293 return Attribute::DenormalFPEnv;
2295 return Attribute::NoOutline;
2300 MaybeAlign &Alignment) {
2303 if (
Exponent > Value::MaxAlignmentExponent + 1)
2304 return error(
"Invalid alignment value");
2309Error BitcodeReader::parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind) {
2311 if (*Kind == Attribute::None)
2312 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2317 switch (EncodedKind) {
2341Error BitcodeReader::parseAttributeGroupBlock() {
2345 if (!MAttributeGroups.empty())
2346 return error(
"Invalid multiple blocks");
2348 SmallVector<uint64_t, 64>
Record;
2355 BitstreamEntry
Entry = MaybeEntry.
get();
2357 switch (
Entry.Kind) {
2360 return error(
"Malformed block");
2373 switch (MaybeRecord.
get()) {
2378 return error(
"Invalid grp record");
2380 uint64_t GrpID =
Record[0];
2381 uint64_t Idx =
Record[1];
2385 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2386 if (Record[i] == 0) {
2387 Attribute::AttrKind
Kind;
2388 uint64_t EncodedKind =
Record[++i];
2389 if (Idx == AttributeList::FunctionIndex &&
2398 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2404 if (Kind == Attribute::ByVal)
2405 B.addByValAttr(
nullptr);
2406 else if (Kind == Attribute::StructRet)
2407 B.addStructRetAttr(
nullptr);
2408 else if (Kind == Attribute::InAlloca)
2409 B.addInAllocaAttr(
nullptr);
2410 else if (Kind == Attribute::UWTable)
2411 B.addUWTableAttr(UWTableKind::Default);
2412 else if (Kind == Attribute::DeadOnReturn)
2413 B.addDeadOnReturnAttr(DeadOnReturnInfo());
2414 else if (Attribute::isEnumAttrKind(Kind))
2415 B.addAttribute(Kind);
2417 return error(
"Not an enum attribute");
2418 }
else if (Record[i] == 1) {
2419 Attribute::AttrKind
Kind;
2420 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2422 if (!Attribute::isIntAttrKind(Kind))
2423 return error(
"Not an int attribute");
2424 if (Kind == Attribute::Alignment)
2425 B.addAlignmentAttr(Record[++i]);
2426 else if (Kind == Attribute::StackAlignment)
2427 B.addStackAlignmentAttr(Record[++i]);
2428 else if (Kind == Attribute::Dereferenceable)
2429 B.addDereferenceableAttr(Record[++i]);
2430 else if (Kind == Attribute::DereferenceableOrNull)
2431 B.addDereferenceableOrNullAttr(Record[++i]);
2432 else if (Kind == Attribute::DeadOnReturn)
2433 B.addDeadOnReturnAttr(
2435 else if (Kind == Attribute::AllocSize)
2436 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2437 else if (Kind == Attribute::VScaleRange)
2438 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2439 else if (Kind == Attribute::UWTable)
2441 else if (Kind == Attribute::AllocKind)
2442 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2443 else if (Kind == Attribute::Memory) {
2444 uint64_t EncodedME =
Record[++i];
2445 const uint8_t
Version = (EncodedME >> 56);
2457 B.addMemoryAttr(ME);
2462 EncodedME & 0x00FFFFFFFFFFFFFFULL));
2464 }
else if (Kind == Attribute::Captures)
2466 else if (Kind == Attribute::NoFPClass)
2469 else if (Kind == Attribute::DenormalFPEnv) {
2470 B.addDenormalFPEnvAttr(
2473 }
else if (Record[i] == 3 || Record[i] == 4) {
2475 SmallString<64> KindStr;
2476 SmallString<64> ValStr;
2478 while (Record[i] != 0 && i != e)
2480 assert(Record[i] == 0 &&
"Kind string not null terminated");
2485 while (Record[i] != 0 && i != e)
2487 assert(Record[i] == 0 &&
"Value string not null terminated");
2490 B.addAttribute(KindStr.
str(), ValStr.
str());
2491 }
else if (Record[i] == 5 || Record[i] == 6) {
2492 bool HasType =
Record[i] == 6;
2493 Attribute::AttrKind
Kind;
2494 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2496 if (!Attribute::isTypeAttrKind(Kind))
2497 return error(
"Not a type attribute");
2499 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2500 }
else if (Record[i] == 7) {
2501 Attribute::AttrKind
Kind;
2504 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2506 if (!Attribute::isConstantRangeAttrKind(Kind))
2507 return error(
"Not a ConstantRange attribute");
2509 Expected<ConstantRange> MaybeCR =
2510 readBitWidthAndConstantRange(Record, i);
2515 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2516 }
else if (Record[i] == 8) {
2517 Attribute::AttrKind
Kind;
2520 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2522 if (!Attribute::isConstantRangeListAttrKind(Kind))
2523 return error(
"Not a constant range list attribute");
2527 return error(
"Too few records for constant range list");
2528 unsigned RangeSize =
Record[i++];
2530 for (
unsigned Idx = 0; Idx < RangeSize; ++Idx) {
2531 Expected<ConstantRange> MaybeCR =
2532 readConstantRange(Record, i,
BitWidth);
2540 return error(
"Invalid (unordered or overlapping) range list");
2541 B.addConstantRangeListAttr(Kind, Val);
2543 return error(
"Invalid attribute group entry");
2548 B.addMemoryAttr(ME);
2551 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2558Error BitcodeReader::parseTypeTable() {
2562 return parseTypeTableBody();
2565Error BitcodeReader::parseTypeTableBody() {
2566 if (!TypeList.empty())
2567 return error(
"Invalid multiple blocks");
2569 SmallVector<uint64_t, 64>
Record;
2570 unsigned NumRecords = 0;
2579 BitstreamEntry
Entry = MaybeEntry.
get();
2581 switch (
Entry.Kind) {
2584 return error(
"Malformed block");
2586 if (NumRecords != TypeList.size())
2587 return error(
"Malformed block");
2596 Type *ResultTy =
nullptr;
2597 SmallVector<unsigned> ContainedIDs;
2601 switch (MaybeRecord.
get()) {
2603 return error(
"Invalid value");
2608 return error(
"Invalid numentry record");
2609 TypeList.resize(Record[0]);
2612 ResultTy = Type::getVoidTy(
Context);
2615 ResultTy = Type::getHalfTy(
Context);
2618 ResultTy = Type::getBFloatTy(
Context);
2621 ResultTy = Type::getFloatTy(
Context);
2624 ResultTy = Type::getDoubleTy(
Context);
2627 ResultTy = Type::getX86_FP80Ty(
Context);
2630 ResultTy = Type::getFP128Ty(
Context);
2633 ResultTy = Type::getPPC_FP128Ty(
Context);
2636 ResultTy = Type::getLabelTy(
Context);
2639 ResultTy = Type::getMetadataTy(
Context);
2647 ResultTy = Type::getX86_AMXTy(
Context);
2650 ResultTy = Type::getTokenTy(
Context);
2654 return error(
"Invalid integer record");
2656 uint64_t NumBits =
Record[0];
2659 return error(
"Bitwidth for integer type out of range");
2666 return error(
"Invalid pointer record");
2670 ResultTy = getTypeByID(Record[0]);
2672 !PointerType::isValidElementType(ResultTy))
2673 return error(
"Invalid type");
2680 return error(
"Invalid opaque pointer record");
2689 return error(
"Invalid function record");
2691 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2692 if (
Type *
T = getTypeByID(Record[i]))
2698 ResultTy = getTypeByID(Record[2]);
2699 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2700 return error(
"Invalid type");
2703 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2709 return error(
"Invalid function record");
2711 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2712 if (
Type *
T = getTypeByID(Record[i])) {
2713 if (!FunctionType::isValidArgumentType(
T))
2714 return error(
"Invalid function argument type");
2721 ResultTy = getTypeByID(Record[1]);
2722 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2723 return error(
"Invalid type");
2726 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2731 return error(
"Invalid anon struct record");
2733 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2734 if (
Type *
T = getTypeByID(Record[i]))
2740 return error(
"Invalid type");
2747 return error(
"Invalid struct name record");
2752 return error(
"Invalid named struct record");
2754 if (NumRecords >= TypeList.size())
2755 return error(
"Invalid TYPE table");
2761 TypeList[NumRecords] =
nullptr;
2763 Res = createIdentifiedStructType(
Context, TypeName);
2767 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2768 if (
Type *
T = getTypeByID(Record[i]))
2774 return error(
"Invalid named struct record");
2783 return error(
"Invalid opaque type record");
2785 if (NumRecords >= TypeList.size())
2786 return error(
"Invalid TYPE table");
2792 TypeList[NumRecords] =
nullptr;
2794 Res = createIdentifiedStructType(
Context, TypeName);
2801 return error(
"Invalid target extension type record");
2803 if (NumRecords >= TypeList.size())
2804 return error(
"Invalid TYPE table");
2806 if (Record[0] >=
Record.size())
2807 return error(
"Too many type parameters");
2809 unsigned NumTys =
Record[0];
2811 SmallVector<unsigned, 8> IntParams;
2812 for (
unsigned i = 0; i < NumTys; i++) {
2813 if (
Type *
T = getTypeByID(Record[i + 1]))
2816 return error(
"Invalid type");
2819 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2820 if (Record[i] > UINT_MAX)
2821 return error(
"Integer parameter too large");
2826 if (
auto E = TTy.takeError())
2834 return error(
"Invalid array type record");
2835 ResultTy = getTypeByID(Record[1]);
2836 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2837 return error(
"Invalid type");
2839 ResultTy = ArrayType::get(ResultTy, Record[0]);
2844 return error(
"Invalid vector type record");
2846 return error(
"Invalid vector length");
2847 ResultTy = getTypeByID(Record[1]);
2848 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2849 return error(
"Invalid type");
2852 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2856 if (NumRecords >= TypeList.size())
2857 return error(
"Invalid TYPE table");
2858 if (TypeList[NumRecords])
2860 "Invalid TYPE table: Only named structs can be forward referenced");
2861 assert(ResultTy &&
"Didn't read a type?");
2862 TypeList[NumRecords] = ResultTy;
2863 if (!ContainedIDs.
empty())
2864 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2869Error BitcodeReader::parseOperandBundleTags() {
2873 if (!BundleTags.empty())
2874 return error(
"Invalid multiple blocks");
2876 SmallVector<uint64_t, 64>
Record;
2882 BitstreamEntry
Entry = MaybeEntry.
get();
2884 switch (
Entry.Kind) {
2887 return error(
"Malformed block");
2901 return error(
"Invalid operand bundle record");
2904 BundleTags.emplace_back();
2906 return error(
"Invalid operand bundle record");
2911Error BitcodeReader::parseSyncScopeNames() {
2916 return error(
"Invalid multiple synchronization scope names blocks");
2918 SmallVector<uint64_t, 64>
Record;
2923 BitstreamEntry
Entry = MaybeEntry.
get();
2925 switch (
Entry.Kind) {
2928 return error(
"Malformed block");
2931 return error(
"Invalid empty synchronization scope names block");
2945 return error(
"Invalid sync scope record");
2947 SmallString<16> SSN;
2949 return error(
"Invalid sync scope record");
2957Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
2958 unsigned NameIndex, Triple &TT) {
2961 return error(
"Invalid record");
2962 unsigned ValueID =
Record[0];
2963 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2964 return error(
"Invalid record");
2965 Value *
V = ValueList[ValueID];
2968 if (NameStr.contains(0))
2969 return error(
"Invalid value name");
2970 V->setName(NameStr);
2972 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
2985 return std::move(JumpFailed);
2991 return error(
"Expected value symbol table subblock");
2995void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
2997 ArrayRef<uint64_t> Record) {
3001 uint64_t FuncWordOffset =
Record[1] - 1;
3002 uint64_t FuncBitOffset = FuncWordOffset * 32;
3003 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
3007 if (FuncBitOffset > LastFunctionBlockBit)
3008 LastFunctionBlockBit = FuncBitOffset;
3012Error BitcodeReader::parseGlobalValueSymbolTable() {
3013 unsigned FuncBitcodeOffsetDelta =
3019 SmallVector<uint64_t, 64>
Record;
3024 BitstreamEntry
Entry = MaybeEntry.
get();
3026 switch (
Entry.Kind) {
3029 return error(
"Malformed block");
3040 switch (MaybeRecord.
get()) {
3042 unsigned ValueID =
Record[0];
3043 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3044 return error(
"Invalid value reference in symbol table");
3045 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3055Error BitcodeReader::parseValueSymbolTable(uint64_t
Offset) {
3056 uint64_t CurrentBit;
3062 if (!MaybeCurrentBit)
3064 CurrentBit = MaybeCurrentBit.
get();
3067 if (
Error Err = parseGlobalValueSymbolTable())
3088 unsigned FuncBitcodeOffsetDelta =
3094 SmallVector<uint64_t, 64>
Record;
3105 BitstreamEntry
Entry = MaybeEntry.
get();
3107 switch (
Entry.Kind) {
3110 return error(
"Malformed block");
3126 switch (MaybeRecord.
get()) {
3130 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3138 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3146 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3151 return error(
"Invalid bbentry record");
3154 return error(
"Invalid bbentry record");
3166uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {
3176Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3177 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3178 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3179 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3181 GlobalInitWorklist.swap(GlobalInits);
3182 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3183 FunctionOperandWorklist.swap(FunctionOperands);
3185 while (!GlobalInitWorklist.empty()) {
3186 unsigned ValID = GlobalInitWorklist.back().second;
3187 if (ValID >= ValueList.
size()) {
3189 GlobalInits.push_back(GlobalInitWorklist.back());
3191 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3194 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3196 GlobalInitWorklist.pop_back();
3199 while (!IndirectSymbolInitWorklist.empty()) {
3200 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3201 if (ValID >= ValueList.
size()) {
3202 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3204 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3208 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3211 return error(
"Alias and aliasee types don't match");
3216 return error(
"Expected an alias or an ifunc");
3219 IndirectSymbolInitWorklist.pop_back();
3222 while (!FunctionOperandWorklist.empty()) {
3223 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3224 if (
Info.PersonalityFn) {
3225 unsigned ValID =
Info.PersonalityFn - 1;
3226 if (ValID < ValueList.
size()) {
3227 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3230 Info.F->setPersonalityFn(MaybeC.
get());
3231 Info.PersonalityFn = 0;
3235 unsigned ValID =
Info.Prefix - 1;
3236 if (ValID < ValueList.
size()) {
3237 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3240 Info.F->setPrefixData(MaybeC.
get());
3244 if (
Info.Prologue) {
3245 unsigned ValID =
Info.Prologue - 1;
3246 if (ValID < ValueList.
size()) {
3247 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3250 Info.F->setPrologueData(MaybeC.
get());
3254 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3255 FunctionOperands.push_back(Info);
3256 FunctionOperandWorklist.pop_back();
3265 BitcodeReader::decodeSignRotatedValue);
3267 return APInt(TypeBits, Words);
3270Error BitcodeReader::parseConstants() {
3278 unsigned Int32TyID = getVirtualTypeID(CurTy);
3279 unsigned CurTyID = Int32TyID;
3280 Type *CurElemTy =
nullptr;
3281 unsigned NextCstNo = ValueList.
size();
3289 switch (Entry.Kind) {
3292 return error(
"Malformed block");
3294 if (NextCstNo != ValueList.
size())
3295 return error(
"Invalid constant reference");
3306 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
3309 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3319 return error(
"Invalid settype record");
3320 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3321 return error(
"Invalid settype record");
3322 if (TypeList[Record[0]] == VoidType)
3323 return error(
"Invalid constant type");
3325 CurTy = TypeList[CurTyID];
3326 CurElemTy = getPtrElementTypeByID(CurTyID);
3330 return error(
"Invalid type for a constant null value");
3333 return error(
"Invalid type for a constant null value");
3338 return error(
"Invalid integer const record");
3343 return error(
"Invalid wide integer const record");
3346 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3347 V = ConstantInt::get(CurTy, VInt);
3352 return error(
"Invalid float const record");
3355 if (ScalarTy->isHalfTy())
3356 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3357 APInt(16, (uint16_t)Record[0])));
3358 else if (ScalarTy->isBFloatTy())
3359 V = ConstantFP::get(
3360 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3361 else if (ScalarTy->isFloatTy())
3362 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3363 APInt(32, (uint32_t)Record[0])));
3364 else if (ScalarTy->isDoubleTy())
3365 V = ConstantFP::get(
3366 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3367 else if (ScalarTy->isX86_FP80Ty()) {
3369 uint64_t Rearrange[2];
3370 Rearrange[0] = (
Record[1] & 0xffffLL) | (Record[0] << 16);
3371 Rearrange[1] =
Record[0] >> 48;
3372 V = ConstantFP::get(
3373 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3374 }
else if (ScalarTy->isFP128Ty())
3375 V = ConstantFP::get(CurTy,
3376 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3377 else if (ScalarTy->isPPC_FP128Ty())
3378 V = ConstantFP::get(
3379 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3387 return error(
"Invalid aggregate record");
3389 SmallVector<unsigned, 16> Elts;
3393 V = BitcodeConstant::create(
3394 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3396 V = BitcodeConstant::create(
Alloc, CurTy,
3397 BitcodeConstant::ConstantArrayOpcode, Elts);
3399 V = BitcodeConstant::create(
3400 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3409 return error(
"Invalid string record");
3418 return error(
"Invalid data record");
3422 EltTy =
Array->getElementType();
3432 SmallVector<uint16_t, 16> Elts(
Record.begin(),
Record.end());
3438 SmallVector<uint32_t, 16> Elts(
Record.begin(),
Record.end());
3444 SmallVector<uint64_t, 16> Elts(
Record.begin(),
Record.end());
3450 SmallVector<uint16_t, 16> Elts(
Record.begin(),
Record.end());
3456 SmallVector<uint16_t, 16> Elts(
Record.begin(),
Record.end());
3462 SmallVector<uint32_t, 16> Elts(
Record.begin(),
Record.end());
3468 SmallVector<uint64_t, 16> Elts(
Record.begin(),
Record.end());
3474 return error(
"Invalid type for value");
3480 return error(
"Invalid unary op constexpr record");
3485 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3491 return error(
"Invalid binary op constexpr record");
3497 if (
Record.size() >= 4) {
3498 if (
Opc == Instruction::Add ||
3499 Opc == Instruction::Sub ||
3500 Opc == Instruction::Mul ||
3501 Opc == Instruction::Shl) {
3506 }
else if (
Opc == Instruction::SDiv ||
3507 Opc == Instruction::UDiv ||
3508 Opc == Instruction::LShr ||
3509 Opc == Instruction::AShr) {
3514 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3515 {(unsigned)Record[1], (
unsigned)
Record[2]});
3521 return error(
"Invalid cast constexpr record");
3526 unsigned OpTyID =
Record[1];
3527 Type *OpTy = getTypeByID(OpTyID);
3529 return error(
"Invalid cast constexpr record");
3530 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3542 return error(
"Constant GEP record must have at least two elements");
3544 Type *PointeeType =
nullptr;
3548 PointeeType = getTypeByID(Record[OpNum++]);
3551 std::optional<ConstantRange>
InRange;
3555 unsigned InRangeIndex =
Op >> 1;
3561 Expected<ConstantRange> MaybeInRange =
3562 readBitWidthAndConstantRange(Record, OpNum);
3571 SmallVector<unsigned, 16> Elts;
3572 unsigned BaseTypeID =
Record[OpNum];
3573 while (OpNum !=
Record.size()) {
3574 unsigned ElTyID =
Record[OpNum++];
3575 Type *ElTy = getTypeByID(ElTyID);
3577 return error(
"Invalid getelementptr constexpr record");
3581 if (Elts.
size() < 1)
3582 return error(
"Invalid gep with no operands");
3586 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3587 BaseType = getTypeByID(BaseTypeID);
3592 return error(
"GEP base operand must be pointer or vector of pointer");
3595 PointeeType = getPtrElementTypeByID(BaseTypeID);
3597 return error(
"Missing element type for old-style constant GEP");
3600 V = BitcodeConstant::create(
3602 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3608 return error(
"Invalid select constexpr record");
3610 V = BitcodeConstant::create(
3611 Alloc, CurTy, Instruction::Select,
3612 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3618 return error(
"Invalid extractelement constexpr record");
3619 unsigned OpTyID =
Record[0];
3623 return error(
"Invalid extractelement constexpr record");
3625 if (
Record.size() == 4) {
3626 unsigned IdxTyID =
Record[2];
3627 Type *IdxTy = getTypeByID(IdxTyID);
3629 return error(
"Invalid extractelement constexpr record");
3635 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3636 {(unsigned)Record[1], IdxRecord});
3642 if (
Record.size() < 3 || !OpTy)
3643 return error(
"Invalid insertelement constexpr record");
3645 if (
Record.size() == 4) {
3646 unsigned IdxTyID =
Record[2];
3647 Type *IdxTy = getTypeByID(IdxTyID);
3649 return error(
"Invalid insertelement constexpr record");
3655 V = BitcodeConstant::create(
3656 Alloc, CurTy, Instruction::InsertElement,
3657 {(unsigned)Record[0], (
unsigned)
Record[1], IdxRecord});
3662 if (
Record.size() < 3 || !OpTy)
3663 return error(
"Invalid shufflevector constexpr record");
3664 V = BitcodeConstant::create(
3665 Alloc, CurTy, Instruction::ShuffleVector,
3666 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2]});
3673 if (
Record.size() < 4 || !RTy || !OpTy)
3674 return error(
"Invalid shufflevector constexpr record");
3675 V = BitcodeConstant::create(
3676 Alloc, CurTy, Instruction::ShuffleVector,
3677 {(unsigned)Record[1], (
unsigned)
Record[2], (unsigned)Record[3]});
3682 return error(
"Invalid cmp constexpt record");
3683 unsigned OpTyID =
Record[0];
3684 Type *OpTy = getTypeByID(OpTyID);
3686 return error(
"Invalid cmp constexpr record");
3687 V = BitcodeConstant::create(
3690 : Instruction::ICmp),
3691 (uint8_t)Record[3]},
3692 {(unsigned)Record[1], (
unsigned)
Record[2]});
3699 return error(
"Invalid inlineasm record");
3700 std::string AsmStr, ConstrStr;
3701 bool HasSideEffects =
Record[0] & 1;
3702 bool IsAlignStack =
Record[0] >> 1;
3703 unsigned AsmStrSize =
Record[1];
3704 if (2+AsmStrSize >=
Record.size())
3705 return error(
"Invalid inlineasm record");
3706 unsigned ConstStrSize =
Record[2+AsmStrSize];
3707 if (3+AsmStrSize+ConstStrSize >
Record.size())
3708 return error(
"Invalid inlineasm record");
3710 for (
unsigned i = 0; i != AsmStrSize; ++i)
3711 AsmStr += (
char)
Record[2+i];
3712 for (
unsigned i = 0; i != ConstStrSize; ++i)
3713 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3716 return error(
"Missing element type for old-style inlineasm");
3718 HasSideEffects, IsAlignStack);
3725 return error(
"Invalid inlineasm record");
3726 std::string AsmStr, ConstrStr;
3727 bool HasSideEffects =
Record[0] & 1;
3728 bool IsAlignStack = (
Record[0] >> 1) & 1;
3729 unsigned AsmDialect =
Record[0] >> 2;
3730 unsigned AsmStrSize =
Record[1];
3731 if (2+AsmStrSize >=
Record.size())
3732 return error(
"Invalid inlineasm record");
3733 unsigned ConstStrSize =
Record[2+AsmStrSize];
3734 if (3+AsmStrSize+ConstStrSize >
Record.size())
3735 return error(
"Invalid inlineasm record");
3737 for (
unsigned i = 0; i != AsmStrSize; ++i)
3738 AsmStr += (
char)
Record[2+i];
3739 for (
unsigned i = 0; i != ConstStrSize; ++i)
3740 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3743 return error(
"Missing element type for old-style inlineasm");
3745 HasSideEffects, IsAlignStack,
3752 return error(
"Invalid inlineasm record");
3754 std::string AsmStr, ConstrStr;
3755 bool HasSideEffects =
Record[OpNum] & 1;
3756 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3757 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3758 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3760 unsigned AsmStrSize =
Record[OpNum];
3762 if (OpNum + AsmStrSize >=
Record.size())
3763 return error(
"Invalid inlineasm record");
3764 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3765 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3766 return error(
"Invalid inlineasm record");
3768 for (
unsigned i = 0; i != AsmStrSize; ++i)
3769 AsmStr += (
char)
Record[OpNum + i];
3771 for (
unsigned i = 0; i != ConstStrSize; ++i)
3772 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3775 return error(
"Missing element type for old-style inlineasm");
3777 HasSideEffects, IsAlignStack,
3784 return error(
"Invalid inlineasm record");
3789 return error(
"Invalid inlineasm record");
3790 std::string AsmStr, ConstrStr;
3791 bool HasSideEffects =
Record[OpNum] & 1;
3792 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3793 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3794 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3796 unsigned AsmStrSize =
Record[OpNum];
3798 if (OpNum + AsmStrSize >=
Record.size())
3799 return error(
"Invalid inlineasm record");
3800 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3801 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3802 return error(
"Invalid inlineasm record");
3804 for (
unsigned i = 0; i != AsmStrSize; ++i)
3805 AsmStr += (
char)
Record[OpNum + i];
3807 for (
unsigned i = 0; i != ConstStrSize; ++i)
3808 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3810 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3816 return error(
"Invalid blockaddress record");
3817 unsigned FnTyID =
Record[0];
3818 Type *FnTy = getTypeByID(FnTyID);
3820 return error(
"Invalid blockaddress record");
3821 V = BitcodeConstant::create(
3823 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3829 return error(
"Invalid dso_local record");
3830 unsigned GVTyID =
Record[0];
3831 Type *GVTy = getTypeByID(GVTyID);
3833 return error(
"Invalid dso_local record");
3834 V = BitcodeConstant::create(
3835 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3840 return error(
"Invalid no_cfi record");
3841 unsigned GVTyID =
Record[0];
3842 Type *GVTy = getTypeByID(GVTyID);
3844 return error(
"Invalid no_cfi record");
3845 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3851 return error(
"Invalid ptrauth record");
3853 V = BitcodeConstant::create(
Alloc, CurTy,
3854 BitcodeConstant::ConstantPtrAuthOpcode,
3855 {(unsigned)Record[0], (
unsigned)
Record[1],
3856 (unsigned)Record[2], (
unsigned)
Record[3]});
3861 return error(
"Invalid ptrauth record");
3863 V = BitcodeConstant::create(
3864 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3865 {(unsigned)Record[0], (
unsigned)
Record[1], (unsigned)Record[2],
3866 (
unsigned)
Record[3], (unsigned)Record[4]});
3871 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3878Error BitcodeReader::parseUseLists() {
3883 SmallVector<uint64_t, 64>
Record;
3889 BitstreamEntry
Entry = MaybeEntry.
get();
3891 switch (
Entry.Kind) {
3894 return error(
"Malformed block");
3908 switch (MaybeRecord.
get()) {
3916 if (RecordLength < 3)
3918 return error(
"Invalid uselist record");
3919 unsigned ID =
Record.pop_back_val();
3923 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3924 V = FunctionBBs[
ID];
3928 if (!
V->hasUseList())
3931 unsigned NumUses = 0;
3932 SmallDenseMap<const Use *, unsigned, 16> Order;
3933 for (
const Use &U :
V->materialized_uses()) {
3934 if (++NumUses >
Record.size())
3936 Order[&
U] =
Record[NumUses - 1];
3943 V->sortUseList([&](
const Use &L,
const Use &R) {
3954Error BitcodeReader::rememberAndSkipMetadata() {
3957 DeferredMetadataInfo.push_back(CurBit);
3965Error BitcodeReader::materializeMetadata() {
3966 for (uint64_t BitPos : DeferredMetadataInfo) {
3970 if (
Error Err = MDLoader->parseModuleMetadata())
3979 NamedMDNode *LinkerOpts =
3981 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
3986 DeferredMetadataInfo.clear();
3990void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
3994Error BitcodeReader::rememberAndSkipFunctionBody() {
3996 if (FunctionsWithBodies.empty())
3997 return error(
"Insufficient function protos");
3999 Function *Fn = FunctionsWithBodies.back();
4000 FunctionsWithBodies.pop_back();
4005 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
4006 "Mismatch between VST and scanned function offsets");
4007 DeferredFunctionInfo[Fn] = CurBit;
4015Error BitcodeReader::globalCleanup() {
4017 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4019 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
4020 return error(
"Malformed global initializer set");
4024 for (Function &
F : *TheModule) {
4025 MDLoader->upgradeDebugIntrinsics(
F);
4028 UpgradedIntrinsics[&
F] = NewFn;
4034 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4035 for (GlobalVariable &GV : TheModule->globals())
4037 UpgradedVariables.emplace_back(&GV, Upgraded);
4038 for (
auto &Pair : UpgradedVariables) {
4039 Pair.first->eraseFromParent();
4040 TheModule->insertGlobalVariable(Pair.second);
4045 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4046 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4054Error BitcodeReader::rememberAndSkipFunctionBodies() {
4059 return error(
"Could not find function in stream");
4061 if (!SeenFirstFunctionBody)
4062 return error(
"Trying to materialize functions before seeing function blocks");
4066 assert(SeenValueSymbolTable);
4069 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4072 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4074 switch (
Entry.Kind) {
4076 return error(
"Expect SubBlock");
4080 return error(
"Expect function block");
4082 if (
Error Err = rememberAndSkipFunctionBody())
4091Error BitcodeReaderBase::readBlockInfo() {
4092 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4094 if (!MaybeNewBlockInfo)
4096 std::optional<BitstreamBlockInfo> NewBlockInfo =
4097 std::move(MaybeNewBlockInfo.
get());
4099 return error(
"Malformed block");
4100 BlockInfo = std::move(*NewBlockInfo);
4104Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4108 std::tie(Name, Record) = readNameFromStrtab(Record);
4111 return error(
"Invalid comdat record");
4113 std::string OldFormatName;
4116 return error(
"Invalid comdat record");
4117 unsigned ComdatNameSize =
Record[1];
4118 if (ComdatNameSize >
Record.size() - 2)
4119 return error(
"Comdat name size too large");
4120 OldFormatName.reserve(ComdatNameSize);
4121 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4122 OldFormatName += (
char)
Record[2 + i];
4123 Name = OldFormatName;
4125 Comdat *
C = TheModule->getOrInsertComdat(Name);
4126 C->setSelectionKind(SK);
4127 ComdatList.push_back(
C);
4141 Meta.NoAddress =
true;
4143 Meta.NoHWAddress =
true;
4147 Meta.IsDynInit =
true;
4151Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4159 std::tie(Name, Record) = readNameFromStrtab(Record);
4162 return error(
"Invalid global variable record");
4163 unsigned TyID =
Record[0];
4164 Type *Ty = getTypeByID(TyID);
4166 return error(
"Invalid global variable record");
4168 bool explicitType =
Record[1] & 2;
4174 return error(
"Invalid type for value");
4176 TyID = getContainedTypeID(TyID);
4177 Ty = getTypeByID(TyID);
4179 return error(
"Missing element type for old-style global");
4182 uint64_t RawLinkage =
Record[3];
4184 MaybeAlign Alignment;
4185 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4189 if (Record[5] - 1 >= SectionTable.size())
4190 return error(
"Invalid ID");
4199 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4207 bool ExternallyInitialized =
false;
4209 ExternallyInitialized =
Record[9];
4211 GlobalVariable *NewGV =
4221 if (
Record.size() > 10) {
4233 if (
unsigned InitID = Record[2])
4234 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4236 if (
Record.size() > 11) {
4237 if (
unsigned ComdatID = Record[11]) {
4238 if (ComdatID > ComdatList.size())
4239 return error(
"Invalid global variable comdat ID");
4240 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4243 ImplicitComdatObjects.
insert(NewGV);
4246 if (
Record.size() > 12) {
4251 if (
Record.size() > 13) {
4260 if (
Record.size() > 16 && Record[16]) {
4261 llvm::GlobalValue::SanitizerMetadata
Meta =
4266 if (
Record.size() > 17 && Record[17]) {
4270 return error(
"Invalid global variable code model");
4276void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4277 if (ValueTypeCallback) {
4278 (*ValueTypeCallback)(
4279 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4280 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4284Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4290 std::tie(Name, Record) = readNameFromStrtab(Record);
4293 return error(
"Invalid function record");
4294 unsigned FTyID =
Record[0];
4295 Type *FTy = getTypeByID(FTyID);
4297 return error(
"Invalid function record");
4299 FTyID = getContainedTypeID(FTyID, 0);
4300 FTy = getTypeByID(FTyID);
4302 return error(
"Missing element type for old-style function");
4306 return error(
"Invalid type for value");
4307 auto CC =
static_cast<CallingConv::ID
>(
Record[1]);
4308 if (CC & ~CallingConv::MaxID)
4309 return error(
"Invalid calling convention ID");
4311 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4317 AddrSpace, Name, TheModule);
4320 "Incorrect fully specified type provided for function");
4321 FunctionTypeIDs[
Func] = FTyID;
4323 Func->setCallingConv(CC);
4324 bool isProto =
Record[2];
4325 uint64_t RawLinkage =
Record[3];
4328 callValueTypeCallback(Func, FTyID);
4333 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4334 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4335 Attribute::InAlloca}) {
4336 if (!
Func->hasParamAttribute(i, Kind))
4339 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4342 Func->removeParamAttr(i, Kind);
4344 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4345 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4347 return error(
"Missing param element type for attribute upgrade");
4351 case Attribute::ByVal:
4352 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4354 case Attribute::StructRet:
4355 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4357 case Attribute::InAlloca:
4358 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4364 Func->addParamAttr(i, NewAttr);
4368 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4369 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4370 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4371 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4373 return error(
"Missing param element type for x86_intrcc upgrade");
4375 Func->addParamAttr(0, NewAttr);
4378 MaybeAlign Alignment;
4379 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4382 Func->setAlignment(*Alignment);
4384 if (Record[6] - 1 >= SectionTable.size())
4385 return error(
"Invalid ID");
4386 Func->setSection(SectionTable[Record[6] - 1]);
4390 if (!
Func->hasLocalLinkage())
4392 if (
Record.size() > 8 && Record[8]) {
4393 if (Record[8] - 1 >= GCTable.size())
4394 return error(
"Invalid ID");
4395 Func->setGC(GCTable[Record[8] - 1]);
4400 Func->setUnnamedAddr(UnnamedAddr);
4402 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4404 OperandInfo.Prologue =
Record[10];
4406 if (
Record.size() > 11) {
4408 if (!
Func->hasLocalLinkage()) {
4415 if (
Record.size() > 12) {
4416 if (
unsigned ComdatID = Record[12]) {
4417 if (ComdatID > ComdatList.size())
4418 return error(
"Invalid function comdat ID");
4419 Func->setComdat(ComdatList[ComdatID - 1]);
4422 ImplicitComdatObjects.
insert(Func);
4426 OperandInfo.Prefix =
Record[13];
4429 OperandInfo.PersonalityFn =
Record[14];
4431 if (
Record.size() > 15) {
4441 Record[17] + Record[18] <= Strtab.
size()) {
4442 Func->setPartition(StringRef(Strtab.
data() + Record[17], Record[18]));
4445 if (
Record.size() > 19) {
4446 MaybeAlign PrefAlignment;
4447 if (
Error Err = parseAlignmentValue(Record[19], PrefAlignment))
4449 Func->setPreferredAlignment(PrefAlignment);
4452 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4454 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4455 FunctionOperands.push_back(OperandInfo);
4460 Func->setIsMaterializable(
true);
4461 FunctionsWithBodies.push_back(Func);
4462 DeferredFunctionInfo[
Func] = 0;
4467Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4468 unsigned BitCode, ArrayRef<uint64_t> Record) {
4478 std::tie(Name, Record) = readNameFromStrtab(Record);
4481 if (
Record.size() < (3 + (
unsigned)NewRecord))
4482 return error(
"Invalid global indirect symbol record");
4487 return error(
"Invalid global indirect symbol record");
4493 return error(
"Invalid type for value");
4494 AddrSpace = PTy->getAddressSpace();
4496 Ty = getTypeByID(
TypeID);
4498 return error(
"Missing element type for old-style indirect symbol");
4500 AddrSpace =
Record[OpNum++];
4503 auto Val =
Record[OpNum++];
4512 nullptr, TheModule);
4516 if (OpNum !=
Record.size()) {
4517 auto VisInd = OpNum++;
4523 if (OpNum !=
Record.size()) {
4524 auto S =
Record[OpNum++];
4531 if (OpNum !=
Record.size())
4533 if (OpNum !=
Record.size())
4536 if (OpNum !=
Record.size())
4541 if (OpNum + 1 <
Record.size()) {
4543 if (Record[OpNum] + Record[OpNum + 1] > Strtab.
size())
4544 return error(
"Malformed partition, too large.");
4546 StringRef(Strtab.
data() + Record[OpNum], Record[OpNum + 1]));
4550 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4554Error BitcodeReader::parseModule(uint64_t ResumeBit,
4555 bool ShouldLazyLoadMetadata,
4556 ParserCallbacks Callbacks) {
4557 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4564 SmallVector<uint64_t, 64>
Record;
4568 bool ResolvedDataLayout =
false;
4573 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4575 auto ResolveDataLayout = [&]() ->
Error {
4576 if (ResolvedDataLayout)
4580 ResolvedDataLayout =
true;
4584 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4588 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4589 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4590 TentativeDataLayoutStr = *LayoutOverride;
4598 TheModule->setDataLayout(MaybeDL.
get());
4604 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
4607 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4609 switch (
Entry.Kind) {
4611 return error(
"Malformed block");
4613 if (
Error Err = ResolveDataLayout())
4615 return globalCleanup();
4624 if (
Error Err = readBlockInfo())
4628 if (
Error Err = parseAttributeBlock())
4632 if (
Error Err = parseAttributeGroupBlock())
4636 if (
Error Err = parseTypeTable())
4640 if (!SeenValueSymbolTable) {
4646 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4647 if (
Error Err = parseValueSymbolTable())
4649 SeenValueSymbolTable =
true;
4659 if (
Error Err = parseConstants())
4661 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4665 if (ShouldLazyLoadMetadata) {
4666 if (
Error Err = rememberAndSkipMetadata())
4670 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4671 if (
Error Err = MDLoader->parseModuleMetadata())
4675 if (
Error Err = MDLoader->parseMetadataKinds())
4679 if (
Error Err = ResolveDataLayout())
4684 if (!SeenFirstFunctionBody) {
4685 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4686 if (
Error Err = globalCleanup())
4688 SeenFirstFunctionBody =
true;
4691 if (VSTOffset > 0) {
4695 if (!SeenValueSymbolTable) {
4696 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4698 SeenValueSymbolTable =
true;
4720 if (
Error Err = rememberAndSkipFunctionBody())
4727 if (SeenValueSymbolTable) {
4731 return globalCleanup();
4735 if (
Error Err = parseUseLists())
4739 if (
Error Err = parseOperandBundleTags())
4743 if (
Error Err = parseSyncScopeNames())
4755 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
4758 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4761 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4764 UseRelativeIDs = *VersionOrErr >= 1;
4768 if (ResolvedDataLayout)
4769 return error(
"target triple too late in module");
4772 return error(
"Invalid triple record");
4773 TheModule->setTargetTriple(Triple(std::move(S)));
4777 if (ResolvedDataLayout)
4778 return error(
"datalayout too late in module");
4780 return error(
"Invalid data layout record");
4786 return error(
"Invalid asm record");
4787 TheModule->setModuleInlineAsm(S);
4794 return error(
"Invalid deplib record");
4801 return error(
"Invalid section name record");
4802 SectionTable.push_back(S);
4808 return error(
"Invalid gcname record");
4809 GCTable.push_back(S);
4813 if (
Error Err = parseComdatRecord(Record))
4822 if (
Error Err = parseGlobalVarRecord(Record))
4826 if (
Error Err = ResolveDataLayout())
4828 if (
Error Err = parseFunctionRecord(Record))
4834 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4840 return error(
"Invalid vstoffset record");
4844 VSTOffset =
Record[0] - 1;
4850 return error(
"Invalid source filename record");
4851 TheModule->setSourceFileName(
ValueName);
4856 this->ValueTypeCallback = std::nullopt;
4860Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4862 ParserCallbacks Callbacks) {
4864 MetadataLoaderCallbacks MDCallbacks;
4865 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4867 return getContainedTypeID(
I, J);
4870 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4871 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4874Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4876 return error(
"Load/Store operand is not a pointer type");
4877 if (!PointerType::isLoadableOrStorableType(ValType))
4878 return error(
"Cannot load/store from pointer");
4882Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4883 ArrayRef<unsigned> ArgTyIDs) {
4885 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4886 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4887 Attribute::InAlloca}) {
4888 if (!
Attrs.hasParamAttr(i, Kind) ||
4889 Attrs.getParamAttr(i, Kind).getValueAsType())
4892 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4894 return error(
"Missing element type for typed attribute upgrade");
4898 case Attribute::ByVal:
4899 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4901 case Attribute::StructRet:
4902 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4904 case Attribute::InAlloca:
4905 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4918 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
4922 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
4923 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4925 return error(
"Missing element type for inline asm upgrade");
4928 Attribute::get(
Context, Attribute::ElementType, ElemTy));
4936 case Intrinsic::preserve_array_access_index:
4937 case Intrinsic::preserve_struct_access_index:
4938 case Intrinsic::aarch64_ldaxr:
4939 case Intrinsic::aarch64_ldxr:
4940 case Intrinsic::aarch64_stlxr:
4941 case Intrinsic::aarch64_stxr:
4942 case Intrinsic::arm_ldaex:
4943 case Intrinsic::arm_ldrex:
4944 case Intrinsic::arm_stlex:
4945 case Intrinsic::arm_strex: {
4948 case Intrinsic::aarch64_stlxr:
4949 case Intrinsic::aarch64_stxr:
4950 case Intrinsic::arm_stlex:
4951 case Intrinsic::arm_strex:
4958 if (!
Attrs.getParamElementType(ArgNo)) {
4959 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4961 return error(
"Missing element type for elementtype upgrade");
4976Error BitcodeReader::parseFunctionBody(Function *
F) {
4981 if (MDLoader->hasFwdRefs())
4982 return error(
"Invalid function metadata: incoming forward references");
4984 InstructionList.
clear();
4985 unsigned ModuleValueListSize = ValueList.
size();
4986 unsigned ModuleMDLoaderSize = MDLoader->size();
4990 unsigned FTyID = FunctionTypeIDs[
F];
4991 for (Argument &
I :
F->args()) {
4992 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
4993 assert(
I.getType() == getTypeByID(ArgTyID) &&
4994 "Incorrect fully specified type for Function Argument");
4998 unsigned NextValueNo = ValueList.
size();
5000 unsigned CurBBNo = 0;
5005 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
5009 auto getLastInstruction = [&]() -> Instruction * {
5010 if (CurBB && !CurBB->
empty())
5011 return &CurBB->
back();
5012 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
5013 !FunctionBBs[CurBBNo - 1]->
empty())
5014 return &FunctionBBs[CurBBNo - 1]->back();
5018 std::vector<OperandBundleDef> OperandBundles;
5021 SmallVector<uint64_t, 64>
Record;
5024 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
5027 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
5029 switch (
Entry.Kind) {
5031 return error(
"Malformed block");
5033 goto OutOfRecordLoop;
5042 if (
Error Err = parseConstants())
5044 NextValueNo = ValueList.
size();
5047 if (
Error Err = parseValueSymbolTable())
5051 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5055 assert(DeferredMetadataInfo.empty() &&
5056 "Must read all module-level metadata before function-level");
5057 if (
Error Err = MDLoader->parseFunctionMetadata())
5061 if (
Error Err = parseUseLists())
5075 unsigned ResTypeID = InvalidTypeID;
5076 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
5079 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5081 return error(
"Invalid value");
5083 if (
Record.empty() || Record[0] == 0)
5084 return error(
"Invalid declareblocks record");
5086 FunctionBBs.resize(Record[0]);
5089 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5090 if (BBFRI == BasicBlockFwdRefs.
end()) {
5091 for (BasicBlock *&BB : FunctionBBs)
5094 auto &BBRefs = BBFRI->second;
5096 if (BBRefs.size() > FunctionBBs.size())
5097 return error(
"Invalid ID");
5098 assert(!BBRefs.empty() &&
"Unexpected empty array");
5099 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5100 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5102 if (
I < RE && BBRefs[
I]) {
5103 BBRefs[
I]->insertInto(
F);
5104 FunctionBBs[
I] = BBRefs[
I];
5110 BasicBlockFwdRefs.
erase(BBFRI);
5113 CurBB = FunctionBBs[0];
5120 return error(
"Invalid blockaddr users record");
5134 for (uint64_t ValID : Record)
5136 BackwardRefFunctions.push_back(
F);
5138 return error(
"Invalid blockaddr users record");
5145 I = getLastInstruction();
5148 return error(
"Invalid debug_loc_again record");
5149 I->setDebugLoc(LastLoc);
5154 I = getLastInstruction();
5156 return error(
"Invalid debug loc record");
5161 uint64_t AtomGroup =
Record.size() == 7 ?
Record[5] : 0;
5164 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5167 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5169 return error(
"Invalid debug loc record");
5173 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5175 return error(
"Invalid debug loc record");
5178 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5179 isImplicitCode, AtomGroup, AtomRank);
5180 I->setDebugLoc(LastLoc);
5188 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5190 return error(
"Invalid unary operator record");
5194 return error(
"Invalid unary operator record");
5198 if (OpNum <
Record.size()) {
5202 I->setFastMathFlags(FMF);
5211 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5215 return error(
"Invalid binary operator record");
5219 return error(
"Invalid binary operator record");
5223 if (OpNum <
Record.size()) {
5224 if (
Opc == Instruction::Add ||
5225 Opc == Instruction::Sub ||
5226 Opc == Instruction::Mul ||
5227 Opc == Instruction::Shl) {
5232 }
else if (
Opc == Instruction::SDiv ||
5233 Opc == Instruction::UDiv ||
5234 Opc == Instruction::LShr ||
5235 Opc == Instruction::AShr) {
5238 }
else if (
Opc == Instruction::Or) {
5244 I->setFastMathFlags(FMF);
5253 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5254 OpNum + 1 >
Record.size())
5255 return error(
"Invalid cast record");
5257 ResTypeID =
Record[OpNum++];
5258 Type *ResTy = getTypeByID(ResTypeID);
5261 if (
Opc == -1 || !ResTy)
5262 return error(
"Invalid cast record");
5267 assert(CurBB &&
"No current BB?");
5273 return error(
"Invalid cast");
5277 if (OpNum <
Record.size()) {
5278 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5281 }
else if (
Opc == Instruction::Trunc) {
5290 I->setFastMathFlags(FMF);
5309 Ty = getTypeByID(TyID);
5313 TyID = InvalidTypeID;
5318 unsigned BasePtrTypeID;
5319 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5321 return error(
"Invalid gep record");
5324 TyID = getContainedTypeID(BasePtrTypeID);
5325 if (
BasePtr->getType()->isVectorTy())
5326 TyID = getContainedTypeID(TyID);
5327 Ty = getTypeByID(TyID);
5330 SmallVector<Value*, 16> GEPIdx;
5331 while (OpNum !=
Record.size()) {
5334 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5335 return error(
"Invalid gep record");
5346 unsigned SubType = 0;
5347 if (GTI.isStruct()) {
5349 Idx->getType()->isVectorTy()
5351 :
cast<ConstantInt>(Idx);
5354 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5361 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5362 if (
I->getType()->isVectorTy())
5363 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5366 GEP->setNoWrapFlags(NW);
5375 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5376 return error(
"Invalid extractvalue record");
5379 unsigned RecSize =
Record.size();
5380 if (OpNum == RecSize)
5381 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5383 SmallVector<unsigned, 4> EXTRACTVALIdx;
5384 ResTypeID = AggTypeID;
5385 for (; OpNum != RecSize; ++OpNum) {
5390 if (!IsStruct && !IsArray)
5391 return error(
"EXTRACTVAL: Invalid type");
5392 if ((
unsigned)Index != Index)
5393 return error(
"Invalid value");
5395 return error(
"EXTRACTVAL: Invalid struct index");
5397 return error(
"EXTRACTVAL: Invalid array index");
5398 EXTRACTVALIdx.
push_back((
unsigned)Index);
5402 ResTypeID = getContainedTypeID(ResTypeID, Index);
5405 ResTypeID = getContainedTypeID(ResTypeID);
5419 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5420 return error(
"Invalid insertvalue record");
5423 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5424 return error(
"Invalid insertvalue record");
5426 unsigned RecSize =
Record.size();
5427 if (OpNum == RecSize)
5428 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5430 SmallVector<unsigned, 4> INSERTVALIdx;
5432 for (; OpNum != RecSize; ++OpNum) {
5437 if (!IsStruct && !IsArray)
5438 return error(
"INSERTVAL: Invalid type");
5439 if ((
unsigned)Index != Index)
5440 return error(
"Invalid value");
5442 return error(
"INSERTVAL: Invalid struct index");
5444 return error(
"INSERTVAL: Invalid array index");
5446 INSERTVALIdx.
push_back((
unsigned)Index);
5454 return error(
"Inserted value type doesn't match aggregate type");
5457 ResTypeID = AggTypeID;
5469 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5471 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5473 popValue(Record, OpNum, NextValueNo, CondType,
5474 getVirtualTypeID(CondType),
Cond, CurBB))
5475 return error(
"Invalid select record");
5488 unsigned ValTypeID, CondTypeID;
5489 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5491 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5493 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5494 return error(
"Invalid vector select record");
5497 if (VectorType* vector_type =
5500 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5501 return error(
"Invalid type for value");
5505 return error(
"Invalid type for value");
5509 ResTypeID = ValTypeID;
5514 I->setFastMathFlags(FMF);
5522 unsigned VecTypeID, IdxTypeID;
5523 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5524 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5525 return error(
"Invalid extractelement record");
5527 return error(
"Invalid type for value");
5529 ResTypeID = getContainedTypeID(VecTypeID);
5536 Value *Vec, *Elt, *Idx;
5537 unsigned VecTypeID, IdxTypeID;
5538 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5539 return error(
"Invalid insertelement record");
5541 return error(
"Invalid type for value");
5542 if (popValue(Record, OpNum, NextValueNo,
5544 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5545 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5546 return error(
"Invalid insert element record");
5548 ResTypeID = VecTypeID;
5556 unsigned Vec1TypeID;
5557 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5559 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5561 return error(
"Invalid shufflevector record");
5563 unsigned MaskTypeID;
5564 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5565 return error(
"Invalid shufflevector record");
5567 return error(
"Invalid type for value");
5569 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5571 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5586 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5587 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5589 return error(
"Invalid comparison record");
5591 if (OpNum >=
Record.size())
5593 "Invalid record: operand number exceeded available operands");
5598 if (IsFP &&
Record.size() > OpNum+1)
5603 return error(
"Invalid fcmp predicate");
5604 I =
new FCmpInst(PredVal,
LHS,
RHS);
5607 return error(
"Invalid icmp predicate");
5608 I =
new ICmpInst(PredVal,
LHS,
RHS);
5609 if (
Record.size() > OpNum + 1 &&
5614 if (OpNum + 1 !=
Record.size())
5615 return error(
"Invalid comparison record");
5617 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5619 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5622 I->setFastMathFlags(FMF);
5639 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5640 return error(
"Invalid ret record");
5641 if (OpNum !=
Record.size())
5642 return error(
"Invalid ret record");
5650 return error(
"Invalid br record");
5651 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5653 return error(
"Invalid br record");
5655 if (
Record.size() == 1) {
5660 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5662 Value *
Cond = getValue(Record, 2, NextValueNo, CondType,
5663 getVirtualTypeID(CondType), CurBB);
5664 if (!FalseDest || !
Cond)
5665 return error(
"Invalid br record");
5673 return error(
"Invalid cleanupret record");
5676 Value *CleanupPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5677 getVirtualTypeID(TokenTy), CurBB);
5679 return error(
"Invalid cleanupret record");
5681 if (
Record.size() == 2) {
5682 UnwindDest = getBasicBlock(Record[Idx++]);
5684 return error(
"Invalid cleanupret record");
5693 return error(
"Invalid catchret record");
5696 Value *CatchPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5697 getVirtualTypeID(TokenTy), CurBB);
5699 return error(
"Invalid catchret record");
5700 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5702 return error(
"Invalid catchret record");
5711 return error(
"Invalid catchswitch record");
5716 Value *ParentPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5717 getVirtualTypeID(TokenTy), CurBB);
5719 return error(
"Invalid catchswitch record");
5721 unsigned NumHandlers =
Record[Idx++];
5724 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5725 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5727 return error(
"Invalid catchswitch record");
5732 if (Idx + 1 ==
Record.size()) {
5733 UnwindDest = getBasicBlock(Record[Idx++]);
5735 return error(
"Invalid catchswitch record");
5738 if (
Record.size() != Idx)
5739 return error(
"Invalid catchswitch record");
5743 for (BasicBlock *Handler : Handlers)
5744 CatchSwitch->addHandler(Handler);
5746 ResTypeID = getVirtualTypeID(
I->getType());
5754 return error(
"Invalid catchpad/cleanuppad record");
5759 Value *ParentPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5760 getVirtualTypeID(TokenTy), CurBB);
5762 return error(
"Invalid catchpad/cleanuppad record");
5764 unsigned NumArgOperands =
Record[Idx++];
5766 SmallVector<Value *, 2>
Args;
5767 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5770 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5771 return error(
"Invalid catchpad/cleanuppad record");
5772 Args.push_back(Val);
5775 if (
Record.size() != Idx)
5776 return error(
"Invalid catchpad/cleanuppad record");
5782 ResTypeID = getVirtualTypeID(
I->getType());
5788 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5794 unsigned OpTyID =
Record[1];
5795 Type *OpTy = getTypeByID(OpTyID);
5798 Value *
Cond = getValue(Record, 2, NextValueNo, OpTy, OpTyID, CurBB);
5801 return error(
"Invalid switch record");
5803 unsigned NumCases =
Record[4];
5808 unsigned CurIdx = 5;
5809 for (
unsigned i = 0; i != NumCases; ++i) {
5811 unsigned NumItems =
Record[CurIdx++];
5812 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5813 bool isSingleNumber =
Record[CurIdx++];
5816 unsigned ActiveWords = 1;
5817 if (ValueBitWidth > 64)
5818 ActiveWords =
Record[CurIdx++];
5821 CurIdx += ActiveWords;
5823 if (!isSingleNumber) {
5825 if (ValueBitWidth > 64)
5826 ActiveWords =
Record[CurIdx++];
5829 CurIdx += ActiveWords;
5840 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5841 for (ConstantInt *Cst : CaseVals)
5842 SI->addCase(Cst, DestBB);
5851 return error(
"Invalid switch record");
5852 unsigned OpTyID =
Record[0];
5853 Type *OpTy = getTypeByID(OpTyID);
5854 Value *
Cond = getValue(Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
5857 return error(
"Invalid switch record");
5858 unsigned NumCases = (
Record.size()-3)/2;
5861 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5863 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
5864 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
5865 if (!CaseVal || !DestBB) {
5867 return error(
"Invalid switch record");
5869 SI->addCase(CaseVal, DestBB);
5876 return error(
"Invalid indirectbr record");
5877 unsigned OpTyID =
Record[0];
5878 Type *OpTy = getTypeByID(OpTyID);
5879 Value *
Address = getValue(Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
5881 return error(
"Invalid indirectbr record");
5882 unsigned NumDests =
Record.size()-2;
5885 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5886 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
5890 return error(
"Invalid indirectbr record");
5900 return error(
"Invalid invoke record");
5903 unsigned CCInfo =
Record[OpNum++];
5904 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
5905 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
5907 unsigned FTyID = InvalidTypeID;
5908 FunctionType *FTy =
nullptr;
5909 if ((CCInfo >> 13) & 1) {
5913 return error(
"Explicit invoke type is not a function type");
5917 unsigned CalleeTypeID;
5918 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5920 return error(
"Invalid invoke record");
5924 return error(
"Callee is not a pointer");
5926 FTyID = getContainedTypeID(CalleeTypeID);
5929 return error(
"Callee is not of pointer to function type");
5931 if (
Record.size() < FTy->getNumParams() + OpNum)
5932 return error(
"Insufficient operands to call");
5934 SmallVector<Value*, 16>
Ops;
5935 SmallVector<unsigned, 16> ArgTyIDs;
5936 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5937 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5938 Ops.push_back(getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
5942 return error(
"Invalid invoke record");
5945 if (!FTy->isVarArg()) {
5946 if (
Record.size() != OpNum)
5947 return error(
"Invalid invoke record");
5950 while (OpNum !=
Record.size()) {
5953 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5954 return error(
"Invalid invoke record");
5961 if (!OperandBundles.empty())
5966 ResTypeID = getContainedTypeID(FTyID);
5967 OperandBundles.clear();
5970 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
5981 Value *Val =
nullptr;
5983 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
5984 return error(
"Invalid resume record");
5993 unsigned CCInfo =
Record[OpNum++];
5995 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
5996 unsigned NumIndirectDests =
Record[OpNum++];
5997 SmallVector<BasicBlock *, 16> IndirectDests;
5998 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
5999 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
6001 unsigned FTyID = InvalidTypeID;
6002 FunctionType *FTy =
nullptr;
6007 return error(
"Explicit call type is not a function type");
6011 unsigned CalleeTypeID;
6012 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6014 return error(
"Invalid callbr record");
6018 return error(
"Callee is not a pointer type");
6020 FTyID = getContainedTypeID(CalleeTypeID);
6023 return error(
"Callee is not of pointer to function type");
6025 if (
Record.size() < FTy->getNumParams() + OpNum)
6026 return error(
"Insufficient operands to call");
6028 SmallVector<Value*, 16>
Args;
6029 SmallVector<unsigned, 16> ArgTyIDs;
6031 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6033 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6034 if (FTy->getParamType(i)->isLabelTy())
6035 Arg = getBasicBlock(Record[OpNum]);
6037 Arg = getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
6040 return error(
"Invalid callbr record");
6041 Args.push_back(Arg);
6046 if (!FTy->isVarArg()) {
6047 if (OpNum !=
Record.size())
6048 return error(
"Invalid callbr record");
6050 while (OpNum !=
Record.size()) {
6053 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6054 return error(
"Invalid callbr record");
6061 if (!OperandBundles.empty())
6066 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6069 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6074 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6075 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6076 unsigned LabelNo = ArgNo - FirstBlockArg;
6078 if (!BA || BA->getFunction() !=
F ||
6079 LabelNo > IndirectDests.
size() ||
6080 BA->getBasicBlock() != IndirectDests[LabelNo])
6081 return error(
"callbr argument does not match indirect dest");
6086 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6090 for (
Value *Arg : Args)
6093 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6096 std::string Constraints =
IA->getConstraintString().str();
6099 for (
const auto &CI : ConstraintInfo) {
6101 if (ArgNo >= FirstBlockArg)
6102 Constraints.insert(Pos,
"!");
6107 Pos = Constraints.find(
',', Pos);
6108 if (Pos == std::string::npos)
6114 IA->hasSideEffects(),
IA->isAlignStack(),
6115 IA->getDialect(),
IA->canThrow());
6121 ResTypeID = getContainedTypeID(FTyID);
6122 OperandBundles.clear();
6139 return error(
"Invalid phi record");
6141 unsigned TyID =
Record[0];
6142 Type *Ty = getTypeByID(TyID);
6144 return error(
"Invalid phi record");
6149 size_t NumArgs = (
Record.size() - 1) / 2;
6153 return error(
"Invalid phi record");
6157 SmallDenseMap<BasicBlock *, Value *>
Args;
6158 for (
unsigned i = 0; i != NumArgs; i++) {
6159 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6162 return error(
"Invalid phi BB");
6169 auto It =
Args.find(BB);
6171 if (It !=
Args.end()) {
6185 if (!PhiConstExprBB)
6187 EdgeBB = PhiConstExprBB;
6195 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6197 V = getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6201 return error(
"Invalid phi record");
6204 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6205 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6206 PhiConstExprBB =
nullptr;
6209 Args.insert({BB,
V});
6215 if (
Record.size() % 2 == 0) {
6219 I->setFastMathFlags(FMF);
6231 return error(
"Invalid landingpad record");
6235 return error(
"Invalid landingpad record");
6237 ResTypeID =
Record[Idx++];
6238 Type *Ty = getTypeByID(ResTypeID);
6240 return error(
"Invalid landingpad record");
6242 Value *PersFn =
nullptr;
6243 unsigned PersFnTypeID;
6244 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6246 return error(
"Invalid landingpad record");
6248 if (!
F->hasPersonalityFn())
6251 return error(
"Personality function mismatch");
6254 bool IsCleanup = !!
Record[Idx++];
6255 unsigned NumClauses =
Record[Idx++];
6258 for (
unsigned J = 0; J != NumClauses; ++J) {
6264 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6267 return error(
"Invalid landingpad record");
6272 "Catch clause has a invalid type!");
6275 "Filter clause has invalid type!");
6286 return error(
"Invalid alloca record");
6287 using APV = AllocaPackedValues;
6288 const uint64_t Rec =
Record[3];
6291 unsigned TyID =
Record[0];
6292 Type *Ty = getTypeByID(TyID);
6294 TyID = getContainedTypeID(TyID);
6295 Ty = getTypeByID(TyID);
6297 return error(
"Missing element type for old-style alloca");
6299 unsigned OpTyID =
Record[1];
6300 Type *OpTy = getTypeByID(OpTyID);
6301 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6306 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6310 return error(
"Invalid alloca record");
6312 const DataLayout &
DL = TheModule->getDataLayout();
6313 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6315 SmallPtrSet<Type *, 4> Visited;
6316 if (!Align && !Ty->
isSized(&Visited))
6317 return error(
"alloca of unsized type");
6319 Align =
DL.getPrefTypeAlign(Ty);
6321 if (!
Size->getType()->isIntegerTy())
6322 return error(
"alloca element count must have integer type");
6324 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6328 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6336 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6337 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6338 return error(
"Invalid load record");
6341 return error(
"Load operand is not a pointer type");
6344 if (OpNum + 3 ==
Record.size()) {
6345 ResTypeID =
Record[OpNum++];
6346 Ty = getTypeByID(ResTypeID);
6348 ResTypeID = getContainedTypeID(OpTypeID);
6349 Ty = getTypeByID(ResTypeID);
6353 return error(
"Missing load type");
6355 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6359 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6361 SmallPtrSet<Type *, 4> Visited;
6362 if (!Align && !Ty->
isSized(&Visited))
6363 return error(
"load of unsized type");
6365 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6366 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6375 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6376 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size()))
6377 return error(
"Invalid load atomic record");
6380 return error(
"Load operand is not a pointer type");
6383 if (OpNum + 5 ==
Record.size()) {
6384 ResTypeID =
Record[OpNum++];
6385 Ty = getTypeByID(ResTypeID);
6387 ResTypeID = getContainedTypeID(OpTypeID);
6388 Ty = getTypeByID(ResTypeID);
6392 return error(
"Missing atomic load type");
6394 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6398 if (Ordering == AtomicOrdering::NotAtomic ||
6399 Ordering == AtomicOrdering::Release ||
6400 Ordering == AtomicOrdering::AcquireRelease)
6401 return error(
"Invalid load atomic record");
6402 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6403 return error(
"Invalid load atomic record");
6404 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6407 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6410 return error(
"Alignment missing from atomic load");
6411 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align, Ordering, SSID);
6419 unsigned PtrTypeID, ValTypeID;
6420 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6421 return error(
"Invalid store record");
6424 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6425 return error(
"Invalid store record");
6427 ValTypeID = getContainedTypeID(PtrTypeID);
6428 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6429 ValTypeID, Val, CurBB))
6430 return error(
"Invalid store record");
6433 if (OpNum + 2 !=
Record.size())
6434 return error(
"Invalid store record");
6439 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6441 SmallPtrSet<Type *, 4> Visited;
6443 return error(
"store of unsized type");
6445 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6446 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6455 unsigned PtrTypeID, ValTypeID;
6456 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6458 return error(
"Invalid store atomic record");
6460 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6461 return error(
"Invalid store atomic record");
6463 ValTypeID = getContainedTypeID(PtrTypeID);
6464 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6465 ValTypeID, Val, CurBB))
6466 return error(
"Invalid store atomic record");
6469 if (OpNum + 4 !=
Record.size())
6470 return error(
"Invalid store atomic record");
6475 if (Ordering == AtomicOrdering::NotAtomic ||
6476 Ordering == AtomicOrdering::Acquire ||
6477 Ordering == AtomicOrdering::AcquireRelease)
6478 return error(
"Invalid store atomic record");
6479 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6480 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6481 return error(
"Invalid store atomic record");
6484 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6487 return error(
"Alignment missing from atomic store");
6488 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align, Ordering, SSID);
6495 const size_t NumRecords =
Record.size();
6497 Value *Ptr =
nullptr;
6499 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6500 return error(
"Invalid cmpxchg record");
6503 return error(
"Cmpxchg operand is not a pointer type");
6506 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6507 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6508 CmpTypeID, Cmp, CurBB))
6509 return error(
"Invalid cmpxchg record");
6512 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6514 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6515 return error(
"Invalid cmpxchg record");
6519 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6520 SuccessOrdering == AtomicOrdering::Unordered)
6521 return error(
"Invalid cmpxchg record");
6523 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6525 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6533 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6534 FailureOrdering == AtomicOrdering::Unordered)
6535 return error(
"Invalid cmpxchg record");
6537 const Align Alignment(
6538 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6540 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6541 FailureOrdering, SSID);
6544 if (NumRecords < 8) {
6548 I->insertInto(CurBB, CurBB->
end());
6550 ResTypeID = CmpTypeID;
6553 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6554 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6563 const size_t NumRecords =
Record.size();
6565 Value *Ptr =
nullptr;
6567 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6568 return error(
"Invalid cmpxchg record");
6571 return error(
"Cmpxchg operand is not a pointer type");
6575 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6576 return error(
"Invalid cmpxchg record");
6578 Value *Val =
nullptr;
6579 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6581 return error(
"Invalid cmpxchg record");
6583 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6584 return error(
"Invalid cmpxchg record");
6586 const bool IsVol =
Record[OpNum];
6591 return error(
"Invalid cmpxchg success ordering");
6593 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6595 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6601 return error(
"Invalid cmpxchg failure ordering");
6603 const bool IsWeak =
Record[OpNum + 4];
6605 MaybeAlign Alignment;
6607 if (NumRecords == (OpNum + 6)) {
6608 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6613 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6615 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6616 FailureOrdering, SSID);
6620 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6621 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6630 const size_t NumRecords =
Record.size();
6633 Value *Ptr =
nullptr;
6635 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6636 return error(
"Invalid atomicrmw record");
6639 return error(
"Invalid atomicrmw record");
6641 Value *Val =
nullptr;
6642 unsigned ValTypeID = InvalidTypeID;
6644 ValTypeID = getContainedTypeID(PtrTypeID);
6645 if (popValue(Record, OpNum, NextValueNo,
6646 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6647 return error(
"Invalid atomicrmw record");
6649 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6650 return error(
"Invalid atomicrmw record");
6653 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6654 return error(
"Invalid atomicrmw record");
6660 return error(
"Invalid atomicrmw record");
6662 const bool IsVol =
Record[OpNum + 1];
6665 if (Ordering == AtomicOrdering::NotAtomic ||
6666 Ordering == AtomicOrdering::Unordered)
6667 return error(
"Invalid atomicrmw record");
6669 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6671 MaybeAlign Alignment;
6673 if (NumRecords == (OpNum + 5)) {
6674 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6680 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6682 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID);
6683 ResTypeID = ValTypeID;
6691 return error(
"Invalid fence record");
6693 if (Ordering == AtomicOrdering::NotAtomic ||
6694 Ordering == AtomicOrdering::Unordered ||
6695 Ordering == AtomicOrdering::Monotonic)
6696 return error(
"Invalid fence record");
6698 I =
new FenceInst(
Context, Ordering, SSID);
6705 SeenDebugRecord =
true;
6708 return error(
"Invalid dbg record: missing instruction");
6711 Inst->
getParent()->insertDbgRecordBefore(
6722 SeenDebugRecord =
true;
6725 return error(
"Invalid dbg record: missing instruction");
6742 DILocalVariable *Var =
6744 DIExpression *Expr =
6757 unsigned SlotBefore =
Slot;
6758 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6759 return error(
"Invalid dbg record: invalid value");
6761 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6764 RawLocation = getFnMetadataByID(Record[Slot++]);
6767 DbgVariableRecord *DVR =
nullptr;
6771 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6772 DbgVariableRecord::LocationType::Value);
6775 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6776 DbgVariableRecord::LocationType::Declare);
6779 DVR =
new DbgVariableRecord(
6780 RawLocation, Var, Expr, DIL,
6781 DbgVariableRecord::LocationType::DeclareValue);
6785 DIExpression *AddrExpr =
6787 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6788 DVR =
new DbgVariableRecord(RawLocation, Var, Expr,
ID, Addr, AddrExpr,
6801 return error(
"Invalid call record");
6805 unsigned CCInfo =
Record[OpNum++];
6811 return error(
"Fast math flags indicator set for call with no FMF");
6814 unsigned FTyID = InvalidTypeID;
6815 FunctionType *FTy =
nullptr;
6820 return error(
"Explicit call type is not a function type");
6824 unsigned CalleeTypeID;
6825 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6827 return error(
"Invalid call record");
6831 return error(
"Callee is not a pointer type");
6833 FTyID = getContainedTypeID(CalleeTypeID);
6836 return error(
"Callee is not of pointer to function type");
6838 if (
Record.size() < FTy->getNumParams() + OpNum)
6839 return error(
"Insufficient operands to call");
6841 SmallVector<Value*, 16>
Args;
6842 SmallVector<unsigned, 16> ArgTyIDs;
6844 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6845 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6846 if (FTy->getParamType(i)->isLabelTy())
6847 Args.push_back(getBasicBlock(Record[OpNum]));
6849 Args.push_back(getValue(Record, OpNum, NextValueNo,
6850 FTy->getParamType(i), ArgTyID, CurBB));
6853 return error(
"Invalid call record");
6857 if (!FTy->isVarArg()) {
6858 if (OpNum !=
Record.size())
6859 return error(
"Invalid call record");
6861 while (OpNum !=
Record.size()) {
6864 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6865 return error(
"Invalid call record");
6872 if (!OperandBundles.empty())
6876 ResTypeID = getContainedTypeID(FTyID);
6877 OperandBundles.clear();
6891 SeenDebugIntrinsic =
true;
6898 return error(
"Fast-math-flags specified for call without "
6899 "floating-point scalar or vector return type");
6900 I->setFastMathFlags(FMF);
6906 return error(
"Invalid va_arg record");
6907 unsigned OpTyID =
Record[0];
6908 Type *OpTy = getTypeByID(OpTyID);
6909 Value *
Op = getValue(Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
6911 Type *ResTy = getTypeByID(ResTypeID);
6912 if (!OpTy || !
Op || !ResTy)
6913 return error(
"Invalid va_arg record");
6914 I =
new VAArgInst(
Op, ResTy);
6924 if (
Record.empty() || Record[0] >= BundleTags.size())
6925 return error(
"Invalid operand bundle record");
6927 std::vector<Value *> Inputs;
6930 while (OpNum !=
Record.size()) {
6932 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
6933 return error(
"Invalid operand bundle record");
6934 Inputs.push_back(
Op);
6937 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
6945 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6946 return error(
"Invalid freeze record");
6947 if (OpNum !=
Record.size())
6948 return error(
"Invalid freeze record");
6950 I =
new FreezeInst(
Op);
6951 ResTypeID = OpTypeID;
6961 return error(
"Invalid instruction with no BB");
6963 if (!OperandBundles.empty()) {
6965 return error(
"Operand bundles found with no consumer");
6967 I->insertInto(CurBB, CurBB->
end());
6970 if (
I->isTerminator()) {
6972 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
6976 if (!
I->getType()->isVoidTy()) {
6977 assert(
I->getType() == getTypeByID(ResTypeID) &&
6978 "Incorrect result type ID");
6986 if (!OperandBundles.empty())
6987 return error(
"Operand bundles found with no consumer");
6991 if (!
A->getParent()) {
6993 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
6999 return error(
"Never resolved value found in function");
7004 if (MDLoader->hasFwdRefs())
7005 return error(
"Invalid function metadata: outgoing forward refs");
7010 for (
const auto &Pair : ConstExprEdgeBBs) {
7021 ValueList.
shrinkTo(ModuleValueListSize);
7022 MDLoader->shrinkTo(ModuleMDLoaderSize);
7023 std::vector<BasicBlock*>().swap(FunctionBBs);
7028Error BitcodeReader::findFunctionInStream(
7030 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
7031 while (DeferredFunctionInfoIterator->second == 0) {
7036 assert(VSTOffset == 0 || !
F->hasName());
7039 if (
Error Err = rememberAndSkipFunctionBodies())
7045SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7048 if (Val >= SSIDs.
size())
7057Error BitcodeReader::materialize(GlobalValue *GV) {
7060 if (!
F || !
F->isMaterializable())
7063 DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.
find(
F);
7064 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7067 if (DFII->second == 0)
7068 if (
Error Err = findFunctionInStream(
F, DFII))
7072 if (
Error Err = materializeMetadata())
7079 if (
Error Err = parseFunctionBody(
F))
7081 F->setIsMaterializable(
false);
7085 if (SeenDebugIntrinsic && SeenDebugRecord)
7086 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7092 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7093 F->setSubprogram(SP);
7096 if (!MDLoader->isStrippingTBAA()) {
7098 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7101 MDLoader->setStripTBAA(
true);
7108 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7109 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7115 unsigned ExpectedNumOperands = 0;
7117 ExpectedNumOperands = 2;
7119 ExpectedNumOperands =
SI->getNumSuccessors();
7121 ExpectedNumOperands = 1;
7125 ExpectedNumOperands = 2;
7132 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7133 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7139 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7140 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7142 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7143 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7144 CI->getArgOperand(ArgNo)->getType(),
7145 CI->getParamAttributes(ArgNo)));
7148 if (Function *OldFn = CI->getCalledFunction()) {
7149 auto It = UpgradedIntrinsics.find(OldFn);
7150 if (It != UpgradedIntrinsics.end())
7161 return materializeForwardReferencedFunctions();
7164Error BitcodeReader::materializeModule() {
7165 if (
Error Err = materializeMetadata())
7169 WillMaterializeAllForwardRefs =
true;
7173 for (Function &
F : *TheModule) {
7174 if (
Error Err = materialize(&
F))
7180 if (LastFunctionBlockBit || NextUnreadBit)
7182 ? LastFunctionBlockBit
7188 if (!BasicBlockFwdRefs.
empty())
7189 return error(
"Never resolved function from blockaddress");
7195 for (
auto &
I : UpgradedIntrinsics) {
7196 for (
auto *U :
I.first->users()) {
7200 if (
I.first !=
I.second) {
7201 if (!
I.first->use_empty())
7202 I.first->replaceAllUsesWith(
I.second);
7203 I.first->eraseFromParent();
7206 UpgradedIntrinsics.clear();
7221std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7222 return IdentifiedStructTypes;
7225ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7226 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7228 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7229 ModulePath(ModulePath), IsPrevailing(IsPrevailing) {}
7231void ModuleSummaryIndexBitcodeReader::addThisModule() {
7236ModuleSummaryIndexBitcodeReader::getThisModule() {
7240template <
bool AllowNullValueInfo>
7241std::pair<ValueInfo, GlobalValue::GUID>
7242ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7243 auto VGI = ValueIdToValueInfoMap[ValueId];
7250 assert(AllowNullValueInfo || std::get<0>(VGI));
7254void ModuleSummaryIndexBitcodeReader::setValueGUID(
7256 StringRef SourceFileName) {
7257 std::string GlobalId =
7260 auto OriginalNameID = ValueGUID;
7264 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7270 ValueIdToValueInfoMap[ValueID] = std::make_pair(
7279Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7281 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7288 if (!MaybeCurrentBit)
7290 uint64_t CurrentBit = MaybeCurrentBit.
get();
7295 SmallVector<uint64_t, 64>
Record;
7304 BitstreamEntry
Entry = MaybeEntry.
get();
7306 switch (
Entry.Kind) {
7309 return error(
"Malformed block");
7325 switch (MaybeRecord.
get()) {
7330 return error(
"Invalid vst_code_entry record");
7331 unsigned ValueID =
Record[0];
7333 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7334 assert(VLI != ValueIdToLinkageMap.
end() &&
7335 "No linkage found for VST entry?");
7344 return error(
"Invalid vst_code_fnentry record");
7345 unsigned ValueID =
Record[0];
7347 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7348 assert(VLI != ValueIdToLinkageMap.
end() &&
7349 "No linkage found for VST entry?");
7357 unsigned ValueID =
Record[0];
7361 ValueIdToValueInfoMap[ValueID] =
7372Error ModuleSummaryIndexBitcodeReader::parseModule() {
7376 SmallVector<uint64_t, 64>
Record;
7377 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7378 unsigned ValueId = 0;
7382 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.
advance();
7385 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7387 switch (
Entry.Kind) {
7389 return error(
"Malformed block");
7401 if (
Error Err = readBlockInfo())
7407 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7408 !SeenGlobalValSummary) &&
7409 "Expected early VST parse via VSTOffset record");
7416 if (!SourceFileName.
empty())
7418 assert(!SeenValueSymbolTable &&
7419 "Already read VST when parsing summary block?");
7424 if (VSTOffset > 0) {
7425 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7427 SeenValueSymbolTable =
true;
7429 SeenGlobalValSummary =
true;
7430 if (
Error Err = parseEntireSummary(
Entry.ID))
7434 if (
Error Err = parseModuleStringTable())
7442 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7445 switch (MaybeBitCode.
get()) {
7449 if (
Error Err = parseVersionRecord(Record).takeError())
7457 return error(
"Invalid source filename record");
7464 return error(
"Invalid hash length " + Twine(
Record.size()).str());
7465 auto &Hash = getThisModule()->second;
7467 for (
auto &Val : Record) {
7468 assert(!(Val >> 32) &&
"Unexpected high bits set");
7476 return error(
"Invalid vstoffset record");
7480 VSTOffset =
Record[0] - 1;
7490 ArrayRef<uint64_t> GVRecord;
7491 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7492 if (GVRecord.
size() <= 3)
7493 return error(
"Invalid global record");
7494 uint64_t RawLinkage = GVRecord[3];
7497 ValueIdToLinkageMap[ValueId++] =
Linkage;
7501 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7512ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7515 for (uint64_t RefValueId : Record)
7516 Ret.
push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7521ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7522 bool IsOldProfileFormat,
7523 bool HasProfile,
bool HasRelBF) {
7527 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7532 for (
unsigned I = 0,
E =
Record.size();
I !=
E; ++
I) {
7534 bool HasTailCall =
false;
7536 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7537 if (IsOldProfileFormat) {
7541 }
else if (HasProfile)
7542 std::tie(Hotness, HasTailCall) =
7576 static_cast<size_t>(
Record[Slot + 1])};
7599 while (Slot <
Record.size())
7603std::vector<FunctionSummary::ParamAccess>
7604ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7605 auto ReadRange = [&]() {
7607 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7609 BitcodeReader::decodeSignRotatedValue(
Record.consume_front()));
7616 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7617 while (!
Record.empty()) {
7618 PendingParamAccesses.emplace_back();
7619 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7621 ParamAccess.
Use = ReadRange();
7626 std::get<0>(getValueInfoFromValueId(
Record.consume_front()));
7627 Call.Offsets = ReadRange();
7630 return PendingParamAccesses;
7633void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7634 ArrayRef<uint64_t> Record,
size_t &Slot,
7637 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7641void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7642 ArrayRef<uint64_t> Record) {
7650 while (Slot <
Record.size())
7651 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7654SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7655 ArrayRef<uint64_t> Record,
unsigned &
I) {
7656 SmallVector<unsigned> StackIdList;
7660 if (RadixArray.empty()) {
7661 unsigned NumStackEntries =
Record[
I++];
7663 StackIdList.
reserve(NumStackEntries);
7664 for (
unsigned J = 0; J < NumStackEntries; J++) {
7665 assert(Record[
I] < StackIds.size());
7666 StackIdList.
push_back(getStackIdIndex(Record[
I++]));
7669 unsigned RadixIndex =
Record[
I++];
7675 assert(RadixIndex < RadixArray.size());
7676 unsigned NumStackIds = RadixArray[RadixIndex++];
7677 StackIdList.
reserve(NumStackIds);
7678 while (NumStackIds--) {
7679 assert(RadixIndex < RadixArray.size());
7680 unsigned Elem = RadixArray[RadixIndex];
7681 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7682 RadixIndex = RadixIndex - Elem;
7683 assert(RadixIndex < RadixArray.size());
7684 Elem = RadixArray[RadixIndex];
7686 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7689 StackIdList.
push_back(getStackIdIndex(Elem));
7699 unsigned FirstWORef = Refs.
size() - WOCnt;
7700 unsigned RefNo = FirstWORef - ROCnt;
7701 for (; RefNo < FirstWORef; ++RefNo)
7702 Refs[RefNo].setReadOnly();
7703 for (; RefNo < Refs.
size(); ++RefNo)
7704 Refs[RefNo].setWriteOnly();
7709Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7712 SmallVector<uint64_t, 64>
Record;
7719 BitstreamEntry
Entry = MaybeEntry.
get();
7722 return error(
"Invalid Summary Block: record for version expected");
7727 return error(
"Invalid Summary Block: version expected");
7730 const bool IsOldProfileFormat =
Version == 1;
7733 const bool MemProfAfterFunctionSummary =
Version >= 13;
7735 return error(
"Invalid summary version " + Twine(
Version) +
7736 ". Version should be in the range [1-" +
7743 GlobalValueSummary *LastSeenSummary =
nullptr;
7753 FunctionSummary *CurrentPrevailingFS =
nullptr;
7758 std::vector<GlobalValue::GUID> PendingTypeTests;
7759 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7760 PendingTypeCheckedLoadVCalls;
7761 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7762 PendingTypeCheckedLoadConstVCalls;
7763 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7765 std::vector<CallsiteInfo> PendingCallsites;
7766 std::vector<AllocInfo> PendingAllocs;
7767 std::vector<uint64_t> PendingContextIds;
7773 BitstreamEntry
Entry = MaybeEntry.
get();
7775 switch (
Entry.Kind) {
7778 return error(
"Malformed block");
7794 Expected<unsigned> MaybeBitCode = Stream.
readRecord(
Entry.ID, Record);
7797 unsigned BitCode = MaybeBitCode.
get();
7807 uint64_t ValueID =
Record[0];
7814 ValueIdToValueInfoMap[ValueID] =
7832 unsigned ValueID =
Record[0];
7833 uint64_t RawFlags =
Record[1];
7834 unsigned InstCount =
Record[2];
7835 uint64_t RawFunFlags = 0;
7836 unsigned NumRefs =
Record[3];
7837 unsigned NumRORefs = 0, NumWORefs = 0;
7838 int RefListStartIndex = 4;
7842 RefListStartIndex = 5;
7845 RefListStartIndex = 6;
7848 RefListStartIndex = 7;
7859 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7861 "Record size inconsistent with number of references");
7863 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7868 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7869 IsOldProfileFormat, HasProfile, HasRelBF);
7871 auto [
VI,
GUID] = getValueInfoFromValueId(ValueID);
7878 IsPrevailing(
VI.getGUID());
7884 assert(!MemProfAfterFunctionSummary ||
7885 (PendingCallsites.empty() && PendingAllocs.empty()));
7886 if (!IsPrevailingSym && !MemProfAfterFunctionSummary) {
7887 PendingCallsites.clear();
7888 PendingAllocs.clear();
7891 auto FS = std::make_unique<FunctionSummary>(
7893 std::move(Calls), std::move(PendingTypeTests),
7894 std::move(PendingTypeTestAssumeVCalls),
7895 std::move(PendingTypeCheckedLoadVCalls),
7896 std::move(PendingTypeTestAssumeConstVCalls),
7897 std::move(PendingTypeCheckedLoadConstVCalls),
7898 std::move(PendingParamAccesses), std::move(PendingCallsites),
7899 std::move(PendingAllocs));
7900 FS->setModulePath(getThisModule()->first());
7901 FS->setOriginalName(GUID);
7904 if (MemProfAfterFunctionSummary) {
7905 if (IsPrevailingSym)
7906 CurrentPrevailingFS =
FS.get();
7908 CurrentPrevailingFS =
nullptr;
7917 unsigned ValueID =
Record[0];
7918 uint64_t RawFlags =
Record[1];
7919 unsigned AliaseeID =
Record[2];
7921 auto AS = std::make_unique<AliasSummary>(Flags);
7927 AS->setModulePath(getThisModule()->first());
7929 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
7931 if (!AliaseeInModule)
7932 return error(
"Alias expects aliasee summary to be parsed");
7933 AS->setAliasee(AliaseeVI, AliaseeInModule);
7935 auto GUID = getValueInfoFromValueId(ValueID);
7936 AS->setOriginalName(std::get<1>(GUID));
7942 unsigned ValueID =
Record[0];
7943 uint64_t RawFlags =
Record[1];
7944 unsigned RefArrayStart = 2;
7945 GlobalVarSummary::GVarFlags GVF(
false,
7955 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
7957 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7958 FS->setModulePath(getThisModule()->first());
7959 auto GUID = getValueInfoFromValueId(ValueID);
7960 FS->setOriginalName(std::get<1>(GUID));
7968 unsigned ValueID =
Record[0];
7969 uint64_t RawFlags =
Record[1];
7971 unsigned NumRefs =
Record[3];
7972 unsigned RefListStartIndex = 4;
7973 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
7976 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7978 for (
unsigned I = VTableListStartIndex,
E =
Record.size();
I !=
E; ++
I) {
7979 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7984 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7985 VS->setModulePath(getThisModule()->first());
7986 VS->setVTableFuncs(VTableFuncs);
7987 auto GUID = getValueInfoFromValueId(ValueID);
7988 VS->setOriginalName(std::get<1>(GUID));
8000 unsigned ValueID =
Record[0];
8001 uint64_t ModuleId =
Record[1];
8002 uint64_t RawFlags =
Record[2];
8003 unsigned InstCount =
Record[3];
8004 uint64_t RawFunFlags = 0;
8005 unsigned NumRefs =
Record[4];
8006 unsigned NumRORefs = 0, NumWORefs = 0;
8007 int RefListStartIndex = 5;
8011 RefListStartIndex = 6;
8012 size_t NumRefsIndex = 5;
8014 unsigned NumRORefsOffset = 1;
8015 RefListStartIndex = 7;
8018 RefListStartIndex = 8;
8020 RefListStartIndex = 9;
8022 NumRORefsOffset = 2;
8025 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
8027 NumRefs =
Record[NumRefsIndex];
8031 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
8033 "Record size inconsistent with number of references");
8035 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
8038 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
8039 IsOldProfileFormat, HasProfile,
false);
8040 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8042 auto FS = std::make_unique<FunctionSummary>(
8044 std::move(Edges), std::move(PendingTypeTests),
8045 std::move(PendingTypeTestAssumeVCalls),
8046 std::move(PendingTypeCheckedLoadVCalls),
8047 std::move(PendingTypeTestAssumeConstVCalls),
8048 std::move(PendingTypeCheckedLoadConstVCalls),
8049 std::move(PendingParamAccesses), std::move(PendingCallsites),
8050 std::move(PendingAllocs));
8051 LastSeenSummary =
FS.get();
8052 if (MemProfAfterFunctionSummary)
8053 CurrentPrevailingFS =
FS.get();
8054 LastSeenGUID =
VI.getGUID();
8055 FS->setModulePath(ModuleIdMap[ModuleId]);
8063 unsigned ValueID =
Record[0];
8064 uint64_t ModuleId =
Record[1];
8065 uint64_t RawFlags =
Record[2];
8066 unsigned AliaseeValueId =
Record[3];
8068 auto AS = std::make_unique<AliasSummary>(Flags);
8069 LastSeenSummary = AS.get();
8070 AS->setModulePath(ModuleIdMap[ModuleId]);
8072 auto AliaseeVI = std::get<0>(
8073 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(AliaseeValueId));
8075 auto AliaseeInModule =
8077 AS->setAliasee(AliaseeVI, AliaseeInModule);
8079 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8080 LastSeenGUID =
VI.getGUID();
8086 unsigned ValueID =
Record[0];
8087 uint64_t ModuleId =
Record[1];
8088 uint64_t RawFlags =
Record[2];
8089 unsigned RefArrayStart = 3;
8090 GlobalVarSummary::GVarFlags GVF(
false,
8100 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8102 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8103 LastSeenSummary =
FS.get();
8104 FS->setModulePath(ModuleIdMap[ModuleId]);
8105 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8106 LastSeenGUID =
VI.getGUID();
8112 uint64_t OriginalName =
Record[0];
8113 if (!LastSeenSummary)
8114 return error(
"Name attachment that does not follow a combined record");
8118 LastSeenSummary =
nullptr;
8123 assert(PendingTypeTests.empty());
8128 assert(PendingTypeTestAssumeVCalls.empty());
8129 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8130 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8134 assert(PendingTypeCheckedLoadVCalls.empty());
8135 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8136 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8140 PendingTypeTestAssumeConstVCalls.push_back(
8145 PendingTypeCheckedLoadConstVCalls.push_back(
8151 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8153 static_cast<size_t>(Record[
I + 1]));
8159 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8161 static_cast<size_t>(Record[
I + 1]));
8170 parseTypeIdCompatibleVtableSummaryRecord(Record);
8178 PendingParamAccesses = parseParamAccesses(Record);
8185 assert(StackIds.empty());
8187 StackIds = ArrayRef<uint64_t>(Record);
8193 StackIds.reserve(
Record.size() / 2);
8194 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8195 StackIds.push_back(*R << 32 | *(R + 1));
8197 assert(StackIdToIndex.empty());
8199 StackIdToIndex.resize(StackIds.size(), UninitializedStackIdIndex);
8204 RadixArray = ArrayRef<uint64_t>(Record);
8211 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8213 unsigned ValueID =
Record[0];
8214 SmallVector<unsigned> StackIdList;
8216 assert(R < StackIds.size());
8217 StackIdList.
push_back(getStackIdIndex(R));
8219 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8220 if (MemProfAfterFunctionSummary)
8222 CallsiteInfo({
VI, std::move(StackIdList)}));
8224 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8231 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8232 auto RecordIter =
Record.begin();
8233 unsigned ValueID = *RecordIter++;
8234 unsigned NumStackIds = *RecordIter++;
8235 unsigned NumVersions = *RecordIter++;
8236 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8237 SmallVector<unsigned> StackIdList;
8238 for (
unsigned J = 0; J < NumStackIds; J++) {
8239 assert(*RecordIter < StackIds.size());
8240 StackIdList.
push_back(getStackIdIndex(*RecordIter++));
8242 SmallVector<unsigned> Versions;
8243 for (
unsigned J = 0; J < NumVersions; J++)
8245 ValueInfo
VI = std::get<0>(
8246 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8247 if (MemProfAfterFunctionSummary)
8249 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8251 PendingCallsites.push_back(
8252 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8259 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS)
8264 PendingContextIds.reserve(
Record.size() / 2);
8265 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8266 PendingContextIds.push_back(*R << 32 | *(R + 1));
8273 if (MemProfAfterFunctionSummary && !CurrentPrevailingFS) {
8274 PendingContextIds.clear();
8278 std::vector<MIBInfo> MIBs;
8279 unsigned NumMIBs = 0;
8282 unsigned MIBsRead = 0;
8283 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8287 auto StackIdList = parseAllocInfoContext(Record,
I);
8288 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8294 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8296 assert(!PendingContextIds.empty() &&
8297 "Missing context ids for alloc sizes");
8298 unsigned ContextIdIndex = 0;
8304 while (MIBsRead++ < NumMIBs) {
8306 unsigned NumContextSizeInfoEntries =
Record[
I++];
8308 std::vector<ContextTotalSize> ContextSizes;
8309 ContextSizes.reserve(NumContextSizeInfoEntries);
8310 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8311 assert(ContextIdIndex < PendingContextIds.size());
8313 if (PendingContextIds[ContextIdIndex] == 0) {
8322 ContextSizes.push_back(
8323 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8325 AllContextSizes.push_back(std::move(ContextSizes));
8327 PendingContextIds.clear();
8329 AllocInfo AI(std::move(MIBs));
8330 if (!AllContextSizes.empty()) {
8331 assert(AI.MIBs.size() == AllContextSizes.size());
8332 AI.ContextSizeInfos = std::move(AllContextSizes);
8335 if (MemProfAfterFunctionSummary)
8336 CurrentPrevailingFS->
addAlloc(std::move(AI));
8338 PendingAllocs.push_back(std::move(AI));
8346 assert(!MemProfAfterFunctionSummary || CurrentPrevailingFS);
8348 std::vector<MIBInfo> MIBs;
8349 unsigned NumMIBs =
Record[
I++];
8350 unsigned NumVersions =
Record[
I++];
8351 unsigned MIBsRead = 0;
8352 while (MIBsRead++ < NumMIBs) {
8355 SmallVector<unsigned> StackIdList;
8357 StackIdList = parseAllocInfoContext(Record,
I);
8358 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8361 SmallVector<uint8_t> Versions;
8362 for (
unsigned J = 0; J < NumVersions; J++)
8365 AllocInfo AI(std::move(Versions), std::move(MIBs));
8366 if (MemProfAfterFunctionSummary)
8367 CurrentPrevailingFS->
addAlloc(std::move(AI));
8369 PendingAllocs.push_back(std::move(AI));
8379Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8383 SmallVector<uint64_t, 64>
Record;
8385 SmallString<128> ModulePath;
8392 BitstreamEntry
Entry = MaybeEntry.
get();
8394 switch (
Entry.Kind) {
8397 return error(
"Malformed block");
8409 switch (MaybeRecord.
get()) {
8414 uint64_t ModuleId =
Record[0];
8417 return error(
"Invalid code_entry record");
8419 LastSeenModule = TheIndex.
addModule(ModulePath);
8420 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8428 return error(
"Invalid hash length " + Twine(
Record.size()).str());
8429 if (!LastSeenModule)
8430 return error(
"Invalid hash that does not follow a module path");
8432 for (
auto &Val : Record) {
8433 assert(!(Val >> 32) &&
"Unexpected high bits set");
8434 LastSeenModule->
second[Pos++] = Val;
8437 LastSeenModule =
nullptr;
8450class BitcodeErrorCategoryType :
public std::error_category {
8451 const char *
name()
const noexcept
override {
8452 return "llvm.bitcode";
8455 std::string message(
int IE)
const override {
8458 case BitcodeError::CorruptedBitcode:
8459 return "Corrupted bitcode";
8468 static BitcodeErrorCategoryType ErrorCategory;
8469 return ErrorCategory;
8473 unsigned Block,
unsigned RecordID) {
8475 return std::move(Err);
8484 switch (Entry.Kind) {
8489 return error(
"Malformed block");
8493 return std::move(Err);
8503 if (MaybeRecord.
get() == RecordID)
8514Expected<std::vector<BitcodeModule>>
8518 return FOrErr.takeError();
8519 return std::move(FOrErr->Mods);
8544 switch (Entry.Kind) {
8547 return error(
"Malformed block");
8550 uint64_t IdentificationBit = -1ull;
8554 return std::move(Err);
8560 Entry = MaybeEntry.
get();
8565 return error(
"Malformed block");
8571 return std::move(Err);
8590 if (!
I.Strtab.empty())
8597 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8598 F.StrtabForSymtab = *Strtab;
8614 if (
F.Symtab.empty())
8615 F.Symtab = *SymtabOrErr;
8620 return std::move(Err);
8625 return std::move(E);
8640BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8641 bool ShouldLazyLoadMetadata,
bool IsImporting,
8645 std::string ProducerIdentification;
8646 if (IdentificationBit != -1ull) {
8648 return std::move(JumpFailed);
8651 return std::move(
E);
8655 return std::move(JumpFailed);
8656 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8659 std::unique_ptr<Module>
M =
8660 std::make_unique<Module>(ModuleIdentifier,
Context);
8661 M->setMaterializer(R);
8664 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8665 IsImporting, Callbacks))
8666 return std::move(Err);
8668 if (MaterializeAll) {
8670 if (
Error Err =
M->materializeAll())
8671 return std::move(Err);
8674 if (
Error Err =
R->materializeForwardReferencedFunctions())
8675 return std::move(Err);
8678 return std::move(M);
8681Expected<std::unique_ptr<Module>>
8684 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8699 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8700 ModulePath, IsPrevailing);
8701 return R.parseModule();
8708 return std::move(JumpFailed);
8710 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8711 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8712 ModuleIdentifier, 0);
8714 if (
Error Err = R.parseModule())
8715 return std::move(Err);
8717 return std::move(Index);
8723 return std::move(Err);
8729 return std::move(
E);
8731 switch (Entry.Kind) {
8734 return error(
"Malformed block");
8737 return std::make_pair(
false,
false);
8749 switch (MaybeBitCode.
get()) {
8755 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8757 bool EnableSplitLTOUnit = Flags & 0x8;
8758 bool UnifiedLTO = Flags & 0x200;
8759 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8770 return std::move(JumpFailed);
8773 return std::move(Err);
8778 return std::move(E);
8780 switch (Entry.Kind) {
8782 return error(
"Malformed block");
8793 return Flags.takeError();
8803 return std::move(Err);
8810 return StreamFailed.takeError();
8820 if (MsOrErr->size() != 1)
8821 return error(
"Expected a single module");
8823 return (*MsOrErr)[0];
8826Expected<std::unique_ptr<Module>>
8828 bool ShouldLazyLoadMetadata,
bool IsImporting,
8834 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8839 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8840 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8842 IsImporting, Callbacks);
8844 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8850 return getModuleImpl(Context,
true,
false,
false, Callbacks);
8862 return BM->parseModule(Context, Callbacks);
8895 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
8904 return BM->getSummary();
8912 return BM->getLTOInfo();
8917 bool IgnoreEmptyThinLTOIndexFile) {
8922 if (IgnoreEmptyThinLTOIndexFile && !(*FileOrErr)->getBufferSize())
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static void getDecodedRelBFCallEdgeInfo(uint64_t RawFlags, uint64_t &RelBF, bool &HasTailCall)
static void upgradeDLLImportExportLinkage(GlobalValue *GV, unsigned Val)
static cl::opt< bool > PrintSummaryGUIDs("print-summary-global-ids", cl::init(false), cl::Hidden, cl::desc("Print the global id for each value when reading the module summary"))
static AtomicOrdering getDecodedOrdering(unsigned Val)
static std::pair< CalleeInfo::HotnessType, bool > getDecodedHotnessCallEdgeInfo(uint64_t RawFlags)
static FunctionSummary::FFlags getDecodedFFlags(uint64_t RawFlags)
static std::optional< CodeModel::Model > getDecodedCodeModel(unsigned Val)
static void setSpecialRefs(SmallVectorImpl< ValueInfo > &Refs, unsigned ROCnt, unsigned WOCnt)
static bool getDecodedDSOLocal(unsigned Val)
static bool convertToString(ArrayRef< uint64_t > Record, unsigned Idx, StrTy &Result)
Convert a string from a record into an std::string, return true on failure.
static GlobalVariable::UnnamedAddr getDecodedUnnamedAddrType(unsigned Val)
static void stripTBAA(Module *M)
static int getDecodedUnaryOpcode(unsigned Val, Type *Ty)
static Expected< std::string > readTriple(BitstreamCursor &Stream)
static void parseWholeProgramDevirtResolutionByArg(ArrayRef< uint64_t > Record, size_t &Slot, WholeProgramDevirtResolution &Wpd)
static uint64_t getRawAttributeMask(Attribute::AttrKind Val)
static GlobalValueSummary::GVFlags getDecodedGVSummaryFlags(uint64_t RawFlags, uint64_t Version)
static GlobalVarSummary::GVarFlags getDecodedGVarFlags(uint64_t RawFlags)
static Attribute::AttrKind getAttrFromCode(uint64_t Code)
static Expected< uint64_t > jumpToValueSymbolTable(uint64_t Offset, BitstreamCursor &Stream)
Helper to note and return the current location, and jump to the given offset.
static Expected< bool > hasObjCCategoryInModule(BitstreamCursor &Stream)
static GlobalValue::DLLStorageClassTypes getDecodedDLLStorageClass(unsigned Val)
static GEPNoWrapFlags toGEPNoWrapFlags(uint64_t Flags)
static void decodeLLVMAttributesForBitcode(AttrBuilder &B, uint64_t EncodedAttrs, uint64_t AttrIdx)
This fills an AttrBuilder object with the LLVM attributes that have been decoded from the given integ...
static 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 AtomicRMWInst::BinOp getDecodedRMWOperation(unsigned Val)
static Expected< BitcodeModule > getSingleModule(MemoryBufferRef Buffer)
static Expected< bool > hasObjCCategory(BitstreamCursor &Stream)
static GlobalVariable::ThreadLocalMode getDecodedThreadLocalMode(unsigned Val)
static void parseWholeProgramDevirtResolution(ArrayRef< uint64_t > Record, StringRef Strtab, size_t &Slot, TypeIdSummary &TypeId)
static void inferDSOLocal(GlobalValue *GV)
static FastMathFlags getDecodedFastMathFlags(unsigned Val)
GlobalValue::SanitizerMetadata deserializeSanitizerMetadata(unsigned V)
static Expected< BitstreamCursor > initStream(MemoryBufferRef Buffer)
static cl::opt< bool > ExpandConstantExprs("expand-constant-exprs", cl::Hidden, cl::desc("Expand constant expressions to instructions for testing purposes"))
static bool upgradeOldMemoryAttribute(MemoryEffects &ME, uint64_t EncodedKind)
static Expected< StringRef > readBlobInRecord(BitstreamCursor &Stream, unsigned Block, unsigned RecordID)
static Expected< std::string > readIdentificationBlock(BitstreamCursor &Stream)
Read the "IDENTIFICATION_BLOCK_ID" block, do some basic enforcement on the "epoch" encoded in the bit...
static Expected< std::pair< bool, bool > > getEnableSplitLTOUnitAndUnifiedFlag(BitstreamCursor &Stream, unsigned ID)
static bool isConstExprSupported(const BitcodeConstant *BC)
static int getDecodedCastOpcode(unsigned Val)
static Expected< std::string > readModuleTriple(BitstreamCursor &Stream)
static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static StringRef getOpcodeName(uint8_t Opcode, uint8_t OpcodeBase)
This file defines the DenseMap class.
Provides ErrorOr<T> smart pointer.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Module.h This file contains the declarations for the Module class.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
Machine Check Debug Module
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
PowerPC Reduce CR logical Operation
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines the SmallString class.
This file defines the SmallVector class.
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
PointerType * getType() const
Overload to return most specific pointer type.
void setUsedWithInAlloca(bool V)
Specify whether this alloca is used to represent the arguments to a call.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
bool empty() const
empty - 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
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
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 if the block is well formed or null if the block is not well forme...
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Represents a module in a bitcode file.
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getSummary()
Parse the specified bitcode buffer, returning the module summary index.
LLVM_ABI Expected< BitcodeLTOInfo > getLTOInfo()
Returns information about the module to be used for LTO: whether to compile with ThinLTO,...
LLVM_ABI Error readSummary(ModuleSummaryIndex &CombinedIndex, StringRef ModulePath, std::function< bool(GlobalValue::GUID)> IsPrevailing=nullptr)
Parse the specified bitcode buffer and merge its module summary index into CombinedIndex.
LLVM_ABI Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyModule(LLVMContext &Context, bool ShouldLazyLoadMetadata, bool IsImporting, ParserCallbacks Callbacks={})
Read the bitcode module and prepare for lazy deserialization of function bodies.
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
void push_back(Value *V, unsigned TypeID)
void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV)
Error assignValue(unsigned Idx, Value *V, unsigned TypeID)
void shrinkTo(unsigned N)
unsigned getTypeID(unsigned ValNo) const
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
ArrayRef< uint8_t > getBitcodeBytes() const
Expected< word_t > Read(unsigned NumBits)
Expected< BitstreamEntry > advance(unsigned Flags=0)
Advance the current bitstream, returning the next entry in the stream.
Expected< BitstreamEntry > advanceSkippingSubblocks(unsigned Flags=0)
This is a convenience function for clients that don't expect any subblocks.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Error EnterSubBlock(unsigned BlockID, unsigned *NumWordsP=nullptr)
Having read the ENTER_SUBBLOCK abbrevid, and enter the block.
Error SkipBlock()
Having read the ENTER_SUBBLOCK abbrevid and a BlockID, skip over the body of this block.
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
uint64_t getCurrentByteNo() const
LLVM_ABI Expected< std::optional< BitstreamBlockInfo > > ReadBlockInfoBlock(bool ReadBlockInfoNames=false)
Read and return a block info block from the bitstream.
unsigned getAbbrevIDWidth() const
Return the number of bits used to encode an abbrev #.
bool canSkipToPos(size_t pos) const
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
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)
void emplace(Args &&...A)
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)
This method constructs a CDS and initializes it with a text string.
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
static LLVM_ABI Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of array type with a float element type taken from argument ...
static LLVM_ABI Constant * get(LLVMContext &Context, ArrayRef< uint8_t > Elts)
get() constructors - Return a constant with vector type with an element count and element type matchi...
static LLVM_ABI Constant * getFP(Type *ElementType, ArrayRef< uint16_t > Elts)
getFP() constructors - Return a constant of vector type with a float element type taken from argument...
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static LLVM_ABI bool isSupportedBinOp(unsigned Opcode)
Whether creating a constant expression for this binary operator is supported.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI bool isSupportedCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is supported.
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
static LLVM_ABI bool isOrderedRanges(ArrayRef< ConstantRange > RangesRef)
LLVM_ABI bool isUpperSignWrapped() const
Return true if the (exclusive) upper bound wraps around the signed domain.
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
static LLVM_ABI Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
static DeadOnReturnInfo createFromIntValue(uint64_t Data)
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Base class for error info classes.
virtual std::string message() const
Return the error message as a string.
virtual std::error_code convertToErrorCode() const =0
Convert this error to a std::error_code.
Represents either an error or a value T.
std::error_code getError() const
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
Convenience struct for specifying and reasoning about fast-math flags.
void setFast(bool B=true)
void setAllowContract(bool B=true)
void setAllowReciprocal(bool B=true)
void setNoSignedZeros(bool B=true)
void setNoNaNs(bool B=true)
void setAllowReassoc(bool B=true)
Flag setters.
void setApproxFunc(bool B=true)
void setNoInfs(bool B=true)
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
void addCallsite(CallsiteInfo &&Callsite)
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
void addAlloc(AllocInfo &&Alloc)
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
BasicBlockListType::iterator iterator
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags noUnsignedSignedWrap()
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
static LLVM_ABI GlobalIFunc * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Resolver, Module *Parent)
If a parent module is specified, the ifunc is automatically inserted into the end of the specified mo...
LLVM_ABI void setComdat(Comdat *C)
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
void setOriginalName(GlobalValue::GUID Name)
Initialize the original name hash in this summary.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
static bool isLocalLinkage(LinkageTypes Linkage)
void setUnnamedAddr(UnnamedAddr Val)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
bool hasLocalLinkage() const
bool hasDefaultVisibility() const
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
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
ValueT lookup(const KeyT &Key) const
size_t getBufferSize() const
StringRef getBufferIdentifier() const
const char * getBufferStart() const
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
static MemoryEffectsBase readOnly()
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase errnoMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase createFromIntValue(uint32_t Data)
static MemoryEffectsBase writeOnly()
static MemoryEffectsBase otherMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase none()
static MemoryEffectsBase unknown()
Class to hold module path string table and global value map, and encapsulate methods for operating on...
TypeIdSummary & getOrInsertTypeIdSummary(StringRef TypeId)
Return an existing or new TypeIdSummary entry for TypeId.
ModulePathStringTableTy::value_type ModuleInfo
ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID)
Return a ValueInfo for GUID.
static constexpr uint64_t BitcodeSummaryVersion
StringRef saveString(StringRef String)
LLVM_ABI void setFlags(uint64_t Flags)
CfiFunctionIndex & cfiFunctionDecls()
void addBlockCount(uint64_t C)
ModuleInfo * addModule(StringRef ModPath, ModuleHash Hash=ModuleHash{{0}})
Add a new module with the given Hash, mapped to the given ModID, and return a reference to the module...
void addGlobalValueSummary(const GlobalValue &GV, std::unique_ptr< GlobalValueSummary > Summary)
Add a global value summary for a value.
CfiFunctionIndex & cfiFunctionDefs()
GlobalValueSummary * findSummaryInModule(ValueInfo VI, StringRef ModuleId) const
Find the summary for ValueInfo VI in module ModuleId, or nullptr if not found.
unsigned addOrGetStackIdIndex(uint64_t StackId)
ModuleInfo * getModule(StringRef ModPath)
Return module entry for module with the given ModPath.
void addOriginalName(GlobalValue::GUID ValueGUID, GlobalValue::GUID OrigGUID)
Add an original name for the value of the given GUID.
TypeIdCompatibleVtableInfo & getOrInsertTypeIdCompatibleVtableSummary(StringRef TypeId)
Return an existing or new TypeIdCompatibleVtableMap entry for TypeId.
A Module instance is used to store all the information related to an LLVM module.
const Triple & getTargetTriple() const
Get the target triple which is a string describing the target host.
NamedMDNode * getNamedMetadata(StringRef Name) const
Return the first NamedMDNode in the module with the specified name.
NamedMDNode * getOrInsertNamedMetadata(StringRef Name)
Return the named MDNode in the module with the specified name.
Comdat * getOrInsertComdat(StringRef Name)
Return the Comdat in the module with the specified name.
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
static ResumeInst * Create(Value *Exn, InsertPosition InsertBefore=nullptr)
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
ArrayRef< int > getShuffleMask() const
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.
StringRef - 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
empty - Check if the string is empty.
constexpr size_t size() const
size - Get the string size.
constexpr const char * data() const
data - 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
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
LLVM_ABI unsigned getStructNumElements() const
LLVM_ABI uint64_t getArrayNumElements() const
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isStructTy() const
True if this is an instance of StructType.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isIntegerTy() const
True if this is an instance of IntegerType.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
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 *IfTrue, InsertPosition InsertBefore=nullptr)
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
std::pair< iterator, bool > insert(const ValueT &V)
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
const ParentTy * getParent() const
self_iterator getIterator()
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
constexpr uint8_t RecordLength
Length of the parts of a physical GOFF record.
@ BasicBlock
Various leaf nodes.
LLVM_ABI AttributeList getAttributes(LLVMContext &C, ID id, FunctionType *FT)
Return the attributes for an intrinsic.
@ SingleThread
Synchronized with respect to signal handlers executing in the same thread.
@ System
Synchronized with respect to all concurrently executing threads.
@ TYPE_CODE_OPAQUE_POINTER
@ FS_CONTEXT_RADIX_TREE_ARRAY
@ FS_COMBINED_GLOBALVAR_INIT_REFS
@ FS_TYPE_CHECKED_LOAD_VCALLS
@ FS_COMBINED_ORIGINAL_NAME
@ FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_CONST_VCALL
@ FS_PERMODULE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_VCALLS
@ FS_COMBINED_ALLOC_INFO_NO_CONTEXT
@ FS_COMBINED_CALLSITE_INFO
@ FS_PERMODULE_CALLSITE_INFO
@ FS_PERMODULE_ALLOC_INFO
@ FS_TYPE_CHECKED_LOAD_CONST_VCALL
@ IDENTIFICATION_CODE_EPOCH
@ IDENTIFICATION_CODE_STRING
@ CST_CODE_CE_INBOUNDS_GEP
@ CST_CODE_INLINEASM_OLD3
@ CST_CODE_CE_GEP_WITH_INRANGE_INDEX_OLD
@ CST_CODE_DSO_LOCAL_EQUIVALENT
@ CST_CODE_INLINEASM_OLD2
@ CST_CODE_CE_GEP_WITH_INRANGE
@ VST_CODE_COMBINED_ENTRY
@ COMDAT_SELECTION_KIND_LARGEST
@ COMDAT_SELECTION_KIND_ANY
@ COMDAT_SELECTION_KIND_SAME_SIZE
@ COMDAT_SELECTION_KIND_EXACT_MATCH
@ COMDAT_SELECTION_KIND_NO_DUPLICATES
@ ATTR_KIND_STACK_PROTECT
@ ATTR_KIND_STACK_PROTECT_STRONG
@ ATTR_KIND_SANITIZE_MEMORY
@ ATTR_KIND_OPTIMIZE_FOR_SIZE
@ ATTR_KIND_INACCESSIBLEMEM_ONLY
@ ATTR_KIND_FNRETTHUNK_EXTERN
@ ATTR_KIND_NO_DIVERGENCE_SOURCE
@ ATTR_KIND_SANITIZE_ADDRESS
@ ATTR_KIND_NO_IMPLICIT_FLOAT
@ ATTR_KIND_DEAD_ON_UNWIND
@ ATTR_KIND_STACK_ALIGNMENT
@ ATTR_KIND_INACCESSIBLEMEM_OR_ARGMEMONLY
@ ATTR_KIND_STACK_PROTECT_REQ
@ ATTR_KIND_NULL_POINTER_IS_VALID
@ ATTR_KIND_SANITIZE_HWADDRESS
@ ATTR_KIND_RETURNS_TWICE
@ ATTR_KIND_SHADOWCALLSTACK
@ ATTR_KIND_OPT_FOR_FUZZING
@ ATTR_KIND_DENORMAL_FPENV
@ ATTR_KIND_SANITIZE_NUMERICAL_STABILITY
@ ATTR_KIND_ALLOCATED_POINTER
@ ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION
@ ATTR_KIND_CORO_ELIDE_SAFE
@ ATTR_KIND_NON_LAZY_BIND
@ ATTR_KIND_DEREFERENCEABLE
@ ATTR_KIND_OPTIMIZE_NONE
@ ATTR_KIND_DEREFERENCEABLE_OR_NULL
@ ATTR_KIND_SANITIZE_REALTIME
@ ATTR_KIND_SPECULATIVE_LOAD_HARDENING
@ ATTR_KIND_ALWAYS_INLINE
@ ATTR_KIND_SANITIZE_TYPE
@ ATTR_KIND_PRESPLIT_COROUTINE
@ ATTR_KIND_SANITIZE_ALLOC_TOKEN
@ ATTR_KIND_NO_SANITIZE_COVERAGE
@ ATTR_KIND_NO_CREATE_UNDEF_OR_POISON
@ ATTR_KIND_DEAD_ON_RETURN
@ ATTR_KIND_SANITIZE_REALTIME_BLOCKING
@ ATTR_KIND_NO_SANITIZE_BOUNDS
@ ATTR_KIND_SANITIZE_MEMTAG
@ ATTR_KIND_CORO_ONLY_DESTROY_WHEN_COMPLETE
@ ATTR_KIND_SANITIZE_THREAD
@ ATTR_KIND_OPTIMIZE_FOR_DEBUGGING
@ SYNC_SCOPE_NAMES_BLOCK_ID
@ PARAMATTR_GROUP_BLOCK_ID
@ IDENTIFICATION_BLOCK_ID
@ GLOBALVAL_SUMMARY_BLOCK_ID
@ FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID
@ OPERAND_BUNDLE_TAGS_BLOCK_ID
@ BLOCKINFO_BLOCK_ID
BLOCKINFO_BLOCK is used to define metadata about blocks, for example, standard abbrevs that should be...
@ MODULE_CODE_SOURCE_FILENAME
@ MODULE_CODE_SECTIONNAME
@ FUNC_CODE_INST_ATOMICRMW_OLD
@ FUNC_CODE_INST_CATCHRET
@ FUNC_CODE_INST_LANDINGPAD
@ FUNC_CODE_INST_EXTRACTVAL
@ FUNC_CODE_INST_CATCHPAD
@ FUNC_CODE_INST_CATCHSWITCH
@ FUNC_CODE_INST_INBOUNDS_GEP_OLD
@ FUNC_CODE_INST_STOREATOMIC_OLD
@ FUNC_CODE_INST_CLEANUPRET
@ FUNC_CODE_INST_LANDINGPAD_OLD
@ FUNC_CODE_DEBUG_RECORD_VALUE
@ FUNC_CODE_INST_LOADATOMIC
@ FUNC_CODE_DEBUG_RECORD_ASSIGN
@ FUNC_CODE_INST_STOREATOMIC
@ FUNC_CODE_INST_ATOMICRMW
@ FUNC_CODE_DEBUG_RECORD_DECLARE_VALUE
@ FUNC_CODE_DEBUG_LOC_AGAIN
@ FUNC_CODE_INST_EXTRACTELT
@ FUNC_CODE_INST_INDIRECTBR
@ FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE
@ FUNC_CODE_INST_INSERTVAL
@ FUNC_CODE_DECLAREBLOCKS
@ FUNC_CODE_DEBUG_RECORD_LABEL
@ FUNC_CODE_INST_INSERTELT
@ FUNC_CODE_BLOCKADDR_USERS
@ FUNC_CODE_INST_CLEANUPPAD
@ FUNC_CODE_INST_SHUFFLEVEC
@ FUNC_CODE_INST_STORE_OLD
@ FUNC_CODE_INST_UNREACHABLE
@ FUNC_CODE_INST_CMPXCHG_OLD
@ FUNC_CODE_DEBUG_RECORD_DECLARE
@ FUNC_CODE_OPERAND_BUNDLE
@ PARAMATTR_CODE_ENTRY_OLD
@ PARAMATTR_GRP_CODE_ENTRY
initializer< Ty > init(const Ty &Val)
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
NodeAddr< FuncNode * > Func
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
FunctionAddr VTableAddr Value
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
StringMapEntry< Value * > ValueName
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
LLVM_ABI const std::error_category & BitcodeErrorCategory()
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
LLVM_ABI Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
LLVM_ABI void UpgradeInlineAsmString(std::string *AsmStr)
Upgrade comment in call to inline asm that represents an objc retain release marker.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
std::error_code make_error_code(BitcodeError E)
LLVM_ABI bool stripDebugInfo(Function &F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Expected< bool > isBitcodeContainingObjCCategory(MemoryBufferRef Buffer)
Return true if Buffer contains a bitcode file with ObjC code (category or class) in it.
void handleAllErrors(Error E, HandlerTs &&... Handlers)
Behaves the same as handleErrors, except that by contract all errors must be handled by the given han...
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI void UpgradeAttributes(AttrBuilder &B)
Upgrade attributes that changed format or kind.
LLVM_ABI Expected< std::string > getBitcodeTargetTriple(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the triple information.
LLVM_ABI std::unique_ptr< Module > parseModule(const uint8_t *Data, size_t Size, LLVMContext &Context)
Fuzzer friendly interface for the llvm bitcode parser.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI Expected< BitcodeFileContents > getBitcodeFileContents(MemoryBufferRef Buffer)
Returns the contents of a bitcode file.
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
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.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
LLVM_ABI void UpgradeOperandBundles(std::vector< OperandBundleDef > &OperandBundles)
Upgrade operand bundles (without knowing about their user instruction).
LLVM_ABI Constant * UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy)
This is an auto-upgrade for bitcast constant expression between pointers with different address space...
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndex(MemoryBufferRef Buffer)
Parse the specified bitcode buffer, returning the module summary index.
auto dyn_cast_or_null(const Y &Val)
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
FunctionAddr VTableAddr uintptr_t uintptr_t Version
LLVM_ABI Expected< std::string > getBitcodeProducerString(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the producer string information.
auto reverse(ContainerTy &&C)
LLVM_ABI Expected< std::unique_ptr< Module > > getLazyBitcodeModule(MemoryBufferRef Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Read the header of the specified bitcode buffer and prepare for lazy deserialization of function bodi...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
detail::ValueMatchesPoly< M > HasValue(M Matcher)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI std::string UpgradeDataLayoutString(StringRef DL, StringRef Triple)
Upgrade the datalayout string by adding a section for address space pointers.
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
LLVM_ABI Expected< BitcodeLTOInfo > getBitcodeLTOInfo(MemoryBufferRef Buffer)
Returns LTO information for the specified bitcode file.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI GlobalVariable * UpgradeGlobalVariable(GlobalVariable *GV)
This checks for global variables which should be upgraded.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
LLVM_ABI bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
AtomicOrdering
Atomic ordering for LLVM's memory model.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
@ ArgMem
Access to memory via argument pointers.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
LLVM_ABI Instruction * UpgradeBitCastInst(unsigned Opc, Value *V, Type *DestTy, Instruction *&Temp)
This is an auto-upgrade for bitcast between pointers with different address spaces: the instruction i...
MaybeAlign decodeMaybeAlign(unsigned Value)
Dual operation of the encode function above.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
bool SkipBitcodeWrapperHeader(const unsigned char *&BufPtr, const unsigned char *&BufEnd, bool VerifyBufferSize)
SkipBitcodeWrapperHeader - Some systems wrap bc files with a special header for padding or other reas...
bool isBitcodeWrapper(const unsigned char *BufPtr, const unsigned char *BufEnd)
isBitcodeWrapper - Return true if the given bytes are the magic bytes for an LLVM IR bitcode wrapper.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
gep_type_iterator gep_type_begin(const User *GEP)
LLVM_ABI APInt readWideAPInt(ArrayRef< uint64_t > Vals, unsigned TypeBits)
LLVM_ABI Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
LLVM_ABI void UpgradeFunctionAttributes(Function &F)
Correct any IR that is relying on old function attribute behavior.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
BumpPtrAllocatorImpl<> BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
LLVM_ABI Error readModuleSummaryIndex(MemoryBufferRef Buffer, ModuleSummaryIndex &CombinedIndex)
Parse the specified bitcode buffer and merge the index into CombinedIndex.
LLVM_ABI void UpgradeARCRuntime(Module &M)
Convert calls to ARC runtime functions to intrinsic calls and upgrade the old retain release marker t...
LLVM_ABI Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndexForFile(StringRef Path, bool IgnoreEmptyThinLTOIndexFile=false)
Parse the module summary index out of an IR file and return the module summary index object if found,...
LLVM_ABI Expected< std::unique_ptr< Module > > getOwningLazyBitcodeModule(std::unique_ptr< MemoryBuffer > &&Buffer, LLVMContext &Context, bool ShouldLazyLoadMetadata=false, bool IsImporting=false, ParserCallbacks Callbacks={})
Like getLazyBitcodeModule, except that the module takes ownership of the memory buffer if successful.
LLVM_ABI std::error_code errorToErrorCodeAndEmitErrors(LLVMContext &Ctx, Error Err)
Implement std::hash so that hash_code can be used in STL containers.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Basic information extracted from a bitcode module to be used for LTO.
static Bitfield::Type get(StorageType Packed)
Unpacks the field from the Packed value.
When advancing through a bitstream cursor, each advance can discover a few different kinds of entries...
static constexpr DenormalFPEnv createFromIntValue(uint32_t Data)
Flags specific to function summaries.
static constexpr uint32_t RangeWidth
std::vector< Call > Calls
In the per-module summary, it summarizes the byte offset applied to each pointer parameter before pas...
ConstantRange Use
The range contains byte offsets from the parameter pointer which accessed by the function.
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
static LLVM_ABI const char * BranchWeights
std::optional< ValueTypeCallbackTy > ValueType
The ValueType callback is called for every function definition or declaration and allows accessing th...
std::optional< DataLayoutCallbackFuncTy > DataLayout
std::optional< MDTypeCallbackTy > MDType
The MDType callback is called for every value in metadata.
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
Kind
Specifies which kind of type check we should emit for this byte array.
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
ValID - Represents a reference of a definition of some sort with no type.
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...
std::string SingleImplName