65 "Allow incomplete IR on a best effort basis (references to unknown "
66 "metadata will be dropped)"));
81 const char *Boundary = BoundaryLoc.
getPointer();
82 const char *BlockCommentStart =
nullptr;
83 bool InLineComment =
false;
85 for (
const char *Ptr = Begin; Ptr < End;) {
86 if (BlockCommentStart) {
87 if (Ptr + 1 < End && Ptr[0] ==
'*' && Ptr[1] ==
'/') {
89 if (BlockCommentStart < Boundary && Ptr > Boundary)
91 BlockCommentStart =
nullptr;
99 if (*Ptr ==
'\n' || *Ptr ==
'\r')
100 InLineComment =
false;
106 InLineComment =
true;
110 if (Ptr + 1 < End && Ptr[0] ==
'/' && Ptr[1] ==
'*') {
111 BlockCommentStart = Ptr;
118 return BlockCommentStart && BlockCommentStart < Boundary && End > Boundary;
127 if (Context.shouldDiscardValueNames())
130 "Can't read textual IR with a Context that discards named Values");
133 if (parseTargetDefinitions(DataLayoutCallback))
137 return parseTopLevelEntities() || validateEndOfModule(UpgradeDebugInfo) ||
138 validateEndOfIndex();
143 restoreParsingState(Slots);
147 if (parseType(Ty) || parseConstantValue(Ty,
C))
150 return error(Lex.getLoc(),
"expected end of string");
156 restoreParsingState(Slots);
160 SMLoc Start = Lex.getLoc();
164 SMLoc End = Lex.getLoc();
172 restoreParsingState(Slots);
176 SMLoc Start = Lex.getLoc();
178 bool Status = parseDIExpressionBody(Result,
false);
179 SMLoc End = Lex.getLoc();
187 restoreParsingState(&Slots);
190 for (
SMLoc End : DefinitionEnds) {
191 if (Lex.getLoc().getPointer() >= End.getPointer())
192 return error(End,
"expected end of metadata definition");
194 return tokError(
"expected a metadata definition");
195 if (parseStandaloneMetadata())
197 if (Lex.getPrevTokEndLoc().getPointer() > End.getPointer() ||
199 Lex.getLoc().getPointer() < End.getPointer()) ||
201 return error(End,
"expected end of metadata definition");
205 return tokError(
"expected end of metadata definitions");
207 if (!ForwardRefMDNodes.empty())
208 return error(ForwardRefMDNodes.begin()->second.second,
209 "use of undefined metadata '!" +
210 Twine(ForwardRefMDNodes.begin()->first) +
"'");
212 for (
auto &[
_, MD] : NumberedMetadata)
213 if (MD && !MD->isResolved())
216 NewDistinctSPs.clear();
218 Slots.MetadataNodes = std::move(NumberedMetadata);
222void LLParser::restoreParsingState(
const SlotMapping *Slots) {
229 std::make_pair(
I.getKey(), std::make_pair(
I.second,
LocTy())));
230 for (
const auto &
I : Slots->
Types)
231 NumberedTypes.insert(
232 std::make_pair(
I.first, std::make_pair(
I.second,
LocTy())));
238 II->getIntrinsicID() != Intrinsic::experimental_noalias_scope_decl)
245 if (MD->isTemporary())
249 assert(
II->use_empty() &&
"Cannot have uses");
250 II->eraseFromParent();
259void LLParser::dropUnknownMetadataReferences() {
260 auto Pred = [](
unsigned MDKind, MDNode *
Node) {
return Node->isTemporary(); };
262 F.eraseMetadataIf(Pred);
264 I.eraseMetadataIf(Pred);
271 for (GlobalVariable &GV : M->globals())
272 GV.eraseMetadataIf(Pred);
275 [](
const auto &
E) {
return std::get<2>(
E)->isTemporary(); });
277 [](
const auto &
E) {
return std::get<2>(
E)->isTemporary(); });
282 if (
Info.first->getNumTemporaryUses() == 1) {
283 NumberedMetadata.erase(ID);
284 ForwardRefMDNodes.erase(ID);
297 assert(!(SeenNewDbgInfoFormat && SeenOldDbgInfoFormat) &&
298 "Mixed debug intrinsics/records seen without a parsing error?");
301 for (
const auto &RAG : ForwardRefAttrGroups) {
303 const std::vector<unsigned> &
Attrs = RAG.second;
304 AttrBuilder
B(Context);
306 for (
const auto &Attr : Attrs) {
307 auto R = NumberedAttrBuilders.find(Attr);
308 if (R != NumberedAttrBuilders.end())
313 AttributeList AS = Fn->getAttributes();
314 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
315 AS = AS.removeFnAttributes(Context);
321 if (MaybeAlign
A = FnAttrs.getAlignment()) {
322 Fn->setAlignment(*
A);
323 FnAttrs.removeAttribute(Attribute::Alignment);
326 AS = AS.addFnAttributes(Context, FnAttrs);
327 Fn->setAttributes(AS);
329 AttributeList AS = CI->getAttributes();
330 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
331 AS = AS.removeFnAttributes(Context);
333 AS = AS.addFnAttributes(Context, FnAttrs);
334 CI->setAttributes(AS);
336 AttributeList AS =
II->getAttributes();
337 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
338 AS = AS.removeFnAttributes(Context);
340 AS = AS.addFnAttributes(Context, FnAttrs);
341 II->setAttributes(AS);
343 AttributeList AS = CBI->getAttributes();
344 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
345 AS = AS.removeFnAttributes(Context);
347 AS = AS.addFnAttributes(Context, FnAttrs);
348 CBI->setAttributes(AS);
350 AttrBuilder
Attrs(M->getContext(), GV->getAttributes());
360 if (!ForwardRefBlockAddresses.empty())
361 return error(ForwardRefBlockAddresses.begin()->first.Loc,
362 "expected function name in blockaddress");
364 auto ResolveForwardRefDSOLocalEquivalents = [&](
const ValID &GVRef,
365 GlobalValue *FwdRef) {
366 GlobalValue *GV =
nullptr;
368 GV = M->getNamedValue(GVRef.
StrVal);
370 GV = NumberedVals.get(GVRef.
UIntVal);
375 "' referenced by dso_local_equivalent");
379 "expected a function, alias to function, or ifunc "
380 "in dso_local_equivalent");
383 FwdRef->replaceAllUsesWith(Equiv);
384 FwdRef->eraseFromParent();
391 for (
auto &Iter : ForwardRefDSOLocalEquivalentIDs) {
392 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
395 for (
auto &Iter : ForwardRefDSOLocalEquivalentNames) {
396 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
399 ForwardRefDSOLocalEquivalentIDs.clear();
400 ForwardRefDSOLocalEquivalentNames.clear();
402 for (
const auto &NT : NumberedTypes)
403 if (
NT.second.second.isValid())
405 "use of undefined type '%" + Twine(
NT.first) +
"'");
407 for (
const auto &[Name, TypeInfo] : NamedTypes)
408 if (TypeInfo.second.isValid())
409 return error(TypeInfo.second,
410 "use of undefined type named '" + Name +
"'");
412 if (!ForwardRefComdats.empty())
413 return error(ForwardRefComdats.begin()->second,
414 "use of undefined comdat '$" +
415 ForwardRefComdats.begin()->first +
"'");
418 dropUnknownMetadataReferences();
420 if (!ForwardRefMDNodes.empty())
421 return error(ForwardRefMDNodes.begin()->second.second,
422 "use of undefined metadata '!" +
423 Twine(ForwardRefMDNodes.begin()->first) +
"'");
426 for (
auto [Loc, DR, MD] : PendingDbgRecords) {
430 return error(Loc,
"invalid debug location");
432 PendingDbgRecords.clear();
433 for (
auto [Loc,
I, MD] : PendingDbgInsts) {
437 return error(Loc,
"invalid !dbg metadata");
439 PendingDbgInsts.clear();
453 if (!CB || !CB->isCallee(&U))
454 return error(
Info.second,
"intrinsic can only be used as callee");
456 std::string ErrorMsg;
457 raw_string_ostream ErrorOS(ErrorMsg);
471 return error(
Info.second,
"unknown intrinsic '" + Name +
"'");
482 Info.first->eraseFromParent();
483 ForwardRefVals.erase(Name);
492 auto GetCommonFunctionType = [](
Value *
V) -> FunctionType * {
493 FunctionType *FTy =
nullptr;
494 for (Use &U :
V->uses()) {
496 if (!CB || !CB->isCallee(&U) || (FTy && FTy != CB->getFunctionType()))
498 FTy = CB->getFunctionType();
506 Type *Ty = GetCommonFunctionType(
Info.first);
514 GV =
new GlobalVariable(*M, Ty,
false,
517 Info.first->replaceAllUsesWith(GV);
518 Info.first->eraseFromParent();
519 ForwardRefVals.erase(Name);
522 if (!ForwardRefVals.empty())
523 return error(ForwardRefVals.begin()->second.second,
524 "use of undefined value '@" + ForwardRefVals.begin()->first +
527 if (!ForwardRefValIDs.empty())
528 return error(ForwardRefValIDs.begin()->second.second,
529 "use of undefined value '@" +
530 Twine(ForwardRefValIDs.begin()->first) +
"'");
533 for (
auto &
N : NumberedMetadata) {
534 if (
N.second && !
N.second->isResolved())
535 N.second->resolveCycles();
539 NewDistinctSPs.clear();
541 for (
auto *Inst : InstsWithTBAATag) {
542 MDNode *MD = Inst->getMetadata(LLVMContext::MD_tbaa);
545 assert(MD &&
"UpgradeInstWithTBAATag should have a TBAA tag");
548 if (MD != UpgradedMD)
549 Inst->setMetadata(LLVMContext::MD_tbaa, UpgradedMD);
558 if (UpgradeDebugInfo)
572 Slots->GlobalValues = std::move(NumberedVals);
573 Slots->MetadataNodes = std::move(NumberedMetadata);
574 for (
const auto &
I : NamedTypes)
575 Slots->NamedTypes.insert(std::make_pair(
I.getKey(),
I.second.first));
576 for (
const auto &
I : NumberedTypes)
577 Slots->Types.insert(std::make_pair(
I.first,
I.second.first));
583bool LLParser::validateEndOfIndex() {
587 if (!ForwardRefValueInfos.empty())
588 return error(ForwardRefValueInfos.begin()->second.front().second,
589 "use of undefined summary '^" +
590 Twine(ForwardRefValueInfos.begin()->first) +
"'");
592 if (!ForwardRefAliasees.empty())
593 return error(ForwardRefAliasees.begin()->second.front().second,
594 "use of undefined summary '^" +
595 Twine(ForwardRefAliasees.begin()->first) +
"'");
597 if (!ForwardRefTypeIds.empty())
598 return error(ForwardRefTypeIds.begin()->second.front().second,
599 "use of undefined type id summary '^" +
600 Twine(ForwardRefTypeIds.begin()->first) +
"'");
614 std::string TentativeDLStr = M->getDataLayoutStr();
619 switch (Lex.getKind()) {
621 if (parseTargetDefinition(TentativeDLStr, DLStrLoc))
625 if (parseSourceFileName())
634 if (
auto LayoutOverride =
635 DataLayoutCallback(M->getTargetTriple().str(), TentativeDLStr)) {
636 TentativeDLStr = *LayoutOverride;
642 M->setDataLayout(MaybeDL.
get());
646bool LLParser::parseTopLevelEntities() {
650 switch (Lex.getKind()) {
654 if (parseSummaryEntry())
658 if (parseSourceFileName())
668 switch (Lex.getKind()) {
670 return tokError(
"expected top-level entity");
681 if (parseModuleAsm())
685 if (parseUnnamedType())
689 if (parseNamedType())
693 if (parseUnnamedGlobal())
697 if (parseNamedGlobal())
702 if (parseStandaloneMetadata())
706 if (parseSummaryEntry())
710 if (parseNamedMetadata())
714 if (parseUnnamedAttrGrp())
718 if (parseUseListOrder())
730bool LLParser::parseModuleAsm() {
738 Module::GlobalAsmProperties Props;
742 SMLoc Loc = Lex.getLoc();
744 return error(Loc,
"expected property name followed by ':'");
746 Key = Lex.getStrVal();
749 if (parseStringConstant(
Value))
753 return error(Loc,
"unknown property name");
763 std::string AsmStrPart;
764 if (parseStringConstant(AsmStrPart))
766 AsmStr += AsmStrPart +
"\n";
769 M->appendModuleInlineAsm({AsmStr, Props});
776bool LLParser::parseTargetDefinition(std::string &TentativeDLStr,
782 return tokError(
"unknown target property");
785 if (parseToken(
lltok::equal,
"expected '=' after target triple") ||
786 parseStringConstant(Str))
788 M->setTargetTriple(Triple(std::move(Str)));
792 if (parseToken(
lltok::equal,
"expected '=' after target datalayout"))
794 DLStrLoc = Lex.getLoc();
795 if (parseStringConstant(TentativeDLStr))
803bool LLParser::parseSourceFileName() {
806 if (parseToken(
lltok::equal,
"expected '=' after source_filename") ||
807 parseStringConstant(SourceFileName))
810 M->setSourceFileName(SourceFileName);
816bool LLParser::parseUnnamedType() {
817 LocTy TypeLoc = Lex.getLoc();
818 unsigned TypeID = Lex.getUIntVal();
821 if (parseToken(
lltok::equal,
"expected '=' after name") ||
826 if (parseStructDefinition(TypeLoc,
"", NumberedTypes[
TypeID], Result))
830 std::pair<Type*, LocTy> &
Entry = NumberedTypes[
TypeID];
832 return error(TypeLoc,
"non-struct types may not be recursive");
834 Entry.second = SMLoc();
842bool LLParser::parseNamedType() {
843 std::string
Name = Lex.getStrVal();
844 LocTy NameLoc = Lex.getLoc();
847 if (parseToken(
lltok::equal,
"expected '=' after name") ||
852 if (parseStructDefinition(NameLoc, Name, NamedTypes[Name], Result))
856 std::pair<Type*, LocTy> &
Entry = NamedTypes[
Name];
858 return error(NameLoc,
"non-struct types may not be recursive");
860 Entry.second = SMLoc();
868bool LLParser::parseDeclare() {
872 std::vector<std::pair<unsigned, MDNode *>> MDs;
876 if (parseMetadataAttachment(MDK,
N))
878 MDs.push_back({MDK,
N});
882 unsigned FunctionNumber = -1;
883 SmallVector<unsigned> UnnamedArgNums;
884 if (parseFunctionHeader(
F,
false, FunctionNumber, UnnamedArgNums))
887 F->addMetadata(MD.first, *MD.second);
893bool LLParser::parseDefine() {
896 FileLoc FunctionStart = getTokLineColumnPos();
900 unsigned FunctionNumber = -1;
901 SmallVector<unsigned> UnnamedArgNums;
903 parseFunctionHeader(
F,
true, FunctionNumber, UnnamedArgNums) ||
904 parseOptionalFunctionMetadata(*
F) ||
905 parseFunctionBody(*
F, FunctionNumber, UnnamedArgNums);
907 ParserContext->addFunctionLocation(
908 F, FileLocRange(FunctionStart, getPrevTokEndLineColumnPos()));
916bool LLParser::parseGlobalType(
bool &IsConstant) {
923 return tokError(
"expected 'global' or 'constant'");
929bool LLParser::parseOptionalUnnamedAddr(
950bool LLParser::parseUnnamedGlobal() {
953 LocTy NameLoc = Lex.getLoc();
957 VarID = Lex.getUIntVal();
958 if (checkValueID(NameLoc,
"global",
"@", NumberedVals.getNext(),
VarID))
962 if (parseToken(
lltok::equal,
"expected '=' after name"))
965 VarID = NumberedVals.getNext();
969 unsigned Linkage, Visibility, DLLStorageClass;
973 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
975 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
978 switch (Lex.getKind()) {
980 return parseGlobal(Name,
VarID, NameLoc,
Linkage, HasLinkage, Visibility,
981 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
984 return parseAliasOrIFunc(Name,
VarID, NameLoc,
Linkage, Visibility,
985 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
994bool LLParser::parseNamedGlobal() {
996 LocTy NameLoc = Lex.getLoc();
997 std::string
Name = Lex.getStrVal();
1001 unsigned Linkage, Visibility, DLLStorageClass;
1005 if (parseToken(
lltok::equal,
"expected '=' in global variable") ||
1006 parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
1008 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
1011 switch (Lex.getKind()) {
1013 return parseGlobal(Name, -1, NameLoc,
Linkage, HasLinkage, Visibility,
1014 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
1017 return parseAliasOrIFunc(Name, -1, NameLoc,
Linkage, Visibility,
1018 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
1022bool LLParser::parseComdat() {
1024 std::string
Name = Lex.getStrVal();
1025 LocTy NameLoc = Lex.getLoc();
1032 return tokError(
"expected comdat type");
1035 switch (Lex.getKind()) {
1037 return tokError(
"unknown selection kind");
1059 if (
I != ComdatSymTab.
end() && !ForwardRefComdats.erase(Name))
1060 return error(NameLoc,
"redefinition of comdat '$" + Name +
"'");
1063 if (
I != ComdatSymTab.
end())
1066 C = M->getOrInsertComdat(Name);
1067 C->setSelectionKind(SK);
1074bool LLParser::parseMDString(
MDString *&Result) {
1076 if (parseStringConstant(Str))
1084bool LLParser::parseMDNodeID(
MDNode *&Result) {
1086 LocTy IDLoc = Lex.getLoc();
1088 if (parseUInt32(MID))
1092 auto [It,
Inserted] = NumberedMetadata.try_emplace(MID);
1099 auto &FwdRef = ForwardRefMDNodes[MID];
1102 Result = FwdRef.first.get();
1103 It->second.reset(Result);
1109bool LLParser::parseNamedMetadata() {
1111 std::string
Name = Lex.getStrVal();
1119 NamedMDNode *NMD = M->getOrInsertNamedMetadata(Name);
1122 MDNode *
N =
nullptr;
1127 Lex.getStrVal() ==
"DIExpression") {
1128 if (parseDIExpression(
N,
false))
1133 Lex.getStrVal() ==
"DIArgList") {
1134 return tokError(
"found DIArgList outside of function");
1142 return parseToken(
lltok::rbrace,
"expected end of metadata node");
1147bool LLParser::parseStandaloneMetadata() {
1150 unsigned MetadataID = 0;
1153 if (parseUInt32(MetadataID) || parseToken(
lltok::equal,
"expected '=' here"))
1158 return tokError(
"unexpected type in metadata definition");
1162 if (parseSpecializedMDNode(Init, IsDistinct))
1165 parseMDTuple(Init, IsDistinct))
1169 auto FI = ForwardRefMDNodes.find(MetadataID);
1170 if (FI != ForwardRefMDNodes.end()) {
1171 auto *ToReplace = FI->second.first.get();
1175 for (
auto *Inst : TempDIAssignIDAttachments[ToReplace]) {
1176 assert(!Inst->getMetadata(LLVMContext::MD_DIAssignID) &&
1177 "Inst unexpectedly already has DIAssignID attachment");
1178 Inst->setMetadata(LLVMContext::MD_DIAssignID, Init);
1182 ToReplace->replaceAllUsesWith(Init);
1183 ForwardRefMDNodes.erase(FI);
1185 assert(NumberedMetadata[MetadataID] == Init &&
"Tracking VH didn't work");
1187 auto [It,
Inserted] = NumberedMetadata.try_emplace(MetadataID);
1189 return tokError(
"Metadata id is already used");
1190 It->second.reset(Init);
1197bool LLParser::skipModuleSummaryEntry() {
1207 return tokError(
"Expected 'gv', 'module', 'typeid', "
1208 "'typeidCompatibleVTable', 'flags' or 'blockcount' at the "
1209 "start of summary entry");
1211 return parseSummaryIndexFlags();
1213 return parseBlockCount();
1215 if (parseToken(
lltok::colon,
"expected ':' at start of summary entry") ||
1216 parseToken(
lltok::lparen,
"expected '(' at start of summary entry"))
1220 unsigned NumOpenParen = 1;
1222 switch (Lex.getKind()) {
1230 return tokError(
"found end of file while parsing summary entry");
1236 }
while (NumOpenParen > 0);
1242bool LLParser::parseSummaryEntry() {
1248 Lex.setIgnoreColonInIdentifiers(
true);
1256 return skipModuleSummaryEntry();
1258 bool result =
false;
1259 switch (Lex.getKind()) {
1261 result = parseGVEntry(SummaryID);
1264 result = parseModuleEntry(SummaryID);
1267 result = parseTypeIdEntry(SummaryID);
1270 result = parseTypeIdCompatibleVtableEntry(SummaryID);
1273 result = parseSummaryIndexFlags();
1276 result = parseBlockCount();
1279 result =
error(Lex.getLoc(),
"unexpected summary kind");
1282 Lex.setIgnoreColonInIdentifiers(
false);
1316bool LLParser::parseAliasOrIFunc(
const std::string &Name,
unsigned NameID,
1317 LocTy NameLoc,
unsigned L,
unsigned Visibility,
1318 unsigned DLLStorageClass,
bool DSOLocal,
1333 return error(NameLoc,
"invalid linkage type for alias");
1336 return error(NameLoc,
1337 "symbol with local linkage must have default visibility");
1340 return error(NameLoc,
1341 "symbol with local linkage cannot have a DLL storage class");
1344 LocTy ExplicitTypeLoc = Lex.getLoc();
1345 if (parseType(Ty) ||
1346 parseToken(
lltok::comma,
"expected comma after alias or ifunc's type"))
1350 LocTy AliaseeLoc = Lex.getLoc();
1355 if (parseGlobalTypeAndValue(Aliasee))
1360 if (parseValID(ID,
nullptr))
1363 return error(AliaseeLoc,
"invalid aliasee");
1364 Aliasee =
ID.ConstantVal;
1370 return error(AliaseeLoc,
"An alias or ifunc must have pointer type");
1371 unsigned AddrSpace = PTy->getAddressSpace();
1373 GlobalValue *GVal =
nullptr;
1377 if (!
Name.empty()) {
1378 auto I = ForwardRefVals.find(Name);
1379 if (
I != ForwardRefVals.end()) {
1380 GVal =
I->second.first;
1381 ForwardRefVals.erase(Name);
1382 }
else if (M->getNamedValue(Name)) {
1383 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1386 auto I = ForwardRefValIDs.find(NameID);
1387 if (
I != ForwardRefValIDs.end()) {
1388 GVal =
I->second.first;
1389 ForwardRefValIDs.erase(
I);
1394 std::unique_ptr<GlobalAlias> GA;
1395 std::unique_ptr<GlobalIFunc> GI;
1423 if (parseGlobalObjectMetadataAttachment(*GI))
1426 return tokError(
"unknown alias or ifunc property!");
1431 NumberedVals.add(NameID, GV);
1438 "forward reference and definition of alias have different types");
1448 M->insertAlias(GA.release());
1450 M->insertIFunc(GI.release());
1451 assert(GV->
getName() == Name &&
"Should not be a name conflict!");
1460 case lltok::kw_sanitize_memtag:
1474 switch (Lex.getKind()) {
1476 Meta.NoAddress =
true;
1479 Meta.NoHWAddress =
true;
1481 case lltok::kw_sanitize_memtag:
1485 Meta.IsDynInit =
true;
1488 return tokError(
"non-sanitizer token passed to LLParser::parseSanitizer()");
1508bool LLParser::parseGlobal(
const std::string &Name,
unsigned NameID,
1509 LocTy NameLoc,
unsigned Linkage,
bool HasLinkage,
1510 unsigned Visibility,
unsigned DLLStorageClass,
1514 return error(NameLoc,
1515 "symbol with local linkage must have default visibility");
1518 return error(NameLoc,
1519 "symbol with local linkage cannot have a DLL storage class");
1523 LocTy IsExternallyInitializedLoc;
1527 if (parseOptionalAddrSpace(AddrSpace) ||
1529 IsExternallyInitialized,
1530 &IsExternallyInitializedLoc) ||
1531 parseGlobalType(IsConstant) || parseType(Ty, TyLoc))
1540 if (parseGlobalValue(Ty, Init))
1545 return error(TyLoc,
"invalid type for global variable");
1547 GlobalValue *GVal =
nullptr;
1550 if (!
Name.empty()) {
1551 auto I = ForwardRefVals.find(Name);
1552 if (
I != ForwardRefVals.end()) {
1553 GVal =
I->second.first;
1554 ForwardRefVals.erase(
I);
1555 }
else if (M->getNamedValue(Name)) {
1556 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1561 if (NameID == (
unsigned)-1)
1562 NameID = NumberedVals.getNext();
1564 auto I = ForwardRefValIDs.find(NameID);
1565 if (
I != ForwardRefValIDs.end()) {
1566 GVal =
I->second.first;
1567 ForwardRefValIDs.erase(
I);
1571 GlobalVariable *GV =
new GlobalVariable(
1576 NumberedVals.add(NameID, GV);
1594 "forward reference and definition of global have different types");
1614 }
else if (Lex.getKind() == lltok::kw_align) {
1616 if (parseOptionalAlignment(Alignment))
1622 if (parseOptionalCodeModel(CodeModel))
1626 if (parseGlobalObjectMetadataAttachment(*GV))
1629 if (parseSanitizer(GV))
1633 if (parseOptionalComdat(Name,
C))
1638 return tokError(
"unknown global variable property!");
1642 AttrBuilder
Attrs(M->getContext());
1644 std::vector<unsigned> FwdRefAttrGrps;
1645 if (parseFnAttributeValuePairs(Attrs, FwdRefAttrGrps,
false, BuiltinLoc))
1647 if (
Attrs.hasAttributes() || !FwdRefAttrGrps.empty()) {
1649 ForwardRefAttrGroups[GV] = FwdRefAttrGrps;
1657bool LLParser::parseUnnamedAttrGrp() {
1659 LocTy AttrGrpLoc = Lex.getLoc();
1663 return tokError(
"expected attribute group id");
1665 unsigned VarID = Lex.getUIntVal();
1666 std::vector<unsigned> unused;
1674 auto R = NumberedAttrBuilders.find(
VarID);
1675 if (R == NumberedAttrBuilders.end())
1676 R = NumberedAttrBuilders.emplace(
VarID, AttrBuilder(M->getContext())).first;
1678 if (parseFnAttributeValuePairs(
R->second, unused,
true, BuiltinLoc) ||
1679 parseToken(
lltok::rbrace,
"expected end of attribute group"))
1682 if (!
R->second.hasAttributes())
1683 return error(AttrGrpLoc,
"attribute group has no attributes");
1690#define GET_ATTR_NAMES
1691#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME) \
1692 case lltok::kw_##DISPLAY_NAME: \
1693 return Attribute::ENUM_NAME;
1694#include "llvm/IR/Attributes.inc"
1703 return parseRequiredTypeAttr(
B, Lex.getKind(), Attr);
1706 case Attribute::Alignment: {
1715 if (parseOptionalAlignment(Alignment,
true))
1718 B.addAlignmentAttr(Alignment);
1721 case Attribute::StackAlignment: {
1726 parseUInt32(Alignment))
1729 if (parseOptionalStackAlignment(Alignment))
1732 B.addStackAlignmentAttr(Alignment);
1735 case Attribute::AllocSize: {
1736 unsigned ElemSizeArg;
1737 std::optional<unsigned> NumElemsArg;
1738 if (parseAllocSizeArguments(ElemSizeArg, NumElemsArg))
1740 B.addAllocSizeAttr(ElemSizeArg, NumElemsArg);
1743 case Attribute::VScaleRange: {
1744 unsigned MinValue, MaxValue;
1745 if (parseVScaleRangeArguments(MinValue, MaxValue))
1747 B.addVScaleRangeAttr(MinValue,
1748 MaxValue > 0 ? MaxValue : std::optional<unsigned>());
1751 case Attribute::Dereferenceable: {
1752 std::optional<uint64_t> Bytes;
1753 if (parseOptionalAttrBytes(lltok::kw_dereferenceable, Bytes))
1755 assert(Bytes.has_value());
1756 B.addDereferenceableAttr(Bytes.value());
1759 case Attribute::DeadOnReturn: {
1760 std::optional<uint64_t> Bytes;
1761 if (parseOptionalAttrBytes(lltok::kw_dead_on_return, Bytes,
1764 if (Bytes.has_value()) {
1765 B.addDeadOnReturnAttr(DeadOnReturnInfo(Bytes.value()));
1767 B.addDeadOnReturnAttr(DeadOnReturnInfo());
1771 case Attribute::DereferenceableOrNull: {
1772 std::optional<uint64_t> Bytes;
1773 if (parseOptionalAttrBytes(lltok::kw_dereferenceable_or_null, Bytes))
1775 assert(Bytes.has_value());
1776 B.addDereferenceableOrNullAttr(Bytes.value());
1779 case Attribute::UWTable: {
1781 if (parseOptionalUWTableKind(Kind))
1783 B.addUWTableAttr(Kind);
1786 case Attribute::AllocKind: {
1788 if (parseAllocKind(Kind))
1790 B.addAllocKindAttr(Kind);
1793 case Attribute::Memory: {
1794 std::optional<MemoryEffects> ME = parseMemoryAttr();
1797 B.addMemoryAttr(*ME);
1800 case Attribute::DenormalFPEnv: {
1801 std::optional<DenormalFPEnv>
Mode = parseDenormalFPEnvAttr();
1805 B.addDenormalFPEnvAttr(*
Mode);
1808 case Attribute::NoFPClass: {
1811 B.addNoFPClassAttr(NoFPClass);
1817 case Attribute::Range:
1818 return parseRangeAttr(
B);
1819 case Attribute::Initializes:
1820 return parseInitializesAttr(
B);
1821 case Attribute::Captures:
1822 return parseCapturesAttr(
B);
1824 B.addAttribute(Attr);
1832 case lltok::kw_readnone:
1835 case lltok::kw_readonly:
1838 case lltok::kw_writeonly:
1857bool LLParser::parseFnAttributeValuePairs(AttrBuilder &
B,
1858 std::vector<unsigned> &FwdRefAttrGrps,
1859 bool InAttrGrp, LocTy &BuiltinLoc) {
1860 bool HaveError =
false;
1871 if (parseStringAttribute(
B))
1883 "cannot have an attribute group reference in an attribute group");
1886 FwdRefAttrGrps.push_back(Lex.getUIntVal());
1892 SMLoc Loc = Lex.getLoc();
1893 if (Token == lltok::kw_builtin)
1905 return error(Lex.getLoc(),
"unterminated attribute group");
1908 if (parseEnumAttribute(Attr,
B, InAttrGrp))
1915 HaveError |=
error(Loc,
"this attribute does not apply to functions");
1919 B.addMemoryAttr(ME);
1933 PTy->getAddressSpace());
1942 error(Loc,
"'" + Name +
"' is not a basic block");
1944 error(Loc,
"'" + Name +
"' defined with type '" +
1957 error(Loc,
"global variable reference must have pointer type");
1968 auto I = ForwardRefVals.find(Name);
1969 if (
I != ForwardRefVals.end())
1970 Val =
I->second.first;
1976 checkValidVariableType(Loc,
"@" + Name, Ty, Val));
1980 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
1987 error(Loc,
"global variable reference must have pointer type");
1991 GlobalValue *Val = NumberedVals.get(ID);
1996 auto I = ForwardRefValIDs.find(ID);
1997 if (
I != ForwardRefValIDs.end())
1998 Val =
I->second.first;
2004 checkValidVariableType(Loc,
"@" + Twine(ID), Ty, Val));
2008 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
2016Comdat *LLParser::getComdat(
const std::string &Name, LocTy
Loc) {
2020 if (
I != ComdatSymTab.
end())
2024 Comdat *
C = M->getOrInsertComdat(Name);
2025 ForwardRefComdats[
Name] = Loc;
2035bool LLParser::parseToken(
lltok::Kind T,
const char *ErrMsg) {
2036 if (Lex.getKind() !=
T)
2037 return tokError(ErrMsg);
2044bool LLParser::parseStringConstant(std::string &Result) {
2046 return tokError(
"expected string constant");
2047 Result = Lex.getStrVal();
2054bool LLParser::parseUInt32(uint32_t &Val) {
2055 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
2056 return tokError(
"expected integer");
2057 uint64_t Val64 = Lex.getAPSIntVal().getLimitedValue(0xFFFFFFFFULL+1);
2058 if (Val64 !=
unsigned(Val64))
2059 return tokError(
"expected 32-bit integer (too large)");
2067bool LLParser::parseUInt64(
uint64_t &Val) {
2068 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
2069 return tokError(
"expected integer");
2070 Val = Lex.getAPSIntVal().getLimitedValue();
2080 switch (Lex.getKind()) {
2082 return tokError(
"expected localdynamic, initialexec or localexec");
2110 return parseTLSModel(TLM) ||
2111 parseToken(
lltok::rparen,
"expected ')' after thread local model");
2119bool LLParser::parseOptionalAddrSpace(
unsigned &AddrSpace,
unsigned DefaultAS) {
2120 AddrSpace = DefaultAS;
2124 auto ParseAddrspaceValue = [&](
unsigned &AddrSpace) ->
bool {
2126 const std::string &AddrSpaceStr = Lex.getStrVal();
2127 if (AddrSpaceStr ==
"A") {
2128 AddrSpace = M->getDataLayout().getAllocaAddrSpace();
2129 }
else if (AddrSpaceStr ==
"G") {
2130 AddrSpace = M->getDataLayout().getDefaultGlobalsAddressSpace();
2131 }
else if (AddrSpaceStr ==
"P") {
2132 AddrSpace = M->getDataLayout().getProgramAddressSpace();
2133 }
else if (std::optional<unsigned> AS =
2134 M->getDataLayout().getNamedAddressSpace(AddrSpaceStr)) {
2137 return tokError(
"invalid symbolic addrspace '" + AddrSpaceStr +
"'");
2143 return tokError(
"expected integer or string constant");
2144 SMLoc Loc = Lex.getLoc();
2145 if (parseUInt32(AddrSpace))
2148 return error(Loc,
"invalid address space, must be a 24-bit integer");
2152 return parseToken(
lltok::lparen,
"expected '(' in address space") ||
2153 ParseAddrspaceValue(AddrSpace) ||
2160bool LLParser::parseStringAttribute(AttrBuilder &
B) {
2161 std::string Attr = Lex.getStrVal();
2164 if (EatIfPresent(
lltok::equal) && parseStringConstant(Val))
2166 B.addAttribute(Attr, Val);
2171bool LLParser::parseOptionalParamOrReturnAttrs(AttrBuilder &
B,
bool IsParam) {
2172 bool HaveError =
false;
2179 if (parseStringAttribute(
B))
2190 SMLoc Loc = Lex.getLoc();
2195 if (parseEnumAttribute(Attr,
B,
false))
2199 HaveError |=
error(Loc,
"this attribute does not apply to parameters");
2201 HaveError |=
error(Loc,
"this attribute does not apply to return values");
2249bool LLParser::parseOptionalLinkage(
unsigned &Res,
bool &HasLinkage,
2250 unsigned &Visibility,
2251 unsigned &DLLStorageClass,
bool &DSOLocal) {
2255 parseOptionalDSOLocal(DSOLocal);
2256 parseOptionalVisibility(Visibility);
2257 parseOptionalDLLStorageClass(DLLStorageClass);
2260 return error(Lex.getLoc(),
"dso_location and DLL-StorageClass mismatch");
2266void LLParser::parseOptionalDSOLocal(
bool &DSOLocal) {
2267 switch (Lex.getKind()) {
2288void LLParser::parseOptionalVisibility(
unsigned &Res) {
2289 switch (Lex.getKind()) {
2306bool LLParser::parseOptionalImportType(
lltok::Kind Kind,
2310 return tokError(
"unknown import kind. Expect definition or declaration.");
2325void LLParser::parseOptionalDLLStorageClass(
unsigned &Res) {
2326 switch (Lex.getKind()) {
2396bool LLParser::parseOptionalCallingConv(
unsigned &CC) {
2397 switch (Lex.getKind()) {
2484 return tokError(
"unknown RISC-V ABI VLEN");
2485#define CC_VLS_CASE(ABIVlen) \
2487 CC = CallingConv::RISCV_VLSCall_##ABIVlen; \
2515 return parseUInt32(CC);
2525bool LLParser::parseMetadataAttachment(
unsigned &Kind,
MDNode *&MD) {
2528 std::string
Name = Lex.getStrVal();
2529 Kind = M->getMDKindID(Name);
2532 return parseMDNode(MD);
2537bool LLParser::parseInstructionMetadata(
Instruction &Inst) {
2540 return tokError(
"expected metadata after comma");
2544 auto Loc = Lex.getLoc();
2545 if (parseMetadataAttachment(MDK,
N))
2548 if (MDK == LLVMContext::MD_DIAssignID)
2549 TempDIAssignIDAttachments[
N].push_back(&Inst);
2550 else if (MDK == LLVMContext::MD_dbg)
2551 PendingDbgInsts.emplace_back(Loc, &Inst,
N);
2555 if (MDK == LLVMContext::MD_tbaa)
2556 InstsWithTBAATag.push_back(&Inst);
2565bool LLParser::parseGlobalObjectMetadataAttachment(
GlobalObject &GO) {
2568 if (parseMetadataAttachment(MDK,
N))
2577bool LLParser::parseOptionalFunctionMetadata(
Function &
F) {
2579 if (parseGlobalObjectMetadataAttachment(
F))
2587bool LLParser::parseOptionalAlignment(
MaybeAlign &Alignment,
bool AllowParens) {
2589 if (!EatIfPresent(lltok::kw_align))
2591 LocTy AlignLoc = Lex.getLoc();
2594 LocTy ParenLoc = Lex.getLoc();
2595 bool HaveParens =
false;
2601 if (parseUInt64(
Value))
2605 return error(ParenLoc,
"expected ')'");
2608 return error(AlignLoc,
"alignment is not a power of two");
2610 return error(AlignLoc,
"huge alignments are not supported yet");
2618bool LLParser::parseOptionalPrefAlignment(
MaybeAlign &Alignment) {
2622 LocTy AlignLoc = Lex.getLoc();
2625 LocTy ParenLoc = Lex.getLoc();
2627 return error(ParenLoc,
"expected '('");
2629 if (parseUInt64(
Value))
2632 ParenLoc = Lex.getLoc();
2634 return error(ParenLoc,
"expected ')'");
2637 return error(AlignLoc,
"alignment is not a power of two");
2639 return error(AlignLoc,
"huge alignments are not supported yet");
2649 auto StrVal = Lex.getStrVal();
2650 auto ErrMsg =
"expected global code model string";
2651 if (StrVal ==
"tiny")
2653 else if (StrVal ==
"small")
2655 else if (StrVal ==
"kernel")
2657 else if (StrVal ==
"medium")
2659 else if (StrVal ==
"large")
2662 return tokError(ErrMsg);
2674bool LLParser::parseOptionalAttrBytes(
lltok::Kind AttrKind,
2675 std::optional<uint64_t> &Bytes,
2676 bool ErrorNoBytes) {
2677 assert((AttrKind == lltok::kw_dereferenceable ||
2678 AttrKind == lltok::kw_dereferenceable_or_null ||
2679 AttrKind == lltok::kw_dead_on_return) &&
2683 if (!EatIfPresent(AttrKind))
2685 LocTy ParenLoc = Lex.getLoc();
2688 return error(ParenLoc,
"expected '('");
2689 Bytes = std::nullopt;
2692 LocTy DerefLoc = Lex.getLoc();
2693 if (parseUInt64(Bytes.value()))
2695 ParenLoc = Lex.getLoc();
2697 return error(ParenLoc,
"expected ')'");
2699 return error(DerefLoc,
"byte count specified must be non-zero");
2703bool LLParser::parseOptionalUWTableKind(
UWTableKind &Kind) {
2708 LocTy KindLoc = Lex.getLoc();
2714 return error(KindLoc,
"expected unwind table kind");
2721 LocTy ParenLoc = Lex.getLoc();
2723 return error(ParenLoc,
"expected '('");
2724 LocTy KindLoc = Lex.getLoc();
2726 if (parseStringConstant(Arg))
2727 return error(KindLoc,
"expected allockind value");
2731 }
else if (
A ==
"realloc") {
2733 }
else if (
A ==
"free") {
2735 }
else if (
A ==
"uninitialized") {
2737 }
else if (
A ==
"zeroed") {
2739 }
else if (
A ==
"aligned") {
2742 return error(KindLoc, Twine(
"unknown allockind ") +
A);
2745 ParenLoc = Lex.getLoc();
2747 return error(ParenLoc,
"expected ')'");
2749 return error(KindLoc,
"expected allockind value");
2758 return {Loc::ArgMem};
2760 return {Loc::InaccessibleMem};
2762 return {Loc::ErrnoMem};
2764 return {Loc::TargetMem0};
2766 return {Loc::TargetMem1};
2789 return std::nullopt;
2793static std::optional<DenormalMode::DenormalModeKind>
2805 return std::nullopt;
2809std::optional<MemoryEffects> LLParser::parseMemoryAttr() {
2814 Lex.setIgnoreColonInIdentifiers(
true);
2819 tokError(
"expected '('");
2820 return std::nullopt;
2823 bool SeenLoc =
false;
2824 bool SeenTargetLoc =
false;
2827 if (!Locs.
empty()) {
2830 tokError(
"expected ':' after location");
2831 return std::nullopt;
2838 tokError(
"expected memory location (argmem, inaccessiblemem, errnomem) "
2839 "or access kind (none, read, write, readwrite)");
2841 tokError(
"expected access kind (none, read, write, readwrite)");
2842 return std::nullopt;
2846 if (!Locs.
empty()) {
2851 SeenTargetLoc =
true;
2853 if (Locs.size() > 1 && SeenTargetLoc) {
2854 tokError(
"target memory default access kind must be specified first");
2855 return std::nullopt;
2860 tokError(
"default access kind must be specified first");
2861 return std::nullopt;
2870 tokError(
"unterminated memory attribute");
2871 return std::nullopt;
2874std::optional<DenormalMode> LLParser::parseDenormalFPEnvEntry() {
2875 std::optional<DenormalMode::DenormalModeKind> OutputMode =
2878 tokError(
"expected denormal behavior kind (ieee, preservesign, "
2879 "positivezero, dynamic)");
2885 std::optional<DenormalMode::DenormalModeKind> InputMode;
2889 tokError(
"expected denormal behavior kind (ieee, preservesign, "
2890 "positivezero, dynamic)");
2897 InputMode = OutputMode;
2900 return DenormalMode(*OutputMode, *InputMode);
2903std::optional<DenormalFPEnv> LLParser::parseDenormalFPEnvAttr() {
2906 Lex.setIgnoreColonInIdentifiers(
true);
2917 bool HasDefaultSection =
false;
2919 std::optional<DenormalMode> ParsedDefaultMode = parseDenormalFPEnvEntry();
2920 if (!ParsedDefaultMode)
2922 DefaultMode = *ParsedDefaultMode;
2923 HasDefaultSection =
true;
2928 if (HasDefaultSection && !HasComma) {
2929 tokError(
"expected ',' before float:");
2934 if (parseType(Ty) || !Ty->
isFloatTy()) {
2935 tokError(
"expected float:");
2939 if (parseToken(
lltok::colon,
"expected ':' before float denormal_fpenv"))
2942 std::optional<DenormalMode> ParsedF32Mode = parseDenormalFPEnvEntry();
2946 F32Mode = *ParsedF32Mode;
2949 if (parseToken(
lltok::rparen,
"unterminated denormal_fpenv"))
2952 return DenormalFPEnv(DefaultMode, F32Mode);
2994unsigned LLParser::parseNoFPClassAttr() {
2999 tokError(
"expected '('");
3006 if (TestMask != 0) {
3010 !parseUInt64(
Value)) {
3012 error(Lex.getLoc(),
"invalid mask value for 'nofpclass'");
3017 error(Lex.getLoc(),
"expected ')'");
3023 error(Lex.getLoc(),
"expected nofpclass test mask");
3041bool LLParser::parseOptionalCommaAlign(
MaybeAlign &Alignment,
3042 bool &AteExtraComma) {
3043 AteExtraComma =
false;
3047 AteExtraComma =
true;
3051 if (Lex.getKind() != lltok::kw_align)
3052 return error(Lex.getLoc(),
"expected metadata or 'align'");
3054 if (parseOptionalAlignment(Alignment))
3067bool LLParser::parseOptionalCommaAddrSpace(
unsigned &AddrSpace, LocTy &
Loc,
3068 bool &AteExtraComma) {
3069 AteExtraComma =
false;
3073 AteExtraComma =
true;
3079 return error(Lex.getLoc(),
"expected metadata or 'addrspace'");
3081 if (parseOptionalAddrSpace(AddrSpace))
3088bool LLParser::parseAllocSizeArguments(
unsigned &BaseSizeArg,
3089 std::optional<unsigned> &HowManyArg) {
3092 auto StartParen = Lex.getLoc();
3094 return error(StartParen,
"expected '('");
3096 if (parseUInt32(BaseSizeArg))
3100 auto HowManyAt = Lex.getLoc();
3102 if (parseUInt32(HowMany))
3104 if (HowMany == BaseSizeArg)
3105 return error(HowManyAt,
3106 "'allocsize' indices can't refer to the same parameter");
3107 HowManyArg = HowMany;
3109 HowManyArg = std::nullopt;
3111 auto EndParen = Lex.getLoc();
3113 return error(EndParen,
"expected ')'");
3117bool LLParser::parseVScaleRangeArguments(
unsigned &MinValue,
3118 unsigned &MaxValue) {
3121 auto StartParen = Lex.getLoc();
3123 return error(StartParen,
"expected '('");
3125 if (parseUInt32(MinValue))
3129 if (parseUInt32(MaxValue))
3132 MaxValue = MinValue;
3134 auto EndParen = Lex.getLoc();
3136 return error(EndParen,
"expected ')'");
3145bool LLParser::parseScopeAndOrdering(
bool IsAtomic,
SyncScope::ID &SSID,
3150 return parseScope(SSID) || parseOrdering(Ordering);
3160 auto StartParenAt = Lex.getLoc();
3162 return error(StartParenAt,
"Expected '(' in syncscope");
3165 auto SSNAt = Lex.getLoc();
3166 if (parseStringConstant(SSN))
3167 return error(SSNAt,
"Expected synchronization scope name");
3169 auto EndParenAt = Lex.getLoc();
3171 return error(EndParenAt,
"Expected ')' in syncscope");
3173 SSID = Context.getOrInsertSyncScopeID(SSN);
3184 switch (Lex.getKind()) {
3186 return tokError(
"Expected ordering on atomic instruction");
3205bool LLParser::parseOptionalStackAlignment(
unsigned &Alignment) {
3207 if (!EatIfPresent(lltok::kw_alignstack))
3209 LocTy ParenLoc = Lex.getLoc();
3211 return error(ParenLoc,
"expected '('");
3212 LocTy AlignLoc = Lex.getLoc();
3213 if (parseUInt32(Alignment))
3215 ParenLoc = Lex.getLoc();
3217 return error(ParenLoc,
"expected ')'");
3219 return error(AlignLoc,
"stack alignment is not a power of two");
3233 bool &AteExtraComma) {
3234 AteExtraComma =
false;
3237 return tokError(
"expected ',' as start of index list");
3241 if (Indices.
empty())
3242 return tokError(
"expected index");
3243 AteExtraComma =
true;
3247 if (parseUInt32(Idx))
3260bool LLParser::parseType(
Type *&Result,
const Twine &
Msg,
bool AllowVoid) {
3261 SMLoc TypeLoc = Lex.getLoc();
3262 switch (Lex.getKind()) {
3264 return tokError(
Msg);
3273 if (
Result->isPointerTy()) {
3275 if (parseOptionalAddrSpace(AddrSpace))
3281 return tokError(
"ptr* is invalid - use ptr instead");
3292 if (parseTargetExtType(Result))
3298 if (parseAnonStructType(Result,
false))
3304 if (parseArrayVectorType(Result,
false))
3311 if (parseAnonStructType(Result,
true) ||
3312 parseToken(
lltok::greater,
"expected '>' at end of packed struct"))
3314 }
else if (parseArrayVectorType(Result,
true))
3319 std::pair<Type*, LocTy> &
Entry = NamedTypes[Lex.getStrVal()];
3325 Entry.second = Lex.getLoc();
3334 std::pair<Type*, LocTy> &
Entry = NumberedTypes[Lex.getUIntVal()];
3340 Entry.second = Lex.getLoc();
3350 switch (Lex.getKind()) {
3353 if (!AllowVoid &&
Result->isVoidTy())
3354 return error(TypeLoc,
"void type only allowed for function results");
3360 return tokError(
"basic block pointers are invalid");
3362 return tokError(
"pointers to void are invalid - use i8* instead");
3364 return tokError(
"pointer to this type is invalid");
3372 return tokError(
"basic block pointers are invalid");
3374 return tokError(
"pointers to void are invalid; use i8* instead");
3376 return tokError(
"pointer to this type is invalid");
3378 if (parseOptionalAddrSpace(AddrSpace) ||
3379 parseToken(
lltok::star,
"expected '*' in address space"))
3388 if (parseFunctionType(Result))
3401 PerFunctionState &PFS,
bool IsMustTailCall,
3402 bool InVarArgsFunc) {
3408 if (!ArgList.
empty() &&
3409 parseToken(
lltok::comma,
"expected ',' in argument list"))
3414 const char *
Msg =
"unexpected ellipsis in argument list for ";
3415 if (!IsMustTailCall)
3416 return tokError(Twine(
Msg) +
"non-musttail call");
3418 return tokError(Twine(
Msg) +
"musttail call in non-varargs function");
3420 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3425 Type *ArgTy =
nullptr;
3427 if (parseType(ArgTy, ArgLoc))
3430 return error(ArgLoc,
"invalid type for function argument");
3432 AttrBuilder ArgAttrs(M->getContext());
3435 if (parseMetadataAsValue(V, PFS))
3439 if (parseOptionalParamAttrs(ArgAttrs) || parseValue(ArgTy, V, PFS))
3446 if (IsMustTailCall && InVarArgsFunc)
3447 return tokError(
"expected '...' at end of argument list for musttail call "
3448 "in varargs function");
3456bool LLParser::parseRequiredTypeAttr(AttrBuilder &
B,
lltok::Kind AttrToken,
3459 if (!EatIfPresent(AttrToken))
3462 return error(Lex.getLoc(),
"expected '('");
3466 return error(Lex.getLoc(),
"expected ')'");
3468 B.addTypeAttr(AttrKind, Ty);
3474bool LLParser::parseRangeAttr(AttrBuilder &
B) {
3482 auto ParseAPSInt = [&](
unsigned BitWidth, APInt &Val) {
3484 return tokError(
"expected integer");
3485 if (Lex.getAPSIntVal().getBitWidth() >
BitWidth)
3487 "integer is too large for the bit width of specified type");
3488 Val = Lex.getAPSIntVal().extend(
BitWidth);
3493 if (parseToken(
lltok::lparen,
"expected '('") || parseType(Ty, TyLoc))
3496 return error(TyLoc,
"the range must have integer type!");
3504 return tokError(
"the range represent the empty set but limits aren't 0!");
3515bool LLParser::parseInitializesAttr(AttrBuilder &
B) {
3518 auto ParseAPSInt = [&](APInt &Val) {
3520 return tokError(
"expected integer");
3521 Val = Lex.getAPSIntVal().extend(64);
3541 return tokError(
"the range should not represent the full or empty set!");
3553 if (!CRLOrNull.has_value())
3554 return tokError(
"Invalid (unordered or overlapping) range list");
3555 B.addInitializesAttr(*CRLOrNull);
3559bool LLParser::parseCapturesAttr(AttrBuilder &
B) {
3561 std::optional<CaptureComponents> Ret;
3565 Lex.setIgnoreColonInIdentifiers(
true);
3573 bool SeenComponent =
false;
3579 return tokError(
"duplicate 'ret' location");
3582 SeenComponent =
false;
3587 return tokError(
"cannot use 'none' with other component");
3591 return tokError(
"cannot use 'none' with other component");
3602 return tokError(
"expected one of 'none', 'address', 'address_is_null', "
3603 "'provenance' or 'read_provenance'");
3606 SeenComponent =
true;
3614 B.addCapturesAttr(CaptureInfo(
Other, Ret.value_or(
Other)));
3627bool LLParser::parseOptionalOperandBundles(
3629 LocTy BeginLoc = Lex.getLoc();
3635 if (!BundleList.
empty() &&
3636 parseToken(
lltok::comma,
"expected ',' in input list"))
3640 if (parseStringConstant(
Tag))
3643 if (parseToken(
lltok::lparen,
"expected '(' in operand bundle"))
3646 std::vector<Value *> Inputs;
3649 if (!Inputs.empty() &&
3650 parseToken(
lltok::comma,
"expected ',' in input list"))
3654 Value *Input =
nullptr;
3658 if (parseMetadataAsValue(Input, PFS))
3660 }
else if (parseValue(Ty, Input, PFS)) {
3663 Inputs.push_back(Input);
3671 if (BundleList.
empty())
3672 return error(BeginLoc,
"operand bundle set must not be empty");
3679 unsigned NextID,
unsigned ID) {
3681 return error(Loc, Kind +
" expected to be numbered '" + Prefix +
3682 Twine(NextID) +
"' or greater");
3699 unsigned CurValID = 0;
3713 LocTy TypeLoc = Lex.getLoc();
3714 Type *ArgTy =
nullptr;
3715 AttrBuilder
Attrs(M->getContext());
3716 if (parseType(ArgTy) || parseOptionalParamAttrs(Attrs))
3720 return error(TypeLoc,
"argument can not have void type");
3725 bool Unnamed =
false;
3727 Name = Lex.getStrVal();
3728 IdentStart = getTokLineColumnPos();
3730 IdentEnd = getPrevTokEndLineColumnPos();
3734 ArgID = Lex.getUIntVal();
3735 IdentStart = getTokLineColumnPos();
3736 if (checkValueID(TypeLoc,
"argument",
"%", CurValID, ArgID))
3739 IdentEnd = getPrevTokEndLineColumnPos();
3745 CurValID = ArgID + 1;
3749 return error(TypeLoc,
"invalid type for function argument");
3753 Unnamed ? std::nullopt
3754 : std::make_optional(FileLocRange(IdentStart, IdentEnd)),
3759 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3764bool LLParser::parseFunctionType(
Type *&Result) {
3768 return tokError(
"invalid function return type");
3772 SmallVector<unsigned> UnnamedArgNums;
3773 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg))
3777 for (
const ArgInfo &Arg : ArgList) {
3778 if (!Arg.Name.empty())
3779 return error(Arg.Loc,
"argument name invalid in function type");
3780 if (Arg.Attrs.hasAttributes())
3781 return error(Arg.Loc,
"argument attributes invalid in function type");
3785 for (
const ArgInfo &Arg : ArgList)
3794bool LLParser::parseAnonStructType(
Type *&Result,
bool Packed) {
3796 if (parseStructBody(Elts))
3804bool LLParser::parseStructDefinition(
SMLoc TypeLoc,
StringRef Name,
3805 std::pair<Type *, LocTy> &Entry,
3809 return error(TypeLoc,
"redefinition of type");
3815 Entry.second = SMLoc();
3820 ResultTy =
Entry.first;
3832 return error(TypeLoc,
"forward references to non-struct type");
3836 return parseArrayVectorType(ResultTy,
true);
3837 return parseType(ResultTy);
3841 Entry.second = SMLoc();
3850 if (parseStructBody(Body) ||
3851 (isPacked && parseToken(
lltok::greater,
"expected '>' in packed struct")))
3855 return tokError(
toString(std::move(
E)));
3875 LocTy EltTyLoc = Lex.getLoc();
3882 return error(EltTyLoc,
"invalid element type for struct");
3885 EltTyLoc = Lex.getLoc();
3890 return error(EltTyLoc,
"invalid element type for struct");
3895 return parseToken(
lltok::rbrace,
"expected '}' at end of struct");
3904bool LLParser::parseArrayVectorType(
Type *&Result,
bool IsVector) {
3905 bool Scalable =
false;
3909 if (parseToken(
lltok::kw_x,
"expected 'x' after vscale"))
3915 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned() ||
3916 Lex.getAPSIntVal().getBitWidth() > 64)
3917 return tokError(
"expected number in address space");
3919 LocTy SizeLoc = Lex.getLoc();
3923 if (parseToken(
lltok::kw_x,
"expected 'x' after element count"))
3926 LocTy TypeLoc = Lex.getLoc();
3927 Type *EltTy =
nullptr;
3928 if (parseType(EltTy))
3932 "expected end of sequential type"))
3937 return error(SizeLoc,
"zero element vector is illegal");
3939 return error(SizeLoc,
"size too large for vector");
3941 return error(TypeLoc,
"invalid vector element type");
3945 return error(TypeLoc,
"invalid array element type");
3962bool LLParser::parseTargetExtType(
Type *&Result) {
3967 if (parseToken(
lltok::lparen,
"expected '(' in target extension type") ||
3968 parseStringConstant(TypeName))
3975 SmallVector<unsigned> IntParams;
3976 bool SeenInt =
false;
3983 if (parseUInt32(IntVal))
3986 }
else if (SeenInt) {
3989 return tokError(
"expected uint32 param");
3992 if (parseType(TypeParam,
true))
3998 if (parseToken(
lltok::rparen,
"expected ')' in target extension type"))
4003 if (
auto E = TTy.takeError())
4004 return tokError(
toString(std::move(
E)));
4017 :
P(
p),
F(
f), FunctionNumber(functionNumber) {
4020 auto It = UnnamedArgNums.
begin();
4023 unsigned ArgNum = *It++;
4024 NumberedVals.add(ArgNum, &A);
4029LLParser::PerFunctionState::~PerFunctionState() {
4032 for (
const auto &P : ForwardRefVals) {
4035 P.second.first->replaceAllUsesWith(
4037 P.second.first->deleteValue();
4040 for (
const auto &P : ForwardRefValIDs) {
4043 P.second.first->replaceAllUsesWith(
4045 P.second.first->deleteValue();
4049bool LLParser::PerFunctionState::finishFunction() {
4050 if (!ForwardRefVals.empty())
4051 return P.error(ForwardRefVals.begin()->second.second,
4052 "use of undefined value '%" + ForwardRefVals.begin()->first +
4054 if (!ForwardRefValIDs.empty())
4055 return P.error(ForwardRefValIDs.begin()->second.second,
4056 "use of undefined value '%" +
4057 Twine(ForwardRefValIDs.begin()->first) +
"'");
4064Value *LLParser::PerFunctionState::getVal(
const std::string &Name,
Type *Ty,
4067 Value *Val =
F.getValueSymbolTable()->lookup(Name);
4072 auto I = ForwardRefVals.find(Name);
4073 if (
I != ForwardRefVals.end())
4074 Val =
I->second.first;
4079 return P.checkValidVariableType(Loc,
"%" + Name, Ty, Val);
4083 P.error(Loc,
"invalid use of a non-first-class type");
4094 if (FwdVal->
getName() != Name) {
4095 P.error(Loc,
"name is too long which can result in name collisions, "
4096 "consider making the name shorter or "
4097 "increasing -non-global-value-max-name-size");
4101 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
4105Value *LLParser::PerFunctionState::getVal(
unsigned ID,
Type *Ty,
LocTy Loc) {
4107 Value *Val = NumberedVals.get(ID);
4112 auto I = ForwardRefValIDs.find(ID);
4113 if (
I != ForwardRefValIDs.end())
4114 Val =
I->second.first;
4119 return P.checkValidVariableType(Loc,
"%" + Twine(ID), Ty, Val);
4122 P.error(Loc,
"invalid use of a non-first-class type");
4134 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
4140bool LLParser::PerFunctionState::setInstName(
int NameID,
4141 const std::string &NameStr,
4142 LocTy NameLoc, Instruction *Inst) {
4145 if (NameID != -1 || !NameStr.empty())
4146 return P.error(NameLoc,
"instructions returning void cannot have a name");
4152 if (NameStr.empty()) {
4155 NameID = NumberedVals.getNext();
4157 if (
P.checkValueID(NameLoc,
"instruction",
"%", NumberedVals.getNext(),
4161 auto FI = ForwardRefValIDs.find(NameID);
4162 if (FI != ForwardRefValIDs.end()) {
4165 return P.error(NameLoc,
"instruction forward referenced with type '" +
4169 Sentinel->replaceAllUsesWith(Inst);
4171 ForwardRefValIDs.erase(FI);
4174 NumberedVals.add(NameID, Inst);
4179 auto FI = ForwardRefVals.find(NameStr);
4180 if (FI != ForwardRefVals.end()) {
4183 return P.error(NameLoc,
"instruction forward referenced with type '" +
4187 Sentinel->replaceAllUsesWith(Inst);
4189 ForwardRefVals.erase(FI);
4195 if (Inst->
getName() != NameStr)
4196 return P.error(NameLoc,
"multiple definition of local value named '" +
4203BasicBlock *LLParser::PerFunctionState::getBB(
const std::string &Name,
4209BasicBlock *LLParser::PerFunctionState::getBB(
unsigned ID,
LocTy Loc) {
4217BasicBlock *LLParser::PerFunctionState::defineBB(
const std::string &Name,
4218 int NameID,
LocTy Loc) {
4222 if (
P.checkValueID(Loc,
"label",
"", NumberedVals.getNext(), NameID))
4225 NameID = NumberedVals.getNext();
4227 BB = getBB(NameID, Loc);
4229 P.error(Loc,
"unable to create block numbered '" + Twine(NameID) +
"'");
4233 BB = getBB(Name, Loc);
4235 P.error(Loc,
"unable to create block named '" + Name +
"'");
4246 ForwardRefValIDs.erase(NameID);
4247 NumberedVals.add(NameID, BB);
4250 ForwardRefVals.erase(Name);
4267bool LLParser::parseValID(ValID &ID, PerFunctionState *PFS,
Type *ExpectedTy) {
4268 ID.Loc = Lex.getLoc();
4269 switch (Lex.getKind()) {
4271 return tokError(
"expected value token");
4273 ID.UIntVal = Lex.getUIntVal();
4277 ID.StrVal = Lex.getStrVal();
4281 ID.UIntVal = Lex.getUIntVal();
4285 ID.StrVal = Lex.getStrVal();
4289 ID.APSIntVal = Lex.getAPSIntVal();
4293 ID.APFloatVal = Lex.getAPFloatVal();
4299 return error(
ID.Loc,
"unexpected floating-point literal");
4301 return error(
ID.Loc,
"floating-point constant invalid for type");
4306 "Invalid float strings should be caught by the lexer");
4311 return error(
ID.Loc,
"floating-point constant overflowed type");
4313 return error(
ID.Loc,
"floating-point constant underflowed type");
4319 return error(
ID.Loc,
"unexpected floating-point literal");
4321 const APInt &
Bits = Lex.getAPSIntVal();
4323 return error(
ID.Loc,
"float hex literal has incorrect number of bits");
4324 ID.APFloatVal =
APFloat(Semantics, Bits);
4346 if (parseGlobalValueVector(Elts) ||
4347 parseToken(
lltok::rbrace,
"expected end of struct constant"))
4350 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4351 ID.UIntVal = Elts.
size();
4352 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4353 Elts.
size() *
sizeof(Elts[0]));
4364 LocTy FirstEltLoc = Lex.getLoc();
4365 if (parseGlobalValueVector(Elts) ||
4367 parseToken(
lltok::rbrace,
"expected end of packed struct")) ||
4371 if (isPackedStruct) {
4372 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4373 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4374 Elts.
size() *
sizeof(Elts[0]));
4375 ID.UIntVal = Elts.
size();
4381 return error(
ID.Loc,
"constant vector must not be empty");
4383 if (!Elts[0]->
getType()->isIntegerTy() && !Elts[0]->
getType()->isByteTy() &&
4384 !Elts[0]->
getType()->isFloatingPointTy() &&
4388 "vector elements must have integer, byte, pointer or floating point "
4392 for (
unsigned i = 1, e = Elts.
size(); i != e; ++i)
4394 return error(FirstEltLoc,
"vector element #" + Twine(i) +
4395 " is not of type '" +
4405 LocTy FirstEltLoc = Lex.getLoc();
4406 if (parseGlobalValueVector(Elts) ||
4418 if (!Elts[0]->
getType()->isFirstClassType())
4419 return error(FirstEltLoc,
"invalid array element type: " +
4425 for (
unsigned i = 0, e = Elts.
size(); i != e; ++i) {
4427 return error(FirstEltLoc,
"array element #" + Twine(i) +
4428 " is not of type '" +
4440 Context, Lex.getStrVal(),
false, ATy->getElementType()->isByteTy());
4449 bool HasSideEffect, AlignStack, AsmDialect, CanThrow;
4452 parseOptionalToken(lltok::kw_alignstack, AlignStack) ||
4455 parseStringConstant(
ID.StrVal) ||
4456 parseToken(
lltok::comma,
"expected comma in inline asm expression") ||
4459 ID.StrVal2 = Lex.getStrVal();
4460 ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack) << 1) |
4461 (
unsigned(AsmDialect) << 2) | (unsigned(CanThrow) << 3);
4472 if (parseToken(
lltok::lparen,
"expected '(' in block address expression") ||
4473 parseValID(Fn, PFS) ||
4475 "expected comma in block address expression") ||
4476 parseValID(Label, PFS) ||
4477 parseToken(
lltok::rparen,
"expected ')' in block address expression"))
4481 return error(Fn.
Loc,
"expected function name in blockaddress");
4483 return error(
Label.Loc,
"expected basic block name in blockaddress");
4486 GlobalValue *GV =
nullptr;
4488 GV = NumberedVals.get(Fn.
UIntVal);
4489 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4490 GV = M->getNamedValue(Fn.
StrVal);
4496 return error(Fn.
Loc,
"expected function name in blockaddress");
4498 if (
F->isDeclaration())
4499 return error(Fn.
Loc,
"cannot take blockaddress inside a declaration");
4504 GlobalValue *&FwdRef =
4505 ForwardRefBlockAddresses[std::move(Fn)][std::move(Label)];
4513 "type of blockaddress must be a pointer and not '" +
4518 FwdDeclAS = PFS->getFunction().getAddressSpace();
4522 FwdRef =
new GlobalVariable(
4527 ID.ConstantVal = FwdRef;
4535 if (BlockAddressPFS &&
F == &BlockAddressPFS->getFunction()) {
4537 BB = BlockAddressPFS->getBB(
Label.UIntVal,
Label.Loc);
4539 BB = BlockAddressPFS->getBB(
Label.StrVal,
Label.Loc);
4541 return error(
Label.Loc,
"referenced value is not a basic block");
4544 return error(
Label.Loc,
"cannot take address of numeric label after "
4545 "the function is defined");
4547 F->getValueSymbolTable()->lookup(
Label.StrVal));
4549 return error(
Label.Loc,
"referenced value is not a basic block");
4563 if (parseValID(Fn, PFS))
4568 "expected global value name in dso_local_equivalent");
4571 GlobalValue *GV =
nullptr;
4573 GV = NumberedVals.get(Fn.
UIntVal);
4574 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4575 GV = M->getNamedValue(Fn.
StrVal);
4581 ? ForwardRefDSOLocalEquivalentIDs
4582 : ForwardRefDSOLocalEquivalentNames;
4583 GlobalValue *&FwdRef = FwdRefMap[Fn];
4590 ID.ConstantVal = FwdRef;
4596 return error(Fn.
Loc,
"expected a function, alias to function, or ifunc "
4597 "in dso_local_equivalent");
4608 if (parseValID(ID, PFS))
4612 return error(
ID.Loc,
"expected global value name in no_cfi");
4624 Constant *Disc =
nullptr, *AddrDisc =
nullptr,
4625 *DeactivationSymbol =
nullptr;
4628 "expected '(' in constant ptrauth expression") ||
4629 parseGlobalTypeAndValue(Ptr) ||
4631 "expected comma in constant ptrauth expression") ||
4632 parseGlobalTypeAndValue(
Key))
4635 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(Disc))
4637 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(AddrDisc))
4640 parseGlobalTypeAndValue(DeactivationSymbol))
4643 "expected ')' in constant ptrauth expression"))
4647 return error(
ID.Loc,
"constant ptrauth base pointer must be a pointer");
4650 if (!KeyC || KeyC->getBitWidth() != 32)
4651 return error(
ID.Loc,
"constant ptrauth key must be i32 constant");
4653 ConstantInt *DiscC =
nullptr;
4659 "constant ptrauth integer discriminator must be i64 constant");
4665 if (!AddrDisc->getType()->isPointerTy())
4667 ID.Loc,
"constant ptrauth address discriminator must be a pointer");
4672 if (!DeactivationSymbol)
4673 DeactivationSymbol =
4675 if (!DeactivationSymbol->getType()->isPointerTy())
4677 "constant ptrauth deactivation symbol must be a pointer");
4691 unsigned Opc = Lex.getUIntVal();
4692 Type *DestTy =
nullptr;
4695 if (parseToken(
lltok::lparen,
"expected '(' after constantexpr cast") ||
4696 parseGlobalTypeAndValue(SrcVal) ||
4697 parseToken(
lltok::kw_to,
"expected 'to' in constantexpr cast") ||
4698 parseType(DestTy) ||
4699 parseToken(
lltok::rparen,
"expected ')' at end of constantexpr cast"))
4702 return error(
ID.Loc,
"invalid cast opcode for cast from '" +
4711 return error(
ID.Loc,
"extractvalue constexprs are no longer supported");
4713 return error(
ID.Loc,
"insertvalue constexprs are no longer supported");
4715 return error(
ID.Loc,
"udiv constexprs are no longer supported");
4717 return error(
ID.Loc,
"sdiv constexprs are no longer supported");
4719 return error(
ID.Loc,
"urem constexprs are no longer supported");
4721 return error(
ID.Loc,
"srem constexprs are no longer supported");
4723 return error(
ID.Loc,
"fadd constexprs are no longer supported");
4725 return error(
ID.Loc,
"fsub constexprs are no longer supported");
4727 return error(
ID.Loc,
"fmul constexprs are no longer supported");
4729 return error(
ID.Loc,
"fdiv constexprs are no longer supported");
4731 return error(
ID.Loc,
"frem constexprs are no longer supported");
4733 return error(
ID.Loc,
"and constexprs are no longer supported");
4735 return error(
ID.Loc,
"or constexprs are no longer supported");
4737 return error(
ID.Loc,
"lshr constexprs are no longer supported");
4739 return error(
ID.Loc,
"ashr constexprs are no longer supported");
4741 return error(
ID.Loc,
"shl constexprs are no longer supported");
4743 return error(
ID.Loc,
"mul constexprs are no longer supported");
4745 return error(
ID.Loc,
"fneg constexprs are no longer supported");
4747 return error(
ID.Loc,
"select constexprs are no longer supported");
4749 return error(
ID.Loc,
"zext constexprs are no longer supported");
4751 return error(
ID.Loc,
"sext constexprs are no longer supported");
4753 return error(
ID.Loc,
"fptrunc constexprs are no longer supported");
4755 return error(
ID.Loc,
"fpext constexprs are no longer supported");
4757 return error(
ID.Loc,
"uitofp constexprs are no longer supported");
4759 return error(
ID.Loc,
"sitofp constexprs are no longer supported");
4761 return error(
ID.Loc,
"fptoui constexprs are no longer supported");
4763 return error(
ID.Loc,
"fptosi constexprs are no longer supported");
4765 return error(
ID.Loc,
"icmp constexprs are no longer supported");
4767 return error(
ID.Loc,
"fcmp constexprs are no longer supported");
4775 unsigned Opc = Lex.getUIntVal();
4778 if (
Opc == Instruction::Add ||
Opc == Instruction::Sub ||
4779 Opc == Instruction::Mul) {
4788 if (parseToken(
lltok::lparen,
"expected '(' in binary constantexpr") ||
4789 parseGlobalTypeAndValue(Val0) ||
4790 parseToken(
lltok::comma,
"expected comma in binary constantexpr") ||
4791 parseGlobalTypeAndValue(Val1) ||
4792 parseToken(
lltok::rparen,
"expected ')' in binary constantexpr"))
4795 return error(
ID.Loc,
"operands of constexpr must have same type");
4799 "constexpr requires integer or integer vector operands");
4810 if (parseToken(
lltok::lparen,
"expected '(' after vector splat"))
4813 if (parseGlobalTypeAndValue(
C))
4815 if (parseToken(
lltok::rparen,
"expected ')' at end of vector splat"))
4827 unsigned Opc = Lex.getUIntVal();
4830 bool HasInRange =
false;
4836 if (
Opc == Instruction::GetElementPtr) {
4852 return tokError(
"expected integer");
4853 InRangeStart = Lex.getAPSIntVal();
4858 return tokError(
"expected integer");
4859 InRangeEnd = Lex.getAPSIntVal();
4867 if (parseToken(
lltok::lparen,
"expected '(' in constantexpr"))
4870 if (
Opc == Instruction::GetElementPtr) {
4871 if (parseType(Ty) ||
4872 parseToken(
lltok::comma,
"expected comma after getelementptr's type"))
4876 if (parseGlobalValueVector(Elts) ||
4880 if (
Opc == Instruction::GetElementPtr) {
4881 if (Elts.
size() == 0 ||
4882 !Elts[0]->getType()->isPtrOrPtrVectorTy())
4883 return error(
ID.Loc,
"base of getelementptr must be a pointer");
4886 std::optional<ConstantRange>
InRange;
4888 unsigned IndexWidth =
4889 M->getDataLayout().getIndexTypeSizeInBits(
BaseType);
4890 InRangeStart = InRangeStart.
extOrTrunc(IndexWidth);
4891 InRangeEnd = InRangeEnd.
extOrTrunc(IndexWidth);
4892 if (InRangeStart.
sge(InRangeEnd))
4893 return error(
ID.Loc,
"expected end to be larger than start");
4903 for (Constant *Val : Indices) {
4906 return error(
ID.Loc,
"getelementptr index must be an integer");
4909 if (GEPWidth && (ValNumEl != GEPWidth))
4912 "getelementptr vector index has a wrong number of elements");
4915 GEPWidth = ValNumEl;
4919 SmallPtrSet<Type*, 4> Visited;
4920 if (!Indices.empty() && !Ty->
isSized(&Visited))
4921 return error(
ID.Loc,
"base element of getelementptr must be sized");
4924 return error(
ID.Loc,
"invalid base element for constant getelementptr");
4927 return error(
ID.Loc,
"invalid getelementptr indices");
4931 }
else if (
Opc == Instruction::ShuffleVector) {
4932 if (Elts.
size() != 3)
4933 return error(
ID.Loc,
"expected three operands to shufflevector");
4935 return error(
ID.Loc,
"invalid operands to shufflevector");
4936 SmallVector<int, 16>
Mask;
4939 }
else if (
Opc == Instruction::ExtractElement) {
4940 if (Elts.
size() != 2)
4941 return error(
ID.Loc,
"expected two operands to extractelement");
4943 return error(
ID.Loc,
"invalid extractelement operands");
4946 assert(
Opc == Instruction::InsertElement &&
"Unknown opcode");
4947 if (Elts.
size() != 3)
4948 return error(
ID.Loc,
"expected three operands to insertelement");
4950 return error(
ID.Loc,
"invalid insertelement operands");
4965bool LLParser::parseGlobalValue(
Type *Ty, Constant *&
C) {
4969 bool Parsed = parseValID(ID,
nullptr, Ty) ||
4970 convertValIDToValue(Ty, ID, V,
nullptr);
4972 return error(
ID.Loc,
"global values must be constants");
4976bool LLParser::parseGlobalTypeAndValue(Constant *&V) {
4978 return parseType(Ty) || parseGlobalValue(Ty, V);
4981bool LLParser::parseOptionalComdat(StringRef GlobalName, Comdat *&
C) {
4984 LocTy KwLoc = Lex.getLoc();
4990 return tokError(
"expected comdat variable");
4991 C = getComdat(Lex.getStrVal(), Lex.getLoc());
4993 if (parseToken(
lltok::rparen,
"expected ')' after comdat var"))
4996 if (GlobalName.
empty())
4997 return tokError(
"comdat cannot be unnamed");
4998 C = getComdat(std::string(GlobalName), KwLoc);
5007bool LLParser::parseGlobalValueVector(SmallVectorImpl<Constant *> &Elts) {
5021 if (parseGlobalTypeAndValue(
C))
5029bool LLParser::parseMDTuple(MDNode *&MD,
bool IsDistinct) {
5031 if (parseMDNodeVector(Elts))
5042bool LLParser::parseMDNode(MDNode *&
N) {
5044 return parseSpecializedMDNode(
N);
5046 return parseToken(
lltok::exclaim,
"expected '!' here") || parseMDNodeTail(
N);
5049bool LLParser::parseMDNodeTail(MDNode *&
N) {
5052 return parseMDTuple(
N);
5055 return parseMDNodeID(
N);
5061template <
class FieldTy>
struct MDFieldImpl {
5062 typedef MDFieldImpl ImplTy;
5066 void assign(FieldTy Val) {
5068 this->Val = std::move(Val);
5071 explicit MDFieldImpl(FieldTy
Default)
5079template <
class FieldTypeA,
class FieldTypeB>
struct MDEitherFieldImpl {
5080 typedef MDEitherFieldImpl<FieldTypeA, FieldTypeB> ImplTy;
5093 this->
A = std::move(
A);
5099 this->
B = std::move(
B);
5103 explicit MDEitherFieldImpl(FieldTypeA DefaultA, FieldTypeB DefaultB)
5105 WhatIs(IsInvalid) {}
5108struct MDUnsignedField :
public MDFieldImpl<uint64_t> {
5115struct LineField :
public MDUnsignedField {
5116 LineField() : MDUnsignedField(0, UINT32_MAX) {}
5119struct ColumnField :
public MDUnsignedField {
5120 ColumnField() : MDUnsignedField(0, UINT16_MAX) {}
5123struct DwarfTagField :
public MDUnsignedField {
5129struct DwarfMacinfoTypeField :
public MDUnsignedField {
5135struct DwarfAttEncodingField :
public MDUnsignedField {
5136 DwarfAttEncodingField() : MDUnsignedField(0, dwarf::
DW_ATE_hi_user) {}
5139struct DwarfVirtualityField :
public MDUnsignedField {
5143struct DwarfLangField :
public MDUnsignedField {
5147struct DwarfSourceLangNameField :
public MDUnsignedField {
5148 DwarfSourceLangNameField() : MDUnsignedField(0, UINT32_MAX) {}
5151struct DwarfLangDialectField :
public MDUnsignedField {
5152 DwarfLangDialectField()
5156struct DwarfCCField :
public MDUnsignedField {
5157 DwarfCCField() : MDUnsignedField(0, dwarf::
DW_CC_hi_user) {}
5160struct DwarfEnumKindField :
public MDUnsignedField {
5161 DwarfEnumKindField()
5166struct EmissionKindField :
public MDUnsignedField {
5167 EmissionKindField() : MDUnsignedField(0, DICompileUnit::LastEmissionKind) {}
5170struct FixedPointKindField :
public MDUnsignedField {
5171 FixedPointKindField()
5172 : MDUnsignedField(0, DIFixedPointType::LastFixedPointKind) {}
5175struct NameTableKindField :
public MDUnsignedField {
5176 NameTableKindField()
5179 DICompileUnit::DebugNameTableKind::LastDebugNameTableKind) {}
5182struct DIFlagField :
public MDFieldImpl<DINode::DIFlags> {
5183 DIFlagField() : MDFieldImpl(DINode::FlagZero) {}
5186struct DISPFlagField :
public MDFieldImpl<DISubprogram::DISPFlags> {
5187 DISPFlagField() : MDFieldImpl(DISubprogram::SPFlagZero) {}
5190struct MDAPSIntField :
public MDFieldImpl<APSInt> {
5191 MDAPSIntField() : ImplTy(
APSInt()) {}
5194struct MDSignedField :
public MDFieldImpl<int64_t> {
5198 MDSignedField(int64_t
Default = 0)
5200 MDSignedField(int64_t
Default, int64_t Min, int64_t Max)
5204struct MDBoolField :
public MDFieldImpl<bool> {
5208struct MDField :
public MDFieldImpl<Metadata *> {
5211 MDField(
bool AllowNull =
true) : ImplTy(nullptr), AllowNull(AllowNull) {}
5214struct MDStringField :
public MDFieldImpl<MDString *> {
5215 enum class EmptyIs {
5220 MDStringField(
enum EmptyIs EmptyIs = EmptyIs::Null)
5221 : ImplTy(nullptr), EmptyIs(EmptyIs) {}
5224struct MDFieldList :
public MDFieldImpl<SmallVector<Metadata *, 4>> {
5228struct ChecksumKindField :
public MDFieldImpl<DIFile::ChecksumKind> {
5232struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
5233 MDSignedOrMDField(int64_t
Default = 0,
bool AllowNull =
true)
5234 : ImplTy(MDSignedField(
Default), MDField(AllowNull)) {}
5236 MDSignedOrMDField(int64_t
Default, int64_t Min, int64_t Max,
5237 bool AllowNull =
true)
5238 : ImplTy(MDSignedField(
Default, Min,
Max), MDField(AllowNull)) {}
5240 bool isMDSignedField()
const {
return WhatIs == IsTypeA; }
5241 bool isMDField()
const {
return WhatIs == IsTypeB; }
5242 int64_t getMDSignedValue()
const {
5243 assert(isMDSignedField() &&
"Wrong field type");
5246 Metadata *getMDFieldValue()
const {
5247 assert(isMDField() &&
"Wrong field type");
5252struct MDUnsignedOrMDField : MDEitherFieldImpl<MDUnsignedField, MDField> {
5254 : ImplTy(MDUnsignedField(
Default), MDField(AllowNull)) {}
5257 : ImplTy(MDUnsignedField(
Default,
Max), MDField(AllowNull)) {}
5259 bool isMDUnsignedField()
const {
return WhatIs == IsTypeA; }
5260 bool isMDField()
const {
return WhatIs == IsTypeB; }
5261 uint64_t getMDUnsignedValue()
const {
5262 assert(isMDUnsignedField() &&
"Wrong field type");
5265 Metadata *getMDFieldValue()
const {
5266 assert(isMDField() &&
"Wrong field type");
5271 if (isMDUnsignedField())
5273 ConstantInt::get(Type::getInt64Ty(
Context), getMDUnsignedValue()));
5275 return getMDFieldValue();
5287 return tokError(
"expected integer");
5289 Result.assign(Lex.getAPSIntVal());
5296 MDUnsignedField &Result) {
5297 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
5298 return tokError(
"expected unsigned integer");
5300 auto &U = Lex.getAPSIntVal();
5301 if (U.ugt(Result.Max))
5302 return tokError(
"value for '" + Name +
"' too large, limit is " +
5304 Result.assign(U.getZExtValue());
5305 assert(Result.Val <= Result.Max &&
"Expected value in range");
5312 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5316 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5322 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5325 return tokError(
"expected DWARF tag");
5329 return tokError(
"invalid DWARF tag" +
Twine(
" '") + Lex.getStrVal() +
"'");
5330 assert(
Tag <= Result.Max &&
"Expected valid DWARF tag");
5339 DwarfMacinfoTypeField &Result) {
5341 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5344 return tokError(
"expected DWARF macinfo type");
5348 return tokError(
"invalid DWARF macinfo type" +
Twine(
" '") +
5349 Lex.getStrVal() +
"'");
5350 assert(Macinfo <= Result.Max &&
"Expected valid DWARF macinfo type");
5352 Result.assign(Macinfo);
5359 DwarfVirtualityField &Result) {
5361 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5364 return tokError(
"expected DWARF virtuality code");
5368 return tokError(
"invalid DWARF virtuality code" +
Twine(
" '") +
5369 Lex.getStrVal() +
"'");
5370 assert(Virtuality <= Result.Max &&
"Expected valid DWARF virtuality code");
5371 Result.assign(Virtuality);
5378 DwarfEnumKindField &Result) {
5380 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5383 return tokError(
"expected DWARF enum kind code");
5387 return tokError(
"invalid DWARF enum kind code" +
Twine(
" '") +
5388 Lex.getStrVal() +
"'");
5389 assert(EnumKind <= Result.Max &&
"Expected valid DWARF enum kind code");
5390 Result.assign(EnumKind);
5398 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5401 return tokError(
"expected DWARF language");
5405 return tokError(
"invalid DWARF language" +
Twine(
" '") + Lex.getStrVal() +
5407 assert(Lang <= Result.Max &&
"Expected valid DWARF language");
5408 Result.assign(Lang);
5415 DwarfSourceLangNameField &Result) {
5417 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5420 return tokError(
"expected DWARF source language name");
5424 return tokError(
"invalid DWARF source language name" +
Twine(
" '") +
5425 Lex.getStrVal() +
"'");
5426 assert(Lang <= Result.Max &&
"Expected valid DWARF source language name");
5427 Result.assign(Lang);
5434 DwarfLangDialectField &Result) {
5439 if (Lex.getAPSIntVal() == 0)
5440 return tokError(
"value for 'dialect' must be a known DWARF language "
5441 "dialect (DW_LLVM_LANG_DIALECT_simt or "
5442 "DW_LLVM_LANG_DIALECT_tile)");
5443 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5447 return tokError(
"expected DWARF language dialect");
5449 StringRef DialectString = Lex.getStrVal();
5454 if (Dialect > Result.Max)
5455 return tokError(
"invalid DWARF language dialect" +
Twine(
" '") +
5456 DialectString +
"'");
5457 Result.assign(Dialect);
5465 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5468 return tokError(
"expected DWARF calling convention");
5472 return tokError(
"invalid DWARF calling convention" +
Twine(
" '") +
5473 Lex.getStrVal() +
"'");
5474 assert(CC <= Result.Max &&
"Expected valid DWARF calling convention");
5482 EmissionKindField &Result) {
5484 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5487 return tokError(
"expected emission kind");
5491 return tokError(
"invalid emission kind" +
Twine(
" '") + Lex.getStrVal() +
5493 assert(*Kind <= Result.Max &&
"Expected valid emission kind");
5494 Result.assign(*Kind);
5501 FixedPointKindField &Result) {
5503 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5506 return tokError(
"expected fixed-point kind");
5510 return tokError(
"invalid fixed-point kind" +
Twine(
" '") + Lex.getStrVal() +
5512 assert(*Kind <= Result.Max &&
"Expected valid fixed-point kind");
5513 Result.assign(*Kind);
5520 NameTableKindField &Result) {
5522 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5525 return tokError(
"expected nameTable kind");
5529 return tokError(
"invalid nameTable kind" +
Twine(
" '") + Lex.getStrVal() +
5531 assert(((
unsigned)*Kind) <= Result.Max &&
"Expected valid nameTable kind");
5532 Result.assign((
unsigned)*Kind);
5539 DwarfAttEncodingField &Result) {
5541 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5544 return tokError(
"expected DWARF type attribute encoding");
5548 return tokError(
"invalid DWARF type attribute encoding" +
Twine(
" '") +
5549 Lex.getStrVal() +
"'");
5550 assert(Encoding <= Result.Max &&
"Expected valid DWARF language");
5551 Result.assign(Encoding);
5565 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5567 bool Res = parseUInt32(TempVal);
5573 return tokError(
"expected debug info flag");
5577 return tokError(
Twine(
"invalid debug info flag '") + Lex.getStrVal() +
5592 Result.assign(Combined);
5605 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5607 bool Res = parseUInt32(TempVal);
5613 return tokError(
"expected debug info flag");
5617 return tokError(
Twine(
"invalid subprogram debug info flag '") +
5618 Lex.getStrVal() +
"'");
5632 Result.assign(Combined);
5639 return tokError(
"expected signed integer");
5641 auto &S = Lex.getAPSIntVal();
5643 return tokError(
"value for '" + Name +
"' too small, limit is " +
5646 return tokError(
"value for '" + Name +
"' too large, limit is " +
5648 Result.assign(S.getExtValue());
5649 assert(Result.Val >= Result.Min &&
"Expected value in range");
5650 assert(Result.Val <= Result.Max &&
"Expected value in range");
5657 switch (Lex.getKind()) {
5659 return tokError(
"expected 'true' or 'false'");
5661 Result.assign(
true);
5664 Result.assign(
false);
5674 if (!Result.AllowNull)
5675 return tokError(
"'" + Name +
"' cannot be null");
5677 Result.assign(
nullptr);
5682 if (parseMetadata(MD,
nullptr))
5691 MDSignedOrMDField &Result) {
5694 MDSignedField Res = Result.A;
5695 if (!parseMDField(
Loc, Name, Res)) {
5703 MDField Res = Result.B;
5704 if (!parseMDField(
Loc, Name, Res)) {
5714 MDUnsignedOrMDField &Result) {
5717 MDUnsignedField Res = Result.A;
5718 if (!parseMDField(
Loc, Name, Res)) {
5726 MDField Res = Result.B;
5727 if (!parseMDField(
Loc, Name, Res)) {
5737 LocTy ValueLoc = Lex.getLoc();
5739 if (parseStringConstant(S))
5743 switch (Result.EmptyIs) {
5744 case MDStringField::EmptyIs::Null:
5745 Result.assign(
nullptr);
5747 case MDStringField::EmptyIs::Empty:
5749 case MDStringField::EmptyIs::Error:
5750 return error(ValueLoc,
"'" + Name +
"' cannot be empty");
5761 if (parseMDNodeVector(MDs))
5764 Result.assign(std::move(MDs));
5770 ChecksumKindField &Result) {
5771 std::optional<DIFile::ChecksumKind> CSKind =
5775 return tokError(
"invalid checksum kind" +
Twine(
" '") + Lex.getStrVal() +
5778 Result.assign(*CSKind);
5785template <
class ParserTy>
5786bool LLParser::parseMDFieldsImplBody(ParserTy ParseField) {
5789 return tokError(
"expected field label here");
5798template <
class ParserTy>
5799bool LLParser::parseMDFieldsImpl(ParserTy ParseField, LocTy &ClosingLoc) {
5806 if (parseMDFieldsImplBody(ParseField))
5809 ClosingLoc = Lex.getLoc();
5813template <
class FieldTy>
5814bool LLParser::parseMDField(
StringRef Name, FieldTy &Result) {
5816 return tokError(
"field '" + Name +
"' cannot be specified more than once");
5818 LocTy Loc = Lex.getLoc();
5820 return parseMDField(Loc, Name, Result);
5823bool LLParser::parseSpecializedMDNode(
MDNode *&
N,
bool IsDistinct) {
5826#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
5827 if (Lex.getStrVal() == #CLASS) \
5828 return parse##CLASS(N, IsDistinct);
5829#include "llvm/IR/Metadata.def"
5831 return tokError(
"expected metadata type");
5834#define DECLARE_FIELD(NAME, TYPE, INIT) TYPE NAME INIT
5835#define NOP_FIELD(NAME, TYPE, INIT)
5836#define REQUIRE_FIELD(NAME, TYPE, INIT) \
5838 return error(ClosingLoc, "missing required field '" #NAME "'");
5839#define PARSE_MD_FIELD(NAME, TYPE, DEFAULT) \
5840 if (Lex.getStrVal() == #NAME) \
5841 return parseMDField(#NAME, NAME);
5842#define PARSE_MD_FIELDS() \
5843 VISIT_MD_FIELDS(DECLARE_FIELD, DECLARE_FIELD) \
5846 if (parseMDFieldsImpl( \
5848 VISIT_MD_FIELDS(PARSE_MD_FIELD, PARSE_MD_FIELD) \
5849 return tokError(Twine("invalid field '") + Lex.getStrVal() + \
5854 VISIT_MD_FIELDS(NOP_FIELD, REQUIRE_FIELD) \
5856#define GET_OR_DISTINCT(CLASS, ARGS) \
5857 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
5862bool LLParser::parseDILocation(
MDNode *&Result,
bool IsDistinct) {
5863#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5864 OPTIONAL(line, LineField, ); \
5865 OPTIONAL(column, ColumnField, ); \
5866 REQUIRED(scope, MDField, ( false)); \
5867 OPTIONAL(inlinedAt, MDField, ); \
5868 OPTIONAL(isImplicitCode, MDBoolField, (false)); \
5869 OPTIONAL(atomGroup, MDUnsignedField, (0, UINT64_MAX)); \
5870 OPTIONAL(atomRank, MDUnsignedField, (0, UINT8_MAX));
5872#undef VISIT_MD_FIELDS
5875 DILocation, (Context, line.Val, column.Val, scope.Val, inlinedAt.Val,
5876 isImplicitCode.Val, atomGroup.Val, atomRank.Val));
5882bool LLParser::parseDIAssignID(
MDNode *&Result,
bool IsDistinct) {
5884 return tokError(
"missing 'distinct', required for !DIAssignID()");
5900bool LLParser::parseGenericDINode(
MDNode *&Result,
bool IsDistinct) {
5901#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5902 REQUIRED(tag, DwarfTagField, ); \
5903 OPTIONAL(header, MDStringField, ); \
5904 OPTIONAL(operands, MDFieldList, );
5906#undef VISIT_MD_FIELDS
5909 (Context, tag.Val, header.Val, operands.Val));
5918bool LLParser::parseDISubrangeType(
MDNode *&Result,
bool IsDistinct) {
5919#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5920 OPTIONAL(name, MDStringField, ); \
5921 OPTIONAL(file, MDField, ); \
5922 OPTIONAL(line, LineField, ); \
5923 OPTIONAL(scope, MDField, ); \
5924 OPTIONAL(baseType, MDField, ); \
5925 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5926 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5927 OPTIONAL(flags, DIFlagField, ); \
5928 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5929 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5930 OPTIONAL(stride, MDSignedOrMDField, ); \
5931 OPTIONAL(bias, MDSignedOrMDField, );
5933#undef VISIT_MD_FIELDS
5935 auto convToMetadata = [&](MDSignedOrMDField Bound) ->
Metadata * {
5936 if (Bound.isMDSignedField())
5939 if (Bound.isMDField())
5940 return Bound.getMDFieldValue();
5946 Metadata *Stride = convToMetadata(stride);
5947 Metadata *Bias = convToMetadata(bias);
5950 DISubrangeType, (Context,
name.Val,
file.Val, line.Val, scope.Val,
5951 size.getValueAsMetadata(Context),
align.Val, flags.Val,
5952 baseType.Val, LowerBound, UpperBound, Stride, Bias));
5961bool LLParser::parseDISubrange(
MDNode *&Result,
bool IsDistinct) {
5962#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5963 OPTIONAL(count, MDSignedOrMDField, (-1, -1, INT64_MAX, false)); \
5964 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5965 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5966 OPTIONAL(stride, MDSignedOrMDField, );
5968#undef VISIT_MD_FIELDS
5975 auto convToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5976 if (Bound.isMDSignedField())
5979 if (Bound.isMDField())
5980 return Bound.getMDFieldValue();
5987 Stride = convToMetadata(stride);
5990 (Context,
Count, LowerBound, UpperBound, Stride));
5998bool LLParser::parseDIGenericSubrange(
MDNode *&Result,
bool IsDistinct) {
5999#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6000 OPTIONAL(count, MDSignedOrMDField, ); \
6001 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
6002 OPTIONAL(upperBound, MDSignedOrMDField, ); \
6003 OPTIONAL(stride, MDSignedOrMDField, );
6005#undef VISIT_MD_FIELDS
6007 auto ConvToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
6008 if (Bound.isMDSignedField())
6010 Context, {dwarf::DW_OP_consts,
6011 static_cast<uint64_t>(Bound.getMDSignedValue())});
6012 if (Bound.isMDField())
6013 return Bound.getMDFieldValue();
6020 Metadata *Stride = ConvToMetadata(stride);
6023 (Context,
Count, LowerBound, UpperBound, Stride));
6030bool LLParser::parseDIEnumerator(
MDNode *&Result,
bool IsDistinct) {
6031#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6032 REQUIRED(name, MDStringField, ); \
6033 REQUIRED(value, MDAPSIntField, ); \
6034 OPTIONAL(isUnsigned, MDBoolField, (false));
6036#undef VISIT_MD_FIELDS
6038 if (isUnsigned.Val && value.Val.isNegative())
6039 return tokError(
"unsigned enumerator with negative value");
6044 if (!isUnsigned.Val && value.Val.isUnsigned() && value.Val.isSignBitSet())
6056bool LLParser::parseDIBasicType(
MDNode *&Result,
bool IsDistinct) {
6057#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6058 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
6059 OPTIONAL(name, MDStringField, ); \
6060 OPTIONAL(file, MDField, ); \
6061 OPTIONAL(line, LineField, ); \
6062 OPTIONAL(scope, MDField, ); \
6063 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6064 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6065 OPTIONAL(dataSize, MDUnsignedField, (0, UINT32_MAX)); \
6066 OPTIONAL(encoding, DwarfAttEncodingField, ); \
6067 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
6068 OPTIONAL(flags, DIFlagField, );
6070#undef VISIT_MD_FIELDS
6073 DIBasicType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
6074 size.getValueAsMetadata(Context),
align.Val, encoding.Val,
6075 num_extra_inhabitants.Val, dataSize.Val, flags.Val));
6084bool LLParser::parseDIFixedPointType(
MDNode *&Result,
bool IsDistinct) {
6085#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6086 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
6087 OPTIONAL(name, MDStringField, ); \
6088 OPTIONAL(file, MDField, ); \
6089 OPTIONAL(line, LineField, ); \
6090 OPTIONAL(scope, MDField, ); \
6091 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6092 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6093 OPTIONAL(encoding, DwarfAttEncodingField, ); \
6094 OPTIONAL(flags, DIFlagField, ); \
6095 OPTIONAL(kind, FixedPointKindField, ); \
6096 OPTIONAL(factor, MDSignedField, ); \
6097 OPTIONAL(numerator, MDAPSIntField, ); \
6098 OPTIONAL(denominator, MDAPSIntField, );
6100#undef VISIT_MD_FIELDS
6103 (Context, tag.Val,
name.Val,
file.Val, line.Val,
6104 scope.Val,
size.getValueAsMetadata(Context),
6105 align.Val, encoding.Val, flags.Val, kind.Val,
6106 factor.Val, numerator.Val, denominator.Val));
6112bool LLParser::parseDIStringType(
MDNode *&Result,
bool IsDistinct) {
6113#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6114 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_string_type)); \
6115 OPTIONAL(name, MDStringField, ); \
6116 OPTIONAL(stringLength, MDField, ); \
6117 OPTIONAL(stringLengthExpression, MDField, ); \
6118 OPTIONAL(stringLocationExpression, MDField, ); \
6119 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6120 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6121 OPTIONAL(encoding, DwarfAttEncodingField, );
6123#undef VISIT_MD_FIELDS
6127 (Context, tag.Val,
name.Val, stringLength.Val, stringLengthExpression.Val,
6128 stringLocationExpression.Val,
size.getValueAsMetadata(Context),
6129 align.Val, encoding.Val));
6142bool LLParser::parseDIDerivedType(
MDNode *&Result,
bool IsDistinct) {
6143#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6144 REQUIRED(tag, DwarfTagField, ); \
6145 OPTIONAL(name, MDStringField, ); \
6146 OPTIONAL(file, MDField, ); \
6147 OPTIONAL(line, LineField, ); \
6148 OPTIONAL(scope, MDField, ); \
6149 REQUIRED(baseType, MDField, ); \
6150 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6151 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6152 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6153 OPTIONAL(flags, DIFlagField, ); \
6154 OPTIONAL(extraData, MDField, ); \
6155 OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
6156 OPTIONAL(annotations, MDField, ); \
6157 OPTIONAL(ptrAuthKey, MDUnsignedField, (0, 7)); \
6158 OPTIONAL(ptrAuthIsAddressDiscriminated, MDBoolField, ); \
6159 OPTIONAL(ptrAuthExtraDiscriminator, MDUnsignedField, (0, 0xffff)); \
6160 OPTIONAL(ptrAuthIsaPointer, MDBoolField, ); \
6161 OPTIONAL(ptrAuthAuthenticatesNullValues, MDBoolField, );
6163#undef VISIT_MD_FIELDS
6165 std::optional<unsigned> DWARFAddressSpace;
6166 if (dwarfAddressSpace.Val != UINT32_MAX)
6167 DWARFAddressSpace = dwarfAddressSpace.Val;
6168 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
6170 PtrAuthData.emplace(
6171 (
unsigned)ptrAuthKey.Val, ptrAuthIsAddressDiscriminated.Val,
6172 (
unsigned)ptrAuthExtraDiscriminator.Val, ptrAuthIsaPointer.Val,
6173 ptrAuthAuthenticatesNullValues.Val);
6176 DIDerivedType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
6177 baseType.Val,
size.getValueAsMetadata(Context),
align.Val,
6178 offset.getValueAsMetadata(Context), DWARFAddressSpace,
6179 PtrAuthData, flags.Val, extraData.Val, annotations.Val));
6183bool LLParser::parseDICompositeType(
MDNode *&Result,
bool IsDistinct) {
6184#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6185 REQUIRED(tag, DwarfTagField, ); \
6186 OPTIONAL(name, MDStringField, ); \
6187 OPTIONAL(file, MDField, ); \
6188 OPTIONAL(line, LineField, ); \
6189 OPTIONAL(scope, MDField, ); \
6190 OPTIONAL(baseType, MDField, ); \
6191 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6192 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6193 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6194 OPTIONAL(flags, DIFlagField, ); \
6195 OPTIONAL(elements, MDField, ); \
6196 OPTIONAL(runtimeLang, DwarfLangField, ); \
6197 OPTIONAL(enumKind, DwarfEnumKindField, ); \
6198 OPTIONAL(vtableHolder, MDField, ); \
6199 OPTIONAL(templateParams, MDField, ); \
6200 OPTIONAL(identifier, MDStringField, ); \
6201 OPTIONAL(discriminator, MDField, ); \
6202 OPTIONAL(dataLocation, MDField, ); \
6203 OPTIONAL(associated, MDField, ); \
6204 OPTIONAL(allocated, MDField, ); \
6205 OPTIONAL(rank, MDSignedOrMDField, ); \
6206 OPTIONAL(annotations, MDField, ); \
6207 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
6208 OPTIONAL(specification, MDField, ); \
6209 OPTIONAL(bitStride, MDField, );
6211#undef VISIT_MD_FIELDS
6214 if (rank.isMDSignedField())
6217 else if (rank.isMDField())
6218 Rank = rank.getMDFieldValue();
6220 std::optional<unsigned> EnumKind;
6222 EnumKind = enumKind.Val;
6227 Context, *identifier.Val, tag.Val,
name.Val,
file.Val, line.Val,
6228 scope.Val, baseType.Val,
size.getValueAsMetadata(Context),
6229 align.Val, offset.getValueAsMetadata(Context), specification.Val,
6230 num_extra_inhabitants.Val, flags.Val, elements.Val, runtimeLang.Val,
6231 EnumKind, vtableHolder.Val, templateParams.Val, discriminator.Val,
6232 dataLocation.Val, associated.Val, allocated.Val, Rank,
6233 annotations.Val, bitStride.Val)) {
6242 (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val, baseType.Val,
6243 size.getValueAsMetadata(Context),
align.Val,
6244 offset.getValueAsMetadata(Context), flags.Val, elements.Val,
6245 runtimeLang.Val, EnumKind, vtableHolder.Val, templateParams.Val,
6246 identifier.Val, discriminator.Val, dataLocation.Val, associated.Val,
6247 allocated.Val, Rank, annotations.Val, specification.Val,
6248 num_extra_inhabitants.Val, bitStride.Val));
6252bool LLParser::parseDISubroutineType(
MDNode *&Result,
bool IsDistinct) {
6253#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6254 OPTIONAL(flags, DIFlagField, ); \
6255 OPTIONAL(cc, DwarfCCField, ); \
6256 REQUIRED(types, MDField, );
6258#undef VISIT_MD_FIELDS
6261 (Context, flags.Val, cc.Val, types.Val));
6270bool LLParser::parseDIFile(
MDNode *&Result,
bool IsDistinct) {
6274#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6275 REQUIRED(filename, MDStringField, ); \
6276 REQUIRED(directory, MDStringField, ); \
6277 OPTIONAL(checksumkind, ChecksumKindField, (DIFile::CSK_MD5)); \
6278 OPTIONAL(checksum, MDStringField, ); \
6279 OPTIONAL(source, MDStringField, (MDStringField::EmptyIs::Empty));
6281#undef VISIT_MD_FIELDS
6283 std::optional<DIFile::ChecksumInfo<MDString *>> OptChecksum;
6284 if (checksumkind.Seen && checksum.Seen)
6285 OptChecksum.emplace(checksumkind.Val, checksum.Val);
6286 else if (checksumkind.Seen || checksum.Seen)
6287 return tokError(
"'checksumkind' and 'checksum' must be provided together");
6289 MDString *
Source =
nullptr;
6293 DIFile, (Context,
filename.Val, directory.Val, OptChecksum, Source));
6305bool LLParser::parseDICompileUnit(
MDNode *&Result,
bool IsDistinct) {
6307 return tokError(
"missing 'distinct', required for !DICompileUnit");
6309 LocTy Loc = Lex.getLoc();
6311#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6312 REQUIRED(file, MDField, ( false)); \
6313 OPTIONAL(language, DwarfLangField, ); \
6314 OPTIONAL(sourceLanguageName, DwarfSourceLangNameField, ); \
6315 OPTIONAL(sourceLanguageVersion, MDUnsignedField, (0, UINT32_MAX)); \
6316 OPTIONAL(producer, MDStringField, ); \
6317 OPTIONAL(isOptimized, MDBoolField, ); \
6318 OPTIONAL(flags, MDStringField, ); \
6319 OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); \
6320 OPTIONAL(splitDebugFilename, MDStringField, ); \
6321 OPTIONAL(emissionKind, EmissionKindField, ); \
6322 OPTIONAL(enums, MDField, ); \
6323 OPTIONAL(retainedTypes, MDField, ); \
6324 OPTIONAL(globals, MDField, ); \
6325 OPTIONAL(imports, MDField, ); \
6326 OPTIONAL(macros, MDField, ); \
6327 OPTIONAL(dwoId, MDUnsignedField, ); \
6328 OPTIONAL(splitDebugInlining, MDBoolField, = true); \
6329 OPTIONAL(debugInfoForProfiling, MDBoolField, = false); \
6330 OPTIONAL(nameTableKind, NameTableKindField, ); \
6331 OPTIONAL(rangesBaseAddress, MDBoolField, = false); \
6332 OPTIONAL(sysroot, MDStringField, ); \
6333 OPTIONAL(sdk, MDStringField, ); \
6334 OPTIONAL(dialect, DwarfLangDialectField, );
6336#undef VISIT_MD_FIELDS
6338 if (!language.Seen && !sourceLanguageName.Seen)
6339 return error(Loc,
"missing one of 'language' or 'sourceLanguageName', "
6340 "required for !DICompileUnit");
6342 if (language.Seen && sourceLanguageName.Seen)
6343 return error(Loc,
"can only specify one of 'language' and "
6344 "'sourceLanguageName' on !DICompileUnit");
6346 if (sourceLanguageVersion.Seen && !sourceLanguageName.Seen)
6347 return error(Loc,
"'sourceLanguageVersion' requires an associated "
6348 "'sourceLanguageName' on !DICompileUnit");
6350 uint16_t Dialect =
static_cast<uint16_t
>(dialect.Val);
6353 ? DISourceLanguageName(
static_cast<uint16_t
>(language.Val), Dialect)
6354 : DISourceLanguageName(
6355 static_cast<uint16_t>(sourceLanguageName.Val),
6356 static_cast<uint32_t>(sourceLanguageVersion.Val), Dialect);
6359 Context, SourceLanguage,
file.Val, producer.Val, isOptimized.Val,
6360 flags.Val, runtimeVersion.Val, splitDebugFilename.Val, emissionKind.Val,
6361 enums.Val, retainedTypes.Val,
globals.Val, imports.Val, macros.Val,
6362 dwoId.Val, splitDebugInlining.Val, debugInfoForProfiling.Val,
6363 nameTableKind.Val, rangesBaseAddress.Val, sysroot.Val, sdk.Val);
6376bool LLParser::parseDISubprogram(
MDNode *&Result,
bool IsDistinct) {
6377 auto Loc = Lex.getLoc();
6378#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6379 OPTIONAL(scope, MDField, ); \
6380 OPTIONAL(name, MDStringField, ); \
6381 OPTIONAL(linkageName, MDStringField, ); \
6382 OPTIONAL(file, MDField, ); \
6383 OPTIONAL(line, LineField, ); \
6384 REQUIRED(type, MDField, ( false)); \
6385 OPTIONAL(isLocal, MDBoolField, ); \
6386 OPTIONAL(isDefinition, MDBoolField, (true)); \
6387 OPTIONAL(scopeLine, LineField, ); \
6388 OPTIONAL(containingType, MDField, ); \
6389 OPTIONAL(virtuality, DwarfVirtualityField, ); \
6390 OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); \
6391 OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); \
6392 OPTIONAL(flags, DIFlagField, ); \
6393 OPTIONAL(spFlags, DISPFlagField, ); \
6394 OPTIONAL(isOptimized, MDBoolField, ); \
6395 OPTIONAL(unit, MDField, ); \
6396 OPTIONAL(templateParams, MDField, ); \
6397 OPTIONAL(declaration, MDField, ); \
6398 OPTIONAL(retainedNodes, MDField, ); \
6399 OPTIONAL(thrownTypes, MDField, ); \
6400 OPTIONAL(annotations, MDField, ); \
6401 OPTIONAL(targetFuncName, MDStringField, ); \
6402 OPTIONAL(keyInstructions, MDBoolField, );
6404#undef VISIT_MD_FIELDS
6409 spFlags.Seen ? spFlags.Val
6411 isOptimized.Val, virtuality.Val);
6412 if ((SPFlags & DISubprogram::SPFlagDefinition) && !IsDistinct)
6415 "missing 'distinct', required for !DISubprogram that is a Definition");
6418 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val, line.Val,
6419 type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
6420 thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
6421 declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
6422 targetFuncName.Val, keyInstructions.Val));
6432bool LLParser::parseDILexicalBlock(
MDNode *&Result,
bool IsDistinct) {
6433#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6434 REQUIRED(scope, MDField, ( false)); \
6435 OPTIONAL(file, MDField, ); \
6436 OPTIONAL(line, LineField, ); \
6437 OPTIONAL(column, ColumnField, );
6439#undef VISIT_MD_FIELDS
6442 DILexicalBlock, (Context, scope.Val,
file.Val, line.Val, column.Val));
6448bool LLParser::parseDILexicalBlockFile(
MDNode *&Result,
bool IsDistinct) {
6449#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6450 REQUIRED(scope, MDField, ( false)); \
6451 OPTIONAL(file, MDField, ); \
6452 REQUIRED(discriminator, MDUnsignedField, (0, UINT32_MAX));
6454#undef VISIT_MD_FIELDS
6457 (Context, scope.Val,
file.Val, discriminator.Val));
6463bool LLParser::parseDICommonBlock(
MDNode *&Result,
bool IsDistinct) {
6464#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6465 REQUIRED(scope, MDField, ); \
6466 OPTIONAL(declaration, MDField, ); \
6467 OPTIONAL(name, MDStringField, ); \
6468 OPTIONAL(file, MDField, ); \
6469 OPTIONAL(line, LineField, );
6471#undef VISIT_MD_FIELDS
6474 (Context, scope.Val, declaration.Val,
name.Val,
6475 file.Val, line.Val));
6481bool LLParser::parseDINamespace(
MDNode *&Result,
bool IsDistinct) {
6482#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6483 REQUIRED(scope, MDField, ); \
6484 OPTIONAL(name, MDStringField, ); \
6485 OPTIONAL(exportSymbols, MDBoolField, );
6487#undef VISIT_MD_FIELDS
6490 (Context, scope.Val,
name.Val, exportSymbols.Val));
6497bool LLParser::parseDIMacro(
MDNode *&Result,
bool IsDistinct) {
6498#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6499 REQUIRED(type, DwarfMacinfoTypeField, ); \
6500 OPTIONAL(line, LineField, ); \
6501 REQUIRED(name, MDStringField, ); \
6502 OPTIONAL(value, MDStringField, );
6504#undef VISIT_MD_FIELDS
6507 (Context, type.Val, line.Val,
name.Val, value.Val));
6513bool LLParser::parseDIMacroFile(
MDNode *&Result,
bool IsDistinct) {
6514#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6515 OPTIONAL(type, DwarfMacinfoTypeField, (dwarf::DW_MACINFO_start_file)); \
6516 OPTIONAL(line, LineField, ); \
6517 REQUIRED(file, MDField, ); \
6518 OPTIONAL(nodes, MDField, );
6520#undef VISIT_MD_FIELDS
6523 (Context, type.Val, line.Val,
file.Val,
nodes.Val));
6531bool LLParser::parseDIModule(
MDNode *&Result,
bool IsDistinct) {
6532#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6533 REQUIRED(scope, MDField, ); \
6534 REQUIRED(name, MDStringField, ); \
6535 OPTIONAL(configMacros, MDStringField, ); \
6536 OPTIONAL(includePath, MDStringField, ); \
6537 OPTIONAL(apinotes, MDStringField, ); \
6538 OPTIONAL(file, MDField, ); \
6539 OPTIONAL(line, LineField, ); \
6540 OPTIONAL(isDecl, MDBoolField, );
6542#undef VISIT_MD_FIELDS
6545 configMacros.Val, includePath.Val,
6546 apinotes.Val, line.Val, isDecl.Val));
6552bool LLParser::parseDITemplateTypeParameter(
MDNode *&Result,
bool IsDistinct) {
6553#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6554 OPTIONAL(name, MDStringField, ); \
6555 REQUIRED(type, MDField, ); \
6556 OPTIONAL(defaulted, MDBoolField, );
6558#undef VISIT_MD_FIELDS
6561 (Context,
name.Val, type.Val, defaulted.Val));
6569bool LLParser::parseDITemplateValueParameter(
MDNode *&Result,
bool IsDistinct) {
6570#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6571 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_template_value_parameter)); \
6572 OPTIONAL(name, MDStringField, ); \
6573 OPTIONAL(type, MDField, ); \
6574 OPTIONAL(defaulted, MDBoolField, ); \
6575 REQUIRED(value, MDField, );
6578#undef VISIT_MD_FIELDS
6581 DITemplateValueParameter,
6582 (Context, tag.Val,
name.Val, type.Val, defaulted.Val, value.Val));
6591bool LLParser::parseDIGlobalVariable(
MDNode *&Result,
bool IsDistinct) {
6592#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6593 OPTIONAL(name, MDStringField, (MDStringField::EmptyIs::Error)); \
6594 OPTIONAL(scope, MDField, ); \
6595 OPTIONAL(linkageName, MDStringField, ); \
6596 OPTIONAL(file, MDField, ); \
6597 OPTIONAL(line, LineField, ); \
6598 OPTIONAL(type, MDField, ); \
6599 OPTIONAL(isLocal, MDBoolField, ); \
6600 OPTIONAL(isDefinition, MDBoolField, (true)); \
6601 OPTIONAL(templateParams, MDField, ); \
6602 OPTIONAL(declaration, MDField, ); \
6603 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6604 OPTIONAL(annotations, MDField, );
6606#undef VISIT_MD_FIELDS
6610 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val,
6611 line.Val, type.Val, isLocal.Val, isDefinition.Val,
6612 declaration.Val, templateParams.Val,
align.Val,
6624bool LLParser::parseDILocalVariable(
MDNode *&Result,
bool IsDistinct) {
6625#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6626 REQUIRED(scope, MDField, ( false)); \
6627 OPTIONAL(name, MDStringField, ); \
6628 OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); \
6629 OPTIONAL(file, MDField, ); \
6630 OPTIONAL(line, LineField, ); \
6631 OPTIONAL(type, MDField, ); \
6632 OPTIONAL(flags, DIFlagField, ); \
6633 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6634 OPTIONAL(annotations, MDField, );
6636#undef VISIT_MD_FIELDS
6639 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6640 type.Val, arg.Val, flags.Val,
align.Val,
6647bool LLParser::parseDILabel(
MDNode *&Result,
bool IsDistinct) {
6648#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6649 REQUIRED(scope, MDField, ( false)); \
6650 REQUIRED(name, MDStringField, ); \
6651 REQUIRED(file, MDField, ); \
6652 REQUIRED(line, LineField, ); \
6653 OPTIONAL(column, ColumnField, ); \
6654 OPTIONAL(isArtificial, MDBoolField, ); \
6655 OPTIONAL(coroSuspendIdx, MDUnsignedField, );
6657#undef VISIT_MD_FIELDS
6659 std::optional<unsigned> CoroSuspendIdx =
6660 coroSuspendIdx.Seen ? std::optional<unsigned>(coroSuspendIdx.Val)
6664 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6665 column.Val, isArtificial.Val, CoroSuspendIdx));
6671bool LLParser::parseDIExpressionBody(
MDNode *&Result,
bool IsDistinct) {
6684 return tokError(Twine(
"invalid DWARF op '") + Lex.getStrVal() +
"'");
6693 return tokError(Twine(
"invalid DWARF attribute encoding '") +
6694 Lex.getStrVal() +
"'");
6697 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
6698 return tokError(
"expected unsigned integer");
6700 auto &
U = Lex.getAPSIntVal();
6702 return tokError(
"element too large, limit is " + Twine(
UINT64_MAX));
6716bool LLParser::parseDIExpression(
MDNode *&Result,
bool IsDistinct) {
6718 assert(Lex.getStrVal() ==
"DIExpression" &&
"Expected '!DIExpression'");
6721 return parseDIExpressionBody(Result, IsDistinct);
6726bool LLParser::parseDIArgList(
Metadata *&MD, PerFunctionState *PFS) {
6727 assert(PFS &&
"Expected valid function state");
6738 if (parseValueAsMetadata(MD,
"expected value-as-metadata operand", PFS))
6752bool LLParser::parseDIGlobalVariableExpression(
MDNode *&Result,
6754#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6755 REQUIRED(var, MDField, ); \
6756 REQUIRED(expr, MDField, );
6758#undef VISIT_MD_FIELDS
6761 GET_OR_DISTINCT(DIGlobalVariableExpression, (Context, var.Val, expr.Val));
6768bool LLParser::parseDIObjCProperty(
MDNode *&Result,
bool IsDistinct) {
6769#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6770 OPTIONAL(name, MDStringField, ); \
6771 OPTIONAL(file, MDField, ); \
6772 OPTIONAL(line, LineField, ); \
6773 OPTIONAL(setter, MDStringField, ); \
6774 OPTIONAL(getter, MDStringField, ); \
6775 OPTIONAL(attributes, MDUnsignedField, (0, UINT32_MAX)); \
6776 OPTIONAL(type, MDField, );
6778#undef VISIT_MD_FIELDS
6781 (Context,
name.Val,
file.Val, line.Val, getter.Val,
6782 setter.Val, attributes.Val, type.Val));
6789bool LLParser::parseDIProperty(
MDNode *&Result,
bool IsDistinct) {
6790#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6791 OPTIONAL(name, MDStringField, ); \
6792 OPTIONAL(file, MDField, ); \
6793 OPTIONAL(line, LineField, ); \
6794 OPTIONAL(type, MDField, ); \
6795 OPTIONAL(backing_storage, MDField, );
6797#undef VISIT_MD_FIELDS
6800 type.Val, backing_storage.Val));
6807bool LLParser::parseDIImportedEntity(
MDNode *&Result,
bool IsDistinct) {
6808#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6809 REQUIRED(tag, DwarfTagField, ); \
6810 REQUIRED(scope, MDField, ); \
6811 OPTIONAL(entity, MDField, ); \
6812 OPTIONAL(file, MDField, ); \
6813 OPTIONAL(line, LineField, ); \
6814 OPTIONAL(name, MDStringField, ); \
6815 OPTIONAL(elements, MDField, );
6817#undef VISIT_MD_FIELDS
6820 (Context, tag.Val, scope.Val, entity.Val,
file.Val,
6821 line.Val,
name.Val, elements.Val));
6825#undef PARSE_MD_FIELD
6837bool LLParser::parseMetadataAsValue(
Value *&V, PerFunctionState &PFS) {
6840 if (parseMetadata(MD, &PFS))
6851bool LLParser::parseValueAsMetadata(
Metadata *&MD,
const Twine &TypeMsg,
6852 PerFunctionState *PFS) {
6855 if (parseType(Ty, TypeMsg, Loc))
6858 return error(Loc,
"invalid metadata-value-metadata roundtrip");
6861 if (parseValue(Ty, V, PFS))
6876bool LLParser::parseMetadata(
Metadata *&MD, PerFunctionState *PFS) {
6880 if (Lex.getStrVal() ==
"DIArgList") {
6882 if (parseDIArgList(AL, PFS))
6888 if (parseSpecializedMDNode(
N)) {
6898 return parseValueAsMetadata(MD,
"expected metadata operand", PFS);
6908 if (parseMDString(S))
6918 if (parseMDNodeTail(
N))
6928bool LLParser::convertValIDToValue(
Type *Ty,
ValID &ID,
Value *&V,
6929 PerFunctionState *PFS) {
6931 return error(
ID.Loc,
"functions are not values, refer to them as pointers");
6936 return error(
ID.Loc,
"invalid use of function-local name");
6937 V = PFS->getVal(
ID.UIntVal, Ty,
ID.Loc);
6938 return V ==
nullptr;
6941 return error(
ID.Loc,
"invalid use of function-local name");
6942 V = PFS->getVal(
ID.StrVal, Ty,
ID.Loc);
6943 return V ==
nullptr;
6946 return error(
ID.Loc,
"invalid type for inline asm constraint string");
6950 ID.FTy,
ID.StrVal,
ID.StrVal2,
ID.UIntVal & 1, (
ID.UIntVal >> 1) & 1,
6955 V = getGlobalVal(
ID.StrVal, Ty,
ID.Loc);
6958 return V ==
nullptr;
6960 V = getGlobalVal(
ID.UIntVal, Ty,
ID.Loc);
6963 return V ==
nullptr;
6966 return error(
ID.Loc,
"integer/byte constant must have integer/byte type");
6969 :
V = ConstantByte::
get(Context,
ID.APSIntVal);
6974 return error(
ID.Loc,
"floating point constant invalid for type");
6980 bool IsSNAN = ID.APFloatVal.isSignaling();
6983 ID.APFloatVal.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven,
6985 else if (Ty->isBFloatTy())
6986 ID.APFloatVal.convert(APFloat::BFloat(), APFloat::rmNearestTiesToEven,
6988 else if (Ty->isFloatTy())
6989 ID.APFloatVal.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven,
6995 APInt Payload = ID.APFloatVal.bitcastToAPInt();
6996 ID.APFloatVal = APFloat::getSNaN(ID.APFloatVal.getSemantics(),
6997 ID.APFloatVal.isNegative(), &Payload);
7000 V = ConstantFP::get(Context,
ID.APFloatVal);
7002 if (
V->getType() != Ty)
7003 return error(
ID.Loc,
"floating point constant does not have type '" +
7009 return error(
ID.Loc,
"null must be a pointer type");
7015 return error(
ID.Loc,
"invalid type for undef constant");
7020 return error(
ID.Loc,
"invalid empty array initializer");
7026 return error(
ID.Loc,
"invalid type for null constant");
7029 return error(
ID.Loc,
"invalid type for null constant");
7034 return error(
ID.Loc,
"invalid type for none constant");
7040 return error(
ID.Loc,
"invalid type for poison constant");
7044 if (
ID.ConstantVal->getType() != Ty)
7045 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
7052 return error(
ID.Loc,
"vector constant must have vector type");
7054 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
7056 "' but expected '" +
7064 if (
ST->getNumElements() !=
ID.UIntVal)
7066 "initializer with struct type has wrong # elements");
7068 return error(
ID.Loc,
"packed'ness of initializer and type don't match");
7071 for (
unsigned i = 0, e =
ID.UIntVal; i != e; ++i)
7072 if (
ID.ConstantStructElts[i]->getType() !=
ST->getElementType(i))
7075 "element " + Twine(i) +
7076 " of struct initializer doesn't match struct element type");
7079 ST,
ArrayRef(
ID.ConstantStructElts.get(),
ID.UIntVal));
7081 return error(
ID.Loc,
"constant expression type mismatch");
7090 auto Loc = Lex.getLoc();
7091 if (parseValID(ID,
nullptr, Ty))
7104 if (convertValIDToValue(Ty, ID, V,
nullptr))
7114 return error(Loc,
"expected a constant value");
7118bool LLParser::parseValue(
Type *Ty,
Value *&V, PerFunctionState *PFS) {
7122 FileLoc
Start = getTokLineColumnPos();
7123 bool Ret = parseValID(ID, PFS, Ty) || convertValIDToValue(Ty, ID, V, PFS);
7124 if (!Ret && ParserContext) {
7125 FileLoc End = getPrevTokEndLineColumnPos();
7126 ParserContext->addValueReferenceAtLocation(V, FileLocRange(Start, End));
7131bool LLParser::parseTypeAndValue(
Value *&V, PerFunctionState *PFS) {
7133 return parseType(Ty) || parseValue(Ty, V, PFS);
7136bool LLParser::parseTypeAndBasicBlock(
BasicBlock *&BB, LocTy &
Loc,
7137 PerFunctionState &PFS) {
7140 if (parseTypeAndValue(V, PFS))
7143 return error(Loc,
"expected a basic block");
7152 if (!Name.starts_with(
"llvm.dbg."))
7155 return FnID == Intrinsic::dbg_declare || FnID == Intrinsic::dbg_value ||
7156 FnID == Intrinsic::dbg_assign;
7164bool LLParser::parseFunctionHeader(
Function *&Fn,
bool IsDefine,
7165 unsigned &FunctionNumber,
7168 LocTy LinkageLoc = Lex.getLoc();
7170 unsigned Visibility;
7171 unsigned DLLStorageClass;
7173 AttrBuilder RetAttrs(M->getContext());
7176 Type *RetType =
nullptr;
7177 LocTy RetTypeLoc = Lex.getLoc();
7178 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
7180 parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7181 parseType(RetType, RetTypeLoc,
true ))
7190 return error(LinkageLoc,
"invalid linkage for function definition");
7200 return error(LinkageLoc,
"invalid linkage for function declaration");
7204 return error(LinkageLoc,
"invalid function linkage type");
7208 return error(LinkageLoc,
7209 "symbol with local linkage must have default visibility");
7212 return error(LinkageLoc,
7213 "symbol with local linkage cannot have a DLL storage class");
7216 return error(RetTypeLoc,
"invalid function return type");
7218 LocTy NameLoc = Lex.getLoc();
7220 std::string FunctionName;
7222 FunctionName = Lex.getStrVal();
7224 FunctionNumber = Lex.getUIntVal();
7225 if (checkValueID(NameLoc,
"function",
"@", NumberedVals.getNext(),
7229 return tokError(
"expected function name");
7235 return tokError(
"expected '(' in function argument list");
7239 AttrBuilder FuncAttrs(M->getContext());
7240 std::vector<unsigned> FwdRefAttrGrps;
7243 std::string Partition;
7247 unsigned AddrSpace = 0;
7253 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg) ||
7254 parseOptionalUnnamedAddr(UnnamedAddr) ||
7255 parseOptionalProgramAddrSpace(AddrSpace) ||
7256 parseFnAttributeValuePairs(FuncAttrs, FwdRefAttrGrps,
false,
7260 parseOptionalComdat(FunctionName,
C) ||
7261 parseOptionalAlignment(Alignment) ||
7262 parseOptionalPrefAlignment(PrefAlignment) ||
7263 (EatIfPresent(
lltok::kw_gc) && parseStringConstant(GC)) ||
7267 parseGlobalTypeAndValue(PersonalityFn)))
7270 if (FuncAttrs.contains(Attribute::Builtin))
7271 return error(BuiltinLoc,
"'builtin' attribute not valid on function");
7274 if (MaybeAlign
A = FuncAttrs.getAlignment()) {
7276 FuncAttrs.removeAttribute(Attribute::Alignment);
7281 std::vector<Type*> ParamTypeList;
7284 for (
const ArgInfo &Arg : ArgList) {
7285 ParamTypeList.push_back(Arg.Ty);
7286 Attrs.push_back(Arg.Attrs);
7293 if (PAL.hasParamAttr(0, Attribute::StructRet) && !RetType->
isVoidTy())
7294 return error(RetTypeLoc,
"functions with 'sret' argument must return void");
7300 GlobalValue *FwdFn =
nullptr;
7301 if (!FunctionName.empty()) {
7304 auto FRVI = ForwardRefVals.find(FunctionName);
7305 if (FRVI != ForwardRefVals.end()) {
7306 FwdFn = FRVI->second.first;
7308 return error(FRVI->second.second,
7309 "invalid forward reference to "
7312 "' with wrong type: "
7316 ForwardRefVals.erase(FRVI);
7317 }
else if ((Fn = M->getFunction(FunctionName))) {
7319 return error(NameLoc,
7320 "invalid redefinition of function '" + FunctionName +
"'");
7321 }
else if (M->getNamedValue(FunctionName)) {
7322 return error(NameLoc,
"redefinition of function '@" + FunctionName +
"'");
7328 if (FunctionNumber == (
unsigned)-1)
7329 FunctionNumber = NumberedVals.getNext();
7333 auto I = ForwardRefValIDs.find(FunctionNumber);
7334 if (
I != ForwardRefValIDs.end()) {
7335 FwdFn =
I->second.first;
7337 return error(NameLoc,
"type of definition and forward reference of '@" +
7338 Twine(FunctionNumber) +
7343 ForwardRefValIDs.erase(
I);
7352 if (FunctionName.empty())
7353 NumberedVals.add(FunctionNumber, Fn);
7369 if (!
GC.empty()) Fn->
setGC(GC);
7372 ForwardRefAttrGroups[Fn] = FwdRefAttrGrps;
7376 for (
unsigned i = 0, e = ArgList.size(); i != e; ++i, ++ArgIt) {
7377 if (ParserContext && ArgList[i].IdentLoc)
7378 ParserContext->addInstructionOrArgumentLocation(
7379 &*ArgIt, ArgList[i].IdentLoc.value());
7381 if (ArgList[i].
Name.empty())
continue;
7384 ArgIt->
setName(ArgList[i].Name);
7386 if (ArgIt->
getName() != ArgList[i].Name)
7387 return error(ArgList[i].Loc,
7388 "redefinition of argument '%" + ArgList[i].Name +
"'");
7401 if (FunctionName.empty()) {
7403 ID.UIntVal = FunctionNumber;
7406 ID.StrVal = FunctionName;
7408 auto Blocks = ForwardRefBlockAddresses.find(ID);
7409 if (Blocks != ForwardRefBlockAddresses.end())
7410 return error(Blocks->first.Loc,
7411 "cannot take blockaddress inside a declaration");
7415bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
7417 if (FunctionNumber == -1) {
7419 ID.StrVal = std::string(F.getName());
7422 ID.UIntVal = FunctionNumber;
7425 auto Blocks = P.ForwardRefBlockAddresses.find(ID);
7426 if (Blocks == P.ForwardRefBlockAddresses.end())
7429 for (
const auto &
I : Blocks->second) {
7430 const ValID &BBID =
I.first;
7431 GlobalValue *GV =
I.second;
7434 "Expected local id or name");
7441 return P.error(BBID.
Loc,
"referenced value is not a basic block");
7444 ResolvedVal = P.checkValidVariableType(BBID.
Loc, BBID.
StrVal, GV->
getType(),
7452 P.ForwardRefBlockAddresses.erase(Blocks);
7458bool LLParser::parseFunctionBody(
Function &Fn,
unsigned FunctionNumber,
7459 ArrayRef<unsigned> UnnamedArgNums) {
7461 return tokError(
"expected '{' in function body");
7464 PerFunctionState PFS(*
this, Fn, FunctionNumber, UnnamedArgNums);
7468 if (PFS.resolveForwardRefBlockAddresses())
7474 return tokError(
"function body requires at least one basic block");
7478 if (parseBasicBlock(PFS))
7482 if (parseUseListOrder(&PFS))
7489 return PFS.finishFunction();
7494bool LLParser::parseBasicBlock(PerFunctionState &PFS) {
7495 FileLoc BBStart = getTokLineColumnPos();
7500 LocTy NameLoc = Lex.getLoc();
7502 Name = Lex.getStrVal();
7505 NameID = Lex.getUIntVal();
7509 BasicBlock *BB = PFS.defineBB(Name, NameID, NameLoc);
7513 std::string NameStr;
7518 auto DeleteDbgRecord = [](DbgRecord *DR) { DR->deleteRecord(); };
7519 using DbgRecordPtr = std::unique_ptr<DbgRecord,
decltype(DeleteDbgRecord)>;
7526 if (SeenOldDbgInfoFormat)
7527 return error(Lex.getLoc(),
"debug record should not appear in a module "
7528 "containing debug info intrinsics");
7529 SeenNewDbgInfoFormat =
true;
7533 if (parseDebugRecord(DR, PFS))
7535 TrailingDbgRecord.emplace_back(DR, DeleteDbgRecord);
7538 FileLoc InstStart = getTokLineColumnPos();
7541 LocTy NameLoc = Lex.getLoc();
7546 NameID = Lex.getUIntVal();
7548 if (parseToken(
lltok::equal,
"expected '=' after instruction id"))
7551 NameStr = Lex.getStrVal();
7553 if (parseToken(
lltok::equal,
"expected '=' after instruction name"))
7557 switch (parseInstruction(Inst, BB, PFS)) {
7560 case InstError:
return true;
7567 if (parseInstructionMetadata(*Inst))
7570 case InstExtraComma:
7575 if (parseInstructionMetadata(*Inst))
7581 if (PFS.setInstName(NameID, NameStr, NameLoc, Inst))
7585 for (DbgRecordPtr &DR : TrailingDbgRecord)
7587 TrailingDbgRecord.clear();
7588 if (ParserContext) {
7589 ParserContext->addInstructionOrArgumentLocation(
7590 Inst, FileLocRange(InstStart, getPrevTokEndLineColumnPos()));
7595 ParserContext->addBlockLocation(
7596 BB, FileLocRange(BBStart, getPrevTokEndLineColumnPos()));
7598 assert(TrailingDbgRecord.empty() &&
7599 "All debug values should have been attached to an instruction.");
7608bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
7611 LocTy DVRLoc = Lex.getLoc();
7613 return error(DVRLoc,
"expected debug record type here");
7614 RecordKind
RecordType = StringSwitch<RecordKind>(Lex.getStrVal())
7615 .Case(
"declare", RecordKind::ValueKind)
7616 .Case(
"value", RecordKind::ValueKind)
7617 .Case(
"assign", RecordKind::ValueKind)
7618 .Case(
"label", RecordKind::LabelKind)
7619 .Case(
"declare_value", RecordKind::ValueKind);
7628 if (parseMDNode(Label))
7633 if (parseMDNode(DbgLoc))
7638 PendingDbgRecords.emplace_back(DVRLoc, DR, DbgLoc);
7642 LocType
ValueType = StringSwitch<LocType>(Lex.getStrVal())
7643 .Case(
"declare", LocType::Declare)
7644 .Case(
"value", LocType::Value)
7645 .Case(
"assign", LocType::Assign)
7646 .Case(
"declare_value", LocType::DeclareValue);
7654 if (parseMetadata(ValLocMD, &PFS))
7661 if (parseMDNode(Variable))
7668 if (parseMDNode(Expression))
7674 MDNode *AssignID =
nullptr;
7675 Metadata *AddressLocation =
nullptr;
7676 MDNode *AddressExpression =
nullptr;
7679 if (parseMDNode(AssignID))
7685 if (parseMetadata(AddressLocation, &PFS))
7691 if (parseMDNode(AddressExpression))
7705 ValueType, ValLocMD, Variable, Expression, AssignID, AddressLocation,
7707 PendingDbgRecords.emplace_back(DVRLoc, DR,
DebugLoc);
7716int LLParser::parseInstruction(Instruction *&Inst, BasicBlock *BB,
7717 PerFunctionState &PFS) {
7720 return tokError(
"found end of file when expecting more instructions");
7721 LocTy Loc = Lex.getLoc();
7722 unsigned KeywordVal = Lex.getUIntVal();
7727 return error(Loc,
"expected instruction opcode");
7731 return parseRet(Inst, BB, PFS);
7733 return parseBr(Inst, PFS);
7735 return parseSwitch(Inst, PFS);
7737 return parseIndirectBr(Inst, PFS);
7739 return parseInvoke(Inst, PFS);
7741 return parseResume(Inst, PFS);
7743 return parseCleanupRet(Inst, PFS);
7745 return parseCatchRet(Inst, PFS);
7747 return parseCatchSwitch(Inst, PFS);
7749 return parseCatchPad(Inst, PFS);
7751 return parseCleanupPad(Inst, PFS);
7753 return parseCallBr(Inst, PFS);
7756 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7757 int Res = parseUnaryOp(Inst, PFS, KeywordVal,
true);
7773 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7785 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7786 int Res = parseArithmetic(Inst, PFS, KeywordVal,
true);
7800 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7808 return parseArithmetic(Inst, PFS, KeywordVal,
7812 if (parseLogical(Inst, PFS, KeywordVal))
7820 return parseLogical(Inst, PFS, KeywordVal);
7823 if (parseCompare(Inst, PFS, KeywordVal))
7830 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7831 int Res = parseCompare(Inst, PFS, KeywordVal);
7841 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7843 bool Res = parseCast(Inst, PFS, KeywordVal);
7853 bool Res = parseCast(Inst, PFS, KeywordVal);
7865 if (parseCast(Inst, PFS, KeywordVal))
7881 return parseCast(Inst, PFS, KeywordVal);
7885 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7886 if (parseCast(Inst, PFS, KeywordVal))
7895 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7896 int Res = parseSelect(Inst, PFS);
7902 return error(Loc,
"fast-math-flags specified for select without "
7903 "floating-point scalar or vector return type");
7910 return parseVAArg(Inst, PFS);
7912 return parseExtractElement(Inst, PFS);
7914 return parseInsertElement(Inst, PFS);
7916 return parseShuffleVector(Inst, PFS);
7918 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7919 int Res = parsePHI(Inst, PFS);
7925 return error(Loc,
"fast-math-flags specified for phi without "
7926 "floating-point scalar or vector return type");
7933 return parseLandingPad(Inst, PFS);
7935 return parseFreeze(Inst, PFS);
7947 return parseAlloc(Inst, PFS);
7949 return parseLoad(Inst, PFS);
7951 return parseStore(Inst, PFS);
7953 return parseCmpXchg(Inst, PFS);
7955 return parseAtomicRMW(Inst, PFS);
7957 return parseFence(Inst, PFS);
7959 return parseGetElementPtr(Inst, PFS);
7961 return parseExtractValue(Inst, PFS);
7963 return parseInsertValue(Inst, PFS);
7968bool LLParser::parseCmpPredicate(
unsigned &
P,
unsigned Opc) {
7969 if (
Opc == Instruction::FCmp) {
7970 switch (Lex.getKind()) {
7972 return tokError(
"expected fcmp predicate (e.g. 'oeq')");
7991 switch (Lex.getKind()) {
7993 return tokError(
"expected icmp predicate (e.g. 'eq')");
8017bool LLParser::parseRet(Instruction *&Inst, BasicBlock *BB,
8018 PerFunctionState &PFS) {
8019 SMLoc TypeLoc = Lex.getLoc();
8021 if (parseType(Ty,
true ))
8024 Type *ResType = PFS.getFunction().getReturnType();
8028 return error(TypeLoc,
"value doesn't match function result type '" +
8036 if (parseValue(Ty, RV, PFS))
8040 return error(TypeLoc,
"value doesn't match function result type '" +
8050bool LLParser::parseBr(Instruction *&Inst, PerFunctionState &PFS) {
8054 if (parseTypeAndValue(Op0, Loc, PFS))
8063 return error(Loc,
"branch condition must have 'i1' type");
8065 if (parseToken(
lltok::comma,
"expected ',' after branch condition") ||
8066 parseTypeAndBasicBlock(Op1, Loc, PFS) ||
8067 parseToken(
lltok::comma,
"expected ',' after true destination") ||
8068 parseTypeAndBasicBlock(Op2, Loc2, PFS))
8080bool LLParser::parseSwitch(Instruction *&Inst, PerFunctionState &PFS) {
8081 LocTy CondLoc, BBLoc;
8084 if (parseTypeAndValue(
Cond, CondLoc, PFS) ||
8085 parseToken(
lltok::comma,
"expected ',' after switch condition") ||
8086 parseTypeAndBasicBlock(DefaultBB, BBLoc, PFS) ||
8090 if (!
Cond->getType()->isIntegerTy())
8091 return error(CondLoc,
"switch condition must have integer type");
8094 SmallPtrSet<Value*, 32> SeenCases;
8100 if (parseTypeAndValue(Constant, CondLoc, PFS) ||
8101 parseToken(
lltok::comma,
"expected ',' after case value") ||
8102 parseTypeAndBasicBlock(DestBB, PFS))
8105 if (!SeenCases.
insert(Constant).second)
8106 return error(CondLoc,
"duplicate case value in switch");
8108 return error(CondLoc,
"case value is not a constant integer");
8116 for (
const auto &[OnVal, Dest] :
Table)
8117 SI->addCase(OnVal, Dest);
8125bool LLParser::parseIndirectBr(Instruction *&Inst, PerFunctionState &PFS) {
8128 if (parseTypeAndValue(
Address, AddrLoc, PFS) ||
8129 parseToken(
lltok::comma,
"expected ',' after indirectbr address") ||
8133 if (!
Address->getType()->isPointerTy())
8134 return error(AddrLoc,
"indirectbr address must have pointer type");
8137 SmallVector<BasicBlock*, 16> DestList;
8141 if (parseTypeAndBasicBlock(DestBB, PFS))
8146 if (parseTypeAndBasicBlock(DestBB, PFS))
8152 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
8156 for (BasicBlock *Dest : DestList)
8166 FunctionType *&FuncTy) {
8172 for (
const ParamInfo &Arg : ArgList)
8186bool LLParser::parseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
8187 LocTy CallLoc = Lex.getLoc();
8188 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8189 std::vector<unsigned> FwdRefAttrGrps;
8192 unsigned InvokeAddrSpace;
8193 Type *RetType =
nullptr;
8200 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8201 parseOptionalProgramAddrSpace(InvokeAddrSpace) ||
8202 parseType(RetType, RetTypeLoc,
true ) ||
8203 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
8204 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
8206 parseOptionalOperandBundles(BundleList, PFS) ||
8208 parseTypeAndBasicBlock(NormalBB, PFS) ||
8210 parseTypeAndBasicBlock(UnwindBB, PFS))
8217 if (resolveFunctionType(RetType, ArgList, Ty))
8218 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8224 if (convertValIDToValue(
PointerType::get(Context, InvokeAddrSpace), CalleeID,
8229 SmallVector<Value *, 8>
Args;
8236 for (
const ParamInfo &Arg : ArgList) {
8237 Type *ExpectedTy =
nullptr;
8240 }
else if (!Ty->isVarArg()) {
8241 return error(Arg.Loc,
"too many arguments specified");
8244 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8245 return error(Arg.Loc,
"argument is not of expected type '" +
8247 Args.push_back(Arg.V);
8252 return error(CallLoc,
"not enough parameters specified for call");
8261 II->setCallingConv(CC);
8262 II->setAttributes(PAL);
8263 ForwardRefAttrGroups[
II] = FwdRefAttrGrps;
8270bool LLParser::parseResume(Instruction *&Inst, PerFunctionState &PFS) {
8272 if (parseTypeAndValue(Exn, ExnLoc, PFS))
8280bool LLParser::parseExceptionArgs(SmallVectorImpl<Value *> &Args,
8281 PerFunctionState &PFS) {
8282 if (parseToken(
lltok::lsquare,
"expected '[' in catchpad/cleanuppad"))
8287 if (!
Args.empty() &&
8288 parseToken(
lltok::comma,
"expected ',' in argument list"))
8293 Type *ArgTy =
nullptr;
8294 if (parseType(ArgTy, ArgLoc))
8299 if (parseMetadataAsValue(V, PFS))
8302 if (parseValue(ArgTy, V, PFS))
8314bool LLParser::parseCleanupRet(Instruction *&Inst, PerFunctionState &PFS) {
8315 Value *CleanupPad =
nullptr;
8317 if (parseToken(
lltok::kw_from,
"expected 'from' after cleanupret"))
8332 if (parseTypeAndBasicBlock(UnwindBB, PFS)) {
8343bool LLParser::parseCatchRet(Instruction *&Inst, PerFunctionState &PFS) {
8344 Value *CatchPad =
nullptr;
8346 if (parseToken(
lltok::kw_from,
"expected 'from' after catchret"))
8353 if (parseToken(
lltok::kw_to,
"expected 'to' in catchret") ||
8354 parseTypeAndBasicBlock(BB, PFS))
8363bool LLParser::parseCatchSwitch(Instruction *&Inst, PerFunctionState &PFS) {
8371 return tokError(
"expected scope value for catchswitch");
8376 if (parseToken(
lltok::lsquare,
"expected '[' with catchswitch labels"))
8382 if (parseTypeAndBasicBlock(DestBB, PFS))
8384 Table.push_back(DestBB);
8387 if (parseToken(
lltok::rsquare,
"expected ']' after catchswitch labels"))
8390 if (parseToken(
lltok::kw_unwind,
"expected 'unwind' after catchswitch scope"))
8398 if (parseTypeAndBasicBlock(UnwindBB, PFS))
8404 for (BasicBlock *DestBB :
Table)
8405 CatchSwitch->addHandler(DestBB);
8412bool LLParser::parseCatchPad(Instruction *&Inst, PerFunctionState &PFS) {
8413 Value *CatchSwitch =
nullptr;
8419 return tokError(
"expected scope value for catchpad");
8424 SmallVector<Value *, 8>
Args;
8425 if (parseExceptionArgs(Args, PFS))
8434bool LLParser::parseCleanupPad(Instruction *&Inst, PerFunctionState &PFS) {
8435 Value *ParentPad =
nullptr;
8442 return tokError(
"expected scope value for cleanuppad");
8447 SmallVector<Value *, 8>
Args;
8448 if (parseExceptionArgs(Args, PFS))
8464bool LLParser::parseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
8465 unsigned Opc,
bool IsFP) {
8467 if (parseTypeAndValue(
LHS, Loc, PFS))
8474 return error(Loc,
"invalid operand type for instruction");
8484bool LLParser::parseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
8485 LocTy CallLoc = Lex.getLoc();
8486 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8487 std::vector<unsigned> FwdRefAttrGrps;
8490 Type *RetType =
nullptr;
8497 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8498 parseType(RetType, RetTypeLoc,
true ) ||
8499 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
8500 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
8502 parseOptionalOperandBundles(BundleList, PFS) ||
8504 parseTypeAndBasicBlock(DefaultDest, PFS) ||
8509 SmallVector<BasicBlock *, 16> IndirectDests;
8513 if (parseTypeAndBasicBlock(DestBB, PFS))
8518 if (parseTypeAndBasicBlock(DestBB, PFS))
8524 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
8531 if (resolveFunctionType(RetType, ArgList, Ty))
8532 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8543 SmallVector<Value *, 8>
Args;
8550 for (
const ParamInfo &Arg : ArgList) {
8551 Type *ExpectedTy =
nullptr;
8554 }
else if (!Ty->isVarArg()) {
8555 return error(Arg.Loc,
"too many arguments specified");
8558 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8559 return error(Arg.Loc,
"argument is not of expected type '" +
8561 Args.push_back(Arg.V);
8566 return error(CallLoc,
"not enough parameters specified for call");
8578 ForwardRefAttrGroups[CBI] = FwdRefAttrGrps;
8592bool LLParser::parseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
8593 unsigned Opc,
bool IsFP) {
8595 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8596 parseToken(
lltok::comma,
"expected ',' in arithmetic operation") ||
8604 return error(Loc,
"invalid operand type for instruction");
8612bool LLParser::parseLogical(Instruction *&Inst, PerFunctionState &PFS,
8615 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8616 parseToken(
lltok::comma,
"expected ',' in logical operation") ||
8622 "instruction requires integer or integer vector operands");
8631bool LLParser::parseCompare(Instruction *&Inst, PerFunctionState &PFS,
8637 if (parseCmpPredicate(Pred,
Opc) || parseTypeAndValue(
LHS, Loc, PFS) ||
8638 parseToken(
lltok::comma,
"expected ',' after compare value") ||
8642 if (
Opc == Instruction::FCmp) {
8644 return error(Loc,
"fcmp requires floating point operands");
8647 assert(
Opc == Instruction::ICmp &&
"Unknown opcode for CmpInst!");
8650 return error(Loc,
"icmp requires integer operands");
8662bool LLParser::parseCast(Instruction *&Inst, PerFunctionState &PFS,
8666 Type *DestTy =
nullptr;
8667 if (parseTypeAndValue(
Op, Loc, PFS) ||
8668 parseToken(
lltok::kw_to,
"expected 'to' after cast value") ||
8673 return error(Loc,
"invalid cast opcode for cast from '" +
8682bool LLParser::parseSelect(Instruction *&Inst, PerFunctionState &PFS) {
8684 Value *Op0, *Op1, *Op2;
8685 if (parseTypeAndValue(Op0, Loc, PFS) ||
8686 parseToken(
lltok::comma,
"expected ',' after select condition") ||
8687 parseTypeAndValue(Op1, PFS) ||
8688 parseToken(
lltok::comma,
"expected ',' after select value") ||
8689 parseTypeAndValue(Op2, PFS))
8693 return error(Loc, Reason);
8701bool LLParser::parseVAArg(Instruction *&Inst, PerFunctionState &PFS) {
8703 Type *EltTy =
nullptr;
8705 if (parseTypeAndValue(
Op, PFS) ||
8706 parseToken(
lltok::comma,
"expected ',' after vaarg operand") ||
8707 parseType(EltTy, TypeLoc))
8711 return error(TypeLoc,
"va_arg requires operand with first class type");
8713 Inst =
new VAArgInst(
Op, EltTy);
8719bool LLParser::parseExtractElement(Instruction *&Inst, PerFunctionState &PFS) {
8722 if (parseTypeAndValue(Op0, Loc, PFS) ||
8723 parseToken(
lltok::comma,
"expected ',' after extract value") ||
8724 parseTypeAndValue(Op1, PFS))
8728 return error(Loc,
"invalid extractelement operands");
8736bool LLParser::parseInsertElement(Instruction *&Inst, PerFunctionState &PFS) {
8738 Value *Op0, *Op1, *Op2;
8739 if (parseTypeAndValue(Op0, Loc, PFS) ||
8740 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8741 parseTypeAndValue(Op1, PFS) ||
8742 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8743 parseTypeAndValue(Op2, PFS))
8747 return error(Loc,
"invalid insertelement operands");
8755bool LLParser::parseShuffleVector(Instruction *&Inst, PerFunctionState &PFS) {
8757 Value *Op0, *Op1, *Op2;
8758 if (parseTypeAndValue(Op0, Loc, PFS) ||
8759 parseToken(
lltok::comma,
"expected ',' after shuffle mask") ||
8760 parseTypeAndValue(Op1, PFS) ||
8761 parseToken(
lltok::comma,
"expected ',' after shuffle value") ||
8762 parseTypeAndValue(Op2, PFS))
8766 return error(Loc,
"invalid shufflevector operands");
8768 Inst =
new ShuffleVectorInst(Op0, Op1, Op2);
8774int LLParser::parsePHI(Instruction *&Inst, PerFunctionState &PFS) {
8778 if (parseType(Ty, TypeLoc))
8782 return error(TypeLoc,
"phi node must have first class type");
8785 bool AteExtraComma =
false;
8797 AteExtraComma =
true;
8801 if (parseToken(
lltok::lsquare,
"expected '[' in phi value list") ||
8802 parseValue(Ty, Op0, PFS) ||
8803 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8812 for (
const auto &[Val, BB] : PHIVals)
8815 return AteExtraComma ? InstExtraComma : InstNormal;
8824bool LLParser::parseLandingPad(Instruction *&Inst, PerFunctionState &PFS) {
8827 if (parseType(Ty, TyLoc))
8840 return tokError(
"expected 'catch' or 'filter' clause type");
8844 if (parseTypeAndValue(V, VLoc, PFS))
8851 return error(VLoc,
"'catch' clause has an invalid type");
8854 return error(VLoc,
"'filter' clause has an invalid type");
8859 return error(VLoc,
"clause argument must be a constant");
8863 Inst = LP.release();
8869bool LLParser::parseFreeze(Instruction *&Inst, PerFunctionState &PFS) {
8872 if (parseTypeAndValue(
Op, Loc, PFS))
8875 Inst =
new FreezeInst(
Op);
8888bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS,
8890 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8891 std::vector<unsigned> FwdRefAttrGrps;
8893 unsigned CallAddrSpace;
8895 Type *RetType =
nullptr;
8900 LocTy CallLoc = Lex.getLoc();
8904 "expected 'tail call', 'musttail call', or 'notail call'"))
8907 FastMathFlags FMF = EatFastMathFlagsIfPresent();
8909 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8910 parseOptionalProgramAddrSpace(CallAddrSpace) ||
8911 parseType(RetType, RetTypeLoc,
true ) ||
8912 parseValID(CalleeID, &PFS) ||
8914 PFS.getFunction().isVarArg()) ||
8915 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false, BuiltinLoc) ||
8916 parseOptionalOperandBundles(BundleList, PFS))
8923 if (resolveFunctionType(RetType, ArgList, Ty))
8924 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8930 if (convertValIDToValue(
PointerType::get(Context, CallAddrSpace), CalleeID,
8937 SmallVector<Value*, 8>
Args;
8943 for (
const ParamInfo &Arg : ArgList) {
8944 Type *ExpectedTy =
nullptr;
8947 }
else if (!Ty->isVarArg()) {
8948 return error(Arg.Loc,
"too many arguments specified");
8951 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8952 return error(Arg.Loc,
"argument is not of expected type '" +
8954 Args.push_back(Arg.V);
8955 Attrs.push_back(Arg.Attrs);
8959 return error(CallLoc,
"not enough parameters specified for call");
8972 return error(CallLoc,
"fast-math-flags specified for call without "
8973 "floating-point scalar or vector return type");
8980 if (SeenNewDbgInfoFormat) {
8982 return error(CallLoc,
"llvm.dbg intrinsic should not appear in a module "
8983 "using non-intrinsic debug info");
8985 SeenOldDbgInfoFormat =
true;
8988 ForwardRefAttrGroups[CI] = FwdRefAttrGrps;
9000int LLParser::parseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
9002 LocTy SizeLoc, TyLoc, ASLoc;
9004 unsigned AddrSpace = 0;
9007 bool IsInAlloca = EatIfPresent(lltok::kw_inalloca);
9008 bool IsSwiftError = EatIfPresent(lltok::kw_swifterror);
9010 if (parseType(Ty, TyLoc))
9014 return error(TyLoc,
"invalid type for alloca");
9016 bool AteExtraComma =
false;
9018 if (Lex.getKind() == lltok::kw_align) {
9019 if (parseOptionalAlignment(Alignment))
9021 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
9024 ASLoc = Lex.getLoc();
9025 if (parseOptionalAddrSpace(AddrSpace))
9028 AteExtraComma =
true;
9030 if (parseTypeAndValue(
Size, SizeLoc, PFS))
9033 if (Lex.getKind() == lltok::kw_align) {
9034 if (parseOptionalAlignment(Alignment))
9036 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
9039 ASLoc = Lex.getLoc();
9040 if (parseOptionalAddrSpace(AddrSpace))
9043 AteExtraComma =
true;
9049 if (
Size && !
Size->getType()->isIntegerTy())
9050 return error(SizeLoc,
"element count must have integer type");
9052 SmallPtrSet<Type *, 4> Visited;
9053 if (!Alignment && !Ty->
isSized(&Visited))
9054 return error(TyLoc,
"Cannot allocate unsized type");
9056 Alignment = M->getDataLayout().getPrefTypeAlign(Ty);
9057 AllocaInst *AI =
new AllocaInst(Ty, AddrSpace,
Size, *Alignment);
9061 return AteExtraComma ? InstExtraComma : InstNormal;
9068int LLParser::parseLoad(Instruction *&Inst, PerFunctionState &PFS) {
9071 bool AteExtraComma =
false;
9081 bool isVolatile =
false;
9087 bool IsElementwise =
false;
9089 IsElementwise =
true;
9094 LocTy ExplicitTypeLoc = Lex.getLoc();
9095 if (parseType(Ty) ||
9096 parseToken(
lltok::comma,
"expected comma after load's type") ||
9097 parseTypeAndValue(Val, Loc, PFS) ||
9098 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
9099 parseOptionalCommaAlign(Alignment, AteExtraComma))
9103 return error(Loc,
"load operand must be a pointer to a first class type");
9105 if (IsElementwise && !isAtomic)
9106 return error(Loc,
"elementwise load must be atomic");
9109 return error(ExplicitTypeLoc,
9110 "atomic elementwise load operand must have fixed vector type");
9112 if (isAtomic && !Alignment)
9113 return error(Loc,
"atomic load must have explicit non-zero alignment");
9117 return error(Loc,
"atomic load cannot use Release ordering");
9120 "atomic elementwise load cannot be sequentially consistent");
9122 SmallPtrSet<Type *, 4> Visited;
9123 if (!Alignment && !Ty->
isSized(&Visited))
9124 return error(ExplicitTypeLoc,
"loading unsized types is not allowed");
9126 Alignment = M->getDataLayout().getABITypeAlign(Ty);
9127 Inst =
new LoadInst(Ty, Val,
"",
9129 SSID, IsElementwise},
9131 return AteExtraComma ? InstExtraComma : InstNormal;
9139int LLParser::parseStore(Instruction *&Inst, PerFunctionState &PFS) {
9143 bool AteExtraComma =
false;
9153 bool isVolatile =
false;
9159 bool IsElementwise =
false;
9161 IsElementwise =
true;
9165 if (parseTypeAndValue(Val, Loc, PFS) ||
9166 parseToken(
lltok::comma,
"expected ',' after store operand") ||
9167 parseTypeAndValue(Ptr, PtrLoc, PFS) ||
9168 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
9169 parseOptionalCommaAlign(Alignment, AteExtraComma))
9173 return error(PtrLoc,
"store operand must be a pointer");
9175 return error(Loc,
"store operand must be a first class value");
9176 if (isAtomic && !Alignment)
9177 return error(Loc,
"atomic store must have explicit non-zero alignment");
9180 return error(Loc,
"atomic store cannot use Acquire ordering");
9182 if (IsElementwise && !isAtomic)
9183 return error(Loc,
"elementwise store must be atomic");
9187 Loc,
"atomic elementwise store operand must have fixed vector type");
9191 "atomic elementwise store cannot be sequentially consistent");
9193 SmallPtrSet<Type *, 4> Visited;
9195 return error(Loc,
"storing unsized types is not allowed");
9199 Inst =
new StoreInst(Val, Ptr,
9201 SSID, IsElementwise},
9203 return AteExtraComma ? InstExtraComma : InstNormal;
9210int LLParser::parseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {
9212 bool AteExtraComma =
false;
9216 bool isVolatile =
false;
9217 bool isWeak =
false;
9226 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
9227 parseToken(
lltok::comma,
"expected ',' after cmpxchg address") ||
9228 parseTypeAndValue(Cmp, CmpLoc, PFS) ||
9229 parseToken(
lltok::comma,
"expected ',' after cmpxchg cmp operand") ||
9230 parseTypeAndValue(New, NewLoc, PFS) ||
9231 parseScopeAndOrdering(
true , SSID, SuccessOrdering) ||
9232 parseOrdering(FailureOrdering) ||
9233 parseOptionalCommaAlign(Alignment, AteExtraComma))
9237 return tokError(
"invalid cmpxchg success ordering");
9239 return tokError(
"invalid cmpxchg failure ordering");
9241 return error(PtrLoc,
"cmpxchg operand must be a pointer");
9242 if (
Cmp->getType() !=
New->getType())
9243 return error(NewLoc,
"compare value and new value type do not match");
9244 if (!
New->getType()->isFirstClassType())
9245 return error(NewLoc,
"cmpxchg operand must be a first class value");
9247 const Align DefaultAlignment(
9248 PFS.getFunction().getDataLayout().getTypeStoreSize(
9251 AtomicCmpXchgInst *CXI =
9252 new AtomicCmpXchgInst(Ptr, Cmp, New,
Alignment.value_or(DefaultAlignment),
9253 SuccessOrdering, FailureOrdering, SSID);
9258 return AteExtraComma ? InstExtraComma : InstNormal;
9265int LLParser::parseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {
9267 bool AteExtraComma =
false;
9271 bool IsElementwise =
false;
9279 IsElementwise =
true;
9281 switch (Lex.getKind()) {
9283 return tokError(
"expected binary operation in atomicrmw");
9342 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
9343 parseToken(
lltok::comma,
"expected ',' after atomicrmw address") ||
9344 parseTypeAndValue(Val, ValLoc, PFS) ||
9345 parseScopeAndOrdering(
true , SSID, Ordering) ||
9346 parseOptionalCommaAlign(Alignment, AteExtraComma))
9350 return tokError(
"atomicrmw cannot be unordered");
9352 return tokError(
"atomicrmw elementwise cannot be sequentially consistent");
9354 return error(PtrLoc,
"atomicrmw operand must be a pointer");
9356 return error(ValLoc,
"atomicrmw operand may not be scalable");
9359 if (IsElementwise) {
9361 return error(ValLoc,
9362 "atomicrmw elementwise operand must be a fixed vector type");
9371 " operand must be an integer type, a floating-point type, a "
9372 "pointer type, or a fixed vector of any of these types");
9376 return error(ValLoc,
"atomicrmw " +
9378 " operand must be a floating point or fixed "
9379 "vector of floating point type");
9386 " operand must be an integer or fixed vector of integer type");
9391 PFS.getFunction().getDataLayout().getTypeStoreSizeInBits(ValTy);
9393 return error(ValLoc,
9394 "atomicrmw operand must have a power-of-two byte size");
9395 const Align DefaultAlignment(
9396 PFS.getFunction().getDataLayout().getTypeStoreSize(Val->
getType()));
9397 AtomicRMWInst *RMWI =
new AtomicRMWInst(
Operation, Ptr, Val,
9399 Ordering, SSID, IsElementwise);
9402 return AteExtraComma ? InstExtraComma : InstNormal;
9407int LLParser::parseFence(Instruction *&Inst, PerFunctionState &PFS) {
9410 if (parseScopeAndOrdering(
true , SSID, Ordering))
9414 return tokError(
"fence cannot be unordered");
9416 return tokError(
"fence cannot be monotonic");
9418 Inst =
new FenceInst(Context, Ordering, SSID);
9424int LLParser::parseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
9425 Value *Ptr =
nullptr;
9426 Value *Val =
nullptr;
9442 if (parseType(Ty) ||
9443 parseToken(
lltok::comma,
"expected comma after getelementptr's type") ||
9444 parseTypeAndValue(Ptr, Loc, PFS))
9449 if (!BasePointerType)
9450 return error(Loc,
"base of getelementptr must be a pointer");
9452 SmallVector<Value*, 16> Indices;
9453 bool AteExtraComma =
false;
9456 ElementCount GEPWidth =
BaseType->isVectorTy()
9462 AteExtraComma =
true;
9465 if (parseTypeAndValue(Val, EltLoc, PFS))
9468 return error(EltLoc,
"getelementptr index must be an integer");
9471 ElementCount ValNumEl = ValVTy->getElementCount();
9475 "getelementptr vector index has a wrong number of elements");
9476 GEPWidth = ValNumEl;
9481 SmallPtrSet<Type*, 4> Visited;
9483 return error(Loc,
"base element of getelementptr must be sized");
9487 return error(Loc,
"getelementptr cannot target structure that contains "
9488 "scalable vector type");
9491 return error(Loc,
"invalid getelementptr indices");
9494 GEP->setNoWrapFlags(NW);
9495 return AteExtraComma ? InstExtraComma : InstNormal;
9500int LLParser::parseExtractValue(Instruction *&Inst, PerFunctionState &PFS) {
9502 SmallVector<unsigned, 4> Indices;
9504 if (parseTypeAndValue(Val, Loc, PFS) ||
9505 parseIndexList(Indices, AteExtraComma))
9509 return error(Loc,
"extractvalue operand must be aggregate type");
9512 return error(Loc,
"invalid indices for extractvalue");
9514 return AteExtraComma ? InstExtraComma : InstNormal;
9519int LLParser::parseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
9521 SmallVector<unsigned, 4> Indices;
9523 if (parseTypeAndValue(Val0, Loc0, PFS) ||
9524 parseToken(
lltok::comma,
"expected comma after insertvalue operand") ||
9525 parseTypeAndValue(Val1, Loc1, PFS) ||
9526 parseIndexList(Indices, AteExtraComma))
9530 return error(Loc0,
"insertvalue operand must be aggregate type");
9534 return error(Loc0,
"invalid indices for insertvalue");
9535 if (IndexedType != Val1->
getType())
9536 return error(Loc1,
"insertvalue operand and field disagree in type: '" +
9540 return AteExtraComma ? InstExtraComma : InstNormal;
9551bool LLParser::parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts) {
9566 if (parseMetadata(MD,
nullptr))
9571 return parseToken(
lltok::rbrace,
"expected end of metadata node");
9577bool LLParser::sortUseListOrder(
Value *V, ArrayRef<unsigned> Indexes,
9579 if (!
V->hasUseList())
9582 return error(Loc,
"value has no uses");
9584 unsigned NumUses = 0;
9585 SmallDenseMap<const Use *, unsigned, 16> Order;
9586 for (
const Use &U :
V->uses()) {
9587 if (++NumUses > Indexes.
size())
9589 Order[&
U] = Indexes[NumUses - 1];
9592 return error(Loc,
"value only has one use");
9593 if (Order.
size() != Indexes.
size() || NumUses > Indexes.
size())
9595 "wrong number of indexes, expected " + Twine(
V->getNumUses()));
9597 V->sortUseList([&](
const Use &L,
const Use &R) {
9605bool LLParser::parseUseListOrderIndexes(SmallVectorImpl<unsigned> &Indexes) {
9606 SMLoc Loc = Lex.getLoc();
9610 return tokError(
"expected non-empty list of uselistorder indexes");
9617 bool IsOrdered =
true;
9618 assert(Indexes.
empty() &&
"Expected empty order vector");
9621 if (parseUInt32(Index))
9626 Max = std::max(Max, Index);
9627 IsOrdered &= Index == Indexes.
size();
9635 if (Indexes.
size() < 2)
9636 return error(Loc,
"expected >= 2 uselistorder indexes");
9639 "expected distinct uselistorder indexes in range [0, size)");
9641 return error(Loc,
"expected uselistorder indexes to change the order");
9648bool LLParser::parseUseListOrder(PerFunctionState *PFS) {
9649 SMLoc Loc = Lex.getLoc();
9654 SmallVector<unsigned, 16> Indexes;
9655 if (parseTypeAndValue(V, PFS) ||
9656 parseToken(
lltok::comma,
"expected comma in uselistorder directive") ||
9657 parseUseListOrderIndexes(Indexes))
9660 return sortUseListOrder(V, Indexes, Loc);
9666bool LLParser::parseModuleEntry(
unsigned ID) {
9675 parseStringConstant(Path) ||
9683 if (parseUInt32(Hash[0]) || parseToken(
lltok::comma,
"expected ',' here") ||
9684 parseUInt32(Hash[1]) || parseToken(
lltok::comma,
"expected ',' here") ||
9685 parseUInt32(Hash[2]) || parseToken(
lltok::comma,
"expected ',' here") ||
9686 parseUInt32(Hash[3]) || parseToken(
lltok::comma,
"expected ',' here") ||
9687 parseUInt32(Hash[4]))
9694 auto ModuleEntry = Index->addModule(Path, Hash);
9695 ModuleIdMap[
ID] = ModuleEntry->first();
9702bool LLParser::parseTypeIdEntry(
unsigned ID) {
9711 parseStringConstant(Name))
9714 TypeIdSummary &TIS = Index->getOrInsertTypeIdSummary(Name);
9716 parseTypeIdSummary(TIS) || parseToken(
lltok::rparen,
"expected ')' here"))
9721 auto FwdRefTIDs = ForwardRefTypeIds.find(ID);
9722 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9723 for (
auto TIDRef : FwdRefTIDs->second) {
9725 "Forward referenced type id GUID expected to be 0");
9728 ForwardRefTypeIds.erase(FwdRefTIDs);
9736bool LLParser::parseTypeIdSummary(TypeIdSummary &TIS) {
9740 parseTypeTestResolution(TIS.
TTRes))
9745 if (parseOptionalWpdResolutions(TIS.
WPDRes))
9762bool LLParser::parseTypeIdCompatibleVtableEntry(
unsigned ID) {
9771 parseStringConstant(Name))
9775 Index->getOrInsertTypeIdCompatibleVtableSummary(Name);
9782 IdToIndexMapType IdToIndexMap;
9795 if (parseGVReference(VI, GVId))
9802 IdToIndexMap[GVId].push_back(std::make_pair(TI.size(),
Loc));
9803 TI.push_back({
Offset, VI});
9811 for (
auto I : IdToIndexMap) {
9812 auto &Infos = ForwardRefValueInfos[
I.first];
9813 for (
auto P :
I.second) {
9815 "Forward referenced ValueInfo expected to be empty");
9816 Infos.emplace_back(&TI[
P.first].VTableVI,
P.second);
9826 auto FwdRefTIDs = ForwardRefTypeIds.find(ID);
9827 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9828 for (
auto TIDRef : FwdRefTIDs->second) {
9830 "Forward referenced type id GUID expected to be 0");
9833 ForwardRefTypeIds.erase(FwdRefTIDs);
9845bool LLParser::parseTypeTestResolution(TypeTestResolution &TTRes) {
9853 switch (Lex.getKind()) {
9873 return error(Lex.getLoc(),
"unexpected TypeTestResolution kind");
9885 switch (Lex.getKind()) {
9900 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(Val))
9913 return error(Lex.getLoc(),
"expected optional TypeTestResolution field");
9926bool LLParser::parseOptionalWpdResolutions(
9927 std::map<uint64_t, WholeProgramDevirtResolution> &WPDResMap) {
9935 WholeProgramDevirtResolution WPDRes;
9939 parseToken(
lltok::comma,
"expected ',' here") || parseWpdRes(WPDRes) ||
9942 WPDResMap[
Offset] = WPDRes;
9959bool LLParser::parseWpdRes(WholeProgramDevirtResolution &WPDRes) {
9967 switch (Lex.getKind()) {
9978 return error(Lex.getLoc(),
"unexpected WholeProgramDevirtResolution kind");
9984 switch (Lex.getKind()) {
9992 if (parseOptionalResByArg(WPDRes.
ResByArg))
9996 return error(Lex.getLoc(),
9997 "expected optional WholeProgramDevirtResolution field");
10014bool LLParser::parseOptionalResByArg(
10015 std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>
10023 std::vector<uint64_t>
Args;
10024 if (parseArgs(Args) || parseToken(
lltok::comma,
"expected ',' here") ||
10032 WholeProgramDevirtResolution::ByArg ByArg;
10033 switch (Lex.getKind()) {
10047 return error(Lex.getLoc(),
10048 "unexpected WholeProgramDevirtResolution::ByArg kind");
10054 switch (Lex.getKind()) {
10058 parseUInt64(ByArg.
Info))
10064 parseUInt32(ByArg.
Byte))
10070 parseUInt32(ByArg.
Bit))
10074 return error(Lex.getLoc(),
10075 "expected optional whole program devirt field");
10082 ResByArg[
Args] = ByArg;
10093bool LLParser::parseArgs(std::vector<uint64_t> &Args) {
10101 if (parseUInt64(Val))
10103 Args.push_back(Val);
10127bool LLParser::addGlobalValueToIndex(
10129 unsigned ID, std::unique_ptr<GlobalValueSummary> Summary,
LocTy Loc) {
10134 VI = Index->getOrInsertValueInfo(GUID);
10138 auto *GV = M->getNamedValue(Name);
10140 return error(Loc,
"Reference to undefined global \"" + Name +
"\"");
10146 VI = Index->getOrInsertValueInfo(GV, GUID);
10150 "Need a source_filename to compute GUID for local");
10153 VI = Index->getOrInsertValueInfo(GUID, Index->saveString(Name));
10158 auto FwdRefVIs = ForwardRefValueInfos.find(ID);
10159 if (FwdRefVIs != ForwardRefValueInfos.end()) {
10160 for (
auto VIRef : FwdRefVIs->second) {
10162 "Forward referenced ValueInfo expected to be empty");
10165 ForwardRefValueInfos.erase(FwdRefVIs);
10169 auto FwdRefAliasees = ForwardRefAliasees.find(ID);
10170 if (FwdRefAliasees != ForwardRefAliasees.end()) {
10171 for (
auto AliaseeRef : FwdRefAliasees->second) {
10172 assert(!AliaseeRef.first->hasAliasee() &&
10173 "Forward referencing alias already has aliasee");
10174 assert(Summary &&
"Aliasee must be a definition");
10175 AliaseeRef.first->setAliasee(VI,
Summary.get());
10177 ForwardRefAliasees.erase(FwdRefAliasees);
10182 Index->addGlobalValueSummary(VI, std::move(Summary));