64 "Allow incomplete IR on a best effort basis (references to unknown "
65 "metadata will be dropped)"));
80 if (Context.shouldDiscardValueNames())
83 "Can't read textual IR with a Context that discards named Values");
86 if (parseTargetDefinitions(DataLayoutCallback))
90 return parseTopLevelEntities() || validateEndOfModule(UpgradeDebugInfo) ||
96 restoreParsingState(Slots);
100 if (parseType(Ty) || parseConstantValue(Ty,
C))
103 return error(Lex.getLoc(),
"expected end of string");
109 restoreParsingState(Slots);
113 SMLoc Start = Lex.getLoc();
117 SMLoc End = Lex.getLoc();
125 restoreParsingState(Slots);
129 SMLoc Start = Lex.getLoc();
131 bool Status = parseDIExpressionBody(Result,
false);
132 SMLoc End = Lex.getLoc();
138void LLParser::restoreParsingState(
const SlotMapping *Slots) {
145 std::make_pair(
I.getKey(), std::make_pair(
I.second,
LocTy())));
146 for (
const auto &
I : Slots->
Types)
147 NumberedTypes.insert(
148 std::make_pair(
I.first, std::make_pair(
I.second,
LocTy())));
154 II->getIntrinsicID() != Intrinsic::experimental_noalias_scope_decl)
161 if (MD->isTemporary())
165 assert(
II->use_empty() &&
"Cannot have uses");
166 II->eraseFromParent();
175void LLParser::dropUnknownMetadataReferences() {
176 auto Pred = [](
unsigned MDKind, MDNode *
Node) {
return Node->isTemporary(); };
177 for (Function &
F : *M) {
178 F.eraseMetadataIf(Pred);
180 I.eraseMetadataIf(Pred);
187 for (GlobalVariable &GV : M->globals())
188 GV.eraseMetadataIf(Pred);
193 if (
Info.first->getNumTemporaryUses() == 1) {
194 NumberedMetadata.erase(
ID);
195 ForwardRefMDNodes.erase(
ID);
208 assert(!(SeenNewDbgInfoFormat && SeenOldDbgInfoFormat) &&
209 "Mixed debug intrinsics/records seen without a parsing error?");
212 for (
const auto &RAG : ForwardRefAttrGroups) {
214 const std::vector<unsigned> &
Attrs = RAG.second;
215 AttrBuilder
B(Context);
217 for (
const auto &Attr : Attrs) {
218 auto R = NumberedAttrBuilders.find(Attr);
219 if (R != NumberedAttrBuilders.end())
224 AttributeList AS = Fn->getAttributes();
225 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
226 AS = AS.removeFnAttributes(Context);
232 if (MaybeAlign
A = FnAttrs.getAlignment()) {
233 Fn->setAlignment(*
A);
234 FnAttrs.removeAttribute(Attribute::Alignment);
237 AS = AS.addFnAttributes(Context, FnAttrs);
238 Fn->setAttributes(AS);
240 AttributeList AS = CI->getAttributes();
241 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
242 AS = AS.removeFnAttributes(Context);
244 AS = AS.addFnAttributes(Context, FnAttrs);
245 CI->setAttributes(AS);
247 AttributeList AS =
II->getAttributes();
248 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
249 AS = AS.removeFnAttributes(Context);
251 AS = AS.addFnAttributes(Context, FnAttrs);
252 II->setAttributes(AS);
254 AttributeList AS = CBI->getAttributes();
255 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
256 AS = AS.removeFnAttributes(Context);
258 AS = AS.addFnAttributes(Context, FnAttrs);
259 CBI->setAttributes(AS);
261 AttrBuilder
Attrs(M->getContext(), GV->getAttributes());
271 if (!ForwardRefBlockAddresses.empty())
272 return error(ForwardRefBlockAddresses.begin()->first.Loc,
273 "expected function name in blockaddress");
275 auto ResolveForwardRefDSOLocalEquivalents = [&](
const ValID &GVRef,
276 GlobalValue *FwdRef) {
277 GlobalValue *GV =
nullptr;
279 GV = M->getNamedValue(GVRef.
StrVal);
281 GV = NumberedVals.get(GVRef.
UIntVal);
286 "' referenced by dso_local_equivalent");
290 "expected a function, alias to function, or ifunc "
291 "in dso_local_equivalent");
294 FwdRef->replaceAllUsesWith(Equiv);
295 FwdRef->eraseFromParent();
302 for (
auto &Iter : ForwardRefDSOLocalEquivalentIDs) {
303 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
306 for (
auto &Iter : ForwardRefDSOLocalEquivalentNames) {
307 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
310 ForwardRefDSOLocalEquivalentIDs.clear();
311 ForwardRefDSOLocalEquivalentNames.clear();
313 for (
const auto &NT : NumberedTypes)
314 if (
NT.second.second.isValid())
316 "use of undefined type '%" + Twine(
NT.first) +
"'");
318 for (StringMap<std::pair<Type*, LocTy> >::iterator
I =
319 NamedTypes.begin(),
E = NamedTypes.end();
I !=
E; ++
I)
320 if (
I->second.second.isValid())
321 return error(
I->second.second,
322 "use of undefined type named '" +
I->getKey() +
"'");
324 if (!ForwardRefComdats.empty())
325 return error(ForwardRefComdats.begin()->second,
326 "use of undefined comdat '$" +
327 ForwardRefComdats.begin()->first +
"'");
345 if (!CB || !CB->isCallee(&U))
346 return error(
Info.second,
"intrinsic can only be used as callee");
351 return error(
Info.second,
"invalid intrinsic signature");
356 Info.first->eraseFromParent();
357 ForwardRefVals.erase(Name);
366 auto GetCommonFunctionType = [](
Value *
V) -> FunctionType * {
367 FunctionType *FTy =
nullptr;
368 for (Use &U :
V->uses()) {
370 if (!CB || !CB->isCallee(&U) || (FTy && FTy != CB->getFunctionType()))
372 FTy = CB->getFunctionType();
380 Type *Ty = GetCommonFunctionType(
Info.first);
388 GV =
new GlobalVariable(*M, Ty,
false,
391 Info.first->replaceAllUsesWith(GV);
392 Info.first->eraseFromParent();
393 ForwardRefVals.erase(Name);
396 if (!ForwardRefVals.empty())
397 return error(ForwardRefVals.begin()->second.second,
398 "use of undefined value '@" + ForwardRefVals.begin()->first +
401 if (!ForwardRefValIDs.empty())
402 return error(ForwardRefValIDs.begin()->second.second,
403 "use of undefined value '@" +
404 Twine(ForwardRefValIDs.begin()->first) +
"'");
407 dropUnknownMetadataReferences();
409 if (!ForwardRefMDNodes.empty())
410 return error(ForwardRefMDNodes.begin()->second.second,
411 "use of undefined metadata '!" +
412 Twine(ForwardRefMDNodes.begin()->first) +
"'");
415 for (
auto &
N : NumberedMetadata) {
416 if (
N.second && !
N.second->isResolved())
417 N.second->resolveCycles();
420 for (
auto *Inst : InstsWithTBAATag) {
421 MDNode *MD = Inst->getMetadata(LLVMContext::MD_tbaa);
424 assert(MD &&
"UpgradeInstWithTBAATag should have a TBAA tag");
427 if (MD != UpgradedMD)
428 Inst->setMetadata(LLVMContext::MD_tbaa, UpgradedMD);
437 if (UpgradeDebugInfo)
449 Slots->GlobalValues = std::move(NumberedVals);
450 Slots->MetadataNodes = std::move(NumberedMetadata);
451 for (
const auto &
I : NamedTypes)
452 Slots->NamedTypes.insert(std::make_pair(
I.getKey(),
I.second.first));
453 for (
const auto &
I : NumberedTypes)
454 Slots->Types.insert(std::make_pair(
I.first,
I.second.first));
460bool LLParser::validateEndOfIndex() {
464 if (!ForwardRefValueInfos.empty())
465 return error(ForwardRefValueInfos.begin()->second.front().second,
466 "use of undefined summary '^" +
467 Twine(ForwardRefValueInfos.begin()->first) +
"'");
469 if (!ForwardRefAliasees.empty())
470 return error(ForwardRefAliasees.begin()->second.front().second,
471 "use of undefined summary '^" +
472 Twine(ForwardRefAliasees.begin()->first) +
"'");
474 if (!ForwardRefTypeIds.empty())
475 return error(ForwardRefTypeIds.begin()->second.front().second,
476 "use of undefined type id summary '^" +
477 Twine(ForwardRefTypeIds.begin()->first) +
"'");
491 std::string TentativeDLStr = M->getDataLayoutStr();
496 switch (Lex.getKind()) {
498 if (parseTargetDefinition(TentativeDLStr, DLStrLoc))
502 if (parseSourceFileName())
511 if (
auto LayoutOverride =
512 DataLayoutCallback(M->getTargetTriple().str(), TentativeDLStr)) {
513 TentativeDLStr = *LayoutOverride;
519 M->setDataLayout(MaybeDL.
get());
523bool LLParser::parseTopLevelEntities() {
527 switch (Lex.getKind()) {
531 if (parseSummaryEntry())
535 if (parseSourceFileName())
545 switch (Lex.getKind()) {
547 return tokError(
"expected top-level entity");
558 if (parseModuleAsm())
562 if (parseUnnamedType())
566 if (parseNamedType())
570 if (parseUnnamedGlobal())
574 if (parseNamedGlobal())
579 if (parseStandaloneMetadata())
583 if (parseSummaryEntry())
587 if (parseNamedMetadata())
591 if (parseUnnamedAttrGrp())
595 if (parseUseListOrder())
599 if (parseUseListOrderBB())
608bool LLParser::parseModuleAsm() {
614 parseStringConstant(AsmStr))
617 M->appendModuleInlineAsm(AsmStr);
624bool LLParser::parseTargetDefinition(std::string &TentativeDLStr,
630 return tokError(
"unknown target property");
633 if (parseToken(
lltok::equal,
"expected '=' after target triple") ||
634 parseStringConstant(Str))
636 M->setTargetTriple(Triple(std::move(Str)));
640 if (parseToken(
lltok::equal,
"expected '=' after target datalayout"))
642 DLStrLoc = Lex.getLoc();
643 if (parseStringConstant(TentativeDLStr))
651bool LLParser::parseSourceFileName() {
654 if (parseToken(
lltok::equal,
"expected '=' after source_filename") ||
655 parseStringConstant(SourceFileName))
658 M->setSourceFileName(SourceFileName);
664bool LLParser::parseUnnamedType() {
665 LocTy TypeLoc = Lex.getLoc();
666 unsigned TypeID = Lex.getUIntVal();
669 if (parseToken(
lltok::equal,
"expected '=' after name") ||
674 if (parseStructDefinition(TypeLoc,
"", NumberedTypes[
TypeID], Result))
678 std::pair<Type*, LocTy> &
Entry = NumberedTypes[
TypeID];
680 return error(TypeLoc,
"non-struct types may not be recursive");
682 Entry.second = SMLoc();
690bool LLParser::parseNamedType() {
691 std::string
Name = Lex.getStrVal();
692 LocTy NameLoc = Lex.getLoc();
695 if (parseToken(
lltok::equal,
"expected '=' after name") ||
700 if (parseStructDefinition(NameLoc, Name, NamedTypes[Name], Result))
704 std::pair<Type*, LocTy> &
Entry = NamedTypes[
Name];
706 return error(NameLoc,
"non-struct types may not be recursive");
708 Entry.second = SMLoc();
716bool LLParser::parseDeclare() {
720 std::vector<std::pair<unsigned, MDNode *>> MDs;
724 if (parseMetadataAttachment(MDK,
N))
726 MDs.push_back({MDK,
N});
730 unsigned FunctionNumber = -1;
731 SmallVector<unsigned> UnnamedArgNums;
732 if (parseFunctionHeader(
F,
false, FunctionNumber, UnnamedArgNums))
735 F->addMetadata(MD.first, *MD.second);
741bool LLParser::parseDefine() {
746 unsigned FunctionNumber = -1;
747 SmallVector<unsigned> UnnamedArgNums;
748 return parseFunctionHeader(
F,
true, FunctionNumber, UnnamedArgNums) ||
749 parseOptionalFunctionMetadata(*
F) ||
750 parseFunctionBody(*
F, FunctionNumber, UnnamedArgNums);
756bool LLParser::parseGlobalType(
bool &IsConstant) {
763 return tokError(
"expected 'global' or 'constant'");
769bool LLParser::parseOptionalUnnamedAddr(
790bool LLParser::parseUnnamedGlobal() {
793 LocTy NameLoc = Lex.getLoc();
797 VarID = Lex.getUIntVal();
798 if (checkValueID(NameLoc,
"global",
"@", NumberedVals.getNext(),
VarID))
802 if (parseToken(
lltok::equal,
"expected '=' after name"))
805 VarID = NumberedVals.getNext();
809 unsigned Linkage, Visibility, DLLStorageClass;
813 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
815 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
818 switch (Lex.getKind()) {
820 return parseGlobal(Name,
VarID, NameLoc,
Linkage, HasLinkage, Visibility,
821 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
824 return parseAliasOrIFunc(Name,
VarID, NameLoc,
Linkage, Visibility,
825 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
834bool LLParser::parseNamedGlobal() {
836 LocTy NameLoc = Lex.getLoc();
837 std::string
Name = Lex.getStrVal();
841 unsigned Linkage, Visibility, DLLStorageClass;
845 if (parseToken(
lltok::equal,
"expected '=' in global variable") ||
846 parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
848 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
851 switch (Lex.getKind()) {
853 return parseGlobal(Name, -1, NameLoc,
Linkage, HasLinkage, Visibility,
854 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
857 return parseAliasOrIFunc(Name, -1, NameLoc,
Linkage, Visibility,
858 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
862bool LLParser::parseComdat() {
864 std::string
Name = Lex.getStrVal();
865 LocTy NameLoc = Lex.getLoc();
872 return tokError(
"expected comdat type");
875 switch (Lex.getKind()) {
877 return tokError(
"unknown selection kind");
899 if (
I != ComdatSymTab.
end() && !ForwardRefComdats.erase(Name))
900 return error(NameLoc,
"redefinition of comdat '$" + Name +
"'");
903 if (
I != ComdatSymTab.
end())
906 C = M->getOrInsertComdat(Name);
907 C->setSelectionKind(SK);
914bool LLParser::parseMDString(
MDString *&Result) {
916 if (parseStringConstant(Str))
924bool LLParser::parseMDNodeID(
MDNode *&Result) {
926 LocTy IDLoc = Lex.getLoc();
928 if (parseUInt32(MID))
932 auto [It,
Inserted] = NumberedMetadata.try_emplace(MID);
939 auto &FwdRef = ForwardRefMDNodes[MID];
942 Result = FwdRef.first.get();
943 It->second.reset(Result);
949bool LLParser::parseNamedMetadata() {
951 std::string
Name = Lex.getStrVal();
959 NamedMDNode *NMD = M->getOrInsertNamedMetadata(Name);
967 Lex.getStrVal() ==
"DIExpression") {
968 if (parseDIExpression(
N,
false))
973 Lex.getStrVal() ==
"DIArgList") {
974 return tokError(
"found DIArgList outside of function");
982 return parseToken(
lltok::rbrace,
"expected end of metadata node");
987bool LLParser::parseStandaloneMetadata() {
990 unsigned MetadataID = 0;
993 if (parseUInt32(MetadataID) || parseToken(
lltok::equal,
"expected '=' here"))
998 return tokError(
"unexpected type in metadata definition");
1002 if (parseSpecializedMDNode(Init, IsDistinct))
1005 parseMDTuple(Init, IsDistinct))
1009 auto FI = ForwardRefMDNodes.find(MetadataID);
1010 if (FI != ForwardRefMDNodes.end()) {
1011 auto *ToReplace = FI->second.first.get();
1015 for (
auto *Inst : TempDIAssignIDAttachments[ToReplace]) {
1016 assert(!Inst->getMetadata(LLVMContext::MD_DIAssignID) &&
1017 "Inst unexpectedly already has DIAssignID attachment");
1018 Inst->setMetadata(LLVMContext::MD_DIAssignID, Init);
1022 ToReplace->replaceAllUsesWith(Init);
1023 ForwardRefMDNodes.erase(FI);
1025 assert(NumberedMetadata[MetadataID] == Init &&
"Tracking VH didn't work");
1027 auto [It,
Inserted] = NumberedMetadata.try_emplace(MetadataID);
1029 return tokError(
"Metadata id is already used");
1030 It->second.reset(Init);
1037bool LLParser::skipModuleSummaryEntry() {
1047 "Expected 'gv', 'module', 'typeid', 'flags' or 'blockcount' at the "
1048 "start of summary entry");
1050 return parseSummaryIndexFlags();
1052 return parseBlockCount();
1054 if (parseToken(
lltok::colon,
"expected ':' at start of summary entry") ||
1055 parseToken(
lltok::lparen,
"expected '(' at start of summary entry"))
1059 unsigned NumOpenParen = 1;
1061 switch (Lex.getKind()) {
1069 return tokError(
"found end of file while parsing summary entry");
1075 }
while (NumOpenParen > 0);
1081bool LLParser::parseSummaryEntry() {
1087 Lex.setIgnoreColonInIdentifiers(
true);
1095 return skipModuleSummaryEntry();
1097 bool result =
false;
1098 switch (Lex.getKind()) {
1100 result = parseGVEntry(SummaryID);
1103 result = parseModuleEntry(SummaryID);
1106 result = parseTypeIdEntry(SummaryID);
1109 result = parseTypeIdCompatibleVtableEntry(SummaryID);
1112 result = parseSummaryIndexFlags();
1115 result = parseBlockCount();
1118 result =
error(Lex.getLoc(),
"unexpected summary kind");
1121 Lex.setIgnoreColonInIdentifiers(
false);
1155bool LLParser::parseAliasOrIFunc(
const std::string &Name,
unsigned NameID,
1156 LocTy NameLoc,
unsigned L,
unsigned Visibility,
1157 unsigned DLLStorageClass,
bool DSOLocal,
1172 return error(NameLoc,
"invalid linkage type for alias");
1175 return error(NameLoc,
1176 "symbol with local linkage must have default visibility");
1179 return error(NameLoc,
1180 "symbol with local linkage cannot have a DLL storage class");
1183 LocTy ExplicitTypeLoc = Lex.getLoc();
1184 if (parseType(Ty) ||
1185 parseToken(
lltok::comma,
"expected comma after alias or ifunc's type"))
1189 LocTy AliaseeLoc = Lex.getLoc();
1194 if (parseGlobalTypeAndValue(Aliasee))
1199 if (parseValID(
ID,
nullptr))
1202 return error(AliaseeLoc,
"invalid aliasee");
1203 Aliasee =
ID.ConstantVal;
1209 return error(AliaseeLoc,
"An alias or ifunc must have pointer type");
1210 unsigned AddrSpace = PTy->getAddressSpace();
1212 GlobalValue *GVal =
nullptr;
1216 if (!
Name.empty()) {
1217 auto I = ForwardRefVals.find(Name);
1218 if (
I != ForwardRefVals.end()) {
1219 GVal =
I->second.first;
1220 ForwardRefVals.erase(Name);
1221 }
else if (M->getNamedValue(Name)) {
1222 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1225 auto I = ForwardRefValIDs.find(NameID);
1226 if (
I != ForwardRefValIDs.end()) {
1227 GVal =
I->second.first;
1228 ForwardRefValIDs.erase(
I);
1233 std::unique_ptr<GlobalAlias> GA;
1234 std::unique_ptr<GlobalIFunc> GI;
1262 if (parseGlobalObjectMetadataAttachment(*GI.get()))
1265 return tokError(
"unknown alias or ifunc property!");
1270 NumberedVals.add(NameID, GV);
1277 "forward reference and definition of alias have different types");
1287 M->insertAlias(GA.release());
1289 M->insertIFunc(GI.release());
1290 assert(GV->
getName() == Name &&
"Should not be a name conflict!");
1299 case lltok::kw_sanitize_memtag:
1313 switch (Lex.getKind()) {
1315 Meta.NoAddress =
true;
1318 Meta.NoHWAddress =
true;
1320 case lltok::kw_sanitize_memtag:
1324 Meta.IsDynInit =
true;
1327 return tokError(
"non-sanitizer token passed to LLParser::parseSanitizer()");
1347bool LLParser::parseGlobal(
const std::string &Name,
unsigned NameID,
1348 LocTy NameLoc,
unsigned Linkage,
bool HasLinkage,
1349 unsigned Visibility,
unsigned DLLStorageClass,
1353 return error(NameLoc,
1354 "symbol with local linkage must have default visibility");
1357 return error(NameLoc,
1358 "symbol with local linkage cannot have a DLL storage class");
1362 LocTy IsExternallyInitializedLoc;
1366 if (parseOptionalAddrSpace(AddrSpace) ||
1368 IsExternallyInitialized,
1369 &IsExternallyInitializedLoc) ||
1370 parseGlobalType(IsConstant) || parseType(Ty, TyLoc))
1379 if (parseGlobalValue(Ty, Init))
1384 return error(TyLoc,
"invalid type for global variable");
1386 GlobalValue *GVal =
nullptr;
1389 if (!
Name.empty()) {
1390 auto I = ForwardRefVals.find(Name);
1391 if (
I != ForwardRefVals.end()) {
1392 GVal =
I->second.first;
1393 ForwardRefVals.erase(
I);
1394 }
else if (M->getNamedValue(Name)) {
1395 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1400 if (NameID == (
unsigned)-1)
1401 NameID = NumberedVals.getNext();
1403 auto I = ForwardRefValIDs.find(NameID);
1404 if (
I != ForwardRefValIDs.end()) {
1405 GVal =
I->second.first;
1406 ForwardRefValIDs.erase(
I);
1410 GlobalVariable *GV =
new GlobalVariable(
1415 NumberedVals.add(NameID, GV);
1433 "forward reference and definition of global have different types");
1453 }
else if (Lex.getKind() == lltok::kw_align) {
1454 MaybeAlign Alignment;
1455 if (parseOptionalAlignment(Alignment))
1461 if (parseOptionalCodeModel(CodeModel))
1465 if (parseGlobalObjectMetadataAttachment(*GV))
1468 if (parseSanitizer(GV))
1472 if (parseOptionalComdat(Name,
C))
1477 return tokError(
"unknown global variable property!");
1481 AttrBuilder
Attrs(M->getContext());
1483 std::vector<unsigned> FwdRefAttrGrps;
1484 if (parseFnAttributeValuePairs(Attrs, FwdRefAttrGrps,
false, BuiltinLoc))
1486 if (
Attrs.hasAttributes() || !FwdRefAttrGrps.empty()) {
1488 ForwardRefAttrGroups[GV] = FwdRefAttrGrps;
1496bool LLParser::parseUnnamedAttrGrp() {
1498 LocTy AttrGrpLoc = Lex.getLoc();
1502 return tokError(
"expected attribute group id");
1504 unsigned VarID = Lex.getUIntVal();
1505 std::vector<unsigned> unused;
1513 auto R = NumberedAttrBuilders.find(
VarID);
1514 if (R == NumberedAttrBuilders.end())
1515 R = NumberedAttrBuilders.emplace(
VarID, AttrBuilder(M->getContext())).first;
1517 if (parseFnAttributeValuePairs(
R->second, unused,
true, BuiltinLoc) ||
1518 parseToken(
lltok::rbrace,
"expected end of attribute group"))
1521 if (!
R->second.hasAttributes())
1522 return error(AttrGrpLoc,
"attribute group has no attributes");
1529#define GET_ATTR_NAMES
1530#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME) \
1531 case lltok::kw_##DISPLAY_NAME: \
1532 return Attribute::ENUM_NAME;
1533#include "llvm/IR/Attributes.inc"
1542 return parseRequiredTypeAttr(
B, Lex.getKind(), Attr);
1545 case Attribute::Alignment: {
1546 MaybeAlign Alignment;
1554 if (parseOptionalAlignment(Alignment,
true))
1557 B.addAlignmentAttr(Alignment);
1560 case Attribute::StackAlignment: {
1565 parseUInt32(Alignment))
1568 if (parseOptionalStackAlignment(Alignment))
1571 B.addStackAlignmentAttr(Alignment);
1574 case Attribute::AllocSize: {
1575 unsigned ElemSizeArg;
1576 std::optional<unsigned> NumElemsArg;
1577 if (parseAllocSizeArguments(ElemSizeArg, NumElemsArg))
1579 B.addAllocSizeAttr(ElemSizeArg, NumElemsArg);
1582 case Attribute::VScaleRange: {
1583 unsigned MinValue, MaxValue;
1584 if (parseVScaleRangeArguments(MinValue, MaxValue))
1586 B.addVScaleRangeAttr(MinValue,
1587 MaxValue > 0 ? MaxValue : std::optional<unsigned>());
1590 case Attribute::Dereferenceable: {
1592 if (parseOptionalDerefAttrBytes(lltok::kw_dereferenceable, Bytes))
1594 B.addDereferenceableAttr(Bytes);
1597 case Attribute::DereferenceableOrNull: {
1599 if (parseOptionalDerefAttrBytes(lltok::kw_dereferenceable_or_null, Bytes))
1601 B.addDereferenceableOrNullAttr(Bytes);
1604 case Attribute::UWTable: {
1606 if (parseOptionalUWTableKind(Kind))
1608 B.addUWTableAttr(Kind);
1611 case Attribute::AllocKind: {
1613 if (parseAllocKind(Kind))
1615 B.addAllocKindAttr(Kind);
1618 case Attribute::Memory: {
1619 std::optional<MemoryEffects> ME = parseMemoryAttr();
1622 B.addMemoryAttr(*ME);
1625 case Attribute::NoFPClass: {
1628 B.addNoFPClassAttr(NoFPClass);
1634 case Attribute::Range:
1635 return parseRangeAttr(
B);
1636 case Attribute::Initializes:
1637 return parseInitializesAttr(
B);
1638 case Attribute::Captures:
1639 return parseCapturesAttr(
B);
1641 B.addAttribute(Attr);
1649 case lltok::kw_readnone:
1652 case lltok::kw_readonly:
1655 case lltok::kw_writeonly:
1674bool LLParser::parseFnAttributeValuePairs(AttrBuilder &
B,
1675 std::vector<unsigned> &FwdRefAttrGrps,
1676 bool InAttrGrp, LocTy &BuiltinLoc) {
1677 bool HaveError =
false;
1688 if (parseStringAttribute(
B))
1700 "cannot have an attribute group reference in an attribute group");
1703 FwdRefAttrGrps.push_back(Lex.getUIntVal());
1709 SMLoc Loc = Lex.getLoc();
1710 if (Token == lltok::kw_builtin)
1722 return error(Lex.getLoc(),
"unterminated attribute group");
1725 if (parseEnumAttribute(Attr,
B, InAttrGrp))
1732 HaveError |=
error(Loc,
"this attribute does not apply to functions");
1736 B.addMemoryAttr(ME);
1750 PTy->getAddressSpace());
1759 error(Loc,
"'" + Name +
"' is not a basic block");
1761 error(Loc,
"'" + Name +
"' defined with type '" +
1774 error(Loc,
"global variable reference must have pointer type");
1785 auto I = ForwardRefVals.find(Name);
1786 if (
I != ForwardRefVals.end())
1787 Val =
I->second.first;
1793 checkValidVariableType(Loc,
"@" + Name, Ty, Val));
1797 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
1804 error(Loc,
"global variable reference must have pointer type");
1808 GlobalValue *Val = NumberedVals.get(
ID);
1813 auto I = ForwardRefValIDs.find(
ID);
1814 if (
I != ForwardRefValIDs.end())
1815 Val =
I->second.first;
1821 checkValidVariableType(Loc,
"@" + Twine(
ID), Ty, Val));
1825 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
1833Comdat *LLParser::getComdat(
const std::string &Name, LocTy
Loc) {
1837 if (
I != ComdatSymTab.
end())
1841 Comdat *
C = M->getOrInsertComdat(Name);
1842 ForwardRefComdats[
Name] = Loc;
1852bool LLParser::parseToken(
lltok::Kind T,
const char *ErrMsg) {
1853 if (Lex.getKind() !=
T)
1854 return tokError(ErrMsg);
1861bool LLParser::parseStringConstant(std::string &Result) {
1863 return tokError(
"expected string constant");
1864 Result = Lex.getStrVal();
1871bool LLParser::parseUInt32(uint32_t &Val) {
1872 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1873 return tokError(
"expected integer");
1874 uint64_t Val64 = Lex.getAPSIntVal().getLimitedValue(0xFFFFFFFFULL+1);
1875 if (Val64 !=
unsigned(Val64))
1876 return tokError(
"expected 32-bit integer (too large)");
1884bool LLParser::parseUInt64(uint64_t &Val) {
1885 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1886 return tokError(
"expected integer");
1887 Val = Lex.getAPSIntVal().getLimitedValue();
1897 switch (Lex.getKind()) {
1899 return tokError(
"expected localdynamic, initialexec or localexec");
1927 return parseTLSModel(TLM) ||
1928 parseToken(
lltok::rparen,
"expected ')' after thread local model");
1936bool LLParser::parseOptionalAddrSpace(
unsigned &AddrSpace,
unsigned DefaultAS) {
1937 AddrSpace = DefaultAS;
1941 auto ParseAddrspaceValue = [&](
unsigned &AddrSpace) ->
bool {
1943 auto AddrSpaceStr = Lex.getStrVal();
1944 if (AddrSpaceStr ==
"A") {
1945 AddrSpace = M->getDataLayout().getAllocaAddrSpace();
1946 }
else if (AddrSpaceStr ==
"G") {
1947 AddrSpace = M->getDataLayout().getDefaultGlobalsAddressSpace();
1948 }
else if (AddrSpaceStr ==
"P") {
1949 AddrSpace = M->getDataLayout().getProgramAddressSpace();
1951 return tokError(
"invalid symbolic addrspace '" + AddrSpaceStr +
"'");
1957 return tokError(
"expected integer or string constant");
1958 SMLoc Loc = Lex.getLoc();
1959 if (parseUInt32(AddrSpace))
1962 return error(Loc,
"invalid address space, must be a 24-bit integer");
1966 return parseToken(
lltok::lparen,
"expected '(' in address space") ||
1967 ParseAddrspaceValue(AddrSpace) ||
1974bool LLParser::parseStringAttribute(AttrBuilder &
B) {
1975 std::string Attr = Lex.getStrVal();
1978 if (EatIfPresent(
lltok::equal) && parseStringConstant(Val))
1980 B.addAttribute(Attr, Val);
1985bool LLParser::parseOptionalParamOrReturnAttrs(AttrBuilder &
B,
bool IsParam) {
1986 bool HaveError =
false;
1993 if (parseStringAttribute(
B))
2004 SMLoc Loc = Lex.getLoc();
2009 if (parseEnumAttribute(Attr,
B,
false))
2013 HaveError |=
error(Loc,
"this attribute does not apply to parameters");
2015 HaveError |=
error(Loc,
"this attribute does not apply to return values");
2063bool LLParser::parseOptionalLinkage(
unsigned &Res,
bool &HasLinkage,
2064 unsigned &Visibility,
2065 unsigned &DLLStorageClass,
bool &DSOLocal) {
2069 parseOptionalDSOLocal(DSOLocal);
2070 parseOptionalVisibility(Visibility);
2071 parseOptionalDLLStorageClass(DLLStorageClass);
2074 return error(Lex.getLoc(),
"dso_location and DLL-StorageClass mismatch");
2080void LLParser::parseOptionalDSOLocal(
bool &DSOLocal) {
2081 switch (Lex.getKind()) {
2102void LLParser::parseOptionalVisibility(
unsigned &Res) {
2103 switch (Lex.getKind()) {
2120bool LLParser::parseOptionalImportType(
lltok::Kind Kind,
2124 return tokError(
"unknown import kind. Expect definition or declaration.");
2139void LLParser::parseOptionalDLLStorageClass(
unsigned &Res) {
2140 switch (Lex.getKind()) {
2210bool LLParser::parseOptionalCallingConv(
unsigned &CC) {
2211 switch (Lex.getKind()) {
2298 return tokError(
"unknown RISC-V ABI VLEN");
2299#define CC_VLS_CASE(ABIVlen) \
2301 CC = CallingConv::RISCV_VLSCall_##ABIVlen; \
2329 return parseUInt32(CC);
2339bool LLParser::parseMetadataAttachment(
unsigned &Kind,
MDNode *&MD) {
2342 std::string
Name = Lex.getStrVal();
2343 Kind = M->getMDKindID(Name);
2346 return parseMDNode(MD);
2351bool LLParser::parseInstructionMetadata(
Instruction &Inst) {
2354 return tokError(
"expected metadata after comma");
2358 if (parseMetadataAttachment(MDK,
N))
2361 if (MDK == LLVMContext::MD_DIAssignID)
2362 TempDIAssignIDAttachments[
N].push_back(&Inst);
2366 if (MDK == LLVMContext::MD_tbaa)
2367 InstsWithTBAATag.push_back(&Inst);
2376bool LLParser::parseGlobalObjectMetadataAttachment(
GlobalObject &GO) {
2379 if (parseMetadataAttachment(MDK,
N))
2388bool LLParser::parseOptionalFunctionMetadata(
Function &
F) {
2390 if (parseGlobalObjectMetadataAttachment(
F))
2398bool LLParser::parseOptionalAlignment(
MaybeAlign &Alignment,
bool AllowParens) {
2399 Alignment = std::nullopt;
2400 if (!EatIfPresent(lltok::kw_align))
2402 LocTy AlignLoc = Lex.getLoc();
2405 LocTy ParenLoc = Lex.getLoc();
2406 bool HaveParens =
false;
2412 if (parseUInt64(
Value))
2416 return error(ParenLoc,
"expected ')'");
2419 return error(AlignLoc,
"alignment is not a power of two");
2421 return error(AlignLoc,
"huge alignments are not supported yet");
2431 auto StrVal = Lex.getStrVal();
2432 auto ErrMsg =
"expected global code model string";
2433 if (StrVal ==
"tiny")
2435 else if (StrVal ==
"small")
2437 else if (StrVal ==
"kernel")
2439 else if (StrVal ==
"medium")
2441 else if (StrVal ==
"large")
2444 return tokError(ErrMsg);
2455bool LLParser::parseOptionalDerefAttrBytes(
lltok::Kind AttrKind,
2457 assert((AttrKind == lltok::kw_dereferenceable ||
2458 AttrKind == lltok::kw_dereferenceable_or_null) &&
2462 if (!EatIfPresent(AttrKind))
2464 LocTy ParenLoc = Lex.getLoc();
2466 return error(ParenLoc,
"expected '('");
2467 LocTy DerefLoc = Lex.getLoc();
2468 if (parseUInt64(Bytes))
2470 ParenLoc = Lex.getLoc();
2472 return error(ParenLoc,
"expected ')'");
2474 return error(DerefLoc,
"dereferenceable bytes must be non-zero");
2478bool LLParser::parseOptionalUWTableKind(
UWTableKind &Kind) {
2483 LocTy KindLoc = Lex.getLoc();
2489 return error(KindLoc,
"expected unwind table kind");
2496 LocTy ParenLoc = Lex.getLoc();
2498 return error(ParenLoc,
"expected '('");
2499 LocTy KindLoc = Lex.getLoc();
2501 if (parseStringConstant(Arg))
2502 return error(KindLoc,
"expected allockind value");
2506 }
else if (
A ==
"realloc") {
2508 }
else if (
A ==
"free") {
2510 }
else if (
A ==
"uninitialized") {
2512 }
else if (
A ==
"zeroed") {
2514 }
else if (
A ==
"aligned") {
2517 return error(KindLoc, Twine(
"unknown allockind ") +
A);
2520 ParenLoc = Lex.getLoc();
2522 return error(ParenLoc,
"expected ')'");
2524 return error(KindLoc,
"expected allockind value");
2537 return std::nullopt;
2552 return std::nullopt;
2556std::optional<MemoryEffects> LLParser::parseMemoryAttr() {
2561 Lex.setIgnoreColonInIdentifiers(
true);
2566 tokError(
"expected '('");
2567 return std::nullopt;
2570 bool SeenLoc =
false;
2572 std::optional<IRMemLocation> Loc =
keywordToLoc(Lex.getKind());
2576 tokError(
"expected ':' after location");
2577 return std::nullopt;
2584 tokError(
"expected memory location (argmem, inaccessiblemem, errnomem) "
2585 "or access kind (none, read, write, readwrite)");
2587 tokError(
"expected access kind (none, read, write, readwrite)");
2588 return std::nullopt;
2597 tokError(
"default access kind must be specified first");
2598 return std::nullopt;
2607 tokError(
"unterminated memory attribute");
2608 return std::nullopt;
2650unsigned LLParser::parseNoFPClassAttr() {
2655 tokError(
"expected '('");
2662 if (TestMask != 0) {
2666 !parseUInt64(
Value)) {
2668 error(Lex.getLoc(),
"invalid mask value for 'nofpclass'");
2673 error(Lex.getLoc(),
"expected ')'");
2679 error(Lex.getLoc(),
"expected nofpclass test mask");
2697bool LLParser::parseOptionalCommaAlign(
MaybeAlign &Alignment,
2698 bool &AteExtraComma) {
2699 AteExtraComma =
false;
2703 AteExtraComma =
true;
2707 if (Lex.getKind() != lltok::kw_align)
2708 return error(Lex.getLoc(),
"expected metadata or 'align'");
2710 if (parseOptionalAlignment(Alignment))
2723bool LLParser::parseOptionalCommaAddrSpace(
unsigned &AddrSpace, LocTy &
Loc,
2724 bool &AteExtraComma) {
2725 AteExtraComma =
false;
2729 AteExtraComma =
true;
2735 return error(Lex.getLoc(),
"expected metadata or 'addrspace'");
2737 if (parseOptionalAddrSpace(AddrSpace))
2744bool LLParser::parseAllocSizeArguments(
unsigned &BaseSizeArg,
2745 std::optional<unsigned> &HowManyArg) {
2748 auto StartParen = Lex.getLoc();
2750 return error(StartParen,
"expected '('");
2752 if (parseUInt32(BaseSizeArg))
2756 auto HowManyAt = Lex.getLoc();
2758 if (parseUInt32(HowMany))
2760 if (HowMany == BaseSizeArg)
2761 return error(HowManyAt,
2762 "'allocsize' indices can't refer to the same parameter");
2763 HowManyArg = HowMany;
2765 HowManyArg = std::nullopt;
2767 auto EndParen = Lex.getLoc();
2769 return error(EndParen,
"expected ')'");
2773bool LLParser::parseVScaleRangeArguments(
unsigned &MinValue,
2774 unsigned &MaxValue) {
2777 auto StartParen = Lex.getLoc();
2779 return error(StartParen,
"expected '('");
2781 if (parseUInt32(MinValue))
2785 if (parseUInt32(MaxValue))
2788 MaxValue = MinValue;
2790 auto EndParen = Lex.getLoc();
2792 return error(EndParen,
"expected ')'");
2801bool LLParser::parseScopeAndOrdering(
bool IsAtomic,
SyncScope::ID &SSID,
2806 return parseScope(SSID) || parseOrdering(Ordering);
2816 auto StartParenAt = Lex.getLoc();
2818 return error(StartParenAt,
"Expected '(' in syncscope");
2821 auto SSNAt = Lex.getLoc();
2822 if (parseStringConstant(SSN))
2823 return error(SSNAt,
"Expected synchronization scope name");
2825 auto EndParenAt = Lex.getLoc();
2827 return error(EndParenAt,
"Expected ')' in syncscope");
2829 SSID = Context.getOrInsertSyncScopeID(SSN);
2840 switch (Lex.getKind()) {
2842 return tokError(
"Expected ordering on atomic instruction");
2861bool LLParser::parseOptionalStackAlignment(
unsigned &Alignment) {
2863 if (!EatIfPresent(lltok::kw_alignstack))
2865 LocTy ParenLoc = Lex.getLoc();
2867 return error(ParenLoc,
"expected '('");
2868 LocTy AlignLoc = Lex.getLoc();
2869 if (parseUInt32(Alignment))
2871 ParenLoc = Lex.getLoc();
2873 return error(ParenLoc,
"expected ')'");
2875 return error(AlignLoc,
"stack alignment is not a power of two");
2889 bool &AteExtraComma) {
2890 AteExtraComma =
false;
2893 return tokError(
"expected ',' as start of index list");
2897 if (Indices.
empty())
2898 return tokError(
"expected index");
2899 AteExtraComma =
true;
2903 if (parseUInt32(Idx))
2916bool LLParser::parseType(
Type *&Result,
const Twine &Msg,
bool AllowVoid) {
2917 SMLoc TypeLoc = Lex.getLoc();
2918 switch (Lex.getKind()) {
2920 return tokError(Msg);
2929 if (
Result->isPointerTy()) {
2931 if (parseOptionalAddrSpace(AddrSpace))
2937 return tokError(
"ptr* is invalid - use ptr instead");
2948 if (parseTargetExtType(Result))
2954 if (parseAnonStructType(Result,
false))
2960 if (parseArrayVectorType(Result,
false))
2967 if (parseAnonStructType(Result,
true) ||
2968 parseToken(
lltok::greater,
"expected '>' at end of packed struct"))
2970 }
else if (parseArrayVectorType(Result,
true))
2975 std::pair<Type*, LocTy> &
Entry = NamedTypes[Lex.getStrVal()];
2981 Entry.second = Lex.getLoc();
2990 std::pair<Type*, LocTy> &
Entry = NumberedTypes[Lex.getUIntVal()];
2996 Entry.second = Lex.getLoc();
3006 switch (Lex.getKind()) {
3009 if (!AllowVoid &&
Result->isVoidTy())
3010 return error(TypeLoc,
"void type only allowed for function results");
3016 return tokError(
"basic block pointers are invalid");
3018 return tokError(
"pointers to void are invalid - use i8* instead");
3020 return tokError(
"pointer to this type is invalid");
3028 return tokError(
"basic block pointers are invalid");
3030 return tokError(
"pointers to void are invalid; use i8* instead");
3032 return tokError(
"pointer to this type is invalid");
3034 if (parseOptionalAddrSpace(AddrSpace) ||
3035 parseToken(
lltok::star,
"expected '*' in address space"))
3044 if (parseFunctionType(Result))
3057 PerFunctionState &PFS,
bool IsMustTailCall,
3058 bool InVarArgsFunc) {
3064 if (!ArgList.
empty() &&
3065 parseToken(
lltok::comma,
"expected ',' in argument list"))
3070 const char *Msg =
"unexpected ellipsis in argument list for ";
3071 if (!IsMustTailCall)
3072 return tokError(Twine(Msg) +
"non-musttail call");
3074 return tokError(Twine(Msg) +
"musttail call in non-varargs function");
3076 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3081 Type *ArgTy =
nullptr;
3083 if (parseType(ArgTy, ArgLoc))
3086 return error(ArgLoc,
"invalid type for function argument");
3088 AttrBuilder ArgAttrs(M->getContext());
3091 if (parseMetadataAsValue(V, PFS))
3095 if (parseOptionalParamAttrs(ArgAttrs) || parseValue(ArgTy, V, PFS))
3102 if (IsMustTailCall && InVarArgsFunc)
3103 return tokError(
"expected '...' at end of argument list for musttail call "
3104 "in varargs function");
3112bool LLParser::parseRequiredTypeAttr(AttrBuilder &
B,
lltok::Kind AttrToken,
3115 if (!EatIfPresent(AttrToken))
3118 return error(Lex.getLoc(),
"expected '('");
3122 return error(Lex.getLoc(),
"expected ')'");
3124 B.addTypeAttr(AttrKind, Ty);
3130bool LLParser::parseRangeAttr(AttrBuilder &
B) {
3138 auto ParseAPSInt = [&](
unsigned BitWidth, APInt &Val) {
3140 return tokError(
"expected integer");
3141 if (Lex.getAPSIntVal().getBitWidth() >
BitWidth)
3143 "integer is too large for the bit width of specified type");
3144 Val = Lex.getAPSIntVal().extend(
BitWidth);
3149 if (parseToken(
lltok::lparen,
"expected '('") || parseType(Ty, TyLoc))
3152 return error(TyLoc,
"the range must have integer type!");
3160 return tokError(
"the range represent the empty set but limits aren't 0!");
3171bool LLParser::parseInitializesAttr(AttrBuilder &
B) {
3174 auto ParseAPSInt = [&](APInt &Val) {
3176 return tokError(
"expected integer");
3177 Val = Lex.getAPSIntVal().extend(64);
3197 return tokError(
"the range should not represent the full or empty set!");
3209 if (!CRLOrNull.has_value())
3210 return tokError(
"Invalid (unordered or overlapping) range list");
3211 B.addInitializesAttr(*CRLOrNull);
3215bool LLParser::parseCapturesAttr(AttrBuilder &
B) {
3217 std::optional<CaptureComponents>
Ret;
3221 Lex.setIgnoreColonInIdentifiers(
true);
3229 bool SeenComponent =
false;
3235 return tokError(
"duplicate 'ret' location");
3238 SeenComponent =
false;
3243 return tokError(
"cannot use 'none' with other component");
3247 return tokError(
"cannot use 'none' with other component");
3258 return tokError(
"expected one of 'none', 'address', 'address_is_null', "
3259 "'provenance' or 'read_provenance'");
3262 SeenComponent =
true;
3283bool LLParser::parseOptionalOperandBundles(
3285 LocTy BeginLoc = Lex.getLoc();
3291 if (!BundleList.
empty() &&
3292 parseToken(
lltok::comma,
"expected ',' in input list"))
3296 if (parseStringConstant(
Tag))
3299 if (parseToken(
lltok::lparen,
"expected '(' in operand bundle"))
3302 std::vector<Value *> Inputs;
3305 if (!Inputs.empty() &&
3306 parseToken(
lltok::comma,
"expected ',' in input list"))
3310 Value *Input =
nullptr;
3314 if (parseMetadataAsValue(Input, PFS))
3316 }
else if (parseValue(Ty, Input, PFS)) {
3319 Inputs.push_back(Input);
3327 if (BundleList.
empty())
3328 return error(BeginLoc,
"operand bundle set must not be empty");
3335 unsigned NextID,
unsigned ID) {
3337 return error(Loc, Kind +
" expected to be numbered '" + Prefix +
3338 Twine(NextID) +
"' or greater");
3355 unsigned CurValID = 0;
3369 LocTy TypeLoc = Lex.getLoc();
3370 Type *ArgTy =
nullptr;
3371 AttrBuilder
Attrs(M->getContext());
3372 if (parseType(ArgTy) || parseOptionalParamAttrs(Attrs))
3376 return error(TypeLoc,
"argument can not have void type");
3380 Name = Lex.getStrVal();
3385 ArgID = Lex.getUIntVal();
3386 if (checkValueID(TypeLoc,
"argument",
"%", CurValID, ArgID))
3393 CurValID = ArgID + 1;
3397 return error(TypeLoc,
"invalid type for function argument");
3405 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3410bool LLParser::parseFunctionType(
Type *&Result) {
3414 return tokError(
"invalid function return type");
3418 SmallVector<unsigned> UnnamedArgNums;
3419 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg))
3423 for (
const ArgInfo &Arg : ArgList) {
3424 if (!Arg.Name.empty())
3425 return error(Arg.Loc,
"argument name invalid in function type");
3426 if (Arg.Attrs.hasAttributes())
3427 return error(Arg.Loc,
"argument attributes invalid in function type");
3431 for (
const ArgInfo &Arg : ArgList)
3440bool LLParser::parseAnonStructType(
Type *&Result,
bool Packed) {
3442 if (parseStructBody(Elts))
3450bool LLParser::parseStructDefinition(
SMLoc TypeLoc,
StringRef Name,
3451 std::pair<Type *, LocTy> &Entry,
3455 return error(TypeLoc,
"redefinition of type");
3461 Entry.second = SMLoc();
3466 ResultTy =
Entry.first;
3478 return error(TypeLoc,
"forward references to non-struct type");
3482 return parseArrayVectorType(ResultTy,
true);
3483 return parseType(ResultTy);
3487 Entry.second = SMLoc();
3496 if (parseStructBody(Body) ||
3497 (isPacked && parseToken(
lltok::greater,
"expected '>' in packed struct")))
3501 return tokError(
toString(std::move(
E)));
3521 LocTy EltTyLoc = Lex.getLoc();
3528 return error(EltTyLoc,
"invalid element type for struct");
3531 EltTyLoc = Lex.getLoc();
3536 return error(EltTyLoc,
"invalid element type for struct");
3541 return parseToken(
lltok::rbrace,
"expected '}' at end of struct");
3550bool LLParser::parseArrayVectorType(
Type *&Result,
bool IsVector) {
3551 bool Scalable =
false;
3555 if (parseToken(
lltok::kw_x,
"expected 'x' after vscale"))
3561 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned() ||
3562 Lex.getAPSIntVal().getBitWidth() > 64)
3563 return tokError(
"expected number in address space");
3565 LocTy SizeLoc = Lex.getLoc();
3566 uint64_t
Size = Lex.getAPSIntVal().getZExtValue();
3569 if (parseToken(
lltok::kw_x,
"expected 'x' after element count"))
3572 LocTy TypeLoc = Lex.getLoc();
3573 Type *EltTy =
nullptr;
3574 if (parseType(EltTy))
3578 "expected end of sequential type"))
3583 return error(SizeLoc,
"zero element vector is illegal");
3585 return error(SizeLoc,
"size too large for vector");
3587 return error(TypeLoc,
"invalid vector element type");
3591 return error(TypeLoc,
"invalid array element type");
3608bool LLParser::parseTargetExtType(
Type *&Result) {
3613 if (parseToken(
lltok::lparen,
"expected '(' in target extension type") ||
3614 parseStringConstant(TypeName))
3621 SmallVector<unsigned> IntParams;
3622 bool SeenInt =
false;
3629 if (parseUInt32(IntVal))
3632 }
else if (SeenInt) {
3635 return tokError(
"expected uint32 param");
3638 if (parseType(TypeParam,
true))
3644 if (parseToken(
lltok::rparen,
"expected ')' in target extension type"))
3649 if (
auto E = TTy.takeError())
3650 return tokError(
toString(std::move(
E)));
3663 :
P(
p),
F(
f), FunctionNumber(functionNumber) {
3666 auto It = UnnamedArgNums.
begin();
3669 unsigned ArgNum = *It++;
3670 NumberedVals.add(ArgNum, &A);
3675LLParser::PerFunctionState::~PerFunctionState() {
3678 for (
const auto &P : ForwardRefVals) {
3681 P.second.first->replaceAllUsesWith(
3683 P.second.first->deleteValue();
3686 for (
const auto &P : ForwardRefValIDs) {
3689 P.second.first->replaceAllUsesWith(
3691 P.second.first->deleteValue();
3695bool LLParser::PerFunctionState::finishFunction() {
3696 if (!ForwardRefVals.empty())
3697 return P.error(ForwardRefVals.begin()->second.second,
3698 "use of undefined value '%" + ForwardRefVals.begin()->first +
3700 if (!ForwardRefValIDs.empty())
3701 return P.error(ForwardRefValIDs.begin()->second.second,
3702 "use of undefined value '%" +
3703 Twine(ForwardRefValIDs.begin()->first) +
"'");
3710Value *LLParser::PerFunctionState::getVal(
const std::string &Name,
Type *Ty,
3713 Value *Val =
F.getValueSymbolTable()->lookup(Name);
3718 auto I = ForwardRefVals.find(Name);
3719 if (
I != ForwardRefVals.end())
3720 Val =
I->second.first;
3725 return P.checkValidVariableType(Loc,
"%" + Name, Ty, Val);
3729 P.error(Loc,
"invalid use of a non-first-class type");
3740 if (FwdVal->
getName() != Name) {
3741 P.error(Loc,
"name is too long which can result in name collisions, "
3742 "consider making the name shorter or "
3743 "increasing -non-global-value-max-name-size");
3747 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
3751Value *LLParser::PerFunctionState::getVal(
unsigned ID,
Type *Ty,
LocTy Loc) {
3753 Value *Val = NumberedVals.get(
ID);
3758 auto I = ForwardRefValIDs.find(
ID);
3759 if (
I != ForwardRefValIDs.end())
3760 Val =
I->second.first;
3765 return P.checkValidVariableType(Loc,
"%" + Twine(
ID), Ty, Val);
3768 P.error(Loc,
"invalid use of a non-first-class type");
3780 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
3786bool LLParser::PerFunctionState::setInstName(
int NameID,
3787 const std::string &NameStr,
3788 LocTy NameLoc, Instruction *Inst) {
3791 if (NameID != -1 || !NameStr.empty())
3792 return P.error(NameLoc,
"instructions returning void cannot have a name");
3798 if (NameStr.empty()) {
3801 NameID = NumberedVals.getNext();
3803 if (
P.checkValueID(NameLoc,
"instruction",
"%", NumberedVals.getNext(),
3807 auto FI = ForwardRefValIDs.find(NameID);
3808 if (FI != ForwardRefValIDs.end()) {
3811 return P.error(NameLoc,
"instruction forward referenced with type '" +
3815 Sentinel->replaceAllUsesWith(Inst);
3817 ForwardRefValIDs.erase(FI);
3820 NumberedVals.add(NameID, Inst);
3825 auto FI = ForwardRefVals.find(NameStr);
3826 if (FI != ForwardRefVals.end()) {
3829 return P.error(NameLoc,
"instruction forward referenced with type '" +
3833 Sentinel->replaceAllUsesWith(Inst);
3835 ForwardRefVals.erase(FI);
3841 if (Inst->
getName() != NameStr)
3842 return P.error(NameLoc,
"multiple definition of local value named '" +
3849BasicBlock *LLParser::PerFunctionState::getBB(
const std::string &Name,
3863BasicBlock *LLParser::PerFunctionState::defineBB(
const std::string &Name,
3864 int NameID,
LocTy Loc) {
3868 if (
P.checkValueID(Loc,
"label",
"", NumberedVals.getNext(), NameID))
3871 NameID = NumberedVals.getNext();
3873 BB = getBB(NameID, Loc);
3875 P.error(Loc,
"unable to create block numbered '" + Twine(NameID) +
"'");
3879 BB = getBB(Name, Loc);
3881 P.error(Loc,
"unable to create block named '" + Name +
"'");
3892 ForwardRefValIDs.erase(NameID);
3893 NumberedVals.add(NameID, BB);
3896 ForwardRefVals.erase(Name);
3913bool LLParser::parseValID(ValID &
ID, PerFunctionState *PFS,
Type *ExpectedTy) {
3914 ID.Loc = Lex.getLoc();
3915 switch (Lex.getKind()) {
3917 return tokError(
"expected value token");
3919 ID.UIntVal = Lex.getUIntVal();
3923 ID.StrVal = Lex.getStrVal();
3927 ID.UIntVal = Lex.getUIntVal();
3931 ID.StrVal = Lex.getStrVal();
3935 ID.APSIntVal = Lex.getAPSIntVal();
3939 ID.APFloatVal = Lex.getAPFloatVal();
3960 if (parseGlobalValueVector(Elts) ||
3961 parseToken(
lltok::rbrace,
"expected end of struct constant"))
3964 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
3965 ID.UIntVal = Elts.
size();
3966 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
3967 Elts.
size() *
sizeof(Elts[0]));
3978 LocTy FirstEltLoc = Lex.getLoc();
3979 if (parseGlobalValueVector(Elts) ||
3981 parseToken(
lltok::rbrace,
"expected end of packed struct")) ||
3985 if (isPackedStruct) {
3986 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
3987 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
3988 Elts.
size() *
sizeof(Elts[0]));
3989 ID.UIntVal = Elts.
size();
3995 return error(
ID.Loc,
"constant vector must not be empty");
3997 if (!Elts[0]->
getType()->isIntegerTy() &&
3998 !Elts[0]->
getType()->isFloatingPointTy() &&
4002 "vector elements must have integer, pointer or floating point type");
4005 for (
unsigned i = 1, e = Elts.
size(); i != e; ++i)
4007 return error(FirstEltLoc,
"vector element #" + Twine(i) +
4008 " is not of type '" +
4018 LocTy FirstEltLoc = Lex.getLoc();
4019 if (parseGlobalValueVector(Elts) ||
4031 if (!Elts[0]->
getType()->isFirstClassType())
4032 return error(FirstEltLoc,
"invalid array element type: " +
4038 for (
unsigned i = 0, e = Elts.
size(); i != e; ++i) {
4040 return error(FirstEltLoc,
"array element #" + Twine(i) +
4041 " is not of type '" +
4061 bool HasSideEffect, AlignStack, AsmDialect, CanThrow;
4064 parseOptionalToken(lltok::kw_alignstack, AlignStack) ||
4067 parseStringConstant(
ID.StrVal) ||
4068 parseToken(
lltok::comma,
"expected comma in inline asm expression") ||
4071 ID.StrVal2 = Lex.getStrVal();
4072 ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack) << 1) |
4073 (
unsigned(AsmDialect) << 2) | (unsigned(CanThrow) << 3);
4084 if (parseToken(
lltok::lparen,
"expected '(' in block address expression") ||
4085 parseValID(Fn, PFS) ||
4087 "expected comma in block address expression") ||
4088 parseValID(Label, PFS) ||
4089 parseToken(
lltok::rparen,
"expected ')' in block address expression"))
4093 return error(Fn.
Loc,
"expected function name in blockaddress");
4095 return error(
Label.Loc,
"expected basic block name in blockaddress");
4098 GlobalValue *GV =
nullptr;
4100 GV = NumberedVals.get(Fn.
UIntVal);
4101 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4102 GV = M->getNamedValue(Fn.
StrVal);
4108 return error(Fn.
Loc,
"expected function name in blockaddress");
4110 if (
F->isDeclaration())
4111 return error(Fn.
Loc,
"cannot take blockaddress inside a declaration");
4116 GlobalValue *&FwdRef =
4117 ForwardRefBlockAddresses[std::move(Fn)][std::move(Label)];
4125 "type of blockaddress must be a pointer and not '" +
4130 FwdDeclAS = PFS->getFunction().getAddressSpace();
4134 FwdRef =
new GlobalVariable(
4139 ID.ConstantVal = FwdRef;
4147 if (BlockAddressPFS &&
F == &BlockAddressPFS->getFunction()) {
4149 BB = BlockAddressPFS->getBB(
Label.UIntVal,
Label.Loc);
4151 BB = BlockAddressPFS->getBB(
Label.StrVal,
Label.Loc);
4153 return error(
Label.Loc,
"referenced value is not a basic block");
4156 return error(
Label.Loc,
"cannot take address of numeric label after "
4157 "the function is defined");
4159 F->getValueSymbolTable()->lookup(
Label.StrVal));
4161 return error(
Label.Loc,
"referenced value is not a basic block");
4175 if (parseValID(Fn, PFS))
4180 "expected global value name in dso_local_equivalent");
4183 GlobalValue *GV =
nullptr;
4185 GV = NumberedVals.get(Fn.
UIntVal);
4186 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4187 GV = M->getNamedValue(Fn.
StrVal);
4193 ? ForwardRefDSOLocalEquivalentIDs
4194 : ForwardRefDSOLocalEquivalentNames;
4195 GlobalValue *&FwdRef = FwdRefMap[Fn];
4202 ID.ConstantVal = FwdRef;
4208 return error(Fn.
Loc,
"expected a function, alias to function, or ifunc "
4209 "in dso_local_equivalent");
4220 if (parseValID(
ID, PFS))
4224 return error(
ID.Loc,
"expected global value name in no_cfi");
4235 Constant *Disc =
nullptr, *AddrDisc =
nullptr;
4238 "expected '(' in constant ptrauth expression") ||
4239 parseGlobalTypeAndValue(
Ptr) ||
4241 "expected comma in constant ptrauth expression") ||
4242 parseGlobalTypeAndValue(
Key))
4246 if (parseGlobalTypeAndValue(Disc) ||
4247 (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(AddrDisc)))
4250 "expected ')' in constant ptrauth expression"))
4253 if (!
Ptr->getType()->isPointerTy())
4254 return error(
ID.Loc,
"constant ptrauth base pointer must be a pointer");
4257 if (!KeyC || KeyC->getBitWidth() != 32)
4258 return error(
ID.Loc,
"constant ptrauth key must be i32 constant");
4260 ConstantInt *DiscC =
nullptr;
4266 "constant ptrauth integer discriminator must be i64 constant");
4272 if (!AddrDisc->getType()->isPointerTy())
4274 ID.Loc,
"constant ptrauth address discriminator must be a pointer");
4290 unsigned Opc = Lex.getUIntVal();
4291 Type *DestTy =
nullptr;
4294 if (parseToken(
lltok::lparen,
"expected '(' after constantexpr cast") ||
4295 parseGlobalTypeAndValue(SrcVal) ||
4296 parseToken(
lltok::kw_to,
"expected 'to' in constantexpr cast") ||
4297 parseType(DestTy) ||
4298 parseToken(
lltok::rparen,
"expected ')' at end of constantexpr cast"))
4301 return error(
ID.Loc,
"invalid cast opcode for cast from '" +
4310 return error(
ID.Loc,
"extractvalue constexprs are no longer supported");
4312 return error(
ID.Loc,
"insertvalue constexprs are no longer supported");
4314 return error(
ID.Loc,
"udiv constexprs are no longer supported");
4316 return error(
ID.Loc,
"sdiv constexprs are no longer supported");
4318 return error(
ID.Loc,
"urem constexprs are no longer supported");
4320 return error(
ID.Loc,
"srem constexprs are no longer supported");
4322 return error(
ID.Loc,
"fadd constexprs are no longer supported");
4324 return error(
ID.Loc,
"fsub constexprs are no longer supported");
4326 return error(
ID.Loc,
"fmul constexprs are no longer supported");
4328 return error(
ID.Loc,
"fdiv constexprs are no longer supported");
4330 return error(
ID.Loc,
"frem constexprs are no longer supported");
4332 return error(
ID.Loc,
"and constexprs are no longer supported");
4334 return error(
ID.Loc,
"or constexprs are no longer supported");
4336 return error(
ID.Loc,
"lshr constexprs are no longer supported");
4338 return error(
ID.Loc,
"ashr constexprs are no longer supported");
4340 return error(
ID.Loc,
"shl constexprs are no longer supported");
4342 return error(
ID.Loc,
"mul constexprs are no longer supported");
4344 return error(
ID.Loc,
"fneg constexprs are no longer supported");
4346 return error(
ID.Loc,
"select constexprs are no longer supported");
4348 return error(
ID.Loc,
"zext constexprs are no longer supported");
4350 return error(
ID.Loc,
"sext constexprs are no longer supported");
4352 return error(
ID.Loc,
"fptrunc constexprs are no longer supported");
4354 return error(
ID.Loc,
"fpext constexprs are no longer supported");
4356 return error(
ID.Loc,
"uitofp constexprs are no longer supported");
4358 return error(
ID.Loc,
"sitofp constexprs are no longer supported");
4360 return error(
ID.Loc,
"fptoui constexprs are no longer supported");
4362 return error(
ID.Loc,
"fptosi constexprs are no longer supported");
4364 return error(
ID.Loc,
"icmp constexprs are no longer supported");
4366 return error(
ID.Loc,
"fcmp constexprs are no longer supported");
4374 unsigned Opc = Lex.getUIntVal();
4377 if (
Opc == Instruction::Add ||
Opc == Instruction::Sub ||
4378 Opc == Instruction::Mul) {
4387 if (parseToken(
lltok::lparen,
"expected '(' in binary constantexpr") ||
4388 parseGlobalTypeAndValue(Val0) ||
4389 parseToken(
lltok::comma,
"expected comma in binary constantexpr") ||
4390 parseGlobalTypeAndValue(Val1) ||
4391 parseToken(
lltok::rparen,
"expected ')' in binary constantexpr"))
4394 return error(
ID.Loc,
"operands of constexpr must have same type");
4398 "constexpr requires integer or integer vector operands");
4409 if (parseToken(
lltok::lparen,
"expected '(' after vector splat"))
4412 if (parseGlobalTypeAndValue(
C))
4414 if (parseToken(
lltok::rparen,
"expected ')' at end of vector splat"))
4426 unsigned Opc = Lex.getUIntVal();
4429 bool HasInRange =
false;
4435 if (
Opc == Instruction::GetElementPtr) {
4451 return tokError(
"expected integer");
4452 InRangeStart = Lex.getAPSIntVal();
4457 return tokError(
"expected integer");
4458 InRangeEnd = Lex.getAPSIntVal();
4466 if (parseToken(
lltok::lparen,
"expected '(' in constantexpr"))
4469 if (
Opc == Instruction::GetElementPtr) {
4470 if (parseType(Ty) ||
4471 parseToken(
lltok::comma,
"expected comma after getelementptr's type"))
4475 if (parseGlobalValueVector(Elts) ||
4479 if (
Opc == Instruction::GetElementPtr) {
4480 if (Elts.
size() == 0 ||
4481 !Elts[0]->getType()->isPtrOrPtrVectorTy())
4482 return error(
ID.Loc,
"base of getelementptr must be a pointer");
4485 std::optional<ConstantRange>
InRange;
4487 unsigned IndexWidth =
4488 M->getDataLayout().getIndexTypeSizeInBits(
BaseType);
4489 InRangeStart = InRangeStart.
extOrTrunc(IndexWidth);
4490 InRangeEnd = InRangeEnd.
extOrTrunc(IndexWidth);
4491 if (InRangeStart.
sge(InRangeEnd))
4492 return error(
ID.Loc,
"expected end to be larger than start");
4502 for (Constant *Val : Indices) {
4505 return error(
ID.Loc,
"getelementptr index must be an integer");
4508 if (GEPWidth && (ValNumEl != GEPWidth))
4511 "getelementptr vector index has a wrong number of elements");
4514 GEPWidth = ValNumEl;
4518 SmallPtrSet<Type*, 4> Visited;
4519 if (!Indices.empty() && !Ty->
isSized(&Visited))
4520 return error(
ID.Loc,
"base element of getelementptr must be sized");
4523 return error(
ID.Loc,
"invalid getelementptr indices");
4527 }
else if (
Opc == Instruction::ShuffleVector) {
4528 if (Elts.
size() != 3)
4529 return error(
ID.Loc,
"expected three operands to shufflevector");
4531 return error(
ID.Loc,
"invalid operands to shufflevector");
4532 SmallVector<int, 16>
Mask;
4535 }
else if (
Opc == Instruction::ExtractElement) {
4536 if (Elts.
size() != 2)
4537 return error(
ID.Loc,
"expected two operands to extractelement");
4539 return error(
ID.Loc,
"invalid extractelement operands");
4542 assert(
Opc == Instruction::InsertElement &&
"Unknown opcode");
4543 if (Elts.
size() != 3)
4544 return error(
ID.Loc,
"expected three operands to insertelement");
4546 return error(
ID.Loc,
"invalid insertelement operands");
4561bool LLParser::parseGlobalValue(
Type *Ty, Constant *&
C) {
4565 bool Parsed = parseValID(
ID,
nullptr, Ty) ||
4566 convertValIDToValue(Ty,
ID, V,
nullptr);
4568 return error(
ID.Loc,
"global values must be constants");
4572bool LLParser::parseGlobalTypeAndValue(Constant *&V) {
4574 return parseType(Ty) || parseGlobalValue(Ty, V);
4577bool LLParser::parseOptionalComdat(StringRef GlobalName, Comdat *&
C) {
4580 LocTy KwLoc = Lex.getLoc();
4586 return tokError(
"expected comdat variable");
4587 C = getComdat(Lex.getStrVal(), Lex.getLoc());
4589 if (parseToken(
lltok::rparen,
"expected ')' after comdat var"))
4592 if (GlobalName.
empty())
4593 return tokError(
"comdat cannot be unnamed");
4594 C = getComdat(std::string(GlobalName), KwLoc);
4603bool LLParser::parseGlobalValueVector(SmallVectorImpl<Constant *> &Elts) {
4617 if (parseGlobalTypeAndValue(
C))
4625bool LLParser::parseMDTuple(MDNode *&MD,
bool IsDistinct) {
4627 if (parseMDNodeVector(Elts))
4638bool LLParser::parseMDNode(MDNode *&
N) {
4640 return parseSpecializedMDNode(
N);
4642 return parseToken(
lltok::exclaim,
"expected '!' here") || parseMDNodeTail(
N);
4645bool LLParser::parseMDNodeTail(MDNode *&
N) {
4648 return parseMDTuple(
N);
4651 return parseMDNodeID(
N);
4657template <
class FieldTy>
struct MDFieldImpl {
4658 typedef MDFieldImpl ImplTy;
4662 void assign(FieldTy Val) {
4664 this->Val = std::move(Val);
4667 explicit MDFieldImpl(FieldTy
Default)
4675template <
class FieldTypeA,
class FieldTypeB>
struct MDEitherFieldImpl {
4676 typedef MDEitherFieldImpl<FieldTypeA, FieldTypeB> ImplTy;
4687 void assign(FieldTypeA
A) {
4689 this->
A = std::move(
A);
4693 void assign(FieldTypeB
B) {
4695 this->
B = std::move(
B);
4699 explicit MDEitherFieldImpl(FieldTypeA DefaultA, FieldTypeB DefaultB)
4701 WhatIs(IsInvalid) {}
4704struct MDUnsignedField :
public MDFieldImpl<uint64_t> {
4711struct LineField :
public MDUnsignedField {
4712 LineField() : MDUnsignedField(0, UINT32_MAX) {}
4715struct ColumnField :
public MDUnsignedField {
4716 ColumnField() : MDUnsignedField(0, UINT16_MAX) {}
4719struct DwarfTagField :
public MDUnsignedField {
4725struct DwarfMacinfoTypeField :
public MDUnsignedField {
4731struct DwarfAttEncodingField :
public MDUnsignedField {
4732 DwarfAttEncodingField() : MDUnsignedField(0, dwarf::
DW_ATE_hi_user) {}
4735struct DwarfVirtualityField :
public MDUnsignedField {
4739struct DwarfLangField :
public MDUnsignedField {
4743struct DwarfCCField :
public MDUnsignedField {
4744 DwarfCCField() : MDUnsignedField(0, dwarf::
DW_CC_hi_user) {}
4747struct DwarfEnumKindField :
public MDUnsignedField {
4748 DwarfEnumKindField()
4753struct EmissionKindField :
public MDUnsignedField {
4754 EmissionKindField() : MDUnsignedField(0, DICompileUnit::LastEmissionKind) {}
4757struct FixedPointKindField :
public MDUnsignedField {
4758 FixedPointKindField()
4759 : MDUnsignedField(0, DIFixedPointType::LastFixedPointKind) {}
4762struct NameTableKindField :
public MDUnsignedField {
4763 NameTableKindField()
4766 DICompileUnit::DebugNameTableKind::LastDebugNameTableKind) {}
4769struct DIFlagField :
public MDFieldImpl<DINode::DIFlags> {
4770 DIFlagField() : MDFieldImpl(DINode::FlagZero) {}
4773struct DISPFlagField :
public MDFieldImpl<DISubprogram::DISPFlags> {
4774 DISPFlagField() : MDFieldImpl(DISubprogram::SPFlagZero) {}
4777struct MDAPSIntField :
public MDFieldImpl<APSInt> {
4778 MDAPSIntField() : ImplTy(
APSInt()) {}
4781struct MDSignedField :
public MDFieldImpl<int64_t> {
4785 MDSignedField(int64_t
Default = 0)
4787 MDSignedField(int64_t
Default, int64_t Min, int64_t Max)
4791struct MDBoolField :
public MDFieldImpl<bool> {
4795struct MDField :
public MDFieldImpl<Metadata *> {
4798 MDField(
bool AllowNull =
true) : ImplTy(nullptr), AllowNull(AllowNull) {}
4801struct MDStringField :
public MDFieldImpl<MDString *> {
4802 enum class EmptyIs {
4807 MDStringField(
enum EmptyIs EmptyIs = EmptyIs::Null)
4808 : ImplTy(nullptr), EmptyIs(EmptyIs) {}
4811struct MDFieldList :
public MDFieldImpl<SmallVector<Metadata *, 4>> {
4815struct ChecksumKindField :
public MDFieldImpl<DIFile::ChecksumKind> {
4819struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
4820 MDSignedOrMDField(int64_t
Default = 0,
bool AllowNull =
true)
4821 : ImplTy(MDSignedField(
Default), MDField(AllowNull)) {}
4823 MDSignedOrMDField(int64_t
Default, int64_t Min, int64_t Max,
4824 bool AllowNull =
true)
4825 : ImplTy(MDSignedField(
Default, Min,
Max), MDField(AllowNull)) {}
4827 bool isMDSignedField()
const {
return WhatIs == IsTypeA; }
4828 bool isMDField()
const {
return WhatIs == IsTypeB; }
4829 int64_t getMDSignedValue()
const {
4830 assert(isMDSignedField() &&
"Wrong field type");
4833 Metadata *getMDFieldValue()
const {
4834 assert(isMDField() &&
"Wrong field type");
4839struct MDUnsignedOrMDField : MDEitherFieldImpl<MDUnsignedField, MDField> {
4840 MDUnsignedOrMDField(uint64_t
Default = 0,
bool AllowNull =
true)
4841 : ImplTy(MDUnsignedField(
Default), MDField(AllowNull)) {}
4843 MDUnsignedOrMDField(uint64_t
Default, uint64_t Max,
bool AllowNull =
true)
4844 : ImplTy(MDUnsignedField(
Default,
Max), MDField(AllowNull)) {}
4846 bool isMDUnsignedField()
const {
return WhatIs == IsTypeA; }
4847 bool isMDField()
const {
return WhatIs == IsTypeB; }
4848 uint64_t getMDUnsignedValue()
const {
4849 assert(isMDUnsignedField() &&
"Wrong field type");
4852 Metadata *getMDFieldValue()
const {
4853 assert(isMDField() &&
"Wrong field type");
4858 if (isMDUnsignedField())
4860 ConstantInt::get(Type::getInt64Ty(
Context), getMDUnsignedValue()));
4862 return getMDFieldValue();
4874 return tokError(
"expected integer");
4876 Result.assign(Lex.getAPSIntVal());
4883 MDUnsignedField &Result) {
4884 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
4885 return tokError(
"expected unsigned integer");
4887 auto &U = Lex.getAPSIntVal();
4888 if (U.ugt(Result.Max))
4889 return tokError(
"value for '" + Name +
"' too large, limit is " +
4891 Result.assign(U.getZExtValue());
4892 assert(Result.Val <= Result.Max &&
"Expected value in range");
4899 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4903 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4909 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4912 return tokError(
"expected DWARF tag");
4916 return tokError(
"invalid DWARF tag" +
Twine(
" '") + Lex.getStrVal() +
"'");
4917 assert(
Tag <= Result.Max &&
"Expected valid DWARF tag");
4926 DwarfMacinfoTypeField &Result) {
4928 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4931 return tokError(
"expected DWARF macinfo type");
4935 return tokError(
"invalid DWARF macinfo type" +
Twine(
" '") +
4936 Lex.getStrVal() +
"'");
4937 assert(Macinfo <= Result.Max &&
"Expected valid DWARF macinfo type");
4939 Result.assign(Macinfo);
4946 DwarfVirtualityField &Result) {
4948 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4951 return tokError(
"expected DWARF virtuality code");
4955 return tokError(
"invalid DWARF virtuality code" +
Twine(
" '") +
4956 Lex.getStrVal() +
"'");
4957 assert(Virtuality <= Result.Max &&
"Expected valid DWARF virtuality code");
4958 Result.assign(Virtuality);
4965 DwarfEnumKindField &Result) {
4967 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4970 return tokError(
"expected DWARF enum kind code");
4974 return tokError(
"invalid DWARF enum kind code" +
Twine(
" '") +
4975 Lex.getStrVal() +
"'");
4976 assert(EnumKind <= Result.Max &&
"Expected valid DWARF enum kind code");
4977 Result.assign(EnumKind);
4985 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4988 return tokError(
"expected DWARF language");
4992 return tokError(
"invalid DWARF language" +
Twine(
" '") + Lex.getStrVal() +
4994 assert(Lang <= Result.Max &&
"Expected valid DWARF language");
4995 Result.assign(Lang);
5003 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5006 return tokError(
"expected DWARF calling convention");
5010 return tokError(
"invalid DWARF calling convention" +
Twine(
" '") +
5011 Lex.getStrVal() +
"'");
5012 assert(CC <= Result.Max &&
"Expected valid DWARF calling convention");
5020 EmissionKindField &Result) {
5022 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5025 return tokError(
"expected emission kind");
5029 return tokError(
"invalid emission kind" +
Twine(
" '") + Lex.getStrVal() +
5031 assert(*Kind <= Result.Max &&
"Expected valid emission kind");
5032 Result.assign(*Kind);
5039 FixedPointKindField &Result) {
5041 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5044 return tokError(
"expected fixed-point kind");
5048 return tokError(
"invalid fixed-point kind" +
Twine(
" '") + Lex.getStrVal() +
5050 assert(*Kind <= Result.Max &&
"Expected valid fixed-point kind");
5051 Result.assign(*Kind);
5058 NameTableKindField &Result) {
5060 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5063 return tokError(
"expected nameTable kind");
5067 return tokError(
"invalid nameTable kind" +
Twine(
" '") + Lex.getStrVal() +
5069 assert(((
unsigned)*Kind) <= Result.Max &&
"Expected valid nameTable kind");
5070 Result.assign((
unsigned)*Kind);
5077 DwarfAttEncodingField &Result) {
5079 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5082 return tokError(
"expected DWARF type attribute encoding");
5086 return tokError(
"invalid DWARF type attribute encoding" +
Twine(
" '") +
5087 Lex.getStrVal() +
"'");
5088 assert(Encoding <= Result.Max &&
"Expected valid DWARF language");
5089 Result.assign(Encoding);
5103 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5105 bool Res = parseUInt32(TempVal);
5111 return tokError(
"expected debug info flag");
5115 return tokError(
Twine(
"invalid debug info flag '") + Lex.getStrVal() +
5130 Result.assign(Combined);
5143 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5145 bool Res = parseUInt32(TempVal);
5151 return tokError(
"expected debug info flag");
5155 return tokError(
Twine(
"invalid subprogram debug info flag '") +
5156 Lex.getStrVal() +
"'");
5170 Result.assign(Combined);
5177 return tokError(
"expected signed integer");
5179 auto &S = Lex.getAPSIntVal();
5181 return tokError(
"value for '" + Name +
"' too small, limit is " +
5184 return tokError(
"value for '" + Name +
"' too large, limit is " +
5186 Result.assign(S.getExtValue());
5187 assert(Result.Val >= Result.Min &&
"Expected value in range");
5188 assert(Result.Val <= Result.Max &&
"Expected value in range");
5195 switch (Lex.getKind()) {
5197 return tokError(
"expected 'true' or 'false'");
5199 Result.assign(
true);
5202 Result.assign(
false);
5212 if (!Result.AllowNull)
5213 return tokError(
"'" + Name +
"' cannot be null");
5215 Result.assign(
nullptr);
5220 if (parseMetadata(MD,
nullptr))
5229 MDSignedOrMDField &Result) {
5232 MDSignedField Res = Result.A;
5233 if (!parseMDField(
Loc, Name, Res)) {
5241 MDField Res = Result.B;
5242 if (!parseMDField(
Loc, Name, Res)) {
5252 MDUnsignedOrMDField &Result) {
5255 MDUnsignedField Res = Result.A;
5256 if (!parseMDField(
Loc, Name, Res)) {
5264 MDField Res = Result.B;
5265 if (!parseMDField(
Loc, Name, Res)) {
5275 LocTy ValueLoc = Lex.getLoc();
5277 if (parseStringConstant(S))
5281 switch (Result.EmptyIs) {
5282 case MDStringField::EmptyIs::Null:
5283 Result.assign(
nullptr);
5285 case MDStringField::EmptyIs::Empty:
5287 case MDStringField::EmptyIs::Error:
5288 return error(ValueLoc,
"'" + Name +
"' cannot be empty");
5299 if (parseMDNodeVector(MDs))
5302 Result.assign(std::move(MDs));
5308 ChecksumKindField &Result) {
5309 std::optional<DIFile::ChecksumKind> CSKind =
5313 return tokError(
"invalid checksum kind" +
Twine(
" '") + Lex.getStrVal() +
5316 Result.assign(*CSKind);
5323template <
class ParserTy>
5324bool LLParser::parseMDFieldsImplBody(ParserTy ParseField) {
5327 return tokError(
"expected field label here");
5336template <
class ParserTy>
5337bool LLParser::parseMDFieldsImpl(ParserTy ParseField, LocTy &ClosingLoc) {
5344 if (parseMDFieldsImplBody(ParseField))
5347 ClosingLoc = Lex.getLoc();
5351template <
class FieldTy>
5352bool LLParser::parseMDField(
StringRef Name, FieldTy &Result) {
5354 return tokError(
"field '" + Name +
"' cannot be specified more than once");
5356 LocTy Loc = Lex.getLoc();
5358 return parseMDField(Loc, Name, Result);
5361bool LLParser::parseSpecializedMDNode(
MDNode *&
N,
bool IsDistinct) {
5364#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
5365 if (Lex.getStrVal() == #CLASS) \
5366 return parse##CLASS(N, IsDistinct);
5367#include "llvm/IR/Metadata.def"
5369 return tokError(
"expected metadata type");
5372#define DECLARE_FIELD(NAME, TYPE, INIT) TYPE NAME INIT
5373#define NOP_FIELD(NAME, TYPE, INIT)
5374#define REQUIRE_FIELD(NAME, TYPE, INIT) \
5376 return error(ClosingLoc, "missing required field '" #NAME "'");
5377#define PARSE_MD_FIELD(NAME, TYPE, DEFAULT) \
5378 if (Lex.getStrVal() == #NAME) \
5379 return parseMDField(#NAME, NAME);
5380#define PARSE_MD_FIELDS() \
5381 VISIT_MD_FIELDS(DECLARE_FIELD, DECLARE_FIELD) \
5384 if (parseMDFieldsImpl( \
5386 VISIT_MD_FIELDS(PARSE_MD_FIELD, PARSE_MD_FIELD) \
5387 return tokError(Twine("invalid field '") + Lex.getStrVal() + \
5392 VISIT_MD_FIELDS(NOP_FIELD, REQUIRE_FIELD) \
5394#define GET_OR_DISTINCT(CLASS, ARGS) \
5395 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
5400bool LLParser::parseDILocation(
MDNode *&Result,
bool IsDistinct) {
5401#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5402 OPTIONAL(line, LineField, ); \
5403 OPTIONAL(column, ColumnField, ); \
5404 REQUIRED(scope, MDField, ( false)); \
5405 OPTIONAL(inlinedAt, MDField, ); \
5406 OPTIONAL(isImplicitCode, MDBoolField, (false)); \
5407 OPTIONAL(atomGroup, MDUnsignedField, (0, UINT64_MAX)); \
5408 OPTIONAL(atomRank, MDUnsignedField, (0, UINT8_MAX));
5410#undef VISIT_MD_FIELDS
5413 DILocation, (Context, line.Val, column.Val, scope.Val, inlinedAt.Val,
5414 isImplicitCode.Val, atomGroup.Val, atomRank.Val));
5420bool LLParser::parseDIAssignID(
MDNode *&Result,
bool IsDistinct) {
5422 return tokError(
"missing 'distinct', required for !DIAssignID()");
5438bool LLParser::parseGenericDINode(
MDNode *&Result,
bool IsDistinct) {
5439#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5440 REQUIRED(tag, DwarfTagField, ); \
5441 OPTIONAL(header, MDStringField, ); \
5442 OPTIONAL(operands, MDFieldList, );
5444#undef VISIT_MD_FIELDS
5447 (Context, tag.Val, header.Val, operands.Val));
5456bool LLParser::parseDISubrangeType(
MDNode *&Result,
bool IsDistinct) {
5457#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5458 OPTIONAL(name, MDStringField, ); \
5459 OPTIONAL(file, MDField, ); \
5460 OPTIONAL(line, LineField, ); \
5461 OPTIONAL(scope, MDField, ); \
5462 OPTIONAL(baseType, MDField, ); \
5463 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5464 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5465 OPTIONAL(flags, DIFlagField, ); \
5466 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5467 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5468 OPTIONAL(stride, MDSignedOrMDField, ); \
5469 OPTIONAL(bias, MDSignedOrMDField, );
5471#undef VISIT_MD_FIELDS
5473 auto convToMetadata = [&](MDSignedOrMDField Bound) ->
Metadata * {
5474 if (Bound.isMDSignedField())
5477 if (Bound.isMDField())
5478 return Bound.getMDFieldValue();
5482 Metadata *LowerBound = convToMetadata(lowerBound);
5484 Metadata *Stride = convToMetadata(stride);
5485 Metadata *Bias = convToMetadata(bias);
5488 DISubrangeType, (Context,
name.Val,
file.Val, line.Val, scope.Val,
5489 size.getValueAsMetadata(Context), align.Val, flags.Val,
5490 baseType.Val, LowerBound, UpperBound, Stride, Bias));
5499bool LLParser::parseDISubrange(
MDNode *&Result,
bool IsDistinct) {
5500#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5501 OPTIONAL(count, MDSignedOrMDField, (-1, -1, INT64_MAX, false)); \
5502 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5503 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5504 OPTIONAL(stride, MDSignedOrMDField, );
5506#undef VISIT_MD_FIELDS
5513 auto convToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5514 if (Bound.isMDSignedField())
5517 if (Bound.isMDField())
5518 return Bound.getMDFieldValue();
5523 LowerBound = convToMetadata(lowerBound);
5525 Stride = convToMetadata(stride);
5528 (Context,
Count, LowerBound, UpperBound, Stride));
5536bool LLParser::parseDIGenericSubrange(
MDNode *&Result,
bool IsDistinct) {
5537#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5538 OPTIONAL(count, MDSignedOrMDField, ); \
5539 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5540 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5541 OPTIONAL(stride, MDSignedOrMDField, );
5543#undef VISIT_MD_FIELDS
5545 auto ConvToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5546 if (Bound.isMDSignedField())
5548 Context, {dwarf::DW_OP_consts,
5549 static_cast<uint64_t
>(Bound.getMDSignedValue())});
5550 if (Bound.isMDField())
5551 return Bound.getMDFieldValue();
5556 Metadata *LowerBound = ConvToMetadata(lowerBound);
5558 Metadata *Stride = ConvToMetadata(stride);
5561 (Context,
Count, LowerBound, UpperBound, Stride));
5568bool LLParser::parseDIEnumerator(
MDNode *&Result,
bool IsDistinct) {
5569#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5570 REQUIRED(name, MDStringField, ); \
5571 REQUIRED(value, MDAPSIntField, ); \
5572 OPTIONAL(isUnsigned, MDBoolField, (false));
5574#undef VISIT_MD_FIELDS
5576 if (isUnsigned.Val && value.Val.isNegative())
5577 return tokError(
"unsigned enumerator with negative value");
5582 if (!isUnsigned.Val && value.Val.isUnsigned() && value.Val.isSignBitSet())
5594bool LLParser::parseDIBasicType(
MDNode *&Result,
bool IsDistinct) {
5595#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5596 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5597 OPTIONAL(name, MDStringField, ); \
5598 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5599 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5600 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5601 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5602 OPTIONAL(flags, DIFlagField, );
5604#undef VISIT_MD_FIELDS
5607 size.getValueAsMetadata(Context),
5608 align.Val, encoding.Val,
5609 num_extra_inhabitants.Val, flags.Val));
5618bool LLParser::parseDIFixedPointType(
MDNode *&Result,
bool IsDistinct) {
5619#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5620 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5621 OPTIONAL(name, MDStringField, ); \
5622 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5623 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5624 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5625 OPTIONAL(flags, DIFlagField, ); \
5626 OPTIONAL(kind, FixedPointKindField, ); \
5627 OPTIONAL(factor, MDSignedField, ); \
5628 OPTIONAL(numerator, MDAPSIntField, ); \
5629 OPTIONAL(denominator, MDAPSIntField, );
5631#undef VISIT_MD_FIELDS
5634 (Context, tag.Val,
name.Val,
5635 size.getValueAsMetadata(Context), align.Val,
5636 encoding.Val, flags.Val, kind.Val, factor.Val,
5637 numerator.Val, denominator.Val));
5643bool LLParser::parseDIStringType(
MDNode *&Result,
bool IsDistinct) {
5644#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5645 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_string_type)); \
5646 OPTIONAL(name, MDStringField, ); \
5647 OPTIONAL(stringLength, MDField, ); \
5648 OPTIONAL(stringLengthExpression, MDField, ); \
5649 OPTIONAL(stringLocationExpression, MDField, ); \
5650 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5651 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5652 OPTIONAL(encoding, DwarfAttEncodingField, );
5654#undef VISIT_MD_FIELDS
5658 (Context, tag.Val,
name.Val, stringLength.Val, stringLengthExpression.Val,
5659 stringLocationExpression.Val,
size.getValueAsMetadata(Context),
5660 align.Val, encoding.Val));
5673bool LLParser::parseDIDerivedType(
MDNode *&Result,
bool IsDistinct) {
5674#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5675 REQUIRED(tag, DwarfTagField, ); \
5676 OPTIONAL(name, MDStringField, ); \
5677 OPTIONAL(file, MDField, ); \
5678 OPTIONAL(line, LineField, ); \
5679 OPTIONAL(scope, MDField, ); \
5680 REQUIRED(baseType, MDField, ); \
5681 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5682 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5683 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5684 OPTIONAL(flags, DIFlagField, ); \
5685 OPTIONAL(extraData, MDField, ); \
5686 OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
5687 OPTIONAL(annotations, MDField, ); \
5688 OPTIONAL(ptrAuthKey, MDUnsignedField, (0, 7)); \
5689 OPTIONAL(ptrAuthIsAddressDiscriminated, MDBoolField, ); \
5690 OPTIONAL(ptrAuthExtraDiscriminator, MDUnsignedField, (0, 0xffff)); \
5691 OPTIONAL(ptrAuthIsaPointer, MDBoolField, ); \
5692 OPTIONAL(ptrAuthAuthenticatesNullValues, MDBoolField, );
5694#undef VISIT_MD_FIELDS
5696 std::optional<unsigned> DWARFAddressSpace;
5697 if (dwarfAddressSpace.Val != UINT32_MAX)
5698 DWARFAddressSpace = dwarfAddressSpace.Val;
5699 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
5701 PtrAuthData.emplace(
5702 (
unsigned)ptrAuthKey.Val, ptrAuthIsAddressDiscriminated.Val,
5703 (
unsigned)ptrAuthExtraDiscriminator.Val, ptrAuthIsaPointer.Val,
5704 ptrAuthAuthenticatesNullValues.Val);
5707 DIDerivedType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
5708 baseType.Val,
size.getValueAsMetadata(Context), align.Val,
5709 offset.getValueAsMetadata(Context), DWARFAddressSpace,
5710 PtrAuthData, flags.Val, extraData.Val, annotations.Val));
5714bool LLParser::parseDICompositeType(
MDNode *&Result,
bool IsDistinct) {
5715#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5716 REQUIRED(tag, DwarfTagField, ); \
5717 OPTIONAL(name, MDStringField, ); \
5718 OPTIONAL(file, MDField, ); \
5719 OPTIONAL(line, LineField, ); \
5720 OPTIONAL(scope, MDField, ); \
5721 OPTIONAL(baseType, MDField, ); \
5722 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5723 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5724 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5725 OPTIONAL(flags, DIFlagField, ); \
5726 OPTIONAL(elements, MDField, ); \
5727 OPTIONAL(runtimeLang, DwarfLangField, ); \
5728 OPTIONAL(enumKind, DwarfEnumKindField, ); \
5729 OPTIONAL(vtableHolder, MDField, ); \
5730 OPTIONAL(templateParams, MDField, ); \
5731 OPTIONAL(identifier, MDStringField, ); \
5732 OPTIONAL(discriminator, MDField, ); \
5733 OPTIONAL(dataLocation, MDField, ); \
5734 OPTIONAL(associated, MDField, ); \
5735 OPTIONAL(allocated, MDField, ); \
5736 OPTIONAL(rank, MDSignedOrMDField, ); \
5737 OPTIONAL(annotations, MDField, ); \
5738 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5739 OPTIONAL(specification, MDField, ); \
5740 OPTIONAL(bitStride, MDField, );
5742#undef VISIT_MD_FIELDS
5745 if (rank.isMDSignedField())
5748 else if (rank.isMDField())
5749 Rank = rank.getMDFieldValue();
5751 std::optional<unsigned> EnumKind;
5753 EnumKind = enumKind.Val;
5758 Context, *identifier.Val, tag.Val,
name.Val,
file.Val, line.Val,
5759 scope.Val, baseType.Val,
size.getValueAsMetadata(Context),
5760 align.Val, offset.getValueAsMetadata(Context), specification.Val,
5761 num_extra_inhabitants.Val, flags.Val, elements.Val, runtimeLang.Val,
5762 EnumKind, vtableHolder.Val, templateParams.Val, discriminator.Val,
5763 dataLocation.Val, associated.Val, allocated.Val, Rank,
5764 annotations.Val, bitStride.Val)) {
5773 (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val, baseType.Val,
5774 size.getValueAsMetadata(Context), align.Val,
5775 offset.getValueAsMetadata(Context), flags.Val, elements.Val,
5776 runtimeLang.Val, EnumKind, vtableHolder.Val, templateParams.Val,
5777 identifier.Val, discriminator.Val, dataLocation.Val, associated.Val,
5778 allocated.Val, Rank, annotations.Val, specification.Val,
5779 num_extra_inhabitants.Val, bitStride.Val));
5783bool LLParser::parseDISubroutineType(
MDNode *&Result,
bool IsDistinct) {
5784#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5785 OPTIONAL(flags, DIFlagField, ); \
5786 OPTIONAL(cc, DwarfCCField, ); \
5787 REQUIRED(types, MDField, );
5789#undef VISIT_MD_FIELDS
5792 (Context, flags.Val, cc.Val, types.Val));
5801bool LLParser::parseDIFile(
MDNode *&Result,
bool IsDistinct) {
5805#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5806 REQUIRED(filename, MDStringField, ); \
5807 REQUIRED(directory, MDStringField, ); \
5808 OPTIONAL(checksumkind, ChecksumKindField, (DIFile::CSK_MD5)); \
5809 OPTIONAL(checksum, MDStringField, ); \
5810 OPTIONAL(source, MDStringField, (MDStringField::EmptyIs::Empty));
5812#undef VISIT_MD_FIELDS
5814 std::optional<DIFile::ChecksumInfo<MDString *>> OptChecksum;
5815 if (checksumkind.Seen && checksum.Seen)
5816 OptChecksum.emplace(checksumkind.Val, checksum.Val);
5817 else if (checksumkind.Seen || checksum.Seen)
5818 return tokError(
"'checksumkind' and 'checksum' must be provided together");
5820 MDString *
Source =
nullptr;
5824 DIFile, (Context,
filename.Val, directory.Val, OptChecksum, Source));
5835bool LLParser::parseDICompileUnit(
MDNode *&Result,
bool IsDistinct) {
5837 return tokError(
"missing 'distinct', required for !DICompileUnit");
5839#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5840 REQUIRED(language, DwarfLangField, ); \
5841 REQUIRED(file, MDField, ( false)); \
5842 OPTIONAL(producer, MDStringField, ); \
5843 OPTIONAL(isOptimized, MDBoolField, ); \
5844 OPTIONAL(flags, MDStringField, ); \
5845 OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); \
5846 OPTIONAL(splitDebugFilename, MDStringField, ); \
5847 OPTIONAL(emissionKind, EmissionKindField, ); \
5848 OPTIONAL(enums, MDField, ); \
5849 OPTIONAL(retainedTypes, MDField, ); \
5850 OPTIONAL(globals, MDField, ); \
5851 OPTIONAL(imports, MDField, ); \
5852 OPTIONAL(macros, MDField, ); \
5853 OPTIONAL(dwoId, MDUnsignedField, ); \
5854 OPTIONAL(splitDebugInlining, MDBoolField, = true); \
5855 OPTIONAL(debugInfoForProfiling, MDBoolField, = false); \
5856 OPTIONAL(nameTableKind, NameTableKindField, ); \
5857 OPTIONAL(rangesBaseAddress, MDBoolField, = false); \
5858 OPTIONAL(sysroot, MDStringField, ); \
5859 OPTIONAL(sdk, MDStringField, );
5861#undef VISIT_MD_FIELDS
5864 Context, language.Val,
file.Val, producer.Val, isOptimized.Val, flags.Val,
5865 runtimeVersion.Val, splitDebugFilename.Val, emissionKind.Val, enums.Val,
5866 retainedTypes.Val,
globals.Val, imports.Val, macros.Val, dwoId.Val,
5867 splitDebugInlining.Val, debugInfoForProfiling.Val, nameTableKind.Val,
5868 rangesBaseAddress.Val, sysroot.Val, sdk.Val);
5881bool LLParser::parseDISubprogram(
MDNode *&Result,
bool IsDistinct) {
5882 auto Loc = Lex.getLoc();
5883#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5884 OPTIONAL(scope, MDField, ); \
5885 OPTIONAL(name, MDStringField, ); \
5886 OPTIONAL(linkageName, MDStringField, ); \
5887 OPTIONAL(file, MDField, ); \
5888 OPTIONAL(line, LineField, ); \
5889 OPTIONAL(type, MDField, ); \
5890 OPTIONAL(isLocal, MDBoolField, ); \
5891 OPTIONAL(isDefinition, MDBoolField, (true)); \
5892 OPTIONAL(scopeLine, LineField, ); \
5893 OPTIONAL(containingType, MDField, ); \
5894 OPTIONAL(virtuality, DwarfVirtualityField, ); \
5895 OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); \
5896 OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); \
5897 OPTIONAL(flags, DIFlagField, ); \
5898 OPTIONAL(spFlags, DISPFlagField, ); \
5899 OPTIONAL(isOptimized, MDBoolField, ); \
5900 OPTIONAL(unit, MDField, ); \
5901 OPTIONAL(templateParams, MDField, ); \
5902 OPTIONAL(declaration, MDField, ); \
5903 OPTIONAL(retainedNodes, MDField, ); \
5904 OPTIONAL(thrownTypes, MDField, ); \
5905 OPTIONAL(annotations, MDField, ); \
5906 OPTIONAL(targetFuncName, MDStringField, ); \
5907 OPTIONAL(keyInstructions, MDBoolField, );
5909#undef VISIT_MD_FIELDS
5914 spFlags.Seen ? spFlags.Val
5916 isOptimized.Val, virtuality.Val);
5917 if ((SPFlags & DISubprogram::SPFlagDefinition) && !IsDistinct)
5920 "missing 'distinct', required for !DISubprogram that is a Definition");
5923 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val, line.Val,
5924 type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
5925 thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
5926 declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
5927 targetFuncName.Val, keyInstructions.Val));
5933bool LLParser::parseDILexicalBlock(
MDNode *&Result,
bool IsDistinct) {
5934#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5935 REQUIRED(scope, MDField, ( false)); \
5936 OPTIONAL(file, MDField, ); \
5937 OPTIONAL(line, LineField, ); \
5938 OPTIONAL(column, ColumnField, );
5940#undef VISIT_MD_FIELDS
5943 DILexicalBlock, (Context, scope.Val,
file.Val, line.Val, column.Val));
5949bool LLParser::parseDILexicalBlockFile(
MDNode *&Result,
bool IsDistinct) {
5950#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5951 REQUIRED(scope, MDField, ( false)); \
5952 OPTIONAL(file, MDField, ); \
5953 REQUIRED(discriminator, MDUnsignedField, (0, UINT32_MAX));
5955#undef VISIT_MD_FIELDS
5958 (Context, scope.Val,
file.Val, discriminator.Val));
5964bool LLParser::parseDICommonBlock(
MDNode *&Result,
bool IsDistinct) {
5965#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5966 REQUIRED(scope, MDField, ); \
5967 OPTIONAL(declaration, MDField, ); \
5968 OPTIONAL(name, MDStringField, ); \
5969 OPTIONAL(file, MDField, ); \
5970 OPTIONAL(line, LineField, );
5972#undef VISIT_MD_FIELDS
5975 (Context, scope.Val, declaration.Val,
name.Val,
5976 file.Val, line.Val));
5982bool LLParser::parseDINamespace(
MDNode *&Result,
bool IsDistinct) {
5983#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5984 REQUIRED(scope, MDField, ); \
5985 OPTIONAL(name, MDStringField, ); \
5986 OPTIONAL(exportSymbols, MDBoolField, );
5988#undef VISIT_MD_FIELDS
5991 (Context, scope.Val,
name.Val, exportSymbols.Val));
5998bool LLParser::parseDIMacro(
MDNode *&Result,
bool IsDistinct) {
5999#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6000 REQUIRED(type, DwarfMacinfoTypeField, ); \
6001 OPTIONAL(line, LineField, ); \
6002 REQUIRED(name, MDStringField, ); \
6003 OPTIONAL(value, MDStringField, );
6005#undef VISIT_MD_FIELDS
6008 (Context, type.Val, line.Val,
name.Val, value.Val));
6014bool LLParser::parseDIMacroFile(
MDNode *&Result,
bool IsDistinct) {
6015#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6016 OPTIONAL(type, DwarfMacinfoTypeField, (dwarf::DW_MACINFO_start_file)); \
6017 OPTIONAL(line, LineField, ); \
6018 REQUIRED(file, MDField, ); \
6019 OPTIONAL(nodes, MDField, );
6021#undef VISIT_MD_FIELDS
6024 (Context, type.Val, line.Val,
file.Val,
nodes.Val));
6032bool LLParser::parseDIModule(
MDNode *&Result,
bool IsDistinct) {
6033#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6034 REQUIRED(scope, MDField, ); \
6035 REQUIRED(name, MDStringField, ); \
6036 OPTIONAL(configMacros, MDStringField, ); \
6037 OPTIONAL(includePath, MDStringField, ); \
6038 OPTIONAL(apinotes, MDStringField, ); \
6039 OPTIONAL(file, MDField, ); \
6040 OPTIONAL(line, LineField, ); \
6041 OPTIONAL(isDecl, MDBoolField, );
6043#undef VISIT_MD_FIELDS
6046 configMacros.Val, includePath.Val,
6047 apinotes.Val, line.Val, isDecl.Val));
6053bool LLParser::parseDITemplateTypeParameter(
MDNode *&Result,
bool IsDistinct) {
6054#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6055 OPTIONAL(name, MDStringField, ); \
6056 REQUIRED(type, MDField, ); \
6057 OPTIONAL(defaulted, MDBoolField, );
6059#undef VISIT_MD_FIELDS
6062 (Context,
name.Val, type.Val, defaulted.Val));
6070bool LLParser::parseDITemplateValueParameter(
MDNode *&Result,
bool IsDistinct) {
6071#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6072 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_template_value_parameter)); \
6073 OPTIONAL(name, MDStringField, ); \
6074 OPTIONAL(type, MDField, ); \
6075 OPTIONAL(defaulted, MDBoolField, ); \
6076 REQUIRED(value, MDField, );
6079#undef VISIT_MD_FIELDS
6082 DITemplateValueParameter,
6083 (Context, tag.Val,
name.Val, type.Val, defaulted.Val, value.Val));
6092bool LLParser::parseDIGlobalVariable(
MDNode *&Result,
bool IsDistinct) {
6093#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6094 OPTIONAL(name, MDStringField, (MDStringField::EmptyIs::Error)); \
6095 OPTIONAL(scope, MDField, ); \
6096 OPTIONAL(linkageName, MDStringField, ); \
6097 OPTIONAL(file, MDField, ); \
6098 OPTIONAL(line, LineField, ); \
6099 OPTIONAL(type, MDField, ); \
6100 OPTIONAL(isLocal, MDBoolField, ); \
6101 OPTIONAL(isDefinition, MDBoolField, (true)); \
6102 OPTIONAL(templateParams, MDField, ); \
6103 OPTIONAL(declaration, MDField, ); \
6104 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6105 OPTIONAL(annotations, MDField, );
6107#undef VISIT_MD_FIELDS
6111 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val,
6112 line.Val, type.Val, isLocal.Val, isDefinition.Val,
6113 declaration.Val, templateParams.Val, align.Val,
6125bool LLParser::parseDILocalVariable(
MDNode *&Result,
bool IsDistinct) {
6126#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6127 REQUIRED(scope, MDField, ( false)); \
6128 OPTIONAL(name, MDStringField, ); \
6129 OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); \
6130 OPTIONAL(file, MDField, ); \
6131 OPTIONAL(line, LineField, ); \
6132 OPTIONAL(type, MDField, ); \
6133 OPTIONAL(flags, DIFlagField, ); \
6134 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6135 OPTIONAL(annotations, MDField, );
6137#undef VISIT_MD_FIELDS
6140 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6141 type.Val, arg.Val, flags.Val, align.Val,
6148bool LLParser::parseDILabel(
MDNode *&Result,
bool IsDistinct) {
6149#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6150 REQUIRED(scope, MDField, ( false)); \
6151 REQUIRED(name, MDStringField, ); \
6152 REQUIRED(file, MDField, ); \
6153 REQUIRED(line, LineField, ); \
6154 OPTIONAL(column, ColumnField, ); \
6155 OPTIONAL(isArtificial, MDBoolField, ); \
6156 OPTIONAL(coroSuspendIdx, MDUnsignedField, );
6158#undef VISIT_MD_FIELDS
6160 std::optional<unsigned> CoroSuspendIdx =
6161 coroSuspendIdx.Seen ? std::optional<unsigned>(coroSuspendIdx.Val)
6165 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6166 column.Val, isArtificial.Val, CoroSuspendIdx));
6172bool LLParser::parseDIExpressionBody(
MDNode *&Result,
bool IsDistinct) {
6185 return tokError(Twine(
"invalid DWARF op '") + Lex.getStrVal() +
"'");
6194 return tokError(Twine(
"invalid DWARF attribute encoding '") +
6195 Lex.getStrVal() +
"'");
6198 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
6199 return tokError(
"expected unsigned integer");
6201 auto &
U = Lex.getAPSIntVal();
6203 return tokError(
"element too large, limit is " + Twine(
UINT64_MAX));
6217bool LLParser::parseDIExpression(
MDNode *&Result,
bool IsDistinct) {
6219 assert(Lex.getStrVal() ==
"DIExpression" &&
"Expected '!DIExpression'");
6222 return parseDIExpressionBody(Result, IsDistinct);
6227bool LLParser::parseDIArgList(
Metadata *&MD, PerFunctionState *PFS) {
6228 assert(PFS &&
"Expected valid function state");
6239 if (parseValueAsMetadata(MD,
"expected value-as-metadata operand", PFS))
6253bool LLParser::parseDIGlobalVariableExpression(
MDNode *&Result,
6255#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6256 REQUIRED(var, MDField, ); \
6257 REQUIRED(expr, MDField, );
6259#undef VISIT_MD_FIELDS
6262 GET_OR_DISTINCT(DIGlobalVariableExpression, (Context, var.Val, expr.Val));
6269bool LLParser::parseDIObjCProperty(
MDNode *&Result,
bool IsDistinct) {
6270#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6271 OPTIONAL(name, MDStringField, ); \
6272 OPTIONAL(file, MDField, ); \
6273 OPTIONAL(line, LineField, ); \
6274 OPTIONAL(setter, MDStringField, ); \
6275 OPTIONAL(getter, MDStringField, ); \
6276 OPTIONAL(attributes, MDUnsignedField, (0, UINT32_MAX)); \
6277 OPTIONAL(type, MDField, );
6279#undef VISIT_MD_FIELDS
6282 (Context,
name.Val,
file.Val, line.Val, setter.Val,
6283 getter.Val, attributes.Val, type.Val));
6290bool LLParser::parseDIImportedEntity(
MDNode *&Result,
bool IsDistinct) {
6291#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6292 REQUIRED(tag, DwarfTagField, ); \
6293 REQUIRED(scope, MDField, ); \
6294 OPTIONAL(entity, MDField, ); \
6295 OPTIONAL(file, MDField, ); \
6296 OPTIONAL(line, LineField, ); \
6297 OPTIONAL(name, MDStringField, ); \
6298 OPTIONAL(elements, MDField, );
6300#undef VISIT_MD_FIELDS
6303 (Context, tag.Val, scope.Val, entity.Val,
file.Val,
6304 line.Val,
name.Val, elements.Val));
6308#undef PARSE_MD_FIELD
6320bool LLParser::parseMetadataAsValue(
Value *&V, PerFunctionState &PFS) {
6323 if (parseMetadata(MD, &PFS))
6334bool LLParser::parseValueAsMetadata(
Metadata *&MD,
const Twine &TypeMsg,
6335 PerFunctionState *PFS) {
6338 if (parseType(Ty, TypeMsg, Loc))
6341 return error(Loc,
"invalid metadata-value-metadata roundtrip");
6344 if (parseValue(Ty, V, PFS))
6359bool LLParser::parseMetadata(
Metadata *&MD, PerFunctionState *PFS) {
6363 if (Lex.getStrVal() ==
"DIArgList") {
6365 if (parseDIArgList(AL, PFS))
6371 if (parseSpecializedMDNode(
N)) {
6381 return parseValueAsMetadata(MD,
"expected metadata operand", PFS);
6391 if (parseMDString(S))
6401 if (parseMDNodeTail(
N))
6412 PerFunctionState *PFS) {
6414 return error(
ID.Loc,
"functions are not values, refer to them as pointers");
6419 return error(
ID.Loc,
"invalid use of function-local name");
6420 V = PFS->getVal(
ID.UIntVal, Ty,
ID.Loc);
6421 return V ==
nullptr;
6424 return error(
ID.Loc,
"invalid use of function-local name");
6425 V = PFS->getVal(
ID.StrVal, Ty,
ID.Loc);
6426 return V ==
nullptr;
6429 return error(
ID.Loc,
"invalid type for inline asm constraint string");
6433 ID.FTy,
ID.StrVal,
ID.StrVal2,
ID.UIntVal & 1, (
ID.UIntVal >> 1) & 1,
6438 V = getGlobalVal(
ID.StrVal, Ty,
ID.Loc);
6441 return V ==
nullptr;
6443 V = getGlobalVal(
ID.UIntVal, Ty,
ID.Loc);
6446 return V ==
nullptr;
6449 return error(
ID.Loc,
"integer constant must have integer type");
6451 V = ConstantInt::get(Context,
ID.APSIntVal);
6456 return error(
ID.Loc,
"floating point constant invalid for type");
6462 bool IsSNAN =
ID.APFloatVal.isSignaling();
6477 APInt Payload =
ID.APFloatVal.bitcastToAPInt();
6479 ID.APFloatVal.isNegative(), &Payload);
6482 V = ConstantFP::get(Context,
ID.APFloatVal);
6484 if (
V->getType() != Ty)
6485 return error(
ID.Loc,
"floating point constant does not have type '" +
6491 return error(
ID.Loc,
"null must be a pointer type");
6497 return error(
ID.Loc,
"invalid type for undef constant");
6502 return error(
ID.Loc,
"invalid empty array initializer");
6508 return error(
ID.Loc,
"invalid type for null constant");
6511 return error(
ID.Loc,
"invalid type for null constant");
6516 return error(
ID.Loc,
"invalid type for none constant");
6522 return error(
ID.Loc,
"invalid type for poison constant");
6526 if (
ID.ConstantVal->getType() != Ty)
6527 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6534 return error(
ID.Loc,
"vector constant must have vector type");
6536 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6538 "' but expected '" +
6546 if (
ST->getNumElements() !=
ID.UIntVal)
6548 "initializer with struct type has wrong # elements");
6550 return error(
ID.Loc,
"packed'ness of initializer and type don't match");
6553 for (
unsigned i = 0, e =
ID.UIntVal; i != e; ++i)
6554 if (
ID.ConstantStructElts[i]->getType() !=
ST->getElementType(i))
6557 "element " + Twine(i) +
6558 " of struct initializer doesn't match struct element type");
6561 ST,
ArrayRef(
ID.ConstantStructElts.get(),
ID.UIntVal));
6563 return error(
ID.Loc,
"constant expression type mismatch");
6572 auto Loc = Lex.getLoc();
6573 if (parseValID(
ID,
nullptr))
6586 if (convertValIDToValue(Ty,
ID, V,
nullptr))
6596 return error(Loc,
"expected a constant value");
6600bool LLParser::parseValue(
Type *Ty,
Value *&V, PerFunctionState *PFS) {
6603 return parseValID(
ID, PFS, Ty) ||
6604 convertValIDToValue(Ty,
ID, V, PFS);
6607bool LLParser::parseTypeAndValue(
Value *&V, PerFunctionState *PFS) {
6609 return parseType(Ty) || parseValue(Ty, V, PFS);
6612bool LLParser::parseTypeAndBasicBlock(
BasicBlock *&BB, LocTy &
Loc,
6613 PerFunctionState &PFS) {
6616 if (parseTypeAndValue(V, PFS))
6619 return error(Loc,
"expected a basic block");
6628 if (!Name.starts_with(
"llvm.dbg."))
6631 return FnID == Intrinsic::dbg_declare || FnID == Intrinsic::dbg_value ||
6632 FnID == Intrinsic::dbg_assign;
6640bool LLParser::parseFunctionHeader(
Function *&Fn,
bool IsDefine,
6641 unsigned &FunctionNumber,
6644 LocTy LinkageLoc = Lex.getLoc();
6646 unsigned Visibility;
6647 unsigned DLLStorageClass;
6649 AttrBuilder RetAttrs(M->getContext());
6652 Type *RetType =
nullptr;
6653 LocTy RetTypeLoc = Lex.getLoc();
6654 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
6656 parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
6657 parseType(RetType, RetTypeLoc,
true ))
6666 return error(LinkageLoc,
"invalid linkage for function definition");
6676 return error(LinkageLoc,
"invalid linkage for function declaration");
6680 return error(LinkageLoc,
"invalid function linkage type");
6684 return error(LinkageLoc,
6685 "symbol with local linkage must have default visibility");
6688 return error(LinkageLoc,
6689 "symbol with local linkage cannot have a DLL storage class");
6692 return error(RetTypeLoc,
"invalid function return type");
6694 LocTy NameLoc = Lex.getLoc();
6696 std::string FunctionName;
6698 FunctionName = Lex.getStrVal();
6700 FunctionNumber = Lex.getUIntVal();
6701 if (checkValueID(NameLoc,
"function",
"@", NumberedVals.getNext(),
6705 return tokError(
"expected function name");
6711 return tokError(
"expected '(' in function argument list");
6715 AttrBuilder FuncAttrs(M->getContext());
6716 std::vector<unsigned> FwdRefAttrGrps;
6719 std::string Partition;
6720 MaybeAlign Alignment;
6723 unsigned AddrSpace = 0;
6729 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg) ||
6730 parseOptionalUnnamedAddr(UnnamedAddr) ||
6731 parseOptionalProgramAddrSpace(AddrSpace) ||
6732 parseFnAttributeValuePairs(FuncAttrs, FwdRefAttrGrps,
false,
6736 parseOptionalComdat(FunctionName,
C) ||
6737 parseOptionalAlignment(Alignment) ||
6738 (EatIfPresent(
lltok::kw_gc) && parseStringConstant(GC)) ||
6742 parseGlobalTypeAndValue(PersonalityFn)))
6745 if (FuncAttrs.contains(Attribute::Builtin))
6746 return error(BuiltinLoc,
"'builtin' attribute not valid on function");
6749 if (MaybeAlign
A = FuncAttrs.getAlignment()) {
6751 FuncAttrs.removeAttribute(Attribute::Alignment);
6756 std::vector<Type*> ParamTypeList;
6759 for (
const ArgInfo &Arg : ArgList) {
6760 ParamTypeList.push_back(Arg.Ty);
6761 Attrs.push_back(Arg.Attrs);
6768 if (PAL.hasParamAttr(0, Attribute::StructRet) && !RetType->
isVoidTy())
6769 return error(RetTypeLoc,
"functions with 'sret' argument must return void");
6775 GlobalValue *FwdFn =
nullptr;
6776 if (!FunctionName.empty()) {
6779 auto FRVI = ForwardRefVals.find(FunctionName);
6780 if (FRVI != ForwardRefVals.end()) {
6781 FwdFn = FRVI->second.first;
6783 return error(FRVI->second.second,
6784 "invalid forward reference to "
6787 "' with wrong type: "
6791 ForwardRefVals.erase(FRVI);
6792 }
else if ((Fn = M->getFunction(FunctionName))) {
6794 return error(NameLoc,
6795 "invalid redefinition of function '" + FunctionName +
"'");
6796 }
else if (M->getNamedValue(FunctionName)) {
6797 return error(NameLoc,
"redefinition of function '@" + FunctionName +
"'");
6803 if (FunctionNumber == (
unsigned)-1)
6804 FunctionNumber = NumberedVals.getNext();
6808 auto I = ForwardRefValIDs.find(FunctionNumber);
6809 if (
I != ForwardRefValIDs.end()) {
6810 FwdFn =
I->second.first;
6812 return error(NameLoc,
"type of definition and forward reference of '@" +
6813 Twine(FunctionNumber) +
6818 ForwardRefValIDs.erase(
I);
6827 if (FunctionName.empty())
6828 NumberedVals.add(FunctionNumber, Fn);
6843 if (!
GC.empty()) Fn->
setGC(GC);
6846 ForwardRefAttrGroups[Fn] = FwdRefAttrGrps;
6850 for (
unsigned i = 0, e = ArgList.size(); i != e; ++i, ++ArgIt) {
6852 if (ArgList[i].
Name.empty())
continue;
6855 ArgIt->
setName(ArgList[i].Name);
6857 if (ArgIt->
getName() != ArgList[i].Name)
6858 return error(ArgList[i].Loc,
6859 "redefinition of argument '%" + ArgList[i].Name +
"'");
6872 if (FunctionName.empty()) {
6874 ID.UIntVal = FunctionNumber;
6877 ID.StrVal = FunctionName;
6879 auto Blocks = ForwardRefBlockAddresses.find(
ID);
6880 if (Blocks != ForwardRefBlockAddresses.end())
6881 return error(Blocks->first.Loc,
6882 "cannot take blockaddress inside a declaration");
6886bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
6888 if (FunctionNumber == -1) {
6890 ID.StrVal = std::string(F.getName());
6893 ID.UIntVal = FunctionNumber;
6896 auto Blocks = P.ForwardRefBlockAddresses.find(
ID);
6897 if (Blocks == P.ForwardRefBlockAddresses.end())
6900 for (
const auto &
I : Blocks->second) {
6901 const ValID &BBID =
I.first;
6902 GlobalValue *GV =
I.second;
6905 "Expected local id or name");
6912 return P.error(BBID.
Loc,
"referenced value is not a basic block");
6915 ResolvedVal = P.checkValidVariableType(BBID.
Loc, BBID.
StrVal, GV->
getType(),
6923 P.ForwardRefBlockAddresses.erase(Blocks);
6929bool LLParser::parseFunctionBody(Function &Fn,
unsigned FunctionNumber,
6930 ArrayRef<unsigned> UnnamedArgNums) {
6932 return tokError(
"expected '{' in function body");
6935 PerFunctionState PFS(*
this, Fn, FunctionNumber, UnnamedArgNums);
6939 if (PFS.resolveForwardRefBlockAddresses())
6945 return tokError(
"function body requires at least one basic block");
6949 if (parseBasicBlock(PFS))
6953 if (parseUseListOrder(&PFS))
6960 return PFS.finishFunction();
6965bool LLParser::parseBasicBlock(PerFunctionState &PFS) {
6969 LocTy NameLoc = Lex.getLoc();
6971 Name = Lex.getStrVal();
6974 NameID = Lex.getUIntVal();
6978 BasicBlock *BB = PFS.defineBB(Name, NameID, NameLoc);
6982 std::string NameStr;
6987 auto DeleteDbgRecord = [](DbgRecord *DR) { DR->deleteRecord(); };
6988 using DbgRecordPtr = std::unique_ptr<DbgRecord,
decltype(DeleteDbgRecord)>;
6995 if (SeenOldDbgInfoFormat)
6996 return error(Lex.getLoc(),
"debug record should not appear in a module "
6997 "containing debug info intrinsics");
6998 SeenNewDbgInfoFormat =
true;
7002 if (parseDebugRecord(DR, PFS))
7004 TrailingDbgRecord.emplace_back(DR, DeleteDbgRecord);
7009 LocTy NameLoc = Lex.getLoc();
7014 NameID = Lex.getUIntVal();
7016 if (parseToken(
lltok::equal,
"expected '=' after instruction id"))
7019 NameStr = Lex.getStrVal();
7021 if (parseToken(
lltok::equal,
"expected '=' after instruction name"))
7025 switch (parseInstruction(Inst, BB, PFS)) {
7028 case InstError:
return true;
7035 if (parseInstructionMetadata(*Inst))
7038 case InstExtraComma:
7043 if (parseInstructionMetadata(*Inst))
7049 if (PFS.setInstName(NameID, NameStr, NameLoc, Inst))
7053 for (DbgRecordPtr &DR : TrailingDbgRecord)
7055 TrailingDbgRecord.clear();
7058 assert(TrailingDbgRecord.empty() &&
7059 "All debug values should have been attached to an instruction.");
7068bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
7071 LocTy DVRLoc = Lex.getLoc();
7073 return error(DVRLoc,
"expected debug record type here");
7074 RecordKind
RecordType = StringSwitch<RecordKind>(Lex.getStrVal())
7075 .Case(
"declare", RecordKind::ValueKind)
7076 .Case(
"value", RecordKind::ValueKind)
7077 .Case(
"assign", RecordKind::ValueKind)
7078 .Case(
"label", RecordKind::LabelKind);
7087 if (parseMDNode(Label))
7092 if (parseMDNode(DbgLoc))
7100 LocType
ValueType = StringSwitch<LocType>(Lex.getStrVal())
7101 .Case(
"declare", LocType::Declare)
7102 .Case(
"value", LocType::Value)
7103 .Case(
"assign", LocType::Assign);
7111 if (parseMetadata(ValLocMD, &PFS))
7118 if (parseMDNode(Variable))
7125 if (parseMDNode(Expression))
7131 MDNode *AssignID =
nullptr;
7132 Metadata *AddressLocation =
nullptr;
7133 MDNode *AddressExpression =
nullptr;
7136 if (parseMDNode(AssignID))
7142 if (parseMetadata(AddressLocation, &PFS))
7148 if (parseMDNode(AddressExpression))
7162 ValueType, ValLocMD, Variable, Expression, AssignID, AddressLocation,
7172int LLParser::parseInstruction(Instruction *&Inst, BasicBlock *BB,
7173 PerFunctionState &PFS) {
7176 return tokError(
"found end of file when expecting more instructions");
7177 LocTy Loc = Lex.getLoc();
7178 unsigned KeywordVal = Lex.getUIntVal();
7183 return error(Loc,
"expected instruction opcode");
7187 return parseRet(Inst, BB, PFS);
7189 return parseBr(Inst, PFS);
7191 return parseSwitch(Inst, PFS);
7193 return parseIndirectBr(Inst, PFS);
7195 return parseInvoke(Inst, PFS);
7197 return parseResume(Inst, PFS);
7199 return parseCleanupRet(Inst, PFS);
7201 return parseCatchRet(Inst, PFS);
7203 return parseCatchSwitch(Inst, PFS);
7205 return parseCatchPad(Inst, PFS);
7207 return parseCleanupPad(Inst, PFS);
7209 return parseCallBr(Inst, PFS);
7212 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7213 int Res = parseUnaryOp(Inst, PFS, KeywordVal,
true);
7229 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7241 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7242 int Res = parseArithmetic(Inst, PFS, KeywordVal,
true);
7256 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7264 return parseArithmetic(Inst, PFS, KeywordVal,
7268 if (parseLogical(Inst, PFS, KeywordVal))
7276 return parseLogical(Inst, PFS, KeywordVal);
7279 if (parseCompare(Inst, PFS, KeywordVal))
7286 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7287 int Res = parseCompare(Inst, PFS, KeywordVal);
7299 bool Res = parseCast(Inst, PFS, KeywordVal);
7311 if (parseCast(Inst, PFS, KeywordVal))
7328 return parseCast(Inst, PFS, KeywordVal);
7331 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7332 if (parseCast(Inst, PFS, KeywordVal))
7341 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7342 int Res = parseSelect(Inst, PFS);
7347 return error(Loc,
"fast-math-flags specified for select without "
7348 "floating-point scalar or vector return type");
7354 return parseVAArg(Inst, PFS);
7356 return parseExtractElement(Inst, PFS);
7358 return parseInsertElement(Inst, PFS);
7360 return parseShuffleVector(Inst, PFS);
7362 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7363 int Res = parsePHI(Inst, PFS);
7368 return error(Loc,
"fast-math-flags specified for phi without "
7369 "floating-point scalar or vector return type");
7375 return parseLandingPad(Inst, PFS);
7377 return parseFreeze(Inst, PFS);
7389 return parseAlloc(Inst, PFS);
7391 return parseLoad(Inst, PFS);
7393 return parseStore(Inst, PFS);
7395 return parseCmpXchg(Inst, PFS);
7397 return parseAtomicRMW(Inst, PFS);
7399 return parseFence(Inst, PFS);
7401 return parseGetElementPtr(Inst, PFS);
7403 return parseExtractValue(Inst, PFS);
7405 return parseInsertValue(Inst, PFS);
7410bool LLParser::parseCmpPredicate(
unsigned &
P,
unsigned Opc) {
7411 if (
Opc == Instruction::FCmp) {
7412 switch (Lex.getKind()) {
7414 return tokError(
"expected fcmp predicate (e.g. 'oeq')");
7433 switch (Lex.getKind()) {
7435 return tokError(
"expected icmp predicate (e.g. 'eq')");
7459bool LLParser::parseRet(Instruction *&Inst, BasicBlock *BB,
7460 PerFunctionState &PFS) {
7461 SMLoc TypeLoc = Lex.getLoc();
7463 if (parseType(Ty,
true ))
7466 Type *ResType = PFS.getFunction().getReturnType();
7470 return error(TypeLoc,
"value doesn't match function result type '" +
7478 if (parseValue(Ty, RV, PFS))
7482 return error(TypeLoc,
"value doesn't match function result type '" +
7492bool LLParser::parseBr(Instruction *&Inst, PerFunctionState &PFS) {
7496 if (parseTypeAndValue(Op0, Loc, PFS))
7505 return error(Loc,
"branch condition must have 'i1' type");
7507 if (parseToken(
lltok::comma,
"expected ',' after branch condition") ||
7508 parseTypeAndBasicBlock(Op1, Loc, PFS) ||
7509 parseToken(
lltok::comma,
"expected ',' after true destination") ||
7510 parseTypeAndBasicBlock(Op2, Loc2, PFS))
7522bool LLParser::parseSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7523 LocTy CondLoc, BBLoc;
7526 if (parseTypeAndValue(
Cond, CondLoc, PFS) ||
7527 parseToken(
lltok::comma,
"expected ',' after switch condition") ||
7528 parseTypeAndBasicBlock(DefaultBB, BBLoc, PFS) ||
7532 if (!
Cond->getType()->isIntegerTy())
7533 return error(CondLoc,
"switch condition must have integer type");
7536 SmallPtrSet<Value*, 32> SeenCases;
7542 if (parseTypeAndValue(Constant, CondLoc, PFS) ||
7543 parseToken(
lltok::comma,
"expected ',' after case value") ||
7544 parseTypeAndBasicBlock(DestBB, PFS))
7547 if (!SeenCases.
insert(Constant).second)
7548 return error(CondLoc,
"duplicate case value in switch");
7550 return error(CondLoc,
"case value is not a constant integer");
7558 for (
const auto &[OnVal, Dest] : Table)
7559 SI->addCase(OnVal, Dest);
7567bool LLParser::parseIndirectBr(Instruction *&Inst, PerFunctionState &PFS) {
7570 if (parseTypeAndValue(
Address, AddrLoc, PFS) ||
7571 parseToken(
lltok::comma,
"expected ',' after indirectbr address") ||
7575 if (!
Address->getType()->isPointerTy())
7576 return error(AddrLoc,
"indirectbr address must have pointer type");
7579 SmallVector<BasicBlock*, 16> DestList;
7583 if (parseTypeAndBasicBlock(DestBB, PFS))
7588 if (parseTypeAndBasicBlock(DestBB, PFS))
7594 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
7598 for (BasicBlock *Dest : DestList)
7608 FunctionType *&FuncTy) {
7614 for (
const ParamInfo &Arg : ArgList)
7628bool LLParser::parseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
7629 LocTy CallLoc = Lex.getLoc();
7630 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
7631 std::vector<unsigned> FwdRefAttrGrps;
7634 unsigned InvokeAddrSpace;
7635 Type *RetType =
nullptr;
7642 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7643 parseOptionalProgramAddrSpace(InvokeAddrSpace) ||
7644 parseType(RetType, RetTypeLoc,
true ) ||
7645 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
7646 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
7648 parseOptionalOperandBundles(BundleList, PFS) ||
7650 parseTypeAndBasicBlock(NormalBB, PFS) ||
7652 parseTypeAndBasicBlock(UnwindBB, PFS))
7659 if (resolveFunctionType(RetType, ArgList, Ty))
7660 return error(RetTypeLoc,
"Invalid result type for LLVM function");
7666 if (convertValIDToValue(
PointerType::get(Context, InvokeAddrSpace), CalleeID,
7671 SmallVector<Value *, 8>
Args;
7678 for (
const ParamInfo &Arg : ArgList) {
7679 Type *ExpectedTy =
nullptr;
7682 }
else if (!Ty->isVarArg()) {
7683 return error(Arg.Loc,
"too many arguments specified");
7686 if (ExpectedTy && ExpectedTy != Arg.V->getType())
7687 return error(Arg.Loc,
"argument is not of expected type '" +
7689 Args.push_back(Arg.V);
7694 return error(CallLoc,
"not enough parameters specified for call");
7703 II->setCallingConv(CC);
7704 II->setAttributes(PAL);
7705 ForwardRefAttrGroups[
II] = FwdRefAttrGrps;
7712bool LLParser::parseResume(Instruction *&Inst, PerFunctionState &PFS) {
7714 if (parseTypeAndValue(Exn, ExnLoc, PFS))
7722bool LLParser::parseExceptionArgs(SmallVectorImpl<Value *> &Args,
7723 PerFunctionState &PFS) {
7724 if (parseToken(
lltok::lsquare,
"expected '[' in catchpad/cleanuppad"))
7729 if (!
Args.empty() &&
7730 parseToken(
lltok::comma,
"expected ',' in argument list"))
7735 Type *ArgTy =
nullptr;
7736 if (parseType(ArgTy, ArgLoc))
7741 if (parseMetadataAsValue(V, PFS))
7744 if (parseValue(ArgTy, V, PFS))
7756bool LLParser::parseCleanupRet(Instruction *&Inst, PerFunctionState &PFS) {
7757 Value *CleanupPad =
nullptr;
7759 if (parseToken(
lltok::kw_from,
"expected 'from' after cleanupret"))
7774 if (parseTypeAndBasicBlock(UnwindBB, PFS)) {
7785bool LLParser::parseCatchRet(Instruction *&Inst, PerFunctionState &PFS) {
7786 Value *CatchPad =
nullptr;
7788 if (parseToken(
lltok::kw_from,
"expected 'from' after catchret"))
7795 if (parseToken(
lltok::kw_to,
"expected 'to' in catchret") ||
7796 parseTypeAndBasicBlock(BB, PFS))
7805bool LLParser::parseCatchSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7813 return tokError(
"expected scope value for catchswitch");
7818 if (parseToken(
lltok::lsquare,
"expected '[' with catchswitch labels"))
7824 if (parseTypeAndBasicBlock(DestBB, PFS))
7829 if (parseToken(
lltok::rsquare,
"expected ']' after catchswitch labels"))
7832 if (parseToken(
lltok::kw_unwind,
"expected 'unwind' after catchswitch scope"))
7840 if (parseTypeAndBasicBlock(UnwindBB, PFS))
7846 for (BasicBlock *DestBB : Table)
7847 CatchSwitch->addHandler(DestBB);
7854bool LLParser::parseCatchPad(Instruction *&Inst, PerFunctionState &PFS) {
7855 Value *CatchSwitch =
nullptr;
7861 return tokError(
"expected scope value for catchpad");
7866 SmallVector<Value *, 8>
Args;
7867 if (parseExceptionArgs(Args, PFS))
7876bool LLParser::parseCleanupPad(Instruction *&Inst, PerFunctionState &PFS) {
7877 Value *ParentPad =
nullptr;
7884 return tokError(
"expected scope value for cleanuppad");
7889 SmallVector<Value *, 8>
Args;
7890 if (parseExceptionArgs(Args, PFS))
7906bool LLParser::parseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
7907 unsigned Opc,
bool IsFP) {
7909 if (parseTypeAndValue(
LHS, Loc, PFS))
7916 return error(Loc,
"invalid operand type for instruction");
7926bool LLParser::parseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
7927 LocTy CallLoc = Lex.getLoc();
7928 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
7929 std::vector<unsigned> FwdRefAttrGrps;
7932 Type *RetType =
nullptr;
7939 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7940 parseType(RetType, RetTypeLoc,
true ) ||
7941 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
7942 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
7944 parseOptionalOperandBundles(BundleList, PFS) ||
7946 parseTypeAndBasicBlock(DefaultDest, PFS) ||
7951 SmallVector<BasicBlock *, 16> IndirectDests;
7955 if (parseTypeAndBasicBlock(DestBB, PFS))
7960 if (parseTypeAndBasicBlock(DestBB, PFS))
7966 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
7973 if (resolveFunctionType(RetType, ArgList, Ty))
7974 return error(RetTypeLoc,
"Invalid result type for LLVM function");
7985 SmallVector<Value *, 8>
Args;
7992 for (
const ParamInfo &Arg : ArgList) {
7993 Type *ExpectedTy =
nullptr;
7996 }
else if (!Ty->isVarArg()) {
7997 return error(Arg.Loc,
"too many arguments specified");
8000 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8001 return error(Arg.Loc,
"argument is not of expected type '" +
8003 Args.push_back(Arg.V);
8008 return error(CallLoc,
"not enough parameters specified for call");
8020 ForwardRefAttrGroups[CBI] = FwdRefAttrGrps;
8034bool LLParser::parseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
8035 unsigned Opc,
bool IsFP) {
8037 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8038 parseToken(
lltok::comma,
"expected ',' in arithmetic operation") ||
8046 return error(Loc,
"invalid operand type for instruction");
8054bool LLParser::parseLogical(Instruction *&Inst, PerFunctionState &PFS,
8057 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8058 parseToken(
lltok::comma,
"expected ',' in logical operation") ||
8064 "instruction requires integer or integer vector operands");
8073bool LLParser::parseCompare(Instruction *&Inst, PerFunctionState &PFS,
8079 if (parseCmpPredicate(Pred,
Opc) || parseTypeAndValue(
LHS, Loc, PFS) ||
8080 parseToken(
lltok::comma,
"expected ',' after compare value") ||
8084 if (
Opc == Instruction::FCmp) {
8086 return error(Loc,
"fcmp requires floating point operands");
8089 assert(
Opc == Instruction::ICmp &&
"Unknown opcode for CmpInst!");
8092 return error(Loc,
"icmp requires integer operands");
8104bool LLParser::parseCast(Instruction *&Inst, PerFunctionState &PFS,
8108 Type *DestTy =
nullptr;
8109 if (parseTypeAndValue(
Op, Loc, PFS) ||
8110 parseToken(
lltok::kw_to,
"expected 'to' after cast value") ||
8115 return error(Loc,
"invalid cast opcode for cast from '" +
8124bool LLParser::parseSelect(Instruction *&Inst, PerFunctionState &PFS) {
8126 Value *Op0, *Op1, *Op2;
8127 if (parseTypeAndValue(Op0, Loc, PFS) ||
8128 parseToken(
lltok::comma,
"expected ',' after select condition") ||
8129 parseTypeAndValue(Op1, PFS) ||
8130 parseToken(
lltok::comma,
"expected ',' after select value") ||
8131 parseTypeAndValue(Op2, PFS))
8135 return error(Loc, Reason);
8143bool LLParser::parseVAArg(Instruction *&Inst, PerFunctionState &PFS) {
8145 Type *EltTy =
nullptr;
8147 if (parseTypeAndValue(
Op, PFS) ||
8148 parseToken(
lltok::comma,
"expected ',' after vaarg operand") ||
8149 parseType(EltTy, TypeLoc))
8153 return error(TypeLoc,
"va_arg requires operand with first class type");
8155 Inst =
new VAArgInst(
Op, EltTy);
8161bool LLParser::parseExtractElement(Instruction *&Inst, PerFunctionState &PFS) {
8164 if (parseTypeAndValue(Op0, Loc, PFS) ||
8165 parseToken(
lltok::comma,
"expected ',' after extract value") ||
8166 parseTypeAndValue(Op1, PFS))
8170 return error(Loc,
"invalid extractelement operands");
8178bool LLParser::parseInsertElement(Instruction *&Inst, PerFunctionState &PFS) {
8180 Value *Op0, *Op1, *Op2;
8181 if (parseTypeAndValue(Op0, Loc, PFS) ||
8182 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8183 parseTypeAndValue(Op1, PFS) ||
8184 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8185 parseTypeAndValue(Op2, PFS))
8189 return error(Loc,
"invalid insertelement operands");
8197bool LLParser::parseShuffleVector(Instruction *&Inst, PerFunctionState &PFS) {
8199 Value *Op0, *Op1, *Op2;
8200 if (parseTypeAndValue(Op0, Loc, PFS) ||
8201 parseToken(
lltok::comma,
"expected ',' after shuffle mask") ||
8202 parseTypeAndValue(Op1, PFS) ||
8203 parseToken(
lltok::comma,
"expected ',' after shuffle value") ||
8204 parseTypeAndValue(Op2, PFS))
8208 return error(Loc,
"invalid shufflevector operands");
8210 Inst =
new ShuffleVectorInst(Op0, Op1, Op2);
8216int LLParser::parsePHI(Instruction *&Inst, PerFunctionState &PFS) {
8220 if (parseType(Ty, TypeLoc))
8224 return error(TypeLoc,
"phi node must have first class type");
8227 bool AteExtraComma =
false;
8239 AteExtraComma =
true;
8243 if (parseToken(
lltok::lsquare,
"expected '[' in phi value list") ||
8244 parseValue(Ty, Op0, PFS) ||
8245 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8254 for (
const auto &[Val, BB] : PHIVals)
8257 return AteExtraComma ? InstExtraComma : InstNormal;
8266bool LLParser::parseLandingPad(Instruction *&Inst, PerFunctionState &PFS) {
8269 if (parseType(Ty, TyLoc))
8282 return tokError(
"expected 'catch' or 'filter' clause type");
8286 if (parseTypeAndValue(V, VLoc, PFS))
8293 return error(VLoc,
"'catch' clause has an invalid type");
8296 return error(VLoc,
"'filter' clause has an invalid type");
8301 return error(VLoc,
"clause argument must be a constant");
8305 Inst = LP.release();
8311bool LLParser::parseFreeze(Instruction *&Inst, PerFunctionState &PFS) {
8314 if (parseTypeAndValue(
Op, Loc, PFS))
8317 Inst =
new FreezeInst(
Op);
8330bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS,
8332 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8333 std::vector<unsigned> FwdRefAttrGrps;
8335 unsigned CallAddrSpace;
8337 Type *RetType =
nullptr;
8342 LocTy CallLoc = Lex.getLoc();
8346 "expected 'tail call', 'musttail call', or 'notail call'"))
8349 FastMathFlags FMF = EatFastMathFlagsIfPresent();
8351 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8352 parseOptionalProgramAddrSpace(CallAddrSpace) ||
8353 parseType(RetType, RetTypeLoc,
true ) ||
8354 parseValID(CalleeID, &PFS) ||
8356 PFS.getFunction().isVarArg()) ||
8357 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false, BuiltinLoc) ||
8358 parseOptionalOperandBundles(BundleList, PFS))
8365 if (resolveFunctionType(RetType, ArgList, Ty))
8366 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8372 if (convertValIDToValue(
PointerType::get(Context, CallAddrSpace), CalleeID,
8379 SmallVector<Value*, 8>
Args;
8385 for (
const ParamInfo &Arg : ArgList) {
8386 Type *ExpectedTy =
nullptr;
8389 }
else if (!Ty->isVarArg()) {
8390 return error(Arg.Loc,
"too many arguments specified");
8393 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8394 return error(Arg.Loc,
"argument is not of expected type '" +
8396 Args.push_back(Arg.V);
8397 Attrs.push_back(Arg.Attrs);
8401 return error(CallLoc,
"not enough parameters specified for call");
8414 return error(CallLoc,
"fast-math-flags specified for call without "
8415 "floating-point scalar or vector return type");
8422 if (SeenNewDbgInfoFormat) {
8424 return error(CallLoc,
"llvm.dbg intrinsic should not appear in a module "
8425 "using non-intrinsic debug info");
8427 SeenOldDbgInfoFormat =
true;
8430 ForwardRefAttrGroups[CI] = FwdRefAttrGrps;
8442int LLParser::parseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
8444 LocTy SizeLoc, TyLoc, ASLoc;
8445 MaybeAlign Alignment;
8446 unsigned AddrSpace = 0;
8449 bool IsInAlloca = EatIfPresent(lltok::kw_inalloca);
8450 bool IsSwiftError = EatIfPresent(lltok::kw_swifterror);
8452 if (parseType(Ty, TyLoc))
8456 return error(TyLoc,
"invalid type for alloca");
8458 bool AteExtraComma =
false;
8460 if (Lex.getKind() == lltok::kw_align) {
8461 if (parseOptionalAlignment(Alignment))
8463 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8466 ASLoc = Lex.getLoc();
8467 if (parseOptionalAddrSpace(AddrSpace))
8470 AteExtraComma =
true;
8472 if (parseTypeAndValue(
Size, SizeLoc, PFS))
8475 if (Lex.getKind() == lltok::kw_align) {
8476 if (parseOptionalAlignment(Alignment))
8478 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8481 ASLoc = Lex.getLoc();
8482 if (parseOptionalAddrSpace(AddrSpace))
8485 AteExtraComma =
true;
8491 if (
Size && !
Size->getType()->isIntegerTy())
8492 return error(SizeLoc,
"element count must have integer type");
8494 SmallPtrSet<Type *, 4> Visited;
8495 if (!Alignment && !Ty->
isSized(&Visited))
8496 return error(TyLoc,
"Cannot allocate unsized type");
8498 Alignment = M->getDataLayout().getPrefTypeAlign(Ty);
8499 AllocaInst *AI =
new AllocaInst(Ty, AddrSpace,
Size, *Alignment);
8503 return AteExtraComma ? InstExtraComma : InstNormal;
8510int LLParser::parseLoad(Instruction *&Inst, PerFunctionState &PFS) {
8512 MaybeAlign Alignment;
8513 bool AteExtraComma =
false;
8514 bool isAtomic =
false;
8523 bool isVolatile =
false;
8530 LocTy ExplicitTypeLoc = Lex.getLoc();
8531 if (parseType(Ty) ||
8532 parseToken(
lltok::comma,
"expected comma after load's type") ||
8533 parseTypeAndValue(Val, Loc, PFS) ||
8534 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8535 parseOptionalCommaAlign(Alignment, AteExtraComma))
8539 return error(Loc,
"load operand must be a pointer to a first class type");
8540 if (isAtomic && !Alignment)
8541 return error(Loc,
"atomic load must have explicit non-zero alignment");
8544 return error(Loc,
"atomic load cannot use Release ordering");
8546 SmallPtrSet<Type *, 4> Visited;
8547 if (!Alignment && !Ty->
isSized(&Visited))
8548 return error(ExplicitTypeLoc,
"loading unsized types is not allowed");
8550 Alignment = M->getDataLayout().getABITypeAlign(Ty);
8551 Inst =
new LoadInst(Ty, Val,
"", isVolatile, *Alignment, Ordering, SSID);
8552 return AteExtraComma ? InstExtraComma : InstNormal;
8560int LLParser::parseStore(Instruction *&Inst, PerFunctionState &PFS) {
8562 MaybeAlign Alignment;
8563 bool AteExtraComma =
false;
8564 bool isAtomic =
false;
8573 bool isVolatile =
false;
8579 if (parseTypeAndValue(Val, Loc, PFS) ||
8580 parseToken(
lltok::comma,
"expected ',' after store operand") ||
8581 parseTypeAndValue(
Ptr, PtrLoc, PFS) ||
8582 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8583 parseOptionalCommaAlign(Alignment, AteExtraComma))
8586 if (!
Ptr->getType()->isPointerTy())
8587 return error(PtrLoc,
"store operand must be a pointer");
8589 return error(Loc,
"store operand must be a first class value");
8590 if (isAtomic && !Alignment)
8591 return error(Loc,
"atomic store must have explicit non-zero alignment");
8594 return error(Loc,
"atomic store cannot use Acquire ordering");
8595 SmallPtrSet<Type *, 4> Visited;
8597 return error(Loc,
"storing unsized types is not allowed");
8599 Alignment = M->getDataLayout().getABITypeAlign(Val->
getType());
8601 Inst =
new StoreInst(Val,
Ptr, isVolatile, *Alignment, Ordering, SSID);
8602 return AteExtraComma ? InstExtraComma : InstNormal;
8609int LLParser::parseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {
8611 bool AteExtraComma =
false;
8615 bool isVolatile =
false;
8616 bool isWeak =
false;
8617 MaybeAlign Alignment;
8625 if (parseTypeAndValue(
Ptr, PtrLoc, PFS) ||
8626 parseToken(
lltok::comma,
"expected ',' after cmpxchg address") ||
8627 parseTypeAndValue(Cmp, CmpLoc, PFS) ||
8628 parseToken(
lltok::comma,
"expected ',' after cmpxchg cmp operand") ||
8629 parseTypeAndValue(New, NewLoc, PFS) ||
8630 parseScopeAndOrdering(
true , SSID, SuccessOrdering) ||
8631 parseOrdering(FailureOrdering) ||
8632 parseOptionalCommaAlign(Alignment, AteExtraComma))
8636 return tokError(
"invalid cmpxchg success ordering");
8638 return tokError(
"invalid cmpxchg failure ordering");
8639 if (!
Ptr->getType()->isPointerTy())
8640 return error(PtrLoc,
"cmpxchg operand must be a pointer");
8641 if (
Cmp->getType() !=
New->getType())
8642 return error(NewLoc,
"compare value and new value type do not match");
8643 if (!
New->getType()->isFirstClassType())
8644 return error(NewLoc,
"cmpxchg operand must be a first class value");
8646 const Align DefaultAlignment(
8647 PFS.getFunction().getDataLayout().getTypeStoreSize(
8650 AtomicCmpXchgInst *CXI =
8651 new AtomicCmpXchgInst(
Ptr, Cmp, New, Alignment.value_or(DefaultAlignment),
8652 SuccessOrdering, FailureOrdering, SSID);
8657 return AteExtraComma ? InstExtraComma : InstNormal;
8663int LLParser::parseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {
8665 bool AteExtraComma =
false;
8668 bool isVolatile =
false;
8671 MaybeAlign Alignment;
8676 switch (Lex.getKind()) {
8678 return tokError(
"expected binary operation in atomicrmw");
8729 if (parseTypeAndValue(
Ptr, PtrLoc, PFS) ||
8730 parseToken(
lltok::comma,
"expected ',' after atomicrmw address") ||
8731 parseTypeAndValue(Val, ValLoc, PFS) ||
8732 parseScopeAndOrdering(
true , SSID, Ordering) ||
8733 parseOptionalCommaAlign(Alignment, AteExtraComma))
8737 return tokError(
"atomicrmw cannot be unordered");
8738 if (!
Ptr->getType()->isPointerTy())
8739 return error(PtrLoc,
"atomicrmw operand must be a pointer");
8741 return error(ValLoc,
"atomicrmw operand may not be scalable");
8750 " operand must be an integer, floating point, or pointer type");
8754 return error(ValLoc,
"atomicrmw " +
8756 " operand must be a floating point type");
8760 return error(ValLoc,
"atomicrmw " +
8762 " operand must be an integer");
8767 PFS.getFunction().getDataLayout().getTypeStoreSizeInBits(
8770 return error(ValLoc,
"atomicrmw operand must be power-of-two byte-sized"
8772 const Align DefaultAlignment(
8773 PFS.getFunction().getDataLayout().getTypeStoreSize(
8775 AtomicRMWInst *RMWI =
8777 Alignment.value_or(DefaultAlignment), Ordering, SSID);
8780 return AteExtraComma ? InstExtraComma : InstNormal;
8785int LLParser::parseFence(Instruction *&Inst, PerFunctionState &PFS) {
8788 if (parseScopeAndOrdering(
true , SSID, Ordering))
8792 return tokError(
"fence cannot be unordered");
8794 return tokError(
"fence cannot be monotonic");
8796 Inst =
new FenceInst(Context, Ordering, SSID);
8802int LLParser::parseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
8804 Value *Val =
nullptr;
8820 if (parseType(Ty) ||
8821 parseToken(
lltok::comma,
"expected comma after getelementptr's type") ||
8822 parseTypeAndValue(
Ptr, Loc, PFS))
8827 if (!BasePointerType)
8828 return error(Loc,
"base of getelementptr must be a pointer");
8830 SmallVector<Value*, 16> Indices;
8831 bool AteExtraComma =
false;
8834 ElementCount GEPWidth =
BaseType->isVectorTy()
8840 AteExtraComma =
true;
8843 if (parseTypeAndValue(Val, EltLoc, PFS))
8846 return error(EltLoc,
"getelementptr index must be an integer");
8849 ElementCount ValNumEl = ValVTy->getElementCount();
8853 "getelementptr vector index has a wrong number of elements");
8854 GEPWidth = ValNumEl;
8859 SmallPtrSet<Type*, 4> Visited;
8861 return error(Loc,
"base element of getelementptr must be sized");
8865 return error(Loc,
"getelementptr cannot target structure that contains "
8866 "scalable vector type");
8869 return error(Loc,
"invalid getelementptr indices");
8872 GEP->setNoWrapFlags(NW);
8873 return AteExtraComma ? InstExtraComma : InstNormal;
8878int LLParser::parseExtractValue(Instruction *&Inst, PerFunctionState &PFS) {
8880 SmallVector<unsigned, 4> Indices;
8882 if (parseTypeAndValue(Val, Loc, PFS) ||
8883 parseIndexList(Indices, AteExtraComma))
8887 return error(Loc,
"extractvalue operand must be aggregate type");
8890 return error(Loc,
"invalid indices for extractvalue");
8892 return AteExtraComma ? InstExtraComma : InstNormal;
8897int LLParser::parseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
8899 SmallVector<unsigned, 4> Indices;
8901 if (parseTypeAndValue(Val0, Loc0, PFS) ||
8902 parseToken(
lltok::comma,
"expected comma after insertvalue operand") ||
8903 parseTypeAndValue(Val1, Loc1, PFS) ||
8904 parseIndexList(Indices, AteExtraComma))
8908 return error(Loc0,
"insertvalue operand must be aggregate type");
8912 return error(Loc0,
"invalid indices for insertvalue");
8913 if (IndexedType != Val1->
getType())
8914 return error(Loc1,
"insertvalue operand and field disagree in type: '" +
8918 return AteExtraComma ? InstExtraComma : InstNormal;
8929bool LLParser::parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts) {
8944 if (parseMetadata(MD,
nullptr))
8949 return parseToken(
lltok::rbrace,
"expected end of metadata node");
8955bool LLParser::sortUseListOrder(
Value *V, ArrayRef<unsigned> Indexes,
8957 if (!
V->hasUseList())
8960 return error(Loc,
"value has no uses");
8962 unsigned NumUses = 0;
8963 SmallDenseMap<const Use *, unsigned, 16> Order;
8964 for (
const Use &U :
V->uses()) {
8965 if (++NumUses > Indexes.
size())
8967 Order[&
U] = Indexes[NumUses - 1];
8970 return error(Loc,
"value only has one use");
8971 if (Order.
size() != Indexes.
size() || NumUses > Indexes.
size())
8973 "wrong number of indexes, expected " + Twine(
V->getNumUses()));
8975 V->sortUseList([&](
const Use &L,
const Use &R) {
8983bool LLParser::parseUseListOrderIndexes(SmallVectorImpl<unsigned> &Indexes) {
8984 SMLoc Loc = Lex.getLoc();
8988 return tokError(
"expected non-empty list of uselistorder indexes");
8995 bool IsOrdered =
true;
8996 assert(Indexes.
empty() &&
"Expected empty order vector");
8999 if (parseUInt32(Index))
9004 Max = std::max(Max, Index);
9005 IsOrdered &= Index == Indexes.
size();
9013 if (Indexes.
size() < 2)
9014 return error(Loc,
"expected >= 2 uselistorder indexes");
9017 "expected distinct uselistorder indexes in range [0, size)");
9019 return error(Loc,
"expected uselistorder indexes to change the order");
9026bool LLParser::parseUseListOrder(PerFunctionState *PFS) {
9027 SMLoc Loc = Lex.getLoc();
9032 SmallVector<unsigned, 16> Indexes;
9033 if (parseTypeAndValue(V, PFS) ||
9034 parseToken(
lltok::comma,
"expected comma in uselistorder directive") ||
9035 parseUseListOrderIndexes(Indexes))
9038 return sortUseListOrder(V, Indexes, Loc);
9043bool LLParser::parseUseListOrderBB() {
9045 SMLoc Loc = Lex.getLoc();
9049 SmallVector<unsigned, 16> Indexes;
9050 if (parseValID(Fn,
nullptr) ||
9051 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9052 parseValID(Label,
nullptr) ||
9053 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9054 parseUseListOrderIndexes(Indexes))
9060 GV = M->getNamedValue(Fn.
StrVal);
9062 GV = NumberedVals.get(Fn.
UIntVal);
9064 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9067 "invalid function forward reference in uselistorder_bb");
9070 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9071 if (
F->isDeclaration())
9072 return error(Fn.
Loc,
"invalid declaration in uselistorder_bb");
9076 return error(
Label.Loc,
"invalid numeric label in uselistorder_bb");
9078 return error(
Label.Loc,
"expected basic block name in uselistorder_bb");
9079 Value *
V =
F->getValueSymbolTable()->lookup(
Label.StrVal);
9081 return error(
Label.Loc,
"invalid basic block in uselistorder_bb");
9083 return error(
Label.Loc,
"expected basic block in uselistorder_bb");
9085 return sortUseListOrder(V, Indexes, Loc);
9091bool LLParser::parseModuleEntry(
unsigned ID) {
9100 parseStringConstant(Path) ||
9108 if (parseUInt32(Hash[0]) || parseToken(
lltok::comma,
"expected ',' here") ||
9109 parseUInt32(Hash[1]) || parseToken(
lltok::comma,
"expected ',' here") ||
9110 parseUInt32(Hash[2]) || parseToken(
lltok::comma,
"expected ',' here") ||
9111 parseUInt32(Hash[3]) || parseToken(
lltok::comma,
"expected ',' here") ||
9112 parseUInt32(Hash[4]))
9119 auto ModuleEntry = Index->addModule(Path, Hash);
9120 ModuleIdMap[
ID] = ModuleEntry->first();
9127bool LLParser::parseTypeIdEntry(
unsigned ID) {
9136 parseStringConstant(Name))
9139 TypeIdSummary &TIS = Index->getOrInsertTypeIdSummary(Name);
9141 parseTypeIdSummary(TIS) || parseToken(
lltok::rparen,
"expected ')' here"))
9146 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9147 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9148 for (
auto TIDRef : FwdRefTIDs->second) {
9150 "Forward referenced type id GUID expected to be 0");
9153 ForwardRefTypeIds.erase(FwdRefTIDs);
9161bool LLParser::parseTypeIdSummary(TypeIdSummary &TIS) {
9165 parseTypeTestResolution(TIS.
TTRes))
9170 if (parseOptionalWpdResolutions(TIS.
WPDRes))
9181 ValueInfo(
false, (GlobalValueSummaryMapTy::value_type *)-8);
9187bool LLParser::parseTypeIdCompatibleVtableEntry(
unsigned ID) {
9196 parseStringConstant(Name))
9200 Index->getOrInsertTypeIdCompatibleVtableSummary(Name);
9207 IdToIndexMapType IdToIndexMap;
9220 if (parseGVReference(VI, GVId))
9227 IdToIndexMap[GVId].push_back(std::make_pair(TI.size(),
Loc));
9228 TI.push_back({
Offset, VI});
9236 for (
auto I : IdToIndexMap) {
9237 auto &Infos = ForwardRefValueInfos[
I.first];
9238 for (
auto P :
I.second) {
9240 "Forward referenced ValueInfo expected to be empty");
9241 Infos.emplace_back(&TI[
P.first].VTableVI,
P.second);
9251 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9252 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9253 for (
auto TIDRef : FwdRefTIDs->second) {
9255 "Forward referenced type id GUID expected to be 0");
9258 ForwardRefTypeIds.erase(FwdRefTIDs);
9270bool LLParser::parseTypeTestResolution(TypeTestResolution &TTRes) {
9278 switch (Lex.getKind()) {
9298 return error(Lex.getLoc(),
"unexpected TypeTestResolution kind");
9310 switch (Lex.getKind()) {
9325 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(Val))
9338 return error(Lex.getLoc(),
"expected optional TypeTestResolution field");
9351bool LLParser::parseOptionalWpdResolutions(
9352 std::map<uint64_t, WholeProgramDevirtResolution> &WPDResMap) {
9360 WholeProgramDevirtResolution WPDRes;
9364 parseToken(
lltok::comma,
"expected ',' here") || parseWpdRes(WPDRes) ||
9367 WPDResMap[
Offset] = WPDRes;
9384bool LLParser::parseWpdRes(WholeProgramDevirtResolution &WPDRes) {
9392 switch (Lex.getKind()) {
9403 return error(Lex.getLoc(),
"unexpected WholeProgramDevirtResolution kind");
9409 switch (Lex.getKind()) {
9417 if (parseOptionalResByArg(WPDRes.
ResByArg))
9421 return error(Lex.getLoc(),
9422 "expected optional WholeProgramDevirtResolution field");
9439bool LLParser::parseOptionalResByArg(
9440 std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>
9448 std::vector<uint64_t>
Args;
9449 if (parseArgs(Args) || parseToken(
lltok::comma,
"expected ',' here") ||
9457 WholeProgramDevirtResolution::ByArg ByArg;
9458 switch (Lex.getKind()) {
9472 return error(Lex.getLoc(),
9473 "unexpected WholeProgramDevirtResolution::ByArg kind");
9479 switch (Lex.getKind()) {
9483 parseUInt64(ByArg.
Info))
9489 parseUInt32(ByArg.
Byte))
9495 parseUInt32(ByArg.
Bit))
9499 return error(Lex.getLoc(),
9500 "expected optional whole program devirt field");
9507 ResByArg[
Args] = ByArg;
9518bool LLParser::parseArgs(std::vector<uint64_t> &Args) {
9526 if (parseUInt64(Val))
9528 Args.push_back(Val);
9537static const auto FwdVIRef = (GlobalValueSummaryMapTy::value_type *)-8;
9542 assert(!(ReadOnly && WriteOnly));
9552bool LLParser::addGlobalValueToIndex(
9554 unsigned ID, std::unique_ptr<GlobalValueSummary> Summary,
LocTy Loc) {
9559 VI = Index->getOrInsertValueInfo(GUID);
9563 auto *GV = M->getNamedValue(Name);
9565 return error(Loc,
"Reference to undefined global \"" + Name +
"\"");
9567 VI = Index->getOrInsertValueInfo(GV);
9571 "Need a source_filename to compute GUID for local");
9574 VI = Index->getOrInsertValueInfo(GUID, Index->saveString(Name));
9579 auto FwdRefVIs = ForwardRefValueInfos.find(
ID);
9580 if (FwdRefVIs != ForwardRefValueInfos.end()) {
9581 for (
auto VIRef : FwdRefVIs->second) {
9583 "Forward referenced ValueInfo expected to be empty");
9586 ForwardRefValueInfos.erase(FwdRefVIs);
9590 auto FwdRefAliasees = ForwardRefAliasees.find(
ID);
9591 if (FwdRefAliasees != ForwardRefAliasees.end()) {
9592 for (
auto AliaseeRef : FwdRefAliasees->second) {
9593 assert(!AliaseeRef.first->hasAliasee() &&
9594 "Forward referencing alias already has aliasee");
9595 assert(Summary &&
"Aliasee must be a definition");
9596 AliaseeRef.first->setAliasee(VI,
Summary.get());
9598 ForwardRefAliasees.erase(FwdRefAliasees);
9603 Index->addGlobalValueSummary(VI, std::move(Summary));
9606 if (
ID == NumberedValueInfos.size())
9607 NumberedValueInfos.push_back(VI);
9610 if (
ID > NumberedValueInfos.size())
9611 NumberedValueInfos.resize(
ID + 1);
9612 NumberedValueInfos[
ID] =
VI;
9620bool LLParser::parseSummaryIndexFlags() {
9627 if (parseUInt64(Flags))
9630 Index->setFlags(Flags);
9636bool LLParser::parseBlockCount() {
9642 uint64_t BlockCount;
9643 if (parseUInt64(BlockCount))
9646 Index->setBlockCount(BlockCount);
9654bool LLParser::parseGVEntry(
unsigned ID) {
9662 LocTy Loc = Lex.getLoc();
9665 switch (Lex.getKind()) {
9669 parseStringConstant(Name))
9675 if (parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(GUID))
9679 return error(Lex.getLoc(),
"expected name or guid tag");
9702 switch (Lex.getKind()) {
9704 if (parseFunctionSummary(Name, GUID,
ID))
9708 if (parseVariableSummary(Name, GUID,
ID))
9712 if (parseAliasSummary(Name, GUID,
ID))
9716 return error(Lex.getLoc(),
"expected summary type");
9734 LocTy Loc = Lex.getLoc();
9738 StringRef ModulePath;
9739 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9742 false,
false,
false,
9746 FunctionSummary::TypeIdInfo TypeIdInfo;
9747 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
9749 std::vector<CallsiteInfo> Callsites;
9750 std::vector<AllocInfo> Allocs;
9752 FunctionSummary::FFlags FFlags = {};
9755 parseModuleReference(ModulePath) ||
9756 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9759 parseToken(
lltok::colon,
"expected ':' here") || parseUInt32(InstCount))
9764 switch (Lex.getKind()) {
9766 if (parseOptionalFFlags(FFlags))
9770 if (parseOptionalCalls(Calls))
9774 if (parseOptionalTypeIdInfo(TypeIdInfo))
9778 if (parseOptionalRefs(Refs))
9782 if (parseOptionalParamAccesses(ParamAccesses))
9786 if (parseOptionalAllocs(Allocs))
9790 if (parseOptionalCallsites(Callsites))
9794 return error(Lex.getLoc(),
"expected optional function summary field");
9801 auto FS = std::make_unique<FunctionSummary>(
9802 GVFlags, InstCount, FFlags, std::move(Refs), std::move(Calls),
9808 std::move(ParamAccesses), std::move(Callsites), std::move(Allocs));
9810 FS->setModulePath(ModulePath);
9812 return addGlobalValueToIndex(Name, GUID,
9814 std::move(FS), Loc);
9822 LocTy Loc = Lex.getLoc();
9826 StringRef ModulePath;
9827 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9830 false,
false,
false,
9832 GlobalVarSummary::GVarFlags GVarFlags(
false,
9840 parseModuleReference(ModulePath) ||
9841 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9843 parseGVarFlags(GVarFlags))
9848 switch (Lex.getKind()) {
9850 if (parseOptionalVTableFuncs(VTableFuncs))
9854 if (parseOptionalRefs(Refs))
9858 return error(Lex.getLoc(),
"expected optional variable summary field");
9866 std::make_unique<GlobalVarSummary>(GVFlags, GVarFlags, std::move(Refs));
9868 GS->setModulePath(ModulePath);
9869 GS->setVTableFuncs(std::move(VTableFuncs));
9871 return addGlobalValueToIndex(Name, GUID,
9873 std::move(GS), Loc);
9882 LocTy Loc = Lex.getLoc();
9885 StringRef ModulePath;
9886 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9889 false,
false,
false,
9893 parseModuleReference(ModulePath) ||
9894 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9900 ValueInfo AliaseeVI;
9902 if (parseGVReference(AliaseeVI, GVId))
9908 auto AS = std::make_unique<AliasSummary>(GVFlags);
9910 AS->setModulePath(ModulePath);
9914 ForwardRefAliasees[GVId].emplace_back(AS.get(), Loc);
9916 auto Summary = Index->findSummaryInModule(AliaseeVI, ModulePath);
9917 assert(Summary &&
"Aliasee must be a definition");
9918 AS->setAliasee(AliaseeVI, Summary);
9921 return addGlobalValueToIndex(Name, GUID,
9923 std::move(AS), Loc);
9928bool LLParser::parseFlag(
unsigned &Val) {
9929 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
9930 return tokError(
"expected integer");
9931 Val = (unsigned)Lex.getAPSIntVal().getBoolValue();
9947bool LLParser::parseOptionalFFlags(FunctionSummary::FFlags &FFlags) {
9951 if (parseToken(
lltok::colon,
"expected ':' in funcFlags") ||
9957 switch (Lex.getKind()) {
9960 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
9966 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
9972 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
9978 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
9984 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
9990 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
9996 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10002 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10008 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10014 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10019 return error(Lex.getLoc(),
"expected function flag type");
10023 if (parseToken(
lltok::rparen,
"expected ')' in funcFlags"))
10034bool LLParser::parseOptionalCalls(
10035 SmallVectorImpl<FunctionSummary::EdgeTy> &Calls) {
10039 if (parseToken(
lltok::colon,
"expected ':' in calls") ||
10043 IdToIndexMapType IdToIndexMap;
10052 LocTy Loc = Lex.getLoc();
10054 if (parseGVReference(VI, GVId))
10058 unsigned RelBF = 0;
10059 unsigned HasTailCall =
false;
10063 switch (Lex.getKind()) {
10066 if (parseToken(
lltok::colon,
"expected ':'") || parseHotness(Hotness))
10071 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(RelBF))
10076 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(HasTailCall))
10080 return error(Lex.getLoc(),
"expected hotness, relbf, or tail");
10084 return tokError(
"Expected only one of hotness or relbf");
10089 IdToIndexMap[GVId].push_back(std::make_pair(Calls.
size(), Loc));
10099 for (
auto I : IdToIndexMap) {
10100 auto &Infos = ForwardRefValueInfos[
I.first];
10101 for (
auto P :
I.second) {
10103 "Forward referenced ValueInfo expected to be empty");
10104 Infos.emplace_back(&Calls[
P.first].first,
P.second);
10117 switch (Lex.getKind()) {
10121 case lltok::kw_cold:
10127 case lltok::kw_hot:
10134 return error(Lex.getLoc(),
"invalid call edge hotness");
10143bool LLParser::parseOptionalVTableFuncs(
VTableFuncList &VTableFuncs) {
10147 if (parseToken(
lltok::colon,
"expected ':' in vTableFuncs") ||
10151 IdToIndexMapType IdToIndexMap;
10155 if (parseToken(
lltok::lparen,
"expected '(' in vTableFunc") ||
10160 LocTy Loc = Lex.getLoc();
10162 if (parseGVReference(VI, GVId))
10175 IdToIndexMap[GVId].push_back(std::make_pair(VTableFuncs.size(), Loc));
10176 VTableFuncs.push_back({
VI,
Offset});
10178 if (parseToken(
lltok::rparen,
"expected ')' in vTableFunc"))
10184 for (
auto I : IdToIndexMap) {
10185 auto &Infos = ForwardRefValueInfos[
I.first];
10186 for (
auto P :
I.second) {
10188 "Forward referenced ValueInfo expected to be empty");
10189 Infos.emplace_back(&VTableFuncs[
P.first].FuncVI,
P.second);
10193 if (parseToken(
lltok::rparen,
"expected ')' in vTableFuncs"))
10200bool LLParser::parseParamNo(uint64_t &ParamNo) {
10202 parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(ParamNo))
10208bool LLParser::parseParamAccessOffset(ConstantRange &
Range) {
10211 auto ParseAPSInt = [&](
APSInt &Val) {
10213 return tokError(
"expected integer");
10214 Val = Lex.getAPSIntVal();
10216 Val.setIsSigned(
true);
10238bool LLParser::parseParamAccessCall(FunctionSummary::ParamAccess::Call &
Call,
10239 IdLocListType &IdLocList) {
10247 LocTy Loc = Lex.getLoc();
10248 if (parseGVReference(VI, GVId))
10252 IdLocList.emplace_back(GVId, Loc);
10255 parseParamNo(
Call.ParamNo) ||
10257 parseParamAccessOffset(
Call.Offsets))
10269bool LLParser::parseParamAccess(FunctionSummary::ParamAccess &Param,
10270 IdLocListType &IdLocList) {
10272 parseParamNo(
Param.ParamNo) ||
10274 parseParamAccessOffset(
Param.Use))
10283 FunctionSummary::ParamAccess::Call
Call;
10284 if (parseParamAccessCall(
Call, IdLocList))
10301bool LLParser::parseOptionalParamAccesses(
10302 std::vector<FunctionSummary::ParamAccess> &Params) {
10310 IdLocListType VContexts;
10311 size_t CallsNum = 0;
10313 FunctionSummary::ParamAccess ParamAccess;
10314 if (parseParamAccess(ParamAccess, VContexts))
10316 CallsNum += ParamAccess.
Calls.size();
10317 assert(VContexts.size() == CallsNum);
10319 Params.emplace_back(std::move(ParamAccess));
10327 IdLocListType::const_iterator ItContext = VContexts.begin();
10328 for (
auto &PA : Params) {
10329 for (
auto &
C : PA.Calls) {
10331 ForwardRefValueInfos[ItContext->first].emplace_back(&
C.Callee,
10332 ItContext->second);
10336 assert(ItContext == VContexts.end());
10343bool LLParser::parseOptionalRefs(SmallVectorImpl<ValueInfo> &Refs) {
10347 if (parseToken(
lltok::colon,
"expected ':' in refs") ||
10351 struct ValueContext {
10356 std::vector<ValueContext> VContexts;
10360 VC.Loc = Lex.getLoc();
10361 if (parseGVReference(
VC.VI,
VC.GVId))
10363 VContexts.push_back(VC);
10369 llvm::sort(VContexts, [](
const ValueContext &VC1,
const ValueContext &VC2) {
10370 return VC1.VI.getAccessSpecifier() < VC2.VI.getAccessSpecifier();
10373 IdToIndexMapType IdToIndexMap;
10374 for (
auto &VC : VContexts) {
10379 IdToIndexMap[
VC.GVId].push_back(std::make_pair(Refs.
size(),
VC.Loc));
10385 for (
auto I : IdToIndexMap) {
10386 auto &Infos = ForwardRefValueInfos[
I.first];
10387 for (
auto P :
I.second) {
10389 "Forward referenced ValueInfo expected to be empty");
10390 Infos.emplace_back(&Refs[
P.first],
P.second);
10404bool LLParser::parseOptionalTypeIdInfo(
10405 FunctionSummary::TypeIdInfo &TypeIdInfo) {
10414 switch (Lex.getKind()) {
10416 if (parseTypeTests(TypeIdInfo.
TypeTests))
10440 return error(Lex.getLoc(),
"invalid typeIdInfo list type");
10444 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10453bool LLParser::parseTypeTests(std::vector<GlobalValue::GUID> &TypeTests) {
10461 IdToIndexMapType IdToIndexMap;
10465 unsigned ID = Lex.getUIntVal();
10466 LocTy Loc = Lex.getLoc();
10470 IdToIndexMap[
ID].push_back(std::make_pair(TypeTests.size(), Loc));
10472 }
else if (parseUInt64(GUID))
10474 TypeTests.push_back(GUID);
10479 for (
auto I : IdToIndexMap) {
10480 auto &Ids = ForwardRefTypeIds[
I.first];
10481 for (
auto P :
I.second) {
10482 assert(TypeTests[
P.first] == 0 &&
10483 "Forward referenced type id GUID expected to be 0");
10484 Ids.emplace_back(&TypeTests[
P.first],
P.second);
10488 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10496bool LLParser::parseVFuncIdList(
10497 lltok::Kind Kind, std::vector<FunctionSummary::VFuncId> &VFuncIdList) {
10498 assert(Lex.getKind() == Kind);
10505 IdToIndexMapType IdToIndexMap;
10507 FunctionSummary::VFuncId VFuncId;
10508 if (parseVFuncId(VFuncId, IdToIndexMap, VFuncIdList.size()))
10510 VFuncIdList.push_back(VFuncId);
10518 for (
auto I : IdToIndexMap) {
10519 auto &Ids = ForwardRefTypeIds[
I.first];
10520 for (
auto P :
I.second) {
10521 assert(VFuncIdList[
P.first].GUID == 0 &&
10522 "Forward referenced type id GUID expected to be 0");
10523 Ids.emplace_back(&VFuncIdList[
P.first].GUID,
P.second);
10532bool LLParser::parseConstVCallList(
10534 std::vector<FunctionSummary::ConstVCall> &ConstVCallList) {
10535 assert(Lex.getKind() == Kind);
10542 IdToIndexMapType IdToIndexMap;
10544 FunctionSummary::ConstVCall ConstVCall;
10545 if (parseConstVCall(ConstVCall, IdToIndexMap, ConstVCallList.size()))
10547 ConstVCallList.push_back(ConstVCall);
10555 for (
auto I : IdToIndexMap) {
10556 auto &Ids = ForwardRefTypeIds[
I.first];
10557 for (
auto P :
I.second) {
10558 assert(ConstVCallList[
P.first].VFunc.GUID == 0 &&
10559 "Forward referenced type id GUID expected to be 0");
10560 Ids.emplace_back(&ConstVCallList[
P.first].VFunc.GUID,
P.second);
10569bool LLParser::parseConstVCall(FunctionSummary::ConstVCall &ConstVCall,
10570 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10572 parseVFuncId(ConstVCall.
VFunc, IdToIndexMap, Index))
10576 if (parseArgs(ConstVCall.
Args))
10588bool LLParser::parseVFuncId(FunctionSummary::VFuncId &VFuncId,
10589 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10599 unsigned ID = Lex.getUIntVal();
10600 LocTy Loc = Lex.getLoc();
10604 IdToIndexMap[
ID].push_back(std::make_pair(Index, Loc));
10606 }
else if (parseToken(
lltok::kw_guid,
"expected 'guid' here") ||
10608 parseUInt64(VFuncId.
GUID))
10614 parseUInt64(VFuncId.
Offset) ||
10626bool LLParser::parseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
10636 switch (Lex.getKind()) {
10643 assert(HasLinkage &&
"Linkage not optional in summary entry");
10650 parseOptionalVisibility(Flag);
10655 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10661 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10667 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10673 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10682 if (parseOptionalImportType(Lex.getKind(), IK))
10684 GVFlags.
ImportType =
static_cast<unsigned>(IK);
10688 return error(Lex.getLoc(),
"expected gv flag type");
10702bool LLParser::parseGVarFlags(GlobalVarSummary::GVarFlags &GVarFlags) {
10710 auto ParseRest = [
this](
unsigned int &Val) {
10714 return parseFlag(Val);
10719 switch (Lex.getKind()) {
10720 case lltok::kw_readonly:
10721 if (ParseRest(Flag))
10725 case lltok::kw_writeonly:
10726 if (ParseRest(Flag))
10731 if (ParseRest(Flag))
10736 if (ParseRest(Flag))
10741 return error(Lex.getLoc(),
"expected gvar flag type");
10749bool LLParser::parseModuleReference(StringRef &ModulePath) {
10756 unsigned ModuleID = Lex.getUIntVal();
10757 auto I = ModuleIdMap.find(ModuleID);
10759 assert(
I != ModuleIdMap.end());
10760 ModulePath =
I->second;
10766bool LLParser::parseGVReference(ValueInfo &VI,
unsigned &GVId) {
10769 WriteOnly = EatIfPresent(lltok::kw_writeonly);
10773 GVId = Lex.getUIntVal();
10775 if (GVId < NumberedValueInfos.size() && NumberedValueInfos[GVId]) {
10777 VI = NumberedValueInfos[GVId];
10794bool LLParser::parseOptionalAllocs(std::vector<AllocInfo> &Allocs) {
10798 if (parseToken(
lltok::colon,
"expected ':' in allocs") ||
10810 SmallVector<uint8_t> Versions;
10813 if (parseAllocType(V))
10818 if (parseToken(
lltok::rparen,
"expected ')' in versions") ||
10822 std::vector<MIBInfo> MIBs;
10823 if (parseMemProfs(MIBs))
10826 Allocs.push_back({Versions, MIBs});
10843bool LLParser::parseMemProfs(std::vector<MIBInfo> &MIBs) {
10847 if (parseToken(
lltok::colon,
"expected ':' in memprof") ||
10853 if (parseToken(
lltok::lparen,
"expected '(' in memprof") ||
10862 if (parseToken(
lltok::comma,
"expected ',' in memprof") ||
10868 SmallVector<unsigned> StackIdIndices;
10872 uint64_t StackId = 0;
10873 if (parseUInt64(StackId))
10875 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
10896bool LLParser::parseAllocType(uint8_t &
AllocType) {
10897 switch (Lex.getKind()) {
10904 case lltok::kw_cold:
10907 case lltok::kw_hot:
10911 return error(Lex.getLoc(),
"invalid alloc type");
10924bool LLParser::parseOptionalCallsites(std::vector<CallsiteInfo> &Callsites) {
10928 if (parseToken(
lltok::colon,
"expected ':' in callsites") ||
10932 IdToIndexMapType IdToIndexMap;
10935 if (parseToken(
lltok::lparen,
"expected '(' in callsite") ||
10942 LocTy Loc = Lex.getLoc();
10944 if (parseGVReference(VI, GVId))
10948 if (parseToken(
lltok::comma,
"expected ',' in callsite") ||
10954 SmallVector<unsigned> Clones;
10957 if (parseUInt32(V))
10963 parseToken(
lltok::comma,
"expected ',' in callsite") ||
10969 SmallVector<unsigned> StackIdIndices;
10973 uint64_t StackId = 0;
10974 if (parseUInt64(StackId))
10976 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
10987 IdToIndexMap[GVId].
push_back(std::make_pair(Callsites.size(), Loc));
10988 Callsites.push_back({
VI, Clones, StackIdIndices});
10996 for (
auto I : IdToIndexMap) {
10997 auto &Infos = ForwardRefValueInfos[
I.first];
10998 for (
auto P :
I.second) {
11000 "Forward referenced ValueInfo expected to be empty");
11001 Infos.emplace_back(&Callsites[
P.first].Callee,
P.second);
11005 if (parseToken(
lltok::rparen,
"expected ')' in callsites"))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Unify divergent function exit nodes
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
Function Alias Analysis false
Expand Atomic instructions
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
GlobalValue::SanitizerMetadata SanitizerMetadata
Module.h This file contains the declarations for the Module class.
static GlobalValue * createGlobalFwdRef(Module *M, PointerType *PTy)
static cl::opt< bool > AllowIncompleteIR("allow-incomplete-ir", cl::init(false), cl::Hidden, cl::desc("Allow incomplete IR on a best effort basis (references to unknown " "metadata will be dropped)"))
static void maybeSetDSOLocal(bool DSOLocal, GlobalValue &GV)
static bool upgradeMemoryAttr(MemoryEffects &ME, lltok::Kind Kind)
static std::optional< MemoryEffects::Location > keywordToLoc(lltok::Kind Tok)
static void resolveFwdRef(ValueInfo *Fwd, ValueInfo &Resolved)
static unsigned parseOptionalLinkageAux(lltok::Kind Kind, bool &HasLinkage)
static unsigned keywordToFPClassTest(lltok::Kind Tok)
#define CC_VLS_CASE(ABIVlen)
static std::optional< ModRefInfo > keywordToModRef(lltok::Kind Tok)
static bool isSanitizer(lltok::Kind Kind)
static void dropIntrinsicWithUnknownMetadataArgument(IntrinsicInst *II)
#define PARSE_MD_FIELDS()
static Attribute::AttrKind tokenToAttribute(lltok::Kind Kind)
#define GET_OR_DISTINCT(CLASS, ARGS)
bool isOldDbgFormatIntrinsic(StringRef Name)
static bool isValidVisibilityForLinkage(unsigned V, unsigned L)
static std::string getTypeString(Type *T)
static bool isValidDLLStorageClassForLinkage(unsigned S, unsigned L)
static const auto FwdVIRef
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
PowerPC Reduce CR logical Operation
static bool getVal(MDTuple *MD, const char *Key, uint64_t &Val)
const SmallVectorImpl< MachineOperand > & Cond
dot regions Print regions of function to dot file(with no function bodies)"
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file provides utility classes that use RAII to save and restore values.
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file defines the SmallPtrSet class.
FunctionLoweringInfo::StatepointRelocationRecord RecordType
static SymbolRef::Type getType(const Symbol *Sym)
LocallyHashedType DenseMapInfo< LocallyHashedType >::Empty
static APFloat getSNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for SNaN values.
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
APSInt extOrTrunc(uint32_t width) const
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
void setUsedWithInAlloca(bool V)
Specify whether this alloca is used to represent the arguments to a call.
This class represents an incoming formal argument to a Function.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
void setWeak(bool IsWeak)
static bool isValidFailureOrdering(AtomicOrdering Ordering)
void setVolatile(bool V)
Specify whether this is a volatile cmpxchg.
static bool isValidSuccessOrdering(AtomicOrdering Ordering)
void setVolatile(bool V)
Specify whether this is a volatile RMW or not.
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
static LLVM_ABI StringRef getOperationName(BinOp Op)
static LLVM_ABI AttributeSet get(LLVMContext &C, const AttrBuilder &B)
static LLVM_ABI bool canUseAsRetAttr(AttrKind Kind)
static bool isTypeAttrKind(AttrKind Kind)
static LLVM_ABI bool canUseAsFnAttr(AttrKind Kind)
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
@ None
No attributes have been set.
static LLVM_ABI bool canUseAsParamAttr(AttrKind Kind)
LLVM Basic Block Representation.
LLVM_ABI void insertDbgRecordBefore(DbgRecord *DR, InstListType::iterator Here)
Insert a DbgRecord into a block at the position given by Here.
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static LLVM_ABI BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
void setCallingConv(CallingConv::ID CC)
void setAttributes(AttributeList A)
Set the attributes for this call.
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
void setTailCallKind(TailCallKind TCK)
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CaptureInfo none()
Create CaptureInfo that does not capture any components of the pointer.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static LLVM_ABI bool castIsValid(Instruction::CastOps op, Type *SrcTy, Type *DstTy)
This method can be used to determine if a cast from SrcTy to DstTy using Opcode op is valid or not.
static CatchPadInst * Create(Value *CatchSwitch, ArrayRef< Value * > Args, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CatchReturnInst * Create(Value *CatchPad, BasicBlock *BB, InsertPosition InsertBefore=nullptr)
static CatchSwitchInst * Create(Value *ParentPad, BasicBlock *UnwindDest, unsigned NumHandlers, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupPadInst * Create(Value *ParentPad, ArrayRef< Value * > Args={}, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static CleanupReturnInst * Create(Value *CleanupPad, BasicBlock *UnwindBB=nullptr, InsertPosition InsertBefore=nullptr)
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
@ ICMP_SLT
signed less than
@ ICMP_SLE
signed less or equal
@ FCMP_OLT
0 1 0 0 True if ordered and less than
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
@ ICMP_UGE
unsigned greater or equal
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ FCMP_ULT
1 1 0 0 True if unordered or less than
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
@ ICMP_ULT
unsigned less than
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
@ ICMP_SGE
signed greater or equal
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
@ ICMP_ULE
unsigned less or equal
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI bool isValueValidForType(Type *Ty, const APFloat &V)
Return true if Ty is big enough to represent V.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc)
Return a pointer signed with the specified parameters.
static LLVM_ABI std::optional< ConstantRangeList > getConstantRangeList(ArrayRef< ConstantRange > RangesRef)
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
static DIAssignID * getDistinct(LLVMContext &Context)
DebugEmissionKind getEmissionKind() const
DebugNameTableKind getNameTableKind() const
static LLVM_ABI DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, std::optional< uint32_t > EnumKind, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, Metadata *Rank, Metadata *Annotations, Metadata *BitStride)
Build a DICompositeType with the given ODR identifier.
static LLVM_ABI std::optional< ChecksumKind > getChecksumKind(StringRef CSKindStr)
ChecksumKind
Which algorithm (e.g.
static LLVM_ABI std::optional< FixedPointKind > getFixedPointKind(StringRef Str)
static LLVM_ABI DIFlags getFlag(StringRef Flag)
static LLVM_ABI DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
static LLVM_ABI DISPFlags getFlag(StringRef Flag)
DISPFlags
Debug info subprogram flags.
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
static LLVM_ABI Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
static LLVM_ABI DbgLabelRecord * createUnresolvedDbgLabelRecord(MDNode *Label, MDNode *DL)
For use during parsing; creates a DbgLabelRecord from as-of-yet unresolved MDNodes.
Kind
Subclass discriminator.
static LLVM_ABI DbgVariableRecord * createUnresolvedDbgVariableRecord(LocationType Type, Metadata *Val, MDNode *Variable, MDNode *Expression, MDNode *AssignID, Metadata *Address, MDNode *AddressExpression, MDNode *DI)
Used to create DbgVariableRecords during parsing, where some metadata references may still be unresol...
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
static constexpr ElementCount getFixed(ScalarTy MinVal)
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
static LLVM_ABI bool isValidArgumentType(Type *ArgTy)
Return true if the specified type is valid as an argument type.
Type::subtype_iterator param_iterator
static LLVM_ABI bool isValidReturnType(Type *RetTy)
Return true if the specified type is valid as a return type.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
void setPrefixData(Constant *PrefixData)
void setGC(std::string Str)
void setPersonalityFn(Constant *Fn)
void setAlignment(Align Align)
Sets the alignment attribute of the Function.
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
void setPrologueData(Constant *PrologueData)
void setCallingConv(CallingConv::ID CC)
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags noUnsignedSignedWrap()
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
static bool isValidLinkage(LinkageTypes L)
static LLVM_ABI GlobalAlias * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Aliasee, Module *Parent)
If a parent module is specified, the alias is automatically inserted into the end of the specified mo...
static LLVM_ABI GlobalIFunc * create(Type *Ty, unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name, Constant *Resolver, Module *Parent)
If a parent module is specified, the ifunc is automatically inserted into the end of the specified mo...
LLVM_ABI void setComdat(Comdat *C)
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
LLVM_ABI const SanitizerMetadata & getSanitizerMetadata() const
static bool isLocalLinkage(LinkageTypes Linkage)
void setUnnamedAddr(UnnamedAddr Val)
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
void setDLLStorageClass(DLLStorageClassTypes C)
void setThreadLocalMode(ThreadLocalMode Val)
void setLinkage(LinkageTypes LT)
DLLStorageClassTypes
Storage classes of global values for PE targets.
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
bool hasSanitizerMetadata() const
unsigned getAddressSpace() const
void setDSOLocal(bool Local)
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing module and deletes it.
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
static bool isValidDeclarationLinkage(LinkageTypes Linkage)
static LLVM_ABI std::string getGlobalIdentifier(StringRef Name, GlobalValue::LinkageTypes Linkage, StringRef FileName)
Return the modified name for a global value suitable to be used as the key for a global lookup (e....
void setVisibility(VisibilityTypes V)
LLVM_ABI void setSanitizerMetadata(SanitizerMetadata Meta)
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AppendingLinkage
Special purpose, only applies to global arrays.
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Type * getValueType() const
LLVM_ABI void setPartition(StringRef Part)
LLVM_ABI void setInitializer(Constant *InitVal)
setInitializer - Sets the initializer for this global variable, removing any existing initializer if ...
void setAttributes(AttributeSet A)
Set attribute list for this global.
void setConstant(bool Val)
LLVM_ABI void setCodeModel(CodeModel::Model CM)
Change the code model for this global.
void setExternallyInitialized(bool Val)
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
LLVM_ABI void addDestination(BasicBlock *Dest)
Add a destination.
static IndirectBrInst * Create(Value *Address, unsigned NumDests, InsertPosition InsertBefore=nullptr)
static LLVM_ABI InlineAsm * get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack=false, AsmDialect asmDialect=AD_ATT, bool canThrow=false)
InlineAsm::get - Return the specified uniqued inline asm string.
static LLVM_ABI Error verify(FunctionType *Ty, StringRef Constraints)
This static method can be used by the parser to check to see if the specified constraint string is le...
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI bool isValidOperands(const Value *Vec, const Value *NewElt, const Value *Idx)
Return true if an insertelement instruction can be formed with the specified operands.
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
LLVM_ABI void setNonNeg(bool b=true)
Set or clear the nneg flag on this instruction, which must be a zext instruction.
bool isTerminator() const
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
LLVM_ABI InstListType::iterator insertInto(BasicBlock *ParentBB, InstListType::iterator It)
Inserts an unlinked instruction into ParentBB at position It and returns the iterator of the inserted...
A wrapper class for inspecting calls to intrinsic functions.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
lltok::Kind getKind() const
bool parseDIExpressionBodyAtBeginning(MDNode *&Result, unsigned &Read, const SlotMapping *Slots)
LLVMContext & getContext()
bool parseTypeAtBeginning(Type *&Ty, unsigned &Read, const SlotMapping *Slots)
bool parseStandaloneConstantValue(Constant *&C, const SlotMapping *Slots)
bool Run(bool UpgradeDebugInfo, DataLayoutCallbackTy DataLayoutCallback=[](StringRef, StringRef) { return std::nullopt;})
Run: module ::= toplevelentity*.
static LLVM_ABI LandingPadInst * Create(Type *RetTy, unsigned NumReservedClauses, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedClauses is a hint for the number of incoming clauses that this landingpad w...
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a distinct node.
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
static MemoryEffectsBase readOnly()
MemoryEffectsBase getWithModRef(Location Loc, ModRefInfo MR) const
Get new MemoryEffectsBase with modified ModRefInfo for Loc.
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase writeOnly()
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase none()
static MemoryEffectsBase unknown()
A Module instance is used to store all the information related to an LLVM module.
StringMap< Comdat > ComdatSymTabType
The type of the comdat "symbol" table.
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
static LLVM_ABI PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
static ResumeInst * Create(Value *Exn, InsertPosition InsertBefore=nullptr)
static ReturnInst * Create(LLVMContext &C, Value *retVal=nullptr, InsertPosition InsertBefore=nullptr)
Represents a location in source code.
constexpr const char * getPointer() const
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, Instruction *MDFrom=nullptr)
static LLVM_ABI const char * areInvalidOperands(Value *Cond, Value *True, Value *False)
Return a string if the specified operands are invalid for a select operation, otherwise return null.
ArrayRef< int > getShuffleMask() const
static LLVM_ABI bool isValidOperands(const Value *V1, const Value *V2, const Value *Mask)
Return true if a shufflevector instruction can be formed with the specified operands.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
iterator find(StringRef Key)
StringMapIterBase< Comdat, false > iterator
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
LLVM_ABI Error setBodyOrError(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type or return an error if it would make the type recursive.
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Returns true if this struct contains a scalable vector.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
@ HasZeroInit
zeroinitializer is valid for this target extension type.
static LLVM_ABI Expected< TargetExtType * > getOrError(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters,...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
bool isVectorTy() const
True if this is an instance of VectorType.
bool isArrayTy() const
True if this is an instance of ArrayType.
static LLVM_ABI Type * getTokenTy(LLVMContext &C)
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
bool isLabelTy() const
Return true if this is 'label'.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
static LLVM_ABI Type * getLabelTy(LLVMContext &C)
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM_ABI bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
bool isAggregateType() const
Return true if the type is an aggregate type.
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
bool isFunctionTy() const
True if this is an instance of FunctionType.
bool isIntegerTy() const
True if this is an instance of IntegerType.
bool isTokenTy() const
Return true if this is 'token'.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
bool isVoidTy() const
Return true if this is 'void'.
bool isMetadataTy() const
Return true if this is 'metadata'.
static LLVM_ABI UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
static constexpr uint64_t MaximumAlignment
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVM_ABI void deleteValue()
Delete a pointer to a generic Value.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
self_iterator getIterator()
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
LLVM_ABI unsigned getOperationEncoding(StringRef OperationEncodingString)
LLVM_ABI unsigned getAttributeEncoding(StringRef EncodingString)
LLVM_ABI unsigned getTag(StringRef TagString)
LLVM_ABI unsigned getCallingConvention(StringRef LanguageString)
LLVM_ABI unsigned getLanguage(StringRef LanguageString)
LLVM_ABI unsigned getVirtuality(StringRef VirtualityString)
LLVM_ABI unsigned getEnumKind(StringRef EnumKindString)
LLVM_ABI unsigned getMacinfo(StringRef MacinfoString)
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ AArch64_VectorCall
Used between AArch64 Advanced SIMD functions.
@ X86_64_SysV
The C convention as specified in the x86-64 supplement to the System V ABI, used on most non-Windows ...
@ RISCV_VectorCall
Calling convention used for RISC-V V-extension.
@ AMDGPU_CS
Used for Mesa/AMDPAL compute shaders.
@ AMDGPU_VS
Used for Mesa vertex shaders, or AMDPAL last shader stage before rasterization (vertex shader if tess...
@ AVR_SIGNAL
Used for AVR signal routines.
@ Swift
Calling convention for Swift.
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ AArch64_SVE_VectorCall
Used between AArch64 SVE functions.
@ ARM_APCS
ARM Procedure Calling Standard (obsolete, but still used on some targets).
@ CHERIoT_CompartmentCall
Calling convention used for CHERIoT when crossing a protection boundary.
@ CFGuard_Check
Special calling convention on Windows for calling the Control Guard Check ICall funtion.
@ AVR_INTR
Used for AVR interrupt routines.
@ PreserveMost
Used for runtime calls that preserves most registers.
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
@ AMDGPU_Gfx
Used for AMD graphics targets.
@ DUMMY_HHVM
Placeholders for HHVM calling conventions (deprecated, removed).
@ AMDGPU_CS_ChainPreserve
Used on AMDGPUs to give the middle-end more control over argument placement.
@ AMDGPU_HS
Used for Mesa/AMDPAL hull shaders (= tessellation control shaders).
@ ARM_AAPCS
ARM Architecture Procedure Calling Standard calling convention (aka EABI).
@ CHERIoT_CompartmentCallee
Calling convention used for the callee of CHERIoT_CompartmentCall.
@ AMDGPU_GS
Used for Mesa/AMDPAL geometry shaders.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2
Preserve X2-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ CHERIoT_LibraryCall
Calling convention used for CHERIoT for cross-library calls to a stateless compartment.
@ CXX_FAST_TLS
Used for access functions.
@ X86_INTR
x86 hardware interrupt context.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0
Preserve X0-X13, X19-X29, SP, Z0-Z31, P0-P15.
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
@ AMDGPU_PS
Used for Mesa/AMDPAL pixel shaders.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1
Preserve X1-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ X86_ThisCall
Similar to X86_StdCall.
@ PTX_Device
Call to a PTX device function.
@ SPIR_KERNEL
Used for SPIR kernel functions.
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
@ X86_StdCall
stdcall is mostly used by the Win32 API.
@ SPIR_FUNC
Used for SPIR non-kernel device functions.
@ Fast
Attempts to make calls as fast as possible (e.g.
@ MSP430_INTR
Used for MSP430 interrupt routines.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ Intel_OCL_BI
Used for Intel OpenCL built-ins.
@ PreserveNone
Used for runtime calls that preserves none general registers.
@ AMDGPU_ES
Used for AMDPAL shader stage before geometry shader if geometry is in use.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
@ PTX_Kernel
Call to a PTX kernel. Passes all arguments in parameter space.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
@ GRAAL
Used by GraalVM. Two additional registers are reserved.
@ AMDGPU_LS
Used for AMDPAL vertex shader if tessellation is in use.
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
@ X86_RegCall
Register calling convention used for parameters transfer optimization.
@ M68k_RTD
Used for M68k rtd-based CC (similar to X86's stdcall).
@ C
The default llvm calling convention, compatible with C.
@ X86_FastCall
'fast' analog of X86_StdCall.
@ BasicBlock
Various leaf nodes.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
LLVM_ABI bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &ArgTys)
Gets the type arguments of an intrinsic call by matching type contraints specified by the ....
Flag
These should be considered private to the implementation of the MCInstrDesc class.
@ System
Synchronized with respect to all concurrently executing threads.
initializer< Ty > init(const Ty &Val)
@ DW_TAG_invalid
LLVM mock tags (see also llvm/BinaryFormat/Dwarf.def).
@ DW_MACINFO_invalid
Macinfo type for invalid results.
@ DW_APPLE_ENUM_KIND_invalid
Enum kind for invalid results.
@ DW_VIRTUALITY_invalid
Virtuality for invalid results.
@ kw_aarch64_sme_preservemost_from_x1
@ kw_no_sanitize_hwaddress
@ kw_cheriot_librarycallcc
@ kw_cheriot_compartmentcalleecc
@ kw_typeCheckedLoadConstVCalls
@ kw_aarch64_sve_vector_pcs
@ kw_cheriot_compartmentcallcc
@ kw_amdgpu_gfx_whole_wave
@ kw_typeTestAssumeConstVCalls
@ kw_typeidCompatibleVTable
@ kw_typeCheckedLoadVCalls
@ kw_inaccessiblemem_or_argmemonly
@ kw_externally_initialized
@ kw_sanitize_address_dyninit
@ kw_amdgpu_cs_chain_preserve
@ kw_available_externally
@ kw_typeTestAssumeVCalls
@ kw_aarch64_sme_preservemost_from_x0
@ kw_dso_local_equivalent
@ kw_aarch64_sme_preservemost_from_x2
NodeAddr< NodeBase * > Node
friend class Instruction
Iterator for Instructions in a `BasicBlock.
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
std::tuple< const DIScope *, const DIScope *, const DILocalVariable * > VarID
A unique key that represents a debug variable.
LLVM_ABI void UpgradeSectionAttributes(Module &M)
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
SaveAndRestore(T &) -> SaveAndRestore< T >
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
LLVM_ABI void UpgradeCallsToIntrinsic(Function *F)
This is an auto-upgrade hook for any old intrinsic function syntaxes which need to have both the func...
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
auto dyn_cast_or_null(const Y &Val)
@ Async
"Asynchronous" unwind tables (instr precise)
@ Sync
"Synchronous" unwind tables
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
void sort(IteratorTy Start, IteratorTy End)
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
bool isPointerTy(const Type *T)
FunctionAddr VTableAddr Count
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
CaptureComponents
Components of the pointer that may be captured.
iterator_range< SplittingIterator > split(StringRef Str, StringRef Separator)
Split the specified string over a separator and return a range-compatible iterable over its partition...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Ref
The access may reference the value stored in memory.
@ ModRef
The access may reference and may modify the value stored in memory.
@ Mod
The access may modify the value stored in memory.
@ NoModRef
The access neither references nor modifies the value stored in memory.
@ ArgMem
Access to memory via argument pointers.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
llvm::function_ref< std::optional< std::string >(StringRef, StringRef)> DataLayoutCallbackTy
auto count(R &&Range, const E &Element)
Wrapper function around std::count to count the number of times an element Element occurs in the give...
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
PointerUnion< const Value *, const PseudoSourceValue * > ValueType
LLVM_ABI bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
static int64_t upperBound(StackOffset Size)
bool capturesNothing(CaptureComponents CC)
LLVM_ABI MDNode * UpgradeTBAANode(MDNode &TBAANode)
If the given TBAA tag uses the scalar TBAA format, create a new node corresponding to the upgrade to ...
static LLVM_ABI const fltSemantics & IEEEsingle() LLVM_READNONE
static constexpr roundingMode rmNearestTiesToEven
static LLVM_ABI const fltSemantics & IEEEdouble() LLVM_READNONE
static LLVM_ABI const fltSemantics & IEEEhalf() LLVM_READNONE
static LLVM_ABI const fltSemantics & BFloat() LLVM_READNONE
std::vector< uint64_t > Args
unsigned ReturnDoesNotAlias
unsigned MustBeUnreachable
std::vector< Call > Calls
In the per-module summary, it summarizes the byte offset applied to each pointer parameter before pas...
static constexpr uint32_t RangeWidth
std::vector< ConstVCall > TypeCheckedLoadConstVCalls
std::vector< VFuncId > TypeCheckedLoadVCalls
std::vector< ConstVCall > TypeTestAssumeConstVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
std::vector< GlobalValue::GUID > TypeTests
List of type identifiers used by this function in llvm.type.test intrinsics referenced by something o...
std::vector< VFuncId > TypeTestAssumeVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
unsigned DSOLocal
Indicates that the linker resolved the symbol to a definition from within the same linkage unit.
unsigned CanAutoHide
In the per-module summary, indicates that the global value is linkonce_odr and global unnamed addr (s...
unsigned ImportType
This field is written by the ThinLTO indexing step to postlink combined summary.
unsigned NotEligibleToImport
Indicate if the global value cannot be imported (e.g.
unsigned Linkage
The linkage type of the associated global value.
unsigned Visibility
Indicates the visibility.
unsigned Live
In per-module summary, indicate that the global value must be considered a live root for index-based ...
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
This struct contains the mappings from the slot numbers to unnamed metadata nodes,...
std::map< unsigned, Type * > Types
StringMap< Type * > NamedTypes
std::map< unsigned, TrackingMDNodeRef > MetadataNodes
NumberedValues< GlobalValue * > GlobalValues
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
@ Unknown
Unknown (analysis not performed, don't lower)
@ Single
Single element (last example in "Short Inline Bit Vectors")
@ Inline
Inlined bit vector ("Short Inline Bit Vectors")
@ Unsat
Unsatisfiable type (i.e. no global has this type metadata)
@ AllOnes
All-ones bit vector ("Eliminating Bit Vector Checks for All-Ones Bit Vectors")
@ ByteArray
Test a byte array (first example)
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
ValID - Represents a reference of a definition of some sort with no type.
enum llvm::ValID::@273232264270353276247031231016211363171152164072 Kind
Struct that holds a reference to a particular GUID in a global value summary.
const GlobalValueSummaryMapTy::value_type * getRef() const
@ UniformRetVal
Uniform return value optimization.
@ VirtualConstProp
Virtual constant propagation.
@ UniqueRetVal
Unique return value optimization.
@ Indir
Just do a regular virtual call.
uint64_t Info
Additional information for the resolution:
enum llvm::WholeProgramDevirtResolution::ByArg::Kind TheKind
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...
std::string SingleImplName
@ SingleImpl
Single implementation devirtualization.
@ Indir
Just do a regular virtual call.
@ BranchFunnel
When retpoline mitigation is enabled, use a branch funnel that is defined in the merged module.