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(); };
179 F.eraseMetadataIf(Pred);
181 I.eraseMetadataIf(Pred);
188 for (GlobalVariable &GV : M->globals())
189 GV.eraseMetadataIf(Pred);
192 [](
const auto &
E) {
return std::get<2>(
E)->isTemporary(); });
194 [](
const auto &
E) {
return std::get<2>(
E)->isTemporary(); });
199 if (
Info.first->getNumTemporaryUses() == 1) {
200 NumberedMetadata.erase(ID);
201 ForwardRefMDNodes.erase(ID);
214 assert(!(SeenNewDbgInfoFormat && SeenOldDbgInfoFormat) &&
215 "Mixed debug intrinsics/records seen without a parsing error?");
218 for (
const auto &RAG : ForwardRefAttrGroups) {
220 const std::vector<unsigned> &
Attrs = RAG.second;
221 AttrBuilder
B(Context);
223 for (
const auto &Attr : Attrs) {
224 auto R = NumberedAttrBuilders.find(Attr);
225 if (R != NumberedAttrBuilders.end())
230 AttributeList AS = Fn->getAttributes();
231 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
232 AS = AS.removeFnAttributes(Context);
238 if (MaybeAlign
A = FnAttrs.getAlignment()) {
239 Fn->setAlignment(*
A);
240 FnAttrs.removeAttribute(Attribute::Alignment);
243 AS = AS.addFnAttributes(Context, FnAttrs);
244 Fn->setAttributes(AS);
246 AttributeList AS = CI->getAttributes();
247 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
248 AS = AS.removeFnAttributes(Context);
250 AS = AS.addFnAttributes(Context, FnAttrs);
251 CI->setAttributes(AS);
253 AttributeList AS =
II->getAttributes();
254 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
255 AS = AS.removeFnAttributes(Context);
257 AS = AS.addFnAttributes(Context, FnAttrs);
258 II->setAttributes(AS);
260 AttributeList AS = CBI->getAttributes();
261 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
262 AS = AS.removeFnAttributes(Context);
264 AS = AS.addFnAttributes(Context, FnAttrs);
265 CBI->setAttributes(AS);
267 AttrBuilder
Attrs(M->getContext(), GV->getAttributes());
277 if (!ForwardRefBlockAddresses.empty())
278 return error(ForwardRefBlockAddresses.begin()->first.Loc,
279 "expected function name in blockaddress");
281 auto ResolveForwardRefDSOLocalEquivalents = [&](
const ValID &GVRef,
282 GlobalValue *FwdRef) {
283 GlobalValue *GV =
nullptr;
285 GV = M->getNamedValue(GVRef.
StrVal);
287 GV = NumberedVals.get(GVRef.
UIntVal);
292 "' referenced by dso_local_equivalent");
296 "expected a function, alias to function, or ifunc "
297 "in dso_local_equivalent");
300 FwdRef->replaceAllUsesWith(Equiv);
301 FwdRef->eraseFromParent();
308 for (
auto &Iter : ForwardRefDSOLocalEquivalentIDs) {
309 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
312 for (
auto &Iter : ForwardRefDSOLocalEquivalentNames) {
313 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
316 ForwardRefDSOLocalEquivalentIDs.clear();
317 ForwardRefDSOLocalEquivalentNames.clear();
319 for (
const auto &NT : NumberedTypes)
320 if (
NT.second.second.isValid())
322 "use of undefined type '%" + Twine(
NT.first) +
"'");
324 for (
const auto &[Name, TypeInfo] : NamedTypes)
325 if (TypeInfo.second.isValid())
326 return error(TypeInfo.second,
327 "use of undefined type named '" + Name +
"'");
329 if (!ForwardRefComdats.empty())
330 return error(ForwardRefComdats.begin()->second,
331 "use of undefined comdat '$" +
332 ForwardRefComdats.begin()->first +
"'");
335 dropUnknownMetadataReferences();
337 if (!ForwardRefMDNodes.empty())
338 return error(ForwardRefMDNodes.begin()->second.second,
339 "use of undefined metadata '!" +
340 Twine(ForwardRefMDNodes.begin()->first) +
"'");
343 for (
auto [Loc, DR, MD] : PendingDbgRecords) {
347 return error(Loc,
"invalid debug location");
349 PendingDbgRecords.clear();
350 for (
auto [Loc,
I, MD] : PendingDbgInsts) {
354 return error(Loc,
"invalid !dbg metadata");
356 PendingDbgInsts.clear();
370 if (!CB || !CB->isCallee(&U))
371 return error(
Info.second,
"intrinsic can only be used as callee");
373 std::string ErrorMsg;
374 raw_string_ostream ErrorOS(ErrorMsg);
388 return error(
Info.second,
"unknown intrinsic '" + Name +
"'");
399 Info.first->eraseFromParent();
400 ForwardRefVals.erase(Name);
409 auto GetCommonFunctionType = [](
Value *
V) -> FunctionType * {
410 FunctionType *FTy =
nullptr;
411 for (Use &U :
V->uses()) {
413 if (!CB || !CB->isCallee(&U) || (FTy && FTy != CB->getFunctionType()))
415 FTy = CB->getFunctionType();
423 Type *Ty = GetCommonFunctionType(
Info.first);
431 GV =
new GlobalVariable(*M, Ty,
false,
434 Info.first->replaceAllUsesWith(GV);
435 Info.first->eraseFromParent();
436 ForwardRefVals.erase(Name);
439 if (!ForwardRefVals.empty())
440 return error(ForwardRefVals.begin()->second.second,
441 "use of undefined value '@" + ForwardRefVals.begin()->first +
444 if (!ForwardRefValIDs.empty())
445 return error(ForwardRefValIDs.begin()->second.second,
446 "use of undefined value '@" +
447 Twine(ForwardRefValIDs.begin()->first) +
"'");
450 for (
auto &
N : NumberedMetadata) {
451 if (
N.second && !
N.second->isResolved())
452 N.second->resolveCycles();
456 NewDistinctSPs.clear();
458 for (
auto *Inst : InstsWithTBAATag) {
459 MDNode *MD = Inst->getMetadata(LLVMContext::MD_tbaa);
462 assert(MD &&
"UpgradeInstWithTBAATag should have a TBAA tag");
465 if (MD != UpgradedMD)
466 Inst->setMetadata(LLVMContext::MD_tbaa, UpgradedMD);
475 if (UpgradeDebugInfo)
489 Slots->GlobalValues = std::move(NumberedVals);
490 Slots->MetadataNodes = std::move(NumberedMetadata);
491 for (
const auto &
I : NamedTypes)
492 Slots->NamedTypes.insert(std::make_pair(
I.getKey(),
I.second.first));
493 for (
const auto &
I : NumberedTypes)
494 Slots->Types.insert(std::make_pair(
I.first,
I.second.first));
500bool LLParser::validateEndOfIndex() {
504 if (!ForwardRefValueInfos.empty())
505 return error(ForwardRefValueInfos.begin()->second.front().second,
506 "use of undefined summary '^" +
507 Twine(ForwardRefValueInfos.begin()->first) +
"'");
509 if (!ForwardRefAliasees.empty())
510 return error(ForwardRefAliasees.begin()->second.front().second,
511 "use of undefined summary '^" +
512 Twine(ForwardRefAliasees.begin()->first) +
"'");
514 if (!ForwardRefTypeIds.empty())
515 return error(ForwardRefTypeIds.begin()->second.front().second,
516 "use of undefined type id summary '^" +
517 Twine(ForwardRefTypeIds.begin()->first) +
"'");
531 std::string TentativeDLStr = M->getDataLayoutStr();
536 switch (Lex.getKind()) {
538 if (parseTargetDefinition(TentativeDLStr, DLStrLoc))
542 if (parseSourceFileName())
551 if (
auto LayoutOverride =
552 DataLayoutCallback(M->getTargetTriple().str(), TentativeDLStr)) {
553 TentativeDLStr = *LayoutOverride;
559 M->setDataLayout(MaybeDL.
get());
563bool LLParser::parseTopLevelEntities() {
567 switch (Lex.getKind()) {
571 if (parseSummaryEntry())
575 if (parseSourceFileName())
585 switch (Lex.getKind()) {
587 return tokError(
"expected top-level entity");
598 if (parseModuleAsm())
602 if (parseUnnamedType())
606 if (parseNamedType())
610 if (parseUnnamedGlobal())
614 if (parseNamedGlobal())
619 if (parseStandaloneMetadata())
623 if (parseSummaryEntry())
627 if (parseNamedMetadata())
631 if (parseUnnamedAttrGrp())
635 if (parseUseListOrder())
647bool LLParser::parseModuleAsm() {
655 Module::GlobalAsmProperties Props;
659 SMLoc Loc = Lex.getLoc();
661 return error(Loc,
"expected property name followed by ':'");
663 Key = Lex.getStrVal();
666 if (parseStringConstant(
Value))
670 return error(Loc,
"unknown property name");
680 std::string AsmStrPart;
681 if (parseStringConstant(AsmStrPart))
683 AsmStr += AsmStrPart +
"\n";
686 M->appendModuleInlineAsm({AsmStr, Props});
693bool LLParser::parseTargetDefinition(std::string &TentativeDLStr,
699 return tokError(
"unknown target property");
702 if (parseToken(
lltok::equal,
"expected '=' after target triple") ||
703 parseStringConstant(Str))
705 M->setTargetTriple(Triple(std::move(Str)));
709 if (parseToken(
lltok::equal,
"expected '=' after target datalayout"))
711 DLStrLoc = Lex.getLoc();
712 if (parseStringConstant(TentativeDLStr))
720bool LLParser::parseSourceFileName() {
723 if (parseToken(
lltok::equal,
"expected '=' after source_filename") ||
724 parseStringConstant(SourceFileName))
727 M->setSourceFileName(SourceFileName);
733bool LLParser::parseUnnamedType() {
734 LocTy TypeLoc = Lex.getLoc();
735 unsigned TypeID = Lex.getUIntVal();
738 if (parseToken(
lltok::equal,
"expected '=' after name") ||
743 if (parseStructDefinition(TypeLoc,
"", NumberedTypes[
TypeID], Result))
747 std::pair<Type*, LocTy> &
Entry = NumberedTypes[
TypeID];
749 return error(TypeLoc,
"non-struct types may not be recursive");
751 Entry.second = SMLoc();
759bool LLParser::parseNamedType() {
760 std::string
Name = Lex.getStrVal();
761 LocTy NameLoc = Lex.getLoc();
764 if (parseToken(
lltok::equal,
"expected '=' after name") ||
769 if (parseStructDefinition(NameLoc, Name, NamedTypes[Name], Result))
773 std::pair<Type*, LocTy> &
Entry = NamedTypes[
Name];
775 return error(NameLoc,
"non-struct types may not be recursive");
777 Entry.second = SMLoc();
785bool LLParser::parseDeclare() {
789 std::vector<std::pair<unsigned, MDNode *>> MDs;
793 if (parseMetadataAttachment(MDK,
N))
795 MDs.push_back({MDK,
N});
799 unsigned FunctionNumber = -1;
800 SmallVector<unsigned> UnnamedArgNums;
801 if (parseFunctionHeader(
F,
false, FunctionNumber, UnnamedArgNums))
804 F->addMetadata(MD.first, *MD.second);
810bool LLParser::parseDefine() {
813 FileLoc FunctionStart = getTokLineColumnPos();
817 unsigned FunctionNumber = -1;
818 SmallVector<unsigned> UnnamedArgNums;
820 parseFunctionHeader(
F,
true, FunctionNumber, UnnamedArgNums) ||
821 parseOptionalFunctionMetadata(*
F) ||
822 parseFunctionBody(*
F, FunctionNumber, UnnamedArgNums);
824 ParserContext->addFunctionLocation(
825 F, FileLocRange(FunctionStart, getPrevTokEndLineColumnPos()));
833bool LLParser::parseGlobalType(
bool &IsConstant) {
840 return tokError(
"expected 'global' or 'constant'");
846bool LLParser::parseOptionalUnnamedAddr(
867bool LLParser::parseUnnamedGlobal() {
870 LocTy NameLoc = Lex.getLoc();
874 VarID = Lex.getUIntVal();
875 if (checkValueID(NameLoc,
"global",
"@", NumberedVals.getNext(),
VarID))
879 if (parseToken(
lltok::equal,
"expected '=' after name"))
882 VarID = NumberedVals.getNext();
886 unsigned Linkage, Visibility, DLLStorageClass;
890 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
892 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
895 switch (Lex.getKind()) {
897 return parseGlobal(Name,
VarID, NameLoc,
Linkage, HasLinkage, Visibility,
898 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
901 return parseAliasOrIFunc(Name,
VarID, NameLoc,
Linkage, Visibility,
902 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
911bool LLParser::parseNamedGlobal() {
913 LocTy NameLoc = Lex.getLoc();
914 std::string
Name = Lex.getStrVal();
918 unsigned Linkage, Visibility, DLLStorageClass;
922 if (parseToken(
lltok::equal,
"expected '=' in global variable") ||
923 parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
925 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
928 switch (Lex.getKind()) {
930 return parseGlobal(Name, -1, NameLoc,
Linkage, HasLinkage, Visibility,
931 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
934 return parseAliasOrIFunc(Name, -1, NameLoc,
Linkage, Visibility,
935 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
939bool LLParser::parseComdat() {
941 std::string
Name = Lex.getStrVal();
942 LocTy NameLoc = Lex.getLoc();
949 return tokError(
"expected comdat type");
952 switch (Lex.getKind()) {
954 return tokError(
"unknown selection kind");
976 if (
I != ComdatSymTab.
end() && !ForwardRefComdats.erase(Name))
977 return error(NameLoc,
"redefinition of comdat '$" + Name +
"'");
980 if (
I != ComdatSymTab.
end())
983 C = M->getOrInsertComdat(Name);
984 C->setSelectionKind(SK);
991bool LLParser::parseMDString(
MDString *&Result) {
993 if (parseStringConstant(Str))
1001bool LLParser::parseMDNodeID(
MDNode *&Result) {
1003 LocTy IDLoc = Lex.getLoc();
1005 if (parseUInt32(MID))
1009 auto [It,
Inserted] = NumberedMetadata.try_emplace(MID);
1016 auto &FwdRef = ForwardRefMDNodes[MID];
1019 Result = FwdRef.first.get();
1020 It->second.reset(Result);
1026bool LLParser::parseNamedMetadata() {
1028 std::string
Name = Lex.getStrVal();
1036 NamedMDNode *NMD = M->getOrInsertNamedMetadata(Name);
1039 MDNode *
N =
nullptr;
1044 Lex.getStrVal() ==
"DIExpression") {
1045 if (parseDIExpression(
N,
false))
1050 Lex.getStrVal() ==
"DIArgList") {
1051 return tokError(
"found DIArgList outside of function");
1059 return parseToken(
lltok::rbrace,
"expected end of metadata node");
1064bool LLParser::parseStandaloneMetadata() {
1067 unsigned MetadataID = 0;
1070 if (parseUInt32(MetadataID) || parseToken(
lltok::equal,
"expected '=' here"))
1075 return tokError(
"unexpected type in metadata definition");
1079 if (parseSpecializedMDNode(Init, IsDistinct))
1082 parseMDTuple(Init, IsDistinct))
1086 auto FI = ForwardRefMDNodes.find(MetadataID);
1087 if (FI != ForwardRefMDNodes.end()) {
1088 auto *ToReplace = FI->second.first.get();
1092 for (
auto *Inst : TempDIAssignIDAttachments[ToReplace]) {
1093 assert(!Inst->getMetadata(LLVMContext::MD_DIAssignID) &&
1094 "Inst unexpectedly already has DIAssignID attachment");
1095 Inst->setMetadata(LLVMContext::MD_DIAssignID, Init);
1099 ToReplace->replaceAllUsesWith(Init);
1100 ForwardRefMDNodes.erase(FI);
1102 assert(NumberedMetadata[MetadataID] == Init &&
"Tracking VH didn't work");
1104 auto [It,
Inserted] = NumberedMetadata.try_emplace(MetadataID);
1106 return tokError(
"Metadata id is already used");
1107 It->second.reset(Init);
1114bool LLParser::skipModuleSummaryEntry() {
1124 return tokError(
"Expected 'gv', 'module', 'typeid', "
1125 "'typeidCompatibleVTable', 'flags' or 'blockcount' at the "
1126 "start of summary entry");
1128 return parseSummaryIndexFlags();
1130 return parseBlockCount();
1132 if (parseToken(
lltok::colon,
"expected ':' at start of summary entry") ||
1133 parseToken(
lltok::lparen,
"expected '(' at start of summary entry"))
1137 unsigned NumOpenParen = 1;
1139 switch (Lex.getKind()) {
1147 return tokError(
"found end of file while parsing summary entry");
1153 }
while (NumOpenParen > 0);
1159bool LLParser::parseSummaryEntry() {
1165 Lex.setIgnoreColonInIdentifiers(
true);
1173 return skipModuleSummaryEntry();
1175 bool result =
false;
1176 switch (Lex.getKind()) {
1178 result = parseGVEntry(SummaryID);
1181 result = parseModuleEntry(SummaryID);
1184 result = parseTypeIdEntry(SummaryID);
1187 result = parseTypeIdCompatibleVtableEntry(SummaryID);
1190 result = parseSummaryIndexFlags();
1193 result = parseBlockCount();
1196 result =
error(Lex.getLoc(),
"unexpected summary kind");
1199 Lex.setIgnoreColonInIdentifiers(
false);
1233bool LLParser::parseAliasOrIFunc(
const std::string &Name,
unsigned NameID,
1234 LocTy NameLoc,
unsigned L,
unsigned Visibility,
1235 unsigned DLLStorageClass,
bool DSOLocal,
1250 return error(NameLoc,
"invalid linkage type for alias");
1253 return error(NameLoc,
1254 "symbol with local linkage must have default visibility");
1257 return error(NameLoc,
1258 "symbol with local linkage cannot have a DLL storage class");
1261 LocTy ExplicitTypeLoc = Lex.getLoc();
1262 if (parseType(Ty) ||
1263 parseToken(
lltok::comma,
"expected comma after alias or ifunc's type"))
1267 LocTy AliaseeLoc = Lex.getLoc();
1272 if (parseGlobalTypeAndValue(Aliasee))
1277 if (parseValID(ID,
nullptr))
1280 return error(AliaseeLoc,
"invalid aliasee");
1281 Aliasee =
ID.ConstantVal;
1287 return error(AliaseeLoc,
"An alias or ifunc must have pointer type");
1288 unsigned AddrSpace = PTy->getAddressSpace();
1290 GlobalValue *GVal =
nullptr;
1294 if (!
Name.empty()) {
1295 auto I = ForwardRefVals.find(Name);
1296 if (
I != ForwardRefVals.end()) {
1297 GVal =
I->second.first;
1298 ForwardRefVals.erase(Name);
1299 }
else if (M->getNamedValue(Name)) {
1300 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1303 auto I = ForwardRefValIDs.find(NameID);
1304 if (
I != ForwardRefValIDs.end()) {
1305 GVal =
I->second.first;
1306 ForwardRefValIDs.erase(
I);
1311 std::unique_ptr<GlobalAlias> GA;
1312 std::unique_ptr<GlobalIFunc> GI;
1340 if (parseGlobalObjectMetadataAttachment(*GI))
1343 return tokError(
"unknown alias or ifunc property!");
1348 NumberedVals.add(NameID, GV);
1355 "forward reference and definition of alias have different types");
1365 M->insertAlias(GA.release());
1367 M->insertIFunc(GI.release());
1368 assert(GV->
getName() == Name &&
"Should not be a name conflict!");
1377 case lltok::kw_sanitize_memtag:
1391 switch (Lex.getKind()) {
1393 Meta.NoAddress =
true;
1396 Meta.NoHWAddress =
true;
1398 case lltok::kw_sanitize_memtag:
1402 Meta.IsDynInit =
true;
1405 return tokError(
"non-sanitizer token passed to LLParser::parseSanitizer()");
1425bool LLParser::parseGlobal(
const std::string &Name,
unsigned NameID,
1426 LocTy NameLoc,
unsigned Linkage,
bool HasLinkage,
1427 unsigned Visibility,
unsigned DLLStorageClass,
1431 return error(NameLoc,
1432 "symbol with local linkage must have default visibility");
1435 return error(NameLoc,
1436 "symbol with local linkage cannot have a DLL storage class");
1440 LocTy IsExternallyInitializedLoc;
1444 if (parseOptionalAddrSpace(AddrSpace) ||
1446 IsExternallyInitialized,
1447 &IsExternallyInitializedLoc) ||
1448 parseGlobalType(IsConstant) || parseType(Ty, TyLoc))
1457 if (parseGlobalValue(Ty, Init))
1462 return error(TyLoc,
"invalid type for global variable");
1464 GlobalValue *GVal =
nullptr;
1467 if (!
Name.empty()) {
1468 auto I = ForwardRefVals.find(Name);
1469 if (
I != ForwardRefVals.end()) {
1470 GVal =
I->second.first;
1471 ForwardRefVals.erase(
I);
1472 }
else if (M->getNamedValue(Name)) {
1473 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1478 if (NameID == (
unsigned)-1)
1479 NameID = NumberedVals.getNext();
1481 auto I = ForwardRefValIDs.find(NameID);
1482 if (
I != ForwardRefValIDs.end()) {
1483 GVal =
I->second.first;
1484 ForwardRefValIDs.erase(
I);
1488 GlobalVariable *GV =
new GlobalVariable(
1493 NumberedVals.add(NameID, GV);
1511 "forward reference and definition of global have different types");
1531 }
else if (Lex.getKind() == lltok::kw_align) {
1533 if (parseOptionalAlignment(Alignment))
1539 if (parseOptionalCodeModel(CodeModel))
1543 if (parseGlobalObjectMetadataAttachment(*GV))
1546 if (parseSanitizer(GV))
1550 if (parseOptionalComdat(Name,
C))
1555 return tokError(
"unknown global variable property!");
1559 AttrBuilder
Attrs(M->getContext());
1561 std::vector<unsigned> FwdRefAttrGrps;
1562 if (parseFnAttributeValuePairs(Attrs, FwdRefAttrGrps,
false, BuiltinLoc))
1564 if (
Attrs.hasAttributes() || !FwdRefAttrGrps.empty()) {
1566 ForwardRefAttrGroups[GV] = FwdRefAttrGrps;
1574bool LLParser::parseUnnamedAttrGrp() {
1576 LocTy AttrGrpLoc = Lex.getLoc();
1580 return tokError(
"expected attribute group id");
1582 unsigned VarID = Lex.getUIntVal();
1583 std::vector<unsigned> unused;
1591 auto R = NumberedAttrBuilders.find(
VarID);
1592 if (R == NumberedAttrBuilders.end())
1593 R = NumberedAttrBuilders.emplace(
VarID, AttrBuilder(M->getContext())).first;
1595 if (parseFnAttributeValuePairs(
R->second, unused,
true, BuiltinLoc) ||
1596 parseToken(
lltok::rbrace,
"expected end of attribute group"))
1599 if (!
R->second.hasAttributes())
1600 return error(AttrGrpLoc,
"attribute group has no attributes");
1607#define GET_ATTR_NAMES
1608#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME) \
1609 case lltok::kw_##DISPLAY_NAME: \
1610 return Attribute::ENUM_NAME;
1611#include "llvm/IR/Attributes.inc"
1620 return parseRequiredTypeAttr(
B, Lex.getKind(), Attr);
1623 case Attribute::Alignment: {
1632 if (parseOptionalAlignment(Alignment,
true))
1635 B.addAlignmentAttr(Alignment);
1638 case Attribute::StackAlignment: {
1643 parseUInt32(Alignment))
1646 if (parseOptionalStackAlignment(Alignment))
1649 B.addStackAlignmentAttr(Alignment);
1652 case Attribute::AllocSize: {
1653 unsigned ElemSizeArg;
1654 std::optional<unsigned> NumElemsArg;
1655 if (parseAllocSizeArguments(ElemSizeArg, NumElemsArg))
1657 B.addAllocSizeAttr(ElemSizeArg, NumElemsArg);
1660 case Attribute::VScaleRange: {
1661 unsigned MinValue, MaxValue;
1662 if (parseVScaleRangeArguments(MinValue, MaxValue))
1664 B.addVScaleRangeAttr(MinValue,
1665 MaxValue > 0 ? MaxValue : std::optional<unsigned>());
1668 case Attribute::Dereferenceable: {
1669 std::optional<uint64_t> Bytes;
1670 if (parseOptionalAttrBytes(lltok::kw_dereferenceable, Bytes))
1672 assert(Bytes.has_value());
1673 B.addDereferenceableAttr(Bytes.value());
1676 case Attribute::DeadOnReturn: {
1677 std::optional<uint64_t> Bytes;
1678 if (parseOptionalAttrBytes(lltok::kw_dead_on_return, Bytes,
1681 if (Bytes.has_value()) {
1682 B.addDeadOnReturnAttr(DeadOnReturnInfo(Bytes.value()));
1684 B.addDeadOnReturnAttr(DeadOnReturnInfo());
1688 case Attribute::DereferenceableOrNull: {
1689 std::optional<uint64_t> Bytes;
1690 if (parseOptionalAttrBytes(lltok::kw_dereferenceable_or_null, Bytes))
1692 assert(Bytes.has_value());
1693 B.addDereferenceableOrNullAttr(Bytes.value());
1696 case Attribute::UWTable: {
1698 if (parseOptionalUWTableKind(Kind))
1700 B.addUWTableAttr(Kind);
1703 case Attribute::AllocKind: {
1705 if (parseAllocKind(Kind))
1707 B.addAllocKindAttr(Kind);
1710 case Attribute::Memory: {
1711 std::optional<MemoryEffects> ME = parseMemoryAttr();
1714 B.addMemoryAttr(*ME);
1717 case Attribute::DenormalFPEnv: {
1718 std::optional<DenormalFPEnv>
Mode = parseDenormalFPEnvAttr();
1722 B.addDenormalFPEnvAttr(*
Mode);
1725 case Attribute::NoFPClass: {
1728 B.addNoFPClassAttr(NoFPClass);
1734 case Attribute::Range:
1735 return parseRangeAttr(
B);
1736 case Attribute::Initializes:
1737 return parseInitializesAttr(
B);
1738 case Attribute::Captures:
1739 return parseCapturesAttr(
B);
1741 B.addAttribute(Attr);
1749 case lltok::kw_readnone:
1752 case lltok::kw_readonly:
1755 case lltok::kw_writeonly:
1774bool LLParser::parseFnAttributeValuePairs(AttrBuilder &
B,
1775 std::vector<unsigned> &FwdRefAttrGrps,
1776 bool InAttrGrp, LocTy &BuiltinLoc) {
1777 bool HaveError =
false;
1788 if (parseStringAttribute(
B))
1800 "cannot have an attribute group reference in an attribute group");
1803 FwdRefAttrGrps.push_back(Lex.getUIntVal());
1809 SMLoc Loc = Lex.getLoc();
1810 if (Token == lltok::kw_builtin)
1822 return error(Lex.getLoc(),
"unterminated attribute group");
1825 if (parseEnumAttribute(Attr,
B, InAttrGrp))
1832 HaveError |=
error(Loc,
"this attribute does not apply to functions");
1836 B.addMemoryAttr(ME);
1850 PTy->getAddressSpace());
1859 error(Loc,
"'" + Name +
"' is not a basic block");
1861 error(Loc,
"'" + Name +
"' defined with type '" +
1874 error(Loc,
"global variable reference must have pointer type");
1885 auto I = ForwardRefVals.find(Name);
1886 if (
I != ForwardRefVals.end())
1887 Val =
I->second.first;
1893 checkValidVariableType(Loc,
"@" + Name, Ty, Val));
1897 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
1904 error(Loc,
"global variable reference must have pointer type");
1908 GlobalValue *Val = NumberedVals.get(ID);
1913 auto I = ForwardRefValIDs.find(ID);
1914 if (
I != ForwardRefValIDs.end())
1915 Val =
I->second.first;
1921 checkValidVariableType(Loc,
"@" + Twine(ID), Ty, Val));
1925 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
1933Comdat *LLParser::getComdat(
const std::string &Name, LocTy
Loc) {
1937 if (
I != ComdatSymTab.
end())
1941 Comdat *
C = M->getOrInsertComdat(Name);
1942 ForwardRefComdats[
Name] = Loc;
1952bool LLParser::parseToken(
lltok::Kind T,
const char *ErrMsg) {
1953 if (Lex.getKind() !=
T)
1954 return tokError(ErrMsg);
1961bool LLParser::parseStringConstant(std::string &Result) {
1963 return tokError(
"expected string constant");
1964 Result = Lex.getStrVal();
1971bool LLParser::parseUInt32(uint32_t &Val) {
1972 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1973 return tokError(
"expected integer");
1974 uint64_t Val64 = Lex.getAPSIntVal().getLimitedValue(0xFFFFFFFFULL+1);
1975 if (Val64 !=
unsigned(Val64))
1976 return tokError(
"expected 32-bit integer (too large)");
1984bool LLParser::parseUInt64(
uint64_t &Val) {
1985 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1986 return tokError(
"expected integer");
1987 Val = Lex.getAPSIntVal().getLimitedValue();
1997 switch (Lex.getKind()) {
1999 return tokError(
"expected localdynamic, initialexec or localexec");
2027 return parseTLSModel(TLM) ||
2028 parseToken(
lltok::rparen,
"expected ')' after thread local model");
2036bool LLParser::parseOptionalAddrSpace(
unsigned &AddrSpace,
unsigned DefaultAS) {
2037 AddrSpace = DefaultAS;
2041 auto ParseAddrspaceValue = [&](
unsigned &AddrSpace) ->
bool {
2043 const std::string &AddrSpaceStr = Lex.getStrVal();
2044 if (AddrSpaceStr ==
"A") {
2045 AddrSpace = M->getDataLayout().getAllocaAddrSpace();
2046 }
else if (AddrSpaceStr ==
"G") {
2047 AddrSpace = M->getDataLayout().getDefaultGlobalsAddressSpace();
2048 }
else if (AddrSpaceStr ==
"P") {
2049 AddrSpace = M->getDataLayout().getProgramAddressSpace();
2050 }
else if (std::optional<unsigned> AS =
2051 M->getDataLayout().getNamedAddressSpace(AddrSpaceStr)) {
2054 return tokError(
"invalid symbolic addrspace '" + AddrSpaceStr +
"'");
2060 return tokError(
"expected integer or string constant");
2061 SMLoc Loc = Lex.getLoc();
2062 if (parseUInt32(AddrSpace))
2065 return error(Loc,
"invalid address space, must be a 24-bit integer");
2069 return parseToken(
lltok::lparen,
"expected '(' in address space") ||
2070 ParseAddrspaceValue(AddrSpace) ||
2077bool LLParser::parseStringAttribute(AttrBuilder &
B) {
2078 std::string Attr = Lex.getStrVal();
2081 if (EatIfPresent(
lltok::equal) && parseStringConstant(Val))
2083 B.addAttribute(Attr, Val);
2088bool LLParser::parseOptionalParamOrReturnAttrs(AttrBuilder &
B,
bool IsParam) {
2089 bool HaveError =
false;
2096 if (parseStringAttribute(
B))
2107 SMLoc Loc = Lex.getLoc();
2112 if (parseEnumAttribute(Attr,
B,
false))
2116 HaveError |=
error(Loc,
"this attribute does not apply to parameters");
2118 HaveError |=
error(Loc,
"this attribute does not apply to return values");
2166bool LLParser::parseOptionalLinkage(
unsigned &Res,
bool &HasLinkage,
2167 unsigned &Visibility,
2168 unsigned &DLLStorageClass,
bool &DSOLocal) {
2172 parseOptionalDSOLocal(DSOLocal);
2173 parseOptionalVisibility(Visibility);
2174 parseOptionalDLLStorageClass(DLLStorageClass);
2177 return error(Lex.getLoc(),
"dso_location and DLL-StorageClass mismatch");
2183void LLParser::parseOptionalDSOLocal(
bool &DSOLocal) {
2184 switch (Lex.getKind()) {
2205void LLParser::parseOptionalVisibility(
unsigned &Res) {
2206 switch (Lex.getKind()) {
2223bool LLParser::parseOptionalImportType(
lltok::Kind Kind,
2227 return tokError(
"unknown import kind. Expect definition or declaration.");
2242void LLParser::parseOptionalDLLStorageClass(
unsigned &Res) {
2243 switch (Lex.getKind()) {
2313bool LLParser::parseOptionalCallingConv(
unsigned &CC) {
2314 switch (Lex.getKind()) {
2401 return tokError(
"unknown RISC-V ABI VLEN");
2402#define CC_VLS_CASE(ABIVlen) \
2404 CC = CallingConv::RISCV_VLSCall_##ABIVlen; \
2432 return parseUInt32(CC);
2442bool LLParser::parseMetadataAttachment(
unsigned &Kind,
MDNode *&MD) {
2445 std::string
Name = Lex.getStrVal();
2446 Kind = M->getMDKindID(Name);
2449 return parseMDNode(MD);
2454bool LLParser::parseInstructionMetadata(
Instruction &Inst) {
2457 return tokError(
"expected metadata after comma");
2461 auto Loc = Lex.getLoc();
2462 if (parseMetadataAttachment(MDK,
N))
2465 if (MDK == LLVMContext::MD_DIAssignID)
2466 TempDIAssignIDAttachments[
N].push_back(&Inst);
2467 else if (MDK == LLVMContext::MD_dbg)
2468 PendingDbgInsts.emplace_back(Loc, &Inst,
N);
2472 if (MDK == LLVMContext::MD_tbaa)
2473 InstsWithTBAATag.push_back(&Inst);
2482bool LLParser::parseGlobalObjectMetadataAttachment(
GlobalObject &GO) {
2485 if (parseMetadataAttachment(MDK,
N))
2494bool LLParser::parseOptionalFunctionMetadata(
Function &
F) {
2496 if (parseGlobalObjectMetadataAttachment(
F))
2504bool LLParser::parseOptionalAlignment(
MaybeAlign &Alignment,
bool AllowParens) {
2506 if (!EatIfPresent(lltok::kw_align))
2508 LocTy AlignLoc = Lex.getLoc();
2511 LocTy ParenLoc = Lex.getLoc();
2512 bool HaveParens =
false;
2518 if (parseUInt64(
Value))
2522 return error(ParenLoc,
"expected ')'");
2525 return error(AlignLoc,
"alignment is not a power of two");
2527 return error(AlignLoc,
"huge alignments are not supported yet");
2535bool LLParser::parseOptionalPrefAlignment(
MaybeAlign &Alignment) {
2539 LocTy AlignLoc = Lex.getLoc();
2542 LocTy ParenLoc = Lex.getLoc();
2544 return error(ParenLoc,
"expected '('");
2546 if (parseUInt64(
Value))
2549 ParenLoc = Lex.getLoc();
2551 return error(ParenLoc,
"expected ')'");
2554 return error(AlignLoc,
"alignment is not a power of two");
2556 return error(AlignLoc,
"huge alignments are not supported yet");
2566 auto StrVal = Lex.getStrVal();
2567 auto ErrMsg =
"expected global code model string";
2568 if (StrVal ==
"tiny")
2570 else if (StrVal ==
"small")
2572 else if (StrVal ==
"kernel")
2574 else if (StrVal ==
"medium")
2576 else if (StrVal ==
"large")
2579 return tokError(ErrMsg);
2591bool LLParser::parseOptionalAttrBytes(
lltok::Kind AttrKind,
2592 std::optional<uint64_t> &Bytes,
2593 bool ErrorNoBytes) {
2594 assert((AttrKind == lltok::kw_dereferenceable ||
2595 AttrKind == lltok::kw_dereferenceable_or_null ||
2596 AttrKind == lltok::kw_dead_on_return) &&
2600 if (!EatIfPresent(AttrKind))
2602 LocTy ParenLoc = Lex.getLoc();
2605 return error(ParenLoc,
"expected '('");
2606 Bytes = std::nullopt;
2609 LocTy DerefLoc = Lex.getLoc();
2610 if (parseUInt64(Bytes.value()))
2612 ParenLoc = Lex.getLoc();
2614 return error(ParenLoc,
"expected ')'");
2616 return error(DerefLoc,
"byte count specified must be non-zero");
2620bool LLParser::parseOptionalUWTableKind(
UWTableKind &Kind) {
2625 LocTy KindLoc = Lex.getLoc();
2631 return error(KindLoc,
"expected unwind table kind");
2638 LocTy ParenLoc = Lex.getLoc();
2640 return error(ParenLoc,
"expected '('");
2641 LocTy KindLoc = Lex.getLoc();
2643 if (parseStringConstant(Arg))
2644 return error(KindLoc,
"expected allockind value");
2648 }
else if (
A ==
"realloc") {
2650 }
else if (
A ==
"free") {
2652 }
else if (
A ==
"uninitialized") {
2654 }
else if (
A ==
"zeroed") {
2656 }
else if (
A ==
"aligned") {
2659 return error(KindLoc, Twine(
"unknown allockind ") +
A);
2662 ParenLoc = Lex.getLoc();
2664 return error(ParenLoc,
"expected ')'");
2666 return error(KindLoc,
"expected allockind value");
2675 return {Loc::ArgMem};
2677 return {Loc::InaccessibleMem};
2679 return {Loc::ErrnoMem};
2681 return {Loc::TargetMem0};
2683 return {Loc::TargetMem1};
2706 return std::nullopt;
2710static std::optional<DenormalMode::DenormalModeKind>
2722 return std::nullopt;
2726std::optional<MemoryEffects> LLParser::parseMemoryAttr() {
2731 Lex.setIgnoreColonInIdentifiers(
true);
2736 tokError(
"expected '('");
2737 return std::nullopt;
2740 bool SeenLoc =
false;
2741 bool SeenTargetLoc =
false;
2744 if (!Locs.
empty()) {
2747 tokError(
"expected ':' after location");
2748 return std::nullopt;
2755 tokError(
"expected memory location (argmem, inaccessiblemem, errnomem) "
2756 "or access kind (none, read, write, readwrite)");
2758 tokError(
"expected access kind (none, read, write, readwrite)");
2759 return std::nullopt;
2763 if (!Locs.
empty()) {
2768 SeenTargetLoc =
true;
2770 if (Locs.size() > 1 && SeenTargetLoc) {
2771 tokError(
"target memory default access kind must be specified first");
2772 return std::nullopt;
2777 tokError(
"default access kind must be specified first");
2778 return std::nullopt;
2787 tokError(
"unterminated memory attribute");
2788 return std::nullopt;
2791std::optional<DenormalMode> LLParser::parseDenormalFPEnvEntry() {
2792 std::optional<DenormalMode::DenormalModeKind> OutputMode =
2795 tokError(
"expected denormal behavior kind (ieee, preservesign, "
2796 "positivezero, dynamic)");
2802 std::optional<DenormalMode::DenormalModeKind> InputMode;
2806 tokError(
"expected denormal behavior kind (ieee, preservesign, "
2807 "positivezero, dynamic)");
2814 InputMode = OutputMode;
2817 return DenormalMode(*OutputMode, *InputMode);
2820std::optional<DenormalFPEnv> LLParser::parseDenormalFPEnvAttr() {
2823 Lex.setIgnoreColonInIdentifiers(
true);
2834 bool HasDefaultSection =
false;
2836 std::optional<DenormalMode> ParsedDefaultMode = parseDenormalFPEnvEntry();
2837 if (!ParsedDefaultMode)
2839 DefaultMode = *ParsedDefaultMode;
2840 HasDefaultSection =
true;
2845 if (HasDefaultSection && !HasComma) {
2846 tokError(
"expected ',' before float:");
2851 if (parseType(Ty) || !Ty->
isFloatTy()) {
2852 tokError(
"expected float:");
2856 if (parseToken(
lltok::colon,
"expected ':' before float denormal_fpenv"))
2859 std::optional<DenormalMode> ParsedF32Mode = parseDenormalFPEnvEntry();
2863 F32Mode = *ParsedF32Mode;
2866 if (parseToken(
lltok::rparen,
"unterminated denormal_fpenv"))
2869 return DenormalFPEnv(DefaultMode, F32Mode);
2911unsigned LLParser::parseNoFPClassAttr() {
2916 tokError(
"expected '('");
2923 if (TestMask != 0) {
2927 !parseUInt64(
Value)) {
2929 error(Lex.getLoc(),
"invalid mask value for 'nofpclass'");
2934 error(Lex.getLoc(),
"expected ')'");
2940 error(Lex.getLoc(),
"expected nofpclass test mask");
2958bool LLParser::parseOptionalCommaAlign(
MaybeAlign &Alignment,
2959 bool &AteExtraComma) {
2960 AteExtraComma =
false;
2964 AteExtraComma =
true;
2968 if (Lex.getKind() != lltok::kw_align)
2969 return error(Lex.getLoc(),
"expected metadata or 'align'");
2971 if (parseOptionalAlignment(Alignment))
2984bool LLParser::parseOptionalCommaAddrSpace(
unsigned &AddrSpace, LocTy &
Loc,
2985 bool &AteExtraComma) {
2986 AteExtraComma =
false;
2990 AteExtraComma =
true;
2996 return error(Lex.getLoc(),
"expected metadata or 'addrspace'");
2998 if (parseOptionalAddrSpace(AddrSpace))
3005bool LLParser::parseAllocSizeArguments(
unsigned &BaseSizeArg,
3006 std::optional<unsigned> &HowManyArg) {
3009 auto StartParen = Lex.getLoc();
3011 return error(StartParen,
"expected '('");
3013 if (parseUInt32(BaseSizeArg))
3017 auto HowManyAt = Lex.getLoc();
3019 if (parseUInt32(HowMany))
3021 if (HowMany == BaseSizeArg)
3022 return error(HowManyAt,
3023 "'allocsize' indices can't refer to the same parameter");
3024 HowManyArg = HowMany;
3026 HowManyArg = std::nullopt;
3028 auto EndParen = Lex.getLoc();
3030 return error(EndParen,
"expected ')'");
3034bool LLParser::parseVScaleRangeArguments(
unsigned &MinValue,
3035 unsigned &MaxValue) {
3038 auto StartParen = Lex.getLoc();
3040 return error(StartParen,
"expected '('");
3042 if (parseUInt32(MinValue))
3046 if (parseUInt32(MaxValue))
3049 MaxValue = MinValue;
3051 auto EndParen = Lex.getLoc();
3053 return error(EndParen,
"expected ')'");
3062bool LLParser::parseScopeAndOrdering(
bool IsAtomic,
SyncScope::ID &SSID,
3067 return parseScope(SSID) || parseOrdering(Ordering);
3077 auto StartParenAt = Lex.getLoc();
3079 return error(StartParenAt,
"Expected '(' in syncscope");
3082 auto SSNAt = Lex.getLoc();
3083 if (parseStringConstant(SSN))
3084 return error(SSNAt,
"Expected synchronization scope name");
3086 auto EndParenAt = Lex.getLoc();
3088 return error(EndParenAt,
"Expected ')' in syncscope");
3090 SSID = Context.getOrInsertSyncScopeID(SSN);
3101 switch (Lex.getKind()) {
3103 return tokError(
"Expected ordering on atomic instruction");
3122bool LLParser::parseOptionalStackAlignment(
unsigned &Alignment) {
3124 if (!EatIfPresent(lltok::kw_alignstack))
3126 LocTy ParenLoc = Lex.getLoc();
3128 return error(ParenLoc,
"expected '('");
3129 LocTy AlignLoc = Lex.getLoc();
3130 if (parseUInt32(Alignment))
3132 ParenLoc = Lex.getLoc();
3134 return error(ParenLoc,
"expected ')'");
3136 return error(AlignLoc,
"stack alignment is not a power of two");
3150 bool &AteExtraComma) {
3151 AteExtraComma =
false;
3154 return tokError(
"expected ',' as start of index list");
3158 if (Indices.
empty())
3159 return tokError(
"expected index");
3160 AteExtraComma =
true;
3164 if (parseUInt32(Idx))
3177bool LLParser::parseType(
Type *&Result,
const Twine &
Msg,
bool AllowVoid) {
3178 SMLoc TypeLoc = Lex.getLoc();
3179 switch (Lex.getKind()) {
3181 return tokError(
Msg);
3190 if (
Result->isPointerTy()) {
3192 if (parseOptionalAddrSpace(AddrSpace))
3198 return tokError(
"ptr* is invalid - use ptr instead");
3209 if (parseTargetExtType(Result))
3215 if (parseAnonStructType(Result,
false))
3221 if (parseArrayVectorType(Result,
false))
3228 if (parseAnonStructType(Result,
true) ||
3229 parseToken(
lltok::greater,
"expected '>' at end of packed struct"))
3231 }
else if (parseArrayVectorType(Result,
true))
3236 std::pair<Type*, LocTy> &
Entry = NamedTypes[Lex.getStrVal()];
3242 Entry.second = Lex.getLoc();
3251 std::pair<Type*, LocTy> &
Entry = NumberedTypes[Lex.getUIntVal()];
3257 Entry.second = Lex.getLoc();
3267 switch (Lex.getKind()) {
3270 if (!AllowVoid &&
Result->isVoidTy())
3271 return error(TypeLoc,
"void type only allowed for function results");
3277 return tokError(
"basic block pointers are invalid");
3279 return tokError(
"pointers to void are invalid - use i8* instead");
3281 return tokError(
"pointer to this type is invalid");
3289 return tokError(
"basic block pointers are invalid");
3291 return tokError(
"pointers to void are invalid; use i8* instead");
3293 return tokError(
"pointer to this type is invalid");
3295 if (parseOptionalAddrSpace(AddrSpace) ||
3296 parseToken(
lltok::star,
"expected '*' in address space"))
3305 if (parseFunctionType(Result))
3318 PerFunctionState &PFS,
bool IsMustTailCall,
3319 bool InVarArgsFunc) {
3325 if (!ArgList.
empty() &&
3326 parseToken(
lltok::comma,
"expected ',' in argument list"))
3331 const char *
Msg =
"unexpected ellipsis in argument list for ";
3332 if (!IsMustTailCall)
3333 return tokError(Twine(
Msg) +
"non-musttail call");
3335 return tokError(Twine(
Msg) +
"musttail call in non-varargs function");
3337 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3342 Type *ArgTy =
nullptr;
3344 if (parseType(ArgTy, ArgLoc))
3347 return error(ArgLoc,
"invalid type for function argument");
3349 AttrBuilder ArgAttrs(M->getContext());
3352 if (parseMetadataAsValue(V, PFS))
3356 if (parseOptionalParamAttrs(ArgAttrs) || parseValue(ArgTy, V, PFS))
3363 if (IsMustTailCall && InVarArgsFunc)
3364 return tokError(
"expected '...' at end of argument list for musttail call "
3365 "in varargs function");
3373bool LLParser::parseRequiredTypeAttr(AttrBuilder &
B,
lltok::Kind AttrToken,
3376 if (!EatIfPresent(AttrToken))
3379 return error(Lex.getLoc(),
"expected '('");
3383 return error(Lex.getLoc(),
"expected ')'");
3385 B.addTypeAttr(AttrKind, Ty);
3391bool LLParser::parseRangeAttr(AttrBuilder &
B) {
3399 auto ParseAPSInt = [&](
unsigned BitWidth, APInt &Val) {
3401 return tokError(
"expected integer");
3402 if (Lex.getAPSIntVal().getBitWidth() >
BitWidth)
3404 "integer is too large for the bit width of specified type");
3405 Val = Lex.getAPSIntVal().extend(
BitWidth);
3410 if (parseToken(
lltok::lparen,
"expected '('") || parseType(Ty, TyLoc))
3413 return error(TyLoc,
"the range must have integer type!");
3421 return tokError(
"the range represent the empty set but limits aren't 0!");
3432bool LLParser::parseInitializesAttr(AttrBuilder &
B) {
3435 auto ParseAPSInt = [&](APInt &Val) {
3437 return tokError(
"expected integer");
3438 Val = Lex.getAPSIntVal().extend(64);
3458 return tokError(
"the range should not represent the full or empty set!");
3470 if (!CRLOrNull.has_value())
3471 return tokError(
"Invalid (unordered or overlapping) range list");
3472 B.addInitializesAttr(*CRLOrNull);
3476bool LLParser::parseCapturesAttr(AttrBuilder &
B) {
3478 std::optional<CaptureComponents> Ret;
3482 Lex.setIgnoreColonInIdentifiers(
true);
3490 bool SeenComponent =
false;
3496 return tokError(
"duplicate 'ret' location");
3499 SeenComponent =
false;
3504 return tokError(
"cannot use 'none' with other component");
3508 return tokError(
"cannot use 'none' with other component");
3519 return tokError(
"expected one of 'none', 'address', 'address_is_null', "
3520 "'provenance' or 'read_provenance'");
3523 SeenComponent =
true;
3531 B.addCapturesAttr(CaptureInfo(
Other, Ret.value_or(
Other)));
3544bool LLParser::parseOptionalOperandBundles(
3546 LocTy BeginLoc = Lex.getLoc();
3552 if (!BundleList.
empty() &&
3553 parseToken(
lltok::comma,
"expected ',' in input list"))
3557 if (parseStringConstant(
Tag))
3560 if (parseToken(
lltok::lparen,
"expected '(' in operand bundle"))
3563 std::vector<Value *> Inputs;
3566 if (!Inputs.empty() &&
3567 parseToken(
lltok::comma,
"expected ',' in input list"))
3571 Value *Input =
nullptr;
3575 if (parseMetadataAsValue(Input, PFS))
3577 }
else if (parseValue(Ty, Input, PFS)) {
3580 Inputs.push_back(Input);
3588 if (BundleList.
empty())
3589 return error(BeginLoc,
"operand bundle set must not be empty");
3596 unsigned NextID,
unsigned ID) {
3598 return error(Loc, Kind +
" expected to be numbered '" + Prefix +
3599 Twine(NextID) +
"' or greater");
3616 unsigned CurValID = 0;
3630 LocTy TypeLoc = Lex.getLoc();
3631 Type *ArgTy =
nullptr;
3632 AttrBuilder
Attrs(M->getContext());
3633 if (parseType(ArgTy) || parseOptionalParamAttrs(Attrs))
3637 return error(TypeLoc,
"argument can not have void type");
3642 bool Unnamed =
false;
3644 Name = Lex.getStrVal();
3645 IdentStart = getTokLineColumnPos();
3647 IdentEnd = getPrevTokEndLineColumnPos();
3651 ArgID = Lex.getUIntVal();
3652 IdentStart = getTokLineColumnPos();
3653 if (checkValueID(TypeLoc,
"argument",
"%", CurValID, ArgID))
3656 IdentEnd = getPrevTokEndLineColumnPos();
3662 CurValID = ArgID + 1;
3666 return error(TypeLoc,
"invalid type for function argument");
3670 Unnamed ? std::nullopt
3671 : std::make_optional(FileLocRange(IdentStart, IdentEnd)),
3676 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3681bool LLParser::parseFunctionType(
Type *&Result) {
3685 return tokError(
"invalid function return type");
3689 SmallVector<unsigned> UnnamedArgNums;
3690 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg))
3694 for (
const ArgInfo &Arg : ArgList) {
3695 if (!Arg.Name.empty())
3696 return error(Arg.Loc,
"argument name invalid in function type");
3697 if (Arg.Attrs.hasAttributes())
3698 return error(Arg.Loc,
"argument attributes invalid in function type");
3702 for (
const ArgInfo &Arg : ArgList)
3711bool LLParser::parseAnonStructType(
Type *&Result,
bool Packed) {
3713 if (parseStructBody(Elts))
3721bool LLParser::parseStructDefinition(
SMLoc TypeLoc,
StringRef Name,
3722 std::pair<Type *, LocTy> &Entry,
3726 return error(TypeLoc,
"redefinition of type");
3732 Entry.second = SMLoc();
3737 ResultTy =
Entry.first;
3749 return error(TypeLoc,
"forward references to non-struct type");
3753 return parseArrayVectorType(ResultTy,
true);
3754 return parseType(ResultTy);
3758 Entry.second = SMLoc();
3767 if (parseStructBody(Body) ||
3768 (isPacked && parseToken(
lltok::greater,
"expected '>' in packed struct")))
3772 return tokError(
toString(std::move(
E)));
3792 LocTy EltTyLoc = Lex.getLoc();
3799 return error(EltTyLoc,
"invalid element type for struct");
3802 EltTyLoc = Lex.getLoc();
3807 return error(EltTyLoc,
"invalid element type for struct");
3812 return parseToken(
lltok::rbrace,
"expected '}' at end of struct");
3821bool LLParser::parseArrayVectorType(
Type *&Result,
bool IsVector) {
3822 bool Scalable =
false;
3826 if (parseToken(
lltok::kw_x,
"expected 'x' after vscale"))
3832 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned() ||
3833 Lex.getAPSIntVal().getBitWidth() > 64)
3834 return tokError(
"expected number in address space");
3836 LocTy SizeLoc = Lex.getLoc();
3840 if (parseToken(
lltok::kw_x,
"expected 'x' after element count"))
3843 LocTy TypeLoc = Lex.getLoc();
3844 Type *EltTy =
nullptr;
3845 if (parseType(EltTy))
3849 "expected end of sequential type"))
3854 return error(SizeLoc,
"zero element vector is illegal");
3856 return error(SizeLoc,
"size too large for vector");
3858 return error(TypeLoc,
"invalid vector element type");
3862 return error(TypeLoc,
"invalid array element type");
3879bool LLParser::parseTargetExtType(
Type *&Result) {
3884 if (parseToken(
lltok::lparen,
"expected '(' in target extension type") ||
3885 parseStringConstant(TypeName))
3892 SmallVector<unsigned> IntParams;
3893 bool SeenInt =
false;
3900 if (parseUInt32(IntVal))
3903 }
else if (SeenInt) {
3906 return tokError(
"expected uint32 param");
3909 if (parseType(TypeParam,
true))
3915 if (parseToken(
lltok::rparen,
"expected ')' in target extension type"))
3920 if (
auto E = TTy.takeError())
3921 return tokError(
toString(std::move(
E)));
3934 :
P(
p),
F(
f), FunctionNumber(functionNumber) {
3937 auto It = UnnamedArgNums.
begin();
3940 unsigned ArgNum = *It++;
3941 NumberedVals.add(ArgNum, &A);
3946LLParser::PerFunctionState::~PerFunctionState() {
3949 for (
const auto &P : ForwardRefVals) {
3952 P.second.first->replaceAllUsesWith(
3954 P.second.first->deleteValue();
3957 for (
const auto &P : ForwardRefValIDs) {
3960 P.second.first->replaceAllUsesWith(
3962 P.second.first->deleteValue();
3966bool LLParser::PerFunctionState::finishFunction() {
3967 if (!ForwardRefVals.empty())
3968 return P.error(ForwardRefVals.begin()->second.second,
3969 "use of undefined value '%" + ForwardRefVals.begin()->first +
3971 if (!ForwardRefValIDs.empty())
3972 return P.error(ForwardRefValIDs.begin()->second.second,
3973 "use of undefined value '%" +
3974 Twine(ForwardRefValIDs.begin()->first) +
"'");
3981Value *LLParser::PerFunctionState::getVal(
const std::string &Name,
Type *Ty,
3984 Value *Val =
F.getValueSymbolTable()->lookup(Name);
3989 auto I = ForwardRefVals.find(Name);
3990 if (
I != ForwardRefVals.end())
3991 Val =
I->second.first;
3996 return P.checkValidVariableType(Loc,
"%" + Name, Ty, Val);
4000 P.error(Loc,
"invalid use of a non-first-class type");
4011 if (FwdVal->
getName() != Name) {
4012 P.error(Loc,
"name is too long which can result in name collisions, "
4013 "consider making the name shorter or "
4014 "increasing -non-global-value-max-name-size");
4018 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
4022Value *LLParser::PerFunctionState::getVal(
unsigned ID,
Type *Ty,
LocTy Loc) {
4024 Value *Val = NumberedVals.get(ID);
4029 auto I = ForwardRefValIDs.find(ID);
4030 if (
I != ForwardRefValIDs.end())
4031 Val =
I->second.first;
4036 return P.checkValidVariableType(Loc,
"%" + Twine(ID), Ty, Val);
4039 P.error(Loc,
"invalid use of a non-first-class type");
4051 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
4057bool LLParser::PerFunctionState::setInstName(
int NameID,
4058 const std::string &NameStr,
4059 LocTy NameLoc, Instruction *Inst) {
4062 if (NameID != -1 || !NameStr.empty())
4063 return P.error(NameLoc,
"instructions returning void cannot have a name");
4069 if (NameStr.empty()) {
4072 NameID = NumberedVals.getNext();
4074 if (
P.checkValueID(NameLoc,
"instruction",
"%", NumberedVals.getNext(),
4078 auto FI = ForwardRefValIDs.find(NameID);
4079 if (FI != ForwardRefValIDs.end()) {
4082 return P.error(NameLoc,
"instruction forward referenced with type '" +
4086 Sentinel->replaceAllUsesWith(Inst);
4088 ForwardRefValIDs.erase(FI);
4091 NumberedVals.add(NameID, Inst);
4096 auto FI = ForwardRefVals.find(NameStr);
4097 if (FI != ForwardRefVals.end()) {
4100 return P.error(NameLoc,
"instruction forward referenced with type '" +
4104 Sentinel->replaceAllUsesWith(Inst);
4106 ForwardRefVals.erase(FI);
4112 if (Inst->
getName() != NameStr)
4113 return P.error(NameLoc,
"multiple definition of local value named '" +
4120BasicBlock *LLParser::PerFunctionState::getBB(
const std::string &Name,
4126BasicBlock *LLParser::PerFunctionState::getBB(
unsigned ID,
LocTy Loc) {
4134BasicBlock *LLParser::PerFunctionState::defineBB(
const std::string &Name,
4135 int NameID,
LocTy Loc) {
4139 if (
P.checkValueID(Loc,
"label",
"", NumberedVals.getNext(), NameID))
4142 NameID = NumberedVals.getNext();
4144 BB = getBB(NameID, Loc);
4146 P.error(Loc,
"unable to create block numbered '" + Twine(NameID) +
"'");
4150 BB = getBB(Name, Loc);
4152 P.error(Loc,
"unable to create block named '" + Name +
"'");
4163 ForwardRefValIDs.erase(NameID);
4164 NumberedVals.add(NameID, BB);
4167 ForwardRefVals.erase(Name);
4184bool LLParser::parseValID(ValID &ID, PerFunctionState *PFS,
Type *ExpectedTy) {
4185 ID.Loc = Lex.getLoc();
4186 switch (Lex.getKind()) {
4188 return tokError(
"expected value token");
4190 ID.UIntVal = Lex.getUIntVal();
4194 ID.StrVal = Lex.getStrVal();
4198 ID.UIntVal = Lex.getUIntVal();
4202 ID.StrVal = Lex.getStrVal();
4206 ID.APSIntVal = Lex.getAPSIntVal();
4210 ID.APFloatVal = Lex.getAPFloatVal();
4216 return error(
ID.Loc,
"unexpected floating-point literal");
4218 return error(
ID.Loc,
"floating-point constant invalid for type");
4223 "Invalid float strings should be caught by the lexer");
4228 return error(
ID.Loc,
"floating-point constant overflowed type");
4230 return error(
ID.Loc,
"floating-point constant underflowed type");
4236 return error(
ID.Loc,
"unexpected floating-point literal");
4238 const APInt &
Bits = Lex.getAPSIntVal();
4240 return error(
ID.Loc,
"float hex literal has incorrect number of bits");
4241 ID.APFloatVal =
APFloat(Semantics, Bits);
4263 if (parseGlobalValueVector(Elts) ||
4264 parseToken(
lltok::rbrace,
"expected end of struct constant"))
4267 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4268 ID.UIntVal = Elts.
size();
4269 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4270 Elts.
size() *
sizeof(Elts[0]));
4281 LocTy FirstEltLoc = Lex.getLoc();
4282 if (parseGlobalValueVector(Elts) ||
4284 parseToken(
lltok::rbrace,
"expected end of packed struct")) ||
4288 if (isPackedStruct) {
4289 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4290 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4291 Elts.
size() *
sizeof(Elts[0]));
4292 ID.UIntVal = Elts.
size();
4298 return error(
ID.Loc,
"constant vector must not be empty");
4300 if (!Elts[0]->
getType()->isIntegerTy() && !Elts[0]->
getType()->isByteTy() &&
4301 !Elts[0]->
getType()->isFloatingPointTy() &&
4305 "vector elements must have integer, byte, pointer or floating point "
4309 for (
unsigned i = 1, e = Elts.
size(); i != e; ++i)
4311 return error(FirstEltLoc,
"vector element #" + Twine(i) +
4312 " is not of type '" +
4322 LocTy FirstEltLoc = Lex.getLoc();
4323 if (parseGlobalValueVector(Elts) ||
4335 if (!Elts[0]->
getType()->isFirstClassType())
4336 return error(FirstEltLoc,
"invalid array element type: " +
4342 for (
unsigned i = 0, e = Elts.
size(); i != e; ++i) {
4344 return error(FirstEltLoc,
"array element #" + Twine(i) +
4345 " is not of type '" +
4357 Context, Lex.getStrVal(),
false, ATy->getElementType()->isByteTy());
4366 bool HasSideEffect, AlignStack, AsmDialect, CanThrow;
4369 parseOptionalToken(lltok::kw_alignstack, AlignStack) ||
4372 parseStringConstant(
ID.StrVal) ||
4373 parseToken(
lltok::comma,
"expected comma in inline asm expression") ||
4376 ID.StrVal2 = Lex.getStrVal();
4377 ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack) << 1) |
4378 (
unsigned(AsmDialect) << 2) | (unsigned(CanThrow) << 3);
4389 if (parseToken(
lltok::lparen,
"expected '(' in block address expression") ||
4390 parseValID(Fn, PFS) ||
4392 "expected comma in block address expression") ||
4393 parseValID(Label, PFS) ||
4394 parseToken(
lltok::rparen,
"expected ')' in block address expression"))
4398 return error(Fn.
Loc,
"expected function name in blockaddress");
4400 return error(
Label.Loc,
"expected basic block name in blockaddress");
4403 GlobalValue *GV =
nullptr;
4405 GV = NumberedVals.get(Fn.
UIntVal);
4406 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4407 GV = M->getNamedValue(Fn.
StrVal);
4413 return error(Fn.
Loc,
"expected function name in blockaddress");
4415 if (
F->isDeclaration())
4416 return error(Fn.
Loc,
"cannot take blockaddress inside a declaration");
4421 GlobalValue *&FwdRef =
4422 ForwardRefBlockAddresses[std::move(Fn)][std::move(Label)];
4430 "type of blockaddress must be a pointer and not '" +
4435 FwdDeclAS = PFS->getFunction().getAddressSpace();
4439 FwdRef =
new GlobalVariable(
4444 ID.ConstantVal = FwdRef;
4452 if (BlockAddressPFS &&
F == &BlockAddressPFS->getFunction()) {
4454 BB = BlockAddressPFS->getBB(
Label.UIntVal,
Label.Loc);
4456 BB = BlockAddressPFS->getBB(
Label.StrVal,
Label.Loc);
4458 return error(
Label.Loc,
"referenced value is not a basic block");
4461 return error(
Label.Loc,
"cannot take address of numeric label after "
4462 "the function is defined");
4464 F->getValueSymbolTable()->lookup(
Label.StrVal));
4466 return error(
Label.Loc,
"referenced value is not a basic block");
4480 if (parseValID(Fn, PFS))
4485 "expected global value name in dso_local_equivalent");
4488 GlobalValue *GV =
nullptr;
4490 GV = NumberedVals.get(Fn.
UIntVal);
4491 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4492 GV = M->getNamedValue(Fn.
StrVal);
4498 ? ForwardRefDSOLocalEquivalentIDs
4499 : ForwardRefDSOLocalEquivalentNames;
4500 GlobalValue *&FwdRef = FwdRefMap[Fn];
4507 ID.ConstantVal = FwdRef;
4513 return error(Fn.
Loc,
"expected a function, alias to function, or ifunc "
4514 "in dso_local_equivalent");
4525 if (parseValID(ID, PFS))
4529 return error(
ID.Loc,
"expected global value name in no_cfi");
4541 Constant *Disc =
nullptr, *AddrDisc =
nullptr,
4542 *DeactivationSymbol =
nullptr;
4545 "expected '(' in constant ptrauth expression") ||
4546 parseGlobalTypeAndValue(Ptr) ||
4548 "expected comma in constant ptrauth expression") ||
4549 parseGlobalTypeAndValue(
Key))
4552 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(Disc))
4554 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(AddrDisc))
4557 parseGlobalTypeAndValue(DeactivationSymbol))
4560 "expected ')' in constant ptrauth expression"))
4564 return error(
ID.Loc,
"constant ptrauth base pointer must be a pointer");
4567 if (!KeyC || KeyC->getBitWidth() != 32)
4568 return error(
ID.Loc,
"constant ptrauth key must be i32 constant");
4570 ConstantInt *DiscC =
nullptr;
4576 "constant ptrauth integer discriminator must be i64 constant");
4582 if (!AddrDisc->getType()->isPointerTy())
4584 ID.Loc,
"constant ptrauth address discriminator must be a pointer");
4589 if (!DeactivationSymbol)
4590 DeactivationSymbol =
4592 if (!DeactivationSymbol->getType()->isPointerTy())
4594 "constant ptrauth deactivation symbol must be a pointer");
4608 unsigned Opc = Lex.getUIntVal();
4609 Type *DestTy =
nullptr;
4612 if (parseToken(
lltok::lparen,
"expected '(' after constantexpr cast") ||
4613 parseGlobalTypeAndValue(SrcVal) ||
4614 parseToken(
lltok::kw_to,
"expected 'to' in constantexpr cast") ||
4615 parseType(DestTy) ||
4616 parseToken(
lltok::rparen,
"expected ')' at end of constantexpr cast"))
4619 return error(
ID.Loc,
"invalid cast opcode for cast from '" +
4628 return error(
ID.Loc,
"extractvalue constexprs are no longer supported");
4630 return error(
ID.Loc,
"insertvalue constexprs are no longer supported");
4632 return error(
ID.Loc,
"udiv constexprs are no longer supported");
4634 return error(
ID.Loc,
"sdiv constexprs are no longer supported");
4636 return error(
ID.Loc,
"urem constexprs are no longer supported");
4638 return error(
ID.Loc,
"srem constexprs are no longer supported");
4640 return error(
ID.Loc,
"fadd constexprs are no longer supported");
4642 return error(
ID.Loc,
"fsub constexprs are no longer supported");
4644 return error(
ID.Loc,
"fmul constexprs are no longer supported");
4646 return error(
ID.Loc,
"fdiv constexprs are no longer supported");
4648 return error(
ID.Loc,
"frem constexprs are no longer supported");
4650 return error(
ID.Loc,
"and constexprs are no longer supported");
4652 return error(
ID.Loc,
"or constexprs are no longer supported");
4654 return error(
ID.Loc,
"lshr constexprs are no longer supported");
4656 return error(
ID.Loc,
"ashr constexprs are no longer supported");
4658 return error(
ID.Loc,
"shl constexprs are no longer supported");
4660 return error(
ID.Loc,
"mul constexprs are no longer supported");
4662 return error(
ID.Loc,
"fneg constexprs are no longer supported");
4664 return error(
ID.Loc,
"select constexprs are no longer supported");
4666 return error(
ID.Loc,
"zext constexprs are no longer supported");
4668 return error(
ID.Loc,
"sext constexprs are no longer supported");
4670 return error(
ID.Loc,
"fptrunc constexprs are no longer supported");
4672 return error(
ID.Loc,
"fpext constexprs are no longer supported");
4674 return error(
ID.Loc,
"uitofp constexprs are no longer supported");
4676 return error(
ID.Loc,
"sitofp constexprs are no longer supported");
4678 return error(
ID.Loc,
"fptoui constexprs are no longer supported");
4680 return error(
ID.Loc,
"fptosi constexprs are no longer supported");
4682 return error(
ID.Loc,
"icmp constexprs are no longer supported");
4684 return error(
ID.Loc,
"fcmp constexprs are no longer supported");
4692 unsigned Opc = Lex.getUIntVal();
4695 if (
Opc == Instruction::Add ||
Opc == Instruction::Sub ||
4696 Opc == Instruction::Mul) {
4705 if (parseToken(
lltok::lparen,
"expected '(' in binary constantexpr") ||
4706 parseGlobalTypeAndValue(Val0) ||
4707 parseToken(
lltok::comma,
"expected comma in binary constantexpr") ||
4708 parseGlobalTypeAndValue(Val1) ||
4709 parseToken(
lltok::rparen,
"expected ')' in binary constantexpr"))
4712 return error(
ID.Loc,
"operands of constexpr must have same type");
4716 "constexpr requires integer or integer vector operands");
4727 if (parseToken(
lltok::lparen,
"expected '(' after vector splat"))
4730 if (parseGlobalTypeAndValue(
C))
4732 if (parseToken(
lltok::rparen,
"expected ')' at end of vector splat"))
4744 unsigned Opc = Lex.getUIntVal();
4747 bool HasInRange =
false;
4753 if (
Opc == Instruction::GetElementPtr) {
4769 return tokError(
"expected integer");
4770 InRangeStart = Lex.getAPSIntVal();
4775 return tokError(
"expected integer");
4776 InRangeEnd = Lex.getAPSIntVal();
4784 if (parseToken(
lltok::lparen,
"expected '(' in constantexpr"))
4787 if (
Opc == Instruction::GetElementPtr) {
4788 if (parseType(Ty) ||
4789 parseToken(
lltok::comma,
"expected comma after getelementptr's type"))
4793 if (parseGlobalValueVector(Elts) ||
4797 if (
Opc == Instruction::GetElementPtr) {
4798 if (Elts.
size() == 0 ||
4799 !Elts[0]->getType()->isPtrOrPtrVectorTy())
4800 return error(
ID.Loc,
"base of getelementptr must be a pointer");
4803 std::optional<ConstantRange>
InRange;
4805 unsigned IndexWidth =
4806 M->getDataLayout().getIndexTypeSizeInBits(
BaseType);
4807 InRangeStart = InRangeStart.
extOrTrunc(IndexWidth);
4808 InRangeEnd = InRangeEnd.
extOrTrunc(IndexWidth);
4809 if (InRangeStart.
sge(InRangeEnd))
4810 return error(
ID.Loc,
"expected end to be larger than start");
4820 for (Constant *Val : Indices) {
4823 return error(
ID.Loc,
"getelementptr index must be an integer");
4826 if (GEPWidth && (ValNumEl != GEPWidth))
4829 "getelementptr vector index has a wrong number of elements");
4832 GEPWidth = ValNumEl;
4836 SmallPtrSet<Type*, 4> Visited;
4837 if (!Indices.empty() && !Ty->
isSized(&Visited))
4838 return error(
ID.Loc,
"base element of getelementptr must be sized");
4841 return error(
ID.Loc,
"invalid base element for constant getelementptr");
4844 return error(
ID.Loc,
"invalid getelementptr indices");
4848 }
else if (
Opc == Instruction::ShuffleVector) {
4849 if (Elts.
size() != 3)
4850 return error(
ID.Loc,
"expected three operands to shufflevector");
4852 return error(
ID.Loc,
"invalid operands to shufflevector");
4853 SmallVector<int, 16>
Mask;
4856 }
else if (
Opc == Instruction::ExtractElement) {
4857 if (Elts.
size() != 2)
4858 return error(
ID.Loc,
"expected two operands to extractelement");
4860 return error(
ID.Loc,
"invalid extractelement operands");
4863 assert(
Opc == Instruction::InsertElement &&
"Unknown opcode");
4864 if (Elts.
size() != 3)
4865 return error(
ID.Loc,
"expected three operands to insertelement");
4867 return error(
ID.Loc,
"invalid insertelement operands");
4882bool LLParser::parseGlobalValue(
Type *Ty, Constant *&
C) {
4886 bool Parsed = parseValID(ID,
nullptr, Ty) ||
4887 convertValIDToValue(Ty, ID, V,
nullptr);
4889 return error(
ID.Loc,
"global values must be constants");
4893bool LLParser::parseGlobalTypeAndValue(Constant *&V) {
4895 return parseType(Ty) || parseGlobalValue(Ty, V);
4898bool LLParser::parseOptionalComdat(StringRef GlobalName, Comdat *&
C) {
4901 LocTy KwLoc = Lex.getLoc();
4907 return tokError(
"expected comdat variable");
4908 C = getComdat(Lex.getStrVal(), Lex.getLoc());
4910 if (parseToken(
lltok::rparen,
"expected ')' after comdat var"))
4913 if (GlobalName.
empty())
4914 return tokError(
"comdat cannot be unnamed");
4915 C = getComdat(std::string(GlobalName), KwLoc);
4924bool LLParser::parseGlobalValueVector(SmallVectorImpl<Constant *> &Elts) {
4938 if (parseGlobalTypeAndValue(
C))
4946bool LLParser::parseMDTuple(MDNode *&MD,
bool IsDistinct) {
4948 if (parseMDNodeVector(Elts))
4959bool LLParser::parseMDNode(MDNode *&
N) {
4961 return parseSpecializedMDNode(
N);
4963 return parseToken(
lltok::exclaim,
"expected '!' here") || parseMDNodeTail(
N);
4966bool LLParser::parseMDNodeTail(MDNode *&
N) {
4969 return parseMDTuple(
N);
4972 return parseMDNodeID(
N);
4978template <
class FieldTy>
struct MDFieldImpl {
4979 typedef MDFieldImpl ImplTy;
4983 void assign(FieldTy Val) {
4985 this->Val = std::move(Val);
4988 explicit MDFieldImpl(FieldTy
Default)
4996template <
class FieldTypeA,
class FieldTypeB>
struct MDEitherFieldImpl {
4997 typedef MDEitherFieldImpl<FieldTypeA, FieldTypeB> ImplTy;
5010 this->
A = std::move(
A);
5016 this->
B = std::move(
B);
5020 explicit MDEitherFieldImpl(FieldTypeA DefaultA, FieldTypeB DefaultB)
5022 WhatIs(IsInvalid) {}
5025struct MDUnsignedField :
public MDFieldImpl<uint64_t> {
5032struct LineField :
public MDUnsignedField {
5033 LineField() : MDUnsignedField(0, UINT32_MAX) {}
5036struct ColumnField :
public MDUnsignedField {
5037 ColumnField() : MDUnsignedField(0, UINT16_MAX) {}
5040struct DwarfTagField :
public MDUnsignedField {
5046struct DwarfMacinfoTypeField :
public MDUnsignedField {
5052struct DwarfAttEncodingField :
public MDUnsignedField {
5053 DwarfAttEncodingField() : MDUnsignedField(0, dwarf::
DW_ATE_hi_user) {}
5056struct DwarfVirtualityField :
public MDUnsignedField {
5060struct DwarfLangField :
public MDUnsignedField {
5064struct DwarfSourceLangNameField :
public MDUnsignedField {
5065 DwarfSourceLangNameField() : MDUnsignedField(0, UINT32_MAX) {}
5068struct DwarfLangDialectField :
public MDUnsignedField {
5069 DwarfLangDialectField()
5073struct DwarfCCField :
public MDUnsignedField {
5074 DwarfCCField() : MDUnsignedField(0, dwarf::
DW_CC_hi_user) {}
5077struct DwarfEnumKindField :
public MDUnsignedField {
5078 DwarfEnumKindField()
5083struct EmissionKindField :
public MDUnsignedField {
5084 EmissionKindField() : MDUnsignedField(0, DICompileUnit::LastEmissionKind) {}
5087struct FixedPointKindField :
public MDUnsignedField {
5088 FixedPointKindField()
5089 : MDUnsignedField(0, DIFixedPointType::LastFixedPointKind) {}
5092struct NameTableKindField :
public MDUnsignedField {
5093 NameTableKindField()
5096 DICompileUnit::DebugNameTableKind::LastDebugNameTableKind) {}
5099struct DIFlagField :
public MDFieldImpl<DINode::DIFlags> {
5100 DIFlagField() : MDFieldImpl(DINode::FlagZero) {}
5103struct DISPFlagField :
public MDFieldImpl<DISubprogram::DISPFlags> {
5104 DISPFlagField() : MDFieldImpl(DISubprogram::SPFlagZero) {}
5107struct MDAPSIntField :
public MDFieldImpl<APSInt> {
5108 MDAPSIntField() : ImplTy(
APSInt()) {}
5111struct MDSignedField :
public MDFieldImpl<int64_t> {
5115 MDSignedField(int64_t
Default = 0)
5117 MDSignedField(int64_t
Default, int64_t Min, int64_t Max)
5121struct MDBoolField :
public MDFieldImpl<bool> {
5125struct MDField :
public MDFieldImpl<Metadata *> {
5128 MDField(
bool AllowNull =
true) : ImplTy(nullptr), AllowNull(AllowNull) {}
5131struct MDStringField :
public MDFieldImpl<MDString *> {
5132 enum class EmptyIs {
5137 MDStringField(
enum EmptyIs EmptyIs = EmptyIs::Null)
5138 : ImplTy(nullptr), EmptyIs(EmptyIs) {}
5141struct MDFieldList :
public MDFieldImpl<SmallVector<Metadata *, 4>> {
5145struct ChecksumKindField :
public MDFieldImpl<DIFile::ChecksumKind> {
5149struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
5150 MDSignedOrMDField(int64_t
Default = 0,
bool AllowNull =
true)
5151 : ImplTy(MDSignedField(
Default), MDField(AllowNull)) {}
5153 MDSignedOrMDField(int64_t
Default, int64_t Min, int64_t Max,
5154 bool AllowNull =
true)
5155 : ImplTy(MDSignedField(
Default, Min,
Max), MDField(AllowNull)) {}
5157 bool isMDSignedField()
const {
return WhatIs == IsTypeA; }
5158 bool isMDField()
const {
return WhatIs == IsTypeB; }
5159 int64_t getMDSignedValue()
const {
5160 assert(isMDSignedField() &&
"Wrong field type");
5163 Metadata *getMDFieldValue()
const {
5164 assert(isMDField() &&
"Wrong field type");
5169struct MDUnsignedOrMDField : MDEitherFieldImpl<MDUnsignedField, MDField> {
5171 : ImplTy(MDUnsignedField(
Default), MDField(AllowNull)) {}
5174 : ImplTy(MDUnsignedField(
Default,
Max), MDField(AllowNull)) {}
5176 bool isMDUnsignedField()
const {
return WhatIs == IsTypeA; }
5177 bool isMDField()
const {
return WhatIs == IsTypeB; }
5178 uint64_t getMDUnsignedValue()
const {
5179 assert(isMDUnsignedField() &&
"Wrong field type");
5182 Metadata *getMDFieldValue()
const {
5183 assert(isMDField() &&
"Wrong field type");
5188 if (isMDUnsignedField())
5190 ConstantInt::get(Type::getInt64Ty(
Context), getMDUnsignedValue()));
5192 return getMDFieldValue();
5204 return tokError(
"expected integer");
5206 Result.assign(Lex.getAPSIntVal());
5213 MDUnsignedField &Result) {
5214 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
5215 return tokError(
"expected unsigned integer");
5217 auto &U = Lex.getAPSIntVal();
5218 if (U.ugt(Result.Max))
5219 return tokError(
"value for '" + Name +
"' too large, limit is " +
5221 Result.assign(U.getZExtValue());
5222 assert(Result.Val <= Result.Max &&
"Expected value in range");
5229 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5233 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5239 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5242 return tokError(
"expected DWARF tag");
5246 return tokError(
"invalid DWARF tag" +
Twine(
" '") + Lex.getStrVal() +
"'");
5247 assert(
Tag <= Result.Max &&
"Expected valid DWARF tag");
5256 DwarfMacinfoTypeField &Result) {
5258 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5261 return tokError(
"expected DWARF macinfo type");
5265 return tokError(
"invalid DWARF macinfo type" +
Twine(
" '") +
5266 Lex.getStrVal() +
"'");
5267 assert(Macinfo <= Result.Max &&
"Expected valid DWARF macinfo type");
5269 Result.assign(Macinfo);
5276 DwarfVirtualityField &Result) {
5278 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5281 return tokError(
"expected DWARF virtuality code");
5285 return tokError(
"invalid DWARF virtuality code" +
Twine(
" '") +
5286 Lex.getStrVal() +
"'");
5287 assert(Virtuality <= Result.Max &&
"Expected valid DWARF virtuality code");
5288 Result.assign(Virtuality);
5295 DwarfEnumKindField &Result) {
5297 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5300 return tokError(
"expected DWARF enum kind code");
5304 return tokError(
"invalid DWARF enum kind code" +
Twine(
" '") +
5305 Lex.getStrVal() +
"'");
5306 assert(EnumKind <= Result.Max &&
"Expected valid DWARF enum kind code");
5307 Result.assign(EnumKind);
5315 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5318 return tokError(
"expected DWARF language");
5322 return tokError(
"invalid DWARF language" +
Twine(
" '") + Lex.getStrVal() +
5324 assert(Lang <= Result.Max &&
"Expected valid DWARF language");
5325 Result.assign(Lang);
5332 DwarfSourceLangNameField &Result) {
5334 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5337 return tokError(
"expected DWARF source language name");
5341 return tokError(
"invalid DWARF source language name" +
Twine(
" '") +
5342 Lex.getStrVal() +
"'");
5343 assert(Lang <= Result.Max &&
"Expected valid DWARF source language name");
5344 Result.assign(Lang);
5351 DwarfLangDialectField &Result) {
5356 if (Lex.getAPSIntVal() == 0)
5357 return tokError(
"value for 'dialect' must be a known DWARF language "
5358 "dialect (DW_LLVM_LANG_DIALECT_simt or "
5359 "DW_LLVM_LANG_DIALECT_tile)");
5360 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5364 return tokError(
"expected DWARF language dialect");
5366 StringRef DialectString = Lex.getStrVal();
5371 if (Dialect > Result.Max)
5372 return tokError(
"invalid DWARF language dialect" +
Twine(
" '") +
5373 DialectString +
"'");
5374 Result.assign(Dialect);
5382 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5385 return tokError(
"expected DWARF calling convention");
5389 return tokError(
"invalid DWARF calling convention" +
Twine(
" '") +
5390 Lex.getStrVal() +
"'");
5391 assert(CC <= Result.Max &&
"Expected valid DWARF calling convention");
5399 EmissionKindField &Result) {
5401 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5404 return tokError(
"expected emission kind");
5408 return tokError(
"invalid emission kind" +
Twine(
" '") + Lex.getStrVal() +
5410 assert(*Kind <= Result.Max &&
"Expected valid emission kind");
5411 Result.assign(*Kind);
5418 FixedPointKindField &Result) {
5420 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5423 return tokError(
"expected fixed-point kind");
5427 return tokError(
"invalid fixed-point kind" +
Twine(
" '") + Lex.getStrVal() +
5429 assert(*Kind <= Result.Max &&
"Expected valid fixed-point kind");
5430 Result.assign(*Kind);
5437 NameTableKindField &Result) {
5439 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5442 return tokError(
"expected nameTable kind");
5446 return tokError(
"invalid nameTable kind" +
Twine(
" '") + Lex.getStrVal() +
5448 assert(((
unsigned)*Kind) <= Result.Max &&
"Expected valid nameTable kind");
5449 Result.assign((
unsigned)*Kind);
5456 DwarfAttEncodingField &Result) {
5458 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5461 return tokError(
"expected DWARF type attribute encoding");
5465 return tokError(
"invalid DWARF type attribute encoding" +
Twine(
" '") +
5466 Lex.getStrVal() +
"'");
5467 assert(Encoding <= Result.Max &&
"Expected valid DWARF language");
5468 Result.assign(Encoding);
5482 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5484 bool Res = parseUInt32(TempVal);
5490 return tokError(
"expected debug info flag");
5494 return tokError(
Twine(
"invalid debug info flag '") + Lex.getStrVal() +
5509 Result.assign(Combined);
5522 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5524 bool Res = parseUInt32(TempVal);
5530 return tokError(
"expected debug info flag");
5534 return tokError(
Twine(
"invalid subprogram debug info flag '") +
5535 Lex.getStrVal() +
"'");
5549 Result.assign(Combined);
5556 return tokError(
"expected signed integer");
5558 auto &S = Lex.getAPSIntVal();
5560 return tokError(
"value for '" + Name +
"' too small, limit is " +
5563 return tokError(
"value for '" + Name +
"' too large, limit is " +
5565 Result.assign(S.getExtValue());
5566 assert(Result.Val >= Result.Min &&
"Expected value in range");
5567 assert(Result.Val <= Result.Max &&
"Expected value in range");
5574 switch (Lex.getKind()) {
5576 return tokError(
"expected 'true' or 'false'");
5578 Result.assign(
true);
5581 Result.assign(
false);
5591 if (!Result.AllowNull)
5592 return tokError(
"'" + Name +
"' cannot be null");
5594 Result.assign(
nullptr);
5599 if (parseMetadata(MD,
nullptr))
5608 MDSignedOrMDField &Result) {
5611 MDSignedField Res = Result.A;
5612 if (!parseMDField(
Loc, Name, Res)) {
5620 MDField Res = Result.B;
5621 if (!parseMDField(
Loc, Name, Res)) {
5631 MDUnsignedOrMDField &Result) {
5634 MDUnsignedField Res = Result.A;
5635 if (!parseMDField(
Loc, Name, Res)) {
5643 MDField Res = Result.B;
5644 if (!parseMDField(
Loc, Name, Res)) {
5654 LocTy ValueLoc = Lex.getLoc();
5656 if (parseStringConstant(S))
5660 switch (Result.EmptyIs) {
5661 case MDStringField::EmptyIs::Null:
5662 Result.assign(
nullptr);
5664 case MDStringField::EmptyIs::Empty:
5666 case MDStringField::EmptyIs::Error:
5667 return error(ValueLoc,
"'" + Name +
"' cannot be empty");
5678 if (parseMDNodeVector(MDs))
5681 Result.assign(std::move(MDs));
5687 ChecksumKindField &Result) {
5688 std::optional<DIFile::ChecksumKind> CSKind =
5692 return tokError(
"invalid checksum kind" +
Twine(
" '") + Lex.getStrVal() +
5695 Result.assign(*CSKind);
5702template <
class ParserTy>
5703bool LLParser::parseMDFieldsImplBody(ParserTy ParseField) {
5706 return tokError(
"expected field label here");
5715template <
class ParserTy>
5716bool LLParser::parseMDFieldsImpl(ParserTy ParseField, LocTy &ClosingLoc) {
5723 if (parseMDFieldsImplBody(ParseField))
5726 ClosingLoc = Lex.getLoc();
5730template <
class FieldTy>
5731bool LLParser::parseMDField(
StringRef Name, FieldTy &Result) {
5733 return tokError(
"field '" + Name +
"' cannot be specified more than once");
5735 LocTy Loc = Lex.getLoc();
5737 return parseMDField(Loc, Name, Result);
5740bool LLParser::parseSpecializedMDNode(
MDNode *&
N,
bool IsDistinct) {
5743#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
5744 if (Lex.getStrVal() == #CLASS) \
5745 return parse##CLASS(N, IsDistinct);
5746#include "llvm/IR/Metadata.def"
5748 return tokError(
"expected metadata type");
5751#define DECLARE_FIELD(NAME, TYPE, INIT) TYPE NAME INIT
5752#define NOP_FIELD(NAME, TYPE, INIT)
5753#define REQUIRE_FIELD(NAME, TYPE, INIT) \
5755 return error(ClosingLoc, "missing required field '" #NAME "'");
5756#define PARSE_MD_FIELD(NAME, TYPE, DEFAULT) \
5757 if (Lex.getStrVal() == #NAME) \
5758 return parseMDField(#NAME, NAME);
5759#define PARSE_MD_FIELDS() \
5760 VISIT_MD_FIELDS(DECLARE_FIELD, DECLARE_FIELD) \
5763 if (parseMDFieldsImpl( \
5765 VISIT_MD_FIELDS(PARSE_MD_FIELD, PARSE_MD_FIELD) \
5766 return tokError(Twine("invalid field '") + Lex.getStrVal() + \
5771 VISIT_MD_FIELDS(NOP_FIELD, REQUIRE_FIELD) \
5773#define GET_OR_DISTINCT(CLASS, ARGS) \
5774 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
5779bool LLParser::parseDILocation(
MDNode *&Result,
bool IsDistinct) {
5780#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5781 OPTIONAL(line, LineField, ); \
5782 OPTIONAL(column, ColumnField, ); \
5783 REQUIRED(scope, MDField, ( false)); \
5784 OPTIONAL(inlinedAt, MDField, ); \
5785 OPTIONAL(isImplicitCode, MDBoolField, (false)); \
5786 OPTIONAL(atomGroup, MDUnsignedField, (0, UINT64_MAX)); \
5787 OPTIONAL(atomRank, MDUnsignedField, (0, UINT8_MAX));
5789#undef VISIT_MD_FIELDS
5792 DILocation, (Context, line.Val, column.Val, scope.Val, inlinedAt.Val,
5793 isImplicitCode.Val, atomGroup.Val, atomRank.Val));
5799bool LLParser::parseDIAssignID(
MDNode *&Result,
bool IsDistinct) {
5801 return tokError(
"missing 'distinct', required for !DIAssignID()");
5817bool LLParser::parseGenericDINode(
MDNode *&Result,
bool IsDistinct) {
5818#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5819 REQUIRED(tag, DwarfTagField, ); \
5820 OPTIONAL(header, MDStringField, ); \
5821 OPTIONAL(operands, MDFieldList, );
5823#undef VISIT_MD_FIELDS
5826 (Context, tag.Val, header.Val, operands.Val));
5835bool LLParser::parseDISubrangeType(
MDNode *&Result,
bool IsDistinct) {
5836#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5837 OPTIONAL(name, MDStringField, ); \
5838 OPTIONAL(file, MDField, ); \
5839 OPTIONAL(line, LineField, ); \
5840 OPTIONAL(scope, MDField, ); \
5841 OPTIONAL(baseType, MDField, ); \
5842 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5843 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5844 OPTIONAL(flags, DIFlagField, ); \
5845 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5846 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5847 OPTIONAL(stride, MDSignedOrMDField, ); \
5848 OPTIONAL(bias, MDSignedOrMDField, );
5850#undef VISIT_MD_FIELDS
5852 auto convToMetadata = [&](MDSignedOrMDField Bound) ->
Metadata * {
5853 if (Bound.isMDSignedField())
5856 if (Bound.isMDField())
5857 return Bound.getMDFieldValue();
5863 Metadata *Stride = convToMetadata(stride);
5864 Metadata *Bias = convToMetadata(bias);
5867 DISubrangeType, (Context,
name.Val,
file.Val, line.Val, scope.Val,
5868 size.getValueAsMetadata(Context),
align.Val, flags.Val,
5869 baseType.Val, LowerBound, UpperBound, Stride, Bias));
5878bool LLParser::parseDISubrange(
MDNode *&Result,
bool IsDistinct) {
5879#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5880 OPTIONAL(count, MDSignedOrMDField, (-1, -1, INT64_MAX, false)); \
5881 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5882 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5883 OPTIONAL(stride, MDSignedOrMDField, );
5885#undef VISIT_MD_FIELDS
5892 auto convToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5893 if (Bound.isMDSignedField())
5896 if (Bound.isMDField())
5897 return Bound.getMDFieldValue();
5904 Stride = convToMetadata(stride);
5907 (Context,
Count, LowerBound, UpperBound, Stride));
5915bool LLParser::parseDIGenericSubrange(
MDNode *&Result,
bool IsDistinct) {
5916#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5917 OPTIONAL(count, MDSignedOrMDField, ); \
5918 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5919 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5920 OPTIONAL(stride, MDSignedOrMDField, );
5922#undef VISIT_MD_FIELDS
5924 auto ConvToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5925 if (Bound.isMDSignedField())
5927 Context, {dwarf::DW_OP_consts,
5928 static_cast<uint64_t>(Bound.getMDSignedValue())});
5929 if (Bound.isMDField())
5930 return Bound.getMDFieldValue();
5937 Metadata *Stride = ConvToMetadata(stride);
5940 (Context,
Count, LowerBound, UpperBound, Stride));
5947bool LLParser::parseDIEnumerator(
MDNode *&Result,
bool IsDistinct) {
5948#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5949 REQUIRED(name, MDStringField, ); \
5950 REQUIRED(value, MDAPSIntField, ); \
5951 OPTIONAL(isUnsigned, MDBoolField, (false));
5953#undef VISIT_MD_FIELDS
5955 if (isUnsigned.Val && value.Val.isNegative())
5956 return tokError(
"unsigned enumerator with negative value");
5961 if (!isUnsigned.Val && value.Val.isUnsigned() && value.Val.isSignBitSet())
5973bool LLParser::parseDIBasicType(
MDNode *&Result,
bool IsDistinct) {
5974#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5975 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5976 OPTIONAL(name, MDStringField, ); \
5977 OPTIONAL(file, MDField, ); \
5978 OPTIONAL(line, LineField, ); \
5979 OPTIONAL(scope, MDField, ); \
5980 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5981 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5982 OPTIONAL(dataSize, MDUnsignedField, (0, UINT32_MAX)); \
5983 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5984 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5985 OPTIONAL(flags, DIFlagField, );
5987#undef VISIT_MD_FIELDS
5990 DIBasicType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
5991 size.getValueAsMetadata(Context),
align.Val, encoding.Val,
5992 num_extra_inhabitants.Val, dataSize.Val, flags.Val));
6001bool LLParser::parseDIFixedPointType(
MDNode *&Result,
bool IsDistinct) {
6002#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6003 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
6004 OPTIONAL(name, MDStringField, ); \
6005 OPTIONAL(file, MDField, ); \
6006 OPTIONAL(line, LineField, ); \
6007 OPTIONAL(scope, MDField, ); \
6008 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6009 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6010 OPTIONAL(encoding, DwarfAttEncodingField, ); \
6011 OPTIONAL(flags, DIFlagField, ); \
6012 OPTIONAL(kind, FixedPointKindField, ); \
6013 OPTIONAL(factor, MDSignedField, ); \
6014 OPTIONAL(numerator, MDAPSIntField, ); \
6015 OPTIONAL(denominator, MDAPSIntField, );
6017#undef VISIT_MD_FIELDS
6020 (Context, tag.Val,
name.Val,
file.Val, line.Val,
6021 scope.Val,
size.getValueAsMetadata(Context),
6022 align.Val, encoding.Val, flags.Val, kind.Val,
6023 factor.Val, numerator.Val, denominator.Val));
6029bool LLParser::parseDIStringType(
MDNode *&Result,
bool IsDistinct) {
6030#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6031 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_string_type)); \
6032 OPTIONAL(name, MDStringField, ); \
6033 OPTIONAL(stringLength, MDField, ); \
6034 OPTIONAL(stringLengthExpression, MDField, ); \
6035 OPTIONAL(stringLocationExpression, MDField, ); \
6036 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6037 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6038 OPTIONAL(encoding, DwarfAttEncodingField, );
6040#undef VISIT_MD_FIELDS
6044 (Context, tag.Val,
name.Val, stringLength.Val, stringLengthExpression.Val,
6045 stringLocationExpression.Val,
size.getValueAsMetadata(Context),
6046 align.Val, encoding.Val));
6059bool LLParser::parseDIDerivedType(
MDNode *&Result,
bool IsDistinct) {
6060#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6061 REQUIRED(tag, DwarfTagField, ); \
6062 OPTIONAL(name, MDStringField, ); \
6063 OPTIONAL(file, MDField, ); \
6064 OPTIONAL(line, LineField, ); \
6065 OPTIONAL(scope, MDField, ); \
6066 REQUIRED(baseType, MDField, ); \
6067 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6068 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6069 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6070 OPTIONAL(flags, DIFlagField, ); \
6071 OPTIONAL(extraData, MDField, ); \
6072 OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
6073 OPTIONAL(annotations, MDField, ); \
6074 OPTIONAL(ptrAuthKey, MDUnsignedField, (0, 7)); \
6075 OPTIONAL(ptrAuthIsAddressDiscriminated, MDBoolField, ); \
6076 OPTIONAL(ptrAuthExtraDiscriminator, MDUnsignedField, (0, 0xffff)); \
6077 OPTIONAL(ptrAuthIsaPointer, MDBoolField, ); \
6078 OPTIONAL(ptrAuthAuthenticatesNullValues, MDBoolField, );
6080#undef VISIT_MD_FIELDS
6082 std::optional<unsigned> DWARFAddressSpace;
6083 if (dwarfAddressSpace.Val != UINT32_MAX)
6084 DWARFAddressSpace = dwarfAddressSpace.Val;
6085 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
6087 PtrAuthData.emplace(
6088 (
unsigned)ptrAuthKey.Val, ptrAuthIsAddressDiscriminated.Val,
6089 (
unsigned)ptrAuthExtraDiscriminator.Val, ptrAuthIsaPointer.Val,
6090 ptrAuthAuthenticatesNullValues.Val);
6093 DIDerivedType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
6094 baseType.Val,
size.getValueAsMetadata(Context),
align.Val,
6095 offset.getValueAsMetadata(Context), DWARFAddressSpace,
6096 PtrAuthData, flags.Val, extraData.Val, annotations.Val));
6100bool LLParser::parseDICompositeType(
MDNode *&Result,
bool IsDistinct) {
6101#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6102 REQUIRED(tag, DwarfTagField, ); \
6103 OPTIONAL(name, MDStringField, ); \
6104 OPTIONAL(file, MDField, ); \
6105 OPTIONAL(line, LineField, ); \
6106 OPTIONAL(scope, MDField, ); \
6107 OPTIONAL(baseType, MDField, ); \
6108 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6109 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6110 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6111 OPTIONAL(flags, DIFlagField, ); \
6112 OPTIONAL(elements, MDField, ); \
6113 OPTIONAL(runtimeLang, DwarfLangField, ); \
6114 OPTIONAL(enumKind, DwarfEnumKindField, ); \
6115 OPTIONAL(vtableHolder, MDField, ); \
6116 OPTIONAL(templateParams, MDField, ); \
6117 OPTIONAL(identifier, MDStringField, ); \
6118 OPTIONAL(discriminator, MDField, ); \
6119 OPTIONAL(dataLocation, MDField, ); \
6120 OPTIONAL(associated, MDField, ); \
6121 OPTIONAL(allocated, MDField, ); \
6122 OPTIONAL(rank, MDSignedOrMDField, ); \
6123 OPTIONAL(annotations, MDField, ); \
6124 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
6125 OPTIONAL(specification, MDField, ); \
6126 OPTIONAL(bitStride, MDField, );
6128#undef VISIT_MD_FIELDS
6131 if (rank.isMDSignedField())
6134 else if (rank.isMDField())
6135 Rank = rank.getMDFieldValue();
6137 std::optional<unsigned> EnumKind;
6139 EnumKind = enumKind.Val;
6144 Context, *identifier.Val, tag.Val,
name.Val,
file.Val, line.Val,
6145 scope.Val, baseType.Val,
size.getValueAsMetadata(Context),
6146 align.Val, offset.getValueAsMetadata(Context), specification.Val,
6147 num_extra_inhabitants.Val, flags.Val, elements.Val, runtimeLang.Val,
6148 EnumKind, vtableHolder.Val, templateParams.Val, discriminator.Val,
6149 dataLocation.Val, associated.Val, allocated.Val, Rank,
6150 annotations.Val, bitStride.Val)) {
6159 (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val, baseType.Val,
6160 size.getValueAsMetadata(Context),
align.Val,
6161 offset.getValueAsMetadata(Context), flags.Val, elements.Val,
6162 runtimeLang.Val, EnumKind, vtableHolder.Val, templateParams.Val,
6163 identifier.Val, discriminator.Val, dataLocation.Val, associated.Val,
6164 allocated.Val, Rank, annotations.Val, specification.Val,
6165 num_extra_inhabitants.Val, bitStride.Val));
6169bool LLParser::parseDISubroutineType(
MDNode *&Result,
bool IsDistinct) {
6170#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6171 OPTIONAL(flags, DIFlagField, ); \
6172 OPTIONAL(cc, DwarfCCField, ); \
6173 REQUIRED(types, MDField, );
6175#undef VISIT_MD_FIELDS
6178 (Context, flags.Val, cc.Val, types.Val));
6187bool LLParser::parseDIFile(
MDNode *&Result,
bool IsDistinct) {
6191#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6192 REQUIRED(filename, MDStringField, ); \
6193 REQUIRED(directory, MDStringField, ); \
6194 OPTIONAL(checksumkind, ChecksumKindField, (DIFile::CSK_MD5)); \
6195 OPTIONAL(checksum, MDStringField, ); \
6196 OPTIONAL(source, MDStringField, (MDStringField::EmptyIs::Empty));
6198#undef VISIT_MD_FIELDS
6200 std::optional<DIFile::ChecksumInfo<MDString *>> OptChecksum;
6201 if (checksumkind.Seen && checksum.Seen)
6202 OptChecksum.emplace(checksumkind.Val, checksum.Val);
6203 else if (checksumkind.Seen || checksum.Seen)
6204 return tokError(
"'checksumkind' and 'checksum' must be provided together");
6206 MDString *
Source =
nullptr;
6210 DIFile, (Context,
filename.Val, directory.Val, OptChecksum, Source));
6222bool LLParser::parseDICompileUnit(
MDNode *&Result,
bool IsDistinct) {
6224 return tokError(
"missing 'distinct', required for !DICompileUnit");
6226 LocTy Loc = Lex.getLoc();
6228#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6229 REQUIRED(file, MDField, ( false)); \
6230 OPTIONAL(language, DwarfLangField, ); \
6231 OPTIONAL(sourceLanguageName, DwarfSourceLangNameField, ); \
6232 OPTIONAL(sourceLanguageVersion, MDUnsignedField, (0, UINT32_MAX)); \
6233 OPTIONAL(producer, MDStringField, ); \
6234 OPTIONAL(isOptimized, MDBoolField, ); \
6235 OPTIONAL(flags, MDStringField, ); \
6236 OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); \
6237 OPTIONAL(splitDebugFilename, MDStringField, ); \
6238 OPTIONAL(emissionKind, EmissionKindField, ); \
6239 OPTIONAL(enums, MDField, ); \
6240 OPTIONAL(retainedTypes, MDField, ); \
6241 OPTIONAL(globals, MDField, ); \
6242 OPTIONAL(imports, MDField, ); \
6243 OPTIONAL(macros, MDField, ); \
6244 OPTIONAL(dwoId, MDUnsignedField, ); \
6245 OPTIONAL(splitDebugInlining, MDBoolField, = true); \
6246 OPTIONAL(debugInfoForProfiling, MDBoolField, = false); \
6247 OPTIONAL(nameTableKind, NameTableKindField, ); \
6248 OPTIONAL(rangesBaseAddress, MDBoolField, = false); \
6249 OPTIONAL(sysroot, MDStringField, ); \
6250 OPTIONAL(sdk, MDStringField, ); \
6251 OPTIONAL(dialect, DwarfLangDialectField, );
6253#undef VISIT_MD_FIELDS
6255 if (!language.Seen && !sourceLanguageName.Seen)
6256 return error(Loc,
"missing one of 'language' or 'sourceLanguageName', "
6257 "required for !DICompileUnit");
6259 if (language.Seen && sourceLanguageName.Seen)
6260 return error(Loc,
"can only specify one of 'language' and "
6261 "'sourceLanguageName' on !DICompileUnit");
6263 if (sourceLanguageVersion.Seen && !sourceLanguageName.Seen)
6264 return error(Loc,
"'sourceLanguageVersion' requires an associated "
6265 "'sourceLanguageName' on !DICompileUnit");
6267 uint16_t Dialect =
static_cast<uint16_t
>(dialect.Val);
6270 ? DISourceLanguageName(
static_cast<uint16_t
>(language.Val), Dialect)
6271 : DISourceLanguageName(
6272 static_cast<uint16_t>(sourceLanguageName.Val),
6273 static_cast<uint32_t>(sourceLanguageVersion.Val), Dialect);
6276 Context, SourceLanguage,
file.Val, producer.Val, isOptimized.Val,
6277 flags.Val, runtimeVersion.Val, splitDebugFilename.Val, emissionKind.Val,
6278 enums.Val, retainedTypes.Val,
globals.Val, imports.Val, macros.Val,
6279 dwoId.Val, splitDebugInlining.Val, debugInfoForProfiling.Val,
6280 nameTableKind.Val, rangesBaseAddress.Val, sysroot.Val, sdk.Val);
6293bool LLParser::parseDISubprogram(
MDNode *&Result,
bool IsDistinct) {
6294 auto Loc = Lex.getLoc();
6295#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6296 OPTIONAL(scope, MDField, ); \
6297 OPTIONAL(name, MDStringField, ); \
6298 OPTIONAL(linkageName, MDStringField, ); \
6299 OPTIONAL(file, MDField, ); \
6300 OPTIONAL(line, LineField, ); \
6301 REQUIRED(type, MDField, ( false)); \
6302 OPTIONAL(isLocal, MDBoolField, ); \
6303 OPTIONAL(isDefinition, MDBoolField, (true)); \
6304 OPTIONAL(scopeLine, LineField, ); \
6305 OPTIONAL(containingType, MDField, ); \
6306 OPTIONAL(virtuality, DwarfVirtualityField, ); \
6307 OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); \
6308 OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); \
6309 OPTIONAL(flags, DIFlagField, ); \
6310 OPTIONAL(spFlags, DISPFlagField, ); \
6311 OPTIONAL(isOptimized, MDBoolField, ); \
6312 OPTIONAL(unit, MDField, ); \
6313 OPTIONAL(templateParams, MDField, ); \
6314 OPTIONAL(declaration, MDField, ); \
6315 OPTIONAL(retainedNodes, MDField, ); \
6316 OPTIONAL(thrownTypes, MDField, ); \
6317 OPTIONAL(annotations, MDField, ); \
6318 OPTIONAL(targetFuncName, MDStringField, ); \
6319 OPTIONAL(keyInstructions, MDBoolField, );
6321#undef VISIT_MD_FIELDS
6326 spFlags.Seen ? spFlags.Val
6328 isOptimized.Val, virtuality.Val);
6329 if ((SPFlags & DISubprogram::SPFlagDefinition) && !IsDistinct)
6332 "missing 'distinct', required for !DISubprogram that is a Definition");
6335 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val, line.Val,
6336 type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
6337 thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
6338 declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
6339 targetFuncName.Val, keyInstructions.Val));
6349bool LLParser::parseDILexicalBlock(
MDNode *&Result,
bool IsDistinct) {
6350#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6351 REQUIRED(scope, MDField, ( false)); \
6352 OPTIONAL(file, MDField, ); \
6353 OPTIONAL(line, LineField, ); \
6354 OPTIONAL(column, ColumnField, );
6356#undef VISIT_MD_FIELDS
6359 DILexicalBlock, (Context, scope.Val,
file.Val, line.Val, column.Val));
6365bool LLParser::parseDILexicalBlockFile(
MDNode *&Result,
bool IsDistinct) {
6366#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6367 REQUIRED(scope, MDField, ( false)); \
6368 OPTIONAL(file, MDField, ); \
6369 REQUIRED(discriminator, MDUnsignedField, (0, UINT32_MAX));
6371#undef VISIT_MD_FIELDS
6374 (Context, scope.Val,
file.Val, discriminator.Val));
6380bool LLParser::parseDICommonBlock(
MDNode *&Result,
bool IsDistinct) {
6381#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6382 REQUIRED(scope, MDField, ); \
6383 OPTIONAL(declaration, MDField, ); \
6384 OPTIONAL(name, MDStringField, ); \
6385 OPTIONAL(file, MDField, ); \
6386 OPTIONAL(line, LineField, );
6388#undef VISIT_MD_FIELDS
6391 (Context, scope.Val, declaration.Val,
name.Val,
6392 file.Val, line.Val));
6398bool LLParser::parseDINamespace(
MDNode *&Result,
bool IsDistinct) {
6399#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6400 REQUIRED(scope, MDField, ); \
6401 OPTIONAL(name, MDStringField, ); \
6402 OPTIONAL(exportSymbols, MDBoolField, );
6404#undef VISIT_MD_FIELDS
6407 (Context, scope.Val,
name.Val, exportSymbols.Val));
6414bool LLParser::parseDIMacro(
MDNode *&Result,
bool IsDistinct) {
6415#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6416 REQUIRED(type, DwarfMacinfoTypeField, ); \
6417 OPTIONAL(line, LineField, ); \
6418 REQUIRED(name, MDStringField, ); \
6419 OPTIONAL(value, MDStringField, );
6421#undef VISIT_MD_FIELDS
6424 (Context, type.Val, line.Val,
name.Val, value.Val));
6430bool LLParser::parseDIMacroFile(
MDNode *&Result,
bool IsDistinct) {
6431#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6432 OPTIONAL(type, DwarfMacinfoTypeField, (dwarf::DW_MACINFO_start_file)); \
6433 OPTIONAL(line, LineField, ); \
6434 REQUIRED(file, MDField, ); \
6435 OPTIONAL(nodes, MDField, );
6437#undef VISIT_MD_FIELDS
6440 (Context, type.Val, line.Val,
file.Val,
nodes.Val));
6448bool LLParser::parseDIModule(
MDNode *&Result,
bool IsDistinct) {
6449#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6450 REQUIRED(scope, MDField, ); \
6451 REQUIRED(name, MDStringField, ); \
6452 OPTIONAL(configMacros, MDStringField, ); \
6453 OPTIONAL(includePath, MDStringField, ); \
6454 OPTIONAL(apinotes, MDStringField, ); \
6455 OPTIONAL(file, MDField, ); \
6456 OPTIONAL(line, LineField, ); \
6457 OPTIONAL(isDecl, MDBoolField, );
6459#undef VISIT_MD_FIELDS
6462 configMacros.Val, includePath.Val,
6463 apinotes.Val, line.Val, isDecl.Val));
6469bool LLParser::parseDITemplateTypeParameter(
MDNode *&Result,
bool IsDistinct) {
6470#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6471 OPTIONAL(name, MDStringField, ); \
6472 REQUIRED(type, MDField, ); \
6473 OPTIONAL(defaulted, MDBoolField, );
6475#undef VISIT_MD_FIELDS
6478 (Context,
name.Val, type.Val, defaulted.Val));
6486bool LLParser::parseDITemplateValueParameter(
MDNode *&Result,
bool IsDistinct) {
6487#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6488 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_template_value_parameter)); \
6489 OPTIONAL(name, MDStringField, ); \
6490 OPTIONAL(type, MDField, ); \
6491 OPTIONAL(defaulted, MDBoolField, ); \
6492 REQUIRED(value, MDField, );
6495#undef VISIT_MD_FIELDS
6498 DITemplateValueParameter,
6499 (Context, tag.Val,
name.Val, type.Val, defaulted.Val, value.Val));
6508bool LLParser::parseDIGlobalVariable(
MDNode *&Result,
bool IsDistinct) {
6509#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6510 OPTIONAL(name, MDStringField, (MDStringField::EmptyIs::Error)); \
6511 OPTIONAL(scope, MDField, ); \
6512 OPTIONAL(linkageName, MDStringField, ); \
6513 OPTIONAL(file, MDField, ); \
6514 OPTIONAL(line, LineField, ); \
6515 OPTIONAL(type, MDField, ); \
6516 OPTIONAL(isLocal, MDBoolField, ); \
6517 OPTIONAL(isDefinition, MDBoolField, (true)); \
6518 OPTIONAL(templateParams, MDField, ); \
6519 OPTIONAL(declaration, MDField, ); \
6520 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6521 OPTIONAL(annotations, MDField, );
6523#undef VISIT_MD_FIELDS
6527 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val,
6528 line.Val, type.Val, isLocal.Val, isDefinition.Val,
6529 declaration.Val, templateParams.Val,
align.Val,
6541bool LLParser::parseDILocalVariable(
MDNode *&Result,
bool IsDistinct) {
6542#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6543 REQUIRED(scope, MDField, ( false)); \
6544 OPTIONAL(name, MDStringField, ); \
6545 OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); \
6546 OPTIONAL(file, MDField, ); \
6547 OPTIONAL(line, LineField, ); \
6548 OPTIONAL(type, MDField, ); \
6549 OPTIONAL(flags, DIFlagField, ); \
6550 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6551 OPTIONAL(annotations, MDField, );
6553#undef VISIT_MD_FIELDS
6556 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6557 type.Val, arg.Val, flags.Val,
align.Val,
6564bool LLParser::parseDILabel(
MDNode *&Result,
bool IsDistinct) {
6565#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6566 REQUIRED(scope, MDField, ( false)); \
6567 REQUIRED(name, MDStringField, ); \
6568 REQUIRED(file, MDField, ); \
6569 REQUIRED(line, LineField, ); \
6570 OPTIONAL(column, ColumnField, ); \
6571 OPTIONAL(isArtificial, MDBoolField, ); \
6572 OPTIONAL(coroSuspendIdx, MDUnsignedField, );
6574#undef VISIT_MD_FIELDS
6576 std::optional<unsigned> CoroSuspendIdx =
6577 coroSuspendIdx.Seen ? std::optional<unsigned>(coroSuspendIdx.Val)
6581 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6582 column.Val, isArtificial.Val, CoroSuspendIdx));
6588bool LLParser::parseDIExpressionBody(
MDNode *&Result,
bool IsDistinct) {
6601 return tokError(Twine(
"invalid DWARF op '") + Lex.getStrVal() +
"'");
6610 return tokError(Twine(
"invalid DWARF attribute encoding '") +
6611 Lex.getStrVal() +
"'");
6614 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
6615 return tokError(
"expected unsigned integer");
6617 auto &
U = Lex.getAPSIntVal();
6619 return tokError(
"element too large, limit is " + Twine(
UINT64_MAX));
6633bool LLParser::parseDIExpression(
MDNode *&Result,
bool IsDistinct) {
6635 assert(Lex.getStrVal() ==
"DIExpression" &&
"Expected '!DIExpression'");
6638 return parseDIExpressionBody(Result, IsDistinct);
6643bool LLParser::parseDIArgList(
Metadata *&MD, PerFunctionState *PFS) {
6644 assert(PFS &&
"Expected valid function state");
6655 if (parseValueAsMetadata(MD,
"expected value-as-metadata operand", PFS))
6669bool LLParser::parseDIGlobalVariableExpression(
MDNode *&Result,
6671#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6672 REQUIRED(var, MDField, ); \
6673 REQUIRED(expr, MDField, );
6675#undef VISIT_MD_FIELDS
6678 GET_OR_DISTINCT(DIGlobalVariableExpression, (Context, var.Val, expr.Val));
6685bool LLParser::parseDIObjCProperty(
MDNode *&Result,
bool IsDistinct) {
6686#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6687 OPTIONAL(name, MDStringField, ); \
6688 OPTIONAL(file, MDField, ); \
6689 OPTIONAL(line, LineField, ); \
6690 OPTIONAL(setter, MDStringField, ); \
6691 OPTIONAL(getter, MDStringField, ); \
6692 OPTIONAL(attributes, MDUnsignedField, (0, UINT32_MAX)); \
6693 OPTIONAL(type, MDField, );
6695#undef VISIT_MD_FIELDS
6698 (Context,
name.Val,
file.Val, line.Val, getter.Val,
6699 setter.Val, attributes.Val, type.Val));
6706bool LLParser::parseDIProperty(
MDNode *&Result,
bool IsDistinct) {
6707#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6708 OPTIONAL(name, MDStringField, ); \
6709 OPTIONAL(file, MDField, ); \
6710 OPTIONAL(line, LineField, ); \
6711 OPTIONAL(type, MDField, ); \
6712 OPTIONAL(backing_storage, MDField, );
6714#undef VISIT_MD_FIELDS
6717 type.Val, backing_storage.Val));
6724bool LLParser::parseDIImportedEntity(
MDNode *&Result,
bool IsDistinct) {
6725#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6726 REQUIRED(tag, DwarfTagField, ); \
6727 REQUIRED(scope, MDField, ); \
6728 OPTIONAL(entity, MDField, ); \
6729 OPTIONAL(file, MDField, ); \
6730 OPTIONAL(line, LineField, ); \
6731 OPTIONAL(name, MDStringField, ); \
6732 OPTIONAL(elements, MDField, );
6734#undef VISIT_MD_FIELDS
6737 (Context, tag.Val, scope.Val, entity.Val,
file.Val,
6738 line.Val,
name.Val, elements.Val));
6742#undef PARSE_MD_FIELD
6754bool LLParser::parseMetadataAsValue(
Value *&V, PerFunctionState &PFS) {
6757 if (parseMetadata(MD, &PFS))
6768bool LLParser::parseValueAsMetadata(
Metadata *&MD,
const Twine &TypeMsg,
6769 PerFunctionState *PFS) {
6772 if (parseType(Ty, TypeMsg, Loc))
6775 return error(Loc,
"invalid metadata-value-metadata roundtrip");
6778 if (parseValue(Ty, V, PFS))
6793bool LLParser::parseMetadata(
Metadata *&MD, PerFunctionState *PFS) {
6797 if (Lex.getStrVal() ==
"DIArgList") {
6799 if (parseDIArgList(AL, PFS))
6805 if (parseSpecializedMDNode(
N)) {
6815 return parseValueAsMetadata(MD,
"expected metadata operand", PFS);
6825 if (parseMDString(S))
6835 if (parseMDNodeTail(
N))
6845bool LLParser::convertValIDToValue(
Type *Ty,
ValID &ID,
Value *&V,
6846 PerFunctionState *PFS) {
6848 return error(
ID.Loc,
"functions are not values, refer to them as pointers");
6853 return error(
ID.Loc,
"invalid use of function-local name");
6854 V = PFS->getVal(
ID.UIntVal, Ty,
ID.Loc);
6855 return V ==
nullptr;
6858 return error(
ID.Loc,
"invalid use of function-local name");
6859 V = PFS->getVal(
ID.StrVal, Ty,
ID.Loc);
6860 return V ==
nullptr;
6863 return error(
ID.Loc,
"invalid type for inline asm constraint string");
6867 ID.FTy,
ID.StrVal,
ID.StrVal2,
ID.UIntVal & 1, (
ID.UIntVal >> 1) & 1,
6872 V = getGlobalVal(
ID.StrVal, Ty,
ID.Loc);
6875 return V ==
nullptr;
6877 V = getGlobalVal(
ID.UIntVal, Ty,
ID.Loc);
6880 return V ==
nullptr;
6883 return error(
ID.Loc,
"integer/byte constant must have integer/byte type");
6886 :
V = ConstantByte::
get(Context,
ID.APSIntVal);
6891 return error(
ID.Loc,
"floating point constant invalid for type");
6897 bool IsSNAN = ID.APFloatVal.isSignaling();
6900 ID.APFloatVal.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven,
6902 else if (Ty->isBFloatTy())
6903 ID.APFloatVal.convert(APFloat::BFloat(), APFloat::rmNearestTiesToEven,
6905 else if (Ty->isFloatTy())
6906 ID.APFloatVal.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven,
6912 APInt Payload = ID.APFloatVal.bitcastToAPInt();
6913 ID.APFloatVal = APFloat::getSNaN(ID.APFloatVal.getSemantics(),
6914 ID.APFloatVal.isNegative(), &Payload);
6917 V = ConstantFP::get(Context,
ID.APFloatVal);
6919 if (
V->getType() != Ty)
6920 return error(
ID.Loc,
"floating point constant does not have type '" +
6926 return error(
ID.Loc,
"null must be a pointer type");
6932 return error(
ID.Loc,
"invalid type for undef constant");
6937 return error(
ID.Loc,
"invalid empty array initializer");
6943 return error(
ID.Loc,
"invalid type for null constant");
6946 return error(
ID.Loc,
"invalid type for null constant");
6951 return error(
ID.Loc,
"invalid type for none constant");
6957 return error(
ID.Loc,
"invalid type for poison constant");
6961 if (
ID.ConstantVal->getType() != Ty)
6962 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6969 return error(
ID.Loc,
"vector constant must have vector type");
6971 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6973 "' but expected '" +
6981 if (
ST->getNumElements() !=
ID.UIntVal)
6983 "initializer with struct type has wrong # elements");
6985 return error(
ID.Loc,
"packed'ness of initializer and type don't match");
6988 for (
unsigned i = 0, e =
ID.UIntVal; i != e; ++i)
6989 if (
ID.ConstantStructElts[i]->getType() !=
ST->getElementType(i))
6992 "element " + Twine(i) +
6993 " of struct initializer doesn't match struct element type");
6996 ST,
ArrayRef(
ID.ConstantStructElts.get(),
ID.UIntVal));
6998 return error(
ID.Loc,
"constant expression type mismatch");
7007 auto Loc = Lex.getLoc();
7008 if (parseValID(ID,
nullptr, Ty))
7021 if (convertValIDToValue(Ty, ID, V,
nullptr))
7031 return error(Loc,
"expected a constant value");
7035bool LLParser::parseValue(
Type *Ty,
Value *&V, PerFunctionState *PFS) {
7039 FileLoc
Start = getTokLineColumnPos();
7040 bool Ret = parseValID(ID, PFS, Ty) || convertValIDToValue(Ty, ID, V, PFS);
7041 if (!Ret && ParserContext) {
7042 FileLoc End = getPrevTokEndLineColumnPos();
7043 ParserContext->addValueReferenceAtLocation(V, FileLocRange(Start, End));
7048bool LLParser::parseTypeAndValue(
Value *&V, PerFunctionState *PFS) {
7050 return parseType(Ty) || parseValue(Ty, V, PFS);
7053bool LLParser::parseTypeAndBasicBlock(
BasicBlock *&BB, LocTy &
Loc,
7054 PerFunctionState &PFS) {
7057 if (parseTypeAndValue(V, PFS))
7060 return error(Loc,
"expected a basic block");
7069 if (!Name.starts_with(
"llvm.dbg."))
7072 return FnID == Intrinsic::dbg_declare || FnID == Intrinsic::dbg_value ||
7073 FnID == Intrinsic::dbg_assign;
7081bool LLParser::parseFunctionHeader(
Function *&Fn,
bool IsDefine,
7082 unsigned &FunctionNumber,
7085 LocTy LinkageLoc = Lex.getLoc();
7087 unsigned Visibility;
7088 unsigned DLLStorageClass;
7090 AttrBuilder RetAttrs(M->getContext());
7093 Type *RetType =
nullptr;
7094 LocTy RetTypeLoc = Lex.getLoc();
7095 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
7097 parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7098 parseType(RetType, RetTypeLoc,
true ))
7107 return error(LinkageLoc,
"invalid linkage for function definition");
7117 return error(LinkageLoc,
"invalid linkage for function declaration");
7121 return error(LinkageLoc,
"invalid function linkage type");
7125 return error(LinkageLoc,
7126 "symbol with local linkage must have default visibility");
7129 return error(LinkageLoc,
7130 "symbol with local linkage cannot have a DLL storage class");
7133 return error(RetTypeLoc,
"invalid function return type");
7135 LocTy NameLoc = Lex.getLoc();
7137 std::string FunctionName;
7139 FunctionName = Lex.getStrVal();
7141 FunctionNumber = Lex.getUIntVal();
7142 if (checkValueID(NameLoc,
"function",
"@", NumberedVals.getNext(),
7146 return tokError(
"expected function name");
7152 return tokError(
"expected '(' in function argument list");
7156 AttrBuilder FuncAttrs(M->getContext());
7157 std::vector<unsigned> FwdRefAttrGrps;
7160 std::string Partition;
7164 unsigned AddrSpace = 0;
7170 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg) ||
7171 parseOptionalUnnamedAddr(UnnamedAddr) ||
7172 parseOptionalProgramAddrSpace(AddrSpace) ||
7173 parseFnAttributeValuePairs(FuncAttrs, FwdRefAttrGrps,
false,
7177 parseOptionalComdat(FunctionName,
C) ||
7178 parseOptionalAlignment(Alignment) ||
7179 parseOptionalPrefAlignment(PrefAlignment) ||
7180 (EatIfPresent(
lltok::kw_gc) && parseStringConstant(GC)) ||
7184 parseGlobalTypeAndValue(PersonalityFn)))
7187 if (FuncAttrs.contains(Attribute::Builtin))
7188 return error(BuiltinLoc,
"'builtin' attribute not valid on function");
7191 if (MaybeAlign
A = FuncAttrs.getAlignment()) {
7193 FuncAttrs.removeAttribute(Attribute::Alignment);
7198 std::vector<Type*> ParamTypeList;
7201 for (
const ArgInfo &Arg : ArgList) {
7202 ParamTypeList.push_back(Arg.Ty);
7203 Attrs.push_back(Arg.Attrs);
7210 if (PAL.hasParamAttr(0, Attribute::StructRet) && !RetType->
isVoidTy())
7211 return error(RetTypeLoc,
"functions with 'sret' argument must return void");
7217 GlobalValue *FwdFn =
nullptr;
7218 if (!FunctionName.empty()) {
7221 auto FRVI = ForwardRefVals.find(FunctionName);
7222 if (FRVI != ForwardRefVals.end()) {
7223 FwdFn = FRVI->second.first;
7225 return error(FRVI->second.second,
7226 "invalid forward reference to "
7229 "' with wrong type: "
7233 ForwardRefVals.erase(FRVI);
7234 }
else if ((Fn = M->getFunction(FunctionName))) {
7236 return error(NameLoc,
7237 "invalid redefinition of function '" + FunctionName +
"'");
7238 }
else if (M->getNamedValue(FunctionName)) {
7239 return error(NameLoc,
"redefinition of function '@" + FunctionName +
"'");
7245 if (FunctionNumber == (
unsigned)-1)
7246 FunctionNumber = NumberedVals.getNext();
7250 auto I = ForwardRefValIDs.find(FunctionNumber);
7251 if (
I != ForwardRefValIDs.end()) {
7252 FwdFn =
I->second.first;
7254 return error(NameLoc,
"type of definition and forward reference of '@" +
7255 Twine(FunctionNumber) +
7260 ForwardRefValIDs.erase(
I);
7269 if (FunctionName.empty())
7270 NumberedVals.add(FunctionNumber, Fn);
7286 if (!
GC.empty()) Fn->
setGC(GC);
7289 ForwardRefAttrGroups[Fn] = FwdRefAttrGrps;
7293 for (
unsigned i = 0, e = ArgList.size(); i != e; ++i, ++ArgIt) {
7294 if (ParserContext && ArgList[i].IdentLoc)
7295 ParserContext->addInstructionOrArgumentLocation(
7296 &*ArgIt, ArgList[i].IdentLoc.value());
7298 if (ArgList[i].
Name.empty())
continue;
7301 ArgIt->
setName(ArgList[i].Name);
7303 if (ArgIt->
getName() != ArgList[i].Name)
7304 return error(ArgList[i].Loc,
7305 "redefinition of argument '%" + ArgList[i].Name +
"'");
7318 if (FunctionName.empty()) {
7320 ID.UIntVal = FunctionNumber;
7323 ID.StrVal = FunctionName;
7325 auto Blocks = ForwardRefBlockAddresses.find(ID);
7326 if (Blocks != ForwardRefBlockAddresses.end())
7327 return error(Blocks->first.Loc,
7328 "cannot take blockaddress inside a declaration");
7332bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
7334 if (FunctionNumber == -1) {
7336 ID.StrVal = std::string(F.getName());
7339 ID.UIntVal = FunctionNumber;
7342 auto Blocks = P.ForwardRefBlockAddresses.find(ID);
7343 if (Blocks == P.ForwardRefBlockAddresses.end())
7346 for (
const auto &
I : Blocks->second) {
7347 const ValID &BBID =
I.first;
7348 GlobalValue *GV =
I.second;
7351 "Expected local id or name");
7358 return P.error(BBID.
Loc,
"referenced value is not a basic block");
7361 ResolvedVal = P.checkValidVariableType(BBID.
Loc, BBID.
StrVal, GV->
getType(),
7369 P.ForwardRefBlockAddresses.erase(Blocks);
7375bool LLParser::parseFunctionBody(
Function &Fn,
unsigned FunctionNumber,
7376 ArrayRef<unsigned> UnnamedArgNums) {
7378 return tokError(
"expected '{' in function body");
7381 PerFunctionState PFS(*
this, Fn, FunctionNumber, UnnamedArgNums);
7385 if (PFS.resolveForwardRefBlockAddresses())
7391 return tokError(
"function body requires at least one basic block");
7395 if (parseBasicBlock(PFS))
7399 if (parseUseListOrder(&PFS))
7406 return PFS.finishFunction();
7411bool LLParser::parseBasicBlock(PerFunctionState &PFS) {
7412 FileLoc BBStart = getTokLineColumnPos();
7417 LocTy NameLoc = Lex.getLoc();
7419 Name = Lex.getStrVal();
7422 NameID = Lex.getUIntVal();
7426 BasicBlock *BB = PFS.defineBB(Name, NameID, NameLoc);
7430 std::string NameStr;
7435 auto DeleteDbgRecord = [](DbgRecord *DR) { DR->deleteRecord(); };
7436 using DbgRecordPtr = std::unique_ptr<DbgRecord,
decltype(DeleteDbgRecord)>;
7443 if (SeenOldDbgInfoFormat)
7444 return error(Lex.getLoc(),
"debug record should not appear in a module "
7445 "containing debug info intrinsics");
7446 SeenNewDbgInfoFormat =
true;
7450 if (parseDebugRecord(DR, PFS))
7452 TrailingDbgRecord.emplace_back(DR, DeleteDbgRecord);
7455 FileLoc InstStart = getTokLineColumnPos();
7458 LocTy NameLoc = Lex.getLoc();
7463 NameID = Lex.getUIntVal();
7465 if (parseToken(
lltok::equal,
"expected '=' after instruction id"))
7468 NameStr = Lex.getStrVal();
7470 if (parseToken(
lltok::equal,
"expected '=' after instruction name"))
7474 switch (parseInstruction(Inst, BB, PFS)) {
7477 case InstError:
return true;
7484 if (parseInstructionMetadata(*Inst))
7487 case InstExtraComma:
7492 if (parseInstructionMetadata(*Inst))
7498 if (PFS.setInstName(NameID, NameStr, NameLoc, Inst))
7502 for (DbgRecordPtr &DR : TrailingDbgRecord)
7504 TrailingDbgRecord.clear();
7505 if (ParserContext) {
7506 ParserContext->addInstructionOrArgumentLocation(
7507 Inst, FileLocRange(InstStart, getPrevTokEndLineColumnPos()));
7512 ParserContext->addBlockLocation(
7513 BB, FileLocRange(BBStart, getPrevTokEndLineColumnPos()));
7515 assert(TrailingDbgRecord.empty() &&
7516 "All debug values should have been attached to an instruction.");
7525bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
7528 LocTy DVRLoc = Lex.getLoc();
7530 return error(DVRLoc,
"expected debug record type here");
7531 RecordKind
RecordType = StringSwitch<RecordKind>(Lex.getStrVal())
7532 .Case(
"declare", RecordKind::ValueKind)
7533 .Case(
"value", RecordKind::ValueKind)
7534 .Case(
"assign", RecordKind::ValueKind)
7535 .Case(
"label", RecordKind::LabelKind)
7536 .Case(
"declare_value", RecordKind::ValueKind);
7545 if (parseMDNode(Label))
7550 if (parseMDNode(DbgLoc))
7555 PendingDbgRecords.emplace_back(DVRLoc, DR, DbgLoc);
7559 LocType
ValueType = StringSwitch<LocType>(Lex.getStrVal())
7560 .Case(
"declare", LocType::Declare)
7561 .Case(
"value", LocType::Value)
7562 .Case(
"assign", LocType::Assign)
7563 .Case(
"declare_value", LocType::DeclareValue);
7571 if (parseMetadata(ValLocMD, &PFS))
7578 if (parseMDNode(Variable))
7585 if (parseMDNode(Expression))
7591 MDNode *AssignID =
nullptr;
7592 Metadata *AddressLocation =
nullptr;
7593 MDNode *AddressExpression =
nullptr;
7596 if (parseMDNode(AssignID))
7602 if (parseMetadata(AddressLocation, &PFS))
7608 if (parseMDNode(AddressExpression))
7622 ValueType, ValLocMD, Variable, Expression, AssignID, AddressLocation,
7624 PendingDbgRecords.emplace_back(DVRLoc, DR,
DebugLoc);
7633int LLParser::parseInstruction(Instruction *&Inst, BasicBlock *BB,
7634 PerFunctionState &PFS) {
7637 return tokError(
"found end of file when expecting more instructions");
7638 LocTy Loc = Lex.getLoc();
7639 unsigned KeywordVal = Lex.getUIntVal();
7644 return error(Loc,
"expected instruction opcode");
7648 return parseRet(Inst, BB, PFS);
7650 return parseBr(Inst, PFS);
7652 return parseSwitch(Inst, PFS);
7654 return parseIndirectBr(Inst, PFS);
7656 return parseInvoke(Inst, PFS);
7658 return parseResume(Inst, PFS);
7660 return parseCleanupRet(Inst, PFS);
7662 return parseCatchRet(Inst, PFS);
7664 return parseCatchSwitch(Inst, PFS);
7666 return parseCatchPad(Inst, PFS);
7668 return parseCleanupPad(Inst, PFS);
7670 return parseCallBr(Inst, PFS);
7673 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7674 int Res = parseUnaryOp(Inst, PFS, KeywordVal,
true);
7690 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7702 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7703 int Res = parseArithmetic(Inst, PFS, KeywordVal,
true);
7717 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7725 return parseArithmetic(Inst, PFS, KeywordVal,
7729 if (parseLogical(Inst, PFS, KeywordVal))
7737 return parseLogical(Inst, PFS, KeywordVal);
7740 if (parseCompare(Inst, PFS, KeywordVal))
7747 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7748 int Res = parseCompare(Inst, PFS, KeywordVal);
7758 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7760 bool Res = parseCast(Inst, PFS, KeywordVal);
7770 bool Res = parseCast(Inst, PFS, KeywordVal);
7782 if (parseCast(Inst, PFS, KeywordVal))
7798 return parseCast(Inst, PFS, KeywordVal);
7802 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7803 if (parseCast(Inst, PFS, KeywordVal))
7812 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7813 int Res = parseSelect(Inst, PFS);
7819 return error(Loc,
"fast-math-flags specified for select without "
7820 "floating-point scalar or vector return type");
7827 return parseVAArg(Inst, PFS);
7829 return parseExtractElement(Inst, PFS);
7831 return parseInsertElement(Inst, PFS);
7833 return parseShuffleVector(Inst, PFS);
7835 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7836 int Res = parsePHI(Inst, PFS);
7842 return error(Loc,
"fast-math-flags specified for phi without "
7843 "floating-point scalar or vector return type");
7850 return parseLandingPad(Inst, PFS);
7852 return parseFreeze(Inst, PFS);
7864 return parseAlloc(Inst, PFS);
7866 return parseLoad(Inst, PFS);
7868 return parseStore(Inst, PFS);
7870 return parseCmpXchg(Inst, PFS);
7872 return parseAtomicRMW(Inst, PFS);
7874 return parseFence(Inst, PFS);
7876 return parseGetElementPtr(Inst, PFS);
7878 return parseExtractValue(Inst, PFS);
7880 return parseInsertValue(Inst, PFS);
7885bool LLParser::parseCmpPredicate(
unsigned &
P,
unsigned Opc) {
7886 if (
Opc == Instruction::FCmp) {
7887 switch (Lex.getKind()) {
7889 return tokError(
"expected fcmp predicate (e.g. 'oeq')");
7908 switch (Lex.getKind()) {
7910 return tokError(
"expected icmp predicate (e.g. 'eq')");
7934bool LLParser::parseRet(Instruction *&Inst, BasicBlock *BB,
7935 PerFunctionState &PFS) {
7936 SMLoc TypeLoc = Lex.getLoc();
7938 if (parseType(Ty,
true ))
7941 Type *ResType = PFS.getFunction().getReturnType();
7945 return error(TypeLoc,
"value doesn't match function result type '" +
7953 if (parseValue(Ty, RV, PFS))
7957 return error(TypeLoc,
"value doesn't match function result type '" +
7967bool LLParser::parseBr(Instruction *&Inst, PerFunctionState &PFS) {
7971 if (parseTypeAndValue(Op0, Loc, PFS))
7980 return error(Loc,
"branch condition must have 'i1' type");
7982 if (parseToken(
lltok::comma,
"expected ',' after branch condition") ||
7983 parseTypeAndBasicBlock(Op1, Loc, PFS) ||
7984 parseToken(
lltok::comma,
"expected ',' after true destination") ||
7985 parseTypeAndBasicBlock(Op2, Loc2, PFS))
7997bool LLParser::parseSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7998 LocTy CondLoc, BBLoc;
8001 if (parseTypeAndValue(
Cond, CondLoc, PFS) ||
8002 parseToken(
lltok::comma,
"expected ',' after switch condition") ||
8003 parseTypeAndBasicBlock(DefaultBB, BBLoc, PFS) ||
8007 if (!
Cond->getType()->isIntegerTy())
8008 return error(CondLoc,
"switch condition must have integer type");
8011 SmallPtrSet<Value*, 32> SeenCases;
8017 if (parseTypeAndValue(Constant, CondLoc, PFS) ||
8018 parseToken(
lltok::comma,
"expected ',' after case value") ||
8019 parseTypeAndBasicBlock(DestBB, PFS))
8022 if (!SeenCases.
insert(Constant).second)
8023 return error(CondLoc,
"duplicate case value in switch");
8025 return error(CondLoc,
"case value is not a constant integer");
8033 for (
const auto &[OnVal, Dest] :
Table)
8034 SI->addCase(OnVal, Dest);
8042bool LLParser::parseIndirectBr(Instruction *&Inst, PerFunctionState &PFS) {
8045 if (parseTypeAndValue(
Address, AddrLoc, PFS) ||
8046 parseToken(
lltok::comma,
"expected ',' after indirectbr address") ||
8050 if (!
Address->getType()->isPointerTy())
8051 return error(AddrLoc,
"indirectbr address must have pointer type");
8054 SmallVector<BasicBlock*, 16> DestList;
8058 if (parseTypeAndBasicBlock(DestBB, PFS))
8063 if (parseTypeAndBasicBlock(DestBB, PFS))
8069 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
8073 for (BasicBlock *Dest : DestList)
8083 FunctionType *&FuncTy) {
8089 for (
const ParamInfo &Arg : ArgList)
8103bool LLParser::parseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
8104 LocTy CallLoc = Lex.getLoc();
8105 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8106 std::vector<unsigned> FwdRefAttrGrps;
8109 unsigned InvokeAddrSpace;
8110 Type *RetType =
nullptr;
8117 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8118 parseOptionalProgramAddrSpace(InvokeAddrSpace) ||
8119 parseType(RetType, RetTypeLoc,
true ) ||
8120 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
8121 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
8123 parseOptionalOperandBundles(BundleList, PFS) ||
8125 parseTypeAndBasicBlock(NormalBB, PFS) ||
8127 parseTypeAndBasicBlock(UnwindBB, PFS))
8134 if (resolveFunctionType(RetType, ArgList, Ty))
8135 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8141 if (convertValIDToValue(
PointerType::get(Context, InvokeAddrSpace), CalleeID,
8146 SmallVector<Value *, 8>
Args;
8153 for (
const ParamInfo &Arg : ArgList) {
8154 Type *ExpectedTy =
nullptr;
8157 }
else if (!Ty->isVarArg()) {
8158 return error(Arg.Loc,
"too many arguments specified");
8161 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8162 return error(Arg.Loc,
"argument is not of expected type '" +
8164 Args.push_back(Arg.V);
8169 return error(CallLoc,
"not enough parameters specified for call");
8178 II->setCallingConv(CC);
8179 II->setAttributes(PAL);
8180 ForwardRefAttrGroups[
II] = FwdRefAttrGrps;
8187bool LLParser::parseResume(Instruction *&Inst, PerFunctionState &PFS) {
8189 if (parseTypeAndValue(Exn, ExnLoc, PFS))
8197bool LLParser::parseExceptionArgs(SmallVectorImpl<Value *> &Args,
8198 PerFunctionState &PFS) {
8199 if (parseToken(
lltok::lsquare,
"expected '[' in catchpad/cleanuppad"))
8204 if (!
Args.empty() &&
8205 parseToken(
lltok::comma,
"expected ',' in argument list"))
8210 Type *ArgTy =
nullptr;
8211 if (parseType(ArgTy, ArgLoc))
8216 if (parseMetadataAsValue(V, PFS))
8219 if (parseValue(ArgTy, V, PFS))
8231bool LLParser::parseCleanupRet(Instruction *&Inst, PerFunctionState &PFS) {
8232 Value *CleanupPad =
nullptr;
8234 if (parseToken(
lltok::kw_from,
"expected 'from' after cleanupret"))
8249 if (parseTypeAndBasicBlock(UnwindBB, PFS)) {
8260bool LLParser::parseCatchRet(Instruction *&Inst, PerFunctionState &PFS) {
8261 Value *CatchPad =
nullptr;
8263 if (parseToken(
lltok::kw_from,
"expected 'from' after catchret"))
8270 if (parseToken(
lltok::kw_to,
"expected 'to' in catchret") ||
8271 parseTypeAndBasicBlock(BB, PFS))
8280bool LLParser::parseCatchSwitch(Instruction *&Inst, PerFunctionState &PFS) {
8288 return tokError(
"expected scope value for catchswitch");
8293 if (parseToken(
lltok::lsquare,
"expected '[' with catchswitch labels"))
8299 if (parseTypeAndBasicBlock(DestBB, PFS))
8301 Table.push_back(DestBB);
8304 if (parseToken(
lltok::rsquare,
"expected ']' after catchswitch labels"))
8307 if (parseToken(
lltok::kw_unwind,
"expected 'unwind' after catchswitch scope"))
8315 if (parseTypeAndBasicBlock(UnwindBB, PFS))
8321 for (BasicBlock *DestBB :
Table)
8322 CatchSwitch->addHandler(DestBB);
8329bool LLParser::parseCatchPad(Instruction *&Inst, PerFunctionState &PFS) {
8330 Value *CatchSwitch =
nullptr;
8336 return tokError(
"expected scope value for catchpad");
8341 SmallVector<Value *, 8>
Args;
8342 if (parseExceptionArgs(Args, PFS))
8351bool LLParser::parseCleanupPad(Instruction *&Inst, PerFunctionState &PFS) {
8352 Value *ParentPad =
nullptr;
8359 return tokError(
"expected scope value for cleanuppad");
8364 SmallVector<Value *, 8>
Args;
8365 if (parseExceptionArgs(Args, PFS))
8381bool LLParser::parseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
8382 unsigned Opc,
bool IsFP) {
8384 if (parseTypeAndValue(
LHS, Loc, PFS))
8391 return error(Loc,
"invalid operand type for instruction");
8401bool LLParser::parseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
8402 LocTy CallLoc = Lex.getLoc();
8403 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8404 std::vector<unsigned> FwdRefAttrGrps;
8407 Type *RetType =
nullptr;
8414 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8415 parseType(RetType, RetTypeLoc,
true ) ||
8416 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
8417 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
8419 parseOptionalOperandBundles(BundleList, PFS) ||
8421 parseTypeAndBasicBlock(DefaultDest, PFS) ||
8426 SmallVector<BasicBlock *, 16> IndirectDests;
8430 if (parseTypeAndBasicBlock(DestBB, PFS))
8435 if (parseTypeAndBasicBlock(DestBB, PFS))
8441 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
8448 if (resolveFunctionType(RetType, ArgList, Ty))
8449 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8460 SmallVector<Value *, 8>
Args;
8467 for (
const ParamInfo &Arg : ArgList) {
8468 Type *ExpectedTy =
nullptr;
8471 }
else if (!Ty->isVarArg()) {
8472 return error(Arg.Loc,
"too many arguments specified");
8475 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8476 return error(Arg.Loc,
"argument is not of expected type '" +
8478 Args.push_back(Arg.V);
8483 return error(CallLoc,
"not enough parameters specified for call");
8495 ForwardRefAttrGroups[CBI] = FwdRefAttrGrps;
8509bool LLParser::parseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
8510 unsigned Opc,
bool IsFP) {
8512 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8513 parseToken(
lltok::comma,
"expected ',' in arithmetic operation") ||
8521 return error(Loc,
"invalid operand type for instruction");
8529bool LLParser::parseLogical(Instruction *&Inst, PerFunctionState &PFS,
8532 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8533 parseToken(
lltok::comma,
"expected ',' in logical operation") ||
8539 "instruction requires integer or integer vector operands");
8548bool LLParser::parseCompare(Instruction *&Inst, PerFunctionState &PFS,
8554 if (parseCmpPredicate(Pred,
Opc) || parseTypeAndValue(
LHS, Loc, PFS) ||
8555 parseToken(
lltok::comma,
"expected ',' after compare value") ||
8559 if (
Opc == Instruction::FCmp) {
8561 return error(Loc,
"fcmp requires floating point operands");
8564 assert(
Opc == Instruction::ICmp &&
"Unknown opcode for CmpInst!");
8567 return error(Loc,
"icmp requires integer operands");
8579bool LLParser::parseCast(Instruction *&Inst, PerFunctionState &PFS,
8583 Type *DestTy =
nullptr;
8584 if (parseTypeAndValue(
Op, Loc, PFS) ||
8585 parseToken(
lltok::kw_to,
"expected 'to' after cast value") ||
8590 return error(Loc,
"invalid cast opcode for cast from '" +
8599bool LLParser::parseSelect(Instruction *&Inst, PerFunctionState &PFS) {
8601 Value *Op0, *Op1, *Op2;
8602 if (parseTypeAndValue(Op0, Loc, PFS) ||
8603 parseToken(
lltok::comma,
"expected ',' after select condition") ||
8604 parseTypeAndValue(Op1, PFS) ||
8605 parseToken(
lltok::comma,
"expected ',' after select value") ||
8606 parseTypeAndValue(Op2, PFS))
8610 return error(Loc, Reason);
8618bool LLParser::parseVAArg(Instruction *&Inst, PerFunctionState &PFS) {
8620 Type *EltTy =
nullptr;
8622 if (parseTypeAndValue(
Op, PFS) ||
8623 parseToken(
lltok::comma,
"expected ',' after vaarg operand") ||
8624 parseType(EltTy, TypeLoc))
8628 return error(TypeLoc,
"va_arg requires operand with first class type");
8630 Inst =
new VAArgInst(
Op, EltTy);
8636bool LLParser::parseExtractElement(Instruction *&Inst, PerFunctionState &PFS) {
8639 if (parseTypeAndValue(Op0, Loc, PFS) ||
8640 parseToken(
lltok::comma,
"expected ',' after extract value") ||
8641 parseTypeAndValue(Op1, PFS))
8645 return error(Loc,
"invalid extractelement operands");
8653bool LLParser::parseInsertElement(Instruction *&Inst, PerFunctionState &PFS) {
8655 Value *Op0, *Op1, *Op2;
8656 if (parseTypeAndValue(Op0, Loc, PFS) ||
8657 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8658 parseTypeAndValue(Op1, PFS) ||
8659 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8660 parseTypeAndValue(Op2, PFS))
8664 return error(Loc,
"invalid insertelement operands");
8672bool LLParser::parseShuffleVector(Instruction *&Inst, PerFunctionState &PFS) {
8674 Value *Op0, *Op1, *Op2;
8675 if (parseTypeAndValue(Op0, Loc, PFS) ||
8676 parseToken(
lltok::comma,
"expected ',' after shuffle mask") ||
8677 parseTypeAndValue(Op1, PFS) ||
8678 parseToken(
lltok::comma,
"expected ',' after shuffle value") ||
8679 parseTypeAndValue(Op2, PFS))
8683 return error(Loc,
"invalid shufflevector operands");
8685 Inst =
new ShuffleVectorInst(Op0, Op1, Op2);
8691int LLParser::parsePHI(Instruction *&Inst, PerFunctionState &PFS) {
8695 if (parseType(Ty, TypeLoc))
8699 return error(TypeLoc,
"phi node must have first class type");
8702 bool AteExtraComma =
false;
8714 AteExtraComma =
true;
8718 if (parseToken(
lltok::lsquare,
"expected '[' in phi value list") ||
8719 parseValue(Ty, Op0, PFS) ||
8720 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8729 for (
const auto &[Val, BB] : PHIVals)
8732 return AteExtraComma ? InstExtraComma : InstNormal;
8741bool LLParser::parseLandingPad(Instruction *&Inst, PerFunctionState &PFS) {
8744 if (parseType(Ty, TyLoc))
8757 return tokError(
"expected 'catch' or 'filter' clause type");
8761 if (parseTypeAndValue(V, VLoc, PFS))
8768 return error(VLoc,
"'catch' clause has an invalid type");
8771 return error(VLoc,
"'filter' clause has an invalid type");
8776 return error(VLoc,
"clause argument must be a constant");
8780 Inst = LP.release();
8786bool LLParser::parseFreeze(Instruction *&Inst, PerFunctionState &PFS) {
8789 if (parseTypeAndValue(
Op, Loc, PFS))
8792 Inst =
new FreezeInst(
Op);
8805bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS,
8807 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8808 std::vector<unsigned> FwdRefAttrGrps;
8810 unsigned CallAddrSpace;
8812 Type *RetType =
nullptr;
8817 LocTy CallLoc = Lex.getLoc();
8821 "expected 'tail call', 'musttail call', or 'notail call'"))
8824 FastMathFlags FMF = EatFastMathFlagsIfPresent();
8826 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8827 parseOptionalProgramAddrSpace(CallAddrSpace) ||
8828 parseType(RetType, RetTypeLoc,
true ) ||
8829 parseValID(CalleeID, &PFS) ||
8831 PFS.getFunction().isVarArg()) ||
8832 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false, BuiltinLoc) ||
8833 parseOptionalOperandBundles(BundleList, PFS))
8840 if (resolveFunctionType(RetType, ArgList, Ty))
8841 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8847 if (convertValIDToValue(
PointerType::get(Context, CallAddrSpace), CalleeID,
8854 SmallVector<Value*, 8>
Args;
8860 for (
const ParamInfo &Arg : ArgList) {
8861 Type *ExpectedTy =
nullptr;
8864 }
else if (!Ty->isVarArg()) {
8865 return error(Arg.Loc,
"too many arguments specified");
8868 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8869 return error(Arg.Loc,
"argument is not of expected type '" +
8871 Args.push_back(Arg.V);
8872 Attrs.push_back(Arg.Attrs);
8876 return error(CallLoc,
"not enough parameters specified for call");
8889 return error(CallLoc,
"fast-math-flags specified for call without "
8890 "floating-point scalar or vector return type");
8897 if (SeenNewDbgInfoFormat) {
8899 return error(CallLoc,
"llvm.dbg intrinsic should not appear in a module "
8900 "using non-intrinsic debug info");
8902 SeenOldDbgInfoFormat =
true;
8905 ForwardRefAttrGroups[CI] = FwdRefAttrGrps;
8917int LLParser::parseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
8919 LocTy SizeLoc, TyLoc, ASLoc;
8921 unsigned AddrSpace = 0;
8924 bool IsInAlloca = EatIfPresent(lltok::kw_inalloca);
8925 bool IsSwiftError = EatIfPresent(lltok::kw_swifterror);
8927 if (parseType(Ty, TyLoc))
8931 return error(TyLoc,
"invalid type for alloca");
8933 bool AteExtraComma =
false;
8935 if (Lex.getKind() == lltok::kw_align) {
8936 if (parseOptionalAlignment(Alignment))
8938 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8941 ASLoc = Lex.getLoc();
8942 if (parseOptionalAddrSpace(AddrSpace))
8945 AteExtraComma =
true;
8947 if (parseTypeAndValue(
Size, SizeLoc, PFS))
8950 if (Lex.getKind() == lltok::kw_align) {
8951 if (parseOptionalAlignment(Alignment))
8953 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8956 ASLoc = Lex.getLoc();
8957 if (parseOptionalAddrSpace(AddrSpace))
8960 AteExtraComma =
true;
8966 if (
Size && !
Size->getType()->isIntegerTy())
8967 return error(SizeLoc,
"element count must have integer type");
8969 SmallPtrSet<Type *, 4> Visited;
8970 if (!Alignment && !Ty->
isSized(&Visited))
8971 return error(TyLoc,
"Cannot allocate unsized type");
8973 Alignment = M->getDataLayout().getPrefTypeAlign(Ty);
8974 AllocaInst *AI =
new AllocaInst(Ty, AddrSpace,
Size, *Alignment);
8978 return AteExtraComma ? InstExtraComma : InstNormal;
8985int LLParser::parseLoad(Instruction *&Inst, PerFunctionState &PFS) {
8988 bool AteExtraComma =
false;
8998 bool isVolatile =
false;
9004 bool IsElementwise =
false;
9006 IsElementwise =
true;
9011 LocTy ExplicitTypeLoc = Lex.getLoc();
9012 if (parseType(Ty) ||
9013 parseToken(
lltok::comma,
"expected comma after load's type") ||
9014 parseTypeAndValue(Val, Loc, PFS) ||
9015 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
9016 parseOptionalCommaAlign(Alignment, AteExtraComma))
9020 return error(Loc,
"load operand must be a pointer to a first class type");
9022 if (IsElementwise && !isAtomic)
9023 return error(Loc,
"elementwise load must be atomic");
9026 return error(ExplicitTypeLoc,
9027 "atomic elementwise load operand must have fixed vector type");
9029 if (isAtomic && !Alignment)
9030 return error(Loc,
"atomic load must have explicit non-zero alignment");
9034 return error(Loc,
"atomic load cannot use Release ordering");
9037 "atomic elementwise load cannot be sequentially consistent");
9039 SmallPtrSet<Type *, 4> Visited;
9040 if (!Alignment && !Ty->
isSized(&Visited))
9041 return error(ExplicitTypeLoc,
"loading unsized types is not allowed");
9043 Alignment = M->getDataLayout().getABITypeAlign(Ty);
9044 Inst =
new LoadInst(Ty, Val,
"",
9046 SSID, IsElementwise},
9048 return AteExtraComma ? InstExtraComma : InstNormal;
9056int LLParser::parseStore(Instruction *&Inst, PerFunctionState &PFS) {
9060 bool AteExtraComma =
false;
9070 bool isVolatile =
false;
9076 bool IsElementwise =
false;
9078 IsElementwise =
true;
9082 if (parseTypeAndValue(Val, Loc, PFS) ||
9083 parseToken(
lltok::comma,
"expected ',' after store operand") ||
9084 parseTypeAndValue(Ptr, PtrLoc, PFS) ||
9085 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
9086 parseOptionalCommaAlign(Alignment, AteExtraComma))
9090 return error(PtrLoc,
"store operand must be a pointer");
9092 return error(Loc,
"store operand must be a first class value");
9093 if (isAtomic && !Alignment)
9094 return error(Loc,
"atomic store must have explicit non-zero alignment");
9097 return error(Loc,
"atomic store cannot use Acquire ordering");
9099 if (IsElementwise && !isAtomic)
9100 return error(Loc,
"elementwise store must be atomic");
9104 Loc,
"atomic elementwise store operand must have fixed vector type");
9108 "atomic elementwise store cannot be sequentially consistent");
9110 SmallPtrSet<Type *, 4> Visited;
9112 return error(Loc,
"storing unsized types is not allowed");
9116 Inst =
new StoreInst(Val, Ptr,
9118 SSID, IsElementwise},
9120 return AteExtraComma ? InstExtraComma : InstNormal;
9127int LLParser::parseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {
9129 bool AteExtraComma =
false;
9133 bool isVolatile =
false;
9134 bool isWeak =
false;
9143 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
9144 parseToken(
lltok::comma,
"expected ',' after cmpxchg address") ||
9145 parseTypeAndValue(Cmp, CmpLoc, PFS) ||
9146 parseToken(
lltok::comma,
"expected ',' after cmpxchg cmp operand") ||
9147 parseTypeAndValue(New, NewLoc, PFS) ||
9148 parseScopeAndOrdering(
true , SSID, SuccessOrdering) ||
9149 parseOrdering(FailureOrdering) ||
9150 parseOptionalCommaAlign(Alignment, AteExtraComma))
9154 return tokError(
"invalid cmpxchg success ordering");
9156 return tokError(
"invalid cmpxchg failure ordering");
9158 return error(PtrLoc,
"cmpxchg operand must be a pointer");
9159 if (
Cmp->getType() !=
New->getType())
9160 return error(NewLoc,
"compare value and new value type do not match");
9161 if (!
New->getType()->isFirstClassType())
9162 return error(NewLoc,
"cmpxchg operand must be a first class value");
9164 const Align DefaultAlignment(
9165 PFS.getFunction().getDataLayout().getTypeStoreSize(
9168 AtomicCmpXchgInst *CXI =
9169 new AtomicCmpXchgInst(Ptr, Cmp, New,
Alignment.value_or(DefaultAlignment),
9170 SuccessOrdering, FailureOrdering, SSID);
9175 return AteExtraComma ? InstExtraComma : InstNormal;
9182int LLParser::parseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {
9184 bool AteExtraComma =
false;
9188 bool IsElementwise =
false;
9196 IsElementwise =
true;
9198 switch (Lex.getKind()) {
9200 return tokError(
"expected binary operation in atomicrmw");
9259 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
9260 parseToken(
lltok::comma,
"expected ',' after atomicrmw address") ||
9261 parseTypeAndValue(Val, ValLoc, PFS) ||
9262 parseScopeAndOrdering(
true , SSID, Ordering) ||
9263 parseOptionalCommaAlign(Alignment, AteExtraComma))
9267 return tokError(
"atomicrmw cannot be unordered");
9269 return tokError(
"atomicrmw elementwise cannot be sequentially consistent");
9271 return error(PtrLoc,
"atomicrmw operand must be a pointer");
9273 return error(ValLoc,
"atomicrmw operand may not be scalable");
9276 if (IsElementwise) {
9278 return error(ValLoc,
9279 "atomicrmw elementwise operand must be a fixed vector type");
9288 " operand must be an integer type, a floating-point type, a "
9289 "pointer type, or a fixed vector of any of these types");
9293 return error(ValLoc,
"atomicrmw " +
9295 " operand must be a floating point or fixed "
9296 "vector of floating point type");
9303 " operand must be an integer or fixed vector of integer type");
9308 PFS.getFunction().getDataLayout().getTypeStoreSizeInBits(ValTy);
9310 return error(ValLoc,
9311 "atomicrmw operand must have a power-of-two byte size");
9312 const Align DefaultAlignment(
9313 PFS.getFunction().getDataLayout().getTypeStoreSize(Val->
getType()));
9314 AtomicRMWInst *RMWI =
new AtomicRMWInst(
Operation, Ptr, Val,
9316 Ordering, SSID, IsElementwise);
9319 return AteExtraComma ? InstExtraComma : InstNormal;
9324int LLParser::parseFence(Instruction *&Inst, PerFunctionState &PFS) {
9327 if (parseScopeAndOrdering(
true , SSID, Ordering))
9331 return tokError(
"fence cannot be unordered");
9333 return tokError(
"fence cannot be monotonic");
9335 Inst =
new FenceInst(Context, Ordering, SSID);
9341int LLParser::parseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
9342 Value *Ptr =
nullptr;
9343 Value *Val =
nullptr;
9359 if (parseType(Ty) ||
9360 parseToken(
lltok::comma,
"expected comma after getelementptr's type") ||
9361 parseTypeAndValue(Ptr, Loc, PFS))
9366 if (!BasePointerType)
9367 return error(Loc,
"base of getelementptr must be a pointer");
9369 SmallVector<Value*, 16> Indices;
9370 bool AteExtraComma =
false;
9373 ElementCount GEPWidth =
BaseType->isVectorTy()
9379 AteExtraComma =
true;
9382 if (parseTypeAndValue(Val, EltLoc, PFS))
9385 return error(EltLoc,
"getelementptr index must be an integer");
9388 ElementCount ValNumEl = ValVTy->getElementCount();
9392 "getelementptr vector index has a wrong number of elements");
9393 GEPWidth = ValNumEl;
9398 SmallPtrSet<Type*, 4> Visited;
9400 return error(Loc,
"base element of getelementptr must be sized");
9404 return error(Loc,
"getelementptr cannot target structure that contains "
9405 "scalable vector type");
9408 return error(Loc,
"invalid getelementptr indices");
9411 GEP->setNoWrapFlags(NW);
9412 return AteExtraComma ? InstExtraComma : InstNormal;
9417int LLParser::parseExtractValue(Instruction *&Inst, PerFunctionState &PFS) {
9419 SmallVector<unsigned, 4> Indices;
9421 if (parseTypeAndValue(Val, Loc, PFS) ||
9422 parseIndexList(Indices, AteExtraComma))
9426 return error(Loc,
"extractvalue operand must be aggregate type");
9429 return error(Loc,
"invalid indices for extractvalue");
9431 return AteExtraComma ? InstExtraComma : InstNormal;
9436int LLParser::parseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
9438 SmallVector<unsigned, 4> Indices;
9440 if (parseTypeAndValue(Val0, Loc0, PFS) ||
9441 parseToken(
lltok::comma,
"expected comma after insertvalue operand") ||
9442 parseTypeAndValue(Val1, Loc1, PFS) ||
9443 parseIndexList(Indices, AteExtraComma))
9447 return error(Loc0,
"insertvalue operand must be aggregate type");
9451 return error(Loc0,
"invalid indices for insertvalue");
9452 if (IndexedType != Val1->
getType())
9453 return error(Loc1,
"insertvalue operand and field disagree in type: '" +
9457 return AteExtraComma ? InstExtraComma : InstNormal;
9468bool LLParser::parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts) {
9483 if (parseMetadata(MD,
nullptr))
9488 return parseToken(
lltok::rbrace,
"expected end of metadata node");
9494bool LLParser::sortUseListOrder(
Value *V, ArrayRef<unsigned> Indexes,
9496 if (!
V->hasUseList())
9499 return error(Loc,
"value has no uses");
9501 unsigned NumUses = 0;
9502 SmallDenseMap<const Use *, unsigned, 16> Order;
9503 for (
const Use &U :
V->uses()) {
9504 if (++NumUses > Indexes.
size())
9506 Order[&
U] = Indexes[NumUses - 1];
9509 return error(Loc,
"value only has one use");
9510 if (Order.
size() != Indexes.
size() || NumUses > Indexes.
size())
9512 "wrong number of indexes, expected " + Twine(
V->getNumUses()));
9514 V->sortUseList([&](
const Use &L,
const Use &R) {
9522bool LLParser::parseUseListOrderIndexes(SmallVectorImpl<unsigned> &Indexes) {
9523 SMLoc Loc = Lex.getLoc();
9527 return tokError(
"expected non-empty list of uselistorder indexes");
9534 bool IsOrdered =
true;
9535 assert(Indexes.
empty() &&
"Expected empty order vector");
9538 if (parseUInt32(Index))
9543 Max = std::max(Max, Index);
9544 IsOrdered &= Index == Indexes.
size();
9552 if (Indexes.
size() < 2)
9553 return error(Loc,
"expected >= 2 uselistorder indexes");
9556 "expected distinct uselistorder indexes in range [0, size)");
9558 return error(Loc,
"expected uselistorder indexes to change the order");
9565bool LLParser::parseUseListOrder(PerFunctionState *PFS) {
9566 SMLoc Loc = Lex.getLoc();
9571 SmallVector<unsigned, 16> Indexes;
9572 if (parseTypeAndValue(V, PFS) ||
9573 parseToken(
lltok::comma,
"expected comma in uselistorder directive") ||
9574 parseUseListOrderIndexes(Indexes))
9577 return sortUseListOrder(V, Indexes, Loc);
9583bool LLParser::parseModuleEntry(
unsigned ID) {
9592 parseStringConstant(Path) ||
9600 if (parseUInt32(Hash[0]) || parseToken(
lltok::comma,
"expected ',' here") ||
9601 parseUInt32(Hash[1]) || parseToken(
lltok::comma,
"expected ',' here") ||
9602 parseUInt32(Hash[2]) || parseToken(
lltok::comma,
"expected ',' here") ||
9603 parseUInt32(Hash[3]) || parseToken(
lltok::comma,
"expected ',' here") ||
9604 parseUInt32(Hash[4]))
9611 auto ModuleEntry = Index->addModule(Path, Hash);
9612 ModuleIdMap[
ID] = ModuleEntry->first();
9619bool LLParser::parseTypeIdEntry(
unsigned ID) {
9628 parseStringConstant(Name))
9631 TypeIdSummary &TIS = Index->getOrInsertTypeIdSummary(Name);
9633 parseTypeIdSummary(TIS) || parseToken(
lltok::rparen,
"expected ')' here"))
9638 auto FwdRefTIDs = ForwardRefTypeIds.find(ID);
9639 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9640 for (
auto TIDRef : FwdRefTIDs->second) {
9642 "Forward referenced type id GUID expected to be 0");
9645 ForwardRefTypeIds.erase(FwdRefTIDs);
9653bool LLParser::parseTypeIdSummary(TypeIdSummary &TIS) {
9657 parseTypeTestResolution(TIS.
TTRes))
9662 if (parseOptionalWpdResolutions(TIS.
WPDRes))
9679bool LLParser::parseTypeIdCompatibleVtableEntry(
unsigned ID) {
9688 parseStringConstant(Name))
9692 Index->getOrInsertTypeIdCompatibleVtableSummary(Name);
9699 IdToIndexMapType IdToIndexMap;
9712 if (parseGVReference(VI, GVId))
9719 IdToIndexMap[GVId].push_back(std::make_pair(TI.size(),
Loc));
9720 TI.push_back({
Offset, VI});
9728 for (
auto I : IdToIndexMap) {
9729 auto &Infos = ForwardRefValueInfos[
I.first];
9730 for (
auto P :
I.second) {
9732 "Forward referenced ValueInfo expected to be empty");
9733 Infos.emplace_back(&TI[
P.first].VTableVI,
P.second);
9743 auto FwdRefTIDs = ForwardRefTypeIds.find(ID);
9744 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9745 for (
auto TIDRef : FwdRefTIDs->second) {
9747 "Forward referenced type id GUID expected to be 0");
9750 ForwardRefTypeIds.erase(FwdRefTIDs);
9762bool LLParser::parseTypeTestResolution(TypeTestResolution &TTRes) {
9770 switch (Lex.getKind()) {
9790 return error(Lex.getLoc(),
"unexpected TypeTestResolution kind");
9802 switch (Lex.getKind()) {
9817 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(Val))
9830 return error(Lex.getLoc(),
"expected optional TypeTestResolution field");
9843bool LLParser::parseOptionalWpdResolutions(
9844 std::map<uint64_t, WholeProgramDevirtResolution> &WPDResMap) {
9852 WholeProgramDevirtResolution WPDRes;
9856 parseToken(
lltok::comma,
"expected ',' here") || parseWpdRes(WPDRes) ||
9859 WPDResMap[
Offset] = WPDRes;
9876bool LLParser::parseWpdRes(WholeProgramDevirtResolution &WPDRes) {
9884 switch (Lex.getKind()) {
9895 return error(Lex.getLoc(),
"unexpected WholeProgramDevirtResolution kind");
9901 switch (Lex.getKind()) {
9909 if (parseOptionalResByArg(WPDRes.
ResByArg))
9913 return error(Lex.getLoc(),
9914 "expected optional WholeProgramDevirtResolution field");
9931bool LLParser::parseOptionalResByArg(
9932 std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>
9940 std::vector<uint64_t>
Args;
9941 if (parseArgs(Args) || parseToken(
lltok::comma,
"expected ',' here") ||
9949 WholeProgramDevirtResolution::ByArg ByArg;
9950 switch (Lex.getKind()) {
9964 return error(Lex.getLoc(),
9965 "unexpected WholeProgramDevirtResolution::ByArg kind");
9971 switch (Lex.getKind()) {
9975 parseUInt64(ByArg.
Info))
9981 parseUInt32(ByArg.
Byte))
9987 parseUInt32(ByArg.
Bit))
9991 return error(Lex.getLoc(),
9992 "expected optional whole program devirt field");
9999 ResByArg[
Args] = ByArg;
10010bool LLParser::parseArgs(std::vector<uint64_t> &Args) {
10018 if (parseUInt64(Val))
10020 Args.push_back(Val);
10044bool LLParser::addGlobalValueToIndex(
10046 unsigned ID, std::unique_ptr<GlobalValueSummary> Summary,
LocTy Loc) {
10051 VI = Index->getOrInsertValueInfo(GUID);
10055 auto *GV = M->getNamedValue(Name);
10057 return error(Loc,
"Reference to undefined global \"" + Name +
"\"");
10063 VI = Index->getOrInsertValueInfo(GV, GUID);
10067 "Need a source_filename to compute GUID for local");
10070 VI = Index->getOrInsertValueInfo(GUID, Index->saveString(Name));
10075 auto FwdRefVIs = ForwardRefValueInfos.find(ID);
10076 if (FwdRefVIs != ForwardRefValueInfos.end()) {
10077 for (
auto VIRef : FwdRefVIs->second) {
10079 "Forward referenced ValueInfo expected to be empty");
10082 ForwardRefValueInfos.erase(FwdRefVIs);
10086 auto FwdRefAliasees = ForwardRefAliasees.find(ID);
10087 if (FwdRefAliasees != ForwardRefAliasees.end()) {
10088 for (
auto AliaseeRef : FwdRefAliasees->second) {
10089 assert(!AliaseeRef.first->hasAliasee() &&
10090 "Forward referencing alias already has aliasee");
10091 assert(Summary &&
"Aliasee must be a definition");
10092 AliaseeRef.first->setAliasee(VI,
Summary.get());
10094 ForwardRefAliasees.erase(FwdRefAliasees);
10099 Index->addGlobalValueSummary(VI, std::move(Summary));
10102 if (ID == NumberedValueInfos.size())
10103 NumberedValueInfos.push_back(VI);
10106 if (ID > NumberedValueInfos.size())
10107 NumberedValueInfos.resize(ID + 1);
10108 NumberedValueInfos[
ID] =
VI;
10116bool LLParser::parseSummaryIndexFlags() {
10123 if (parseUInt64(Flags))
10126 Index->setFlags(Flags);
10132bool LLParser::parseBlockCount() {
10139 if (parseUInt64(BlockCount))
10142 Index->setBlockCount(BlockCount);
10150bool LLParser::parseGVEntry(
unsigned ID) {
10158 LocTy Loc = Lex.getLoc();
10161 switch (Lex.getKind()) {
10165 parseStringConstant(Name))
10171 if (parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(GUID))
10175 return error(Lex.getLoc(),
"expected name or guid tag");