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;
535 ExtraInfo(uint8_t Opcode, uint8_t Flags = 0,
Type *SrcElemTy =
nullptr,
536 std::optional<ConstantRange> InRange = std::nullopt)
537 : Opcode(Opcode),
Flags(
Flags), SrcElemTy(SrcElemTy),
540 ExtraInfo(uint8_t Opcode, uint8_t Flags,
unsigned BlockAddressBB)
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;
799 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
801 if (getValue(
Record, Slot, InstNum, Ty, TyID, ResVal, ConstExprInsertBB))
810 unsigned InstNum,
Type *Ty,
unsigned TyID,
Value *&ResVal,
812 ResVal = getValue(
Record, Slot, InstNum, Ty, TyID, ConstExprInsertBB);
813 return ResVal ==
nullptr;
819 unsigned InstNum,
Type *Ty,
unsigned TyID,
821 if (Slot ==
Record.size())
return nullptr;
825 ValNo = InstNum - ValNo;
826 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
831 unsigned InstNum,
Type *Ty,
unsigned TyID,
833 if (Slot ==
Record.size())
return nullptr;
837 ValNo = InstNum - ValNo;
838 return getFnValueByID(ValNo, Ty, TyID, ConstExprInsertBB);
844 if (
Record.size() - OpNum < 2)
845 return error(
"Too few records for range");
847 unsigned LowerActiveWords =
Record[OpNum];
848 unsigned UpperActiveWords =
Record[OpNum++] >> 32;
849 if (
Record.size() - OpNum < LowerActiveWords + UpperActiveWords)
850 return error(
"Too few records for range");
853 OpNum += LowerActiveWords;
856 OpNum += UpperActiveWords;
859 int64_t Start = BitcodeReader::decodeSignRotatedValue(
Record[OpNum++]);
860 int64_t
End = BitcodeReader::decodeSignRotatedValue(
Record[OpNum++]);
867 if (
Record.size() - OpNum < 1)
868 return error(
"Too few records for range");
889 Error parseGlobalIndirectSymbolRecord(
unsigned BitCode,
892 Error parseAttributeBlock();
893 Error parseAttributeGroupBlock();
894 Error parseTypeTable();
895 Error parseTypeTableBody();
896 Error parseOperandBundleTags();
897 Error parseSyncScopeNames();
900 unsigned NameIndex,
Triple &TT);
901 void setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
Function *
F,
904 Error parseGlobalValueSymbolTable();
905 Error parseConstants();
906 Error rememberAndSkipFunctionBodies();
907 Error rememberAndSkipFunctionBody();
909 Error rememberAndSkipMetadata();
912 Error globalCleanup();
913 Error resolveGlobalAndIndirectSymbolInits();
914 Error parseUseLists();
915 Error findFunctionInStream(
924class ModuleSummaryIndexBitcodeReader :
public BitcodeReaderBase {
930 bool SeenGlobalValSummary =
false;
933 bool SeenValueSymbolTable =
false;
949 std::tuple<ValueInfo, GlobalValue::GUID, GlobalValue::GUID>>
950 ValueIdToValueInfoMap;
959 std::string SourceFileName;
971 std::vector<uint64_t> StackIds;
974 ModuleSummaryIndexBitcodeReader(
985 Error parseValueSymbolTable(
990 bool IsOldProfileFormat,
993 Error parseEntireSummary(
unsigned ID);
994 Error parseModuleStringTable();
998 std::vector<FunctionSummary::ParamAccess>
1001 template <
bool AllowNullValueInfo = false>
1002 std::tuple<ValueInfo, GlobalValue::GUID, GlobalValue::GUID>
1003 getValueInfoFromValueId(
unsigned ValueId);
1005 void addThisModule();
1021 return std::error_code();
1027 : BitcodeReaderBase(
std::
move(Stream), Strtab), Context(Context),
1028 ValueList(this->Stream.SizeInBytes(),
1030 return materializeValue(
ValID, InsertBB);
1032 this->ProducerIdentification = std::string(ProducerIdentification);
1035Error BitcodeReader::materializeForwardReferencedFunctions() {
1036 if (WillMaterializeAllForwardRefs)
1040 WillMaterializeAllForwardRefs =
true;
1042 while (!BasicBlockFwdRefQueue.empty()) {
1043 Function *
F = BasicBlockFwdRefQueue.front();
1044 BasicBlockFwdRefQueue.pop_front();
1045 assert(
F &&
"Expected valid function");
1046 if (!BasicBlockFwdRefs.
count(
F))
1054 if (!
F->isMaterializable())
1055 return error(
"Never resolved function from blockaddress");
1058 if (
Error Err = materialize(
F))
1061 assert(BasicBlockFwdRefs.
empty() &&
"Function missing from queue");
1063 for (
Function *
F : BackwardRefFunctions)
1064 if (
Error Err = materialize(
F))
1066 BackwardRefFunctions.clear();
1069 WillMaterializeAllForwardRefs =
false;
1133 Flags.ReadNone = RawFlags & 0x1;
1134 Flags.ReadOnly = (RawFlags >> 1) & 0x1;
1135 Flags.NoRecurse = (RawFlags >> 2) & 0x1;
1136 Flags.ReturnDoesNotAlias = (RawFlags >> 3) & 0x1;
1137 Flags.NoInline = (RawFlags >> 4) & 0x1;
1138 Flags.AlwaysInline = (RawFlags >> 5) & 0x1;
1139 Flags.NoUnwind = (RawFlags >> 6) & 0x1;
1140 Flags.MayThrow = (RawFlags >> 7) & 0x1;
1141 Flags.HasUnknownCall = (RawFlags >> 8) & 0x1;
1142 Flags.MustBeUnreachable = (RawFlags >> 9) & 0x1;
1158 RawFlags = RawFlags >> 4;
1159 bool NotEligibleToImport = (RawFlags & 0x1) || Version < 3;
1163 bool Live = (RawFlags & 0x2) || Version < 3;
1164 bool Local = (RawFlags & 0x4);
1165 bool AutoHide = (RawFlags & 0x8);
1168 Live, Local, AutoHide, IK);
1174 (RawFlags & 0x1) ?
true :
false, (RawFlags & 0x2) ?
true :
false,
1175 (RawFlags & 0x4) ?
true :
false,
1179static std::pair<CalleeInfo::HotnessType, bool>
1183 bool HasTailCall = (RawFlags & 0x8);
1184 return {Hotness, HasTailCall};
1188 bool &HasTailCall) {
1189 static constexpr uint64_t RelBlockFreqMask =
1191 RelBF = RawFlags & RelBlockFreqMask;
1217 case 0:
return false;
1218 case 1:
return true;
1241 case 0:
return GlobalVariable::NotThreadLocal;
1243 case 1:
return GlobalVariable::GeneralDynamicTLSModel;
1244 case 2:
return GlobalVariable::LocalDynamicTLSModel;
1245 case 3:
return GlobalVariable::InitialExecTLSModel;
1246 case 4:
return GlobalVariable::LocalExecTLSModel;
1253 case 0:
return GlobalVariable::UnnamedAddr::None;
1254 case 1:
return GlobalVariable::UnnamedAddr::Global;
1255 case 2:
return GlobalVariable::UnnamedAddr::Local;
1288 return IsFP ? Instruction::FNeg : -1;
1302 return IsFP ? Instruction::FAdd : Instruction::Add;
1304 return IsFP ? Instruction::FSub : Instruction::Sub;
1306 return IsFP ? Instruction::FMul : Instruction::Mul;
1308 return IsFP ? -1 : Instruction::UDiv;
1310 return IsFP ? Instruction::FDiv : Instruction::SDiv;
1312 return IsFP ? -1 : Instruction::URem;
1314 return IsFP ? Instruction::FRem : Instruction::SRem;
1316 return IsFP ? -1 : Instruction::Shl;
1318 return IsFP ? -1 : Instruction::LShr;
1320 return IsFP ? -1 : Instruction::AShr;
1322 return IsFP ? -1 : Instruction::And;
1324 return IsFP ? -1 : Instruction::Or;
1326 return IsFP ? -1 : Instruction::Xor;
1415Type *BitcodeReader::getTypeByID(
unsigned ID) {
1417 if (
ID >= TypeList.size())
1420 if (
Type *Ty = TypeList[
ID])
1425 return TypeList[
ID] = createIdentifiedStructType(Context);
1428unsigned BitcodeReader::getContainedTypeID(
unsigned ID,
unsigned Idx) {
1429 auto It = ContainedTypeIDs.
find(
ID);
1430 if (It == ContainedTypeIDs.
end())
1431 return InvalidTypeID;
1433 if (
Idx >= It->second.size())
1434 return InvalidTypeID;
1436 return It->second[
Idx];
1439Type *BitcodeReader::getPtrElementTypeByID(
unsigned ID) {
1440 if (
ID >= TypeList.size())
1447 return getTypeByID(getContainedTypeID(
ID, 0));
1450unsigned BitcodeReader::getVirtualTypeID(
Type *Ty,
1452 unsigned ChildTypeID = ChildTypeIDs.
empty() ? InvalidTypeID : ChildTypeIDs[0];
1453 auto CacheKey = std::make_pair(Ty, ChildTypeID);
1454 auto It = VirtualTypeIDs.
find(CacheKey);
1455 if (It != VirtualTypeIDs.
end()) {
1461 ContainedTypeIDs[It->second] == ChildTypeIDs) &&
1462 "Incorrect cached contained type IDs");
1466 unsigned TypeID = TypeList.size();
1467 TypeList.push_back(Ty);
1468 if (!ChildTypeIDs.
empty())
1486 uint8_t Opcode = BC->Opcode;
1489 if (Opcode >= BitcodeConstant::FirstSpecialOpcode)
1503 if (Opcode == Instruction::GetElementPtr)
1507 case Instruction::FNeg:
1508 case Instruction::Select:
1509 case Instruction::ICmp:
1510 case Instruction::FCmp:
1520 if (StartValID < ValueList.
size() && ValueList[StartValID] &&
1521 !isa<BitcodeConstant>(ValueList[StartValID]))
1522 return ValueList[StartValID];
1527 while (!Worklist.
empty()) {
1536 return error(
"Invalid value ID");
1539 auto *BC = dyn_cast<BitcodeConstant>(V);
1549 for (
unsigned OpID :
reverse(BC->getOperandIDs())) {
1550 auto It = MaterializedValues.
find(OpID);
1551 if (It != MaterializedValues.
end())
1559 if (Ops.
size() != BC->getOperandIDs().size())
1561 std::reverse(Ops.
begin(), Ops.
end());
1565 if (
auto *
C = dyn_cast<Constant>(
Op))
1578 switch (BC->Opcode) {
1579 case BitcodeConstant::ConstantPtrAuthOpcode: {
1580 auto *
Key = dyn_cast<ConstantInt>(ConstOps[1]);
1582 return error(
"ptrauth key operand must be ConstantInt");
1584 auto *Disc = dyn_cast<ConstantInt>(ConstOps[2]);
1586 return error(
"ptrauth disc operand must be ConstantInt");
1591 case BitcodeConstant::NoCFIOpcode: {
1592 auto *GV = dyn_cast<GlobalValue>(ConstOps[0]);
1594 return error(
"no_cfi operand must be GlobalValue");
1598 case BitcodeConstant::DSOLocalEquivalentOpcode: {
1599 auto *GV = dyn_cast<GlobalValue>(ConstOps[0]);
1601 return error(
"dso_local operand must be GlobalValue");
1605 case BitcodeConstant::BlockAddressOpcode: {
1606 Function *Fn = dyn_cast<Function>(ConstOps[0]);
1608 return error(
"blockaddress operand must be a function");
1613 unsigned BBID = BC->BlockAddressBB;
1616 return error(
"Invalid ID");
1619 for (
size_t I = 0, E = BBID;
I != E; ++
I) {
1621 return error(
"Invalid ID");
1628 auto &FwdBBs = BasicBlockFwdRefs[Fn];
1630 BasicBlockFwdRefQueue.push_back(Fn);
1631 if (FwdBBs.size() < BBID + 1)
1632 FwdBBs.resize(BBID + 1);
1640 case BitcodeConstant::ConstantStructOpcode:
1643 case BitcodeConstant::ConstantArrayOpcode:
1646 case BitcodeConstant::ConstantVectorOpcode:
1649 case Instruction::GetElementPtr:
1651 BC->SrcElemTy, ConstOps[0],
ArrayRef(ConstOps).drop_front(),
1654 case Instruction::ExtractElement:
1657 case Instruction::InsertElement:
1661 case Instruction::ShuffleVector: {
1680 return error(
Twine(
"Value referenced by initializer is an unsupported "
1681 "constant expression of type ") +
1682 BC->getOpcodeName());
1688 BC->getType(),
"constexpr", InsertBB);
1691 "constexpr", InsertBB);
1694 Ops[1],
"constexpr", InsertBB);
1695 if (isa<OverflowingBinaryOperator>(
I)) {
1697 I->setHasNoSignedWrap();
1699 I->setHasNoUnsignedWrap();
1701 if (isa<PossiblyExactOperator>(
I) &&
1705 switch (BC->Opcode) {
1706 case BitcodeConstant::ConstantVectorOpcode: {
1710 Value *
Idx = ConstantInt::get(IdxTy, Pair.index());
1714 I = cast<Instruction>(V);
1717 case BitcodeConstant::ConstantStructOpcode:
1718 case BitcodeConstant::ConstantArrayOpcode: {
1722 "constexpr.ins", InsertBB);
1723 I = cast<Instruction>(V);
1726 case Instruction::ICmp:
1727 case Instruction::FCmp:
1730 "constexpr", InsertBB);
1732 case Instruction::GetElementPtr:
1734 ArrayRef(Ops).drop_front(),
"constexpr",
1738 case Instruction::Select:
1741 case Instruction::ExtractElement:
1744 case Instruction::InsertElement:
1748 case Instruction::ShuffleVector:
1761 return MaterializedValues[StartValID];
1770 return cast<Constant>(MaybeV.
get());
1776 IdentifiedStructTypes.push_back(Ret);
1782 IdentifiedStructTypes.push_back(Ret);
1798 case Attribute::ZExt:
return 1 << 0;
1799 case Attribute::SExt:
return 1 << 1;
1800 case Attribute::NoReturn:
return 1 << 2;
1801 case Attribute::InReg:
return 1 << 3;
1802 case Attribute::StructRet:
return 1 << 4;
1803 case Attribute::NoUnwind:
return 1 << 5;
1804 case Attribute::NoAlias:
return 1 << 6;
1805 case Attribute::ByVal:
return 1 << 7;
1806 case Attribute::Nest:
return 1 << 8;
1807 case Attribute::ReadNone:
return 1 << 9;
1808 case Attribute::ReadOnly:
return 1 << 10;
1809 case Attribute::NoInline:
return 1 << 11;
1810 case Attribute::AlwaysInline:
return 1 << 12;
1811 case Attribute::OptimizeForSize:
return 1 << 13;
1812 case Attribute::StackProtect:
return 1 << 14;
1813 case Attribute::StackProtectReq:
return 1 << 15;
1814 case Attribute::Alignment:
return 31 << 16;
1815 case Attribute::NoCapture:
return 1 << 21;
1816 case Attribute::NoRedZone:
return 1 << 22;
1817 case Attribute::NoImplicitFloat:
return 1 << 23;
1818 case Attribute::Naked:
return 1 << 24;
1819 case Attribute::InlineHint:
return 1 << 25;
1820 case Attribute::StackAlignment:
return 7 << 26;
1821 case Attribute::ReturnsTwice:
return 1 << 29;
1822 case Attribute::UWTable:
return 1 << 30;
1823 case Attribute::NonLazyBind:
return 1U << 31;
1824 case Attribute::SanitizeAddress:
return 1ULL << 32;
1825 case Attribute::MinSize:
return 1ULL << 33;
1826 case Attribute::NoDuplicate:
return 1ULL << 34;
1827 case Attribute::StackProtectStrong:
return 1ULL << 35;
1828 case Attribute::SanitizeThread:
return 1ULL << 36;
1829 case Attribute::SanitizeMemory:
return 1ULL << 37;
1830 case Attribute::NoBuiltin:
return 1ULL << 38;
1831 case Attribute::Returned:
return 1ULL << 39;
1832 case Attribute::Cold:
return 1ULL << 40;
1833 case Attribute::Builtin:
return 1ULL << 41;
1834 case Attribute::OptimizeNone:
return 1ULL << 42;
1835 case Attribute::InAlloca:
return 1ULL << 43;
1836 case Attribute::NonNull:
return 1ULL << 44;
1837 case Attribute::JumpTable:
return 1ULL << 45;
1838 case Attribute::Convergent:
return 1ULL << 46;
1839 case Attribute::SafeStack:
return 1ULL << 47;
1840 case Attribute::NoRecurse:
return 1ULL << 48;
1843 case Attribute::SwiftSelf:
return 1ULL << 51;
1844 case Attribute::SwiftError:
return 1ULL << 52;
1845 case Attribute::WriteOnly:
return 1ULL << 53;
1846 case Attribute::Speculatable:
return 1ULL << 54;
1847 case Attribute::StrictFP:
return 1ULL << 55;
1848 case Attribute::SanitizeHWAddress:
return 1ULL << 56;
1849 case Attribute::NoCfCheck:
return 1ULL << 57;
1850 case Attribute::OptForFuzzing:
return 1ULL << 58;
1851 case Attribute::ShadowCallStack:
return 1ULL << 59;
1852 case Attribute::SpeculativeLoadHardening:
1854 case Attribute::ImmArg:
1856 case Attribute::WillReturn:
1858 case Attribute::NoFree:
1874 if (
I == Attribute::Alignment)
1875 B.addAlignmentAttr(1ULL << ((
A >> 16) - 1));
1876 else if (
I == Attribute::StackAlignment)
1877 B.addStackAlignmentAttr(1ULL << ((
A >> 26)-1));
1879 B.addTypeAttr(
I,
nullptr);
1894 unsigned Alignment = (EncodedAttrs & (0xffffULL << 16)) >> 16;
1896 "Alignment must be a power of two.");
1899 B.addAlignmentAttr(Alignment);
1901 uint64_t Attrs = ((EncodedAttrs & (0xfffffULL << 32)) >> 11) |
1902 (EncodedAttrs & 0xffff);
1907 if (Attrs & (1ULL << 9)) {
1909 Attrs &= ~(1ULL << 9);
1912 if (Attrs & (1ULL << 10)) {
1914 Attrs &= ~(1ULL << 10);
1917 if (Attrs & (1ULL << 49)) {
1919 Attrs &= ~(1ULL << 49);
1922 if (Attrs & (1ULL << 50)) {
1924 Attrs &= ~(1ULL << 50);
1927 if (Attrs & (1ULL << 53)) {
1929 Attrs &= ~(1ULL << 53);
1933 B.addMemoryAttr(ME);
1939Error BitcodeReader::parseAttributeBlock() {
1943 if (!MAttributes.empty())
1944 return error(
"Invalid multiple blocks");
1957 switch (
Entry.Kind) {
1960 return error(
"Malformed block");
1973 switch (MaybeRecord.
get()) {
1979 return error(
"Invalid parameter attribute record");
1981 for (
unsigned i = 0, e =
Record.size(); i != e; i += 2) {
1992 Attrs.push_back(MAttributeGroups[Val]);
2007 return Attribute::Alignment;
2009 return Attribute::AlwaysInline;
2011 return Attribute::Builtin;
2013 return Attribute::ByVal;
2015 return Attribute::InAlloca;
2017 return Attribute::Cold;
2019 return Attribute::Convergent;
2021 return Attribute::DisableSanitizerInstrumentation;
2023 return Attribute::ElementType;
2025 return Attribute::FnRetThunkExtern;
2027 return Attribute::InlineHint;
2029 return Attribute::InReg;
2031 return Attribute::JumpTable;
2033 return Attribute::Memory;
2035 return Attribute::NoFPClass;
2037 return Attribute::MinSize;
2039 return Attribute::Naked;
2041 return Attribute::Nest;
2043 return Attribute::NoAlias;
2045 return Attribute::NoBuiltin;
2047 return Attribute::NoCallback;
2049 return Attribute::NoCapture;
2051 return Attribute::NoDuplicate;
2053 return Attribute::NoFree;
2055 return Attribute::NoImplicitFloat;
2057 return Attribute::NoInline;
2059 return Attribute::NoRecurse;
2061 return Attribute::NoMerge;
2063 return Attribute::NonLazyBind;
2065 return Attribute::NonNull;
2067 return Attribute::Dereferenceable;
2069 return Attribute::DereferenceableOrNull;
2071 return Attribute::AllocAlign;
2073 return Attribute::AllocKind;
2075 return Attribute::AllocSize;
2077 return Attribute::AllocatedPointer;
2079 return Attribute::NoRedZone;
2081 return Attribute::NoReturn;
2083 return Attribute::NoSync;
2085 return Attribute::NoCfCheck;
2087 return Attribute::NoProfile;
2089 return Attribute::SkipProfile;
2091 return Attribute::NoUnwind;
2093 return Attribute::NoSanitizeBounds;
2095 return Attribute::NoSanitizeCoverage;
2097 return Attribute::NullPointerIsValid;
2099 return Attribute::OptimizeForDebugging;
2101 return Attribute::OptForFuzzing;
2103 return Attribute::OptimizeForSize;
2105 return Attribute::OptimizeNone;
2107 return Attribute::ReadNone;
2109 return Attribute::ReadOnly;
2111 return Attribute::Returned;
2113 return Attribute::ReturnsTwice;
2115 return Attribute::SExt;
2117 return Attribute::Speculatable;
2119 return Attribute::StackAlignment;
2121 return Attribute::StackProtect;
2123 return Attribute::StackProtectReq;
2125 return Attribute::StackProtectStrong;
2127 return Attribute::SafeStack;
2129 return Attribute::ShadowCallStack;
2131 return Attribute::StrictFP;
2133 return Attribute::StructRet;
2135 return Attribute::SanitizeAddress;
2137 return Attribute::SanitizeHWAddress;
2139 return Attribute::SanitizeThread;
2141 return Attribute::SanitizeMemory;
2143 return Attribute::SanitizeNumericalStability;
2145 return Attribute::SanitizeRealtime;
2147 return Attribute::SpeculativeLoadHardening;
2149 return Attribute::SwiftError;
2151 return Attribute::SwiftSelf;
2153 return Attribute::SwiftAsync;
2155 return Attribute::UWTable;
2157 return Attribute::VScaleRange;
2159 return Attribute::WillReturn;
2161 return Attribute::WriteOnly;
2163 return Attribute::ZExt;
2165 return Attribute::ImmArg;
2167 return Attribute::SanitizeMemTag;
2169 return Attribute::Preallocated;
2171 return Attribute::NoUndef;
2173 return Attribute::ByRef;
2175 return Attribute::MustProgress;
2177 return Attribute::Hot;
2179 return Attribute::PresplitCoroutine;
2181 return Attribute::Writable;
2183 return Attribute::CoroDestroyOnlyWhenComplete;
2185 return Attribute::DeadOnUnwind;
2187 return Attribute::Range;
2189 return Attribute::Initializes;
2198 return error(
"Invalid alignment value");
2206 return error(
"Unknown attribute kind (" +
Twine(Code) +
")");
2211 switch (EncodedKind) {
2235Error BitcodeReader::parseAttributeGroupBlock() {
2239 if (!MAttributeGroups.empty())
2240 return error(
"Invalid multiple blocks");
2251 switch (
Entry.Kind) {
2254 return error(
"Malformed block");
2267 switch (MaybeRecord.
get()) {
2272 return error(
"Invalid grp record");
2279 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2287 if (
Error Err = parseAttrKind(EncodedKind, &Kind))
2293 if (Kind == Attribute::ByVal)
2294 B.addByValAttr(
nullptr);
2295 else if (Kind == Attribute::StructRet)
2296 B.addStructRetAttr(
nullptr);
2297 else if (Kind == Attribute::InAlloca)
2298 B.addInAllocaAttr(
nullptr);
2299 else if (Kind == Attribute::UWTable)
2300 B.addUWTableAttr(UWTableKind::Default);
2302 B.addAttribute(Kind);
2304 return error(
"Not an enum attribute");
2305 }
else if (
Record[i] == 1) {
2307 if (
Error Err = parseAttrKind(
Record[++i], &Kind))
2310 return error(
"Not an int attribute");
2311 if (Kind == Attribute::Alignment)
2312 B.addAlignmentAttr(
Record[++i]);
2313 else if (Kind == Attribute::StackAlignment)
2314 B.addStackAlignmentAttr(
Record[++i]);
2315 else if (Kind == Attribute::Dereferenceable)
2316 B.addDereferenceableAttr(
Record[++i]);
2317 else if (Kind == Attribute::DereferenceableOrNull)
2318 B.addDereferenceableOrNullAttr(
Record[++i]);
2319 else if (Kind == Attribute::AllocSize)
2320 B.addAllocSizeAttrFromRawRepr(
Record[++i]);
2321 else if (Kind == Attribute::VScaleRange)
2322 B.addVScaleRangeAttrFromRawRepr(
Record[++i]);
2323 else if (Kind == Attribute::UWTable)
2325 else if (Kind == Attribute::AllocKind)
2327 else if (Kind == Attribute::Memory)
2329 else if (Kind == Attribute::NoFPClass)
2337 while (
Record[i] != 0 && i != e)
2339 assert(
Record[i] == 0 &&
"Kind string not null terminated");
2344 while (
Record[i] != 0 && i != e)
2346 assert(
Record[i] == 0 &&
"Value string not null terminated");
2349 B.addAttribute(KindStr.
str(), ValStr.
str());
2351 bool HasType =
Record[i] == 6;
2353 if (
Error Err = parseAttrKind(
Record[++i], &Kind))
2356 return error(
"Not a type attribute");
2358 B.addTypeAttr(Kind, HasType ? getTypeByID(
Record[++i]) :
nullptr);
2359 }
else if (
Record[i] == 7) {
2363 if (
Error Err = parseAttrKind(
Record[i++], &Kind))
2366 return error(
"Not a ConstantRange attribute");
2369 readBitWidthAndConstantRange(
Record, i);
2374 B.addConstantRangeAttr(Kind, MaybeCR.
get());
2375 }
else if (
Record[i] == 8) {
2379 if (
Error Err = parseAttrKind(
Record[i++], &Kind))
2382 return error(
"Not a constant range list attribute");
2386 return error(
"Too few records for constant range list");
2387 unsigned RangeSize =
Record[i++];
2389 for (
unsigned Idx = 0;
Idx < RangeSize; ++
Idx) {
2399 return error(
"Invalid (unordered or overlapping) range list");
2400 B.addConstantRangeListAttr(Kind, Val);
2402 return error(
"Invalid attribute group entry");
2407 B.addMemoryAttr(ME);
2417Error BitcodeReader::parseTypeTable() {
2421 return parseTypeTableBody();
2424Error BitcodeReader::parseTypeTableBody() {
2425 if (!TypeList.empty())
2426 return error(
"Invalid multiple blocks");
2429 unsigned NumRecords = 0;
2440 switch (
Entry.Kind) {
2443 return error(
"Malformed block");
2445 if (NumRecords != TypeList.size())
2446 return error(
"Malformed block");
2455 Type *ResultTy =
nullptr;
2460 switch (MaybeRecord.
get()) {
2462 return error(
"Invalid value");
2467 return error(
"Invalid numentry record");
2468 TypeList.resize(
Record[0]);
2513 return error(
"Invalid integer record");
2518 return error(
"Bitwidth for integer type out of range");
2525 return error(
"Invalid pointer record");
2529 ResultTy = getTypeByID(
Record[0]);
2531 !PointerType::isValidElementType(ResultTy))
2532 return error(
"Invalid type");
2539 return error(
"Invalid opaque pointer record");
2548 return error(
"Invalid function record");
2550 for (
unsigned i = 3, e =
Record.size(); i != e; ++i) {
2557 ResultTy = getTypeByID(
Record[2]);
2558 if (!ResultTy || ArgTys.
size() <
Record.size()-3)
2559 return error(
"Invalid type");
2562 ResultTy = FunctionType::get(ResultTy, ArgTys,
Record[0]);
2568 return error(
"Invalid function record");
2570 for (
unsigned i = 2, e =
Record.size(); i != e; ++i) {
2572 if (!FunctionType::isValidArgumentType(
T))
2573 return error(
"Invalid function argument type");
2580 ResultTy = getTypeByID(
Record[1]);
2581 if (!ResultTy || ArgTys.
size() <
Record.size()-2)
2582 return error(
"Invalid type");
2585 ResultTy = FunctionType::get(ResultTy, ArgTys,
Record[0]);
2590 return error(
"Invalid anon struct record");
2592 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2599 return error(
"Invalid type");
2606 return error(
"Invalid struct name record");
2611 return error(
"Invalid named struct record");
2613 if (NumRecords >= TypeList.size())
2614 return error(
"Invalid TYPE table");
2617 StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]);
2620 TypeList[NumRecords] =
nullptr;
2622 Res = createIdentifiedStructType(Context, TypeName);
2626 for (
unsigned i = 1, e =
Record.size(); i != e; ++i) {
2633 return error(
"Invalid named struct record");
2641 return error(
"Invalid opaque type record");
2643 if (NumRecords >= TypeList.size())
2644 return error(
"Invalid TYPE table");
2647 StructType *Res = cast_or_null<StructType>(TypeList[NumRecords]);
2650 TypeList[NumRecords] =
nullptr;
2652 Res = createIdentifiedStructType(Context, TypeName);
2659 return error(
"Invalid target extension type record");
2661 if (NumRecords >= TypeList.size())
2662 return error(
"Invalid TYPE table");
2665 return error(
"Too many type parameters");
2667 unsigned NumTys =
Record[0];
2670 for (
unsigned i = 0; i < NumTys; i++) {
2674 return error(
"Invalid type");
2677 for (
unsigned i = NumTys + 1, e =
Record.size(); i < e; i++) {
2678 if (
Record[i] > UINT_MAX)
2679 return error(
"Integer parameter too large");
2688 return error(
"Invalid array type record");
2689 ResultTy = getTypeByID(
Record[1]);
2690 if (!ResultTy || !ArrayType::isValidElementType(ResultTy))
2691 return error(
"Invalid type");
2693 ResultTy = ArrayType::get(ResultTy,
Record[0]);
2698 return error(
"Invalid vector type record");
2700 return error(
"Invalid vector length");
2701 ResultTy = getTypeByID(
Record[1]);
2702 if (!ResultTy || !VectorType::isValidElementType(ResultTy))
2703 return error(
"Invalid type");
2706 ResultTy = VectorType::get(ResultTy,
Record[0], Scalable);
2710 if (NumRecords >= TypeList.size())
2711 return error(
"Invalid TYPE table");
2712 if (TypeList[NumRecords])
2714 "Invalid TYPE table: Only named structs can be forward referenced");
2715 assert(ResultTy &&
"Didn't read a type?");
2716 TypeList[NumRecords] = ResultTy;
2717 if (!ContainedIDs.
empty())
2718 ContainedTypeIDs[NumRecords] = std::move(ContainedIDs);
2723Error BitcodeReader::parseOperandBundleTags() {
2727 if (!BundleTags.empty())
2728 return error(
"Invalid multiple blocks");
2738 switch (
Entry.Kind) {
2741 return error(
"Malformed block");
2755 return error(
"Invalid operand bundle record");
2758 BundleTags.emplace_back();
2760 return error(
"Invalid operand bundle record");
2765Error BitcodeReader::parseSyncScopeNames() {
2770 return error(
"Invalid multiple synchronization scope names blocks");
2779 switch (
Entry.Kind) {
2782 return error(
"Malformed block");
2785 return error(
"Invalid empty synchronization scope names block");
2799 return error(
"Invalid sync scope record");
2803 return error(
"Invalid sync scope record");
2812 unsigned NameIndex,
Triple &TT) {
2815 return error(
"Invalid record");
2816 unsigned ValueID =
Record[0];
2817 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2818 return error(
"Invalid record");
2819 Value *
V = ValueList[ValueID];
2822 if (NameStr.contains(0))
2823 return error(
"Invalid value name");
2824 V->setName(NameStr);
2825 auto *GO = dyn_cast<GlobalObject>(V);
2826 if (GO && ImplicitComdatObjects.
contains(GO) &&
TT.supportsCOMDAT())
2839 return std::move(JumpFailed);
2845 return error(
"Expected value symbol table subblock");
2849void BitcodeReader::setDeferredFunctionInfo(
unsigned FuncBitcodeOffsetDelta,
2856 uint64_t FuncBitOffset = FuncWordOffset * 32;
2857 DeferredFunctionInfo[
F] = FuncBitOffset + FuncBitcodeOffsetDelta;
2861 if (FuncBitOffset > LastFunctionBlockBit)
2862 LastFunctionBlockBit = FuncBitOffset;
2866Error BitcodeReader::parseGlobalValueSymbolTable() {
2867 unsigned FuncBitcodeOffsetDelta =
2880 switch (
Entry.Kind) {
2883 return error(
"Malformed block");
2894 switch (MaybeRecord.
get()) {
2896 unsigned ValueID =
Record[0];
2897 if (ValueID >= ValueList.
size() || !ValueList[ValueID])
2898 return error(
"Invalid value reference in symbol table");
2899 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
2900 cast<Function>(ValueList[ValueID]),
Record);
2916 if (!MaybeCurrentBit)
2918 CurrentBit = MaybeCurrentBit.
get();
2921 if (
Error Err = parseGlobalValueSymbolTable())
2923 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
2942 unsigned FuncBitcodeOffsetDelta =
2961 switch (
Entry.Kind) {
2964 return error(
"Malformed block");
2967 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
2980 switch (MaybeRecord.
get()) {
2999 if (
auto *
F = dyn_cast<Function>(V))
3000 setDeferredFunctionInfo(FuncBitcodeOffsetDelta,
F,
Record);
3005 return error(
"Invalid bbentry record");
3008 return error(
"Invalid bbentry record");
3030Error BitcodeReader::resolveGlobalAndIndirectSymbolInits() {
3031 std::vector<std::pair<GlobalVariable *, unsigned>> GlobalInitWorklist;
3032 std::vector<std::pair<GlobalValue *, unsigned>> IndirectSymbolInitWorklist;
3033 std::vector<FunctionOperandInfo> FunctionOperandWorklist;
3035 GlobalInitWorklist.swap(GlobalInits);
3036 IndirectSymbolInitWorklist.swap(IndirectSymbolInits);
3037 FunctionOperandWorklist.swap(FunctionOperands);
3039 while (!GlobalInitWorklist.empty()) {
3040 unsigned ValID = GlobalInitWorklist.back().second;
3043 GlobalInits.push_back(GlobalInitWorklist.back());
3048 GlobalInitWorklist.back().first->setInitializer(MaybeC.
get());
3050 GlobalInitWorklist.pop_back();
3053 while (!IndirectSymbolInitWorklist.empty()) {
3054 unsigned ValID = IndirectSymbolInitWorklist.back().second;
3056 IndirectSymbolInits.push_back(IndirectSymbolInitWorklist.back());
3062 GlobalValue *GV = IndirectSymbolInitWorklist.back().first;
3063 if (
auto *GA = dyn_cast<GlobalAlias>(GV)) {
3065 return error(
"Alias and aliasee types don't match");
3067 }
else if (
auto *GI = dyn_cast<GlobalIFunc>(GV)) {
3070 return error(
"Expected an alias or an ifunc");
3073 IndirectSymbolInitWorklist.pop_back();
3076 while (!FunctionOperandWorklist.empty()) {
3077 FunctionOperandInfo &
Info = FunctionOperandWorklist.back();
3078 if (
Info.PersonalityFn) {
3079 unsigned ValID =
Info.PersonalityFn - 1;
3084 Info.F->setPersonalityFn(MaybeC.
get());
3085 Info.PersonalityFn = 0;
3094 Info.F->setPrefixData(MaybeC.
get());
3098 if (
Info.Prologue) {
3104 Info.F->setPrologueData(MaybeC.
get());
3108 if (
Info.PersonalityFn ||
Info.Prefix ||
Info.Prologue)
3109 FunctionOperands.push_back(Info);
3110 FunctionOperandWorklist.pop_back();
3119 BitcodeReader::decodeSignRotatedValue);
3121 return APInt(TypeBits, Words);
3124Error BitcodeReader::parseConstants() {
3132 unsigned Int32TyID = getVirtualTypeID(CurTy);
3133 unsigned CurTyID = Int32TyID;
3134 Type *CurElemTy =
nullptr;
3135 unsigned NextCstNo = ValueList.
size();
3143 switch (Entry.Kind) {
3146 return error(
"Malformed block");
3148 if (NextCstNo != ValueList.
size())
3149 return error(
"Invalid constant reference");
3163 switch (
unsigned BitCode = MaybeBitCode.
get()) {
3173 return error(
"Invalid settype record");
3174 if (
Record[0] >= TypeList.size() || !TypeList[
Record[0]])
3175 return error(
"Invalid settype record");
3176 if (TypeList[
Record[0]] == VoidType)
3177 return error(
"Invalid constant type");
3179 CurTy = TypeList[CurTyID];
3180 CurElemTy = getPtrElementTypeByID(CurTyID);
3184 return error(
"Invalid type for a constant null value");
3185 if (
auto *TETy = dyn_cast<TargetExtType>(CurTy))
3187 return error(
"Invalid type for a constant null value");
3192 return error(
"Invalid integer const record");
3197 return error(
"Invalid wide integer const record");
3201 V = ConstantInt::get(CurTy, VInt);
3206 return error(
"Invalid float const record");
3209 if (ScalarTy->isHalfTy())
3210 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEhalf(),
3212 else if (ScalarTy->isBFloatTy())
3213 V = ConstantFP::get(
3215 else if (ScalarTy->isFloatTy())
3216 V = ConstantFP::get(CurTy,
APFloat(APFloat::IEEEsingle(),
3218 else if (ScalarTy->isDoubleTy())
3219 V = ConstantFP::get(
3221 else if (ScalarTy->isX86_FP80Ty()) {
3224 Rearrange[0] = (
Record[1] & 0xffffLL) | (
Record[0] << 16);
3225 Rearrange[1] =
Record[0] >> 48;
3226 V = ConstantFP::get(
3227 CurTy,
APFloat(APFloat::x87DoubleExtended(),
APInt(80, Rearrange)));
3228 }
else if (ScalarTy->isFP128Ty())
3229 V = ConstantFP::get(CurTy,
3231 else if (ScalarTy->isPPC_FP128Ty())
3232 V = ConstantFP::get(
3241 return error(
"Invalid aggregate record");
3245 for (
unsigned i = 0; i !=
Size; ++i)
3248 if (isa<StructType>(CurTy)) {
3249 V = BitcodeConstant::create(
3250 Alloc, CurTy, BitcodeConstant::ConstantStructOpcode, Elts);
3251 }
else if (isa<ArrayType>(CurTy)) {
3252 V = BitcodeConstant::create(Alloc, CurTy,
3253 BitcodeConstant::ConstantArrayOpcode, Elts);
3254 }
else if (isa<VectorType>(CurTy)) {
3255 V = BitcodeConstant::create(
3256 Alloc, CurTy, BitcodeConstant::ConstantVectorOpcode, Elts);
3265 return error(
"Invalid string record");
3274 return error(
"Invalid data record");
3277 if (
auto *Array = dyn_cast<ArrayType>(CurTy))
3278 EltTy =
Array->getElementType();
3280 EltTy = cast<VectorType>(CurTy)->getElementType();
3283 if (isa<VectorType>(CurTy))
3289 if (isa<VectorType>(CurTy))
3295 if (isa<VectorType>(CurTy))
3301 if (isa<VectorType>(CurTy))
3307 if (isa<VectorType>(CurTy))
3313 if (isa<VectorType>(CurTy))
3319 if (isa<VectorType>(CurTy))
3325 if (isa<VectorType>(CurTy))
3330 return error(
"Invalid type for value");
3336 return error(
"Invalid unary op constexpr record");
3341 V = BitcodeConstant::create(Alloc, CurTy, Opc, (
unsigned)
Record[1]);
3347 return error(
"Invalid binary op constexpr record");
3353 if (
Record.size() >= 4) {
3354 if (Opc == Instruction::Add ||
3355 Opc == Instruction::Sub ||
3356 Opc == Instruction::Mul ||
3357 Opc == Instruction::Shl) {
3362 }
else if (Opc == Instruction::SDiv ||
3363 Opc == Instruction::UDiv ||
3364 Opc == Instruction::LShr ||
3365 Opc == Instruction::AShr) {
3370 V = BitcodeConstant::create(Alloc, CurTy, {(uint8_t)Opc, Flags},
3377 return error(
"Invalid cast constexpr record");
3382 unsigned OpTyID =
Record[1];
3383 Type *OpTy = getTypeByID(OpTyID);
3385 return error(
"Invalid cast constexpr record");
3386 V = BitcodeConstant::create(Alloc, CurTy, Opc, (
unsigned)
Record[2]);
3398 return error(
"Constant GEP record must have at least two elements");
3400 Type *PointeeType =
nullptr;
3404 PointeeType = getTypeByID(
Record[OpNum++]);
3407 std::optional<ConstantRange>
InRange;
3411 unsigned InRangeIndex =
Op >> 1;
3418 readBitWidthAndConstantRange(
Record, OpNum);
3428 unsigned BaseTypeID =
Record[OpNum];
3429 while (OpNum !=
Record.size()) {
3430 unsigned ElTyID =
Record[OpNum++];
3431 Type *ElTy = getTypeByID(ElTyID);
3433 return error(
"Invalid getelementptr constexpr record");
3437 if (Elts.
size() < 1)
3438 return error(
"Invalid gep with no operands");
3442 BaseTypeID = getContainedTypeID(BaseTypeID, 0);
3443 BaseType = getTypeByID(BaseTypeID);
3448 return error(
"GEP base operand must be pointer or vector of pointer");
3451 PointeeType = getPtrElementTypeByID(BaseTypeID);
3453 return error(
"Missing element type for old-style constant GEP");
3456 V = BitcodeConstant::create(
3458 {Instruction::GetElementPtr, uint8_t(Flags), PointeeType,
InRange},
3464 return error(
"Invalid select constexpr record");
3466 V = BitcodeConstant::create(
3467 Alloc, CurTy, Instruction::Select,
3474 return error(
"Invalid extractelement constexpr record");
3475 unsigned OpTyID =
Record[0];
3477 dyn_cast_or_null<VectorType>(getTypeByID(OpTyID));
3479 return error(
"Invalid extractelement constexpr record");
3481 if (
Record.size() == 4) {
3482 unsigned IdxTyID =
Record[2];
3483 Type *IdxTy = getTypeByID(IdxTyID);
3485 return error(
"Invalid extractelement constexpr record");
3491 V = BitcodeConstant::create(Alloc, CurTy, Instruction::ExtractElement,
3497 VectorType *OpTy = dyn_cast<VectorType>(CurTy);
3498 if (
Record.size() < 3 || !OpTy)
3499 return error(
"Invalid insertelement constexpr record");
3501 if (
Record.size() == 4) {
3502 unsigned IdxTyID =
Record[2];
3503 Type *IdxTy = getTypeByID(IdxTyID);
3505 return error(
"Invalid insertelement constexpr record");
3511 V = BitcodeConstant::create(
3512 Alloc, CurTy, Instruction::InsertElement,
3517 VectorType *OpTy = dyn_cast<VectorType>(CurTy);
3518 if (
Record.size() < 3 || !OpTy)
3519 return error(
"Invalid shufflevector constexpr record");
3520 V = BitcodeConstant::create(
3521 Alloc, CurTy, Instruction::ShuffleVector,
3526 VectorType *RTy = dyn_cast<VectorType>(CurTy);
3528 dyn_cast_or_null<VectorType>(getTypeByID(
Record[0]));
3529 if (
Record.size() < 4 || !RTy || !OpTy)
3530 return error(
"Invalid shufflevector constexpr record");
3531 V = BitcodeConstant::create(
3532 Alloc, CurTy, Instruction::ShuffleVector,
3538 return error(
"Invalid cmp constexpt record");
3539 unsigned OpTyID =
Record[0];
3540 Type *OpTy = getTypeByID(OpTyID);
3542 return error(
"Invalid cmp constexpr record");
3543 V = BitcodeConstant::create(
3546 : Instruction::ICmp),
3555 return error(
"Invalid inlineasm record");
3556 std::string AsmStr, ConstrStr;
3557 bool HasSideEffects =
Record[0] & 1;
3558 bool IsAlignStack =
Record[0] >> 1;
3559 unsigned AsmStrSize =
Record[1];
3560 if (2+AsmStrSize >=
Record.size())
3561 return error(
"Invalid inlineasm record");
3562 unsigned ConstStrSize =
Record[2+AsmStrSize];
3563 if (3+AsmStrSize+ConstStrSize >
Record.size())
3564 return error(
"Invalid inlineasm record");
3566 for (
unsigned i = 0; i != AsmStrSize; ++i)
3567 AsmStr += (
char)
Record[2+i];
3568 for (
unsigned i = 0; i != ConstStrSize; ++i)
3569 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3572 return error(
"Missing element type for old-style inlineasm");
3574 HasSideEffects, IsAlignStack);
3581 return error(
"Invalid inlineasm record");
3582 std::string AsmStr, ConstrStr;
3583 bool HasSideEffects =
Record[0] & 1;
3584 bool IsAlignStack = (
Record[0] >> 1) & 1;
3585 unsigned AsmDialect =
Record[0] >> 2;
3586 unsigned AsmStrSize =
Record[1];
3587 if (2+AsmStrSize >=
Record.size())
3588 return error(
"Invalid inlineasm record");
3589 unsigned ConstStrSize =
Record[2+AsmStrSize];
3590 if (3+AsmStrSize+ConstStrSize >
Record.size())
3591 return error(
"Invalid inlineasm record");
3593 for (
unsigned i = 0; i != AsmStrSize; ++i)
3594 AsmStr += (
char)
Record[2+i];
3595 for (
unsigned i = 0; i != ConstStrSize; ++i)
3596 ConstrStr += (
char)
Record[3+AsmStrSize+i];
3599 return error(
"Missing element type for old-style inlineasm");
3601 HasSideEffects, IsAlignStack,
3608 return error(
"Invalid inlineasm record");
3610 std::string AsmStr, ConstrStr;
3611 bool HasSideEffects =
Record[OpNum] & 1;
3612 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3613 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3614 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3616 unsigned AsmStrSize =
Record[OpNum];
3618 if (OpNum + AsmStrSize >=
Record.size())
3619 return error(
"Invalid inlineasm record");
3620 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3621 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3622 return error(
"Invalid inlineasm record");
3624 for (
unsigned i = 0; i != AsmStrSize; ++i)
3625 AsmStr += (
char)
Record[OpNum + i];
3627 for (
unsigned i = 0; i != ConstStrSize; ++i)
3628 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3631 return error(
"Missing element type for old-style inlineasm");
3633 HasSideEffects, IsAlignStack,
3640 return error(
"Invalid inlineasm record");
3642 auto *FnTy = dyn_cast_or_null<FunctionType>(getTypeByID(
Record[OpNum]));
3645 return error(
"Invalid inlineasm record");
3646 std::string AsmStr, ConstrStr;
3647 bool HasSideEffects =
Record[OpNum] & 1;
3648 bool IsAlignStack = (
Record[OpNum] >> 1) & 1;
3649 unsigned AsmDialect = (
Record[OpNum] >> 2) & 1;
3650 bool CanThrow = (
Record[OpNum] >> 3) & 1;
3652 unsigned AsmStrSize =
Record[OpNum];
3654 if (OpNum + AsmStrSize >=
Record.size())
3655 return error(
"Invalid inlineasm record");
3656 unsigned ConstStrSize =
Record[OpNum + AsmStrSize];
3657 if (OpNum + 1 + AsmStrSize + ConstStrSize >
Record.size())
3658 return error(
"Invalid inlineasm record");
3660 for (
unsigned i = 0; i != AsmStrSize; ++i)
3661 AsmStr += (
char)
Record[OpNum + i];
3663 for (
unsigned i = 0; i != ConstStrSize; ++i)
3664 ConstrStr += (
char)
Record[OpNum + AsmStrSize + i];
3666 V =
InlineAsm::get(FnTy, AsmStr, ConstrStr, HasSideEffects, IsAlignStack,
3672 return error(
"Invalid blockaddress record");
3673 unsigned FnTyID =
Record[0];
3674 Type *FnTy = getTypeByID(FnTyID);
3676 return error(
"Invalid blockaddress record");
3677 V = BitcodeConstant::create(
3685 return error(
"Invalid dso_local record");
3686 unsigned GVTyID =
Record[0];
3687 Type *GVTy = getTypeByID(GVTyID);
3689 return error(
"Invalid dso_local record");
3690 V = BitcodeConstant::create(
3691 Alloc, CurTy, BitcodeConstant::DSOLocalEquivalentOpcode,
Record[1]);
3696 return error(
"Invalid no_cfi record");
3697 unsigned GVTyID =
Record[0];
3698 Type *GVTy = getTypeByID(GVTyID);
3700 return error(
"Invalid no_cfi record");
3701 V = BitcodeConstant::create(Alloc, CurTy, BitcodeConstant::NoCFIOpcode,
3707 return error(
"Invalid ptrauth record");
3709 V = BitcodeConstant::create(Alloc, CurTy,
3710 BitcodeConstant::ConstantPtrAuthOpcode,
3717 assert(
V->getType() == getTypeByID(CurTyID) &&
"Incorrect result type ID");
3724Error BitcodeReader::parseUseLists() {
3737 switch (
Entry.Kind) {
3740 return error(
"Malformed block");
3754 switch (MaybeRecord.
get()) {
3762 if (RecordLength < 3)
3764 return error(
"Invalid record");
3765 unsigned ID =
Record.pop_back_val();
3769 assert(
ID < FunctionBBs.size() &&
"Basic block not found");
3770 V = FunctionBBs[
ID];
3773 unsigned NumUses = 0;
3775 for (
const Use &U :
V->materialized_uses()) {
3776 if (++NumUses >
Record.size())
3778 Order[&
U] =
Record[NumUses - 1];
3785 V->sortUseList([&](
const Use &L,
const Use &R) {
3796Error BitcodeReader::rememberAndSkipMetadata() {
3798 uint64_t CurBit = Stream.GetCurrentBitNo();
3799 DeferredMetadataInfo.push_back(CurBit);
3802 if (
Error Err = Stream.SkipBlock())
3807Error BitcodeReader::materializeMetadata() {
3808 for (
uint64_t BitPos : DeferredMetadataInfo) {
3810 if (
Error JumpFailed = Stream.JumpToBit(BitPos))
3812 if (
Error Err = MDLoader->parseModuleMetadata())
3823 for (
const MDOperand &MDOptions : cast<MDNode>(Val)->operands())
3824 LinkerOpts->
addOperand(cast<MDNode>(MDOptions));
3828 DeferredMetadataInfo.clear();
3832void BitcodeReader::setStripDebugInfo() {
StripDebugInfo =
true; }
3836Error BitcodeReader::rememberAndSkipFunctionBody() {
3838 if (FunctionsWithBodies.empty())
3839 return error(
"Insufficient function protos");
3842 FunctionsWithBodies.pop_back();
3845 uint64_t CurBit = Stream.GetCurrentBitNo();
3847 (DeferredFunctionInfo[Fn] == 0 || DeferredFunctionInfo[Fn] == CurBit) &&
3848 "Mismatch between VST and scanned function offsets");
3849 DeferredFunctionInfo[Fn] = CurBit;
3852 if (
Error Err = Stream.SkipBlock())
3857Error BitcodeReader::globalCleanup() {
3859 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
3861 if (!GlobalInits.empty() || !IndirectSymbolInits.empty())
3862 return error(
"Malformed global initializer set");
3867 MDLoader->upgradeDebugIntrinsics(
F);
3874 UpgradedIntrinsics[&
F] = NewFn;
3880 std::vector<std::pair<GlobalVariable *, GlobalVariable *>> UpgradedVariables;
3883 UpgradedVariables.emplace_back(&GV, Upgraded);
3884 for (
auto &Pair : UpgradedVariables) {
3885 Pair.first->eraseFromParent();
3886 TheModule->insertGlobalVariable(Pair.second);
3891 std::vector<std::pair<GlobalVariable *, unsigned>>().
swap(GlobalInits);
3892 std::vector<std::pair<GlobalValue *, unsigned>>().
swap(IndirectSymbolInits);
3900Error BitcodeReader::rememberAndSkipFunctionBodies() {
3901 if (
Error JumpFailed = Stream.JumpToBit(NextUnreadBit))
3904 if (Stream.AtEndOfStream())
3905 return error(
"Could not find function in stream");
3907 if (!SeenFirstFunctionBody)
3908 return error(
"Trying to materialize functions before seeing function blocks");
3912 assert(SeenValueSymbolTable);
3922 switch (
Entry.Kind) {
3924 return error(
"Expect SubBlock");
3928 return error(
"Expect function block");
3930 if (
Error Err = rememberAndSkipFunctionBody())
3932 NextUnreadBit = Stream.GetCurrentBitNo();
3939Error BitcodeReaderBase::readBlockInfo() {
3941 Stream.ReadBlockInfoBlock();
3942 if (!MaybeNewBlockInfo)
3944 std::optional<BitstreamBlockInfo> NewBlockInfo =
3945 std::move(MaybeNewBlockInfo.
get());
3947 return error(
"Malformed block");
3948 BlockInfo = std::move(*NewBlockInfo);
3959 return error(
"Invalid record");
3961 std::string OldFormatName;
3964 return error(
"Invalid record");
3965 unsigned ComdatNameSize =
Record[1];
3966 if (ComdatNameSize >
Record.size() - 2)
3967 return error(
"Comdat name size too large");
3968 OldFormatName.reserve(ComdatNameSize);
3969 for (
unsigned i = 0; i != ComdatNameSize; ++i)
3970 OldFormatName += (
char)
Record[2 + i];
3971 Name = OldFormatName;
3974 C->setSelectionKind(SK);
3975 ComdatList.push_back(
C);
3989 Meta.NoAddress =
true;
3991 Meta.NoHWAddress =
true;
3995 Meta.IsDynInit =
true;
4010 return error(
"Invalid record");
4011 unsigned TyID =
Record[0];
4012 Type *Ty = getTypeByID(TyID);
4014 return error(
"Invalid record");
4016 bool explicitType =
Record[1] & 2;
4022 return error(
"Invalid type for value");
4023 AddressSpace = cast<PointerType>(Ty)->getAddressSpace();
4024 TyID = getContainedTypeID(TyID);
4025 Ty = getTypeByID(TyID);
4027 return error(
"Missing element type for old-style global");
4033 if (
Error Err = parseAlignmentValue(
Record[4], Alignment))
4037 if (
Record[5] - 1 >= SectionTable.size())
4038 return error(
"Invalid ID");
4055 bool ExternallyInitialized =
false;
4057 ExternallyInitialized =
Record[9];
4069 if (
Record.size() > 10) {
4081 if (
unsigned InitID =
Record[2])
4082 GlobalInits.push_back(std::make_pair(NewGV, InitID - 1));
4084 if (
Record.size() > 11) {
4085 if (
unsigned ComdatID =
Record[11]) {
4086 if (ComdatID > ComdatList.size())
4087 return error(
"Invalid global variable comdat ID");
4088 NewGV->
setComdat(ComdatList[ComdatID - 1]);
4091 ImplicitComdatObjects.
insert(NewGV);
4094 if (
Record.size() > 12) {
4099 if (
Record.size() > 13) {
4118 return error(
"Invalid global variable code model");
4124void BitcodeReader::callValueTypeCallback(
Value *
F,
unsigned TypeID) {
4125 if (ValueTypeCallback) {
4126 (*ValueTypeCallback)(
4127 F,
TypeID, [
this](
unsigned I) {
return getTypeByID(
I); },
4128 [
this](
unsigned I,
unsigned J) {
return getContainedTypeID(
I, J); });
4141 return error(
"Invalid record");
4142 unsigned FTyID =
Record[0];
4143 Type *FTy = getTypeByID(FTyID);
4145 return error(
"Invalid record");
4146 if (isa<PointerType>(FTy)) {
4147 FTyID = getContainedTypeID(FTyID, 0);
4148 FTy = getTypeByID(FTyID);
4150 return error(
"Missing element type for old-style function");
4153 if (!isa<FunctionType>(FTy))
4154 return error(
"Invalid type for value");
4157 return error(
"Invalid calling convention ID");
4159 unsigned AddrSpace = TheModule->getDataLayout().getProgramAddressSpace();
4165 AddrSpace,
Name, TheModule);
4168 "Incorrect fully specified type provided for function");
4169 FunctionTypeIDs[
Func] = FTyID;
4171 Func->setCallingConv(
CC);
4172 bool isProto =
Record[2];
4176 callValueTypeCallback(Func, FTyID);
4181 for (
unsigned i = 0; i !=
Func->arg_size(); ++i) {
4183 Attribute::InAlloca}) {
4184 if (!
Func->hasParamAttribute(i, Kind))
4187 if (
Func->getParamAttribute(i, Kind).getValueAsType())
4190 Func->removeParamAttr(i, Kind);
4192 unsigned ParamTypeID = getContainedTypeID(FTyID, i + 1);
4193 Type *PtrEltTy = getPtrElementTypeByID(ParamTypeID);
4195 return error(
"Missing param element type for attribute upgrade");
4199 case Attribute::ByVal:
4202 case Attribute::StructRet:
4205 case Attribute::InAlloca:
4212 Func->addParamAttr(i, NewAttr);
4217 !
Func->arg_empty() && !
Func->hasParamAttribute(0, Attribute::ByVal)) {
4218 unsigned ParamTypeID = getContainedTypeID(FTyID, 1);
4219 Type *ByValTy = getPtrElementTypeByID(ParamTypeID);
4221 return error(
"Missing param element type for x86_intrcc upgrade");
4223 Func->addParamAttr(0, NewAttr);
4227 if (
Error Err = parseAlignmentValue(
Record[5], Alignment))
4230 Func->setAlignment(*Alignment);
4232 if (
Record[6] - 1 >= SectionTable.size())
4233 return error(
"Invalid ID");
4234 Func->setSection(SectionTable[
Record[6] - 1]);
4238 if (!
Func->hasLocalLinkage())
4241 if (
Record[8] - 1 >= GCTable.size())
4242 return error(
"Invalid ID");
4248 Func->setUnnamedAddr(UnnamedAddr);
4250 FunctionOperandInfo OperandInfo = {
Func, 0, 0, 0};
4252 OperandInfo.Prologue =
Record[10];
4254 if (
Record.size() > 11) {
4256 if (!
Func->hasLocalLinkage()) {
4263 if (
Record.size() > 12) {
4264 if (
unsigned ComdatID =
Record[12]) {
4265 if (ComdatID > ComdatList.size())
4266 return error(
"Invalid function comdat ID");
4267 Func->setComdat(ComdatList[ComdatID - 1]);
4270 ImplicitComdatObjects.
insert(Func);
4274 OperandInfo.Prefix =
Record[13];
4277 OperandInfo.PersonalityFn =
Record[14];
4279 if (
Record.size() > 15) {
4288 if (
Record.size() > 18 && Strtab.data() &&
4293 ValueList.
push_back(Func, getVirtualTypeID(
Func->getType(), FTyID));
4295 if (OperandInfo.PersonalityFn || OperandInfo.Prefix || OperandInfo.Prologue)
4296 FunctionOperands.push_back(OperandInfo);
4301 Func->setIsMaterializable(
true);
4302 FunctionsWithBodies.push_back(Func);
4303 DeferredFunctionInfo[
Func] = 0;
4308Error BitcodeReader::parseGlobalIndirectSymbolRecord(
4322 if (
Record.size() < (3 + (
unsigned)NewRecord))
4323 return error(
"Invalid record");
4328 return error(
"Invalid record");
4332 auto *PTy = dyn_cast<PointerType>(Ty);
4334 return error(
"Invalid type for value");
4335 AddrSpace = PTy->getAddressSpace();
4337 Ty = getTypeByID(
TypeID);
4339 return error(
"Missing element type for old-style indirect symbol");
4341 AddrSpace =
Record[OpNum++];
4344 auto Val =
Record[OpNum++];
4353 nullptr, TheModule);
4357 if (OpNum !=
Record.size()) {
4358 auto VisInd = OpNum++;
4364 if (OpNum !=
Record.size()) {
4365 auto S =
Record[OpNum++];
4372 if (OpNum !=
Record.size())
4374 if (OpNum !=
Record.size())
4377 if (OpNum !=
Record.size())
4382 if (OpNum + 1 <
Record.size()) {
4385 return error(
"Malformed partition, too large.");
4391 IndirectSymbolInits.push_back(std::make_pair(NewGA, Val));
4396 bool ShouldLazyLoadMetadata,
4402 TheModule->IsNewDbgInfoFormat =
4407 this->ValueTypeCallback = std::move(Callbacks.
ValueType);
4409 if (
Error JumpFailed = Stream.JumpToBit(ResumeBit))
4418 bool ResolvedDataLayout =
false;
4423 std::string TentativeDataLayoutStr = TheModule->getDataLayoutStr();
4425 auto ResolveDataLayout = [&]() ->
Error {
4426 if (ResolvedDataLayout)
4430 ResolvedDataLayout =
true;
4434 TentativeDataLayoutStr, TheModule->getTargetTriple());
4438 if (
auto LayoutOverride = (*Callbacks.
DataLayout)(
4439 TheModule->getTargetTriple(), TentativeDataLayoutStr))
4440 TentativeDataLayoutStr = *LayoutOverride;
4448 TheModule->setDataLayout(MaybeDL.
get());
4459 switch (
Entry.Kind) {
4461 return error(
"Malformed block");
4463 if (
Error Err = ResolveDataLayout())
4465 return globalCleanup();
4470 if (
Error Err = Stream.SkipBlock())
4474 if (
Error Err = readBlockInfo())
4478 if (
Error Err = parseAttributeBlock())
4482 if (
Error Err = parseAttributeGroupBlock())
4486 if (
Error Err = parseTypeTable())
4490 if (!SeenValueSymbolTable) {
4496 assert(VSTOffset == 0 || FunctionsWithBodies.empty());
4497 if (
Error Err = parseValueSymbolTable())
4499 SeenValueSymbolTable =
true;
4504 if (
Error Err = Stream.SkipBlock())
4509 if (
Error Err = parseConstants())
4511 if (
Error Err = resolveGlobalAndIndirectSymbolInits())
4515 if (ShouldLazyLoadMetadata) {
4516 if (
Error Err = rememberAndSkipMetadata())
4520 assert(DeferredMetadataInfo.empty() &&
"Unexpected deferred metadata");
4521 if (
Error Err = MDLoader->parseModuleMetadata())
4525 if (
Error Err = MDLoader->parseMetadataKinds())
4529 if (
Error Err = ResolveDataLayout())
4534 if (!SeenFirstFunctionBody) {
4535 std::reverse(FunctionsWithBodies.begin(), FunctionsWithBodies.end());
4536 if (
Error Err = globalCleanup())
4538 SeenFirstFunctionBody =
true;
4541 if (VSTOffset > 0) {
4545 if (!SeenValueSymbolTable) {
4546 if (
Error Err = BitcodeReader::parseValueSymbolTable(VSTOffset))
4548 SeenValueSymbolTable =
true;
4560 if (
Error Err = Stream.SkipBlock())
4570 if (
Error Err = rememberAndSkipFunctionBody())
4577 if (SeenValueSymbolTable) {
4578 NextUnreadBit = Stream.GetCurrentBitNo();
4581 return globalCleanup();
4585 if (
Error Err = parseUseLists())
4589 if (
Error Err = parseOperandBundleTags())
4593 if (
Error Err = parseSyncScopeNames())
4608 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4614 UseRelativeIDs = *VersionOrErr >= 1;
4618 if (ResolvedDataLayout)
4619 return error(
"target triple too late in module");
4622 return error(
"Invalid record");
4623 TheModule->setTargetTriple(S);
4627 if (ResolvedDataLayout)
4628 return error(
"datalayout too late in module");
4630 return error(
"Invalid record");
4636 return error(
"Invalid record");
4637 TheModule->setModuleInlineAsm(S);
4644 return error(
"Invalid record");
4651 return error(
"Invalid record");
4652 SectionTable.push_back(S);
4658 return error(
"Invalid record");
4659 GCTable.push_back(S);
4676 if (
Error Err = ResolveDataLayout())
4684 if (
Error Err = parseGlobalIndirectSymbolRecord(BitCode,
Record))
4690 return error(
"Invalid record");
4694 VSTOffset =
Record[0] - 1;
4700 return error(
"Invalid record");
4701 TheModule->setSourceFileName(
ValueName);
4706 this->ValueTypeCallback = std::nullopt;
4710Error BitcodeReader::parseBitcodeInto(
Module *M,
bool ShouldLazyLoadMetadata,
4715 MDCallbacks.
GetTypeByID = [&](
unsigned ID) {
return getTypeByID(
ID); };
4717 return getContainedTypeID(
I, J);
4720 MDLoader =
MetadataLoader(Stream, *M, ValueList, IsImporting, MDCallbacks);
4721 return parseModule(0, ShouldLazyLoadMetadata, Callbacks);
4724Error BitcodeReader::typeCheckLoadStoreInst(
Type *ValType,
Type *PtrType) {
4725 if (!isa<PointerType>(PtrType))
4726 return error(
"Load/Store operand is not a pointer type");
4727 if (!PointerType::isLoadableOrStorableType(ValType))
4728 return error(
"Cannot load/store from pointer");
4735 for (
unsigned i = 0; i != CB->
arg_size(); ++i) {
4737 Attribute::InAlloca}) {
4738 if (!
Attrs.hasParamAttr(i, Kind) ||
4739 Attrs.getParamAttr(i, Kind).getValueAsType())
4742 Type *PtrEltTy = getPtrElementTypeByID(ArgTyIDs[i]);
4744 return error(
"Missing element type for typed attribute upgrade");
4748 case Attribute::ByVal:
4751 case Attribute::StructRet:
4754 case Attribute::InAlloca:
4761 Attrs =
Attrs.addParamAttribute(Context, i, NewAttr);
4772 if (CI.isIndirect && !
Attrs.getParamElementType(ArgNo)) {
4773 Type *ElemTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4775 return error(
"Missing element type for inline asm upgrade");
4786 case Intrinsic::preserve_array_access_index:
4787 case Intrinsic::preserve_struct_access_index:
4788 case Intrinsic::aarch64_ldaxr:
4789 case Intrinsic::aarch64_ldxr:
4790 case Intrinsic::aarch64_stlxr:
4791 case Intrinsic::aarch64_stxr:
4792 case Intrinsic::arm_ldaex:
4793 case Intrinsic::arm_ldrex:
4794 case Intrinsic::arm_stlex:
4795 case Intrinsic::arm_strex: {
4798 case Intrinsic::aarch64_stlxr:
4799 case Intrinsic::aarch64_stxr:
4800 case Intrinsic::arm_stlex:
4801 case Intrinsic::arm_strex:
4808 if (!
Attrs.getParamElementType(ArgNo)) {
4809 Type *ElTy = getPtrElementTypeByID(ArgTyIDs[ArgNo]);
4811 return error(
"Missing element type for elementtype upgrade");
4813 Attrs =
Attrs.addParamAttribute(Context, ArgNo, NewAttr);
4831 if (MDLoader->hasFwdRefs())
4832 return error(
"Invalid function metadata: incoming forward references");
4834 InstructionList.
clear();
4835 unsigned ModuleValueListSize = ValueList.
size();
4836 unsigned ModuleMDLoaderSize = MDLoader->size();
4840 unsigned FTyID = FunctionTypeIDs[
F];
4842 unsigned ArgTyID = getContainedTypeID(FTyID, ArgNo + 1);
4843 assert(
I.getType() == getTypeByID(ArgTyID) &&
4844 "Incorrect fully specified type for Function Argument");
4848 unsigned NextValueNo = ValueList.
size();
4850 unsigned CurBBNo = 0;
4859 auto getLastInstruction = [&]() ->
Instruction * {
4860 if (CurBB && !CurBB->
empty())
4861 return &CurBB->
back();
4862 else if (CurBBNo && FunctionBBs[CurBBNo - 1] &&
4863 !FunctionBBs[CurBBNo - 1]->empty())
4864 return &FunctionBBs[CurBBNo - 1]->back();
4868 std::vector<OperandBundleDef> OperandBundles;
4879 switch (
Entry.Kind) {
4881 return error(
"Malformed block");
4883 goto OutOfRecordLoop;
4888 if (
Error Err = Stream.SkipBlock())
4892 if (
Error Err = parseConstants())
4894 NextValueNo = ValueList.
size();
4897 if (
Error Err = parseValueSymbolTable())
4901 if (
Error Err = MDLoader->parseMetadataAttachment(*
F, InstructionList))
4905 assert(DeferredMetadataInfo.empty() &&
4906 "Must read all module-level metadata before function-level");
4907 if (
Error Err = MDLoader->parseFunctionMetadata())
4911 if (
Error Err = parseUseLists())
4925 unsigned ResTypeID = InvalidTypeID;
4929 switch (
unsigned BitCode = MaybeBitCode.
get()) {
4931 return error(
"Invalid value");
4934 return error(
"Invalid record");
4936 FunctionBBs.resize(
Record[0]);
4939 auto BBFRI = BasicBlockFwdRefs.
find(
F);
4940 if (BBFRI == BasicBlockFwdRefs.
end()) {
4944 auto &BBRefs = BBFRI->second;
4946 if (BBRefs.size() > FunctionBBs.size())
4947 return error(
"Invalid ID");
4948 assert(!BBRefs.empty() &&
"Unexpected empty array");
4949 assert(!BBRefs.front() &&
"Invalid reference to entry block");
4950 for (
unsigned I = 0, E = FunctionBBs.size(), RE = BBRefs.size();
I != E;
4952 if (
I < RE && BBRefs[
I]) {
4953 BBRefs[
I]->insertInto(
F);
4954 FunctionBBs[
I] = BBRefs[
I];
4960 BasicBlockFwdRefs.
erase(BBFRI);
4963 CurBB = FunctionBBs[0];
4970 return error(
"Invalid record");
4985 if (
auto *
F = dyn_cast<Function>(ValueList[
ValID]))
4986 BackwardRefFunctions.push_back(
F);
4988 return error(
"Invalid record");
4995 I = getLastInstruction();
4998 return error(
"Invalid record");
4999 I->setDebugLoc(LastLoc);
5004 I = getLastInstruction();
5006 return error(
"Invalid record");
5014 Scope = dyn_cast_or_null<MDNode>(
5015 MDLoader->getMetadataFwdRefOrLoad(ScopeID - 1));
5017 return error(
"Invalid record");
5020 IA = dyn_cast_or_null<MDNode>(
5021 MDLoader->getMetadataFwdRefOrLoad(IAID - 1));
5023 return error(
"Invalid record");
5025 LastLoc = DILocation::get(
Scope->getContext(), Line, Col, Scope, IA,
5027 I->setDebugLoc(LastLoc);
5035 if (getValueTypePair(
Record, OpNum, NextValueNo, LHS,
TypeID, CurBB) ||
5037 return error(
"Invalid record");
5041 return error(
"Invalid record");
5045 if (OpNum <
Record.size()) {
5046 if (isa<FPMathOperator>(
I)) {
5049 I->setFastMathFlags(FMF);
5058 if (getValueTypePair(
Record, OpNum, NextValueNo, LHS,
TypeID, CurBB) ||
5062 return error(
"Invalid record");
5066 return error(
"Invalid record");
5070 if (OpNum <
Record.size()) {
5071 if (Opc == Instruction::Add ||
5072 Opc == Instruction::Sub ||
5073 Opc == Instruction::Mul ||
5074 Opc == Instruction::Shl) {
5076 cast<BinaryOperator>(
I)->setHasNoSignedWrap(
true);
5078 cast<BinaryOperator>(
I)->setHasNoUnsignedWrap(
true);
5079 }
else if (Opc == Instruction::SDiv ||
5080 Opc == Instruction::UDiv ||
5081 Opc == Instruction::LShr ||
5082 Opc == Instruction::AShr) {
5084 cast<BinaryOperator>(
I)->setIsExact(
true);
5085 }
else if (Opc == Instruction::Or) {
5087 cast<PossiblyDisjointInst>(
I)->setIsDisjoint(
true);
5088 }
else if (isa<FPMathOperator>(
I)) {
5091 I->setFastMathFlags(FMF);
5100 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
5101 OpNum + 1 >
Record.size())
5102 return error(
"Invalid record");
5104 ResTypeID =
Record[OpNum++];
5105 Type *ResTy = getTypeByID(ResTypeID);
5108 if (Opc == -1 || !ResTy)
5109 return error(
"Invalid record");
5114 assert(CurBB &&
"No current BB?");
5120 return error(
"Invalid cast");
5124 if (OpNum <
Record.size()) {
5125 if (Opc == Instruction::ZExt || Opc == Instruction::UIToFP) {
5127 cast<PossiblyNonNegInst>(
I)->setNonNeg(
true);
5128 }
else if (Opc == Instruction::Trunc) {
5130 cast<TruncInst>(
I)->setHasNoUnsignedWrap(
true);
5132 cast<TruncInst>(
I)->setHasNoSignedWrap(
true);
5151 Ty = getTypeByID(TyID);
5155 TyID = InvalidTypeID;
5160 unsigned BasePtrTypeID;
5161 if (getValueTypePair(
Record, OpNum, NextValueNo, BasePtr, BasePtrTypeID,
5163 return error(
"Invalid record");
5166 TyID = getContainedTypeID(BasePtrTypeID);
5167 if (
BasePtr->getType()->isVectorTy())
5168 TyID = getContainedTypeID(TyID);
5169 Ty = getTypeByID(TyID);
5173 while (OpNum !=
Record.size()) {
5176 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5177 return error(
"Invalid record");
5185 if (cast<GEPOperator>(
I)->getNumIndices() != 0) {
5188 unsigned SubType = 0;
5189 if (GTI.isStruct()) {
5191 Idx->getType()->isVectorTy()
5196 ResTypeID = getContainedTypeID(ResTypeID, SubType);
5203 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType(), ResTypeID);
5204 if (
I->getType()->isVectorTy())
5205 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5208 GEP->setNoWrapFlags(NW);
5217 if (getValueTypePair(
Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5218 return error(
"Invalid record");
5221 unsigned RecSize =
Record.size();
5222 if (OpNum == RecSize)
5223 return error(
"EXTRACTVAL: Invalid instruction with 0 indices");
5226 ResTypeID = AggTypeID;
5227 for (; OpNum != RecSize; ++OpNum) {
5232 if (!IsStruct && !IsArray)
5233 return error(
"EXTRACTVAL: Invalid type");
5235 return error(
"Invalid value");
5237 return error(
"EXTRACTVAL: Invalid struct index");
5239 return error(
"EXTRACTVAL: Invalid array index");
5244 ResTypeID = getContainedTypeID(ResTypeID,
Index);
5247 ResTypeID = getContainedTypeID(ResTypeID);
5261 if (getValueTypePair(
Record, OpNum, NextValueNo, Agg, AggTypeID, CurBB))
5262 return error(
"Invalid record");
5265 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
5266 return error(
"Invalid record");
5268 unsigned RecSize =
Record.size();
5269 if (OpNum == RecSize)
5270 return error(
"INSERTVAL: Invalid instruction with 0 indices");
5274 for (; OpNum != RecSize; ++OpNum) {
5279 if (!IsStruct && !IsArray)
5280 return error(
"INSERTVAL: Invalid type");
5282 return error(
"Invalid value");
5284 return error(
"INSERTVAL: Invalid struct index");
5286 return error(
"INSERTVAL: Invalid array index");
5296 return error(
"Inserted value type doesn't match aggregate type");
5299 ResTypeID = AggTypeID;
5311 if (getValueTypePair(
Record, OpNum, NextValueNo, TrueVal,
TypeID,
5315 popValue(
Record, OpNum, NextValueNo, CondType,
5316 getVirtualTypeID(CondType),
Cond, CurBB))
5317 return error(
"Invalid record");
5330 unsigned ValTypeID, CondTypeID;
5331 if (getValueTypePair(
Record, OpNum, NextValueNo, TrueVal, ValTypeID,
5333 popValue(
Record, OpNum, NextValueNo,
TrueVal->getType(), ValTypeID,
5335 getValueTypePair(
Record, OpNum, NextValueNo,
Cond, CondTypeID, CurBB))
5336 return error(
"Invalid record");
5340 dyn_cast<VectorType>(
Cond->getType())) {
5343 return error(
"Invalid type for value");
5347 return error(
"Invalid type for value");
5351 ResTypeID = ValTypeID;
5353 if (OpNum <
Record.size() && isa<FPMathOperator>(
I)) {
5356 I->setFastMathFlags(FMF);
5364 unsigned VecTypeID, IdxTypeID;
5365 if (getValueTypePair(
Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB) ||
5366 getValueTypePair(
Record, OpNum, NextValueNo,
Idx, IdxTypeID, CurBB))
5367 return error(
"Invalid record");
5369 return error(
"Invalid type for value");
5371 ResTypeID = getContainedTypeID(VecTypeID);
5379 unsigned VecTypeID, IdxTypeID;
5380 if (getValueTypePair(
Record, OpNum, NextValueNo, Vec, VecTypeID, CurBB))
5381 return error(
"Invalid record");
5383 return error(
"Invalid type for value");
5384 if (popValue(
Record, OpNum, NextValueNo,
5385 cast<VectorType>(Vec->
getType())->getElementType(),
5386 getContainedTypeID(VecTypeID), Elt, CurBB) ||
5387 getValueTypePair(
Record, OpNum, NextValueNo,
Idx, IdxTypeID, CurBB))
5388 return error(
"Invalid record");
5390 ResTypeID = VecTypeID;
5398 unsigned Vec1TypeID;
5399 if (getValueTypePair(
Record, OpNum, NextValueNo, Vec1, Vec1TypeID,
5401 popValue(
Record, OpNum, NextValueNo, Vec1->
getType(), Vec1TypeID,
5403 return error(
"Invalid record");
5405 unsigned MaskTypeID;
5406 if (getValueTypePair(
Record, OpNum, NextValueNo, Mask, MaskTypeID, CurBB))
5407 return error(
"Invalid record");
5409 return error(
"Invalid type for value");
5413 getVirtualTypeID(
I->getType(), getContainedTypeID(Vec1TypeID));
5428 if (getValueTypePair(
Record, OpNum, NextValueNo, LHS, LHSTypeID, CurBB) ||
5431 return error(
"Invalid record");
5433 if (OpNum >=
Record.size())
5435 "Invalid record: operand number exceeded available operands");
5440 if (IsFP &&
Record.size() > OpNum+1)
5443 if (OpNum+1 !=
Record.size())
5444 return error(
"Invalid record");
5448 return error(
"Invalid fcmp predicate");
5452 return error(
"Invalid icmp predicate");
5456 ResTypeID = getVirtualTypeID(
I->getType()->getScalarType());
5458 ResTypeID = getVirtualTypeID(
I->getType(), ResTypeID);
5461 I->setFastMathFlags(FMF);
5478 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5479 return error(
"Invalid record");
5480 if (OpNum !=
Record.size())
5481 return error(
"Invalid record");
5489 return error(
"Invalid record");
5492 return error(
"Invalid record");
5494 if (
Record.size() == 1) {
5502 getVirtualTypeID(CondType), CurBB);
5503 if (!FalseDest || !
Cond)
5504 return error(
"Invalid record");
5512 return error(
"Invalid record");
5515 Value *CleanupPad = getValue(
Record,
Idx++, NextValueNo, TokenTy,
5516 getVirtualTypeID(TokenTy), CurBB);
5518 return error(
"Invalid record");
5520 if (
Record.size() == 2) {
5521 UnwindDest = getBasicBlock(
Record[
Idx++]);
5523 return error(
"Invalid record");
5532 return error(
"Invalid record");
5536 getVirtualTypeID(TokenTy), CurBB);
5538 return error(
"Invalid record");
5541 return error(
"Invalid record");
5550 return error(
"Invalid record");
5556 getVirtualTypeID(TokenTy), CurBB);
5558 return error(
"Invalid record");
5563 for (
unsigned Op = 0;
Op != NumHandlers; ++
Op) {
5566 return error(
"Invalid record");
5572 UnwindDest = getBasicBlock(
Record[
Idx++]);
5574 return error(
"Invalid record");
5578 return error(
"Invalid record");
5583 CatchSwitch->addHandler(Handler);
5585 ResTypeID = getVirtualTypeID(
I->getType());
5593 return error(
"Invalid record");
5599 getVirtualTypeID(TokenTy), CurBB);
5601 return error(
"Invald record");
5603 unsigned NumArgOperands =
Record[
Idx++];
5606 for (
unsigned Op = 0;
Op != NumArgOperands; ++
Op) {
5609 if (getValueTypePair(
Record,
Idx, NextValueNo, Val, ValTypeID,
nullptr))
5610 return error(
"Invalid record");
5611 Args.push_back(Val);
5615 return error(
"Invalid record");
5621 ResTypeID = getVirtualTypeID(
I->getType());
5627 if ((
Record[0] >> 16) == SWITCH_INST_MAGIC) {
5633 unsigned OpTyID =
Record[1];
5634 Type *OpTy = getTypeByID(OpTyID);
5635 unsigned ValueBitWidth = cast<IntegerType>(OpTy)->getBitWidth();
5640 return error(
"Invalid record");
5642 unsigned NumCases =
Record[4];
5647 unsigned CurIdx = 5;
5648 for (
unsigned i = 0; i != NumCases; ++i) {
5650 unsigned NumItems =
Record[CurIdx++];
5651 for (
unsigned ci = 0; ci != NumItems; ++ci) {
5652 bool isSingleNumber =
Record[CurIdx++];
5655 unsigned ActiveWords = 1;
5656 if (ValueBitWidth > 64)
5657 ActiveWords =
Record[CurIdx++];
5660 CurIdx += ActiveWords;
5662 if (!isSingleNumber) {
5664 if (ValueBitWidth > 64)
5665 ActiveWords =
Record[CurIdx++];
5668 CurIdx += ActiveWords;
5681 SI->addCase(Cst, DestBB);
5690 return error(
"Invalid record");
5691 unsigned OpTyID =
Record[0];
5692 Type *OpTy = getTypeByID(OpTyID);
5696 return error(
"Invalid record");
5697 unsigned NumCases = (
Record.size()-3)/2;
5700 for (
unsigned i = 0, e = NumCases; i !=
e; ++i) {
5701 ConstantInt *CaseVal = dyn_cast_or_null<ConstantInt>(
5702 getFnValueByID(
Record[3+i*2], OpTy, OpTyID,
nullptr));
5704 if (!CaseVal || !DestBB) {
5706 return error(
"Invalid record");
5708 SI->addCase(CaseVal, DestBB);
5715 return error(
"Invalid record");
5716 unsigned OpTyID =
Record[0];
5717 Type *OpTy = getTypeByID(OpTyID);
5719 if (!OpTy || !Address)
5720 return error(
"Invalid record");
5721 unsigned NumDests =
Record.size()-2;
5724 for (
unsigned i = 0, e = NumDests; i !=
e; ++i) {
5729 return error(
"Invalid record");
5739 return error(
"Invalid record");
5742 unsigned CCInfo =
Record[OpNum++];
5746 unsigned FTyID = InvalidTypeID;
5748 if ((CCInfo >> 13) & 1) {
5750 FTy = dyn_cast<FunctionType>(getTypeByID(FTyID));
5752 return error(
"Explicit invoke type is not a function type");
5756 unsigned CalleeTypeID;
5757 if (getValueTypePair(
Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5759 return error(
"Invalid record");
5763 return error(
"Callee is not a pointer");
5765 FTyID = getContainedTypeID(CalleeTypeID);
5766 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
5768 return error(
"Callee is not of pointer to function type");
5770 if (
Record.size() < FTy->getNumParams() + OpNum)
5771 return error(
"Insufficient operands to call");
5775 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5776 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5777 Ops.
push_back(getValue(
Record, OpNum, NextValueNo, FTy->getParamType(i),
5781 return error(
"Invalid record");
5784 if (!FTy->isVarArg()) {
5785 if (
Record.size() != OpNum)
5786 return error(
"Invalid record");
5789 while (OpNum !=
Record.size()) {
5792 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5793 return error(
"Invalid record");
5800 if (!OperandBundles.empty())
5805 ResTypeID = getContainedTypeID(FTyID);
5806 OperandBundles.clear();
5808 cast<InvokeInst>(
I)->setCallingConv(
5810 cast<InvokeInst>(
I)->setAttributes(PAL);
5811 if (
Error Err = propagateAttributeTypes(cast<CallBase>(
I), ArgTyIDs)) {
5820 Value *Val =
nullptr;
5822 if (getValueTypePair(
Record,
Idx, NextValueNo, Val, ValTypeID, CurBB))
5823 return error(
"Invalid record");
5832 unsigned CCInfo =
Record[OpNum++];
5835 unsigned NumIndirectDests =
Record[OpNum++];
5837 for (
unsigned i = 0, e = NumIndirectDests; i !=
e; ++i)
5840 unsigned FTyID = InvalidTypeID;
5844 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
5846 return error(
"Explicit call type is not a function type");
5850 unsigned CalleeTypeID;
5851 if (getValueTypePair(
Record, OpNum, NextValueNo, Callee, CalleeTypeID,
5853 return error(
"Invalid record");
5857 return error(
"Callee is not a pointer type");
5859 FTyID = getContainedTypeID(CalleeTypeID);
5860 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
5862 return error(
"Callee is not of pointer to function type");
5864 if (
Record.size() < FTy->getNumParams() + OpNum)
5865 return error(
"Insufficient operands to call");
5870 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
5872 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
5873 if (FTy->getParamType(i)->isLabelTy())
5874 Arg = getBasicBlock(
Record[OpNum]);
5876 Arg = getValue(
Record, OpNum, NextValueNo, FTy->getParamType(i),
5879 return error(
"Invalid record");
5880 Args.push_back(Arg);
5885 if (!FTy->isVarArg()) {
5886 if (OpNum !=
Record.size())
5887 return error(
"Invalid record");
5889 while (OpNum !=
Record.size()) {
5892 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
5893 return error(
"Invalid record");
5900 if (!OperandBundles.empty())
5903 if (
auto *IA = dyn_cast<InlineAsm>(Callee)) {
5908 if (
none_of(ConstraintInfo, IsLabelConstraint)) {
5913 unsigned FirstBlockArg =
Args.size() - IndirectDests.
size();
5914 for (
unsigned ArgNo = FirstBlockArg; ArgNo <
Args.size(); ++ArgNo) {
5915 unsigned LabelNo = ArgNo - FirstBlockArg;
5916 auto *BA = dyn_cast<BlockAddress>(Args[ArgNo]);
5917 if (!BA || BA->getFunction() !=
F ||
5918 LabelNo > IndirectDests.
size() ||
5919 BA->getBasicBlock() != IndirectDests[LabelNo])
5920 return error(
"callbr argument does not match indirect dest");
5925 ArgTyIDs.
erase(ArgTyIDs.
begin() + FirstBlockArg, ArgTyIDs.
end());
5929 for (
Value *Arg : Args)
5932 FunctionType::get(FTy->getReturnType(), ArgTys, FTy->isVarArg());
5935 std::string Constraints =
IA->getConstraintString();
5938 for (
const auto &CI : ConstraintInfo) {
5940 if (ArgNo >= FirstBlockArg)
5941 Constraints.insert(Pos,
"!");
5946 Pos = Constraints.find(
',', Pos);
5947 if (Pos == std::string::npos)
5953 IA->hasSideEffects(),
IA->isAlignStack(),
5954 IA->getDialect(),
IA->canThrow());
5960 ResTypeID = getContainedTypeID(FTyID);
5961 OperandBundles.clear();
5963 cast<CallBrInst>(
I)->setCallingConv(
5965 cast<CallBrInst>(
I)->setAttributes(PAL);
5966 if (
Error Err = propagateAttributeTypes(cast<CallBase>(
I), ArgTyIDs)) {
5978 return error(
"Invalid phi record");
5980 unsigned TyID =
Record[0];
5981 Type *Ty = getTypeByID(TyID);
5983 return error(
"Invalid phi record");
5988 size_t NumArgs = (
Record.size() - 1) / 2;
5990 if ((
Record.size() - 1) % 2 == 1 && !isa<FPMathOperator>(PN)) {
5992 return error(
"Invalid phi record");
5997 for (
unsigned i = 0; i != NumArgs; i++) {
6001 return error(
"Invalid phi BB");
6008 auto It =
Args.find(BB);
6009 if (It !=
Args.end()) {
6020 if (!PhiConstExprBB)
6022 EdgeBB = PhiConstExprBB;
6030 V = getValueSigned(
Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6032 V = getValue(
Record, i * 2 + 1, NextValueNo, Ty, TyID, EdgeBB);
6036 return error(
"Invalid phi record");
6039 if (EdgeBB == PhiConstExprBB && !EdgeBB->
empty()) {
6040 ConstExprEdgeBBs.
insert({{BB, CurBB}, EdgeBB});
6041 PhiConstExprBB =
nullptr;
6044 Args.insert({BB,
V});
6050 if (
Record.size() % 2 == 0) {
6051 assert(isa<FPMathOperator>(
I) &&
"Unexpected phi type");
6054 I->setFastMathFlags(FMF);
6066 return error(
"Invalid record");
6070 return error(
"Invalid record");
6073 Type *Ty = getTypeByID(ResTypeID);
6075 return error(
"Invalid record");
6077 Value *PersFn =
nullptr;
6078 unsigned PersFnTypeID;
6079 if (getValueTypePair(
Record,
Idx, NextValueNo, PersFn, PersFnTypeID,
6081 return error(
"Invalid record");
6083 if (!
F->hasPersonalityFn())
6084 F->setPersonalityFn(cast<Constant>(PersFn));
6085 else if (
F->getPersonalityFn() != cast<Constant>(PersFn))
6086 return error(
"Personality function mismatch");
6093 for (
unsigned J = 0; J != NumClauses; ++J) {
6099 if (getValueTypePair(
Record,
Idx, NextValueNo, Val, ValTypeID,
6102 return error(
"Invalid record");
6106 !isa<ArrayType>(Val->
getType())) &&
6107 "Catch clause has a invalid type!");
6109 isa<ArrayType>(Val->
getType())) &&
6110 "Filter clause has invalid type!");
6121 return error(
"Invalid record");
6124 const bool InAlloca = Bitfield::get<APV::UsedWithInAlloca>(Rec);
6125 const bool SwiftError = Bitfield::get<APV::SwiftError>(Rec);
6126 unsigned TyID =
Record[0];
6127 Type *Ty = getTypeByID(TyID);
6128 if (!Bitfield::get<APV::ExplicitType>(Rec)) {
6129 TyID = getContainedTypeID(TyID);
6130 Ty = getTypeByID(TyID);
6132 return error(
"Missing element type for old-style alloca");
6134 unsigned OpTyID =
Record[1];
6135 Type *OpTy = getTypeByID(OpTyID);
6139 Bitfield::get<APV::AlignLower>(Rec) |
6140 (Bitfield::get<APV::AlignUpper>(Rec) << APV::AlignLower::Bits);
6141 if (
Error Err = parseAlignmentValue(AlignExp,
Align)) {
6145 return error(
"Invalid record");
6148 unsigned AS =
Record.size() == 5 ?
Record[4] :
DL.getAllocaAddrSpace();
6152 return error(
"alloca of unsized type");
6154 Align =
DL.getPrefTypeAlign(Ty);
6156 if (!
Size->getType()->isIntegerTy())
6157 return error(
"alloca element count must have integer type");
6163 ResTypeID = getVirtualTypeID(AI->
getType(), TyID);
6171 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6172 (OpNum + 2 !=
Record.size() && OpNum + 3 !=
Record.size()))
6173 return error(
"Invalid record");
6175 if (!isa<PointerType>(
Op->getType()))
6176 return error(
"Load operand is not a pointer type");
6179 if (OpNum + 3 ==
Record.size()) {
6180 ResTypeID =
Record[OpNum++];
6181 Ty = getTypeByID(ResTypeID);
6183 ResTypeID = getContainedTypeID(OpTypeID);
6184 Ty = getTypeByID(ResTypeID);
6188 return error(
"Missing load type");
6190 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6198 return error(
"load of unsized type");
6200 Align = TheModule->getDataLayout().getABITypeAlign(Ty);
6210 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB) ||
6211 (OpNum + 4 !=
Record.size() && OpNum + 5 !=
Record.size()))
6212 return error(
"Invalid record");
6214 if (!isa<PointerType>(
Op->getType()))
6215 return error(
"Load operand is not a pointer type");
6218 if (OpNum + 5 ==
Record.size()) {
6219 ResTypeID =
Record[OpNum++];
6220 Ty = getTypeByID(ResTypeID);
6222 ResTypeID = getContainedTypeID(OpTypeID);
6223 Ty = getTypeByID(ResTypeID);
6227 return error(
"Missing atomic load type");
6229 if (
Error Err = typeCheckLoadStoreInst(Ty,
Op->getType()))
6233 if (Ordering == AtomicOrdering::NotAtomic ||
6234 Ordering == AtomicOrdering::Release ||
6235 Ordering == AtomicOrdering::AcquireRelease)
6236 return error(
"Invalid record");
6237 if (Ordering != AtomicOrdering::NotAtomic &&
Record[OpNum] == 0)
6238 return error(
"Invalid record");
6245 return error(
"Alignment missing from atomic load");
6254 unsigned PtrTypeID, ValTypeID;
6255 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6256 return error(
"Invalid record");
6259 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6260 return error(
"Invalid record");
6262 ValTypeID = getContainedTypeID(PtrTypeID);
6263 if (popValue(
Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6264 ValTypeID, Val, CurBB))
6265 return error(
"Invalid record");
6268 if (OpNum + 2 !=
Record.size())
6269 return error(
"Invalid record");
6271 if (
Error Err = typeCheckLoadStoreInst(Val->
getType(),
Ptr->getType()))
6278 return error(
"store of unsized type");
6280 Align = TheModule->getDataLayout().getABITypeAlign(Val->
getType());
6290 unsigned PtrTypeID, ValTypeID;
6291 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB) ||
6292 !isa<PointerType>(
Ptr->getType()))
6293 return error(
"Invalid record");
6295 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6296 return error(
"Invalid record");
6298 ValTypeID = getContainedTypeID(PtrTypeID);
6299 if (popValue(
Record, OpNum, NextValueNo, getTypeByID(ValTypeID),
6300 ValTypeID, Val, CurBB))
6301 return error(
"Invalid record");
6304 if (OpNum + 4 !=
Record.size())
6305 return error(
"Invalid record");
6307 if (
Error Err = typeCheckLoadStoreInst(Val->
getType(),
Ptr->getType()))
6310 if (Ordering == AtomicOrdering::NotAtomic ||
6311 Ordering == AtomicOrdering::Acquire ||
6312 Ordering == AtomicOrdering::AcquireRelease)
6313 return error(
"Invalid record");
6315 if (Ordering != AtomicOrdering::NotAtomic &&
Record[OpNum] == 0)
6316 return error(
"Invalid record");
6322 return error(
"Alignment missing from atomic store");
6330 const size_t NumRecords =
Record.size();
6334 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6335 return error(
"Invalid record");
6337 if (!isa<PointerType>(
Ptr->getType()))
6338 return error(
"Cmpxchg operand is not a pointer type");
6341 unsigned CmpTypeID = getContainedTypeID(PtrTypeID);
6342 if (popValue(
Record, OpNum, NextValueNo, getTypeByID(CmpTypeID),
6343 CmpTypeID, Cmp, CurBB))
6344 return error(
"Invalid record");
6347 if (popValue(
Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID,
6349 NumRecords < OpNum + 3 || NumRecords > OpNum + 5)
6350 return error(
"Invalid record");
6354 if (SuccessOrdering == AtomicOrdering::NotAtomic ||
6355 SuccessOrdering == AtomicOrdering::Unordered)
6356 return error(
"Invalid record");
6360 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(),
Ptr->getType()))
6368 if (FailureOrdering == AtomicOrdering::NotAtomic ||
6369 FailureOrdering == AtomicOrdering::Unordered)
6370 return error(
"Invalid record");
6372 const Align Alignment(
6373 TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6376 FailureOrdering, SSID);
6377 cast<AtomicCmpXchgInst>(
I)->setVolatile(
Record[OpNum]);
6379 if (NumRecords < 8) {
6383 I->insertInto(CurBB, CurBB->
end());
6385 ResTypeID = CmpTypeID;
6387 cast<AtomicCmpXchgInst>(
I)->setWeak(
Record[OpNum + 4]);
6389 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6398 const size_t NumRecords =
Record.size();
6402 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6403 return error(
"Invalid record");
6405 if (!isa<PointerType>(
Ptr->getType()))
6406 return error(
"Cmpxchg operand is not a pointer type");
6410 if (getValueTypePair(
Record, OpNum, NextValueNo, Cmp, CmpTypeID, CurBB))
6411 return error(
"Invalid record");
6413 Value *Val =
nullptr;
6414 if (popValue(
Record, OpNum, NextValueNo,
Cmp->getType(), CmpTypeID, Val,
6416 return error(
"Invalid record");
6418 if (NumRecords < OpNum + 3 || NumRecords > OpNum + 6)
6419 return error(
"Invalid record");
6421 const bool IsVol =
Record[OpNum];
6426 return error(
"Invalid cmpxchg success ordering");
6430 if (
Error Err = typeCheckLoadStoreInst(
Cmp->getType(),
Ptr->getType()))
6436 return error(
"Invalid cmpxchg failure ordering");
6438 const bool IsWeak =
Record[OpNum + 4];
6442 if (NumRecords == (OpNum + 6)) {
6443 if (
Error Err = parseAlignmentValue(
Record[OpNum + 5], Alignment))
6448 Align(TheModule->getDataLayout().getTypeStoreSize(
Cmp->getType()));
6451 FailureOrdering, SSID);
6452 cast<AtomicCmpXchgInst>(
I)->setVolatile(IsVol);
6453 cast<AtomicCmpXchgInst>(
I)->setWeak(IsWeak);
6456 ResTypeID = getVirtualTypeID(
I->getType(), {CmpTypeID, I1TypeID});
6465 const size_t NumRecords =
Record.size();
6470 if (getValueTypePair(
Record, OpNum, NextValueNo,
Ptr, PtrTypeID, CurBB))
6471 return error(
"Invalid record");
6473 if (!isa<PointerType>(
Ptr->getType()))
6474 return error(
"Invalid record");
6476 Value *Val =
nullptr;
6477 unsigned ValTypeID = InvalidTypeID;
6479 ValTypeID = getContainedTypeID(PtrTypeID);
6480 if (popValue(
Record, OpNum, NextValueNo,
6481 getTypeByID(ValTypeID), ValTypeID, Val, CurBB))
6482 return error(
"Invalid record");
6484 if (getValueTypePair(
Record, OpNum, NextValueNo, Val, ValTypeID, CurBB))
6485 return error(
"Invalid record");
6488 if (!(NumRecords == (OpNum + 4) || NumRecords == (OpNum + 5)))
6489 return error(
"Invalid record");
6495 return error(
"Invalid record");
6497 const bool IsVol =
Record[OpNum + 1];
6500 if (Ordering == AtomicOrdering::NotAtomic ||
6501 Ordering == AtomicOrdering::Unordered)
6502 return error(
"Invalid record");
6508 if (NumRecords == (OpNum + 5)) {
6509 if (
Error Err = parseAlignmentValue(
Record[OpNum + 4], Alignment))
6515 Align(TheModule->getDataLayout().getTypeStoreSize(Val->
getType()));
6518 ResTypeID = ValTypeID;
6519 cast<AtomicRMWInst>(
I)->setVolatile(IsVol);
6526 return error(
"Invalid record");
6528 if (Ordering == AtomicOrdering::NotAtomic ||
6529 Ordering == AtomicOrdering::Unordered ||
6530 Ordering == AtomicOrdering::Monotonic)
6531 return error(
"Invalid record");
6540 SeenDebugRecord =
true;
6543 return error(
"Invalid dbg record: missing instruction");
6546 Inst->
getParent()->insertDbgRecordBefore(
6556 SeenDebugRecord =
true;
6559 return error(
"Invalid dbg record: missing instruction");
6575 cast<DILocalVariable>(getFnMetadataByID(
Record[Slot++]));
6577 cast<DIExpression>(getFnMetadataByID(
Record[Slot++]));
6589 unsigned SlotBefore =
Slot;
6590 if (getValueTypePair(
Record, Slot, NextValueNo, V, TyID, CurBB))
6591 return error(
"Invalid dbg record: invalid value");
6593 assert((SlotBefore == Slot - 1) &&
"unexpected fwd ref");
6596 RawLocation = getFnMetadataByID(
Record[Slot++]);
6604 DbgVariableRecord::LocationType::Value);
6608 DbgVariableRecord::LocationType::Declare);
6613 cast<DIExpression>(getFnMetadataByID(
Record[Slot++]));
6628 return error(
"Invalid record");
6632 unsigned CCInfo =
Record[OpNum++];
6638 return error(
"Fast math flags indicator set for call with no FMF");
6641 unsigned FTyID = InvalidTypeID;
6645 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
6647 return error(
"Explicit call type is not a function type");
6651 unsigned CalleeTypeID;
6652 if (getValueTypePair(
Record, OpNum, NextValueNo, Callee, CalleeTypeID,
6654 return error(
"Invalid record");
6658 return error(
"Callee is not a pointer type");
6660 FTyID = getContainedTypeID(CalleeTypeID);
6661 FTy = dyn_cast_or_null<FunctionType>(getTypeByID(FTyID));
6663 return error(
"Callee is not of pointer to function type");
6665 if (
Record.size() < FTy->getNumParams() + OpNum)
6666 return error(
"Insufficient operands to call");
6671 for (
unsigned i = 0, e = FTy->getNumParams(); i != e; ++i, ++OpNum) {
6672 unsigned ArgTyID = getContainedTypeID(FTyID, i + 1);
6673 if (FTy->getParamType(i)->isLabelTy())
6674 Args.push_back(getBasicBlock(
Record[OpNum]));
6676 Args.push_back(getValue(
Record, OpNum, NextValueNo,
6677 FTy->getParamType(i), ArgTyID, CurBB));
6680 return error(
"Invalid record");
6684 if (!FTy->isVarArg()) {
6685 if (OpNum !=
Record.size())
6686 return error(
"Invalid record");
6688 while (OpNum !=
Record.size()) {
6691 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6692 return error(
"Invalid record");
6699 if (!OperandBundles.empty())
6703 ResTypeID = getContainedTypeID(FTyID);
6704 OperandBundles.clear();
6706 cast<CallInst>(
I)->setCallingConv(
6715 cast<CallInst>(
I)->setTailCallKind(TCK);
6716 cast<CallInst>(
I)->setAttributes(PAL);
6717 if (isa<DbgInfoIntrinsic>(
I))
6718 SeenDebugIntrinsic =
true;
6719 if (
Error Err = propagateAttributeTypes(cast<CallBase>(
I), ArgTyIDs)) {
6724 if (!isa<FPMathOperator>(
I))
6725 return error(
"Fast-math-flags specified for call without "
6726 "floating-point scalar or vector return type");
6727 I->setFastMathFlags(FMF);
6733 return error(
"Invalid record");
6734 unsigned OpTyID =
Record[0];
6735 Type *OpTy = getTypeByID(OpTyID);
6736 Value *
Op = getValue(
Record, 1, NextValueNo, OpTy, OpTyID, CurBB);
6738 Type *ResTy = getTypeByID(ResTypeID);
6739 if (!OpTy || !
Op || !ResTy)
6740 return error(
"Invalid record");
6752 return error(
"Invalid record");
6754 std::vector<Value *> Inputs;
6757 while (OpNum !=
Record.size()) {
6760 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6761 return error(
"Invalid record");
6762 Inputs.push_back(
Op);
6765 OperandBundles.emplace_back(BundleTags[
Record[0]], std::move(Inputs));
6773 if (getValueTypePair(
Record, OpNum, NextValueNo,
Op, OpTypeID, CurBB))
6774 return error(
"Invalid record");
6775 if (OpNum !=
Record.size())
6776 return error(
"Invalid record");
6779 ResTypeID = OpTypeID;
6789 return error(
"Invalid instruction with no BB");
6791 if (!OperandBundles.empty()) {
6793 return error(
"Operand bundles found with no consumer");
6795 I->insertInto(CurBB, CurBB->
end());
6798 if (
I->isTerminator()) {
6800 CurBB = CurBBNo < FunctionBBs.size() ? FunctionBBs[CurBBNo] :
nullptr;
6804 if (!
I->getType()->isVoidTy()) {
6805 assert(
I->getType() == getTypeByID(ResTypeID) &&
6806 "Incorrect result type ID");
6814 if (!OperandBundles.empty())
6815 return error(
"Operand bundles found with no consumer");
6819 if (!
A->getParent()) {
6821 for (
unsigned i = ModuleValueListSize, e = ValueList.
size(); i != e; ++i){
6822 if ((
A = dyn_cast_or_null<Argument>(ValueList[i])) && !
A->getParent()) {
6827 return error(
"Never resolved value found in function");
6832 if (MDLoader->hasFwdRefs())
6833 return error(
"Invalid function metadata: outgoing forward refs");
6838 for (
const auto &Pair : ConstExprEdgeBBs) {
6843 From->getTerminator()->replaceSuccessorWith(To, EdgeBB);
6849 ValueList.
shrinkTo(ModuleValueListSize);
6850 MDLoader->shrinkTo(ModuleMDLoaderSize);
6851 std::vector<BasicBlock*>().swap(FunctionBBs);
6856Error BitcodeReader::findFunctionInStream(
6859 while (DeferredFunctionInfoIterator->second == 0) {
6864 assert(VSTOffset == 0 || !
F->hasName());
6867 if (
Error Err = rememberAndSkipFunctionBodies())
6873SyncScope::ID BitcodeReader::getDecodedSyncScopeID(
unsigned Val) {
6876 if (Val >= SSIDs.
size())
6888 if (!
F || !
F->isMaterializable())
6892 assert(DFII != DeferredFunctionInfo.
end() &&
"Deferred function not found!");
6895 if (DFII->second == 0)
6896 if (
Error Err = findFunctionInStream(
F, DFII))
6900 if (
Error Err = materializeMetadata())
6904 if (
Error JumpFailed = Stream.JumpToBit(DFII->second))
6909 F->IsNewDbgInfoFormat =
true;
6911 if (
Error Err = parseFunctionBody(
F))
6913 F->setIsMaterializable(
false);
6917 if (SeenDebugIntrinsic && SeenDebugRecord)
6918 return error(
"Mixed debug intrinsics and debug records in bitcode module!");
6920 bool SeenAnyDebugInfo = SeenDebugIntrinsic || SeenDebugRecord;
6921 bool NewDbgInfoFormatDesired =
6922 SeenAnyDebugInfo ? SeenDebugRecord :
F->getParent()->IsNewDbgInfoFormat;
6923 if (SeenAnyDebugInfo) {
6932 if (NewDbgInfoFormatDesired !=
F->getParent()->IsNewDbgInfoFormat)
6933 F->getParent()->setNewDbgInfoFormatFlag(NewDbgInfoFormatDesired);
6935 F->setNewDbgInfoFormatFlag(NewDbgInfoFormatDesired);
6943 bool ModuleIsNewDbgInfoFormat =
F->getParent()->IsNewDbgInfoFormat;
6944 if (ModuleIsNewDbgInfoFormat || !SeenDebugRecord)
6945 F->setNewDbgInfoFormatFlag(ModuleIsNewDbgInfoFormat);
6947 F->setIsNewDbgInfoFormat(ModuleIsNewDbgInfoFormat);
6954 for (
auto &
I : UpgradedIntrinsics) {
6956 if (
CallInst *CI = dyn_cast<CallInst>(U))
6961 if (
DISubprogram *SP = MDLoader->lookupSubprogramForFunction(
F))
6962 F->setSubprogram(SP);
6965 if (!MDLoader->isStrippingTBAA()) {
6967 MDNode *TBAA =
I.getMetadata(LLVMContext::MD_tbaa);
6970 MDLoader->setStripTBAA(
true);
6977 if (
auto *MD =
I.getMetadata(LLVMContext::MD_prof)) {
6978 if (MD->getOperand(0) !=
nullptr && isa<MDString>(MD->getOperand(0))) {
6979 MDString *MDS = cast<MDString>(MD->getOperand(0));
6982 if (ProfName !=
"branch_weights")
6984 unsigned ExpectedNumOperands = 0;
6986 ExpectedNumOperands = BI->getNumSuccessors();
6987 else if (
SwitchInst *SI = dyn_cast<SwitchInst>(&
I))
6988 ExpectedNumOperands =
SI->getNumSuccessors();
6989 else if (isa<CallInst>(&
I))
6990 ExpectedNumOperands = 1;
6993 else if (isa<SelectInst>(&
I))
6994 ExpectedNumOperands = 2;
7001 if (MD->getNumOperands() !=
Offset + ExpectedNumOperands)
7002 I.setMetadata(LLVMContext::MD_prof,
nullptr);
7007 if (
auto *CI = dyn_cast<CallBase>(&
I)) {
7009 CI->getFunctionType()->getReturnType()));
7011 for (
unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo)
7013 CI->getArgOperand(ArgNo)->getType()));
7022 return materializeForwardReferencedFunctions();
7025Error BitcodeReader::materializeModule() {
7026 if (
Error Err = materializeMetadata())
7030 WillMaterializeAllForwardRefs =
true;
7035 if (
Error Err = materialize(&
F))
7041 if (LastFunctionBlockBit || NextUnreadBit)
7043 ? LastFunctionBlockBit
7049 if (!BasicBlockFwdRefs.
empty())
7050 return error(
"Never resolved function from blockaddress");
7056 for (
auto &
I : UpgradedIntrinsics) {
7057 for (
auto *U :
I.first->users()) {
7058 if (
CallInst *CI = dyn_cast<CallInst>(U))
7061 if (!
I.first->use_empty())
7062 I.first->replaceAllUsesWith(
I.second);
7063 I.first->eraseFromParent();
7065 UpgradedIntrinsics.clear();
7076std::vector<StructType *> BitcodeReader::getIdentifiedStructTypes()
const {
7077 return IdentifiedStructTypes;
7080ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
7083 : BitcodeReaderBase(
std::
move(Cursor), Strtab), TheIndex(TheIndex),
7084 ModulePath(ModulePath), IsPrevailing(IsPrevailing) {}
7086void ModuleSummaryIndexBitcodeReader::addThisModule() {
7091ModuleSummaryIndexBitcodeReader::getThisModule() {
7095template <
bool AllowNullValueInfo>
7096std::tuple<ValueInfo, GlobalValue::GUID, GlobalValue::GUID>
7097ModuleSummaryIndexBitcodeReader::getValueInfoFromValueId(
unsigned ValueId) {
7098 auto VGI = ValueIdToValueInfoMap[ValueId];
7103 assert(AllowNullValueInfo || std::get<0>(VGI));
7107void ModuleSummaryIndexBitcodeReader::setValueGUID(
7110 std::string GlobalId =
7113 auto OriginalNameID = ValueGUID;
7117 dbgs() <<
"GUID " << ValueGUID <<
"(" << OriginalNameID <<
") is "
7123 ValueIdToValueInfoMap[ValueID] = std::make_tuple(
7126 OriginalNameID, ValueGUID);
7132Error ModuleSummaryIndexBitcodeReader::parseValueSymbolTable(
7141 if (!MaybeCurrentBit)
7159 switch (
Entry.Kind) {
7162 return error(
"Malformed block");
7165 if (
Error JumpFailed = Stream.JumpToBit(CurrentBit))
7178 switch (MaybeRecord.
get()) {
7183 return error(
"Invalid record");
7184 unsigned ValueID =
Record[0];
7186 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7187 assert(VLI != ValueIdToLinkageMap.
end() &&
7188 "No linkage found for VST entry?");
7190 setValueGUID(ValueID,
ValueName, Linkage, SourceFileName);
7197 return error(
"Invalid record");
7198 unsigned ValueID =
Record[0];
7200 auto VLI = ValueIdToLinkageMap.
find(ValueID);
7201 assert(VLI != ValueIdToLinkageMap.
end() &&
7202 "No linkage found for VST entry?");
7204 setValueGUID(ValueID,
ValueName, Linkage, SourceFileName);
7210 unsigned ValueID =
Record[0];
7214 ValueIdToValueInfoMap[ValueID] = std::make_tuple(
7225Error ModuleSummaryIndexBitcodeReader::parseModule() {
7231 unsigned ValueId = 0;
7240 switch (
Entry.Kind) {
7242 return error(
"Malformed block");
7249 if (
Error Err = Stream.SkipBlock())
7254 if (
Error Err = readBlockInfo())
7260 assert(((SeenValueSymbolTable && VSTOffset > 0) ||
7261 !SeenGlobalValSummary) &&
7262 "Expected early VST parse via VSTOffset record");
7263 if (
Error Err = Stream.SkipBlock())
7269 if (!SourceFileName.
empty())
7271 assert(!SeenValueSymbolTable &&
7272 "Already read VST when parsing summary block?");
7277 if (VSTOffset > 0) {
7278 if (
Error Err = parseValueSymbolTable(VSTOffset, ValueIdToLinkageMap))
7280 SeenValueSymbolTable =
true;
7282 SeenGlobalValSummary =
true;
7283 if (
Error Err = parseEntireSummary(
Entry.ID))
7287 if (
Error Err = parseModuleStringTable())
7298 switch (MaybeBitCode.
get()) {
7302 if (
Error Err = parseVersionRecord(
Record).takeError())
7310 return error(
"Invalid record");
7318 auto &Hash = getThisModule()->second;
7320 for (
auto &Val :
Record) {
7321 assert(!(Val >> 32) &&
"Unexpected high bits set");
7329 return error(
"Invalid record");
7333 VSTOffset =
Record[0] - 1;
7344 std::tie(
Name, GVRecord) = readNameFromStrtab(
Record);
7345 if (GVRecord.
size() <= 3)
7346 return error(
"Invalid record");
7350 ValueIdToLinkageMap[ValueId++] =
Linkage;
7354 setValueGUID(ValueId++,
Name, Linkage, SourceFileName);
7364std::vector<ValueInfo>
7366 std::vector<ValueInfo>
Ret;
7369 Ret.push_back(std::get<0>(getValueInfoFromValueId(RefValueId)));
7373std::vector<FunctionSummary::EdgeTy>
7375 bool IsOldProfileFormat,
7376 bool HasProfile,
bool HasRelBF) {
7377 std::vector<FunctionSummary::EdgeTy>
Ret;
7380 if (!IsOldProfileFormat && (HasProfile || HasRelBF))
7385 for (
unsigned I = 0, E =
Record.size();
I != E; ++
I) {
7387 bool HasTailCall =
false;
7390 if (IsOldProfileFormat) {
7394 }
else if (HasProfile)
7395 std::tie(Hotness, HasTailCall) =
7428 static_cast<size_t>(
Record[Slot + 1])};
7451 while (Slot <
Record.size())
7455std::vector<FunctionSummary::ParamAccess>
7457 auto ReadRange = [&]() {
7459 BitcodeReader::decodeSignRotatedValue(
Record.front()));
7462 BitcodeReader::decodeSignRotatedValue(
Record.front()));
7470 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7471 while (!
Record.empty()) {
7472 PendingParamAccesses.emplace_back();
7476 ParamAccess.
Use = ReadRange();
7479 for (
auto &Call : ParamAccess.
Calls) {
7482 Call.Callee = std::get<0>(getValueInfoFromValueId(
Record.front()));
7484 Call.Offsets = ReadRange();
7487 return PendingParamAccesses;
7490void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableInfo(
7498void ModuleSummaryIndexBitcodeReader::parseTypeIdCompatibleVtableSummaryRecord(
7504 static_cast<size_t>(
Record[Slot + 1])});
7507 while (Slot <
Record.size())
7508 parseTypeIdCompatibleVtableInfo(
Record, Slot, TypeId);
7514 assert(ROCnt + WOCnt <= Refs.size());
7515 unsigned FirstWORef = Refs.size() - WOCnt;
7516 unsigned RefNo = FirstWORef - ROCnt;
7517 for (; RefNo < FirstWORef; ++RefNo)
7518 Refs[RefNo].setReadOnly();
7519 for (; RefNo < Refs.size(); ++RefNo)
7520 Refs[RefNo].setWriteOnly();
7525Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
unsigned ID) {
7526 if (
Error Err = Stream.EnterSubBlock(
ID))
7538 return error(
"Invalid Summary Block: record for version expected");
7543 return error(
"Invalid Summary Block: version expected");
7546 const bool IsOldProfileFormat =
Version == 1;
7548 return error(
"Invalid summary version " +
Twine(Version) +
7549 ". Version should be in the range [1-" +
7562 std::vector<GlobalValue::GUID> PendingTypeTests;
7563 std::vector<FunctionSummary::VFuncId> PendingTypeTestAssumeVCalls,
7564 PendingTypeCheckedLoadVCalls;
7565 std::vector<FunctionSummary::ConstVCall> PendingTypeTestAssumeConstVCalls,
7566 PendingTypeCheckedLoadConstVCalls;
7567 std::vector<FunctionSummary::ParamAccess> PendingParamAccesses;
7569 std::vector<CallsiteInfo> PendingCallsites;
7570 std::vector<AllocInfo> PendingAllocs;
7578 switch (
Entry.Kind) {
7581 return error(
"Malformed block");
7600 switch (
unsigned BitCode = MaybeBitCode.
get()) {
7610 ValueIdToValueInfoMap[ValueID] = std::make_tuple(
7626 unsigned ValueID =
Record[0];
7628 unsigned InstCount =
Record[2];
7630 unsigned NumRefs =
Record[3];
7631 unsigned NumRORefs = 0, NumWORefs = 0;
7632 int RefListStartIndex = 4;
7636 RefListStartIndex = 5;
7639 RefListStartIndex = 6;
7642 RefListStartIndex = 7;
7653 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7655 "Record size inconsistent with number of references");
7656 std::vector<ValueInfo> Refs = makeRefList(
7660 std::vector<FunctionSummary::EdgeTy> Calls = makeCallList(
7662 IsOldProfileFormat, HasProfile, HasRelBF);
7664 auto VIAndOriginalGUID = getValueInfoFromValueId(ValueID);
7671 !IsPrevailing(std::get<2>(VIAndOriginalGUID))) {
7672 PendingCallsites.clear();
7673 PendingAllocs.clear();
7675 auto FS = std::make_unique<FunctionSummary>(
7677 std::move(Refs), std::move(Calls), std::move(PendingTypeTests),
7678 std::move(PendingTypeTestAssumeVCalls),
7679 std::move(PendingTypeCheckedLoadVCalls),
7680 std::move(PendingTypeTestAssumeConstVCalls),
7681 std::move(PendingTypeCheckedLoadConstVCalls),
7682 std::move(PendingParamAccesses), std::move(PendingCallsites),
7683 std::move(PendingAllocs));
7684 FS->setModulePath(getThisModule()->first());
7685 FS->setOriginalName(std::get<1>(VIAndOriginalGUID));
7694 unsigned ValueID =
Record[0];
7696 unsigned AliaseeID =
Record[2];
7698 auto AS = std::make_unique<AliasSummary>(Flags);
7704 AS->setModulePath(getThisModule()->first());
7706 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeID));
7708 if (!AliaseeInModule)
7709 return error(
"Alias expects aliasee summary to be parsed");
7710 AS->setAliasee(AliaseeVI, AliaseeInModule);
7712 auto GUID = getValueInfoFromValueId(ValueID);
7713 AS->setOriginalName(std::get<1>(GUID));
7719 unsigned ValueID =
Record[0];
7721 unsigned RefArrayStart = 2;
7731 std::vector<ValueInfo> Refs =
7734 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7735 FS->setModulePath(getThisModule()->first());
7736 auto GUID = getValueInfoFromValueId(ValueID);
7737 FS->setOriginalName(std::get<1>(GUID));
7745 unsigned ValueID =
Record[0];
7748 unsigned NumRefs =
Record[3];
7749 unsigned RefListStartIndex = 4;
7750 unsigned VTableListStartIndex = RefListStartIndex + NumRefs;
7752 std::vector<ValueInfo> Refs = makeRefList(
7755 for (
unsigned I = VTableListStartIndex, E =
Record.size();
I != E; ++
I) {
7761 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7762 VS->setModulePath(getThisModule()->first());
7763 VS->setVTableFuncs(VTableFuncs);
7764 auto GUID = getValueInfoFromValueId(ValueID);
7765 VS->setOriginalName(std::get<1>(GUID));
7777 unsigned ValueID =
Record[0];
7780 unsigned InstCount =
Record[3];
7783 unsigned NumRefs =
Record[4];
7784 unsigned NumRORefs = 0, NumWORefs = 0;
7785 int RefListStartIndex = 5;
7789 RefListStartIndex = 6;
7790 size_t NumRefsIndex = 5;
7792 unsigned NumRORefsOffset = 1;
7793 RefListStartIndex = 7;
7797 RefListStartIndex = 8;
7799 RefListStartIndex = 9;
7801 NumRORefsOffset = 2;
7804 NumRORefs =
Record[RefListStartIndex - NumRORefsOffset];
7806 NumRefs =
Record[NumRefsIndex];
7810 int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
7812 "Record size inconsistent with number of references");
7813 std::vector<ValueInfo> Refs = makeRefList(
7816 std::vector<FunctionSummary::EdgeTy> Edges = makeCallList(
7818 IsOldProfileFormat, HasProfile,
false);
7819 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
7821 auto FS = std::make_unique<FunctionSummary>(
7823 std::move(Refs), std::move(Edges), std::move(PendingTypeTests),
7824 std::move(PendingTypeTestAssumeVCalls),
7825 std::move(PendingTypeCheckedLoadVCalls),
7826 std::move(PendingTypeTestAssumeConstVCalls),
7827 std::move(PendingTypeCheckedLoadConstVCalls),
7828 std::move(PendingParamAccesses), std::move(PendingCallsites),
7829 std::move(PendingAllocs));
7830 LastSeenSummary =
FS.get();
7831 LastSeenGUID =
VI.getGUID();
7832 FS->setModulePath(ModuleIdMap[ModuleId]);
7840 unsigned ValueID =
Record[0];
7843 unsigned AliaseeValueId =
Record[3];
7845 auto AS = std::make_unique<AliasSummary>(Flags);
7846 LastSeenSummary = AS.get();
7847 AS->setModulePath(ModuleIdMap[ModuleId]);
7849 auto AliaseeVI = std::get<0>(getValueInfoFromValueId(AliaseeValueId));
7851 AS->setAliasee(AliaseeVI, AliaseeInModule);
7853 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
7854 LastSeenGUID =
VI.getGUID();
7860 unsigned ValueID =
Record[0];
7863 unsigned RefArrayStart = 3;
7873 std::vector<ValueInfo> Refs =
7876 std::make_unique<GlobalVarSummary>(Flags, GVF, std::move(Refs));
7877 LastSeenSummary =
FS.get();
7878 FS->setModulePath(ModuleIdMap[ModuleId]);
7879 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
7880 LastSeenGUID =
VI.getGUID();
7887 if (!LastSeenSummary)
7888 return error(
"Name attachment that does not follow a combined record");
7892 LastSeenSummary =
nullptr;
7897 assert(PendingTypeTests.empty());
7902 assert(PendingTypeTestAssumeVCalls.empty());
7903 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
7904 PendingTypeTestAssumeVCalls.push_back({Record[I], Record[I+1]});
7908 assert(PendingTypeCheckedLoadVCalls.empty());
7909 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
7910 PendingTypeCheckedLoadVCalls.push_back({Record[I], Record[I+1]});
7914 PendingTypeTestAssumeConstVCalls.push_back(
7919 PendingTypeCheckedLoadConstVCalls.push_back(
7925 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
7926 CfiFunctionDefs.insert(
7927 {Strtab.data() + Record[I], static_cast<size_t>(Record[I + 1])});
7933 for (
unsigned I = 0;
I !=
Record.size();
I += 2)
7934 CfiFunctionDecls.insert(
7935 {Strtab.data() + Record[I], static_cast<size_t>(Record[I + 1])});
7944 parseTypeIdCompatibleVtableSummaryRecord(
Record);
7952 PendingParamAccesses = parseParamAccesses(
Record);
7964 unsigned ValueID =
Record[0];
7966 for (
auto R =
Record.begin() + 1; R !=
Record.end(); R++) {
7967 assert(*R < StackIds.size());
7970 ValueInfo VI = std::get<0>(getValueInfoFromValueId(ValueID));
7971 PendingCallsites.push_back(
CallsiteInfo({
VI, std::move(StackIdList)}));
7976 auto RecordIter =
Record.begin();
7977 unsigned ValueID = *RecordIter++;
7978 unsigned NumStackIds = *RecordIter++;
7979 unsigned NumVersions = *RecordIter++;
7980 assert(
Record.size() == 3 + NumStackIds + NumVersions);
7982 for (
unsigned J = 0; J < NumStackIds; J++) {
7983 assert(*RecordIter < StackIds.size());
7988 for (
unsigned J = 0; J < NumVersions; J++)
7991 getValueInfoFromValueId</*AllowNullValueInfo*/ true>(ValueID));
7992 PendingCallsites.push_back(
7993 CallsiteInfo({
VI, std::move(Versions), std::move(StackIdList)}));
7999 std::vector<MIBInfo> MIBs;
8000 unsigned NumMIBs = 0;
8003 unsigned MIBsRead = 0;
8004 while ((Version >= 10 && MIBsRead++ < NumMIBs) ||
8008 unsigned NumStackEntries =
Record[
I++];
8011 for (
unsigned J = 0; J < NumStackEntries; J++) {
8018 std::vector<uint64_t> TotalSizes;
8023 while (MIBsRead++ < NumMIBs)
8024 TotalSizes.push_back(
Record[
I++]);
8026 PendingAllocs.push_back(
AllocInfo(std::move(MIBs)));
8027 if (!TotalSizes.empty()) {
8028 assert(PendingAllocs.back().MIBs.size() == TotalSizes.size());
8029 PendingAllocs.back().TotalSizes = std::move(TotalSizes);
8036 std::vector<MIBInfo> MIBs;
8037 unsigned NumMIBs =
Record[
I++];
8038 unsigned NumVersions =
Record[
I++];
8039 unsigned MIBsRead = 0;
8040 while (MIBsRead++ < NumMIBs) {
8043 unsigned NumStackEntries =
Record[
I++];
8046 for (
unsigned J = 0; J < NumStackEntries; J++) {
8055 for (
unsigned J = 0; J < NumVersions; J++)
8057 std::vector<uint64_t> TotalSizes;
8062 while (MIBsRead++ < NumMIBs) {
8063 TotalSizes.push_back(
Record[
I++]);
8066 PendingAllocs.push_back(
8067 AllocInfo(std::move(Versions), std::move(MIBs)));
8068 if (!TotalSizes.empty()) {
8069 assert(PendingAllocs.back().MIBs.size() == TotalSizes.size());
8070 PendingAllocs.back().TotalSizes = std::move(TotalSizes);
8081Error ModuleSummaryIndexBitcodeReader::parseModuleStringTable() {
8096 switch (
Entry.Kind) {
8099 return error(
"Malformed block");
8111 switch (MaybeRecord.
get()) {
8119 return error(
"Invalid record");
8121 LastSeenModule = TheIndex.
addModule(ModulePath);
8122 ModuleIdMap[ModuleId] = LastSeenModule->
first();
8131 if (!LastSeenModule)
8132 return error(
"Invalid hash that does not follow a module path");
8134 for (
auto &Val :
Record) {
8135 assert(!(Val >> 32) &&
"Unexpected high bits set");
8136 LastSeenModule->
second[Pos++] = Val;
8139 LastSeenModule =
nullptr;
8152class BitcodeErrorCategoryType :
public std::error_category {
8153 const char *
name()
const noexcept
override {
8154 return "llvm.bitcode";
8157 std::string message(
int IE)
const override {
8160 case BitcodeError::CorruptedBitcode:
8161 return "Corrupted bitcode";
8170 static BitcodeErrorCategoryType ErrorCategory;
8171 return ErrorCategory;
8175 unsigned Block,
unsigned RecordID) {
8177 return std::move(Err);
8186 switch (Entry.Kind) {
8191 return error(
"Malformed block");
8195 return std::move(Err);
8205 if (MaybeRecord.
get() == RecordID)
8220 return FOrErr.takeError();
8221 return std::move(FOrErr->Mods);
8246 switch (Entry.Kind) {
8249 return error(
"Malformed block");
8252 uint64_t IdentificationBit = -1ull;
8256 return std::move(Err);
8262 Entry = MaybeEntry.
get();
8267 return error(
"Malformed block");
8273 return std::move(Err);
8292 if (!
I.Strtab.empty())
8299 if (!
F.Symtab.empty() &&
F.StrtabForSymtab.empty())
8300 F.StrtabForSymtab = *Strtab;
8316 if (
F.Symtab.empty())
8317 F.Symtab = *SymtabOrErr;
8322 return std::move(Err);
8327 return std::move(E);
8342BitcodeModule::getModuleImpl(
LLVMContext &Context,
bool MaterializeAll,
8343 bool ShouldLazyLoadMetadata,
bool IsImporting,
8347 std::string ProducerIdentification;
8348 if (IdentificationBit != -1ull) {
8349 if (
Error JumpFailed = Stream.JumpToBit(IdentificationBit))
8350 return std::move(JumpFailed);
8353 return std::move(E);
8356 if (
Error JumpFailed = Stream.JumpToBit(ModuleBit))
8357 return std::move(JumpFailed);
8358 auto *
R =
new BitcodeReader(std::move(Stream), Strtab, ProducerIdentification,
8361 std::unique_ptr<Module>
M =
8362 std::make_unique<Module>(ModuleIdentifier, Context);
8363 M->setMaterializer(R);
8366 if (
Error Err =
R->parseBitcodeInto(
M.get(), ShouldLazyLoadMetadata,
8367 IsImporting, Callbacks))
8368 return std::move(Err);
8370 if (MaterializeAll) {
8372 if (
Error Err =
M->materializeAll())
8373 return std::move(Err);
8376 if (
Error Err =
R->materializeForwardReferencedFunctions())
8377 return std::move(Err);
8380 return std::move(M);
8386 return getModuleImpl(Context,
false, ShouldLazyLoadMetadata, IsImporting,
8401 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, CombinedIndex,
8402 ModulePath, IsPrevailing);
8403 return R.parseModule();
8410 return std::move(JumpFailed);
8412 auto Index = std::make_unique<ModuleSummaryIndex>(
false);
8413 ModuleSummaryIndexBitcodeReader R(std::move(Stream), Strtab, *
Index,
8414 ModuleIdentifier, 0);
8416 if (
Error Err = R.parseModule())
8417 return std::move(Err);
8419 return std::move(
Index);
8427 return std::move(Err);
8432 std::pair<bool, bool> Result = {
false,
false};
8434 return std::move(E);
8436 switch (Entry.Kind) {
8439 return error(
"Malformed block");
8454 switch (MaybeBitCode.
get()) {
8460 assert(Flags <= 0x2ff &&
"Unexpected bits in flag");
8462 bool EnableSplitLTOUnit = Flags & 0x8;
8463 bool UnifiedLTO = Flags & 0x200;
8464 Result = {EnableSplitLTOUnit, UnifiedLTO};
8477 return std::move(JumpFailed);
8480 return std::move(Err);
8485 return std::move(E);
8487 switch (Entry.Kind) {
8489 return error(
"Malformed block");
8500 return Flags.takeError();
8512 return Flags.takeError();
8521 return std::move(Err);
8528 return StreamFailed.takeError();
8538 if (MsOrErr->size() != 1)
8539 return error(
"Expected a single module");
8541 return (*MsOrErr)[0];
8546 bool ShouldLazyLoadMetadata,
bool IsImporting,
8552 return BM->getLazyModule(Context, ShouldLazyLoadMetadata, IsImporting,
8557 std::unique_ptr<MemoryBuffer> &&Buffer,
LLVMContext &Context,
8558 bool ShouldLazyLoadMetadata,
bool IsImporting,
ParserCallbacks Callbacks) {
8560 IsImporting, Callbacks);
8562 (*MOrErr)->setOwnedMemoryBuffer(std::move(Buffer));
8568 return getModuleImpl(Context,
true,
false,
false, Callbacks);
8580 return BM->parseModule(Context, Callbacks);
8613 return BM->readSummary(CombinedIndex, BM->getModuleIdentifier());
8622 return BM->getSummary();
8630 return BM->getLTOInfo();
8635 bool IgnoreEmptyThinLTOIndexFile) {
8640 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)
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 void setSpecialRefs(std::vector< ValueInfo > &Refs, unsigned ROCnt, unsigned WOCnt)
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...
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...
Module.h This file contains the declarations for the Module class.
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.
@ Min
*p = old <signed v ? old : v
@ 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 parameter 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 parameter 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 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=std::nullopt, 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.
SyncScope::ID getOrInsertSyncScopeID(StringRef SSN)
getOrInsertSyncScopeID - Maps synchronization scope name to synchronization scope ID.
void emitError(uint64_t LocCookie, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
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...
std::set< std::string > & cfiFunctionDecls()
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.
static constexpr uint64_t BitcodeSummaryVersion
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)
std::set< std::string > & cfiFunctionDefs()
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...
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.
void setBody(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type.
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...
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.
static TargetExtType * get(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types=std::nullopt, ArrayRef< unsigned > Ints=std::nullopt)
Return a target extension type having the specified name and optional type and integer parameters.
@ HasZeroInit
zeroinitializer is valid for this target extension type.
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, 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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ 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.
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_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_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_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_PRESPLIT_COROUTINE
@ ATTR_KIND_NO_SANITIZE_COVERAGE
@ 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.
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.
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