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 DwarfSourceLangNameField :
public MDUnsignedField {
4744 DwarfSourceLangNameField() : MDUnsignedField(0, UINT32_MAX) {}
4747struct DwarfCCField :
public MDUnsignedField {
4748 DwarfCCField() : MDUnsignedField(0, dwarf::
DW_CC_hi_user) {}
4751struct DwarfEnumKindField :
public MDUnsignedField {
4752 DwarfEnumKindField()
4757struct EmissionKindField :
public MDUnsignedField {
4758 EmissionKindField() : MDUnsignedField(0, DICompileUnit::LastEmissionKind) {}
4761struct FixedPointKindField :
public MDUnsignedField {
4762 FixedPointKindField()
4763 : MDUnsignedField(0, DIFixedPointType::LastFixedPointKind) {}
4766struct NameTableKindField :
public MDUnsignedField {
4767 NameTableKindField()
4770 DICompileUnit::DebugNameTableKind::LastDebugNameTableKind) {}
4773struct DIFlagField :
public MDFieldImpl<DINode::DIFlags> {
4774 DIFlagField() : MDFieldImpl(DINode::FlagZero) {}
4777struct DISPFlagField :
public MDFieldImpl<DISubprogram::DISPFlags> {
4778 DISPFlagField() : MDFieldImpl(DISubprogram::SPFlagZero) {}
4781struct MDAPSIntField :
public MDFieldImpl<APSInt> {
4782 MDAPSIntField() : ImplTy(
APSInt()) {}
4785struct MDSignedField :
public MDFieldImpl<int64_t> {
4789 MDSignedField(int64_t
Default = 0)
4791 MDSignedField(int64_t
Default, int64_t Min, int64_t Max)
4795struct MDBoolField :
public MDFieldImpl<bool> {
4799struct MDField :
public MDFieldImpl<Metadata *> {
4802 MDField(
bool AllowNull =
true) : ImplTy(nullptr), AllowNull(AllowNull) {}
4805struct MDStringField :
public MDFieldImpl<MDString *> {
4806 enum class EmptyIs {
4811 MDStringField(
enum EmptyIs EmptyIs = EmptyIs::Null)
4812 : ImplTy(nullptr), EmptyIs(EmptyIs) {}
4815struct MDFieldList :
public MDFieldImpl<SmallVector<Metadata *, 4>> {
4819struct ChecksumKindField :
public MDFieldImpl<DIFile::ChecksumKind> {
4823struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
4824 MDSignedOrMDField(int64_t
Default = 0,
bool AllowNull =
true)
4825 : ImplTy(MDSignedField(
Default), MDField(AllowNull)) {}
4827 MDSignedOrMDField(int64_t
Default, int64_t Min, int64_t Max,
4828 bool AllowNull =
true)
4829 : ImplTy(MDSignedField(
Default, Min,
Max), MDField(AllowNull)) {}
4831 bool isMDSignedField()
const {
return WhatIs == IsTypeA; }
4832 bool isMDField()
const {
return WhatIs == IsTypeB; }
4833 int64_t getMDSignedValue()
const {
4834 assert(isMDSignedField() &&
"Wrong field type");
4837 Metadata *getMDFieldValue()
const {
4838 assert(isMDField() &&
"Wrong field type");
4843struct MDUnsignedOrMDField : MDEitherFieldImpl<MDUnsignedField, MDField> {
4844 MDUnsignedOrMDField(uint64_t
Default = 0,
bool AllowNull =
true)
4845 : ImplTy(MDUnsignedField(
Default), MDField(AllowNull)) {}
4847 MDUnsignedOrMDField(uint64_t
Default, uint64_t Max,
bool AllowNull =
true)
4848 : ImplTy(MDUnsignedField(
Default,
Max), MDField(AllowNull)) {}
4850 bool isMDUnsignedField()
const {
return WhatIs == IsTypeA; }
4851 bool isMDField()
const {
return WhatIs == IsTypeB; }
4852 uint64_t getMDUnsignedValue()
const {
4853 assert(isMDUnsignedField() &&
"Wrong field type");
4856 Metadata *getMDFieldValue()
const {
4857 assert(isMDField() &&
"Wrong field type");
4862 if (isMDUnsignedField())
4864 ConstantInt::get(Type::getInt64Ty(
Context), getMDUnsignedValue()));
4866 return getMDFieldValue();
4878 return tokError(
"expected integer");
4880 Result.assign(Lex.getAPSIntVal());
4887 MDUnsignedField &Result) {
4888 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
4889 return tokError(
"expected unsigned integer");
4891 auto &U = Lex.getAPSIntVal();
4892 if (U.ugt(Result.Max))
4893 return tokError(
"value for '" + Name +
"' too large, limit is " +
4895 Result.assign(U.getZExtValue());
4896 assert(Result.Val <= Result.Max &&
"Expected value in range");
4903 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4907 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4913 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4916 return tokError(
"expected DWARF tag");
4920 return tokError(
"invalid DWARF tag" +
Twine(
" '") + Lex.getStrVal() +
"'");
4921 assert(
Tag <= Result.Max &&
"Expected valid DWARF tag");
4930 DwarfMacinfoTypeField &Result) {
4932 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4935 return tokError(
"expected DWARF macinfo type");
4939 return tokError(
"invalid DWARF macinfo type" +
Twine(
" '") +
4940 Lex.getStrVal() +
"'");
4941 assert(Macinfo <= Result.Max &&
"Expected valid DWARF macinfo type");
4943 Result.assign(Macinfo);
4950 DwarfVirtualityField &Result) {
4952 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4955 return tokError(
"expected DWARF virtuality code");
4959 return tokError(
"invalid DWARF virtuality code" +
Twine(
" '") +
4960 Lex.getStrVal() +
"'");
4961 assert(Virtuality <= Result.Max &&
"Expected valid DWARF virtuality code");
4962 Result.assign(Virtuality);
4969 DwarfEnumKindField &Result) {
4971 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4974 return tokError(
"expected DWARF enum kind code");
4978 return tokError(
"invalid DWARF enum kind code" +
Twine(
" '") +
4979 Lex.getStrVal() +
"'");
4980 assert(EnumKind <= Result.Max &&
"Expected valid DWARF enum kind code");
4981 Result.assign(EnumKind);
4989 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4992 return tokError(
"expected DWARF language");
4996 return tokError(
"invalid DWARF language" +
Twine(
" '") + Lex.getStrVal() +
4998 assert(Lang <= Result.Max &&
"Expected valid DWARF language");
4999 Result.assign(Lang);
5006 DwarfSourceLangNameField &Result) {
5008 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5011 return tokError(
"expected DWARF source language name");
5015 return tokError(
"invalid DWARF source language name" +
Twine(
" '") +
5016 Lex.getStrVal() +
"'");
5017 assert(Lang <= Result.Max &&
"Expected valid DWARF source language name");
5018 Result.assign(Lang);
5026 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5029 return tokError(
"expected DWARF calling convention");
5033 return tokError(
"invalid DWARF calling convention" +
Twine(
" '") +
5034 Lex.getStrVal() +
"'");
5035 assert(CC <= Result.Max &&
"Expected valid DWARF calling convention");
5043 EmissionKindField &Result) {
5045 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5048 return tokError(
"expected emission kind");
5052 return tokError(
"invalid emission kind" +
Twine(
" '") + Lex.getStrVal() +
5054 assert(*Kind <= Result.Max &&
"Expected valid emission kind");
5055 Result.assign(*Kind);
5062 FixedPointKindField &Result) {
5064 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5067 return tokError(
"expected fixed-point kind");
5071 return tokError(
"invalid fixed-point kind" +
Twine(
" '") + Lex.getStrVal() +
5073 assert(*Kind <= Result.Max &&
"Expected valid fixed-point kind");
5074 Result.assign(*Kind);
5081 NameTableKindField &Result) {
5083 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5086 return tokError(
"expected nameTable kind");
5090 return tokError(
"invalid nameTable kind" +
Twine(
" '") + Lex.getStrVal() +
5092 assert(((
unsigned)*Kind) <= Result.Max &&
"Expected valid nameTable kind");
5093 Result.assign((
unsigned)*Kind);
5100 DwarfAttEncodingField &Result) {
5102 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5105 return tokError(
"expected DWARF type attribute encoding");
5109 return tokError(
"invalid DWARF type attribute encoding" +
Twine(
" '") +
5110 Lex.getStrVal() +
"'");
5111 assert(Encoding <= Result.Max &&
"Expected valid DWARF language");
5112 Result.assign(Encoding);
5126 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5128 bool Res = parseUInt32(TempVal);
5134 return tokError(
"expected debug info flag");
5138 return tokError(
Twine(
"invalid debug info flag '") + Lex.getStrVal() +
5153 Result.assign(Combined);
5166 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5168 bool Res = parseUInt32(TempVal);
5174 return tokError(
"expected debug info flag");
5178 return tokError(
Twine(
"invalid subprogram debug info flag '") +
5179 Lex.getStrVal() +
"'");
5193 Result.assign(Combined);
5200 return tokError(
"expected signed integer");
5202 auto &S = Lex.getAPSIntVal();
5204 return tokError(
"value for '" + Name +
"' too small, limit is " +
5207 return tokError(
"value for '" + Name +
"' too large, limit is " +
5209 Result.assign(S.getExtValue());
5210 assert(Result.Val >= Result.Min &&
"Expected value in range");
5211 assert(Result.Val <= Result.Max &&
"Expected value in range");
5218 switch (Lex.getKind()) {
5220 return tokError(
"expected 'true' or 'false'");
5222 Result.assign(
true);
5225 Result.assign(
false);
5235 if (!Result.AllowNull)
5236 return tokError(
"'" + Name +
"' cannot be null");
5238 Result.assign(
nullptr);
5243 if (parseMetadata(MD,
nullptr))
5252 MDSignedOrMDField &Result) {
5255 MDSignedField Res = Result.A;
5256 if (!parseMDField(
Loc, Name, Res)) {
5264 MDField Res = Result.B;
5265 if (!parseMDField(
Loc, Name, Res)) {
5275 MDUnsignedOrMDField &Result) {
5278 MDUnsignedField Res = Result.A;
5279 if (!parseMDField(
Loc, Name, Res)) {
5287 MDField Res = Result.B;
5288 if (!parseMDField(
Loc, Name, Res)) {
5298 LocTy ValueLoc = Lex.getLoc();
5300 if (parseStringConstant(S))
5304 switch (Result.EmptyIs) {
5305 case MDStringField::EmptyIs::Null:
5306 Result.assign(
nullptr);
5308 case MDStringField::EmptyIs::Empty:
5310 case MDStringField::EmptyIs::Error:
5311 return error(ValueLoc,
"'" + Name +
"' cannot be empty");
5322 if (parseMDNodeVector(MDs))
5325 Result.assign(std::move(MDs));
5331 ChecksumKindField &Result) {
5332 std::optional<DIFile::ChecksumKind> CSKind =
5336 return tokError(
"invalid checksum kind" +
Twine(
" '") + Lex.getStrVal() +
5339 Result.assign(*CSKind);
5346template <
class ParserTy>
5347bool LLParser::parseMDFieldsImplBody(ParserTy ParseField) {
5350 return tokError(
"expected field label here");
5359template <
class ParserTy>
5360bool LLParser::parseMDFieldsImpl(ParserTy ParseField, LocTy &ClosingLoc) {
5367 if (parseMDFieldsImplBody(ParseField))
5370 ClosingLoc = Lex.getLoc();
5374template <
class FieldTy>
5375bool LLParser::parseMDField(
StringRef Name, FieldTy &Result) {
5377 return tokError(
"field '" + Name +
"' cannot be specified more than once");
5379 LocTy Loc = Lex.getLoc();
5381 return parseMDField(Loc, Name, Result);
5384bool LLParser::parseSpecializedMDNode(
MDNode *&
N,
bool IsDistinct) {
5387#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
5388 if (Lex.getStrVal() == #CLASS) \
5389 return parse##CLASS(N, IsDistinct);
5390#include "llvm/IR/Metadata.def"
5392 return tokError(
"expected metadata type");
5395#define DECLARE_FIELD(NAME, TYPE, INIT) TYPE NAME INIT
5396#define NOP_FIELD(NAME, TYPE, INIT)
5397#define REQUIRE_FIELD(NAME, TYPE, INIT) \
5399 return error(ClosingLoc, "missing required field '" #NAME "'");
5400#define PARSE_MD_FIELD(NAME, TYPE, DEFAULT) \
5401 if (Lex.getStrVal() == #NAME) \
5402 return parseMDField(#NAME, NAME);
5403#define PARSE_MD_FIELDS() \
5404 VISIT_MD_FIELDS(DECLARE_FIELD, DECLARE_FIELD) \
5407 if (parseMDFieldsImpl( \
5409 VISIT_MD_FIELDS(PARSE_MD_FIELD, PARSE_MD_FIELD) \
5410 return tokError(Twine("invalid field '") + Lex.getStrVal() + \
5415 VISIT_MD_FIELDS(NOP_FIELD, REQUIRE_FIELD) \
5417#define GET_OR_DISTINCT(CLASS, ARGS) \
5418 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
5423bool LLParser::parseDILocation(
MDNode *&Result,
bool IsDistinct) {
5424#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5425 OPTIONAL(line, LineField, ); \
5426 OPTIONAL(column, ColumnField, ); \
5427 REQUIRED(scope, MDField, ( false)); \
5428 OPTIONAL(inlinedAt, MDField, ); \
5429 OPTIONAL(isImplicitCode, MDBoolField, (false)); \
5430 OPTIONAL(atomGroup, MDUnsignedField, (0, UINT64_MAX)); \
5431 OPTIONAL(atomRank, MDUnsignedField, (0, UINT8_MAX));
5433#undef VISIT_MD_FIELDS
5436 DILocation, (Context, line.Val, column.Val, scope.Val, inlinedAt.Val,
5437 isImplicitCode.Val, atomGroup.Val, atomRank.Val));
5443bool LLParser::parseDIAssignID(
MDNode *&Result,
bool IsDistinct) {
5445 return tokError(
"missing 'distinct', required for !DIAssignID()");
5461bool LLParser::parseGenericDINode(
MDNode *&Result,
bool IsDistinct) {
5462#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5463 REQUIRED(tag, DwarfTagField, ); \
5464 OPTIONAL(header, MDStringField, ); \
5465 OPTIONAL(operands, MDFieldList, );
5467#undef VISIT_MD_FIELDS
5470 (Context, tag.Val, header.Val, operands.Val));
5479bool LLParser::parseDISubrangeType(
MDNode *&Result,
bool IsDistinct) {
5480#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5481 OPTIONAL(name, MDStringField, ); \
5482 OPTIONAL(file, MDField, ); \
5483 OPTIONAL(line, LineField, ); \
5484 OPTIONAL(scope, MDField, ); \
5485 OPTIONAL(baseType, MDField, ); \
5486 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5487 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5488 OPTIONAL(flags, DIFlagField, ); \
5489 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5490 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5491 OPTIONAL(stride, MDSignedOrMDField, ); \
5492 OPTIONAL(bias, MDSignedOrMDField, );
5494#undef VISIT_MD_FIELDS
5496 auto convToMetadata = [&](MDSignedOrMDField Bound) ->
Metadata * {
5497 if (Bound.isMDSignedField())
5500 if (Bound.isMDField())
5501 return Bound.getMDFieldValue();
5505 Metadata *LowerBound = convToMetadata(lowerBound);
5507 Metadata *Stride = convToMetadata(stride);
5508 Metadata *Bias = convToMetadata(bias);
5511 DISubrangeType, (Context,
name.Val,
file.Val, line.Val, scope.Val,
5512 size.getValueAsMetadata(Context), align.Val, flags.Val,
5513 baseType.Val, LowerBound, UpperBound, Stride, Bias));
5522bool LLParser::parseDISubrange(
MDNode *&Result,
bool IsDistinct) {
5523#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5524 OPTIONAL(count, MDSignedOrMDField, (-1, -1, INT64_MAX, false)); \
5525 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5526 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5527 OPTIONAL(stride, MDSignedOrMDField, );
5529#undef VISIT_MD_FIELDS
5536 auto convToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5537 if (Bound.isMDSignedField())
5540 if (Bound.isMDField())
5541 return Bound.getMDFieldValue();
5546 LowerBound = convToMetadata(lowerBound);
5548 Stride = convToMetadata(stride);
5551 (Context,
Count, LowerBound, UpperBound, Stride));
5559bool LLParser::parseDIGenericSubrange(
MDNode *&Result,
bool IsDistinct) {
5560#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5561 OPTIONAL(count, MDSignedOrMDField, ); \
5562 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5563 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5564 OPTIONAL(stride, MDSignedOrMDField, );
5566#undef VISIT_MD_FIELDS
5568 auto ConvToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5569 if (Bound.isMDSignedField())
5571 Context, {dwarf::DW_OP_consts,
5572 static_cast<uint64_t
>(Bound.getMDSignedValue())});
5573 if (Bound.isMDField())
5574 return Bound.getMDFieldValue();
5579 Metadata *LowerBound = ConvToMetadata(lowerBound);
5581 Metadata *Stride = ConvToMetadata(stride);
5584 (Context,
Count, LowerBound, UpperBound, Stride));
5591bool LLParser::parseDIEnumerator(
MDNode *&Result,
bool IsDistinct) {
5592#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5593 REQUIRED(name, MDStringField, ); \
5594 REQUIRED(value, MDAPSIntField, ); \
5595 OPTIONAL(isUnsigned, MDBoolField, (false));
5597#undef VISIT_MD_FIELDS
5599 if (isUnsigned.Val && value.Val.isNegative())
5600 return tokError(
"unsigned enumerator with negative value");
5605 if (!isUnsigned.Val && value.Val.isUnsigned() && value.Val.isSignBitSet())
5617bool LLParser::parseDIBasicType(
MDNode *&Result,
bool IsDistinct) {
5618#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5619 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5620 OPTIONAL(name, MDStringField, ); \
5621 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5622 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5623 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5624 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5625 OPTIONAL(flags, DIFlagField, );
5627#undef VISIT_MD_FIELDS
5630 size.getValueAsMetadata(Context),
5631 align.Val, encoding.Val,
5632 num_extra_inhabitants.Val, flags.Val));
5641bool LLParser::parseDIFixedPointType(
MDNode *&Result,
bool IsDistinct) {
5642#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5643 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5644 OPTIONAL(name, MDStringField, ); \
5645 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5646 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5647 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5648 OPTIONAL(flags, DIFlagField, ); \
5649 OPTIONAL(kind, FixedPointKindField, ); \
5650 OPTIONAL(factor, MDSignedField, ); \
5651 OPTIONAL(numerator, MDAPSIntField, ); \
5652 OPTIONAL(denominator, MDAPSIntField, );
5654#undef VISIT_MD_FIELDS
5657 (Context, tag.Val,
name.Val,
5658 size.getValueAsMetadata(Context), align.Val,
5659 encoding.Val, flags.Val, kind.Val, factor.Val,
5660 numerator.Val, denominator.Val));
5666bool LLParser::parseDIStringType(
MDNode *&Result,
bool IsDistinct) {
5667#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5668 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_string_type)); \
5669 OPTIONAL(name, MDStringField, ); \
5670 OPTIONAL(stringLength, MDField, ); \
5671 OPTIONAL(stringLengthExpression, MDField, ); \
5672 OPTIONAL(stringLocationExpression, MDField, ); \
5673 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5674 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5675 OPTIONAL(encoding, DwarfAttEncodingField, );
5677#undef VISIT_MD_FIELDS
5681 (Context, tag.Val,
name.Val, stringLength.Val, stringLengthExpression.Val,
5682 stringLocationExpression.Val,
size.getValueAsMetadata(Context),
5683 align.Val, encoding.Val));
5696bool LLParser::parseDIDerivedType(
MDNode *&Result,
bool IsDistinct) {
5697#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5698 REQUIRED(tag, DwarfTagField, ); \
5699 OPTIONAL(name, MDStringField, ); \
5700 OPTIONAL(file, MDField, ); \
5701 OPTIONAL(line, LineField, ); \
5702 OPTIONAL(scope, MDField, ); \
5703 REQUIRED(baseType, MDField, ); \
5704 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5705 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5706 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5707 OPTIONAL(flags, DIFlagField, ); \
5708 OPTIONAL(extraData, MDField, ); \
5709 OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
5710 OPTIONAL(annotations, MDField, ); \
5711 OPTIONAL(ptrAuthKey, MDUnsignedField, (0, 7)); \
5712 OPTIONAL(ptrAuthIsAddressDiscriminated, MDBoolField, ); \
5713 OPTIONAL(ptrAuthExtraDiscriminator, MDUnsignedField, (0, 0xffff)); \
5714 OPTIONAL(ptrAuthIsaPointer, MDBoolField, ); \
5715 OPTIONAL(ptrAuthAuthenticatesNullValues, MDBoolField, );
5717#undef VISIT_MD_FIELDS
5719 std::optional<unsigned> DWARFAddressSpace;
5720 if (dwarfAddressSpace.Val != UINT32_MAX)
5721 DWARFAddressSpace = dwarfAddressSpace.Val;
5722 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
5724 PtrAuthData.emplace(
5725 (
unsigned)ptrAuthKey.Val, ptrAuthIsAddressDiscriminated.Val,
5726 (
unsigned)ptrAuthExtraDiscriminator.Val, ptrAuthIsaPointer.Val,
5727 ptrAuthAuthenticatesNullValues.Val);
5730 DIDerivedType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
5731 baseType.Val,
size.getValueAsMetadata(Context), align.Val,
5732 offset.getValueAsMetadata(Context), DWARFAddressSpace,
5733 PtrAuthData, flags.Val, extraData.Val, annotations.Val));
5737bool LLParser::parseDICompositeType(
MDNode *&Result,
bool IsDistinct) {
5738#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5739 REQUIRED(tag, DwarfTagField, ); \
5740 OPTIONAL(name, MDStringField, ); \
5741 OPTIONAL(file, MDField, ); \
5742 OPTIONAL(line, LineField, ); \
5743 OPTIONAL(scope, MDField, ); \
5744 OPTIONAL(baseType, MDField, ); \
5745 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5746 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5747 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5748 OPTIONAL(flags, DIFlagField, ); \
5749 OPTIONAL(elements, MDField, ); \
5750 OPTIONAL(runtimeLang, DwarfLangField, ); \
5751 OPTIONAL(enumKind, DwarfEnumKindField, ); \
5752 OPTIONAL(vtableHolder, MDField, ); \
5753 OPTIONAL(templateParams, MDField, ); \
5754 OPTIONAL(identifier, MDStringField, ); \
5755 OPTIONAL(discriminator, MDField, ); \
5756 OPTIONAL(dataLocation, MDField, ); \
5757 OPTIONAL(associated, MDField, ); \
5758 OPTIONAL(allocated, MDField, ); \
5759 OPTIONAL(rank, MDSignedOrMDField, ); \
5760 OPTIONAL(annotations, MDField, ); \
5761 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5762 OPTIONAL(specification, MDField, ); \
5763 OPTIONAL(bitStride, MDField, );
5765#undef VISIT_MD_FIELDS
5768 if (rank.isMDSignedField())
5771 else if (rank.isMDField())
5772 Rank = rank.getMDFieldValue();
5774 std::optional<unsigned> EnumKind;
5776 EnumKind = enumKind.Val;
5781 Context, *identifier.Val, tag.Val,
name.Val,
file.Val, line.Val,
5782 scope.Val, baseType.Val,
size.getValueAsMetadata(Context),
5783 align.Val, offset.getValueAsMetadata(Context), specification.Val,
5784 num_extra_inhabitants.Val, flags.Val, elements.Val, runtimeLang.Val,
5785 EnumKind, vtableHolder.Val, templateParams.Val, discriminator.Val,
5786 dataLocation.Val, associated.Val, allocated.Val, Rank,
5787 annotations.Val, bitStride.Val)) {
5796 (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val, baseType.Val,
5797 size.getValueAsMetadata(Context), align.Val,
5798 offset.getValueAsMetadata(Context), flags.Val, elements.Val,
5799 runtimeLang.Val, EnumKind, vtableHolder.Val, templateParams.Val,
5800 identifier.Val, discriminator.Val, dataLocation.Val, associated.Val,
5801 allocated.Val, Rank, annotations.Val, specification.Val,
5802 num_extra_inhabitants.Val, bitStride.Val));
5806bool LLParser::parseDISubroutineType(
MDNode *&Result,
bool IsDistinct) {
5807#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5808 OPTIONAL(flags, DIFlagField, ); \
5809 OPTIONAL(cc, DwarfCCField, ); \
5810 REQUIRED(types, MDField, );
5812#undef VISIT_MD_FIELDS
5815 (Context, flags.Val, cc.Val, types.Val));
5824bool LLParser::parseDIFile(
MDNode *&Result,
bool IsDistinct) {
5828#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5829 REQUIRED(filename, MDStringField, ); \
5830 REQUIRED(directory, MDStringField, ); \
5831 OPTIONAL(checksumkind, ChecksumKindField, (DIFile::CSK_MD5)); \
5832 OPTIONAL(checksum, MDStringField, ); \
5833 OPTIONAL(source, MDStringField, (MDStringField::EmptyIs::Empty));
5835#undef VISIT_MD_FIELDS
5837 std::optional<DIFile::ChecksumInfo<MDString *>> OptChecksum;
5838 if (checksumkind.Seen && checksum.Seen)
5839 OptChecksum.emplace(checksumkind.Val, checksum.Val);
5840 else if (checksumkind.Seen || checksum.Seen)
5841 return tokError(
"'checksumkind' and 'checksum' must be provided together");
5843 MDString *
Source =
nullptr;
5847 DIFile, (Context,
filename.Val, directory.Val, OptChecksum, Source));
5858bool LLParser::parseDICompileUnit(
MDNode *&Result,
bool IsDistinct) {
5860 return tokError(
"missing 'distinct', required for !DICompileUnit");
5862 LocTy Loc = Lex.getLoc();
5864#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5865 REQUIRED(file, MDField, ( false)); \
5866 OPTIONAL(language, DwarfLangField, ); \
5867 OPTIONAL(sourceLanguageName, DwarfSourceLangNameField, ); \
5868 OPTIONAL(producer, MDStringField, ); \
5869 OPTIONAL(isOptimized, MDBoolField, ); \
5870 OPTIONAL(flags, MDStringField, ); \
5871 OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); \
5872 OPTIONAL(splitDebugFilename, MDStringField, ); \
5873 OPTIONAL(emissionKind, EmissionKindField, ); \
5874 OPTIONAL(enums, MDField, ); \
5875 OPTIONAL(retainedTypes, MDField, ); \
5876 OPTIONAL(globals, MDField, ); \
5877 OPTIONAL(imports, MDField, ); \
5878 OPTIONAL(macros, MDField, ); \
5879 OPTIONAL(dwoId, MDUnsignedField, ); \
5880 OPTIONAL(splitDebugInlining, MDBoolField, = true); \
5881 OPTIONAL(debugInfoForProfiling, MDBoolField, = false); \
5882 OPTIONAL(nameTableKind, NameTableKindField, ); \
5883 OPTIONAL(rangesBaseAddress, MDBoolField, = false); \
5884 OPTIONAL(sysroot, MDStringField, ); \
5885 OPTIONAL(sdk, MDStringField, );
5887#undef VISIT_MD_FIELDS
5889 if (!language.Seen && !sourceLanguageName.Seen)
5890 return error(Loc,
"missing one of 'language' or 'sourceLanguageName', "
5891 "required for !DICompileUnit");
5893 if (language.Seen && sourceLanguageName.Seen)
5894 return error(Loc,
"can only specify one of 'language' and "
5895 "'sourceLanguageName' on !DICompileUnit");
5899 language.Seen ? DISourceLanguageName(language.Val)
5900 : DISourceLanguageName(sourceLanguageName.Val, 0),
5901 file.Val, producer.Val, isOptimized.Val, flags.Val, runtimeVersion.Val,
5902 splitDebugFilename.Val, emissionKind.Val, enums.Val, retainedTypes.Val,
5903 globals.Val, imports.Val, macros.Val, dwoId.Val, splitDebugInlining.Val,
5904 debugInfoForProfiling.Val, nameTableKind.Val, rangesBaseAddress.Val,
5905 sysroot.Val, sdk.Val);
5918bool LLParser::parseDISubprogram(
MDNode *&Result,
bool IsDistinct) {
5919 auto Loc = Lex.getLoc();
5920#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5921 OPTIONAL(scope, MDField, ); \
5922 OPTIONAL(name, MDStringField, ); \
5923 OPTIONAL(linkageName, MDStringField, ); \
5924 OPTIONAL(file, MDField, ); \
5925 OPTIONAL(line, LineField, ); \
5926 OPTIONAL(type, MDField, ); \
5927 OPTIONAL(isLocal, MDBoolField, ); \
5928 OPTIONAL(isDefinition, MDBoolField, (true)); \
5929 OPTIONAL(scopeLine, LineField, ); \
5930 OPTIONAL(containingType, MDField, ); \
5931 OPTIONAL(virtuality, DwarfVirtualityField, ); \
5932 OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); \
5933 OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); \
5934 OPTIONAL(flags, DIFlagField, ); \
5935 OPTIONAL(spFlags, DISPFlagField, ); \
5936 OPTIONAL(isOptimized, MDBoolField, ); \
5937 OPTIONAL(unit, MDField, ); \
5938 OPTIONAL(templateParams, MDField, ); \
5939 OPTIONAL(declaration, MDField, ); \
5940 OPTIONAL(retainedNodes, MDField, ); \
5941 OPTIONAL(thrownTypes, MDField, ); \
5942 OPTIONAL(annotations, MDField, ); \
5943 OPTIONAL(targetFuncName, MDStringField, ); \
5944 OPTIONAL(keyInstructions, MDBoolField, );
5946#undef VISIT_MD_FIELDS
5951 spFlags.Seen ? spFlags.Val
5953 isOptimized.Val, virtuality.Val);
5954 if ((SPFlags & DISubprogram::SPFlagDefinition) && !IsDistinct)
5957 "missing 'distinct', required for !DISubprogram that is a Definition");
5960 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val, line.Val,
5961 type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
5962 thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
5963 declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
5964 targetFuncName.Val, keyInstructions.Val));
5970bool LLParser::parseDILexicalBlock(
MDNode *&Result,
bool IsDistinct) {
5971#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5972 REQUIRED(scope, MDField, ( false)); \
5973 OPTIONAL(file, MDField, ); \
5974 OPTIONAL(line, LineField, ); \
5975 OPTIONAL(column, ColumnField, );
5977#undef VISIT_MD_FIELDS
5980 DILexicalBlock, (Context, scope.Val,
file.Val, line.Val, column.Val));
5986bool LLParser::parseDILexicalBlockFile(
MDNode *&Result,
bool IsDistinct) {
5987#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5988 REQUIRED(scope, MDField, ( false)); \
5989 OPTIONAL(file, MDField, ); \
5990 REQUIRED(discriminator, MDUnsignedField, (0, UINT32_MAX));
5992#undef VISIT_MD_FIELDS
5995 (Context, scope.Val,
file.Val, discriminator.Val));
6001bool LLParser::parseDICommonBlock(
MDNode *&Result,
bool IsDistinct) {
6002#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6003 REQUIRED(scope, MDField, ); \
6004 OPTIONAL(declaration, MDField, ); \
6005 OPTIONAL(name, MDStringField, ); \
6006 OPTIONAL(file, MDField, ); \
6007 OPTIONAL(line, LineField, );
6009#undef VISIT_MD_FIELDS
6012 (Context, scope.Val, declaration.Val,
name.Val,
6013 file.Val, line.Val));
6019bool LLParser::parseDINamespace(
MDNode *&Result,
bool IsDistinct) {
6020#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6021 REQUIRED(scope, MDField, ); \
6022 OPTIONAL(name, MDStringField, ); \
6023 OPTIONAL(exportSymbols, MDBoolField, );
6025#undef VISIT_MD_FIELDS
6028 (Context, scope.Val,
name.Val, exportSymbols.Val));
6035bool LLParser::parseDIMacro(
MDNode *&Result,
bool IsDistinct) {
6036#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6037 REQUIRED(type, DwarfMacinfoTypeField, ); \
6038 OPTIONAL(line, LineField, ); \
6039 REQUIRED(name, MDStringField, ); \
6040 OPTIONAL(value, MDStringField, );
6042#undef VISIT_MD_FIELDS
6045 (Context, type.Val, line.Val,
name.Val, value.Val));
6051bool LLParser::parseDIMacroFile(
MDNode *&Result,
bool IsDistinct) {
6052#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6053 OPTIONAL(type, DwarfMacinfoTypeField, (dwarf::DW_MACINFO_start_file)); \
6054 OPTIONAL(line, LineField, ); \
6055 REQUIRED(file, MDField, ); \
6056 OPTIONAL(nodes, MDField, );
6058#undef VISIT_MD_FIELDS
6061 (Context, type.Val, line.Val,
file.Val,
nodes.Val));
6069bool LLParser::parseDIModule(
MDNode *&Result,
bool IsDistinct) {
6070#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6071 REQUIRED(scope, MDField, ); \
6072 REQUIRED(name, MDStringField, ); \
6073 OPTIONAL(configMacros, MDStringField, ); \
6074 OPTIONAL(includePath, MDStringField, ); \
6075 OPTIONAL(apinotes, MDStringField, ); \
6076 OPTIONAL(file, MDField, ); \
6077 OPTIONAL(line, LineField, ); \
6078 OPTIONAL(isDecl, MDBoolField, );
6080#undef VISIT_MD_FIELDS
6083 configMacros.Val, includePath.Val,
6084 apinotes.Val, line.Val, isDecl.Val));
6090bool LLParser::parseDITemplateTypeParameter(
MDNode *&Result,
bool IsDistinct) {
6091#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6092 OPTIONAL(name, MDStringField, ); \
6093 REQUIRED(type, MDField, ); \
6094 OPTIONAL(defaulted, MDBoolField, );
6096#undef VISIT_MD_FIELDS
6099 (Context,
name.Val, type.Val, defaulted.Val));
6107bool LLParser::parseDITemplateValueParameter(
MDNode *&Result,
bool IsDistinct) {
6108#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6109 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_template_value_parameter)); \
6110 OPTIONAL(name, MDStringField, ); \
6111 OPTIONAL(type, MDField, ); \
6112 OPTIONAL(defaulted, MDBoolField, ); \
6113 REQUIRED(value, MDField, );
6116#undef VISIT_MD_FIELDS
6119 DITemplateValueParameter,
6120 (Context, tag.Val,
name.Val, type.Val, defaulted.Val, value.Val));
6129bool LLParser::parseDIGlobalVariable(
MDNode *&Result,
bool IsDistinct) {
6130#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6131 OPTIONAL(name, MDStringField, (MDStringField::EmptyIs::Error)); \
6132 OPTIONAL(scope, MDField, ); \
6133 OPTIONAL(linkageName, MDStringField, ); \
6134 OPTIONAL(file, MDField, ); \
6135 OPTIONAL(line, LineField, ); \
6136 OPTIONAL(type, MDField, ); \
6137 OPTIONAL(isLocal, MDBoolField, ); \
6138 OPTIONAL(isDefinition, MDBoolField, (true)); \
6139 OPTIONAL(templateParams, MDField, ); \
6140 OPTIONAL(declaration, MDField, ); \
6141 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6142 OPTIONAL(annotations, MDField, );
6144#undef VISIT_MD_FIELDS
6148 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val,
6149 line.Val, type.Val, isLocal.Val, isDefinition.Val,
6150 declaration.Val, templateParams.Val, align.Val,
6162bool LLParser::parseDILocalVariable(
MDNode *&Result,
bool IsDistinct) {
6163#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6164 REQUIRED(scope, MDField, ( false)); \
6165 OPTIONAL(name, MDStringField, ); \
6166 OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); \
6167 OPTIONAL(file, MDField, ); \
6168 OPTIONAL(line, LineField, ); \
6169 OPTIONAL(type, MDField, ); \
6170 OPTIONAL(flags, DIFlagField, ); \
6171 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6172 OPTIONAL(annotations, MDField, );
6174#undef VISIT_MD_FIELDS
6177 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6178 type.Val, arg.Val, flags.Val, align.Val,
6185bool LLParser::parseDILabel(
MDNode *&Result,
bool IsDistinct) {
6186#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6187 REQUIRED(scope, MDField, ( false)); \
6188 REQUIRED(name, MDStringField, ); \
6189 REQUIRED(file, MDField, ); \
6190 REQUIRED(line, LineField, ); \
6191 OPTIONAL(column, ColumnField, ); \
6192 OPTIONAL(isArtificial, MDBoolField, ); \
6193 OPTIONAL(coroSuspendIdx, MDUnsignedField, );
6195#undef VISIT_MD_FIELDS
6197 std::optional<unsigned> CoroSuspendIdx =
6198 coroSuspendIdx.Seen ? std::optional<unsigned>(coroSuspendIdx.Val)
6202 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6203 column.Val, isArtificial.Val, CoroSuspendIdx));
6209bool LLParser::parseDIExpressionBody(
MDNode *&Result,
bool IsDistinct) {
6222 return tokError(Twine(
"invalid DWARF op '") + Lex.getStrVal() +
"'");
6231 return tokError(Twine(
"invalid DWARF attribute encoding '") +
6232 Lex.getStrVal() +
"'");
6235 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
6236 return tokError(
"expected unsigned integer");
6238 auto &
U = Lex.getAPSIntVal();
6240 return tokError(
"element too large, limit is " + Twine(
UINT64_MAX));
6254bool LLParser::parseDIExpression(
MDNode *&Result,
bool IsDistinct) {
6256 assert(Lex.getStrVal() ==
"DIExpression" &&
"Expected '!DIExpression'");
6259 return parseDIExpressionBody(Result, IsDistinct);
6264bool LLParser::parseDIArgList(
Metadata *&MD, PerFunctionState *PFS) {
6265 assert(PFS &&
"Expected valid function state");
6276 if (parseValueAsMetadata(MD,
"expected value-as-metadata operand", PFS))
6290bool LLParser::parseDIGlobalVariableExpression(
MDNode *&Result,
6292#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6293 REQUIRED(var, MDField, ); \
6294 REQUIRED(expr, MDField, );
6296#undef VISIT_MD_FIELDS
6299 GET_OR_DISTINCT(DIGlobalVariableExpression, (Context, var.Val, expr.Val));
6306bool LLParser::parseDIObjCProperty(
MDNode *&Result,
bool IsDistinct) {
6307#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6308 OPTIONAL(name, MDStringField, ); \
6309 OPTIONAL(file, MDField, ); \
6310 OPTIONAL(line, LineField, ); \
6311 OPTIONAL(setter, MDStringField, ); \
6312 OPTIONAL(getter, MDStringField, ); \
6313 OPTIONAL(attributes, MDUnsignedField, (0, UINT32_MAX)); \
6314 OPTIONAL(type, MDField, );
6316#undef VISIT_MD_FIELDS
6319 (Context,
name.Val,
file.Val, line.Val, setter.Val,
6320 getter.Val, attributes.Val, type.Val));
6327bool LLParser::parseDIImportedEntity(
MDNode *&Result,
bool IsDistinct) {
6328#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6329 REQUIRED(tag, DwarfTagField, ); \
6330 REQUIRED(scope, MDField, ); \
6331 OPTIONAL(entity, MDField, ); \
6332 OPTIONAL(file, MDField, ); \
6333 OPTIONAL(line, LineField, ); \
6334 OPTIONAL(name, MDStringField, ); \
6335 OPTIONAL(elements, MDField, );
6337#undef VISIT_MD_FIELDS
6340 (Context, tag.Val, scope.Val, entity.Val,
file.Val,
6341 line.Val,
name.Val, elements.Val));
6345#undef PARSE_MD_FIELD
6357bool LLParser::parseMetadataAsValue(
Value *&V, PerFunctionState &PFS) {
6360 if (parseMetadata(MD, &PFS))
6371bool LLParser::parseValueAsMetadata(
Metadata *&MD,
const Twine &TypeMsg,
6372 PerFunctionState *PFS) {
6375 if (parseType(Ty, TypeMsg, Loc))
6378 return error(Loc,
"invalid metadata-value-metadata roundtrip");
6381 if (parseValue(Ty, V, PFS))
6396bool LLParser::parseMetadata(
Metadata *&MD, PerFunctionState *PFS) {
6400 if (Lex.getStrVal() ==
"DIArgList") {
6402 if (parseDIArgList(AL, PFS))
6408 if (parseSpecializedMDNode(
N)) {
6418 return parseValueAsMetadata(MD,
"expected metadata operand", PFS);
6428 if (parseMDString(S))
6438 if (parseMDNodeTail(
N))
6449 PerFunctionState *PFS) {
6451 return error(
ID.Loc,
"functions are not values, refer to them as pointers");
6456 return error(
ID.Loc,
"invalid use of function-local name");
6457 V = PFS->getVal(
ID.UIntVal, Ty,
ID.Loc);
6458 return V ==
nullptr;
6461 return error(
ID.Loc,
"invalid use of function-local name");
6462 V = PFS->getVal(
ID.StrVal, Ty,
ID.Loc);
6463 return V ==
nullptr;
6466 return error(
ID.Loc,
"invalid type for inline asm constraint string");
6470 ID.FTy,
ID.StrVal,
ID.StrVal2,
ID.UIntVal & 1, (
ID.UIntVal >> 1) & 1,
6475 V = getGlobalVal(
ID.StrVal, Ty,
ID.Loc);
6478 return V ==
nullptr;
6480 V = getGlobalVal(
ID.UIntVal, Ty,
ID.Loc);
6483 return V ==
nullptr;
6486 return error(
ID.Loc,
"integer constant must have integer type");
6488 V = ConstantInt::get(Context,
ID.APSIntVal);
6493 return error(
ID.Loc,
"floating point constant invalid for type");
6499 bool IsSNAN =
ID.APFloatVal.isSignaling();
6514 APInt Payload =
ID.APFloatVal.bitcastToAPInt();
6516 ID.APFloatVal.isNegative(), &Payload);
6519 V = ConstantFP::get(Context,
ID.APFloatVal);
6521 if (
V->getType() != Ty)
6522 return error(
ID.Loc,
"floating point constant does not have type '" +
6528 return error(
ID.Loc,
"null must be a pointer type");
6534 return error(
ID.Loc,
"invalid type for undef constant");
6539 return error(
ID.Loc,
"invalid empty array initializer");
6545 return error(
ID.Loc,
"invalid type for null constant");
6548 return error(
ID.Loc,
"invalid type for null constant");
6553 return error(
ID.Loc,
"invalid type for none constant");
6559 return error(
ID.Loc,
"invalid type for poison constant");
6563 if (
ID.ConstantVal->getType() != Ty)
6564 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6571 return error(
ID.Loc,
"vector constant must have vector type");
6573 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6575 "' but expected '" +
6583 if (
ST->getNumElements() !=
ID.UIntVal)
6585 "initializer with struct type has wrong # elements");
6587 return error(
ID.Loc,
"packed'ness of initializer and type don't match");
6590 for (
unsigned i = 0, e =
ID.UIntVal; i != e; ++i)
6591 if (
ID.ConstantStructElts[i]->getType() !=
ST->getElementType(i))
6594 "element " + Twine(i) +
6595 " of struct initializer doesn't match struct element type");
6598 ST,
ArrayRef(
ID.ConstantStructElts.get(),
ID.UIntVal));
6600 return error(
ID.Loc,
"constant expression type mismatch");
6609 auto Loc = Lex.getLoc();
6610 if (parseValID(
ID,
nullptr))
6623 if (convertValIDToValue(Ty,
ID, V,
nullptr))
6633 return error(Loc,
"expected a constant value");
6637bool LLParser::parseValue(
Type *Ty,
Value *&V, PerFunctionState *PFS) {
6640 return parseValID(
ID, PFS, Ty) ||
6641 convertValIDToValue(Ty,
ID, V, PFS);
6644bool LLParser::parseTypeAndValue(
Value *&V, PerFunctionState *PFS) {
6646 return parseType(Ty) || parseValue(Ty, V, PFS);
6649bool LLParser::parseTypeAndBasicBlock(
BasicBlock *&BB, LocTy &
Loc,
6650 PerFunctionState &PFS) {
6653 if (parseTypeAndValue(V, PFS))
6656 return error(Loc,
"expected a basic block");
6665 if (!Name.starts_with(
"llvm.dbg."))
6668 return FnID == Intrinsic::dbg_declare || FnID == Intrinsic::dbg_value ||
6669 FnID == Intrinsic::dbg_assign;
6677bool LLParser::parseFunctionHeader(
Function *&Fn,
bool IsDefine,
6678 unsigned &FunctionNumber,
6681 LocTy LinkageLoc = Lex.getLoc();
6683 unsigned Visibility;
6684 unsigned DLLStorageClass;
6686 AttrBuilder RetAttrs(M->getContext());
6689 Type *RetType =
nullptr;
6690 LocTy RetTypeLoc = Lex.getLoc();
6691 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
6693 parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
6694 parseType(RetType, RetTypeLoc,
true ))
6703 return error(LinkageLoc,
"invalid linkage for function definition");
6713 return error(LinkageLoc,
"invalid linkage for function declaration");
6717 return error(LinkageLoc,
"invalid function linkage type");
6721 return error(LinkageLoc,
6722 "symbol with local linkage must have default visibility");
6725 return error(LinkageLoc,
6726 "symbol with local linkage cannot have a DLL storage class");
6729 return error(RetTypeLoc,
"invalid function return type");
6731 LocTy NameLoc = Lex.getLoc();
6733 std::string FunctionName;
6735 FunctionName = Lex.getStrVal();
6737 FunctionNumber = Lex.getUIntVal();
6738 if (checkValueID(NameLoc,
"function",
"@", NumberedVals.getNext(),
6742 return tokError(
"expected function name");
6748 return tokError(
"expected '(' in function argument list");
6752 AttrBuilder FuncAttrs(M->getContext());
6753 std::vector<unsigned> FwdRefAttrGrps;
6756 std::string Partition;
6757 MaybeAlign Alignment;
6760 unsigned AddrSpace = 0;
6766 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg) ||
6767 parseOptionalUnnamedAddr(UnnamedAddr) ||
6768 parseOptionalProgramAddrSpace(AddrSpace) ||
6769 parseFnAttributeValuePairs(FuncAttrs, FwdRefAttrGrps,
false,
6773 parseOptionalComdat(FunctionName,
C) ||
6774 parseOptionalAlignment(Alignment) ||
6775 (EatIfPresent(
lltok::kw_gc) && parseStringConstant(GC)) ||
6779 parseGlobalTypeAndValue(PersonalityFn)))
6782 if (FuncAttrs.contains(Attribute::Builtin))
6783 return error(BuiltinLoc,
"'builtin' attribute not valid on function");
6786 if (MaybeAlign
A = FuncAttrs.getAlignment()) {
6788 FuncAttrs.removeAttribute(Attribute::Alignment);
6793 std::vector<Type*> ParamTypeList;
6796 for (
const ArgInfo &Arg : ArgList) {
6797 ParamTypeList.push_back(Arg.Ty);
6798 Attrs.push_back(Arg.Attrs);
6805 if (PAL.hasParamAttr(0, Attribute::StructRet) && !RetType->
isVoidTy())
6806 return error(RetTypeLoc,
"functions with 'sret' argument must return void");
6812 GlobalValue *FwdFn =
nullptr;
6813 if (!FunctionName.empty()) {
6816 auto FRVI = ForwardRefVals.find(FunctionName);
6817 if (FRVI != ForwardRefVals.end()) {
6818 FwdFn = FRVI->second.first;
6820 return error(FRVI->second.second,
6821 "invalid forward reference to "
6824 "' with wrong type: "
6828 ForwardRefVals.erase(FRVI);
6829 }
else if ((Fn = M->getFunction(FunctionName))) {
6831 return error(NameLoc,
6832 "invalid redefinition of function '" + FunctionName +
"'");
6833 }
else if (M->getNamedValue(FunctionName)) {
6834 return error(NameLoc,
"redefinition of function '@" + FunctionName +
"'");
6840 if (FunctionNumber == (
unsigned)-1)
6841 FunctionNumber = NumberedVals.getNext();
6845 auto I = ForwardRefValIDs.find(FunctionNumber);
6846 if (
I != ForwardRefValIDs.end()) {
6847 FwdFn =
I->second.first;
6849 return error(NameLoc,
"type of definition and forward reference of '@" +
6850 Twine(FunctionNumber) +
6855 ForwardRefValIDs.erase(
I);
6864 if (FunctionName.empty())
6865 NumberedVals.add(FunctionNumber, Fn);
6880 if (!
GC.empty()) Fn->
setGC(GC);
6883 ForwardRefAttrGroups[Fn] = FwdRefAttrGrps;
6887 for (
unsigned i = 0, e = ArgList.size(); i != e; ++i, ++ArgIt) {
6889 if (ArgList[i].
Name.empty())
continue;
6892 ArgIt->
setName(ArgList[i].Name);
6894 if (ArgIt->
getName() != ArgList[i].Name)
6895 return error(ArgList[i].Loc,
6896 "redefinition of argument '%" + ArgList[i].Name +
"'");
6909 if (FunctionName.empty()) {
6911 ID.UIntVal = FunctionNumber;
6914 ID.StrVal = FunctionName;
6916 auto Blocks = ForwardRefBlockAddresses.find(
ID);
6917 if (Blocks != ForwardRefBlockAddresses.end())
6918 return error(Blocks->first.Loc,
6919 "cannot take blockaddress inside a declaration");
6923bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
6925 if (FunctionNumber == -1) {
6927 ID.StrVal = std::string(F.getName());
6930 ID.UIntVal = FunctionNumber;
6933 auto Blocks = P.ForwardRefBlockAddresses.find(
ID);
6934 if (Blocks == P.ForwardRefBlockAddresses.end())
6937 for (
const auto &
I : Blocks->second) {
6938 const ValID &BBID =
I.first;
6939 GlobalValue *GV =
I.second;
6942 "Expected local id or name");
6949 return P.error(BBID.
Loc,
"referenced value is not a basic block");
6952 ResolvedVal = P.checkValidVariableType(BBID.
Loc, BBID.
StrVal, GV->
getType(),
6960 P.ForwardRefBlockAddresses.erase(Blocks);
6966bool LLParser::parseFunctionBody(Function &Fn,
unsigned FunctionNumber,
6967 ArrayRef<unsigned> UnnamedArgNums) {
6969 return tokError(
"expected '{' in function body");
6972 PerFunctionState PFS(*
this, Fn, FunctionNumber, UnnamedArgNums);
6976 if (PFS.resolveForwardRefBlockAddresses())
6982 return tokError(
"function body requires at least one basic block");
6986 if (parseBasicBlock(PFS))
6990 if (parseUseListOrder(&PFS))
6997 return PFS.finishFunction();
7002bool LLParser::parseBasicBlock(PerFunctionState &PFS) {
7006 LocTy NameLoc = Lex.getLoc();
7008 Name = Lex.getStrVal();
7011 NameID = Lex.getUIntVal();
7015 BasicBlock *BB = PFS.defineBB(Name, NameID, NameLoc);
7019 std::string NameStr;
7024 auto DeleteDbgRecord = [](DbgRecord *DR) { DR->deleteRecord(); };
7025 using DbgRecordPtr = std::unique_ptr<DbgRecord,
decltype(DeleteDbgRecord)>;
7032 if (SeenOldDbgInfoFormat)
7033 return error(Lex.getLoc(),
"debug record should not appear in a module "
7034 "containing debug info intrinsics");
7035 SeenNewDbgInfoFormat =
true;
7039 if (parseDebugRecord(DR, PFS))
7041 TrailingDbgRecord.emplace_back(DR, DeleteDbgRecord);
7046 LocTy NameLoc = Lex.getLoc();
7051 NameID = Lex.getUIntVal();
7053 if (parseToken(
lltok::equal,
"expected '=' after instruction id"))
7056 NameStr = Lex.getStrVal();
7058 if (parseToken(
lltok::equal,
"expected '=' after instruction name"))
7062 switch (parseInstruction(Inst, BB, PFS)) {
7065 case InstError:
return true;
7072 if (parseInstructionMetadata(*Inst))
7075 case InstExtraComma:
7080 if (parseInstructionMetadata(*Inst))
7086 if (PFS.setInstName(NameID, NameStr, NameLoc, Inst))
7090 for (DbgRecordPtr &DR : TrailingDbgRecord)
7092 TrailingDbgRecord.clear();
7095 assert(TrailingDbgRecord.empty() &&
7096 "All debug values should have been attached to an instruction.");
7105bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
7108 LocTy DVRLoc = Lex.getLoc();
7110 return error(DVRLoc,
"expected debug record type here");
7111 RecordKind
RecordType = StringSwitch<RecordKind>(Lex.getStrVal())
7112 .Case(
"declare", RecordKind::ValueKind)
7113 .Case(
"value", RecordKind::ValueKind)
7114 .Case(
"assign", RecordKind::ValueKind)
7115 .Case(
"label", RecordKind::LabelKind);
7124 if (parseMDNode(Label))
7129 if (parseMDNode(DbgLoc))
7137 LocType
ValueType = StringSwitch<LocType>(Lex.getStrVal())
7138 .Case(
"declare", LocType::Declare)
7139 .Case(
"value", LocType::Value)
7140 .Case(
"assign", LocType::Assign);
7148 if (parseMetadata(ValLocMD, &PFS))
7155 if (parseMDNode(Variable))
7162 if (parseMDNode(Expression))
7168 MDNode *AssignID =
nullptr;
7169 Metadata *AddressLocation =
nullptr;
7170 MDNode *AddressExpression =
nullptr;
7173 if (parseMDNode(AssignID))
7179 if (parseMetadata(AddressLocation, &PFS))
7185 if (parseMDNode(AddressExpression))
7199 ValueType, ValLocMD, Variable, Expression, AssignID, AddressLocation,
7209int LLParser::parseInstruction(Instruction *&Inst, BasicBlock *BB,
7210 PerFunctionState &PFS) {
7213 return tokError(
"found end of file when expecting more instructions");
7214 LocTy Loc = Lex.getLoc();
7215 unsigned KeywordVal = Lex.getUIntVal();
7220 return error(Loc,
"expected instruction opcode");
7224 return parseRet(Inst, BB, PFS);
7226 return parseBr(Inst, PFS);
7228 return parseSwitch(Inst, PFS);
7230 return parseIndirectBr(Inst, PFS);
7232 return parseInvoke(Inst, PFS);
7234 return parseResume(Inst, PFS);
7236 return parseCleanupRet(Inst, PFS);
7238 return parseCatchRet(Inst, PFS);
7240 return parseCatchSwitch(Inst, PFS);
7242 return parseCatchPad(Inst, PFS);
7244 return parseCleanupPad(Inst, PFS);
7246 return parseCallBr(Inst, PFS);
7249 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7250 int Res = parseUnaryOp(Inst, PFS, KeywordVal,
true);
7266 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7278 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7279 int Res = parseArithmetic(Inst, PFS, KeywordVal,
true);
7293 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7301 return parseArithmetic(Inst, PFS, KeywordVal,
7305 if (parseLogical(Inst, PFS, KeywordVal))
7313 return parseLogical(Inst, PFS, KeywordVal);
7316 if (parseCompare(Inst, PFS, KeywordVal))
7323 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7324 int Res = parseCompare(Inst, PFS, KeywordVal);
7336 bool Res = parseCast(Inst, PFS, KeywordVal);
7348 if (parseCast(Inst, PFS, KeywordVal))
7365 return parseCast(Inst, PFS, KeywordVal);
7368 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7369 if (parseCast(Inst, PFS, KeywordVal))
7378 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7379 int Res = parseSelect(Inst, PFS);
7384 return error(Loc,
"fast-math-flags specified for select without "
7385 "floating-point scalar or vector return type");
7391 return parseVAArg(Inst, PFS);
7393 return parseExtractElement(Inst, PFS);
7395 return parseInsertElement(Inst, PFS);
7397 return parseShuffleVector(Inst, PFS);
7399 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7400 int Res = parsePHI(Inst, PFS);
7405 return error(Loc,
"fast-math-flags specified for phi without "
7406 "floating-point scalar or vector return type");
7412 return parseLandingPad(Inst, PFS);
7414 return parseFreeze(Inst, PFS);
7426 return parseAlloc(Inst, PFS);
7428 return parseLoad(Inst, PFS);
7430 return parseStore(Inst, PFS);
7432 return parseCmpXchg(Inst, PFS);
7434 return parseAtomicRMW(Inst, PFS);
7436 return parseFence(Inst, PFS);
7438 return parseGetElementPtr(Inst, PFS);
7440 return parseExtractValue(Inst, PFS);
7442 return parseInsertValue(Inst, PFS);
7447bool LLParser::parseCmpPredicate(
unsigned &
P,
unsigned Opc) {
7448 if (
Opc == Instruction::FCmp) {
7449 switch (Lex.getKind()) {
7451 return tokError(
"expected fcmp predicate (e.g. 'oeq')");
7470 switch (Lex.getKind()) {
7472 return tokError(
"expected icmp predicate (e.g. 'eq')");
7496bool LLParser::parseRet(Instruction *&Inst, BasicBlock *BB,
7497 PerFunctionState &PFS) {
7498 SMLoc TypeLoc = Lex.getLoc();
7500 if (parseType(Ty,
true ))
7503 Type *ResType = PFS.getFunction().getReturnType();
7507 return error(TypeLoc,
"value doesn't match function result type '" +
7515 if (parseValue(Ty, RV, PFS))
7519 return error(TypeLoc,
"value doesn't match function result type '" +
7529bool LLParser::parseBr(Instruction *&Inst, PerFunctionState &PFS) {
7533 if (parseTypeAndValue(Op0, Loc, PFS))
7542 return error(Loc,
"branch condition must have 'i1' type");
7544 if (parseToken(
lltok::comma,
"expected ',' after branch condition") ||
7545 parseTypeAndBasicBlock(Op1, Loc, PFS) ||
7546 parseToken(
lltok::comma,
"expected ',' after true destination") ||
7547 parseTypeAndBasicBlock(Op2, Loc2, PFS))
7559bool LLParser::parseSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7560 LocTy CondLoc, BBLoc;
7563 if (parseTypeAndValue(
Cond, CondLoc, PFS) ||
7564 parseToken(
lltok::comma,
"expected ',' after switch condition") ||
7565 parseTypeAndBasicBlock(DefaultBB, BBLoc, PFS) ||
7569 if (!
Cond->getType()->isIntegerTy())
7570 return error(CondLoc,
"switch condition must have integer type");
7573 SmallPtrSet<Value*, 32> SeenCases;
7579 if (parseTypeAndValue(Constant, CondLoc, PFS) ||
7580 parseToken(
lltok::comma,
"expected ',' after case value") ||
7581 parseTypeAndBasicBlock(DestBB, PFS))
7584 if (!SeenCases.
insert(Constant).second)
7585 return error(CondLoc,
"duplicate case value in switch");
7587 return error(CondLoc,
"case value is not a constant integer");
7595 for (
const auto &[OnVal, Dest] : Table)
7596 SI->addCase(OnVal, Dest);
7604bool LLParser::parseIndirectBr(Instruction *&Inst, PerFunctionState &PFS) {
7607 if (parseTypeAndValue(
Address, AddrLoc, PFS) ||
7608 parseToken(
lltok::comma,
"expected ',' after indirectbr address") ||
7612 if (!
Address->getType()->isPointerTy())
7613 return error(AddrLoc,
"indirectbr address must have pointer type");
7616 SmallVector<BasicBlock*, 16> DestList;
7620 if (parseTypeAndBasicBlock(DestBB, PFS))
7625 if (parseTypeAndBasicBlock(DestBB, PFS))
7631 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
7635 for (BasicBlock *Dest : DestList)
7645 FunctionType *&FuncTy) {
7651 for (
const ParamInfo &Arg : ArgList)
7665bool LLParser::parseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
7666 LocTy CallLoc = Lex.getLoc();
7667 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
7668 std::vector<unsigned> FwdRefAttrGrps;
7671 unsigned InvokeAddrSpace;
7672 Type *RetType =
nullptr;
7679 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7680 parseOptionalProgramAddrSpace(InvokeAddrSpace) ||
7681 parseType(RetType, RetTypeLoc,
true ) ||
7682 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
7683 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
7685 parseOptionalOperandBundles(BundleList, PFS) ||
7687 parseTypeAndBasicBlock(NormalBB, PFS) ||
7689 parseTypeAndBasicBlock(UnwindBB, PFS))
7696 if (resolveFunctionType(RetType, ArgList, Ty))
7697 return error(RetTypeLoc,
"Invalid result type for LLVM function");
7703 if (convertValIDToValue(
PointerType::get(Context, InvokeAddrSpace), CalleeID,
7708 SmallVector<Value *, 8>
Args;
7715 for (
const ParamInfo &Arg : ArgList) {
7716 Type *ExpectedTy =
nullptr;
7719 }
else if (!Ty->isVarArg()) {
7720 return error(Arg.Loc,
"too many arguments specified");
7723 if (ExpectedTy && ExpectedTy != Arg.V->getType())
7724 return error(Arg.Loc,
"argument is not of expected type '" +
7726 Args.push_back(Arg.V);
7731 return error(CallLoc,
"not enough parameters specified for call");
7740 II->setCallingConv(CC);
7741 II->setAttributes(PAL);
7742 ForwardRefAttrGroups[
II] = FwdRefAttrGrps;
7749bool LLParser::parseResume(Instruction *&Inst, PerFunctionState &PFS) {
7751 if (parseTypeAndValue(Exn, ExnLoc, PFS))
7759bool LLParser::parseExceptionArgs(SmallVectorImpl<Value *> &Args,
7760 PerFunctionState &PFS) {
7761 if (parseToken(
lltok::lsquare,
"expected '[' in catchpad/cleanuppad"))
7766 if (!
Args.empty() &&
7767 parseToken(
lltok::comma,
"expected ',' in argument list"))
7772 Type *ArgTy =
nullptr;
7773 if (parseType(ArgTy, ArgLoc))
7778 if (parseMetadataAsValue(V, PFS))
7781 if (parseValue(ArgTy, V, PFS))
7793bool LLParser::parseCleanupRet(Instruction *&Inst, PerFunctionState &PFS) {
7794 Value *CleanupPad =
nullptr;
7796 if (parseToken(
lltok::kw_from,
"expected 'from' after cleanupret"))
7811 if (parseTypeAndBasicBlock(UnwindBB, PFS)) {
7822bool LLParser::parseCatchRet(Instruction *&Inst, PerFunctionState &PFS) {
7823 Value *CatchPad =
nullptr;
7825 if (parseToken(
lltok::kw_from,
"expected 'from' after catchret"))
7832 if (parseToken(
lltok::kw_to,
"expected 'to' in catchret") ||
7833 parseTypeAndBasicBlock(BB, PFS))
7842bool LLParser::parseCatchSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7850 return tokError(
"expected scope value for catchswitch");
7855 if (parseToken(
lltok::lsquare,
"expected '[' with catchswitch labels"))
7861 if (parseTypeAndBasicBlock(DestBB, PFS))
7866 if (parseToken(
lltok::rsquare,
"expected ']' after catchswitch labels"))
7869 if (parseToken(
lltok::kw_unwind,
"expected 'unwind' after catchswitch scope"))
7877 if (parseTypeAndBasicBlock(UnwindBB, PFS))
7883 for (BasicBlock *DestBB : Table)
7884 CatchSwitch->addHandler(DestBB);
7891bool LLParser::parseCatchPad(Instruction *&Inst, PerFunctionState &PFS) {
7892 Value *CatchSwitch =
nullptr;
7898 return tokError(
"expected scope value for catchpad");
7903 SmallVector<Value *, 8>
Args;
7904 if (parseExceptionArgs(Args, PFS))
7913bool LLParser::parseCleanupPad(Instruction *&Inst, PerFunctionState &PFS) {
7914 Value *ParentPad =
nullptr;
7921 return tokError(
"expected scope value for cleanuppad");
7926 SmallVector<Value *, 8>
Args;
7927 if (parseExceptionArgs(Args, PFS))
7943bool LLParser::parseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
7944 unsigned Opc,
bool IsFP) {
7946 if (parseTypeAndValue(
LHS, Loc, PFS))
7953 return error(Loc,
"invalid operand type for instruction");
7963bool LLParser::parseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
7964 LocTy CallLoc = Lex.getLoc();
7965 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
7966 std::vector<unsigned> FwdRefAttrGrps;
7969 Type *RetType =
nullptr;
7976 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7977 parseType(RetType, RetTypeLoc,
true ) ||
7978 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
7979 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
7981 parseOptionalOperandBundles(BundleList, PFS) ||
7983 parseTypeAndBasicBlock(DefaultDest, PFS) ||
7988 SmallVector<BasicBlock *, 16> IndirectDests;
7992 if (parseTypeAndBasicBlock(DestBB, PFS))
7997 if (parseTypeAndBasicBlock(DestBB, PFS))
8003 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
8010 if (resolveFunctionType(RetType, ArgList, Ty))
8011 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8022 SmallVector<Value *, 8>
Args;
8029 for (
const ParamInfo &Arg : ArgList) {
8030 Type *ExpectedTy =
nullptr;
8033 }
else if (!Ty->isVarArg()) {
8034 return error(Arg.Loc,
"too many arguments specified");
8037 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8038 return error(Arg.Loc,
"argument is not of expected type '" +
8040 Args.push_back(Arg.V);
8045 return error(CallLoc,
"not enough parameters specified for call");
8057 ForwardRefAttrGroups[CBI] = FwdRefAttrGrps;
8071bool LLParser::parseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
8072 unsigned Opc,
bool IsFP) {
8074 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8075 parseToken(
lltok::comma,
"expected ',' in arithmetic operation") ||
8083 return error(Loc,
"invalid operand type for instruction");
8091bool LLParser::parseLogical(Instruction *&Inst, PerFunctionState &PFS,
8094 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8095 parseToken(
lltok::comma,
"expected ',' in logical operation") ||
8101 "instruction requires integer or integer vector operands");
8110bool LLParser::parseCompare(Instruction *&Inst, PerFunctionState &PFS,
8116 if (parseCmpPredicate(Pred,
Opc) || parseTypeAndValue(
LHS, Loc, PFS) ||
8117 parseToken(
lltok::comma,
"expected ',' after compare value") ||
8121 if (
Opc == Instruction::FCmp) {
8123 return error(Loc,
"fcmp requires floating point operands");
8126 assert(
Opc == Instruction::ICmp &&
"Unknown opcode for CmpInst!");
8129 return error(Loc,
"icmp requires integer operands");
8141bool LLParser::parseCast(Instruction *&Inst, PerFunctionState &PFS,
8145 Type *DestTy =
nullptr;
8146 if (parseTypeAndValue(
Op, Loc, PFS) ||
8147 parseToken(
lltok::kw_to,
"expected 'to' after cast value") ||
8152 return error(Loc,
"invalid cast opcode for cast from '" +
8161bool LLParser::parseSelect(Instruction *&Inst, PerFunctionState &PFS) {
8163 Value *Op0, *Op1, *Op2;
8164 if (parseTypeAndValue(Op0, Loc, PFS) ||
8165 parseToken(
lltok::comma,
"expected ',' after select condition") ||
8166 parseTypeAndValue(Op1, PFS) ||
8167 parseToken(
lltok::comma,
"expected ',' after select value") ||
8168 parseTypeAndValue(Op2, PFS))
8172 return error(Loc, Reason);
8180bool LLParser::parseVAArg(Instruction *&Inst, PerFunctionState &PFS) {
8182 Type *EltTy =
nullptr;
8184 if (parseTypeAndValue(
Op, PFS) ||
8185 parseToken(
lltok::comma,
"expected ',' after vaarg operand") ||
8186 parseType(EltTy, TypeLoc))
8190 return error(TypeLoc,
"va_arg requires operand with first class type");
8192 Inst =
new VAArgInst(
Op, EltTy);
8198bool LLParser::parseExtractElement(Instruction *&Inst, PerFunctionState &PFS) {
8201 if (parseTypeAndValue(Op0, Loc, PFS) ||
8202 parseToken(
lltok::comma,
"expected ',' after extract value") ||
8203 parseTypeAndValue(Op1, PFS))
8207 return error(Loc,
"invalid extractelement operands");
8215bool LLParser::parseInsertElement(Instruction *&Inst, PerFunctionState &PFS) {
8217 Value *Op0, *Op1, *Op2;
8218 if (parseTypeAndValue(Op0, Loc, PFS) ||
8219 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8220 parseTypeAndValue(Op1, PFS) ||
8221 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8222 parseTypeAndValue(Op2, PFS))
8226 return error(Loc,
"invalid insertelement operands");
8234bool LLParser::parseShuffleVector(Instruction *&Inst, PerFunctionState &PFS) {
8236 Value *Op0, *Op1, *Op2;
8237 if (parseTypeAndValue(Op0, Loc, PFS) ||
8238 parseToken(
lltok::comma,
"expected ',' after shuffle mask") ||
8239 parseTypeAndValue(Op1, PFS) ||
8240 parseToken(
lltok::comma,
"expected ',' after shuffle value") ||
8241 parseTypeAndValue(Op2, PFS))
8245 return error(Loc,
"invalid shufflevector operands");
8247 Inst =
new ShuffleVectorInst(Op0, Op1, Op2);
8253int LLParser::parsePHI(Instruction *&Inst, PerFunctionState &PFS) {
8257 if (parseType(Ty, TypeLoc))
8261 return error(TypeLoc,
"phi node must have first class type");
8264 bool AteExtraComma =
false;
8276 AteExtraComma =
true;
8280 if (parseToken(
lltok::lsquare,
"expected '[' in phi value list") ||
8281 parseValue(Ty, Op0, PFS) ||
8282 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8291 for (
const auto &[Val, BB] : PHIVals)
8294 return AteExtraComma ? InstExtraComma : InstNormal;
8303bool LLParser::parseLandingPad(Instruction *&Inst, PerFunctionState &PFS) {
8306 if (parseType(Ty, TyLoc))
8319 return tokError(
"expected 'catch' or 'filter' clause type");
8323 if (parseTypeAndValue(V, VLoc, PFS))
8330 return error(VLoc,
"'catch' clause has an invalid type");
8333 return error(VLoc,
"'filter' clause has an invalid type");
8338 return error(VLoc,
"clause argument must be a constant");
8342 Inst = LP.release();
8348bool LLParser::parseFreeze(Instruction *&Inst, PerFunctionState &PFS) {
8351 if (parseTypeAndValue(
Op, Loc, PFS))
8354 Inst =
new FreezeInst(
Op);
8367bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS,
8369 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8370 std::vector<unsigned> FwdRefAttrGrps;
8372 unsigned CallAddrSpace;
8374 Type *RetType =
nullptr;
8379 LocTy CallLoc = Lex.getLoc();
8383 "expected 'tail call', 'musttail call', or 'notail call'"))
8386 FastMathFlags FMF = EatFastMathFlagsIfPresent();
8388 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8389 parseOptionalProgramAddrSpace(CallAddrSpace) ||
8390 parseType(RetType, RetTypeLoc,
true ) ||
8391 parseValID(CalleeID, &PFS) ||
8393 PFS.getFunction().isVarArg()) ||
8394 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false, BuiltinLoc) ||
8395 parseOptionalOperandBundles(BundleList, PFS))
8402 if (resolveFunctionType(RetType, ArgList, Ty))
8403 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8409 if (convertValIDToValue(
PointerType::get(Context, CallAddrSpace), CalleeID,
8416 SmallVector<Value*, 8>
Args;
8422 for (
const ParamInfo &Arg : ArgList) {
8423 Type *ExpectedTy =
nullptr;
8426 }
else if (!Ty->isVarArg()) {
8427 return error(Arg.Loc,
"too many arguments specified");
8430 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8431 return error(Arg.Loc,
"argument is not of expected type '" +
8433 Args.push_back(Arg.V);
8434 Attrs.push_back(Arg.Attrs);
8438 return error(CallLoc,
"not enough parameters specified for call");
8451 return error(CallLoc,
"fast-math-flags specified for call without "
8452 "floating-point scalar or vector return type");
8459 if (SeenNewDbgInfoFormat) {
8461 return error(CallLoc,
"llvm.dbg intrinsic should not appear in a module "
8462 "using non-intrinsic debug info");
8464 SeenOldDbgInfoFormat =
true;
8467 ForwardRefAttrGroups[CI] = FwdRefAttrGrps;
8479int LLParser::parseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
8481 LocTy SizeLoc, TyLoc, ASLoc;
8482 MaybeAlign Alignment;
8483 unsigned AddrSpace = 0;
8486 bool IsInAlloca = EatIfPresent(lltok::kw_inalloca);
8487 bool IsSwiftError = EatIfPresent(lltok::kw_swifterror);
8489 if (parseType(Ty, TyLoc))
8493 return error(TyLoc,
"invalid type for alloca");
8495 bool AteExtraComma =
false;
8497 if (Lex.getKind() == lltok::kw_align) {
8498 if (parseOptionalAlignment(Alignment))
8500 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8503 ASLoc = Lex.getLoc();
8504 if (parseOptionalAddrSpace(AddrSpace))
8507 AteExtraComma =
true;
8509 if (parseTypeAndValue(
Size, SizeLoc, PFS))
8512 if (Lex.getKind() == lltok::kw_align) {
8513 if (parseOptionalAlignment(Alignment))
8515 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8518 ASLoc = Lex.getLoc();
8519 if (parseOptionalAddrSpace(AddrSpace))
8522 AteExtraComma =
true;
8528 if (
Size && !
Size->getType()->isIntegerTy())
8529 return error(SizeLoc,
"element count must have integer type");
8531 SmallPtrSet<Type *, 4> Visited;
8532 if (!Alignment && !Ty->
isSized(&Visited))
8533 return error(TyLoc,
"Cannot allocate unsized type");
8535 Alignment = M->getDataLayout().getPrefTypeAlign(Ty);
8536 AllocaInst *AI =
new AllocaInst(Ty, AddrSpace,
Size, *Alignment);
8540 return AteExtraComma ? InstExtraComma : InstNormal;
8547int LLParser::parseLoad(Instruction *&Inst, PerFunctionState &PFS) {
8549 MaybeAlign Alignment;
8550 bool AteExtraComma =
false;
8551 bool isAtomic =
false;
8560 bool isVolatile =
false;
8567 LocTy ExplicitTypeLoc = Lex.getLoc();
8568 if (parseType(Ty) ||
8569 parseToken(
lltok::comma,
"expected comma after load's type") ||
8570 parseTypeAndValue(Val, Loc, PFS) ||
8571 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8572 parseOptionalCommaAlign(Alignment, AteExtraComma))
8576 return error(Loc,
"load operand must be a pointer to a first class type");
8577 if (isAtomic && !Alignment)
8578 return error(Loc,
"atomic load must have explicit non-zero alignment");
8581 return error(Loc,
"atomic load cannot use Release ordering");
8583 SmallPtrSet<Type *, 4> Visited;
8584 if (!Alignment && !Ty->
isSized(&Visited))
8585 return error(ExplicitTypeLoc,
"loading unsized types is not allowed");
8587 Alignment = M->getDataLayout().getABITypeAlign(Ty);
8588 Inst =
new LoadInst(Ty, Val,
"", isVolatile, *Alignment, Ordering, SSID);
8589 return AteExtraComma ? InstExtraComma : InstNormal;
8597int LLParser::parseStore(Instruction *&Inst, PerFunctionState &PFS) {
8599 MaybeAlign Alignment;
8600 bool AteExtraComma =
false;
8601 bool isAtomic =
false;
8610 bool isVolatile =
false;
8616 if (parseTypeAndValue(Val, Loc, PFS) ||
8617 parseToken(
lltok::comma,
"expected ',' after store operand") ||
8618 parseTypeAndValue(
Ptr, PtrLoc, PFS) ||
8619 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8620 parseOptionalCommaAlign(Alignment, AteExtraComma))
8623 if (!
Ptr->getType()->isPointerTy())
8624 return error(PtrLoc,
"store operand must be a pointer");
8626 return error(Loc,
"store operand must be a first class value");
8627 if (isAtomic && !Alignment)
8628 return error(Loc,
"atomic store must have explicit non-zero alignment");
8631 return error(Loc,
"atomic store cannot use Acquire ordering");
8632 SmallPtrSet<Type *, 4> Visited;
8634 return error(Loc,
"storing unsized types is not allowed");
8636 Alignment = M->getDataLayout().getABITypeAlign(Val->
getType());
8638 Inst =
new StoreInst(Val,
Ptr, isVolatile, *Alignment, Ordering, SSID);
8639 return AteExtraComma ? InstExtraComma : InstNormal;
8646int LLParser::parseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {
8648 bool AteExtraComma =
false;
8652 bool isVolatile =
false;
8653 bool isWeak =
false;
8654 MaybeAlign Alignment;
8662 if (parseTypeAndValue(
Ptr, PtrLoc, PFS) ||
8663 parseToken(
lltok::comma,
"expected ',' after cmpxchg address") ||
8664 parseTypeAndValue(Cmp, CmpLoc, PFS) ||
8665 parseToken(
lltok::comma,
"expected ',' after cmpxchg cmp operand") ||
8666 parseTypeAndValue(New, NewLoc, PFS) ||
8667 parseScopeAndOrdering(
true , SSID, SuccessOrdering) ||
8668 parseOrdering(FailureOrdering) ||
8669 parseOptionalCommaAlign(Alignment, AteExtraComma))
8673 return tokError(
"invalid cmpxchg success ordering");
8675 return tokError(
"invalid cmpxchg failure ordering");
8676 if (!
Ptr->getType()->isPointerTy())
8677 return error(PtrLoc,
"cmpxchg operand must be a pointer");
8678 if (
Cmp->getType() !=
New->getType())
8679 return error(NewLoc,
"compare value and new value type do not match");
8680 if (!
New->getType()->isFirstClassType())
8681 return error(NewLoc,
"cmpxchg operand must be a first class value");
8683 const Align DefaultAlignment(
8684 PFS.getFunction().getDataLayout().getTypeStoreSize(
8687 AtomicCmpXchgInst *CXI =
8688 new AtomicCmpXchgInst(
Ptr, Cmp, New, Alignment.value_or(DefaultAlignment),
8689 SuccessOrdering, FailureOrdering, SSID);
8694 return AteExtraComma ? InstExtraComma : InstNormal;
8700int LLParser::parseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {
8702 bool AteExtraComma =
false;
8705 bool isVolatile =
false;
8708 MaybeAlign Alignment;
8713 switch (Lex.getKind()) {
8715 return tokError(
"expected binary operation in atomicrmw");
8766 if (parseTypeAndValue(
Ptr, PtrLoc, PFS) ||
8767 parseToken(
lltok::comma,
"expected ',' after atomicrmw address") ||
8768 parseTypeAndValue(Val, ValLoc, PFS) ||
8769 parseScopeAndOrdering(
true , SSID, Ordering) ||
8770 parseOptionalCommaAlign(Alignment, AteExtraComma))
8774 return tokError(
"atomicrmw cannot be unordered");
8775 if (!
Ptr->getType()->isPointerTy())
8776 return error(PtrLoc,
"atomicrmw operand must be a pointer");
8778 return error(ValLoc,
"atomicrmw operand may not be scalable");
8787 " operand must be an integer, floating point, or pointer type");
8791 return error(ValLoc,
"atomicrmw " +
8793 " operand must be a floating point type");
8797 return error(ValLoc,
"atomicrmw " +
8799 " operand must be an integer");
8804 PFS.getFunction().getDataLayout().getTypeStoreSizeInBits(
8807 return error(ValLoc,
"atomicrmw operand must be power-of-two byte-sized"
8809 const Align DefaultAlignment(
8810 PFS.getFunction().getDataLayout().getTypeStoreSize(
8812 AtomicRMWInst *RMWI =
8814 Alignment.value_or(DefaultAlignment), Ordering, SSID);
8817 return AteExtraComma ? InstExtraComma : InstNormal;
8822int LLParser::parseFence(Instruction *&Inst, PerFunctionState &PFS) {
8825 if (parseScopeAndOrdering(
true , SSID, Ordering))
8829 return tokError(
"fence cannot be unordered");
8831 return tokError(
"fence cannot be monotonic");
8833 Inst =
new FenceInst(Context, Ordering, SSID);
8839int LLParser::parseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
8841 Value *Val =
nullptr;
8857 if (parseType(Ty) ||
8858 parseToken(
lltok::comma,
"expected comma after getelementptr's type") ||
8859 parseTypeAndValue(
Ptr, Loc, PFS))
8864 if (!BasePointerType)
8865 return error(Loc,
"base of getelementptr must be a pointer");
8867 SmallVector<Value*, 16> Indices;
8868 bool AteExtraComma =
false;
8871 ElementCount GEPWidth =
BaseType->isVectorTy()
8877 AteExtraComma =
true;
8880 if (parseTypeAndValue(Val, EltLoc, PFS))
8883 return error(EltLoc,
"getelementptr index must be an integer");
8886 ElementCount ValNumEl = ValVTy->getElementCount();
8890 "getelementptr vector index has a wrong number of elements");
8891 GEPWidth = ValNumEl;
8896 SmallPtrSet<Type*, 4> Visited;
8898 return error(Loc,
"base element of getelementptr must be sized");
8902 return error(Loc,
"getelementptr cannot target structure that contains "
8903 "scalable vector type");
8906 return error(Loc,
"invalid getelementptr indices");
8909 GEP->setNoWrapFlags(NW);
8910 return AteExtraComma ? InstExtraComma : InstNormal;
8915int LLParser::parseExtractValue(Instruction *&Inst, PerFunctionState &PFS) {
8917 SmallVector<unsigned, 4> Indices;
8919 if (parseTypeAndValue(Val, Loc, PFS) ||
8920 parseIndexList(Indices, AteExtraComma))
8924 return error(Loc,
"extractvalue operand must be aggregate type");
8927 return error(Loc,
"invalid indices for extractvalue");
8929 return AteExtraComma ? InstExtraComma : InstNormal;
8934int LLParser::parseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
8936 SmallVector<unsigned, 4> Indices;
8938 if (parseTypeAndValue(Val0, Loc0, PFS) ||
8939 parseToken(
lltok::comma,
"expected comma after insertvalue operand") ||
8940 parseTypeAndValue(Val1, Loc1, PFS) ||
8941 parseIndexList(Indices, AteExtraComma))
8945 return error(Loc0,
"insertvalue operand must be aggregate type");
8949 return error(Loc0,
"invalid indices for insertvalue");
8950 if (IndexedType != Val1->
getType())
8951 return error(Loc1,
"insertvalue operand and field disagree in type: '" +
8955 return AteExtraComma ? InstExtraComma : InstNormal;
8966bool LLParser::parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts) {
8981 if (parseMetadata(MD,
nullptr))
8986 return parseToken(
lltok::rbrace,
"expected end of metadata node");
8992bool LLParser::sortUseListOrder(
Value *V, ArrayRef<unsigned> Indexes,
8994 if (!
V->hasUseList())
8997 return error(Loc,
"value has no uses");
8999 unsigned NumUses = 0;
9000 SmallDenseMap<const Use *, unsigned, 16> Order;
9001 for (
const Use &U :
V->uses()) {
9002 if (++NumUses > Indexes.
size())
9004 Order[&
U] = Indexes[NumUses - 1];
9007 return error(Loc,
"value only has one use");
9008 if (Order.
size() != Indexes.
size() || NumUses > Indexes.
size())
9010 "wrong number of indexes, expected " + Twine(
V->getNumUses()));
9012 V->sortUseList([&](
const Use &L,
const Use &R) {
9020bool LLParser::parseUseListOrderIndexes(SmallVectorImpl<unsigned> &Indexes) {
9021 SMLoc Loc = Lex.getLoc();
9025 return tokError(
"expected non-empty list of uselistorder indexes");
9032 bool IsOrdered =
true;
9033 assert(Indexes.
empty() &&
"Expected empty order vector");
9036 if (parseUInt32(Index))
9041 Max = std::max(Max, Index);
9042 IsOrdered &= Index == Indexes.
size();
9050 if (Indexes.
size() < 2)
9051 return error(Loc,
"expected >= 2 uselistorder indexes");
9054 "expected distinct uselistorder indexes in range [0, size)");
9056 return error(Loc,
"expected uselistorder indexes to change the order");
9063bool LLParser::parseUseListOrder(PerFunctionState *PFS) {
9064 SMLoc Loc = Lex.getLoc();
9069 SmallVector<unsigned, 16> Indexes;
9070 if (parseTypeAndValue(V, PFS) ||
9071 parseToken(
lltok::comma,
"expected comma in uselistorder directive") ||
9072 parseUseListOrderIndexes(Indexes))
9075 return sortUseListOrder(V, Indexes, Loc);
9080bool LLParser::parseUseListOrderBB() {
9082 SMLoc Loc = Lex.getLoc();
9086 SmallVector<unsigned, 16> Indexes;
9087 if (parseValID(Fn,
nullptr) ||
9088 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9089 parseValID(Label,
nullptr) ||
9090 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9091 parseUseListOrderIndexes(Indexes))
9097 GV = M->getNamedValue(Fn.
StrVal);
9099 GV = NumberedVals.get(Fn.
UIntVal);
9101 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9104 "invalid function forward reference in uselistorder_bb");
9107 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9108 if (
F->isDeclaration())
9109 return error(Fn.
Loc,
"invalid declaration in uselistorder_bb");
9113 return error(
Label.Loc,
"invalid numeric label in uselistorder_bb");
9115 return error(
Label.Loc,
"expected basic block name in uselistorder_bb");
9116 Value *
V =
F->getValueSymbolTable()->lookup(
Label.StrVal);
9118 return error(
Label.Loc,
"invalid basic block in uselistorder_bb");
9120 return error(
Label.Loc,
"expected basic block in uselistorder_bb");
9122 return sortUseListOrder(V, Indexes, Loc);
9128bool LLParser::parseModuleEntry(
unsigned ID) {
9137 parseStringConstant(Path) ||
9145 if (parseUInt32(Hash[0]) || parseToken(
lltok::comma,
"expected ',' here") ||
9146 parseUInt32(Hash[1]) || parseToken(
lltok::comma,
"expected ',' here") ||
9147 parseUInt32(Hash[2]) || parseToken(
lltok::comma,
"expected ',' here") ||
9148 parseUInt32(Hash[3]) || parseToken(
lltok::comma,
"expected ',' here") ||
9149 parseUInt32(Hash[4]))
9156 auto ModuleEntry = Index->addModule(Path, Hash);
9157 ModuleIdMap[
ID] = ModuleEntry->first();
9164bool LLParser::parseTypeIdEntry(
unsigned ID) {
9173 parseStringConstant(Name))
9176 TypeIdSummary &TIS = Index->getOrInsertTypeIdSummary(Name);
9178 parseTypeIdSummary(TIS) || parseToken(
lltok::rparen,
"expected ')' here"))
9183 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9184 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9185 for (
auto TIDRef : FwdRefTIDs->second) {
9187 "Forward referenced type id GUID expected to be 0");
9190 ForwardRefTypeIds.erase(FwdRefTIDs);
9198bool LLParser::parseTypeIdSummary(TypeIdSummary &TIS) {
9202 parseTypeTestResolution(TIS.
TTRes))
9207 if (parseOptionalWpdResolutions(TIS.
WPDRes))
9218 ValueInfo(
false, (GlobalValueSummaryMapTy::value_type *)-8);
9224bool LLParser::parseTypeIdCompatibleVtableEntry(
unsigned ID) {
9233 parseStringConstant(Name))
9237 Index->getOrInsertTypeIdCompatibleVtableSummary(Name);
9244 IdToIndexMapType IdToIndexMap;
9257 if (parseGVReference(VI, GVId))
9264 IdToIndexMap[GVId].push_back(std::make_pair(TI.size(),
Loc));
9265 TI.push_back({
Offset, VI});
9273 for (
auto I : IdToIndexMap) {
9274 auto &Infos = ForwardRefValueInfos[
I.first];
9275 for (
auto P :
I.second) {
9277 "Forward referenced ValueInfo expected to be empty");
9278 Infos.emplace_back(&TI[
P.first].VTableVI,
P.second);
9288 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9289 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9290 for (
auto TIDRef : FwdRefTIDs->second) {
9292 "Forward referenced type id GUID expected to be 0");
9295 ForwardRefTypeIds.erase(FwdRefTIDs);
9307bool LLParser::parseTypeTestResolution(TypeTestResolution &TTRes) {
9315 switch (Lex.getKind()) {
9335 return error(Lex.getLoc(),
"unexpected TypeTestResolution kind");
9347 switch (Lex.getKind()) {
9362 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(Val))
9375 return error(Lex.getLoc(),
"expected optional TypeTestResolution field");
9388bool LLParser::parseOptionalWpdResolutions(
9389 std::map<uint64_t, WholeProgramDevirtResolution> &WPDResMap) {
9397 WholeProgramDevirtResolution WPDRes;
9401 parseToken(
lltok::comma,
"expected ',' here") || parseWpdRes(WPDRes) ||
9404 WPDResMap[
Offset] = WPDRes;
9421bool LLParser::parseWpdRes(WholeProgramDevirtResolution &WPDRes) {
9429 switch (Lex.getKind()) {
9440 return error(Lex.getLoc(),
"unexpected WholeProgramDevirtResolution kind");
9446 switch (Lex.getKind()) {
9454 if (parseOptionalResByArg(WPDRes.
ResByArg))
9458 return error(Lex.getLoc(),
9459 "expected optional WholeProgramDevirtResolution field");
9476bool LLParser::parseOptionalResByArg(
9477 std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>
9485 std::vector<uint64_t>
Args;
9486 if (parseArgs(Args) || parseToken(
lltok::comma,
"expected ',' here") ||
9494 WholeProgramDevirtResolution::ByArg ByArg;
9495 switch (Lex.getKind()) {
9509 return error(Lex.getLoc(),
9510 "unexpected WholeProgramDevirtResolution::ByArg kind");
9516 switch (Lex.getKind()) {
9520 parseUInt64(ByArg.
Info))
9526 parseUInt32(ByArg.
Byte))
9532 parseUInt32(ByArg.
Bit))
9536 return error(Lex.getLoc(),
9537 "expected optional whole program devirt field");
9544 ResByArg[
Args] = ByArg;
9555bool LLParser::parseArgs(std::vector<uint64_t> &Args) {
9563 if (parseUInt64(Val))
9565 Args.push_back(Val);
9574static const auto FwdVIRef = (GlobalValueSummaryMapTy::value_type *)-8;
9579 assert(!(ReadOnly && WriteOnly));
9589bool LLParser::addGlobalValueToIndex(
9591 unsigned ID, std::unique_ptr<GlobalValueSummary> Summary,
LocTy Loc) {
9596 VI = Index->getOrInsertValueInfo(GUID);
9600 auto *GV = M->getNamedValue(Name);
9602 return error(Loc,
"Reference to undefined global \"" + Name +
"\"");
9604 VI = Index->getOrInsertValueInfo(GV);
9608 "Need a source_filename to compute GUID for local");
9611 VI = Index->getOrInsertValueInfo(GUID, Index->saveString(Name));
9616 auto FwdRefVIs = ForwardRefValueInfos.find(
ID);
9617 if (FwdRefVIs != ForwardRefValueInfos.end()) {
9618 for (
auto VIRef : FwdRefVIs->second) {
9620 "Forward referenced ValueInfo expected to be empty");
9623 ForwardRefValueInfos.erase(FwdRefVIs);
9627 auto FwdRefAliasees = ForwardRefAliasees.find(
ID);
9628 if (FwdRefAliasees != ForwardRefAliasees.end()) {
9629 for (
auto AliaseeRef : FwdRefAliasees->second) {
9630 assert(!AliaseeRef.first->hasAliasee() &&
9631 "Forward referencing alias already has aliasee");
9632 assert(Summary &&
"Aliasee must be a definition");
9633 AliaseeRef.first->setAliasee(VI,
Summary.get());
9635 ForwardRefAliasees.erase(FwdRefAliasees);
9640 Index->addGlobalValueSummary(VI, std::move(Summary));
9643 if (
ID == NumberedValueInfos.size())
9644 NumberedValueInfos.push_back(VI);
9647 if (
ID > NumberedValueInfos.size())
9648 NumberedValueInfos.resize(
ID + 1);
9649 NumberedValueInfos[
ID] =
VI;
9657bool LLParser::parseSummaryIndexFlags() {
9664 if (parseUInt64(Flags))
9667 Index->setFlags(Flags);
9673bool LLParser::parseBlockCount() {
9679 uint64_t BlockCount;
9680 if (parseUInt64(BlockCount))
9683 Index->setBlockCount(BlockCount);
9691bool LLParser::parseGVEntry(
unsigned ID) {
9699 LocTy Loc = Lex.getLoc();
9702 switch (Lex.getKind()) {
9706 parseStringConstant(Name))
9712 if (parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(GUID))
9716 return error(Lex.getLoc(),
"expected name or guid tag");
9739 switch (Lex.getKind()) {
9741 if (parseFunctionSummary(Name, GUID,
ID))
9745 if (parseVariableSummary(Name, GUID,
ID))
9749 if (parseAliasSummary(Name, GUID,
ID))
9753 return error(Lex.getLoc(),
"expected summary type");
9771 LocTy Loc = Lex.getLoc();
9775 StringRef ModulePath;
9776 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9779 false,
false,
false,
9783 FunctionSummary::TypeIdInfo TypeIdInfo;
9784 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
9786 std::vector<CallsiteInfo> Callsites;
9787 std::vector<AllocInfo> Allocs;
9789 FunctionSummary::FFlags FFlags = {};
9792 parseModuleReference(ModulePath) ||
9793 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9796 parseToken(
lltok::colon,
"expected ':' here") || parseUInt32(InstCount))
9801 switch (Lex.getKind()) {
9803 if (parseOptionalFFlags(FFlags))
9807 if (parseOptionalCalls(Calls))
9811 if (parseOptionalTypeIdInfo(TypeIdInfo))
9815 if (parseOptionalRefs(Refs))
9819 if (parseOptionalParamAccesses(ParamAccesses))
9823 if (parseOptionalAllocs(Allocs))
9827 if (parseOptionalCallsites(Callsites))
9831 return error(Lex.getLoc(),
"expected optional function summary field");
9838 auto FS = std::make_unique<FunctionSummary>(
9839 GVFlags, InstCount, FFlags, std::move(Refs), std::move(Calls),
9845 std::move(ParamAccesses), std::move(Callsites), std::move(Allocs));
9847 FS->setModulePath(ModulePath);
9849 return addGlobalValueToIndex(Name, GUID,
9851 std::move(FS), Loc);
9859 LocTy Loc = Lex.getLoc();
9863 StringRef ModulePath;
9864 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9867 false,
false,
false,
9869 GlobalVarSummary::GVarFlags GVarFlags(
false,
9877 parseModuleReference(ModulePath) ||
9878 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9880 parseGVarFlags(GVarFlags))
9885 switch (Lex.getKind()) {
9887 if (parseOptionalVTableFuncs(VTableFuncs))
9891 if (parseOptionalRefs(Refs))
9895 return error(Lex.getLoc(),
"expected optional variable summary field");
9903 std::make_unique<GlobalVarSummary>(GVFlags, GVarFlags, std::move(Refs));
9905 GS->setModulePath(ModulePath);
9906 GS->setVTableFuncs(std::move(VTableFuncs));
9908 return addGlobalValueToIndex(Name, GUID,
9910 std::move(GS), Loc);
9919 LocTy Loc = Lex.getLoc();
9922 StringRef ModulePath;
9923 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9926 false,
false,
false,
9930 parseModuleReference(ModulePath) ||
9931 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9937 ValueInfo AliaseeVI;
9939 if (parseGVReference(AliaseeVI, GVId))
9945 auto AS = std::make_unique<AliasSummary>(GVFlags);
9947 AS->setModulePath(ModulePath);
9951 ForwardRefAliasees[GVId].emplace_back(AS.get(), Loc);
9953 auto Summary = Index->findSummaryInModule(AliaseeVI, ModulePath);
9954 assert(Summary &&
"Aliasee must be a definition");
9955 AS->setAliasee(AliaseeVI, Summary);
9958 return addGlobalValueToIndex(Name, GUID,
9960 std::move(AS), Loc);
9965bool LLParser::parseFlag(
unsigned &Val) {
9966 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
9967 return tokError(
"expected integer");
9968 Val = (unsigned)Lex.getAPSIntVal().getBoolValue();
9984bool LLParser::parseOptionalFFlags(FunctionSummary::FFlags &FFlags) {
9988 if (parseToken(
lltok::colon,
"expected ':' in funcFlags") ||
9994 switch (Lex.getKind()) {
9997 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10003 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10009 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10015 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10021 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10027 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10033 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10039 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10045 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10051 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10056 return error(Lex.getLoc(),
"expected function flag type");
10060 if (parseToken(
lltok::rparen,
"expected ')' in funcFlags"))
10071bool LLParser::parseOptionalCalls(
10072 SmallVectorImpl<FunctionSummary::EdgeTy> &Calls) {
10076 if (parseToken(
lltok::colon,
"expected ':' in calls") ||
10080 IdToIndexMapType IdToIndexMap;
10089 LocTy Loc = Lex.getLoc();
10091 if (parseGVReference(VI, GVId))
10095 unsigned RelBF = 0;
10096 unsigned HasTailCall =
false;
10100 switch (Lex.getKind()) {
10103 if (parseToken(
lltok::colon,
"expected ':'") || parseHotness(Hotness))
10108 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(RelBF))
10113 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(HasTailCall))
10117 return error(Lex.getLoc(),
"expected hotness, relbf, or tail");
10121 return tokError(
"Expected only one of hotness or relbf");
10126 IdToIndexMap[GVId].push_back(std::make_pair(Calls.
size(), Loc));
10136 for (
auto I : IdToIndexMap) {
10137 auto &Infos = ForwardRefValueInfos[
I.first];
10138 for (
auto P :
I.second) {
10140 "Forward referenced ValueInfo expected to be empty");
10141 Infos.emplace_back(&Calls[
P.first].first,
P.second);
10154 switch (Lex.getKind()) {
10158 case lltok::kw_cold:
10164 case lltok::kw_hot:
10171 return error(Lex.getLoc(),
"invalid call edge hotness");
10180bool LLParser::parseOptionalVTableFuncs(
VTableFuncList &VTableFuncs) {
10184 if (parseToken(
lltok::colon,
"expected ':' in vTableFuncs") ||
10188 IdToIndexMapType IdToIndexMap;
10192 if (parseToken(
lltok::lparen,
"expected '(' in vTableFunc") ||
10197 LocTy Loc = Lex.getLoc();
10199 if (parseGVReference(VI, GVId))
10212 IdToIndexMap[GVId].push_back(std::make_pair(VTableFuncs.size(), Loc));
10213 VTableFuncs.push_back({
VI,
Offset});
10215 if (parseToken(
lltok::rparen,
"expected ')' in vTableFunc"))
10221 for (
auto I : IdToIndexMap) {
10222 auto &Infos = ForwardRefValueInfos[
I.first];
10223 for (
auto P :
I.second) {
10225 "Forward referenced ValueInfo expected to be empty");
10226 Infos.emplace_back(&VTableFuncs[
P.first].FuncVI,
P.second);
10230 if (parseToken(
lltok::rparen,
"expected ')' in vTableFuncs"))
10237bool LLParser::parseParamNo(uint64_t &ParamNo) {
10239 parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(ParamNo))
10245bool LLParser::parseParamAccessOffset(ConstantRange &
Range) {
10248 auto ParseAPSInt = [&](
APSInt &Val) {
10250 return tokError(
"expected integer");
10251 Val = Lex.getAPSIntVal();
10253 Val.setIsSigned(
true);
10275bool LLParser::parseParamAccessCall(FunctionSummary::ParamAccess::Call &
Call,
10276 IdLocListType &IdLocList) {
10284 LocTy Loc = Lex.getLoc();
10285 if (parseGVReference(VI, GVId))
10289 IdLocList.emplace_back(GVId, Loc);
10292 parseParamNo(
Call.ParamNo) ||
10294 parseParamAccessOffset(
Call.Offsets))
10306bool LLParser::parseParamAccess(FunctionSummary::ParamAccess &Param,
10307 IdLocListType &IdLocList) {
10309 parseParamNo(
Param.ParamNo) ||
10311 parseParamAccessOffset(
Param.Use))
10320 FunctionSummary::ParamAccess::Call
Call;
10321 if (parseParamAccessCall(
Call, IdLocList))
10338bool LLParser::parseOptionalParamAccesses(
10339 std::vector<FunctionSummary::ParamAccess> &Params) {
10347 IdLocListType VContexts;
10348 size_t CallsNum = 0;
10350 FunctionSummary::ParamAccess ParamAccess;
10351 if (parseParamAccess(ParamAccess, VContexts))
10353 CallsNum += ParamAccess.
Calls.size();
10354 assert(VContexts.size() == CallsNum);
10356 Params.emplace_back(std::move(ParamAccess));
10364 IdLocListType::const_iterator ItContext = VContexts.begin();
10365 for (
auto &PA : Params) {
10366 for (
auto &
C : PA.Calls) {
10368 ForwardRefValueInfos[ItContext->first].emplace_back(&
C.Callee,
10369 ItContext->second);
10373 assert(ItContext == VContexts.end());
10380bool LLParser::parseOptionalRefs(SmallVectorImpl<ValueInfo> &Refs) {
10384 if (parseToken(
lltok::colon,
"expected ':' in refs") ||
10388 struct ValueContext {
10393 std::vector<ValueContext> VContexts;
10397 VC.Loc = Lex.getLoc();
10398 if (parseGVReference(
VC.VI,
VC.GVId))
10400 VContexts.push_back(VC);
10406 llvm::sort(VContexts, [](
const ValueContext &VC1,
const ValueContext &VC2) {
10407 return VC1.VI.getAccessSpecifier() < VC2.VI.getAccessSpecifier();
10410 IdToIndexMapType IdToIndexMap;
10411 for (
auto &VC : VContexts) {
10416 IdToIndexMap[
VC.GVId].push_back(std::make_pair(Refs.
size(),
VC.Loc));
10422 for (
auto I : IdToIndexMap) {
10423 auto &Infos = ForwardRefValueInfos[
I.first];
10424 for (
auto P :
I.second) {
10426 "Forward referenced ValueInfo expected to be empty");
10427 Infos.emplace_back(&Refs[
P.first],
P.second);
10441bool LLParser::parseOptionalTypeIdInfo(
10442 FunctionSummary::TypeIdInfo &TypeIdInfo) {
10451 switch (Lex.getKind()) {
10453 if (parseTypeTests(TypeIdInfo.
TypeTests))
10477 return error(Lex.getLoc(),
"invalid typeIdInfo list type");
10481 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10490bool LLParser::parseTypeTests(std::vector<GlobalValue::GUID> &TypeTests) {
10498 IdToIndexMapType IdToIndexMap;
10502 unsigned ID = Lex.getUIntVal();
10503 LocTy Loc = Lex.getLoc();
10507 IdToIndexMap[
ID].push_back(std::make_pair(TypeTests.size(), Loc));
10509 }
else if (parseUInt64(GUID))
10511 TypeTests.push_back(GUID);
10516 for (
auto I : IdToIndexMap) {
10517 auto &Ids = ForwardRefTypeIds[
I.first];
10518 for (
auto P :
I.second) {
10519 assert(TypeTests[
P.first] == 0 &&
10520 "Forward referenced type id GUID expected to be 0");
10521 Ids.emplace_back(&TypeTests[
P.first],
P.second);
10525 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10533bool LLParser::parseVFuncIdList(
10534 lltok::Kind Kind, std::vector<FunctionSummary::VFuncId> &VFuncIdList) {
10535 assert(Lex.getKind() == Kind);
10542 IdToIndexMapType IdToIndexMap;
10544 FunctionSummary::VFuncId VFuncId;
10545 if (parseVFuncId(VFuncId, IdToIndexMap, VFuncIdList.size()))
10547 VFuncIdList.push_back(VFuncId);
10555 for (
auto I : IdToIndexMap) {
10556 auto &Ids = ForwardRefTypeIds[
I.first];
10557 for (
auto P :
I.second) {
10558 assert(VFuncIdList[
P.first].GUID == 0 &&
10559 "Forward referenced type id GUID expected to be 0");
10560 Ids.emplace_back(&VFuncIdList[
P.first].GUID,
P.second);
10569bool LLParser::parseConstVCallList(
10571 std::vector<FunctionSummary::ConstVCall> &ConstVCallList) {
10572 assert(Lex.getKind() == Kind);
10579 IdToIndexMapType IdToIndexMap;
10581 FunctionSummary::ConstVCall ConstVCall;
10582 if (parseConstVCall(ConstVCall, IdToIndexMap, ConstVCallList.size()))
10584 ConstVCallList.push_back(ConstVCall);
10592 for (
auto I : IdToIndexMap) {
10593 auto &Ids = ForwardRefTypeIds[
I.first];
10594 for (
auto P :
I.second) {
10595 assert(ConstVCallList[
P.first].VFunc.GUID == 0 &&
10596 "Forward referenced type id GUID expected to be 0");
10597 Ids.emplace_back(&ConstVCallList[
P.first].VFunc.GUID,
P.second);
10606bool LLParser::parseConstVCall(FunctionSummary::ConstVCall &ConstVCall,
10607 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10609 parseVFuncId(ConstVCall.
VFunc, IdToIndexMap, Index))
10613 if (parseArgs(ConstVCall.
Args))
10625bool LLParser::parseVFuncId(FunctionSummary::VFuncId &VFuncId,
10626 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10636 unsigned ID = Lex.getUIntVal();
10637 LocTy Loc = Lex.getLoc();
10641 IdToIndexMap[
ID].push_back(std::make_pair(Index, Loc));
10643 }
else if (parseToken(
lltok::kw_guid,
"expected 'guid' here") ||
10645 parseUInt64(VFuncId.
GUID))
10651 parseUInt64(VFuncId.
Offset) ||
10663bool LLParser::parseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
10673 switch (Lex.getKind()) {
10680 assert(HasLinkage &&
"Linkage not optional in summary entry");
10687 parseOptionalVisibility(Flag);
10692 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10698 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10704 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10710 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10719 if (parseOptionalImportType(Lex.getKind(), IK))
10721 GVFlags.
ImportType =
static_cast<unsigned>(IK);
10725 return error(Lex.getLoc(),
"expected gv flag type");
10739bool LLParser::parseGVarFlags(GlobalVarSummary::GVarFlags &GVarFlags) {
10747 auto ParseRest = [
this](
unsigned int &Val) {
10751 return parseFlag(Val);
10756 switch (Lex.getKind()) {
10757 case lltok::kw_readonly:
10758 if (ParseRest(Flag))
10762 case lltok::kw_writeonly:
10763 if (ParseRest(Flag))
10768 if (ParseRest(Flag))
10773 if (ParseRest(Flag))
10778 return error(Lex.getLoc(),
"expected gvar flag type");
10786bool LLParser::parseModuleReference(StringRef &ModulePath) {
10793 unsigned ModuleID = Lex.getUIntVal();
10794 auto I = ModuleIdMap.find(ModuleID);
10796 assert(
I != ModuleIdMap.end());
10797 ModulePath =
I->second;
10803bool LLParser::parseGVReference(ValueInfo &VI,
unsigned &GVId) {
10806 WriteOnly = EatIfPresent(lltok::kw_writeonly);
10810 GVId = Lex.getUIntVal();
10812 if (GVId < NumberedValueInfos.size() && NumberedValueInfos[GVId]) {
10814 VI = NumberedValueInfos[GVId];
10831bool LLParser::parseOptionalAllocs(std::vector<AllocInfo> &Allocs) {
10835 if (parseToken(
lltok::colon,
"expected ':' in allocs") ||
10847 SmallVector<uint8_t> Versions;
10850 if (parseAllocType(V))
10855 if (parseToken(
lltok::rparen,
"expected ')' in versions") ||
10859 std::vector<MIBInfo> MIBs;
10860 if (parseMemProfs(MIBs))
10863 Allocs.push_back({Versions, MIBs});
10880bool LLParser::parseMemProfs(std::vector<MIBInfo> &MIBs) {
10884 if (parseToken(
lltok::colon,
"expected ':' in memprof") ||
10890 if (parseToken(
lltok::lparen,
"expected '(' in memprof") ||
10899 if (parseToken(
lltok::comma,
"expected ',' in memprof") ||
10905 SmallVector<unsigned> StackIdIndices;
10909 uint64_t StackId = 0;
10910 if (parseUInt64(StackId))
10912 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
10933bool LLParser::parseAllocType(uint8_t &
AllocType) {
10934 switch (Lex.getKind()) {
10941 case lltok::kw_cold:
10944 case lltok::kw_hot:
10948 return error(Lex.getLoc(),
"invalid alloc type");
10961bool LLParser::parseOptionalCallsites(std::vector<CallsiteInfo> &Callsites) {
10965 if (parseToken(
lltok::colon,
"expected ':' in callsites") ||
10969 IdToIndexMapType IdToIndexMap;
10972 if (parseToken(
lltok::lparen,
"expected '(' in callsite") ||
10979 LocTy Loc = Lex.getLoc();
10981 if (parseGVReference(VI, GVId))
10985 if (parseToken(
lltok::comma,
"expected ',' in callsite") ||
10991 SmallVector<unsigned> Clones;
10994 if (parseUInt32(V))
11000 parseToken(
lltok::comma,
"expected ',' in callsite") ||
11006 SmallVector<unsigned> StackIdIndices;
11010 uint64_t StackId = 0;
11011 if (parseUInt64(StackId))
11013 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
11024 IdToIndexMap[GVId].
push_back(std::make_pair(Callsites.size(), Loc));
11025 Callsites.push_back({
VI, Clones, StackIdIndices});
11033 for (
auto I : IdToIndexMap) {
11034 auto &Infos = ForwardRefValueInfos[
I.first];
11035 for (
auto P :
I.second) {
11037 "Forward referenced ValueInfo expected to be empty");
11038 Infos.emplace_back(&Callsites[
P.first].Callee,
P.second);
11042 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 LLVM_ABI const char * areInvalidOperands(Value *Cond, Value *True, Value *False)
Return a string if the specified operands are invalid for a select operation, otherwise return null.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
ArrayRef< int > getShuffleMask() const
static LLVM_ABI bool isValidOperands(const Value *V1, const Value *V2, const Value *Mask)
Return true if a shufflevector instruction can be formed with the specified operands.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
iterator find(StringRef Key)
StringMapIterBase< Comdat, false > iterator
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
static LLVM_ABI StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
LLVM_ABI Error setBodyOrError(ArrayRef< Type * > Elements, bool isPacked=false)
Specify a body for an opaque identified type or return an error if it would make the type recursive.
LLVM_ABI bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Returns true if this struct contains a scalable vector.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
@ HasZeroInit
zeroinitializer is valid for this target extension type.
static LLVM_ABI Expected< TargetExtType * > getOrError(LLVMContext &Context, StringRef Name, ArrayRef< Type * > Types={}, ArrayRef< unsigned > Ints={})
Return a target extension type having the specified name and optional type and integer parameters,...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
bool 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 getSourceLanguageName(StringRef SourceLanguageNameString)
LLVM_ABI unsigned getOperationEncoding(StringRef OperationEncodingString)
LLVM_ABI unsigned getAttributeEncoding(StringRef EncodingString)
LLVM_ABI unsigned getTag(StringRef TagString)
LLVM_ABI unsigned getCallingConvention(StringRef LanguageString)
LLVM_ABI unsigned getLanguage(StringRef LanguageString)
LLVM_ABI unsigned getVirtuality(StringRef VirtualityString)
LLVM_ABI unsigned getEnumKind(StringRef EnumKindString)
LLVM_ABI unsigned getMacinfo(StringRef MacinfoString)
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ AArch64_VectorCall
Used between AArch64 Advanced SIMD functions.
@ X86_64_SysV
The C convention as specified in the x86-64 supplement to the System V ABI, used on most non-Windows ...
@ RISCV_VectorCall
Calling convention used for RISC-V V-extension.
@ AMDGPU_CS
Used for Mesa/AMDPAL compute shaders.
@ AMDGPU_VS
Used for Mesa vertex shaders, or AMDPAL last shader stage before rasterization (vertex shader if tess...
@ AVR_SIGNAL
Used for AVR signal routines.
@ Swift
Calling convention for Swift.
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ AArch64_SVE_VectorCall
Used between AArch64 SVE functions.
@ ARM_APCS
ARM Procedure Calling Standard (obsolete, but still used on some targets).
@ CHERIoT_CompartmentCall
Calling convention used for CHERIoT when crossing a protection boundary.
@ CFGuard_Check
Special calling convention on Windows for calling the Control Guard Check ICall funtion.
@ AVR_INTR
Used for AVR interrupt routines.
@ PreserveMost
Used for runtime calls that preserves most registers.
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
@ AMDGPU_Gfx
Used for AMD graphics targets.
@ DUMMY_HHVM
Placeholders for HHVM calling conventions (deprecated, removed).
@ AMDGPU_CS_ChainPreserve
Used on AMDGPUs to give the middle-end more control over argument placement.
@ AMDGPU_HS
Used for Mesa/AMDPAL hull shaders (= tessellation control shaders).
@ ARM_AAPCS
ARM Architecture Procedure Calling Standard calling convention (aka EABI).
@ CHERIoT_CompartmentCallee
Calling convention used for the callee of CHERIoT_CompartmentCall.
@ AMDGPU_GS
Used for Mesa/AMDPAL geometry shaders.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2
Preserve X2-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ CHERIoT_LibraryCall
Calling convention used for CHERIoT for cross-library calls to a stateless compartment.
@ CXX_FAST_TLS
Used for access functions.
@ X86_INTR
x86 hardware interrupt context.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0
Preserve X0-X13, X19-X29, SP, Z0-Z31, P0-P15.
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
@ AMDGPU_PS
Used for Mesa/AMDPAL pixel shaders.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1
Preserve X1-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ X86_ThisCall
Similar to X86_StdCall.
@ PTX_Device
Call to a PTX device function.
@ SPIR_KERNEL
Used for SPIR kernel functions.
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
@ X86_StdCall
stdcall is mostly used by the Win32 API.
@ SPIR_FUNC
Used for SPIR non-kernel device functions.
@ Fast
Attempts to make calls as fast as possible (e.g.
@ MSP430_INTR
Used for MSP430 interrupt routines.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ Intel_OCL_BI
Used for Intel OpenCL built-ins.
@ PreserveNone
Used for runtime calls that preserves none general registers.
@ AMDGPU_ES
Used for AMDPAL shader stage before geometry shader if geometry is in use.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
@ PTX_Kernel
Call to a PTX kernel. Passes all arguments in parameter space.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
@ GRAAL
Used by GraalVM. Two additional registers are reserved.
@ AMDGPU_LS
Used for AMDPAL vertex shader if tessellation is in use.
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
@ X86_RegCall
Register calling convention used for parameters transfer optimization.
@ M68k_RTD
Used for M68k rtd-based CC (similar to X86's stdcall).
@ C
The default llvm calling convention, compatible with C.
@ X86_FastCall
'fast' analog of X86_StdCall.
@ BasicBlock
Various leaf nodes.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
LLVM_ABI ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
LLVM_ABI bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &ArgTys)
Gets the type arguments of an intrinsic call by matching type contraints specified by the ....
Flag
These should be considered private to the implementation of the MCInstrDesc class.
@ System
Synchronized with respect to all concurrently executing threads.
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.