24#include "llvm/Config/llvm-config.h"
54#include "llvm/IR/IntrinsicsAArch64.h"
55#include "llvm/IR/IntrinsicsARM.h"
88#include <system_error>
98 "Print the global id for each value when reading the module summary"));
103 "Expand constant expressions to instructions for testing purposes"));
110 "load-bitcode-into-experimental-debuginfo-iterators",
cl::Hidden,
111 cl::desc(
"Load bitcode directly into the new debug info format (regardless "
112 "of input format)"));
121 SWITCH_INST_MAGIC = 0x4B5
127 return make_error<StringError>(
134 "file too small to contain bitcode header");
135 for (
unsigned C : {
'B',
'C'})
139 "file doesn't start with bitcode header");
141 return Res.takeError();
142 for (
unsigned C : {0x0, 0xC, 0xE, 0xD})
146 "file doesn't start with bitcode header");
148 return Res.takeError();
153 const unsigned char *BufPtr = (
const unsigned char *)Buffer.
getBufferStart();
154 const unsigned char *BufEnd = BufPtr + Buffer.
getBufferSize();
157 return error(
"Invalid bitcode signature");
163 return error(
"Invalid bitcode wrapper header");
167 return std::move(Err);
169 return std::move(Stream);
173template <
typename StrTy>
186 if (
F.isMaterializable())
189 I.setMetadata(LLVMContext::MD_tbaa,
nullptr);
197 return std::move(Err);
202 std::string ProducerIdentification;
209 switch (Entry.Kind) {
212 return error(
"Malformed block");
214 return ProducerIdentification;
225 switch (MaybeBitCode.
get()) {
227 return error(
"Invalid value");
235 Twine(
"Incompatible epoch: Bitcode '") +
Twine(epoch) +
254 switch (Entry.Kind) {
257 return error(
"Malformed block");
265 return std::move(Err);
277 return std::move(Err);
288 switch (Entry.Kind) {
291 return error(
"Malformed block");
303 switch (MaybeRecord.
get()) {
309 return error(
"Invalid section name record");
311 if (S.find(
"__DATA,__objc_catlist") != std::string::npos ||
312 S.find(
"__OBJC,__category") != std::string::npos ||
313 S.find(
"__TEXT,__swift") != std::string::npos)
331 switch (Entry.Kind) {
333 return error(
"Malformed block");
343 return std::move(Err);
356 return std::move(Err);
369 switch (Entry.Kind) {
372 return error(
"Malformed block");
384 switch (MaybeRecord.
get()) {
389 return error(
"Invalid triple record");
408 switch (Entry.Kind) {
410 return error(
"Malformed block");
420 return std::move(Err);
427 return Skipped.takeError();
434class BitcodeReaderBase {
437 : Stream(
std::
move(Stream)), Strtab(Strtab) {
447 bool UseStrtab =
false;
454 std::pair<StringRef, ArrayRef<uint64_t>>
457 Error readBlockInfo();
460 std::string ProducerIdentification;
467Error BitcodeReaderBase::error(
const Twine &Message) {
468 std::string FullMsg = Message.
str();
469 if (!ProducerIdentification.empty())
470 FullMsg +=
" (Producer: '" + ProducerIdentification +
"' Reader: 'LLVM " +
471 LLVM_VERSION_STRING
"')";
472 return ::error(FullMsg);
478 return error(
"Invalid version record");
479 unsigned ModuleVersion =
Record[0];
480 if (ModuleVersion > 2)
481 return error(
"Invalid value");
482 UseStrtab = ModuleVersion >= 2;
483 return ModuleVersion;
486std::pair<StringRef, ArrayRef<uint64_t>>
504class BitcodeConstant final :
public Value,
509 static constexpr uint8_t SubclassID = 255;
517 static constexpr uint8_t ConstantStructOpcode = 255;
518 static constexpr uint8_t ConstantArrayOpcode = 254;
519 static constexpr uint8_t ConstantVectorOpcode = 253;
520 static constexpr uint8_t NoCFIOpcode = 252;
521 static constexpr uint8_t DSOLocalEquivalentOpcode = 251;
522 static constexpr uint8_t BlockAddressOpcode = 250;
523 static constexpr uint8_t ConstantPtrAuthOpcode = 249;
524 static constexpr uint8_t FirstSpecialOpcode = ConstantPtrAuthOpcode;
531 unsigned BlockAddressBB = 0;
532 Type *SrcElemTy =
nullptr;
533 std::optional<ConstantRange> InRange;
536 std::optional<ConstantRange> InRange = std::nullopt)
537 : Opcode(Opcode),
Flags(
Flags), SrcElemTy(SrcElemTy),
541 : Opcode(Opcode),
Flags(
Flags), BlockAddressBB(BlockAddressBB) {}
546 unsigned NumOperands;
547 unsigned BlockAddressBB;
549 std::optional<ConstantRange>
InRange;
554 NumOperands(OpIDs.
size()), BlockAddressBB(
Info.BlockAddressBB),
555 SrcElemTy(
Info.SrcElemTy), InRange(
Info.InRange) {
556 std::uninitialized_copy(OpIDs.
begin(), OpIDs.
end(),
557 getTrailingObjects<unsigned>());
560 BitcodeConstant &
operator=(
const BitcodeConstant &) =
delete;
564 const ExtraInfo &Info,
566 void *Mem =
A.Allocate(totalSizeToAlloc<unsigned>(OpIDs.
size()),
567 alignof(BitcodeConstant));
568 return new (Mem) BitcodeConstant(Ty, Info, OpIDs);
571 static bool classof(
const Value *V) {
return V->getValueID() == SubclassID; }
574 return ArrayRef(getTrailingObjects<unsigned>(), NumOperands);
577 std::optional<ConstantRange> getInRange()
const {
578 assert(Opcode == Instruction::GetElementPtr);
587class BitcodeReader :
public BitcodeReaderBase,
public GVMaterializer {
589 Module *TheModule =
nullptr;
594 bool SeenValueSymbolTable =
false;
597 std::vector<std::string> SectionTable;
598 std::vector<std::string> GCTable;
600 std::vector<Type *> TypeList;
618 std::optional<MetadataLoader> MDLoader;
619 std::vector<Comdat *> ComdatList;
623 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInits;
624 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInits;
626 struct FunctionOperandInfo {
628 unsigned PersonalityFn;
632 std::vector<FunctionOperandInfo> FunctionOperands;
636 std::vector<AttributeList> MAttributes;
639 std::map<unsigned, AttributeList> MAttributeGroups;
643 std::vector<BasicBlock*> FunctionBBs;
647 std::vector<Function*> FunctionsWithBodies;
652 UpdatedIntrinsicMap UpgradedIntrinsics;
657 bool SeenFirstFunctionBody =
false;
666 std::vector<uint64_t> DeferredMetadataInfo;
672 std::deque<Function *> BasicBlockFwdRefQueue;
679 std::vector<Function *> BackwardRefFunctions;
687 bool UseRelativeIDs =
false;
691 bool WillMaterializeAllForwardRefs =
false;
695 bool SeenDebugIntrinsic =
false;
696 bool SeenDebugRecord =
false;
701 std::vector<std::string> BundleTags;
704 std::optional<ValueTypeCallbackTy> ValueTypeCallback;
710 Error materializeForwardReferencedFunctions();
718 Error parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
729 std::vector<StructType *> IdentifiedStructTypes;
733 static constexpr unsigned InvalidTypeID = ~0
u;
735 Type *getTypeByID(
unsigned ID);
736 Type *getPtrElementTypeByID(
unsigned ID);
737 unsigned getContainedTypeID(
unsigned ID,
unsigned Idx = 0);
744 Value *getFnValueByID(
unsigned ID,
Type *Ty,
unsigned TyID,
752 return MDLoader->getMetadataFwdRefOrLoad(
ID);
756 if (
ID >= FunctionBBs.size())
return nullptr;
757 return FunctionBBs[
ID];
761 if (i-1 < MAttributes.size())
762 return MAttributes[i-1];
770 unsigned InstNum,
Value *&ResVal,
unsigned &
TypeID,
772 if (Slot ==
Record.size())
return true;
776 ValNo = InstNum - ValNo;
777 if (ValNo < InstNum) {
781 ResVal = getFnValueByID(ValNo,
nullptr,
TypeID, ConstExprInsertBB);
783 "Incorrect type ID stored for value");
784 return ResVal ==
nullptr;
786 if (Slot ==
Record.size())
790 ResVal = getFnValueByID(ValNo, getTypeByID(
TypeID),
TypeID,
792 return ResVal ==
nullptr;
796 unsigned &Slot,
unsigned InstNum,
Value *&ResVal,
798 if (Slot ==
Record.size())
803 return getValueTypePair(
Record, --Slot, InstNum, ResVal, TypeId,
806 if (Slot ==
Record.size())
817 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
819 if (getValue(
Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
828 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
830 ResVal = getValue(
Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
831 return ResVal ==
nullptr;
837 unsigned InstNum,
Type *Ty,
unsigned TyID,
839 if (Slot ==
Record.size())
return nullptr;
843 ValNo = InstNum - ValNo;
844 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
849 unsigned InstNum,
Type *Ty,
unsigned TyID,
851 if (Slot ==
Record.size())
return nullptr;
855 ValNo = InstNum - ValNo;
856 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
862 if (
Record.size() - OpNum < 2)
863 return error(
"Too few records for range");
865 unsigned LowerActiveWords =
Record[OpNum];
866 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
867 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
868 return error(
"Too few records for range");
871 OpNum += LowerActiveWords;
874 OpNum += UpperActiveWords;
877 int64_t Start = BitcodeReader::decodeSignRotatedValue(
Record[OpNum++]);
878 int64_t
End = BitcodeReader::decodeSignRotatedValue(
Record[OpNum++]);
886 if (
Record.size() - OpNum < 1)
887 return error(
"Too few records for range");
908 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
911 Error parseAttributeBlock();
912 Error parseAttributeGroupBlock();
913 Error parseTypeTable();
914 Error parseTypeTableBody();
915 Error parseOperandBundleTags();
916 Error parseSyncScopeNames();
919 unsigned NameIndex,
Triple &TT);
920 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
Function *
F,
923 Error parseGlobalValueSymbolTable();
924 Error parseConstants();
925 Error rememberAndSkipFunctionBodies();
926 Error rememberAndSkipFunctionBody();
928 Error rememberAndSkipMetadata();
931 Error globalCleanup();
932 Error resolveGlobalAndIndirectSymbolInits();
933 Error parseUseLists();
934 Error findFunctionInStream(
943class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
949 bool SeenGlobalValSummary =
false;
952 bool SeenValueSymbolTable =
false;
967 ValueIdToValueInfoMap;
976 std::string SourceFileName;
988 std::vector<uint64_t> StackIds;
992 std::vector<uint64_t> RadixArray;
995 ModuleSummaryIndexBitcodeReader(
1006 Error parseValueSymbolTable(
1012 bool HasProfile,
bool HasRelBF);
1013 Error parseEntireSummary(
unsigned ID);
1014 Error parseModuleStringTable();
1018 std::vector<FunctionSummary::ParamAccess>
1023 template <
bool AllowNullValueInfo = false>
1024 std::pair<ValueInfo, GlobalValue::GUID>
1025 getValueInfoFromValueId(
unsigned ValueId);
1027 void addThisModule();
1043 return std::error_code();
1049 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1050 ValueList(this->Stream.SizeInBytes(),
1052 return materializeValue(
ValID, InsertBB);
1054 this->ProducerIdentification = std::string(ProducerIdentification);
1057Error BitcodeReader::materializeForwardReferencedFunctions() {
1058 if (WillMaterializeAllForwardRefs)
1062 WillMaterializeAllForwardRefs =
true;
1064 while (!BasicBlockFwdRefQueue.empty()) {
1065 Function *
F = BasicBlockFwdRefQueue.front();
1066 BasicBlockFwdRefQueue.pop_front();
1067 assert(
F &&
"Expected valid function");
1068 if (!BasicBlockFwdRefs.
count(
F))
1076 if (!
F->isMaterializable())
1077 return error(
"Never resolved function from blockaddress");
1080 if (
Error Err = materialize(
F))
1083 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1085 for (
Function *
F : BackwardRefFunctions)
1086 if (
Error Err = materialize(
F))
1088 BackwardRefFunctions.clear();
1091 WillMaterializeAllForwardRefs =
false;
1155 Flags.ReadNone = RawFlags & 0x1;
1156 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1157 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1158 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1159 Flags.NoInline = (RawFlags >> 4) & 0x1;
1160 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1161 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1162 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1163 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1164 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1180 RawFlags = RawFlags >> 4;
1181 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1185 bool Live = (RawFlags & 0x2) || Version < 3;
1186 bool Local = (RawFlags & 0x4);
1187 bool AutoHide = (RawFlags & 0x8);
1196 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1197 (RawFlags & 0x4) ?
true :
false,
1201static std::pair<CalleeInfo::HotnessType, bool>
1205 bool HasTailCall = (RawFlags & 0x8);
1206 return {Hotness, HasTailCall};
1210 bool &HasTailCall) {
1211 static constexpr uint64_t RelBlockFreqMask =
1213 RelBF = RawFlags & RelBlockFreqMask;
1239 case 0:
return false;
1240 case 1:
return true;
1263 case 0:
return GlobalVariable::NotThreadLocal;
1265 case 1:
return GlobalVariable::GeneralDynamicTLSModel;
1266 case 2:
return GlobalVariable::LocalDynamicTLSModel;
1267 case 3:
return GlobalVariable::InitialExecTLSModel;
1268 case 4:
return GlobalVariable::LocalExecTLSModel;
1275 case 0:
return GlobalVariable::UnnamedAddr::None;
1276 case 1:
return GlobalVariable::UnnamedAddr::Global;
1277 case 2:
return GlobalVariable::UnnamedAddr::Local;
1310 return IsFP ? Instruction::FNeg : -1;
1324 return IsFP ? Instruction::FAdd : Instruction::Add;
1326 return IsFP ? Instruction::FSub : Instruction::Sub;
1328 return IsFP ? Instruction::FMul : Instruction::Mul;
1330 return IsFP ? -1 : Instruction::UDiv;
1332 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1334 return IsFP ? -1 : Instruction::URem;
1336 return IsFP ? Instruction::FRem : Instruction::SRem;
1338 return IsFP ? -1 : Instruction::Shl;
1340 return IsFP ? -1 : Instruction::LShr;
1342 return IsFP ? -1 : Instruction::AShr;
1344 return IsFP ? -1 : Instruction::And;
1346 return IsFP ? -1 : Instruction::Or;
1348 return IsFP ? -1 : Instruction::Xor;
1441Type *BitcodeReader::getTypeByID(
unsigned ID) {
1443 if (
ID >= TypeList.size())
1446 if (
Type *Ty = TypeList[
ID])
1451 return TypeList[
ID] = createIdentifiedStructType(Context);
1454unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1455 auto It = ContainedTypeIDs.
find(
ID);
1456 if (It == ContainedTypeIDs.
end())
1457 return InvalidTypeID;
1459 if (
Idx >= It->second.size())
1460 return InvalidTypeID;
1462 return It->second[
Idx];
1465Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1466 if (
ID >= TypeList.size())
1473 return getTypeByID(getContainedTypeID(
ID, 0));
1476unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1478 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1479 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1480 auto It = VirtualTypeIDs.
find(CacheKey);
1481 if (It != VirtualTypeIDs.
end()) {
1487 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1488 "Incorrect cached contained type IDs");
1492 unsigned TypeID = TypeList.size();
1493 TypeList.push_back(Ty);
1494 if (!ChildTypeIDs.
empty())
1515 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1529 if (Opcode == Instruction::GetElementPtr)
1533 case Instruction::FNeg:
1534 case Instruction::Select:
1535 case Instruction::ICmp:
1536 case Instruction::FCmp:
1546 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1547 !isa<BitcodeConstant>(ValueList[StartValID]))
1548 return ValueList[StartValID];
1553 while (!Worklist.
empty()) {
1562 return error(
"Invalid value ID");
1565 auto *BC = dyn_cast<BitcodeConstant>(V);
1575 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1576 auto It = MaterializedValues.
find(OpID);
1577 if (It != MaterializedValues.
end())
1585 if (Ops.
size() != BC->getOperandIDs().size())
1587 std::reverse(Ops.
begin(), Ops.
end());
1591 if (
auto *
C = dyn_cast<Constant>(
Op))
1604 switch (BC->Opcode) {
1605 case BitcodeConstant::ConstantPtrAuthOpcode: {
1606 auto *
Key = dyn_cast<ConstantInt>(ConstOps[1]);
1608 return error(
"ptrauth key operand must be ConstantInt");
1610 auto *Disc = dyn_cast<ConstantInt>(ConstOps[2]);
1612 return error(
"ptrauth disc operand must be ConstantInt");
1617 case BitcodeConstant::NoCFIOpcode: {
1618 auto *GV = dyn_cast<GlobalValue>(ConstOps[0]);
1620 return error(
"no_cfi operand must be GlobalValue");
1624 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1625 auto *GV = dyn_cast<GlobalValue>(ConstOps[0]);
1627 return error(
"dso_local operand must be GlobalValue");
1631 case BitcodeConstant::BlockAddressOpcode: {
1632 Function *Fn = dyn_cast<Function>(ConstOps[0]);
1634 return error(
"blockaddress operand must be a function");
1639 unsigned BBID = BC->BlockAddressBB;
1642 return error(
"Invalid ID");
1645 for (
size_t I = 0, E = BBID;
I != E; ++
I) {
1647 return error(
"Invalid ID");
1654 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1656 BasicBlockFwdRefQueue.push_back(Fn);
1657 if (FwdBBs.size() < BBID + 1)
1658 FwdBBs.resize(BBID + 1);
1666 case BitcodeConstant::ConstantStructOpcode: {
1667 auto *
ST = cast<StructType>(BC->getType());
1668 if (
ST->getNumElements() != ConstOps.
size())
1669 return error(
"Invalid number of elements in struct initializer");
1671 for (
const auto [Ty,
Op] :
zip(
ST->elements(), ConstOps))
1672 if (
Op->getType() != Ty)
1673 return error(
"Incorrect type in struct initializer");
1678 case BitcodeConstant::ConstantArrayOpcode: {
1679 auto *AT = cast<ArrayType>(BC->getType());
1680 if (AT->getNumElements() != ConstOps.
size())
1681 return error(
"Invalid number of elements in array initializer");
1684 if (
Op->getType() != AT->getElementType())
1685 return error(
"Incorrect type in array initializer");
1690 case BitcodeConstant::ConstantVectorOpcode: {
1691 auto *VT = cast<FixedVectorType>(BC->getType());
1692 if (VT->getNumElements() != ConstOps.size())
1693 return error(
"Invalid number of elements in vector initializer");
1696 if (
Op->getType() != VT->getElementType())
1697 return error(
"Incorrect type in vector initializer");
1702 case Instruction::GetElementPtr:
1704 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1707 case Instruction::ExtractElement:
1710 case Instruction::InsertElement:
1714 case Instruction::ShuffleVector: {
1733 return error(
Twine(
"Value referenced by initializer is an unsupported "
1734 "constant expression of type ") +
1735 BC->getOpcodeName());
1741 BC->getType(),
"constexpr", InsertBB);
1744 "constexpr", InsertBB);
1747 Ops[1],
"constexpr", InsertBB);
1748 if (isa<OverflowingBinaryOperator>(
I)) {
1750 I->setHasNoSignedWrap();
1752 I->setHasNoUnsignedWrap();
1754 if (isa<PossiblyExactOperator>(
I) &&
1758 switch (BC->Opcode) {
1759 case BitcodeConstant::ConstantVectorOpcode: {
1763 Value *
Idx = ConstantInt::get(IdxTy, Pair.index());
1767 I = cast<Instruction>(V);
1770 case BitcodeConstant::ConstantStructOpcode:
1771 case BitcodeConstant::ConstantArrayOpcode: {
1775 "constexpr.ins", InsertBB);
1776 I = cast<Instruction>(V);
1779 case Instruction::ICmp:
1780 case Instruction::FCmp:
1783 "constexpr", InsertBB);
1785 case Instruction::GetElementPtr:
1787 ArrayRef(Ops).drop_front(),
"constexpr",
1791 case Instruction::Select:
1794 case Instruction::ExtractElement:
1797 case Instruction::InsertElement:
1801 case Instruction::ShuffleVector:
1814 return MaterializedValues[StartValID];
1823 return cast<Constant>(MaybeV.
get());
1829 IdentifiedStructTypes.push_back(Ret);
1835 IdentifiedStructTypes.push_back(Ret);
1851 case Attribute::ZExt:
return 1 << 0;
1852 case Attribute::SExt:
return 1 << 1;
1853 case Attribute::NoReturn:
return 1 << 2;
1854 case Attribute::InReg:
return 1 << 3;
1855 case Attribute::StructRet:
return 1 << 4;
1856 case Attribute::NoUnwind:
return 1 << 5;
1857 case Attribute::NoAlias:
return 1 << 6;
1858 case Attribute::ByVal:
return 1 << 7;
1859 case Attribute::Nest:
return 1 << 8;
1860 case Attribute::ReadNone:
return 1 << 9;
1861 case Attribute::ReadOnly:
return 1 << 10;
1862 case Attribute::NoInline:
return 1 << 11;
1863 case Attribute::AlwaysInline:
return 1 << 12;
1864 case Attribute::OptimizeForSize:
return 1 << 13;
1865 case Attribute::StackProtect:
return 1 << 14;
1866 case Attribute::StackProtectReq:
return 1 << 15;
1867 case Attribute::Alignment:
return 31 << 16;
1868 case Attribute::NoCapture:
return 1 << 21;
1869 case Attribute::NoRedZone:
return 1 << 22;
1870 case Attribute::NoImplicitFloat:
return 1 << 23;
1871 case Attribute::Naked:
return 1 << 24;
1872 case Attribute::InlineHint:
return 1 << 25;
1873 case Attribute::StackAlignment:
return 7 << 26;
1874 case Attribute::ReturnsTwice:
return 1 << 29;
1875 case Attribute::UWTable:
return 1 << 30;
1876 case Attribute::NonLazyBind:
return 1U << 31;
1877 case Attribute::SanitizeAddress:
return 1ULL << 32;
1878 case Attribute::MinSize:
return 1ULL << 33;
1879 case Attribute::NoDuplicate:
return 1ULL << 34;
1880 case Attribute::StackProtectStrong:
return 1ULL << 35;
1881 case Attribute::SanitizeThread:
return 1ULL << 36;
1882 case Attribute::SanitizeMemory:
return 1ULL << 37;
1883 case Attribute::NoBuiltin:
return 1ULL << 38;
1884 case Attribute::Returned:
return 1ULL << 39;
1885 case Attribute::Cold:
return 1ULL << 40;
1886 case Attribute::Builtin:
return 1ULL << 41;
1887 case Attribute::OptimizeNone:
return 1ULL << 42;
1888 case Attribute::InAlloca:
return 1ULL << 43;
1889 case Attribute::NonNull:
return 1ULL << 44;
1890 case Attribute::JumpTable:
return 1ULL << 45;
1891 case Attribute::Convergent:
return 1ULL << 46;
1892 case Attribute::SafeStack:
return 1ULL << 47;
1893 case Attribute::NoRecurse:
return 1ULL << 48;
1896 case Attribute::SwiftSelf:
return 1ULL << 51;
1897 case Attribute::SwiftError:
return 1ULL << 52;
1898 case Attribute::WriteOnly:
return 1ULL << 53;
1899 case Attribute::Speculatable:
return 1ULL << 54;
1900 case Attribute::StrictFP:
return 1ULL << 55;
1901 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1902 case Attribute::NoCfCheck:
return 1ULL << 57;
1903 case Attribute::OptForFuzzing:
return 1ULL << 58;
1904 case Attribute::ShadowCallStack:
return 1ULL << 59;
1905 case Attribute::SpeculativeLoadHardening:
1907 case Attribute::ImmArg:
1909 case Attribute::WillReturn:
1911 case Attribute::NoFree:
1927 if (
I == Attribute::Alignment)
1928 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1929 else if (
I == Attribute::StackAlignment)
1930 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1932 B.addTypeAttr(
I,
nullptr);
1947 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
1949 "Alignment must be a power of two.");
1952 B.addAlignmentAttr(Alignment);
1954 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
1955 (EncodedAttrs & 0xffff);
1960 if (Attrs & (1ULL << 9)) {
1962 Attrs &= ~(1ULL << 9);
1965 if (Attrs & (1ULL << 10)) {
1967 Attrs &= ~(1ULL << 10);
1970 if (Attrs & (1ULL << 49)) {
1972 Attrs &= ~(1ULL << 49);
1975 if (Attrs & (1ULL << 50)) {
1977 Attrs &= ~(1ULL << 50);
1980 if (Attrs & (1ULL << 53)) {
1982 Attrs &= ~(1ULL << 53);
1986 B.addMemoryAttr(ME);
1992Error BitcodeReader::parseAttributeBlock() {
1996 if (!MAttributes.empty())
1997 return error(
"Invalid multiple blocks");
2010 switch (
Entry.Kind) {
2013 return error(
"Malformed block");
2026 switch (MaybeRecord.
get()) {
2032 return error(
"Invalid parameter attribute record");
2034 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2045 Attrs.push_back(MAttributeGroups[Val]);
2060 return Attribute::Alignment;
2062 return Attribute::AlwaysInline;
2064 return Attribute::Builtin;
2066 return Attribute::ByVal;
2068 return Attribute::InAlloca;
2070 return Attribute::Cold;
2072 return Attribute::Convergent;
2074 return Attribute::DisableSanitizerInstrumentation;
2076 return Attribute::ElementType;
2078 return Attribute::FnRetThunkExtern;
2080 return Attribute::InlineHint;
2082 return Attribute::InReg;
2084 return Attribute::JumpTable;
2086 return Attribute::Memory;
2088 return Attribute::NoFPClass;
2090 return Attribute::MinSize;
2092 return Attribute::Naked;
2094 return Attribute::Nest;
2096 return Attribute::NoAlias;
2098 return Attribute::NoBuiltin;
2100 return Attribute::NoCallback;
2102 return Attribute::NoCapture;
2104 return Attribute::NoDivergenceSource;
2106 return Attribute::NoDuplicate;
2108 return Attribute::NoFree;
2110 return Attribute::NoImplicitFloat;
2112 return Attribute::NoInline;
2114 return Attribute::NoRecurse;
2116 return Attribute::NoMerge;
2118 return Attribute::NonLazyBind;
2120 return Attribute::NonNull;
2122 return Attribute::Dereferenceable;
2124 return Attribute::DereferenceableOrNull;
2126 return Attribute::AllocAlign;
2128 return Attribute::AllocKind;
2130 return Attribute::AllocSize;
2132 return Attribute::AllocatedPointer;
2134 return Attribute::NoRedZone;
2136 return Attribute::NoReturn;
2138 return Attribute::NoSync;
2140 return Attribute::NoCfCheck;
2142 return Attribute::NoProfile;
2144 return Attribute::SkipProfile;
2146 return Attribute::NoUnwind;
2148 return Attribute::NoSanitizeBounds;
2150 return Attribute::NoSanitizeCoverage;
2152 return Attribute::NullPointerIsValid;
2154 return Attribute::OptimizeForDebugging;
2156 return Attribute::OptForFuzzing;
2158 return Attribute::OptimizeForSize;
2160 return Attribute::OptimizeNone;
2162 return Attribute::ReadNone;
2164 return Attribute::ReadOnly;
2166 return Attribute::Returned;
2168 return Attribute::ReturnsTwice;
2170 return Attribute::SExt;
2172 return Attribute::Speculatable;
2174 return Attribute::StackAlignment;
2176 return Attribute::StackProtect;
2178 return Attribute::StackProtectReq;
2180 return Attribute::StackProtectStrong;
2182 return Attribute::SafeStack;
2184 return Attribute::ShadowCallStack;
2186 return Attribute::StrictFP;
2188 return Attribute::StructRet;
2190 return Attribute::SanitizeAddress;
2192 return Attribute::SanitizeHWAddress;
2194 return Attribute::SanitizeThread;
2196 return Attribute::SanitizeType;
2198 return Attribute::SanitizeMemory;
2200 return Attribute::SanitizeNumericalStability;
2202 return Attribute::SanitizeRealtime;
2204 return Attribute::SanitizeRealtimeBlocking;
2206 return Attribute::SpeculativeLoadHardening;
2208 return Attribute::SwiftError;
2210 return Attribute::SwiftSelf;
2212 return Attribute::SwiftAsync;
2214 return Attribute::UWTable;
2216 return Attribute::VScaleRange;
2218 return Attribute::WillReturn;
2220 return Attribute::WriteOnly;
2222 return Attribute::ZExt;
2224 return Attribute::ImmArg;
2226 return Attribute::SanitizeMemTag;
2228 return Attribute::Preallocated;
2230 return Attribute::NoUndef;
2232 return Attribute::ByRef;
2234 return Attribute::MustProgress;
2236 return Attribute::Hot;
2238 return Attribute::PresplitCoroutine;
2240 return Attribute::Writable;
2242 return Attribute::CoroDestroyOnlyWhenComplete;
2244 return Attribute::DeadOnUnwind;
2246 return Attribute::Range;
2248 return Attribute::Initializes;
2250 return Attribute::CoroElideSafe;
2252 return Attribute::NoExt;
2254 return Attribute::Captures;
2263 return error(
"Invalid alignment value");
2271 return error(
"Unknown attribute kind (" +
Twine(Code) +
")");
2276 switch (EncodedKind) {
2300Error BitcodeReader::parseAttributeGroupBlock() {
2304 if (!MAttributeGroups.empty())
2305 return error(
"Invalid multiple blocks");
2316 switch (
Entry.Kind) {
2319 return error(
"Malformed block");
2332 switch (MaybeRecord.
get()) {
2337 return error(
"Invalid grp record");
2344 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2352 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2358 if (Kind == Attribute::ByVal)
2359 B.addByValAttr(
nullptr);
2360 else if (Kind == Attribute::StructRet)
2361 B.addStructRetAttr(
nullptr);
2362 else if (Kind == Attribute::InAlloca)
2363 B.addInAllocaAttr(
nullptr);
2364 else if (Kind == Attribute::UWTable)
2365 B.addUWTableAttr(UWTableKind::Default);
2367 B.addAttribute(Kind);
2369 return error(
"Not an enum attribute");
2370 }
else if (
Record[i] == 1) {
2372 if (
Error Err = parseAttrKind(
Record[++i], &Kind))
2375 return error(
"Not an int attribute");
2376 if (Kind == Attribute::Alignment)
2377 B.addAlignmentAttr(
Record[++i]);
2378 else if (Kind == Attribute::StackAlignment)
2379 B.addStackAlignmentAttr(
Record[++i]);
2380 else if (Kind == Attribute::Dereferenceable)
2381 B.addDereferenceableAttr(
Record[++i]);
2382 else if (Kind == Attribute::DereferenceableOrNull)
2383 B.addDereferenceableOrNullAttr(
Record[++i]);
2384 else if (Kind == Attribute::AllocSize)
2385 B.addAllocSizeAttrFromRawRepr(
Record[++i]);
2386 else if (Kind == Attribute::VScaleRange)
2387 B.addVScaleRangeAttrFromRawRepr(
Record[++i]);
2388 else if (Kind == Attribute::UWTable)
2390 else if (Kind == Attribute::AllocKind)
2392 else if (Kind == Attribute::Memory)
2394 else if (Kind == Attribute::Captures)
2396 else if (Kind == Attribute::NoFPClass)
2404 while (
Record[i] != 0 && i != e)
2406 assert(
Record[i] == 0 &&
"Kind string not null terminated");
2411 while (
Record[i] != 0 && i != e)
2413 assert(
Record[i] == 0 &&
"Value string not null terminated");
2416 B.addAttribute(KindStr.
str(), ValStr.
str());
2418 bool HasType =
Record[i] == 6;
2420 if (
Error Err = parseAttrKind(
Record[++i], &Kind))
2423 return error(
"Not a type attribute");
2425 B.addTypeAttr(Kind, HasType ? getTypeByID(
Record[++i]) :
nullptr);
2426 }
else if (
Record[i] == 7) {
2430 if (
Error Err = parseAttrKind(
Record[i++], &Kind))
2433 return error(
"Not a ConstantRange attribute");
2436 readBitWidthAndConstantRange(
Record, i);
2441 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2442 }
else if (
Record[i] == 8) {
2446 if (
Error Err = parseAttrKind(
Record[i++], &Kind))
2449 return error(
"Not a constant range list attribute");
2453 return error(
"Too few records for constant range list");
2454 unsigned RangeSize =
Record[i++];
2456 for (
unsigned Idx = 0;
Idx < RangeSize; ++
Idx) {
2466 return error(
"Invalid (unordered or overlapping) range list");
2467 B.addConstantRangeListAttr(Kind, Val);
2469 return error(
"Invalid attribute group entry");
2474 B.addMemoryAttr(ME);
2484Error BitcodeReader::parseTypeTable() {
2488 return parseTypeTableBody();
2491Error BitcodeReader::parseTypeTableBody() {
2492 if (!TypeList.empty())
2493 return error(
"Invalid multiple blocks");
2496 unsigned NumRecords = 0;
2507 switch (
Entry.Kind) {
2510 return error(
"Malformed block");
2512 if (NumRecords != TypeList.size())
2513 return error(
"Malformed block");
2522 Type *ResultTy =
nullptr;
2527 switch (MaybeRecord.
get()) {
2529 return error(
"Invalid value");
2534 return error(
"Invalid numentry record");
2535 TypeList.resize(
Record[0]);
2580 return error(
"Invalid integer record");
2585 return error(
"Bitwidth for integer type out of range");
2592 return error(
"Invalid pointer record");
2596 ResultTy = getTypeByID(
Record[0]);
2598 !PointerType::isValidElementType(ResultTy))
2599 return error(
"Invalid type");
2606 return error(
"Invalid opaque pointer record");
2615 return error(
"Invalid function record");
2617 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2624 ResultTy = getTypeByID(
Record[2]);
2625 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2626 return error(
"Invalid type");
2629 ResultTy = FunctionType::get(ResultTy, ArgTys,
Record[0]);
2635 return error(
"Invalid function record");
2637 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2639 if (!FunctionType::isValidArgumentType(
T))
2640 return error(
"Invalid function argument type");
2647 ResultTy = getTypeByID(
Record[1]);
2648 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2649 return error(
"Invalid type");
2652 ResultTy = FunctionType::get(ResultTy, ArgTys,
Record[0]);
2657 return error(
"Invalid anon struct record");
2659 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2666 return error(
"Invalid type");
2673 return error(
"Invalid struct name record");
2678 return error(
"Invalid named struct record");
2680 if (NumRecords >= TypeList.size())
2681 return error(
"Invalid TYPE table");
2684 StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]);
2687 TypeList[NumRecords] =
nullptr;
2689 Res = createIdentifiedStructType(Context, TypeName);
2693 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2700 return error(
"Invalid named struct record");
2709 return error(
"Invalid opaque type record");
2711 if (NumRecords >= TypeList.size())
2712 return error(
"Invalid TYPE table");
2715 StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]);
2718 TypeList[NumRecords] =
nullptr;
2720 Res = createIdentifiedStructType(Context, TypeName);
2727 return error(
"Invalid target extension type record");
2729 if (NumRecords >= TypeList.size())
2730 return error(
"Invalid TYPE table");
2733 return error(
"Too many type parameters");
2735 unsigned NumTys =
Record[0];
2738 for (
unsigned i = 0; i < NumTys; i++) {
2742 return error(
"Invalid type");
2745 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2746 if (
Record[i] > UINT_MAX)
2747 return error(
"Integer parameter too large");
2752 if (
auto E = TTy.takeError())
2760 return error(
"Invalid array type record");
2761 ResultTy = getTypeByID(
Record[1]);
2762 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2763 return error(
"Invalid type");
2765 ResultTy = ArrayType::get(ResultTy,
Record[0]);
2770 return error(
"Invalid vector type record");
2772 return error(
"Invalid vector length");
2773 ResultTy = getTypeByID(
Record[1]);
2774 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2775 return error(
"Invalid type");
2778 ResultTy = VectorType::get(ResultTy,
Record[0], Scalable);
2782 if (NumRecords >= TypeList.size())
2783 return error(
"Invalid TYPE table");
2784 if (TypeList[NumRecords])
2786 "Invalid TYPE table: Only named structs can be forward referenced");
2787 assert(ResultTy &&
"Didn't read a type?");
2788 TypeList[NumRecords] = ResultTy;
2789 if (!ContainedIDs.
empty())
2790 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2795Error BitcodeReader::parseOperandBundleTags() {
2799 if (!BundleTags.empty())
2800 return error(
"Invalid multiple blocks");
2810 switch (
Entry.Kind) {
2813 return error(
"Malformed block");
2827 return error(
"Invalid operand bundle record");
2830 BundleTags.emplace_back();
2832 return error(
"Invalid operand bundle record");
2837Error BitcodeReader::parseSyncScopeNames() {
2842 return error(
"Invalid multiple synchronization scope names blocks");
2851 switch (
Entry.Kind) {
2854 return error(
"Malformed block");
2857 return error(
"Invalid empty synchronization scope names block");
2871 return error(
"Invalid sync scope record");
2875 return error(
"Invalid sync scope record");
2884 unsigned NameIndex,
Triple &TT) {
2887 return error(
"Invalid record");
2888 unsigned ValueID =
Record[0];
2889 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2890 return error(
"Invalid record");
2891 Value *
V = ValueList[ValueID];
2894 if (NameStr.contains(0))
2895 return error(
"Invalid value name");
2896 V->setName(NameStr);
2897 auto *GO = dyn_cast<GlobalObject>(V);
2898 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
2911 return std::move(JumpFailed);
2917 return error(
"Expected value symbol table subblock");
2921void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
2928 uint64_t FuncBitOffset = FuncWordOffset * 32;
2929 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
2933 if (FuncBitOffset > LastFunctionBlockBit)
2934 LastFunctionBlockBit = FuncBitOffset;
2938Error BitcodeReader::parseGlobalValueSymbolTable() {
2939 unsigned FuncBitcodeOffsetDelta =
2952 switch (
Entry.Kind) {
2955 return error(
"Malformed block");
2966 switch (MaybeRecord.
get()) {
2968 unsigned ValueID =
Record[0];
2969 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2970 return error(
"Invalid value reference in symbol table");
2971 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
2972 cast<Function>(ValueList[ValueID]),
Record);
2988 if (!MaybeCurrentBit)
2990 CurrentBit = MaybeCurrentBit.
get();
2993 if (
Error Err = parseGlobalValueSymbolTable())
2995 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
3014 unsigned FuncBitcodeOffsetDelta =
3033 switch (
Entry.Kind) {
3036 return error(
"Malformed block");
3039 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
3052 switch (MaybeRecord.
get()) {
3071 if (
auto *
F = dyn_cast<Function>(V))
3072 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F,
Record);
3077 return error(
"Invalid bbentry record");
3080 return error(
"Invalid bbentry record");
3102Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3103 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3104 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3105 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3107 GlobalInitWorklist.swap(GlobalInits);
3108 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3109 FunctionOperandWorklist.swap(FunctionOperands);
3111 while (!GlobalInitWorklist.empty()) {
3112 unsigned ValID = GlobalInitWorklist.back().second;
3115 GlobalInits.push_back(GlobalInitWorklist.back());
3120 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3122 GlobalInitWorklist.pop_back();
3125 while (!IndirectSymbolInitWorklist.empty()) {
3126 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3128 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3134 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3135 if (
auto *GA = dyn_cast<GlobalAlias>(GV)) {
3137 return error(
"Alias and aliasee types don't match");
3139 }
else if (
auto *GI = dyn_cast<GlobalIFunc>(GV)) {
3142 return error(
"Expected an alias or an ifunc");
3145 IndirectSymbolInitWorklist.pop_back();
3148 while (!FunctionOperandWorklist.empty()) {
3149 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3150 if (
Info.PersonalityFn) {
3151 unsigned ValID =
Info.PersonalityFn - 1;
3156 Info.F->setPersonalityFn(MaybeC.
get());
3157 Info.PersonalityFn = 0;
3166 Info.F->setPrefixData(MaybeC.
get());
3170 if (
Info.Prologue) {
3176 Info.F->setPrologueData(MaybeC.
get());
3180 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3181 FunctionOperands.push_back(Info);
3182 FunctionOperandWorklist.pop_back();
3191 BitcodeReader::decodeSignRotatedValue);
3193 return APInt(TypeBits, Words);
3196Error BitcodeReader::parseConstants() {
3204 unsigned Int32TyID = getVirtualTypeID(CurTy);
3205 unsigned CurTyID = Int32TyID;
3206 Type *CurElemTy =
nullptr;
3207 unsigned NextCstNo = ValueList.
size();
3215 switch (Entry.Kind) {
3218 return error(
"Malformed block");
3220 if (NextCstNo != ValueList.
size())
3221 return error(
"Invalid constant reference");
3235 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3245 return error(
"Invalid settype record");
3246 if (
Record[0] >= TypeList.size() || !TypeList[
Record[0]])
3247 return error(
"Invalid settype record");
3248 if (TypeList[
Record[0]] == VoidType)
3249 return error(
"Invalid constant type");
3251 CurTy = TypeList[CurTyID];
3252 CurElemTy = getPtrElementTypeByID(CurTyID);
3256 return error(
"Invalid type for a constant null value");
3257 if (
auto *TETy = dyn_cast<TargetExtType>(CurTy))
3259 return error(
"Invalid type for a constant null value");
3264 return error(
"Invalid integer const record");
3269 return error(
"Invalid wide integer const record");
3273 V = ConstantInt::get(CurTy, VInt);
3278 return error(
"Invalid float const record");
3281 if (ScalarTy->isHalfTy())
3282 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3284 else if (ScalarTy->isBFloatTy())
3285 V = ConstantFP::get(
3287 else if (ScalarTy->isFloatTy())
3288 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3290 else if (ScalarTy->isDoubleTy())
3291 V = ConstantFP::get(
3293 else if (ScalarTy->isX86_FP80Ty()) {
3296 Rearrange[0] = (
Record[1] & 0xffffLL) | (
Record[0] << 16);
3297 Rearrange[1] =
Record[0] >> 48;
3298 V = ConstantFP::get(
3299 CurTy,
APFloat(APFloat::x87DoubleExtended(),
APInt(80, Rearrange)));
3300 }
else if (ScalarTy->isFP128Ty())
3301 V = ConstantFP::get(CurTy,
3303 else if (ScalarTy->isPPC_FP128Ty())
3304 V = ConstantFP::get(
3313 return error(
"Invalid aggregate record");
3317 for (
unsigned i = 0; i !=
Size; ++i)
3320 if (isa<StructType>(CurTy)) {
3321 V = BitcodeConstant::create(
3322 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3323 }
else if (isa<ArrayType>(CurTy)) {
3324 V = BitcodeConstant::create(Alloc, CurTy,
3325 BitcodeConstant::ConstantArrayOpcode, Elts);
3326 }
else if (isa<VectorType>(CurTy)) {
3327 V = BitcodeConstant::create(
3328 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3337 return error(
"Invalid string record");
3346 return error(
"Invalid data record");
3349 if (
auto *Array = dyn_cast<ArrayType>(CurTy))
3350 EltTy =
Array->getElementType();
3352 EltTy = cast<VectorType>(CurTy)->getElementType();
3355 if (isa<VectorType>(CurTy))
3361 if (isa<VectorType>(CurTy))
3367 if (isa<VectorType>(CurTy))
3373 if (isa<VectorType>(CurTy))
3379 if (isa<VectorType>(CurTy))
3385 if (isa<VectorType>(CurTy))
3391 if (isa<VectorType>(CurTy))
3397 if (isa<VectorType>(CurTy))
3402 return error(
"Invalid type for value");
3408 return error(
"Invalid unary op constexpr record");
3413 V = BitcodeConstant::create(Alloc, CurTy, Opc, (
unsigned)
Record[1]);
3419 return error(
"Invalid binary op constexpr record");
3425 if (
Record.size() >= 4) {
3426 if (Opc == Instruction::Add ||
3427 Opc == Instruction::Sub ||
3428 Opc == Instruction::Mul ||
3429 Opc == Instruction::Shl) {
3434 }
else if (Opc == Instruction::SDiv ||
3435 Opc == Instruction::UDiv ||
3436 Opc == Instruction::LShr ||
3437 Opc == Instruction::AShr) {
3442 V = BitcodeConstant::create(Alloc, CurTy, {(
uint8_t)Opc, Flags},
3449 return error(
"Invalid cast constexpr record");
3454 unsigned OpTyID =
Record[1];
3455 Type *OpTy = getTypeByID(OpTyID);
3457 return error(
"Invalid cast constexpr record");
3458 V = BitcodeConstant::create(Alloc, CurTy, Opc, (
unsigned)
Record[2]);
3470 return error(
"Constant GEP record must have at least two elements");
3472 Type *PointeeType =
nullptr;
3476 PointeeType = getTypeByID(
Record[OpNum++]);
3479 std::optional<ConstantRange>
InRange;
3483 unsigned InRangeIndex =
Op >> 1;
3490 readBitWidthAndConstantRange(
Record, OpNum);
3500 unsigned BaseTypeID =
Record[OpNum];
3501 while (OpNum !=
Record.size()) {
3502 unsigned ElTyID =
Record[OpNum++];
3503 Type *ElTy = getTypeByID(ElTyID);
3505 return error(
"Invalid getelementptr constexpr record");
3509 if (Elts.
size() < 1)
3510 return error(
"Invalid gep with no operands");
3514 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3515 BaseType = getTypeByID(BaseTypeID);
3520 return error(
"GEP base operand must be pointer or vector of pointer");
3523 PointeeType = getPtrElementTypeByID(BaseTypeID);
3525 return error(
"Missing element type for old-style constant GEP");
3528 V = BitcodeConstant::create(
3530 {Instruction::GetElementPtr,
uint8_t(Flags), PointeeType,
InRange},
3536 return error(
"Invalid select constexpr record");
3538 V = BitcodeConstant::create(
3539 Alloc, CurTy, Instruction::Select,
3546 return error(
"Invalid extractelement constexpr record");
3547 unsigned OpTyID =
Record[0];
3549 dyn_cast_or_null<VectorType>(getTypeByID(OpTyID));
3551 return error(
"Invalid extractelement constexpr record");
3553 if (
Record.size() == 4) {
3554 unsigned IdxTyID =
Record[2];
3555 Type *IdxTy = getTypeByID(IdxTyID);
3557 return error(
"Invalid extractelement constexpr record");
3563 V = BitcodeConstant::create(Alloc, CurTy, Instruction::ExtractElement,
3569 VectorType *OpTy = dyn_cast<VectorType>(CurTy);
3570 if (
Record.size() < 3 || !OpTy)
3571 return error(
"Invalid insertelement constexpr record");
3573 if (
Record.size() == 4) {
3574 unsigned IdxTyID =
Record[2];
3575 Type *IdxTy = getTypeByID(IdxTyID);
3577 return error(
"Invalid insertelement constexpr record");
3583 V = BitcodeConstant::create(
3584 Alloc, CurTy, Instruction::InsertElement,
3589 VectorType *OpTy = dyn_cast<VectorType>(CurTy);
3590 if (
Record.size() < 3 || !OpTy)
3591 return error(
"Invalid shufflevector constexpr record");
3592 V = BitcodeConstant::create(
3593 Alloc, CurTy, Instruction::ShuffleVector,
3598 VectorType *RTy = dyn_cast<VectorType>(CurTy);
3600 dyn_cast_or_null<VectorType>(getTypeByID(
Record[0]));
3601 if (
Record.size() < 4 || !RTy || !OpTy)
3602 return error(
"Invalid shufflevector constexpr record");
3603 V = BitcodeConstant::create(
3604 Alloc, CurTy, Instruction::ShuffleVector,
3610 return error(
"Invalid cmp constexpt record");
3611 unsigned OpTyID =
Record[0];
3612 Type *OpTy = getTypeByID(OpTyID);
3614 return error(
"Invalid cmp constexpr record");
3615 V = BitcodeConstant::create(
3618 : Instruction::ICmp),
3627 return error(
"Invalid inlineasm record");
3628 std::string AsmStr, ConstrStr;
3629 bool HasSideEffects =
Record[0] & 1;
3630 bool IsAlignStack =
Record[0] >> 1;
3631 unsigned AsmStrSize =
Record[1];
3632 if (2+AsmStrSize >=
Record.size())
3633 return error(
"Invalid inlineasm record");
3634 unsigned ConstStrSize =
Record[2+AsmStrSize];
3635 if (3+AsmStrSize+ConstStrSize >
Record.size())
3636 return error(
"Invalid inlineasm record");
3638 for (
unsigned i = 0; i != AsmStrSize; ++i)
3639 AsmStr += (
char)
Record[2+i];
3640 for (
unsigned i = 0; i != ConstStrSize; ++i)
3641 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3644 return error(
"Missing element type for old-style inlineasm");
3646 HasSideEffects, IsAlignStack);
3653 return error(
"Invalid inlineasm record");
3654 std::string AsmStr, ConstrStr;
3655 bool HasSideEffects =
Record[0] & 1;
3656 bool IsAlignStack = (
Record[0] >> 1) & 1;
3657 unsigned AsmDialect =
Record[0] >> 2;
3658 unsigned AsmStrSize =
Record[1];
3659 if (2+AsmStrSize >=
Record.size())
3660 return error(
"Invalid inlineasm record");
3661 unsigned ConstStrSize =
Record[2+AsmStrSize];
3662 if (3+AsmStrSize+ConstStrSize >
Record.size())
3663 return error(
"Invalid inlineasm record");
3665 for (
unsigned i = 0; i != AsmStrSize; ++i)
3666 AsmStr += (
char)
Record[2+i];
3667 for (
unsigned i = 0; i != ConstStrSize; ++i)
3668 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3671 return error(
"Missing element type for old-style inlineasm");
3673 HasSideEffects, IsAlignStack,
3680 return error(
"Invalid inlineasm record");
3682 std::string AsmStr, ConstrStr;
3683 bool HasSideEffects =
Record[OpNum] & 1;
3684 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3685 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3686 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3688 unsigned AsmStrSize =
Record[OpNum];
3690 if (OpNum + AsmStrSize >=
Record.size())
3691 return error(
"Invalid inlineasm record");
3692 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3693 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3694 return error(
"Invalid inlineasm record");
3696 for (
unsigned i = 0; i != AsmStrSize; ++i)
3697 AsmStr += (
char)
Record[OpNum + i];
3699 for (
unsigned i = 0; i != ConstStrSize; ++i)
3700 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3703 return error(
"Missing element type for old-style inlineasm");
3705 HasSideEffects, IsAlignStack,
3712 return error(
"Invalid inlineasm record");
3714 auto *FnTy = dyn_cast_or_null<FunctionType>(getTypeByID(
Record[OpNum]));
3717 return error(
"Invalid inlineasm record");
3718 std::string AsmStr, ConstrStr;
3719 bool HasSideEffects =
Record[OpNum] & 1;
3720 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3721 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3722 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3724 unsigned AsmStrSize =
Record[OpNum];
3726 if (OpNum + AsmStrSize >=
Record.size())
3727 return error(
"Invalid inlineasm record");
3728 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3729 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3730 return error(
"Invalid inlineasm record");
3732 for (
unsigned i = 0; i != AsmStrSize; ++i)
3733 AsmStr += (
char)
Record[OpNum + i];
3735 for (
unsigned i = 0; i != ConstStrSize; ++i)
3736 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3738 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3744 return error(
"Invalid blockaddress record");
3745 unsigned FnTyID =
Record[0];
3746 Type *FnTy = getTypeByID(FnTyID);
3748 return error(
"Invalid blockaddress record");
3749 V = BitcodeConstant::create(
3757 return error(
"Invalid dso_local record");
3758 unsigned GVTyID =
Record[0];
3759 Type *GVTy = getTypeByID(GVTyID);
3761 return error(
"Invalid dso_local record");
3762 V = BitcodeConstant::create(
3763 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode,
Record[1]);
3768 return error(
"Invalid no_cfi record");
3769 unsigned GVTyID =
Record[0];
3770 Type *GVTy = getTypeByID(GVTyID);
3772 return error(
"Invalid no_cfi record");
3773 V = BitcodeConstant::create(Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3779 return error(
"Invalid ptrauth record");
3781 V = BitcodeConstant::create(Alloc, CurTy,
3782 BitcodeConstant::ConstantPtrAuthOpcode,
3789 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3796Error BitcodeReader::parseUseLists() {
3809 switch (
Entry.Kind) {
3812 return error(
"Malformed block");
3826 switch (MaybeRecord.
get()) {
3834 if (RecordLength < 3)
3836 return error(
"Invalid record");
3837 unsigned ID =
Record.pop_back_val();
3841 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3842 V = FunctionBBs[
ID];
3845 unsigned NumUses = 0;
3847 for (
const Use &U :
V->materialized_uses()) {
3848 if (++NumUses >
Record.size())
3850 Order[&
U] =
Record[NumUses - 1];
3857 V->sortUseList([&](
const Use &L,
const Use &R) {
3868Error BitcodeReader::rememberAndSkipMetadata() {
3870 uint64_t CurBit = Stream.GetCurrentBitNo();
3871 DeferredMetadataInfo.push_back(CurBit);
3874 if (
Error Err = Stream.SkipBlock())
3879Error BitcodeReader::materializeMetadata() {
3880 for (
uint64_t BitPos : DeferredMetadataInfo) {
3882 if (
Error JumpFailed = Stream.JumpToBit(BitPos))
3884 if (
Error Err = MDLoader->parseModuleMetadata())
3895 for (
const MDOperand &MDOptions : cast<MDNode>(Val)->operands())
3896 LinkerOpts->
addOperand(cast<MDNode>(MDOptions));
3900 DeferredMetadataInfo.clear();
3904void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
3908Error BitcodeReader::rememberAndSkipFunctionBody() {
3910 if (FunctionsWithBodies.empty())
3911 return error(
"Insufficient function protos");
3914 FunctionsWithBodies.pop_back();
3917 uint64_t CurBit = Stream.GetCurrentBitNo();
3919 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
3920 "Mismatch between VST and scanned function offsets");
3921 DeferredFunctionInfo[Fn] = CurBit;
3924 if (
Error Err = Stream.SkipBlock())
3929Error BitcodeReader::globalCleanup() {
3931 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
3933 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
3934 return error(
"Malformed global initializer set");
3939 MDLoader->upgradeDebugIntrinsics(
F);
3946 UpgradedIntrinsics[&
F] = NewFn;
3952 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
3955 UpgradedVariables.emplace_back(&GV, Upgraded);
3956 for (
auto &Pair : UpgradedVariables) {
3957 Pair.first->eraseFromParent();
3958 TheModule->insertGlobalVariable(Pair.second);
3963 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
3964 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
3972Error BitcodeReader::rememberAndSkipFunctionBodies() {
3973 if (
Error JumpFailed = Stream.JumpToBit(NextUnreadBit))
3976 if (Stream.AtEndOfStream())
3977 return error(
"Could not find function in stream");
3979 if (!SeenFirstFunctionBody)
3980 return error(
"Trying to materialize functions before seeing function blocks");
3984 assert(SeenValueSymbolTable);
3994 switch (
Entry.Kind) {
3996 return error(
"Expect SubBlock");
4000 return error(
"Expect function block");
4002 if (
Error Err = rememberAndSkipFunctionBody())
4004 NextUnreadBit = Stream.GetCurrentBitNo();
4011Error BitcodeReaderBase::readBlockInfo() {
4013 Stream.ReadBlockInfoBlock();
4014 if (!MaybeNewBlockInfo)
4016 std::optional<BitstreamBlockInfo> NewBlockInfo =
4017 std::move(MaybeNewBlockInfo.
get());
4019 return error(
"Malformed block");
4020 BlockInfo = std::move(*NewBlockInfo);
4031 return error(
"Invalid record");
4033 std::string OldFormatName;
4036 return error(
"Invalid record");
4037 unsigned ComdatNameSize =
Record[1];
4038 if (ComdatNameSize >
Record.size() - 2)
4039 return error(
"Comdat name size too large");
4040 OldFormatName.reserve(ComdatNameSize);
4041 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4042 OldFormatName += (
char)
Record[2 + i];
4043 Name = OldFormatName;
4046 C->setSelectionKind(SK);
4047 ComdatList.push_back(
C);
4061 Meta.NoAddress =
true;
4063 Meta.NoHWAddress =
true;
4067 Meta.IsDynInit =
true;
4082 return error(
"Invalid record");
4083 unsigned TyID =
Record[0];
4084 Type *Ty = getTypeByID(TyID);
4086 return error(
"Invalid record");
4088 bool explicitType =
Record[1] & 2;
4094 return error(
"Invalid type for value");
4095 AddressSpace = cast<PointerType>(Ty)->getAddressSpace();
4096 TyID = getContainedTypeID(TyID);
4097 Ty = getTypeByID(TyID);
4099 return error(
"Missing element type for old-style global");
4105 if (
Error Err = parseAlignmentValue(
Record[4], Alignment))
4109 if (
Record[5] - 1 >= SectionTable.size())
4110 return error(
"Invalid ID");
4127 bool ExternallyInitialized =
false;
4129 ExternallyInitialized =
Record[9];
4141 if (
Record.size() > 10) {
4153 if (
unsigned InitID =
Record[2])
4154 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4156 if (
Record.size() > 11) {
4157 if (
unsigned ComdatID =
Record[11]) {
4158 if (ComdatID > ComdatList.size())
4159 return error(
"Invalid global variable comdat ID");
4160 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4163 ImplicitComdatObjects.
insert(NewGV);
4166 if (
Record.size() > 12) {
4171 if (
Record.size() > 13) {
4190 return error(
"Invalid global variable code model");
4196void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4197 if (ValueTypeCallback) {
4198 (*ValueTypeCallback)(
4199 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4200 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4213 return error(
"Invalid record");
4214 unsigned FTyID =
Record[0];
4215 Type *FTy = getTypeByID(FTyID);
4217 return error(
"Invalid record");
4218 if (isa<PointerType>(FTy)) {
4219 FTyID = getContainedTypeID(FTyID, 0);
4220 FTy = getTypeByID(FTyID);
4222 return error(
"Missing element type for old-style function");
4225 if (!isa<FunctionType>(FTy))
4226 return error(
"Invalid type for value");
4229 return error(
"Invalid calling convention ID");
4231 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4237 AddrSpace,
Name, TheModule);
4240 "Incorrect fully specified type provided for function");
4241 FunctionTypeIDs[
Func] = FTyID;
4243 Func->setCallingConv(
CC);
4244 bool isProto =
Record[2];
4248 callValueTypeCallback(Func, FTyID);
4253 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4255 Attribute::InAlloca}) {
4256 if (!
Func->hasParamAttribute(i, Kind))
4259 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4262 Func->removeParamAttr(i, Kind);
4264 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4265 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4267 return error(
"Missing param element type for attribute upgrade");
4271 case Attribute::ByVal:
4274 case Attribute::StructRet:
4277 case Attribute::InAlloca:
4284 Func->addParamAttr(i, NewAttr);
4289 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4290 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4291 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4293 return error(
"Missing param element type for x86_intrcc upgrade");
4295 Func->addParamAttr(0, NewAttr);
4299 if (
Error Err = parseAlignmentValue(
Record[5], Alignment))
4302 Func->setAlignment(*Alignment);
4304 if (
Record[6] - 1 >= SectionTable.size())
4305 return error(
"Invalid ID");
4306 Func->setSection(SectionTable[
Record[6] - 1]);
4310 if (!
Func->hasLocalLinkage())
4313 if (
Record[8] - 1 >= GCTable.size())
4314 return error(
"Invalid ID");
4320 Func->setUnnamedAddr(UnnamedAddr);
4326 if (
Record.size() > 11) {
4328 if (!
Func->hasLocalLinkage()) {
4335 if (
Record.size() > 12) {
4336 if (
unsigned ComdatID =
Record[12]) {
4337 if (ComdatID > ComdatList.size())
4338 return error(
"Invalid function comdat ID");
4339 Func->setComdat(ComdatList[ComdatID - 1]);
4342 ImplicitComdatObjects.
insert(Func);
4351 if (
Record.size() > 15) {
4360 if (
Record.size() > 18 && Strtab.data() &&
4365 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4373 Func->setIsMaterializable(
true);
4374 FunctionsWithBodies.push_back(Func);
4375 DeferredFunctionInfo[
Func] = 0;
4380Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4394 if (
Record.size() < (3 + (
unsigned)NewRecord))
4395 return error(
"Invalid record");
4400 return error(
"Invalid record");
4404 auto *PTy = dyn_cast<PointerType>(Ty);
4406 return error(
"Invalid type for value");
4407 AddrSpace = PTy->getAddressSpace();
4409 Ty = getTypeByID(
TypeID);
4411 return error(
"Missing element type for old-style indirect symbol");
4413 AddrSpace =
Record[OpNum++];
4416 auto Val =
Record[OpNum++];
4425 nullptr, TheModule);
4429 if (OpNum !=
Record.size()) {
4430 auto VisInd = OpNum++;
4436 if (OpNum !=
Record.size()) {
4437 auto S =
Record[OpNum++];
4444 if (OpNum !=
Record.size())
4446 if (OpNum !=
Record.size())
4449 if (OpNum !=
Record.size())
4454 if (OpNum + 1 <
Record.size()) {
4457 return error(
"Malformed partition, too large.");
4463 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4468 bool ShouldLazyLoadMetadata,
4474 TheModule->IsNewDbgInfoFormat =
4479 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4481 if (
Error JumpFailed = Stream.JumpToBit(ResumeBit))
4490 bool ResolvedDataLayout =
false;
4495 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4497 auto ResolveDataLayout = [&]() ->
Error {
4498 if (ResolvedDataLayout)
4502 ResolvedDataLayout =
true;
4506 TentativeDataLayoutStr, TheModule->getTargetTriple());
4510 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4511 TheModule->getTargetTriple(), TentativeDataLayoutStr))
4512 TentativeDataLayoutStr = *LayoutOverride;
4520 TheModule->setDataLayout(MaybeDL.
get());
4531 switch (
Entry.Kind) {
4533 return error(
"Malformed block");
4535 if (
Error Err = ResolveDataLayout())
4537 return globalCleanup();
4542 if (
Error Err = Stream.SkipBlock())
4546 if (
Error Err = readBlockInfo())
4550 if (
Error Err = parseAttributeBlock())
4554 if (
Error Err = parseAttributeGroupBlock())
4558 if (
Error Err = parseTypeTable())
4562 if (!SeenValueSymbolTable) {
4568 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4569 if (
Error Err = parseValueSymbolTable())
4571 SeenValueSymbolTable =
true;
4576 if (
Error Err = Stream.SkipBlock())
4581 if (
Error Err = parseConstants())
4583 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4587 if (ShouldLazyLoadMetadata) {
4588 if (
Error Err = rememberAndSkipMetadata())
4592 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4593 if (
Error Err = MDLoader->parseModuleMetadata())
4597 if (
Error Err = MDLoader->parseMetadataKinds())
4601 if (
Error Err = ResolveDataLayout())
4606 if (!SeenFirstFunctionBody) {
4607 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4608 if (
Error Err = globalCleanup())
4610 SeenFirstFunctionBody =
true;
4613 if (VSTOffset > 0) {
4617 if (!SeenValueSymbolTable) {
4618 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4620 SeenValueSymbolTable =
true;
4632 if (
Error Err = Stream.SkipBlock())
4642 if (
Error Err = rememberAndSkipFunctionBody())
4649 if (SeenValueSymbolTable) {
4650 NextUnreadBit = Stream.GetCurrentBitNo();
4653 return globalCleanup();
4657 if (
Error Err = parseUseLists())
4661 if (
Error Err = parseOperandBundleTags())
4665 if (
Error Err = parseSyncScopeNames())
4680 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4686 UseRelativeIDs = *VersionOrErr >= 1;
4690 if (ResolvedDataLayout)
4691 return error(
"target triple too late in module");
4694 return error(
"Invalid record");
4695 TheModule->setTargetTriple(S);
4699 if (ResolvedDataLayout)
4700 return error(
"datalayout too late in module");
4702 return error(
"Invalid record");
4708 return error(
"Invalid record");
4709 TheModule->setModuleInlineAsm(S);
4716 return error(
"Invalid record");
4723 return error(
"Invalid record");
4724 SectionTable.push_back(S);
4730 return error(
"Invalid record");
4731 GCTable.push_back(S);
4748 if (
Error Err = ResolveDataLayout())
4756 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode,
Record))
4762 return error(
"Invalid record");
4766 VSTOffset =
Record[0] - 1;
4772 return error(
"Invalid record");
4773 TheModule->setSourceFileName(
ValueName);
4778 this->ValueTypeCallback = std::nullopt;
4782Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4787 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4789 return getContainedTypeID(
I, J);
4792 MDLoader =
MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4793 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4796Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4797 if (!isa<PointerType>(PtrType))
4798 return error(
"Load/Store operand is not a pointer type");
4799 if (!PointerType::isLoadableOrStorableType(ValType))
4800 return error(
"Cannot load/store from pointer");
4807 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4809 Attribute::InAlloca}) {
4810 if (!
Attrs.hasParamAttr(i, Kind) ||
4811 Attrs.getParamAttr(i, Kind).getValueAsType())
4814 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4816 return error(
"Missing element type for typed attribute upgrade");
4820 case Attribute::ByVal:
4823 case Attribute::StructRet:
4826 case Attribute::InAlloca:
4833 Attrs =
Attrs.addParamAttribute(Context, i, NewAttr);
4844 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
4845 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4847 return error(
"Missing element type for inline asm upgrade");
4858 case Intrinsic::preserve_array_access_index:
4859 case Intrinsic::preserve_struct_access_index:
4860 case Intrinsic::aarch64_ldaxr:
4861 case Intrinsic::aarch64_ldxr:
4862 case Intrinsic::aarch64_stlxr:
4863 case Intrinsic::aarch64_stxr:
4864 case Intrinsic::arm_ldaex:
4865 case Intrinsic::arm_ldrex:
4866 case Intrinsic::arm_stlex:
4867 case Intrinsic::arm_strex: {
4870 case Intrinsic::aarch64_stlxr:
4871 case Intrinsic::aarch64_stxr:
4872 case Intrinsic::arm_stlex:
4873 case Intrinsic::arm_strex:
4880 if (!
Attrs.getParamElementType(ArgNo)) {
4881 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4883 return error(
"Missing element type for elementtype upgrade");
4885 Attrs =
Attrs.addParamAttribute(Context, ArgNo, NewAttr);
4903 if (MDLoader->hasFwdRefs())
4904 return error(
"Invalid function metadata: incoming forward references");
4906 InstructionList.
clear();
4907 unsigned ModuleValueListSize = ValueList.
size();
4908 unsigned ModuleMDLoaderSize = MDLoader->size();
4912 unsigned FTyID = FunctionTypeIDs[
F];
4914 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
4915 assert(
I.getType() == getTypeByID(ArgTyID) &&
4916 "Incorrect fully specified type for Function Argument");
4920 unsigned NextValueNo = ValueList.
size();
4922 unsigned CurBBNo = 0;
4931 auto getLastInstruction = [&]() ->
Instruction * {
4932 if (CurBB && !CurBB->
empty())
4933 return &CurBB->
back();
4934 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
4935 !FunctionBBs[CurBBNo - 1]->empty())
4936 return &FunctionBBs[CurBBNo - 1]->back();
4940 std::vector<OperandBundleDef> OperandBundles;
4951 switch (
Entry.Kind) {
4953 return error(
"Malformed block");
4955 goto OutOfRecordLoop;
4960 if (
Error Err = Stream.SkipBlock())
4964 if (
Error Err = parseConstants())
4966 NextValueNo = ValueList.
size();
4969 if (
Error Err = parseValueSymbolTable())
4973 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
4977 assert(DeferredMetadataInfo.empty() &&
4978 "Must read all module-level metadata before function-level");
4979 if (
Error Err = MDLoader->parseFunctionMetadata())
4983 if (
Error Err = parseUseLists())
4997 unsigned ResTypeID = InvalidTypeID;
5001 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5003 return error(
"Invalid value");
5006 return error(
"Invalid record");
5008 FunctionBBs.resize(
Record[0]);
5011 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5012 if (BBFRI == BasicBlockFwdRefs.
end()) {
5016 auto &BBRefs = BBFRI->second;
5018 if (BBRefs.size() > FunctionBBs.size())
5019 return error(
"Invalid ID");
5020 assert(!BBRefs.empty() &&
"Unexpected empty array");
5021 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5022 for (
unsigned I = 0, E = FunctionBBs.size(), RE = BBRefs.size();
I != E;
5024 if (
I < RE && BBRefs[
I]) {
5025 BBRefs[
I]->insertInto(
F);
5026 FunctionBBs[
I] = BBRefs[
I];
5032 BasicBlockFwdRefs.
erase(BBFRI);
5035 CurBB = FunctionBBs[0];
5042 return error(
"Invalid record");
5057 if (
auto *
F = dyn_cast<Function>(ValueList[
ValID]))
5058 BackwardRefFunctions.push_back(
F);
5060 return error(
"Invalid record");
5067 I = getLastInstruction();
5070 return error(
"Invalid record");
5071 I->setDebugLoc(LastLoc);
5076 I = getLastInstruction();
5078 return error(
"Invalid record");
5086 Scope = dyn_cast_or_null<MDNode>(
5087 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5089 return error(
"Invalid record");
5092 IA = dyn_cast_or_null<MDNode>(
5093 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5095 return error(
"Invalid record");
5097 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5099 I->setDebugLoc(LastLoc);
5107 if (getValueTypePair(
Record, OpNum, NextValueNo, LHS,
TypeID, CurBB) ||
5109 return error(
"Invalid record");
5113 return error(
"Invalid record");
5117 if (OpNum <
Record.size()) {
5118 if (isa<FPMathOperator>(
I)) {
5121 I->setFastMathFlags(FMF);
5130 if (getValueTypePair(
Record, OpNum, NextValueNo, LHS,
TypeID, CurBB) ||
5134 return error(
"Invalid record");
5138 return error(
"Invalid record");
5142 if (OpNum <
Record.size()) {
5143 if (Opc == Instruction::Add ||
5144 Opc == Instruction::Sub ||
5145 Opc == Instruction::Mul ||
5146 Opc == Instruction::Shl) {
5148 cast<BinaryOperator>(
I)->setHasNoSignedWrap(
true);
5150 cast<BinaryOperator>(
I)->setHasNoUnsignedWrap(
true);
5151 }
else if (Opc == Instruction::SDiv ||
5152 Opc == Instruction::UDiv ||
5153 Opc == Instruction::LShr ||
5154 Opc == Instruction::AShr) {
5156 cast<BinaryOperator>(
I)->setIsExact(
true);
5157 }
else if (Opc == Instruction::Or) {
5159 cast<PossiblyDisjointInst>(
I)->setIsDisjoint(
true);
5160 }
else if (isa<FPMathOperator>(
I)) {
5163 I->setFastMathFlags(FMF);
5172 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5173 OpNum + 1 >
Record.size())
5174 return error(
"Invalid record");
5176 ResTypeID =
Record[OpNum++];
5177 Type *ResTy = getTypeByID(ResTypeID);
5180 if (Opc == -1 || !ResTy)
5181 return error(
"Invalid record");
5186 assert(CurBB &&
"No current BB?");
5192 return error(
"Invalid cast");
5196 if (OpNum <
Record.size()) {
5197 if (Opc == Instruction::ZExt || Opc == Instruction::UIToFP) {
5199 cast<PossiblyNonNegInst>(
I)->setNonNeg(
true);
5200 }
else if (Opc == Instruction::Trunc) {
5202 cast<TruncInst>(
I)->setHasNoUnsignedWrap(
true);
5204 cast<TruncInst>(
I)->setHasNoSignedWrap(
true);
5206 if (isa<FPMathOperator>(
I)) {
5209 I->setFastMathFlags(FMF);
5228 Ty = getTypeByID(TyID);
5232 TyID = InvalidTypeID;
5237 unsigned BasePtrTypeID;
5238 if (getValueTypePair(
Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5240 return error(
"Invalid record");
5243 TyID = getContainedTypeID(BasePtrTypeID);
5244 if (
BasePtr->getType()->isVectorTy())
5245 TyID = getContainedTypeID(TyID);
5246 Ty = getTypeByID(TyID);
5250 while (OpNum !=
Record.size()) {
5253 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5254 return error(
"Invalid record");
5262 if (cast<GEPOperator>(
I)->getNumIndices() != 0) {
5265 unsigned SubType = 0;
5266 if (GTI.isStruct()) {
5268 Idx->getType()->isVectorTy()
5273 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5280 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5281 if (
I->getType()->isVectorTy())
5282 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5285 GEP->setNoWrapFlags(NW);
5294 if (getValueTypePair(
Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5295 return error(
"Invalid record");
5298 unsigned RecSize =
Record.size();
5299 if (OpNum == RecSize)
5300 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5303 ResTypeID = AggTypeID;
5304 for (; OpNum != RecSize; ++OpNum) {
5309 if (!IsStruct && !IsArray)
5310 return error(
"EXTRACTVAL: Invalid type");
5311 if ((
unsigned)Index != Index)
5312 return error(
"Invalid value");
5314 return error(
"EXTRACTVAL: Invalid struct index");
5316 return error(
"EXTRACTVAL: Invalid array index");
5317 EXTRACTVALIdx.
push_back((
unsigned)Index);
5321 ResTypeID = getContainedTypeID(ResTypeID, Index);
5324 ResTypeID = getContainedTypeID(ResTypeID);
5338 if (getValueTypePair(
Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5339 return error(
"Invalid record");
5342 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5343 return error(
"Invalid record");
5345 unsigned RecSize =
Record.size();
5346 if (OpNum == RecSize)
5347 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5351 for (; OpNum != RecSize; ++OpNum) {
5356 if (!IsStruct && !IsArray)
5357 return error(
"INSERTVAL: Invalid type");
5358 if ((
unsigned)Index != Index)
5359 return error(
"Invalid value");
5361 return error(
"INSERTVAL: Invalid struct index");
5363 return error(
"INSERTVAL: Invalid array index");
5365 INSERTVALIdx.
push_back((
unsigned)Index);
5373 return error(
"Inserted value type doesn't match aggregate type");
5376 ResTypeID = AggTypeID;
5388 if (getValueTypePair(
Record, OpNum, NextValueNo, TrueVal,
TypeID,
5392 popValue(
Record, OpNum, NextValueNo, CondType,
5393 getVirtualTypeID(CondType),
Cond, CurBB))
5394 return error(
"Invalid record");
5407 unsigned ValTypeID, CondTypeID;
5408 if (getValueTypePair(
Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5410 popValue(
Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5412 getValueTypePair(
Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5413 return error(
"Invalid record");
5417 dyn_cast<VectorType>(
Cond->getType())) {
5420 return error(
"Invalid type for value");
5424 return error(
"Invalid type for value");
5428 ResTypeID = ValTypeID;
5430 if (OpNum <
Record.size() && isa<FPMathOperator>(
I)) {
5433 I->setFastMathFlags(FMF);
5441 unsigned VecTypeID, IdxTypeID;
5442 if (getValueTypePair(
Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5443 getValueTypePair(
Record, OpNum, NextValueNo,
Idx, IdxTypeID, CurBB))
5444 return error(
"Invalid record");
5446 return error(
"Invalid type for value");
5448 ResTypeID = getContainedTypeID(VecTypeID);
5456 unsigned VecTypeID, IdxTypeID;
5457 if (getValueTypePair(
Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5458 return error(
"Invalid record");
5460 return error(
"Invalid type for value");
5461 if (popValue(
Record, OpNum, NextValueNo,
5462 cast<VectorType>(Vec->
getType())->getElementType(),
5463 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5464 getValueTypePair(
Record, OpNum, NextValueNo,
Idx, IdxTypeID, CurBB))
5465 return error(
"Invalid record");
5467 ResTypeID = VecTypeID;
5475 unsigned Vec1TypeID;
5476 if (getValueTypePair(
Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5478 popValue(
Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5480 return error(
"Invalid record");
5482 unsigned MaskTypeID;
5483 if (getValueTypePair(
Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5484 return error(
"Invalid record");
5486 return error(
"Invalid type for value");
5490 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5505 if (getValueTypePair(
Record, OpNum, NextValueNo, LHS, LHSTypeID, CurBB) ||
5508 return error(
"Invalid record");
5510 if (OpNum >=
Record.size())
5512 "Invalid record: operand number exceeded available operands");
5517 if (IsFP &&
Record.size() > OpNum+1)
5522 return error(
"Invalid fcmp predicate");
5526 return error(
"Invalid icmp predicate");
5528 if (
Record.size() > OpNum + 1 &&
5530 cast<ICmpInst>(
I)->setSameSign();
5533 if (OpNum + 1 !=
Record.size())
5534 return error(
"Invalid record");
5536 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5538 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5541 I->setFastMathFlags(FMF);
5558 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5559 return error(
"Invalid record");
5560 if (OpNum !=
Record.size())
5561 return error(
"Invalid record");
5569 return error(
"Invalid record");
5572 return error(
"Invalid record");
5574 if (
Record.size() == 1) {
5582 getVirtualTypeID(CondType), CurBB);
5583 if (!FalseDest || !
Cond)
5584 return error(
"Invalid record");
5592 return error(
"Invalid record");
5595 Value *CleanupPad = getValue(
Record,
Idx++, NextValueNo, TokenTy,
5596 getVirtualTypeID(TokenTy), CurBB);
5598 return error(
"Invalid record");
5600 if (
Record.size() == 2) {
5601 UnwindDest = getBasicBlock(
Record[
Idx++]);
5603 return error(
"Invalid record");
5612 return error(
"Invalid record");
5616 getVirtualTypeID(TokenTy), CurBB);
5618 return error(
"Invalid record");
5621 return error(
"Invalid record");
5630 return error(
"Invalid record");
5636 getVirtualTypeID(TokenTy), CurBB);
5638 return error(
"Invalid record");
5643 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5646 return error(
"Invalid record");
5652 UnwindDest = getBasicBlock(
Record[
Idx++]);
5654 return error(
"Invalid record");
5658 return error(
"Invalid record");
5663 CatchSwitch->addHandler(Handler);
5665 ResTypeID = getVirtualTypeID(
I->getType());
5673 return error(
"Invalid record");
5679 getVirtualTypeID(TokenTy), CurBB);
5681 return error(
"Invald record");
5683 unsigned NumArgOperands =
Record[
Idx++];
5686 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5689 if (getValueTypePair(
Record,
Idx, NextValueNo, Val, ValTypeID,
nullptr))
5690 return error(
"Invalid record");
5691 Args.push_back(Val);
5695 return error(
"Invalid record");
5701 ResTypeID = getVirtualTypeID(
I->getType());
5707 if ((
Record[0] >> 16) == SWITCH_INST_MAGIC) {
5713 unsigned OpTyID =
Record[1];
5714 Type *OpTy = getTypeByID(OpTyID);
5715 unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth();
5720 return error(
"Invalid record");
5722 unsigned NumCases =
Record[4];
5727 unsigned CurIdx = 5;
5728 for (
unsigned i = 0; i != NumCases; ++i) {
5730 unsigned NumItems =
Record[CurIdx++];
5731 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5732 bool isSingleNumber =
Record[CurIdx++];
5735 unsigned ActiveWords = 1;
5736 if (ValueBitWidth > 64)
5737 ActiveWords =
Record[CurIdx++];
5740 CurIdx += ActiveWords;
5742 if (!isSingleNumber) {
5744 if (ValueBitWidth > 64)
5745 ActiveWords =
Record[CurIdx++];
5748 CurIdx += ActiveWords;
5761 SI->addCase(Cst, DestBB);
5770 return error(
"Invalid record");
5771 unsigned OpTyID =
Record[0];
5772 Type *OpTy = getTypeByID(OpTyID);
5776 return error(
"Invalid record");
5777 unsigned NumCases = (
Record.size()-3)/2;
5780 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5781 ConstantInt *CaseVal = dyn_cast_or_null<ConstantInt>(
5782 getFnValueByID(
Record[3+i*2], OpTy, OpTyID,
nullptr));
5784 if (!CaseVal || !DestBB) {
5786 return error(
"Invalid record");
5788 SI->addCase(CaseVal, DestBB);
5795 return error(
"Invalid record");
5796 unsigned OpTyID =
Record[0];
5797 Type *OpTy = getTypeByID(OpTyID);
5799 if (!OpTy || !Address)
5800 return error(
"Invalid record");
5801 unsigned NumDests =
Record.size()-2;
5804 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5809 return error(
"Invalid record");
5819 return error(
"Invalid record");
5822 unsigned CCInfo =
Record[OpNum++];
5826 unsigned FTyID = InvalidTypeID;
5828 if ((CCInfo >> 13) & 1) {
5830 FTy = dyn_cast<FunctionType>(getTypeByID(FTyID));
5832 return error(
"Explicit invoke type is not a function type");
5836 unsigned CalleeTypeID;
5837 if (getValueTypePair(
Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5839 return error(
"Invalid record");
5843 return error(
"Callee is not a pointer");
5845 FTyID = getContainedTypeID(CalleeTypeID);
5846 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
5848 return error(
"Callee is not of pointer to function type");
5850 if (
Record.size() < FTy->getNumParams() + OpNum)
5851 return error(
"Insufficient operands to call");
5855 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5856 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5857 Ops.
push_back(getValue(
Record, OpNum, NextValueNo, FTy->getParamType(i),
5861 return error(
"Invalid record");
5864 if (!FTy->isVarArg()) {
5865 if (
Record.size() != OpNum)
5866 return error(
"Invalid record");
5869 while (OpNum !=
Record.size()) {
5872 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5873 return error(
"Invalid record");
5880 if (!OperandBundles.empty())
5885 ResTypeID = getContainedTypeID(FTyID);
5886 OperandBundles.clear();
5888 cast<InvokeInst>(
I)->setCallingConv(
5890 cast<InvokeInst>(
I)->setAttributes(PAL);
5891 if (
Error Err = propagateAttributeTypes(cast<CallBase>(
I), ArgTyIDs)) {
5900 Value *Val =
nullptr;
5902 if (getValueTypePair(
Record,
Idx, NextValueNo, Val, ValTypeID, CurBB))
5903 return error(
"Invalid record");
5912 unsigned CCInfo =
Record[OpNum++];
5915 unsigned NumIndirectDests =
Record[OpNum++];
5917 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
5920 unsigned FTyID = InvalidTypeID;
5924 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
5926 return error(
"Explicit call type is not a function type");
5930 unsigned CalleeTypeID;
5931 if (getValueTypePair(
Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5933 return error(
"Invalid record");
5937 return error(
"Callee is not a pointer type");
5939 FTyID = getContainedTypeID(CalleeTypeID);
5940 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
5942 return error(
"Callee is not of pointer to function type");
5944 if (
Record.size() < FTy->getNumParams() + OpNum)
5945 return error(
"Insufficient operands to call");
5950 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5952 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5953 if (FTy->getParamType(i)->isLabelTy())
5954 Arg = getBasicBlock(
Record[OpNum]);
5956 Arg = getValue(
Record, OpNum, NextValueNo, FTy->getParamType(i),
5959 return error(
"Invalid record");
5960 Args.push_back(Arg);
5965 if (!FTy->isVarArg()) {
5966 if (OpNum !=
Record.size())
5967 return error(
"Invalid record");
5969 while (OpNum !=
Record.size()) {
5972 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5973 return error(
"Invalid record");
5980 if (!OperandBundles.empty())
5983 if (
auto *IA = dyn_cast<InlineAsm>(Callee)) {
5988 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
5993 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
5994 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
5995 unsigned LabelNo = ArgNo - FirstBlockArg;
5996 auto *BA = dyn_cast<BlockAddress>(Args[ArgNo]);
5997 if (!BA || BA->getFunction() !=
F ||
5998 LabelNo > IndirectDests.
size() ||
5999 BA->getBasicBlock() != IndirectDests[LabelNo])
6000 return error(
"callbr argument does not match indirect dest");
6005 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6009 for (
Value *Arg : Args)
6012 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6015 std::string Constraints =
IA->getConstraintString();
6018 for (
const auto &CI : ConstraintInfo) {
6020 if (ArgNo >= FirstBlockArg)
6021 Constraints.insert(Pos,
"!");
6026 Pos = Constraints.find(
',', Pos);
6027 if (Pos == std::string::npos)
6033 IA->hasSideEffects(),
IA->isAlignStack(),
6034 IA->getDialect(),
IA->canThrow());
6040 ResTypeID = getContainedTypeID(FTyID);
6041 OperandBundles.clear();
6043 cast<CallBrInst>(
I)->setCallingConv(
6045 cast<CallBrInst>(
I)->setAttributes(PAL);
6046 if (
Error Err = propagateAttributeTypes(cast<CallBase>(
I), ArgTyIDs)) {
6058 return error(
"Invalid phi record");
6060 unsigned TyID =
Record[0];
6061 Type *Ty = getTypeByID(TyID);
6063 return error(
"Invalid phi record");
6068 size_t NumArgs = (
Record.size() - 1) / 2;
6070 if ((
Record.size() - 1) % 2 == 1 && !isa<FPMathOperator>(PN)) {
6072 return error(
"Invalid phi record");
6077 for (
unsigned i = 0; i != NumArgs; i++) {
6081 return error(
"Invalid phi BB");
6088 auto It =
Args.find(BB);
6089 if (It !=
Args.end()) {
6100 if (!PhiConstExprBB)
6102 EdgeBB = PhiConstExprBB;
6110 V = getValueSigned(
Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6112 V = getValue(
Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6116 return error(
"Invalid phi record");
6119 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6120 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6121 PhiConstExprBB =
nullptr;
6124 Args.insert({BB,
V});
6130 if (
Record.size() % 2 == 0) {
6131 assert(isa<FPMathOperator>(
I) &&
"Unexpected phi type");
6134 I->setFastMathFlags(FMF);
6146 return error(
"Invalid record");
6150 return error(
"Invalid record");
6153 Type *Ty = getTypeByID(ResTypeID);
6155 return error(
"Invalid record");
6157 Value *PersFn =
nullptr;
6158 unsigned PersFnTypeID;
6159 if (getValueTypePair(
Record,
Idx, NextValueNo, PersFn, PersFnTypeID,
6161 return error(
"Invalid record");
6163 if (!
F->hasPersonalityFn())
6164 F->setPersonalityFn(cast<Constant>(PersFn));
6165 else if (
F->getPersonalityFn() != cast<Constant>(PersFn))
6166 return error(
"Personality function mismatch");
6173 for (
unsigned J = 0; J != NumClauses; ++J) {
6179 if (getValueTypePair(
Record,
Idx, NextValueNo, Val, ValTypeID,
6182 return error(
"Invalid record");
6186 !isa<ArrayType>(Val->
getType())) &&
6187 "Catch clause has a invalid type!");
6189 isa<ArrayType>(Val->
getType())) &&
6190 "Filter clause has invalid type!");
6201 return error(
"Invalid record");
6204 const bool InAlloca = Bitfield::get<APV::UsedWithInAlloca>(Rec);
6205 const bool SwiftError = Bitfield::get<APV::SwiftError>(Rec);
6206 unsigned TyID =
Record[0];
6207 Type *Ty = getTypeByID(TyID);
6208 if (!Bitfield::get<APV::ExplicitType>(Rec)) {
6209 TyID = getContainedTypeID(TyID);
6210 Ty = getTypeByID(TyID);
6212 return error(
"Missing element type for old-style alloca");
6214 unsigned OpTyID =
Record[1];
6215 Type *OpTy = getTypeByID(OpTyID);
6219 Bitfield::get<APV::AlignLower>(Rec) |
6220 (Bitfield::get<APV::AlignUpper>(Rec) << APV::AlignLower::Bits);
6221 if (
Error Err = parseAlignmentValue(AlignExp,
Align)) {
6225 return error(
"Invalid record");
6228 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6232 return error(
"alloca of unsized type");
6234 Align =
DL.getPrefTypeAlign(Ty);
6236 if (!
Size->getType()->isIntegerTy())
6237 return error(
"alloca element count must have integer type");
6243 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6251 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6252 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6253 return error(
"Invalid record");
6255 if (!isa<PointerType>(
Op->getType()))
6256 return error(
"Load operand is not a pointer type");
6259 if (OpNum + 3 ==
Record.size()) {
6260 ResTypeID =
Record[OpNum++];
6261 Ty = getTypeByID(ResTypeID);
6263 ResTypeID = getContainedTypeID(OpTypeID);
6264 Ty = getTypeByID(ResTypeID);
6268 return error(
"Missing load type");
6270 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6278 return error(
"load of unsized type");
6280 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6290 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6291 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size()))
6292 return error(
"Invalid record");
6294 if (!isa<PointerType>(
Op->getType()))
6295 return error(
"Load operand is not a pointer type");
6298 if (OpNum + 5 ==
Record.size()) {
6299 ResTypeID =
Record[OpNum++];
6300 Ty = getTypeByID(ResTypeID);
6302 ResTypeID = getContainedTypeID(OpTypeID);
6303 Ty = getTypeByID(ResTypeID);
6307 return error(
"Missing atomic load type");
6309 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6313 if (Ordering == AtomicOrdering::NotAtomic ||
6314 Ordering == AtomicOrdering::Release ||
6315 Ordering == AtomicOrdering::AcquireRelease)
6316 return error(
"Invalid record");
6317 if (Ordering != AtomicOrdering::NotAtomic &&
Record[OpNum] == 0)
6318 return error(
"Invalid record");
6325 return error(
"Alignment missing from atomic load");
6334 unsigned PtrTypeID, ValTypeID;
6335 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6336 return error(
"Invalid record");
6339 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6340 return error(
"Invalid record");
6342 ValTypeID = getContainedTypeID(PtrTypeID);
6343 if (popValue(
Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6344 ValTypeID, Val, CurBB))
6345 return error(
"Invalid record");
6348 if (OpNum + 2 !=
Record.size())
6349 return error(
"Invalid record");
6351 if (
Error Err = typeCheckLoadStoreInst(Val->
getType(),
Ptr->getType()))
6358 return error(
"store of unsized type");
6360 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6370 unsigned PtrTypeID, ValTypeID;
6371 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB) ||
6372 !isa<PointerType>(
Ptr->getType()))
6373 return error(
"Invalid record");
6375 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6376 return error(
"Invalid record");
6378 ValTypeID = getContainedTypeID(PtrTypeID);
6379 if (popValue(
Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6380 ValTypeID, Val, CurBB))
6381 return error(
"Invalid record");
6384 if (OpNum + 4 !=
Record.size())
6385 return error(
"Invalid record");
6387 if (
Error Err = typeCheckLoadStoreInst(Val->
getType(),
Ptr->getType()))
6390 if (Ordering == AtomicOrdering::NotAtomic ||
6391 Ordering == AtomicOrdering::Acquire ||
6392 Ordering == AtomicOrdering::AcquireRelease)
6393 return error(
"Invalid record");
6395 if (Ordering != AtomicOrdering::NotAtomic &&
Record[OpNum] == 0)
6396 return error(
"Invalid record");
6402 return error(
"Alignment missing from atomic store");
6410 const size_t NumRecords =
Record.size();
6414 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6415 return error(
"Invalid record");
6417 if (!isa<PointerType>(
Ptr->getType()))
6418 return error(
"Cmpxchg operand is not a pointer type");
6421 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6422 if (popValue(
Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6423 CmpTypeID, Cmp, CurBB))
6424 return error(
"Invalid record");
6427 if (popValue(
Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6429 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6430 return error(
"Invalid record");
6434 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6435 SuccessOrdering == AtomicOrdering::Unordered)
6436 return error(
"Invalid record");
6440 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(),
Ptr->getType()))
6448 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6449 FailureOrdering == AtomicOrdering::Unordered)
6450 return error(
"Invalid record");
6452 const Align Alignment(
6453 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6456 FailureOrdering, SSID);
6457 cast<AtomicCmpXchgInst>(
I)->setVolatile(
Record[OpNum]);
6459 if (NumRecords < 8) {
6463 I->insertInto(CurBB, CurBB->
end());
6465 ResTypeID = CmpTypeID;
6467 cast<AtomicCmpXchgInst>(
I)->setWeak(
Record[OpNum + 4]);
6469 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6478 const size_t NumRecords =
Record.size();
6482 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6483 return error(
"Invalid record");
6485 if (!isa<PointerType>(
Ptr->getType()))
6486 return error(
"Cmpxchg operand is not a pointer type");
6490 if (getValueTypePair(
Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6491 return error(
"Invalid record");
6493 Value *Val =
nullptr;
6494 if (popValue(
Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6496 return error(
"Invalid record");
6498 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6499 return error(
"Invalid record");
6501 const bool IsVol =
Record[OpNum];
6506 return error(
"Invalid cmpxchg success ordering");
6510 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(),
Ptr->getType()))
6516 return error(
"Invalid cmpxchg failure ordering");
6518 const bool IsWeak =
Record[OpNum + 4];
6522 if (NumRecords == (OpNum + 6)) {
6523 if (
Error Err = parseAlignmentValue(
Record[OpNum + 5], Alignment))
6528 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6531 FailureOrdering, SSID);
6532 cast<AtomicCmpXchgInst>(
I)->setVolatile(IsVol);
6533 cast<AtomicCmpXchgInst>(
I)->setWeak(IsWeak);
6536 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6545 const size_t NumRecords =
Record.size();
6550 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6551 return error(
"Invalid record");
6553 if (!isa<PointerType>(
Ptr->getType()))
6554 return error(
"Invalid record");
6556 Value *Val =
nullptr;
6557 unsigned ValTypeID = InvalidTypeID;
6559 ValTypeID = getContainedTypeID(PtrTypeID);
6560 if (popValue(
Record, OpNum, NextValueNo,
6561 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6562 return error(
"Invalid record");
6564 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6565 return error(
"Invalid record");
6568 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6569 return error(
"Invalid record");
6575 return error(
"Invalid record");
6577 const bool IsVol =
Record[OpNum + 1];
6580 if (Ordering == AtomicOrdering::NotAtomic ||
6581 Ordering == AtomicOrdering::Unordered)
6582 return error(
"Invalid record");
6588 if (NumRecords == (OpNum + 5)) {
6589 if (
Error Err = parseAlignmentValue(
Record[OpNum + 4], Alignment))
6595 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6598 ResTypeID = ValTypeID;
6599 cast<AtomicRMWInst>(
I)->setVolatile(IsVol);
6606 return error(
"Invalid record");
6608 if (Ordering == AtomicOrdering::NotAtomic ||
6609 Ordering == AtomicOrdering::Unordered ||
6610 Ordering == AtomicOrdering::Monotonic)
6611 return error(
"Invalid record");
6620 SeenDebugRecord =
true;
6623 return error(
"Invalid dbg record: missing instruction");
6626 Inst->
getParent()->insertDbgRecordBefore(
6636 SeenDebugRecord =
true;
6639 return error(
"Invalid dbg record: missing instruction");
6655 cast<DILocalVariable>(getFnMetadataByID(
Record[Slot++]));
6657 cast<DIExpression>(getFnMetadataByID(
Record[Slot++]));
6669 unsigned SlotBefore =
Slot;
6670 if (getValueTypePair(
Record, Slot, NextValueNo, V, TyID, CurBB))
6671 return error(
"Invalid dbg record: invalid value");
6673 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6676 RawLocation = getFnMetadataByID(
Record[Slot++]);
6684 DbgVariableRecord::LocationType::Value);
6688 DbgVariableRecord::LocationType::Declare);
6693 cast<DIExpression>(getFnMetadataByID(
Record[Slot++]));
6708 return error(
"Invalid record");
6712 unsigned CCInfo =
Record[OpNum++];
6718 return error(
"Fast math flags indicator set for call with no FMF");
6721 unsigned FTyID = InvalidTypeID;
6725 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
6727 return error(
"Explicit call type is not a function type");
6731 unsigned CalleeTypeID;
6732 if (getValueTypePair(
Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6734 return error(
"Invalid record");
6738 return error(
"Callee is not a pointer type");
6740 FTyID = getContainedTypeID(CalleeTypeID);
6741 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
6743 return error(
"Callee is not of pointer to function type");
6745 if (
Record.size() < FTy->getNumParams() + OpNum)
6746 return error(
"Insufficient operands to call");
6751 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6752 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6753 if (FTy->getParamType(i)->isLabelTy())
6754 Args.push_back(getBasicBlock(
Record[OpNum]));
6756 Args.push_back(getValue(
Record, OpNum, NextValueNo,
6757 FTy->getParamType(i), ArgTyID, CurBB));
6760 return error(
"Invalid record");
6764 if (!FTy->isVarArg()) {
6765 if (OpNum !=
Record.size())
6766 return error(
"Invalid record");
6768 while (OpNum !=
Record.size()) {
6771 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6772 return error(
"Invalid record");
6779 if (!OperandBundles.empty())
6783 ResTypeID = getContainedTypeID(FTyID);
6784 OperandBundles.clear();
6786 cast<CallInst>(
I)->setCallingConv(
6795 cast<CallInst>(
I)->setTailCallKind(TCK);
6796 cast<CallInst>(
I)->setAttributes(PAL);
6797 if (isa<DbgInfoIntrinsic>(
I))
6798 SeenDebugIntrinsic =
true;
6799 if (
Error Err = propagateAttributeTypes(cast<CallBase>(
I), ArgTyIDs)) {
6804 if (!isa<FPMathOperator>(
I))
6805 return error(
"Fast-math-flags specified for call without "
6806 "floating-point scalar or vector return type");
6807 I->setFastMathFlags(FMF);
6813 return error(
"Invalid record");
6814 unsigned OpTyID =
Record[0];
6815 Type *OpTy = getTypeByID(OpTyID);
6816 Value *
Op = getValue(
Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
6818 Type *ResTy = getTypeByID(ResTypeID);
6819 if (!OpTy || !
Op || !ResTy)
6820 return error(
"Invalid record");
6832 return error(
"Invalid record");
6834 std::vector<Value *> Inputs;
6837 while (OpNum !=
Record.size()) {
6839 if (getValueOrMetadata(
Record, OpNum, NextValueNo,
Op, CurBB))
6840 return error(
"Invalid record");
6841 Inputs.push_back(
Op);
6844 OperandBundles.emplace_back(BundleTags[
Record[0]], std::move(Inputs));
6852 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6853 return error(
"Invalid record");
6854 if (OpNum !=
Record.size())
6855 return error(
"Invalid record");
6858 ResTypeID = OpTypeID;
6868 return error(
"Invalid instruction with no BB");
6870 if (!OperandBundles.empty()) {
6872 return error(
"Operand bundles found with no consumer");
6874 I->insertInto(CurBB, CurBB->
end());
6877 if (
I->isTerminator()) {
6879 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
6883 if (!
I->getType()->isVoidTy()) {
6884 assert(
I->getType() == getTypeByID(ResTypeID) &&
6885 "Incorrect result type ID");
6893 if (!OperandBundles.empty())
6894 return error(
"Operand bundles found with no consumer");
6898 if (!
A->getParent()) {
6900 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
6901 if ((
A = dyn_cast_or_null<Argument>(ValueList[i])) && !
A->getParent()) {
6906 return error(
"Never resolved value found in function");
6911 if (MDLoader->hasFwdRefs())
6912 return error(
"Invalid function metadata: outgoing forward refs");
6917 for (
const auto &Pair : ConstExprEdgeBBs) {
6922 From->getTerminator()->replaceSuccessorWith(To, EdgeBB);
6928 ValueList.
shrinkTo(ModuleValueListSize);
6929 MDLoader->shrinkTo(ModuleMDLoaderSize);
6930 std::vector<BasicBlock*>().swap(FunctionBBs);
6935Error BitcodeReader::findFunctionInStream(
6938 while (DeferredFunctionInfoIterator->second == 0) {
6943 assert(VSTOffset == 0 || !
F->hasName());
6946 if (
Error Err = rememberAndSkipFunctionBodies())
6952SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
6955 if (Val >= SSIDs.
size())
6967 if (!
F || !
F->isMaterializable())
6971 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
6974 if (DFII->second == 0)
6975 if (
Error Err = findFunctionInStream(
F, DFII))
6979 if (
Error Err = materializeMetadata())
6983 if (
Error JumpFailed = Stream.JumpToBit(DFII->second))
6988 F->IsNewDbgInfoFormat =
true;
6990 if (
Error Err = parseFunctionBody(
F))
6992 F->setIsMaterializable(
false);
6996 if (SeenDebugIntrinsic && SeenDebugRecord)
6997 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
6999 bool SeenAnyDebugInfo = SeenDebugIntrinsic || SeenDebugRecord;
7000 bool NewDbgInfoFormatDesired =
7001 SeenAnyDebugInfo ? SeenDebugRecord :
F->getParent()->IsNewDbgInfoFormat;
7002 if (SeenAnyDebugInfo) {
7011 if (NewDbgInfoFormatDesired !=
F->getParent()->IsNewDbgInfoFormat)
7012 F->getParent()->setNewDbgInfoFormatFlag(NewDbgInfoFormatDesired);
7014 F->setNewDbgInfoFormatFlag(NewDbgInfoFormatDesired);
7022 bool ModuleIsNewDbgInfoFormat =
F->getParent()->IsNewDbgInfoFormat;
7023 if (ModuleIsNewDbgInfoFormat || !SeenDebugRecord)
7024 F->setNewDbgInfoFormatFlag(ModuleIsNewDbgInfoFormat);
7026 F->setIsNewDbgInfoFormat(ModuleIsNewDbgInfoFormat);
7033 for (
auto &
I : UpgradedIntrinsics) {
7035 if (
CallInst *CI = dyn_cast<CallInst>(U))
7040 if (
DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7041 F->setSubprogram(SP);
7044 if (!MDLoader->isStrippingTBAA()) {
7046 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7049 MDLoader->setStripTBAA(
true);
7056 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7057 if (MD->getOperand(0) !=
nullptr && isa<MDString>(MD->getOperand(0))) {
7058 MDString *MDS = cast<MDString>(MD->getOperand(0));
7061 if (ProfName !=
"branch_weights")
7063 unsigned ExpectedNumOperands = 0;
7065 ExpectedNumOperands = BI->getNumSuccessors();
7066 else if (
SwitchInst *SI = dyn_cast<SwitchInst>(&
I))
7067 ExpectedNumOperands =
SI->getNumSuccessors();
7068 else if (isa<CallInst>(&
I))
7069 ExpectedNumOperands = 1;
7072 else if (isa<SelectInst>(&
I))
7073 ExpectedNumOperands = 2;
7080 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7081 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7086 if (
auto *CI = dyn_cast<CallBase>(&
I)) {
7088 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7090 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7092 CI->getArgOperand(ArgNo)->getType(),
7093 CI->getParamAttributes(ArgNo)));
7102 return materializeForwardReferencedFunctions();
7105Error BitcodeReader::materializeModule() {
7106 if (
Error Err = materializeMetadata())
7110 WillMaterializeAllForwardRefs =
true;
7115 if (
Error Err = materialize(&
F))
7121 if (LastFunctionBlockBit || NextUnreadBit)
7123 ? LastFunctionBlockBit
7129 if (!BasicBlockFwdRefs.
empty())
7130 return error(
"Never resolved function from blockaddress");
7136 for (
auto &
I : UpgradedIntrinsics) {
7137 for (
auto *U :
I.first->users()) {
7138 if (
CallInst *CI = dyn_cast<CallInst>(U))
7141 if (!
I.first->use_empty())
7142 I.first->replaceAllUsesWith(
I.second);
7143 I.first->eraseFromParent();
7145 UpgradedIntrinsics.clear();
7156std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7157 return IdentifiedStructTypes;
7160ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7163 : BitcodeReaderBase(
std::
move(Cursor), Strtab), TheIndex(TheIndex),
7164 ModulePath(ModulePath), IsPrevailing(IsPrevailing) {}
7166void ModuleSummaryIndexBitcodeReader::addThisModule() {
7171ModuleSummaryIndexBitcodeReader::getThisModule() {
7175template <
bool AllowNullValueInfo>
7176std::pair<ValueInfo, GlobalValue::GUID>
7177ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7178 auto VGI = ValueIdToValueInfoMap[ValueId];
7183 assert(AllowNullValueInfo || std::get<0>(VGI));
7187void ModuleSummaryIndexBitcodeReader::setValueGUID(
7190 std::string GlobalId =
7193 auto OriginalNameID = ValueGUID;
7197 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7203 ValueIdToValueInfoMap[ValueID] = std::make_pair(
7212Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7221 if (!MaybeCurrentBit)
7239 switch (
Entry.Kind) {
7242 return error(
"Malformed block");
7245 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
7258 switch (MaybeRecord.
get()) {
7263 return error(
"Invalid record");
7264 unsigned ValueID =
Record[0];
7266 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7267 assert(VLI != ValueIdToLinkageMap.
end() &&
7268 "No linkage found for VST entry?");
7270 setValueGUID(ValueID,
ValueName, Linkage, SourceFileName);
7277 return error(
"Invalid record");
7278 unsigned ValueID =
Record[0];
7280 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7281 assert(VLI != ValueIdToLinkageMap.
end() &&
7282 "No linkage found for VST entry?");
7284 setValueGUID(ValueID,
ValueName, Linkage, SourceFileName);
7290 unsigned ValueID =
Record[0];
7294 ValueIdToValueInfoMap[ValueID] =
7305Error ModuleSummaryIndexBitcodeReader::parseModule() {
7311 unsigned ValueId = 0;
7320 switch (
Entry.Kind) {
7322 return error(
"Malformed block");
7329 if (
Error Err = Stream.SkipBlock())
7334 if (
Error Err = readBlockInfo())
7340 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7341 !SeenGlobalValSummary) &&
7342 "Expected early VST parse via VSTOffset record");
7343 if (
Error Err = Stream.SkipBlock())
7349 if (!SourceFileName.
empty())
7351 assert(!SeenValueSymbolTable &&
7352 "Already read VST when parsing summary block?");
7357 if (VSTOffset > 0) {
7358 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7360 SeenValueSymbolTable =
true;
7362 SeenGlobalValSummary =
true;
7363 if (
Error Err = parseEntireSummary(
Entry.ID))
7367 if (
Error Err = parseModuleStringTable())
7378 switch (MaybeBitCode.
get()) {
7382 if (
Error Err = parseVersionRecord(
Record).takeError())
7390 return error(
"Invalid record");
7398 auto &Hash = getThisModule()->second;
7400 for (
auto &Val :
Record) {
7401 assert(!(Val >> 32) &&
"Unexpected high bits set");
7409 return error(
"Invalid record");
7413 VSTOffset =
Record[0] - 1;
7424 std::tie(
Name, GVRecord) = readNameFromStrtab(
Record);
7425 if (GVRecord.
size() <= 3)
7426 return error(
"Invalid record");
7430 ValueIdToLinkageMap[ValueId++] =
Linkage;
7434 setValueGUID(ValueId++,
Name, Linkage, SourceFileName);
7449 Ret.push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7455 bool IsOldProfileFormat,
7456 bool HasProfile,
bool HasRelBF) {
7460 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7465 for (
unsigned I = 0, E =
Record.size();
I != E; ++
I) {
7467 bool HasTailCall =
false;
7470 if (IsOldProfileFormat) {
7474 }
else if (HasProfile)
7475 std::tie(Hotness, HasTailCall) =
7508 static_cast<size_t>(
Record[Slot + 1])};
7531 while (Slot <
Record.size())
7535std::vector<FunctionSummary::ParamAccess>
7537 auto ReadRange = [&]() {
7539 BitcodeReader::decodeSignRotatedValue(
Record.front()));
7542 BitcodeReader::decodeSignRotatedValue(
Record.front()));
7550 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7551 while (!
Record.empty()) {
7552 PendingParamAccesses.emplace_back();
7556 ParamAccess.
Use = ReadRange();
7559 for (
auto &Call : ParamAccess.
Calls) {
7562 Call.Callee = std::get<0>(getValueInfoFromValueId(
Record.front()));
7564 Call.Offsets = ReadRange();
7567 return PendingParamAccesses;
7570void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7578void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7584 static_cast<size_t>(
Record[Slot + 1])});
7587 while (Slot <
Record.size())
7588 parseTypeIdCompatibleVtableInfo(
Record, Slot, TypeId);
7597 if (RadixArray.empty()) {
7598 unsigned NumStackEntries =
Record[
I++];
7600 StackIdList.
reserve(NumStackEntries);
7601 for (
unsigned J = 0; J < NumStackEntries; J++) {
7607 unsigned RadixIndex =
Record[
I++];
7613 assert(RadixIndex < RadixArray.size());
7614 unsigned NumStackIds = RadixArray[RadixIndex++];
7615 StackIdList.
reserve(NumStackIds);
7616 while (NumStackIds--) {
7617 assert(RadixIndex < RadixArray.size());
7618 unsigned Elem = RadixArray[RadixIndex];
7619 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7620 RadixIndex = RadixIndex - Elem;
7621 assert(RadixIndex < RadixArray.size());
7622 Elem = RadixArray[RadixIndex];
7624 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7637 unsigned FirstWORef = Refs.
size() - WOCnt;
7638 unsigned RefNo = FirstWORef - ROCnt;
7639 for (; RefNo < FirstWORef; ++RefNo)
7640 Refs[RefNo].setReadOnly();
7641 for (; RefNo < Refs.
size(); ++RefNo)
7642 Refs[RefNo].setWriteOnly();
7647Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7648 if (
Error Err = Stream.EnterSubBlock(
ID))
7660 return error(
"Invalid Summary Block: record for version expected");
7665 return error(
"Invalid Summary Block: version expected");
7668 const bool IsOldProfileFormat =
Version == 1;
7670 return error(
"Invalid summary version " +
Twine(Version) +
7671 ". Version should be in the range [1-" +
7684 std::vector<GlobalValue::GUID> PendingTypeTests;
7685 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7686 PendingTypeCheckedLoadVCalls;
7687 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7688 PendingTypeCheckedLoadConstVCalls;
7689 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7691 std::vector<CallsiteInfo> PendingCallsites;
7692 std::vector<AllocInfo> PendingAllocs;
7693 std::vector<uint64_t> PendingContextIds;
7701 switch (
Entry.Kind) {
7704 return error(
"Malformed block");
7723 switch (
unsigned BitCode = MaybeBitCode.
get()) {
7733 if (Version >= 11) {
7738 ValueIdToValueInfoMap[ValueID] =
7754 unsigned ValueID =
Record[0];
7756 unsigned InstCount =
Record[2];
7758 unsigned NumRefs =
Record[3];
7759 unsigned NumRORefs = 0, NumWORefs = 0;
7760 int RefListStartIndex = 4;
7764 RefListStartIndex = 5;
7767 RefListStartIndex = 6;
7770 RefListStartIndex = 7;
7781 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7783 "Record size inconsistent with number of references");
7790 IsOldProfileFormat, HasProfile, HasRelBF);
7792 auto VIAndOriginalGUID = getValueInfoFromValueId(ValueID);
7798 !IsPrevailing(VIAndOriginalGUID.first.getGUID())) {
7799 PendingCallsites.clear();
7800 PendingAllocs.clear();
7802 auto FS = std::make_unique<FunctionSummary>(
7804 std::move(Calls), std::move(PendingTypeTests),
7805 std::move(PendingTypeTestAssumeVCalls),
7806 std::move(PendingTypeCheckedLoadVCalls),
7807 std::move(PendingTypeTestAssumeConstVCalls),
7808 std::move(PendingTypeCheckedLoadConstVCalls),
7809 std::move(PendingParamAccesses), std::move(PendingCallsites),
7810 std::move(PendingAllocs));
7811 FS->setModulePath(getThisModule()->first());
7812 FS->setOriginalName(std::get<1>(VIAndOriginalGUID));
7821 unsigned ValueID =
Record[0];
7823 unsigned AliaseeID =
Record[2];
7825 auto AS = std::make_unique<AliasSummary>(Flags);
7831 AS->setModulePath(getThisModule()->first());
7833 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
7835 if (!AliaseeInModule)
7836 return error(
"Alias expects aliasee summary to be parsed");
7837 AS->setAliasee(AliaseeVI, AliaseeInModule);
7839 auto GUID = getValueInfoFromValueId(ValueID);
7840 AS->setOriginalName(std::get<1>(GUID));
7846 unsigned ValueID =
Record[0];
7848 unsigned RefArrayStart = 2;
7861 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7862 FS->setModulePath(getThisModule()->first());
7863 auto GUID = getValueInfoFromValueId(ValueID);
7864 FS->setOriginalName(std::get<1>(GUID));
7872 unsigned ValueID =
Record[0];
7875 unsigned NumRefs =
Record[3];
7876 unsigned RefListStartIndex = 4;
7877 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
7882 for (
unsigned I = VTableListStartIndex, E =
Record.size();
I != E; ++
I) {
7888 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7889 VS->setModulePath(getThisModule()->first());
7890 VS->setVTableFuncs(VTableFuncs);
7891 auto GUID = getValueInfoFromValueId(ValueID);
7892 VS->setOriginalName(std::get<1>(GUID));
7904 unsigned ValueID =
Record[0];
7907 unsigned InstCount =
Record[3];
7909 unsigned NumRefs =
Record[4];
7910 unsigned NumRORefs = 0, NumWORefs = 0;
7911 int RefListStartIndex = 5;
7915 RefListStartIndex = 6;
7916 size_t NumRefsIndex = 5;
7918 unsigned NumRORefsOffset = 1;
7919 RefListStartIndex = 7;
7922 RefListStartIndex = 8;
7924 RefListStartIndex = 9;
7926 NumRORefsOffset = 2;
7929 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
7931 NumRefs =
Record[NumRefsIndex];
7935 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7937 "Record size inconsistent with number of references");
7943 IsOldProfileFormat, HasProfile,
false);
7944 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
7946 auto FS = std::make_unique<FunctionSummary>(
7948 std::move(Edges), std::move(PendingTypeTests),
7949 std::move(PendingTypeTestAssumeVCalls),
7950 std::move(PendingTypeCheckedLoadVCalls),
7951 std::move(PendingTypeTestAssumeConstVCalls),
7952 std::move(PendingTypeCheckedLoadConstVCalls),
7953 std::move(PendingParamAccesses), std::move(PendingCallsites),
7954 std::move(PendingAllocs));
7955 LastSeenSummary =
FS.get();
7956 LastSeenGUID =
VI.getGUID();
7957 FS->setModulePath(ModuleIdMap[ModuleId]);
7965 unsigned ValueID =
Record[0];
7968 unsigned AliaseeValueId =
Record[3];
7970 auto AS = std::make_unique<AliasSummary>(Flags);
7971 LastSeenSummary = AS.get();
7972 AS->setModulePath(ModuleIdMap[ModuleId]);
7974 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeValueId));
7976 AS->setAliasee(AliaseeVI, AliaseeInModule);
7978 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
7979 LastSeenGUID =
VI.getGUID();
7985 unsigned ValueID =
Record[0];
7988 unsigned RefArrayStart = 3;
8001 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8002 LastSeenSummary =
FS.get();
8003 FS->setModulePath(ModuleIdMap[ModuleId]);
8004 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
8005 LastSeenGUID =
VI.getGUID();
8012 if (!LastSeenSummary)
8013 return error(
"Name attachment that does not follow a combined record");
8017 LastSeenSummary =
nullptr;
8022 assert(PendingTypeTests.empty());
8027 assert(PendingTypeTestAssumeVCalls.empty());
8028 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8029 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8033 assert(PendingTypeCheckedLoadVCalls.empty());
8034 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8035 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8039 PendingTypeTestAssumeConstVCalls.push_back(
8044 PendingTypeCheckedLoadConstVCalls.push_back(
8049 std::set<std::string, std::less<>> &CfiFunctionDefs =
8051 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8052 CfiFunctionDefs.insert(
8053 {Strtab.data() + Record[I], static_cast<size_t>(Record[I + 1])});
8058 std::set<std::string, std::less<>> &CfiFunctionDecls =
8060 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8061 CfiFunctionDecls.insert(
8062 {Strtab.data() + Record[I], static_cast<size_t>(Record[I + 1])});
8071 parseTypeIdCompatibleVtableSummaryRecord(
Record);
8079 PendingParamAccesses = parseParamAccesses(
Record);
8086 if (Version <= 11) {
8093 StackIds.reserve(
Record.size() / 2);
8094 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8095 StackIds.push_back(*R << 32 | *(R + 1));
8105 unsigned ValueID =
Record[0];
8107 for (
auto R =
Record.begin() + 1; R !=
Record.end(); R++) {
8108 assert(*R < StackIds.size());
8111 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
8112 PendingCallsites.push_back(
CallsiteInfo({
VI, std::move(StackIdList)}));
8117 auto RecordIter =
Record.begin();
8118 unsigned ValueID = *RecordIter++;
8119 unsigned NumStackIds = *RecordIter++;
8120 unsigned NumVersions = *RecordIter++;
8121 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8123 for (
unsigned J = 0; J < NumStackIds; J++) {
8124 assert(*RecordIter < StackIds.size());
8129 for (
unsigned J = 0; J < NumVersions; J++)
8132 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8133 PendingCallsites.push_back(
8134 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8142 PendingContextIds.reserve(
Record.size() / 2);
8143 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8144 PendingContextIds.push_back(*R << 32 | *(R + 1));
8150 std::vector<MIBInfo> MIBs;
8151 unsigned NumMIBs = 0;
8154 unsigned MIBsRead = 0;
8155 while ((Version >= 10 && MIBsRead++ < NumMIBs) ||
8156 (Version < 10 &&
I <
Record.size())) {
8159 auto StackIdList = parseAllocInfoContext(
Record,
I);
8166 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8168 assert(!PendingContextIds.empty() &&
8169 "Missing context ids for alloc sizes");
8170 unsigned ContextIdIndex = 0;
8176 while (MIBsRead++ < NumMIBs) {
8178 unsigned NumContextSizeInfoEntries =
Record[
I++];
8180 std::vector<ContextTotalSize> ContextSizes;
8181 ContextSizes.reserve(NumContextSizeInfoEntries);
8182 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8183 assert(ContextIdIndex < PendingContextIds.size());
8186 ContextSizes.push_back(
8187 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8189 AllContextSizes.push_back(std::move(ContextSizes));
8191 PendingContextIds.clear();
8193 PendingAllocs.push_back(
AllocInfo(std::move(MIBs)));
8194 if (!AllContextSizes.empty()) {
8195 assert(PendingAllocs.back().MIBs.size() == AllContextSizes.size());
8196 PendingAllocs.back().ContextSizeInfos = std::move(AllContextSizes);
8203 std::vector<MIBInfo> MIBs;
8204 unsigned NumMIBs =
Record[
I++];
8205 unsigned NumVersions =
Record[
I++];
8206 unsigned MIBsRead = 0;
8207 while (MIBsRead++ < NumMIBs) {
8210 auto StackIdList = parseAllocInfoContext(
Record,
I);
8215 for (
unsigned J = 0; J < NumVersions; J++)
8218 PendingAllocs.push_back(
AllocInfo(std::move(Versions), std::move(MIBs)));
8228Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8243 switch (
Entry.Kind) {
8246 return error(
"Malformed block");
8258 switch (MaybeRecord.
get()) {
8266 return error(
"Invalid record");
8268 LastSeenModule = TheIndex.
addModule(ModulePath);
8269 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8278 if (!LastSeenModule)
8279 return error(
"Invalid hash that does not follow a module path");
8281 for (
auto &Val :
Record) {
8282 assert(!(Val >> 32) &&
"Unexpected high bits set");
8283 LastSeenModule->
second[Pos++] = Val;
8286 LastSeenModule =
nullptr;
8299class BitcodeErrorCategoryType :
public std::error_category {
8300 const char *
name()
const noexcept
override {
8301 return "llvm.bitcode";
8304 std::string message(
int IE)
const override {
8307 case BitcodeError::CorruptedBitcode:
8308 return "Corrupted bitcode";
8317 static BitcodeErrorCategoryType ErrorCategory;
8318 return ErrorCategory;
8322 unsigned Block,
unsigned RecordID) {
8324 return std::move(Err);
8333 switch (Entry.Kind) {
8338 return error(
"Malformed block");
8342 return std::move(Err);
8352 if (MaybeRecord.
get() == RecordID)
8367 return FOrErr.takeError();
8368 return std::move(FOrErr->Mods);
8393 switch (Entry.Kind) {
8396 return error(
"Malformed block");
8399 uint64_t IdentificationBit = -1ull;
8403 return std::move(Err);
8409 Entry = MaybeEntry.
get();
8414 return error(
"Malformed block");
8420 return std::move(Err);
8439 if (!
I.Strtab.empty())
8446 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8447 F.StrtabForSymtab = *Strtab;
8463 if (
F.Symtab.empty())
8464 F.Symtab = *SymtabOrErr;
8469 return std::move(Err);
8474 return std::move(E);
8489BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8490 bool ShouldLazyLoadMetadata,
bool IsImporting,
8494 std::string ProducerIdentification;
8495 if (IdentificationBit != -1ull) {
8496 if (
Error JumpFailed = Stream.JumpToBit(IdentificationBit))
8497 return std::move(JumpFailed);
8500 return std::move(E);
8503 if (
Error JumpFailed = Stream.JumpToBit(ModuleBit))
8504 return std::move(JumpFailed);
8505 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8508 std::unique_ptr<Module>
M =
8509 std::make_unique<Module>(ModuleIdentifier, Context);
8510 M->setMaterializer(R);
8513 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8514 IsImporting, Callbacks))
8515 return std::move(Err);
8517 if (MaterializeAll) {
8519 if (
Error Err =
M->materializeAll())
8520 return std::move(Err);
8523 if (
Error Err =
R->materializeForwardReferencedFunctions())
8524 return std::move(Err);
8527 return std::move(M);
8533 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8548 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8549 ModulePath, IsPrevailing);
8550 return R.parseModule();
8557 return std::move(JumpFailed);
8559 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8560 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8561 ModuleIdentifier, 0);
8563 if (
Error Err = R.parseModule())
8564 return std::move(Err);
8566 return std::move(Index);
8574 return std::move(Err);
8579 std::pair<bool, bool> Result = {
false,
false};
8581 return std::move(E);
8583 switch (Entry.Kind) {
8586 return error(
"Malformed block");
8601 switch (MaybeBitCode.
get()) {
8607 assert(Flags <= 0x2ff &&
"Unexpected bits in flag");
8609 bool EnableSplitLTOUnit = Flags & 0x8;
8610 bool UnifiedLTO = Flags & 0x200;
8611 Result = {EnableSplitLTOUnit, UnifiedLTO};
8624 return std::move(JumpFailed);
8627 return std::move(Err);
8632 return std::move(E);
8634 switch (Entry.Kind) {
8636 return error(
"Malformed block");
8647 return Flags.takeError();
8659 return Flags.takeError();
8668 return std::move(Err);
8675 return StreamFailed.takeError();
8685 if (MsOrErr->size() != 1)
8686 return error(
"Expected a single module");
8688 return (*MsOrErr)[0];
8693 bool ShouldLazyLoadMetadata,
bool IsImporting,
8699 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8704 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8705 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8707 IsImporting, Callbacks);
8709 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8715 return getModuleImpl(Context,
true,
false,
false, Callbacks);
8727 return BM->parseModule(Context, Callbacks);
8760 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
8769 return BM->getSummary();
8777 return BM->getLTOInfo();
8782 bool IgnoreEmptyThinLTOIndexFile) {
8787 if (IgnoreEmptyThinLTOIndexFile && !(*FileOrErr)->getBufferSize())
static bool isConstant(const MachineInstr &MI)
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
Expand Atomic instructions
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static void getDecodedRelBFCallEdgeInfo(uint64_t RawFlags, uint64_t &RelBF, bool &HasTailCall)
static void upgradeDLLImportExportLinkage(GlobalValue *GV, unsigned Val)
static cl::opt< bool > PrintSummaryGUIDs("print-summary-global-ids", cl::init(false), cl::Hidden, cl::desc("Print the global id for each value when reading the module summary"))
static AtomicOrdering getDecodedOrdering(unsigned Val)
static std::pair< CalleeInfo::HotnessType, bool > getDecodedHotnessCallEdgeInfo(uint64_t RawFlags)
static FunctionSummary::FFlags getDecodedFFlags(uint64_t RawFlags)
static std::optional< CodeModel::Model > getDecodedCodeModel(unsigned Val)
static void setSpecialRefs(SmallVectorImpl< ValueInfo > &Refs, unsigned ROCnt, unsigned WOCnt)
cl::opt< cl::boolOrDefault > PreserveInputDbgFormat
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 Expected< std::pair< bool, bool > > getEnableSplitLTOUnitAndUnifiedFlag(BitstreamCursor &Stream, unsigned ID, BitcodeLTOInfo <OInfo)
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...
cl::opt< bool > WriteNewDbgInfoFormat
static void parseTypeIdSummaryRecord(ArrayRef< uint64_t > Record, StringRef Strtab, ModuleSummaryIndex &TheIndex)
cl::opt< cl::boolOrDefault > LoadBitcodeIntoNewDbgInfoFormat("load-bitcode-into-experimental-debuginfo-iterators", cl::Hidden, cl::desc("Load bitcode directly into the new debug info format (regardless " "of input format)"))
Load bitcode directly into RemoveDIs format (use debug records instead of debug intrinsics).
static void addRawAttributeValue(AttrBuilder &B, uint64_t Val)
bool WriteNewDbgInfoFormatToBitcode
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 bool isConstExprSupported(const BitcodeConstant *BC)
static int getDecodedCastOpcode(unsigned Val)
cl::opt< bool > UseNewDbgInfoFormat
static Expected< std::string > readModuleTriple(BitstreamCursor &Stream)
static GlobalValue::VisibilityTypes getDecodedVisibility(unsigned Val)
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
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)
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is Live
This file defines the DenseMap class.
Provides ErrorOr<T> smart pointer.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Module.h This file contains the declarations for the Module class.
static 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
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
Class for arbitrary precision integers.
an instruction to allocate memory on the stack
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.
This class represents an incoming formal argument to a Function.
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.
An instruction that atomically checks whether a specified value is in a memory location,...
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)
an instruction that atomically reads a memory location, combines it with another value,...
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ 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.
AttributeSet getFnAttrs() const
The function attributes are returned.
static AttributeList get(LLVMContext &C, ArrayRef< std::pair< unsigned, Attribute > > Attrs)
Create an AttributeList with the specified parameters in it.
static Attribute getWithStructRetType(LLVMContext &Context, Type *Ty)
static Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
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.
static bool isConstantRangeAttrKind(AttrKind Kind)
static Attribute getWithInAllocaType(LLVMContext &Context, Type *Ty)
static bool isIntAttrKind(AttrKind Kind)
static bool isConstantRangeListAttrKind(AttrKind Kind)
static Attribute getWithByValType(LLVMContext &Context, Type *Ty)
static bool isEnumAttrKind(AttrKind Kind)
LLVM Basic Block Representation.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
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.
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 & back() const
static 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.
Expected< std::unique_ptr< ModuleSummaryIndex > > getSummary()
Parse the specified bitcode buffer, returning the module summary index.
Expected< BitcodeLTOInfo > getLTOInfo()
Returns information about the module to be used for LTO: whether to compile with ThinLTO,...
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.
Expected< std::unique_ptr< Module > > parseModule(LLVMContext &Context, ParserCallbacks Callbacks={})
Read the entire bitcode module and return it.
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 class maintains the abbreviations read from a block info block.
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.
void setBlockInfo(BitstreamBlockInfo *BI)
Set the block info to be used by this BitstreamCursor to interpret abbreviated records.
Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
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.
Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
uint64_t getCurrentByteNo() const
bool canSkipToPos(size_t pos) const
static BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
Conditional or Unconditional Branch instruction.
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
Allocate memory in an ever growing pool, as if by bump-pointer.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
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.
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)
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CaptureInfo createFromIntValue(uint32_t Data)
static 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 bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
static 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 Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static 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 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 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 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 Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static 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 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 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 bool isSupportedCastOp(unsigned Opcode)
Whether creating a constant expression for this cast is supported.
This is the shared class of boolean and integer constants.
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
static ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc)
Return a pointer signed with the specified parameters.
static bool isOrderedRanges(ArrayRef< ConstantRange > RangesRef)
This class represents a range of values.
bool isUpperSignWrapped() const
Return true if the (exclusive) upper bound wraps around the signed domain.
bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
static Constant * get(StructType *T, ArrayRef< Constant * > V)
static Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
static Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
Records a position in IR for a source label (DILabel).
Record of a variable value-assignment, aka a non instruction representation of the dbg....
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)
Implements a dense probed hash-table based set.
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.
This instruction compares its operands according to the predicate given to the constructor.
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)
An instruction for ordering other memory operations.
static FixedVectorType * get(Type *ElementType, unsigned NumElts)
This class represents a freeze function that returns random concrete value if an operand is either a ...
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
const BasicBlock & back() const
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags noUnsignedSignedWrap()
virtual void setStripDebugInfo()=0
virtual Error materializeModule()=0
Make sure the entire Module has been completely read.
virtual Error materializeMetadata()=0
virtual Error materialize(GlobalValue *GV)=0
Make sure the given GlobalValue is fully read.
virtual std::vector< StructType * > getIdentifiedStructTypes() const =0
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static 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 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...
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalObject.
void setComdat(Comdat *C)
void setSection(StringRef S)
Change the section for this global.
Function and variable summary information to aid decisions and implementation of importing.
void setOriginalName(GlobalValue::GUID Name)
Initialize the original name hash in this summary.
static bool isLocalLinkage(LinkageTypes Linkage)
void setUnnamedAddr(UnnamedAddr Val)
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.
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
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.
void setVisibility(VisibilityTypes V)
void setSanitizerMetadata(SanitizerMetadata Meta)
std::string getGlobalIdentifier() const
Return the modified name for this global value suitable to be used as the key for a global lookup (e....
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.
void setPartition(StringRef Part)
void setAttributes(AttributeSet A)
Set attribute list for this global.
void setCodeModel(CodeModel::Model CM)
Change the code model for this global.
This instruction compares its operands according to the predicate given to the constructor.
Indirect Branch Instruction.
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 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)
const char * getOpcodeName() const
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 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.
void emitError(const Instruction *I, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
SyncScope::ID getOrInsertSyncScopeID(StringRef SSN)
getOrInsertSyncScopeID - Maps synchronization scope name to synchronization scope ID.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
static 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...
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.
An instruction for reading from memory.
Tracking metadata reference owned by Metadata.
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()
Create MemoryEffectsBase that can read any memory.
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access argument memory.
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access inaccessible memory.
static MemoryEffectsBase createFromIntValue(uint32_t Data)
Create MemoryEffectsBase from an encoded integer value (used by memory attribute).
static MemoryEffectsBase writeOnly()
Create MemoryEffectsBase that can write any memory.
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access inaccessible or argument memory.
static MemoryEffectsBase none()
Create MemoryEffectsBase that cannot read or write any memory.
static MemoryEffectsBase unknown()
Create MemoryEffectsBase that can read and write any memory.
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.
ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID)
Return a ValueInfo for GUID.
StringRef saveString(StringRef String)
void setFlags(uint64_t Flags)
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.
std::set< std::string, std::less<> > & cfiFunctionDefs()
static constexpr uint64_t BitcodeSummaryVersion
std::set< std::string, std::less<> > & cfiFunctionDecls()
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.
NamedMDNode * getNamedMetadata(StringRef Name) const
Return the first NamedMDNode in the module with the specified name.
const std::string & getTargetTriple() const
Get the target triple which is a string describing the target host.
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.
void addOperand(MDNode *M)
static 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 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, Instruction *MDFrom=nullptr)
This instruction constructs a fixed permutation of two input vectors.
ArrayRef< int > getShuffleMask() const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
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.
An instruction for storing to memory.
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
constexpr const char * data() const
data - Get a pointer to the start of the string (which may not be null terminated).
Class to represent struct types.
static StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
static StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
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...
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)
Verify that the TBAA Metadatas are valid.
bool visitTBAAMetadata(Instruction &I, const MDNode *MD)
Visit an instruction and return true if it is valid, return false if an invalid TBAA is attached.
@ HasZeroInit
zeroinitializer is valid for this target extension type.
static 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,...
See the file comment for details on the usage of the TrailingObjects type.
TrailingObjects()=default
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
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.
static Type * getHalfTy(LLVMContext &C)
Type * getStructElementType(unsigned N) const
static Type * getDoubleTy(LLVMContext &C)
bool isVectorTy() const
True if this is an instance of VectorType.
bool isArrayTy() const
True if this is an instance of ArrayType.
static Type * getX86_FP80Ty(LLVMContext &C)
bool isLabelTy() const
Return true if this is 'label'.
static Type * getBFloatTy(LLVMContext &C)
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.
static IntegerType * getInt1Ty(LLVMContext &C)
Type * getArrayElementType() const
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
static Type * getX86_AMXTy(LLVMContext &C)
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
static Type * getMetadataTy(LLVMContext &C)
unsigned getStructNumElements() const
uint64_t getArrayNumElements() const
TypeID
Definitions of all of the base types for the Type system.
static Type * getVoidTy(LLVMContext &C)
static Type * getLabelTy(LLVMContext &C)
bool isStructTy() const
True if this is an instance of StructType.
static Type * getFP128Ty(LLVMContext &C)
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.
static Type * getTokenTy(LLVMContext &C)
bool isFunctionTy() const
True if this is an instance of FunctionType.
static IntegerType * getInt32Ty(LLVMContext &C)
static Type * getFloatTy(LLVMContext &C)
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.
static Type * getPPC_FP128Ty(LLVMContext &C)
bool isVoidTy() const
Return true if this is 'void'.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isMetadataTy() const
Return true if this is 'metadata'.
static UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
static UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
void setName(const Twine &Name)
Change the name of the value.
void deleteValue()
Delete a pointer to a generic Value.
static constexpr unsigned MaxAlignmentExponent
The maximum alignment for instructions.
Value & operator=(const Value &)=delete
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 TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
AttributeMask typeIncompatible(Type *Ty, AttributeSet AS, AttributeSafetyKind ASK=ASK_ALL)
Which attributes cannot be applied to a type.
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.
@ MaxID
The highest possible ID. Must be some 2^k - 1.
@ X86_INTR
x86 hardware interrupt context.
@ C
The default llvm calling convention, compatible with C.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
constexpr uint8_t RecordLength
Length of the parts of a physical GOFF record.
AttributeList getAttributes(LLVMContext &C, ID id)
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_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_NO_SANITIZE_COVERAGE
@ 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_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)
Linkage
Describes symbol linkage. This can be used to resolve definition clashes.
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
NodeAddr< FuncNode * > Func
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.
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...
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.
Expected< std::unique_ptr< Module > > parseBitcodeFile(MemoryBufferRef Buffer, LLVMContext &Context, ParserCallbacks Callbacks={})
Read the specified bitcode file, returning the module.
unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
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)
bool stripDebugInfo(Function &F)
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...
bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
void UpgradeAttributes(AttrBuilder &B)
Upgrade attributes that changed format or kind.
Expected< std::string > getBitcodeTargetTriple(MemoryBufferRef Buffer)
Read the header of the specified bitcode buffer and extract just the triple information.
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.
Expected< BitcodeFileContents > getBitcodeFileContents(MemoryBufferRef Buffer)
Returns the contents of a bitcode file.
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...
bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
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.
void UpgradeOperandBundles(std::vector< OperandBundleDef > &OperandBundles)
Upgrade operand bundles (without knowing about their user instruction).
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
Constant * UpgradeBitCastExpr(unsigned Opc, Constant *C, Type *DestTy)
This is an auto-upgrade for bitcast constant expression between pointers with different address space...
Expected< std::unique_ptr< ModuleSummaryIndex > > getModuleSummaryIndex(MemoryBufferRef Buffer)
Parse the specified bitcode buffer, returning the module summary index.
StringMapEntry< Value * > ValueName
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.
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)
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)
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
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.
Expected< std::vector< BitcodeModule > > getBitcodeModuleList(MemoryBufferRef Buffer)
Returns a list of modules in the specified bitcode buffer.
Expected< BitcodeLTOInfo > getBitcodeLTOInfo(MemoryBufferRef Buffer)
Returns LTO information for the specified bitcode file.
GlobalVariable * UpgradeGlobalVariable(GlobalVariable *GV)
This checks for global variables which should be upgraded.
bool StripDebugInfo(Module &M)
Strip debug info in the module if it exists.
AtomicOrdering
Atomic ordering for LLVM's memory model.
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
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)
APInt readWideAPInt(ArrayRef< uint64_t > Vals, unsigned TypeBits)
Error errorCodeToError(std::error_code EC)
Helper for converting an std::error_code to a Error.
bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
void UpgradeFunctionAttributes(Function &F)
Correct any IR that is relying on old function attribute behavior.
Error readModuleSummaryIndex(MemoryBufferRef Buffer, ModuleSummaryIndex &CombinedIndex)
Parse the specified bitcode buffer and merge the index into CombinedIndex.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
void UpgradeARCRuntime(Module &M)
Convert calls to ARC runtime functions to intrinsic calls and upgrade the old retain release marker t...
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,...
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.
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.
Represents the EMUL and EEW of a MachineOperand.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Summary of memprof metadata on allocations.
Basic information extracted from a bitcode module to be used for LTO.
When advancing through a bitstream cursor, each advance can discover a few different kinds of entries...
Class to accumulate and hold information about a callee.
static constexpr unsigned RelBlockFreqBits
The value stored in RelBlockFreq has to be interpreted as the digits of a scaled number with a scale ...
Summary of memprof callsite metadata.
Flags specific to function summaries.
Describes the uses of a parameter by the function.
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.
static constexpr uint32_t RangeWidth
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
Summary of a single MIB in a memprof metadata on allocations.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
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.
A MapVector that performs no allocations if smaller than a certain size.
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
Kind
Specifies which kind of type check we should emit for this byte array.
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
ValID - Represents a reference of a definition of some sort with no type.
Struct that holds a reference to a particular GUID in a global value summary.
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...
std::string SingleImplName