65 "Allow incomplete IR on a best effort basis (references to unknown "
66 "metadata will be dropped)"));
81 if (Context.shouldDiscardValueNames())
84 "Can't read textual IR with a Context that discards named Values");
87 if (parseTargetDefinitions(DataLayoutCallback))
91 return parseTopLevelEntities() || validateEndOfModule(UpgradeDebugInfo) ||
97 restoreParsingState(Slots);
101 if (parseType(Ty) || parseConstantValue(Ty,
C))
104 return error(Lex.getLoc(),
"expected end of string");
110 restoreParsingState(Slots);
114 SMLoc Start = Lex.getLoc();
118 SMLoc End = Lex.getLoc();
126 restoreParsingState(Slots);
130 SMLoc Start = Lex.getLoc();
132 bool Status = parseDIExpressionBody(Result,
false);
133 SMLoc End = Lex.getLoc();
139void LLParser::restoreParsingState(
const SlotMapping *Slots) {
146 std::make_pair(
I.getKey(), std::make_pair(
I.second,
LocTy())));
147 for (
const auto &
I : Slots->
Types)
148 NumberedTypes.insert(
149 std::make_pair(
I.first, std::make_pair(
I.second,
LocTy())));
155 II->getIntrinsicID() != Intrinsic::experimental_noalias_scope_decl)
162 if (MD->isTemporary())
166 assert(
II->use_empty() &&
"Cannot have uses");
167 II->eraseFromParent();
176void LLParser::dropUnknownMetadataReferences() {
177 auto Pred = [](
unsigned MDKind, MDNode *
Node) {
return Node->isTemporary(); };
178 for (Function &
F : *M) {
179 F.eraseMetadataIf(Pred);
181 I.eraseMetadataIf(Pred);
188 for (GlobalVariable &GV : M->globals())
189 GV.eraseMetadataIf(Pred);
194 if (
Info.first->getNumTemporaryUses() == 1) {
195 NumberedMetadata.erase(
ID);
196 ForwardRefMDNodes.erase(
ID);
209 assert(!(SeenNewDbgInfoFormat && SeenOldDbgInfoFormat) &&
210 "Mixed debug intrinsics/records seen without a parsing error?");
213 for (
const auto &RAG : ForwardRefAttrGroups) {
215 const std::vector<unsigned> &
Attrs = RAG.second;
216 AttrBuilder
B(Context);
218 for (
const auto &Attr : Attrs) {
219 auto R = NumberedAttrBuilders.find(Attr);
220 if (R != NumberedAttrBuilders.end())
225 AttributeList AS = Fn->getAttributes();
226 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
227 AS = AS.removeFnAttributes(Context);
233 if (MaybeAlign
A = FnAttrs.getAlignment()) {
234 Fn->setAlignment(*
A);
235 FnAttrs.removeAttribute(Attribute::Alignment);
238 AS = AS.addFnAttributes(Context, FnAttrs);
239 Fn->setAttributes(AS);
241 AttributeList AS = CI->getAttributes();
242 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
243 AS = AS.removeFnAttributes(Context);
245 AS = AS.addFnAttributes(Context, FnAttrs);
246 CI->setAttributes(AS);
248 AttributeList AS =
II->getAttributes();
249 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
250 AS = AS.removeFnAttributes(Context);
252 AS = AS.addFnAttributes(Context, FnAttrs);
253 II->setAttributes(AS);
255 AttributeList AS = CBI->getAttributes();
256 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
257 AS = AS.removeFnAttributes(Context);
259 AS = AS.addFnAttributes(Context, FnAttrs);
260 CBI->setAttributes(AS);
262 AttrBuilder
Attrs(M->getContext(), GV->getAttributes());
272 if (!ForwardRefBlockAddresses.empty())
273 return error(ForwardRefBlockAddresses.begin()->first.Loc,
274 "expected function name in blockaddress");
276 auto ResolveForwardRefDSOLocalEquivalents = [&](
const ValID &GVRef,
277 GlobalValue *FwdRef) {
278 GlobalValue *GV =
nullptr;
280 GV = M->getNamedValue(GVRef.
StrVal);
282 GV = NumberedVals.get(GVRef.
UIntVal);
287 "' referenced by dso_local_equivalent");
291 "expected a function, alias to function, or ifunc "
292 "in dso_local_equivalent");
295 FwdRef->replaceAllUsesWith(Equiv);
296 FwdRef->eraseFromParent();
303 for (
auto &Iter : ForwardRefDSOLocalEquivalentIDs) {
304 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
307 for (
auto &Iter : ForwardRefDSOLocalEquivalentNames) {
308 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
311 ForwardRefDSOLocalEquivalentIDs.clear();
312 ForwardRefDSOLocalEquivalentNames.clear();
314 for (
const auto &NT : NumberedTypes)
315 if (
NT.second.second.isValid())
317 "use of undefined type '%" + Twine(
NT.first) +
"'");
319 for (
const auto &[Name, TypeInfo] : NamedTypes)
320 if (TypeInfo.second.isValid())
321 return error(TypeInfo.second,
322 "use of undefined type named '" + Name +
"'");
324 if (!ForwardRefComdats.empty())
325 return error(ForwardRefComdats.begin()->second,
326 "use of undefined comdat '$" +
327 ForwardRefComdats.begin()->first +
"'");
341 if (!CB || !CB->isCallee(&U))
342 return error(
Info.second,
"intrinsic can only be used as callee");
356 return error(
Info.second,
"unknown intrinsic '" + Name +
"'");
357 return error(
Info.second,
"invalid intrinsic signature");
367 Info.first->eraseFromParent();
368 ForwardRefVals.erase(Name);
377 auto GetCommonFunctionType = [](
Value *
V) -> FunctionType * {
378 FunctionType *FTy =
nullptr;
379 for (Use &U :
V->uses()) {
381 if (!CB || !CB->isCallee(&U) || (FTy && FTy != CB->getFunctionType()))
383 FTy = CB->getFunctionType();
391 Type *Ty = GetCommonFunctionType(
Info.first);
399 GV =
new GlobalVariable(*M, Ty,
false,
402 Info.first->replaceAllUsesWith(GV);
403 Info.first->eraseFromParent();
404 ForwardRefVals.erase(Name);
407 if (!ForwardRefVals.empty())
408 return error(ForwardRefVals.begin()->second.second,
409 "use of undefined value '@" + ForwardRefVals.begin()->first +
412 if (!ForwardRefValIDs.empty())
413 return error(ForwardRefValIDs.begin()->second.second,
414 "use of undefined value '@" +
415 Twine(ForwardRefValIDs.begin()->first) +
"'");
418 dropUnknownMetadataReferences();
420 if (!ForwardRefMDNodes.empty())
421 return error(ForwardRefMDNodes.begin()->second.second,
422 "use of undefined metadata '!" +
423 Twine(ForwardRefMDNodes.begin()->first) +
"'");
426 for (
auto &
N : NumberedMetadata) {
427 if (
N.second && !
N.second->isResolved())
428 N.second->resolveCycles();
431 for (
auto *Inst : InstsWithTBAATag) {
432 MDNode *MD = Inst->getMetadata(LLVMContext::MD_tbaa);
435 assert(MD &&
"UpgradeInstWithTBAATag should have a TBAA tag");
438 if (MD != UpgradedMD)
439 Inst->setMetadata(LLVMContext::MD_tbaa, UpgradedMD);
448 if (UpgradeDebugInfo)
461 Slots->GlobalValues = std::move(NumberedVals);
462 Slots->MetadataNodes = std::move(NumberedMetadata);
463 for (
const auto &
I : NamedTypes)
464 Slots->NamedTypes.insert(std::make_pair(
I.getKey(),
I.second.first));
465 for (
const auto &
I : NumberedTypes)
466 Slots->Types.insert(std::make_pair(
I.first,
I.second.first));
472bool LLParser::validateEndOfIndex() {
476 if (!ForwardRefValueInfos.empty())
477 return error(ForwardRefValueInfos.begin()->second.front().second,
478 "use of undefined summary '^" +
479 Twine(ForwardRefValueInfos.begin()->first) +
"'");
481 if (!ForwardRefAliasees.empty())
482 return error(ForwardRefAliasees.begin()->second.front().second,
483 "use of undefined summary '^" +
484 Twine(ForwardRefAliasees.begin()->first) +
"'");
486 if (!ForwardRefTypeIds.empty())
487 return error(ForwardRefTypeIds.begin()->second.front().second,
488 "use of undefined type id summary '^" +
489 Twine(ForwardRefTypeIds.begin()->first) +
"'");
503 std::string TentativeDLStr = M->getDataLayoutStr();
508 switch (Lex.getKind()) {
510 if (parseTargetDefinition(TentativeDLStr, DLStrLoc))
514 if (parseSourceFileName())
523 if (
auto LayoutOverride =
524 DataLayoutCallback(M->getTargetTriple().str(), TentativeDLStr)) {
525 TentativeDLStr = *LayoutOverride;
531 M->setDataLayout(MaybeDL.
get());
535bool LLParser::parseTopLevelEntities() {
539 switch (Lex.getKind()) {
543 if (parseSummaryEntry())
547 if (parseSourceFileName())
557 switch (Lex.getKind()) {
559 return tokError(
"expected top-level entity");
570 if (parseModuleAsm())
574 if (parseUnnamedType())
578 if (parseNamedType())
582 if (parseUnnamedGlobal())
586 if (parseNamedGlobal())
591 if (parseStandaloneMetadata())
595 if (parseSummaryEntry())
599 if (parseNamedMetadata())
603 if (parseUnnamedAttrGrp())
607 if (parseUseListOrder())
611 if (parseUseListOrderBB())
620bool LLParser::parseModuleAsm() {
626 parseStringConstant(AsmStr))
629 M->appendModuleInlineAsm(AsmStr);
636bool LLParser::parseTargetDefinition(std::string &TentativeDLStr,
642 return tokError(
"unknown target property");
645 if (parseToken(
lltok::equal,
"expected '=' after target triple") ||
646 parseStringConstant(Str))
648 M->setTargetTriple(Triple(std::move(Str)));
652 if (parseToken(
lltok::equal,
"expected '=' after target datalayout"))
654 DLStrLoc = Lex.getLoc();
655 if (parseStringConstant(TentativeDLStr))
663bool LLParser::parseSourceFileName() {
666 if (parseToken(
lltok::equal,
"expected '=' after source_filename") ||
667 parseStringConstant(SourceFileName))
670 M->setSourceFileName(SourceFileName);
676bool LLParser::parseUnnamedType() {
677 LocTy TypeLoc = Lex.getLoc();
678 unsigned TypeID = Lex.getUIntVal();
681 if (parseToken(
lltok::equal,
"expected '=' after name") ||
686 if (parseStructDefinition(TypeLoc,
"", NumberedTypes[
TypeID], Result))
690 std::pair<Type*, LocTy> &
Entry = NumberedTypes[
TypeID];
692 return error(TypeLoc,
"non-struct types may not be recursive");
694 Entry.second = SMLoc();
702bool LLParser::parseNamedType() {
703 std::string
Name = Lex.getStrVal();
704 LocTy NameLoc = Lex.getLoc();
707 if (parseToken(
lltok::equal,
"expected '=' after name") ||
712 if (parseStructDefinition(NameLoc, Name, NamedTypes[Name], Result))
716 std::pair<Type*, LocTy> &
Entry = NamedTypes[
Name];
718 return error(NameLoc,
"non-struct types may not be recursive");
720 Entry.second = SMLoc();
728bool LLParser::parseDeclare() {
732 std::vector<std::pair<unsigned, MDNode *>> MDs;
736 if (parseMetadataAttachment(MDK,
N))
738 MDs.push_back({MDK,
N});
742 unsigned FunctionNumber = -1;
743 SmallVector<unsigned> UnnamedArgNums;
744 if (parseFunctionHeader(
F,
false, FunctionNumber, UnnamedArgNums))
747 F->addMetadata(MD.first, *MD.second);
753bool LLParser::parseDefine() {
755 FileLoc FunctionStart(Lex.getTokLineColumnPos());
759 unsigned FunctionNumber = -1;
760 SmallVector<unsigned> UnnamedArgNums;
762 parseFunctionHeader(
F,
true, FunctionNumber, UnnamedArgNums) ||
763 parseOptionalFunctionMetadata(*
F) ||
764 parseFunctionBody(*
F, FunctionNumber, UnnamedArgNums);
766 ParserContext->addFunctionLocation(
767 F, FileLocRange(FunctionStart, Lex.getPrevTokEndLineColumnPos()));
775bool LLParser::parseGlobalType(
bool &IsConstant) {
782 return tokError(
"expected 'global' or 'constant'");
788bool LLParser::parseOptionalUnnamedAddr(
809bool LLParser::parseUnnamedGlobal() {
812 LocTy NameLoc = Lex.getLoc();
816 VarID = Lex.getUIntVal();
817 if (checkValueID(NameLoc,
"global",
"@", NumberedVals.getNext(),
VarID))
821 if (parseToken(
lltok::equal,
"expected '=' after name"))
824 VarID = NumberedVals.getNext();
828 unsigned Linkage, Visibility, DLLStorageClass;
832 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
834 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
837 switch (Lex.getKind()) {
839 return parseGlobal(Name,
VarID, NameLoc,
Linkage, HasLinkage, Visibility,
840 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
843 return parseAliasOrIFunc(Name,
VarID, NameLoc,
Linkage, Visibility,
844 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
853bool LLParser::parseNamedGlobal() {
855 LocTy NameLoc = Lex.getLoc();
856 std::string
Name = Lex.getStrVal();
860 unsigned Linkage, Visibility, DLLStorageClass;
864 if (parseToken(
lltok::equal,
"expected '=' in global variable") ||
865 parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
867 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
870 switch (Lex.getKind()) {
872 return parseGlobal(Name, -1, NameLoc,
Linkage, HasLinkage, Visibility,
873 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
876 return parseAliasOrIFunc(Name, -1, NameLoc,
Linkage, Visibility,
877 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
881bool LLParser::parseComdat() {
883 std::string
Name = Lex.getStrVal();
884 LocTy NameLoc = Lex.getLoc();
891 return tokError(
"expected comdat type");
894 switch (Lex.getKind()) {
896 return tokError(
"unknown selection kind");
918 if (
I != ComdatSymTab.
end() && !ForwardRefComdats.erase(Name))
919 return error(NameLoc,
"redefinition of comdat '$" + Name +
"'");
922 if (
I != ComdatSymTab.
end())
925 C = M->getOrInsertComdat(Name);
926 C->setSelectionKind(SK);
933bool LLParser::parseMDString(
MDString *&Result) {
935 if (parseStringConstant(Str))
943bool LLParser::parseMDNodeID(
MDNode *&Result) {
945 LocTy IDLoc = Lex.getLoc();
947 if (parseUInt32(MID))
951 auto [It,
Inserted] = NumberedMetadata.try_emplace(MID);
958 auto &FwdRef = ForwardRefMDNodes[MID];
961 Result = FwdRef.first.get();
962 It->second.reset(Result);
968bool LLParser::parseNamedMetadata() {
970 std::string
Name = Lex.getStrVal();
978 NamedMDNode *NMD = M->getOrInsertNamedMetadata(Name);
986 Lex.getStrVal() ==
"DIExpression") {
987 if (parseDIExpression(
N,
false))
992 Lex.getStrVal() ==
"DIArgList") {
993 return tokError(
"found DIArgList outside of function");
1001 return parseToken(
lltok::rbrace,
"expected end of metadata node");
1006bool LLParser::parseStandaloneMetadata() {
1009 unsigned MetadataID = 0;
1012 if (parseUInt32(MetadataID) || parseToken(
lltok::equal,
"expected '=' here"))
1017 return tokError(
"unexpected type in metadata definition");
1021 if (parseSpecializedMDNode(Init, IsDistinct))
1024 parseMDTuple(Init, IsDistinct))
1028 auto FI = ForwardRefMDNodes.find(MetadataID);
1029 if (FI != ForwardRefMDNodes.end()) {
1030 auto *ToReplace = FI->second.first.get();
1034 for (
auto *Inst : TempDIAssignIDAttachments[ToReplace]) {
1035 assert(!Inst->getMetadata(LLVMContext::MD_DIAssignID) &&
1036 "Inst unexpectedly already has DIAssignID attachment");
1037 Inst->setMetadata(LLVMContext::MD_DIAssignID, Init);
1041 ToReplace->replaceAllUsesWith(Init);
1042 ForwardRefMDNodes.erase(FI);
1044 assert(NumberedMetadata[MetadataID] == Init &&
"Tracking VH didn't work");
1046 auto [It,
Inserted] = NumberedMetadata.try_emplace(MetadataID);
1048 return tokError(
"Metadata id is already used");
1049 It->second.reset(Init);
1056bool LLParser::skipModuleSummaryEntry() {
1066 "Expected 'gv', 'module', 'typeid', 'flags' or 'blockcount' at the "
1067 "start of summary entry");
1069 return parseSummaryIndexFlags();
1071 return parseBlockCount();
1073 if (parseToken(
lltok::colon,
"expected ':' at start of summary entry") ||
1074 parseToken(
lltok::lparen,
"expected '(' at start of summary entry"))
1078 unsigned NumOpenParen = 1;
1080 switch (Lex.getKind()) {
1088 return tokError(
"found end of file while parsing summary entry");
1094 }
while (NumOpenParen > 0);
1100bool LLParser::parseSummaryEntry() {
1106 Lex.setIgnoreColonInIdentifiers(
true);
1114 return skipModuleSummaryEntry();
1116 bool result =
false;
1117 switch (Lex.getKind()) {
1119 result = parseGVEntry(SummaryID);
1122 result = parseModuleEntry(SummaryID);
1125 result = parseTypeIdEntry(SummaryID);
1128 result = parseTypeIdCompatibleVtableEntry(SummaryID);
1131 result = parseSummaryIndexFlags();
1134 result = parseBlockCount();
1137 result =
error(Lex.getLoc(),
"unexpected summary kind");
1140 Lex.setIgnoreColonInIdentifiers(
false);
1174bool LLParser::parseAliasOrIFunc(
const std::string &Name,
unsigned NameID,
1175 LocTy NameLoc,
unsigned L,
unsigned Visibility,
1176 unsigned DLLStorageClass,
bool DSOLocal,
1191 return error(NameLoc,
"invalid linkage type for alias");
1194 return error(NameLoc,
1195 "symbol with local linkage must have default visibility");
1198 return error(NameLoc,
1199 "symbol with local linkage cannot have a DLL storage class");
1202 LocTy ExplicitTypeLoc = Lex.getLoc();
1203 if (parseType(Ty) ||
1204 parseToken(
lltok::comma,
"expected comma after alias or ifunc's type"))
1208 LocTy AliaseeLoc = Lex.getLoc();
1213 if (parseGlobalTypeAndValue(Aliasee))
1218 if (parseValID(
ID,
nullptr))
1221 return error(AliaseeLoc,
"invalid aliasee");
1222 Aliasee =
ID.ConstantVal;
1228 return error(AliaseeLoc,
"An alias or ifunc must have pointer type");
1229 unsigned AddrSpace = PTy->getAddressSpace();
1231 GlobalValue *GVal =
nullptr;
1235 if (!
Name.empty()) {
1236 auto I = ForwardRefVals.find(Name);
1237 if (
I != ForwardRefVals.end()) {
1238 GVal =
I->second.first;
1239 ForwardRefVals.erase(Name);
1240 }
else if (M->getNamedValue(Name)) {
1241 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1244 auto I = ForwardRefValIDs.find(NameID);
1245 if (
I != ForwardRefValIDs.end()) {
1246 GVal =
I->second.first;
1247 ForwardRefValIDs.erase(
I);
1252 std::unique_ptr<GlobalAlias> GA;
1253 std::unique_ptr<GlobalIFunc> GI;
1281 if (parseGlobalObjectMetadataAttachment(*GI))
1284 return tokError(
"unknown alias or ifunc property!");
1289 NumberedVals.add(NameID, GV);
1296 "forward reference and definition of alias have different types");
1306 M->insertAlias(GA.release());
1308 M->insertIFunc(GI.release());
1309 assert(GV->
getName() == Name &&
"Should not be a name conflict!");
1318 case lltok::kw_sanitize_memtag:
1332 switch (Lex.getKind()) {
1334 Meta.NoAddress =
true;
1337 Meta.NoHWAddress =
true;
1339 case lltok::kw_sanitize_memtag:
1343 Meta.IsDynInit =
true;
1346 return tokError(
"non-sanitizer token passed to LLParser::parseSanitizer()");
1366bool LLParser::parseGlobal(
const std::string &Name,
unsigned NameID,
1367 LocTy NameLoc,
unsigned Linkage,
bool HasLinkage,
1368 unsigned Visibility,
unsigned DLLStorageClass,
1372 return error(NameLoc,
1373 "symbol with local linkage must have default visibility");
1376 return error(NameLoc,
1377 "symbol with local linkage cannot have a DLL storage class");
1381 LocTy IsExternallyInitializedLoc;
1385 if (parseOptionalAddrSpace(AddrSpace) ||
1387 IsExternallyInitialized,
1388 &IsExternallyInitializedLoc) ||
1389 parseGlobalType(IsConstant) || parseType(Ty, TyLoc))
1398 if (parseGlobalValue(Ty, Init))
1403 return error(TyLoc,
"invalid type for global variable");
1405 GlobalValue *GVal =
nullptr;
1408 if (!
Name.empty()) {
1409 auto I = ForwardRefVals.find(Name);
1410 if (
I != ForwardRefVals.end()) {
1411 GVal =
I->second.first;
1412 ForwardRefVals.erase(
I);
1413 }
else if (M->getNamedValue(Name)) {
1414 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1419 if (NameID == (
unsigned)-1)
1420 NameID = NumberedVals.getNext();
1422 auto I = ForwardRefValIDs.find(NameID);
1423 if (
I != ForwardRefValIDs.end()) {
1424 GVal =
I->second.first;
1425 ForwardRefValIDs.erase(
I);
1429 GlobalVariable *GV =
new GlobalVariable(
1434 NumberedVals.add(NameID, GV);
1452 "forward reference and definition of global have different types");
1472 }
else if (Lex.getKind() == lltok::kw_align) {
1473 MaybeAlign Alignment;
1474 if (parseOptionalAlignment(Alignment))
1480 if (parseOptionalCodeModel(CodeModel))
1484 if (parseGlobalObjectMetadataAttachment(*GV))
1487 if (parseSanitizer(GV))
1491 if (parseOptionalComdat(Name,
C))
1496 return tokError(
"unknown global variable property!");
1500 AttrBuilder
Attrs(M->getContext());
1502 std::vector<unsigned> FwdRefAttrGrps;
1503 if (parseFnAttributeValuePairs(Attrs, FwdRefAttrGrps,
false, BuiltinLoc))
1505 if (
Attrs.hasAttributes() || !FwdRefAttrGrps.empty()) {
1507 ForwardRefAttrGroups[GV] = FwdRefAttrGrps;
1515bool LLParser::parseUnnamedAttrGrp() {
1517 LocTy AttrGrpLoc = Lex.getLoc();
1521 return tokError(
"expected attribute group id");
1523 unsigned VarID = Lex.getUIntVal();
1524 std::vector<unsigned> unused;
1532 auto R = NumberedAttrBuilders.find(
VarID);
1533 if (R == NumberedAttrBuilders.end())
1534 R = NumberedAttrBuilders.emplace(
VarID, AttrBuilder(M->getContext())).first;
1536 if (parseFnAttributeValuePairs(
R->second, unused,
true, BuiltinLoc) ||
1537 parseToken(
lltok::rbrace,
"expected end of attribute group"))
1540 if (!
R->second.hasAttributes())
1541 return error(AttrGrpLoc,
"attribute group has no attributes");
1548#define GET_ATTR_NAMES
1549#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME) \
1550 case lltok::kw_##DISPLAY_NAME: \
1551 return Attribute::ENUM_NAME;
1552#include "llvm/IR/Attributes.inc"
1561 return parseRequiredTypeAttr(
B, Lex.getKind(), Attr);
1564 case Attribute::Alignment: {
1565 MaybeAlign Alignment;
1573 if (parseOptionalAlignment(Alignment,
true))
1576 B.addAlignmentAttr(Alignment);
1579 case Attribute::StackAlignment: {
1584 parseUInt32(Alignment))
1587 if (parseOptionalStackAlignment(Alignment))
1590 B.addStackAlignmentAttr(Alignment);
1593 case Attribute::AllocSize: {
1594 unsigned ElemSizeArg;
1595 std::optional<unsigned> NumElemsArg;
1596 if (parseAllocSizeArguments(ElemSizeArg, NumElemsArg))
1598 B.addAllocSizeAttr(ElemSizeArg, NumElemsArg);
1601 case Attribute::VScaleRange: {
1602 unsigned MinValue, MaxValue;
1603 if (parseVScaleRangeArguments(MinValue, MaxValue))
1605 B.addVScaleRangeAttr(MinValue,
1606 MaxValue > 0 ? MaxValue : std::optional<unsigned>());
1609 case Attribute::Dereferenceable: {
1610 std::optional<uint64_t> Bytes;
1611 if (parseOptionalAttrBytes(lltok::kw_dereferenceable, Bytes))
1613 assert(Bytes.has_value());
1614 B.addDereferenceableAttr(Bytes.value());
1617 case Attribute::DeadOnReturn: {
1618 std::optional<uint64_t> Bytes;
1619 if (parseOptionalAttrBytes(lltok::kw_dead_on_return, Bytes,
1622 if (Bytes.has_value()) {
1623 B.addDeadOnReturnAttr(DeadOnReturnInfo(Bytes.value()));
1625 B.addDeadOnReturnAttr(DeadOnReturnInfo());
1629 case Attribute::DereferenceableOrNull: {
1630 std::optional<uint64_t> Bytes;
1631 if (parseOptionalAttrBytes(lltok::kw_dereferenceable_or_null, Bytes))
1633 assert(Bytes.has_value());
1634 B.addDereferenceableOrNullAttr(Bytes.value());
1637 case Attribute::UWTable: {
1639 if (parseOptionalUWTableKind(Kind))
1641 B.addUWTableAttr(Kind);
1644 case Attribute::AllocKind: {
1646 if (parseAllocKind(Kind))
1648 B.addAllocKindAttr(Kind);
1651 case Attribute::Memory: {
1652 std::optional<MemoryEffects> ME = parseMemoryAttr();
1655 B.addMemoryAttr(*ME);
1658 case Attribute::NoFPClass: {
1661 B.addNoFPClassAttr(NoFPClass);
1667 case Attribute::Range:
1668 return parseRangeAttr(
B);
1669 case Attribute::Initializes:
1670 return parseInitializesAttr(
B);
1671 case Attribute::Captures:
1672 return parseCapturesAttr(
B);
1674 B.addAttribute(Attr);
1682 case lltok::kw_readnone:
1685 case lltok::kw_readonly:
1688 case lltok::kw_writeonly:
1707bool LLParser::parseFnAttributeValuePairs(AttrBuilder &
B,
1708 std::vector<unsigned> &FwdRefAttrGrps,
1709 bool InAttrGrp, LocTy &BuiltinLoc) {
1710 bool HaveError =
false;
1721 if (parseStringAttribute(
B))
1733 "cannot have an attribute group reference in an attribute group");
1736 FwdRefAttrGrps.push_back(Lex.getUIntVal());
1742 SMLoc Loc = Lex.getLoc();
1743 if (Token == lltok::kw_builtin)
1755 return error(Lex.getLoc(),
"unterminated attribute group");
1758 if (parseEnumAttribute(Attr,
B, InAttrGrp))
1765 HaveError |=
error(Loc,
"this attribute does not apply to functions");
1769 B.addMemoryAttr(ME);
1783 PTy->getAddressSpace());
1792 error(Loc,
"'" + Name +
"' is not a basic block");
1794 error(Loc,
"'" + Name +
"' defined with type '" +
1807 error(Loc,
"global variable reference must have pointer type");
1818 auto I = ForwardRefVals.find(Name);
1819 if (
I != ForwardRefVals.end())
1820 Val =
I->second.first;
1826 checkValidVariableType(Loc,
"@" + Name, Ty, Val));
1830 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
1837 error(Loc,
"global variable reference must have pointer type");
1841 GlobalValue *Val = NumberedVals.get(
ID);
1846 auto I = ForwardRefValIDs.find(
ID);
1847 if (
I != ForwardRefValIDs.end())
1848 Val =
I->second.first;
1854 checkValidVariableType(Loc,
"@" + Twine(
ID), Ty, Val));
1858 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
1866Comdat *LLParser::getComdat(
const std::string &Name, LocTy
Loc) {
1870 if (
I != ComdatSymTab.
end())
1874 Comdat *
C = M->getOrInsertComdat(Name);
1875 ForwardRefComdats[
Name] = Loc;
1885bool LLParser::parseToken(
lltok::Kind T,
const char *ErrMsg) {
1886 if (Lex.getKind() !=
T)
1887 return tokError(ErrMsg);
1894bool LLParser::parseStringConstant(std::string &Result) {
1896 return tokError(
"expected string constant");
1897 Result = Lex.getStrVal();
1904bool LLParser::parseUInt32(uint32_t &Val) {
1905 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1906 return tokError(
"expected integer");
1907 uint64_t Val64 = Lex.getAPSIntVal().getLimitedValue(0xFFFFFFFFULL+1);
1908 if (Val64 !=
unsigned(Val64))
1909 return tokError(
"expected 32-bit integer (too large)");
1917bool LLParser::parseUInt64(uint64_t &Val) {
1918 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1919 return tokError(
"expected integer");
1920 Val = Lex.getAPSIntVal().getLimitedValue();
1930 switch (Lex.getKind()) {
1932 return tokError(
"expected localdynamic, initialexec or localexec");
1960 return parseTLSModel(TLM) ||
1961 parseToken(
lltok::rparen,
"expected ')' after thread local model");
1969bool LLParser::parseOptionalAddrSpace(
unsigned &AddrSpace,
unsigned DefaultAS) {
1970 AddrSpace = DefaultAS;
1974 auto ParseAddrspaceValue = [&](
unsigned &AddrSpace) ->
bool {
1976 const std::string &AddrSpaceStr = Lex.getStrVal();
1977 if (AddrSpaceStr ==
"A") {
1978 AddrSpace = M->getDataLayout().getAllocaAddrSpace();
1979 }
else if (AddrSpaceStr ==
"G") {
1980 AddrSpace = M->getDataLayout().getDefaultGlobalsAddressSpace();
1981 }
else if (AddrSpaceStr ==
"P") {
1982 AddrSpace = M->getDataLayout().getProgramAddressSpace();
1983 }
else if (std::optional<unsigned> AS =
1984 M->getDataLayout().getNamedAddressSpace(AddrSpaceStr)) {
1987 return tokError(
"invalid symbolic addrspace '" + AddrSpaceStr +
"'");
1993 return tokError(
"expected integer or string constant");
1994 SMLoc Loc = Lex.getLoc();
1995 if (parseUInt32(AddrSpace))
1998 return error(Loc,
"invalid address space, must be a 24-bit integer");
2002 return parseToken(
lltok::lparen,
"expected '(' in address space") ||
2003 ParseAddrspaceValue(AddrSpace) ||
2010bool LLParser::parseStringAttribute(AttrBuilder &
B) {
2011 std::string Attr = Lex.getStrVal();
2014 if (EatIfPresent(
lltok::equal) && parseStringConstant(Val))
2016 B.addAttribute(Attr, Val);
2021bool LLParser::parseOptionalParamOrReturnAttrs(AttrBuilder &
B,
bool IsParam) {
2022 bool HaveError =
false;
2029 if (parseStringAttribute(
B))
2040 SMLoc Loc = Lex.getLoc();
2045 if (parseEnumAttribute(Attr,
B,
false))
2049 HaveError |=
error(Loc,
"this attribute does not apply to parameters");
2051 HaveError |=
error(Loc,
"this attribute does not apply to return values");
2099bool LLParser::parseOptionalLinkage(
unsigned &Res,
bool &HasLinkage,
2100 unsigned &Visibility,
2101 unsigned &DLLStorageClass,
bool &DSOLocal) {
2105 parseOptionalDSOLocal(DSOLocal);
2106 parseOptionalVisibility(Visibility);
2107 parseOptionalDLLStorageClass(DLLStorageClass);
2110 return error(Lex.getLoc(),
"dso_location and DLL-StorageClass mismatch");
2116void LLParser::parseOptionalDSOLocal(
bool &DSOLocal) {
2117 switch (Lex.getKind()) {
2138void LLParser::parseOptionalVisibility(
unsigned &Res) {
2139 switch (Lex.getKind()) {
2156bool LLParser::parseOptionalImportType(
lltok::Kind Kind,
2160 return tokError(
"unknown import kind. Expect definition or declaration.");
2175void LLParser::parseOptionalDLLStorageClass(
unsigned &Res) {
2176 switch (Lex.getKind()) {
2246bool LLParser::parseOptionalCallingConv(
unsigned &CC) {
2247 switch (Lex.getKind()) {
2334 return tokError(
"unknown RISC-V ABI VLEN");
2335#define CC_VLS_CASE(ABIVlen) \
2337 CC = CallingConv::RISCV_VLSCall_##ABIVlen; \
2365 return parseUInt32(CC);
2375bool LLParser::parseMetadataAttachment(
unsigned &Kind,
MDNode *&MD) {
2378 std::string
Name = Lex.getStrVal();
2379 Kind = M->getMDKindID(Name);
2382 return parseMDNode(MD);
2387bool LLParser::parseInstructionMetadata(
Instruction &Inst) {
2390 return tokError(
"expected metadata after comma");
2394 if (parseMetadataAttachment(MDK,
N))
2397 if (MDK == LLVMContext::MD_DIAssignID)
2398 TempDIAssignIDAttachments[
N].push_back(&Inst);
2402 if (MDK == LLVMContext::MD_tbaa)
2403 InstsWithTBAATag.push_back(&Inst);
2412bool LLParser::parseGlobalObjectMetadataAttachment(
GlobalObject &GO) {
2415 if (parseMetadataAttachment(MDK,
N))
2424bool LLParser::parseOptionalFunctionMetadata(
Function &
F) {
2426 if (parseGlobalObjectMetadataAttachment(
F))
2434bool LLParser::parseOptionalAlignment(
MaybeAlign &Alignment,
bool AllowParens) {
2435 Alignment = std::nullopt;
2436 if (!EatIfPresent(lltok::kw_align))
2438 LocTy AlignLoc = Lex.getLoc();
2441 LocTy ParenLoc = Lex.getLoc();
2442 bool HaveParens =
false;
2448 if (parseUInt64(
Value))
2452 return error(ParenLoc,
"expected ')'");
2455 return error(AlignLoc,
"alignment is not a power of two");
2457 return error(AlignLoc,
"huge alignments are not supported yet");
2467 auto StrVal = Lex.getStrVal();
2468 auto ErrMsg =
"expected global code model string";
2469 if (StrVal ==
"tiny")
2471 else if (StrVal ==
"small")
2473 else if (StrVal ==
"kernel")
2475 else if (StrVal ==
"medium")
2477 else if (StrVal ==
"large")
2480 return tokError(ErrMsg);
2492bool LLParser::parseOptionalAttrBytes(
lltok::Kind AttrKind,
2493 std::optional<uint64_t> &Bytes,
2494 bool ErrorNoBytes) {
2495 assert((AttrKind == lltok::kw_dereferenceable ||
2496 AttrKind == lltok::kw_dereferenceable_or_null ||
2497 AttrKind == lltok::kw_dead_on_return) &&
2501 if (!EatIfPresent(AttrKind))
2503 LocTy ParenLoc = Lex.getLoc();
2506 return error(ParenLoc,
"expected '('");
2507 Bytes = std::nullopt;
2510 LocTy DerefLoc = Lex.getLoc();
2511 if (parseUInt64(Bytes.value()))
2513 ParenLoc = Lex.getLoc();
2515 return error(ParenLoc,
"expected ')'");
2517 return error(DerefLoc,
"byte count specified must be non-zero");
2521bool LLParser::parseOptionalUWTableKind(
UWTableKind &Kind) {
2526 LocTy KindLoc = Lex.getLoc();
2532 return error(KindLoc,
"expected unwind table kind");
2539 LocTy ParenLoc = Lex.getLoc();
2541 return error(ParenLoc,
"expected '('");
2542 LocTy KindLoc = Lex.getLoc();
2544 if (parseStringConstant(Arg))
2545 return error(KindLoc,
"expected allockind value");
2549 }
else if (
A ==
"realloc") {
2551 }
else if (
A ==
"free") {
2553 }
else if (
A ==
"uninitialized") {
2555 }
else if (
A ==
"zeroed") {
2557 }
else if (
A ==
"aligned") {
2560 return error(KindLoc, Twine(
"unknown allockind ") +
A);
2563 ParenLoc = Lex.getLoc();
2565 return error(ParenLoc,
"expected ')'");
2567 return error(KindLoc,
"expected allockind value");
2584 return std::nullopt;
2599 return std::nullopt;
2603std::optional<MemoryEffects> LLParser::parseMemoryAttr() {
2608 Lex.setIgnoreColonInIdentifiers(
true);
2613 tokError(
"expected '('");
2614 return std::nullopt;
2617 bool SeenLoc =
false;
2619 std::optional<IRMemLocation> Loc =
keywordToLoc(Lex.getKind());
2623 tokError(
"expected ':' after location");
2624 return std::nullopt;
2631 tokError(
"expected memory location (argmem, inaccessiblemem, errnomem) "
2632 "or access kind (none, read, write, readwrite)");
2634 tokError(
"expected access kind (none, read, write, readwrite)");
2635 return std::nullopt;
2644 tokError(
"default access kind must be specified first");
2645 return std::nullopt;
2654 tokError(
"unterminated memory attribute");
2655 return std::nullopt;
2697unsigned LLParser::parseNoFPClassAttr() {
2702 tokError(
"expected '('");
2709 if (TestMask != 0) {
2713 !parseUInt64(
Value)) {
2715 error(Lex.getLoc(),
"invalid mask value for 'nofpclass'");
2720 error(Lex.getLoc(),
"expected ')'");
2726 error(Lex.getLoc(),
"expected nofpclass test mask");
2744bool LLParser::parseOptionalCommaAlign(
MaybeAlign &Alignment,
2745 bool &AteExtraComma) {
2746 AteExtraComma =
false;
2750 AteExtraComma =
true;
2754 if (Lex.getKind() != lltok::kw_align)
2755 return error(Lex.getLoc(),
"expected metadata or 'align'");
2757 if (parseOptionalAlignment(Alignment))
2770bool LLParser::parseOptionalCommaAddrSpace(
unsigned &AddrSpace, LocTy &
Loc,
2771 bool &AteExtraComma) {
2772 AteExtraComma =
false;
2776 AteExtraComma =
true;
2782 return error(Lex.getLoc(),
"expected metadata or 'addrspace'");
2784 if (parseOptionalAddrSpace(AddrSpace))
2791bool LLParser::parseAllocSizeArguments(
unsigned &BaseSizeArg,
2792 std::optional<unsigned> &HowManyArg) {
2795 auto StartParen = Lex.getLoc();
2797 return error(StartParen,
"expected '('");
2799 if (parseUInt32(BaseSizeArg))
2803 auto HowManyAt = Lex.getLoc();
2805 if (parseUInt32(HowMany))
2807 if (HowMany == BaseSizeArg)
2808 return error(HowManyAt,
2809 "'allocsize' indices can't refer to the same parameter");
2810 HowManyArg = HowMany;
2812 HowManyArg = std::nullopt;
2814 auto EndParen = Lex.getLoc();
2816 return error(EndParen,
"expected ')'");
2820bool LLParser::parseVScaleRangeArguments(
unsigned &MinValue,
2821 unsigned &MaxValue) {
2824 auto StartParen = Lex.getLoc();
2826 return error(StartParen,
"expected '('");
2828 if (parseUInt32(MinValue))
2832 if (parseUInt32(MaxValue))
2835 MaxValue = MinValue;
2837 auto EndParen = Lex.getLoc();
2839 return error(EndParen,
"expected ')'");
2848bool LLParser::parseScopeAndOrdering(
bool IsAtomic,
SyncScope::ID &SSID,
2853 return parseScope(SSID) || parseOrdering(Ordering);
2863 auto StartParenAt = Lex.getLoc();
2865 return error(StartParenAt,
"Expected '(' in syncscope");
2868 auto SSNAt = Lex.getLoc();
2869 if (parseStringConstant(SSN))
2870 return error(SSNAt,
"Expected synchronization scope name");
2872 auto EndParenAt = Lex.getLoc();
2874 return error(EndParenAt,
"Expected ')' in syncscope");
2876 SSID = Context.getOrInsertSyncScopeID(SSN);
2887 switch (Lex.getKind()) {
2889 return tokError(
"Expected ordering on atomic instruction");
2908bool LLParser::parseOptionalStackAlignment(
unsigned &Alignment) {
2910 if (!EatIfPresent(lltok::kw_alignstack))
2912 LocTy ParenLoc = Lex.getLoc();
2914 return error(ParenLoc,
"expected '('");
2915 LocTy AlignLoc = Lex.getLoc();
2916 if (parseUInt32(Alignment))
2918 ParenLoc = Lex.getLoc();
2920 return error(ParenLoc,
"expected ')'");
2922 return error(AlignLoc,
"stack alignment is not a power of two");
2936 bool &AteExtraComma) {
2937 AteExtraComma =
false;
2940 return tokError(
"expected ',' as start of index list");
2944 if (Indices.
empty())
2945 return tokError(
"expected index");
2946 AteExtraComma =
true;
2950 if (parseUInt32(Idx))
2963bool LLParser::parseType(
Type *&Result,
const Twine &Msg,
bool AllowVoid) {
2964 SMLoc TypeLoc = Lex.getLoc();
2965 switch (Lex.getKind()) {
2967 return tokError(Msg);
2976 if (
Result->isPointerTy()) {
2978 if (parseOptionalAddrSpace(AddrSpace))
2984 return tokError(
"ptr* is invalid - use ptr instead");
2995 if (parseTargetExtType(Result))
3001 if (parseAnonStructType(Result,
false))
3007 if (parseArrayVectorType(Result,
false))
3014 if (parseAnonStructType(Result,
true) ||
3015 parseToken(
lltok::greater,
"expected '>' at end of packed struct"))
3017 }
else if (parseArrayVectorType(Result,
true))
3022 std::pair<Type*, LocTy> &
Entry = NamedTypes[Lex.getStrVal()];
3028 Entry.second = Lex.getLoc();
3037 std::pair<Type*, LocTy> &
Entry = NumberedTypes[Lex.getUIntVal()];
3043 Entry.second = Lex.getLoc();
3053 switch (Lex.getKind()) {
3056 if (!AllowVoid &&
Result->isVoidTy())
3057 return error(TypeLoc,
"void type only allowed for function results");
3063 return tokError(
"basic block pointers are invalid");
3065 return tokError(
"pointers to void are invalid - use i8* instead");
3067 return tokError(
"pointer to this type is invalid");
3075 return tokError(
"basic block pointers are invalid");
3077 return tokError(
"pointers to void are invalid; use i8* instead");
3079 return tokError(
"pointer to this type is invalid");
3081 if (parseOptionalAddrSpace(AddrSpace) ||
3082 parseToken(
lltok::star,
"expected '*' in address space"))
3091 if (parseFunctionType(Result))
3104 PerFunctionState &PFS,
bool IsMustTailCall,
3105 bool InVarArgsFunc) {
3111 if (!ArgList.
empty() &&
3112 parseToken(
lltok::comma,
"expected ',' in argument list"))
3117 const char *Msg =
"unexpected ellipsis in argument list for ";
3118 if (!IsMustTailCall)
3119 return tokError(Twine(Msg) +
"non-musttail call");
3121 return tokError(Twine(Msg) +
"musttail call in non-varargs function");
3123 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3128 Type *ArgTy =
nullptr;
3130 if (parseType(ArgTy, ArgLoc))
3133 return error(ArgLoc,
"invalid type for function argument");
3135 AttrBuilder ArgAttrs(M->getContext());
3138 if (parseMetadataAsValue(V, PFS))
3142 if (parseOptionalParamAttrs(ArgAttrs) || parseValue(ArgTy, V, PFS))
3149 if (IsMustTailCall && InVarArgsFunc)
3150 return tokError(
"expected '...' at end of argument list for musttail call "
3151 "in varargs function");
3159bool LLParser::parseRequiredTypeAttr(AttrBuilder &
B,
lltok::Kind AttrToken,
3162 if (!EatIfPresent(AttrToken))
3165 return error(Lex.getLoc(),
"expected '('");
3169 return error(Lex.getLoc(),
"expected ')'");
3171 B.addTypeAttr(AttrKind, Ty);
3177bool LLParser::parseRangeAttr(AttrBuilder &
B) {
3185 auto ParseAPSInt = [&](
unsigned BitWidth, APInt &Val) {
3187 return tokError(
"expected integer");
3188 if (Lex.getAPSIntVal().getBitWidth() >
BitWidth)
3190 "integer is too large for the bit width of specified type");
3191 Val = Lex.getAPSIntVal().extend(
BitWidth);
3196 if (parseToken(
lltok::lparen,
"expected '('") || parseType(Ty, TyLoc))
3199 return error(TyLoc,
"the range must have integer type!");
3207 return tokError(
"the range represent the empty set but limits aren't 0!");
3218bool LLParser::parseInitializesAttr(AttrBuilder &
B) {
3221 auto ParseAPSInt = [&](APInt &Val) {
3223 return tokError(
"expected integer");
3224 Val = Lex.getAPSIntVal().extend(64);
3244 return tokError(
"the range should not represent the full or empty set!");
3256 if (!CRLOrNull.has_value())
3257 return tokError(
"Invalid (unordered or overlapping) range list");
3258 B.addInitializesAttr(*CRLOrNull);
3262bool LLParser::parseCapturesAttr(AttrBuilder &
B) {
3264 std::optional<CaptureComponents> Ret;
3268 Lex.setIgnoreColonInIdentifiers(
true);
3276 bool SeenComponent =
false;
3282 return tokError(
"duplicate 'ret' location");
3285 SeenComponent =
false;
3290 return tokError(
"cannot use 'none' with other component");
3294 return tokError(
"cannot use 'none' with other component");
3305 return tokError(
"expected one of 'none', 'address', 'address_is_null', "
3306 "'provenance' or 'read_provenance'");
3309 SeenComponent =
true;
3317 B.addCapturesAttr(CaptureInfo(
Other, Ret.value_or(
Other)));
3330bool LLParser::parseOptionalOperandBundles(
3332 LocTy BeginLoc = Lex.getLoc();
3338 if (!BundleList.
empty() &&
3339 parseToken(
lltok::comma,
"expected ',' in input list"))
3343 if (parseStringConstant(
Tag))
3346 if (parseToken(
lltok::lparen,
"expected '(' in operand bundle"))
3349 std::vector<Value *> Inputs;
3352 if (!Inputs.empty() &&
3353 parseToken(
lltok::comma,
"expected ',' in input list"))
3357 Value *Input =
nullptr;
3361 if (parseMetadataAsValue(Input, PFS))
3363 }
else if (parseValue(Ty, Input, PFS)) {
3366 Inputs.push_back(Input);
3374 if (BundleList.
empty())
3375 return error(BeginLoc,
"operand bundle set must not be empty");
3382 unsigned NextID,
unsigned ID) {
3384 return error(Loc, Kind +
" expected to be numbered '" + Prefix +
3385 Twine(NextID) +
"' or greater");
3402 unsigned CurValID = 0;
3416 LocTy TypeLoc = Lex.getLoc();
3417 Type *ArgTy =
nullptr;
3418 AttrBuilder
Attrs(M->getContext());
3419 if (parseType(ArgTy) || parseOptionalParamAttrs(Attrs))
3423 return error(TypeLoc,
"argument can not have void type");
3427 Name = Lex.getStrVal();
3432 ArgID = Lex.getUIntVal();
3433 if (checkValueID(TypeLoc,
"argument",
"%", CurValID, ArgID))
3440 CurValID = ArgID + 1;
3444 return error(TypeLoc,
"invalid type for function argument");
3452 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3457bool LLParser::parseFunctionType(
Type *&Result) {
3461 return tokError(
"invalid function return type");
3465 SmallVector<unsigned> UnnamedArgNums;
3466 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg))
3470 for (
const ArgInfo &Arg : ArgList) {
3471 if (!Arg.Name.empty())
3472 return error(Arg.Loc,
"argument name invalid in function type");
3473 if (Arg.Attrs.hasAttributes())
3474 return error(Arg.Loc,
"argument attributes invalid in function type");
3478 for (
const ArgInfo &Arg : ArgList)
3487bool LLParser::parseAnonStructType(
Type *&Result,
bool Packed) {
3489 if (parseStructBody(Elts))
3497bool LLParser::parseStructDefinition(
SMLoc TypeLoc,
StringRef Name,
3498 std::pair<Type *, LocTy> &Entry,
3502 return error(TypeLoc,
"redefinition of type");
3508 Entry.second = SMLoc();
3513 ResultTy =
Entry.first;
3525 return error(TypeLoc,
"forward references to non-struct type");
3529 return parseArrayVectorType(ResultTy,
true);
3530 return parseType(ResultTy);
3534 Entry.second = SMLoc();
3543 if (parseStructBody(Body) ||
3544 (isPacked && parseToken(
lltok::greater,
"expected '>' in packed struct")))
3548 return tokError(
toString(std::move(
E)));
3568 LocTy EltTyLoc = Lex.getLoc();
3575 return error(EltTyLoc,
"invalid element type for struct");
3578 EltTyLoc = Lex.getLoc();
3583 return error(EltTyLoc,
"invalid element type for struct");
3588 return parseToken(
lltok::rbrace,
"expected '}' at end of struct");
3597bool LLParser::parseArrayVectorType(
Type *&Result,
bool IsVector) {
3598 bool Scalable =
false;
3602 if (parseToken(
lltok::kw_x,
"expected 'x' after vscale"))
3608 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned() ||
3609 Lex.getAPSIntVal().getBitWidth() > 64)
3610 return tokError(
"expected number in address space");
3612 LocTy SizeLoc = Lex.getLoc();
3613 uint64_t
Size = Lex.getAPSIntVal().getZExtValue();
3616 if (parseToken(
lltok::kw_x,
"expected 'x' after element count"))
3619 LocTy TypeLoc = Lex.getLoc();
3620 Type *EltTy =
nullptr;
3621 if (parseType(EltTy))
3625 "expected end of sequential type"))
3630 return error(SizeLoc,
"zero element vector is illegal");
3632 return error(SizeLoc,
"size too large for vector");
3634 return error(TypeLoc,
"invalid vector element type");
3638 return error(TypeLoc,
"invalid array element type");
3655bool LLParser::parseTargetExtType(
Type *&Result) {
3660 if (parseToken(
lltok::lparen,
"expected '(' in target extension type") ||
3661 parseStringConstant(TypeName))
3668 SmallVector<unsigned> IntParams;
3669 bool SeenInt =
false;
3676 if (parseUInt32(IntVal))
3679 }
else if (SeenInt) {
3682 return tokError(
"expected uint32 param");
3685 if (parseType(TypeParam,
true))
3691 if (parseToken(
lltok::rparen,
"expected ')' in target extension type"))
3696 if (
auto E = TTy.takeError())
3697 return tokError(
toString(std::move(
E)));
3710 :
P(
p),
F(
f), FunctionNumber(functionNumber) {
3713 auto It = UnnamedArgNums.
begin();
3716 unsigned ArgNum = *It++;
3717 NumberedVals.add(ArgNum, &A);
3722LLParser::PerFunctionState::~PerFunctionState() {
3725 for (
const auto &P : ForwardRefVals) {
3728 P.second.first->replaceAllUsesWith(
3730 P.second.first->deleteValue();
3733 for (
const auto &P : ForwardRefValIDs) {
3736 P.second.first->replaceAllUsesWith(
3738 P.second.first->deleteValue();
3742bool LLParser::PerFunctionState::finishFunction() {
3743 if (!ForwardRefVals.empty())
3744 return P.error(ForwardRefVals.begin()->second.second,
3745 "use of undefined value '%" + ForwardRefVals.begin()->first +
3747 if (!ForwardRefValIDs.empty())
3748 return P.error(ForwardRefValIDs.begin()->second.second,
3749 "use of undefined value '%" +
3750 Twine(ForwardRefValIDs.begin()->first) +
"'");
3757Value *LLParser::PerFunctionState::getVal(
const std::string &Name,
Type *Ty,
3760 Value *Val =
F.getValueSymbolTable()->lookup(Name);
3765 auto I = ForwardRefVals.find(Name);
3766 if (
I != ForwardRefVals.end())
3767 Val =
I->second.first;
3772 return P.checkValidVariableType(Loc,
"%" + Name, Ty, Val);
3776 P.error(Loc,
"invalid use of a non-first-class type");
3787 if (FwdVal->
getName() != Name) {
3788 P.error(Loc,
"name is too long which can result in name collisions, "
3789 "consider making the name shorter or "
3790 "increasing -non-global-value-max-name-size");
3794 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
3798Value *LLParser::PerFunctionState::getVal(
unsigned ID,
Type *Ty,
LocTy Loc) {
3800 Value *Val = NumberedVals.get(
ID);
3805 auto I = ForwardRefValIDs.find(
ID);
3806 if (
I != ForwardRefValIDs.end())
3807 Val =
I->second.first;
3812 return P.checkValidVariableType(Loc,
"%" + Twine(
ID), Ty, Val);
3815 P.error(Loc,
"invalid use of a non-first-class type");
3827 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
3833bool LLParser::PerFunctionState::setInstName(
int NameID,
3834 const std::string &NameStr,
3835 LocTy NameLoc, Instruction *Inst) {
3838 if (NameID != -1 || !NameStr.empty())
3839 return P.error(NameLoc,
"instructions returning void cannot have a name");
3845 if (NameStr.empty()) {
3848 NameID = NumberedVals.getNext();
3850 if (
P.checkValueID(NameLoc,
"instruction",
"%", NumberedVals.getNext(),
3854 auto FI = ForwardRefValIDs.find(NameID);
3855 if (FI != ForwardRefValIDs.end()) {
3858 return P.error(NameLoc,
"instruction forward referenced with type '" +
3862 Sentinel->replaceAllUsesWith(Inst);
3864 ForwardRefValIDs.erase(FI);
3867 NumberedVals.add(NameID, Inst);
3872 auto FI = ForwardRefVals.find(NameStr);
3873 if (FI != ForwardRefVals.end()) {
3876 return P.error(NameLoc,
"instruction forward referenced with type '" +
3880 Sentinel->replaceAllUsesWith(Inst);
3882 ForwardRefVals.erase(FI);
3888 if (Inst->
getName() != NameStr)
3889 return P.error(NameLoc,
"multiple definition of local value named '" +
3896BasicBlock *LLParser::PerFunctionState::getBB(
const std::string &Name,
3910BasicBlock *LLParser::PerFunctionState::defineBB(
const std::string &Name,
3911 int NameID,
LocTy Loc) {
3915 if (
P.checkValueID(Loc,
"label",
"", NumberedVals.getNext(), NameID))
3918 NameID = NumberedVals.getNext();
3920 BB = getBB(NameID, Loc);
3922 P.error(Loc,
"unable to create block numbered '" + Twine(NameID) +
"'");
3926 BB = getBB(Name, Loc);
3928 P.error(Loc,
"unable to create block named '" + Name +
"'");
3939 ForwardRefValIDs.erase(NameID);
3940 NumberedVals.add(NameID, BB);
3943 ForwardRefVals.erase(Name);
3960bool LLParser::parseValID(ValID &
ID, PerFunctionState *PFS,
Type *ExpectedTy) {
3961 ID.Loc = Lex.getLoc();
3962 switch (Lex.getKind()) {
3964 return tokError(
"expected value token");
3966 ID.UIntVal = Lex.getUIntVal();
3970 ID.StrVal = Lex.getStrVal();
3974 ID.UIntVal = Lex.getUIntVal();
3978 ID.StrVal = Lex.getStrVal();
3982 ID.APSIntVal = Lex.getAPSIntVal();
3986 ID.APFloatVal = Lex.getAPFloatVal();
4007 if (parseGlobalValueVector(Elts) ||
4008 parseToken(
lltok::rbrace,
"expected end of struct constant"))
4011 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4012 ID.UIntVal = Elts.
size();
4013 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4014 Elts.
size() *
sizeof(Elts[0]));
4025 LocTy FirstEltLoc = Lex.getLoc();
4026 if (parseGlobalValueVector(Elts) ||
4028 parseToken(
lltok::rbrace,
"expected end of packed struct")) ||
4032 if (isPackedStruct) {
4033 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4034 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4035 Elts.
size() *
sizeof(Elts[0]));
4036 ID.UIntVal = Elts.
size();
4042 return error(
ID.Loc,
"constant vector must not be empty");
4044 if (!Elts[0]->
getType()->isIntegerTy() &&
4045 !Elts[0]->
getType()->isFloatingPointTy() &&
4049 "vector elements must have integer, pointer or floating point type");
4052 for (
unsigned i = 1, e = Elts.
size(); i != e; ++i)
4054 return error(FirstEltLoc,
"vector element #" + Twine(i) +
4055 " is not of type '" +
4065 LocTy FirstEltLoc = Lex.getLoc();
4066 if (parseGlobalValueVector(Elts) ||
4078 if (!Elts[0]->
getType()->isFirstClassType())
4079 return error(FirstEltLoc,
"invalid array element type: " +
4085 for (
unsigned i = 0, e = Elts.
size(); i != e; ++i) {
4087 return error(FirstEltLoc,
"array element #" + Twine(i) +
4088 " is not of type '" +
4108 bool HasSideEffect, AlignStack, AsmDialect, CanThrow;
4111 parseOptionalToken(lltok::kw_alignstack, AlignStack) ||
4114 parseStringConstant(
ID.StrVal) ||
4115 parseToken(
lltok::comma,
"expected comma in inline asm expression") ||
4118 ID.StrVal2 = Lex.getStrVal();
4119 ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack) << 1) |
4120 (
unsigned(AsmDialect) << 2) | (unsigned(CanThrow) << 3);
4131 if (parseToken(
lltok::lparen,
"expected '(' in block address expression") ||
4132 parseValID(Fn, PFS) ||
4134 "expected comma in block address expression") ||
4135 parseValID(Label, PFS) ||
4136 parseToken(
lltok::rparen,
"expected ')' in block address expression"))
4140 return error(Fn.
Loc,
"expected function name in blockaddress");
4142 return error(
Label.Loc,
"expected basic block name in blockaddress");
4145 GlobalValue *GV =
nullptr;
4147 GV = NumberedVals.get(Fn.
UIntVal);
4148 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4149 GV = M->getNamedValue(Fn.
StrVal);
4155 return error(Fn.
Loc,
"expected function name in blockaddress");
4157 if (
F->isDeclaration())
4158 return error(Fn.
Loc,
"cannot take blockaddress inside a declaration");
4163 GlobalValue *&FwdRef =
4164 ForwardRefBlockAddresses[std::move(Fn)][std::move(Label)];
4172 "type of blockaddress must be a pointer and not '" +
4177 FwdDeclAS = PFS->getFunction().getAddressSpace();
4181 FwdRef =
new GlobalVariable(
4186 ID.ConstantVal = FwdRef;
4194 if (BlockAddressPFS &&
F == &BlockAddressPFS->getFunction()) {
4196 BB = BlockAddressPFS->getBB(
Label.UIntVal,
Label.Loc);
4198 BB = BlockAddressPFS->getBB(
Label.StrVal,
Label.Loc);
4200 return error(
Label.Loc,
"referenced value is not a basic block");
4203 return error(
Label.Loc,
"cannot take address of numeric label after "
4204 "the function is defined");
4206 F->getValueSymbolTable()->lookup(
Label.StrVal));
4208 return error(
Label.Loc,
"referenced value is not a basic block");
4222 if (parseValID(Fn, PFS))
4227 "expected global value name in dso_local_equivalent");
4230 GlobalValue *GV =
nullptr;
4232 GV = NumberedVals.get(Fn.
UIntVal);
4233 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4234 GV = M->getNamedValue(Fn.
StrVal);
4240 ? ForwardRefDSOLocalEquivalentIDs
4241 : ForwardRefDSOLocalEquivalentNames;
4242 GlobalValue *&FwdRef = FwdRefMap[Fn];
4249 ID.ConstantVal = FwdRef;
4255 return error(Fn.
Loc,
"expected a function, alias to function, or ifunc "
4256 "in dso_local_equivalent");
4267 if (parseValID(
ID, PFS))
4271 return error(
ID.Loc,
"expected global value name in no_cfi");
4283 Constant *Disc =
nullptr, *AddrDisc =
nullptr,
4284 *DeactivationSymbol =
nullptr;
4287 "expected '(' in constant ptrauth expression") ||
4288 parseGlobalTypeAndValue(Ptr) ||
4290 "expected comma in constant ptrauth expression") ||
4291 parseGlobalTypeAndValue(
Key))
4294 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(Disc))
4296 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(AddrDisc))
4299 parseGlobalTypeAndValue(DeactivationSymbol))
4302 "expected ')' in constant ptrauth expression"))
4306 return error(
ID.Loc,
"constant ptrauth base pointer must be a pointer");
4309 if (!KeyC || KeyC->getBitWidth() != 32)
4310 return error(
ID.Loc,
"constant ptrauth key must be i32 constant");
4312 ConstantInt *DiscC =
nullptr;
4318 "constant ptrauth integer discriminator must be i64 constant");
4324 if (!AddrDisc->getType()->isPointerTy())
4326 ID.Loc,
"constant ptrauth address discriminator must be a pointer");
4331 if (!DeactivationSymbol)
4332 DeactivationSymbol =
4334 if (!DeactivationSymbol->getType()->isPointerTy())
4336 "constant ptrauth deactivation symbol must be a pointer");
4350 unsigned Opc = Lex.getUIntVal();
4351 Type *DestTy =
nullptr;
4354 if (parseToken(
lltok::lparen,
"expected '(' after constantexpr cast") ||
4355 parseGlobalTypeAndValue(SrcVal) ||
4356 parseToken(
lltok::kw_to,
"expected 'to' in constantexpr cast") ||
4357 parseType(DestTy) ||
4358 parseToken(
lltok::rparen,
"expected ')' at end of constantexpr cast"))
4361 return error(
ID.Loc,
"invalid cast opcode for cast from '" +
4370 return error(
ID.Loc,
"extractvalue constexprs are no longer supported");
4372 return error(
ID.Loc,
"insertvalue constexprs are no longer supported");
4374 return error(
ID.Loc,
"udiv constexprs are no longer supported");
4376 return error(
ID.Loc,
"sdiv constexprs are no longer supported");
4378 return error(
ID.Loc,
"urem constexprs are no longer supported");
4380 return error(
ID.Loc,
"srem constexprs are no longer supported");
4382 return error(
ID.Loc,
"fadd constexprs are no longer supported");
4384 return error(
ID.Loc,
"fsub constexprs are no longer supported");
4386 return error(
ID.Loc,
"fmul constexprs are no longer supported");
4388 return error(
ID.Loc,
"fdiv constexprs are no longer supported");
4390 return error(
ID.Loc,
"frem constexprs are no longer supported");
4392 return error(
ID.Loc,
"and constexprs are no longer supported");
4394 return error(
ID.Loc,
"or constexprs are no longer supported");
4396 return error(
ID.Loc,
"lshr constexprs are no longer supported");
4398 return error(
ID.Loc,
"ashr constexprs are no longer supported");
4400 return error(
ID.Loc,
"shl constexprs are no longer supported");
4402 return error(
ID.Loc,
"mul constexprs are no longer supported");
4404 return error(
ID.Loc,
"fneg constexprs are no longer supported");
4406 return error(
ID.Loc,
"select constexprs are no longer supported");
4408 return error(
ID.Loc,
"zext constexprs are no longer supported");
4410 return error(
ID.Loc,
"sext constexprs are no longer supported");
4412 return error(
ID.Loc,
"fptrunc constexprs are no longer supported");
4414 return error(
ID.Loc,
"fpext constexprs are no longer supported");
4416 return error(
ID.Loc,
"uitofp constexprs are no longer supported");
4418 return error(
ID.Loc,
"sitofp constexprs are no longer supported");
4420 return error(
ID.Loc,
"fptoui constexprs are no longer supported");
4422 return error(
ID.Loc,
"fptosi constexprs are no longer supported");
4424 return error(
ID.Loc,
"icmp constexprs are no longer supported");
4426 return error(
ID.Loc,
"fcmp constexprs are no longer supported");
4434 unsigned Opc = Lex.getUIntVal();
4437 if (
Opc == Instruction::Add ||
Opc == Instruction::Sub ||
4438 Opc == Instruction::Mul) {
4447 if (parseToken(
lltok::lparen,
"expected '(' in binary constantexpr") ||
4448 parseGlobalTypeAndValue(Val0) ||
4449 parseToken(
lltok::comma,
"expected comma in binary constantexpr") ||
4450 parseGlobalTypeAndValue(Val1) ||
4451 parseToken(
lltok::rparen,
"expected ')' in binary constantexpr"))
4454 return error(
ID.Loc,
"operands of constexpr must have same type");
4458 "constexpr requires integer or integer vector operands");
4469 if (parseToken(
lltok::lparen,
"expected '(' after vector splat"))
4472 if (parseGlobalTypeAndValue(
C))
4474 if (parseToken(
lltok::rparen,
"expected ')' at end of vector splat"))
4486 unsigned Opc = Lex.getUIntVal();
4489 bool HasInRange =
false;
4495 if (
Opc == Instruction::GetElementPtr) {
4511 return tokError(
"expected integer");
4512 InRangeStart = Lex.getAPSIntVal();
4517 return tokError(
"expected integer");
4518 InRangeEnd = Lex.getAPSIntVal();
4526 if (parseToken(
lltok::lparen,
"expected '(' in constantexpr"))
4529 if (
Opc == Instruction::GetElementPtr) {
4530 if (parseType(Ty) ||
4531 parseToken(
lltok::comma,
"expected comma after getelementptr's type"))
4535 if (parseGlobalValueVector(Elts) ||
4539 if (
Opc == Instruction::GetElementPtr) {
4540 if (Elts.
size() == 0 ||
4541 !Elts[0]->getType()->isPtrOrPtrVectorTy())
4542 return error(
ID.Loc,
"base of getelementptr must be a pointer");
4545 std::optional<ConstantRange>
InRange;
4547 unsigned IndexWidth =
4548 M->getDataLayout().getIndexTypeSizeInBits(
BaseType);
4549 InRangeStart = InRangeStart.
extOrTrunc(IndexWidth);
4550 InRangeEnd = InRangeEnd.
extOrTrunc(IndexWidth);
4551 if (InRangeStart.
sge(InRangeEnd))
4552 return error(
ID.Loc,
"expected end to be larger than start");
4562 for (Constant *Val : Indices) {
4565 return error(
ID.Loc,
"getelementptr index must be an integer");
4568 if (GEPWidth && (ValNumEl != GEPWidth))
4571 "getelementptr vector index has a wrong number of elements");
4574 GEPWidth = ValNumEl;
4578 SmallPtrSet<Type*, 4> Visited;
4579 if (!Indices.empty() && !Ty->
isSized(&Visited))
4580 return error(
ID.Loc,
"base element of getelementptr must be sized");
4583 return error(
ID.Loc,
"invalid base element for constant getelementptr");
4586 return error(
ID.Loc,
"invalid getelementptr indices");
4590 }
else if (
Opc == Instruction::ShuffleVector) {
4591 if (Elts.
size() != 3)
4592 return error(
ID.Loc,
"expected three operands to shufflevector");
4594 return error(
ID.Loc,
"invalid operands to shufflevector");
4595 SmallVector<int, 16>
Mask;
4598 }
else if (
Opc == Instruction::ExtractElement) {
4599 if (Elts.
size() != 2)
4600 return error(
ID.Loc,
"expected two operands to extractelement");
4602 return error(
ID.Loc,
"invalid extractelement operands");
4605 assert(
Opc == Instruction::InsertElement &&
"Unknown opcode");
4606 if (Elts.
size() != 3)
4607 return error(
ID.Loc,
"expected three operands to insertelement");
4609 return error(
ID.Loc,
"invalid insertelement operands");
4624bool LLParser::parseGlobalValue(
Type *Ty, Constant *&
C) {
4628 bool Parsed = parseValID(
ID,
nullptr, Ty) ||
4629 convertValIDToValue(Ty,
ID, V,
nullptr);
4631 return error(
ID.Loc,
"global values must be constants");
4635bool LLParser::parseGlobalTypeAndValue(Constant *&V) {
4637 return parseType(Ty) || parseGlobalValue(Ty, V);
4640bool LLParser::parseOptionalComdat(StringRef GlobalName, Comdat *&
C) {
4643 LocTy KwLoc = Lex.getLoc();
4649 return tokError(
"expected comdat variable");
4650 C = getComdat(Lex.getStrVal(), Lex.getLoc());
4652 if (parseToken(
lltok::rparen,
"expected ')' after comdat var"))
4655 if (GlobalName.
empty())
4656 return tokError(
"comdat cannot be unnamed");
4657 C = getComdat(std::string(GlobalName), KwLoc);
4666bool LLParser::parseGlobalValueVector(SmallVectorImpl<Constant *> &Elts) {
4680 if (parseGlobalTypeAndValue(
C))
4688bool LLParser::parseMDTuple(MDNode *&MD,
bool IsDistinct) {
4690 if (parseMDNodeVector(Elts))
4701bool LLParser::parseMDNode(MDNode *&
N) {
4703 return parseSpecializedMDNode(
N);
4705 return parseToken(
lltok::exclaim,
"expected '!' here") || parseMDNodeTail(
N);
4708bool LLParser::parseMDNodeTail(MDNode *&
N) {
4711 return parseMDTuple(
N);
4714 return parseMDNodeID(
N);
4720template <
class FieldTy>
struct MDFieldImpl {
4721 typedef MDFieldImpl ImplTy;
4725 void assign(FieldTy Val) {
4727 this->Val = std::move(Val);
4730 explicit MDFieldImpl(FieldTy
Default)
4738template <
class FieldTypeA,
class FieldTypeB>
struct MDEitherFieldImpl {
4739 typedef MDEitherFieldImpl<FieldTypeA, FieldTypeB> ImplTy;
4750 void assign(FieldTypeA
A) {
4752 this->
A = std::move(
A);
4756 void assign(FieldTypeB
B) {
4758 this->
B = std::move(
B);
4762 explicit MDEitherFieldImpl(FieldTypeA DefaultA, FieldTypeB DefaultB)
4764 WhatIs(IsInvalid) {}
4767struct MDUnsignedField :
public MDFieldImpl<uint64_t> {
4774struct LineField :
public MDUnsignedField {
4775 LineField() : MDUnsignedField(0, UINT32_MAX) {}
4778struct ColumnField :
public MDUnsignedField {
4779 ColumnField() : MDUnsignedField(0, UINT16_MAX) {}
4782struct DwarfTagField :
public MDUnsignedField {
4788struct DwarfMacinfoTypeField :
public MDUnsignedField {
4794struct DwarfAttEncodingField :
public MDUnsignedField {
4795 DwarfAttEncodingField() : MDUnsignedField(0, dwarf::
DW_ATE_hi_user) {}
4798struct DwarfVirtualityField :
public MDUnsignedField {
4802struct DwarfLangField :
public MDUnsignedField {
4806struct DwarfSourceLangNameField :
public MDUnsignedField {
4807 DwarfSourceLangNameField() : MDUnsignedField(0, UINT32_MAX) {}
4810struct DwarfCCField :
public MDUnsignedField {
4811 DwarfCCField() : MDUnsignedField(0, dwarf::
DW_CC_hi_user) {}
4814struct DwarfEnumKindField :
public MDUnsignedField {
4815 DwarfEnumKindField()
4820struct EmissionKindField :
public MDUnsignedField {
4821 EmissionKindField() : MDUnsignedField(0, DICompileUnit::LastEmissionKind) {}
4824struct FixedPointKindField :
public MDUnsignedField {
4825 FixedPointKindField()
4826 : MDUnsignedField(0, DIFixedPointType::LastFixedPointKind) {}
4829struct NameTableKindField :
public MDUnsignedField {
4830 NameTableKindField()
4833 DICompileUnit::DebugNameTableKind::LastDebugNameTableKind) {}
4836struct DIFlagField :
public MDFieldImpl<DINode::DIFlags> {
4837 DIFlagField() : MDFieldImpl(DINode::FlagZero) {}
4840struct DISPFlagField :
public MDFieldImpl<DISubprogram::DISPFlags> {
4841 DISPFlagField() : MDFieldImpl(DISubprogram::SPFlagZero) {}
4844struct MDAPSIntField :
public MDFieldImpl<APSInt> {
4845 MDAPSIntField() : ImplTy(
APSInt()) {}
4848struct MDSignedField :
public MDFieldImpl<int64_t> {
4852 MDSignedField(int64_t
Default = 0)
4854 MDSignedField(int64_t
Default, int64_t Min, int64_t Max)
4858struct MDBoolField :
public MDFieldImpl<bool> {
4862struct MDField :
public MDFieldImpl<Metadata *> {
4865 MDField(
bool AllowNull =
true) : ImplTy(nullptr), AllowNull(AllowNull) {}
4868struct MDStringField :
public MDFieldImpl<MDString *> {
4869 enum class EmptyIs {
4874 MDStringField(
enum EmptyIs EmptyIs = EmptyIs::Null)
4875 : ImplTy(nullptr), EmptyIs(EmptyIs) {}
4878struct MDFieldList :
public MDFieldImpl<SmallVector<Metadata *, 4>> {
4882struct ChecksumKindField :
public MDFieldImpl<DIFile::ChecksumKind> {
4886struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
4887 MDSignedOrMDField(int64_t
Default = 0,
bool AllowNull =
true)
4888 : ImplTy(MDSignedField(
Default), MDField(AllowNull)) {}
4890 MDSignedOrMDField(int64_t
Default, int64_t Min, int64_t Max,
4891 bool AllowNull =
true)
4892 : ImplTy(MDSignedField(
Default, Min,
Max), MDField(AllowNull)) {}
4894 bool isMDSignedField()
const {
return WhatIs == IsTypeA; }
4895 bool isMDField()
const {
return WhatIs == IsTypeB; }
4896 int64_t getMDSignedValue()
const {
4897 assert(isMDSignedField() &&
"Wrong field type");
4900 Metadata *getMDFieldValue()
const {
4901 assert(isMDField() &&
"Wrong field type");
4906struct MDUnsignedOrMDField : MDEitherFieldImpl<MDUnsignedField, MDField> {
4907 MDUnsignedOrMDField(uint64_t
Default = 0,
bool AllowNull =
true)
4908 : ImplTy(MDUnsignedField(
Default), MDField(AllowNull)) {}
4910 MDUnsignedOrMDField(uint64_t
Default, uint64_t Max,
bool AllowNull =
true)
4911 : ImplTy(MDUnsignedField(
Default,
Max), MDField(AllowNull)) {}
4913 bool isMDUnsignedField()
const {
return WhatIs == IsTypeA; }
4914 bool isMDField()
const {
return WhatIs == IsTypeB; }
4915 uint64_t getMDUnsignedValue()
const {
4916 assert(isMDUnsignedField() &&
"Wrong field type");
4919 Metadata *getMDFieldValue()
const {
4920 assert(isMDField() &&
"Wrong field type");
4925 if (isMDUnsignedField())
4927 ConstantInt::get(Type::getInt64Ty(
Context), getMDUnsignedValue()));
4929 return getMDFieldValue();
4941 return tokError(
"expected integer");
4943 Result.assign(Lex.getAPSIntVal());
4950 MDUnsignedField &Result) {
4951 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
4952 return tokError(
"expected unsigned integer");
4954 auto &U = Lex.getAPSIntVal();
4955 if (U.ugt(Result.Max))
4956 return tokError(
"value for '" + Name +
"' too large, limit is " +
4958 Result.assign(U.getZExtValue());
4959 assert(Result.Val <= Result.Max &&
"Expected value in range");
4966 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4970 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4976 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4979 return tokError(
"expected DWARF tag");
4983 return tokError(
"invalid DWARF tag" +
Twine(
" '") + Lex.getStrVal() +
"'");
4984 assert(
Tag <= Result.Max &&
"Expected valid DWARF tag");
4993 DwarfMacinfoTypeField &Result) {
4995 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4998 return tokError(
"expected DWARF macinfo type");
5002 return tokError(
"invalid DWARF macinfo type" +
Twine(
" '") +
5003 Lex.getStrVal() +
"'");
5004 assert(Macinfo <= Result.Max &&
"Expected valid DWARF macinfo type");
5006 Result.assign(Macinfo);
5013 DwarfVirtualityField &Result) {
5015 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5018 return tokError(
"expected DWARF virtuality code");
5022 return tokError(
"invalid DWARF virtuality code" +
Twine(
" '") +
5023 Lex.getStrVal() +
"'");
5024 assert(Virtuality <= Result.Max &&
"Expected valid DWARF virtuality code");
5025 Result.assign(Virtuality);
5032 DwarfEnumKindField &Result) {
5034 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5037 return tokError(
"expected DWARF enum kind code");
5041 return tokError(
"invalid DWARF enum kind code" +
Twine(
" '") +
5042 Lex.getStrVal() +
"'");
5043 assert(EnumKind <= Result.Max &&
"Expected valid DWARF enum kind code");
5044 Result.assign(EnumKind);
5052 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5055 return tokError(
"expected DWARF language");
5059 return tokError(
"invalid DWARF language" +
Twine(
" '") + Lex.getStrVal() +
5061 assert(Lang <= Result.Max &&
"Expected valid DWARF language");
5062 Result.assign(Lang);
5069 DwarfSourceLangNameField &Result) {
5071 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5074 return tokError(
"expected DWARF source language name");
5078 return tokError(
"invalid DWARF source language name" +
Twine(
" '") +
5079 Lex.getStrVal() +
"'");
5080 assert(Lang <= Result.Max &&
"Expected valid DWARF source language name");
5081 Result.assign(Lang);
5089 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5092 return tokError(
"expected DWARF calling convention");
5096 return tokError(
"invalid DWARF calling convention" +
Twine(
" '") +
5097 Lex.getStrVal() +
"'");
5098 assert(CC <= Result.Max &&
"Expected valid DWARF calling convention");
5106 EmissionKindField &Result) {
5108 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5111 return tokError(
"expected emission kind");
5115 return tokError(
"invalid emission kind" +
Twine(
" '") + Lex.getStrVal() +
5117 assert(*Kind <= Result.Max &&
"Expected valid emission kind");
5118 Result.assign(*Kind);
5125 FixedPointKindField &Result) {
5127 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5130 return tokError(
"expected fixed-point kind");
5134 return tokError(
"invalid fixed-point kind" +
Twine(
" '") + Lex.getStrVal() +
5136 assert(*Kind <= Result.Max &&
"Expected valid fixed-point kind");
5137 Result.assign(*Kind);
5144 NameTableKindField &Result) {
5146 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5149 return tokError(
"expected nameTable kind");
5153 return tokError(
"invalid nameTable kind" +
Twine(
" '") + Lex.getStrVal() +
5155 assert(((
unsigned)*Kind) <= Result.Max &&
"Expected valid nameTable kind");
5156 Result.assign((
unsigned)*Kind);
5163 DwarfAttEncodingField &Result) {
5165 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5168 return tokError(
"expected DWARF type attribute encoding");
5172 return tokError(
"invalid DWARF type attribute encoding" +
Twine(
" '") +
5173 Lex.getStrVal() +
"'");
5174 assert(Encoding <= Result.Max &&
"Expected valid DWARF language");
5175 Result.assign(Encoding);
5189 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5191 bool Res = parseUInt32(TempVal);
5197 return tokError(
"expected debug info flag");
5201 return tokError(
Twine(
"invalid debug info flag '") + Lex.getStrVal() +
5216 Result.assign(Combined);
5229 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5231 bool Res = parseUInt32(TempVal);
5237 return tokError(
"expected debug info flag");
5241 return tokError(
Twine(
"invalid subprogram debug info flag '") +
5242 Lex.getStrVal() +
"'");
5256 Result.assign(Combined);
5263 return tokError(
"expected signed integer");
5265 auto &S = Lex.getAPSIntVal();
5267 return tokError(
"value for '" + Name +
"' too small, limit is " +
5270 return tokError(
"value for '" + Name +
"' too large, limit is " +
5272 Result.assign(S.getExtValue());
5273 assert(Result.Val >= Result.Min &&
"Expected value in range");
5274 assert(Result.Val <= Result.Max &&
"Expected value in range");
5281 switch (Lex.getKind()) {
5283 return tokError(
"expected 'true' or 'false'");
5285 Result.assign(
true);
5288 Result.assign(
false);
5298 if (!Result.AllowNull)
5299 return tokError(
"'" + Name +
"' cannot be null");
5301 Result.assign(
nullptr);
5306 if (parseMetadata(MD,
nullptr))
5315 MDSignedOrMDField &Result) {
5318 MDSignedField Res = Result.A;
5319 if (!parseMDField(
Loc, Name, Res)) {
5327 MDField Res = Result.B;
5328 if (!parseMDField(
Loc, Name, Res)) {
5338 MDUnsignedOrMDField &Result) {
5341 MDUnsignedField Res = Result.A;
5342 if (!parseMDField(
Loc, Name, Res)) {
5350 MDField Res = Result.B;
5351 if (!parseMDField(
Loc, Name, Res)) {
5361 LocTy ValueLoc = Lex.getLoc();
5363 if (parseStringConstant(S))
5367 switch (Result.EmptyIs) {
5368 case MDStringField::EmptyIs::Null:
5369 Result.assign(
nullptr);
5371 case MDStringField::EmptyIs::Empty:
5373 case MDStringField::EmptyIs::Error:
5374 return error(ValueLoc,
"'" + Name +
"' cannot be empty");
5385 if (parseMDNodeVector(MDs))
5388 Result.assign(std::move(MDs));
5394 ChecksumKindField &Result) {
5395 std::optional<DIFile::ChecksumKind> CSKind =
5399 return tokError(
"invalid checksum kind" +
Twine(
" '") + Lex.getStrVal() +
5402 Result.assign(*CSKind);
5409template <
class ParserTy>
5410bool LLParser::parseMDFieldsImplBody(ParserTy ParseField) {
5413 return tokError(
"expected field label here");
5422template <
class ParserTy>
5423bool LLParser::parseMDFieldsImpl(ParserTy ParseField, LocTy &ClosingLoc) {
5430 if (parseMDFieldsImplBody(ParseField))
5433 ClosingLoc = Lex.getLoc();
5437template <
class FieldTy>
5438bool LLParser::parseMDField(
StringRef Name, FieldTy &Result) {
5440 return tokError(
"field '" + Name +
"' cannot be specified more than once");
5442 LocTy Loc = Lex.getLoc();
5444 return parseMDField(Loc, Name, Result);
5447bool LLParser::parseSpecializedMDNode(
MDNode *&
N,
bool IsDistinct) {
5450#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
5451 if (Lex.getStrVal() == #CLASS) \
5452 return parse##CLASS(N, IsDistinct);
5453#include "llvm/IR/Metadata.def"
5455 return tokError(
"expected metadata type");
5458#define DECLARE_FIELD(NAME, TYPE, INIT) TYPE NAME INIT
5459#define NOP_FIELD(NAME, TYPE, INIT)
5460#define REQUIRE_FIELD(NAME, TYPE, INIT) \
5462 return error(ClosingLoc, "missing required field '" #NAME "'");
5463#define PARSE_MD_FIELD(NAME, TYPE, DEFAULT) \
5464 if (Lex.getStrVal() == #NAME) \
5465 return parseMDField(#NAME, NAME);
5466#define PARSE_MD_FIELDS() \
5467 VISIT_MD_FIELDS(DECLARE_FIELD, DECLARE_FIELD) \
5470 if (parseMDFieldsImpl( \
5472 VISIT_MD_FIELDS(PARSE_MD_FIELD, PARSE_MD_FIELD) \
5473 return tokError(Twine("invalid field '") + Lex.getStrVal() + \
5478 VISIT_MD_FIELDS(NOP_FIELD, REQUIRE_FIELD) \
5480#define GET_OR_DISTINCT(CLASS, ARGS) \
5481 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
5486bool LLParser::parseDILocation(
MDNode *&Result,
bool IsDistinct) {
5487#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5488 OPTIONAL(line, LineField, ); \
5489 OPTIONAL(column, ColumnField, ); \
5490 REQUIRED(scope, MDField, ( false)); \
5491 OPTIONAL(inlinedAt, MDField, ); \
5492 OPTIONAL(isImplicitCode, MDBoolField, (false)); \
5493 OPTIONAL(atomGroup, MDUnsignedField, (0, UINT64_MAX)); \
5494 OPTIONAL(atomRank, MDUnsignedField, (0, UINT8_MAX));
5496#undef VISIT_MD_FIELDS
5499 DILocation, (Context, line.Val, column.Val, scope.Val, inlinedAt.Val,
5500 isImplicitCode.Val, atomGroup.Val, atomRank.Val));
5506bool LLParser::parseDIAssignID(
MDNode *&Result,
bool IsDistinct) {
5508 return tokError(
"missing 'distinct', required for !DIAssignID()");
5524bool LLParser::parseGenericDINode(
MDNode *&Result,
bool IsDistinct) {
5525#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5526 REQUIRED(tag, DwarfTagField, ); \
5527 OPTIONAL(header, MDStringField, ); \
5528 OPTIONAL(operands, MDFieldList, );
5530#undef VISIT_MD_FIELDS
5533 (Context, tag.Val, header.Val, operands.Val));
5542bool LLParser::parseDISubrangeType(
MDNode *&Result,
bool IsDistinct) {
5543#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5544 OPTIONAL(name, MDStringField, ); \
5545 OPTIONAL(file, MDField, ); \
5546 OPTIONAL(line, LineField, ); \
5547 OPTIONAL(scope, MDField, ); \
5548 OPTIONAL(baseType, MDField, ); \
5549 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5550 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5551 OPTIONAL(flags, DIFlagField, ); \
5552 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5553 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5554 OPTIONAL(stride, MDSignedOrMDField, ); \
5555 OPTIONAL(bias, MDSignedOrMDField, );
5557#undef VISIT_MD_FIELDS
5559 auto convToMetadata = [&](MDSignedOrMDField Bound) ->
Metadata * {
5560 if (Bound.isMDSignedField())
5563 if (Bound.isMDField())
5564 return Bound.getMDFieldValue();
5568 Metadata *LowerBound = convToMetadata(lowerBound);
5570 Metadata *Stride = convToMetadata(stride);
5571 Metadata *Bias = convToMetadata(bias);
5574 DISubrangeType, (Context,
name.Val,
file.Val, line.Val, scope.Val,
5575 size.getValueAsMetadata(Context), align.Val, flags.Val,
5576 baseType.Val, LowerBound, UpperBound, Stride, Bias));
5585bool LLParser::parseDISubrange(
MDNode *&Result,
bool IsDistinct) {
5586#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5587 OPTIONAL(count, MDSignedOrMDField, (-1, -1, INT64_MAX, false)); \
5588 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5589 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5590 OPTIONAL(stride, MDSignedOrMDField, );
5592#undef VISIT_MD_FIELDS
5599 auto convToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5600 if (Bound.isMDSignedField())
5603 if (Bound.isMDField())
5604 return Bound.getMDFieldValue();
5609 LowerBound = convToMetadata(lowerBound);
5611 Stride = convToMetadata(stride);
5614 (Context,
Count, LowerBound, UpperBound, Stride));
5622bool LLParser::parseDIGenericSubrange(
MDNode *&Result,
bool IsDistinct) {
5623#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5624 OPTIONAL(count, MDSignedOrMDField, ); \
5625 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5626 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5627 OPTIONAL(stride, MDSignedOrMDField, );
5629#undef VISIT_MD_FIELDS
5631 auto ConvToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5632 if (Bound.isMDSignedField())
5634 Context, {dwarf::DW_OP_consts,
5635 static_cast<uint64_t
>(Bound.getMDSignedValue())});
5636 if (Bound.isMDField())
5637 return Bound.getMDFieldValue();
5642 Metadata *LowerBound = ConvToMetadata(lowerBound);
5644 Metadata *Stride = ConvToMetadata(stride);
5647 (Context,
Count, LowerBound, UpperBound, Stride));
5654bool LLParser::parseDIEnumerator(
MDNode *&Result,
bool IsDistinct) {
5655#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5656 REQUIRED(name, MDStringField, ); \
5657 REQUIRED(value, MDAPSIntField, ); \
5658 OPTIONAL(isUnsigned, MDBoolField, (false));
5660#undef VISIT_MD_FIELDS
5662 if (isUnsigned.Val && value.Val.isNegative())
5663 return tokError(
"unsigned enumerator with negative value");
5668 if (!isUnsigned.Val && value.Val.isUnsigned() && value.Val.isSignBitSet())
5680bool LLParser::parseDIBasicType(
MDNode *&Result,
bool IsDistinct) {
5681#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5682 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5683 OPTIONAL(name, MDStringField, ); \
5684 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5685 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5686 OPTIONAL(dataSize, MDUnsignedField, (0, UINT32_MAX)); \
5687 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5688 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5689 OPTIONAL(flags, DIFlagField, );
5691#undef VISIT_MD_FIELDS
5695 (Context, tag.Val,
name.Val,
size.getValueAsMetadata(Context), align.Val,
5696 encoding.Val, num_extra_inhabitants.Val, dataSize.Val, flags.Val));
5705bool LLParser::parseDIFixedPointType(
MDNode *&Result,
bool IsDistinct) {
5706#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5707 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5708 OPTIONAL(name, MDStringField, ); \
5709 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5710 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5711 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5712 OPTIONAL(flags, DIFlagField, ); \
5713 OPTIONAL(kind, FixedPointKindField, ); \
5714 OPTIONAL(factor, MDSignedField, ); \
5715 OPTIONAL(numerator, MDAPSIntField, ); \
5716 OPTIONAL(denominator, MDAPSIntField, );
5718#undef VISIT_MD_FIELDS
5721 (Context, tag.Val,
name.Val,
5722 size.getValueAsMetadata(Context), align.Val,
5723 encoding.Val, flags.Val, kind.Val, factor.Val,
5724 numerator.Val, denominator.Val));
5730bool LLParser::parseDIStringType(
MDNode *&Result,
bool IsDistinct) {
5731#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5732 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_string_type)); \
5733 OPTIONAL(name, MDStringField, ); \
5734 OPTIONAL(stringLength, MDField, ); \
5735 OPTIONAL(stringLengthExpression, MDField, ); \
5736 OPTIONAL(stringLocationExpression, MDField, ); \
5737 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5738 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5739 OPTIONAL(encoding, DwarfAttEncodingField, );
5741#undef VISIT_MD_FIELDS
5745 (Context, tag.Val,
name.Val, stringLength.Val, stringLengthExpression.Val,
5746 stringLocationExpression.Val,
size.getValueAsMetadata(Context),
5747 align.Val, encoding.Val));
5760bool LLParser::parseDIDerivedType(
MDNode *&Result,
bool IsDistinct) {
5761#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5762 REQUIRED(tag, DwarfTagField, ); \
5763 OPTIONAL(name, MDStringField, ); \
5764 OPTIONAL(file, MDField, ); \
5765 OPTIONAL(line, LineField, ); \
5766 OPTIONAL(scope, MDField, ); \
5767 REQUIRED(baseType, MDField, ); \
5768 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5769 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5770 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5771 OPTIONAL(flags, DIFlagField, ); \
5772 OPTIONAL(extraData, MDField, ); \
5773 OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
5774 OPTIONAL(annotations, MDField, ); \
5775 OPTIONAL(ptrAuthKey, MDUnsignedField, (0, 7)); \
5776 OPTIONAL(ptrAuthIsAddressDiscriminated, MDBoolField, ); \
5777 OPTIONAL(ptrAuthExtraDiscriminator, MDUnsignedField, (0, 0xffff)); \
5778 OPTIONAL(ptrAuthIsaPointer, MDBoolField, ); \
5779 OPTIONAL(ptrAuthAuthenticatesNullValues, MDBoolField, );
5781#undef VISIT_MD_FIELDS
5783 std::optional<unsigned> DWARFAddressSpace;
5784 if (dwarfAddressSpace.Val != UINT32_MAX)
5785 DWARFAddressSpace = dwarfAddressSpace.Val;
5786 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
5788 PtrAuthData.emplace(
5789 (
unsigned)ptrAuthKey.Val, ptrAuthIsAddressDiscriminated.Val,
5790 (
unsigned)ptrAuthExtraDiscriminator.Val, ptrAuthIsaPointer.Val,
5791 ptrAuthAuthenticatesNullValues.Val);
5794 DIDerivedType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
5795 baseType.Val,
size.getValueAsMetadata(Context), align.Val,
5796 offset.getValueAsMetadata(Context), DWARFAddressSpace,
5797 PtrAuthData, flags.Val, extraData.Val, annotations.Val));
5801bool LLParser::parseDICompositeType(
MDNode *&Result,
bool IsDistinct) {
5802#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5803 REQUIRED(tag, DwarfTagField, ); \
5804 OPTIONAL(name, MDStringField, ); \
5805 OPTIONAL(file, MDField, ); \
5806 OPTIONAL(line, LineField, ); \
5807 OPTIONAL(scope, MDField, ); \
5808 OPTIONAL(baseType, MDField, ); \
5809 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5810 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5811 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5812 OPTIONAL(flags, DIFlagField, ); \
5813 OPTIONAL(elements, MDField, ); \
5814 OPTIONAL(runtimeLang, DwarfLangField, ); \
5815 OPTIONAL(enumKind, DwarfEnumKindField, ); \
5816 OPTIONAL(vtableHolder, MDField, ); \
5817 OPTIONAL(templateParams, MDField, ); \
5818 OPTIONAL(identifier, MDStringField, ); \
5819 OPTIONAL(discriminator, MDField, ); \
5820 OPTIONAL(dataLocation, MDField, ); \
5821 OPTIONAL(associated, MDField, ); \
5822 OPTIONAL(allocated, MDField, ); \
5823 OPTIONAL(rank, MDSignedOrMDField, ); \
5824 OPTIONAL(annotations, MDField, ); \
5825 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5826 OPTIONAL(specification, MDField, ); \
5827 OPTIONAL(bitStride, MDField, );
5829#undef VISIT_MD_FIELDS
5832 if (rank.isMDSignedField())
5835 else if (rank.isMDField())
5836 Rank = rank.getMDFieldValue();
5838 std::optional<unsigned> EnumKind;
5840 EnumKind = enumKind.Val;
5845 Context, *identifier.Val, tag.Val,
name.Val,
file.Val, line.Val,
5846 scope.Val, baseType.Val,
size.getValueAsMetadata(Context),
5847 align.Val, offset.getValueAsMetadata(Context), specification.Val,
5848 num_extra_inhabitants.Val, flags.Val, elements.Val, runtimeLang.Val,
5849 EnumKind, vtableHolder.Val, templateParams.Val, discriminator.Val,
5850 dataLocation.Val, associated.Val, allocated.Val, Rank,
5851 annotations.Val, bitStride.Val)) {
5860 (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val, baseType.Val,
5861 size.getValueAsMetadata(Context), align.Val,
5862 offset.getValueAsMetadata(Context), flags.Val, elements.Val,
5863 runtimeLang.Val, EnumKind, vtableHolder.Val, templateParams.Val,
5864 identifier.Val, discriminator.Val, dataLocation.Val, associated.Val,
5865 allocated.Val, Rank, annotations.Val, specification.Val,
5866 num_extra_inhabitants.Val, bitStride.Val));
5870bool LLParser::parseDISubroutineType(
MDNode *&Result,
bool IsDistinct) {
5871#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5872 OPTIONAL(flags, DIFlagField, ); \
5873 OPTIONAL(cc, DwarfCCField, ); \
5874 REQUIRED(types, MDField, );
5876#undef VISIT_MD_FIELDS
5879 (Context, flags.Val, cc.Val, types.Val));
5888bool LLParser::parseDIFile(
MDNode *&Result,
bool IsDistinct) {
5892#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5893 REQUIRED(filename, MDStringField, ); \
5894 REQUIRED(directory, MDStringField, ); \
5895 OPTIONAL(checksumkind, ChecksumKindField, (DIFile::CSK_MD5)); \
5896 OPTIONAL(checksum, MDStringField, ); \
5897 OPTIONAL(source, MDStringField, (MDStringField::EmptyIs::Empty));
5899#undef VISIT_MD_FIELDS
5901 std::optional<DIFile::ChecksumInfo<MDString *>> OptChecksum;
5902 if (checksumkind.Seen && checksum.Seen)
5903 OptChecksum.emplace(checksumkind.Val, checksum.Val);
5904 else if (checksumkind.Seen || checksum.Seen)
5905 return tokError(
"'checksumkind' and 'checksum' must be provided together");
5907 MDString *
Source =
nullptr;
5911 DIFile, (Context,
filename.Val, directory.Val, OptChecksum, Source));
5922bool LLParser::parseDICompileUnit(
MDNode *&Result,
bool IsDistinct) {
5924 return tokError(
"missing 'distinct', required for !DICompileUnit");
5926 LocTy Loc = Lex.getLoc();
5928#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5929 REQUIRED(file, MDField, ( false)); \
5930 OPTIONAL(language, DwarfLangField, ); \
5931 OPTIONAL(sourceLanguageName, DwarfSourceLangNameField, ); \
5932 OPTIONAL(sourceLanguageVersion, MDUnsignedField, (0, UINT32_MAX)); \
5933 OPTIONAL(producer, MDStringField, ); \
5934 OPTIONAL(isOptimized, MDBoolField, ); \
5935 OPTIONAL(flags, MDStringField, ); \
5936 OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); \
5937 OPTIONAL(splitDebugFilename, MDStringField, ); \
5938 OPTIONAL(emissionKind, EmissionKindField, ); \
5939 OPTIONAL(enums, MDField, ); \
5940 OPTIONAL(retainedTypes, MDField, ); \
5941 OPTIONAL(globals, MDField, ); \
5942 OPTIONAL(imports, MDField, ); \
5943 OPTIONAL(macros, MDField, ); \
5944 OPTIONAL(dwoId, MDUnsignedField, ); \
5945 OPTIONAL(splitDebugInlining, MDBoolField, = true); \
5946 OPTIONAL(debugInfoForProfiling, MDBoolField, = false); \
5947 OPTIONAL(nameTableKind, NameTableKindField, ); \
5948 OPTIONAL(rangesBaseAddress, MDBoolField, = false); \
5949 OPTIONAL(sysroot, MDStringField, ); \
5950 OPTIONAL(sdk, MDStringField, );
5952#undef VISIT_MD_FIELDS
5954 if (!language.Seen && !sourceLanguageName.Seen)
5955 return error(Loc,
"missing one of 'language' or 'sourceLanguageName', "
5956 "required for !DICompileUnit");
5958 if (language.Seen && sourceLanguageName.Seen)
5959 return error(Loc,
"can only specify one of 'language' and "
5960 "'sourceLanguageName' on !DICompileUnit");
5962 if (sourceLanguageVersion.Seen && !sourceLanguageName.Seen)
5963 return error(Loc,
"'sourceLanguageVersion' requires an associated "
5964 "'sourceLanguageName' on !DICompileUnit");
5968 language.Seen ? DISourceLanguageName(language.Val)
5969 : DISourceLanguageName(sourceLanguageName.Val,
5970 sourceLanguageVersion.Val),
5971 file.Val, producer.Val, isOptimized.Val, flags.Val, runtimeVersion.Val,
5972 splitDebugFilename.Val, emissionKind.Val, enums.Val, retainedTypes.Val,
5973 globals.Val, imports.Val, macros.Val, dwoId.Val, splitDebugInlining.Val,
5974 debugInfoForProfiling.Val, nameTableKind.Val, rangesBaseAddress.Val,
5975 sysroot.Val, sdk.Val);
5988bool LLParser::parseDISubprogram(
MDNode *&Result,
bool IsDistinct) {
5989 auto Loc = Lex.getLoc();
5990#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5991 OPTIONAL(scope, MDField, ); \
5992 OPTIONAL(name, MDStringField, ); \
5993 OPTIONAL(linkageName, MDStringField, ); \
5994 OPTIONAL(file, MDField, ); \
5995 OPTIONAL(line, LineField, ); \
5996 OPTIONAL(type, MDField, ); \
5997 OPTIONAL(isLocal, MDBoolField, ); \
5998 OPTIONAL(isDefinition, MDBoolField, (true)); \
5999 OPTIONAL(scopeLine, LineField, ); \
6000 OPTIONAL(containingType, MDField, ); \
6001 OPTIONAL(virtuality, DwarfVirtualityField, ); \
6002 OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); \
6003 OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); \
6004 OPTIONAL(flags, DIFlagField, ); \
6005 OPTIONAL(spFlags, DISPFlagField, ); \
6006 OPTIONAL(isOptimized, MDBoolField, ); \
6007 OPTIONAL(unit, MDField, ); \
6008 OPTIONAL(templateParams, MDField, ); \
6009 OPTIONAL(declaration, MDField, ); \
6010 OPTIONAL(retainedNodes, MDField, ); \
6011 OPTIONAL(thrownTypes, MDField, ); \
6012 OPTIONAL(annotations, MDField, ); \
6013 OPTIONAL(targetFuncName, MDStringField, ); \
6014 OPTIONAL(keyInstructions, MDBoolField, );
6016#undef VISIT_MD_FIELDS
6021 spFlags.Seen ? spFlags.Val
6023 isOptimized.Val, virtuality.Val);
6024 if ((SPFlags & DISubprogram::SPFlagDefinition) && !IsDistinct)
6027 "missing 'distinct', required for !DISubprogram that is a Definition");
6030 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val, line.Val,
6031 type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
6032 thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
6033 declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
6034 targetFuncName.Val, keyInstructions.Val));
6040bool LLParser::parseDILexicalBlock(
MDNode *&Result,
bool IsDistinct) {
6041#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6042 REQUIRED(scope, MDField, ( false)); \
6043 OPTIONAL(file, MDField, ); \
6044 OPTIONAL(line, LineField, ); \
6045 OPTIONAL(column, ColumnField, );
6047#undef VISIT_MD_FIELDS
6050 DILexicalBlock, (Context, scope.Val,
file.Val, line.Val, column.Val));
6056bool LLParser::parseDILexicalBlockFile(
MDNode *&Result,
bool IsDistinct) {
6057#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6058 REQUIRED(scope, MDField, ( false)); \
6059 OPTIONAL(file, MDField, ); \
6060 REQUIRED(discriminator, MDUnsignedField, (0, UINT32_MAX));
6062#undef VISIT_MD_FIELDS
6065 (Context, scope.Val,
file.Val, discriminator.Val));
6071bool LLParser::parseDICommonBlock(
MDNode *&Result,
bool IsDistinct) {
6072#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6073 REQUIRED(scope, MDField, ); \
6074 OPTIONAL(declaration, MDField, ); \
6075 OPTIONAL(name, MDStringField, ); \
6076 OPTIONAL(file, MDField, ); \
6077 OPTIONAL(line, LineField, );
6079#undef VISIT_MD_FIELDS
6082 (Context, scope.Val, declaration.Val,
name.Val,
6083 file.Val, line.Val));
6089bool LLParser::parseDINamespace(
MDNode *&Result,
bool IsDistinct) {
6090#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6091 REQUIRED(scope, MDField, ); \
6092 OPTIONAL(name, MDStringField, ); \
6093 OPTIONAL(exportSymbols, MDBoolField, );
6095#undef VISIT_MD_FIELDS
6098 (Context, scope.Val,
name.Val, exportSymbols.Val));
6105bool LLParser::parseDIMacro(
MDNode *&Result,
bool IsDistinct) {
6106#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6107 REQUIRED(type, DwarfMacinfoTypeField, ); \
6108 OPTIONAL(line, LineField, ); \
6109 REQUIRED(name, MDStringField, ); \
6110 OPTIONAL(value, MDStringField, );
6112#undef VISIT_MD_FIELDS
6115 (Context, type.Val, line.Val,
name.Val, value.Val));
6121bool LLParser::parseDIMacroFile(
MDNode *&Result,
bool IsDistinct) {
6122#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6123 OPTIONAL(type, DwarfMacinfoTypeField, (dwarf::DW_MACINFO_start_file)); \
6124 OPTIONAL(line, LineField, ); \
6125 REQUIRED(file, MDField, ); \
6126 OPTIONAL(nodes, MDField, );
6128#undef VISIT_MD_FIELDS
6131 (Context, type.Val, line.Val,
file.Val,
nodes.Val));
6139bool LLParser::parseDIModule(
MDNode *&Result,
bool IsDistinct) {
6140#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6141 REQUIRED(scope, MDField, ); \
6142 REQUIRED(name, MDStringField, ); \
6143 OPTIONAL(configMacros, MDStringField, ); \
6144 OPTIONAL(includePath, MDStringField, ); \
6145 OPTIONAL(apinotes, MDStringField, ); \
6146 OPTIONAL(file, MDField, ); \
6147 OPTIONAL(line, LineField, ); \
6148 OPTIONAL(isDecl, MDBoolField, );
6150#undef VISIT_MD_FIELDS
6153 configMacros.Val, includePath.Val,
6154 apinotes.Val, line.Val, isDecl.Val));
6160bool LLParser::parseDITemplateTypeParameter(
MDNode *&Result,
bool IsDistinct) {
6161#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6162 OPTIONAL(name, MDStringField, ); \
6163 REQUIRED(type, MDField, ); \
6164 OPTIONAL(defaulted, MDBoolField, );
6166#undef VISIT_MD_FIELDS
6169 (Context,
name.Val, type.Val, defaulted.Val));
6177bool LLParser::parseDITemplateValueParameter(
MDNode *&Result,
bool IsDistinct) {
6178#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6179 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_template_value_parameter)); \
6180 OPTIONAL(name, MDStringField, ); \
6181 OPTIONAL(type, MDField, ); \
6182 OPTIONAL(defaulted, MDBoolField, ); \
6183 REQUIRED(value, MDField, );
6186#undef VISIT_MD_FIELDS
6189 DITemplateValueParameter,
6190 (Context, tag.Val,
name.Val, type.Val, defaulted.Val, value.Val));
6199bool LLParser::parseDIGlobalVariable(
MDNode *&Result,
bool IsDistinct) {
6200#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6201 OPTIONAL(name, MDStringField, (MDStringField::EmptyIs::Error)); \
6202 OPTIONAL(scope, MDField, ); \
6203 OPTIONAL(linkageName, MDStringField, ); \
6204 OPTIONAL(file, MDField, ); \
6205 OPTIONAL(line, LineField, ); \
6206 OPTIONAL(type, MDField, ); \
6207 OPTIONAL(isLocal, MDBoolField, ); \
6208 OPTIONAL(isDefinition, MDBoolField, (true)); \
6209 OPTIONAL(templateParams, MDField, ); \
6210 OPTIONAL(declaration, MDField, ); \
6211 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6212 OPTIONAL(annotations, MDField, );
6214#undef VISIT_MD_FIELDS
6218 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val,
6219 line.Val, type.Val, isLocal.Val, isDefinition.Val,
6220 declaration.Val, templateParams.Val, align.Val,
6232bool LLParser::parseDILocalVariable(
MDNode *&Result,
bool IsDistinct) {
6233#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6234 REQUIRED(scope, MDField, ( false)); \
6235 OPTIONAL(name, MDStringField, ); \
6236 OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); \
6237 OPTIONAL(file, MDField, ); \
6238 OPTIONAL(line, LineField, ); \
6239 OPTIONAL(type, MDField, ); \
6240 OPTIONAL(flags, DIFlagField, ); \
6241 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6242 OPTIONAL(annotations, MDField, );
6244#undef VISIT_MD_FIELDS
6247 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6248 type.Val, arg.Val, flags.Val, align.Val,
6255bool LLParser::parseDILabel(
MDNode *&Result,
bool IsDistinct) {
6256#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6257 REQUIRED(scope, MDField, ( false)); \
6258 REQUIRED(name, MDStringField, ); \
6259 REQUIRED(file, MDField, ); \
6260 REQUIRED(line, LineField, ); \
6261 OPTIONAL(column, ColumnField, ); \
6262 OPTIONAL(isArtificial, MDBoolField, ); \
6263 OPTIONAL(coroSuspendIdx, MDUnsignedField, );
6265#undef VISIT_MD_FIELDS
6267 std::optional<unsigned> CoroSuspendIdx =
6268 coroSuspendIdx.Seen ? std::optional<unsigned>(coroSuspendIdx.Val)
6272 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6273 column.Val, isArtificial.Val, CoroSuspendIdx));
6279bool LLParser::parseDIExpressionBody(
MDNode *&Result,
bool IsDistinct) {
6292 return tokError(Twine(
"invalid DWARF op '") + Lex.getStrVal() +
"'");
6301 return tokError(Twine(
"invalid DWARF attribute encoding '") +
6302 Lex.getStrVal() +
"'");
6305 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
6306 return tokError(
"expected unsigned integer");
6308 auto &
U = Lex.getAPSIntVal();
6310 return tokError(
"element too large, limit is " + Twine(
UINT64_MAX));
6324bool LLParser::parseDIExpression(
MDNode *&Result,
bool IsDistinct) {
6326 assert(Lex.getStrVal() ==
"DIExpression" &&
"Expected '!DIExpression'");
6329 return parseDIExpressionBody(Result, IsDistinct);
6334bool LLParser::parseDIArgList(
Metadata *&MD, PerFunctionState *PFS) {
6335 assert(PFS &&
"Expected valid function state");
6346 if (parseValueAsMetadata(MD,
"expected value-as-metadata operand", PFS))
6360bool LLParser::parseDIGlobalVariableExpression(
MDNode *&Result,
6362#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6363 REQUIRED(var, MDField, ); \
6364 REQUIRED(expr, MDField, );
6366#undef VISIT_MD_FIELDS
6369 GET_OR_DISTINCT(DIGlobalVariableExpression, (Context, var.Val, expr.Val));
6376bool LLParser::parseDIObjCProperty(
MDNode *&Result,
bool IsDistinct) {
6377#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6378 OPTIONAL(name, MDStringField, ); \
6379 OPTIONAL(file, MDField, ); \
6380 OPTIONAL(line, LineField, ); \
6381 OPTIONAL(setter, MDStringField, ); \
6382 OPTIONAL(getter, MDStringField, ); \
6383 OPTIONAL(attributes, MDUnsignedField, (0, UINT32_MAX)); \
6384 OPTIONAL(type, MDField, );
6386#undef VISIT_MD_FIELDS
6389 (Context,
name.Val,
file.Val, line.Val, getter.Val,
6390 setter.Val, attributes.Val, type.Val));
6397bool LLParser::parseDIImportedEntity(
MDNode *&Result,
bool IsDistinct) {
6398#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6399 REQUIRED(tag, DwarfTagField, ); \
6400 REQUIRED(scope, MDField, ); \
6401 OPTIONAL(entity, MDField, ); \
6402 OPTIONAL(file, MDField, ); \
6403 OPTIONAL(line, LineField, ); \
6404 OPTIONAL(name, MDStringField, ); \
6405 OPTIONAL(elements, MDField, );
6407#undef VISIT_MD_FIELDS
6410 (Context, tag.Val, scope.Val, entity.Val,
file.Val,
6411 line.Val,
name.Val, elements.Val));
6415#undef PARSE_MD_FIELD
6427bool LLParser::parseMetadataAsValue(
Value *&V, PerFunctionState &PFS) {
6430 if (parseMetadata(MD, &PFS))
6441bool LLParser::parseValueAsMetadata(
Metadata *&MD,
const Twine &TypeMsg,
6442 PerFunctionState *PFS) {
6445 if (parseType(Ty, TypeMsg, Loc))
6448 return error(Loc,
"invalid metadata-value-metadata roundtrip");
6451 if (parseValue(Ty, V, PFS))
6466bool LLParser::parseMetadata(
Metadata *&MD, PerFunctionState *PFS) {
6470 if (Lex.getStrVal() ==
"DIArgList") {
6472 if (parseDIArgList(AL, PFS))
6478 if (parseSpecializedMDNode(
N)) {
6488 return parseValueAsMetadata(MD,
"expected metadata operand", PFS);
6498 if (parseMDString(S))
6508 if (parseMDNodeTail(
N))
6519 PerFunctionState *PFS) {
6521 return error(
ID.Loc,
"functions are not values, refer to them as pointers");
6526 return error(
ID.Loc,
"invalid use of function-local name");
6527 V = PFS->getVal(
ID.UIntVal, Ty,
ID.Loc);
6528 return V ==
nullptr;
6531 return error(
ID.Loc,
"invalid use of function-local name");
6532 V = PFS->getVal(
ID.StrVal, Ty,
ID.Loc);
6533 return V ==
nullptr;
6536 return error(
ID.Loc,
"invalid type for inline asm constraint string");
6540 ID.FTy,
ID.StrVal,
ID.StrVal2,
ID.UIntVal & 1, (
ID.UIntVal >> 1) & 1,
6545 V = getGlobalVal(
ID.StrVal, Ty,
ID.Loc);
6548 return V ==
nullptr;
6550 V = getGlobalVal(
ID.UIntVal, Ty,
ID.Loc);
6553 return V ==
nullptr;
6556 return error(
ID.Loc,
"integer constant must have integer type");
6558 V = ConstantInt::get(Context,
ID.APSIntVal);
6563 return error(
ID.Loc,
"floating point constant invalid for type");
6569 bool IsSNAN =
ID.APFloatVal.isSignaling();
6584 APInt Payload =
ID.APFloatVal.bitcastToAPInt();
6586 ID.APFloatVal.isNegative(), &Payload);
6589 V = ConstantFP::get(Context,
ID.APFloatVal);
6591 if (
V->getType() != Ty)
6592 return error(
ID.Loc,
"floating point constant does not have type '" +
6598 return error(
ID.Loc,
"null must be a pointer type");
6604 return error(
ID.Loc,
"invalid type for undef constant");
6609 return error(
ID.Loc,
"invalid empty array initializer");
6615 return error(
ID.Loc,
"invalid type for null constant");
6618 return error(
ID.Loc,
"invalid type for null constant");
6623 return error(
ID.Loc,
"invalid type for none constant");
6629 return error(
ID.Loc,
"invalid type for poison constant");
6633 if (
ID.ConstantVal->getType() != Ty)
6634 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6641 return error(
ID.Loc,
"vector constant must have vector type");
6643 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6645 "' but expected '" +
6653 if (
ST->getNumElements() !=
ID.UIntVal)
6655 "initializer with struct type has wrong # elements");
6657 return error(
ID.Loc,
"packed'ness of initializer and type don't match");
6660 for (
unsigned i = 0, e =
ID.UIntVal; i != e; ++i)
6661 if (
ID.ConstantStructElts[i]->getType() !=
ST->getElementType(i))
6664 "element " + Twine(i) +
6665 " of struct initializer doesn't match struct element type");
6668 ST,
ArrayRef(
ID.ConstantStructElts.get(),
ID.UIntVal));
6670 return error(
ID.Loc,
"constant expression type mismatch");
6679 auto Loc = Lex.getLoc();
6680 if (parseValID(
ID,
nullptr))
6693 if (convertValIDToValue(Ty,
ID, V,
nullptr))
6703 return error(Loc,
"expected a constant value");
6707bool LLParser::parseValue(
Type *Ty,
Value *&V, PerFunctionState *PFS) {
6710 return parseValID(
ID, PFS, Ty) ||
6711 convertValIDToValue(Ty,
ID, V, PFS);
6714bool LLParser::parseTypeAndValue(
Value *&V, PerFunctionState *PFS) {
6716 return parseType(Ty) || parseValue(Ty, V, PFS);
6719bool LLParser::parseTypeAndBasicBlock(
BasicBlock *&BB, LocTy &
Loc,
6720 PerFunctionState &PFS) {
6723 if (parseTypeAndValue(V, PFS))
6726 return error(Loc,
"expected a basic block");
6735 if (!Name.starts_with(
"llvm.dbg."))
6738 return FnID == Intrinsic::dbg_declare || FnID == Intrinsic::dbg_value ||
6739 FnID == Intrinsic::dbg_assign;
6747bool LLParser::parseFunctionHeader(
Function *&Fn,
bool IsDefine,
6748 unsigned &FunctionNumber,
6751 LocTy LinkageLoc = Lex.getLoc();
6753 unsigned Visibility;
6754 unsigned DLLStorageClass;
6756 AttrBuilder RetAttrs(M->getContext());
6759 Type *RetType =
nullptr;
6760 LocTy RetTypeLoc = Lex.getLoc();
6761 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
6763 parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
6764 parseType(RetType, RetTypeLoc,
true ))
6773 return error(LinkageLoc,
"invalid linkage for function definition");
6783 return error(LinkageLoc,
"invalid linkage for function declaration");
6787 return error(LinkageLoc,
"invalid function linkage type");
6791 return error(LinkageLoc,
6792 "symbol with local linkage must have default visibility");
6795 return error(LinkageLoc,
6796 "symbol with local linkage cannot have a DLL storage class");
6799 return error(RetTypeLoc,
"invalid function return type");
6801 LocTy NameLoc = Lex.getLoc();
6803 std::string FunctionName;
6805 FunctionName = Lex.getStrVal();
6807 FunctionNumber = Lex.getUIntVal();
6808 if (checkValueID(NameLoc,
"function",
"@", NumberedVals.getNext(),
6812 return tokError(
"expected function name");
6818 return tokError(
"expected '(' in function argument list");
6822 AttrBuilder FuncAttrs(M->getContext());
6823 std::vector<unsigned> FwdRefAttrGrps;
6826 std::string Partition;
6827 MaybeAlign Alignment;
6830 unsigned AddrSpace = 0;
6836 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg) ||
6837 parseOptionalUnnamedAddr(UnnamedAddr) ||
6838 parseOptionalProgramAddrSpace(AddrSpace) ||
6839 parseFnAttributeValuePairs(FuncAttrs, FwdRefAttrGrps,
false,
6843 parseOptionalComdat(FunctionName,
C) ||
6844 parseOptionalAlignment(Alignment) ||
6845 (EatIfPresent(
lltok::kw_gc) && parseStringConstant(GC)) ||
6849 parseGlobalTypeAndValue(PersonalityFn)))
6852 if (FuncAttrs.contains(Attribute::Builtin))
6853 return error(BuiltinLoc,
"'builtin' attribute not valid on function");
6856 if (MaybeAlign
A = FuncAttrs.getAlignment()) {
6858 FuncAttrs.removeAttribute(Attribute::Alignment);
6863 std::vector<Type*> ParamTypeList;
6866 for (
const ArgInfo &Arg : ArgList) {
6867 ParamTypeList.push_back(Arg.Ty);
6868 Attrs.push_back(Arg.Attrs);
6875 if (PAL.hasParamAttr(0, Attribute::StructRet) && !RetType->
isVoidTy())
6876 return error(RetTypeLoc,
"functions with 'sret' argument must return void");
6882 GlobalValue *FwdFn =
nullptr;
6883 if (!FunctionName.empty()) {
6886 auto FRVI = ForwardRefVals.find(FunctionName);
6887 if (FRVI != ForwardRefVals.end()) {
6888 FwdFn = FRVI->second.first;
6890 return error(FRVI->second.second,
6891 "invalid forward reference to "
6894 "' with wrong type: "
6898 ForwardRefVals.erase(FRVI);
6899 }
else if ((Fn = M->getFunction(FunctionName))) {
6901 return error(NameLoc,
6902 "invalid redefinition of function '" + FunctionName +
"'");
6903 }
else if (M->getNamedValue(FunctionName)) {
6904 return error(NameLoc,
"redefinition of function '@" + FunctionName +
"'");
6910 if (FunctionNumber == (
unsigned)-1)
6911 FunctionNumber = NumberedVals.getNext();
6915 auto I = ForwardRefValIDs.find(FunctionNumber);
6916 if (
I != ForwardRefValIDs.end()) {
6917 FwdFn =
I->second.first;
6919 return error(NameLoc,
"type of definition and forward reference of '@" +
6920 Twine(FunctionNumber) +
6925 ForwardRefValIDs.erase(
I);
6934 if (FunctionName.empty())
6935 NumberedVals.add(FunctionNumber, Fn);
6950 if (!
GC.empty()) Fn->
setGC(GC);
6953 ForwardRefAttrGroups[Fn] = FwdRefAttrGrps;
6957 for (
unsigned i = 0, e = ArgList.size(); i != e; ++i, ++ArgIt) {
6959 if (ArgList[i].
Name.empty())
continue;
6962 ArgIt->
setName(ArgList[i].Name);
6964 if (ArgIt->
getName() != ArgList[i].Name)
6965 return error(ArgList[i].Loc,
6966 "redefinition of argument '%" + ArgList[i].Name +
"'");
6979 if (FunctionName.empty()) {
6981 ID.UIntVal = FunctionNumber;
6984 ID.StrVal = FunctionName;
6986 auto Blocks = ForwardRefBlockAddresses.find(
ID);
6987 if (Blocks != ForwardRefBlockAddresses.end())
6988 return error(Blocks->first.Loc,
6989 "cannot take blockaddress inside a declaration");
6993bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
6995 if (FunctionNumber == -1) {
6997 ID.StrVal = std::string(F.getName());
7000 ID.UIntVal = FunctionNumber;
7003 auto Blocks = P.ForwardRefBlockAddresses.find(
ID);
7004 if (Blocks == P.ForwardRefBlockAddresses.end())
7007 for (
const auto &
I : Blocks->second) {
7008 const ValID &BBID =
I.first;
7009 GlobalValue *GV =
I.second;
7012 "Expected local id or name");
7019 return P.error(BBID.
Loc,
"referenced value is not a basic block");
7022 ResolvedVal = P.checkValidVariableType(BBID.
Loc, BBID.
StrVal, GV->
getType(),
7030 P.ForwardRefBlockAddresses.erase(Blocks);
7036bool LLParser::parseFunctionBody(Function &Fn,
unsigned FunctionNumber,
7037 ArrayRef<unsigned> UnnamedArgNums) {
7039 return tokError(
"expected '{' in function body");
7042 PerFunctionState PFS(*
this, Fn, FunctionNumber, UnnamedArgNums);
7046 if (PFS.resolveForwardRefBlockAddresses())
7052 return tokError(
"function body requires at least one basic block");
7056 if (parseBasicBlock(PFS))
7060 if (parseUseListOrder(&PFS))
7067 return PFS.finishFunction();
7072bool LLParser::parseBasicBlock(PerFunctionState &PFS) {
7073 FileLoc BBStart(Lex.getTokLineColumnPos());
7078 LocTy NameLoc = Lex.getLoc();
7080 Name = Lex.getStrVal();
7083 NameID = Lex.getUIntVal();
7087 BasicBlock *BB = PFS.defineBB(Name, NameID, NameLoc);
7091 std::string NameStr;
7096 auto DeleteDbgRecord = [](DbgRecord *DR) { DR->deleteRecord(); };
7097 using DbgRecordPtr = std::unique_ptr<DbgRecord,
decltype(DeleteDbgRecord)>;
7104 if (SeenOldDbgInfoFormat)
7105 return error(Lex.getLoc(),
"debug record should not appear in a module "
7106 "containing debug info intrinsics");
7107 SeenNewDbgInfoFormat =
true;
7111 if (parseDebugRecord(DR, PFS))
7113 TrailingDbgRecord.emplace_back(DR, DeleteDbgRecord);
7116 FileLoc InstStart(Lex.getTokLineColumnPos());
7119 LocTy NameLoc = Lex.getLoc();
7124 NameID = Lex.getUIntVal();
7126 if (parseToken(
lltok::equal,
"expected '=' after instruction id"))
7129 NameStr = Lex.getStrVal();
7131 if (parseToken(
lltok::equal,
"expected '=' after instruction name"))
7135 switch (parseInstruction(Inst, BB, PFS)) {
7138 case InstError:
return true;
7145 if (parseInstructionMetadata(*Inst))
7148 case InstExtraComma:
7153 if (parseInstructionMetadata(*Inst))
7159 if (PFS.setInstName(NameID, NameStr, NameLoc, Inst))
7163 for (DbgRecordPtr &DR : TrailingDbgRecord)
7165 TrailingDbgRecord.clear();
7166 if (ParserContext) {
7167 ParserContext->addInstructionLocation(
7168 Inst, FileLocRange(InstStart, Lex.getPrevTokEndLineColumnPos()));
7173 ParserContext->addBlockLocation(
7174 BB, FileLocRange(BBStart, Lex.getPrevTokEndLineColumnPos()));
7176 assert(TrailingDbgRecord.empty() &&
7177 "All debug values should have been attached to an instruction.");
7186bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
7189 LocTy DVRLoc = Lex.getLoc();
7191 return error(DVRLoc,
"expected debug record type here");
7192 RecordKind
RecordType = StringSwitch<RecordKind>(Lex.getStrVal())
7193 .Case(
"declare", RecordKind::ValueKind)
7194 .Case(
"value", RecordKind::ValueKind)
7195 .Case(
"assign", RecordKind::ValueKind)
7196 .Case(
"label", RecordKind::LabelKind)
7197 .Case(
"declare_value", RecordKind::ValueKind);
7206 if (parseMDNode(Label))
7211 if (parseMDNode(DbgLoc))
7219 LocType
ValueType = StringSwitch<LocType>(Lex.getStrVal())
7220 .Case(
"declare", LocType::Declare)
7221 .Case(
"value", LocType::Value)
7222 .Case(
"assign", LocType::Assign)
7223 .Case(
"declare_value", LocType::DeclareValue);
7231 if (parseMetadata(ValLocMD, &PFS))
7238 if (parseMDNode(Variable))
7245 if (parseMDNode(Expression))
7251 MDNode *AssignID =
nullptr;
7252 Metadata *AddressLocation =
nullptr;
7253 MDNode *AddressExpression =
nullptr;
7256 if (parseMDNode(AssignID))
7262 if (parseMetadata(AddressLocation, &PFS))
7268 if (parseMDNode(AddressExpression))
7282 ValueType, ValLocMD, Variable, Expression, AssignID, AddressLocation,
7292int LLParser::parseInstruction(Instruction *&Inst, BasicBlock *BB,
7293 PerFunctionState &PFS) {
7296 return tokError(
"found end of file when expecting more instructions");
7297 LocTy Loc = Lex.getLoc();
7298 unsigned KeywordVal = Lex.getUIntVal();
7303 return error(Loc,
"expected instruction opcode");
7307 return parseRet(Inst, BB, PFS);
7309 return parseBr(Inst, PFS);
7311 return parseSwitch(Inst, PFS);
7313 return parseIndirectBr(Inst, PFS);
7315 return parseInvoke(Inst, PFS);
7317 return parseResume(Inst, PFS);
7319 return parseCleanupRet(Inst, PFS);
7321 return parseCatchRet(Inst, PFS);
7323 return parseCatchSwitch(Inst, PFS);
7325 return parseCatchPad(Inst, PFS);
7327 return parseCleanupPad(Inst, PFS);
7329 return parseCallBr(Inst, PFS);
7332 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7333 int Res = parseUnaryOp(Inst, PFS, KeywordVal,
true);
7349 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7361 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7362 int Res = parseArithmetic(Inst, PFS, KeywordVal,
true);
7376 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7384 return parseArithmetic(Inst, PFS, KeywordVal,
7388 if (parseLogical(Inst, PFS, KeywordVal))
7396 return parseLogical(Inst, PFS, KeywordVal);
7399 if (parseCompare(Inst, PFS, KeywordVal))
7406 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7407 int Res = parseCompare(Inst, PFS, KeywordVal);
7419 bool Res = parseCast(Inst, PFS, KeywordVal);
7431 if (parseCast(Inst, PFS, KeywordVal))
7448 return parseCast(Inst, PFS, KeywordVal);
7451 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7452 if (parseCast(Inst, PFS, KeywordVal))
7461 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7462 int Res = parseSelect(Inst, PFS);
7467 return error(Loc,
"fast-math-flags specified for select without "
7468 "floating-point scalar or vector return type");
7474 return parseVAArg(Inst, PFS);
7476 return parseExtractElement(Inst, PFS);
7478 return parseInsertElement(Inst, PFS);
7480 return parseShuffleVector(Inst, PFS);
7482 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7483 int Res = parsePHI(Inst, PFS);
7488 return error(Loc,
"fast-math-flags specified for phi without "
7489 "floating-point scalar or vector return type");
7495 return parseLandingPad(Inst, PFS);
7497 return parseFreeze(Inst, PFS);
7509 return parseAlloc(Inst, PFS);
7511 return parseLoad(Inst, PFS);
7513 return parseStore(Inst, PFS);
7515 return parseCmpXchg(Inst, PFS);
7517 return parseAtomicRMW(Inst, PFS);
7519 return parseFence(Inst, PFS);
7521 return parseGetElementPtr(Inst, PFS);
7523 return parseExtractValue(Inst, PFS);
7525 return parseInsertValue(Inst, PFS);
7530bool LLParser::parseCmpPredicate(
unsigned &
P,
unsigned Opc) {
7531 if (
Opc == Instruction::FCmp) {
7532 switch (Lex.getKind()) {
7534 return tokError(
"expected fcmp predicate (e.g. 'oeq')");
7553 switch (Lex.getKind()) {
7555 return tokError(
"expected icmp predicate (e.g. 'eq')");
7579bool LLParser::parseRet(Instruction *&Inst, BasicBlock *BB,
7580 PerFunctionState &PFS) {
7581 SMLoc TypeLoc = Lex.getLoc();
7583 if (parseType(Ty,
true ))
7586 Type *ResType = PFS.getFunction().getReturnType();
7590 return error(TypeLoc,
"value doesn't match function result type '" +
7598 if (parseValue(Ty, RV, PFS))
7602 return error(TypeLoc,
"value doesn't match function result type '" +
7612bool LLParser::parseBr(Instruction *&Inst, PerFunctionState &PFS) {
7616 if (parseTypeAndValue(Op0, Loc, PFS))
7625 return error(Loc,
"branch condition must have 'i1' type");
7627 if (parseToken(
lltok::comma,
"expected ',' after branch condition") ||
7628 parseTypeAndBasicBlock(Op1, Loc, PFS) ||
7629 parseToken(
lltok::comma,
"expected ',' after true destination") ||
7630 parseTypeAndBasicBlock(Op2, Loc2, PFS))
7642bool LLParser::parseSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7643 LocTy CondLoc, BBLoc;
7646 if (parseTypeAndValue(
Cond, CondLoc, PFS) ||
7647 parseToken(
lltok::comma,
"expected ',' after switch condition") ||
7648 parseTypeAndBasicBlock(DefaultBB, BBLoc, PFS) ||
7652 if (!
Cond->getType()->isIntegerTy())
7653 return error(CondLoc,
"switch condition must have integer type");
7656 SmallPtrSet<Value*, 32> SeenCases;
7662 if (parseTypeAndValue(Constant, CondLoc, PFS) ||
7663 parseToken(
lltok::comma,
"expected ',' after case value") ||
7664 parseTypeAndBasicBlock(DestBB, PFS))
7667 if (!SeenCases.
insert(Constant).second)
7668 return error(CondLoc,
"duplicate case value in switch");
7670 return error(CondLoc,
"case value is not a constant integer");
7678 for (
const auto &[OnVal, Dest] : Table)
7679 SI->addCase(OnVal, Dest);
7687bool LLParser::parseIndirectBr(Instruction *&Inst, PerFunctionState &PFS) {
7690 if (parseTypeAndValue(
Address, AddrLoc, PFS) ||
7691 parseToken(
lltok::comma,
"expected ',' after indirectbr address") ||
7695 if (!
Address->getType()->isPointerTy())
7696 return error(AddrLoc,
"indirectbr address must have pointer type");
7699 SmallVector<BasicBlock*, 16> DestList;
7703 if (parseTypeAndBasicBlock(DestBB, PFS))
7708 if (parseTypeAndBasicBlock(DestBB, PFS))
7714 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
7718 for (BasicBlock *Dest : DestList)
7728 FunctionType *&FuncTy) {
7734 for (
const ParamInfo &Arg : ArgList)
7748bool LLParser::parseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
7749 LocTy CallLoc = Lex.getLoc();
7750 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
7751 std::vector<unsigned> FwdRefAttrGrps;
7754 unsigned InvokeAddrSpace;
7755 Type *RetType =
nullptr;
7762 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7763 parseOptionalProgramAddrSpace(InvokeAddrSpace) ||
7764 parseType(RetType, RetTypeLoc,
true ) ||
7765 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
7766 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
7768 parseOptionalOperandBundles(BundleList, PFS) ||
7770 parseTypeAndBasicBlock(NormalBB, PFS) ||
7772 parseTypeAndBasicBlock(UnwindBB, PFS))
7779 if (resolveFunctionType(RetType, ArgList, Ty))
7780 return error(RetTypeLoc,
"Invalid result type for LLVM function");
7786 if (convertValIDToValue(
PointerType::get(Context, InvokeAddrSpace), CalleeID,
7791 SmallVector<Value *, 8>
Args;
7798 for (
const ParamInfo &Arg : ArgList) {
7799 Type *ExpectedTy =
nullptr;
7802 }
else if (!Ty->isVarArg()) {
7803 return error(Arg.Loc,
"too many arguments specified");
7806 if (ExpectedTy && ExpectedTy != Arg.V->getType())
7807 return error(Arg.Loc,
"argument is not of expected type '" +
7809 Args.push_back(Arg.V);
7814 return error(CallLoc,
"not enough parameters specified for call");
7823 II->setCallingConv(CC);
7824 II->setAttributes(PAL);
7825 ForwardRefAttrGroups[
II] = FwdRefAttrGrps;
7832bool LLParser::parseResume(Instruction *&Inst, PerFunctionState &PFS) {
7834 if (parseTypeAndValue(Exn, ExnLoc, PFS))
7842bool LLParser::parseExceptionArgs(SmallVectorImpl<Value *> &Args,
7843 PerFunctionState &PFS) {
7844 if (parseToken(
lltok::lsquare,
"expected '[' in catchpad/cleanuppad"))
7849 if (!
Args.empty() &&
7850 parseToken(
lltok::comma,
"expected ',' in argument list"))
7855 Type *ArgTy =
nullptr;
7856 if (parseType(ArgTy, ArgLoc))
7861 if (parseMetadataAsValue(V, PFS))
7864 if (parseValue(ArgTy, V, PFS))
7876bool LLParser::parseCleanupRet(Instruction *&Inst, PerFunctionState &PFS) {
7877 Value *CleanupPad =
nullptr;
7879 if (parseToken(
lltok::kw_from,
"expected 'from' after cleanupret"))
7894 if (parseTypeAndBasicBlock(UnwindBB, PFS)) {
7905bool LLParser::parseCatchRet(Instruction *&Inst, PerFunctionState &PFS) {
7906 Value *CatchPad =
nullptr;
7908 if (parseToken(
lltok::kw_from,
"expected 'from' after catchret"))
7915 if (parseToken(
lltok::kw_to,
"expected 'to' in catchret") ||
7916 parseTypeAndBasicBlock(BB, PFS))
7925bool LLParser::parseCatchSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7933 return tokError(
"expected scope value for catchswitch");
7938 if (parseToken(
lltok::lsquare,
"expected '[' with catchswitch labels"))
7944 if (parseTypeAndBasicBlock(DestBB, PFS))
7949 if (parseToken(
lltok::rsquare,
"expected ']' after catchswitch labels"))
7952 if (parseToken(
lltok::kw_unwind,
"expected 'unwind' after catchswitch scope"))
7960 if (parseTypeAndBasicBlock(UnwindBB, PFS))
7966 for (BasicBlock *DestBB : Table)
7967 CatchSwitch->addHandler(DestBB);
7974bool LLParser::parseCatchPad(Instruction *&Inst, PerFunctionState &PFS) {
7975 Value *CatchSwitch =
nullptr;
7981 return tokError(
"expected scope value for catchpad");
7986 SmallVector<Value *, 8>
Args;
7987 if (parseExceptionArgs(Args, PFS))
7996bool LLParser::parseCleanupPad(Instruction *&Inst, PerFunctionState &PFS) {
7997 Value *ParentPad =
nullptr;
8004 return tokError(
"expected scope value for cleanuppad");
8009 SmallVector<Value *, 8>
Args;
8010 if (parseExceptionArgs(Args, PFS))
8026bool LLParser::parseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
8027 unsigned Opc,
bool IsFP) {
8029 if (parseTypeAndValue(
LHS, Loc, PFS))
8036 return error(Loc,
"invalid operand type for instruction");
8046bool LLParser::parseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
8047 LocTy CallLoc = Lex.getLoc();
8048 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8049 std::vector<unsigned> FwdRefAttrGrps;
8052 Type *RetType =
nullptr;
8059 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8060 parseType(RetType, RetTypeLoc,
true ) ||
8061 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
8062 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
8064 parseOptionalOperandBundles(BundleList, PFS) ||
8066 parseTypeAndBasicBlock(DefaultDest, PFS) ||
8071 SmallVector<BasicBlock *, 16> IndirectDests;
8075 if (parseTypeAndBasicBlock(DestBB, PFS))
8080 if (parseTypeAndBasicBlock(DestBB, PFS))
8086 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
8093 if (resolveFunctionType(RetType, ArgList, Ty))
8094 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8105 SmallVector<Value *, 8>
Args;
8112 for (
const ParamInfo &Arg : ArgList) {
8113 Type *ExpectedTy =
nullptr;
8116 }
else if (!Ty->isVarArg()) {
8117 return error(Arg.Loc,
"too many arguments specified");
8120 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8121 return error(Arg.Loc,
"argument is not of expected type '" +
8123 Args.push_back(Arg.V);
8128 return error(CallLoc,
"not enough parameters specified for call");
8140 ForwardRefAttrGroups[CBI] = FwdRefAttrGrps;
8154bool LLParser::parseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
8155 unsigned Opc,
bool IsFP) {
8157 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8158 parseToken(
lltok::comma,
"expected ',' in arithmetic operation") ||
8166 return error(Loc,
"invalid operand type for instruction");
8174bool LLParser::parseLogical(Instruction *&Inst, PerFunctionState &PFS,
8177 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8178 parseToken(
lltok::comma,
"expected ',' in logical operation") ||
8184 "instruction requires integer or integer vector operands");
8193bool LLParser::parseCompare(Instruction *&Inst, PerFunctionState &PFS,
8199 if (parseCmpPredicate(Pred,
Opc) || parseTypeAndValue(
LHS, Loc, PFS) ||
8200 parseToken(
lltok::comma,
"expected ',' after compare value") ||
8204 if (
Opc == Instruction::FCmp) {
8206 return error(Loc,
"fcmp requires floating point operands");
8209 assert(
Opc == Instruction::ICmp &&
"Unknown opcode for CmpInst!");
8212 return error(Loc,
"icmp requires integer operands");
8224bool LLParser::parseCast(Instruction *&Inst, PerFunctionState &PFS,
8228 Type *DestTy =
nullptr;
8229 if (parseTypeAndValue(
Op, Loc, PFS) ||
8230 parseToken(
lltok::kw_to,
"expected 'to' after cast value") ||
8235 return error(Loc,
"invalid cast opcode for cast from '" +
8244bool LLParser::parseSelect(Instruction *&Inst, PerFunctionState &PFS) {
8246 Value *Op0, *Op1, *Op2;
8247 if (parseTypeAndValue(Op0, Loc, PFS) ||
8248 parseToken(
lltok::comma,
"expected ',' after select condition") ||
8249 parseTypeAndValue(Op1, PFS) ||
8250 parseToken(
lltok::comma,
"expected ',' after select value") ||
8251 parseTypeAndValue(Op2, PFS))
8255 return error(Loc, Reason);
8263bool LLParser::parseVAArg(Instruction *&Inst, PerFunctionState &PFS) {
8265 Type *EltTy =
nullptr;
8267 if (parseTypeAndValue(
Op, PFS) ||
8268 parseToken(
lltok::comma,
"expected ',' after vaarg operand") ||
8269 parseType(EltTy, TypeLoc))
8273 return error(TypeLoc,
"va_arg requires operand with first class type");
8275 Inst =
new VAArgInst(
Op, EltTy);
8281bool LLParser::parseExtractElement(Instruction *&Inst, PerFunctionState &PFS) {
8284 if (parseTypeAndValue(Op0, Loc, PFS) ||
8285 parseToken(
lltok::comma,
"expected ',' after extract value") ||
8286 parseTypeAndValue(Op1, PFS))
8290 return error(Loc,
"invalid extractelement operands");
8298bool LLParser::parseInsertElement(Instruction *&Inst, PerFunctionState &PFS) {
8300 Value *Op0, *Op1, *Op2;
8301 if (parseTypeAndValue(Op0, Loc, PFS) ||
8302 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8303 parseTypeAndValue(Op1, PFS) ||
8304 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8305 parseTypeAndValue(Op2, PFS))
8309 return error(Loc,
"invalid insertelement operands");
8317bool LLParser::parseShuffleVector(Instruction *&Inst, PerFunctionState &PFS) {
8319 Value *Op0, *Op1, *Op2;
8320 if (parseTypeAndValue(Op0, Loc, PFS) ||
8321 parseToken(
lltok::comma,
"expected ',' after shuffle mask") ||
8322 parseTypeAndValue(Op1, PFS) ||
8323 parseToken(
lltok::comma,
"expected ',' after shuffle value") ||
8324 parseTypeAndValue(Op2, PFS))
8328 return error(Loc,
"invalid shufflevector operands");
8330 Inst =
new ShuffleVectorInst(Op0, Op1, Op2);
8336int LLParser::parsePHI(Instruction *&Inst, PerFunctionState &PFS) {
8340 if (parseType(Ty, TypeLoc))
8344 return error(TypeLoc,
"phi node must have first class type");
8347 bool AteExtraComma =
false;
8359 AteExtraComma =
true;
8363 if (parseToken(
lltok::lsquare,
"expected '[' in phi value list") ||
8364 parseValue(Ty, Op0, PFS) ||
8365 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8374 for (
const auto &[Val, BB] : PHIVals)
8377 return AteExtraComma ? InstExtraComma : InstNormal;
8386bool LLParser::parseLandingPad(Instruction *&Inst, PerFunctionState &PFS) {
8389 if (parseType(Ty, TyLoc))
8402 return tokError(
"expected 'catch' or 'filter' clause type");
8406 if (parseTypeAndValue(V, VLoc, PFS))
8413 return error(VLoc,
"'catch' clause has an invalid type");
8416 return error(VLoc,
"'filter' clause has an invalid type");
8421 return error(VLoc,
"clause argument must be a constant");
8425 Inst = LP.release();
8431bool LLParser::parseFreeze(Instruction *&Inst, PerFunctionState &PFS) {
8434 if (parseTypeAndValue(
Op, Loc, PFS))
8437 Inst =
new FreezeInst(
Op);
8450bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS,
8452 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8453 std::vector<unsigned> FwdRefAttrGrps;
8455 unsigned CallAddrSpace;
8457 Type *RetType =
nullptr;
8462 LocTy CallLoc = Lex.getLoc();
8466 "expected 'tail call', 'musttail call', or 'notail call'"))
8469 FastMathFlags FMF = EatFastMathFlagsIfPresent();
8471 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8472 parseOptionalProgramAddrSpace(CallAddrSpace) ||
8473 parseType(RetType, RetTypeLoc,
true ) ||
8474 parseValID(CalleeID, &PFS) ||
8476 PFS.getFunction().isVarArg()) ||
8477 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false, BuiltinLoc) ||
8478 parseOptionalOperandBundles(BundleList, PFS))
8485 if (resolveFunctionType(RetType, ArgList, Ty))
8486 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8492 if (convertValIDToValue(
PointerType::get(Context, CallAddrSpace), CalleeID,
8499 SmallVector<Value*, 8>
Args;
8505 for (
const ParamInfo &Arg : ArgList) {
8506 Type *ExpectedTy =
nullptr;
8509 }
else if (!Ty->isVarArg()) {
8510 return error(Arg.Loc,
"too many arguments specified");
8513 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8514 return error(Arg.Loc,
"argument is not of expected type '" +
8516 Args.push_back(Arg.V);
8517 Attrs.push_back(Arg.Attrs);
8521 return error(CallLoc,
"not enough parameters specified for call");
8534 return error(CallLoc,
"fast-math-flags specified for call without "
8535 "floating-point scalar or vector return type");
8542 if (SeenNewDbgInfoFormat) {
8544 return error(CallLoc,
"llvm.dbg intrinsic should not appear in a module "
8545 "using non-intrinsic debug info");
8547 SeenOldDbgInfoFormat =
true;
8550 ForwardRefAttrGroups[CI] = FwdRefAttrGrps;
8562int LLParser::parseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
8564 LocTy SizeLoc, TyLoc, ASLoc;
8565 MaybeAlign Alignment;
8566 unsigned AddrSpace = 0;
8569 bool IsInAlloca = EatIfPresent(lltok::kw_inalloca);
8570 bool IsSwiftError = EatIfPresent(lltok::kw_swifterror);
8572 if (parseType(Ty, TyLoc))
8576 return error(TyLoc,
"invalid type for alloca");
8578 bool AteExtraComma =
false;
8580 if (Lex.getKind() == lltok::kw_align) {
8581 if (parseOptionalAlignment(Alignment))
8583 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8586 ASLoc = Lex.getLoc();
8587 if (parseOptionalAddrSpace(AddrSpace))
8590 AteExtraComma =
true;
8592 if (parseTypeAndValue(
Size, SizeLoc, PFS))
8595 if (Lex.getKind() == lltok::kw_align) {
8596 if (parseOptionalAlignment(Alignment))
8598 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8601 ASLoc = Lex.getLoc();
8602 if (parseOptionalAddrSpace(AddrSpace))
8605 AteExtraComma =
true;
8611 if (
Size && !
Size->getType()->isIntegerTy())
8612 return error(SizeLoc,
"element count must have integer type");
8614 SmallPtrSet<Type *, 4> Visited;
8615 if (!Alignment && !Ty->
isSized(&Visited))
8616 return error(TyLoc,
"Cannot allocate unsized type");
8618 Alignment = M->getDataLayout().getPrefTypeAlign(Ty);
8619 AllocaInst *AI =
new AllocaInst(Ty, AddrSpace,
Size, *Alignment);
8623 return AteExtraComma ? InstExtraComma : InstNormal;
8630int LLParser::parseLoad(Instruction *&Inst, PerFunctionState &PFS) {
8632 MaybeAlign Alignment;
8633 bool AteExtraComma =
false;
8634 bool isAtomic =
false;
8643 bool isVolatile =
false;
8650 LocTy ExplicitTypeLoc = Lex.getLoc();
8651 if (parseType(Ty) ||
8652 parseToken(
lltok::comma,
"expected comma after load's type") ||
8653 parseTypeAndValue(Val, Loc, PFS) ||
8654 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8655 parseOptionalCommaAlign(Alignment, AteExtraComma))
8659 return error(Loc,
"load operand must be a pointer to a first class type");
8660 if (isAtomic && !Alignment)
8661 return error(Loc,
"atomic load must have explicit non-zero alignment");
8664 return error(Loc,
"atomic load cannot use Release ordering");
8666 SmallPtrSet<Type *, 4> Visited;
8667 if (!Alignment && !Ty->
isSized(&Visited))
8668 return error(ExplicitTypeLoc,
"loading unsized types is not allowed");
8670 Alignment = M->getDataLayout().getABITypeAlign(Ty);
8671 Inst =
new LoadInst(Ty, Val,
"", isVolatile, *Alignment, Ordering, SSID);
8672 return AteExtraComma ? InstExtraComma : InstNormal;
8680int LLParser::parseStore(Instruction *&Inst, PerFunctionState &PFS) {
8682 MaybeAlign Alignment;
8683 bool AteExtraComma =
false;
8684 bool isAtomic =
false;
8693 bool isVolatile =
false;
8699 if (parseTypeAndValue(Val, Loc, PFS) ||
8700 parseToken(
lltok::comma,
"expected ',' after store operand") ||
8701 parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8702 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8703 parseOptionalCommaAlign(Alignment, AteExtraComma))
8707 return error(PtrLoc,
"store operand must be a pointer");
8709 return error(Loc,
"store operand must be a first class value");
8710 if (isAtomic && !Alignment)
8711 return error(Loc,
"atomic store must have explicit non-zero alignment");
8714 return error(Loc,
"atomic store cannot use Acquire ordering");
8715 SmallPtrSet<Type *, 4> Visited;
8717 return error(Loc,
"storing unsized types is not allowed");
8719 Alignment = M->getDataLayout().getABITypeAlign(Val->
getType());
8721 Inst =
new StoreInst(Val, Ptr, isVolatile, *Alignment, Ordering, SSID);
8722 return AteExtraComma ? InstExtraComma : InstNormal;
8729int LLParser::parseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {
8731 bool AteExtraComma =
false;
8735 bool isVolatile =
false;
8736 bool isWeak =
false;
8737 MaybeAlign Alignment;
8745 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8746 parseToken(
lltok::comma,
"expected ',' after cmpxchg address") ||
8747 parseTypeAndValue(Cmp, CmpLoc, PFS) ||
8748 parseToken(
lltok::comma,
"expected ',' after cmpxchg cmp operand") ||
8749 parseTypeAndValue(New, NewLoc, PFS) ||
8750 parseScopeAndOrdering(
true , SSID, SuccessOrdering) ||
8751 parseOrdering(FailureOrdering) ||
8752 parseOptionalCommaAlign(Alignment, AteExtraComma))
8756 return tokError(
"invalid cmpxchg success ordering");
8758 return tokError(
"invalid cmpxchg failure ordering");
8760 return error(PtrLoc,
"cmpxchg operand must be a pointer");
8761 if (
Cmp->getType() !=
New->getType())
8762 return error(NewLoc,
"compare value and new value type do not match");
8763 if (!
New->getType()->isFirstClassType())
8764 return error(NewLoc,
"cmpxchg operand must be a first class value");
8766 const Align DefaultAlignment(
8767 PFS.getFunction().getDataLayout().getTypeStoreSize(
8770 AtomicCmpXchgInst *CXI =
8771 new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment.value_or(DefaultAlignment),
8772 SuccessOrdering, FailureOrdering, SSID);
8777 return AteExtraComma ? InstExtraComma : InstNormal;
8783int LLParser::parseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {
8785 bool AteExtraComma =
false;
8788 bool isVolatile =
false;
8791 MaybeAlign Alignment;
8796 switch (Lex.getKind()) {
8798 return tokError(
"expected binary operation in atomicrmw");
8849 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8850 parseToken(
lltok::comma,
"expected ',' after atomicrmw address") ||
8851 parseTypeAndValue(Val, ValLoc, PFS) ||
8852 parseScopeAndOrdering(
true , SSID, Ordering) ||
8853 parseOptionalCommaAlign(Alignment, AteExtraComma))
8857 return tokError(
"atomicrmw cannot be unordered");
8859 return error(PtrLoc,
"atomicrmw operand must be a pointer");
8861 return error(ValLoc,
"atomicrmw operand may not be scalable");
8870 " operand must be an integer, floating point, or pointer type");
8874 return error(ValLoc,
"atomicrmw " +
8876 " operand must be a floating point type");
8880 return error(ValLoc,
"atomicrmw " +
8882 " operand must be an integer");
8887 PFS.getFunction().getDataLayout().getTypeStoreSizeInBits(
8890 return error(ValLoc,
"atomicrmw operand must be power-of-two byte-sized"
8892 const Align DefaultAlignment(
8893 PFS.getFunction().getDataLayout().getTypeStoreSize(
8895 AtomicRMWInst *RMWI =
8897 Alignment.value_or(DefaultAlignment), Ordering, SSID);
8900 return AteExtraComma ? InstExtraComma : InstNormal;
8905int LLParser::parseFence(Instruction *&Inst, PerFunctionState &PFS) {
8908 if (parseScopeAndOrdering(
true , SSID, Ordering))
8912 return tokError(
"fence cannot be unordered");
8914 return tokError(
"fence cannot be monotonic");
8916 Inst =
new FenceInst(Context, Ordering, SSID);
8922int LLParser::parseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
8923 Value *Ptr =
nullptr;
8924 Value *Val =
nullptr;
8940 if (parseType(Ty) ||
8941 parseToken(
lltok::comma,
"expected comma after getelementptr's type") ||
8942 parseTypeAndValue(Ptr, Loc, PFS))
8947 if (!BasePointerType)
8948 return error(Loc,
"base of getelementptr must be a pointer");
8950 SmallVector<Value*, 16> Indices;
8951 bool AteExtraComma =
false;
8954 ElementCount GEPWidth =
BaseType->isVectorTy()
8960 AteExtraComma =
true;
8963 if (parseTypeAndValue(Val, EltLoc, PFS))
8966 return error(EltLoc,
"getelementptr index must be an integer");
8969 ElementCount ValNumEl = ValVTy->getElementCount();
8973 "getelementptr vector index has a wrong number of elements");
8974 GEPWidth = ValNumEl;
8979 SmallPtrSet<Type*, 4> Visited;
8981 return error(Loc,
"base element of getelementptr must be sized");
8985 return error(Loc,
"getelementptr cannot target structure that contains "
8986 "scalable vector type");
8989 return error(Loc,
"invalid getelementptr indices");
8992 GEP->setNoWrapFlags(NW);
8993 return AteExtraComma ? InstExtraComma : InstNormal;
8998int LLParser::parseExtractValue(Instruction *&Inst, PerFunctionState &PFS) {
9000 SmallVector<unsigned, 4> Indices;
9002 if (parseTypeAndValue(Val, Loc, PFS) ||
9003 parseIndexList(Indices, AteExtraComma))
9007 return error(Loc,
"extractvalue operand must be aggregate type");
9010 return error(Loc,
"invalid indices for extractvalue");
9012 return AteExtraComma ? InstExtraComma : InstNormal;
9017int LLParser::parseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
9019 SmallVector<unsigned, 4> Indices;
9021 if (parseTypeAndValue(Val0, Loc0, PFS) ||
9022 parseToken(
lltok::comma,
"expected comma after insertvalue operand") ||
9023 parseTypeAndValue(Val1, Loc1, PFS) ||
9024 parseIndexList(Indices, AteExtraComma))
9028 return error(Loc0,
"insertvalue operand must be aggregate type");
9032 return error(Loc0,
"invalid indices for insertvalue");
9033 if (IndexedType != Val1->
getType())
9034 return error(Loc1,
"insertvalue operand and field disagree in type: '" +
9038 return AteExtraComma ? InstExtraComma : InstNormal;
9049bool LLParser::parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts) {
9064 if (parseMetadata(MD,
nullptr))
9069 return parseToken(
lltok::rbrace,
"expected end of metadata node");
9075bool LLParser::sortUseListOrder(
Value *V, ArrayRef<unsigned> Indexes,
9077 if (!
V->hasUseList())
9080 return error(Loc,
"value has no uses");
9082 unsigned NumUses = 0;
9083 SmallDenseMap<const Use *, unsigned, 16> Order;
9084 for (
const Use &U :
V->uses()) {
9085 if (++NumUses > Indexes.
size())
9087 Order[&
U] = Indexes[NumUses - 1];
9090 return error(Loc,
"value only has one use");
9091 if (Order.
size() != Indexes.
size() || NumUses > Indexes.
size())
9093 "wrong number of indexes, expected " + Twine(
V->getNumUses()));
9095 V->sortUseList([&](
const Use &L,
const Use &R) {
9103bool LLParser::parseUseListOrderIndexes(SmallVectorImpl<unsigned> &Indexes) {
9104 SMLoc Loc = Lex.getLoc();
9108 return tokError(
"expected non-empty list of uselistorder indexes");
9115 bool IsOrdered =
true;
9116 assert(Indexes.
empty() &&
"Expected empty order vector");
9119 if (parseUInt32(Index))
9124 Max = std::max(Max, Index);
9125 IsOrdered &= Index == Indexes.
size();
9133 if (Indexes.
size() < 2)
9134 return error(Loc,
"expected >= 2 uselistorder indexes");
9137 "expected distinct uselistorder indexes in range [0, size)");
9139 return error(Loc,
"expected uselistorder indexes to change the order");
9146bool LLParser::parseUseListOrder(PerFunctionState *PFS) {
9147 SMLoc Loc = Lex.getLoc();
9152 SmallVector<unsigned, 16> Indexes;
9153 if (parseTypeAndValue(V, PFS) ||
9154 parseToken(
lltok::comma,
"expected comma in uselistorder directive") ||
9155 parseUseListOrderIndexes(Indexes))
9158 return sortUseListOrder(V, Indexes, Loc);
9163bool LLParser::parseUseListOrderBB() {
9165 SMLoc Loc = Lex.getLoc();
9169 SmallVector<unsigned, 16> Indexes;
9170 if (parseValID(Fn,
nullptr) ||
9171 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9172 parseValID(Label,
nullptr) ||
9173 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9174 parseUseListOrderIndexes(Indexes))
9180 GV = M->getNamedValue(Fn.
StrVal);
9182 GV = NumberedVals.get(Fn.
UIntVal);
9184 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9187 "invalid function forward reference in uselistorder_bb");
9190 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9191 if (
F->isDeclaration())
9192 return error(Fn.
Loc,
"invalid declaration in uselistorder_bb");
9196 return error(
Label.Loc,
"invalid numeric label in uselistorder_bb");
9198 return error(
Label.Loc,
"expected basic block name in uselistorder_bb");
9199 Value *
V =
F->getValueSymbolTable()->lookup(
Label.StrVal);
9201 return error(
Label.Loc,
"invalid basic block in uselistorder_bb");
9203 return error(
Label.Loc,
"expected basic block in uselistorder_bb");
9205 return sortUseListOrder(V, Indexes, Loc);
9211bool LLParser::parseModuleEntry(
unsigned ID) {
9220 parseStringConstant(Path) ||
9228 if (parseUInt32(Hash[0]) || parseToken(
lltok::comma,
"expected ',' here") ||
9229 parseUInt32(Hash[1]) || parseToken(
lltok::comma,
"expected ',' here") ||
9230 parseUInt32(Hash[2]) || parseToken(
lltok::comma,
"expected ',' here") ||
9231 parseUInt32(Hash[3]) || parseToken(
lltok::comma,
"expected ',' here") ||
9232 parseUInt32(Hash[4]))
9239 auto ModuleEntry = Index->addModule(Path, Hash);
9240 ModuleIdMap[
ID] = ModuleEntry->first();
9247bool LLParser::parseTypeIdEntry(
unsigned ID) {
9256 parseStringConstant(Name))
9259 TypeIdSummary &TIS = Index->getOrInsertTypeIdSummary(Name);
9261 parseTypeIdSummary(TIS) || parseToken(
lltok::rparen,
"expected ')' here"))
9266 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9267 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9268 for (
auto TIDRef : FwdRefTIDs->second) {
9270 "Forward referenced type id GUID expected to be 0");
9273 ForwardRefTypeIds.erase(FwdRefTIDs);
9281bool LLParser::parseTypeIdSummary(TypeIdSummary &TIS) {
9285 parseTypeTestResolution(TIS.
TTRes))
9290 if (parseOptionalWpdResolutions(TIS.
WPDRes))
9301 ValueInfo(
false, (GlobalValueSummaryMapTy::value_type *)-8);
9307bool LLParser::parseTypeIdCompatibleVtableEntry(
unsigned ID) {
9316 parseStringConstant(Name))
9320 Index->getOrInsertTypeIdCompatibleVtableSummary(Name);
9327 IdToIndexMapType IdToIndexMap;
9340 if (parseGVReference(VI, GVId))
9347 IdToIndexMap[GVId].push_back(std::make_pair(TI.size(),
Loc));
9348 TI.push_back({
Offset, VI});
9356 for (
auto I : IdToIndexMap) {
9357 auto &Infos = ForwardRefValueInfos[
I.first];
9358 for (
auto P :
I.second) {
9360 "Forward referenced ValueInfo expected to be empty");
9361 Infos.emplace_back(&TI[
P.first].VTableVI,
P.second);
9371 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9372 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9373 for (
auto TIDRef : FwdRefTIDs->second) {
9375 "Forward referenced type id GUID expected to be 0");
9378 ForwardRefTypeIds.erase(FwdRefTIDs);
9390bool LLParser::parseTypeTestResolution(TypeTestResolution &TTRes) {
9398 switch (Lex.getKind()) {
9418 return error(Lex.getLoc(),
"unexpected TypeTestResolution kind");
9430 switch (Lex.getKind()) {
9445 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(Val))
9458 return error(Lex.getLoc(),
"expected optional TypeTestResolution field");
9471bool LLParser::parseOptionalWpdResolutions(
9472 std::map<uint64_t, WholeProgramDevirtResolution> &WPDResMap) {
9480 WholeProgramDevirtResolution WPDRes;
9484 parseToken(
lltok::comma,
"expected ',' here") || parseWpdRes(WPDRes) ||
9487 WPDResMap[
Offset] = WPDRes;
9504bool LLParser::parseWpdRes(WholeProgramDevirtResolution &WPDRes) {
9512 switch (Lex.getKind()) {
9523 return error(Lex.getLoc(),
"unexpected WholeProgramDevirtResolution kind");
9529 switch (Lex.getKind()) {
9537 if (parseOptionalResByArg(WPDRes.
ResByArg))
9541 return error(Lex.getLoc(),
9542 "expected optional WholeProgramDevirtResolution field");
9559bool LLParser::parseOptionalResByArg(
9560 std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>
9568 std::vector<uint64_t>
Args;
9569 if (parseArgs(Args) || parseToken(
lltok::comma,
"expected ',' here") ||
9577 WholeProgramDevirtResolution::ByArg ByArg;
9578 switch (Lex.getKind()) {
9592 return error(Lex.getLoc(),
9593 "unexpected WholeProgramDevirtResolution::ByArg kind");
9599 switch (Lex.getKind()) {
9603 parseUInt64(ByArg.
Info))
9609 parseUInt32(ByArg.
Byte))
9615 parseUInt32(ByArg.
Bit))
9619 return error(Lex.getLoc(),
9620 "expected optional whole program devirt field");
9627 ResByArg[
Args] = ByArg;
9638bool LLParser::parseArgs(std::vector<uint64_t> &Args) {
9646 if (parseUInt64(Val))
9648 Args.push_back(Val);
9657static const auto FwdVIRef = (GlobalValueSummaryMapTy::value_type *)-8;
9662 assert(!(ReadOnly && WriteOnly));
9672bool LLParser::addGlobalValueToIndex(
9674 unsigned ID, std::unique_ptr<GlobalValueSummary> Summary,
LocTy Loc) {
9679 VI = Index->getOrInsertValueInfo(GUID);
9683 auto *GV = M->getNamedValue(Name);
9685 return error(Loc,
"Reference to undefined global \"" + Name +
"\"");
9687 VI = Index->getOrInsertValueInfo(GV);
9691 "Need a source_filename to compute GUID for local");
9694 VI = Index->getOrInsertValueInfo(GUID, Index->saveString(Name));
9699 auto FwdRefVIs = ForwardRefValueInfos.find(
ID);
9700 if (FwdRefVIs != ForwardRefValueInfos.end()) {
9701 for (
auto VIRef : FwdRefVIs->second) {
9703 "Forward referenced ValueInfo expected to be empty");
9706 ForwardRefValueInfos.erase(FwdRefVIs);
9710 auto FwdRefAliasees = ForwardRefAliasees.find(
ID);
9711 if (FwdRefAliasees != ForwardRefAliasees.end()) {
9712 for (
auto AliaseeRef : FwdRefAliasees->second) {
9713 assert(!AliaseeRef.first->hasAliasee() &&
9714 "Forward referencing alias already has aliasee");
9715 assert(Summary &&
"Aliasee must be a definition");
9716 AliaseeRef.first->setAliasee(VI,
Summary.get());
9718 ForwardRefAliasees.erase(FwdRefAliasees);
9723 Index->addGlobalValueSummary(VI, std::move(Summary));
9726 if (
ID == NumberedValueInfos.size())
9727 NumberedValueInfos.push_back(VI);
9730 if (
ID > NumberedValueInfos.size())
9731 NumberedValueInfos.resize(
ID + 1);
9732 NumberedValueInfos[
ID] =
VI;
9740bool LLParser::parseSummaryIndexFlags() {
9747 if (parseUInt64(Flags))
9750 Index->setFlags(Flags);
9756bool LLParser::parseBlockCount() {
9762 uint64_t BlockCount;
9763 if (parseUInt64(BlockCount))
9766 Index->setBlockCount(BlockCount);
9774bool LLParser::parseGVEntry(
unsigned ID) {
9782 LocTy Loc = Lex.getLoc();
9785 switch (Lex.getKind()) {
9789 parseStringConstant(Name))
9795 if (parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(GUID))
9799 return error(Lex.getLoc(),
"expected name or guid tag");
9822 switch (Lex.getKind()) {
9824 if (parseFunctionSummary(Name, GUID,
ID))
9828 if (parseVariableSummary(Name, GUID,
ID))
9832 if (parseAliasSummary(Name, GUID,
ID))
9836 return error(Lex.getLoc(),
"expected summary type");
9854 LocTy Loc = Lex.getLoc();
9858 StringRef ModulePath;
9859 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9862 false,
false,
false,
9866 FunctionSummary::TypeIdInfo TypeIdInfo;
9867 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
9869 std::vector<CallsiteInfo> Callsites;
9870 std::vector<AllocInfo> Allocs;
9872 FunctionSummary::FFlags FFlags = {};
9875 parseModuleReference(ModulePath) ||
9876 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9879 parseToken(
lltok::colon,
"expected ':' here") || parseUInt32(InstCount))
9884 switch (Lex.getKind()) {
9886 if (parseOptionalFFlags(FFlags))
9890 if (parseOptionalCalls(Calls))
9894 if (parseOptionalTypeIdInfo(TypeIdInfo))
9898 if (parseOptionalRefs(Refs))
9902 if (parseOptionalParamAccesses(ParamAccesses))
9906 if (parseOptionalAllocs(Allocs))
9910 if (parseOptionalCallsites(Callsites))
9914 return error(Lex.getLoc(),
"expected optional function summary field");
9921 auto FS = std::make_unique<FunctionSummary>(
9922 GVFlags, InstCount, FFlags, std::move(Refs), std::move(Calls),
9928 std::move(ParamAccesses), std::move(Callsites), std::move(Allocs));
9930 FS->setModulePath(ModulePath);
9932 return addGlobalValueToIndex(Name, GUID,
9934 std::move(FS), Loc);
9942 LocTy Loc = Lex.getLoc();
9946 StringRef ModulePath;
9947 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9950 false,
false,
false,
9952 GlobalVarSummary::GVarFlags GVarFlags(
false,
9960 parseModuleReference(ModulePath) ||
9961 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9963 parseGVarFlags(GVarFlags))
9968 switch (Lex.getKind()) {
9970 if (parseOptionalVTableFuncs(VTableFuncs))
9974 if (parseOptionalRefs(Refs))
9978 return error(Lex.getLoc(),
"expected optional variable summary field");
9986 std::make_unique<GlobalVarSummary>(GVFlags, GVarFlags, std::move(Refs));
9988 GS->setModulePath(ModulePath);
9989 GS->setVTableFuncs(std::move(VTableFuncs));
9991 return addGlobalValueToIndex(Name, GUID,
9993 std::move(GS), Loc);
10002 LocTy Loc = Lex.getLoc();
10005 StringRef ModulePath;
10006 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
10009 false,
false,
false,
10013 parseModuleReference(ModulePath) ||
10014 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
10020 ValueInfo AliaseeVI;
10022 auto AS = std::make_unique<AliasSummary>(GVFlags);
10023 AS->setModulePath(ModulePath);
10026 if (parseGVReference(AliaseeVI, GVId))
10031 ForwardRefAliasees[GVId].emplace_back(AS.get(), Loc);
10033 auto Summary = Index->findSummaryInModule(AliaseeVI, ModulePath);
10034 assert(Summary &&
"Aliasee must be a definition");
10035 AS->setAliasee(AliaseeVI, Summary);
10042 return addGlobalValueToIndex(Name, GUID,
10044 std::move(AS), Loc);
10049bool LLParser::parseFlag(
unsigned &Val) {
10050 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
10051 return tokError(
"expected integer");
10052 Val = (unsigned)Lex.getAPSIntVal().getBoolValue();
10068bool LLParser::parseOptionalFFlags(FunctionSummary::FFlags &FFlags) {
10072 if (parseToken(
lltok::colon,
"expected ':' in funcFlags") ||
10078 switch (Lex.getKind()) {
10081 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10087 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10093 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10099 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10105 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10111 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10117 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10123 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10129 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10135 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10140 return error(Lex.getLoc(),
"expected function flag type");
10144 if (parseToken(
lltok::rparen,
"expected ')' in funcFlags"))
10155bool LLParser::parseOptionalCalls(
10156 SmallVectorImpl<FunctionSummary::EdgeTy> &Calls) {
10160 if (parseToken(
lltok::colon,
"expected ':' in calls") ||
10164 IdToIndexMapType IdToIndexMap;
10173 LocTy Loc = Lex.getLoc();
10175 if (parseGVReference(VI, GVId))
10179 unsigned RelBF = 0;
10180 unsigned HasTailCall =
false;
10184 switch (Lex.getKind()) {
10187 if (parseToken(
lltok::colon,
"expected ':'") || parseHotness(Hotness))
10193 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(RelBF))
10198 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(HasTailCall))
10202 return error(Lex.getLoc(),
"expected hotness, relbf, or tail");
10209 IdToIndexMap[GVId].push_back(std::make_pair(Calls.
size(), Loc));
10219 for (
auto I : IdToIndexMap) {
10220 auto &Infos = ForwardRefValueInfos[
I.first];
10221 for (
auto P :
I.second) {
10223 "Forward referenced ValueInfo expected to be empty");
10224 Infos.emplace_back(&Calls[
P.first].first,
P.second);
10237 switch (Lex.getKind()) {
10241 case lltok::kw_cold:
10247 case lltok::kw_hot:
10254 return error(Lex.getLoc(),
"invalid call edge hotness");
10263bool LLParser::parseOptionalVTableFuncs(
VTableFuncList &VTableFuncs) {
10267 if (parseToken(
lltok::colon,
"expected ':' in vTableFuncs") ||
10271 IdToIndexMapType IdToIndexMap;
10275 if (parseToken(
lltok::lparen,
"expected '(' in vTableFunc") ||
10280 LocTy Loc = Lex.getLoc();
10282 if (parseGVReference(VI, GVId))
10295 IdToIndexMap[GVId].push_back(std::make_pair(VTableFuncs.size(), Loc));
10296 VTableFuncs.push_back({
VI,
Offset});
10298 if (parseToken(
lltok::rparen,
"expected ')' in vTableFunc"))
10304 for (
auto I : IdToIndexMap) {
10305 auto &Infos = ForwardRefValueInfos[
I.first];
10306 for (
auto P :
I.second) {
10308 "Forward referenced ValueInfo expected to be empty");
10309 Infos.emplace_back(&VTableFuncs[
P.first].FuncVI,
P.second);
10313 if (parseToken(
lltok::rparen,
"expected ')' in vTableFuncs"))
10320bool LLParser::parseParamNo(uint64_t &ParamNo) {
10322 parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(ParamNo))
10328bool LLParser::parseParamAccessOffset(ConstantRange &
Range) {
10331 auto ParseAPSInt = [&](
APSInt &Val) {
10333 return tokError(
"expected integer");
10334 Val = Lex.getAPSIntVal();
10336 Val.setIsSigned(
true);
10358bool LLParser::parseParamAccessCall(FunctionSummary::ParamAccess::Call &
Call,
10359 IdLocListType &IdLocList) {
10367 LocTy Loc = Lex.getLoc();
10368 if (parseGVReference(VI, GVId))
10372 IdLocList.emplace_back(GVId, Loc);
10375 parseParamNo(
Call.ParamNo) ||
10377 parseParamAccessOffset(
Call.Offsets))
10389bool LLParser::parseParamAccess(FunctionSummary::ParamAccess &Param,
10390 IdLocListType &IdLocList) {
10392 parseParamNo(
Param.ParamNo) ||
10394 parseParamAccessOffset(
Param.Use))
10403 FunctionSummary::ParamAccess::Call
Call;
10404 if (parseParamAccessCall(
Call, IdLocList))
10421bool LLParser::parseOptionalParamAccesses(
10422 std::vector<FunctionSummary::ParamAccess> &Params) {
10430 IdLocListType VContexts;
10431 size_t CallsNum = 0;
10433 FunctionSummary::ParamAccess ParamAccess;
10434 if (parseParamAccess(ParamAccess, VContexts))
10436 CallsNum += ParamAccess.
Calls.size();
10437 assert(VContexts.size() == CallsNum);
10439 Params.emplace_back(std::move(ParamAccess));
10447 IdLocListType::const_iterator ItContext = VContexts.begin();
10448 for (
auto &PA : Params) {
10449 for (
auto &
C : PA.Calls) {
10451 ForwardRefValueInfos[ItContext->first].emplace_back(&
C.Callee,
10452 ItContext->second);
10456 assert(ItContext == VContexts.end());
10463bool LLParser::parseOptionalRefs(SmallVectorImpl<ValueInfo> &Refs) {
10467 if (parseToken(
lltok::colon,
"expected ':' in refs") ||
10471 struct ValueContext {
10476 std::vector<ValueContext> VContexts;
10480 VC.Loc = Lex.getLoc();
10481 if (parseGVReference(
VC.VI,
VC.GVId))
10483 VContexts.push_back(VC);
10489 llvm::sort(VContexts, [](
const ValueContext &VC1,
const ValueContext &VC2) {
10490 return VC1.VI.getAccessSpecifier() < VC2.VI.getAccessSpecifier();
10493 IdToIndexMapType IdToIndexMap;
10494 for (
auto &VC : VContexts) {
10499 IdToIndexMap[
VC.GVId].push_back(std::make_pair(Refs.
size(),
VC.Loc));
10505 for (
auto I : IdToIndexMap) {
10506 auto &Infos = ForwardRefValueInfos[
I.first];
10507 for (
auto P :
I.second) {
10509 "Forward referenced ValueInfo expected to be empty");
10510 Infos.emplace_back(&Refs[
P.first],
P.second);
10524bool LLParser::parseOptionalTypeIdInfo(
10525 FunctionSummary::TypeIdInfo &TypeIdInfo) {
10534 switch (Lex.getKind()) {
10536 if (parseTypeTests(TypeIdInfo.
TypeTests))
10560 return error(Lex.getLoc(),
"invalid typeIdInfo list type");
10564 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10573bool LLParser::parseTypeTests(std::vector<GlobalValue::GUID> &TypeTests) {
10581 IdToIndexMapType IdToIndexMap;
10585 unsigned ID = Lex.getUIntVal();
10586 LocTy Loc = Lex.getLoc();
10590 IdToIndexMap[
ID].push_back(std::make_pair(TypeTests.size(), Loc));
10592 }
else if (parseUInt64(GUID))
10594 TypeTests.push_back(GUID);
10599 for (
auto I : IdToIndexMap) {
10600 auto &Ids = ForwardRefTypeIds[
I.first];
10601 for (
auto P :
I.second) {
10602 assert(TypeTests[
P.first] == 0 &&
10603 "Forward referenced type id GUID expected to be 0");
10604 Ids.emplace_back(&TypeTests[
P.first],
P.second);
10608 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10616bool LLParser::parseVFuncIdList(
10617 lltok::Kind Kind, std::vector<FunctionSummary::VFuncId> &VFuncIdList) {
10618 assert(Lex.getKind() == Kind);
10625 IdToIndexMapType IdToIndexMap;
10627 FunctionSummary::VFuncId VFuncId;
10628 if (parseVFuncId(VFuncId, IdToIndexMap, VFuncIdList.size()))
10630 VFuncIdList.push_back(VFuncId);
10638 for (
auto I : IdToIndexMap) {
10639 auto &Ids = ForwardRefTypeIds[
I.first];
10640 for (
auto P :
I.second) {
10641 assert(VFuncIdList[
P.first].GUID == 0 &&
10642 "Forward referenced type id GUID expected to be 0");
10643 Ids.emplace_back(&VFuncIdList[
P.first].GUID,
P.second);
10652bool LLParser::parseConstVCallList(
10654 std::vector<FunctionSummary::ConstVCall> &ConstVCallList) {
10655 assert(Lex.getKind() == Kind);
10662 IdToIndexMapType IdToIndexMap;
10664 FunctionSummary::ConstVCall ConstVCall;
10665 if (parseConstVCall(ConstVCall, IdToIndexMap, ConstVCallList.size()))
10667 ConstVCallList.push_back(ConstVCall);
10675 for (
auto I : IdToIndexMap) {
10676 auto &Ids = ForwardRefTypeIds[
I.first];
10677 for (
auto P :
I.second) {
10678 assert(ConstVCallList[
P.first].VFunc.GUID == 0 &&
10679 "Forward referenced type id GUID expected to be 0");
10680 Ids.emplace_back(&ConstVCallList[
P.first].VFunc.GUID,
P.second);
10689bool LLParser::parseConstVCall(FunctionSummary::ConstVCall &ConstVCall,
10690 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10692 parseVFuncId(ConstVCall.
VFunc, IdToIndexMap, Index))
10696 if (parseArgs(ConstVCall.
Args))
10708bool LLParser::parseVFuncId(FunctionSummary::VFuncId &VFuncId,
10709 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10719 unsigned ID = Lex.getUIntVal();
10720 LocTy Loc = Lex.getLoc();
10724 IdToIndexMap[
ID].push_back(std::make_pair(Index, Loc));
10726 }
else if (parseToken(
lltok::kw_guid,
"expected 'guid' here") ||
10728 parseUInt64(VFuncId.
GUID))
10734 parseUInt64(VFuncId.
Offset) ||
10746bool LLParser::parseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
10756 switch (Lex.getKind()) {
10763 assert(HasLinkage &&
"Linkage not optional in summary entry");
10770 parseOptionalVisibility(Flag);
10775 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10781 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10787 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10793 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10802 if (parseOptionalImportType(Lex.getKind(), IK))
10804 GVFlags.
ImportType =
static_cast<unsigned>(IK);
10808 return error(Lex.getLoc(),
"expected gv flag type");
10822bool LLParser::parseGVarFlags(GlobalVarSummary::GVarFlags &GVarFlags) {
10830 auto ParseRest = [
this](
unsigned int &Val) {
10834 return parseFlag(Val);
10839 switch (Lex.getKind()) {
10840 case lltok::kw_readonly:
10841 if (ParseRest(Flag))
10845 case lltok::kw_writeonly:
10846 if (ParseRest(Flag))
10851 if (ParseRest(Flag))
10856 if (ParseRest(Flag))
10861 return error(Lex.getLoc(),
"expected gvar flag type");
10869bool LLParser::parseModuleReference(StringRef &ModulePath) {
10876 unsigned ModuleID = Lex.getUIntVal();
10877 auto I = ModuleIdMap.find(ModuleID);
10879 assert(
I != ModuleIdMap.end());
10880 ModulePath =
I->second;
10886bool LLParser::parseGVReference(ValueInfo &VI,
unsigned &GVId) {
10889 WriteOnly = EatIfPresent(lltok::kw_writeonly);
10893 GVId = Lex.getUIntVal();
10895 if (GVId < NumberedValueInfos.size() && NumberedValueInfos[GVId]) {
10897 VI = NumberedValueInfos[GVId];
10914bool LLParser::parseOptionalAllocs(std::vector<AllocInfo> &Allocs) {
10918 if (parseToken(
lltok::colon,
"expected ':' in allocs") ||
10930 SmallVector<uint8_t> Versions;
10933 if (parseAllocType(V))
10938 if (parseToken(
lltok::rparen,
"expected ')' in versions") ||
10942 std::vector<MIBInfo> MIBs;
10943 if (parseMemProfs(MIBs))
10946 Allocs.push_back({Versions, MIBs});
10963bool LLParser::parseMemProfs(std::vector<MIBInfo> &MIBs) {
10967 if (parseToken(
lltok::colon,
"expected ':' in memprof") ||
10973 if (parseToken(
lltok::lparen,
"expected '(' in memprof") ||
10982 if (parseToken(
lltok::comma,
"expected ',' in memprof") ||
10988 SmallVector<unsigned> StackIdIndices;
10992 uint64_t StackId = 0;
10993 if (parseUInt64(StackId))
10995 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
11016bool LLParser::parseAllocType(uint8_t &
AllocType) {
11017 switch (Lex.getKind()) {
11024 case lltok::kw_cold:
11027 case lltok::kw_hot:
11031 return error(Lex.getLoc(),
"invalid alloc type");
11044bool LLParser::parseOptionalCallsites(std::vector<CallsiteInfo> &Callsites) {
11048 if (parseToken(
lltok::colon,
"expected ':' in callsites") ||
11052 IdToIndexMapType IdToIndexMap;
11055 if (parseToken(
lltok::lparen,
"expected '(' in callsite") ||
11062 LocTy Loc = Lex.getLoc();
11064 if (parseGVReference(VI, GVId))
11068 if (parseToken(
lltok::comma,
"expected ',' in callsite") ||
11074 SmallVector<unsigned> Clones;
11077 if (parseUInt32(V))
11083 parseToken(
lltok::comma,
"expected ',' in callsite") ||
11089 SmallVector<unsigned> StackIdIndices;
11093 uint64_t StackId = 0;
11094 if (parseUInt64(StackId))
11096 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
11107 IdToIndexMap[GVId].
push_back(std::make_pair(Callsites.size(), Loc));
11108 Callsites.push_back({
VI, Clones, StackIdIndices});
11116 for (
auto I : IdToIndexMap) {
11117 auto &Infos = ForwardRefValueInfos[
I.first];
11118 for (
auto P :
I.second) {
11120 "Forward referenced ValueInfo expected to be empty");
11121 Infos.emplace_back(&Callsites[
P.first].Callee,
P.second);
11125 if (parseToken(
lltok::rparen,
"expected ')' in callsites"))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Unify divergent function exit nodes
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
Function Alias Analysis false
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
GlobalValue::SanitizerMetadata SanitizerMetadata
Module.h This file contains the declarations for the Module class.
static GlobalValue * createGlobalFwdRef(Module *M, PointerType *PTy)
static cl::opt< bool > AllowIncompleteIR("allow-incomplete-ir", cl::init(false), cl::Hidden, cl::desc("Allow incomplete IR on a best effort basis (references to unknown " "metadata will be dropped)"))
static void maybeSetDSOLocal(bool DSOLocal, GlobalValue &GV)
static bool upgradeMemoryAttr(MemoryEffects &ME, lltok::Kind Kind)
static 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 const fltSemantics & IEEEsingle()
static const fltSemantics & BFloat()
static const fltSemantics & IEEEdouble()
static constexpr roundingMode rmNearestTiesToEven
static const fltSemantics & IEEEhalf()
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 bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI bool isValueValidForType(Type *Ty, const APFloat &V)
Return true if Ty is big enough to represent V.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
static LLVM_ABI std::optional< ConstantRangeList > getConstantRangeList(ArrayRef< ConstantRange > RangesRef)
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
static DIAssignID * getDistinct(LLVMContext &Context)
DebugEmissionKind getEmissionKind() const
DebugNameTableKind getNameTableKind() const
static LLVM_ABI DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, std::optional< uint32_t > EnumKind, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, Metadata *Rank, Metadata *Annotations, Metadata *BitStride)
Build a DICompositeType with the given ODR identifier.
static LLVM_ABI std::optional< ChecksumKind > getChecksumKind(StringRef CSKindStr)
ChecksumKind
Which algorithm (e.g.
static LLVM_ABI std::optional< FixedPointKind > getFixedPointKind(StringRef Str)
static LLVM_ABI DIFlags getFlag(StringRef Flag)
static LLVM_ABI DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
static LLVM_ABI DISPFlags getFlag(StringRef Flag)
DISPFlags
Debug info subprogram flags.
static LLVM_ABI DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
static LLVM_ABI Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
static LLVM_ABI DbgLabelRecord * createUnresolvedDbgLabelRecord(MDNode *Label, MDNode *DL)
For use during parsing; creates a DbgLabelRecord from as-of-yet unresolved MDNodes.
Kind
Subclass discriminator.
static LLVM_ABI DbgVariableRecord * createUnresolvedDbgVariableRecord(LocationType Type, Metadata *Val, MDNode *Variable, MDNode *Expression, MDNode *AssignID, Metadata *Address, MDNode *AddressExpression, MDNode *DI)
Used to create DbgVariableRecords during parsing, where some metadata references may still be unresol...
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
static constexpr ElementCount getFixed(ScalarTy MinVal)
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
static LLVM_ABI bool isValidArgumentType(Type *ArgTy)
Return true if the specified type is valid as an argument type.
Type::subtype_iterator param_iterator
static LLVM_ABI bool isValidReturnType(Type *RetTy)
Return true if the specified type is valid as a return type.
static LLVM_ABI FunctionType * get(Type *Result, ArrayRef< Type * > Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
static Function * Create(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, const Twine &N="", Module *M=nullptr)
void setPrefixData(Constant *PrefixData)
void setGC(std::string Str)
void setPersonalityFn(Constant *Fn)
void eraseFromParent()
eraseFromParent - This method unlinks 'this' from the containing module and deletes it.
void setAlignment(Align Align)
Sets the alignment attribute of the Function.
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
void 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.
@ Valid
The data is already valid.
initializer< Ty > init(const Ty &Val)
@ DW_TAG_invalid
LLVM mock tags (see also llvm/BinaryFormat/Dwarf.def).
@ DW_MACINFO_invalid
Macinfo type for invalid results.
@ DW_APPLE_ENUM_KIND_invalid
Enum kind for invalid results.
@ DW_VIRTUALITY_invalid
Virtuality for invalid results.
@ kw_aarch64_sme_preservemost_from_x1
@ kw_no_sanitize_hwaddress
@ kw_cheriot_librarycallcc
@ kw_cheriot_compartmentcalleecc
@ kw_typeCheckedLoadConstVCalls
@ kw_aarch64_sve_vector_pcs
@ kw_cheriot_compartmentcallcc
@ kw_amdgpu_gfx_whole_wave
@ kw_typeTestAssumeConstVCalls
@ kw_typeidCompatibleVTable
@ kw_typeCheckedLoadVCalls
@ kw_inaccessiblemem_or_argmemonly
@ kw_externally_initialized
@ kw_sanitize_address_dyninit
@ kw_amdgpu_cs_chain_preserve
@ kw_available_externally
@ kw_typeTestAssumeVCalls
@ kw_aarch64_sme_preservemost_from_x0
@ kw_dso_local_equivalent
@ kw_aarch64_sme_preservemost_from_x2
NodeAddr< NodeBase * > Node
friend class Instruction
Iterator for Instructions in a `BasicBlock.
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
std::tuple< const DIScope *, const DIScope *, const DILocalVariable * > VarID
A unique key that represents a debug variable.
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
LLVM_ABI void UpgradeSectionAttributes(Module &M)
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
SaveAndRestore(T &) -> SaveAndRestore< T >
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
scope_exit(Callable) -> scope_exit< Callable >
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI void UpgradeCallsToIntrinsic(Function *F)
This is an auto-upgrade hook for any old intrinsic function syntaxes which need to have both the func...
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
auto dyn_cast_or_null(const Y &Val)
@ Async
"Asynchronous" unwind tables (instr precise)
@ Sync
"Synchronous" unwind tables
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
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.
@ TargetMem0
Represents target specific state.
@ 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 ...
std::vector< uint64_t > Args
unsigned ReturnDoesNotAlias
unsigned MustBeUnreachable
static constexpr uint32_t RangeWidth
std::vector< Call > Calls
In the per-module summary, it summarizes the byte offset applied to each pointer parameter before pas...
std::vector< ConstVCall > TypeCheckedLoadConstVCalls
std::vector< VFuncId > TypeCheckedLoadVCalls
std::vector< ConstVCall > TypeTestAssumeConstVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
std::vector< GlobalValue::GUID > TypeTests
List of type identifiers used by this function in llvm.type.test intrinsics referenced by something o...
std::vector< VFuncId > TypeTestAssumeVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
unsigned 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.