65 "Allow incomplete IR on a best effort basis (references to unknown "
66 "metadata will be dropped)"));
81 if (Context.shouldDiscardValueNames())
84 "Can't read textual IR with a Context that discards named Values");
87 if (parseTargetDefinitions(DataLayoutCallback))
91 return parseTopLevelEntities() || validateEndOfModule(UpgradeDebugInfo) ||
97 restoreParsingState(Slots);
101 if (parseType(Ty) || parseConstantValue(Ty,
C))
104 return error(Lex.getLoc(),
"expected end of string");
110 restoreParsingState(Slots);
114 SMLoc Start = Lex.getLoc();
118 SMLoc End = Lex.getLoc();
126 restoreParsingState(Slots);
130 SMLoc Start = Lex.getLoc();
132 bool Status = parseDIExpressionBody(Result,
false);
133 SMLoc End = Lex.getLoc();
139void LLParser::restoreParsingState(
const SlotMapping *Slots) {
146 std::make_pair(
I.getKey(), std::make_pair(
I.second,
LocTy())));
147 for (
const auto &
I : Slots->
Types)
148 NumberedTypes.insert(
149 std::make_pair(
I.first, std::make_pair(
I.second,
LocTy())));
155 II->getIntrinsicID() != Intrinsic::experimental_noalias_scope_decl)
162 if (MD->isTemporary())
166 assert(
II->use_empty() &&
"Cannot have uses");
167 II->eraseFromParent();
176void LLParser::dropUnknownMetadataReferences() {
177 auto Pred = [](
unsigned MDKind, MDNode *
Node) {
return Node->isTemporary(); };
178 for (Function &
F : *M) {
179 F.eraseMetadataIf(Pred);
181 I.eraseMetadataIf(Pred);
188 for (GlobalVariable &GV : M->globals())
189 GV.eraseMetadataIf(Pred);
194 if (
Info.first->getNumTemporaryUses() == 1) {
195 NumberedMetadata.erase(
ID);
196 ForwardRefMDNodes.erase(
ID);
209 assert(!(SeenNewDbgInfoFormat && SeenOldDbgInfoFormat) &&
210 "Mixed debug intrinsics/records seen without a parsing error?");
213 for (
const auto &RAG : ForwardRefAttrGroups) {
215 const std::vector<unsigned> &
Attrs = RAG.second;
216 AttrBuilder
B(Context);
218 for (
const auto &Attr : Attrs) {
219 auto R = NumberedAttrBuilders.find(Attr);
220 if (R != NumberedAttrBuilders.end())
225 AttributeList AS = Fn->getAttributes();
226 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
227 AS = AS.removeFnAttributes(Context);
233 if (MaybeAlign
A = FnAttrs.getAlignment()) {
234 Fn->setAlignment(*
A);
235 FnAttrs.removeAttribute(Attribute::Alignment);
238 AS = AS.addFnAttributes(Context, FnAttrs);
239 Fn->setAttributes(AS);
241 AttributeList AS = CI->getAttributes();
242 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
243 AS = AS.removeFnAttributes(Context);
245 AS = AS.addFnAttributes(Context, FnAttrs);
246 CI->setAttributes(AS);
248 AttributeList AS =
II->getAttributes();
249 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
250 AS = AS.removeFnAttributes(Context);
252 AS = AS.addFnAttributes(Context, FnAttrs);
253 II->setAttributes(AS);
255 AttributeList AS = CBI->getAttributes();
256 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
257 AS = AS.removeFnAttributes(Context);
259 AS = AS.addFnAttributes(Context, FnAttrs);
260 CBI->setAttributes(AS);
262 AttrBuilder
Attrs(M->getContext(), GV->getAttributes());
272 if (!ForwardRefBlockAddresses.empty())
273 return error(ForwardRefBlockAddresses.begin()->first.Loc,
274 "expected function name in blockaddress");
276 auto ResolveForwardRefDSOLocalEquivalents = [&](
const ValID &GVRef,
277 GlobalValue *FwdRef) {
278 GlobalValue *GV =
nullptr;
280 GV = M->getNamedValue(GVRef.
StrVal);
282 GV = NumberedVals.get(GVRef.
UIntVal);
287 "' referenced by dso_local_equivalent");
291 "expected a function, alias to function, or ifunc "
292 "in dso_local_equivalent");
295 FwdRef->replaceAllUsesWith(Equiv);
296 FwdRef->eraseFromParent();
303 for (
auto &Iter : ForwardRefDSOLocalEquivalentIDs) {
304 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
307 for (
auto &Iter : ForwardRefDSOLocalEquivalentNames) {
308 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
311 ForwardRefDSOLocalEquivalentIDs.clear();
312 ForwardRefDSOLocalEquivalentNames.clear();
314 for (
const auto &NT : NumberedTypes)
315 if (
NT.second.second.isValid())
317 "use of undefined type '%" + Twine(
NT.first) +
"'");
319 for (
const auto &[Name, TypeInfo] : NamedTypes)
320 if (TypeInfo.second.isValid())
321 return error(TypeInfo.second,
322 "use of undefined type named '" + Name +
"'");
324 if (!ForwardRefComdats.empty())
325 return error(ForwardRefComdats.begin()->second,
326 "use of undefined comdat '$" +
327 ForwardRefComdats.begin()->first +
"'");
341 if (!CB || !CB->isCallee(&U))
342 return error(
Info.second,
"intrinsic can only be used as callee");
356 return error(
Info.second,
"unknown intrinsic '" + Name +
"'");
357 return error(
Info.second,
"invalid intrinsic signature");
367 Info.first->eraseFromParent();
368 ForwardRefVals.erase(Name);
377 auto GetCommonFunctionType = [](
Value *
V) -> FunctionType * {
378 FunctionType *FTy =
nullptr;
379 for (Use &U :
V->uses()) {
381 if (!CB || !CB->isCallee(&U) || (FTy && FTy != CB->getFunctionType()))
383 FTy = CB->getFunctionType();
391 Type *Ty = GetCommonFunctionType(
Info.first);
399 GV =
new GlobalVariable(*M, Ty,
false,
402 Info.first->replaceAllUsesWith(GV);
403 Info.first->eraseFromParent();
404 ForwardRefVals.erase(Name);
407 if (!ForwardRefVals.empty())
408 return error(ForwardRefVals.begin()->second.second,
409 "use of undefined value '@" + ForwardRefVals.begin()->first +
412 if (!ForwardRefValIDs.empty())
413 return error(ForwardRefValIDs.begin()->second.second,
414 "use of undefined value '@" +
415 Twine(ForwardRefValIDs.begin()->first) +
"'");
418 dropUnknownMetadataReferences();
420 if (!ForwardRefMDNodes.empty())
421 return error(ForwardRefMDNodes.begin()->second.second,
422 "use of undefined metadata '!" +
423 Twine(ForwardRefMDNodes.begin()->first) +
"'");
426 for (
auto &
N : NumberedMetadata) {
427 if (
N.second && !
N.second->isResolved())
428 N.second->resolveCycles();
432 NewDistinctSPs.clear();
434 for (
auto *Inst : InstsWithTBAATag) {
435 MDNode *MD = Inst->getMetadata(LLVMContext::MD_tbaa);
438 assert(MD &&
"UpgradeInstWithTBAATag should have a TBAA tag");
441 if (MD != UpgradedMD)
442 Inst->setMetadata(LLVMContext::MD_tbaa, UpgradedMD);
451 if (UpgradeDebugInfo)
464 Slots->GlobalValues = std::move(NumberedVals);
465 Slots->MetadataNodes = std::move(NumberedMetadata);
466 for (
const auto &
I : NamedTypes)
467 Slots->NamedTypes.insert(std::make_pair(
I.getKey(),
I.second.first));
468 for (
const auto &
I : NumberedTypes)
469 Slots->Types.insert(std::make_pair(
I.first,
I.second.first));
475bool LLParser::validateEndOfIndex() {
479 if (!ForwardRefValueInfos.empty())
480 return error(ForwardRefValueInfos.begin()->second.front().second,
481 "use of undefined summary '^" +
482 Twine(ForwardRefValueInfos.begin()->first) +
"'");
484 if (!ForwardRefAliasees.empty())
485 return error(ForwardRefAliasees.begin()->second.front().second,
486 "use of undefined summary '^" +
487 Twine(ForwardRefAliasees.begin()->first) +
"'");
489 if (!ForwardRefTypeIds.empty())
490 return error(ForwardRefTypeIds.begin()->second.front().second,
491 "use of undefined type id summary '^" +
492 Twine(ForwardRefTypeIds.begin()->first) +
"'");
506 std::string TentativeDLStr = M->getDataLayoutStr();
511 switch (Lex.getKind()) {
513 if (parseTargetDefinition(TentativeDLStr, DLStrLoc))
517 if (parseSourceFileName())
526 if (
auto LayoutOverride =
527 DataLayoutCallback(M->getTargetTriple().str(), TentativeDLStr)) {
528 TentativeDLStr = *LayoutOverride;
534 M->setDataLayout(MaybeDL.
get());
538bool LLParser::parseTopLevelEntities() {
542 switch (Lex.getKind()) {
546 if (parseSummaryEntry())
550 if (parseSourceFileName())
560 switch (Lex.getKind()) {
562 return tokError(
"expected top-level entity");
573 if (parseModuleAsm())
577 if (parseUnnamedType())
581 if (parseNamedType())
585 if (parseUnnamedGlobal())
589 if (parseNamedGlobal())
594 if (parseStandaloneMetadata())
598 if (parseSummaryEntry())
602 if (parseNamedMetadata())
606 if (parseUnnamedAttrGrp())
610 if (parseUseListOrder())
614 if (parseUseListOrderBB())
623bool LLParser::parseModuleAsm() {
629 parseStringConstant(AsmStr))
632 M->appendModuleInlineAsm(AsmStr);
639bool LLParser::parseTargetDefinition(std::string &TentativeDLStr,
645 return tokError(
"unknown target property");
648 if (parseToken(
lltok::equal,
"expected '=' after target triple") ||
649 parseStringConstant(Str))
651 M->setTargetTriple(Triple(std::move(Str)));
655 if (parseToken(
lltok::equal,
"expected '=' after target datalayout"))
657 DLStrLoc = Lex.getLoc();
658 if (parseStringConstant(TentativeDLStr))
666bool LLParser::parseSourceFileName() {
669 if (parseToken(
lltok::equal,
"expected '=' after source_filename") ||
670 parseStringConstant(SourceFileName))
673 M->setSourceFileName(SourceFileName);
679bool LLParser::parseUnnamedType() {
680 LocTy TypeLoc = Lex.getLoc();
681 unsigned TypeID = Lex.getUIntVal();
684 if (parseToken(
lltok::equal,
"expected '=' after name") ||
689 if (parseStructDefinition(TypeLoc,
"", NumberedTypes[
TypeID], Result))
693 std::pair<Type*, LocTy> &
Entry = NumberedTypes[
TypeID];
695 return error(TypeLoc,
"non-struct types may not be recursive");
697 Entry.second = SMLoc();
705bool LLParser::parseNamedType() {
706 std::string
Name = Lex.getStrVal();
707 LocTy NameLoc = Lex.getLoc();
710 if (parseToken(
lltok::equal,
"expected '=' after name") ||
715 if (parseStructDefinition(NameLoc, Name, NamedTypes[Name], Result))
719 std::pair<Type*, LocTy> &
Entry = NamedTypes[
Name];
721 return error(NameLoc,
"non-struct types may not be recursive");
723 Entry.second = SMLoc();
731bool LLParser::parseDeclare() {
735 std::vector<std::pair<unsigned, MDNode *>> MDs;
739 if (parseMetadataAttachment(MDK,
N))
741 MDs.push_back({MDK,
N});
745 unsigned FunctionNumber = -1;
746 SmallVector<unsigned> UnnamedArgNums;
747 if (parseFunctionHeader(
F,
false, FunctionNumber, UnnamedArgNums))
750 F->addMetadata(MD.first, *MD.second);
756bool LLParser::parseDefine() {
759 FileLoc FunctionStart = getTokLineColumnPos();
763 unsigned FunctionNumber = -1;
764 SmallVector<unsigned> UnnamedArgNums;
766 parseFunctionHeader(
F,
true, FunctionNumber, UnnamedArgNums) ||
767 parseOptionalFunctionMetadata(*
F) ||
768 parseFunctionBody(*
F, FunctionNumber, UnnamedArgNums);
770 ParserContext->addFunctionLocation(
771 F, FileLocRange(FunctionStart, getPrevTokEndLineColumnPos()));
779bool LLParser::parseGlobalType(
bool &IsConstant) {
786 return tokError(
"expected 'global' or 'constant'");
792bool LLParser::parseOptionalUnnamedAddr(
813bool LLParser::parseUnnamedGlobal() {
816 LocTy NameLoc = Lex.getLoc();
820 VarID = Lex.getUIntVal();
821 if (checkValueID(NameLoc,
"global",
"@", NumberedVals.getNext(),
VarID))
825 if (parseToken(
lltok::equal,
"expected '=' after name"))
828 VarID = NumberedVals.getNext();
832 unsigned Linkage, Visibility, DLLStorageClass;
836 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
838 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
841 switch (Lex.getKind()) {
843 return parseGlobal(Name,
VarID, NameLoc,
Linkage, HasLinkage, Visibility,
844 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
847 return parseAliasOrIFunc(Name,
VarID, NameLoc,
Linkage, Visibility,
848 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
857bool LLParser::parseNamedGlobal() {
859 LocTy NameLoc = Lex.getLoc();
860 std::string
Name = Lex.getStrVal();
864 unsigned Linkage, Visibility, DLLStorageClass;
868 if (parseToken(
lltok::equal,
"expected '=' in global variable") ||
869 parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
871 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
874 switch (Lex.getKind()) {
876 return parseGlobal(Name, -1, NameLoc,
Linkage, HasLinkage, Visibility,
877 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
880 return parseAliasOrIFunc(Name, -1, NameLoc,
Linkage, Visibility,
881 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
885bool LLParser::parseComdat() {
887 std::string
Name = Lex.getStrVal();
888 LocTy NameLoc = Lex.getLoc();
895 return tokError(
"expected comdat type");
898 switch (Lex.getKind()) {
900 return tokError(
"unknown selection kind");
922 if (
I != ComdatSymTab.
end() && !ForwardRefComdats.erase(Name))
923 return error(NameLoc,
"redefinition of comdat '$" + Name +
"'");
926 if (
I != ComdatSymTab.
end())
929 C = M->getOrInsertComdat(Name);
930 C->setSelectionKind(SK);
937bool LLParser::parseMDString(
MDString *&Result) {
939 if (parseStringConstant(Str))
947bool LLParser::parseMDNodeID(
MDNode *&Result) {
949 LocTy IDLoc = Lex.getLoc();
951 if (parseUInt32(MID))
955 auto [It,
Inserted] = NumberedMetadata.try_emplace(MID);
962 auto &FwdRef = ForwardRefMDNodes[MID];
965 Result = FwdRef.first.get();
966 It->second.reset(Result);
972bool LLParser::parseNamedMetadata() {
974 std::string
Name = Lex.getStrVal();
982 NamedMDNode *NMD = M->getOrInsertNamedMetadata(Name);
990 Lex.getStrVal() ==
"DIExpression") {
991 if (parseDIExpression(
N,
false))
996 Lex.getStrVal() ==
"DIArgList") {
997 return tokError(
"found DIArgList outside of function");
1005 return parseToken(
lltok::rbrace,
"expected end of metadata node");
1010bool LLParser::parseStandaloneMetadata() {
1013 unsigned MetadataID = 0;
1016 if (parseUInt32(MetadataID) || parseToken(
lltok::equal,
"expected '=' here"))
1021 return tokError(
"unexpected type in metadata definition");
1025 if (parseSpecializedMDNode(Init, IsDistinct))
1028 parseMDTuple(Init, IsDistinct))
1032 auto FI = ForwardRefMDNodes.find(MetadataID);
1033 if (FI != ForwardRefMDNodes.end()) {
1034 auto *ToReplace = FI->second.first.get();
1038 for (
auto *Inst : TempDIAssignIDAttachments[ToReplace]) {
1039 assert(!Inst->getMetadata(LLVMContext::MD_DIAssignID) &&
1040 "Inst unexpectedly already has DIAssignID attachment");
1041 Inst->setMetadata(LLVMContext::MD_DIAssignID, Init);
1045 ToReplace->replaceAllUsesWith(Init);
1046 ForwardRefMDNodes.erase(FI);
1048 assert(NumberedMetadata[MetadataID] == Init &&
"Tracking VH didn't work");
1050 auto [It,
Inserted] = NumberedMetadata.try_emplace(MetadataID);
1052 return tokError(
"Metadata id is already used");
1053 It->second.reset(Init);
1060bool LLParser::skipModuleSummaryEntry() {
1070 "Expected 'gv', 'module', 'typeid', 'flags' or 'blockcount' at the "
1071 "start of summary entry");
1073 return parseSummaryIndexFlags();
1075 return parseBlockCount();
1077 if (parseToken(
lltok::colon,
"expected ':' at start of summary entry") ||
1078 parseToken(
lltok::lparen,
"expected '(' at start of summary entry"))
1082 unsigned NumOpenParen = 1;
1084 switch (Lex.getKind()) {
1092 return tokError(
"found end of file while parsing summary entry");
1098 }
while (NumOpenParen > 0);
1104bool LLParser::parseSummaryEntry() {
1110 Lex.setIgnoreColonInIdentifiers(
true);
1118 return skipModuleSummaryEntry();
1120 bool result =
false;
1121 switch (Lex.getKind()) {
1123 result = parseGVEntry(SummaryID);
1126 result = parseModuleEntry(SummaryID);
1129 result = parseTypeIdEntry(SummaryID);
1132 result = parseTypeIdCompatibleVtableEntry(SummaryID);
1135 result = parseSummaryIndexFlags();
1138 result = parseBlockCount();
1141 result =
error(Lex.getLoc(),
"unexpected summary kind");
1144 Lex.setIgnoreColonInIdentifiers(
false);
1178bool LLParser::parseAliasOrIFunc(
const std::string &Name,
unsigned NameID,
1179 LocTy NameLoc,
unsigned L,
unsigned Visibility,
1180 unsigned DLLStorageClass,
bool DSOLocal,
1195 return error(NameLoc,
"invalid linkage type for alias");
1198 return error(NameLoc,
1199 "symbol with local linkage must have default visibility");
1202 return error(NameLoc,
1203 "symbol with local linkage cannot have a DLL storage class");
1206 LocTy ExplicitTypeLoc = Lex.getLoc();
1207 if (parseType(Ty) ||
1208 parseToken(
lltok::comma,
"expected comma after alias or ifunc's type"))
1212 LocTy AliaseeLoc = Lex.getLoc();
1217 if (parseGlobalTypeAndValue(Aliasee))
1222 if (parseValID(
ID,
nullptr))
1225 return error(AliaseeLoc,
"invalid aliasee");
1226 Aliasee =
ID.ConstantVal;
1232 return error(AliaseeLoc,
"An alias or ifunc must have pointer type");
1233 unsigned AddrSpace = PTy->getAddressSpace();
1235 GlobalValue *GVal =
nullptr;
1239 if (!
Name.empty()) {
1240 auto I = ForwardRefVals.find(Name);
1241 if (
I != ForwardRefVals.end()) {
1242 GVal =
I->second.first;
1243 ForwardRefVals.erase(Name);
1244 }
else if (M->getNamedValue(Name)) {
1245 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1248 auto I = ForwardRefValIDs.find(NameID);
1249 if (
I != ForwardRefValIDs.end()) {
1250 GVal =
I->second.first;
1251 ForwardRefValIDs.erase(
I);
1256 std::unique_ptr<GlobalAlias> GA;
1257 std::unique_ptr<GlobalIFunc> GI;
1285 if (parseGlobalObjectMetadataAttachment(*GI))
1288 return tokError(
"unknown alias or ifunc property!");
1293 NumberedVals.add(NameID, GV);
1300 "forward reference and definition of alias have different types");
1310 M->insertAlias(GA.release());
1312 M->insertIFunc(GI.release());
1313 assert(GV->
getName() == Name &&
"Should not be a name conflict!");
1322 case lltok::kw_sanitize_memtag:
1336 switch (Lex.getKind()) {
1338 Meta.NoAddress =
true;
1341 Meta.NoHWAddress =
true;
1343 case lltok::kw_sanitize_memtag:
1347 Meta.IsDynInit =
true;
1350 return tokError(
"non-sanitizer token passed to LLParser::parseSanitizer()");
1370bool LLParser::parseGlobal(
const std::string &Name,
unsigned NameID,
1371 LocTy NameLoc,
unsigned Linkage,
bool HasLinkage,
1372 unsigned Visibility,
unsigned DLLStorageClass,
1376 return error(NameLoc,
1377 "symbol with local linkage must have default visibility");
1380 return error(NameLoc,
1381 "symbol with local linkage cannot have a DLL storage class");
1385 LocTy IsExternallyInitializedLoc;
1389 if (parseOptionalAddrSpace(AddrSpace) ||
1391 IsExternallyInitialized,
1392 &IsExternallyInitializedLoc) ||
1393 parseGlobalType(IsConstant) || parseType(Ty, TyLoc))
1402 if (parseGlobalValue(Ty, Init))
1407 return error(TyLoc,
"invalid type for global variable");
1409 GlobalValue *GVal =
nullptr;
1412 if (!
Name.empty()) {
1413 auto I = ForwardRefVals.find(Name);
1414 if (
I != ForwardRefVals.end()) {
1415 GVal =
I->second.first;
1416 ForwardRefVals.erase(
I);
1417 }
else if (M->getNamedValue(Name)) {
1418 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1423 if (NameID == (
unsigned)-1)
1424 NameID = NumberedVals.getNext();
1426 auto I = ForwardRefValIDs.find(NameID);
1427 if (
I != ForwardRefValIDs.end()) {
1428 GVal =
I->second.first;
1429 ForwardRefValIDs.erase(
I);
1433 GlobalVariable *GV =
new GlobalVariable(
1438 NumberedVals.add(NameID, GV);
1456 "forward reference and definition of global have different types");
1476 }
else if (Lex.getKind() == lltok::kw_align) {
1477 MaybeAlign Alignment;
1478 if (parseOptionalAlignment(Alignment))
1484 if (parseOptionalCodeModel(CodeModel))
1488 if (parseGlobalObjectMetadataAttachment(*GV))
1491 if (parseSanitizer(GV))
1495 if (parseOptionalComdat(Name,
C))
1500 return tokError(
"unknown global variable property!");
1504 AttrBuilder
Attrs(M->getContext());
1506 std::vector<unsigned> FwdRefAttrGrps;
1507 if (parseFnAttributeValuePairs(Attrs, FwdRefAttrGrps,
false, BuiltinLoc))
1509 if (
Attrs.hasAttributes() || !FwdRefAttrGrps.empty()) {
1511 ForwardRefAttrGroups[GV] = FwdRefAttrGrps;
1519bool LLParser::parseUnnamedAttrGrp() {
1521 LocTy AttrGrpLoc = Lex.getLoc();
1525 return tokError(
"expected attribute group id");
1527 unsigned VarID = Lex.getUIntVal();
1528 std::vector<unsigned> unused;
1536 auto R = NumberedAttrBuilders.find(
VarID);
1537 if (R == NumberedAttrBuilders.end())
1538 R = NumberedAttrBuilders.emplace(
VarID, AttrBuilder(M->getContext())).first;
1540 if (parseFnAttributeValuePairs(
R->second, unused,
true, BuiltinLoc) ||
1541 parseToken(
lltok::rbrace,
"expected end of attribute group"))
1544 if (!
R->second.hasAttributes())
1545 return error(AttrGrpLoc,
"attribute group has no attributes");
1552#define GET_ATTR_NAMES
1553#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME) \
1554 case lltok::kw_##DISPLAY_NAME: \
1555 return Attribute::ENUM_NAME;
1556#include "llvm/IR/Attributes.inc"
1565 return parseRequiredTypeAttr(
B, Lex.getKind(), Attr);
1568 case Attribute::Alignment: {
1569 MaybeAlign Alignment;
1577 if (parseOptionalAlignment(Alignment,
true))
1580 B.addAlignmentAttr(Alignment);
1583 case Attribute::StackAlignment: {
1588 parseUInt32(Alignment))
1591 if (parseOptionalStackAlignment(Alignment))
1594 B.addStackAlignmentAttr(Alignment);
1597 case Attribute::AllocSize: {
1598 unsigned ElemSizeArg;
1599 std::optional<unsigned> NumElemsArg;
1600 if (parseAllocSizeArguments(ElemSizeArg, NumElemsArg))
1602 B.addAllocSizeAttr(ElemSizeArg, NumElemsArg);
1605 case Attribute::VScaleRange: {
1606 unsigned MinValue, MaxValue;
1607 if (parseVScaleRangeArguments(MinValue, MaxValue))
1609 B.addVScaleRangeAttr(MinValue,
1610 MaxValue > 0 ? MaxValue : std::optional<unsigned>());
1613 case Attribute::Dereferenceable: {
1614 std::optional<uint64_t> Bytes;
1615 if (parseOptionalAttrBytes(lltok::kw_dereferenceable, Bytes))
1617 assert(Bytes.has_value());
1618 B.addDereferenceableAttr(Bytes.value());
1621 case Attribute::DeadOnReturn: {
1622 std::optional<uint64_t> Bytes;
1623 if (parseOptionalAttrBytes(lltok::kw_dead_on_return, Bytes,
1626 if (Bytes.has_value()) {
1627 B.addDeadOnReturnAttr(DeadOnReturnInfo(Bytes.value()));
1629 B.addDeadOnReturnAttr(DeadOnReturnInfo());
1633 case Attribute::DereferenceableOrNull: {
1634 std::optional<uint64_t> Bytes;
1635 if (parseOptionalAttrBytes(lltok::kw_dereferenceable_or_null, Bytes))
1637 assert(Bytes.has_value());
1638 B.addDereferenceableOrNullAttr(Bytes.value());
1641 case Attribute::UWTable: {
1643 if (parseOptionalUWTableKind(Kind))
1645 B.addUWTableAttr(Kind);
1648 case Attribute::AllocKind: {
1650 if (parseAllocKind(Kind))
1652 B.addAllocKindAttr(Kind);
1655 case Attribute::Memory: {
1656 std::optional<MemoryEffects> ME = parseMemoryAttr();
1659 B.addMemoryAttr(*ME);
1662 case Attribute::DenormalFPEnv: {
1663 std::optional<DenormalFPEnv>
Mode = parseDenormalFPEnvAttr();
1667 B.addDenormalFPEnvAttr(*
Mode);
1670 case Attribute::NoFPClass: {
1673 B.addNoFPClassAttr(NoFPClass);
1679 case Attribute::Range:
1680 return parseRangeAttr(
B);
1681 case Attribute::Initializes:
1682 return parseInitializesAttr(
B);
1683 case Attribute::Captures:
1684 return parseCapturesAttr(
B);
1686 B.addAttribute(Attr);
1694 case lltok::kw_readnone:
1697 case lltok::kw_readonly:
1700 case lltok::kw_writeonly:
1719bool LLParser::parseFnAttributeValuePairs(AttrBuilder &
B,
1720 std::vector<unsigned> &FwdRefAttrGrps,
1721 bool InAttrGrp, LocTy &BuiltinLoc) {
1722 bool HaveError =
false;
1733 if (parseStringAttribute(
B))
1745 "cannot have an attribute group reference in an attribute group");
1748 FwdRefAttrGrps.push_back(Lex.getUIntVal());
1754 SMLoc Loc = Lex.getLoc();
1755 if (Token == lltok::kw_builtin)
1767 return error(Lex.getLoc(),
"unterminated attribute group");
1770 if (parseEnumAttribute(Attr,
B, InAttrGrp))
1777 HaveError |=
error(Loc,
"this attribute does not apply to functions");
1781 B.addMemoryAttr(ME);
1795 PTy->getAddressSpace());
1804 error(Loc,
"'" + Name +
"' is not a basic block");
1806 error(Loc,
"'" + Name +
"' defined with type '" +
1819 error(Loc,
"global variable reference must have pointer type");
1830 auto I = ForwardRefVals.find(Name);
1831 if (
I != ForwardRefVals.end())
1832 Val =
I->second.first;
1838 checkValidVariableType(Loc,
"@" + Name, Ty, Val));
1842 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
1849 error(Loc,
"global variable reference must have pointer type");
1853 GlobalValue *Val = NumberedVals.get(
ID);
1858 auto I = ForwardRefValIDs.find(
ID);
1859 if (
I != ForwardRefValIDs.end())
1860 Val =
I->second.first;
1866 checkValidVariableType(Loc,
"@" + Twine(
ID), Ty, Val));
1870 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
1878Comdat *LLParser::getComdat(
const std::string &Name, LocTy
Loc) {
1882 if (
I != ComdatSymTab.
end())
1886 Comdat *
C = M->getOrInsertComdat(Name);
1887 ForwardRefComdats[
Name] = Loc;
1897bool LLParser::parseToken(
lltok::Kind T,
const char *ErrMsg) {
1898 if (Lex.getKind() !=
T)
1899 return tokError(ErrMsg);
1906bool LLParser::parseStringConstant(std::string &Result) {
1908 return tokError(
"expected string constant");
1909 Result = Lex.getStrVal();
1916bool LLParser::parseUInt32(uint32_t &Val) {
1917 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1918 return tokError(
"expected integer");
1919 uint64_t Val64 = Lex.getAPSIntVal().getLimitedValue(0xFFFFFFFFULL+1);
1920 if (Val64 !=
unsigned(Val64))
1921 return tokError(
"expected 32-bit integer (too large)");
1929bool LLParser::parseUInt64(uint64_t &Val) {
1930 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1931 return tokError(
"expected integer");
1932 Val = Lex.getAPSIntVal().getLimitedValue();
1942 switch (Lex.getKind()) {
1944 return tokError(
"expected localdynamic, initialexec or localexec");
1972 return parseTLSModel(TLM) ||
1973 parseToken(
lltok::rparen,
"expected ')' after thread local model");
1981bool LLParser::parseOptionalAddrSpace(
unsigned &AddrSpace,
unsigned DefaultAS) {
1982 AddrSpace = DefaultAS;
1986 auto ParseAddrspaceValue = [&](
unsigned &AddrSpace) ->
bool {
1988 const std::string &AddrSpaceStr = Lex.getStrVal();
1989 if (AddrSpaceStr ==
"A") {
1990 AddrSpace = M->getDataLayout().getAllocaAddrSpace();
1991 }
else if (AddrSpaceStr ==
"G") {
1992 AddrSpace = M->getDataLayout().getDefaultGlobalsAddressSpace();
1993 }
else if (AddrSpaceStr ==
"P") {
1994 AddrSpace = M->getDataLayout().getProgramAddressSpace();
1995 }
else if (std::optional<unsigned> AS =
1996 M->getDataLayout().getNamedAddressSpace(AddrSpaceStr)) {
1999 return tokError(
"invalid symbolic addrspace '" + AddrSpaceStr +
"'");
2005 return tokError(
"expected integer or string constant");
2006 SMLoc Loc = Lex.getLoc();
2007 if (parseUInt32(AddrSpace))
2010 return error(Loc,
"invalid address space, must be a 24-bit integer");
2014 return parseToken(
lltok::lparen,
"expected '(' in address space") ||
2015 ParseAddrspaceValue(AddrSpace) ||
2022bool LLParser::parseStringAttribute(AttrBuilder &
B) {
2023 std::string Attr = Lex.getStrVal();
2026 if (EatIfPresent(
lltok::equal) && parseStringConstant(Val))
2028 B.addAttribute(Attr, Val);
2033bool LLParser::parseOptionalParamOrReturnAttrs(AttrBuilder &
B,
bool IsParam) {
2034 bool HaveError =
false;
2041 if (parseStringAttribute(
B))
2052 SMLoc Loc = Lex.getLoc();
2057 if (parseEnumAttribute(Attr,
B,
false))
2061 HaveError |=
error(Loc,
"this attribute does not apply to parameters");
2063 HaveError |=
error(Loc,
"this attribute does not apply to return values");
2111bool LLParser::parseOptionalLinkage(
unsigned &Res,
bool &HasLinkage,
2112 unsigned &Visibility,
2113 unsigned &DLLStorageClass,
bool &DSOLocal) {
2117 parseOptionalDSOLocal(DSOLocal);
2118 parseOptionalVisibility(Visibility);
2119 parseOptionalDLLStorageClass(DLLStorageClass);
2122 return error(Lex.getLoc(),
"dso_location and DLL-StorageClass mismatch");
2128void LLParser::parseOptionalDSOLocal(
bool &DSOLocal) {
2129 switch (Lex.getKind()) {
2150void LLParser::parseOptionalVisibility(
unsigned &Res) {
2151 switch (Lex.getKind()) {
2168bool LLParser::parseOptionalImportType(
lltok::Kind Kind,
2172 return tokError(
"unknown import kind. Expect definition or declaration.");
2187void LLParser::parseOptionalDLLStorageClass(
unsigned &Res) {
2188 switch (Lex.getKind()) {
2258bool LLParser::parseOptionalCallingConv(
unsigned &CC) {
2259 switch (Lex.getKind()) {
2346 return tokError(
"unknown RISC-V ABI VLEN");
2347#define CC_VLS_CASE(ABIVlen) \
2349 CC = CallingConv::RISCV_VLSCall_##ABIVlen; \
2377 return parseUInt32(CC);
2387bool LLParser::parseMetadataAttachment(
unsigned &Kind,
MDNode *&MD) {
2390 std::string
Name = Lex.getStrVal();
2391 Kind = M->getMDKindID(Name);
2394 return parseMDNode(MD);
2399bool LLParser::parseInstructionMetadata(
Instruction &Inst) {
2402 return tokError(
"expected metadata after comma");
2406 if (parseMetadataAttachment(MDK,
N))
2409 if (MDK == LLVMContext::MD_DIAssignID)
2410 TempDIAssignIDAttachments[
N].push_back(&Inst);
2414 if (MDK == LLVMContext::MD_tbaa)
2415 InstsWithTBAATag.push_back(&Inst);
2424bool LLParser::parseGlobalObjectMetadataAttachment(
GlobalObject &GO) {
2427 if (parseMetadataAttachment(MDK,
N))
2436bool LLParser::parseOptionalFunctionMetadata(
Function &
F) {
2438 if (parseGlobalObjectMetadataAttachment(
F))
2446bool LLParser::parseOptionalAlignment(
MaybeAlign &Alignment,
bool AllowParens) {
2447 Alignment = std::nullopt;
2448 if (!EatIfPresent(lltok::kw_align))
2450 LocTy AlignLoc = Lex.getLoc();
2453 LocTy ParenLoc = Lex.getLoc();
2454 bool HaveParens =
false;
2460 if (parseUInt64(
Value))
2464 return error(ParenLoc,
"expected ')'");
2467 return error(AlignLoc,
"alignment is not a power of two");
2469 return error(AlignLoc,
"huge alignments are not supported yet");
2477bool LLParser::parseOptionalPrefAlignment(
MaybeAlign &Alignment) {
2478 Alignment = std::nullopt;
2481 LocTy AlignLoc = Lex.getLoc();
2484 LocTy ParenLoc = Lex.getLoc();
2486 return error(ParenLoc,
"expected '('");
2488 if (parseUInt64(
Value))
2491 ParenLoc = Lex.getLoc();
2493 return error(ParenLoc,
"expected ')'");
2496 return error(AlignLoc,
"alignment is not a power of two");
2498 return error(AlignLoc,
"huge alignments are not supported yet");
2508 auto StrVal = Lex.getStrVal();
2509 auto ErrMsg =
"expected global code model string";
2510 if (StrVal ==
"tiny")
2512 else if (StrVal ==
"small")
2514 else if (StrVal ==
"kernel")
2516 else if (StrVal ==
"medium")
2518 else if (StrVal ==
"large")
2521 return tokError(ErrMsg);
2533bool LLParser::parseOptionalAttrBytes(
lltok::Kind AttrKind,
2534 std::optional<uint64_t> &Bytes,
2535 bool ErrorNoBytes) {
2536 assert((AttrKind == lltok::kw_dereferenceable ||
2537 AttrKind == lltok::kw_dereferenceable_or_null ||
2538 AttrKind == lltok::kw_dead_on_return) &&
2542 if (!EatIfPresent(AttrKind))
2544 LocTy ParenLoc = Lex.getLoc();
2547 return error(ParenLoc,
"expected '('");
2548 Bytes = std::nullopt;
2551 LocTy DerefLoc = Lex.getLoc();
2552 if (parseUInt64(Bytes.value()))
2554 ParenLoc = Lex.getLoc();
2556 return error(ParenLoc,
"expected ')'");
2558 return error(DerefLoc,
"byte count specified must be non-zero");
2562bool LLParser::parseOptionalUWTableKind(
UWTableKind &Kind) {
2567 LocTy KindLoc = Lex.getLoc();
2573 return error(KindLoc,
"expected unwind table kind");
2580 LocTy ParenLoc = Lex.getLoc();
2582 return error(ParenLoc,
"expected '('");
2583 LocTy KindLoc = Lex.getLoc();
2585 if (parseStringConstant(Arg))
2586 return error(KindLoc,
"expected allockind value");
2590 }
else if (
A ==
"realloc") {
2592 }
else if (
A ==
"free") {
2594 }
else if (
A ==
"uninitialized") {
2596 }
else if (
A ==
"zeroed") {
2598 }
else if (
A ==
"aligned") {
2601 return error(KindLoc, Twine(
"unknown allockind ") +
A);
2604 ParenLoc = Lex.getLoc();
2606 return error(ParenLoc,
"expected ')'");
2608 return error(KindLoc,
"expected allockind value");
2617 return {Loc::ArgMem};
2619 return {Loc::InaccessibleMem};
2621 return {Loc::ErrnoMem};
2623 return {Loc::TargetMem0};
2625 return {Loc::TargetMem1};
2648 return std::nullopt;
2652static std::optional<DenormalMode::DenormalModeKind>
2664 return std::nullopt;
2668std::optional<MemoryEffects> LLParser::parseMemoryAttr() {
2673 Lex.setIgnoreColonInIdentifiers(
true);
2678 tokError(
"expected '('");
2679 return std::nullopt;
2682 bool SeenLoc =
false;
2683 bool SeenTargetLoc =
false;
2686 if (!Locs.
empty()) {
2689 tokError(
"expected ':' after location");
2690 return std::nullopt;
2697 tokError(
"expected memory location (argmem, inaccessiblemem, errnomem) "
2698 "or access kind (none, read, write, readwrite)");
2700 tokError(
"expected access kind (none, read, write, readwrite)");
2701 return std::nullopt;
2705 if (!Locs.
empty()) {
2710 SeenTargetLoc =
true;
2712 if (Locs.size() > 1 && SeenTargetLoc) {
2713 tokError(
"target memory default access kind must be specified first");
2714 return std::nullopt;
2719 tokError(
"default access kind must be specified first");
2720 return std::nullopt;
2729 tokError(
"unterminated memory attribute");
2730 return std::nullopt;
2733std::optional<DenormalMode> LLParser::parseDenormalFPEnvEntry() {
2734 std::optional<DenormalMode::DenormalModeKind> OutputMode =
2737 tokError(
"expected denormal behavior kind (ieee, preservesign, "
2738 "positivezero, dynamic)");
2744 std::optional<DenormalMode::DenormalModeKind> InputMode;
2748 tokError(
"expected denormal behavior kind (ieee, preservesign, "
2749 "positivezero, dynamic)");
2756 InputMode = OutputMode;
2759 return DenormalMode(*OutputMode, *InputMode);
2762std::optional<DenormalFPEnv> LLParser::parseDenormalFPEnvAttr() {
2765 Lex.setIgnoreColonInIdentifiers(
true);
2776 bool HasDefaultSection =
false;
2778 std::optional<DenormalMode> ParsedDefaultMode = parseDenormalFPEnvEntry();
2779 if (!ParsedDefaultMode)
2781 DefaultMode = *ParsedDefaultMode;
2782 HasDefaultSection =
true;
2787 if (HasDefaultSection && !HasComma) {
2788 tokError(
"expected ',' before float:");
2793 if (parseType(Ty) || !Ty->
isFloatTy()) {
2794 tokError(
"expected float:");
2798 if (parseToken(
lltok::colon,
"expected ':' before float denormal_fpenv"))
2801 std::optional<DenormalMode> ParsedF32Mode = parseDenormalFPEnvEntry();
2805 F32Mode = *ParsedF32Mode;
2808 if (parseToken(
lltok::rparen,
"unterminated denormal_fpenv"))
2811 return DenormalFPEnv(DefaultMode, F32Mode);
2853unsigned LLParser::parseNoFPClassAttr() {
2858 tokError(
"expected '('");
2865 if (TestMask != 0) {
2869 !parseUInt64(
Value)) {
2871 error(Lex.getLoc(),
"invalid mask value for 'nofpclass'");
2876 error(Lex.getLoc(),
"expected ')'");
2882 error(Lex.getLoc(),
"expected nofpclass test mask");
2900bool LLParser::parseOptionalCommaAlign(
MaybeAlign &Alignment,
2901 bool &AteExtraComma) {
2902 AteExtraComma =
false;
2906 AteExtraComma =
true;
2910 if (Lex.getKind() != lltok::kw_align)
2911 return error(Lex.getLoc(),
"expected metadata or 'align'");
2913 if (parseOptionalAlignment(Alignment))
2926bool LLParser::parseOptionalCommaAddrSpace(
unsigned &AddrSpace, LocTy &
Loc,
2927 bool &AteExtraComma) {
2928 AteExtraComma =
false;
2932 AteExtraComma =
true;
2938 return error(Lex.getLoc(),
"expected metadata or 'addrspace'");
2940 if (parseOptionalAddrSpace(AddrSpace))
2947bool LLParser::parseAllocSizeArguments(
unsigned &BaseSizeArg,
2948 std::optional<unsigned> &HowManyArg) {
2951 auto StartParen = Lex.getLoc();
2953 return error(StartParen,
"expected '('");
2955 if (parseUInt32(BaseSizeArg))
2959 auto HowManyAt = Lex.getLoc();
2961 if (parseUInt32(HowMany))
2963 if (HowMany == BaseSizeArg)
2964 return error(HowManyAt,
2965 "'allocsize' indices can't refer to the same parameter");
2966 HowManyArg = HowMany;
2968 HowManyArg = std::nullopt;
2970 auto EndParen = Lex.getLoc();
2972 return error(EndParen,
"expected ')'");
2976bool LLParser::parseVScaleRangeArguments(
unsigned &MinValue,
2977 unsigned &MaxValue) {
2980 auto StartParen = Lex.getLoc();
2982 return error(StartParen,
"expected '('");
2984 if (parseUInt32(MinValue))
2988 if (parseUInt32(MaxValue))
2991 MaxValue = MinValue;
2993 auto EndParen = Lex.getLoc();
2995 return error(EndParen,
"expected ')'");
3004bool LLParser::parseScopeAndOrdering(
bool IsAtomic,
SyncScope::ID &SSID,
3009 return parseScope(SSID) || parseOrdering(Ordering);
3019 auto StartParenAt = Lex.getLoc();
3021 return error(StartParenAt,
"Expected '(' in syncscope");
3024 auto SSNAt = Lex.getLoc();
3025 if (parseStringConstant(SSN))
3026 return error(SSNAt,
"Expected synchronization scope name");
3028 auto EndParenAt = Lex.getLoc();
3030 return error(EndParenAt,
"Expected ')' in syncscope");
3032 SSID = Context.getOrInsertSyncScopeID(SSN);
3043 switch (Lex.getKind()) {
3045 return tokError(
"Expected ordering on atomic instruction");
3064bool LLParser::parseOptionalStackAlignment(
unsigned &Alignment) {
3066 if (!EatIfPresent(lltok::kw_alignstack))
3068 LocTy ParenLoc = Lex.getLoc();
3070 return error(ParenLoc,
"expected '('");
3071 LocTy AlignLoc = Lex.getLoc();
3072 if (parseUInt32(Alignment))
3074 ParenLoc = Lex.getLoc();
3076 return error(ParenLoc,
"expected ')'");
3078 return error(AlignLoc,
"stack alignment is not a power of two");
3092 bool &AteExtraComma) {
3093 AteExtraComma =
false;
3096 return tokError(
"expected ',' as start of index list");
3100 if (Indices.
empty())
3101 return tokError(
"expected index");
3102 AteExtraComma =
true;
3106 if (parseUInt32(Idx))
3119bool LLParser::parseType(
Type *&Result,
const Twine &Msg,
bool AllowVoid) {
3120 SMLoc TypeLoc = Lex.getLoc();
3121 switch (Lex.getKind()) {
3123 return tokError(Msg);
3132 if (
Result->isPointerTy()) {
3134 if (parseOptionalAddrSpace(AddrSpace))
3140 return tokError(
"ptr* is invalid - use ptr instead");
3151 if (parseTargetExtType(Result))
3157 if (parseAnonStructType(Result,
false))
3163 if (parseArrayVectorType(Result,
false))
3170 if (parseAnonStructType(Result,
true) ||
3171 parseToken(
lltok::greater,
"expected '>' at end of packed struct"))
3173 }
else if (parseArrayVectorType(Result,
true))
3178 std::pair<Type*, LocTy> &
Entry = NamedTypes[Lex.getStrVal()];
3184 Entry.second = Lex.getLoc();
3193 std::pair<Type*, LocTy> &
Entry = NumberedTypes[Lex.getUIntVal()];
3199 Entry.second = Lex.getLoc();
3209 switch (Lex.getKind()) {
3212 if (!AllowVoid &&
Result->isVoidTy())
3213 return error(TypeLoc,
"void type only allowed for function results");
3219 return tokError(
"basic block pointers are invalid");
3221 return tokError(
"pointers to void are invalid - use i8* instead");
3223 return tokError(
"pointer to this type is invalid");
3231 return tokError(
"basic block pointers are invalid");
3233 return tokError(
"pointers to void are invalid; use i8* instead");
3235 return tokError(
"pointer to this type is invalid");
3237 if (parseOptionalAddrSpace(AddrSpace) ||
3238 parseToken(
lltok::star,
"expected '*' in address space"))
3247 if (parseFunctionType(Result))
3260 PerFunctionState &PFS,
bool IsMustTailCall,
3261 bool InVarArgsFunc) {
3267 if (!ArgList.
empty() &&
3268 parseToken(
lltok::comma,
"expected ',' in argument list"))
3273 const char *Msg =
"unexpected ellipsis in argument list for ";
3274 if (!IsMustTailCall)
3275 return tokError(Twine(Msg) +
"non-musttail call");
3277 return tokError(Twine(Msg) +
"musttail call in non-varargs function");
3279 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3284 Type *ArgTy =
nullptr;
3286 if (parseType(ArgTy, ArgLoc))
3289 return error(ArgLoc,
"invalid type for function argument");
3291 AttrBuilder ArgAttrs(M->getContext());
3294 if (parseMetadataAsValue(V, PFS))
3298 if (parseOptionalParamAttrs(ArgAttrs) || parseValue(ArgTy, V, PFS))
3305 if (IsMustTailCall && InVarArgsFunc)
3306 return tokError(
"expected '...' at end of argument list for musttail call "
3307 "in varargs function");
3315bool LLParser::parseRequiredTypeAttr(AttrBuilder &
B,
lltok::Kind AttrToken,
3318 if (!EatIfPresent(AttrToken))
3321 return error(Lex.getLoc(),
"expected '('");
3325 return error(Lex.getLoc(),
"expected ')'");
3327 B.addTypeAttr(AttrKind, Ty);
3333bool LLParser::parseRangeAttr(AttrBuilder &
B) {
3341 auto ParseAPSInt = [&](
unsigned BitWidth, APInt &Val) {
3343 return tokError(
"expected integer");
3344 if (Lex.getAPSIntVal().getBitWidth() >
BitWidth)
3346 "integer is too large for the bit width of specified type");
3347 Val = Lex.getAPSIntVal().extend(
BitWidth);
3352 if (parseToken(
lltok::lparen,
"expected '('") || parseType(Ty, TyLoc))
3355 return error(TyLoc,
"the range must have integer type!");
3363 return tokError(
"the range represent the empty set but limits aren't 0!");
3374bool LLParser::parseInitializesAttr(AttrBuilder &
B) {
3377 auto ParseAPSInt = [&](APInt &Val) {
3379 return tokError(
"expected integer");
3380 Val = Lex.getAPSIntVal().extend(64);
3400 return tokError(
"the range should not represent the full or empty set!");
3412 if (!CRLOrNull.has_value())
3413 return tokError(
"Invalid (unordered or overlapping) range list");
3414 B.addInitializesAttr(*CRLOrNull);
3418bool LLParser::parseCapturesAttr(AttrBuilder &
B) {
3420 std::optional<CaptureComponents> Ret;
3424 Lex.setIgnoreColonInIdentifiers(
true);
3432 bool SeenComponent =
false;
3438 return tokError(
"duplicate 'ret' location");
3441 SeenComponent =
false;
3446 return tokError(
"cannot use 'none' with other component");
3450 return tokError(
"cannot use 'none' with other component");
3461 return tokError(
"expected one of 'none', 'address', 'address_is_null', "
3462 "'provenance' or 'read_provenance'");
3465 SeenComponent =
true;
3473 B.addCapturesAttr(CaptureInfo(
Other, Ret.value_or(
Other)));
3486bool LLParser::parseOptionalOperandBundles(
3488 LocTy BeginLoc = Lex.getLoc();
3494 if (!BundleList.
empty() &&
3495 parseToken(
lltok::comma,
"expected ',' in input list"))
3499 if (parseStringConstant(
Tag))
3502 if (parseToken(
lltok::lparen,
"expected '(' in operand bundle"))
3505 std::vector<Value *> Inputs;
3508 if (!Inputs.empty() &&
3509 parseToken(
lltok::comma,
"expected ',' in input list"))
3513 Value *Input =
nullptr;
3517 if (parseMetadataAsValue(Input, PFS))
3519 }
else if (parseValue(Ty, Input, PFS)) {
3522 Inputs.push_back(Input);
3530 if (BundleList.
empty())
3531 return error(BeginLoc,
"operand bundle set must not be empty");
3538 unsigned NextID,
unsigned ID) {
3540 return error(Loc, Kind +
" expected to be numbered '" + Prefix +
3541 Twine(NextID) +
"' or greater");
3558 unsigned CurValID = 0;
3572 LocTy TypeLoc = Lex.getLoc();
3573 Type *ArgTy =
nullptr;
3574 AttrBuilder
Attrs(M->getContext());
3575 if (parseType(ArgTy) || parseOptionalParamAttrs(Attrs))
3579 return error(TypeLoc,
"argument can not have void type");
3584 bool Unnamed =
false;
3586 Name = Lex.getStrVal();
3587 IdentStart = getTokLineColumnPos();
3589 IdentEnd = getPrevTokEndLineColumnPos();
3593 ArgID = Lex.getUIntVal();
3594 IdentStart = getTokLineColumnPos();
3595 if (checkValueID(TypeLoc,
"argument",
"%", CurValID, ArgID))
3598 IdentEnd = getPrevTokEndLineColumnPos();
3604 CurValID = ArgID + 1;
3608 return error(TypeLoc,
"invalid type for function argument");
3612 Unnamed ? std::nullopt
3613 : std::make_optional(FileLocRange(IdentStart, IdentEnd)),
3618 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3623bool LLParser::parseFunctionType(
Type *&Result) {
3627 return tokError(
"invalid function return type");
3631 SmallVector<unsigned> UnnamedArgNums;
3632 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg))
3636 for (
const ArgInfo &Arg : ArgList) {
3637 if (!Arg.Name.empty())
3638 return error(Arg.Loc,
"argument name invalid in function type");
3639 if (Arg.Attrs.hasAttributes())
3640 return error(Arg.Loc,
"argument attributes invalid in function type");
3644 for (
const ArgInfo &Arg : ArgList)
3653bool LLParser::parseAnonStructType(
Type *&Result,
bool Packed) {
3655 if (parseStructBody(Elts))
3663bool LLParser::parseStructDefinition(
SMLoc TypeLoc,
StringRef Name,
3664 std::pair<Type *, LocTy> &Entry,
3668 return error(TypeLoc,
"redefinition of type");
3674 Entry.second = SMLoc();
3679 ResultTy =
Entry.first;
3691 return error(TypeLoc,
"forward references to non-struct type");
3695 return parseArrayVectorType(ResultTy,
true);
3696 return parseType(ResultTy);
3700 Entry.second = SMLoc();
3709 if (parseStructBody(Body) ||
3710 (isPacked && parseToken(
lltok::greater,
"expected '>' in packed struct")))
3714 return tokError(
toString(std::move(
E)));
3734 LocTy EltTyLoc = Lex.getLoc();
3741 return error(EltTyLoc,
"invalid element type for struct");
3744 EltTyLoc = Lex.getLoc();
3749 return error(EltTyLoc,
"invalid element type for struct");
3754 return parseToken(
lltok::rbrace,
"expected '}' at end of struct");
3763bool LLParser::parseArrayVectorType(
Type *&Result,
bool IsVector) {
3764 bool Scalable =
false;
3768 if (parseToken(
lltok::kw_x,
"expected 'x' after vscale"))
3774 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned() ||
3775 Lex.getAPSIntVal().getBitWidth() > 64)
3776 return tokError(
"expected number in address space");
3778 LocTy SizeLoc = Lex.getLoc();
3779 uint64_t
Size = Lex.getAPSIntVal().getZExtValue();
3782 if (parseToken(
lltok::kw_x,
"expected 'x' after element count"))
3785 LocTy TypeLoc = Lex.getLoc();
3786 Type *EltTy =
nullptr;
3787 if (parseType(EltTy))
3791 "expected end of sequential type"))
3796 return error(SizeLoc,
"zero element vector is illegal");
3798 return error(SizeLoc,
"size too large for vector");
3800 return error(TypeLoc,
"invalid vector element type");
3804 return error(TypeLoc,
"invalid array element type");
3821bool LLParser::parseTargetExtType(
Type *&Result) {
3826 if (parseToken(
lltok::lparen,
"expected '(' in target extension type") ||
3827 parseStringConstant(TypeName))
3834 SmallVector<unsigned> IntParams;
3835 bool SeenInt =
false;
3842 if (parseUInt32(IntVal))
3845 }
else if (SeenInt) {
3848 return tokError(
"expected uint32 param");
3851 if (parseType(TypeParam,
true))
3857 if (parseToken(
lltok::rparen,
"expected ')' in target extension type"))
3862 if (
auto E = TTy.takeError())
3863 return tokError(
toString(std::move(
E)));
3876 :
P(
p),
F(
f), FunctionNumber(functionNumber) {
3879 auto It = UnnamedArgNums.
begin();
3882 unsigned ArgNum = *It++;
3883 NumberedVals.add(ArgNum, &A);
3888LLParser::PerFunctionState::~PerFunctionState() {
3891 for (
const auto &P : ForwardRefVals) {
3894 P.second.first->replaceAllUsesWith(
3896 P.second.first->deleteValue();
3899 for (
const auto &P : ForwardRefValIDs) {
3902 P.second.first->replaceAllUsesWith(
3904 P.second.first->deleteValue();
3908bool LLParser::PerFunctionState::finishFunction() {
3909 if (!ForwardRefVals.empty())
3910 return P.error(ForwardRefVals.begin()->second.second,
3911 "use of undefined value '%" + ForwardRefVals.begin()->first +
3913 if (!ForwardRefValIDs.empty())
3914 return P.error(ForwardRefValIDs.begin()->second.second,
3915 "use of undefined value '%" +
3916 Twine(ForwardRefValIDs.begin()->first) +
"'");
3923Value *LLParser::PerFunctionState::getVal(
const std::string &Name,
Type *Ty,
3926 Value *Val =
F.getValueSymbolTable()->lookup(Name);
3931 auto I = ForwardRefVals.find(Name);
3932 if (
I != ForwardRefVals.end())
3933 Val =
I->second.first;
3938 return P.checkValidVariableType(Loc,
"%" + Name, Ty, Val);
3942 P.error(Loc,
"invalid use of a non-first-class type");
3953 if (FwdVal->
getName() != Name) {
3954 P.error(Loc,
"name is too long which can result in name collisions, "
3955 "consider making the name shorter or "
3956 "increasing -non-global-value-max-name-size");
3960 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
3964Value *LLParser::PerFunctionState::getVal(
unsigned ID,
Type *Ty,
LocTy Loc) {
3966 Value *Val = NumberedVals.get(
ID);
3971 auto I = ForwardRefValIDs.find(
ID);
3972 if (
I != ForwardRefValIDs.end())
3973 Val =
I->second.first;
3978 return P.checkValidVariableType(Loc,
"%" + Twine(
ID), Ty, Val);
3981 P.error(Loc,
"invalid use of a non-first-class type");
3993 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
3999bool LLParser::PerFunctionState::setInstName(
int NameID,
4000 const std::string &NameStr,
4001 LocTy NameLoc, Instruction *Inst) {
4004 if (NameID != -1 || !NameStr.empty())
4005 return P.error(NameLoc,
"instructions returning void cannot have a name");
4011 if (NameStr.empty()) {
4014 NameID = NumberedVals.getNext();
4016 if (
P.checkValueID(NameLoc,
"instruction",
"%", NumberedVals.getNext(),
4020 auto FI = ForwardRefValIDs.find(NameID);
4021 if (FI != ForwardRefValIDs.end()) {
4024 return P.error(NameLoc,
"instruction forward referenced with type '" +
4028 Sentinel->replaceAllUsesWith(Inst);
4030 ForwardRefValIDs.erase(FI);
4033 NumberedVals.add(NameID, Inst);
4038 auto FI = ForwardRefVals.find(NameStr);
4039 if (FI != ForwardRefVals.end()) {
4042 return P.error(NameLoc,
"instruction forward referenced with type '" +
4046 Sentinel->replaceAllUsesWith(Inst);
4048 ForwardRefVals.erase(FI);
4054 if (Inst->
getName() != NameStr)
4055 return P.error(NameLoc,
"multiple definition of local value named '" +
4062BasicBlock *LLParser::PerFunctionState::getBB(
const std::string &Name,
4076BasicBlock *LLParser::PerFunctionState::defineBB(
const std::string &Name,
4077 int NameID,
LocTy Loc) {
4081 if (
P.checkValueID(Loc,
"label",
"", NumberedVals.getNext(), NameID))
4084 NameID = NumberedVals.getNext();
4086 BB = getBB(NameID, Loc);
4088 P.error(Loc,
"unable to create block numbered '" + Twine(NameID) +
"'");
4092 BB = getBB(Name, Loc);
4094 P.error(Loc,
"unable to create block named '" + Name +
"'");
4105 ForwardRefValIDs.erase(NameID);
4106 NumberedVals.add(NameID, BB);
4109 ForwardRefVals.erase(Name);
4126bool LLParser::parseValID(ValID &
ID, PerFunctionState *PFS,
Type *ExpectedTy) {
4127 ID.Loc = Lex.getLoc();
4128 switch (Lex.getKind()) {
4130 return tokError(
"expected value token");
4132 ID.UIntVal = Lex.getUIntVal();
4136 ID.StrVal = Lex.getStrVal();
4140 ID.UIntVal = Lex.getUIntVal();
4144 ID.StrVal = Lex.getStrVal();
4148 ID.APSIntVal = Lex.getAPSIntVal();
4152 ID.APFloatVal = Lex.getAPFloatVal();
4173 if (parseGlobalValueVector(Elts) ||
4174 parseToken(
lltok::rbrace,
"expected end of struct constant"))
4177 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4178 ID.UIntVal = Elts.
size();
4179 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4180 Elts.
size() *
sizeof(Elts[0]));
4191 LocTy FirstEltLoc = Lex.getLoc();
4192 if (parseGlobalValueVector(Elts) ||
4194 parseToken(
lltok::rbrace,
"expected end of packed struct")) ||
4198 if (isPackedStruct) {
4199 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4200 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4201 Elts.
size() *
sizeof(Elts[0]));
4202 ID.UIntVal = Elts.
size();
4208 return error(
ID.Loc,
"constant vector must not be empty");
4210 if (!Elts[0]->
getType()->isIntegerTy() && !Elts[0]->
getType()->isByteTy() &&
4211 !Elts[0]->
getType()->isFloatingPointTy() &&
4215 "vector elements must have integer, byte, pointer or floating point "
4219 for (
unsigned i = 1, e = Elts.
size(); i != e; ++i)
4221 return error(FirstEltLoc,
"vector element #" + Twine(i) +
4222 " is not of type '" +
4232 LocTy FirstEltLoc = Lex.getLoc();
4233 if (parseGlobalValueVector(Elts) ||
4245 if (!Elts[0]->
getType()->isFirstClassType())
4246 return error(FirstEltLoc,
"invalid array element type: " +
4252 for (
unsigned i = 0, e = Elts.
size(); i != e; ++i) {
4254 return error(FirstEltLoc,
"array element #" + Twine(i) +
4255 " is not of type '" +
4267 Context, Lex.getStrVal(),
false, ATy->getElementType()->isByteTy());
4276 bool HasSideEffect, AlignStack, AsmDialect, CanThrow;
4279 parseOptionalToken(lltok::kw_alignstack, AlignStack) ||
4282 parseStringConstant(
ID.StrVal) ||
4283 parseToken(
lltok::comma,
"expected comma in inline asm expression") ||
4286 ID.StrVal2 = Lex.getStrVal();
4287 ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack) << 1) |
4288 (
unsigned(AsmDialect) << 2) | (unsigned(CanThrow) << 3);
4299 if (parseToken(
lltok::lparen,
"expected '(' in block address expression") ||
4300 parseValID(Fn, PFS) ||
4302 "expected comma in block address expression") ||
4303 parseValID(Label, PFS) ||
4304 parseToken(
lltok::rparen,
"expected ')' in block address expression"))
4308 return error(Fn.
Loc,
"expected function name in blockaddress");
4310 return error(
Label.Loc,
"expected basic block name in blockaddress");
4313 GlobalValue *GV =
nullptr;
4315 GV = NumberedVals.get(Fn.
UIntVal);
4316 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4317 GV = M->getNamedValue(Fn.
StrVal);
4323 return error(Fn.
Loc,
"expected function name in blockaddress");
4325 if (
F->isDeclaration())
4326 return error(Fn.
Loc,
"cannot take blockaddress inside a declaration");
4331 GlobalValue *&FwdRef =
4332 ForwardRefBlockAddresses[std::move(Fn)][std::move(Label)];
4340 "type of blockaddress must be a pointer and not '" +
4345 FwdDeclAS = PFS->getFunction().getAddressSpace();
4349 FwdRef =
new GlobalVariable(
4354 ID.ConstantVal = FwdRef;
4362 if (BlockAddressPFS &&
F == &BlockAddressPFS->getFunction()) {
4364 BB = BlockAddressPFS->getBB(
Label.UIntVal,
Label.Loc);
4366 BB = BlockAddressPFS->getBB(
Label.StrVal,
Label.Loc);
4368 return error(
Label.Loc,
"referenced value is not a basic block");
4371 return error(
Label.Loc,
"cannot take address of numeric label after "
4372 "the function is defined");
4374 F->getValueSymbolTable()->lookup(
Label.StrVal));
4376 return error(
Label.Loc,
"referenced value is not a basic block");
4390 if (parseValID(Fn, PFS))
4395 "expected global value name in dso_local_equivalent");
4398 GlobalValue *GV =
nullptr;
4400 GV = NumberedVals.get(Fn.
UIntVal);
4401 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4402 GV = M->getNamedValue(Fn.
StrVal);
4408 ? ForwardRefDSOLocalEquivalentIDs
4409 : ForwardRefDSOLocalEquivalentNames;
4410 GlobalValue *&FwdRef = FwdRefMap[Fn];
4417 ID.ConstantVal = FwdRef;
4423 return error(Fn.
Loc,
"expected a function, alias to function, or ifunc "
4424 "in dso_local_equivalent");
4435 if (parseValID(
ID, PFS))
4439 return error(
ID.Loc,
"expected global value name in no_cfi");
4451 Constant *Disc =
nullptr, *AddrDisc =
nullptr,
4452 *DeactivationSymbol =
nullptr;
4455 "expected '(' in constant ptrauth expression") ||
4456 parseGlobalTypeAndValue(Ptr) ||
4458 "expected comma in constant ptrauth expression") ||
4459 parseGlobalTypeAndValue(
Key))
4462 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(Disc))
4464 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(AddrDisc))
4467 parseGlobalTypeAndValue(DeactivationSymbol))
4470 "expected ')' in constant ptrauth expression"))
4474 return error(
ID.Loc,
"constant ptrauth base pointer must be a pointer");
4477 if (!KeyC || KeyC->getBitWidth() != 32)
4478 return error(
ID.Loc,
"constant ptrauth key must be i32 constant");
4480 ConstantInt *DiscC =
nullptr;
4486 "constant ptrauth integer discriminator must be i64 constant");
4492 if (!AddrDisc->getType()->isPointerTy())
4494 ID.Loc,
"constant ptrauth address discriminator must be a pointer");
4499 if (!DeactivationSymbol)
4500 DeactivationSymbol =
4502 if (!DeactivationSymbol->getType()->isPointerTy())
4504 "constant ptrauth deactivation symbol must be a pointer");
4518 unsigned Opc = Lex.getUIntVal();
4519 Type *DestTy =
nullptr;
4522 if (parseToken(
lltok::lparen,
"expected '(' after constantexpr cast") ||
4523 parseGlobalTypeAndValue(SrcVal) ||
4524 parseToken(
lltok::kw_to,
"expected 'to' in constantexpr cast") ||
4525 parseType(DestTy) ||
4526 parseToken(
lltok::rparen,
"expected ')' at end of constantexpr cast"))
4529 return error(
ID.Loc,
"invalid cast opcode for cast from '" +
4538 return error(
ID.Loc,
"extractvalue constexprs are no longer supported");
4540 return error(
ID.Loc,
"insertvalue constexprs are no longer supported");
4542 return error(
ID.Loc,
"udiv constexprs are no longer supported");
4544 return error(
ID.Loc,
"sdiv constexprs are no longer supported");
4546 return error(
ID.Loc,
"urem constexprs are no longer supported");
4548 return error(
ID.Loc,
"srem constexprs are no longer supported");
4550 return error(
ID.Loc,
"fadd constexprs are no longer supported");
4552 return error(
ID.Loc,
"fsub constexprs are no longer supported");
4554 return error(
ID.Loc,
"fmul constexprs are no longer supported");
4556 return error(
ID.Loc,
"fdiv constexprs are no longer supported");
4558 return error(
ID.Loc,
"frem constexprs are no longer supported");
4560 return error(
ID.Loc,
"and constexprs are no longer supported");
4562 return error(
ID.Loc,
"or constexprs are no longer supported");
4564 return error(
ID.Loc,
"lshr constexprs are no longer supported");
4566 return error(
ID.Loc,
"ashr constexprs are no longer supported");
4568 return error(
ID.Loc,
"shl constexprs are no longer supported");
4570 return error(
ID.Loc,
"mul constexprs are no longer supported");
4572 return error(
ID.Loc,
"fneg constexprs are no longer supported");
4574 return error(
ID.Loc,
"select constexprs are no longer supported");
4576 return error(
ID.Loc,
"zext constexprs are no longer supported");
4578 return error(
ID.Loc,
"sext constexprs are no longer supported");
4580 return error(
ID.Loc,
"fptrunc constexprs are no longer supported");
4582 return error(
ID.Loc,
"fpext constexprs are no longer supported");
4584 return error(
ID.Loc,
"uitofp constexprs are no longer supported");
4586 return error(
ID.Loc,
"sitofp constexprs are no longer supported");
4588 return error(
ID.Loc,
"fptoui constexprs are no longer supported");
4590 return error(
ID.Loc,
"fptosi constexprs are no longer supported");
4592 return error(
ID.Loc,
"icmp constexprs are no longer supported");
4594 return error(
ID.Loc,
"fcmp constexprs are no longer supported");
4602 unsigned Opc = Lex.getUIntVal();
4605 if (
Opc == Instruction::Add ||
Opc == Instruction::Sub ||
4606 Opc == Instruction::Mul) {
4615 if (parseToken(
lltok::lparen,
"expected '(' in binary constantexpr") ||
4616 parseGlobalTypeAndValue(Val0) ||
4617 parseToken(
lltok::comma,
"expected comma in binary constantexpr") ||
4618 parseGlobalTypeAndValue(Val1) ||
4619 parseToken(
lltok::rparen,
"expected ')' in binary constantexpr"))
4622 return error(
ID.Loc,
"operands of constexpr must have same type");
4626 "constexpr requires integer or integer vector operands");
4637 if (parseToken(
lltok::lparen,
"expected '(' after vector splat"))
4640 if (parseGlobalTypeAndValue(
C))
4642 if (parseToken(
lltok::rparen,
"expected ')' at end of vector splat"))
4654 unsigned Opc = Lex.getUIntVal();
4657 bool HasInRange =
false;
4663 if (
Opc == Instruction::GetElementPtr) {
4679 return tokError(
"expected integer");
4680 InRangeStart = Lex.getAPSIntVal();
4685 return tokError(
"expected integer");
4686 InRangeEnd = Lex.getAPSIntVal();
4694 if (parseToken(
lltok::lparen,
"expected '(' in constantexpr"))
4697 if (
Opc == Instruction::GetElementPtr) {
4698 if (parseType(Ty) ||
4699 parseToken(
lltok::comma,
"expected comma after getelementptr's type"))
4703 if (parseGlobalValueVector(Elts) ||
4707 if (
Opc == Instruction::GetElementPtr) {
4708 if (Elts.
size() == 0 ||
4709 !Elts[0]->getType()->isPtrOrPtrVectorTy())
4710 return error(
ID.Loc,
"base of getelementptr must be a pointer");
4713 std::optional<ConstantRange>
InRange;
4715 unsigned IndexWidth =
4716 M->getDataLayout().getIndexTypeSizeInBits(
BaseType);
4717 InRangeStart = InRangeStart.
extOrTrunc(IndexWidth);
4718 InRangeEnd = InRangeEnd.
extOrTrunc(IndexWidth);
4719 if (InRangeStart.
sge(InRangeEnd))
4720 return error(
ID.Loc,
"expected end to be larger than start");
4730 for (Constant *Val : Indices) {
4733 return error(
ID.Loc,
"getelementptr index must be an integer");
4736 if (GEPWidth && (ValNumEl != GEPWidth))
4739 "getelementptr vector index has a wrong number of elements");
4742 GEPWidth = ValNumEl;
4746 SmallPtrSet<Type*, 4> Visited;
4747 if (!Indices.empty() && !Ty->
isSized(&Visited))
4748 return error(
ID.Loc,
"base element of getelementptr must be sized");
4751 return error(
ID.Loc,
"invalid base element for constant getelementptr");
4754 return error(
ID.Loc,
"invalid getelementptr indices");
4758 }
else if (
Opc == Instruction::ShuffleVector) {
4759 if (Elts.
size() != 3)
4760 return error(
ID.Loc,
"expected three operands to shufflevector");
4762 return error(
ID.Loc,
"invalid operands to shufflevector");
4763 SmallVector<int, 16>
Mask;
4766 }
else if (
Opc == Instruction::ExtractElement) {
4767 if (Elts.
size() != 2)
4768 return error(
ID.Loc,
"expected two operands to extractelement");
4770 return error(
ID.Loc,
"invalid extractelement operands");
4773 assert(
Opc == Instruction::InsertElement &&
"Unknown opcode");
4774 if (Elts.
size() != 3)
4775 return error(
ID.Loc,
"expected three operands to insertelement");
4777 return error(
ID.Loc,
"invalid insertelement operands");
4792bool LLParser::parseGlobalValue(
Type *Ty, Constant *&
C) {
4796 bool Parsed = parseValID(
ID,
nullptr, Ty) ||
4797 convertValIDToValue(Ty,
ID, V,
nullptr);
4799 return error(
ID.Loc,
"global values must be constants");
4803bool LLParser::parseGlobalTypeAndValue(Constant *&V) {
4805 return parseType(Ty) || parseGlobalValue(Ty, V);
4808bool LLParser::parseOptionalComdat(StringRef GlobalName, Comdat *&
C) {
4811 LocTy KwLoc = Lex.getLoc();
4817 return tokError(
"expected comdat variable");
4818 C = getComdat(Lex.getStrVal(), Lex.getLoc());
4820 if (parseToken(
lltok::rparen,
"expected ')' after comdat var"))
4823 if (GlobalName.
empty())
4824 return tokError(
"comdat cannot be unnamed");
4825 C = getComdat(std::string(GlobalName), KwLoc);
4834bool LLParser::parseGlobalValueVector(SmallVectorImpl<Constant *> &Elts) {
4848 if (parseGlobalTypeAndValue(
C))
4856bool LLParser::parseMDTuple(MDNode *&MD,
bool IsDistinct) {
4858 if (parseMDNodeVector(Elts))
4869bool LLParser::parseMDNode(MDNode *&
N) {
4871 return parseSpecializedMDNode(
N);
4873 return parseToken(
lltok::exclaim,
"expected '!' here") || parseMDNodeTail(
N);
4876bool LLParser::parseMDNodeTail(MDNode *&
N) {
4879 return parseMDTuple(
N);
4882 return parseMDNodeID(
N);
4888template <
class FieldTy>
struct MDFieldImpl {
4889 typedef MDFieldImpl ImplTy;
4893 void assign(FieldTy Val) {
4895 this->Val = std::move(Val);
4898 explicit MDFieldImpl(FieldTy
Default)
4906template <
class FieldTypeA,
class FieldTypeB>
struct MDEitherFieldImpl {
4907 typedef MDEitherFieldImpl<FieldTypeA, FieldTypeB> ImplTy;
4918 void assign(FieldTypeA
A) {
4920 this->
A = std::move(
A);
4924 void assign(FieldTypeB
B) {
4926 this->
B = std::move(
B);
4930 explicit MDEitherFieldImpl(FieldTypeA DefaultA, FieldTypeB DefaultB)
4932 WhatIs(IsInvalid) {}
4935struct MDUnsignedField :
public MDFieldImpl<uint64_t> {
4942struct LineField :
public MDUnsignedField {
4943 LineField() : MDUnsignedField(0, UINT32_MAX) {}
4946struct ColumnField :
public MDUnsignedField {
4947 ColumnField() : MDUnsignedField(0, UINT16_MAX) {}
4950struct DwarfTagField :
public MDUnsignedField {
4956struct DwarfMacinfoTypeField :
public MDUnsignedField {
4962struct DwarfAttEncodingField :
public MDUnsignedField {
4963 DwarfAttEncodingField() : MDUnsignedField(0, dwarf::
DW_ATE_hi_user) {}
4966struct DwarfVirtualityField :
public MDUnsignedField {
4970struct DwarfLangField :
public MDUnsignedField {
4974struct DwarfSourceLangNameField :
public MDUnsignedField {
4975 DwarfSourceLangNameField() : MDUnsignedField(0, UINT32_MAX) {}
4978struct DwarfCCField :
public MDUnsignedField {
4979 DwarfCCField() : MDUnsignedField(0, dwarf::
DW_CC_hi_user) {}
4982struct DwarfEnumKindField :
public MDUnsignedField {
4983 DwarfEnumKindField()
4988struct EmissionKindField :
public MDUnsignedField {
4989 EmissionKindField() : MDUnsignedField(0, DICompileUnit::LastEmissionKind) {}
4992struct FixedPointKindField :
public MDUnsignedField {
4993 FixedPointKindField()
4994 : MDUnsignedField(0, DIFixedPointType::LastFixedPointKind) {}
4997struct NameTableKindField :
public MDUnsignedField {
4998 NameTableKindField()
5001 DICompileUnit::DebugNameTableKind::LastDebugNameTableKind) {}
5004struct DIFlagField :
public MDFieldImpl<DINode::DIFlags> {
5005 DIFlagField() : MDFieldImpl(DINode::FlagZero) {}
5008struct DISPFlagField :
public MDFieldImpl<DISubprogram::DISPFlags> {
5009 DISPFlagField() : MDFieldImpl(DISubprogram::SPFlagZero) {}
5012struct MDAPSIntField :
public MDFieldImpl<APSInt> {
5013 MDAPSIntField() : ImplTy(
APSInt()) {}
5016struct MDSignedField :
public MDFieldImpl<int64_t> {
5020 MDSignedField(int64_t
Default = 0)
5022 MDSignedField(int64_t
Default, int64_t Min, int64_t Max)
5026struct MDBoolField :
public MDFieldImpl<bool> {
5030struct MDField :
public MDFieldImpl<Metadata *> {
5033 MDField(
bool AllowNull =
true) : ImplTy(nullptr), AllowNull(AllowNull) {}
5036struct MDStringField :
public MDFieldImpl<MDString *> {
5037 enum class EmptyIs {
5042 MDStringField(
enum EmptyIs EmptyIs = EmptyIs::Null)
5043 : ImplTy(nullptr), EmptyIs(EmptyIs) {}
5046struct MDFieldList :
public MDFieldImpl<SmallVector<Metadata *, 4>> {
5050struct ChecksumKindField :
public MDFieldImpl<DIFile::ChecksumKind> {
5054struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
5055 MDSignedOrMDField(int64_t
Default = 0,
bool AllowNull =
true)
5056 : ImplTy(MDSignedField(
Default), MDField(AllowNull)) {}
5058 MDSignedOrMDField(int64_t
Default, int64_t Min, int64_t Max,
5059 bool AllowNull =
true)
5060 : ImplTy(MDSignedField(
Default, Min,
Max), MDField(AllowNull)) {}
5062 bool isMDSignedField()
const {
return WhatIs == IsTypeA; }
5063 bool isMDField()
const {
return WhatIs == IsTypeB; }
5064 int64_t getMDSignedValue()
const {
5065 assert(isMDSignedField() &&
"Wrong field type");
5068 Metadata *getMDFieldValue()
const {
5069 assert(isMDField() &&
"Wrong field type");
5074struct MDUnsignedOrMDField : MDEitherFieldImpl<MDUnsignedField, MDField> {
5075 MDUnsignedOrMDField(uint64_t
Default = 0,
bool AllowNull =
true)
5076 : ImplTy(MDUnsignedField(
Default), MDField(AllowNull)) {}
5078 MDUnsignedOrMDField(uint64_t
Default, uint64_t Max,
bool AllowNull =
true)
5079 : ImplTy(MDUnsignedField(
Default,
Max), MDField(AllowNull)) {}
5081 bool isMDUnsignedField()
const {
return WhatIs == IsTypeA; }
5082 bool isMDField()
const {
return WhatIs == IsTypeB; }
5083 uint64_t getMDUnsignedValue()
const {
5084 assert(isMDUnsignedField() &&
"Wrong field type");
5087 Metadata *getMDFieldValue()
const {
5088 assert(isMDField() &&
"Wrong field type");
5093 if (isMDUnsignedField())
5095 ConstantInt::get(Type::getInt64Ty(
Context), getMDUnsignedValue()));
5097 return getMDFieldValue();
5109 return tokError(
"expected integer");
5111 Result.assign(Lex.getAPSIntVal());
5118 MDUnsignedField &Result) {
5119 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
5120 return tokError(
"expected unsigned integer");
5122 auto &U = Lex.getAPSIntVal();
5123 if (U.ugt(Result.Max))
5124 return tokError(
"value for '" + Name +
"' too large, limit is " +
5126 Result.assign(U.getZExtValue());
5127 assert(Result.Val <= Result.Max &&
"Expected value in range");
5134 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5138 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5144 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5147 return tokError(
"expected DWARF tag");
5151 return tokError(
"invalid DWARF tag" +
Twine(
" '") + Lex.getStrVal() +
"'");
5152 assert(
Tag <= Result.Max &&
"Expected valid DWARF tag");
5161 DwarfMacinfoTypeField &Result) {
5163 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5166 return tokError(
"expected DWARF macinfo type");
5170 return tokError(
"invalid DWARF macinfo type" +
Twine(
" '") +
5171 Lex.getStrVal() +
"'");
5172 assert(Macinfo <= Result.Max &&
"Expected valid DWARF macinfo type");
5174 Result.assign(Macinfo);
5181 DwarfVirtualityField &Result) {
5183 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5186 return tokError(
"expected DWARF virtuality code");
5190 return tokError(
"invalid DWARF virtuality code" +
Twine(
" '") +
5191 Lex.getStrVal() +
"'");
5192 assert(Virtuality <= Result.Max &&
"Expected valid DWARF virtuality code");
5193 Result.assign(Virtuality);
5200 DwarfEnumKindField &Result) {
5202 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5205 return tokError(
"expected DWARF enum kind code");
5209 return tokError(
"invalid DWARF enum kind code" +
Twine(
" '") +
5210 Lex.getStrVal() +
"'");
5211 assert(EnumKind <= Result.Max &&
"Expected valid DWARF enum kind code");
5212 Result.assign(EnumKind);
5220 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5223 return tokError(
"expected DWARF language");
5227 return tokError(
"invalid DWARF language" +
Twine(
" '") + Lex.getStrVal() +
5229 assert(Lang <= Result.Max &&
"Expected valid DWARF language");
5230 Result.assign(Lang);
5237 DwarfSourceLangNameField &Result) {
5239 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5242 return tokError(
"expected DWARF source language name");
5246 return tokError(
"invalid DWARF source language name" +
Twine(
" '") +
5247 Lex.getStrVal() +
"'");
5248 assert(Lang <= Result.Max &&
"Expected valid DWARF source language name");
5249 Result.assign(Lang);
5257 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5260 return tokError(
"expected DWARF calling convention");
5264 return tokError(
"invalid DWARF calling convention" +
Twine(
" '") +
5265 Lex.getStrVal() +
"'");
5266 assert(CC <= Result.Max &&
"Expected valid DWARF calling convention");
5274 EmissionKindField &Result) {
5276 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5279 return tokError(
"expected emission kind");
5283 return tokError(
"invalid emission kind" +
Twine(
" '") + Lex.getStrVal() +
5285 assert(*Kind <= Result.Max &&
"Expected valid emission kind");
5286 Result.assign(*Kind);
5293 FixedPointKindField &Result) {
5295 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5298 return tokError(
"expected fixed-point kind");
5302 return tokError(
"invalid fixed-point kind" +
Twine(
" '") + Lex.getStrVal() +
5304 assert(*Kind <= Result.Max &&
"Expected valid fixed-point kind");
5305 Result.assign(*Kind);
5312 NameTableKindField &Result) {
5314 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5317 return tokError(
"expected nameTable kind");
5321 return tokError(
"invalid nameTable kind" +
Twine(
" '") + Lex.getStrVal() +
5323 assert(((
unsigned)*Kind) <= Result.Max &&
"Expected valid nameTable kind");
5324 Result.assign((
unsigned)*Kind);
5331 DwarfAttEncodingField &Result) {
5333 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5336 return tokError(
"expected DWARF type attribute encoding");
5340 return tokError(
"invalid DWARF type attribute encoding" +
Twine(
" '") +
5341 Lex.getStrVal() +
"'");
5342 assert(Encoding <= Result.Max &&
"Expected valid DWARF language");
5343 Result.assign(Encoding);
5357 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5359 bool Res = parseUInt32(TempVal);
5365 return tokError(
"expected debug info flag");
5369 return tokError(
Twine(
"invalid debug info flag '") + Lex.getStrVal() +
5384 Result.assign(Combined);
5397 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5399 bool Res = parseUInt32(TempVal);
5405 return tokError(
"expected debug info flag");
5409 return tokError(
Twine(
"invalid subprogram debug info flag '") +
5410 Lex.getStrVal() +
"'");
5424 Result.assign(Combined);
5431 return tokError(
"expected signed integer");
5433 auto &S = Lex.getAPSIntVal();
5435 return tokError(
"value for '" + Name +
"' too small, limit is " +
5438 return tokError(
"value for '" + Name +
"' too large, limit is " +
5440 Result.assign(S.getExtValue());
5441 assert(Result.Val >= Result.Min &&
"Expected value in range");
5442 assert(Result.Val <= Result.Max &&
"Expected value in range");
5449 switch (Lex.getKind()) {
5451 return tokError(
"expected 'true' or 'false'");
5453 Result.assign(
true);
5456 Result.assign(
false);
5466 if (!Result.AllowNull)
5467 return tokError(
"'" + Name +
"' cannot be null");
5469 Result.assign(
nullptr);
5474 if (parseMetadata(MD,
nullptr))
5483 MDSignedOrMDField &Result) {
5486 MDSignedField Res = Result.A;
5487 if (!parseMDField(
Loc, Name, Res)) {
5495 MDField Res = Result.B;
5496 if (!parseMDField(
Loc, Name, Res)) {
5506 MDUnsignedOrMDField &Result) {
5509 MDUnsignedField Res = Result.A;
5510 if (!parseMDField(
Loc, Name, Res)) {
5518 MDField Res = Result.B;
5519 if (!parseMDField(
Loc, Name, Res)) {
5529 LocTy ValueLoc = Lex.getLoc();
5531 if (parseStringConstant(S))
5535 switch (Result.EmptyIs) {
5536 case MDStringField::EmptyIs::Null:
5537 Result.assign(
nullptr);
5539 case MDStringField::EmptyIs::Empty:
5541 case MDStringField::EmptyIs::Error:
5542 return error(ValueLoc,
"'" + Name +
"' cannot be empty");
5553 if (parseMDNodeVector(MDs))
5556 Result.assign(std::move(MDs));
5562 ChecksumKindField &Result) {
5563 std::optional<DIFile::ChecksumKind> CSKind =
5567 return tokError(
"invalid checksum kind" +
Twine(
" '") + Lex.getStrVal() +
5570 Result.assign(*CSKind);
5577template <
class ParserTy>
5578bool LLParser::parseMDFieldsImplBody(ParserTy ParseField) {
5581 return tokError(
"expected field label here");
5590template <
class ParserTy>
5591bool LLParser::parseMDFieldsImpl(ParserTy ParseField, LocTy &ClosingLoc) {
5598 if (parseMDFieldsImplBody(ParseField))
5601 ClosingLoc = Lex.getLoc();
5605template <
class FieldTy>
5606bool LLParser::parseMDField(
StringRef Name, FieldTy &Result) {
5608 return tokError(
"field '" + Name +
"' cannot be specified more than once");
5610 LocTy Loc = Lex.getLoc();
5612 return parseMDField(Loc, Name, Result);
5615bool LLParser::parseSpecializedMDNode(
MDNode *&
N,
bool IsDistinct) {
5618#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
5619 if (Lex.getStrVal() == #CLASS) \
5620 return parse##CLASS(N, IsDistinct);
5621#include "llvm/IR/Metadata.def"
5623 return tokError(
"expected metadata type");
5626#define DECLARE_FIELD(NAME, TYPE, INIT) TYPE NAME INIT
5627#define NOP_FIELD(NAME, TYPE, INIT)
5628#define REQUIRE_FIELD(NAME, TYPE, INIT) \
5630 return error(ClosingLoc, "missing required field '" #NAME "'");
5631#define PARSE_MD_FIELD(NAME, TYPE, DEFAULT) \
5632 if (Lex.getStrVal() == #NAME) \
5633 return parseMDField(#NAME, NAME);
5634#define PARSE_MD_FIELDS() \
5635 VISIT_MD_FIELDS(DECLARE_FIELD, DECLARE_FIELD) \
5638 if (parseMDFieldsImpl( \
5640 VISIT_MD_FIELDS(PARSE_MD_FIELD, PARSE_MD_FIELD) \
5641 return tokError(Twine("invalid field '") + Lex.getStrVal() + \
5646 VISIT_MD_FIELDS(NOP_FIELD, REQUIRE_FIELD) \
5648#define GET_OR_DISTINCT(CLASS, ARGS) \
5649 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
5654bool LLParser::parseDILocation(
MDNode *&Result,
bool IsDistinct) {
5655#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5656 OPTIONAL(line, LineField, ); \
5657 OPTIONAL(column, ColumnField, ); \
5658 REQUIRED(scope, MDField, ( false)); \
5659 OPTIONAL(inlinedAt, MDField, ); \
5660 OPTIONAL(isImplicitCode, MDBoolField, (false)); \
5661 OPTIONAL(atomGroup, MDUnsignedField, (0, UINT64_MAX)); \
5662 OPTIONAL(atomRank, MDUnsignedField, (0, UINT8_MAX));
5664#undef VISIT_MD_FIELDS
5667 DILocation, (Context, line.Val, column.Val, scope.Val, inlinedAt.Val,
5668 isImplicitCode.Val, atomGroup.Val, atomRank.Val));
5674bool LLParser::parseDIAssignID(
MDNode *&Result,
bool IsDistinct) {
5676 return tokError(
"missing 'distinct', required for !DIAssignID()");
5692bool LLParser::parseGenericDINode(
MDNode *&Result,
bool IsDistinct) {
5693#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5694 REQUIRED(tag, DwarfTagField, ); \
5695 OPTIONAL(header, MDStringField, ); \
5696 OPTIONAL(operands, MDFieldList, );
5698#undef VISIT_MD_FIELDS
5701 (Context, tag.Val, header.Val, operands.Val));
5710bool LLParser::parseDISubrangeType(
MDNode *&Result,
bool IsDistinct) {
5711#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5712 OPTIONAL(name, MDStringField, ); \
5713 OPTIONAL(file, MDField, ); \
5714 OPTIONAL(line, LineField, ); \
5715 OPTIONAL(scope, MDField, ); \
5716 OPTIONAL(baseType, MDField, ); \
5717 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5718 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5719 OPTIONAL(flags, DIFlagField, ); \
5720 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5721 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5722 OPTIONAL(stride, MDSignedOrMDField, ); \
5723 OPTIONAL(bias, MDSignedOrMDField, );
5725#undef VISIT_MD_FIELDS
5727 auto convToMetadata = [&](MDSignedOrMDField Bound) ->
Metadata * {
5728 if (Bound.isMDSignedField())
5731 if (Bound.isMDField())
5732 return Bound.getMDFieldValue();
5736 Metadata *LowerBound = convToMetadata(lowerBound);
5738 Metadata *Stride = convToMetadata(stride);
5739 Metadata *Bias = convToMetadata(bias);
5742 DISubrangeType, (Context,
name.Val,
file.Val, line.Val, scope.Val,
5743 size.getValueAsMetadata(Context), align.Val, flags.Val,
5744 baseType.Val, LowerBound, UpperBound, Stride, Bias));
5753bool LLParser::parseDISubrange(
MDNode *&Result,
bool IsDistinct) {
5754#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5755 OPTIONAL(count, MDSignedOrMDField, (-1, -1, INT64_MAX, false)); \
5756 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5757 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5758 OPTIONAL(stride, MDSignedOrMDField, );
5760#undef VISIT_MD_FIELDS
5767 auto convToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5768 if (Bound.isMDSignedField())
5771 if (Bound.isMDField())
5772 return Bound.getMDFieldValue();
5777 LowerBound = convToMetadata(lowerBound);
5779 Stride = convToMetadata(stride);
5782 (Context,
Count, LowerBound, UpperBound, Stride));
5790bool LLParser::parseDIGenericSubrange(
MDNode *&Result,
bool IsDistinct) {
5791#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5792 OPTIONAL(count, MDSignedOrMDField, ); \
5793 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5794 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5795 OPTIONAL(stride, MDSignedOrMDField, );
5797#undef VISIT_MD_FIELDS
5799 auto ConvToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5800 if (Bound.isMDSignedField())
5802 Context, {dwarf::DW_OP_consts,
5803 static_cast<uint64_t
>(Bound.getMDSignedValue())});
5804 if (Bound.isMDField())
5805 return Bound.getMDFieldValue();
5810 Metadata *LowerBound = ConvToMetadata(lowerBound);
5812 Metadata *Stride = ConvToMetadata(stride);
5815 (Context,
Count, LowerBound, UpperBound, Stride));
5822bool LLParser::parseDIEnumerator(
MDNode *&Result,
bool IsDistinct) {
5823#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5824 REQUIRED(name, MDStringField, ); \
5825 REQUIRED(value, MDAPSIntField, ); \
5826 OPTIONAL(isUnsigned, MDBoolField, (false));
5828#undef VISIT_MD_FIELDS
5830 if (isUnsigned.Val && value.Val.isNegative())
5831 return tokError(
"unsigned enumerator with negative value");
5836 if (!isUnsigned.Val && value.Val.isUnsigned() && value.Val.isSignBitSet())
5848bool LLParser::parseDIBasicType(
MDNode *&Result,
bool IsDistinct) {
5849#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5850 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5851 OPTIONAL(name, MDStringField, ); \
5852 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5853 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5854 OPTIONAL(dataSize, MDUnsignedField, (0, UINT32_MAX)); \
5855 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5856 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5857 OPTIONAL(flags, DIFlagField, );
5859#undef VISIT_MD_FIELDS
5863 (Context, tag.Val,
name.Val,
size.getValueAsMetadata(Context), align.Val,
5864 encoding.Val, num_extra_inhabitants.Val, dataSize.Val, flags.Val));
5873bool LLParser::parseDIFixedPointType(
MDNode *&Result,
bool IsDistinct) {
5874#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5875 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5876 OPTIONAL(name, MDStringField, ); \
5877 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5878 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5879 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5880 OPTIONAL(flags, DIFlagField, ); \
5881 OPTIONAL(kind, FixedPointKindField, ); \
5882 OPTIONAL(factor, MDSignedField, ); \
5883 OPTIONAL(numerator, MDAPSIntField, ); \
5884 OPTIONAL(denominator, MDAPSIntField, );
5886#undef VISIT_MD_FIELDS
5889 (Context, tag.Val,
name.Val,
5890 size.getValueAsMetadata(Context), align.Val,
5891 encoding.Val, flags.Val, kind.Val, factor.Val,
5892 numerator.Val, denominator.Val));
5898bool LLParser::parseDIStringType(
MDNode *&Result,
bool IsDistinct) {
5899#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5900 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_string_type)); \
5901 OPTIONAL(name, MDStringField, ); \
5902 OPTIONAL(stringLength, MDField, ); \
5903 OPTIONAL(stringLengthExpression, MDField, ); \
5904 OPTIONAL(stringLocationExpression, MDField, ); \
5905 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5906 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5907 OPTIONAL(encoding, DwarfAttEncodingField, );
5909#undef VISIT_MD_FIELDS
5913 (Context, tag.Val,
name.Val, stringLength.Val, stringLengthExpression.Val,
5914 stringLocationExpression.Val,
size.getValueAsMetadata(Context),
5915 align.Val, encoding.Val));
5928bool LLParser::parseDIDerivedType(
MDNode *&Result,
bool IsDistinct) {
5929#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5930 REQUIRED(tag, DwarfTagField, ); \
5931 OPTIONAL(name, MDStringField, ); \
5932 OPTIONAL(file, MDField, ); \
5933 OPTIONAL(line, LineField, ); \
5934 OPTIONAL(scope, MDField, ); \
5935 REQUIRED(baseType, MDField, ); \
5936 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5937 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5938 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5939 OPTIONAL(flags, DIFlagField, ); \
5940 OPTIONAL(extraData, MDField, ); \
5941 OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
5942 OPTIONAL(annotations, MDField, ); \
5943 OPTIONAL(ptrAuthKey, MDUnsignedField, (0, 7)); \
5944 OPTIONAL(ptrAuthIsAddressDiscriminated, MDBoolField, ); \
5945 OPTIONAL(ptrAuthExtraDiscriminator, MDUnsignedField, (0, 0xffff)); \
5946 OPTIONAL(ptrAuthIsaPointer, MDBoolField, ); \
5947 OPTIONAL(ptrAuthAuthenticatesNullValues, MDBoolField, );
5949#undef VISIT_MD_FIELDS
5951 std::optional<unsigned> DWARFAddressSpace;
5952 if (dwarfAddressSpace.Val != UINT32_MAX)
5953 DWARFAddressSpace = dwarfAddressSpace.Val;
5954 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
5956 PtrAuthData.emplace(
5957 (
unsigned)ptrAuthKey.Val, ptrAuthIsAddressDiscriminated.Val,
5958 (
unsigned)ptrAuthExtraDiscriminator.Val, ptrAuthIsaPointer.Val,
5959 ptrAuthAuthenticatesNullValues.Val);
5962 DIDerivedType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
5963 baseType.Val,
size.getValueAsMetadata(Context), align.Val,
5964 offset.getValueAsMetadata(Context), DWARFAddressSpace,
5965 PtrAuthData, flags.Val, extraData.Val, annotations.Val));
5969bool LLParser::parseDICompositeType(
MDNode *&Result,
bool IsDistinct) {
5970#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5971 REQUIRED(tag, DwarfTagField, ); \
5972 OPTIONAL(name, MDStringField, ); \
5973 OPTIONAL(file, MDField, ); \
5974 OPTIONAL(line, LineField, ); \
5975 OPTIONAL(scope, MDField, ); \
5976 OPTIONAL(baseType, MDField, ); \
5977 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5978 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5979 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5980 OPTIONAL(flags, DIFlagField, ); \
5981 OPTIONAL(elements, MDField, ); \
5982 OPTIONAL(runtimeLang, DwarfLangField, ); \
5983 OPTIONAL(enumKind, DwarfEnumKindField, ); \
5984 OPTIONAL(vtableHolder, MDField, ); \
5985 OPTIONAL(templateParams, MDField, ); \
5986 OPTIONAL(identifier, MDStringField, ); \
5987 OPTIONAL(discriminator, MDField, ); \
5988 OPTIONAL(dataLocation, MDField, ); \
5989 OPTIONAL(associated, MDField, ); \
5990 OPTIONAL(allocated, MDField, ); \
5991 OPTIONAL(rank, MDSignedOrMDField, ); \
5992 OPTIONAL(annotations, MDField, ); \
5993 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5994 OPTIONAL(specification, MDField, ); \
5995 OPTIONAL(bitStride, MDField, );
5997#undef VISIT_MD_FIELDS
6000 if (rank.isMDSignedField())
6003 else if (rank.isMDField())
6004 Rank = rank.getMDFieldValue();
6006 std::optional<unsigned> EnumKind;
6008 EnumKind = enumKind.Val;
6013 Context, *identifier.Val, tag.Val,
name.Val,
file.Val, line.Val,
6014 scope.Val, baseType.Val,
size.getValueAsMetadata(Context),
6015 align.Val, offset.getValueAsMetadata(Context), specification.Val,
6016 num_extra_inhabitants.Val, flags.Val, elements.Val, runtimeLang.Val,
6017 EnumKind, vtableHolder.Val, templateParams.Val, discriminator.Val,
6018 dataLocation.Val, associated.Val, allocated.Val, Rank,
6019 annotations.Val, bitStride.Val)) {
6028 (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val, baseType.Val,
6029 size.getValueAsMetadata(Context), align.Val,
6030 offset.getValueAsMetadata(Context), flags.Val, elements.Val,
6031 runtimeLang.Val, EnumKind, vtableHolder.Val, templateParams.Val,
6032 identifier.Val, discriminator.Val, dataLocation.Val, associated.Val,
6033 allocated.Val, Rank, annotations.Val, specification.Val,
6034 num_extra_inhabitants.Val, bitStride.Val));
6038bool LLParser::parseDISubroutineType(
MDNode *&Result,
bool IsDistinct) {
6039#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6040 OPTIONAL(flags, DIFlagField, ); \
6041 OPTIONAL(cc, DwarfCCField, ); \
6042 REQUIRED(types, MDField, );
6044#undef VISIT_MD_FIELDS
6047 (Context, flags.Val, cc.Val, types.Val));
6056bool LLParser::parseDIFile(
MDNode *&Result,
bool IsDistinct) {
6060#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6061 REQUIRED(filename, MDStringField, ); \
6062 REQUIRED(directory, MDStringField, ); \
6063 OPTIONAL(checksumkind, ChecksumKindField, (DIFile::CSK_MD5)); \
6064 OPTIONAL(checksum, MDStringField, ); \
6065 OPTIONAL(source, MDStringField, (MDStringField::EmptyIs::Empty));
6067#undef VISIT_MD_FIELDS
6069 std::optional<DIFile::ChecksumInfo<MDString *>> OptChecksum;
6070 if (checksumkind.Seen && checksum.Seen)
6071 OptChecksum.emplace(checksumkind.Val, checksum.Val);
6072 else if (checksumkind.Seen || checksum.Seen)
6073 return tokError(
"'checksumkind' and 'checksum' must be provided together");
6075 MDString *
Source =
nullptr;
6079 DIFile, (Context,
filename.Val, directory.Val, OptChecksum, Source));
6090bool LLParser::parseDICompileUnit(
MDNode *&Result,
bool IsDistinct) {
6092 return tokError(
"missing 'distinct', required for !DICompileUnit");
6094 LocTy Loc = Lex.getLoc();
6096#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6097 REQUIRED(file, MDField, ( false)); \
6098 OPTIONAL(language, DwarfLangField, ); \
6099 OPTIONAL(sourceLanguageName, DwarfSourceLangNameField, ); \
6100 OPTIONAL(sourceLanguageVersion, MDUnsignedField, (0, UINT32_MAX)); \
6101 OPTIONAL(producer, MDStringField, ); \
6102 OPTIONAL(isOptimized, MDBoolField, ); \
6103 OPTIONAL(flags, MDStringField, ); \
6104 OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); \
6105 OPTIONAL(splitDebugFilename, MDStringField, ); \
6106 OPTIONAL(emissionKind, EmissionKindField, ); \
6107 OPTIONAL(enums, MDField, ); \
6108 OPTIONAL(retainedTypes, MDField, ); \
6109 OPTIONAL(globals, MDField, ); \
6110 OPTIONAL(imports, MDField, ); \
6111 OPTIONAL(macros, MDField, ); \
6112 OPTIONAL(dwoId, MDUnsignedField, ); \
6113 OPTIONAL(splitDebugInlining, MDBoolField, = true); \
6114 OPTIONAL(debugInfoForProfiling, MDBoolField, = false); \
6115 OPTIONAL(nameTableKind, NameTableKindField, ); \
6116 OPTIONAL(rangesBaseAddress, MDBoolField, = false); \
6117 OPTIONAL(sysroot, MDStringField, ); \
6118 OPTIONAL(sdk, MDStringField, );
6120#undef VISIT_MD_FIELDS
6122 if (!language.Seen && !sourceLanguageName.Seen)
6123 return error(Loc,
"missing one of 'language' or 'sourceLanguageName', "
6124 "required for !DICompileUnit");
6126 if (language.Seen && sourceLanguageName.Seen)
6127 return error(Loc,
"can only specify one of 'language' and "
6128 "'sourceLanguageName' on !DICompileUnit");
6130 if (sourceLanguageVersion.Seen && !sourceLanguageName.Seen)
6131 return error(Loc,
"'sourceLanguageVersion' requires an associated "
6132 "'sourceLanguageName' on !DICompileUnit");
6136 language.Seen ? DISourceLanguageName(language.Val)
6137 : DISourceLanguageName(sourceLanguageName.Val,
6138 sourceLanguageVersion.Val),
6139 file.Val, producer.Val, isOptimized.Val, flags.Val, runtimeVersion.Val,
6140 splitDebugFilename.Val, emissionKind.Val, enums.Val, retainedTypes.Val,
6141 globals.Val, imports.Val, macros.Val, dwoId.Val, splitDebugInlining.Val,
6142 debugInfoForProfiling.Val, nameTableKind.Val, rangesBaseAddress.Val,
6143 sysroot.Val, sdk.Val);
6156bool LLParser::parseDISubprogram(
MDNode *&Result,
bool IsDistinct) {
6157 auto Loc = Lex.getLoc();
6158#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6159 OPTIONAL(scope, MDField, ); \
6160 OPTIONAL(name, MDStringField, ); \
6161 OPTIONAL(linkageName, MDStringField, ); \
6162 OPTIONAL(file, MDField, ); \
6163 OPTIONAL(line, LineField, ); \
6164 OPTIONAL(type, MDField, ); \
6165 OPTIONAL(isLocal, MDBoolField, ); \
6166 OPTIONAL(isDefinition, MDBoolField, (true)); \
6167 OPTIONAL(scopeLine, LineField, ); \
6168 OPTIONAL(containingType, MDField, ); \
6169 OPTIONAL(virtuality, DwarfVirtualityField, ); \
6170 OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); \
6171 OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); \
6172 OPTIONAL(flags, DIFlagField, ); \
6173 OPTIONAL(spFlags, DISPFlagField, ); \
6174 OPTIONAL(isOptimized, MDBoolField, ); \
6175 OPTIONAL(unit, MDField, ); \
6176 OPTIONAL(templateParams, MDField, ); \
6177 OPTIONAL(declaration, MDField, ); \
6178 OPTIONAL(retainedNodes, MDField, ); \
6179 OPTIONAL(thrownTypes, MDField, ); \
6180 OPTIONAL(annotations, MDField, ); \
6181 OPTIONAL(targetFuncName, MDStringField, ); \
6182 OPTIONAL(keyInstructions, MDBoolField, );
6184#undef VISIT_MD_FIELDS
6189 spFlags.Seen ? spFlags.Val
6191 isOptimized.Val, virtuality.Val);
6192 if ((SPFlags & DISubprogram::SPFlagDefinition) && !IsDistinct)
6195 "missing 'distinct', required for !DISubprogram that is a Definition");
6198 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val, line.Val,
6199 type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
6200 thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
6201 declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
6202 targetFuncName.Val, keyInstructions.Val));
6212bool LLParser::parseDILexicalBlock(
MDNode *&Result,
bool IsDistinct) {
6213#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6214 REQUIRED(scope, MDField, ( false)); \
6215 OPTIONAL(file, MDField, ); \
6216 OPTIONAL(line, LineField, ); \
6217 OPTIONAL(column, ColumnField, );
6219#undef VISIT_MD_FIELDS
6222 DILexicalBlock, (Context, scope.Val,
file.Val, line.Val, column.Val));
6228bool LLParser::parseDILexicalBlockFile(
MDNode *&Result,
bool IsDistinct) {
6229#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6230 REQUIRED(scope, MDField, ( false)); \
6231 OPTIONAL(file, MDField, ); \
6232 REQUIRED(discriminator, MDUnsignedField, (0, UINT32_MAX));
6234#undef VISIT_MD_FIELDS
6237 (Context, scope.Val,
file.Val, discriminator.Val));
6243bool LLParser::parseDICommonBlock(
MDNode *&Result,
bool IsDistinct) {
6244#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6245 REQUIRED(scope, MDField, ); \
6246 OPTIONAL(declaration, MDField, ); \
6247 OPTIONAL(name, MDStringField, ); \
6248 OPTIONAL(file, MDField, ); \
6249 OPTIONAL(line, LineField, );
6251#undef VISIT_MD_FIELDS
6254 (Context, scope.Val, declaration.Val,
name.Val,
6255 file.Val, line.Val));
6261bool LLParser::parseDINamespace(
MDNode *&Result,
bool IsDistinct) {
6262#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6263 REQUIRED(scope, MDField, ); \
6264 OPTIONAL(name, MDStringField, ); \
6265 OPTIONAL(exportSymbols, MDBoolField, );
6267#undef VISIT_MD_FIELDS
6270 (Context, scope.Val,
name.Val, exportSymbols.Val));
6277bool LLParser::parseDIMacro(
MDNode *&Result,
bool IsDistinct) {
6278#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6279 REQUIRED(type, DwarfMacinfoTypeField, ); \
6280 OPTIONAL(line, LineField, ); \
6281 REQUIRED(name, MDStringField, ); \
6282 OPTIONAL(value, MDStringField, );
6284#undef VISIT_MD_FIELDS
6287 (Context, type.Val, line.Val,
name.Val, value.Val));
6293bool LLParser::parseDIMacroFile(
MDNode *&Result,
bool IsDistinct) {
6294#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6295 OPTIONAL(type, DwarfMacinfoTypeField, (dwarf::DW_MACINFO_start_file)); \
6296 OPTIONAL(line, LineField, ); \
6297 REQUIRED(file, MDField, ); \
6298 OPTIONAL(nodes, MDField, );
6300#undef VISIT_MD_FIELDS
6303 (Context, type.Val, line.Val,
file.Val,
nodes.Val));
6311bool LLParser::parseDIModule(
MDNode *&Result,
bool IsDistinct) {
6312#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6313 REQUIRED(scope, MDField, ); \
6314 REQUIRED(name, MDStringField, ); \
6315 OPTIONAL(configMacros, MDStringField, ); \
6316 OPTIONAL(includePath, MDStringField, ); \
6317 OPTIONAL(apinotes, MDStringField, ); \
6318 OPTIONAL(file, MDField, ); \
6319 OPTIONAL(line, LineField, ); \
6320 OPTIONAL(isDecl, MDBoolField, );
6322#undef VISIT_MD_FIELDS
6325 configMacros.Val, includePath.Val,
6326 apinotes.Val, line.Val, isDecl.Val));
6332bool LLParser::parseDITemplateTypeParameter(
MDNode *&Result,
bool IsDistinct) {
6333#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6334 OPTIONAL(name, MDStringField, ); \
6335 REQUIRED(type, MDField, ); \
6336 OPTIONAL(defaulted, MDBoolField, );
6338#undef VISIT_MD_FIELDS
6341 (Context,
name.Val, type.Val, defaulted.Val));
6349bool LLParser::parseDITemplateValueParameter(
MDNode *&Result,
bool IsDistinct) {
6350#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6351 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_template_value_parameter)); \
6352 OPTIONAL(name, MDStringField, ); \
6353 OPTIONAL(type, MDField, ); \
6354 OPTIONAL(defaulted, MDBoolField, ); \
6355 REQUIRED(value, MDField, );
6358#undef VISIT_MD_FIELDS
6361 DITemplateValueParameter,
6362 (Context, tag.Val,
name.Val, type.Val, defaulted.Val, value.Val));
6371bool LLParser::parseDIGlobalVariable(
MDNode *&Result,
bool IsDistinct) {
6372#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6373 OPTIONAL(name, MDStringField, (MDStringField::EmptyIs::Error)); \
6374 OPTIONAL(scope, MDField, ); \
6375 OPTIONAL(linkageName, MDStringField, ); \
6376 OPTIONAL(file, MDField, ); \
6377 OPTIONAL(line, LineField, ); \
6378 OPTIONAL(type, MDField, ); \
6379 OPTIONAL(isLocal, MDBoolField, ); \
6380 OPTIONAL(isDefinition, MDBoolField, (true)); \
6381 OPTIONAL(templateParams, MDField, ); \
6382 OPTIONAL(declaration, MDField, ); \
6383 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6384 OPTIONAL(annotations, MDField, );
6386#undef VISIT_MD_FIELDS
6390 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val,
6391 line.Val, type.Val, isLocal.Val, isDefinition.Val,
6392 declaration.Val, templateParams.Val, align.Val,
6404bool LLParser::parseDILocalVariable(
MDNode *&Result,
bool IsDistinct) {
6405#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6406 REQUIRED(scope, MDField, ( false)); \
6407 OPTIONAL(name, MDStringField, ); \
6408 OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); \
6409 OPTIONAL(file, MDField, ); \
6410 OPTIONAL(line, LineField, ); \
6411 OPTIONAL(type, MDField, ); \
6412 OPTIONAL(flags, DIFlagField, ); \
6413 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6414 OPTIONAL(annotations, MDField, );
6416#undef VISIT_MD_FIELDS
6419 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6420 type.Val, arg.Val, flags.Val, align.Val,
6427bool LLParser::parseDILabel(
MDNode *&Result,
bool IsDistinct) {
6428#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6429 REQUIRED(scope, MDField, ( false)); \
6430 REQUIRED(name, MDStringField, ); \
6431 REQUIRED(file, MDField, ); \
6432 REQUIRED(line, LineField, ); \
6433 OPTIONAL(column, ColumnField, ); \
6434 OPTIONAL(isArtificial, MDBoolField, ); \
6435 OPTIONAL(coroSuspendIdx, MDUnsignedField, );
6437#undef VISIT_MD_FIELDS
6439 std::optional<unsigned> CoroSuspendIdx =
6440 coroSuspendIdx.Seen ? std::optional<unsigned>(coroSuspendIdx.Val)
6444 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6445 column.Val, isArtificial.Val, CoroSuspendIdx));
6451bool LLParser::parseDIExpressionBody(
MDNode *&Result,
bool IsDistinct) {
6464 return tokError(Twine(
"invalid DWARF op '") + Lex.getStrVal() +
"'");
6473 return tokError(Twine(
"invalid DWARF attribute encoding '") +
6474 Lex.getStrVal() +
"'");
6477 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
6478 return tokError(
"expected unsigned integer");
6480 auto &
U = Lex.getAPSIntVal();
6482 return tokError(
"element too large, limit is " + Twine(
UINT64_MAX));
6496bool LLParser::parseDIExpression(
MDNode *&Result,
bool IsDistinct) {
6498 assert(Lex.getStrVal() ==
"DIExpression" &&
"Expected '!DIExpression'");
6501 return parseDIExpressionBody(Result, IsDistinct);
6506bool LLParser::parseDIArgList(
Metadata *&MD, PerFunctionState *PFS) {
6507 assert(PFS &&
"Expected valid function state");
6518 if (parseValueAsMetadata(MD,
"expected value-as-metadata operand", PFS))
6532bool LLParser::parseDIGlobalVariableExpression(
MDNode *&Result,
6534#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6535 REQUIRED(var, MDField, ); \
6536 REQUIRED(expr, MDField, );
6538#undef VISIT_MD_FIELDS
6541 GET_OR_DISTINCT(DIGlobalVariableExpression, (Context, var.Val, expr.Val));
6548bool LLParser::parseDIObjCProperty(
MDNode *&Result,
bool IsDistinct) {
6549#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6550 OPTIONAL(name, MDStringField, ); \
6551 OPTIONAL(file, MDField, ); \
6552 OPTIONAL(line, LineField, ); \
6553 OPTIONAL(setter, MDStringField, ); \
6554 OPTIONAL(getter, MDStringField, ); \
6555 OPTIONAL(attributes, MDUnsignedField, (0, UINT32_MAX)); \
6556 OPTIONAL(type, MDField, );
6558#undef VISIT_MD_FIELDS
6561 (Context,
name.Val,
file.Val, line.Val, getter.Val,
6562 setter.Val, attributes.Val, type.Val));
6569bool LLParser::parseDIImportedEntity(
MDNode *&Result,
bool IsDistinct) {
6570#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6571 REQUIRED(tag, DwarfTagField, ); \
6572 REQUIRED(scope, MDField, ); \
6573 OPTIONAL(entity, MDField, ); \
6574 OPTIONAL(file, MDField, ); \
6575 OPTIONAL(line, LineField, ); \
6576 OPTIONAL(name, MDStringField, ); \
6577 OPTIONAL(elements, MDField, );
6579#undef VISIT_MD_FIELDS
6582 (Context, tag.Val, scope.Val, entity.Val,
file.Val,
6583 line.Val,
name.Val, elements.Val));
6587#undef PARSE_MD_FIELD
6599bool LLParser::parseMetadataAsValue(
Value *&V, PerFunctionState &PFS) {
6602 if (parseMetadata(MD, &PFS))
6613bool LLParser::parseValueAsMetadata(
Metadata *&MD,
const Twine &TypeMsg,
6614 PerFunctionState *PFS) {
6617 if (parseType(Ty, TypeMsg, Loc))
6620 return error(Loc,
"invalid metadata-value-metadata roundtrip");
6623 if (parseValue(Ty, V, PFS))
6638bool LLParser::parseMetadata(
Metadata *&MD, PerFunctionState *PFS) {
6642 if (Lex.getStrVal() ==
"DIArgList") {
6644 if (parseDIArgList(AL, PFS))
6650 if (parseSpecializedMDNode(
N)) {
6660 return parseValueAsMetadata(MD,
"expected metadata operand", PFS);
6670 if (parseMDString(S))
6680 if (parseMDNodeTail(
N))
6691 PerFunctionState *PFS) {
6693 return error(
ID.Loc,
"functions are not values, refer to them as pointers");
6698 return error(
ID.Loc,
"invalid use of function-local name");
6699 V = PFS->getVal(
ID.UIntVal, Ty,
ID.Loc);
6700 return V ==
nullptr;
6703 return error(
ID.Loc,
"invalid use of function-local name");
6704 V = PFS->getVal(
ID.StrVal, Ty,
ID.Loc);
6705 return V ==
nullptr;
6708 return error(
ID.Loc,
"invalid type for inline asm constraint string");
6712 ID.FTy,
ID.StrVal,
ID.StrVal2,
ID.UIntVal & 1, (
ID.UIntVal >> 1) & 1,
6717 V = getGlobalVal(
ID.StrVal, Ty,
ID.Loc);
6720 return V ==
nullptr;
6722 V = getGlobalVal(
ID.UIntVal, Ty,
ID.Loc);
6725 return V ==
nullptr;
6728 return error(
ID.Loc,
"integer/byte constant must have integer/byte type");
6731 :
V = ConstantByte::
get(Context,
ID.APSIntVal);
6736 return error(
ID.Loc,
"floating point constant invalid for type");
6742 bool IsSNAN = ID.APFloatVal.isSignaling();
6745 ID.APFloatVal.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven,
6747 else if (Ty->isBFloatTy())
6748 ID.APFloatVal.convert(APFloat::BFloat(), APFloat::rmNearestTiesToEven,
6750 else if (Ty->isFloatTy())
6751 ID.APFloatVal.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven,
6757 APInt Payload = ID.APFloatVal.bitcastToAPInt();
6758 ID.APFloatVal = APFloat::getSNaN(ID.APFloatVal.getSemantics(),
6759 ID.APFloatVal.isNegative(), &Payload);
6762 V = ConstantFP::get(Context,
ID.APFloatVal);
6764 if (
V->getType() != Ty)
6765 return error(
ID.Loc,
"floating point constant does not have type '" +
6771 return error(
ID.Loc,
"null must be a pointer type");
6777 return error(
ID.Loc,
"invalid type for undef constant");
6782 return error(
ID.Loc,
"invalid empty array initializer");
6788 return error(
ID.Loc,
"invalid type for null constant");
6791 return error(
ID.Loc,
"invalid type for null constant");
6796 return error(
ID.Loc,
"invalid type for none constant");
6802 return error(
ID.Loc,
"invalid type for poison constant");
6806 if (
ID.ConstantVal->getType() != Ty)
6807 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6814 return error(
ID.Loc,
"vector constant must have vector type");
6816 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6818 "' but expected '" +
6826 if (
ST->getNumElements() !=
ID.UIntVal)
6828 "initializer with struct type has wrong # elements");
6830 return error(
ID.Loc,
"packed'ness of initializer and type don't match");
6833 for (
unsigned i = 0, e =
ID.UIntVal; i != e; ++i)
6834 if (
ID.ConstantStructElts[i]->getType() !=
ST->getElementType(i))
6837 "element " + Twine(i) +
6838 " of struct initializer doesn't match struct element type");
6841 ST,
ArrayRef(
ID.ConstantStructElts.get(),
ID.UIntVal));
6843 return error(
ID.Loc,
"constant expression type mismatch");
6852 auto Loc = Lex.getLoc();
6853 if (parseValID(
ID,
nullptr))
6866 if (convertValIDToValue(Ty,
ID, V,
nullptr))
6876 return error(Loc,
"expected a constant value");
6880bool LLParser::parseValue(
Type *Ty,
Value *&V, PerFunctionState *PFS) {
6884 FileLoc
Start = getTokLineColumnPos();
6885 bool Ret = parseValID(
ID, PFS, Ty) || convertValIDToValue(Ty,
ID, V, PFS);
6886 if (!Ret && ParserContext) {
6887 FileLoc End = getPrevTokEndLineColumnPos();
6888 ParserContext->addValueReferenceAtLocation(V, FileLocRange(Start, End));
6893bool LLParser::parseTypeAndValue(
Value *&V, PerFunctionState *PFS) {
6895 return parseType(Ty) || parseValue(Ty, V, PFS);
6898bool LLParser::parseTypeAndBasicBlock(
BasicBlock *&BB, LocTy &
Loc,
6899 PerFunctionState &PFS) {
6902 if (parseTypeAndValue(V, PFS))
6905 return error(Loc,
"expected a basic block");
6914 if (!Name.starts_with(
"llvm.dbg."))
6917 return FnID == Intrinsic::dbg_declare || FnID == Intrinsic::dbg_value ||
6918 FnID == Intrinsic::dbg_assign;
6926bool LLParser::parseFunctionHeader(
Function *&Fn,
bool IsDefine,
6927 unsigned &FunctionNumber,
6930 LocTy LinkageLoc = Lex.getLoc();
6932 unsigned Visibility;
6933 unsigned DLLStorageClass;
6935 AttrBuilder RetAttrs(M->getContext());
6938 Type *RetType =
nullptr;
6939 LocTy RetTypeLoc = Lex.getLoc();
6940 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
6942 parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
6943 parseType(RetType, RetTypeLoc,
true ))
6952 return error(LinkageLoc,
"invalid linkage for function definition");
6962 return error(LinkageLoc,
"invalid linkage for function declaration");
6966 return error(LinkageLoc,
"invalid function linkage type");
6970 return error(LinkageLoc,
6971 "symbol with local linkage must have default visibility");
6974 return error(LinkageLoc,
6975 "symbol with local linkage cannot have a DLL storage class");
6978 return error(RetTypeLoc,
"invalid function return type");
6980 LocTy NameLoc = Lex.getLoc();
6982 std::string FunctionName;
6984 FunctionName = Lex.getStrVal();
6986 FunctionNumber = Lex.getUIntVal();
6987 if (checkValueID(NameLoc,
"function",
"@", NumberedVals.getNext(),
6991 return tokError(
"expected function name");
6997 return tokError(
"expected '(' in function argument list");
7001 AttrBuilder FuncAttrs(M->getContext());
7002 std::vector<unsigned> FwdRefAttrGrps;
7005 std::string Partition;
7006 MaybeAlign Alignment, PrefAlignment;
7009 unsigned AddrSpace = 0;
7015 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg) ||
7016 parseOptionalUnnamedAddr(UnnamedAddr) ||
7017 parseOptionalProgramAddrSpace(AddrSpace) ||
7018 parseFnAttributeValuePairs(FuncAttrs, FwdRefAttrGrps,
false,
7022 parseOptionalComdat(FunctionName,
C) ||
7023 parseOptionalAlignment(Alignment) ||
7024 parseOptionalPrefAlignment(PrefAlignment) ||
7025 (EatIfPresent(
lltok::kw_gc) && parseStringConstant(GC)) ||
7029 parseGlobalTypeAndValue(PersonalityFn)))
7032 if (FuncAttrs.contains(Attribute::Builtin))
7033 return error(BuiltinLoc,
"'builtin' attribute not valid on function");
7036 if (MaybeAlign
A = FuncAttrs.getAlignment()) {
7038 FuncAttrs.removeAttribute(Attribute::Alignment);
7043 std::vector<Type*> ParamTypeList;
7046 for (
const ArgInfo &Arg : ArgList) {
7047 ParamTypeList.push_back(Arg.Ty);
7048 Attrs.push_back(Arg.Attrs);
7055 if (PAL.hasParamAttr(0, Attribute::StructRet) && !RetType->
isVoidTy())
7056 return error(RetTypeLoc,
"functions with 'sret' argument must return void");
7062 GlobalValue *FwdFn =
nullptr;
7063 if (!FunctionName.empty()) {
7066 auto FRVI = ForwardRefVals.find(FunctionName);
7067 if (FRVI != ForwardRefVals.end()) {
7068 FwdFn = FRVI->second.first;
7070 return error(FRVI->second.second,
7071 "invalid forward reference to "
7074 "' with wrong type: "
7078 ForwardRefVals.erase(FRVI);
7079 }
else if ((Fn = M->getFunction(FunctionName))) {
7081 return error(NameLoc,
7082 "invalid redefinition of function '" + FunctionName +
"'");
7083 }
else if (M->getNamedValue(FunctionName)) {
7084 return error(NameLoc,
"redefinition of function '@" + FunctionName +
"'");
7090 if (FunctionNumber == (
unsigned)-1)
7091 FunctionNumber = NumberedVals.getNext();
7095 auto I = ForwardRefValIDs.find(FunctionNumber);
7096 if (
I != ForwardRefValIDs.end()) {
7097 FwdFn =
I->second.first;
7099 return error(NameLoc,
"type of definition and forward reference of '@" +
7100 Twine(FunctionNumber) +
7105 ForwardRefValIDs.erase(
I);
7114 if (FunctionName.empty())
7115 NumberedVals.add(FunctionNumber, Fn);
7131 if (!
GC.empty()) Fn->
setGC(GC);
7134 ForwardRefAttrGroups[Fn] = FwdRefAttrGrps;
7138 for (
unsigned i = 0, e = ArgList.size(); i != e; ++i, ++ArgIt) {
7139 if (ParserContext && ArgList[i].IdentLoc)
7140 ParserContext->addInstructionOrArgumentLocation(
7141 &*ArgIt, ArgList[i].IdentLoc.value());
7143 if (ArgList[i].
Name.empty())
continue;
7146 ArgIt->
setName(ArgList[i].Name);
7148 if (ArgIt->
getName() != ArgList[i].Name)
7149 return error(ArgList[i].Loc,
7150 "redefinition of argument '%" + ArgList[i].Name +
"'");
7163 if (FunctionName.empty()) {
7165 ID.UIntVal = FunctionNumber;
7168 ID.StrVal = FunctionName;
7170 auto Blocks = ForwardRefBlockAddresses.find(
ID);
7171 if (Blocks != ForwardRefBlockAddresses.end())
7172 return error(Blocks->first.Loc,
7173 "cannot take blockaddress inside a declaration");
7177bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
7179 if (FunctionNumber == -1) {
7181 ID.StrVal = std::string(F.getName());
7184 ID.UIntVal = FunctionNumber;
7187 auto Blocks = P.ForwardRefBlockAddresses.find(
ID);
7188 if (Blocks == P.ForwardRefBlockAddresses.end())
7191 for (
const auto &
I : Blocks->second) {
7192 const ValID &BBID =
I.first;
7193 GlobalValue *GV =
I.second;
7196 "Expected local id or name");
7203 return P.error(BBID.
Loc,
"referenced value is not a basic block");
7206 ResolvedVal = P.checkValidVariableType(BBID.
Loc, BBID.
StrVal, GV->
getType(),
7214 P.ForwardRefBlockAddresses.erase(Blocks);
7220bool LLParser::parseFunctionBody(Function &Fn,
unsigned FunctionNumber,
7221 ArrayRef<unsigned> UnnamedArgNums) {
7223 return tokError(
"expected '{' in function body");
7226 PerFunctionState PFS(*
this, Fn, FunctionNumber, UnnamedArgNums);
7230 if (PFS.resolveForwardRefBlockAddresses())
7236 return tokError(
"function body requires at least one basic block");
7240 if (parseBasicBlock(PFS))
7244 if (parseUseListOrder(&PFS))
7251 return PFS.finishFunction();
7256bool LLParser::parseBasicBlock(PerFunctionState &PFS) {
7257 FileLoc BBStart = getTokLineColumnPos();
7262 LocTy NameLoc = Lex.getLoc();
7264 Name = Lex.getStrVal();
7267 NameID = Lex.getUIntVal();
7271 BasicBlock *BB = PFS.defineBB(Name, NameID, NameLoc);
7275 std::string NameStr;
7280 auto DeleteDbgRecord = [](DbgRecord *DR) { DR->deleteRecord(); };
7281 using DbgRecordPtr = std::unique_ptr<DbgRecord,
decltype(DeleteDbgRecord)>;
7288 if (SeenOldDbgInfoFormat)
7289 return error(Lex.getLoc(),
"debug record should not appear in a module "
7290 "containing debug info intrinsics");
7291 SeenNewDbgInfoFormat =
true;
7295 if (parseDebugRecord(DR, PFS))
7297 TrailingDbgRecord.emplace_back(DR, DeleteDbgRecord);
7300 FileLoc InstStart = getTokLineColumnPos();
7303 LocTy NameLoc = Lex.getLoc();
7308 NameID = Lex.getUIntVal();
7310 if (parseToken(
lltok::equal,
"expected '=' after instruction id"))
7313 NameStr = Lex.getStrVal();
7315 if (parseToken(
lltok::equal,
"expected '=' after instruction name"))
7319 switch (parseInstruction(Inst, BB, PFS)) {
7322 case InstError:
return true;
7329 if (parseInstructionMetadata(*Inst))
7332 case InstExtraComma:
7337 if (parseInstructionMetadata(*Inst))
7343 if (PFS.setInstName(NameID, NameStr, NameLoc, Inst))
7347 for (DbgRecordPtr &DR : TrailingDbgRecord)
7349 TrailingDbgRecord.clear();
7350 if (ParserContext) {
7351 ParserContext->addInstructionOrArgumentLocation(
7352 Inst, FileLocRange(InstStart, getPrevTokEndLineColumnPos()));
7357 ParserContext->addBlockLocation(
7358 BB, FileLocRange(BBStart, getPrevTokEndLineColumnPos()));
7360 assert(TrailingDbgRecord.empty() &&
7361 "All debug values should have been attached to an instruction.");
7370bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
7373 LocTy DVRLoc = Lex.getLoc();
7375 return error(DVRLoc,
"expected debug record type here");
7376 RecordKind
RecordType = StringSwitch<RecordKind>(Lex.getStrVal())
7377 .Case(
"declare", RecordKind::ValueKind)
7378 .Case(
"value", RecordKind::ValueKind)
7379 .Case(
"assign", RecordKind::ValueKind)
7380 .Case(
"label", RecordKind::LabelKind)
7381 .Case(
"declare_value", RecordKind::ValueKind);
7390 if (parseMDNode(Label))
7395 if (parseMDNode(DbgLoc))
7403 LocType
ValueType = StringSwitch<LocType>(Lex.getStrVal())
7404 .Case(
"declare", LocType::Declare)
7405 .Case(
"value", LocType::Value)
7406 .Case(
"assign", LocType::Assign)
7407 .Case(
"declare_value", LocType::DeclareValue);
7415 if (parseMetadata(ValLocMD, &PFS))
7422 if (parseMDNode(Variable))
7429 if (parseMDNode(Expression))
7435 MDNode *AssignID =
nullptr;
7436 Metadata *AddressLocation =
nullptr;
7437 MDNode *AddressExpression =
nullptr;
7440 if (parseMDNode(AssignID))
7446 if (parseMetadata(AddressLocation, &PFS))
7452 if (parseMDNode(AddressExpression))
7466 ValueType, ValLocMD, Variable, Expression, AssignID, AddressLocation,
7476int LLParser::parseInstruction(Instruction *&Inst, BasicBlock *BB,
7477 PerFunctionState &PFS) {
7480 return tokError(
"found end of file when expecting more instructions");
7481 LocTy Loc = Lex.getLoc();
7482 unsigned KeywordVal = Lex.getUIntVal();
7487 return error(Loc,
"expected instruction opcode");
7491 return parseRet(Inst, BB, PFS);
7493 return parseBr(Inst, PFS);
7495 return parseSwitch(Inst, PFS);
7497 return parseIndirectBr(Inst, PFS);
7499 return parseInvoke(Inst, PFS);
7501 return parseResume(Inst, PFS);
7503 return parseCleanupRet(Inst, PFS);
7505 return parseCatchRet(Inst, PFS);
7507 return parseCatchSwitch(Inst, PFS);
7509 return parseCatchPad(Inst, PFS);
7511 return parseCleanupPad(Inst, PFS);
7513 return parseCallBr(Inst, PFS);
7516 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7517 int Res = parseUnaryOp(Inst, PFS, KeywordVal,
true);
7533 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7545 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7546 int Res = parseArithmetic(Inst, PFS, KeywordVal,
true);
7560 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7568 return parseArithmetic(Inst, PFS, KeywordVal,
7572 if (parseLogical(Inst, PFS, KeywordVal))
7580 return parseLogical(Inst, PFS, KeywordVal);
7583 if (parseCompare(Inst, PFS, KeywordVal))
7590 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7591 int Res = parseCompare(Inst, PFS, KeywordVal);
7603 bool Res = parseCast(Inst, PFS, KeywordVal);
7615 if (parseCast(Inst, PFS, KeywordVal))
7632 return parseCast(Inst, PFS, KeywordVal);
7635 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7636 if (parseCast(Inst, PFS, KeywordVal))
7645 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7646 int Res = parseSelect(Inst, PFS);
7651 return error(Loc,
"fast-math-flags specified for select without "
7652 "floating-point scalar or vector return type");
7658 return parseVAArg(Inst, PFS);
7660 return parseExtractElement(Inst, PFS);
7662 return parseInsertElement(Inst, PFS);
7664 return parseShuffleVector(Inst, PFS);
7666 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7667 int Res = parsePHI(Inst, PFS);
7672 return error(Loc,
"fast-math-flags specified for phi without "
7673 "floating-point scalar or vector return type");
7679 return parseLandingPad(Inst, PFS);
7681 return parseFreeze(Inst, PFS);
7693 return parseAlloc(Inst, PFS);
7695 return parseLoad(Inst, PFS);
7697 return parseStore(Inst, PFS);
7699 return parseCmpXchg(Inst, PFS);
7701 return parseAtomicRMW(Inst, PFS);
7703 return parseFence(Inst, PFS);
7705 return parseGetElementPtr(Inst, PFS);
7707 return parseExtractValue(Inst, PFS);
7709 return parseInsertValue(Inst, PFS);
7714bool LLParser::parseCmpPredicate(
unsigned &
P,
unsigned Opc) {
7715 if (
Opc == Instruction::FCmp) {
7716 switch (Lex.getKind()) {
7718 return tokError(
"expected fcmp predicate (e.g. 'oeq')");
7737 switch (Lex.getKind()) {
7739 return tokError(
"expected icmp predicate (e.g. 'eq')");
7763bool LLParser::parseRet(Instruction *&Inst, BasicBlock *BB,
7764 PerFunctionState &PFS) {
7765 SMLoc TypeLoc = Lex.getLoc();
7767 if (parseType(Ty,
true ))
7770 Type *ResType = PFS.getFunction().getReturnType();
7774 return error(TypeLoc,
"value doesn't match function result type '" +
7782 if (parseValue(Ty, RV, PFS))
7786 return error(TypeLoc,
"value doesn't match function result type '" +
7796bool LLParser::parseBr(Instruction *&Inst, PerFunctionState &PFS) {
7800 if (parseTypeAndValue(Op0, Loc, PFS))
7809 return error(Loc,
"branch condition must have 'i1' type");
7811 if (parseToken(
lltok::comma,
"expected ',' after branch condition") ||
7812 parseTypeAndBasicBlock(Op1, Loc, PFS) ||
7813 parseToken(
lltok::comma,
"expected ',' after true destination") ||
7814 parseTypeAndBasicBlock(Op2, Loc2, PFS))
7826bool LLParser::parseSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7827 LocTy CondLoc, BBLoc;
7830 if (parseTypeAndValue(
Cond, CondLoc, PFS) ||
7831 parseToken(
lltok::comma,
"expected ',' after switch condition") ||
7832 parseTypeAndBasicBlock(DefaultBB, BBLoc, PFS) ||
7836 if (!
Cond->getType()->isIntegerTy())
7837 return error(CondLoc,
"switch condition must have integer type");
7840 SmallPtrSet<Value*, 32> SeenCases;
7846 if (parseTypeAndValue(Constant, CondLoc, PFS) ||
7847 parseToken(
lltok::comma,
"expected ',' after case value") ||
7848 parseTypeAndBasicBlock(DestBB, PFS))
7851 if (!SeenCases.
insert(Constant).second)
7852 return error(CondLoc,
"duplicate case value in switch");
7854 return error(CondLoc,
"case value is not a constant integer");
7862 for (
const auto &[OnVal, Dest] : Table)
7863 SI->addCase(OnVal, Dest);
7871bool LLParser::parseIndirectBr(Instruction *&Inst, PerFunctionState &PFS) {
7874 if (parseTypeAndValue(
Address, AddrLoc, PFS) ||
7875 parseToken(
lltok::comma,
"expected ',' after indirectbr address") ||
7879 if (!
Address->getType()->isPointerTy())
7880 return error(AddrLoc,
"indirectbr address must have pointer type");
7883 SmallVector<BasicBlock*, 16> DestList;
7887 if (parseTypeAndBasicBlock(DestBB, PFS))
7892 if (parseTypeAndBasicBlock(DestBB, PFS))
7898 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
7902 for (BasicBlock *Dest : DestList)
7912 FunctionType *&FuncTy) {
7918 for (
const ParamInfo &Arg : ArgList)
7932bool LLParser::parseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
7933 LocTy CallLoc = Lex.getLoc();
7934 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
7935 std::vector<unsigned> FwdRefAttrGrps;
7938 unsigned InvokeAddrSpace;
7939 Type *RetType =
nullptr;
7946 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7947 parseOptionalProgramAddrSpace(InvokeAddrSpace) ||
7948 parseType(RetType, RetTypeLoc,
true ) ||
7949 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
7950 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
7952 parseOptionalOperandBundles(BundleList, PFS) ||
7954 parseTypeAndBasicBlock(NormalBB, PFS) ||
7956 parseTypeAndBasicBlock(UnwindBB, PFS))
7963 if (resolveFunctionType(RetType, ArgList, Ty))
7964 return error(RetTypeLoc,
"Invalid result type for LLVM function");
7970 if (convertValIDToValue(
PointerType::get(Context, InvokeAddrSpace), CalleeID,
7975 SmallVector<Value *, 8>
Args;
7982 for (
const ParamInfo &Arg : ArgList) {
7983 Type *ExpectedTy =
nullptr;
7986 }
else if (!Ty->isVarArg()) {
7987 return error(Arg.Loc,
"too many arguments specified");
7990 if (ExpectedTy && ExpectedTy != Arg.V->getType())
7991 return error(Arg.Loc,
"argument is not of expected type '" +
7993 Args.push_back(Arg.V);
7998 return error(CallLoc,
"not enough parameters specified for call");
8007 II->setCallingConv(CC);
8008 II->setAttributes(PAL);
8009 ForwardRefAttrGroups[
II] = FwdRefAttrGrps;
8016bool LLParser::parseResume(Instruction *&Inst, PerFunctionState &PFS) {
8018 if (parseTypeAndValue(Exn, ExnLoc, PFS))
8026bool LLParser::parseExceptionArgs(SmallVectorImpl<Value *> &Args,
8027 PerFunctionState &PFS) {
8028 if (parseToken(
lltok::lsquare,
"expected '[' in catchpad/cleanuppad"))
8033 if (!
Args.empty() &&
8034 parseToken(
lltok::comma,
"expected ',' in argument list"))
8039 Type *ArgTy =
nullptr;
8040 if (parseType(ArgTy, ArgLoc))
8045 if (parseMetadataAsValue(V, PFS))
8048 if (parseValue(ArgTy, V, PFS))
8060bool LLParser::parseCleanupRet(Instruction *&Inst, PerFunctionState &PFS) {
8061 Value *CleanupPad =
nullptr;
8063 if (parseToken(
lltok::kw_from,
"expected 'from' after cleanupret"))
8078 if (parseTypeAndBasicBlock(UnwindBB, PFS)) {
8089bool LLParser::parseCatchRet(Instruction *&Inst, PerFunctionState &PFS) {
8090 Value *CatchPad =
nullptr;
8092 if (parseToken(
lltok::kw_from,
"expected 'from' after catchret"))
8099 if (parseToken(
lltok::kw_to,
"expected 'to' in catchret") ||
8100 parseTypeAndBasicBlock(BB, PFS))
8109bool LLParser::parseCatchSwitch(Instruction *&Inst, PerFunctionState &PFS) {
8117 return tokError(
"expected scope value for catchswitch");
8122 if (parseToken(
lltok::lsquare,
"expected '[' with catchswitch labels"))
8128 if (parseTypeAndBasicBlock(DestBB, PFS))
8133 if (parseToken(
lltok::rsquare,
"expected ']' after catchswitch labels"))
8136 if (parseToken(
lltok::kw_unwind,
"expected 'unwind' after catchswitch scope"))
8144 if (parseTypeAndBasicBlock(UnwindBB, PFS))
8150 for (BasicBlock *DestBB : Table)
8151 CatchSwitch->addHandler(DestBB);
8158bool LLParser::parseCatchPad(Instruction *&Inst, PerFunctionState &PFS) {
8159 Value *CatchSwitch =
nullptr;
8165 return tokError(
"expected scope value for catchpad");
8170 SmallVector<Value *, 8>
Args;
8171 if (parseExceptionArgs(Args, PFS))
8180bool LLParser::parseCleanupPad(Instruction *&Inst, PerFunctionState &PFS) {
8181 Value *ParentPad =
nullptr;
8188 return tokError(
"expected scope value for cleanuppad");
8193 SmallVector<Value *, 8>
Args;
8194 if (parseExceptionArgs(Args, PFS))
8210bool LLParser::parseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
8211 unsigned Opc,
bool IsFP) {
8213 if (parseTypeAndValue(
LHS, Loc, PFS))
8220 return error(Loc,
"invalid operand type for instruction");
8230bool LLParser::parseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
8231 LocTy CallLoc = Lex.getLoc();
8232 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8233 std::vector<unsigned> FwdRefAttrGrps;
8236 Type *RetType =
nullptr;
8243 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8244 parseType(RetType, RetTypeLoc,
true ) ||
8245 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
8246 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
8248 parseOptionalOperandBundles(BundleList, PFS) ||
8250 parseTypeAndBasicBlock(DefaultDest, PFS) ||
8255 SmallVector<BasicBlock *, 16> IndirectDests;
8259 if (parseTypeAndBasicBlock(DestBB, PFS))
8264 if (parseTypeAndBasicBlock(DestBB, PFS))
8270 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
8277 if (resolveFunctionType(RetType, ArgList, Ty))
8278 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8289 SmallVector<Value *, 8>
Args;
8296 for (
const ParamInfo &Arg : ArgList) {
8297 Type *ExpectedTy =
nullptr;
8300 }
else if (!Ty->isVarArg()) {
8301 return error(Arg.Loc,
"too many arguments specified");
8304 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8305 return error(Arg.Loc,
"argument is not of expected type '" +
8307 Args.push_back(Arg.V);
8312 return error(CallLoc,
"not enough parameters specified for call");
8324 ForwardRefAttrGroups[CBI] = FwdRefAttrGrps;
8338bool LLParser::parseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
8339 unsigned Opc,
bool IsFP) {
8341 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8342 parseToken(
lltok::comma,
"expected ',' in arithmetic operation") ||
8350 return error(Loc,
"invalid operand type for instruction");
8358bool LLParser::parseLogical(Instruction *&Inst, PerFunctionState &PFS,
8361 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8362 parseToken(
lltok::comma,
"expected ',' in logical operation") ||
8368 "instruction requires integer or integer vector operands");
8377bool LLParser::parseCompare(Instruction *&Inst, PerFunctionState &PFS,
8383 if (parseCmpPredicate(Pred,
Opc) || parseTypeAndValue(
LHS, Loc, PFS) ||
8384 parseToken(
lltok::comma,
"expected ',' after compare value") ||
8388 if (
Opc == Instruction::FCmp) {
8390 return error(Loc,
"fcmp requires floating point operands");
8393 assert(
Opc == Instruction::ICmp &&
"Unknown opcode for CmpInst!");
8396 return error(Loc,
"icmp requires integer operands");
8408bool LLParser::parseCast(Instruction *&Inst, PerFunctionState &PFS,
8412 Type *DestTy =
nullptr;
8413 if (parseTypeAndValue(
Op, Loc, PFS) ||
8414 parseToken(
lltok::kw_to,
"expected 'to' after cast value") ||
8419 return error(Loc,
"invalid cast opcode for cast from '" +
8428bool LLParser::parseSelect(Instruction *&Inst, PerFunctionState &PFS) {
8430 Value *Op0, *Op1, *Op2;
8431 if (parseTypeAndValue(Op0, Loc, PFS) ||
8432 parseToken(
lltok::comma,
"expected ',' after select condition") ||
8433 parseTypeAndValue(Op1, PFS) ||
8434 parseToken(
lltok::comma,
"expected ',' after select value") ||
8435 parseTypeAndValue(Op2, PFS))
8439 return error(Loc, Reason);
8447bool LLParser::parseVAArg(Instruction *&Inst, PerFunctionState &PFS) {
8449 Type *EltTy =
nullptr;
8451 if (parseTypeAndValue(
Op, PFS) ||
8452 parseToken(
lltok::comma,
"expected ',' after vaarg operand") ||
8453 parseType(EltTy, TypeLoc))
8457 return error(TypeLoc,
"va_arg requires operand with first class type");
8459 Inst =
new VAArgInst(
Op, EltTy);
8465bool LLParser::parseExtractElement(Instruction *&Inst, PerFunctionState &PFS) {
8468 if (parseTypeAndValue(Op0, Loc, PFS) ||
8469 parseToken(
lltok::comma,
"expected ',' after extract value") ||
8470 parseTypeAndValue(Op1, PFS))
8474 return error(Loc,
"invalid extractelement operands");
8482bool LLParser::parseInsertElement(Instruction *&Inst, PerFunctionState &PFS) {
8484 Value *Op0, *Op1, *Op2;
8485 if (parseTypeAndValue(Op0, Loc, PFS) ||
8486 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8487 parseTypeAndValue(Op1, PFS) ||
8488 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8489 parseTypeAndValue(Op2, PFS))
8493 return error(Loc,
"invalid insertelement operands");
8501bool LLParser::parseShuffleVector(Instruction *&Inst, PerFunctionState &PFS) {
8503 Value *Op0, *Op1, *Op2;
8504 if (parseTypeAndValue(Op0, Loc, PFS) ||
8505 parseToken(
lltok::comma,
"expected ',' after shuffle mask") ||
8506 parseTypeAndValue(Op1, PFS) ||
8507 parseToken(
lltok::comma,
"expected ',' after shuffle value") ||
8508 parseTypeAndValue(Op2, PFS))
8512 return error(Loc,
"invalid shufflevector operands");
8514 Inst =
new ShuffleVectorInst(Op0, Op1, Op2);
8520int LLParser::parsePHI(Instruction *&Inst, PerFunctionState &PFS) {
8524 if (parseType(Ty, TypeLoc))
8528 return error(TypeLoc,
"phi node must have first class type");
8531 bool AteExtraComma =
false;
8543 AteExtraComma =
true;
8547 if (parseToken(
lltok::lsquare,
"expected '[' in phi value list") ||
8548 parseValue(Ty, Op0, PFS) ||
8549 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8558 for (
const auto &[Val, BB] : PHIVals)
8561 return AteExtraComma ? InstExtraComma : InstNormal;
8570bool LLParser::parseLandingPad(Instruction *&Inst, PerFunctionState &PFS) {
8573 if (parseType(Ty, TyLoc))
8586 return tokError(
"expected 'catch' or 'filter' clause type");
8590 if (parseTypeAndValue(V, VLoc, PFS))
8597 return error(VLoc,
"'catch' clause has an invalid type");
8600 return error(VLoc,
"'filter' clause has an invalid type");
8605 return error(VLoc,
"clause argument must be a constant");
8609 Inst = LP.release();
8615bool LLParser::parseFreeze(Instruction *&Inst, PerFunctionState &PFS) {
8618 if (parseTypeAndValue(
Op, Loc, PFS))
8621 Inst =
new FreezeInst(
Op);
8634bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS,
8636 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8637 std::vector<unsigned> FwdRefAttrGrps;
8639 unsigned CallAddrSpace;
8641 Type *RetType =
nullptr;
8646 LocTy CallLoc = Lex.getLoc();
8650 "expected 'tail call', 'musttail call', or 'notail call'"))
8653 FastMathFlags FMF = EatFastMathFlagsIfPresent();
8655 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8656 parseOptionalProgramAddrSpace(CallAddrSpace) ||
8657 parseType(RetType, RetTypeLoc,
true ) ||
8658 parseValID(CalleeID, &PFS) ||
8660 PFS.getFunction().isVarArg()) ||
8661 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false, BuiltinLoc) ||
8662 parseOptionalOperandBundles(BundleList, PFS))
8669 if (resolveFunctionType(RetType, ArgList, Ty))
8670 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8676 if (convertValIDToValue(
PointerType::get(Context, CallAddrSpace), CalleeID,
8683 SmallVector<Value*, 8>
Args;
8689 for (
const ParamInfo &Arg : ArgList) {
8690 Type *ExpectedTy =
nullptr;
8693 }
else if (!Ty->isVarArg()) {
8694 return error(Arg.Loc,
"too many arguments specified");
8697 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8698 return error(Arg.Loc,
"argument is not of expected type '" +
8700 Args.push_back(Arg.V);
8701 Attrs.push_back(Arg.Attrs);
8705 return error(CallLoc,
"not enough parameters specified for call");
8718 return error(CallLoc,
"fast-math-flags specified for call without "
8719 "floating-point scalar or vector return type");
8726 if (SeenNewDbgInfoFormat) {
8728 return error(CallLoc,
"llvm.dbg intrinsic should not appear in a module "
8729 "using non-intrinsic debug info");
8731 SeenOldDbgInfoFormat =
true;
8734 ForwardRefAttrGroups[CI] = FwdRefAttrGrps;
8746int LLParser::parseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
8748 LocTy SizeLoc, TyLoc, ASLoc;
8749 MaybeAlign Alignment;
8750 unsigned AddrSpace = 0;
8753 bool IsInAlloca = EatIfPresent(lltok::kw_inalloca);
8754 bool IsSwiftError = EatIfPresent(lltok::kw_swifterror);
8756 if (parseType(Ty, TyLoc))
8760 return error(TyLoc,
"invalid type for alloca");
8762 bool AteExtraComma =
false;
8764 if (Lex.getKind() == lltok::kw_align) {
8765 if (parseOptionalAlignment(Alignment))
8767 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8770 ASLoc = Lex.getLoc();
8771 if (parseOptionalAddrSpace(AddrSpace))
8774 AteExtraComma =
true;
8776 if (parseTypeAndValue(
Size, SizeLoc, PFS))
8779 if (Lex.getKind() == lltok::kw_align) {
8780 if (parseOptionalAlignment(Alignment))
8782 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8785 ASLoc = Lex.getLoc();
8786 if (parseOptionalAddrSpace(AddrSpace))
8789 AteExtraComma =
true;
8795 if (
Size && !
Size->getType()->isIntegerTy())
8796 return error(SizeLoc,
"element count must have integer type");
8798 SmallPtrSet<Type *, 4> Visited;
8799 if (!Alignment && !Ty->
isSized(&Visited))
8800 return error(TyLoc,
"Cannot allocate unsized type");
8802 Alignment = M->getDataLayout().getPrefTypeAlign(Ty);
8803 AllocaInst *AI =
new AllocaInst(Ty, AddrSpace,
Size, *Alignment);
8807 return AteExtraComma ? InstExtraComma : InstNormal;
8814int LLParser::parseLoad(Instruction *&Inst, PerFunctionState &PFS) {
8816 MaybeAlign Alignment;
8817 bool AteExtraComma =
false;
8818 bool isAtomic =
false;
8827 bool isVolatile =
false;
8834 LocTy ExplicitTypeLoc = Lex.getLoc();
8835 if (parseType(Ty) ||
8836 parseToken(
lltok::comma,
"expected comma after load's type") ||
8837 parseTypeAndValue(Val, Loc, PFS) ||
8838 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8839 parseOptionalCommaAlign(Alignment, AteExtraComma))
8843 return error(Loc,
"load operand must be a pointer to a first class type");
8844 if (isAtomic && !Alignment)
8845 return error(Loc,
"atomic load must have explicit non-zero alignment");
8848 return error(Loc,
"atomic load cannot use Release ordering");
8850 SmallPtrSet<Type *, 4> Visited;
8851 if (!Alignment && !Ty->
isSized(&Visited))
8852 return error(ExplicitTypeLoc,
"loading unsized types is not allowed");
8854 Alignment = M->getDataLayout().getABITypeAlign(Ty);
8855 Inst =
new LoadInst(Ty, Val,
"", isVolatile, *Alignment, Ordering, SSID);
8856 return AteExtraComma ? InstExtraComma : InstNormal;
8864int LLParser::parseStore(Instruction *&Inst, PerFunctionState &PFS) {
8866 MaybeAlign Alignment;
8867 bool AteExtraComma =
false;
8868 bool isAtomic =
false;
8877 bool isVolatile =
false;
8883 if (parseTypeAndValue(Val, Loc, PFS) ||
8884 parseToken(
lltok::comma,
"expected ',' after store operand") ||
8885 parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8886 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8887 parseOptionalCommaAlign(Alignment, AteExtraComma))
8891 return error(PtrLoc,
"store operand must be a pointer");
8893 return error(Loc,
"store operand must be a first class value");
8894 if (isAtomic && !Alignment)
8895 return error(Loc,
"atomic store must have explicit non-zero alignment");
8898 return error(Loc,
"atomic store cannot use Acquire ordering");
8899 SmallPtrSet<Type *, 4> Visited;
8901 return error(Loc,
"storing unsized types is not allowed");
8903 Alignment = M->getDataLayout().getABITypeAlign(Val->
getType());
8905 Inst =
new StoreInst(Val, Ptr, isVolatile, *Alignment, Ordering, SSID);
8906 return AteExtraComma ? InstExtraComma : InstNormal;
8913int LLParser::parseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {
8915 bool AteExtraComma =
false;
8919 bool isVolatile =
false;
8920 bool isWeak =
false;
8921 MaybeAlign Alignment;
8929 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8930 parseToken(
lltok::comma,
"expected ',' after cmpxchg address") ||
8931 parseTypeAndValue(Cmp, CmpLoc, PFS) ||
8932 parseToken(
lltok::comma,
"expected ',' after cmpxchg cmp operand") ||
8933 parseTypeAndValue(New, NewLoc, PFS) ||
8934 parseScopeAndOrdering(
true , SSID, SuccessOrdering) ||
8935 parseOrdering(FailureOrdering) ||
8936 parseOptionalCommaAlign(Alignment, AteExtraComma))
8940 return tokError(
"invalid cmpxchg success ordering");
8942 return tokError(
"invalid cmpxchg failure ordering");
8944 return error(PtrLoc,
"cmpxchg operand must be a pointer");
8945 if (
Cmp->getType() !=
New->getType())
8946 return error(NewLoc,
"compare value and new value type do not match");
8947 if (!
New->getType()->isFirstClassType())
8948 return error(NewLoc,
"cmpxchg operand must be a first class value");
8950 const Align DefaultAlignment(
8951 PFS.getFunction().getDataLayout().getTypeStoreSize(
8954 AtomicCmpXchgInst *CXI =
8955 new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment.value_or(DefaultAlignment),
8956 SuccessOrdering, FailureOrdering, SSID);
8961 return AteExtraComma ? InstExtraComma : InstNormal;
8967int LLParser::parseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {
8969 bool AteExtraComma =
false;
8972 bool isVolatile =
false;
8975 MaybeAlign Alignment;
8980 switch (Lex.getKind()) {
8982 return tokError(
"expected binary operation in atomicrmw");
9041 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
9042 parseToken(
lltok::comma,
"expected ',' after atomicrmw address") ||
9043 parseTypeAndValue(Val, ValLoc, PFS) ||
9044 parseScopeAndOrdering(
true , SSID, Ordering) ||
9045 parseOptionalCommaAlign(Alignment, AteExtraComma))
9049 return tokError(
"atomicrmw cannot be unordered");
9051 return error(PtrLoc,
"atomicrmw operand must be a pointer");
9053 return error(ValLoc,
"atomicrmw operand may not be scalable");
9062 " operand must be an integer, floating point, or pointer type");
9066 return error(ValLoc,
"atomicrmw " +
9068 " operand must be a floating point type");
9072 return error(ValLoc,
"atomicrmw " +
9074 " operand must be an integer");
9079 PFS.getFunction().getDataLayout().getTypeStoreSizeInBits(
9082 return error(ValLoc,
"atomicrmw operand must be power-of-two byte-sized"
9084 const Align DefaultAlignment(
9085 PFS.getFunction().getDataLayout().getTypeStoreSize(
9087 AtomicRMWInst *RMWI =
9089 Alignment.value_or(DefaultAlignment), Ordering, SSID);
9092 return AteExtraComma ? InstExtraComma : InstNormal;
9097int LLParser::parseFence(Instruction *&Inst, PerFunctionState &PFS) {
9100 if (parseScopeAndOrdering(
true , SSID, Ordering))
9104 return tokError(
"fence cannot be unordered");
9106 return tokError(
"fence cannot be monotonic");
9108 Inst =
new FenceInst(Context, Ordering, SSID);
9114int LLParser::parseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
9115 Value *Ptr =
nullptr;
9116 Value *Val =
nullptr;
9132 if (parseType(Ty) ||
9133 parseToken(
lltok::comma,
"expected comma after getelementptr's type") ||
9134 parseTypeAndValue(Ptr, Loc, PFS))
9139 if (!BasePointerType)
9140 return error(Loc,
"base of getelementptr must be a pointer");
9142 SmallVector<Value*, 16> Indices;
9143 bool AteExtraComma =
false;
9146 ElementCount GEPWidth =
BaseType->isVectorTy()
9152 AteExtraComma =
true;
9155 if (parseTypeAndValue(Val, EltLoc, PFS))
9158 return error(EltLoc,
"getelementptr index must be an integer");
9161 ElementCount ValNumEl = ValVTy->getElementCount();
9165 "getelementptr vector index has a wrong number of elements");
9166 GEPWidth = ValNumEl;
9171 SmallPtrSet<Type*, 4> Visited;
9173 return error(Loc,
"base element of getelementptr must be sized");
9177 return error(Loc,
"getelementptr cannot target structure that contains "
9178 "scalable vector type");
9181 return error(Loc,
"invalid getelementptr indices");
9184 GEP->setNoWrapFlags(NW);
9185 return AteExtraComma ? InstExtraComma : InstNormal;
9190int LLParser::parseExtractValue(Instruction *&Inst, PerFunctionState &PFS) {
9192 SmallVector<unsigned, 4> Indices;
9194 if (parseTypeAndValue(Val, Loc, PFS) ||
9195 parseIndexList(Indices, AteExtraComma))
9199 return error(Loc,
"extractvalue operand must be aggregate type");
9202 return error(Loc,
"invalid indices for extractvalue");
9204 return AteExtraComma ? InstExtraComma : InstNormal;
9209int LLParser::parseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
9211 SmallVector<unsigned, 4> Indices;
9213 if (parseTypeAndValue(Val0, Loc0, PFS) ||
9214 parseToken(
lltok::comma,
"expected comma after insertvalue operand") ||
9215 parseTypeAndValue(Val1, Loc1, PFS) ||
9216 parseIndexList(Indices, AteExtraComma))
9220 return error(Loc0,
"insertvalue operand must be aggregate type");
9224 return error(Loc0,
"invalid indices for insertvalue");
9225 if (IndexedType != Val1->
getType())
9226 return error(Loc1,
"insertvalue operand and field disagree in type: '" +
9230 return AteExtraComma ? InstExtraComma : InstNormal;
9241bool LLParser::parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts) {
9256 if (parseMetadata(MD,
nullptr))
9261 return parseToken(
lltok::rbrace,
"expected end of metadata node");
9267bool LLParser::sortUseListOrder(
Value *V, ArrayRef<unsigned> Indexes,
9269 if (!
V->hasUseList())
9272 return error(Loc,
"value has no uses");
9274 unsigned NumUses = 0;
9275 SmallDenseMap<const Use *, unsigned, 16> Order;
9276 for (
const Use &U :
V->uses()) {
9277 if (++NumUses > Indexes.
size())
9279 Order[&
U] = Indexes[NumUses - 1];
9282 return error(Loc,
"value only has one use");
9283 if (Order.
size() != Indexes.
size() || NumUses > Indexes.
size())
9285 "wrong number of indexes, expected " + Twine(
V->getNumUses()));
9287 V->sortUseList([&](
const Use &L,
const Use &R) {
9295bool LLParser::parseUseListOrderIndexes(SmallVectorImpl<unsigned> &Indexes) {
9296 SMLoc Loc = Lex.getLoc();
9300 return tokError(
"expected non-empty list of uselistorder indexes");
9307 bool IsOrdered =
true;
9308 assert(Indexes.
empty() &&
"Expected empty order vector");
9311 if (parseUInt32(Index))
9316 Max = std::max(Max, Index);
9317 IsOrdered &= Index == Indexes.
size();
9325 if (Indexes.
size() < 2)
9326 return error(Loc,
"expected >= 2 uselistorder indexes");
9329 "expected distinct uselistorder indexes in range [0, size)");
9331 return error(Loc,
"expected uselistorder indexes to change the order");
9338bool LLParser::parseUseListOrder(PerFunctionState *PFS) {
9339 SMLoc Loc = Lex.getLoc();
9344 SmallVector<unsigned, 16> Indexes;
9345 if (parseTypeAndValue(V, PFS) ||
9346 parseToken(
lltok::comma,
"expected comma in uselistorder directive") ||
9347 parseUseListOrderIndexes(Indexes))
9350 return sortUseListOrder(V, Indexes, Loc);
9355bool LLParser::parseUseListOrderBB() {
9357 SMLoc Loc = Lex.getLoc();
9361 SmallVector<unsigned, 16> Indexes;
9362 if (parseValID(Fn,
nullptr) ||
9363 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9364 parseValID(Label,
nullptr) ||
9365 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9366 parseUseListOrderIndexes(Indexes))
9372 GV = M->getNamedValue(Fn.
StrVal);
9374 GV = NumberedVals.get(Fn.
UIntVal);
9376 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9379 "invalid function forward reference in uselistorder_bb");
9382 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9383 if (
F->isDeclaration())
9384 return error(Fn.
Loc,
"invalid declaration in uselistorder_bb");
9388 return error(
Label.Loc,
"invalid numeric label in uselistorder_bb");
9390 return error(
Label.Loc,
"expected basic block name in uselistorder_bb");
9391 Value *
V =
F->getValueSymbolTable()->lookup(
Label.StrVal);
9393 return error(
Label.Loc,
"invalid basic block in uselistorder_bb");
9395 return error(
Label.Loc,
"expected basic block in uselistorder_bb");
9397 return sortUseListOrder(V, Indexes, Loc);
9403bool LLParser::parseModuleEntry(
unsigned ID) {
9412 parseStringConstant(Path) ||
9420 if (parseUInt32(Hash[0]) || parseToken(
lltok::comma,
"expected ',' here") ||
9421 parseUInt32(Hash[1]) || parseToken(
lltok::comma,
"expected ',' here") ||
9422 parseUInt32(Hash[2]) || parseToken(
lltok::comma,
"expected ',' here") ||
9423 parseUInt32(Hash[3]) || parseToken(
lltok::comma,
"expected ',' here") ||
9424 parseUInt32(Hash[4]))
9431 auto ModuleEntry = Index->addModule(Path, Hash);
9432 ModuleIdMap[
ID] = ModuleEntry->first();
9439bool LLParser::parseTypeIdEntry(
unsigned ID) {
9448 parseStringConstant(Name))
9451 TypeIdSummary &TIS = Index->getOrInsertTypeIdSummary(Name);
9453 parseTypeIdSummary(TIS) || parseToken(
lltok::rparen,
"expected ')' here"))
9458 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9459 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9460 for (
auto TIDRef : FwdRefTIDs->second) {
9462 "Forward referenced type id GUID expected to be 0");
9465 ForwardRefTypeIds.erase(FwdRefTIDs);
9473bool LLParser::parseTypeIdSummary(TypeIdSummary &TIS) {
9477 parseTypeTestResolution(TIS.
TTRes))
9482 if (parseOptionalWpdResolutions(TIS.
WPDRes))
9493 ValueInfo(
false, (GlobalValueSummaryMapTy::value_type *)-8);
9499bool LLParser::parseTypeIdCompatibleVtableEntry(
unsigned ID) {
9508 parseStringConstant(Name))
9512 Index->getOrInsertTypeIdCompatibleVtableSummary(Name);
9519 IdToIndexMapType IdToIndexMap;
9532 if (parseGVReference(VI, GVId))
9539 IdToIndexMap[GVId].push_back(std::make_pair(TI.size(),
Loc));
9540 TI.push_back({
Offset, VI});
9548 for (
auto I : IdToIndexMap) {
9549 auto &Infos = ForwardRefValueInfos[
I.first];
9550 for (
auto P :
I.second) {
9552 "Forward referenced ValueInfo expected to be empty");
9553 Infos.emplace_back(&TI[
P.first].VTableVI,
P.second);
9563 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9564 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9565 for (
auto TIDRef : FwdRefTIDs->second) {
9567 "Forward referenced type id GUID expected to be 0");
9570 ForwardRefTypeIds.erase(FwdRefTIDs);
9582bool LLParser::parseTypeTestResolution(TypeTestResolution &TTRes) {
9590 switch (Lex.getKind()) {
9610 return error(Lex.getLoc(),
"unexpected TypeTestResolution kind");
9622 switch (Lex.getKind()) {
9637 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(Val))
9650 return error(Lex.getLoc(),
"expected optional TypeTestResolution field");
9663bool LLParser::parseOptionalWpdResolutions(
9664 std::map<uint64_t, WholeProgramDevirtResolution> &WPDResMap) {
9672 WholeProgramDevirtResolution WPDRes;
9676 parseToken(
lltok::comma,
"expected ',' here") || parseWpdRes(WPDRes) ||
9679 WPDResMap[
Offset] = WPDRes;
9696bool LLParser::parseWpdRes(WholeProgramDevirtResolution &WPDRes) {
9704 switch (Lex.getKind()) {
9715 return error(Lex.getLoc(),
"unexpected WholeProgramDevirtResolution kind");
9721 switch (Lex.getKind()) {
9729 if (parseOptionalResByArg(WPDRes.
ResByArg))
9733 return error(Lex.getLoc(),
9734 "expected optional WholeProgramDevirtResolution field");
9751bool LLParser::parseOptionalResByArg(
9752 std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>
9760 std::vector<uint64_t>
Args;
9761 if (parseArgs(Args) || parseToken(
lltok::comma,
"expected ',' here") ||
9769 WholeProgramDevirtResolution::ByArg ByArg;
9770 switch (Lex.getKind()) {
9784 return error(Lex.getLoc(),
9785 "unexpected WholeProgramDevirtResolution::ByArg kind");
9791 switch (Lex.getKind()) {
9795 parseUInt64(ByArg.
Info))
9801 parseUInt32(ByArg.
Byte))
9807 parseUInt32(ByArg.
Bit))
9811 return error(Lex.getLoc(),
9812 "expected optional whole program devirt field");
9819 ResByArg[
Args] = ByArg;
9830bool LLParser::parseArgs(std::vector<uint64_t> &Args) {
9838 if (parseUInt64(Val))
9840 Args.push_back(Val);
9849static const auto FwdVIRef = (GlobalValueSummaryMapTy::value_type *)-8;
9864bool LLParser::addGlobalValueToIndex(
9866 unsigned ID, std::unique_ptr<GlobalValueSummary> Summary,
LocTy Loc) {
9871 VI = Index->getOrInsertValueInfo(GUID);
9875 auto *GV = M->getNamedValue(Name);
9877 return error(Loc,
"Reference to undefined global \"" + Name +
"\"");
9879 VI = Index->getOrInsertValueInfo(GV);
9883 "Need a source_filename to compute GUID for local");
9886 VI = Index->getOrInsertValueInfo(GUID, Index->saveString(Name));
9891 auto FwdRefVIs = ForwardRefValueInfos.find(
ID);
9892 if (FwdRefVIs != ForwardRefValueInfos.end()) {
9893 for (
auto VIRef : FwdRefVIs->second) {
9895 "Forward referenced ValueInfo expected to be empty");
9898 ForwardRefValueInfos.erase(FwdRefVIs);
9902 auto FwdRefAliasees = ForwardRefAliasees.find(
ID);
9903 if (FwdRefAliasees != ForwardRefAliasees.end()) {
9904 for (
auto AliaseeRef : FwdRefAliasees->second) {
9905 assert(!AliaseeRef.first->hasAliasee() &&
9906 "Forward referencing alias already has aliasee");
9907 assert(Summary &&
"Aliasee must be a definition");
9908 AliaseeRef.first->setAliasee(VI,
Summary.get());
9910 ForwardRefAliasees.erase(FwdRefAliasees);
9915 Index->addGlobalValueSummary(VI, std::move(Summary));
9918 if (
ID == NumberedValueInfos.size())
9919 NumberedValueInfos.push_back(VI);
9922 if (
ID > NumberedValueInfos.size())
9923 NumberedValueInfos.resize(
ID + 1);
9924 NumberedValueInfos[
ID] =
VI;
9932bool LLParser::parseSummaryIndexFlags() {
9939 if (parseUInt64(Flags))
9942 Index->setFlags(Flags);
9948bool LLParser::parseBlockCount() {
9954 uint64_t BlockCount;
9955 if (parseUInt64(BlockCount))
9958 Index->setBlockCount(BlockCount);
9966bool LLParser::parseGVEntry(
unsigned ID) {
9974 LocTy Loc = Lex.getLoc();
9977 switch (Lex.getKind()) {
9981 parseStringConstant(Name))
9987 if (parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(GUID))
9991 return error(Lex.getLoc(),
"expected name or guid tag");
10014 switch (Lex.getKind()) {
10016 if (parseFunctionSummary(Name, GUID,
ID))
10020 if (parseVariableSummary(Name, GUID,
ID))
10024 if (parseAliasSummary(Name, GUID,
ID))
10028 return error(Lex.getLoc(),
"expected summary type");
10046 LocTy Loc = Lex.getLoc();
10050 StringRef ModulePath;
10051 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
10054 false,
false,
false,
10056 unsigned InstCount;
10058 FunctionSummary::TypeIdInfo TypeIdInfo;
10059 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
10061 std::vector<CallsiteInfo> Callsites;
10062 std::vector<AllocInfo> Allocs;
10064 FunctionSummary::FFlags FFlags = {};
10067 parseModuleReference(ModulePath) ||
10068 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
10071 parseToken(
lltok::colon,
"expected ':' here") || parseUInt32(InstCount))
10076 switch (Lex.getKind()) {
10078 if (parseOptionalFFlags(FFlags))
10082 if (parseOptionalCalls(Calls))
10086 if (parseOptionalTypeIdInfo(TypeIdInfo))
10090 if (parseOptionalRefs(Refs))
10094 if (parseOptionalParamAccesses(ParamAccesses))
10098 if (parseOptionalAllocs(Allocs))
10102 if (parseOptionalCallsites(Callsites))
10106 return error(Lex.getLoc(),
"expected optional function summary field");
10113 auto FS = std::make_unique<FunctionSummary>(
10114 GVFlags, InstCount, FFlags, std::move(Refs), std::move(Calls),
10120 std::move(ParamAccesses), std::move(Callsites), std::move(Allocs));
10122 FS->setModulePath(ModulePath);
10124 return addGlobalValueToIndex(Name, GUID,
10126 std::move(FS), Loc);
10134 LocTy Loc = Lex.getLoc();
10138 StringRef ModulePath;
10139 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
10142 false,
false,
false,
10144 GlobalVarSummary::GVarFlags GVarFlags(
false,
10152 parseModuleReference(ModulePath) ||
10153 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
10155 parseGVarFlags(GVarFlags))
10160 switch (Lex.getKind()) {
10162 if (parseOptionalVTableFuncs(VTableFuncs))
10166 if (parseOptionalRefs(Refs))
10170 return error(Lex.getLoc(),
"expected optional variable summary field");
10178 std::make_unique<GlobalVarSummary>(GVFlags, GVarFlags, std::move(Refs));
10180 GS->setModulePath(ModulePath);
10181 GS->setVTableFuncs(std::move(VTableFuncs));
10183 return addGlobalValueToIndex(Name, GUID,
10185 std::move(GS), Loc);
10194 LocTy Loc = Lex.getLoc();
10197 StringRef ModulePath;
10198 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
10201 false,
false,
false,
10205 parseModuleReference(ModulePath) ||
10206 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
10212 ValueInfo AliaseeVI;
10214 auto AS = std::make_unique<AliasSummary>(GVFlags);
10215 AS->setModulePath(ModulePath);
10218 if (parseGVReference(AliaseeVI, GVId))
10223 ForwardRefAliasees[GVId].emplace_back(AS.get(), Loc);
10225 auto Summary = Index->findSummaryInModule(AliaseeVI, ModulePath);
10226 assert(Summary &&
"Aliasee must be a definition");
10227 AS->setAliasee(AliaseeVI, Summary);
10234 return addGlobalValueToIndex(Name, GUID,
10236 std::move(AS), Loc);
10241bool LLParser::parseFlag(
unsigned &Val) {
10242 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
10243 return tokError(
"expected integer");
10244 Val = (unsigned)Lex.getAPSIntVal().getBoolValue();
10260bool LLParser::parseOptionalFFlags(FunctionSummary::FFlags &FFlags) {
10264 if (parseToken(
lltok::colon,
"expected ':' in funcFlags") ||
10270 switch (Lex.getKind()) {
10273 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10279 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10285 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10291 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10297 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10303 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10309 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10315 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10321 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10327 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10332 return error(Lex.getLoc(),
"expected function flag type");
10336 if (parseToken(
lltok::rparen,
"expected ')' in funcFlags"))
10347bool LLParser::parseOptionalCalls(
10348 SmallVectorImpl<FunctionSummary::EdgeTy> &Calls) {
10352 if (parseToken(
lltok::colon,
"expected ':' in calls") ||
10356 IdToIndexMapType IdToIndexMap;
10365 LocTy Loc = Lex.getLoc();
10367 if (parseGVReference(VI, GVId))
10371 unsigned RelBF = 0;
10372 unsigned HasTailCall =
false;
10376 switch (Lex.getKind()) {
10379 if (parseToken(
lltok::colon,
"expected ':'") || parseHotness(Hotness))
10385 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(RelBF))
10390 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(HasTailCall))
10394 return error(Lex.getLoc(),
"expected hotness, relbf, or tail");
10401 IdToIndexMap[GVId].push_back(std::make_pair(Calls.
size(), Loc));
10411 for (
auto I : IdToIndexMap) {
10412 auto &Infos = ForwardRefValueInfos[
I.first];
10413 for (
auto P :
I.second) {
10415 "Forward referenced ValueInfo expected to be empty");
10416 Infos.emplace_back(&Calls[
P.first].first,
P.second);
10429 switch (Lex.getKind()) {
10433 case lltok::kw_cold:
10439 case lltok::kw_hot:
10446 return error(Lex.getLoc(),
"invalid call edge hotness");
10455bool LLParser::parseOptionalVTableFuncs(
VTableFuncList &VTableFuncs) {
10459 if (parseToken(
lltok::colon,
"expected ':' in vTableFuncs") ||
10463 IdToIndexMapType IdToIndexMap;
10467 if (parseToken(
lltok::lparen,
"expected '(' in vTableFunc") ||
10472 LocTy Loc = Lex.getLoc();
10474 if (parseGVReference(VI, GVId))
10487 IdToIndexMap[GVId].push_back(std::make_pair(VTableFuncs.size(), Loc));
10488 VTableFuncs.push_back({
VI,
Offset});
10490 if (parseToken(
lltok::rparen,
"expected ')' in vTableFunc"))
10496 for (
auto I : IdToIndexMap) {
10497 auto &Infos = ForwardRefValueInfos[
I.first];
10498 for (
auto P :
I.second) {
10500 "Forward referenced ValueInfo expected to be empty");
10501 Infos.emplace_back(&VTableFuncs[
P.first].FuncVI,
P.second);
10505 if (parseToken(
lltok::rparen,
"expected ')' in vTableFuncs"))
10512bool LLParser::parseParamNo(uint64_t &ParamNo) {
10514 parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(ParamNo))
10520bool LLParser::parseParamAccessOffset(ConstantRange &
Range) {
10523 auto ParseAPSInt = [&](
APSInt &Val) {
10525 return tokError(
"expected integer");
10526 Val = Lex.getAPSIntVal();
10528 Val.setIsSigned(
true);
10550bool LLParser::parseParamAccessCall(FunctionSummary::ParamAccess::Call &
Call,
10551 IdLocListType &IdLocList) {
10559 LocTy Loc = Lex.getLoc();
10560 if (parseGVReference(VI, GVId))
10564 IdLocList.emplace_back(GVId, Loc);
10567 parseParamNo(
Call.ParamNo) ||
10569 parseParamAccessOffset(
Call.Offsets))
10581bool LLParser::parseParamAccess(FunctionSummary::ParamAccess &Param,
10582 IdLocListType &IdLocList) {
10584 parseParamNo(
Param.ParamNo) ||
10586 parseParamAccessOffset(
Param.Use))
10595 FunctionSummary::ParamAccess::Call
Call;
10596 if (parseParamAccessCall(
Call, IdLocList))
10613bool LLParser::parseOptionalParamAccesses(
10614 std::vector<FunctionSummary::ParamAccess> &Params) {
10622 IdLocListType VContexts;
10623 size_t CallsNum = 0;
10625 FunctionSummary::ParamAccess ParamAccess;
10626 if (parseParamAccess(ParamAccess, VContexts))
10628 CallsNum += ParamAccess.
Calls.size();
10629 assert(VContexts.size() == CallsNum);
10631 Params.emplace_back(std::move(ParamAccess));
10639 IdLocListType::const_iterator ItContext = VContexts.begin();
10640 for (
auto &PA : Params) {
10641 for (
auto &
C : PA.Calls) {
10643 ForwardRefValueInfos[ItContext->first].emplace_back(&
C.Callee,
10644 ItContext->second);
10648 assert(ItContext == VContexts.end());
10655bool LLParser::parseOptionalRefs(SmallVectorImpl<ValueInfo> &Refs) {
10659 if (parseToken(
lltok::colon,
"expected ':' in refs") ||
10663 struct ValueContext {
10668 std::vector<ValueContext> VContexts;
10672 VC.Loc = Lex.getLoc();
10673 if (parseGVReference(
VC.VI,
VC.GVId))
10675 VContexts.push_back(VC);
10681 llvm::sort(VContexts, [](
const ValueContext &VC1,
const ValueContext &VC2) {
10682 return VC1.VI.getAccessSpecifier() < VC2.VI.getAccessSpecifier();
10685 IdToIndexMapType IdToIndexMap;
10686 for (
auto &VC : VContexts) {
10691 IdToIndexMap[
VC.GVId].push_back(std::make_pair(Refs.
size(),
VC.Loc));
10697 for (
auto I : IdToIndexMap) {
10698 auto &Infos = ForwardRefValueInfos[
I.first];
10699 for (
auto P :
I.second) {
10701 "Forward referenced ValueInfo expected to be empty");
10702 Infos.emplace_back(&Refs[
P.first],
P.second);
10716bool LLParser::parseOptionalTypeIdInfo(
10717 FunctionSummary::TypeIdInfo &TypeIdInfo) {
10726 switch (Lex.getKind()) {
10728 if (parseTypeTests(TypeIdInfo.
TypeTests))
10752 return error(Lex.getLoc(),
"invalid typeIdInfo list type");
10756 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10765bool LLParser::parseTypeTests(std::vector<GlobalValue::GUID> &TypeTests) {
10773 IdToIndexMapType IdToIndexMap;
10777 unsigned ID = Lex.getUIntVal();
10778 LocTy Loc = Lex.getLoc();
10782 IdToIndexMap[
ID].push_back(std::make_pair(TypeTests.size(), Loc));
10784 }
else if (parseUInt64(GUID))
10786 TypeTests.push_back(GUID);
10791 for (
auto I : IdToIndexMap) {
10792 auto &Ids = ForwardRefTypeIds[
I.first];
10793 for (
auto P :
I.second) {
10794 assert(TypeTests[
P.first] == 0 &&
10795 "Forward referenced type id GUID expected to be 0");
10796 Ids.emplace_back(&TypeTests[
P.first],
P.second);
10800 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10808bool LLParser::parseVFuncIdList(
10809 lltok::Kind Kind, std::vector<FunctionSummary::VFuncId> &VFuncIdList) {
10810 assert(Lex.getKind() == Kind);
10817 IdToIndexMapType IdToIndexMap;
10819 FunctionSummary::VFuncId VFuncId;
10820 if (parseVFuncId(VFuncId, IdToIndexMap, VFuncIdList.size()))
10822 VFuncIdList.push_back(VFuncId);
10830 for (
auto I : IdToIndexMap) {
10831 auto &Ids = ForwardRefTypeIds[
I.first];
10832 for (
auto P :
I.second) {
10833 assert(VFuncIdList[
P.first].GUID == 0 &&
10834 "Forward referenced type id GUID expected to be 0");
10835 Ids.emplace_back(&VFuncIdList[
P.first].GUID,
P.second);
10844bool LLParser::parseConstVCallList(
10846 std::vector<FunctionSummary::ConstVCall> &ConstVCallList) {
10847 assert(Lex.getKind() == Kind);
10854 IdToIndexMapType IdToIndexMap;
10856 FunctionSummary::ConstVCall ConstVCall;
10857 if (parseConstVCall(ConstVCall, IdToIndexMap, ConstVCallList.size()))
10859 ConstVCallList.push_back(ConstVCall);
10867 for (
auto I : IdToIndexMap) {
10868 auto &Ids = ForwardRefTypeIds[
I.first];
10869 for (
auto P :
I.second) {
10870 assert(ConstVCallList[
P.first].VFunc.GUID == 0 &&
10871 "Forward referenced type id GUID expected to be 0");
10872 Ids.emplace_back(&ConstVCallList[
P.first].VFunc.GUID,
P.second);
10881bool LLParser::parseConstVCall(FunctionSummary::ConstVCall &ConstVCall,
10882 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10884 parseVFuncId(ConstVCall.
VFunc, IdToIndexMap, Index))
10888 if (parseArgs(ConstVCall.
Args))
10900bool LLParser::parseVFuncId(FunctionSummary::VFuncId &VFuncId,
10901 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10911 unsigned ID = Lex.getUIntVal();
10912 LocTy Loc = Lex.getLoc();
10916 IdToIndexMap[
ID].push_back(std::make_pair(Index, Loc));
10918 }
else if (parseToken(
lltok::kw_guid,
"expected 'guid' here") ||
10920 parseUInt64(VFuncId.
GUID))
10926 parseUInt64(VFuncId.
Offset) ||
10938bool LLParser::parseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
10948 switch (Lex.getKind()) {
10955 assert(HasLinkage &&
"Linkage not optional in summary entry");
10962 parseOptionalVisibility(Flag);
10967 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10973 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10979 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10985 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10994 if (parseOptionalImportType(Lex.getKind(), IK))
10996 GVFlags.
ImportType =
static_cast<unsigned>(IK);
11001 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
11006 return error(Lex.getLoc(),
"expected gv flag type");
11020bool LLParser::parseGVarFlags(GlobalVarSummary::GVarFlags &GVarFlags) {
11028 auto ParseRest = [
this](
unsigned int &Val) {
11032 return parseFlag(Val);
11037 switch (Lex.getKind()) {
11038 case lltok::kw_readonly:
11039 if (ParseRest(Flag))
11043 case lltok::kw_writeonly:
11044 if (ParseRest(Flag))
11049 if (ParseRest(Flag))
11054 if (ParseRest(Flag))
11059 return error(Lex.getLoc(),
"expected gvar flag type");
11067bool LLParser::parseModuleReference(StringRef &ModulePath) {
11074 unsigned ModuleID = Lex.getUIntVal();
11075 auto I = ModuleIdMap.find(ModuleID);
11077 assert(
I != ModuleIdMap.end());
11078 ModulePath =
I->second;
11084bool LLParser::parseGVReference(ValueInfo &VI,
unsigned &GVId) {
11087 WriteOnly = EatIfPresent(lltok::kw_writeonly);
11091 GVId = Lex.getUIntVal();
11093 if (GVId < NumberedValueInfos.size() && NumberedValueInfos[GVId]) {
11095 VI = NumberedValueInfos[GVId];
11112bool LLParser::parseOptionalAllocs(std::vector<AllocInfo> &Allocs) {
11116 if (parseToken(
lltok::colon,
"expected ':' in allocs") ||
11128 SmallVector<uint8_t> Versions;
11131 if (parseAllocType(V))
11136 if (parseToken(
lltok::rparen,
"expected ')' in versions") ||
11140 std::vector<MIBInfo> MIBs;
11141 if (parseMemProfs(MIBs))
11144 Allocs.push_back({Versions, MIBs});
11161bool LLParser::parseMemProfs(std::vector<MIBInfo> &MIBs) {
11165 if (parseToken(
lltok::colon,
"expected ':' in memprof") ||
11171 if (parseToken(
lltok::lparen,
"expected '(' in memprof") ||
11180 if (parseToken(
lltok::comma,
"expected ',' in memprof") ||
11186 SmallVector<unsigned> StackIdIndices;
11190 uint64_t StackId = 0;
11191 if (parseUInt64(StackId))
11193 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
11214bool LLParser::parseAllocType(uint8_t &
AllocType) {
11215 switch (Lex.getKind()) {
11222 case lltok::kw_cold:
11225 case lltok::kw_hot:
11229 return error(Lex.getLoc(),
"invalid alloc type");
11242bool LLParser::parseOptionalCallsites(std::vector<CallsiteInfo> &Callsites) {
11246 if (parseToken(
lltok::colon,
"expected ':' in callsites") ||
11250 IdToIndexMapType IdToIndexMap;
11253 if (parseToken(
lltok::lparen,
"expected '(' in callsite") ||
11260 LocTy Loc = Lex.getLoc();
11262 if (parseGVReference(VI, GVId))
11266 if (parseToken(
lltok::comma,
"expected ',' in callsite") ||
11272 SmallVector<unsigned> Clones;
11275 if (parseUInt32(V))
11281 parseToken(
lltok::comma,
"expected ',' in callsite") ||
11287 SmallVector<unsigned> StackIdIndices;
11291 uint64_t StackId = 0;
11292 if (parseUInt64(StackId))
11294 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
11305 IdToIndexMap[GVId].
push_back(std::make_pair(Callsites.size(), Loc));
11306 Callsites.push_back({
VI, Clones, StackIdIndices});
11314 for (
auto I : IdToIndexMap) {
11315 auto &Infos = ForwardRefValueInfos[
I.first];
11316 for (
auto P :
I.second) {
11318 "Forward referenced ValueInfo expected to be empty");
11319 Infos.emplace_back(&Callsites[
P.first].Callee,
P.second);
11323 if (parseToken(
lltok::rparen,
"expected ')' in callsites"))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Unify divergent function exit nodes
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
Function Alias Analysis false
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
GlobalValue::SanitizerMetadata SanitizerMetadata
Module.h This file contains the declarations for the Module class.
static GlobalValue * createGlobalFwdRef(Module *M, PointerType *PTy)
static cl::opt< bool > AllowIncompleteIR("allow-incomplete-ir", cl::init(false), cl::Hidden, cl::desc("Allow incomplete IR on a best effort basis (references to unknown " "metadata will be dropped)"))
static void maybeSetDSOLocal(bool DSOLocal, GlobalValue &GV)
static bool upgradeMemoryAttr(MemoryEffects &ME, lltok::Kind Kind)
static void resolveFwdRef(ValueInfo *Fwd, ValueInfo &Resolved)
static SmallVector< MemoryEffects::Location, 2 > keywordToLoc(lltok::Kind Tok)
static std::optional< DenormalMode::DenormalModeKind > keywordToDenormalModeKind(lltok::Kind Tok)
static unsigned parseOptionalLinkageAux(lltok::Kind Kind, bool &HasLinkage)
static unsigned keywordToFPClassTest(lltok::Kind Tok)
#define CC_VLS_CASE(ABIVlen)
static std::optional< ModRefInfo > keywordToModRef(lltok::Kind Tok)
static bool isSanitizer(lltok::Kind Kind)
static void dropIntrinsicWithUnknownMetadataArgument(IntrinsicInst *II)
#define PARSE_MD_FIELDS()
static Attribute::AttrKind tokenToAttribute(lltok::Kind Kind)
#define GET_OR_DISTINCT(CLASS, ARGS)
bool isOldDbgFormatIntrinsic(StringRef Name)
static bool isValidVisibilityForLinkage(unsigned V, unsigned L)
static std::string getTypeString(Type *T)
static bool isValidDLLStorageClassForLinkage(unsigned S, unsigned L)
static const auto FwdVIRef
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
PowerPC Reduce CR logical Operation
static bool getVal(MDTuple *MD, const char *Key, uint64_t &Val)
const SmallVectorImpl< MachineOperand > & Cond
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
dot regions Print regions of function to dot file(with no function bodies)"
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file provides utility classes that use RAII to save and restore values.
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file defines the SmallPtrSet class.
FunctionLoweringInfo::StatepointRelocationRecord RecordType
static SymbolRef::Type getType(const Symbol *Sym)
LocallyHashedType DenseMapInfo< LocallyHashedType >::Empty
static const fltSemantics & IEEEdouble()
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
APSInt extOrTrunc(uint32_t width) const
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
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.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
void setWeak(bool IsWeak)
static bool isValidFailureOrdering(AtomicOrdering Ordering)
void setVolatile(bool V)
Specify whether this is a volatile cmpxchg.
static bool isValidSuccessOrdering(AtomicOrdering Ordering)
void setVolatile(bool V)
Specify whether this is a volatile RMW or not.
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
static LLVM_ABI StringRef getOperationName(BinOp Op)
static LLVM_ABI AttributeSet get(LLVMContext &C, const AttrBuilder &B)
static LLVM_ABI bool canUseAsRetAttr(AttrKind Kind)
static bool isTypeAttrKind(AttrKind Kind)
static LLVM_ABI bool canUseAsFnAttr(AttrKind Kind)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ None
No attributes have been set.
static LLVM_ABI bool canUseAsParamAttr(AttrKind Kind)
LLVM Basic Block Representation.
LLVM_ABI void insertDbgRecordBefore(DbgRecord *DR, InstListType::iterator Here)
Insert a DbgRecord into a block at the position given by Here.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
void setCallingConv(CallingConv::ID CC)
void setAttributes(AttributeList A)
Set the attributes for this call.
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
void setTailCallKind(TailCallKind TCK)
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
@ ICMP_SLT
signed less than
@ ICMP_SLE
signed less or equal
@ FCMP_OLT
0 1 0 0 True if ordered and less than
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
@ ICMP_UGE
unsigned greater or equal
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ FCMP_ULT
1 1 0 0 True if unordered or less than
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
@ ICMP_ULT
unsigned less than
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
@ ICMP_SGE
signed greater or equal
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
@ ICMP_ULE
unsigned less or equal
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
static CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI bool isValueValidForType(Type *Ty, const APFloat &V)
Return true if Ty is big enough to represent V.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
static LLVM_ABI std::optional< ConstantRangeList > getConstantRangeList(ArrayRef< ConstantRange > RangesRef)
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
static DIAssignID * getDistinct(LLVMContext &Context)
DebugEmissionKind getEmissionKind() const
DebugNameTableKind getNameTableKind() const
static LLVM_ABI DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, std::optional< uint32_t > EnumKind, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, Metadata *Rank, Metadata *Annotations, Metadata *BitStride)
Build a DICompositeType with the given ODR identifier.
static LLVM_ABI std::optional< ChecksumKind > getChecksumKind(StringRef CSKindStr)
ChecksumKind
Which algorithm (e.g.
static LLVM_ABI std::optional< FixedPointKind > getFixedPointKind(StringRef Str)
static LLVM_ABI DIFlags getFlag(StringRef Flag)
void cleanupRetainedNodes()
When IR modules are merged, typically during LTO, the merged module may contain several types having ...
static LLVM_ABI DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
static LLVM_ABI DISPFlags getFlag(StringRef Flag)
DISPFlags
Debug info subprogram flags.
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
static LLVM_ABI Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
static LLVM_ABI DbgLabelRecord * createUnresolvedDbgLabelRecord(MDNode *Label, MDNode *DL)
For use during parsing; creates a DbgLabelRecord from as-of-yet unresolved MDNodes.
Kind
Subclass discriminator.
static LLVM_ABI DbgVariableRecord * createUnresolvedDbgVariableRecord(LocationType Type, Metadata *Val, MDNode *Variable, MDNode *Expression, MDNode *AssignID, Metadata *Address, MDNode *AddressExpression, MDNode *DI)
Used to create DbgVariableRecords during parsing, where some metadata references may still be unresol...
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...
static constexpr ElementCount getFixed(ScalarTy MinVal)
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
static LLVM_ABI bool isValidArgumentType(Type *ArgTy)
Return true if the specified type is valid as an argument type.
Type::subtype_iterator param_iterator
static LLVM_ABI bool isValidReturnType(Type *RetTy)
Return true if the specified type is valid as a return type.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
void setPrefixData(Constant *PrefixData)
void setGC(std::string Str)
void setPersonalityFn(Constant *Fn)
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
void setAlignment(Align Align)
Sets the alignment attribute of the Function.
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
void setPreferredAlignment(MaybeAlign Align)
Sets the prefalign attribute of the Function.
void setPrologueData(Constant *PrologueData)
void setCallingConv(CallingConv::ID CC)
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags noUnsignedSignedWrap()
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
static bool isValidLinkage(LinkageTypes L)
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
static LLVM_ABI GlobalIFunc * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Resolver, Module *Parent)
If a parent module is specified, the ifunc is automatically inserted into the end of the specified mo...
LLVM_ABI void setComdat(Comdat *C)
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
LLVM_ABI const SanitizerMetadata & getSanitizerMetadata() const
static bool isLocalLinkage(LinkageTypes Linkage)
void setUnnamedAddr(UnnamedAddr Val)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
void setDLLStorageClass(DLLStorageClassTypes C)
void setThreadLocalMode(ThreadLocalMode Val)
void setLinkage(LinkageTypes LT)
DLLStorageClassTypes
Storage classes of global values for PE targets.
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
bool hasSanitizerMetadata() const
unsigned getAddressSpace() const
void setDSOLocal(bool Local)
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing module and deletes it.
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
static bool isValidDeclarationLinkage(LinkageTypes Linkage)
static LLVM_ABI std::string getGlobalIdentifier(StringRef Name, GlobalValue::LinkageTypes Linkage, StringRef FileName)
Return the modified name for a global value suitable to be used as the key for a global lookup (e....
void setVisibility(VisibilityTypes V)
LLVM_ABI void setSanitizerMetadata(SanitizerMetadata Meta)
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AppendingLinkage
Special purpose, only applies to global arrays.
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Type * getValueType() const
LLVM_ABI void setPartition(StringRef Part)
LLVM_ABI void setInitializer(Constant *InitVal)
setInitializer - Sets the initializer for this global variable, removing any existing initializer if ...
void setAttributes(AttributeSet A)
Set attribute list for this global.
void setConstant(bool Val)
LLVM_ABI void setCodeModel(CodeModel::Model CM)
Change the code model for this global.
void setExternallyInitialized(bool Val)
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
LLVM_ABI void addDestination(BasicBlock *Dest)
Add a destination.
static IndirectBrInst * Create(Value *Address, unsigned NumDests, InsertPosition InsertBefore=nullptr)
static LLVM_ABI InlineAsm * get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack=false, AsmDialect asmDialect=AD_ATT, bool canThrow=false)
InlineAsm::get - Return the specified uniqued inline asm string.
static LLVM_ABI Error verify(FunctionType *Ty, StringRef Constraints)
This static method can be used by the parser to check to see if the specified constraint string is le...
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI bool isValidOperands(const Value *Vec, const Value *NewElt, const Value *Idx)
Return true if an insertelement instruction can be formed with the specified operands.
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
LLVM_ABI void setNonNeg(bool b=true)
Set or clear the nneg flag on this instruction, which must be a zext instruction.
bool isTerminator() const
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
A wrapper class for inspecting calls to intrinsic functions.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
lltok::Kind getKind() const
bool parseDIExpressionBodyAtBeginning(MDNode *&Result, unsigned &Read, const SlotMapping *Slots)
LLVMContext & getContext()
bool parseTypeAtBeginning(Type *&Ty, unsigned &Read, const SlotMapping *Slots)
bool parseStandaloneConstantValue(Constant *&C, const SlotMapping *Slots)
bool Run(bool UpgradeDebugInfo, DataLayoutCallbackTy DataLayoutCallback=[](StringRef, StringRef) { return std::nullopt;})
Run: module ::= toplevelentity*.
static LLVM_ABI LandingPadInst * Create(Type *RetTy, unsigned NumReservedClauses, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedClauses is a hint for the number of incoming clauses that this landingpad w...
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a distinct node.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
static MemoryEffectsBase readOnly()
MemoryEffectsBase getWithModRef(Location Loc, ModRefInfo MR) const
Get new MemoryEffectsBase with modified ModRefInfo for Loc.
static auto targetMemLocations()
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
bool isTargetMemLoc(IRMemLocation Loc) const
Whether location is target memory location.
static MemoryEffectsBase writeOnly()
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase none()
static MemoryEffectsBase unknown()
A Module instance is used to store all the information related to an LLVM module.
StringMap< Comdat > ComdatSymTabType
The type of the comdat "symbol" table.
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
static ResumeInst * Create(Value *Exn, InsertPosition InsertBefore=nullptr)
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
Represents a location in source code.
constexpr const char * getPointer() const
static LLVM_ABI const char * areInvalidOperands(Value *Cond, Value *True, Value *False)
Return a string if the specified operands are invalid for a select operation, otherwise return null.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
ArrayRef< int > getShuffleMask() const
static LLVM_ABI bool isValidOperands(const Value *V1, const Value *V2, const Value *Mask)
Return true if a shufflevector instruction can be formed with the specified operands.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
iterator find(StringRef Key)
StringMapIterBase< Comdat, false > iterator
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
LLVM_ABI Error setBodyOrError(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type or return an error if it would make the type recursive.
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Returns true if this struct contains a scalable vector.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
@ HasZeroInit
zeroinitializer is valid for this target extension type.
static LLVM_ABI Expected< TargetExtType * > getOrError(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters,...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
bool isByteTy() const
True if this is an instance of ByteType.
bool isVectorTy() const
True if this is an instance of VectorType.
bool isArrayTy() const
True if this is an instance of ArrayType.
static LLVM_ABI Type * getTokenTy(LLVMContext &C)
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
bool isLabelTy() const
Return true if this is 'label'.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
static LLVM_ABI Type * getLabelTy(LLVMContext &C)
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM_ABI bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
bool isAggregateType() const
Return true if the type is an aggregate type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isIntegerTy() const
True if this is an instance of IntegerType.
bool isTokenTy() const
Return true if this is 'token'.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
bool isVoidTy() const
Return true if this is 'void'.
bool isMetadataTy() const
Return true if this is 'metadata'.
static LLVM_ABI UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
static UncondBrInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
static constexpr uint64_t MaximumAlignment
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
self_iterator getIterator()
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
LLVM_ABI unsigned getSourceLanguageName(StringRef SourceLanguageNameString)
LLVM_ABI unsigned getOperationEncoding(StringRef OperationEncodingString)
LLVM_ABI unsigned getAttributeEncoding(StringRef EncodingString)
LLVM_ABI unsigned getTag(StringRef TagString)
LLVM_ABI unsigned getCallingConvention(StringRef LanguageString)
LLVM_ABI unsigned getLanguage(StringRef LanguageString)
LLVM_ABI unsigned getVirtuality(StringRef VirtualityString)
LLVM_ABI unsigned getEnumKind(StringRef EnumKindString)
LLVM_ABI unsigned getMacinfo(StringRef MacinfoString)
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ AArch64_VectorCall
Used between AArch64 Advanced SIMD functions.
@ X86_64_SysV
The C convention as specified in the x86-64 supplement to the System V ABI, used on most non-Windows ...
@ RISCV_VectorCall
Calling convention used for RISC-V V-extension.
@ AMDGPU_CS
Used for Mesa/AMDPAL compute shaders.
@ AMDGPU_VS
Used for Mesa vertex shaders, or AMDPAL last shader stage before rasterization (vertex shader if tess...
@ AVR_SIGNAL
Used for AVR signal routines.
@ Swift
Calling convention for Swift.
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ AArch64_SVE_VectorCall
Used between AArch64 SVE functions.
@ ARM_APCS
ARM Procedure Calling Standard (obsolete, but still used on some targets).
@ CHERIoT_CompartmentCall
Calling convention used for CHERIoT when crossing a protection boundary.
@ CFGuard_Check
Special calling convention on Windows for calling the Control Guard Check ICall funtion.
@ AVR_INTR
Used for AVR interrupt routines.
@ PreserveMost
Used for runtime calls that preserves most registers.
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
@ AMDGPU_Gfx
Used for AMD graphics targets.
@ DUMMY_HHVM
Placeholders for HHVM calling conventions (deprecated, removed).
@ AMDGPU_CS_ChainPreserve
Used on AMDGPUs to give the middle-end more control over argument placement.
@ AMDGPU_HS
Used for Mesa/AMDPAL hull shaders (= tessellation control shaders).
@ ARM_AAPCS
ARM Architecture Procedure Calling Standard calling convention (aka EABI).
@ CHERIoT_CompartmentCallee
Calling convention used for the callee of CHERIoT_CompartmentCall.
@ AMDGPU_GS
Used for Mesa/AMDPAL geometry shaders.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2
Preserve X2-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ CHERIoT_LibraryCall
Calling convention used for CHERIoT for cross-library calls to a stateless compartment.
@ CXX_FAST_TLS
Used for access functions.
@ X86_INTR
x86 hardware interrupt context.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0
Preserve X0-X13, X19-X29, SP, Z0-Z31, P0-P15.
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
@ AMDGPU_PS
Used for Mesa/AMDPAL pixel shaders.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1
Preserve X1-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ X86_ThisCall
Similar to X86_StdCall.
@ PTX_Device
Call to a PTX device function.
@ SPIR_KERNEL
Used for SPIR kernel functions.
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
@ X86_StdCall
stdcall is mostly used by the Win32 API.
@ SPIR_FUNC
Used for SPIR non-kernel device functions.
@ Fast
Attempts to make calls as fast as possible (e.g.
@ MSP430_INTR
Used for MSP430 interrupt routines.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ Intel_OCL_BI
Used for Intel OpenCL built-ins.
@ PreserveNone
Used for runtime calls that preserves none general registers.
@ AMDGPU_ES
Used for AMDPAL shader stage before geometry shader if geometry is in use.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
@ PTX_Kernel
Call to a PTX kernel. Passes all arguments in parameter space.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
@ GRAAL
Used by GraalVM. Two additional registers are reserved.
@ AMDGPU_LS
Used for AMDPAL vertex shader if tessellation is in use.
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
@ X86_RegCall
Register calling convention used for parameters transfer optimization.
@ M68k_RTD
Used for M68k rtd-based CC (similar to X86's stdcall).
@ C
The default llvm calling convention, compatible with C.
@ X86_FastCall
'fast' analog of X86_StdCall.
@ BasicBlock
Various leaf nodes.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
LLVM_ABI bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &ArgTys)
Gets the type arguments of an intrinsic call by matching type contraints specified by the ....
Flag
These should be considered private to the implementation of the MCInstrDesc class.
@ System
Synchronized with respect to all concurrently executing threads.
@ Valid
The data is already valid.
initializer< Ty > init(const Ty &Val)
@ DW_TAG_invalid
LLVM mock tags (see also llvm/BinaryFormat/Dwarf.def).
@ DW_MACINFO_invalid
Macinfo type for invalid results.
@ DW_APPLE_ENUM_KIND_invalid
Enum kind for invalid results.
@ DW_VIRTUALITY_invalid
Virtuality for invalid results.
@ kw_aarch64_sme_preservemost_from_x1
@ kw_no_sanitize_hwaddress
@ kw_cheriot_librarycallcc
@ kw_cheriot_compartmentcalleecc
@ kw_typeCheckedLoadConstVCalls
@ kw_aarch64_sve_vector_pcs
@ kw_cheriot_compartmentcallcc
@ kw_amdgpu_gfx_whole_wave
@ kw_typeTestAssumeConstVCalls
@ kw_typeidCompatibleVTable
@ kw_typeCheckedLoadVCalls
@ kw_inaccessiblemem_or_argmemonly
@ kw_externally_initialized
@ kw_sanitize_address_dyninit
@ kw_amdgpu_cs_chain_preserve
@ kw_available_externally
@ kw_typeTestAssumeVCalls
@ kw_aarch64_sme_preservemost_from_x0
@ kw_dso_local_equivalent
@ kw_aarch64_sme_preservemost_from_x2
NodeAddr< NodeBase * > Node
friend class Instruction
Iterator for Instructions in a `BasicBlock.
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
std::tuple< const DIScope *, const DIScope *, const DILocalVariable * > VarID
A unique key that represents a debug variable.
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
LLVM_ABI void UpgradeSectionAttributes(Module &M)
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
SaveAndRestore(T &) -> SaveAndRestore< T >
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.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
scope_exit(Callable) -> scope_exit< Callable >
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI void UpgradeCallsToIntrinsic(Function *F)
This is an auto-upgrade hook for any old intrinsic function syntaxes which need to have both the func...
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
auto dyn_cast_or_null(const Y &Val)
@ Async
"Asynchronous" unwind tables (instr precise)
@ Sync
"Synchronous" unwind tables
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
void sort(IteratorTy Start, IteratorTy End)
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
bool isPointerTy(const Type *T)
FunctionAddr VTableAddr Count
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
CaptureComponents
Components of the pointer that may be captured.
iterator_range< SplittingIterator > split(StringRef Str, StringRef Separator)
Split the specified string over a separator and return a range-compatible iterable over its partition...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Ref
The access may reference the value stored in memory.
@ ModRef
The access may reference and may modify the value stored in memory.
@ Mod
The access may modify the value stored in memory.
@ NoModRef
The access neither references nor modifies the value stored in memory.
IRMemLocation
The locations at which a function might access memory.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
llvm::function_ref< std::optional< std::string >(StringRef, StringRef)> DataLayoutCallbackTy
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
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.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
PointerUnion< const Value *, const PseudoSourceValue * > ValueType
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
static int64_t upperBound(StackOffset Size)
bool capturesNothing(CaptureComponents CC)
LLVM_ABI MDNode * UpgradeTBAANode(MDNode &TBAANode)
If the given TBAA tag uses the scalar TBAA format, create a new node corresponding to the upgrade to ...
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
@ Dynamic
Denormals have unknown treatment.
@ IEEE
IEEE-754 denormal numbers preserved.
static constexpr DenormalMode getInvalid()
static constexpr DenormalMode getIEEE()
std::vector< uint64_t > Args
unsigned ReturnDoesNotAlias
unsigned MustBeUnreachable
static constexpr uint32_t RangeWidth
std::vector< Call > Calls
In the per-module summary, it summarizes the byte offset applied to each pointer parameter before pas...
std::vector< ConstVCall > TypeCheckedLoadConstVCalls
std::vector< VFuncId > TypeCheckedLoadVCalls
std::vector< ConstVCall > TypeTestAssumeConstVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
std::vector< GlobalValue::GUID > TypeTests
List of type identifiers used by this function in llvm.type.test intrinsics referenced by something o...
std::vector< VFuncId > TypeTestAssumeVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
unsigned NoRenameOnPromotion
This field is written by the ThinLTO prelink stage to decide whether a particular static global value...
unsigned DSOLocal
Indicates that the linker resolved the symbol to a definition from within the same linkage unit.
unsigned CanAutoHide
In the per-module summary, indicates that the global value is linkonce_odr and global unnamed addr (s...
unsigned ImportType
This field is written by the ThinLTO indexing step to postlink combined summary.
unsigned NotEligibleToImport
Indicate if the global value cannot be imported (e.g.
unsigned Linkage
The linkage type of the associated global value.
unsigned Visibility
Indicates the visibility.
unsigned Live
In per-module summary, indicate that the global value must be considered a live root for index-based ...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
This struct contains the mappings from the slot numbers to unnamed metadata nodes,...
std::map< unsigned, Type * > Types
StringMap< Type * > NamedTypes
std::map< unsigned, TrackingMDNodeRef > MetadataNodes
NumberedValues< GlobalValue * > GlobalValues
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
@ Unknown
Unknown (analysis not performed, don't lower)
@ Single
Single element (last example in "Short Inline Bit Vectors")
@ Inline
Inlined bit vector ("Short Inline Bit Vectors")
@ Unsat
Unsatisfiable type (i.e. no global has this type metadata)
@ AllOnes
All-ones bit vector ("Eliminating Bit Vector Checks for All-Ones Bit Vectors")
@ ByteArray
Test a byte array (first example)
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
ValID - Represents a reference of a definition of some sort with no type.
enum llvm::ValID::@273232264270353276247031231016211363171152164072 Kind
Struct that holds a reference to a particular GUID in a global value summary.
const GlobalValueSummaryMapTy::value_type * getRef() const
@ UniformRetVal
Uniform return value optimization.
@ VirtualConstProp
Virtual constant propagation.
@ UniqueRetVal
Unique return value optimization.
@ Indir
Just do a regular virtual call.
uint64_t Info
Additional information for the resolution:
enum llvm::WholeProgramDevirtResolution::ByArg::Kind TheKind
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
@ SingleImpl
Single implementation devirtualization.
@ Indir
Just do a regular virtual call.
@ BranchFunnel
When retpoline mitigation is enabled, use a branch funnel that is defined in the merged module.