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;
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);
1990 if (Attrs & (1ULL << 21)) {
1991 Attrs &= ~(1ULL << 21);
1998Error BitcodeReader::parseAttributeBlock() {
2002 if (!MAttributes.empty())
2003 return error(
"Invalid multiple blocks");
2016 switch (
Entry.Kind) {
2019 return error(
"Malformed block");
2032 switch (MaybeRecord.
get()) {
2038 return error(
"Invalid parameter attribute record");
2040 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
2051 Attrs.push_back(MAttributeGroups[Val]);
2066 return Attribute::Alignment;
2068 return Attribute::AlwaysInline;
2070 return Attribute::Builtin;
2072 return Attribute::ByVal;
2074 return Attribute::InAlloca;
2076 return Attribute::Cold;
2078 return Attribute::Convergent;
2080 return Attribute::DisableSanitizerInstrumentation;
2082 return Attribute::ElementType;
2084 return Attribute::FnRetThunkExtern;
2086 return Attribute::InlineHint;
2088 return Attribute::InReg;
2090 return Attribute::JumpTable;
2092 return Attribute::Memory;
2094 return Attribute::NoFPClass;
2096 return Attribute::MinSize;
2098 return Attribute::Naked;
2100 return Attribute::Nest;
2102 return Attribute::NoAlias;
2104 return Attribute::NoBuiltin;
2106 return Attribute::NoCallback;
2108 return Attribute::NoDivergenceSource;
2110 return Attribute::NoDuplicate;
2112 return Attribute::NoFree;
2114 return Attribute::NoImplicitFloat;
2116 return Attribute::NoInline;
2118 return Attribute::NoRecurse;
2120 return Attribute::NoMerge;
2122 return Attribute::NonLazyBind;
2124 return Attribute::NonNull;
2126 return Attribute::Dereferenceable;
2128 return Attribute::DereferenceableOrNull;
2130 return Attribute::AllocAlign;
2132 return Attribute::AllocKind;
2134 return Attribute::AllocSize;
2136 return Attribute::AllocatedPointer;
2138 return Attribute::NoRedZone;
2140 return Attribute::NoReturn;
2142 return Attribute::NoSync;
2144 return Attribute::NoCfCheck;
2146 return Attribute::NoProfile;
2148 return Attribute::SkipProfile;
2150 return Attribute::NoUnwind;
2152 return Attribute::NoSanitizeBounds;
2154 return Attribute::NoSanitizeCoverage;
2156 return Attribute::NullPointerIsValid;
2158 return Attribute::OptimizeForDebugging;
2160 return Attribute::OptForFuzzing;
2162 return Attribute::OptimizeForSize;
2164 return Attribute::OptimizeNone;
2166 return Attribute::ReadNone;
2168 return Attribute::ReadOnly;
2170 return Attribute::Returned;
2172 return Attribute::ReturnsTwice;
2174 return Attribute::SExt;
2176 return Attribute::Speculatable;
2178 return Attribute::StackAlignment;
2180 return Attribute::StackProtect;
2182 return Attribute::StackProtectReq;
2184 return Attribute::StackProtectStrong;
2186 return Attribute::SafeStack;
2188 return Attribute::ShadowCallStack;
2190 return Attribute::StrictFP;
2192 return Attribute::StructRet;
2194 return Attribute::SanitizeAddress;
2196 return Attribute::SanitizeHWAddress;
2198 return Attribute::SanitizeThread;
2200 return Attribute::SanitizeType;
2202 return Attribute::SanitizeMemory;
2204 return Attribute::SanitizeNumericalStability;
2206 return Attribute::SanitizeRealtime;
2208 return Attribute::SanitizeRealtimeBlocking;
2210 return Attribute::SpeculativeLoadHardening;
2212 return Attribute::SwiftError;
2214 return Attribute::SwiftSelf;
2216 return Attribute::SwiftAsync;
2218 return Attribute::UWTable;
2220 return Attribute::VScaleRange;
2222 return Attribute::WillReturn;
2224 return Attribute::WriteOnly;
2226 return Attribute::ZExt;
2228 return Attribute::ImmArg;
2230 return Attribute::SanitizeMemTag;
2232 return Attribute::Preallocated;
2234 return Attribute::NoUndef;
2236 return Attribute::ByRef;
2238 return Attribute::MustProgress;
2240 return Attribute::Hot;
2242 return Attribute::PresplitCoroutine;
2244 return Attribute::Writable;
2246 return Attribute::CoroDestroyOnlyWhenComplete;
2248 return Attribute::DeadOnUnwind;
2250 return Attribute::Range;
2252 return Attribute::Initializes;
2254 return Attribute::CoroElideSafe;
2256 return Attribute::NoExt;
2258 return Attribute::Captures;
2267 return error(
"Invalid alignment value");
2275 return error(
"Unknown attribute kind (" +
Twine(Code) +
")");
2280 switch (EncodedKind) {
2304Error BitcodeReader::parseAttributeGroupBlock() {
2308 if (!MAttributeGroups.empty())
2309 return error(
"Invalid multiple blocks");
2320 switch (
Entry.Kind) {
2323 return error(
"Malformed block");
2336 switch (MaybeRecord.
get()) {
2341 return error(
"Invalid grp record");
2348 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2361 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2367 if (Kind == Attribute::ByVal)
2368 B.addByValAttr(
nullptr);
2369 else if (Kind == Attribute::StructRet)
2370 B.addStructRetAttr(
nullptr);
2371 else if (Kind == Attribute::InAlloca)
2372 B.addInAllocaAttr(
nullptr);
2373 else if (Kind == Attribute::UWTable)
2374 B.addUWTableAttr(UWTableKind::Default);
2376 B.addAttribute(Kind);
2378 return error(
"Not an enum attribute");
2379 }
else if (
Record[i] == 1) {
2381 if (
Error Err = parseAttrKind(
Record[++i], &Kind))
2384 return error(
"Not an int attribute");
2385 if (Kind == Attribute::Alignment)
2386 B.addAlignmentAttr(
Record[++i]);
2387 else if (Kind == Attribute::StackAlignment)
2388 B.addStackAlignmentAttr(
Record[++i]);
2389 else if (Kind == Attribute::Dereferenceable)
2390 B.addDereferenceableAttr(
Record[++i]);
2391 else if (Kind == Attribute::DereferenceableOrNull)
2392 B.addDereferenceableOrNullAttr(
Record[++i]);
2393 else if (Kind == Attribute::AllocSize)
2394 B.addAllocSizeAttrFromRawRepr(
Record[++i]);
2395 else if (Kind == Attribute::VScaleRange)
2396 B.addVScaleRangeAttrFromRawRepr(
Record[++i]);
2397 else if (Kind == Attribute::UWTable)
2399 else if (Kind == Attribute::AllocKind)
2401 else if (Kind == Attribute::Memory)
2403 else if (Kind == Attribute::Captures)
2405 else if (Kind == Attribute::NoFPClass)
2413 while (
Record[i] != 0 && i != e)
2415 assert(
Record[i] == 0 &&
"Kind string not null terminated");
2420 while (
Record[i] != 0 && i != e)
2422 assert(
Record[i] == 0 &&
"Value string not null terminated");
2425 B.addAttribute(KindStr.
str(), ValStr.
str());
2427 bool HasType =
Record[i] == 6;
2429 if (
Error Err = parseAttrKind(
Record[++i], &Kind))
2432 return error(
"Not a type attribute");
2434 B.addTypeAttr(Kind, HasType ? getTypeByID(
Record[++i]) :
nullptr);
2435 }
else if (
Record[i] == 7) {
2439 if (
Error Err = parseAttrKind(
Record[i++], &Kind))
2442 return error(
"Not a ConstantRange attribute");
2445 readBitWidthAndConstantRange(
Record, i);
2450 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2451 }
else if (
Record[i] == 8) {
2455 if (
Error Err = parseAttrKind(
Record[i++], &Kind))
2458 return error(
"Not a constant range list attribute");
2462 return error(
"Too few records for constant range list");
2463 unsigned RangeSize =
Record[i++];
2465 for (
unsigned Idx = 0;
Idx < RangeSize; ++
Idx) {
2475 return error(
"Invalid (unordered or overlapping) range list");
2476 B.addConstantRangeListAttr(Kind, Val);
2478 return error(
"Invalid attribute group entry");
2483 B.addMemoryAttr(ME);
2493Error BitcodeReader::parseTypeTable() {
2497 return parseTypeTableBody();
2500Error BitcodeReader::parseTypeTableBody() {
2501 if (!TypeList.empty())
2502 return error(
"Invalid multiple blocks");
2505 unsigned NumRecords = 0;
2516 switch (
Entry.Kind) {
2519 return error(
"Malformed block");
2521 if (NumRecords != TypeList.size())
2522 return error(
"Malformed block");
2531 Type *ResultTy =
nullptr;
2536 switch (MaybeRecord.
get()) {
2538 return error(
"Invalid value");
2543 return error(
"Invalid numentry record");
2544 TypeList.resize(
Record[0]);
2589 return error(
"Invalid integer record");
2594 return error(
"Bitwidth for integer type out of range");
2601 return error(
"Invalid pointer record");
2605 ResultTy = getTypeByID(
Record[0]);
2607 !PointerType::isValidElementType(ResultTy))
2608 return error(
"Invalid type");
2615 return error(
"Invalid opaque pointer record");
2624 return error(
"Invalid function record");
2626 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2633 ResultTy = getTypeByID(
Record[2]);
2634 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2635 return error(
"Invalid type");
2638 ResultTy = FunctionType::get(ResultTy, ArgTys,
Record[0]);
2644 return error(
"Invalid function record");
2646 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2648 if (!FunctionType::isValidArgumentType(
T))
2649 return error(
"Invalid function argument type");
2656 ResultTy = getTypeByID(
Record[1]);
2657 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2658 return error(
"Invalid type");
2661 ResultTy = FunctionType::get(ResultTy, ArgTys,
Record[0]);
2666 return error(
"Invalid anon struct record");
2668 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2675 return error(
"Invalid type");
2682 return error(
"Invalid struct name record");
2687 return error(
"Invalid named struct record");
2689 if (NumRecords >= TypeList.size())
2690 return error(
"Invalid TYPE table");
2693 StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]);
2696 TypeList[NumRecords] =
nullptr;
2698 Res = createIdentifiedStructType(Context, TypeName);
2702 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2709 return error(
"Invalid named struct record");
2718 return error(
"Invalid opaque type record");
2720 if (NumRecords >= TypeList.size())
2721 return error(
"Invalid TYPE table");
2724 StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]);
2727 TypeList[NumRecords] =
nullptr;
2729 Res = createIdentifiedStructType(Context, TypeName);
2736 return error(
"Invalid target extension type record");
2738 if (NumRecords >= TypeList.size())
2739 return error(
"Invalid TYPE table");
2742 return error(
"Too many type parameters");
2744 unsigned NumTys =
Record[0];
2747 for (
unsigned i = 0; i < NumTys; i++) {
2751 return error(
"Invalid type");
2754 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2755 if (
Record[i] > UINT_MAX)
2756 return error(
"Integer parameter too large");
2761 if (
auto E = TTy.takeError())
2769 return error(
"Invalid array type record");
2770 ResultTy = getTypeByID(
Record[1]);
2771 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2772 return error(
"Invalid type");
2774 ResultTy = ArrayType::get(ResultTy,
Record[0]);
2779 return error(
"Invalid vector type record");
2781 return error(
"Invalid vector length");
2782 ResultTy = getTypeByID(
Record[1]);
2783 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2784 return error(
"Invalid type");
2787 ResultTy = VectorType::get(ResultTy,
Record[0], Scalable);
2791 if (NumRecords >= TypeList.size())
2792 return error(
"Invalid TYPE table");
2793 if (TypeList[NumRecords])
2795 "Invalid TYPE table: Only named structs can be forward referenced");
2796 assert(ResultTy &&
"Didn't read a type?");
2797 TypeList[NumRecords] = ResultTy;
2798 if (!ContainedIDs.
empty())
2799 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2804Error BitcodeReader::parseOperandBundleTags() {
2808 if (!BundleTags.empty())
2809 return error(
"Invalid multiple blocks");
2819 switch (
Entry.Kind) {
2822 return error(
"Malformed block");
2836 return error(
"Invalid operand bundle record");
2839 BundleTags.emplace_back();
2841 return error(
"Invalid operand bundle record");
2846Error BitcodeReader::parseSyncScopeNames() {
2851 return error(
"Invalid multiple synchronization scope names blocks");
2860 switch (
Entry.Kind) {
2863 return error(
"Malformed block");
2866 return error(
"Invalid empty synchronization scope names block");
2880 return error(
"Invalid sync scope record");
2884 return error(
"Invalid sync scope record");
2893 unsigned NameIndex,
Triple &TT) {
2896 return error(
"Invalid record");
2897 unsigned ValueID =
Record[0];
2898 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2899 return error(
"Invalid record");
2900 Value *
V = ValueList[ValueID];
2903 if (NameStr.contains(0))
2904 return error(
"Invalid value name");
2905 V->setName(NameStr);
2906 auto *GO = dyn_cast<GlobalObject>(V);
2907 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
2920 return std::move(JumpFailed);
2926 return error(
"Expected value symbol table subblock");
2930void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
2937 uint64_t FuncBitOffset = FuncWordOffset * 32;
2938 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
2942 if (FuncBitOffset > LastFunctionBlockBit)
2943 LastFunctionBlockBit = FuncBitOffset;
2947Error BitcodeReader::parseGlobalValueSymbolTable() {
2948 unsigned FuncBitcodeOffsetDelta =
2961 switch (
Entry.Kind) {
2964 return error(
"Malformed block");
2975 switch (MaybeRecord.
get()) {
2977 unsigned ValueID =
Record[0];
2978 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2979 return error(
"Invalid value reference in symbol table");
2980 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
2981 cast<Function>(ValueList[ValueID]),
Record);
2997 if (!MaybeCurrentBit)
2999 CurrentBit = MaybeCurrentBit.
get();
3002 if (
Error Err = parseGlobalValueSymbolTable())
3004 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
3023 unsigned FuncBitcodeOffsetDelta =
3042 switch (
Entry.Kind) {
3045 return error(
"Malformed block");
3048 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
3061 switch (MaybeRecord.
get()) {
3080 if (
auto *
F = dyn_cast<Function>(V))
3081 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F,
Record);
3086 return error(
"Invalid bbentry record");
3089 return error(
"Invalid bbentry record");
3111Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3112 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3113 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3114 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3116 GlobalInitWorklist.swap(GlobalInits);
3117 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3118 FunctionOperandWorklist.swap(FunctionOperands);
3120 while (!GlobalInitWorklist.empty()) {
3121 unsigned ValID = GlobalInitWorklist.back().second;
3124 GlobalInits.push_back(GlobalInitWorklist.back());
3129 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3131 GlobalInitWorklist.pop_back();
3134 while (!IndirectSymbolInitWorklist.empty()) {
3135 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3137 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3143 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3144 if (
auto *GA = dyn_cast<GlobalAlias>(GV)) {
3146 return error(
"Alias and aliasee types don't match");
3148 }
else if (
auto *GI = dyn_cast<GlobalIFunc>(GV)) {
3151 return error(
"Expected an alias or an ifunc");
3154 IndirectSymbolInitWorklist.pop_back();
3157 while (!FunctionOperandWorklist.empty()) {
3158 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3159 if (
Info.PersonalityFn) {
3160 unsigned ValID =
Info.PersonalityFn - 1;
3165 Info.F->setPersonalityFn(MaybeC.
get());
3166 Info.PersonalityFn = 0;
3175 Info.F->setPrefixData(MaybeC.
get());
3179 if (
Info.Prologue) {
3185 Info.F->setPrologueData(MaybeC.
get());
3189 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3190 FunctionOperands.push_back(Info);
3191 FunctionOperandWorklist.pop_back();
3200 BitcodeReader::decodeSignRotatedValue);
3202 return APInt(TypeBits, Words);
3205Error BitcodeReader::parseConstants() {
3213 unsigned Int32TyID = getVirtualTypeID(CurTy);
3214 unsigned CurTyID = Int32TyID;
3215 Type *CurElemTy =
nullptr;
3216 unsigned NextCstNo = ValueList.
size();
3224 switch (Entry.Kind) {
3227 return error(
"Malformed block");
3229 if (NextCstNo != ValueList.
size())
3230 return error(
"Invalid constant reference");
3244 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3254 return error(
"Invalid settype record");
3255 if (
Record[0] >= TypeList.size() || !TypeList[
Record[0]])
3256 return error(
"Invalid settype record");
3257 if (TypeList[
Record[0]] == VoidType)
3258 return error(
"Invalid constant type");
3260 CurTy = TypeList[CurTyID];
3261 CurElemTy = getPtrElementTypeByID(CurTyID);
3265 return error(
"Invalid type for a constant null value");
3266 if (
auto *TETy = dyn_cast<TargetExtType>(CurTy))
3268 return error(
"Invalid type for a constant null value");
3273 return error(
"Invalid integer const record");
3278 return error(
"Invalid wide integer const record");
3282 V = ConstantInt::get(CurTy, VInt);
3287 return error(
"Invalid float const record");
3290 if (ScalarTy->isHalfTy())
3291 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3293 else if (ScalarTy->isBFloatTy())
3294 V = ConstantFP::get(
3296 else if (ScalarTy->isFloatTy())
3297 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3299 else if (ScalarTy->isDoubleTy())
3300 V = ConstantFP::get(
3302 else if (ScalarTy->isX86_FP80Ty()) {
3305 Rearrange[0] = (
Record[1] & 0xffffLL) | (
Record[0] << 16);
3306 Rearrange[1] =
Record[0] >> 48;
3307 V = ConstantFP::get(
3308 CurTy,
APFloat(APFloat::x87DoubleExtended(),
APInt(80, Rearrange)));
3309 }
else if (ScalarTy->isFP128Ty())
3310 V = ConstantFP::get(CurTy,
3312 else if (ScalarTy->isPPC_FP128Ty())
3313 V = ConstantFP::get(
3322 return error(
"Invalid aggregate record");
3326 for (
unsigned i = 0; i !=
Size; ++i)
3329 if (isa<StructType>(CurTy)) {
3330 V = BitcodeConstant::create(
3331 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3332 }
else if (isa<ArrayType>(CurTy)) {
3333 V = BitcodeConstant::create(Alloc, CurTy,
3334 BitcodeConstant::ConstantArrayOpcode, Elts);
3335 }
else if (isa<VectorType>(CurTy)) {
3336 V = BitcodeConstant::create(
3337 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3346 return error(
"Invalid string record");
3355 return error(
"Invalid data record");
3358 if (
auto *Array = dyn_cast<ArrayType>(CurTy))
3359 EltTy =
Array->getElementType();
3361 EltTy = cast<VectorType>(CurTy)->getElementType();
3364 if (isa<VectorType>(CurTy))
3370 if (isa<VectorType>(CurTy))
3376 if (isa<VectorType>(CurTy))
3382 if (isa<VectorType>(CurTy))
3388 if (isa<VectorType>(CurTy))
3394 if (isa<VectorType>(CurTy))
3400 if (isa<VectorType>(CurTy))
3406 if (isa<VectorType>(CurTy))
3411 return error(
"Invalid type for value");
3417 return error(
"Invalid unary op constexpr record");
3422 V = BitcodeConstant::create(Alloc, CurTy, Opc, (
unsigned)
Record[1]);
3428 return error(
"Invalid binary op constexpr record");
3434 if (
Record.size() >= 4) {
3435 if (Opc == Instruction::Add ||
3436 Opc == Instruction::Sub ||
3437 Opc == Instruction::Mul ||
3438 Opc == Instruction::Shl) {
3443 }
else if (Opc == Instruction::SDiv ||
3444 Opc == Instruction::UDiv ||
3445 Opc == Instruction::LShr ||
3446 Opc == Instruction::AShr) {
3451 V = BitcodeConstant::create(Alloc, CurTy, {(
uint8_t)Opc, Flags},
3458 return error(
"Invalid cast constexpr record");
3463 unsigned OpTyID =
Record[1];
3464 Type *OpTy = getTypeByID(OpTyID);
3466 return error(
"Invalid cast constexpr record");
3467 V = BitcodeConstant::create(Alloc, CurTy, Opc, (
unsigned)
Record[2]);
3479 return error(
"Constant GEP record must have at least two elements");
3481 Type *PointeeType =
nullptr;
3485 PointeeType = getTypeByID(
Record[OpNum++]);
3488 std::optional<ConstantRange>
InRange;
3492 unsigned InRangeIndex =
Op >> 1;
3499 readBitWidthAndConstantRange(
Record, OpNum);
3509 unsigned BaseTypeID =
Record[OpNum];
3510 while (OpNum !=
Record.size()) {
3511 unsigned ElTyID =
Record[OpNum++];
3512 Type *ElTy = getTypeByID(ElTyID);
3514 return error(
"Invalid getelementptr constexpr record");
3518 if (Elts.
size() < 1)
3519 return error(
"Invalid gep with no operands");
3523 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3524 BaseType = getTypeByID(BaseTypeID);
3529 return error(
"GEP base operand must be pointer or vector of pointer");
3532 PointeeType = getPtrElementTypeByID(BaseTypeID);
3534 return error(
"Missing element type for old-style constant GEP");
3537 V = BitcodeConstant::create(
3539 {Instruction::GetElementPtr,
uint8_t(Flags), PointeeType,
InRange},
3545 return error(
"Invalid select constexpr record");
3547 V = BitcodeConstant::create(
3548 Alloc, CurTy, Instruction::Select,
3555 return error(
"Invalid extractelement constexpr record");
3556 unsigned OpTyID =
Record[0];
3558 dyn_cast_or_null<VectorType>(getTypeByID(OpTyID));
3560 return error(
"Invalid extractelement constexpr record");
3562 if (
Record.size() == 4) {
3563 unsigned IdxTyID =
Record[2];
3564 Type *IdxTy = getTypeByID(IdxTyID);
3566 return error(
"Invalid extractelement constexpr record");
3572 V = BitcodeConstant::create(Alloc, CurTy, Instruction::ExtractElement,
3578 VectorType *OpTy = dyn_cast<VectorType>(CurTy);
3579 if (
Record.size() < 3 || !OpTy)
3580 return error(
"Invalid insertelement constexpr record");
3582 if (
Record.size() == 4) {
3583 unsigned IdxTyID =
Record[2];
3584 Type *IdxTy = getTypeByID(IdxTyID);
3586 return error(
"Invalid insertelement constexpr record");
3592 V = BitcodeConstant::create(
3593 Alloc, CurTy, Instruction::InsertElement,
3598 VectorType *OpTy = dyn_cast<VectorType>(CurTy);
3599 if (
Record.size() < 3 || !OpTy)
3600 return error(
"Invalid shufflevector constexpr record");
3601 V = BitcodeConstant::create(
3602 Alloc, CurTy, Instruction::ShuffleVector,
3607 VectorType *RTy = dyn_cast<VectorType>(CurTy);
3609 dyn_cast_or_null<VectorType>(getTypeByID(
Record[0]));
3610 if (
Record.size() < 4 || !RTy || !OpTy)
3611 return error(
"Invalid shufflevector constexpr record");
3612 V = BitcodeConstant::create(
3613 Alloc, CurTy, Instruction::ShuffleVector,
3619 return error(
"Invalid cmp constexpt record");
3620 unsigned OpTyID =
Record[0];
3621 Type *OpTy = getTypeByID(OpTyID);
3623 return error(
"Invalid cmp constexpr record");
3624 V = BitcodeConstant::create(
3627 : Instruction::ICmp),
3636 return error(
"Invalid inlineasm record");
3637 std::string AsmStr, ConstrStr;
3638 bool HasSideEffects =
Record[0] & 1;
3639 bool IsAlignStack =
Record[0] >> 1;
3640 unsigned AsmStrSize =
Record[1];
3641 if (2+AsmStrSize >=
Record.size())
3642 return error(
"Invalid inlineasm record");
3643 unsigned ConstStrSize =
Record[2+AsmStrSize];
3644 if (3+AsmStrSize+ConstStrSize >
Record.size())
3645 return error(
"Invalid inlineasm record");
3647 for (
unsigned i = 0; i != AsmStrSize; ++i)
3648 AsmStr += (
char)
Record[2+i];
3649 for (
unsigned i = 0; i != ConstStrSize; ++i)
3650 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3653 return error(
"Missing element type for old-style inlineasm");
3655 HasSideEffects, IsAlignStack);
3662 return error(
"Invalid inlineasm record");
3663 std::string AsmStr, ConstrStr;
3664 bool HasSideEffects =
Record[0] & 1;
3665 bool IsAlignStack = (
Record[0] >> 1) & 1;
3666 unsigned AsmDialect =
Record[0] >> 2;
3667 unsigned AsmStrSize =
Record[1];
3668 if (2+AsmStrSize >=
Record.size())
3669 return error(
"Invalid inlineasm record");
3670 unsigned ConstStrSize =
Record[2+AsmStrSize];
3671 if (3+AsmStrSize+ConstStrSize >
Record.size())
3672 return error(
"Invalid inlineasm record");
3674 for (
unsigned i = 0; i != AsmStrSize; ++i)
3675 AsmStr += (
char)
Record[2+i];
3676 for (
unsigned i = 0; i != ConstStrSize; ++i)
3677 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3680 return error(
"Missing element type for old-style inlineasm");
3682 HasSideEffects, IsAlignStack,
3689 return error(
"Invalid inlineasm record");
3691 std::string AsmStr, ConstrStr;
3692 bool HasSideEffects =
Record[OpNum] & 1;
3693 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3694 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3695 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3697 unsigned AsmStrSize =
Record[OpNum];
3699 if (OpNum + AsmStrSize >=
Record.size())
3700 return error(
"Invalid inlineasm record");
3701 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3702 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3703 return error(
"Invalid inlineasm record");
3705 for (
unsigned i = 0; i != AsmStrSize; ++i)
3706 AsmStr += (
char)
Record[OpNum + i];
3708 for (
unsigned i = 0; i != ConstStrSize; ++i)
3709 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3712 return error(
"Missing element type for old-style inlineasm");
3714 HasSideEffects, IsAlignStack,
3721 return error(
"Invalid inlineasm record");
3723 auto *FnTy = dyn_cast_or_null<FunctionType>(getTypeByID(
Record[OpNum]));
3726 return error(
"Invalid inlineasm record");
3727 std::string AsmStr, ConstrStr;
3728 bool HasSideEffects =
Record[OpNum] & 1;
3729 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3730 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3731 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3733 unsigned AsmStrSize =
Record[OpNum];
3735 if (OpNum + AsmStrSize >=
Record.size())
3736 return error(
"Invalid inlineasm record");
3737 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3738 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3739 return error(
"Invalid inlineasm record");
3741 for (
unsigned i = 0; i != AsmStrSize; ++i)
3742 AsmStr += (
char)
Record[OpNum + i];
3744 for (
unsigned i = 0; i != ConstStrSize; ++i)
3745 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3747 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3753 return error(
"Invalid blockaddress record");
3754 unsigned FnTyID =
Record[0];
3755 Type *FnTy = getTypeByID(FnTyID);
3757 return error(
"Invalid blockaddress record");
3758 V = BitcodeConstant::create(
3766 return error(
"Invalid dso_local record");
3767 unsigned GVTyID =
Record[0];
3768 Type *GVTy = getTypeByID(GVTyID);
3770 return error(
"Invalid dso_local record");
3771 V = BitcodeConstant::create(
3772 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode,
Record[1]);
3777 return error(
"Invalid no_cfi record");
3778 unsigned GVTyID =
Record[0];
3779 Type *GVTy = getTypeByID(GVTyID);
3781 return error(
"Invalid no_cfi record");
3782 V = BitcodeConstant::create(Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3788 return error(
"Invalid ptrauth record");
3790 V = BitcodeConstant::create(Alloc, CurTy,
3791 BitcodeConstant::ConstantPtrAuthOpcode,
3798 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3805Error BitcodeReader::parseUseLists() {
3818 switch (
Entry.Kind) {
3821 return error(
"Malformed block");
3835 switch (MaybeRecord.
get()) {
3843 if (RecordLength < 3)
3845 return error(
"Invalid record");
3846 unsigned ID =
Record.pop_back_val();
3850 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3851 V = FunctionBBs[
ID];
3854 unsigned NumUses = 0;
3856 for (
const Use &U :
V->materialized_uses()) {
3857 if (++NumUses >
Record.size())
3859 Order[&
U] =
Record[NumUses - 1];
3866 V->sortUseList([&](
const Use &L,
const Use &R) {
3877Error BitcodeReader::rememberAndSkipMetadata() {
3879 uint64_t CurBit = Stream.GetCurrentBitNo();
3880 DeferredMetadataInfo.push_back(CurBit);
3883 if (
Error Err = Stream.SkipBlock())
3888Error BitcodeReader::materializeMetadata() {
3889 for (
uint64_t BitPos : DeferredMetadataInfo) {
3891 if (
Error JumpFailed = Stream.JumpToBit(BitPos))
3893 if (
Error Err = MDLoader->parseModuleMetadata())
3904 for (
const MDOperand &MDOptions : cast<MDNode>(Val)->operands())
3905 LinkerOpts->
addOperand(cast<MDNode>(MDOptions));
3909 DeferredMetadataInfo.clear();
3913void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
3917Error BitcodeReader::rememberAndSkipFunctionBody() {
3919 if (FunctionsWithBodies.empty())
3920 return error(
"Insufficient function protos");
3923 FunctionsWithBodies.pop_back();
3926 uint64_t CurBit = Stream.GetCurrentBitNo();
3928 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
3929 "Mismatch between VST and scanned function offsets");
3930 DeferredFunctionInfo[Fn] = CurBit;
3933 if (
Error Err = Stream.SkipBlock())
3938Error BitcodeReader::globalCleanup() {
3940 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
3942 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
3943 return error(
"Malformed global initializer set");
3948 MDLoader->upgradeDebugIntrinsics(
F);
3955 UpgradedIntrinsics[&
F] = NewFn;
3961 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
3964 UpgradedVariables.emplace_back(&GV, Upgraded);
3965 for (
auto &Pair : UpgradedVariables) {
3966 Pair.first->eraseFromParent();
3967 TheModule->insertGlobalVariable(Pair.second);
3972 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
3973 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
3981Error BitcodeReader::rememberAndSkipFunctionBodies() {
3982 if (
Error JumpFailed = Stream.JumpToBit(NextUnreadBit))
3985 if (Stream.AtEndOfStream())
3986 return error(
"Could not find function in stream");
3988 if (!SeenFirstFunctionBody)
3989 return error(
"Trying to materialize functions before seeing function blocks");
3993 assert(SeenValueSymbolTable);
4003 switch (
Entry.Kind) {
4005 return error(
"Expect SubBlock");
4009 return error(
"Expect function block");
4011 if (
Error Err = rememberAndSkipFunctionBody())
4013 NextUnreadBit = Stream.GetCurrentBitNo();
4020Error BitcodeReaderBase::readBlockInfo() {
4022 Stream.ReadBlockInfoBlock();
4023 if (!MaybeNewBlockInfo)
4025 std::optional<BitstreamBlockInfo> NewBlockInfo =
4026 std::move(MaybeNewBlockInfo.
get());
4028 return error(
"Malformed block");
4029 BlockInfo = std::move(*NewBlockInfo);
4040 return error(
"Invalid record");
4042 std::string OldFormatName;
4045 return error(
"Invalid record");
4046 unsigned ComdatNameSize =
Record[1];
4047 if (ComdatNameSize >
Record.size() - 2)
4048 return error(
"Comdat name size too large");
4049 OldFormatName.reserve(ComdatNameSize);
4050 for (
unsigned i = 0; i != ComdatNameSize; ++i)
4051 OldFormatName += (
char)
Record[2 + i];
4052 Name = OldFormatName;
4055 C->setSelectionKind(SK);
4056 ComdatList.push_back(
C);
4070 Meta.NoAddress =
true;
4072 Meta.NoHWAddress =
true;
4076 Meta.IsDynInit =
true;
4091 return error(
"Invalid record");
4092 unsigned TyID =
Record[0];
4093 Type *Ty = getTypeByID(TyID);
4095 return error(
"Invalid record");
4097 bool explicitType =
Record[1] & 2;
4103 return error(
"Invalid type for value");
4104 AddressSpace = cast<PointerType>(Ty)->getAddressSpace();
4105 TyID = getContainedTypeID(TyID);
4106 Ty = getTypeByID(TyID);
4108 return error(
"Missing element type for old-style global");
4114 if (
Error Err = parseAlignmentValue(
Record[4], Alignment))
4118 if (
Record[5] - 1 >= SectionTable.size())
4119 return error(
"Invalid ID");
4136 bool ExternallyInitialized =
false;
4138 ExternallyInitialized =
Record[9];
4150 if (
Record.size() > 10) {
4162 if (
unsigned InitID =
Record[2])
4163 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4165 if (
Record.size() > 11) {
4166 if (
unsigned ComdatID =
Record[11]) {
4167 if (ComdatID > ComdatList.size())
4168 return error(
"Invalid global variable comdat ID");
4169 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4172 ImplicitComdatObjects.
insert(NewGV);
4175 if (
Record.size() > 12) {
4180 if (
Record.size() > 13) {
4199 return error(
"Invalid global variable code model");
4205void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4206 if (ValueTypeCallback) {
4207 (*ValueTypeCallback)(
4208 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4209 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4222 return error(
"Invalid record");
4223 unsigned FTyID =
Record[0];
4224 Type *FTy = getTypeByID(FTyID);
4226 return error(
"Invalid record");
4227 if (isa<PointerType>(FTy)) {
4228 FTyID = getContainedTypeID(FTyID, 0);
4229 FTy = getTypeByID(FTyID);
4231 return error(
"Missing element type for old-style function");
4234 if (!isa<FunctionType>(FTy))
4235 return error(
"Invalid type for value");
4238 return error(
"Invalid calling convention ID");
4240 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4246 AddrSpace,
Name, TheModule);
4249 "Incorrect fully specified type provided for function");
4250 FunctionTypeIDs[
Func] = FTyID;
4252 Func->setCallingConv(
CC);
4253 bool isProto =
Record[2];
4257 callValueTypeCallback(Func, FTyID);
4262 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4264 Attribute::InAlloca}) {
4265 if (!
Func->hasParamAttribute(i, Kind))
4268 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4271 Func->removeParamAttr(i, Kind);
4273 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4274 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4276 return error(
"Missing param element type for attribute upgrade");
4280 case Attribute::ByVal:
4283 case Attribute::StructRet:
4286 case Attribute::InAlloca:
4293 Func->addParamAttr(i, NewAttr);
4298 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4299 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4300 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4302 return error(
"Missing param element type for x86_intrcc upgrade");
4304 Func->addParamAttr(0, NewAttr);
4308 if (
Error Err = parseAlignmentValue(
Record[5], Alignment))
4311 Func->setAlignment(*Alignment);
4313 if (
Record[6] - 1 >= SectionTable.size())
4314 return error(
"Invalid ID");
4315 Func->setSection(SectionTable[
Record[6] - 1]);
4319 if (!
Func->hasLocalLinkage())
4322 if (
Record[8] - 1 >= GCTable.size())
4323 return error(
"Invalid ID");
4329 Func->setUnnamedAddr(UnnamedAddr);
4335 if (
Record.size() > 11) {
4337 if (!
Func->hasLocalLinkage()) {
4344 if (
Record.size() > 12) {
4345 if (
unsigned ComdatID =
Record[12]) {
4346 if (ComdatID > ComdatList.size())
4347 return error(
"Invalid function comdat ID");
4348 Func->setComdat(ComdatList[ComdatID - 1]);
4351 ImplicitComdatObjects.
insert(Func);
4360 if (
Record.size() > 15) {
4369 if (
Record.size() > 18 && Strtab.data() &&
4374 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4382 Func->setIsMaterializable(
true);
4383 FunctionsWithBodies.push_back(Func);
4384 DeferredFunctionInfo[
Func] = 0;
4389Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4403 if (
Record.size() < (3 + (
unsigned)NewRecord))
4404 return error(
"Invalid record");
4409 return error(
"Invalid record");
4413 auto *PTy = dyn_cast<PointerType>(Ty);
4415 return error(
"Invalid type for value");
4416 AddrSpace = PTy->getAddressSpace();
4418 Ty = getTypeByID(
TypeID);
4420 return error(
"Missing element type for old-style indirect symbol");
4422 AddrSpace =
Record[OpNum++];
4425 auto Val =
Record[OpNum++];
4434 nullptr, TheModule);
4438 if (OpNum !=
Record.size()) {
4439 auto VisInd = OpNum++;
4445 if (OpNum !=
Record.size()) {
4446 auto S =
Record[OpNum++];
4453 if (OpNum !=
Record.size())
4455 if (OpNum !=
Record.size())
4458 if (OpNum !=
Record.size())
4463 if (OpNum + 1 <
Record.size()) {
4466 return error(
"Malformed partition, too large.");
4472 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4477 bool ShouldLazyLoadMetadata,
4483 TheModule->IsNewDbgInfoFormat =
4488 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4490 if (
Error JumpFailed = Stream.JumpToBit(ResumeBit))
4499 bool ResolvedDataLayout =
false;
4504 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4506 auto ResolveDataLayout = [&]() ->
Error {
4507 if (ResolvedDataLayout)
4511 ResolvedDataLayout =
true;
4515 TentativeDataLayoutStr, TheModule->getTargetTriple());
4519 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4520 TheModule->getTargetTriple(), TentativeDataLayoutStr))
4521 TentativeDataLayoutStr = *LayoutOverride;
4529 TheModule->setDataLayout(MaybeDL.
get());
4540 switch (
Entry.Kind) {
4542 return error(
"Malformed block");
4544 if (
Error Err = ResolveDataLayout())
4546 return globalCleanup();
4551 if (
Error Err = Stream.SkipBlock())
4555 if (
Error Err = readBlockInfo())
4559 if (
Error Err = parseAttributeBlock())
4563 if (
Error Err = parseAttributeGroupBlock())
4567 if (
Error Err = parseTypeTable())
4571 if (!SeenValueSymbolTable) {
4577 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4578 if (
Error Err = parseValueSymbolTable())
4580 SeenValueSymbolTable =
true;
4585 if (
Error Err = Stream.SkipBlock())
4590 if (
Error Err = parseConstants())
4592 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4596 if (ShouldLazyLoadMetadata) {
4597 if (
Error Err = rememberAndSkipMetadata())
4601 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4602 if (
Error Err = MDLoader->parseModuleMetadata())
4606 if (
Error Err = MDLoader->parseMetadataKinds())
4610 if (
Error Err = ResolveDataLayout())
4615 if (!SeenFirstFunctionBody) {
4616 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4617 if (
Error Err = globalCleanup())
4619 SeenFirstFunctionBody =
true;
4622 if (VSTOffset > 0) {
4626 if (!SeenValueSymbolTable) {
4627 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4629 SeenValueSymbolTable =
true;
4641 if (
Error Err = Stream.SkipBlock())
4651 if (
Error Err = rememberAndSkipFunctionBody())
4658 if (SeenValueSymbolTable) {
4659 NextUnreadBit = Stream.GetCurrentBitNo();
4662 return globalCleanup();
4666 if (
Error Err = parseUseLists())
4670 if (
Error Err = parseOperandBundleTags())
4674 if (
Error Err = parseSyncScopeNames())
4689 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4695 UseRelativeIDs = *VersionOrErr >= 1;
4699 if (ResolvedDataLayout)
4700 return error(
"target triple too late in module");
4703 return error(
"Invalid record");
4704 TheModule->setTargetTriple(S);
4708 if (ResolvedDataLayout)
4709 return error(
"datalayout too late in module");
4711 return error(
"Invalid record");
4717 return error(
"Invalid record");
4718 TheModule->setModuleInlineAsm(S);
4725 return error(
"Invalid record");
4732 return error(
"Invalid record");
4733 SectionTable.push_back(S);
4739 return error(
"Invalid record");
4740 GCTable.push_back(S);
4757 if (
Error Err = ResolveDataLayout())
4765 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode,
Record))
4771 return error(
"Invalid record");
4775 VSTOffset =
Record[0] - 1;
4781 return error(
"Invalid record");
4782 TheModule->setSourceFileName(
ValueName);
4787 this->ValueTypeCallback = std::nullopt;
4791Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4796 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4798 return getContainedTypeID(
I, J);
4801 MDLoader =
MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4802 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4805Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4806 if (!isa<PointerType>(PtrType))
4807 return error(
"Load/Store operand is not a pointer type");
4808 if (!PointerType::isLoadableOrStorableType(ValType))
4809 return error(
"Cannot load/store from pointer");
4816 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4818 Attribute::InAlloca}) {
4819 if (!
Attrs.hasParamAttr(i, Kind) ||
4820 Attrs.getParamAttr(i, Kind).getValueAsType())
4823 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4825 return error(
"Missing element type for typed attribute upgrade");
4829 case Attribute::ByVal:
4832 case Attribute::StructRet:
4835 case Attribute::InAlloca:
4842 Attrs =
Attrs.addParamAttribute(Context, i, NewAttr);
4853 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
4854 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4856 return error(
"Missing element type for inline asm upgrade");
4867 case Intrinsic::preserve_array_access_index:
4868 case Intrinsic::preserve_struct_access_index:
4869 case Intrinsic::aarch64_ldaxr:
4870 case Intrinsic::aarch64_ldxr:
4871 case Intrinsic::aarch64_stlxr:
4872 case Intrinsic::aarch64_stxr:
4873 case Intrinsic::arm_ldaex:
4874 case Intrinsic::arm_ldrex:
4875 case Intrinsic::arm_stlex:
4876 case Intrinsic::arm_strex: {
4879 case Intrinsic::aarch64_stlxr:
4880 case Intrinsic::aarch64_stxr:
4881 case Intrinsic::arm_stlex:
4882 case Intrinsic::arm_strex:
4889 if (!
Attrs.getParamElementType(ArgNo)) {
4890 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4892 return error(
"Missing element type for elementtype upgrade");
4894 Attrs =
Attrs.addParamAttribute(Context, ArgNo, NewAttr);
4912 if (MDLoader->hasFwdRefs())
4913 return error(
"Invalid function metadata: incoming forward references");
4915 InstructionList.
clear();
4916 unsigned ModuleValueListSize = ValueList.
size();
4917 unsigned ModuleMDLoaderSize = MDLoader->size();
4921 unsigned FTyID = FunctionTypeIDs[
F];
4923 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
4924 assert(
I.getType() == getTypeByID(ArgTyID) &&
4925 "Incorrect fully specified type for Function Argument");
4929 unsigned NextValueNo = ValueList.
size();
4931 unsigned CurBBNo = 0;
4940 auto getLastInstruction = [&]() ->
Instruction * {
4941 if (CurBB && !CurBB->
empty())
4942 return &CurBB->
back();
4943 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
4944 !FunctionBBs[CurBBNo - 1]->empty())
4945 return &FunctionBBs[CurBBNo - 1]->back();
4949 std::vector<OperandBundleDef> OperandBundles;
4960 switch (
Entry.Kind) {
4962 return error(
"Malformed block");
4964 goto OutOfRecordLoop;
4969 if (
Error Err = Stream.SkipBlock())
4973 if (
Error Err = parseConstants())
4975 NextValueNo = ValueList.
size();
4978 if (
Error Err = parseValueSymbolTable())
4982 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
4986 assert(DeferredMetadataInfo.empty() &&
4987 "Must read all module-level metadata before function-level");
4988 if (
Error Err = MDLoader->parseFunctionMetadata())
4992 if (
Error Err = parseUseLists())
5006 unsigned ResTypeID = InvalidTypeID;
5010 switch (
unsigned BitCode = MaybeBitCode.
get()) {
5012 return error(
"Invalid value");
5015 return error(
"Invalid record");
5017 FunctionBBs.resize(
Record[0]);
5020 auto BBFRI = BasicBlockFwdRefs.
find(
F);
5021 if (BBFRI == BasicBlockFwdRefs.
end()) {
5025 auto &BBRefs = BBFRI->second;
5027 if (BBRefs.size() > FunctionBBs.size())
5028 return error(
"Invalid ID");
5029 assert(!BBRefs.empty() &&
"Unexpected empty array");
5030 assert(!BBRefs.front() &&
"Invalid reference to entry block");
5031 for (
unsigned I = 0, E = FunctionBBs.size(), RE = BBRefs.size();
I != E;
5033 if (
I < RE && BBRefs[
I]) {
5034 BBRefs[
I]->insertInto(
F);
5035 FunctionBBs[
I] = BBRefs[
I];
5041 BasicBlockFwdRefs.
erase(BBFRI);
5044 CurBB = FunctionBBs[0];
5051 return error(
"Invalid record");
5066 if (
auto *
F = dyn_cast<Function>(ValueList[
ValID]))
5067 BackwardRefFunctions.push_back(
F);
5069 return error(
"Invalid record");
5076 I = getLastInstruction();
5079 return error(
"Invalid record");
5080 I->setDebugLoc(LastLoc);
5085 I = getLastInstruction();
5087 return error(
"Invalid record");
5095 Scope = dyn_cast_or_null<MDNode>(
5096 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5098 return error(
"Invalid record");
5101 IA = dyn_cast_or_null<MDNode>(
5102 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5104 return error(
"Invalid record");
5106 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5108 I->setDebugLoc(LastLoc);
5116 if (getValueTypePair(
Record, OpNum, NextValueNo, LHS,
TypeID, CurBB) ||
5118 return error(
"Invalid record");
5122 return error(
"Invalid record");
5126 if (OpNum <
Record.size()) {
5127 if (isa<FPMathOperator>(
I)) {
5130 I->setFastMathFlags(FMF);
5139 if (getValueTypePair(
Record, OpNum, NextValueNo, LHS,
TypeID, CurBB) ||
5143 return error(
"Invalid record");
5147 return error(
"Invalid record");
5151 if (OpNum <
Record.size()) {
5152 if (Opc == Instruction::Add ||
5153 Opc == Instruction::Sub ||
5154 Opc == Instruction::Mul ||
5155 Opc == Instruction::Shl) {
5157 cast<BinaryOperator>(
I)->setHasNoSignedWrap(
true);
5159 cast<BinaryOperator>(
I)->setHasNoUnsignedWrap(
true);
5160 }
else if (Opc == Instruction::SDiv ||
5161 Opc == Instruction::UDiv ||
5162 Opc == Instruction::LShr ||
5163 Opc == Instruction::AShr) {
5165 cast<BinaryOperator>(
I)->setIsExact(
true);
5166 }
else if (Opc == Instruction::Or) {
5168 cast<PossiblyDisjointInst>(
I)->setIsDisjoint(
true);
5169 }
else if (isa<FPMathOperator>(
I)) {
5172 I->setFastMathFlags(FMF);
5181 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5182 OpNum + 1 >
Record.size())
5183 return error(
"Invalid record");
5185 ResTypeID =
Record[OpNum++];
5186 Type *ResTy = getTypeByID(ResTypeID);
5189 if (Opc == -1 || !ResTy)
5190 return error(
"Invalid record");
5195 assert(CurBB &&
"No current BB?");
5201 return error(
"Invalid cast");
5205 if (OpNum <
Record.size()) {
5206 if (Opc == Instruction::ZExt || Opc == Instruction::UIToFP) {
5208 cast<PossiblyNonNegInst>(
I)->setNonNeg(
true);
5209 }
else if (Opc == Instruction::Trunc) {
5211 cast<TruncInst>(
I)->setHasNoUnsignedWrap(
true);
5213 cast<TruncInst>(
I)->setHasNoSignedWrap(
true);
5215 if (isa<FPMathOperator>(
I)) {
5218 I->setFastMathFlags(FMF);
5237 Ty = getTypeByID(TyID);
5241 TyID = InvalidTypeID;
5246 unsigned BasePtrTypeID;
5247 if (getValueTypePair(
Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5249 return error(
"Invalid record");
5252 TyID = getContainedTypeID(BasePtrTypeID);
5253 if (
BasePtr->getType()->isVectorTy())
5254 TyID = getContainedTypeID(TyID);
5255 Ty = getTypeByID(TyID);
5259 while (OpNum !=
Record.size()) {
5262 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5263 return error(
"Invalid record");
5271 if (cast<GEPOperator>(
I)->getNumIndices() != 0) {
5274 unsigned SubType = 0;
5275 if (GTI.isStruct()) {
5277 Idx->getType()->isVectorTy()
5282 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5289 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5290 if (
I->getType()->isVectorTy())
5291 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5294 GEP->setNoWrapFlags(NW);
5303 if (getValueTypePair(
Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5304 return error(
"Invalid record");
5307 unsigned RecSize =
Record.size();
5308 if (OpNum == RecSize)
5309 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5312 ResTypeID = AggTypeID;
5313 for (; OpNum != RecSize; ++OpNum) {
5318 if (!IsStruct && !IsArray)
5319 return error(
"EXTRACTVAL: Invalid type");
5320 if ((
unsigned)Index != Index)
5321 return error(
"Invalid value");
5323 return error(
"EXTRACTVAL: Invalid struct index");
5325 return error(
"EXTRACTVAL: Invalid array index");
5326 EXTRACTVALIdx.
push_back((
unsigned)Index);
5330 ResTypeID = getContainedTypeID(ResTypeID, Index);
5333 ResTypeID = getContainedTypeID(ResTypeID);
5347 if (getValueTypePair(
Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5348 return error(
"Invalid record");
5351 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5352 return error(
"Invalid record");
5354 unsigned RecSize =
Record.size();
5355 if (OpNum == RecSize)
5356 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5360 for (; OpNum != RecSize; ++OpNum) {
5365 if (!IsStruct && !IsArray)
5366 return error(
"INSERTVAL: Invalid type");
5367 if ((
unsigned)Index != Index)
5368 return error(
"Invalid value");
5370 return error(
"INSERTVAL: Invalid struct index");
5372 return error(
"INSERTVAL: Invalid array index");
5374 INSERTVALIdx.
push_back((
unsigned)Index);
5382 return error(
"Inserted value type doesn't match aggregate type");
5385 ResTypeID = AggTypeID;
5397 if (getValueTypePair(
Record, OpNum, NextValueNo, TrueVal,
TypeID,
5401 popValue(
Record, OpNum, NextValueNo, CondType,
5402 getVirtualTypeID(CondType),
Cond, CurBB))
5403 return error(
"Invalid record");
5416 unsigned ValTypeID, CondTypeID;
5417 if (getValueTypePair(
Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5419 popValue(
Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5421 getValueTypePair(
Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5422 return error(
"Invalid record");
5426 dyn_cast<VectorType>(
Cond->getType())) {
5429 return error(
"Invalid type for value");
5433 return error(
"Invalid type for value");
5437 ResTypeID = ValTypeID;
5439 if (OpNum <
Record.size() && isa<FPMathOperator>(
I)) {
5442 I->setFastMathFlags(FMF);
5450 unsigned VecTypeID, IdxTypeID;
5451 if (getValueTypePair(
Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5452 getValueTypePair(
Record, OpNum, NextValueNo,
Idx, IdxTypeID, CurBB))
5453 return error(
"Invalid record");
5455 return error(
"Invalid type for value");
5457 ResTypeID = getContainedTypeID(VecTypeID);
5465 unsigned VecTypeID, IdxTypeID;
5466 if (getValueTypePair(
Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5467 return error(
"Invalid record");
5469 return error(
"Invalid type for value");
5470 if (popValue(
Record, OpNum, NextValueNo,
5471 cast<VectorType>(Vec->
getType())->getElementType(),
5472 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5473 getValueTypePair(
Record, OpNum, NextValueNo,
Idx, IdxTypeID, CurBB))
5474 return error(
"Invalid record");
5476 ResTypeID = VecTypeID;
5484 unsigned Vec1TypeID;
5485 if (getValueTypePair(
Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5487 popValue(
Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5489 return error(
"Invalid record");
5491 unsigned MaskTypeID;
5492 if (getValueTypePair(
Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5493 return error(
"Invalid record");
5495 return error(
"Invalid type for value");
5499 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5514 if (getValueTypePair(
Record, OpNum, NextValueNo, LHS, LHSTypeID, CurBB) ||
5517 return error(
"Invalid record");
5519 if (OpNum >=
Record.size())
5521 "Invalid record: operand number exceeded available operands");
5526 if (IsFP &&
Record.size() > OpNum+1)
5531 return error(
"Invalid fcmp predicate");
5535 return error(
"Invalid icmp predicate");
5537 if (
Record.size() > OpNum + 1 &&
5539 cast<ICmpInst>(
I)->setSameSign();
5542 if (OpNum + 1 !=
Record.size())
5543 return error(
"Invalid record");
5545 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5547 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5550 I->setFastMathFlags(FMF);
5567 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5568 return error(
"Invalid record");
5569 if (OpNum !=
Record.size())
5570 return error(
"Invalid record");
5578 return error(
"Invalid record");
5581 return error(
"Invalid record");
5583 if (
Record.size() == 1) {
5591 getVirtualTypeID(CondType), CurBB);
5592 if (!FalseDest || !
Cond)
5593 return error(
"Invalid record");
5601 return error(
"Invalid record");
5604 Value *CleanupPad = getValue(
Record,
Idx++, NextValueNo, TokenTy,
5605 getVirtualTypeID(TokenTy), CurBB);
5607 return error(
"Invalid record");
5609 if (
Record.size() == 2) {
5610 UnwindDest = getBasicBlock(
Record[
Idx++]);
5612 return error(
"Invalid record");
5621 return error(
"Invalid record");
5625 getVirtualTypeID(TokenTy), CurBB);
5627 return error(
"Invalid record");
5630 return error(
"Invalid record");
5639 return error(
"Invalid record");
5645 getVirtualTypeID(TokenTy), CurBB);
5647 return error(
"Invalid record");
5652 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5655 return error(
"Invalid record");
5661 UnwindDest = getBasicBlock(
Record[
Idx++]);
5663 return error(
"Invalid record");
5667 return error(
"Invalid record");
5672 CatchSwitch->addHandler(Handler);
5674 ResTypeID = getVirtualTypeID(
I->getType());
5682 return error(
"Invalid record");
5688 getVirtualTypeID(TokenTy), CurBB);
5690 return error(
"Invald record");
5692 unsigned NumArgOperands =
Record[
Idx++];
5695 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5698 if (getValueTypePair(
Record,
Idx, NextValueNo, Val, ValTypeID,
nullptr))
5699 return error(
"Invalid record");
5700 Args.push_back(Val);
5704 return error(
"Invalid record");
5710 ResTypeID = getVirtualTypeID(
I->getType());
5716 if ((
Record[0] >> 16) == SWITCH_INST_MAGIC) {
5722 unsigned OpTyID =
Record[1];
5723 Type *OpTy = getTypeByID(OpTyID);
5724 unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth();
5729 return error(
"Invalid record");
5731 unsigned NumCases =
Record[4];
5736 unsigned CurIdx = 5;
5737 for (
unsigned i = 0; i != NumCases; ++i) {
5739 unsigned NumItems =
Record[CurIdx++];
5740 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5741 bool isSingleNumber =
Record[CurIdx++];
5744 unsigned ActiveWords = 1;
5745 if (ValueBitWidth > 64)
5746 ActiveWords =
Record[CurIdx++];
5749 CurIdx += ActiveWords;
5751 if (!isSingleNumber) {
5753 if (ValueBitWidth > 64)
5754 ActiveWords =
Record[CurIdx++];
5757 CurIdx += ActiveWords;
5770 SI->addCase(Cst, DestBB);
5779 return error(
"Invalid record");
5780 unsigned OpTyID =
Record[0];
5781 Type *OpTy = getTypeByID(OpTyID);
5785 return error(
"Invalid record");
5786 unsigned NumCases = (
Record.size()-3)/2;
5789 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5790 ConstantInt *CaseVal = dyn_cast_or_null<ConstantInt>(
5791 getFnValueByID(
Record[3+i*2], OpTy, OpTyID,
nullptr));
5793 if (!CaseVal || !DestBB) {
5795 return error(
"Invalid record");
5797 SI->addCase(CaseVal, DestBB);
5804 return error(
"Invalid record");
5805 unsigned OpTyID =
Record[0];
5806 Type *OpTy = getTypeByID(OpTyID);
5808 if (!OpTy || !Address)
5809 return error(
"Invalid record");
5810 unsigned NumDests =
Record.size()-2;
5813 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5818 return error(
"Invalid record");
5828 return error(
"Invalid record");
5831 unsigned CCInfo =
Record[OpNum++];
5835 unsigned FTyID = InvalidTypeID;
5837 if ((CCInfo >> 13) & 1) {
5839 FTy = dyn_cast<FunctionType>(getTypeByID(FTyID));
5841 return error(
"Explicit invoke type is not a function type");
5845 unsigned CalleeTypeID;
5846 if (getValueTypePair(
Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5848 return error(
"Invalid record");
5852 return error(
"Callee is not a pointer");
5854 FTyID = getContainedTypeID(CalleeTypeID);
5855 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
5857 return error(
"Callee is not of pointer to function type");
5859 if (
Record.size() < FTy->getNumParams() + OpNum)
5860 return error(
"Insufficient operands to call");
5864 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5865 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5866 Ops.
push_back(getValue(
Record, OpNum, NextValueNo, FTy->getParamType(i),
5870 return error(
"Invalid record");
5873 if (!FTy->isVarArg()) {
5874 if (
Record.size() != OpNum)
5875 return error(
"Invalid record");
5878 while (OpNum !=
Record.size()) {
5881 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5882 return error(
"Invalid record");
5889 if (!OperandBundles.empty())
5894 ResTypeID = getContainedTypeID(FTyID);
5895 OperandBundles.clear();
5897 cast<InvokeInst>(
I)->setCallingConv(
5899 cast<InvokeInst>(
I)->setAttributes(PAL);
5900 if (
Error Err = propagateAttributeTypes(cast<CallBase>(
I), ArgTyIDs)) {
5909 Value *Val =
nullptr;
5911 if (getValueTypePair(
Record,
Idx, NextValueNo, Val, ValTypeID, CurBB))
5912 return error(
"Invalid record");
5921 unsigned CCInfo =
Record[OpNum++];
5924 unsigned NumIndirectDests =
Record[OpNum++];
5926 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
5929 unsigned FTyID = InvalidTypeID;
5933 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
5935 return error(
"Explicit call type is not a function type");
5939 unsigned CalleeTypeID;
5940 if (getValueTypePair(
Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5942 return error(
"Invalid record");
5946 return error(
"Callee is not a pointer type");
5948 FTyID = getContainedTypeID(CalleeTypeID);
5949 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
5951 return error(
"Callee is not of pointer to function type");
5953 if (
Record.size() < FTy->getNumParams() + OpNum)
5954 return error(
"Insufficient operands to call");
5959 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5961 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5962 if (FTy->getParamType(i)->isLabelTy())
5963 Arg = getBasicBlock(
Record[OpNum]);
5965 Arg = getValue(
Record, OpNum, NextValueNo, FTy->getParamType(i),
5968 return error(
"Invalid record");
5969 Args.push_back(Arg);
5974 if (!FTy->isVarArg()) {
5975 if (OpNum !=
Record.size())
5976 return error(
"Invalid record");
5978 while (OpNum !=
Record.size()) {
5981 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5982 return error(
"Invalid record");
5989 if (!OperandBundles.empty())
5992 if (
auto *IA = dyn_cast<InlineAsm>(Callee)) {
5997 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
6002 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
6003 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
6004 unsigned LabelNo = ArgNo - FirstBlockArg;
6005 auto *BA = dyn_cast<BlockAddress>(Args[ArgNo]);
6006 if (!BA || BA->getFunction() !=
F ||
6007 LabelNo > IndirectDests.
size() ||
6008 BA->getBasicBlock() != IndirectDests[LabelNo])
6009 return error(
"callbr argument does not match indirect dest");
6014 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
6018 for (
Value *Arg : Args)
6021 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
6024 std::string Constraints =
IA->getConstraintString();
6027 for (
const auto &CI : ConstraintInfo) {
6029 if (ArgNo >= FirstBlockArg)
6030 Constraints.insert(Pos,
"!");
6035 Pos = Constraints.find(
',', Pos);
6036 if (Pos == std::string::npos)
6042 IA->hasSideEffects(),
IA->isAlignStack(),
6043 IA->getDialect(),
IA->canThrow());
6049 ResTypeID = getContainedTypeID(FTyID);
6050 OperandBundles.clear();
6052 cast<CallBrInst>(
I)->setCallingConv(
6054 cast<CallBrInst>(
I)->setAttributes(PAL);
6055 if (
Error Err = propagateAttributeTypes(cast<CallBase>(
I), ArgTyIDs)) {
6067 return error(
"Invalid phi record");
6069 unsigned TyID =
Record[0];
6070 Type *Ty = getTypeByID(TyID);
6072 return error(
"Invalid phi record");
6077 size_t NumArgs = (
Record.size() - 1) / 2;
6079 if ((
Record.size() - 1) % 2 == 1 && !isa<FPMathOperator>(PN)) {
6081 return error(
"Invalid phi record");
6086 for (
unsigned i = 0; i != NumArgs; i++) {
6090 return error(
"Invalid phi BB");
6097 auto It =
Args.find(BB);
6098 if (It !=
Args.end()) {
6109 if (!PhiConstExprBB)
6111 EdgeBB = PhiConstExprBB;
6119 V = getValueSigned(
Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6121 V = getValue(
Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6125 return error(
"Invalid phi record");
6128 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6129 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6130 PhiConstExprBB =
nullptr;
6133 Args.insert({BB,
V});
6139 if (
Record.size() % 2 == 0) {
6140 assert(isa<FPMathOperator>(
I) &&
"Unexpected phi type");
6143 I->setFastMathFlags(FMF);
6155 return error(
"Invalid record");
6159 return error(
"Invalid record");
6162 Type *Ty = getTypeByID(ResTypeID);
6164 return error(
"Invalid record");
6166 Value *PersFn =
nullptr;
6167 unsigned PersFnTypeID;
6168 if (getValueTypePair(
Record,
Idx, NextValueNo, PersFn, PersFnTypeID,
6170 return error(
"Invalid record");
6172 if (!
F->hasPersonalityFn())
6173 F->setPersonalityFn(cast<Constant>(PersFn));
6174 else if (
F->getPersonalityFn() != cast<Constant>(PersFn))
6175 return error(
"Personality function mismatch");
6182 for (
unsigned J = 0; J != NumClauses; ++J) {
6188 if (getValueTypePair(
Record,
Idx, NextValueNo, Val, ValTypeID,
6191 return error(
"Invalid record");
6195 !isa<ArrayType>(Val->
getType())) &&
6196 "Catch clause has a invalid type!");
6198 isa<ArrayType>(Val->
getType())) &&
6199 "Filter clause has invalid type!");
6210 return error(
"Invalid record");
6213 const bool InAlloca = Bitfield::get<APV::UsedWithInAlloca>(Rec);
6214 const bool SwiftError = Bitfield::get<APV::SwiftError>(Rec);
6215 unsigned TyID =
Record[0];
6216 Type *Ty = getTypeByID(TyID);
6217 if (!Bitfield::get<APV::ExplicitType>(Rec)) {
6218 TyID = getContainedTypeID(TyID);
6219 Ty = getTypeByID(TyID);
6221 return error(
"Missing element type for old-style alloca");
6223 unsigned OpTyID =
Record[1];
6224 Type *OpTy = getTypeByID(OpTyID);
6228 Bitfield::get<APV::AlignLower>(Rec) |
6229 (Bitfield::get<APV::AlignUpper>(Rec) << APV::AlignLower::Bits);
6230 if (
Error Err = parseAlignmentValue(AlignExp,
Align)) {
6234 return error(
"Invalid record");
6237 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6241 return error(
"alloca of unsized type");
6243 Align =
DL.getPrefTypeAlign(Ty);
6245 if (!
Size->getType()->isIntegerTy())
6246 return error(
"alloca element count must have integer type");
6252 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6260 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6261 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6262 return error(
"Invalid record");
6264 if (!isa<PointerType>(
Op->getType()))
6265 return error(
"Load operand is not a pointer type");
6268 if (OpNum + 3 ==
Record.size()) {
6269 ResTypeID =
Record[OpNum++];
6270 Ty = getTypeByID(ResTypeID);
6272 ResTypeID = getContainedTypeID(OpTypeID);
6273 Ty = getTypeByID(ResTypeID);
6277 return error(
"Missing load type");
6279 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6287 return error(
"load of unsized type");
6289 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6299 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6300 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size()))
6301 return error(
"Invalid record");
6303 if (!isa<PointerType>(
Op->getType()))
6304 return error(
"Load operand is not a pointer type");
6307 if (OpNum + 5 ==
Record.size()) {
6308 ResTypeID =
Record[OpNum++];
6309 Ty = getTypeByID(ResTypeID);
6311 ResTypeID = getContainedTypeID(OpTypeID);
6312 Ty = getTypeByID(ResTypeID);
6316 return error(
"Missing atomic load type");
6318 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6322 if (Ordering == AtomicOrdering::NotAtomic ||
6323 Ordering == AtomicOrdering::Release ||
6324 Ordering == AtomicOrdering::AcquireRelease)
6325 return error(
"Invalid record");
6326 if (Ordering != AtomicOrdering::NotAtomic &&
Record[OpNum] == 0)
6327 return error(
"Invalid record");
6334 return error(
"Alignment missing from atomic load");
6343 unsigned PtrTypeID, ValTypeID;
6344 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6345 return error(
"Invalid record");
6348 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6349 return error(
"Invalid record");
6351 ValTypeID = getContainedTypeID(PtrTypeID);
6352 if (popValue(
Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6353 ValTypeID, Val, CurBB))
6354 return error(
"Invalid record");
6357 if (OpNum + 2 !=
Record.size())
6358 return error(
"Invalid record");
6360 if (
Error Err = typeCheckLoadStoreInst(Val->
getType(),
Ptr->getType()))
6367 return error(
"store of unsized type");
6369 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6379 unsigned PtrTypeID, ValTypeID;
6380 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB) ||
6381 !isa<PointerType>(
Ptr->getType()))
6382 return error(
"Invalid record");
6384 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6385 return error(
"Invalid record");
6387 ValTypeID = getContainedTypeID(PtrTypeID);
6388 if (popValue(
Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6389 ValTypeID, Val, CurBB))
6390 return error(
"Invalid record");
6393 if (OpNum + 4 !=
Record.size())
6394 return error(
"Invalid record");
6396 if (
Error Err = typeCheckLoadStoreInst(Val->
getType(),
Ptr->getType()))
6399 if (Ordering == AtomicOrdering::NotAtomic ||
6400 Ordering == AtomicOrdering::Acquire ||
6401 Ordering == AtomicOrdering::AcquireRelease)
6402 return error(
"Invalid record");
6404 if (Ordering != AtomicOrdering::NotAtomic &&
Record[OpNum] == 0)
6405 return error(
"Invalid record");
6411 return error(
"Alignment missing from atomic store");
6419 const size_t NumRecords =
Record.size();
6423 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6424 return error(
"Invalid record");
6426 if (!isa<PointerType>(
Ptr->getType()))
6427 return error(
"Cmpxchg operand is not a pointer type");
6430 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6431 if (popValue(
Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6432 CmpTypeID, Cmp, CurBB))
6433 return error(
"Invalid record");
6436 if (popValue(
Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6438 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6439 return error(
"Invalid record");
6443 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6444 SuccessOrdering == AtomicOrdering::Unordered)
6445 return error(
"Invalid record");
6449 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(),
Ptr->getType()))
6457 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6458 FailureOrdering == AtomicOrdering::Unordered)
6459 return error(
"Invalid record");
6461 const Align Alignment(
6462 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6465 FailureOrdering, SSID);
6466 cast<AtomicCmpXchgInst>(
I)->setVolatile(
Record[OpNum]);
6468 if (NumRecords < 8) {
6472 I->insertInto(CurBB, CurBB->
end());
6474 ResTypeID = CmpTypeID;
6476 cast<AtomicCmpXchgInst>(
I)->setWeak(
Record[OpNum + 4]);
6478 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6487 const size_t NumRecords =
Record.size();
6491 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6492 return error(
"Invalid record");
6494 if (!isa<PointerType>(
Ptr->getType()))
6495 return error(
"Cmpxchg operand is not a pointer type");
6499 if (getValueTypePair(
Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6500 return error(
"Invalid record");
6502 Value *Val =
nullptr;
6503 if (popValue(
Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6505 return error(
"Invalid record");
6507 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6508 return error(
"Invalid record");
6510 const bool IsVol =
Record[OpNum];
6515 return error(
"Invalid cmpxchg success ordering");
6519 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(),
Ptr->getType()))
6525 return error(
"Invalid cmpxchg failure ordering");
6527 const bool IsWeak =
Record[OpNum + 4];
6531 if (NumRecords == (OpNum + 6)) {
6532 if (
Error Err = parseAlignmentValue(
Record[OpNum + 5], Alignment))
6537 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6540 FailureOrdering, SSID);
6541 cast<AtomicCmpXchgInst>(
I)->setVolatile(IsVol);
6542 cast<AtomicCmpXchgInst>(
I)->setWeak(IsWeak);
6545 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6554 const size_t NumRecords =
Record.size();
6559 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6560 return error(
"Invalid record");
6562 if (!isa<PointerType>(
Ptr->getType()))
6563 return error(
"Invalid record");
6565 Value *Val =
nullptr;
6566 unsigned ValTypeID = InvalidTypeID;
6568 ValTypeID = getContainedTypeID(PtrTypeID);
6569 if (popValue(
Record, OpNum, NextValueNo,
6570 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6571 return error(
"Invalid record");
6573 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6574 return error(
"Invalid record");
6577 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6578 return error(
"Invalid record");
6584 return error(
"Invalid record");
6586 const bool IsVol =
Record[OpNum + 1];
6589 if (Ordering == AtomicOrdering::NotAtomic ||
6590 Ordering == AtomicOrdering::Unordered)
6591 return error(
"Invalid record");
6597 if (NumRecords == (OpNum + 5)) {
6598 if (
Error Err = parseAlignmentValue(
Record[OpNum + 4], Alignment))
6604 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6607 ResTypeID = ValTypeID;
6608 cast<AtomicRMWInst>(
I)->setVolatile(IsVol);
6615 return error(
"Invalid record");
6617 if (Ordering == AtomicOrdering::NotAtomic ||
6618 Ordering == AtomicOrdering::Unordered ||
6619 Ordering == AtomicOrdering::Monotonic)
6620 return error(
"Invalid record");
6629 SeenDebugRecord =
true;
6632 return error(
"Invalid dbg record: missing instruction");
6635 Inst->
getParent()->insertDbgRecordBefore(
6645 SeenDebugRecord =
true;
6648 return error(
"Invalid dbg record: missing instruction");
6664 cast<DILocalVariable>(getFnMetadataByID(
Record[Slot++]));
6666 cast<DIExpression>(getFnMetadataByID(
Record[Slot++]));
6678 unsigned SlotBefore =
Slot;
6679 if (getValueTypePair(
Record, Slot, NextValueNo, V, TyID, CurBB))
6680 return error(
"Invalid dbg record: invalid value");
6682 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6685 RawLocation = getFnMetadataByID(
Record[Slot++]);
6693 DbgVariableRecord::LocationType::Value);
6697 DbgVariableRecord::LocationType::Declare);
6702 cast<DIExpression>(getFnMetadataByID(
Record[Slot++]));
6717 return error(
"Invalid record");
6721 unsigned CCInfo =
Record[OpNum++];
6727 return error(
"Fast math flags indicator set for call with no FMF");
6730 unsigned FTyID = InvalidTypeID;
6734 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
6736 return error(
"Explicit call type is not a function type");
6740 unsigned CalleeTypeID;
6741 if (getValueTypePair(
Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6743 return error(
"Invalid record");
6747 return error(
"Callee is not a pointer type");
6749 FTyID = getContainedTypeID(CalleeTypeID);
6750 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
6752 return error(
"Callee is not of pointer to function type");
6754 if (
Record.size() < FTy->getNumParams() + OpNum)
6755 return error(
"Insufficient operands to call");
6760 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6761 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6762 if (FTy->getParamType(i)->isLabelTy())
6763 Args.push_back(getBasicBlock(
Record[OpNum]));
6765 Args.push_back(getValue(
Record, OpNum, NextValueNo,
6766 FTy->getParamType(i), ArgTyID, CurBB));
6769 return error(
"Invalid record");
6773 if (!FTy->isVarArg()) {
6774 if (OpNum !=
Record.size())
6775 return error(
"Invalid record");
6777 while (OpNum !=
Record.size()) {
6780 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6781 return error(
"Invalid record");
6788 if (!OperandBundles.empty())
6792 ResTypeID = getContainedTypeID(FTyID);
6793 OperandBundles.clear();
6795 cast<CallInst>(
I)->setCallingConv(
6804 cast<CallInst>(
I)->setTailCallKind(TCK);
6805 cast<CallInst>(
I)->setAttributes(PAL);
6806 if (isa<DbgInfoIntrinsic>(
I))
6807 SeenDebugIntrinsic =
true;
6808 if (
Error Err = propagateAttributeTypes(cast<CallBase>(
I), ArgTyIDs)) {
6813 if (!isa<FPMathOperator>(
I))
6814 return error(
"Fast-math-flags specified for call without "
6815 "floating-point scalar or vector return type");
6816 I->setFastMathFlags(FMF);
6822 return error(
"Invalid record");
6823 unsigned OpTyID =
Record[0];
6824 Type *OpTy = getTypeByID(OpTyID);
6825 Value *
Op = getValue(
Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
6827 Type *ResTy = getTypeByID(ResTypeID);
6828 if (!OpTy || !
Op || !ResTy)
6829 return error(
"Invalid record");
6841 return error(
"Invalid record");
6843 std::vector<Value *> Inputs;
6846 while (OpNum !=
Record.size()) {
6848 if (getValueOrMetadata(
Record, OpNum, NextValueNo,
Op, CurBB))
6849 return error(
"Invalid record");
6850 Inputs.push_back(
Op);
6853 OperandBundles.emplace_back(BundleTags[
Record[0]], std::move(Inputs));
6861 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6862 return error(
"Invalid record");
6863 if (OpNum !=
Record.size())
6864 return error(
"Invalid record");
6867 ResTypeID = OpTypeID;
6877 return error(
"Invalid instruction with no BB");
6879 if (!OperandBundles.empty()) {
6881 return error(
"Operand bundles found with no consumer");
6883 I->insertInto(CurBB, CurBB->
end());
6886 if (
I->isTerminator()) {
6888 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
6892 if (!
I->getType()->isVoidTy()) {
6893 assert(
I->getType() == getTypeByID(ResTypeID) &&
6894 "Incorrect result type ID");
6902 if (!OperandBundles.empty())
6903 return error(
"Operand bundles found with no consumer");
6907 if (!
A->getParent()) {
6909 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
6910 if ((
A = dyn_cast_or_null<Argument>(ValueList[i])) && !
A->getParent()) {
6915 return error(
"Never resolved value found in function");
6920 if (MDLoader->hasFwdRefs())
6921 return error(
"Invalid function metadata: outgoing forward refs");
6926 for (
const auto &Pair : ConstExprEdgeBBs) {
6931 From->getTerminator()->replaceSuccessorWith(To, EdgeBB);
6937 ValueList.
shrinkTo(ModuleValueListSize);
6938 MDLoader->shrinkTo(ModuleMDLoaderSize);
6939 std::vector<BasicBlock*>().swap(FunctionBBs);
6944Error BitcodeReader::findFunctionInStream(
6947 while (DeferredFunctionInfoIterator->second == 0) {
6952 assert(VSTOffset == 0 || !
F->hasName());
6955 if (
Error Err = rememberAndSkipFunctionBodies())
6961SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
6964 if (Val >= SSIDs.
size())
6976 if (!
F || !
F->isMaterializable())
6980 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
6983 if (DFII->second == 0)
6984 if (
Error Err = findFunctionInStream(
F, DFII))
6988 if (
Error Err = materializeMetadata())
6992 if (
Error JumpFailed = Stream.JumpToBit(DFII->second))
6997 F->IsNewDbgInfoFormat =
true;
6999 if (
Error Err = parseFunctionBody(
F))
7001 F->setIsMaterializable(
false);
7005 if (SeenDebugIntrinsic && SeenDebugRecord)
7006 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
7008 bool SeenAnyDebugInfo = SeenDebugIntrinsic || SeenDebugRecord;
7009 bool NewDbgInfoFormatDesired =
7010 SeenAnyDebugInfo ? SeenDebugRecord :
F->getParent()->IsNewDbgInfoFormat;
7011 if (SeenAnyDebugInfo) {
7020 if (NewDbgInfoFormatDesired !=
F->getParent()->IsNewDbgInfoFormat)
7021 F->getParent()->setNewDbgInfoFormatFlag(NewDbgInfoFormatDesired);
7023 F->setNewDbgInfoFormatFlag(NewDbgInfoFormatDesired);
7031 bool ModuleIsNewDbgInfoFormat =
F->getParent()->IsNewDbgInfoFormat;
7032 if (ModuleIsNewDbgInfoFormat || !SeenDebugRecord)
7033 F->setNewDbgInfoFormatFlag(ModuleIsNewDbgInfoFormat);
7035 F->setIsNewDbgInfoFormat(ModuleIsNewDbgInfoFormat);
7042 for (
auto &
I : UpgradedIntrinsics) {
7044 if (
CallInst *CI = dyn_cast<CallInst>(U))
7049 if (
DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
7050 F->setSubprogram(SP);
7053 if (!MDLoader->isStrippingTBAA()) {
7055 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
7058 MDLoader->setStripTBAA(
true);
7065 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
7066 if (MD->getOperand(0) !=
nullptr && isa<MDString>(MD->getOperand(0))) {
7067 MDString *MDS = cast<MDString>(MD->getOperand(0));
7070 if (ProfName !=
"branch_weights")
7072 unsigned ExpectedNumOperands = 0;
7074 ExpectedNumOperands = BI->getNumSuccessors();
7075 else if (
SwitchInst *SI = dyn_cast<SwitchInst>(&
I))
7076 ExpectedNumOperands =
SI->getNumSuccessors();
7077 else if (isa<CallInst>(&
I))
7078 ExpectedNumOperands = 1;
7081 else if (isa<SelectInst>(&
I))
7082 ExpectedNumOperands = 2;
7089 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7090 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7095 if (
auto *CI = dyn_cast<CallBase>(&
I)) {
7097 CI->getFunctionType()->getReturnType(), CI->getRetAttributes()));
7099 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7101 CI->getArgOperand(ArgNo)->getType(),
7102 CI->getParamAttributes(ArgNo)));
7111 return materializeForwardReferencedFunctions();
7114Error BitcodeReader::materializeModule() {
7115 if (
Error Err = materializeMetadata())
7119 WillMaterializeAllForwardRefs =
true;
7124 if (
Error Err = materialize(&
F))
7130 if (LastFunctionBlockBit || NextUnreadBit)
7132 ? LastFunctionBlockBit
7138 if (!BasicBlockFwdRefs.
empty())
7139 return error(
"Never resolved function from blockaddress");
7145 for (
auto &
I : UpgradedIntrinsics) {
7146 for (
auto *U :
I.first->users()) {
7147 if (
CallInst *CI = dyn_cast<CallInst>(U))
7150 if (!
I.first->use_empty())
7151 I.first->replaceAllUsesWith(
I.second);
7152 I.first->eraseFromParent();
7154 UpgradedIntrinsics.clear();
7165std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7166 return IdentifiedStructTypes;
7169ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7172 : BitcodeReaderBase(
std::
move(Cursor), Strtab), TheIndex(TheIndex),
7173 ModulePath(ModulePath), IsPrevailing(IsPrevailing) {}
7175void ModuleSummaryIndexBitcodeReader::addThisModule() {
7180ModuleSummaryIndexBitcodeReader::getThisModule() {
7184template <
bool AllowNullValueInfo>
7185std::pair<ValueInfo, GlobalValue::GUID>
7186ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7187 auto VGI = ValueIdToValueInfoMap[ValueId];
7192 assert(AllowNullValueInfo || std::get<0>(VGI));
7196void ModuleSummaryIndexBitcodeReader::setValueGUID(
7199 std::string GlobalId =
7202 auto OriginalNameID = ValueGUID;
7206 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7212 ValueIdToValueInfoMap[ValueID] = std::make_pair(
7221Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7230 if (!MaybeCurrentBit)
7248 switch (
Entry.Kind) {
7251 return error(
"Malformed block");
7254 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
7267 switch (MaybeRecord.
get()) {
7272 return error(
"Invalid record");
7273 unsigned ValueID =
Record[0];
7275 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7276 assert(VLI != ValueIdToLinkageMap.
end() &&
7277 "No linkage found for VST entry?");
7279 setValueGUID(ValueID,
ValueName, Linkage, SourceFileName);
7286 return error(
"Invalid record");
7287 unsigned ValueID =
Record[0];
7289 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7290 assert(VLI != ValueIdToLinkageMap.
end() &&
7291 "No linkage found for VST entry?");
7293 setValueGUID(ValueID,
ValueName, Linkage, SourceFileName);
7299 unsigned ValueID =
Record[0];
7303 ValueIdToValueInfoMap[ValueID] =
7314Error ModuleSummaryIndexBitcodeReader::parseModule() {
7320 unsigned ValueId = 0;
7329 switch (
Entry.Kind) {
7331 return error(
"Malformed block");
7338 if (
Error Err = Stream.SkipBlock())
7343 if (
Error Err = readBlockInfo())
7349 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7350 !SeenGlobalValSummary) &&
7351 "Expected early VST parse via VSTOffset record");
7352 if (
Error Err = Stream.SkipBlock())
7358 if (!SourceFileName.
empty())
7360 assert(!SeenValueSymbolTable &&
7361 "Already read VST when parsing summary block?");
7366 if (VSTOffset > 0) {
7367 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7369 SeenValueSymbolTable =
true;
7371 SeenGlobalValSummary =
true;
7372 if (
Error Err = parseEntireSummary(
Entry.ID))
7376 if (
Error Err = parseModuleStringTable())
7387 switch (MaybeBitCode.
get()) {
7391 if (
Error Err = parseVersionRecord(
Record).takeError())
7399 return error(
"Invalid record");
7407 auto &Hash = getThisModule()->second;
7409 for (
auto &Val :
Record) {
7410 assert(!(Val >> 32) &&
"Unexpected high bits set");
7418 return error(
"Invalid record");
7422 VSTOffset =
Record[0] - 1;
7433 std::tie(
Name, GVRecord) = readNameFromStrtab(
Record);
7434 if (GVRecord.
size() <= 3)
7435 return error(
"Invalid record");
7439 ValueIdToLinkageMap[ValueId++] =
Linkage;
7443 setValueGUID(ValueId++,
Name, Linkage, SourceFileName);
7458 Ret.push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7464 bool IsOldProfileFormat,
7465 bool HasProfile,
bool HasRelBF) {
7469 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7474 for (
unsigned I = 0, E =
Record.size();
I != E; ++
I) {
7476 bool HasTailCall =
false;
7479 if (IsOldProfileFormat) {
7483 }
else if (HasProfile)
7484 std::tie(Hotness, HasTailCall) =
7517 static_cast<size_t>(
Record[Slot + 1])};
7540 while (Slot <
Record.size())
7544std::vector<FunctionSummary::ParamAccess>
7546 auto ReadRange = [&]() {
7548 BitcodeReader::decodeSignRotatedValue(
Record.front()));
7551 BitcodeReader::decodeSignRotatedValue(
Record.front()));
7559 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7560 while (!
Record.empty()) {
7561 PendingParamAccesses.emplace_back();
7565 ParamAccess.
Use = ReadRange();
7568 for (
auto &Call : ParamAccess.
Calls) {
7571 Call.Callee = std::get<0>(getValueInfoFromValueId(
Record.front()));
7573 Call.Offsets = ReadRange();
7576 return PendingParamAccesses;
7579void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7587void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7593 static_cast<size_t>(
Record[Slot + 1])});
7596 while (Slot <
Record.size())
7597 parseTypeIdCompatibleVtableInfo(
Record, Slot, TypeId);
7606 if (RadixArray.empty()) {
7607 unsigned NumStackEntries =
Record[
I++];
7609 StackIdList.
reserve(NumStackEntries);
7610 for (
unsigned J = 0; J < NumStackEntries; J++) {
7616 unsigned RadixIndex =
Record[
I++];
7622 assert(RadixIndex < RadixArray.size());
7623 unsigned NumStackIds = RadixArray[RadixIndex++];
7624 StackIdList.
reserve(NumStackIds);
7625 while (NumStackIds--) {
7626 assert(RadixIndex < RadixArray.size());
7627 unsigned Elem = RadixArray[RadixIndex];
7628 if (
static_cast<std::make_signed_t<unsigned>
>(Elem) < 0) {
7629 RadixIndex = RadixIndex - Elem;
7630 assert(RadixIndex < RadixArray.size());
7631 Elem = RadixArray[RadixIndex];
7633 assert(
static_cast<std::make_signed_t<unsigned>
>(Elem) >= 0);
7646 unsigned FirstWORef = Refs.
size() - WOCnt;
7647 unsigned RefNo = FirstWORef - ROCnt;
7648 for (; RefNo < FirstWORef; ++RefNo)
7649 Refs[RefNo].setReadOnly();
7650 for (; RefNo < Refs.
size(); ++RefNo)
7651 Refs[RefNo].setWriteOnly();
7656Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7657 if (
Error Err = Stream.EnterSubBlock(
ID))
7669 return error(
"Invalid Summary Block: record for version expected");
7674 return error(
"Invalid Summary Block: version expected");
7677 const bool IsOldProfileFormat =
Version == 1;
7679 return error(
"Invalid summary version " +
Twine(Version) +
7680 ". Version should be in the range [1-" +
7693 std::vector<GlobalValue::GUID> PendingTypeTests;
7694 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7695 PendingTypeCheckedLoadVCalls;
7696 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7697 PendingTypeCheckedLoadConstVCalls;
7698 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7700 std::vector<CallsiteInfo> PendingCallsites;
7701 std::vector<AllocInfo> PendingAllocs;
7702 std::vector<uint64_t> PendingContextIds;
7710 switch (
Entry.Kind) {
7713 return error(
"Malformed block");
7732 switch (
unsigned BitCode = MaybeBitCode.
get()) {
7742 if (Version >= 11) {
7747 ValueIdToValueInfoMap[ValueID] =
7763 unsigned ValueID =
Record[0];
7765 unsigned InstCount =
Record[2];
7767 unsigned NumRefs =
Record[3];
7768 unsigned NumRORefs = 0, NumWORefs = 0;
7769 int RefListStartIndex = 4;
7773 RefListStartIndex = 5;
7776 RefListStartIndex = 6;
7779 RefListStartIndex = 7;
7790 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7792 "Record size inconsistent with number of references");
7799 IsOldProfileFormat, HasProfile, HasRelBF);
7801 auto VIAndOriginalGUID = getValueInfoFromValueId(ValueID);
7807 !IsPrevailing(VIAndOriginalGUID.first.getGUID())) {
7808 PendingCallsites.clear();
7809 PendingAllocs.clear();
7811 auto FS = std::make_unique<FunctionSummary>(
7813 std::move(Calls), std::move(PendingTypeTests),
7814 std::move(PendingTypeTestAssumeVCalls),
7815 std::move(PendingTypeCheckedLoadVCalls),
7816 std::move(PendingTypeTestAssumeConstVCalls),
7817 std::move(PendingTypeCheckedLoadConstVCalls),
7818 std::move(PendingParamAccesses), std::move(PendingCallsites),
7819 std::move(PendingAllocs));
7820 FS->setModulePath(getThisModule()->first());
7821 FS->setOriginalName(std::get<1>(VIAndOriginalGUID));
7830 unsigned ValueID =
Record[0];
7832 unsigned AliaseeID =
Record[2];
7834 auto AS = std::make_unique<AliasSummary>(Flags);
7840 AS->setModulePath(getThisModule()->first());
7842 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
7844 if (!AliaseeInModule)
7845 return error(
"Alias expects aliasee summary to be parsed");
7846 AS->setAliasee(AliaseeVI, AliaseeInModule);
7848 auto GUID = getValueInfoFromValueId(ValueID);
7849 AS->setOriginalName(std::get<1>(GUID));
7855 unsigned ValueID =
Record[0];
7857 unsigned RefArrayStart = 2;
7870 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7871 FS->setModulePath(getThisModule()->first());
7872 auto GUID = getValueInfoFromValueId(ValueID);
7873 FS->setOriginalName(std::get<1>(GUID));
7881 unsigned ValueID =
Record[0];
7884 unsigned NumRefs =
Record[3];
7885 unsigned RefListStartIndex = 4;
7886 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
7891 for (
unsigned I = VTableListStartIndex, E =
Record.size();
I != E; ++
I) {
7897 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7898 VS->setModulePath(getThisModule()->first());
7899 VS->setVTableFuncs(VTableFuncs);
7900 auto GUID = getValueInfoFromValueId(ValueID);
7901 VS->setOriginalName(std::get<1>(GUID));
7913 unsigned ValueID =
Record[0];
7916 unsigned InstCount =
Record[3];
7918 unsigned NumRefs =
Record[4];
7919 unsigned NumRORefs = 0, NumWORefs = 0;
7920 int RefListStartIndex = 5;
7924 RefListStartIndex = 6;
7925 size_t NumRefsIndex = 5;
7927 unsigned NumRORefsOffset = 1;
7928 RefListStartIndex = 7;
7931 RefListStartIndex = 8;
7933 RefListStartIndex = 9;
7935 NumRORefsOffset = 2;
7938 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
7940 NumRefs =
Record[NumRefsIndex];
7944 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7946 "Record size inconsistent with number of references");
7952 IsOldProfileFormat, HasProfile,
false);
7953 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
7955 auto FS = std::make_unique<FunctionSummary>(
7957 std::move(Edges), std::move(PendingTypeTests),
7958 std::move(PendingTypeTestAssumeVCalls),
7959 std::move(PendingTypeCheckedLoadVCalls),
7960 std::move(PendingTypeTestAssumeConstVCalls),
7961 std::move(PendingTypeCheckedLoadConstVCalls),
7962 std::move(PendingParamAccesses), std::move(PendingCallsites),
7963 std::move(PendingAllocs));
7964 LastSeenSummary =
FS.get();
7965 LastSeenGUID =
VI.getGUID();
7966 FS->setModulePath(ModuleIdMap[ModuleId]);
7974 unsigned ValueID =
Record[0];
7977 unsigned AliaseeValueId =
Record[3];
7979 auto AS = std::make_unique<AliasSummary>(Flags);
7980 LastSeenSummary = AS.get();
7981 AS->setModulePath(ModuleIdMap[ModuleId]);
7983 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeValueId));
7985 AS->setAliasee(AliaseeVI, AliaseeInModule);
7987 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
7988 LastSeenGUID =
VI.getGUID();
7994 unsigned ValueID =
Record[0];
7997 unsigned RefArrayStart = 3;
8010 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
8011 LastSeenSummary =
FS.get();
8012 FS->setModulePath(ModuleIdMap[ModuleId]);
8013 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
8014 LastSeenGUID =
VI.getGUID();
8021 if (!LastSeenSummary)
8022 return error(
"Name attachment that does not follow a combined record");
8026 LastSeenSummary =
nullptr;
8031 assert(PendingTypeTests.empty());
8036 assert(PendingTypeTestAssumeVCalls.empty());
8037 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8038 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
8042 assert(PendingTypeCheckedLoadVCalls.empty());
8043 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8044 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
8048 PendingTypeTestAssumeConstVCalls.push_back(
8053 PendingTypeCheckedLoadConstVCalls.push_back(
8058 std::set<std::string, std::less<>> &CfiFunctionDefs =
8060 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8061 CfiFunctionDefs.insert(
8062 {Strtab.data() + Record[I], static_cast<size_t>(Record[I + 1])});
8067 std::set<std::string, std::less<>> &CfiFunctionDecls =
8069 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
8070 CfiFunctionDecls.insert(
8071 {Strtab.data() + Record[I], static_cast<size_t>(Record[I + 1])});
8080 parseTypeIdCompatibleVtableSummaryRecord(
Record);
8088 PendingParamAccesses = parseParamAccesses(
Record);
8095 if (Version <= 11) {
8102 StackIds.reserve(
Record.size() / 2);
8103 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8104 StackIds.push_back(*R << 32 | *(R + 1));
8114 unsigned ValueID =
Record[0];
8116 for (
auto R =
Record.begin() + 1; R !=
Record.end(); R++) {
8117 assert(*R < StackIds.size());
8120 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
8121 PendingCallsites.push_back(
CallsiteInfo({
VI, std::move(StackIdList)}));
8126 auto RecordIter =
Record.begin();
8127 unsigned ValueID = *RecordIter++;
8128 unsigned NumStackIds = *RecordIter++;
8129 unsigned NumVersions = *RecordIter++;
8130 assert(
Record.size() == 3 + NumStackIds + NumVersions);
8132 for (
unsigned J = 0; J < NumStackIds; J++) {
8133 assert(*RecordIter < StackIds.size());
8138 for (
unsigned J = 0; J < NumVersions; J++)
8141 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
8142 PendingCallsites.push_back(
8143 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
8151 PendingContextIds.reserve(
Record.size() / 2);
8152 for (
auto R =
Record.begin(); R !=
Record.end(); R += 2)
8153 PendingContextIds.push_back(*R << 32 | *(R + 1));
8159 std::vector<MIBInfo> MIBs;
8160 unsigned NumMIBs = 0;
8163 unsigned MIBsRead = 0;
8164 while ((Version >= 10 && MIBsRead++ < NumMIBs) ||
8165 (Version < 10 &&
I <
Record.size())) {
8168 auto StackIdList = parseAllocInfoContext(
Record,
I);
8175 std::vector<std::vector<ContextTotalSize>> AllContextSizes;
8177 assert(!PendingContextIds.empty() &&
8178 "Missing context ids for alloc sizes");
8179 unsigned ContextIdIndex = 0;
8185 while (MIBsRead++ < NumMIBs) {
8187 unsigned NumContextSizeInfoEntries =
Record[
I++];
8189 std::vector<ContextTotalSize> ContextSizes;
8190 ContextSizes.reserve(NumContextSizeInfoEntries);
8191 for (
unsigned J = 0; J < NumContextSizeInfoEntries; J++) {
8192 assert(ContextIdIndex < PendingContextIds.size());
8195 ContextSizes.push_back(
8196 {PendingContextIds[ContextIdIndex++],
Record[
I++]});
8198 AllContextSizes.push_back(std::move(ContextSizes));
8200 PendingContextIds.clear();
8202 PendingAllocs.push_back(
AllocInfo(std::move(MIBs)));
8203 if (!AllContextSizes.empty()) {
8204 assert(PendingAllocs.back().MIBs.size() == AllContextSizes.size());
8205 PendingAllocs.back().ContextSizeInfos = std::move(AllContextSizes);
8212 std::vector<MIBInfo> MIBs;
8213 unsigned NumMIBs =
Record[
I++];
8214 unsigned NumVersions =
Record[
I++];
8215 unsigned MIBsRead = 0;
8216 while (MIBsRead++ < NumMIBs) {
8219 auto StackIdList = parseAllocInfoContext(
Record,
I);
8224 for (
unsigned J = 0; J < NumVersions; J++)
8227 PendingAllocs.push_back(
AllocInfo(std::move(Versions), std::move(MIBs)));
8237Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8252 switch (
Entry.Kind) {
8255 return error(
"Malformed block");
8267 switch (MaybeRecord.
get()) {
8275 return error(
"Invalid record");
8277 LastSeenModule = TheIndex.
addModule(ModulePath);
8278 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8287 if (!LastSeenModule)
8288 return error(
"Invalid hash that does not follow a module path");
8290 for (
auto &Val :
Record) {
8291 assert(!(Val >> 32) &&
"Unexpected high bits set");
8292 LastSeenModule->
second[Pos++] = Val;
8295 LastSeenModule =
nullptr;
8308class BitcodeErrorCategoryType :
public std::error_category {
8309 const char *
name()
const noexcept
override {
8310 return "llvm.bitcode";
8313 std::string message(
int IE)
const override {
8316 case BitcodeError::CorruptedBitcode:
8317 return "Corrupted bitcode";
8326 static BitcodeErrorCategoryType ErrorCategory;
8327 return ErrorCategory;
8331 unsigned Block,
unsigned RecordID) {
8333 return std::move(Err);
8342 switch (Entry.Kind) {
8347 return error(
"Malformed block");
8351 return std::move(Err);
8361 if (MaybeRecord.
get() == RecordID)
8376 return FOrErr.takeError();
8377 return std::move(FOrErr->Mods);
8402 switch (Entry.Kind) {
8405 return error(
"Malformed block");
8408 uint64_t IdentificationBit = -1ull;
8412 return std::move(Err);
8418 Entry = MaybeEntry.
get();
8423 return error(
"Malformed block");
8429 return std::move(Err);
8448 if (!
I.Strtab.empty())
8455 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8456 F.StrtabForSymtab = *Strtab;
8472 if (
F.Symtab.empty())
8473 F.Symtab = *SymtabOrErr;
8478 return std::move(Err);
8483 return std::move(E);
8498BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8499 bool ShouldLazyLoadMetadata,
bool IsImporting,
8503 std::string ProducerIdentification;
8504 if (IdentificationBit != -1ull) {
8505 if (
Error JumpFailed = Stream.JumpToBit(IdentificationBit))
8506 return std::move(JumpFailed);
8509 return std::move(E);
8512 if (
Error JumpFailed = Stream.JumpToBit(ModuleBit))
8513 return std::move(JumpFailed);
8514 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8517 std::unique_ptr<Module>
M =
8518 std::make_unique<Module>(ModuleIdentifier, Context);
8519 M->setMaterializer(R);
8522 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8523 IsImporting, Callbacks))
8524 return std::move(Err);
8526 if (MaterializeAll) {
8528 if (
Error Err =
M->materializeAll())
8529 return std::move(Err);
8532 if (
Error Err =
R->materializeForwardReferencedFunctions())
8533 return std::move(Err);
8536 return std::move(M);
8542 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8557 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8558 ModulePath, IsPrevailing);
8559 return R.parseModule();
8566 return std::move(JumpFailed);
8568 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8569 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *Index,
8570 ModuleIdentifier, 0);
8572 if (
Error Err = R.parseModule())
8573 return std::move(Err);
8575 return std::move(Index);
8583 return std::move(Err);
8588 std::pair<bool, bool> Result = {
false,
false};
8590 return std::move(E);
8592 switch (Entry.Kind) {
8595 return error(
"Malformed block");
8610 switch (MaybeBitCode.
get()) {
8616 assert(Flags <= 0x2ff &&
"Unexpected bits in flag");
8618 bool EnableSplitLTOUnit = Flags & 0x8;
8619 bool UnifiedLTO = Flags & 0x200;
8620 Result = {EnableSplitLTOUnit, UnifiedLTO};
8633 return std::move(JumpFailed);
8636 return std::move(Err);
8641 return std::move(E);
8643 switch (Entry.Kind) {
8645 return error(
"Malformed block");
8656 return Flags.takeError();
8668 return Flags.takeError();
8677 return std::move(Err);
8684 return StreamFailed.takeError();
8694 if (MsOrErr->size() != 1)
8695 return error(
"Expected a single module");
8697 return (*MsOrErr)[0];
8702 bool ShouldLazyLoadMetadata,
bool IsImporting,
8708 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8713 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8714 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8716 IsImporting, Callbacks);
8718 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8724 return getModuleImpl(Context,
true,
false,
false, Callbacks);
8736 return BM->parseModule(Context, Callbacks);
8769 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
8778 return BM->getSummary();
8786 return BM->getLTOInfo();
8791 bool IgnoreEmptyThinLTOIndexFile) {
8796 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 CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
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