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 = {});
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())
793 unsigned ValID = Record[
Slot++];
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;
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");
881 unsigned BitWidth = Record[OpNum++];
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;
988 ModuleSummaryIndexBitcodeReader(
989 BitstreamCursor Stream, StringRef Strtab, ModuleSummaryIndex &TheIndex,
990 StringRef ModulePath,
996 void setValueGUID(uint64_t ValueID, StringRef
ValueName,
998 StringRef SourceFileName);
999 Error parseValueSymbolTable(
1001 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
1004 makeCallList(ArrayRef<uint64_t> Record,
bool IsOldProfileFormat,
1005 bool HasProfile,
bool HasRelBF);
1006 Error parseEntireSummary(
unsigned ID);
1007 Error parseModuleStringTable();
1008 void parseTypeIdCompatibleVtableSummaryRecord(ArrayRef<uint64_t> Record);
1009 void parseTypeIdCompatibleVtableInfo(ArrayRef<uint64_t> Record,
size_t &Slot,
1011 std::vector<FunctionSummary::ParamAccess>
1012 parseParamAccesses(ArrayRef<uint64_t> Record);
1013 SmallVector<unsigned> parseAllocInfoContext(ArrayRef<uint64_t> Record,
1016 template <
bool AllowNullValueInfo = false>
1017 std::pair<ValueInfo, GlobalValue::GUID>
1018 getValueInfoFromValueId(
unsigned ValueId);
1020 void addThisModule();
1036 return std::error_code();
1042 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1043 ValueList(this->Stream.SizeInBytes(),
1045 return materializeValue(
ValID, InsertBB);
1047 this->ProducerIdentification = std::string(ProducerIdentification);
1050Error BitcodeReader::materializeForwardReferencedFunctions() {
1051 if (WillMaterializeAllForwardRefs)
1055 WillMaterializeAllForwardRefs =
true;
1057 while (!BasicBlockFwdRefQueue.empty()) {
1058 Function *
F = BasicBlockFwdRefQueue.front();
1059 BasicBlockFwdRefQueue.pop_front();
1060 assert(
F &&
"Expected valid function");
1061 if (!BasicBlockFwdRefs.
count(
F))
1069 if (!
F->isMaterializable())
1070 return error(
"Never resolved function from blockaddress");
1073 if (
Error Err = materialize(
F))
1076 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1078 for (Function *
F : BackwardRefFunctions)
1079 if (
Error Err = materialize(
F))
1081 BackwardRefFunctions.clear();
1084 WillMaterializeAllForwardRefs =
false;
1149 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1150 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1151 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1152 Flags.NoInline = (RawFlags >> 4) & 0x1;
1153 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1154 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1155 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1156 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1157 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1173 RawFlags = RawFlags >> 4;
1174 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1178 bool Live = (RawFlags & 0x2) || Version < 3;
1179 bool Local = (RawFlags & 0x4);
1180 bool AutoHide = (RawFlags & 0x8);
1183 Live,
Local, AutoHide, IK);
1189 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1190 (RawFlags & 0x4) ?
true :
false,
1194static std::pair<CalleeInfo::HotnessType, bool>
1198 bool HasTailCall = (RawFlags & 0x8);
1199 return {Hotness, HasTailCall};
1203 bool &HasTailCall) {
1204 static constexpr uint64_t RelBlockFreqMask =
1206 RelBF = RawFlags & RelBlockFreqMask;
1232 case 0:
return false;
1233 case 1:
return true;
1295 bool IsFP = Ty->isFPOrFPVectorTy();
1297 if (!IsFP && !Ty->isIntOrIntVectorTy())
1304 return IsFP ? Instruction::FNeg : -1;
1309 bool IsFP = Ty->isFPOrFPVectorTy();
1311 if (!IsFP && !Ty->isIntOrIntVectorTy())
1318 return IsFP ? Instruction::FAdd : Instruction::Add;
1320 return IsFP ? Instruction::FSub : Instruction::Sub;
1322 return IsFP ? Instruction::FMul : Instruction::Mul;
1324 return IsFP ? -1 : Instruction::UDiv;
1326 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1328 return IsFP ? -1 : Instruction::URem;
1330 return IsFP ? Instruction::FRem : Instruction::SRem;
1332 return IsFP ? -1 : Instruction::Shl;
1334 return IsFP ? -1 : Instruction::LShr;
1336 return IsFP ? -1 : Instruction::AShr;
1338 return IsFP ? -1 : Instruction::And;
1340 return IsFP ? -1 : Instruction::Or;
1342 return IsFP ? -1 : Instruction::Xor;
1439Type *BitcodeReader::getTypeByID(
unsigned ID) {
1441 if (
ID >= TypeList.size())
1444 if (
Type *Ty = TypeList[
ID])
1449 return TypeList[
ID] = createIdentifiedStructType(
Context);
1452unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1453 auto It = ContainedTypeIDs.
find(
ID);
1454 if (It == ContainedTypeIDs.
end())
1455 return InvalidTypeID;
1457 if (Idx >= It->second.size())
1458 return InvalidTypeID;
1460 return It->second[Idx];
1463Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1464 if (
ID >= TypeList.size())
1471 return getTypeByID(getContainedTypeID(
ID, 0));
1474unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1475 ArrayRef<unsigned> ChildTypeIDs) {
1476 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1477 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1478 auto It = VirtualTypeIDs.
find(CacheKey);
1479 if (It != VirtualTypeIDs.
end()) {
1485 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1486 "Incorrect cached contained type IDs");
1490 unsigned TypeID = TypeList.size();
1491 TypeList.push_back(Ty);
1492 if (!ChildTypeIDs.
empty())
1513 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1527 if (Opcode == Instruction::GetElementPtr)
1531 case Instruction::FNeg:
1532 case Instruction::Select:
1533 case Instruction::ICmp:
1534 case Instruction::FCmp:
1541Expected<Value *> BitcodeReader::materializeValue(
unsigned StartValID,
1542 BasicBlock *InsertBB) {
1544 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1546 return ValueList[StartValID];
1548 SmallDenseMap<unsigned, Value *> MaterializedValues;
1549 SmallVector<unsigned> Worklist;
1551 while (!Worklist.
empty()) {
1552 unsigned ValID = Worklist.
back();
1553 if (MaterializedValues.
count(ValID)) {
1559 if (ValID >= ValueList.
size() || !ValueList[ValID])
1560 return error(
"Invalid value ID");
1562 Value *
V = ValueList[ValID];
1565 MaterializedValues.
insert({ValID,
V});
1573 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1574 auto It = MaterializedValues.
find(OpID);
1575 if (It != MaterializedValues.
end())
1576 Ops.push_back(It->second);
1583 if (
Ops.size() != BC->getOperandIDs().size())
1585 std::reverse(
Ops.begin(),
Ops.end());
1602 switch (BC->Opcode) {
1603 case BitcodeConstant::ConstantPtrAuthOpcode: {
1606 return error(
"ptrauth key operand must be ConstantInt");
1610 return error(
"ptrauth disc operand must be ConstantInt");
1613 ConstOps.
size() > 4 ? ConstOps[4]
1618 "ptrauth deactivation symbol operand must be a pointer");
1621 DeactivationSymbol);
1624 case BitcodeConstant::NoCFIOpcode: {
1627 return error(
"no_cfi operand must be GlobalValue");
1631 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1634 return error(
"dso_local operand must be GlobalValue");
1638 case BitcodeConstant::BlockAddressOpcode: {
1641 return error(
"blockaddress operand must be a function");
1646 unsigned BBID = BC->BlockAddressBB;
1649 return error(
"Invalid ID");
1652 for (
size_t I = 0,
E = BBID;
I !=
E; ++
I) {
1654 return error(
"Invalid ID");
1661 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1663 BasicBlockFwdRefQueue.push_back(Fn);
1664 if (FwdBBs.size() < BBID + 1)
1665 FwdBBs.resize(BBID + 1);
1673 case BitcodeConstant::ConstantStructOpcode: {
1675 if (
ST->getNumElements() != ConstOps.
size())
1676 return error(
"Invalid number of elements in struct initializer");
1678 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1679 if (
Op->getType() != Ty)
1680 return error(
"Incorrect type in struct initializer");
1685 case BitcodeConstant::ConstantArrayOpcode: {
1687 if (AT->getNumElements() != ConstOps.
size())
1688 return error(
"Invalid number of elements in array initializer");
1690 for (Constant *
Op : ConstOps)
1691 if (
Op->getType() != AT->getElementType())
1692 return error(
"Incorrect type in array initializer");
1697 case BitcodeConstant::ConstantVectorOpcode: {
1699 if (VT->getNumElements() != ConstOps.size())
1700 return error(
"Invalid number of elements in vector initializer");
1702 for (Constant *
Op : ConstOps)
1703 if (
Op->getType() != VT->getElementType())
1704 return error(
"Incorrect type in vector initializer");
1709 case Instruction::GetElementPtr:
1711 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1714 case Instruction::ExtractElement:
1717 case Instruction::InsertElement:
1721 case Instruction::ShuffleVector: {
1722 SmallVector<int, 16>
Mask;
1734 MaterializedValues.
insert({ValID,
C});
1740 return error(Twine(
"Value referenced by initializer is an unsupported "
1741 "constant expression of type ") +
1742 BC->getOpcodeName());
1748 BC->getType(),
"constexpr", InsertBB);
1751 "constexpr", InsertBB);
1754 Ops[1],
"constexpr", InsertBB);
1757 I->setHasNoSignedWrap();
1759 I->setHasNoUnsignedWrap();
1765 switch (BC->Opcode) {
1766 case BitcodeConstant::ConstantVectorOpcode: {
1767 Type *IdxTy = Type::getInt32Ty(BC->getContext());
1770 Value *Idx = ConstantInt::get(IdxTy, Pair.index());
1777 case BitcodeConstant::ConstantStructOpcode:
1778 case BitcodeConstant::ConstantArrayOpcode: {
1782 "constexpr.ins", InsertBB);
1786 case Instruction::ICmp:
1787 case Instruction::FCmp:
1790 "constexpr", InsertBB);
1792 case Instruction::GetElementPtr:
1798 case Instruction::Select:
1801 case Instruction::ExtractElement:
1804 case Instruction::InsertElement:
1808 case Instruction::ShuffleVector:
1809 I =
new ShuffleVectorInst(
Ops[0],
Ops[1],
Ops[2],
"constexpr",
1817 MaterializedValues.
insert({ValID,
I});
1821 return MaterializedValues[StartValID];
1824Expected<Constant *> BitcodeReader::getValueForInitializer(
unsigned ID) {
1825 Expected<Value *> MaybeV = materializeValue(
ID,
nullptr);
1833StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context,
1836 IdentifiedStructTypes.push_back(Ret);
1840StructType *BitcodeReader::createIdentifiedStructType(LLVMContext &
Context) {
1842 IdentifiedStructTypes.push_back(Ret);
1858 case Attribute::ZExt:
return 1 << 0;
1859 case Attribute::SExt:
return 1 << 1;
1860 case Attribute::NoReturn:
return 1 << 2;
1861 case Attribute::InReg:
return 1 << 3;
1862 case Attribute::StructRet:
return 1 << 4;
1863 case Attribute::NoUnwind:
return 1 << 5;
1864 case Attribute::NoAlias:
return 1 << 6;
1865 case Attribute::ByVal:
return 1 << 7;
1866 case Attribute::Nest:
return 1 << 8;
1867 case Attribute::ReadNone:
return 1 << 9;
1868 case Attribute::ReadOnly:
return 1 << 10;
1869 case Attribute::NoInline:
return 1 << 11;
1870 case Attribute::AlwaysInline:
return 1 << 12;
1871 case Attribute::OptimizeForSize:
return 1 << 13;
1872 case Attribute::StackProtect:
return 1 << 14;
1873 case Attribute::StackProtectReq:
return 1 << 15;
1874 case Attribute::Alignment:
return 31 << 16;
1876 case Attribute::NoRedZone:
return 1 << 22;
1877 case Attribute::NoImplicitFloat:
return 1 << 23;
1878 case Attribute::Naked:
return 1 << 24;
1879 case Attribute::InlineHint:
return 1 << 25;
1880 case Attribute::StackAlignment:
return 7 << 26;
1881 case Attribute::ReturnsTwice:
return 1 << 29;
1882 case Attribute::UWTable:
return 1 << 30;
1883 case Attribute::NonLazyBind:
return 1U << 31;
1884 case Attribute::SanitizeAddress:
return 1ULL << 32;
1885 case Attribute::MinSize:
return 1ULL << 33;
1886 case Attribute::NoDuplicate:
return 1ULL << 34;
1887 case Attribute::StackProtectStrong:
return 1ULL << 35;
1888 case Attribute::SanitizeThread:
return 1ULL << 36;
1889 case Attribute::SanitizeMemory:
return 1ULL << 37;
1890 case Attribute::NoBuiltin:
return 1ULL << 38;
1891 case Attribute::Returned:
return 1ULL << 39;
1892 case Attribute::Cold:
return 1ULL << 40;
1893 case Attribute::Builtin:
return 1ULL << 41;
1894 case Attribute::OptimizeNone:
return 1ULL << 42;
1895 case Attribute::InAlloca:
return 1ULL << 43;
1896 case Attribute::NonNull:
return 1ULL << 44;
1897 case Attribute::JumpTable:
return 1ULL << 45;
1898 case Attribute::Convergent:
return 1ULL << 46;
1899 case Attribute::SafeStack:
return 1ULL << 47;
1900 case Attribute::NoRecurse:
return 1ULL << 48;
1903 case Attribute::SwiftSelf:
return 1ULL << 51;
1904 case Attribute::SwiftError:
return 1ULL << 52;
1905 case Attribute::WriteOnly:
return 1ULL << 53;
1906 case Attribute::Speculatable:
return 1ULL << 54;
1907 case Attribute::StrictFP:
return 1ULL << 55;
1908 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1909 case Attribute::NoCfCheck:
return 1ULL << 57;
1910 case Attribute::OptForFuzzing:
return 1ULL << 58;
1911 case Attribute::ShadowCallStack:
return 1ULL << 59;
1912 case Attribute::SpeculativeLoadHardening:
1914 case Attribute::ImmArg:
1916 case Attribute::WillReturn:
1918 case Attribute::NoFree:
1934 if (
I == Attribute::Alignment)
1935 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1936 else if (
I == Attribute::StackAlignment)
1937 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1939 B.addTypeAttr(
I,
nullptr);
1953 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
1955 "Alignment must be a power of two.");
1958 B.addAlignmentAttr(Alignment);
1960 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
1961 (EncodedAttrs & 0xffff);
1963 if (AttrIdx == AttributeList::FunctionIndex) {
1966 if (Attrs & (1ULL << 9)) {
1968 Attrs &= ~(1ULL << 9);
1971 if (Attrs & (1ULL << 10)) {
1973 Attrs &= ~(1ULL << 10);
1976 if (Attrs & (1ULL << 49)) {
1978 Attrs &= ~(1ULL << 49);
1981 if (Attrs & (1ULL << 50)) {
1983 Attrs &= ~(1ULL << 50);
1986 if (Attrs & (1ULL << 53)) {
1988 Attrs &= ~(1ULL << 53);
1992 B.addMemoryAttr(ME);
1996 if (Attrs & (1ULL << 21)) {
1997 Attrs &= ~(1ULL << 21);
2004Error BitcodeReader::parseAttributeBlock() {
2008 if (!MAttributes.empty())
2009 return error(
"Invalid multiple blocks");
2011 SmallVector<uint64_t, 64> Record;
2017 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2020 BitstreamEntry
Entry = MaybeEntry.
get();
2022 switch (
Entry.Kind) {
2025 return error(
"Malformed block");
2035 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
2038 switch (MaybeRecord.
get()) {
2043 if (Record.
size() & 1)
2044 return error(
"Invalid parameter attribute record");
2046 for (
unsigned i = 0, e = Record.
size(); i != e; i += 2) {
2052 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2056 for (uint64_t Val : Record)
2057 Attrs.push_back(MAttributeGroups[Val]);
2059 MAttributes.push_back(AttributeList::get(
Context, Attrs));
2072 return Attribute::Alignment;
2074 return Attribute::AlwaysInline;
2076 return Attribute::Builtin;
2078 return Attribute::ByVal;
2080 return Attribute::InAlloca;
2082 return Attribute::Cold;
2084 return Attribute::Convergent;
2086 return Attribute::DisableSanitizerInstrumentation;
2088 return Attribute::ElementType;
2090 return Attribute::FnRetThunkExtern;
2092 return Attribute::InlineHint;
2094 return Attribute::InReg;
2096 return Attribute::JumpTable;
2098 return Attribute::Memory;
2100 return Attribute::NoFPClass;
2102 return Attribute::MinSize;
2104 return Attribute::Naked;
2106 return Attribute::Nest;
2108 return Attribute::NoAlias;
2110 return Attribute::NoBuiltin;
2112 return Attribute::NoCallback;
2114 return Attribute::NoDivergenceSource;
2116 return Attribute::NoDuplicate;
2118 return Attribute::NoFree;
2120 return Attribute::NoImplicitFloat;
2122 return Attribute::NoInline;
2124 return Attribute::NoRecurse;
2126 return Attribute::NoMerge;
2128 return Attribute::NonLazyBind;
2130 return Attribute::NonNull;
2132 return Attribute::Dereferenceable;
2134 return Attribute::DereferenceableOrNull;
2136 return Attribute::AllocAlign;
2138 return Attribute::AllocKind;
2140 return Attribute::AllocSize;
2142 return Attribute::AllocatedPointer;
2144 return Attribute::NoRedZone;
2146 return Attribute::NoReturn;
2148 return Attribute::NoSync;
2150 return Attribute::NoCfCheck;
2152 return Attribute::NoProfile;
2154 return Attribute::SkipProfile;
2156 return Attribute::NoUnwind;
2158 return Attribute::NoSanitizeBounds;
2160 return Attribute::NoSanitizeCoverage;
2162 return Attribute::NullPointerIsValid;
2164 return Attribute::OptimizeForDebugging;
2166 return Attribute::OptForFuzzing;
2168 return Attribute::OptimizeForSize;
2170 return Attribute::OptimizeNone;
2172 return Attribute::ReadNone;
2174 return Attribute::ReadOnly;
2176 return Attribute::Returned;
2178 return Attribute::ReturnsTwice;
2180 return Attribute::SExt;
2182 return Attribute::Speculatable;
2184 return Attribute::StackAlignment;
2186 return Attribute::StackProtect;
2188 return Attribute::StackProtectReq;
2190 return Attribute::StackProtectStrong;
2192 return Attribute::SafeStack;
2194 return Attribute::ShadowCallStack;
2196 return Attribute::StrictFP;
2198 return Attribute::StructRet;
2200 return Attribute::SanitizeAddress;
2202 return Attribute::SanitizeHWAddress;
2204 return Attribute::SanitizeThread;
2206 return Attribute::SanitizeType;
2208 return Attribute::SanitizeMemory;
2210 return Attribute::SanitizeNumericalStability;
2212 return Attribute::SanitizeRealtime;
2214 return Attribute::SanitizeRealtimeBlocking;
2216 return Attribute::SanitizeAllocToken;
2218 return Attribute::SpeculativeLoadHardening;
2220 return Attribute::SwiftError;
2222 return Attribute::SwiftSelf;
2224 return Attribute::SwiftAsync;
2226 return Attribute::UWTable;
2228 return Attribute::VScaleRange;
2230 return Attribute::WillReturn;
2232 return Attribute::WriteOnly;
2234 return Attribute::ZExt;
2236 return Attribute::ImmArg;
2238 return Attribute::SanitizeMemTag;
2240 return Attribute::Preallocated;
2242 return Attribute::NoUndef;
2244 return Attribute::ByRef;
2246 return Attribute::MustProgress;
2248 return Attribute::Hot;
2250 return Attribute::PresplitCoroutine;
2252 return Attribute::Writable;
2254 return Attribute::CoroDestroyOnlyWhenComplete;
2256 return Attribute::DeadOnUnwind;
2258 return Attribute::Range;
2260 return Attribute::Initializes;
2262 return Attribute::CoroElideSafe;
2264 return Attribute::NoExt;
2266 return Attribute::Captures;
2268 return Attribute::DeadOnReturn;
2270 return Attribute::NoCreateUndefOrPoison;
2275 MaybeAlign &Alignment) {
2278 if (
Exponent > Value::MaxAlignmentExponent + 1)
2279 return error(
"Invalid alignment value");
2284Error BitcodeReader::parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind) {
2286 if (*Kind == Attribute::None)
2287 return error(
"Unknown attribute kind (" + Twine(Code) +
")");
2292 switch (EncodedKind) {
2316Error BitcodeReader::parseAttributeGroupBlock() {
2320 if (!MAttributeGroups.empty())
2321 return error(
"Invalid multiple blocks");
2323 SmallVector<uint64_t, 64> Record;
2327 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2330 BitstreamEntry
Entry = MaybeEntry.
get();
2332 switch (
Entry.Kind) {
2335 return error(
"Malformed block");
2345 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
2348 switch (MaybeRecord.
get()) {
2352 if (Record.
size() < 3)
2353 return error(
"Invalid grp record");
2355 uint64_t GrpID = Record[0];
2356 uint64_t Idx = Record[1];
2360 for (
unsigned i = 2, e = Record.
size(); i != e; ++i) {
2361 if (Record[i] == 0) {
2362 Attribute::AttrKind
Kind;
2363 uint64_t EncodedKind = Record[++i];
2364 if (Idx == AttributeList::FunctionIndex &&
2373 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2379 if (Kind == Attribute::ByVal)
2380 B.addByValAttr(
nullptr);
2381 else if (Kind == Attribute::StructRet)
2382 B.addStructRetAttr(
nullptr);
2383 else if (Kind == Attribute::InAlloca)
2384 B.addInAllocaAttr(
nullptr);
2385 else if (Kind == Attribute::UWTable)
2386 B.addUWTableAttr(UWTableKind::Default);
2387 else if (Attribute::isEnumAttrKind(Kind))
2388 B.addAttribute(Kind);
2390 return error(
"Not an enum attribute");
2391 }
else if (Record[i] == 1) {
2392 Attribute::AttrKind
Kind;
2393 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2395 if (!Attribute::isIntAttrKind(Kind))
2396 return error(
"Not an int attribute");
2397 if (Kind == Attribute::Alignment)
2398 B.addAlignmentAttr(Record[++i]);
2399 else if (Kind == Attribute::StackAlignment)
2400 B.addStackAlignmentAttr(Record[++i]);
2401 else if (Kind == Attribute::Dereferenceable)
2402 B.addDereferenceableAttr(Record[++i]);
2403 else if (Kind == Attribute::DereferenceableOrNull)
2404 B.addDereferenceableOrNullAttr(Record[++i]);
2405 else if (Kind == Attribute::AllocSize)
2406 B.addAllocSizeAttrFromRawRepr(Record[++i]);
2407 else if (Kind == Attribute::VScaleRange)
2408 B.addVScaleRangeAttrFromRawRepr(Record[++i]);
2409 else if (Kind == Attribute::UWTable)
2411 else if (Kind == Attribute::AllocKind)
2412 B.addAllocKindAttr(
static_cast<AllocFnKind>(Record[++i]));
2413 else if (Kind == Attribute::Memory) {
2414 uint64_t EncodedME = Record[++i];
2415 const uint8_t
Version = (EncodedME >> 56);
2427 B.addMemoryAttr(ME);
2432 EncodedME & 0x00FFFFFFFFFFFFFFULL));
2434 }
else if (Kind == Attribute::Captures)
2436 else if (Kind == Attribute::NoFPClass)
2439 }
else if (Record[i] == 3 || Record[i] == 4) {
2440 bool HasValue = (Record[i++] == 4);
2441 SmallString<64> KindStr;
2442 SmallString<64> ValStr;
2444 while (Record[i] != 0 && i != e)
2445 KindStr += Record[i++];
2446 assert(Record[i] == 0 &&
"Kind string not null terminated");
2451 while (Record[i] != 0 && i != e)
2452 ValStr += Record[i++];
2453 assert(Record[i] == 0 &&
"Value string not null terminated");
2456 B.addAttribute(KindStr.
str(), ValStr.
str());
2457 }
else if (Record[i] == 5 || Record[i] == 6) {
2458 bool HasType = Record[i] == 6;
2459 Attribute::AttrKind
Kind;
2460 if (
Error Err = parseAttrKind(Record[++i], &Kind))
2462 if (!Attribute::isTypeAttrKind(Kind))
2463 return error(
"Not a type attribute");
2465 B.addTypeAttr(Kind, HasType ? getTypeByID(Record[++i]) :
nullptr);
2466 }
else if (Record[i] == 7) {
2467 Attribute::AttrKind
Kind;
2470 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2472 if (!Attribute::isConstantRangeAttrKind(Kind))
2473 return error(
"Not a ConstantRange attribute");
2475 Expected<ConstantRange> MaybeCR =
2476 readBitWidthAndConstantRange(Record, i);
2481 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2482 }
else if (Record[i] == 8) {
2483 Attribute::AttrKind
Kind;
2486 if (
Error Err = parseAttrKind(Record[i++], &Kind))
2488 if (!Attribute::isConstantRangeListAttrKind(Kind))
2489 return error(
"Not a constant range list attribute");
2493 return error(
"Too few records for constant range list");
2494 unsigned RangeSize = Record[i++];
2496 for (
unsigned Idx = 0; Idx < RangeSize; ++Idx) {
2497 Expected<ConstantRange> MaybeCR =
2498 readConstantRange(Record, i,
BitWidth);
2506 return error(
"Invalid (unordered or overlapping) range list");
2507 B.addConstantRangeListAttr(Kind, Val);
2509 return error(
"Invalid attribute group entry");
2514 B.addMemoryAttr(ME);
2517 MAttributeGroups[GrpID] = AttributeList::get(
Context, Idx,
B);
2524Error BitcodeReader::parseTypeTable() {
2528 return parseTypeTableBody();
2531Error BitcodeReader::parseTypeTableBody() {
2532 if (!TypeList.empty())
2533 return error(
"Invalid multiple blocks");
2535 SmallVector<uint64_t, 64> Record;
2536 unsigned NumRecords = 0;
2542 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2545 BitstreamEntry
Entry = MaybeEntry.
get();
2547 switch (
Entry.Kind) {
2550 return error(
"Malformed block");
2552 if (NumRecords != TypeList.size())
2553 return error(
"Malformed block");
2562 Type *ResultTy =
nullptr;
2563 SmallVector<unsigned> ContainedIDs;
2564 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
2567 switch (MaybeRecord.
get()) {
2569 return error(
"Invalid value");
2574 return error(
"Invalid numentry record");
2575 TypeList.resize(Record[0]);
2578 ResultTy = Type::getVoidTy(
Context);
2581 ResultTy = Type::getHalfTy(
Context);
2584 ResultTy = Type::getBFloatTy(
Context);
2587 ResultTy = Type::getFloatTy(
Context);
2590 ResultTy = Type::getDoubleTy(
Context);
2593 ResultTy = Type::getX86_FP80Ty(
Context);
2596 ResultTy = Type::getFP128Ty(
Context);
2599 ResultTy = Type::getPPC_FP128Ty(
Context);
2602 ResultTy = Type::getLabelTy(
Context);
2605 ResultTy = Type::getMetadataTy(
Context);
2613 ResultTy = Type::getX86_AMXTy(
Context);
2616 ResultTy = Type::getTokenTy(
Context);
2620 return error(
"Invalid integer record");
2622 uint64_t NumBits = Record[0];
2625 return error(
"Bitwidth for integer type out of range");
2632 return error(
"Invalid pointer record");
2634 if (Record.
size() == 2)
2636 ResultTy = getTypeByID(Record[0]);
2638 !PointerType::isValidElementType(ResultTy))
2639 return error(
"Invalid type");
2645 if (Record.
size() != 1)
2646 return error(
"Invalid opaque pointer record");
2654 if (Record.
size() < 3)
2655 return error(
"Invalid function record");
2657 for (
unsigned i = 3, e = Record.
size(); i != e; ++i) {
2658 if (
Type *
T = getTypeByID(Record[i]))
2664 ResultTy = getTypeByID(Record[2]);
2665 if (!ResultTy || ArgTys.
size() < Record.
size()-3)
2666 return error(
"Invalid type");
2669 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2674 if (Record.
size() < 2)
2675 return error(
"Invalid function record");
2677 for (
unsigned i = 2, e = Record.
size(); i != e; ++i) {
2678 if (
Type *
T = getTypeByID(Record[i])) {
2679 if (!FunctionType::isValidArgumentType(
T))
2680 return error(
"Invalid function argument type");
2687 ResultTy = getTypeByID(Record[1]);
2688 if (!ResultTy || ArgTys.
size() < Record.
size()-2)
2689 return error(
"Invalid type");
2692 ResultTy = FunctionType::get(ResultTy, ArgTys, Record[0]);
2697 return error(
"Invalid anon struct record");
2699 for (
unsigned i = 1, e = Record.
size(); i != e; ++i) {
2700 if (
Type *
T = getTypeByID(Record[i]))
2705 if (EltTys.
size() != Record.
size()-1)
2706 return error(
"Invalid type");
2713 return error(
"Invalid struct name record");
2718 return error(
"Invalid named struct record");
2720 if (NumRecords >= TypeList.size())
2721 return error(
"Invalid TYPE table");
2727 TypeList[NumRecords] =
nullptr;
2729 Res = createIdentifiedStructType(
Context, TypeName);
2733 for (
unsigned i = 1, e = Record.
size(); i != e; ++i) {
2734 if (
Type *
T = getTypeByID(Record[i]))
2739 if (EltTys.
size() != Record.
size()-1)
2740 return error(
"Invalid named struct record");
2748 if (Record.
size() != 1)
2749 return error(
"Invalid opaque type record");
2751 if (NumRecords >= TypeList.size())
2752 return error(
"Invalid TYPE table");
2758 TypeList[NumRecords] =
nullptr;
2760 Res = createIdentifiedStructType(
Context, TypeName);
2766 if (Record.
size() < 1)
2767 return error(
"Invalid target extension type record");
2769 if (NumRecords >= TypeList.size())
2770 return error(
"Invalid TYPE table");
2772 if (Record[0] >= Record.
size())
2773 return error(
"Too many type parameters");
2775 unsigned NumTys = Record[0];
2777 SmallVector<unsigned, 8> IntParams;
2778 for (
unsigned i = 0; i < NumTys; i++) {
2779 if (
Type *
T = getTypeByID(Record[i + 1]))
2782 return error(
"Invalid type");
2785 for (
unsigned i = NumTys + 1, e = Record.
size(); i < e; i++) {
2786 if (Record[i] > UINT_MAX)
2787 return error(
"Integer parameter too large");
2792 if (
auto E = TTy.takeError())
2799 if (Record.
size() < 2)
2800 return error(
"Invalid array type record");
2801 ResultTy = getTypeByID(Record[1]);
2802 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2803 return error(
"Invalid type");
2805 ResultTy = ArrayType::get(ResultTy, Record[0]);
2809 if (Record.
size() < 2)
2810 return error(
"Invalid vector type record");
2812 return error(
"Invalid vector length");
2813 ResultTy = getTypeByID(Record[1]);
2814 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2815 return error(
"Invalid type");
2816 bool Scalable = Record.
size() > 2 ? Record[2] :
false;
2818 ResultTy = VectorType::get(ResultTy, Record[0], Scalable);
2822 if (NumRecords >= TypeList.size())
2823 return error(
"Invalid TYPE table");
2824 if (TypeList[NumRecords])
2826 "Invalid TYPE table: Only named structs can be forward referenced");
2827 assert(ResultTy &&
"Didn't read a type?");
2828 TypeList[NumRecords] = ResultTy;
2829 if (!ContainedIDs.
empty())
2830 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2835Error BitcodeReader::parseOperandBundleTags() {
2839 if (!BundleTags.empty())
2840 return error(
"Invalid multiple blocks");
2842 SmallVector<uint64_t, 64> Record;
2845 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2848 BitstreamEntry
Entry = MaybeEntry.
get();
2850 switch (
Entry.Kind) {
2853 return error(
"Malformed block");
2863 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
2867 return error(
"Invalid operand bundle record");
2870 BundleTags.emplace_back();
2872 return error(
"Invalid operand bundle record");
2877Error BitcodeReader::parseSyncScopeNames() {
2882 return error(
"Invalid multiple synchronization scope names blocks");
2884 SmallVector<uint64_t, 64> Record;
2886 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2889 BitstreamEntry
Entry = MaybeEntry.
get();
2891 switch (
Entry.Kind) {
2894 return error(
"Malformed block");
2897 return error(
"Invalid empty synchronization scope names block");
2907 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
2911 return error(
"Invalid sync scope record");
2913 SmallString<16> SSN;
2915 return error(
"Invalid sync scope record");
2923Expected<Value *> BitcodeReader::recordValue(SmallVectorImpl<uint64_t> &Record,
2924 unsigned NameIndex, Triple &TT) {
2927 return error(
"Invalid record");
2928 unsigned ValueID = Record[0];
2929 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2930 return error(
"Invalid record");
2931 Value *
V = ValueList[ValueID];
2934 if (NameStr.contains(0))
2935 return error(
"Invalid value name");
2936 V->setName(NameStr);
2938 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
2951 return std::move(JumpFailed);
2957 return error(
"Expected value symbol table subblock");
2961void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
2963 ArrayRef<uint64_t> Record) {
2967 uint64_t FuncWordOffset = Record[1] - 1;
2968 uint64_t FuncBitOffset = FuncWordOffset * 32;
2969 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
2973 if (FuncBitOffset > LastFunctionBlockBit)
2974 LastFunctionBlockBit = FuncBitOffset;
2978Error BitcodeReader::parseGlobalValueSymbolTable() {
2979 unsigned FuncBitcodeOffsetDelta =
2985 SmallVector<uint64_t, 64> Record;
2987 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
2990 BitstreamEntry
Entry = MaybeEntry.
get();
2992 switch (
Entry.Kind) {
2995 return error(
"Malformed block");
3003 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
3006 switch (MaybeRecord.
get()) {
3008 unsigned ValueID = Record[0];
3009 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
3010 return error(
"Invalid value reference in symbol table");
3011 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
3021Error BitcodeReader::parseValueSymbolTable(uint64_t
Offset) {
3022 uint64_t CurrentBit;
3028 if (!MaybeCurrentBit)
3030 CurrentBit = MaybeCurrentBit.
get();
3033 if (
Error Err = parseGlobalValueSymbolTable())
3035 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
3054 unsigned FuncBitcodeOffsetDelta =
3060 SmallVector<uint64_t, 64> Record;
3068 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
3071 BitstreamEntry
Entry = MaybeEntry.
get();
3073 switch (
Entry.Kind) {
3076 return error(
"Malformed block");
3079 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
3089 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
3092 switch (MaybeRecord.
get()) {
3096 Expected<Value *> ValOrErr = recordValue(Record, 1, TT);
3104 Expected<Value *> ValOrErr = recordValue(Record, 2, TT);
3112 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F, Record);
3117 return error(
"Invalid bbentry record");
3120 return error(
"Invalid bbentry record");
3132uint64_t BitcodeReader::decodeSignRotatedValue(uint64_t V) {
3142Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3143 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3144 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3145 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3147 GlobalInitWorklist.swap(GlobalInits);
3148 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3149 FunctionOperandWorklist.swap(FunctionOperands);
3151 while (!GlobalInitWorklist.empty()) {
3152 unsigned ValID = GlobalInitWorklist.back().second;
3153 if (ValID >= ValueList.
size()) {
3155 GlobalInits.push_back(GlobalInitWorklist.back());
3157 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3160 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3162 GlobalInitWorklist.pop_back();
3165 while (!IndirectSymbolInitWorklist.empty()) {
3166 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3167 if (ValID >= ValueList.
size()) {
3168 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3170 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3174 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3177 return error(
"Alias and aliasee types don't match");
3182 return error(
"Expected an alias or an ifunc");
3185 IndirectSymbolInitWorklist.pop_back();
3188 while (!FunctionOperandWorklist.empty()) {
3189 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3190 if (
Info.PersonalityFn) {
3191 unsigned ValID =
Info.PersonalityFn - 1;
3192 if (ValID < ValueList.
size()) {
3193 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3196 Info.F->setPersonalityFn(MaybeC.
get());
3197 Info.PersonalityFn = 0;
3201 unsigned ValID =
Info.Prefix - 1;
3202 if (ValID < ValueList.
size()) {
3203 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3206 Info.F->setPrefixData(MaybeC.
get());
3210 if (
Info.Prologue) {
3211 unsigned ValID =
Info.Prologue - 1;
3212 if (ValID < ValueList.
size()) {
3213 Expected<Constant *> MaybeC = getValueForInitializer(ValID);
3216 Info.F->setPrologueData(MaybeC.
get());
3220 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3221 FunctionOperands.push_back(
Info);
3222 FunctionOperandWorklist.pop_back();
3231 BitcodeReader::decodeSignRotatedValue);
3233 return APInt(TypeBits, Words);
3236Error BitcodeReader::parseConstants() {
3244 unsigned Int32TyID = getVirtualTypeID(CurTy);
3245 unsigned CurTyID = Int32TyID;
3246 Type *CurElemTy =
nullptr;
3247 unsigned NextCstNo = ValueList.
size();
3255 switch (Entry.Kind) {
3258 return error(
"Malformed block");
3260 if (NextCstNo != ValueList.
size())
3261 return error(
"Invalid constant reference");
3272 Expected<unsigned> MaybeBitCode = Stream.readRecord(
Entry.ID, Record);
3275 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3285 return error(
"Invalid settype record");
3286 if (Record[0] >= TypeList.size() || !TypeList[Record[0]])
3287 return error(
"Invalid settype record");
3288 if (TypeList[Record[0]] == VoidType)
3289 return error(
"Invalid constant type");
3290 CurTyID = Record[0];
3291 CurTy = TypeList[CurTyID];
3292 CurElemTy = getPtrElementTypeByID(CurTyID);
3296 return error(
"Invalid type for a constant null value");
3299 return error(
"Invalid type for a constant null value");
3304 return error(
"Invalid integer const record");
3309 return error(
"Invalid wide integer const record");
3312 APInt VInt =
readWideAPInt(Record, ScalarTy->getBitWidth());
3313 V = ConstantInt::get(CurTy, VInt);
3318 return error(
"Invalid float const record");
3321 if (ScalarTy->isHalfTy())
3322 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3323 APInt(16, (uint16_t)Record[0])));
3324 else if (ScalarTy->isBFloatTy())
3325 V = ConstantFP::get(
3326 CurTy,
APFloat(APFloat::BFloat(), APInt(16, (uint32_t)Record[0])));
3327 else if (ScalarTy->isFloatTy())
3328 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3329 APInt(32, (uint32_t)Record[0])));
3330 else if (ScalarTy->isDoubleTy())
3331 V = ConstantFP::get(
3332 CurTy,
APFloat(APFloat::IEEEdouble(), APInt(64, Record[0])));
3333 else if (ScalarTy->isX86_FP80Ty()) {
3335 uint64_t Rearrange[2];
3336 Rearrange[0] = (Record[1] & 0xffffLL) | (Record[0] << 16);
3337 Rearrange[1] = Record[0] >> 48;
3338 V = ConstantFP::get(
3339 CurTy,
APFloat(APFloat::x87DoubleExtended(), APInt(80, Rearrange)));
3340 }
else if (ScalarTy->isFP128Ty())
3341 V = ConstantFP::get(CurTy,
3342 APFloat(APFloat::IEEEquad(), APInt(128, Record)));
3343 else if (ScalarTy->isPPC_FP128Ty())
3344 V = ConstantFP::get(
3345 CurTy,
APFloat(APFloat::PPCDoubleDouble(), APInt(128, Record)));
3353 return error(
"Invalid aggregate record");
3355 SmallVector<unsigned, 16> Elts;
3359 V = BitcodeConstant::create(
3360 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3362 V = BitcodeConstant::create(
Alloc, CurTy,
3363 BitcodeConstant::ConstantArrayOpcode, Elts);
3365 V = BitcodeConstant::create(
3366 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3375 return error(
"Invalid string record");
3377 SmallString<16> Elts(Record.begin(), Record.end());
3384 return error(
"Invalid data record");
3388 EltTy =
Array->getElementType();
3398 SmallVector<uint16_t, 16> Elts(Record.begin(), Record.end());
3404 SmallVector<uint32_t, 16> Elts(Record.begin(), Record.end());
3410 SmallVector<uint64_t, 16> Elts(Record.begin(), Record.end());
3416 SmallVector<uint16_t, 16> Elts(Record.begin(), Record.end());
3422 SmallVector<uint16_t, 16> Elts(Record.begin(), Record.end());
3428 SmallVector<uint32_t, 16> Elts(Record.begin(), Record.end());
3434 SmallVector<uint64_t, 16> Elts(Record.begin(), Record.end());
3440 return error(
"Invalid type for value");
3445 if (Record.size() < 2)
3446 return error(
"Invalid unary op constexpr record");
3451 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[1]);
3456 if (Record.size() < 3)
3457 return error(
"Invalid binary op constexpr record");
3463 if (Record.size() >= 4) {
3464 if (
Opc == Instruction::Add ||
3465 Opc == Instruction::Sub ||
3466 Opc == Instruction::Mul ||
3467 Opc == Instruction::Shl) {
3472 }
else if (
Opc == Instruction::SDiv ||
3473 Opc == Instruction::UDiv ||
3474 Opc == Instruction::LShr ||
3475 Opc == Instruction::AShr) {
3480 V = BitcodeConstant::create(
Alloc, CurTy, {(uint8_t)
Opc, Flags},
3481 {(unsigned)Record[1], (
unsigned)Record[2]});
3486 if (Record.size() < 3)
3487 return error(
"Invalid cast constexpr record");
3492 unsigned OpTyID = Record[1];
3493 Type *OpTy = getTypeByID(OpTyID);
3495 return error(
"Invalid cast constexpr record");
3496 V = BitcodeConstant::create(
Alloc, CurTy,
Opc, (
unsigned)Record[2]);
3507 if (Record.size() < 2)
3508 return error(
"Constant GEP record must have at least two elements");
3510 Type *PointeeType =
nullptr;
3514 PointeeType = getTypeByID(Record[OpNum++]);
3517 std::optional<ConstantRange>
InRange;
3519 uint64_t
Op = Record[OpNum++];
3521 unsigned InRangeIndex =
Op >> 1;
3526 Flags = Record[OpNum++];
3527 Expected<ConstantRange> MaybeInRange =
3528 readBitWidthAndConstantRange(Record, OpNum);
3533 Flags = Record[OpNum++];
3537 SmallVector<unsigned, 16> Elts;
3538 unsigned BaseTypeID = Record[OpNum];
3539 while (OpNum != Record.size()) {
3540 unsigned ElTyID = Record[OpNum++];
3541 Type *ElTy = getTypeByID(ElTyID);
3543 return error(
"Invalid getelementptr constexpr record");
3547 if (Elts.
size() < 1)
3548 return error(
"Invalid gep with no operands");
3552 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3553 BaseType = getTypeByID(BaseTypeID);
3558 return error(
"GEP base operand must be pointer or vector of pointer");
3561 PointeeType = getPtrElementTypeByID(BaseTypeID);
3563 return error(
"Missing element type for old-style constant GEP");
3566 V = BitcodeConstant::create(
3568 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3573 if (Record.size() < 3)
3574 return error(
"Invalid select constexpr record");
3576 V = BitcodeConstant::create(
3577 Alloc, CurTy, Instruction::Select,
3578 {(unsigned)Record[0], (
unsigned)Record[1], (unsigned)Record[2]});
3583 if (Record.size() < 3)
3584 return error(
"Invalid extractelement constexpr record");
3585 unsigned OpTyID = Record[0];
3589 return error(
"Invalid extractelement constexpr record");
3591 if (Record.size() == 4) {
3592 unsigned IdxTyID = Record[2];
3593 Type *IdxTy = getTypeByID(IdxTyID);
3595 return error(
"Invalid extractelement constexpr record");
3596 IdxRecord = Record[3];
3599 IdxRecord = Record[2];
3601 V = BitcodeConstant::create(
Alloc, CurTy, Instruction::ExtractElement,
3602 {(unsigned)Record[1], IdxRecord});
3608 if (Record.size() < 3 || !OpTy)
3609 return error(
"Invalid insertelement constexpr record");
3611 if (Record.size() == 4) {
3612 unsigned IdxTyID = Record[2];
3613 Type *IdxTy = getTypeByID(IdxTyID);
3615 return error(
"Invalid insertelement constexpr record");
3616 IdxRecord = Record[3];
3619 IdxRecord = Record[2];
3621 V = BitcodeConstant::create(
3622 Alloc, CurTy, Instruction::InsertElement,
3623 {(unsigned)Record[0], (
unsigned)Record[1], IdxRecord});
3628 if (Record.size() < 3 || !OpTy)
3629 return error(
"Invalid shufflevector constexpr record");
3630 V = BitcodeConstant::create(
3631 Alloc, CurTy, Instruction::ShuffleVector,
3632 {(unsigned)Record[0], (
unsigned)Record[1], (unsigned)Record[2]});
3639 if (Record.size() < 4 || !RTy || !OpTy)
3640 return error(
"Invalid shufflevector constexpr record");
3641 V = BitcodeConstant::create(
3642 Alloc, CurTy, Instruction::ShuffleVector,
3643 {(unsigned)Record[1], (
unsigned)Record[2], (unsigned)Record[3]});
3647 if (Record.size() < 4)
3648 return error(
"Invalid cmp constexpt record");
3649 unsigned OpTyID = Record[0];
3650 Type *OpTy = getTypeByID(OpTyID);
3652 return error(
"Invalid cmp constexpr record");
3653 V = BitcodeConstant::create(
3656 : Instruction::ICmp),
3657 (uint8_t)Record[3]},
3658 {(unsigned)Record[1], (
unsigned)Record[2]});
3664 if (Record.size() < 2)
3665 return error(
"Invalid inlineasm record");
3666 std::string AsmStr, ConstrStr;
3667 bool HasSideEffects = Record[0] & 1;
3668 bool IsAlignStack = Record[0] >> 1;
3669 unsigned AsmStrSize = Record[1];
3670 if (2+AsmStrSize >= Record.size())
3671 return error(
"Invalid inlineasm record");
3672 unsigned ConstStrSize = Record[2+AsmStrSize];
3673 if (3+AsmStrSize+ConstStrSize > Record.size())
3674 return error(
"Invalid inlineasm record");
3676 for (
unsigned i = 0; i != AsmStrSize; ++i)
3677 AsmStr += (
char)Record[2+i];
3678 for (
unsigned i = 0; i != ConstStrSize; ++i)
3679 ConstrStr += (
char)Record[3+AsmStrSize+i];
3682 return error(
"Missing element type for old-style inlineasm");
3684 HasSideEffects, IsAlignStack);
3690 if (Record.size() < 2)
3691 return error(
"Invalid inlineasm record");
3692 std::string AsmStr, ConstrStr;
3693 bool HasSideEffects = Record[0] & 1;
3694 bool IsAlignStack = (Record[0] >> 1) & 1;
3695 unsigned AsmDialect = Record[0] >> 2;
3696 unsigned AsmStrSize = Record[1];
3697 if (2+AsmStrSize >= Record.size())
3698 return error(
"Invalid inlineasm record");
3699 unsigned ConstStrSize = Record[2+AsmStrSize];
3700 if (3+AsmStrSize+ConstStrSize > Record.size())
3701 return error(
"Invalid inlineasm record");
3703 for (
unsigned i = 0; i != AsmStrSize; ++i)
3704 AsmStr += (
char)Record[2+i];
3705 for (
unsigned i = 0; i != ConstStrSize; ++i)
3706 ConstrStr += (
char)Record[3+AsmStrSize+i];
3709 return error(
"Missing element type for old-style inlineasm");
3711 HasSideEffects, IsAlignStack,
3717 if (Record.size() < 2)
3718 return error(
"Invalid inlineasm record");
3720 std::string AsmStr, ConstrStr;
3721 bool HasSideEffects = Record[OpNum] & 1;
3722 bool IsAlignStack = (Record[OpNum] >> 1) & 1;
3723 unsigned AsmDialect = (Record[OpNum] >> 2) & 1;
3724 bool CanThrow = (Record[OpNum] >> 3) & 1;
3726 unsigned AsmStrSize = Record[OpNum];
3728 if (OpNum + AsmStrSize >= Record.size())
3729 return error(
"Invalid inlineasm record");
3730 unsigned ConstStrSize = Record[OpNum + AsmStrSize];
3731 if (OpNum + 1 + AsmStrSize + ConstStrSize > Record.size())
3732 return error(
"Invalid inlineasm record");
3734 for (
unsigned i = 0; i != AsmStrSize; ++i)
3735 AsmStr += (
char)Record[OpNum + i];
3737 for (
unsigned i = 0; i != ConstStrSize; ++i)
3738 ConstrStr += (
char)Record[OpNum + AsmStrSize + i];
3741 return error(
"Missing element type for old-style inlineasm");
3743 HasSideEffects, IsAlignStack,
3749 if (Record.size() < 3)
3750 return error(
"Invalid inlineasm record");
3755 return error(
"Invalid inlineasm record");
3756 std::string AsmStr, ConstrStr;
3757 bool HasSideEffects = Record[OpNum] & 1;
3758 bool IsAlignStack = (Record[OpNum] >> 1) & 1;
3759 unsigned AsmDialect = (Record[OpNum] >> 2) & 1;
3760 bool CanThrow = (Record[OpNum] >> 3) & 1;
3762 unsigned AsmStrSize = Record[OpNum];
3764 if (OpNum + AsmStrSize >= Record.size())
3765 return error(
"Invalid inlineasm record");
3766 unsigned ConstStrSize = Record[OpNum + AsmStrSize];
3767 if (OpNum + 1 + AsmStrSize + ConstStrSize > Record.size())
3768 return error(
"Invalid inlineasm record");
3770 for (
unsigned i = 0; i != AsmStrSize; ++i)
3771 AsmStr += (
char)Record[OpNum + i];
3773 for (
unsigned i = 0; i != ConstStrSize; ++i)
3774 ConstrStr += (
char)Record[OpNum + AsmStrSize + i];
3776 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3781 if (Record.size() < 3)
3782 return error(
"Invalid blockaddress record");
3783 unsigned FnTyID = Record[0];
3784 Type *FnTy = getTypeByID(FnTyID);
3786 return error(
"Invalid blockaddress record");
3787 V = BitcodeConstant::create(
3789 {BitcodeConstant::BlockAddressOpcode, 0, (unsigned)Record[2]},
3794 if (Record.size() < 2)
3795 return error(
"Invalid dso_local record");
3796 unsigned GVTyID = Record[0];
3797 Type *GVTy = getTypeByID(GVTyID);
3799 return error(
"Invalid dso_local record");
3800 V = BitcodeConstant::create(
3801 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode, Record[1]);
3805 if (Record.size() < 2)
3806 return error(
"Invalid no_cfi record");
3807 unsigned GVTyID = Record[0];
3808 Type *GVTy = getTypeByID(GVTyID);
3810 return error(
"Invalid no_cfi record");
3811 V = BitcodeConstant::create(
Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3816 if (Record.size() < 4)
3817 return error(
"Invalid ptrauth record");
3819 V = BitcodeConstant::create(
Alloc, CurTy,
3820 BitcodeConstant::ConstantPtrAuthOpcode,
3821 {(unsigned)Record[0], (
unsigned)Record[1],
3822 (unsigned)Record[2], (
unsigned)Record[3]});
3826 if (Record.size() < 5)
3827 return error(
"Invalid ptrauth record");
3829 V = BitcodeConstant::create(
3830 Alloc, CurTy, BitcodeConstant::ConstantPtrAuthOpcode,
3831 {(unsigned)Record[0], (
unsigned)Record[1], (unsigned)Record[2],
3832 (
unsigned)Record[3], (unsigned)Record[4]});
3837 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3844Error BitcodeReader::parseUseLists() {
3849 SmallVector<uint64_t, 64> Record;
3852 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
3855 BitstreamEntry
Entry = MaybeEntry.
get();
3857 switch (
Entry.Kind) {
3860 return error(
"Malformed block");
3871 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
3874 switch (MaybeRecord.
get()) {
3882 if (RecordLength < 3)
3884 return error(
"Invalid record");
3889 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3890 V = FunctionBBs[
ID];
3894 if (!
V->hasUseList())
3897 unsigned NumUses = 0;
3898 SmallDenseMap<const Use *, unsigned, 16> Order;
3899 for (
const Use &U :
V->materialized_uses()) {
3900 if (++NumUses > Record.
size())
3902 Order[&
U] = Record[NumUses - 1];
3904 if (Order.
size() != Record.
size() || NumUses > Record.
size())
3909 V->sortUseList([&](
const Use &L,
const Use &R) {
3920Error BitcodeReader::rememberAndSkipMetadata() {
3922 uint64_t CurBit = Stream.GetCurrentBitNo();
3923 DeferredMetadataInfo.push_back(CurBit);
3926 if (
Error Err = Stream.SkipBlock())
3931Error BitcodeReader::materializeMetadata() {
3932 for (uint64_t BitPos : DeferredMetadataInfo) {
3934 if (
Error JumpFailed = Stream.JumpToBit(BitPos))
3936 if (
Error Err = MDLoader->parseModuleMetadata())
3945 NamedMDNode *LinkerOpts =
3947 for (
const MDOperand &MDOptions :
cast<MDNode>(Val)->operands())
3952 DeferredMetadataInfo.clear();
3956void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
3960Error BitcodeReader::rememberAndSkipFunctionBody() {
3962 if (FunctionsWithBodies.empty())
3963 return error(
"Insufficient function protos");
3965 Function *Fn = FunctionsWithBodies.back();
3966 FunctionsWithBodies.pop_back();
3969 uint64_t CurBit = Stream.GetCurrentBitNo();
3971 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
3972 "Mismatch between VST and scanned function offsets");
3973 DeferredFunctionInfo[Fn] = CurBit;
3976 if (
Error Err = Stream.SkipBlock())
3981Error BitcodeReader::globalCleanup() {
3983 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
3985 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
3986 return error(
"Malformed global initializer set");
3990 for (Function &
F : *TheModule) {
3991 MDLoader->upgradeDebugIntrinsics(
F);
3994 UpgradedIntrinsics[&
F] = NewFn;
4000 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
4001 for (GlobalVariable &GV : TheModule->globals())
4003 UpgradedVariables.emplace_back(&GV, Upgraded);
4004 for (
auto &Pair : UpgradedVariables) {
4005 Pair.first->eraseFromParent();
4006 TheModule->insertGlobalVariable(Pair.second);
4011 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
4012 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
4020Error BitcodeReader::rememberAndSkipFunctionBodies() {
4021 if (
Error JumpFailed = Stream.JumpToBit(NextUnreadBit))
4024 if (Stream.AtEndOfStream())
4025 return error(
"Could not find function in stream");
4027 if (!SeenFirstFunctionBody)
4028 return error(
"Trying to materialize functions before seeing function blocks");
4032 assert(SeenValueSymbolTable);
4035 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4038 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4040 switch (
Entry.Kind) {
4042 return error(
"Expect SubBlock");
4046 return error(
"Expect function block");
4048 if (
Error Err = rememberAndSkipFunctionBody())
4050 NextUnreadBit = Stream.GetCurrentBitNo();
4057Error BitcodeReaderBase::readBlockInfo() {
4058 Expected<std::optional<BitstreamBlockInfo>> MaybeNewBlockInfo =
4060 if (!MaybeNewBlockInfo)
4062 std::optional<BitstreamBlockInfo> NewBlockInfo =
4063 std::move(MaybeNewBlockInfo.
get());
4065 return error(
"Malformed block");
4066 BlockInfo = std::move(*NewBlockInfo);
4070Error BitcodeReader::parseComdatRecord(ArrayRef<uint64_t> Record) {
4074 std::tie(Name, Record) = readNameFromStrtab(Record);
4077 return error(
"Invalid record");
4079 std::string OldFormatName;
4081 if (Record.
size() < 2)
4082 return error(
"Invalid record");
4083 unsigned ComdatNameSize = Record[1];
4084 if (ComdatNameSize > Record.
size() - 2)
4085 return error(
"Comdat name size too large");
4086 OldFormatName.reserve(ComdatNameSize);
4087 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4088 OldFormatName += (
char)Record[2 + i];
4089 Name = OldFormatName;
4091 Comdat *
C = TheModule->getOrInsertComdat(Name);
4092 C->setSelectionKind(SK);
4093 ComdatList.push_back(
C);
4107 Meta.NoAddress =
true;
4109 Meta.NoHWAddress =
true;
4113 Meta.IsDynInit =
true;
4117Error BitcodeReader::parseGlobalVarRecord(ArrayRef<uint64_t> Record) {
4125 std::tie(Name, Record) = readNameFromStrtab(Record);
4127 if (Record.
size() < 6)
4128 return error(
"Invalid record");
4129 unsigned TyID = Record[0];
4130 Type *Ty = getTypeByID(TyID);
4132 return error(
"Invalid record");
4134 bool explicitType = Record[1] & 2;
4140 return error(
"Invalid type for value");
4142 TyID = getContainedTypeID(TyID);
4143 Ty = getTypeByID(TyID);
4145 return error(
"Missing element type for old-style global");
4148 uint64_t RawLinkage = Record[3];
4150 MaybeAlign Alignment;
4151 if (
Error Err = parseAlignmentValue(Record[4], Alignment))
4155 if (Record[5] - 1 >= SectionTable.size())
4156 return error(
"Invalid ID");
4157 Section = SectionTable[Record[5] - 1];
4165 GlobalVariable::ThreadLocalMode TLM = GlobalVariable::NotThreadLocal;
4166 if (Record.
size() > 7)
4170 if (Record.
size() > 8)
4173 bool ExternallyInitialized =
false;
4174 if (Record.
size() > 9)
4175 ExternallyInitialized = Record[9];
4177 GlobalVariable *NewGV =
4187 if (Record.
size() > 10) {
4199 if (
unsigned InitID = Record[2])
4200 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4202 if (Record.
size() > 11) {
4203 if (
unsigned ComdatID = Record[11]) {
4204 if (ComdatID > ComdatList.size())
4205 return error(
"Invalid global variable comdat ID");
4206 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4209 ImplicitComdatObjects.
insert(NewGV);
4212 if (Record.
size() > 12) {
4217 if (Record.
size() > 13) {
4223 if (Record.
size() > 15)
4224 NewGV->
setPartition(StringRef(Strtab.data() + Record[14], Record[15]));
4226 if (Record.
size() > 16 && Record[16]) {
4227 llvm::GlobalValue::SanitizerMetadata
Meta =
4232 if (Record.
size() > 17 && Record[17]) {
4236 return error(
"Invalid global variable code model");
4242void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4243 if (ValueTypeCallback) {
4244 (*ValueTypeCallback)(
4245 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4246 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4250Error BitcodeReader::parseFunctionRecord(ArrayRef<uint64_t> Record) {
4256 std::tie(Name, Record) = readNameFromStrtab(Record);
4258 if (Record.
size() < 8)
4259 return error(
"Invalid record");
4260 unsigned FTyID = Record[0];
4261 Type *FTy = getTypeByID(FTyID);
4263 return error(
"Invalid record");
4265 FTyID = getContainedTypeID(FTyID, 0);
4266 FTy = getTypeByID(FTyID);
4268 return error(
"Missing element type for old-style function");
4272 return error(
"Invalid type for value");
4273 auto CC =
static_cast<CallingConv::ID
>(Record[1]);
4274 if (CC & ~CallingConv::MaxID)
4275 return error(
"Invalid calling convention ID");
4277 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4278 if (Record.
size() > 16)
4279 AddrSpace = Record[16];
4283 AddrSpace, Name, TheModule);
4286 "Incorrect fully specified type provided for function");
4287 FunctionTypeIDs[
Func] = FTyID;
4289 Func->setCallingConv(CC);
4290 bool isProto = Record[2];
4291 uint64_t RawLinkage = Record[3];
4294 callValueTypeCallback(Func, FTyID);
4299 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4300 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4301 Attribute::InAlloca}) {
4302 if (!
Func->hasParamAttribute(i, Kind))
4305 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4308 Func->removeParamAttr(i, Kind);
4310 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4311 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4313 return error(
"Missing param element type for attribute upgrade");
4317 case Attribute::ByVal:
4318 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4320 case Attribute::StructRet:
4321 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4323 case Attribute::InAlloca:
4324 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4330 Func->addParamAttr(i, NewAttr);
4334 if (
Func->getCallingConv() == CallingConv::X86_INTR &&
4335 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4336 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4337 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4339 return error(
"Missing param element type for x86_intrcc upgrade");
4341 Func->addParamAttr(0, NewAttr);
4344 MaybeAlign Alignment;
4345 if (
Error Err = parseAlignmentValue(Record[5], Alignment))
4348 Func->setAlignment(*Alignment);
4350 if (Record[6] - 1 >= SectionTable.size())
4351 return error(
"Invalid ID");
4352 Func->setSection(SectionTable[Record[6] - 1]);
4356 if (!
Func->hasLocalLinkage())
4358 if (Record.
size() > 8 && Record[8]) {
4359 if (Record[8] - 1 >= GCTable.size())
4360 return error(
"Invalid ID");
4361 Func->setGC(GCTable[Record[8] - 1]);
4364 if (Record.
size() > 9)
4366 Func->setUnnamedAddr(UnnamedAddr);
4368 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4369 if (Record.
size() > 10)
4370 OperandInfo.Prologue = Record[10];
4372 if (Record.
size() > 11) {
4374 if (!
Func->hasLocalLinkage()) {
4381 if (Record.
size() > 12) {
4382 if (
unsigned ComdatID = Record[12]) {
4383 if (ComdatID > ComdatList.size())
4384 return error(
"Invalid function comdat ID");
4385 Func->setComdat(ComdatList[ComdatID - 1]);
4388 ImplicitComdatObjects.
insert(Func);
4391 if (Record.
size() > 13)
4392 OperandInfo.Prefix = Record[13];
4394 if (Record.
size() > 14)
4395 OperandInfo.PersonalityFn = Record[14];
4397 if (Record.
size() > 15) {
4406 if (Record.
size() > 18 && Strtab.data() &&
4407 Record[17] + Record[18] <= Strtab.size()) {
4408 Func->setPartition(StringRef(Strtab.data() + Record[17], Record[18]));
4411 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4413 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4414 FunctionOperands.push_back(OperandInfo);
4419 Func->setIsMaterializable(
true);
4420 FunctionsWithBodies.push_back(Func);
4421 DeferredFunctionInfo[
Func] = 0;
4426Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4427 unsigned BitCode, ArrayRef<uint64_t> Record) {
4437 std::tie(Name, Record) = readNameFromStrtab(Record);
4440 if (Record.
size() < (3 + (
unsigned)NewRecord))
4441 return error(
"Invalid record");
4443 unsigned TypeID = Record[OpNum++];
4446 return error(
"Invalid record");
4452 return error(
"Invalid type for value");
4453 AddrSpace = PTy->getAddressSpace();
4455 Ty = getTypeByID(
TypeID);
4457 return error(
"Missing element type for old-style indirect symbol");
4459 AddrSpace = Record[OpNum++];
4462 auto Val = Record[OpNum++];
4463 auto Linkage = Record[OpNum++];
4471 nullptr, TheModule);
4475 if (OpNum != Record.
size()) {
4476 auto VisInd = OpNum++;
4482 if (OpNum != Record.
size()) {
4483 auto S = Record[OpNum++];
4490 if (OpNum != Record.
size())
4492 if (OpNum != Record.
size())
4495 if (OpNum != Record.
size())
4500 if (OpNum + 1 < Record.
size()) {
4502 if (Record[OpNum] + Record[OpNum + 1] > Strtab.size())
4503 return error(
"Malformed partition, too large.");
4505 StringRef(Strtab.data() + Record[OpNum], Record[OpNum + 1]));
4509 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4513Error BitcodeReader::parseModule(uint64_t ResumeBit,
4514 bool ShouldLazyLoadMetadata,
4515 ParserCallbacks Callbacks) {
4516 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4518 if (
Error JumpFailed = Stream.JumpToBit(ResumeBit))
4523 SmallVector<uint64_t, 64> Record;
4527 bool ResolvedDataLayout =
false;
4532 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4534 auto ResolveDataLayout = [&]() ->
Error {
4535 if (ResolvedDataLayout)
4539 ResolvedDataLayout =
true;
4543 TentativeDataLayoutStr, TheModule->getTargetTriple().str());
4547 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4548 TheModule->getTargetTriple().str(), TentativeDataLayoutStr))
4549 TentativeDataLayoutStr = *LayoutOverride;
4557 TheModule->setDataLayout(MaybeDL.
get());
4563 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4566 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4568 switch (
Entry.Kind) {
4570 return error(
"Malformed block");
4572 if (
Error Err = ResolveDataLayout())
4574 return globalCleanup();
4579 if (
Error Err = Stream.SkipBlock())
4583 if (
Error Err = readBlockInfo())
4587 if (
Error Err = parseAttributeBlock())
4591 if (
Error Err = parseAttributeGroupBlock())
4595 if (
Error Err = parseTypeTable())
4599 if (!SeenValueSymbolTable) {
4605 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4606 if (
Error Err = parseValueSymbolTable())
4608 SeenValueSymbolTable =
true;
4613 if (
Error Err = Stream.SkipBlock())
4618 if (
Error Err = parseConstants())
4620 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4624 if (ShouldLazyLoadMetadata) {
4625 if (
Error Err = rememberAndSkipMetadata())
4629 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4630 if (
Error Err = MDLoader->parseModuleMetadata())
4634 if (
Error Err = MDLoader->parseMetadataKinds())
4638 if (
Error Err = ResolveDataLayout())
4643 if (!SeenFirstFunctionBody) {
4644 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4645 if (
Error Err = globalCleanup())
4647 SeenFirstFunctionBody =
true;
4650 if (VSTOffset > 0) {
4654 if (!SeenValueSymbolTable) {
4655 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4657 SeenValueSymbolTable =
true;
4669 if (
Error Err = Stream.SkipBlock())
4679 if (
Error Err = rememberAndSkipFunctionBody())
4686 if (SeenValueSymbolTable) {
4687 NextUnreadBit = Stream.GetCurrentBitNo();
4690 return globalCleanup();
4694 if (
Error Err = parseUseLists())
4698 if (
Error Err = parseOperandBundleTags())
4702 if (
Error Err = parseSyncScopeNames())
4714 Expected<unsigned> MaybeBitCode = Stream.readRecord(
Entry.ID, Record);
4717 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4720 Expected<unsigned> VersionOrErr = parseVersionRecord(Record);
4723 UseRelativeIDs = *VersionOrErr >= 1;
4727 if (ResolvedDataLayout)
4728 return error(
"target triple too late in module");
4731 return error(
"Invalid record");
4732 TheModule->setTargetTriple(Triple(std::move(S)));
4736 if (ResolvedDataLayout)
4737 return error(
"datalayout too late in module");
4739 return error(
"Invalid record");
4745 return error(
"Invalid record");
4746 TheModule->setModuleInlineAsm(S);
4753 return error(
"Invalid record");
4760 return error(
"Invalid record");
4761 SectionTable.push_back(S);
4767 return error(
"Invalid record");
4768 GCTable.push_back(S);
4772 if (
Error Err = parseComdatRecord(Record))
4781 if (
Error Err = parseGlobalVarRecord(Record))
4785 if (
Error Err = ResolveDataLayout())
4787 if (
Error Err = parseFunctionRecord(Record))
4793 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode, Record))
4799 return error(
"Invalid record");
4803 VSTOffset = Record[0] - 1;
4809 return error(
"Invalid record");
4810 TheModule->setSourceFileName(
ValueName);
4815 this->ValueTypeCallback = std::nullopt;
4819Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4821 ParserCallbacks Callbacks) {
4823 MetadataLoaderCallbacks MDCallbacks;
4824 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4826 return getContainedTypeID(
I, J);
4829 MDLoader = MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4830 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4833Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4835 return error(
"Load/Store operand is not a pointer type");
4836 if (!PointerType::isLoadableOrStorableType(ValType))
4837 return error(
"Cannot load/store from pointer");
4841Error BitcodeReader::propagateAttributeTypes(CallBase *CB,
4842 ArrayRef<unsigned> ArgTyIDs) {
4844 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4845 for (Attribute::AttrKind Kind : {Attribute::ByVal, Attribute::StructRet,
4846 Attribute::InAlloca}) {
4847 if (!
Attrs.hasParamAttr(i, Kind) ||
4848 Attrs.getParamAttr(i, Kind).getValueAsType())
4851 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4853 return error(
"Missing element type for typed attribute upgrade");
4857 case Attribute::ByVal:
4858 NewAttr = Attribute::getWithByValType(
Context, PtrEltTy);
4860 case Attribute::StructRet:
4861 NewAttr = Attribute::getWithStructRetType(
Context, PtrEltTy);
4863 case Attribute::InAlloca:
4864 NewAttr = Attribute::getWithInAllocaType(
Context, PtrEltTy);
4877 for (
const InlineAsm::ConstraintInfo &CI :
IA->ParseConstraints()) {
4881 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
4882 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4884 return error(
"Missing element type for inline asm upgrade");
4887 Attribute::get(
Context, Attribute::ElementType, ElemTy));
4895 case Intrinsic::preserve_array_access_index:
4896 case Intrinsic::preserve_struct_access_index:
4897 case Intrinsic::aarch64_ldaxr:
4898 case Intrinsic::aarch64_ldxr:
4899 case Intrinsic::aarch64_stlxr:
4900 case Intrinsic::aarch64_stxr:
4901 case Intrinsic::arm_ldaex:
4902 case Intrinsic::arm_ldrex:
4903 case Intrinsic::arm_stlex:
4904 case Intrinsic::arm_strex: {
4907 case Intrinsic::aarch64_stlxr:
4908 case Intrinsic::aarch64_stxr:
4909 case Intrinsic::arm_stlex:
4910 case Intrinsic::arm_strex:
4917 if (!
Attrs.getParamElementType(ArgNo)) {
4918 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4920 return error(
"Missing element type for elementtype upgrade");
4935Error BitcodeReader::parseFunctionBody(Function *
F) {
4940 if (MDLoader->hasFwdRefs())
4941 return error(
"Invalid function metadata: incoming forward references");
4943 InstructionList.
clear();
4944 unsigned ModuleValueListSize = ValueList.
size();
4945 unsigned ModuleMDLoaderSize = MDLoader->size();
4949 unsigned FTyID = FunctionTypeIDs[
F];
4950 for (Argument &
I :
F->args()) {
4951 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
4952 assert(
I.getType() == getTypeByID(ArgTyID) &&
4953 "Incorrect fully specified type for Function Argument");
4957 unsigned NextValueNo = ValueList.
size();
4959 unsigned CurBBNo = 0;
4964 SmallMapVector<std::pair<BasicBlock *, BasicBlock *>,
BasicBlock *, 4>
4968 auto getLastInstruction = [&]() -> Instruction * {
4969 if (CurBB && !CurBB->
empty())
4970 return &CurBB->
back();
4971 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
4972 !FunctionBBs[CurBBNo - 1]->
empty())
4973 return &FunctionBBs[CurBBNo - 1]->back();
4977 std::vector<OperandBundleDef> OperandBundles;
4980 SmallVector<uint64_t, 64> Record;
4983 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
4986 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
4988 switch (
Entry.Kind) {
4990 return error(
"Malformed block");
4992 goto OutOfRecordLoop;
4997 if (
Error Err = Stream.SkipBlock())
5001 if (
Error Err = parseConstants())
5003 NextValueNo = ValueList.
size();
5006 if (
Error Err = parseValueSymbolTable())
5010 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
5014 assert(DeferredMetadataInfo.empty() &&
5015 "Must read all module-level metadata before function-level");
5016 if (
Error Err = MDLoader->parseFunctionMetadata())
5020 if (
Error Err = parseUseLists())
5034 unsigned ResTypeID = InvalidTypeID;
5035 Expected<unsigned> MaybeBitCode = Stream.readRecord(
Entry.ID, Record);
5038 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5040 return error(
"Invalid value");
5042 if (Record.
empty() || Record[0] == 0)
5043 return error(
"Invalid record");
5045 FunctionBBs.resize(Record[0]);
5048 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5049 if (BBFRI == BasicBlockFwdRefs.
end()) {
5050 for (BasicBlock *&BB : FunctionBBs)
5053 auto &BBRefs = BBFRI->second;
5055 if (BBRefs.size() > FunctionBBs.size())
5056 return error(
"Invalid ID");
5057 assert(!BBRefs.empty() &&
"Unexpected empty array");
5058 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5059 for (
unsigned I = 0,
E = FunctionBBs.size(), RE = BBRefs.size();
I !=
E;
5061 if (
I < RE && BBRefs[
I]) {
5062 BBRefs[
I]->insertInto(
F);
5063 FunctionBBs[
I] = BBRefs[
I];
5069 BasicBlockFwdRefs.
erase(BBFRI);
5072 CurBB = FunctionBBs[0];
5079 return error(
"Invalid record");
5093 for (uint64_t ValID : Record)
5095 BackwardRefFunctions.push_back(
F);
5097 return error(
"Invalid record");
5104 I = getLastInstruction();
5107 return error(
"Invalid record");
5108 I->setDebugLoc(LastLoc);
5113 I = getLastInstruction();
5114 if (!
I || Record.size() < 4)
5115 return error(
"Invalid record");
5117 unsigned Line = Record[0], Col = Record[1];
5118 unsigned ScopeID = Record[2], IAID = Record[3];
5119 bool isImplicitCode = Record.size() >= 5 && Record[4];
5120 uint64_t AtomGroup = Record.size() == 7 ? Record[5] : 0;
5121 uint8_t AtomRank = Record.size() == 7 ? Record[6] : 0;
5123 MDNode *
Scope =
nullptr, *
IA =
nullptr;
5126 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5128 return error(
"Invalid record");
5132 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5134 return error(
"Invalid record");
5137 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5138 isImplicitCode, AtomGroup, AtomRank);
5139 I->setDebugLoc(LastLoc);
5147 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5148 OpNum+1 > Record.size())
5149 return error(
"Invalid record");
5153 return error(
"Invalid record");
5157 if (OpNum < Record.size()) {
5161 I->setFastMathFlags(FMF);
5170 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS,
TypeID, CurBB) ||
5173 OpNum+1 > Record.size())
5174 return error(
"Invalid record");
5178 return error(
"Invalid record");
5182 if (OpNum < Record.size()) {
5183 if (
Opc == Instruction::Add ||
5184 Opc == Instruction::Sub ||
5185 Opc == Instruction::Mul ||
5186 Opc == Instruction::Shl) {
5191 }
else if (
Opc == Instruction::SDiv ||
5192 Opc == Instruction::UDiv ||
5193 Opc == Instruction::LShr ||
5194 Opc == Instruction::AShr) {
5197 }
else if (
Opc == Instruction::Or) {
5203 I->setFastMathFlags(FMF);
5212 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5213 OpNum + 1 > Record.size())
5214 return error(
"Invalid record");
5216 ResTypeID = Record[OpNum++];
5217 Type *ResTy = getTypeByID(ResTypeID);
5220 if (
Opc == -1 || !ResTy)
5221 return error(
"Invalid record");
5226 assert(CurBB &&
"No current BB?");
5232 return error(
"Invalid cast");
5236 if (OpNum < Record.size()) {
5237 if (
Opc == Instruction::ZExt ||
Opc == Instruction::UIToFP) {
5240 }
else if (
Opc == Instruction::Trunc) {
5249 I->setFastMathFlags(FMF);
5267 TyID = Record[OpNum++];
5268 Ty = getTypeByID(TyID);
5272 TyID = InvalidTypeID;
5277 unsigned BasePtrTypeID;
5278 if (getValueTypePair(Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5280 return error(
"Invalid record");
5283 TyID = getContainedTypeID(BasePtrTypeID);
5284 if (
BasePtr->getType()->isVectorTy())
5285 TyID = getContainedTypeID(TyID);
5286 Ty = getTypeByID(TyID);
5289 SmallVector<Value*, 16> GEPIdx;
5290 while (OpNum != Record.size()) {
5293 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5294 return error(
"Invalid record");
5305 unsigned SubType = 0;
5306 if (GTI.isStruct()) {
5308 Idx->getType()->isVectorTy()
5310 :
cast<ConstantInt>(Idx);
5313 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5320 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5321 if (
I->getType()->isVectorTy())
5322 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5325 GEP->setNoWrapFlags(NW);
5334 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5335 return error(
"Invalid record");
5338 unsigned RecSize = Record.size();
5339 if (OpNum == RecSize)
5340 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5342 SmallVector<unsigned, 4> EXTRACTVALIdx;
5343 ResTypeID = AggTypeID;
5344 for (; OpNum != RecSize; ++OpNum) {
5347 uint64_t
Index = Record[OpNum];
5349 if (!IsStruct && !IsArray)
5350 return error(
"EXTRACTVAL: Invalid type");
5351 if ((
unsigned)Index != Index)
5352 return error(
"Invalid value");
5354 return error(
"EXTRACTVAL: Invalid struct index");
5356 return error(
"EXTRACTVAL: Invalid array index");
5357 EXTRACTVALIdx.
push_back((
unsigned)Index);
5361 ResTypeID = getContainedTypeID(ResTypeID, Index);
5364 ResTypeID = getContainedTypeID(ResTypeID);
5378 if (getValueTypePair(Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5379 return error(
"Invalid record");
5382 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5383 return error(
"Invalid record");
5385 unsigned RecSize = Record.size();
5386 if (OpNum == RecSize)
5387 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5389 SmallVector<unsigned, 4> INSERTVALIdx;
5391 for (; OpNum != RecSize; ++OpNum) {
5394 uint64_t
Index = Record[OpNum];
5396 if (!IsStruct && !IsArray)
5397 return error(
"INSERTVAL: Invalid type");
5398 if ((
unsigned)Index != Index)
5399 return error(
"Invalid value");
5401 return error(
"INSERTVAL: Invalid struct index");
5403 return error(
"INSERTVAL: Invalid array index");
5405 INSERTVALIdx.
push_back((
unsigned)Index);
5413 return error(
"Inserted value type doesn't match aggregate type");
5416 ResTypeID = AggTypeID;
5428 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal,
TypeID,
5430 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(),
TypeID,
5432 popValue(Record, OpNum, NextValueNo, CondType,
5433 getVirtualTypeID(CondType),
Cond, CurBB))
5434 return error(
"Invalid record");
5447 unsigned ValTypeID, CondTypeID;
5448 if (getValueTypePair(Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5450 popValue(Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5452 getValueTypePair(Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5453 return error(
"Invalid record");
5456 if (VectorType* vector_type =
5459 if (vector_type->getElementType() != Type::getInt1Ty(
Context))
5460 return error(
"Invalid type for value");
5464 return error(
"Invalid type for value");
5468 ResTypeID = ValTypeID;
5473 I->setFastMathFlags(FMF);
5481 unsigned VecTypeID, IdxTypeID;
5482 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5483 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5484 return error(
"Invalid record");
5486 return error(
"Invalid type for value");
5488 ResTypeID = getContainedTypeID(VecTypeID);
5495 Value *Vec, *Elt, *Idx;
5496 unsigned VecTypeID, IdxTypeID;
5497 if (getValueTypePair(Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5498 return error(
"Invalid record");
5500 return error(
"Invalid type for value");
5501 if (popValue(Record, OpNum, NextValueNo,
5503 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5504 getValueTypePair(Record, OpNum, NextValueNo, Idx, IdxTypeID, CurBB))
5505 return error(
"Invalid record");
5507 ResTypeID = VecTypeID;
5515 unsigned Vec1TypeID;
5516 if (getValueTypePair(Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5518 popValue(Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5520 return error(
"Invalid record");
5522 unsigned MaskTypeID;
5523 if (getValueTypePair(Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5524 return error(
"Invalid record");
5526 return error(
"Invalid type for value");
5528 I =
new ShuffleVectorInst(Vec1, Vec2, Mask);
5530 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5545 if (getValueTypePair(Record, OpNum, NextValueNo,
LHS, LHSTypeID, CurBB) ||
5546 popValue(Record, OpNum, NextValueNo,
LHS->
getType(), LHSTypeID,
RHS,
5548 return error(
"Invalid record");
5550 if (OpNum >= Record.size())
5552 "Invalid record: operand number exceeded available operands");
5557 if (IsFP && Record.size() > OpNum+1)
5562 return error(
"Invalid fcmp predicate");
5563 I =
new FCmpInst(PredVal,
LHS,
RHS);
5566 return error(
"Invalid icmp predicate");
5567 I =
new ICmpInst(PredVal,
LHS,
RHS);
5568 if (Record.size() > OpNum + 1 &&
5573 if (OpNum + 1 != Record.size())
5574 return error(
"Invalid record");
5576 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5578 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5581 I->setFastMathFlags(FMF);
5588 unsigned Size = Record.size();
5598 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5599 return error(
"Invalid record");
5600 if (OpNum != Record.size())
5601 return error(
"Invalid record");
5608 if (Record.size() != 1 && Record.size() != 3)
5609 return error(
"Invalid record");
5610 BasicBlock *TrueDest = getBasicBlock(Record[0]);
5612 return error(
"Invalid record");
5614 if (Record.size() == 1) {
5619 BasicBlock *FalseDest = getBasicBlock(Record[1]);
5621 Value *
Cond = getValue(Record, 2, NextValueNo, CondType,
5622 getVirtualTypeID(CondType), CurBB);
5623 if (!FalseDest || !
Cond)
5624 return error(
"Invalid record");
5631 if (Record.size() != 1 && Record.size() != 2)
5632 return error(
"Invalid record");
5635 Value *CleanupPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5636 getVirtualTypeID(TokenTy), CurBB);
5638 return error(
"Invalid record");
5640 if (Record.size() == 2) {
5641 UnwindDest = getBasicBlock(Record[Idx++]);
5643 return error(
"Invalid record");
5651 if (Record.size() != 2)
5652 return error(
"Invalid record");
5655 Value *CatchPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5656 getVirtualTypeID(TokenTy), CurBB);
5658 return error(
"Invalid record");
5659 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5661 return error(
"Invalid record");
5669 if (Record.size() < 2)
5670 return error(
"Invalid record");
5675 Value *ParentPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5676 getVirtualTypeID(TokenTy), CurBB);
5678 return error(
"Invalid record");
5680 unsigned NumHandlers = Record[Idx++];
5683 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5684 BasicBlock *BB = getBasicBlock(Record[Idx++]);
5686 return error(
"Invalid record");
5691 if (Idx + 1 == Record.size()) {
5692 UnwindDest = getBasicBlock(Record[Idx++]);
5694 return error(
"Invalid record");
5697 if (Record.size() != Idx)
5698 return error(
"Invalid record");
5702 for (BasicBlock *Handler : Handlers)
5703 CatchSwitch->addHandler(Handler);
5705 ResTypeID = getVirtualTypeID(
I->getType());
5712 if (Record.size() < 2)
5713 return error(
"Invalid record");
5718 Value *ParentPad = getValue(Record, Idx++, NextValueNo, TokenTy,
5719 getVirtualTypeID(TokenTy), CurBB);
5721 return error(
"Invald record");
5723 unsigned NumArgOperands = Record[Idx++];
5725 SmallVector<Value *, 2>
Args;
5726 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5729 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
nullptr))
5730 return error(
"Invalid record");
5731 Args.push_back(Val);
5734 if (Record.size() != Idx)
5735 return error(
"Invalid record");
5741 ResTypeID = getVirtualTypeID(
I->getType());
5747 if ((Record[0] >> 16) == SWITCH_INST_MAGIC) {
5753 unsigned OpTyID = Record[1];
5754 Type *OpTy = getTypeByID(OpTyID);
5757 Value *
Cond = getValue(Record, 2, NextValueNo, OpTy, OpTyID, CurBB);
5760 return error(
"Invalid record");
5762 unsigned NumCases = Record[4];
5767 unsigned CurIdx = 5;
5768 for (
unsigned i = 0; i != NumCases; ++i) {
5770 unsigned NumItems = Record[CurIdx++];
5771 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5772 bool isSingleNumber = Record[CurIdx++];
5775 unsigned ActiveWords = 1;
5776 if (ValueBitWidth > 64)
5777 ActiveWords = Record[CurIdx++];
5780 CurIdx += ActiveWords;
5782 if (!isSingleNumber) {
5784 if (ValueBitWidth > 64)
5785 ActiveWords = Record[CurIdx++];
5788 CurIdx += ActiveWords;
5799 BasicBlock *DestBB = getBasicBlock(Record[CurIdx++]);
5800 for (ConstantInt *Cst : CaseVals)
5801 SI->addCase(Cst, DestBB);
5809 if (Record.size() < 3 || (Record.size() & 1) == 0)
5810 return error(
"Invalid record");
5811 unsigned OpTyID = Record[0];
5812 Type *OpTy = getTypeByID(OpTyID);
5813 Value *
Cond = getValue(Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
5816 return error(
"Invalid record");
5817 unsigned NumCases = (Record.size()-3)/2;
5820 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5822 getFnValueByID(Record[3+i*2], OpTy, OpTyID,
nullptr));
5823 BasicBlock *DestBB = getBasicBlock(Record[1+3+i*2]);
5824 if (!CaseVal || !DestBB) {
5826 return error(
"Invalid record");
5828 SI->addCase(CaseVal, DestBB);
5834 if (Record.size() < 2)
5835 return error(
"Invalid record");
5836 unsigned OpTyID = Record[0];
5837 Type *OpTy = getTypeByID(OpTyID);
5838 Value *
Address = getValue(Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
5840 return error(
"Invalid record");
5841 unsigned NumDests = Record.size()-2;
5844 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5845 if (BasicBlock *DestBB = getBasicBlock(Record[2+i])) {
5849 return error(
"Invalid record");
5858 if (Record.size() < 4)
5859 return error(
"Invalid record");
5862 unsigned CCInfo = Record[OpNum++];
5863 BasicBlock *NormalBB = getBasicBlock(Record[OpNum++]);
5864 BasicBlock *UnwindBB = getBasicBlock(Record[OpNum++]);
5866 unsigned FTyID = InvalidTypeID;
5867 FunctionType *FTy =
nullptr;
5868 if ((CCInfo >> 13) & 1) {
5869 FTyID = Record[OpNum++];
5872 return error(
"Explicit invoke type is not a function type");
5876 unsigned CalleeTypeID;
5877 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5879 return error(
"Invalid record");
5883 return error(
"Callee is not a pointer");
5885 FTyID = getContainedTypeID(CalleeTypeID);
5888 return error(
"Callee is not of pointer to function type");
5890 if (Record.size() < FTy->getNumParams() + OpNum)
5891 return error(
"Insufficient operands to call");
5893 SmallVector<Value*, 16>
Ops;
5894 SmallVector<unsigned, 16> ArgTyIDs;
5895 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5896 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5897 Ops.push_back(getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
5901 return error(
"Invalid record");
5904 if (!FTy->isVarArg()) {
5905 if (Record.size() != OpNum)
5906 return error(
"Invalid record");
5909 while (OpNum != Record.size()) {
5912 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5913 return error(
"Invalid record");
5920 if (!OperandBundles.empty())
5925 ResTypeID = getContainedTypeID(FTyID);
5926 OperandBundles.clear();
5929 static_cast<CallingConv::ID
>(CallingConv::MaxID & CCInfo));
5940 Value *Val =
nullptr;
5942 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID, CurBB))
5943 return error(
"Invalid record");
5952 unsigned CCInfo = Record[OpNum++];
5954 BasicBlock *DefaultDest = getBasicBlock(Record[OpNum++]);
5955 unsigned NumIndirectDests = Record[OpNum++];
5956 SmallVector<BasicBlock *, 16> IndirectDests;
5957 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
5958 IndirectDests.
push_back(getBasicBlock(Record[OpNum++]));
5960 unsigned FTyID = InvalidTypeID;
5961 FunctionType *FTy =
nullptr;
5963 FTyID = Record[OpNum++];
5966 return error(
"Explicit call type is not a function type");
5970 unsigned CalleeTypeID;
5971 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5973 return error(
"Invalid record");
5977 return error(
"Callee is not a pointer type");
5979 FTyID = getContainedTypeID(CalleeTypeID);
5982 return error(
"Callee is not of pointer to function type");
5984 if (Record.size() < FTy->getNumParams() + OpNum)
5985 return error(
"Insufficient operands to call");
5987 SmallVector<Value*, 16>
Args;
5988 SmallVector<unsigned, 16> ArgTyIDs;
5990 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5992 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5993 if (FTy->getParamType(i)->isLabelTy())
5994 Arg = getBasicBlock(Record[OpNum]);
5996 Arg = getValue(Record, OpNum, NextValueNo, FTy->getParamType(i),
5999 return error(
"Invalid record");
6000 Args.push_back(Arg);
6005 if (!FTy->isVarArg()) {
6006 if (OpNum != Record.size())
6007 return error(
"Invalid record");
6009 while (OpNum != Record.size()) {
6012 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6013 return error(
"Invalid record");
6020 if (!OperandBundles.empty())
6025 auto IsLabelConstraint = [](
const InlineAsm::ConstraintInfo &CI) {
6028 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6033 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6034 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6035 unsigned LabelNo = ArgNo - FirstBlockArg;
6037 if (!BA || BA->getFunction() !=
F ||
6038 LabelNo > IndirectDests.
size() ||
6039 BA->getBasicBlock() != IndirectDests[LabelNo])
6040 return error(
"callbr argument does not match indirect dest");
6045 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6049 for (
Value *Arg : Args)
6052 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6055 std::string Constraints =
IA->getConstraintString().str();
6058 for (
const auto &CI : ConstraintInfo) {
6060 if (ArgNo >= FirstBlockArg)
6061 Constraints.insert(Pos,
"!");
6066 Pos = Constraints.find(
',', Pos);
6067 if (Pos == std::string::npos)
6073 IA->hasSideEffects(),
IA->isAlignStack(),
6074 IA->getDialect(),
IA->canThrow());
6080 ResTypeID = getContainedTypeID(FTyID);
6081 OperandBundles.clear();
6098 return error(
"Invalid phi record");
6100 unsigned TyID = Record[0];
6101 Type *Ty = getTypeByID(TyID);
6103 return error(
"Invalid phi record");
6108 size_t NumArgs = (Record.size() - 1) / 2;
6112 return error(
"Invalid phi record");
6116 SmallDenseMap<BasicBlock *, Value *>
Args;
6117 for (
unsigned i = 0; i != NumArgs; i++) {
6118 BasicBlock *BB = getBasicBlock(Record[i * 2 + 2]);
6121 return error(
"Invalid phi BB");
6128 auto It =
Args.find(BB);
6130 if (It !=
Args.end()) {
6144 if (!PhiConstExprBB)
6146 EdgeBB = PhiConstExprBB;
6154 V = getValueSigned(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6156 V = getValue(Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6160 return error(
"Invalid phi record");
6163 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6164 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6165 PhiConstExprBB =
nullptr;
6168 Args.insert({BB,
V});
6174 if (Record.size() % 2 == 0) {
6178 I->setFastMathFlags(FMF);
6189 if (Record.size() < 3)
6190 return error(
"Invalid record");
6193 if (Record.size() < 4)
6194 return error(
"Invalid record");
6196 ResTypeID = Record[Idx++];
6197 Type *Ty = getTypeByID(ResTypeID);
6199 return error(
"Invalid record");
6201 Value *PersFn =
nullptr;
6202 unsigned PersFnTypeID;
6203 if (getValueTypePair(Record, Idx, NextValueNo, PersFn, PersFnTypeID,
6205 return error(
"Invalid record");
6207 if (!
F->hasPersonalityFn())
6210 return error(
"Personality function mismatch");
6213 bool IsCleanup = !!Record[Idx++];
6214 unsigned NumClauses = Record[Idx++];
6217 for (
unsigned J = 0; J != NumClauses; ++J) {
6223 if (getValueTypePair(Record, Idx, NextValueNo, Val, ValTypeID,
6226 return error(
"Invalid record");
6231 "Catch clause has a invalid type!");
6234 "Filter clause has invalid type!");
6244 if (Record.size() != 4 && Record.size() != 5)
6245 return error(
"Invalid record");
6246 using APV = AllocaPackedValues;
6247 const uint64_t Rec = Record[3];
6250 unsigned TyID = Record[0];
6251 Type *Ty = getTypeByID(TyID);
6253 TyID = getContainedTypeID(TyID);
6254 Ty = getTypeByID(TyID);
6256 return error(
"Missing element type for old-style alloca");
6258 unsigned OpTyID = Record[1];
6259 Type *OpTy = getTypeByID(OpTyID);
6260 Value *
Size = getFnValueByID(Record[2], OpTy, OpTyID, CurBB);
6265 if (
Error Err = parseAlignmentValue(AlignExp, Align)) {
6269 return error(
"Invalid record");
6271 const DataLayout &
DL = TheModule->getDataLayout();
6272 unsigned AS = Record.
size() == 5 ? Record[4] :
DL.getAllocaAddrSpace();
6274 SmallPtrSet<Type *, 4> Visited;
6275 if (!Align && !Ty->
isSized(&Visited))
6276 return error(
"alloca of unsized type");
6278 Align =
DL.getPrefTypeAlign(Ty);
6280 if (!
Size->getType()->isIntegerTy())
6281 return error(
"alloca element count must have integer type");
6283 AllocaInst *AI =
new AllocaInst(Ty, AS,
Size, *Align);
6287 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6295 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6296 (OpNum + 2 != Record.size() && OpNum + 3 != Record.size()))
6297 return error(
"Invalid record");
6300 return error(
"Load operand is not a pointer type");
6303 if (OpNum + 3 == Record.size()) {
6304 ResTypeID = Record[OpNum++];
6305 Ty = getTypeByID(ResTypeID);
6307 ResTypeID = getContainedTypeID(OpTypeID);
6308 Ty = getTypeByID(ResTypeID);
6312 return error(
"Missing load type");
6314 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6318 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6320 SmallPtrSet<Type *, 4> Visited;
6321 if (!Align && !Ty->
isSized(&Visited))
6322 return error(
"load of unsized type");
6324 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6325 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align);
6334 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6335 (OpNum + 4 != Record.size() && OpNum + 5 != Record.size()))
6336 return error(
"Invalid record");
6339 return error(
"Load operand is not a pointer type");
6342 if (OpNum + 5 == Record.size()) {
6343 ResTypeID = Record[OpNum++];
6344 Ty = getTypeByID(ResTypeID);
6346 ResTypeID = getContainedTypeID(OpTypeID);
6347 Ty = getTypeByID(ResTypeID);
6351 return error(
"Missing atomic load type");
6353 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6357 if (Ordering == AtomicOrdering::NotAtomic ||
6358 Ordering == AtomicOrdering::Release ||
6359 Ordering == AtomicOrdering::AcquireRelease)
6360 return error(
"Invalid record");
6361 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6362 return error(
"Invalid record");
6363 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6366 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6369 return error(
"Alignment missing from atomic load");
6370 I =
new LoadInst(Ty,
Op,
"", Record[OpNum + 1], *Align, Ordering, SSID);
6378 unsigned PtrTypeID, ValTypeID;
6379 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6380 return error(
"Invalid record");
6383 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6384 return error(
"Invalid record");
6386 ValTypeID = getContainedTypeID(PtrTypeID);
6387 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6388 ValTypeID, Val, CurBB))
6389 return error(
"Invalid record");
6392 if (OpNum + 2 != Record.size())
6393 return error(
"Invalid record");
6398 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6400 SmallPtrSet<Type *, 4> Visited;
6402 return error(
"store of unsized type");
6404 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6405 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align);
6414 unsigned PtrTypeID, ValTypeID;
6415 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB) ||
6417 return error(
"Invalid record");
6419 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6420 return error(
"Invalid record");
6422 ValTypeID = getContainedTypeID(PtrTypeID);
6423 if (popValue(Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6424 ValTypeID, Val, CurBB))
6425 return error(
"Invalid record");
6428 if (OpNum + 4 != Record.size())
6429 return error(
"Invalid record");
6434 if (Ordering == AtomicOrdering::NotAtomic ||
6435 Ordering == AtomicOrdering::Acquire ||
6436 Ordering == AtomicOrdering::AcquireRelease)
6437 return error(
"Invalid record");
6438 SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6439 if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0)
6440 return error(
"Invalid record");
6443 if (
Error Err = parseAlignmentValue(Record[OpNum], Align))
6446 return error(
"Alignment missing from atomic store");
6447 I =
new StoreInst(Val, Ptr, Record[OpNum + 1], *Align, Ordering, SSID);
6454 const size_t NumRecords = Record.size();
6456 Value *Ptr =
nullptr;
6458 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6459 return error(
"Invalid record");
6462 return error(
"Cmpxchg operand is not a pointer type");
6465 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6466 if (popValue(Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6467 CmpTypeID, Cmp, CurBB))
6468 return error(
"Invalid record");
6471 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6473 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6474 return error(
"Invalid record");
6478 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6479 SuccessOrdering == AtomicOrdering::Unordered)
6480 return error(
"Invalid record");
6482 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6484 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6492 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6493 FailureOrdering == AtomicOrdering::Unordered)
6494 return error(
"Invalid record");
6496 const Align Alignment(
6497 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6499 I =
new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment, SuccessOrdering,
6500 FailureOrdering, SSID);
6503 if (NumRecords < 8) {
6507 I->insertInto(CurBB, CurBB->
end());
6509 ResTypeID = CmpTypeID;
6512 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6513 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6522 const size_t NumRecords = Record.size();
6524 Value *Ptr =
nullptr;
6526 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6527 return error(
"Invalid record");
6530 return error(
"Cmpxchg operand is not a pointer type");
6534 if (getValueTypePair(Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6535 return error(
"Invalid record");
6537 Value *Val =
nullptr;
6538 if (popValue(Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6540 return error(
"Invalid record");
6542 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6543 return error(
"Invalid record");
6545 const bool IsVol = Record[OpNum];
6550 return error(
"Invalid cmpxchg success ordering");
6552 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 2]);
6554 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(), Ptr->
getType()))
6560 return error(
"Invalid cmpxchg failure ordering");
6562 const bool IsWeak = Record[OpNum + 4];
6564 MaybeAlign Alignment;
6566 if (NumRecords == (OpNum + 6)) {
6567 if (
Error Err = parseAlignmentValue(Record[OpNum + 5], Alignment))
6572 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6574 I =
new AtomicCmpXchgInst(Ptr, Cmp, Val, *Alignment, SuccessOrdering,
6575 FailureOrdering, SSID);
6579 unsigned I1TypeID = getVirtualTypeID(Type::getInt1Ty(
Context));
6580 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6589 const size_t NumRecords = Record.size();
6592 Value *Ptr =
nullptr;
6594 if (getValueTypePair(Record, OpNum, NextValueNo, Ptr, PtrTypeID, CurBB))
6595 return error(
"Invalid record");
6598 return error(
"Invalid record");
6600 Value *Val =
nullptr;
6601 unsigned ValTypeID = InvalidTypeID;
6603 ValTypeID = getContainedTypeID(PtrTypeID);
6604 if (popValue(Record, OpNum, NextValueNo,
6605 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6606 return error(
"Invalid record");
6608 if (getValueTypePair(Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6609 return error(
"Invalid record");
6612 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6613 return error(
"Invalid record");
6619 return error(
"Invalid record");
6621 const bool IsVol = Record[OpNum + 1];
6624 if (Ordering == AtomicOrdering::NotAtomic ||
6625 Ordering == AtomicOrdering::Unordered)
6626 return error(
"Invalid record");
6628 const SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]);
6630 MaybeAlign Alignment;
6632 if (NumRecords == (OpNum + 5)) {
6633 if (
Error Err = parseAlignmentValue(Record[OpNum + 4], Alignment))
6639 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6641 I =
new AtomicRMWInst(
Operation, Ptr, Val, *Alignment, Ordering, SSID);
6642 ResTypeID = ValTypeID;
6649 if (2 != Record.size())
6650 return error(
"Invalid record");
6652 if (Ordering == AtomicOrdering::NotAtomic ||
6653 Ordering == AtomicOrdering::Unordered ||
6654 Ordering == AtomicOrdering::Monotonic)
6655 return error(
"Invalid record");
6657 I =
new FenceInst(
Context, Ordering, SSID);
6664 SeenDebugRecord =
true;
6667 return error(
"Invalid dbg record: missing instruction");
6670 Inst->
getParent()->insertDbgRecordBefore(
6681 SeenDebugRecord =
true;
6684 return error(
"Invalid dbg record: missing instruction");
6701 DILocalVariable *Var =
6703 DIExpression *Expr =
6716 unsigned SlotBefore =
Slot;
6717 if (getValueTypePair(Record, Slot, NextValueNo, V, TyID, CurBB))
6718 return error(
"Invalid dbg record: invalid value");
6720 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6723 RawLocation = getFnMetadataByID(Record[Slot++]);
6726 DbgVariableRecord *DVR =
nullptr;
6730 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6731 DbgVariableRecord::LocationType::Value);
6734 DVR =
new DbgVariableRecord(RawLocation, Var, Expr, DIL,
6735 DbgVariableRecord::LocationType::Declare);
6738 DVR =
new DbgVariableRecord(
6739 RawLocation, Var, Expr, DIL,
6740 DbgVariableRecord::LocationType::DeclareValue);
6744 DIExpression *AddrExpr =
6746 Metadata *Addr = getFnMetadataByID(Record[Slot++]);
6747 DVR =
new DbgVariableRecord(RawLocation, Var, Expr,
ID, Addr, AddrExpr,
6759 if (Record.size() < 3)
6760 return error(
"Invalid record");
6764 unsigned CCInfo = Record[OpNum++];
6770 return error(
"Fast math flags indicator set for call with no FMF");
6773 unsigned FTyID = InvalidTypeID;
6774 FunctionType *FTy =
nullptr;
6776 FTyID = Record[OpNum++];
6779 return error(
"Explicit call type is not a function type");
6783 unsigned CalleeTypeID;
6784 if (getValueTypePair(Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6786 return error(
"Invalid record");
6790 return error(
"Callee is not a pointer type");
6792 FTyID = getContainedTypeID(CalleeTypeID);
6795 return error(
"Callee is not of pointer to function type");
6797 if (Record.size() < FTy->getNumParams() + OpNum)
6798 return error(
"Insufficient operands to call");
6800 SmallVector<Value*, 16>
Args;
6801 SmallVector<unsigned, 16> ArgTyIDs;
6803 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6804 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6805 if (FTy->getParamType(i)->isLabelTy())
6806 Args.push_back(getBasicBlock(Record[OpNum]));
6808 Args.push_back(getValue(Record, OpNum, NextValueNo,
6809 FTy->getParamType(i), ArgTyID, CurBB));
6812 return error(
"Invalid record");
6816 if (!FTy->isVarArg()) {
6817 if (OpNum != Record.size())
6818 return error(
"Invalid record");
6820 while (OpNum != Record.size()) {
6823 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6824 return error(
"Invalid record");
6831 if (!OperandBundles.empty())
6835 ResTypeID = getContainedTypeID(FTyID);
6836 OperandBundles.clear();
6850 SeenDebugIntrinsic =
true;
6857 return error(
"Fast-math-flags specified for call without "
6858 "floating-point scalar or vector return type");
6859 I->setFastMathFlags(FMF);
6864 if (Record.size() < 3)
6865 return error(
"Invalid record");
6866 unsigned OpTyID = Record[0];
6867 Type *OpTy = getTypeByID(OpTyID);
6868 Value *
Op = getValue(Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
6869 ResTypeID = Record[2];
6870 Type *ResTy = getTypeByID(ResTypeID);
6871 if (!OpTy || !
Op || !ResTy)
6872 return error(
"Invalid record");
6873 I =
new VAArgInst(
Op, ResTy);
6883 if (Record.empty() || Record[0] >= BundleTags.size())
6884 return error(
"Invalid record");
6886 std::vector<Value *> Inputs;
6889 while (OpNum != Record.size()) {
6891 if (getValueOrMetadata(Record, OpNum, NextValueNo,
Op, CurBB))
6892 return error(
"Invalid record");
6893 Inputs.push_back(
Op);
6896 OperandBundles.emplace_back(BundleTags[Record[0]], std::move(Inputs));
6904 if (getValueTypePair(Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6905 return error(
"Invalid record");
6906 if (OpNum != Record.size())
6907 return error(
"Invalid record");
6909 I =
new FreezeInst(
Op);
6910 ResTypeID = OpTypeID;
6920 return error(
"Invalid instruction with no BB");
6922 if (!OperandBundles.empty()) {
6924 return error(
"Operand bundles found with no consumer");
6926 I->insertInto(CurBB, CurBB->
end());
6929 if (
I->isTerminator()) {
6931 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
6935 if (!
I->getType()->isVoidTy()) {
6936 assert(
I->getType() == getTypeByID(ResTypeID) &&
6937 "Incorrect result type ID");
6945 if (!OperandBundles.empty())
6946 return error(
"Operand bundles found with no consumer");
6950 if (!
A->getParent()) {
6952 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
6958 return error(
"Never resolved value found in function");
6963 if (MDLoader->hasFwdRefs())
6964 return error(
"Invalid function metadata: outgoing forward refs");
6969 for (
const auto &Pair : ConstExprEdgeBBs) {
6980 ValueList.
shrinkTo(ModuleValueListSize);
6981 MDLoader->shrinkTo(ModuleMDLoaderSize);
6982 std::vector<BasicBlock*>().swap(FunctionBBs);
6987Error BitcodeReader::findFunctionInStream(
6989 DenseMap<Function *, uint64_t>::iterator DeferredFunctionInfoIterator) {
6990 while (DeferredFunctionInfoIterator->second == 0) {
6995 assert(VSTOffset == 0 || !
F->hasName());
6998 if (
Error Err = rememberAndSkipFunctionBodies())
7004SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
7007 if (Val >= SSIDs.
size())
7016Error BitcodeReader::materialize(GlobalValue *GV) {
7019 if (!
F || !
F->isMaterializable())
7022 DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.
find(
F);
7023 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
7026 if (DFII->second == 0)
7027 if (
Error Err = findFunctionInStream(
F, DFII))
7031 if (
Error Err = materializeMetadata())
7035 if (
Error JumpFailed = Stream.JumpToBit(DFII->second))
7038 if (
Error Err = parseFunctionBody(
F))
7040 F->setIsMaterializable(
false);
7044 if (SeenDebugIntrinsic && SeenDebugRecord)
7045 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7051 if (DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7052 F->setSubprogram(SP);
7055 if (!MDLoader->isStrippingTBAA()) {
7057 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7060 MDLoader->setStripTBAA(
true);
7067 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7068 if (MD->getOperand(0) !=
nullptr &&
isa<MDString>(MD->getOperand(0))) {
7074 unsigned ExpectedNumOperands = 0;
7076 ExpectedNumOperands = BI->getNumSuccessors();
7078 ExpectedNumOperands =
SI->getNumSuccessors();
7080 ExpectedNumOperands = 1;
7084 ExpectedNumOperands = 2;
7091 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7092 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7098 CI->removeRetAttrs(AttributeFuncs::typeIncompatible(
7099 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7101 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7102 CI->removeParamAttrs(ArgNo, AttributeFuncs::typeIncompatible(
7103 CI->getArgOperand(ArgNo)->getType(),
7104 CI->getParamAttributes(ArgNo)));
7107 if (Function *OldFn = CI->getCalledFunction()) {
7108 auto It = UpgradedIntrinsics.find(OldFn);
7109 if (It != UpgradedIntrinsics.end())
7120 return materializeForwardReferencedFunctions();
7123Error BitcodeReader::materializeModule() {
7124 if (
Error Err = materializeMetadata())
7128 WillMaterializeAllForwardRefs =
true;
7132 for (Function &
F : *TheModule) {
7133 if (
Error Err = materialize(&
F))
7139 if (LastFunctionBlockBit || NextUnreadBit)
7141 ? LastFunctionBlockBit
7147 if (!BasicBlockFwdRefs.
empty())
7148 return error(
"Never resolved function from blockaddress");
7154 for (
auto &
I : UpgradedIntrinsics) {
7155 for (
auto *U :
I.first->users()) {
7159 if (
I.first !=
I.second) {
7160 if (!
I.first->use_empty())
7161 I.first->replaceAllUsesWith(
I.second);
7162 I.first->eraseFromParent();
7165 UpgradedIntrinsics.clear();
7180std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7181 return IdentifiedStructTypes;
7184ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7185 BitstreamCursor Cursor, StringRef Strtab, ModuleSummaryIndex &TheIndex,
7187 : BitcodeReaderBase(std::
move(Cursor), Strtab), TheIndex(TheIndex),
7188 ModulePath(ModulePath), IsPrevailing(IsPrevailing) {}
7190void ModuleSummaryIndexBitcodeReader::addThisModule() {
7195ModuleSummaryIndexBitcodeReader::getThisModule() {
7199template <
bool AllowNullValueInfo>
7200std::pair<ValueInfo, GlobalValue::GUID>
7201ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7202 auto VGI = ValueIdToValueInfoMap[ValueId];
7207 assert(AllowNullValueInfo || std::get<0>(VGI));
7211void ModuleSummaryIndexBitcodeReader::setValueGUID(
7213 StringRef SourceFileName) {
7214 std::string GlobalId =
7217 auto OriginalNameID = ValueGUID;
7221 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7227 ValueIdToValueInfoMap[ValueID] = std::make_pair(
7236Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7238 DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap) {
7245 if (!MaybeCurrentBit)
7247 uint64_t CurrentBit = MaybeCurrentBit.
get();
7252 SmallVector<uint64_t, 64> Record;
7258 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
7261 BitstreamEntry
Entry = MaybeEntry.
get();
7263 switch (
Entry.Kind) {
7266 return error(
"Malformed block");
7269 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
7279 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
7282 switch (MaybeRecord.
get()) {
7287 return error(
"Invalid record");
7288 unsigned ValueID = Record[0];
7290 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7291 assert(VLI != ValueIdToLinkageMap.
end() &&
7292 "No linkage found for VST entry?");
7301 return error(
"Invalid record");
7302 unsigned ValueID = Record[0];
7304 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7305 assert(VLI != ValueIdToLinkageMap.
end() &&
7306 "No linkage found for VST entry?");
7314 unsigned ValueID = Record[0];
7318 ValueIdToValueInfoMap[ValueID] =
7329Error ModuleSummaryIndexBitcodeReader::parseModule() {
7333 SmallVector<uint64_t, 64> Record;
7334 DenseMap<unsigned, GlobalValue::LinkageTypes> ValueIdToLinkageMap;
7335 unsigned ValueId = 0;
7339 Expected<llvm::BitstreamEntry> MaybeEntry = Stream.advance();
7342 llvm::BitstreamEntry
Entry = MaybeEntry.
get();
7344 switch (
Entry.Kind) {
7346 return error(
"Malformed block");
7353 if (
Error Err = Stream.SkipBlock())
7358 if (
Error Err = readBlockInfo())
7364 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7365 !SeenGlobalValSummary) &&
7366 "Expected early VST parse via VSTOffset record");
7367 if (
Error Err = Stream.SkipBlock())
7373 if (!SourceFileName.
empty())
7375 assert(!SeenValueSymbolTable &&
7376 "Already read VST when parsing summary block?");
7381 if (VSTOffset > 0) {
7382 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7384 SeenValueSymbolTable =
true;
7386 SeenGlobalValSummary =
true;
7387 if (
Error Err = parseEntireSummary(
Entry.ID))
7391 if (
Error Err = parseModuleStringTable())
7399 Expected<unsigned> MaybeBitCode = Stream.readRecord(
Entry.ID, Record);
7402 switch (MaybeBitCode.
get()) {
7406 if (
Error Err = parseVersionRecord(Record).takeError())
7414 return error(
"Invalid record");
7420 if (Record.
size() != 5)
7421 return error(
"Invalid hash length " + Twine(Record.
size()).str());
7422 auto &Hash = getThisModule()->second;
7424 for (
auto &Val : Record) {
7425 assert(!(Val >> 32) &&
"Unexpected high bits set");
7433 return error(
"Invalid record");
7437 VSTOffset = Record[0] - 1;
7447 ArrayRef<uint64_t> GVRecord;
7448 std::tie(Name, GVRecord) = readNameFromStrtab(Record);
7449 if (GVRecord.
size() <= 3)
7450 return error(
"Invalid record");
7451 uint64_t RawLinkage = GVRecord[3];
7454 ValueIdToLinkageMap[ValueId++] =
Linkage;
7458 setValueGUID(ValueId++, Name,
Linkage, SourceFileName);
7469ModuleSummaryIndexBitcodeReader::makeRefList(ArrayRef<uint64_t> Record) {
7472 for (uint64_t RefValueId : Record)
7473 Ret.push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7478ModuleSummaryIndexBitcodeReader::makeCallList(ArrayRef<uint64_t> Record,
7479 bool IsOldProfileFormat,
7480 bool HasProfile,
bool HasRelBF) {
7484 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7485 Ret.reserve(Record.
size() / 2);
7489 for (
unsigned I = 0,
E = Record.
size();
I !=
E; ++
I) {
7491 bool HasTailCall =
false;
7493 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7494 if (IsOldProfileFormat) {
7498 }
else if (HasProfile)
7499 std::tie(Hotness, HasTailCall) =
7504 Callee, CalleeInfo(Hotness, HasTailCall, RelBF)});
7532 static_cast<size_t>(
Record[Slot + 1])};
7555 while (Slot <
Record.size())
7559std::vector<FunctionSummary::ParamAccess>
7560ModuleSummaryIndexBitcodeReader::parseParamAccesses(ArrayRef<uint64_t> Record) {
7561 auto ReadRange = [&]() {
7563 BitcodeReader::decodeSignRotatedValue(Record.
consume_front()));
7565 BitcodeReader::decodeSignRotatedValue(Record.
consume_front()));
7572 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7573 while (!Record.
empty()) {
7574 PendingParamAccesses.emplace_back();
7575 FunctionSummary::ParamAccess &ParamAccess = PendingParamAccesses.back();
7577 ParamAccess.
Use = ReadRange();
7582 std::get<0>(getValueInfoFromValueId(Record.
consume_front()));
7583 Call.Offsets = ReadRange();
7586 return PendingParamAccesses;
7589void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7590 ArrayRef<uint64_t> Record,
size_t &Slot,
7593 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[Slot++]));
7597void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7598 ArrayRef<uint64_t> Record) {
7603 static_cast<size_t>(Record[
Slot + 1])});
7606 while (Slot < Record.
size())
7607 parseTypeIdCompatibleVtableInfo(Record, Slot, TypeId);
7610SmallVector<unsigned> ModuleSummaryIndexBitcodeReader::parseAllocInfoContext(
7611 ArrayRef<uint64_t> Record,
unsigned &
I) {
7612 SmallVector<unsigned> StackIdList;
7616 if (RadixArray.empty()) {
7617 unsigned NumStackEntries = Record[
I++];
7619 StackIdList.
reserve(NumStackEntries);
7620 for (
unsigned J = 0; J < NumStackEntries; J++) {
7621 assert(Record[
I] < StackIds.size());
7626 unsigned RadixIndex = Record[
I++];
7632 assert(RadixIndex < RadixArray.size());
7633 unsigned NumStackIds = RadixArray[RadixIndex++];
7634 StackIdList.
reserve(NumStackIds);
7635 while (NumStackIds--) {
7636 assert(RadixIndex < RadixArray.size());
7637 unsigned Elem = RadixArray[RadixIndex];
7638 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7639 RadixIndex = RadixIndex - Elem;
7640 assert(RadixIndex < RadixArray.size());
7641 Elem = RadixArray[RadixIndex];
7643 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7656 unsigned FirstWORef = Refs.
size() - WOCnt;
7657 unsigned RefNo = FirstWORef - ROCnt;
7658 for (; RefNo < FirstWORef; ++RefNo)
7659 Refs[RefNo].setReadOnly();
7660 for (; RefNo < Refs.
size(); ++RefNo)
7661 Refs[RefNo].setWriteOnly();
7666Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7667 if (
Error Err = Stream.EnterSubBlock(
ID))
7669 SmallVector<uint64_t, 64> Record;
7673 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
7676 BitstreamEntry
Entry = MaybeEntry.
get();
7679 return error(
"Invalid Summary Block: record for version expected");
7680 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
7684 return error(
"Invalid Summary Block: version expected");
7686 const uint64_t
Version = Record[0];
7687 const bool IsOldProfileFormat =
Version == 1;
7689 return error(
"Invalid summary version " + Twine(
Version) +
7690 ". Version should be in the range [1-" +
7697 GlobalValueSummary *LastSeenSummary =
nullptr;
7703 std::vector<GlobalValue::GUID> PendingTypeTests;
7704 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7705 PendingTypeCheckedLoadVCalls;
7706 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7707 PendingTypeCheckedLoadConstVCalls;
7708 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7710 std::vector<CallsiteInfo> PendingCallsites;
7711 std::vector<AllocInfo> PendingAllocs;
7712 std::vector<uint64_t> PendingContextIds;
7715 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
7718 BitstreamEntry
Entry = MaybeEntry.
get();
7720 switch (
Entry.Kind) {
7723 return error(
"Malformed block");
7739 Expected<unsigned> MaybeBitCode = Stream.readRecord(
Entry.ID, Record);
7742 switch (
unsigned BitCode = MaybeBitCode.
get()) {
7750 uint64_t ValueID = Record[0];
7753 RefGUID = Record[1] << 32 | Record[2];
7755 RefGUID = Record[1];
7757 ValueIdToValueInfoMap[ValueID] =
7773 unsigned ValueID = Record[0];
7774 uint64_t RawFlags = Record[1];
7775 unsigned InstCount = Record[2];
7776 uint64_t RawFunFlags = 0;
7777 unsigned NumRefs = Record[3];
7778 unsigned NumRORefs = 0, NumWORefs = 0;
7779 int RefListStartIndex = 4;
7781 RawFunFlags = Record[3];
7782 NumRefs = Record[4];
7783 RefListStartIndex = 5;
7785 NumRORefs = Record[5];
7786 RefListStartIndex = 6;
7788 NumWORefs = Record[6];
7789 RefListStartIndex = 7;
7800 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7801 assert(Record.
size() >= RefListStartIndex + NumRefs &&
7802 "Record size inconsistent with number of references");
7804 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7808 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7809 IsOldProfileFormat, HasProfile, HasRelBF);
7811 auto VIAndOriginalGUID = getValueInfoFromValueId(ValueID);
7817 !IsPrevailing(VIAndOriginalGUID.first.getGUID())) {
7818 PendingCallsites.clear();
7819 PendingAllocs.clear();
7821 auto FS = std::make_unique<FunctionSummary>(
7823 std::move(Calls), std::move(PendingTypeTests),
7824 std::move(PendingTypeTestAssumeVCalls),
7825 std::move(PendingTypeCheckedLoadVCalls),
7826 std::move(PendingTypeTestAssumeConstVCalls),
7827 std::move(PendingTypeCheckedLoadConstVCalls),
7828 std::move(PendingParamAccesses), std::move(PendingCallsites),
7829 std::move(PendingAllocs));
7830 FS->setModulePath(getThisModule()->first());
7831 FS->setOriginalName(std::get<1>(VIAndOriginalGUID));
7840 unsigned ValueID = Record[0];
7841 uint64_t RawFlags = Record[1];
7842 unsigned AliaseeID = Record[2];
7844 auto AS = std::make_unique<AliasSummary>(Flags);
7850 AS->setModulePath(getThisModule()->first());
7852 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
7854 if (!AliaseeInModule)
7855 return error(
"Alias expects aliasee summary to be parsed");
7856 AS->setAliasee(AliaseeVI, AliaseeInModule);
7858 auto GUID = getValueInfoFromValueId(ValueID);
7859 AS->setOriginalName(std::get<1>(GUID));
7865 unsigned ValueID = Record[0];
7866 uint64_t RawFlags = Record[1];
7867 unsigned RefArrayStart = 2;
7868 GlobalVarSummary::GVarFlags GVF(
false,
7878 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
7880 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7881 FS->setModulePath(getThisModule()->first());
7882 auto GUID = getValueInfoFromValueId(ValueID);
7883 FS->setOriginalName(std::get<1>(GUID));
7891 unsigned ValueID = Record[0];
7892 uint64_t RawFlags = Record[1];
7894 unsigned NumRefs = Record[3];
7895 unsigned RefListStartIndex = 4;
7896 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
7899 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7901 for (
unsigned I = VTableListStartIndex,
E = Record.
size();
I !=
E; ++
I) {
7902 ValueInfo
Callee = std::get<0>(getValueInfoFromValueId(Record[
I]));
7903 uint64_t
Offset = Record[++
I];
7907 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7908 VS->setModulePath(getThisModule()->first());
7909 VS->setVTableFuncs(VTableFuncs);
7910 auto GUID = getValueInfoFromValueId(ValueID);
7911 VS->setOriginalName(std::get<1>(GUID));
7923 unsigned ValueID = Record[0];
7924 uint64_t ModuleId = Record[1];
7925 uint64_t RawFlags = Record[2];
7926 unsigned InstCount = Record[3];
7927 uint64_t RawFunFlags = 0;
7928 unsigned NumRefs = Record[4];
7929 unsigned NumRORefs = 0, NumWORefs = 0;
7930 int RefListStartIndex = 5;
7933 RawFunFlags = Record[4];
7934 RefListStartIndex = 6;
7935 size_t NumRefsIndex = 5;
7937 unsigned NumRORefsOffset = 1;
7938 RefListStartIndex = 7;
7941 RefListStartIndex = 8;
7943 RefListStartIndex = 9;
7944 NumWORefs = Record[8];
7945 NumRORefsOffset = 2;
7948 NumRORefs = Record[RefListStartIndex - NumRORefsOffset];
7950 NumRefs = Record[NumRefsIndex];
7954 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7955 assert(Record.
size() >= RefListStartIndex + NumRefs &&
7956 "Record size inconsistent with number of references");
7958 ArrayRef<uint64_t>(Record).slice(RefListStartIndex, NumRefs));
7961 ArrayRef<uint64_t>(Record).slice(CallGraphEdgeStartIndex),
7962 IsOldProfileFormat, HasProfile,
false);
7963 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
7965 auto FS = std::make_unique<FunctionSummary>(
7967 std::move(Edges), std::move(PendingTypeTests),
7968 std::move(PendingTypeTestAssumeVCalls),
7969 std::move(PendingTypeCheckedLoadVCalls),
7970 std::move(PendingTypeTestAssumeConstVCalls),
7971 std::move(PendingTypeCheckedLoadConstVCalls),
7972 std::move(PendingParamAccesses), std::move(PendingCallsites),
7973 std::move(PendingAllocs));
7974 LastSeenSummary =
FS.get();
7975 LastSeenGUID =
VI.getGUID();
7976 FS->setModulePath(ModuleIdMap[ModuleId]);
7984 unsigned ValueID = Record[0];
7985 uint64_t ModuleId = Record[1];
7986 uint64_t RawFlags = Record[2];
7987 unsigned AliaseeValueId = Record[3];
7989 auto AS = std::make_unique<AliasSummary>(Flags);
7990 LastSeenSummary = AS.get();
7991 AS->setModulePath(ModuleIdMap[ModuleId]);
7993 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeValueId));
7995 AS->setAliasee(AliaseeVI, AliaseeInModule);
7997 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
7998 LastSeenGUID =
VI.getGUID();
8004 unsigned ValueID = Record[0];
8005 uint64_t ModuleId = Record[1];
8006 uint64_t RawFlags = Record[2];
8007 unsigned RefArrayStart = 3;
8008 GlobalVarSummary::GVarFlags GVF(
false,
8018 makeRefList(ArrayRef<uint64_t>(Record).slice(RefArrayStart));
8020 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8021 LastSeenSummary =
FS.get();
8022 FS->setModulePath(ModuleIdMap[ModuleId]);
8023 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8024 LastSeenGUID =
VI.getGUID();
8030 uint64_t OriginalName = Record[0];
8031 if (!LastSeenSummary)
8032 return error(
"Name attachment that does not follow a combined record");
8036 LastSeenSummary =
nullptr;
8041 assert(PendingTypeTests.empty());
8046 assert(PendingTypeTestAssumeVCalls.empty());
8047 for (
unsigned I = 0;
I != Record.
size();
I += 2)
8048 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8052 assert(PendingTypeCheckedLoadVCalls.empty());
8053 for (
unsigned I = 0;
I != Record.
size();
I += 2)
8054 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8058 PendingTypeTestAssumeConstVCalls.push_back(
8059 {{Record[0], Record[1]}, {Record.
begin() + 2, Record.
end()}});
8063 PendingTypeCheckedLoadConstVCalls.push_back(
8064 {{Record[0], Record[1]}, {Record.
begin() + 2, Record.
end()}});
8069 for (
unsigned I = 0;
I != Record.
size();
I += 2)
8071 static_cast<size_t>(Record[
I + 1]));
8077 for (
unsigned I = 0;
I != Record.
size();
I += 2)
8079 static_cast<size_t>(Record[
I + 1]));
8088 parseTypeIdCompatibleVtableSummaryRecord(Record);
8096 PendingParamAccesses = parseParamAccesses(Record);
8104 StackIds = ArrayRef<uint64_t>(Record);
8110 StackIds.reserve(Record.
size() / 2);
8111 for (
auto R = Record.
begin(); R != Record.
end(); R += 2)
8112 StackIds.push_back(*R << 32 | *(R + 1));
8117 RadixArray = ArrayRef<uint64_t>(Record);
8122 unsigned ValueID = Record[0];
8123 SmallVector<unsigned> StackIdList;
8125 assert(R < StackIds.size());
8128 ValueInfo
VI = std::get<0>(getValueInfoFromValueId(ValueID));
8129 PendingCallsites.push_back(CallsiteInfo({
VI, std::move(StackIdList)}));
8134 auto RecordIter = Record.
begin();
8135 unsigned ValueID = *RecordIter++;
8136 unsigned NumStackIds = *RecordIter++;
8137 unsigned NumVersions = *RecordIter++;
8138 assert(Record.
size() == 3 + NumStackIds + NumVersions);
8139 SmallVector<unsigned> StackIdList;
8140 for (
unsigned J = 0; J < NumStackIds; J++) {
8141 assert(*RecordIter < StackIds.size());
8145 SmallVector<unsigned> Versions;
8146 for (
unsigned J = 0; J < NumVersions; J++)
8148 ValueInfo
VI = std::get<0>(
8149 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8150 PendingCallsites.push_back(
8151 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8159 PendingContextIds.reserve(Record.
size() / 2);
8160 for (
auto R = Record.
begin(); R != Record.
end(); R += 2)
8161 PendingContextIds.push_back(*R << 32 | *(R + 1));
8167 std::vector<MIBInfo> MIBs;
8168 unsigned NumMIBs = 0;
8170 NumMIBs = Record[
I++];
8171 unsigned MIBsRead = 0;
8172 while ((
Version >= 10 && MIBsRead++ < NumMIBs) ||
8176 auto StackIdList = parseAllocInfoContext(Record,
I);
8177 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8183 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8184 if (
I < Record.
size()) {
8185 assert(!PendingContextIds.empty() &&
8186 "Missing context ids for alloc sizes");
8187 unsigned ContextIdIndex = 0;
8193 while (MIBsRead++ < NumMIBs) {
8195 unsigned NumContextSizeInfoEntries = Record[
I++];
8196 assert(Record.
size() -
I >= NumContextSizeInfoEntries);
8197 std::vector<ContextTotalSize> ContextSizes;
8198 ContextSizes.reserve(NumContextSizeInfoEntries);
8199 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8200 assert(ContextIdIndex < PendingContextIds.size());
8202 if (PendingContextIds[ContextIdIndex] == 0) {
8211 ContextSizes.push_back(
8212 {PendingContextIds[ContextIdIndex++], Record[
I++]});
8214 AllContextSizes.push_back(std::move(ContextSizes));
8216 PendingContextIds.clear();
8218 PendingAllocs.push_back(AllocInfo(std::move(MIBs)));
8219 if (!AllContextSizes.empty()) {
8220 assert(PendingAllocs.back().MIBs.size() == AllContextSizes.size());
8221 PendingAllocs.back().ContextSizeInfos = std::move(AllContextSizes);
8229 std::vector<MIBInfo> MIBs;
8230 unsigned NumMIBs = Record[
I++];
8231 unsigned NumVersions = Record[
I++];
8232 unsigned MIBsRead = 0;
8233 while (MIBsRead++ < NumMIBs) {
8236 SmallVector<unsigned> StackIdList;
8238 StackIdList = parseAllocInfoContext(Record,
I);
8239 MIBs.push_back(MIBInfo(
AllocType, std::move(StackIdList)));
8242 SmallVector<uint8_t> Versions;
8243 for (
unsigned J = 0; J < NumVersions; J++)
8246 PendingAllocs.push_back(AllocInfo(std::move(Versions), std::move(MIBs)));
8256Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8260 SmallVector<uint64_t, 64> Record;
8262 SmallString<128> ModulePath;
8266 Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
8269 BitstreamEntry
Entry = MaybeEntry.
get();
8271 switch (
Entry.Kind) {
8274 return error(
"Malformed block");
8283 Expected<unsigned> MaybeRecord = Stream.readRecord(
Entry.ID, Record);
8286 switch (MaybeRecord.
get()) {
8291 uint64_t ModuleId = Record[0];
8294 return error(
"Invalid record");
8296 LastSeenModule = TheIndex.
addModule(ModulePath);
8297 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8304 if (Record.
size() != 5)
8305 return error(
"Invalid hash length " + Twine(Record.
size()).str());
8306 if (!LastSeenModule)
8307 return error(
"Invalid hash that does not follow a module path");
8309 for (
auto &Val : Record) {
8310 assert(!(Val >> 32) &&
"Unexpected high bits set");
8311 LastSeenModule->
second[Pos++] = Val;
8314 LastSeenModule =
nullptr;
8327class BitcodeErrorCategoryType :
public std::error_category {
8328 const char *
name()
const noexcept
override {
8329 return "llvm.bitcode";
8332 std::string message(
int IE)
const override {
8335 case BitcodeError::CorruptedBitcode:
8336 return "Corrupted bitcode";
8345 static BitcodeErrorCategoryType ErrorCategory;
8346 return ErrorCategory;
8350 unsigned Block,
unsigned RecordID) {
8352 return std::move(Err);
8361 switch (Entry.Kind) {
8366 return error(
"Malformed block");
8370 return std::move(Err);
8380 if (MaybeRecord.
get() == RecordID)
8391Expected<std::vector<BitcodeModule>>
8395 return FOrErr.takeError();
8396 return std::move(FOrErr->Mods);
8421 switch (Entry.Kind) {
8424 return error(
"Malformed block");
8427 uint64_t IdentificationBit = -1ull;
8431 return std::move(Err);
8437 Entry = MaybeEntry.
get();
8442 return error(
"Malformed block");
8448 return std::move(Err);
8467 if (!
I.Strtab.empty())
8474 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8475 F.StrtabForSymtab = *Strtab;
8491 if (
F.Symtab.empty())
8492 F.Symtab = *SymtabOrErr;
8497 return std::move(Err);
8502 return std::move(E);
8517BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8518 bool ShouldLazyLoadMetadata,
bool IsImporting,
8522 std::string ProducerIdentification;
8523 if (IdentificationBit != -1ull) {
8524 if (
Error JumpFailed = Stream.JumpToBit(IdentificationBit))
8525 return std::move(JumpFailed);
8528 return std::move(
E);
8531 if (
Error JumpFailed = Stream.JumpToBit(ModuleBit))
8532 return std::move(JumpFailed);
8533 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8536 std::unique_ptr<Module>
M =
8537 std::make_unique<Module>(ModuleIdentifier,
Context);
8538 M->setMaterializer(R);
8541 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8542 IsImporting, Callbacks))
8543 return std::move(Err);
8545 if (MaterializeAll) {
8547 if (
Error Err =
M->materializeAll())
8548 return std::move(Err);
8551 if (
Error Err =
R->materializeForwardReferencedFunctions())
8552 return std::move(Err);
8555 return std::move(M);
8558Expected<std::unique_ptr<Module>>
8561 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8576 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8577 ModulePath, IsPrevailing);
8578 return R.parseModule();
8585 return std::move(JumpFailed);
8587 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8588 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8589 ModuleIdentifier, 0);
8591 if (
Error Err = R.parseModule())
8592 return std::move(Err);
8594 return std::move(Index);
8600 return std::move(Err);
8606 return std::move(
E);
8608 switch (Entry.Kind) {
8611 return error(
"Malformed block");
8614 return std::make_pair(
false,
false);
8626 switch (MaybeBitCode.
get()) {
8632 assert(Flags <= 0x7ff &&
"Unexpected bits in flag");
8634 bool EnableSplitLTOUnit = Flags & 0x8;
8635 bool UnifiedLTO = Flags & 0x200;
8636 return std::make_pair(EnableSplitLTOUnit, UnifiedLTO);
8647 return std::move(JumpFailed);
8650 return std::move(Err);
8655 return std::move(E);
8657 switch (Entry.Kind) {
8659 return error(
"Malformed block");
8670 return Flags.takeError();
8680 return std::move(Err);
8687 return StreamFailed.takeError();
8697 if (MsOrErr->size() != 1)
8698 return error(
"Expected a single module");
8700 return (*MsOrErr)[0];
8703Expected<std::unique_ptr<Module>>
8705 bool ShouldLazyLoadMetadata,
bool IsImporting,
8711 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8716 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8717 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8719 IsImporting, Callbacks);
8721 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8727 return getModuleImpl(Context,
true,
false,
false, Callbacks);
8739 return BM->parseModule(Context, Callbacks);
8772 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
8781 return BM->getSummary();
8789 return BM->getLTOInfo();
8794 bool IgnoreEmptyThinLTOIndexFile) {
8799 if (IgnoreEmptyThinLTOIndexFile && !(*FileOrErr)->getBufferSize())
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static bool isConstant(const MachineInstr &MI)
AMDGPU Prepare AGPR Alloc
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")
Analysis containing CSE Info
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.
static uint64_t decodeSignRotatedValue(uint64_t V)
Decode a signed value stored with the sign bit in the LSB for dense VBR encoding.
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.
const T & consume_front()
consume_front() - Returns the first element and drops it from ArrayRef.
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.
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.
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
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 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.
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.
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)
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
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 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_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 unsigned RelBlockFreqBits
The value stored in RelBlockFreq has to be interpreted as the digits of a scaled number with a scale ...
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