64 "Allow incomplete IR on a best effort basis (references to unknown "
65 "metadata will be dropped)"));
80 if (Context.shouldDiscardValueNames())
83 "Can't read textual IR with a Context that discards named Values");
86 if (parseTargetDefinitions(DataLayoutCallback))
90 return parseTopLevelEntities() || validateEndOfModule(UpgradeDebugInfo) ||
96 restoreParsingState(Slots);
100 if (parseType(Ty) || parseConstantValue(Ty,
C))
103 return error(Lex.getLoc(),
"expected end of string");
109 restoreParsingState(Slots);
113 SMLoc Start = Lex.getLoc();
117 SMLoc End = Lex.getLoc();
125 restoreParsingState(Slots);
129 SMLoc Start = Lex.getLoc();
131 bool Status = parseDIExpressionBody(Result,
false);
132 SMLoc End = Lex.getLoc();
138void LLParser::restoreParsingState(
const SlotMapping *Slots) {
145 std::make_pair(
I.getKey(), std::make_pair(
I.second,
LocTy())));
146 for (
const auto &
I : Slots->
Types)
147 NumberedTypes.insert(
148 std::make_pair(
I.first, std::make_pair(
I.second,
LocTy())));
154 II->getIntrinsicID() != Intrinsic::experimental_noalias_scope_decl)
161 if (MD->isTemporary())
165 assert(
II->use_empty() &&
"Cannot have uses");
166 II->eraseFromParent();
175void LLParser::dropUnknownMetadataReferences() {
176 auto Pred = [](
unsigned MDKind, MDNode *
Node) {
return Node->isTemporary(); };
177 for (Function &
F : *M) {
178 F.eraseMetadataIf(Pred);
180 I.eraseMetadataIf(Pred);
187 for (GlobalVariable &GV : M->globals())
188 GV.eraseMetadataIf(Pred);
193 if (
Info.first->getNumTemporaryUses() == 1) {
194 NumberedMetadata.erase(
ID);
195 ForwardRefMDNodes.erase(
ID);
208 assert(!(SeenNewDbgInfoFormat && SeenOldDbgInfoFormat) &&
209 "Mixed debug intrinsics/records seen without a parsing error?");
212 for (
const auto &RAG : ForwardRefAttrGroups) {
214 const std::vector<unsigned> &
Attrs = RAG.second;
215 AttrBuilder
B(Context);
217 for (
const auto &Attr : Attrs) {
218 auto R = NumberedAttrBuilders.find(Attr);
219 if (R != NumberedAttrBuilders.end())
224 AttributeList AS = Fn->getAttributes();
225 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
226 AS = AS.removeFnAttributes(Context);
232 if (MaybeAlign
A = FnAttrs.getAlignment()) {
233 Fn->setAlignment(*
A);
234 FnAttrs.removeAttribute(Attribute::Alignment);
237 AS = AS.addFnAttributes(Context, FnAttrs);
238 Fn->setAttributes(AS);
240 AttributeList AS = CI->getAttributes();
241 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
242 AS = AS.removeFnAttributes(Context);
244 AS = AS.addFnAttributes(Context, FnAttrs);
245 CI->setAttributes(AS);
247 AttributeList AS =
II->getAttributes();
248 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
249 AS = AS.removeFnAttributes(Context);
251 AS = AS.addFnAttributes(Context, FnAttrs);
252 II->setAttributes(AS);
254 AttributeList AS = CBI->getAttributes();
255 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
256 AS = AS.removeFnAttributes(Context);
258 AS = AS.addFnAttributes(Context, FnAttrs);
259 CBI->setAttributes(AS);
261 AttrBuilder
Attrs(M->getContext(), GV->getAttributes());
271 if (!ForwardRefBlockAddresses.empty())
272 return error(ForwardRefBlockAddresses.begin()->first.Loc,
273 "expected function name in blockaddress");
275 auto ResolveForwardRefDSOLocalEquivalents = [&](
const ValID &GVRef,
276 GlobalValue *FwdRef) {
277 GlobalValue *GV =
nullptr;
279 GV = M->getNamedValue(GVRef.
StrVal);
281 GV = NumberedVals.get(GVRef.
UIntVal);
286 "' referenced by dso_local_equivalent");
290 "expected a function, alias to function, or ifunc "
291 "in dso_local_equivalent");
294 FwdRef->replaceAllUsesWith(Equiv);
295 FwdRef->eraseFromParent();
302 for (
auto &Iter : ForwardRefDSOLocalEquivalentIDs) {
303 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
306 for (
auto &Iter : ForwardRefDSOLocalEquivalentNames) {
307 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
310 ForwardRefDSOLocalEquivalentIDs.clear();
311 ForwardRefDSOLocalEquivalentNames.clear();
313 for (
const auto &NT : NumberedTypes)
314 if (
NT.second.second.isValid())
316 "use of undefined type '%" + Twine(
NT.first) +
"'");
318 for (
const auto &[Name, TypeInfo] : NamedTypes)
319 if (TypeInfo.second.isValid())
320 return error(TypeInfo.second,
321 "use of undefined type named '" + Name +
"'");
323 if (!ForwardRefComdats.empty())
324 return error(ForwardRefComdats.begin()->second,
325 "use of undefined comdat '$" +
326 ForwardRefComdats.begin()->first +
"'");
340 if (!CB || !CB->isCallee(&U))
341 return error(
Info.second,
"intrinsic can only be used as callee");
355 return error(
Info.second,
"unknown intrinsic '" + Name +
"'");
356 return error(
Info.second,
"invalid intrinsic signature");
366 Info.first->eraseFromParent();
367 ForwardRefVals.erase(Name);
376 auto GetCommonFunctionType = [](
Value *
V) -> FunctionType * {
377 FunctionType *FTy =
nullptr;
378 for (Use &U :
V->uses()) {
380 if (!CB || !CB->isCallee(&U) || (FTy && FTy != CB->getFunctionType()))
382 FTy = CB->getFunctionType();
390 Type *Ty = GetCommonFunctionType(
Info.first);
398 GV =
new GlobalVariable(*M, Ty,
false,
401 Info.first->replaceAllUsesWith(GV);
402 Info.first->eraseFromParent();
403 ForwardRefVals.erase(Name);
406 if (!ForwardRefVals.empty())
407 return error(ForwardRefVals.begin()->second.second,
408 "use of undefined value '@" + ForwardRefVals.begin()->first +
411 if (!ForwardRefValIDs.empty())
412 return error(ForwardRefValIDs.begin()->second.second,
413 "use of undefined value '@" +
414 Twine(ForwardRefValIDs.begin()->first) +
"'");
417 dropUnknownMetadataReferences();
419 if (!ForwardRefMDNodes.empty())
420 return error(ForwardRefMDNodes.begin()->second.second,
421 "use of undefined metadata '!" +
422 Twine(ForwardRefMDNodes.begin()->first) +
"'");
425 for (
auto &
N : NumberedMetadata) {
426 if (
N.second && !
N.second->isResolved())
427 N.second->resolveCycles();
430 for (
auto *Inst : InstsWithTBAATag) {
431 MDNode *MD = Inst->getMetadata(LLVMContext::MD_tbaa);
434 assert(MD &&
"UpgradeInstWithTBAATag should have a TBAA tag");
437 if (MD != UpgradedMD)
438 Inst->setMetadata(LLVMContext::MD_tbaa, UpgradedMD);
447 if (UpgradeDebugInfo)
460 Slots->GlobalValues = std::move(NumberedVals);
461 Slots->MetadataNodes = std::move(NumberedMetadata);
462 for (
const auto &
I : NamedTypes)
463 Slots->NamedTypes.insert(std::make_pair(
I.getKey(),
I.second.first));
464 for (
const auto &
I : NumberedTypes)
465 Slots->Types.insert(std::make_pair(
I.first,
I.second.first));
471bool LLParser::validateEndOfIndex() {
475 if (!ForwardRefValueInfos.empty())
476 return error(ForwardRefValueInfos.begin()->second.front().second,
477 "use of undefined summary '^" +
478 Twine(ForwardRefValueInfos.begin()->first) +
"'");
480 if (!ForwardRefAliasees.empty())
481 return error(ForwardRefAliasees.begin()->second.front().second,
482 "use of undefined summary '^" +
483 Twine(ForwardRefAliasees.begin()->first) +
"'");
485 if (!ForwardRefTypeIds.empty())
486 return error(ForwardRefTypeIds.begin()->second.front().second,
487 "use of undefined type id summary '^" +
488 Twine(ForwardRefTypeIds.begin()->first) +
"'");
502 std::string TentativeDLStr = M->getDataLayoutStr();
507 switch (Lex.getKind()) {
509 if (parseTargetDefinition(TentativeDLStr, DLStrLoc))
513 if (parseSourceFileName())
522 if (
auto LayoutOverride =
523 DataLayoutCallback(M->getTargetTriple().str(), TentativeDLStr)) {
524 TentativeDLStr = *LayoutOverride;
530 M->setDataLayout(MaybeDL.
get());
534bool LLParser::parseTopLevelEntities() {
538 switch (Lex.getKind()) {
542 if (parseSummaryEntry())
546 if (parseSourceFileName())
556 switch (Lex.getKind()) {
558 return tokError(
"expected top-level entity");
569 if (parseModuleAsm())
573 if (parseUnnamedType())
577 if (parseNamedType())
581 if (parseUnnamedGlobal())
585 if (parseNamedGlobal())
590 if (parseStandaloneMetadata())
594 if (parseSummaryEntry())
598 if (parseNamedMetadata())
602 if (parseUnnamedAttrGrp())
606 if (parseUseListOrder())
610 if (parseUseListOrderBB())
619bool LLParser::parseModuleAsm() {
625 parseStringConstant(AsmStr))
628 M->appendModuleInlineAsm(AsmStr);
635bool LLParser::parseTargetDefinition(std::string &TentativeDLStr,
641 return tokError(
"unknown target property");
644 if (parseToken(
lltok::equal,
"expected '=' after target triple") ||
645 parseStringConstant(Str))
647 M->setTargetTriple(Triple(std::move(Str)));
651 if (parseToken(
lltok::equal,
"expected '=' after target datalayout"))
653 DLStrLoc = Lex.getLoc();
654 if (parseStringConstant(TentativeDLStr))
662bool LLParser::parseSourceFileName() {
665 if (parseToken(
lltok::equal,
"expected '=' after source_filename") ||
666 parseStringConstant(SourceFileName))
669 M->setSourceFileName(SourceFileName);
675bool LLParser::parseUnnamedType() {
676 LocTy TypeLoc = Lex.getLoc();
677 unsigned TypeID = Lex.getUIntVal();
680 if (parseToken(
lltok::equal,
"expected '=' after name") ||
685 if (parseStructDefinition(TypeLoc,
"", NumberedTypes[
TypeID], Result))
689 std::pair<Type*, LocTy> &
Entry = NumberedTypes[
TypeID];
691 return error(TypeLoc,
"non-struct types may not be recursive");
693 Entry.second = SMLoc();
701bool LLParser::parseNamedType() {
702 std::string
Name = Lex.getStrVal();
703 LocTy NameLoc = Lex.getLoc();
706 if (parseToken(
lltok::equal,
"expected '=' after name") ||
711 if (parseStructDefinition(NameLoc, Name, NamedTypes[Name], Result))
715 std::pair<Type*, LocTy> &
Entry = NamedTypes[
Name];
717 return error(NameLoc,
"non-struct types may not be recursive");
719 Entry.second = SMLoc();
727bool LLParser::parseDeclare() {
731 std::vector<std::pair<unsigned, MDNode *>> MDs;
735 if (parseMetadataAttachment(MDK,
N))
737 MDs.push_back({MDK,
N});
741 unsigned FunctionNumber = -1;
742 SmallVector<unsigned> UnnamedArgNums;
743 if (parseFunctionHeader(
F,
false, FunctionNumber, UnnamedArgNums))
746 F->addMetadata(MD.first, *MD.second);
752bool LLParser::parseDefine() {
754 FileLoc FunctionStart(Lex.getTokLineColumnPos());
758 unsigned FunctionNumber = -1;
759 SmallVector<unsigned> UnnamedArgNums;
761 parseFunctionHeader(
F,
true, FunctionNumber, UnnamedArgNums) ||
762 parseOptionalFunctionMetadata(*
F) ||
763 parseFunctionBody(*
F, FunctionNumber, UnnamedArgNums);
765 ParserContext->addFunctionLocation(
766 F, FileLocRange(FunctionStart, Lex.getPrevTokEndLineColumnPos()));
774bool LLParser::parseGlobalType(
bool &IsConstant) {
781 return tokError(
"expected 'global' or 'constant'");
787bool LLParser::parseOptionalUnnamedAddr(
808bool LLParser::parseUnnamedGlobal() {
811 LocTy NameLoc = Lex.getLoc();
815 VarID = Lex.getUIntVal();
816 if (checkValueID(NameLoc,
"global",
"@", NumberedVals.getNext(),
VarID))
820 if (parseToken(
lltok::equal,
"expected '=' after name"))
823 VarID = NumberedVals.getNext();
827 unsigned Linkage, Visibility, DLLStorageClass;
831 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
833 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
836 switch (Lex.getKind()) {
838 return parseGlobal(Name,
VarID, NameLoc,
Linkage, HasLinkage, Visibility,
839 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
842 return parseAliasOrIFunc(Name,
VarID, NameLoc,
Linkage, Visibility,
843 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
852bool LLParser::parseNamedGlobal() {
854 LocTy NameLoc = Lex.getLoc();
855 std::string
Name = Lex.getStrVal();
859 unsigned Linkage, Visibility, DLLStorageClass;
863 if (parseToken(
lltok::equal,
"expected '=' in global variable") ||
864 parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
866 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
869 switch (Lex.getKind()) {
871 return parseGlobal(Name, -1, NameLoc,
Linkage, HasLinkage, Visibility,
872 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
875 return parseAliasOrIFunc(Name, -1, NameLoc,
Linkage, Visibility,
876 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
880bool LLParser::parseComdat() {
882 std::string
Name = Lex.getStrVal();
883 LocTy NameLoc = Lex.getLoc();
890 return tokError(
"expected comdat type");
893 switch (Lex.getKind()) {
895 return tokError(
"unknown selection kind");
917 if (
I != ComdatSymTab.
end() && !ForwardRefComdats.erase(Name))
918 return error(NameLoc,
"redefinition of comdat '$" + Name +
"'");
921 if (
I != ComdatSymTab.
end())
924 C = M->getOrInsertComdat(Name);
925 C->setSelectionKind(SK);
932bool LLParser::parseMDString(
MDString *&Result) {
934 if (parseStringConstant(Str))
942bool LLParser::parseMDNodeID(
MDNode *&Result) {
944 LocTy IDLoc = Lex.getLoc();
946 if (parseUInt32(MID))
950 auto [It,
Inserted] = NumberedMetadata.try_emplace(MID);
957 auto &FwdRef = ForwardRefMDNodes[MID];
960 Result = FwdRef.first.get();
961 It->second.reset(Result);
967bool LLParser::parseNamedMetadata() {
969 std::string
Name = Lex.getStrVal();
977 NamedMDNode *NMD = M->getOrInsertNamedMetadata(Name);
985 Lex.getStrVal() ==
"DIExpression") {
986 if (parseDIExpression(
N,
false))
991 Lex.getStrVal() ==
"DIArgList") {
992 return tokError(
"found DIArgList outside of function");
1000 return parseToken(
lltok::rbrace,
"expected end of metadata node");
1005bool LLParser::parseStandaloneMetadata() {
1008 unsigned MetadataID = 0;
1011 if (parseUInt32(MetadataID) || parseToken(
lltok::equal,
"expected '=' here"))
1016 return tokError(
"unexpected type in metadata definition");
1020 if (parseSpecializedMDNode(Init, IsDistinct))
1023 parseMDTuple(Init, IsDistinct))
1027 auto FI = ForwardRefMDNodes.find(MetadataID);
1028 if (FI != ForwardRefMDNodes.end()) {
1029 auto *ToReplace = FI->second.first.get();
1033 for (
auto *Inst : TempDIAssignIDAttachments[ToReplace]) {
1034 assert(!Inst->getMetadata(LLVMContext::MD_DIAssignID) &&
1035 "Inst unexpectedly already has DIAssignID attachment");
1036 Inst->setMetadata(LLVMContext::MD_DIAssignID, Init);
1040 ToReplace->replaceAllUsesWith(Init);
1041 ForwardRefMDNodes.erase(FI);
1043 assert(NumberedMetadata[MetadataID] == Init &&
"Tracking VH didn't work");
1045 auto [It,
Inserted] = NumberedMetadata.try_emplace(MetadataID);
1047 return tokError(
"Metadata id is already used");
1048 It->second.reset(Init);
1055bool LLParser::skipModuleSummaryEntry() {
1065 "Expected 'gv', 'module', 'typeid', 'flags' or 'blockcount' at the "
1066 "start of summary entry");
1068 return parseSummaryIndexFlags();
1070 return parseBlockCount();
1072 if (parseToken(
lltok::colon,
"expected ':' at start of summary entry") ||
1073 parseToken(
lltok::lparen,
"expected '(' at start of summary entry"))
1077 unsigned NumOpenParen = 1;
1079 switch (Lex.getKind()) {
1087 return tokError(
"found end of file while parsing summary entry");
1093 }
while (NumOpenParen > 0);
1099bool LLParser::parseSummaryEntry() {
1105 Lex.setIgnoreColonInIdentifiers(
true);
1113 return skipModuleSummaryEntry();
1115 bool result =
false;
1116 switch (Lex.getKind()) {
1118 result = parseGVEntry(SummaryID);
1121 result = parseModuleEntry(SummaryID);
1124 result = parseTypeIdEntry(SummaryID);
1127 result = parseTypeIdCompatibleVtableEntry(SummaryID);
1130 result = parseSummaryIndexFlags();
1133 result = parseBlockCount();
1136 result =
error(Lex.getLoc(),
"unexpected summary kind");
1139 Lex.setIgnoreColonInIdentifiers(
false);
1173bool LLParser::parseAliasOrIFunc(
const std::string &Name,
unsigned NameID,
1174 LocTy NameLoc,
unsigned L,
unsigned Visibility,
1175 unsigned DLLStorageClass,
bool DSOLocal,
1190 return error(NameLoc,
"invalid linkage type for alias");
1193 return error(NameLoc,
1194 "symbol with local linkage must have default visibility");
1197 return error(NameLoc,
1198 "symbol with local linkage cannot have a DLL storage class");
1201 LocTy ExplicitTypeLoc = Lex.getLoc();
1202 if (parseType(Ty) ||
1203 parseToken(
lltok::comma,
"expected comma after alias or ifunc's type"))
1207 LocTy AliaseeLoc = Lex.getLoc();
1212 if (parseGlobalTypeAndValue(Aliasee))
1217 if (parseValID(
ID,
nullptr))
1220 return error(AliaseeLoc,
"invalid aliasee");
1221 Aliasee =
ID.ConstantVal;
1227 return error(AliaseeLoc,
"An alias or ifunc must have pointer type");
1228 unsigned AddrSpace = PTy->getAddressSpace();
1230 GlobalValue *GVal =
nullptr;
1234 if (!
Name.empty()) {
1235 auto I = ForwardRefVals.find(Name);
1236 if (
I != ForwardRefVals.end()) {
1237 GVal =
I->second.first;
1238 ForwardRefVals.erase(Name);
1239 }
else if (M->getNamedValue(Name)) {
1240 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1243 auto I = ForwardRefValIDs.find(NameID);
1244 if (
I != ForwardRefValIDs.end()) {
1245 GVal =
I->second.first;
1246 ForwardRefValIDs.erase(
I);
1251 std::unique_ptr<GlobalAlias> GA;
1252 std::unique_ptr<GlobalIFunc> GI;
1280 if (parseGlobalObjectMetadataAttachment(*GI))
1283 return tokError(
"unknown alias or ifunc property!");
1288 NumberedVals.add(NameID, GV);
1295 "forward reference and definition of alias have different types");
1305 M->insertAlias(GA.release());
1307 M->insertIFunc(GI.release());
1308 assert(GV->
getName() == Name &&
"Should not be a name conflict!");
1317 case lltok::kw_sanitize_memtag:
1331 switch (Lex.getKind()) {
1333 Meta.NoAddress =
true;
1336 Meta.NoHWAddress =
true;
1338 case lltok::kw_sanitize_memtag:
1342 Meta.IsDynInit =
true;
1345 return tokError(
"non-sanitizer token passed to LLParser::parseSanitizer()");
1365bool LLParser::parseGlobal(
const std::string &Name,
unsigned NameID,
1366 LocTy NameLoc,
unsigned Linkage,
bool HasLinkage,
1367 unsigned Visibility,
unsigned DLLStorageClass,
1371 return error(NameLoc,
1372 "symbol with local linkage must have default visibility");
1375 return error(NameLoc,
1376 "symbol with local linkage cannot have a DLL storage class");
1380 LocTy IsExternallyInitializedLoc;
1384 if (parseOptionalAddrSpace(AddrSpace) ||
1386 IsExternallyInitialized,
1387 &IsExternallyInitializedLoc) ||
1388 parseGlobalType(IsConstant) || parseType(Ty, TyLoc))
1397 if (parseGlobalValue(Ty, Init))
1402 return error(TyLoc,
"invalid type for global variable");
1404 GlobalValue *GVal =
nullptr;
1407 if (!
Name.empty()) {
1408 auto I = ForwardRefVals.find(Name);
1409 if (
I != ForwardRefVals.end()) {
1410 GVal =
I->second.first;
1411 ForwardRefVals.erase(
I);
1412 }
else if (M->getNamedValue(Name)) {
1413 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1418 if (NameID == (
unsigned)-1)
1419 NameID = NumberedVals.getNext();
1421 auto I = ForwardRefValIDs.find(NameID);
1422 if (
I != ForwardRefValIDs.end()) {
1423 GVal =
I->second.first;
1424 ForwardRefValIDs.erase(
I);
1428 GlobalVariable *GV =
new GlobalVariable(
1433 NumberedVals.add(NameID, GV);
1451 "forward reference and definition of global have different types");
1471 }
else if (Lex.getKind() == lltok::kw_align) {
1472 MaybeAlign Alignment;
1473 if (parseOptionalAlignment(Alignment))
1479 if (parseOptionalCodeModel(CodeModel))
1483 if (parseGlobalObjectMetadataAttachment(*GV))
1486 if (parseSanitizer(GV))
1490 if (parseOptionalComdat(Name,
C))
1495 return tokError(
"unknown global variable property!");
1499 AttrBuilder
Attrs(M->getContext());
1501 std::vector<unsigned> FwdRefAttrGrps;
1502 if (parseFnAttributeValuePairs(Attrs, FwdRefAttrGrps,
false, BuiltinLoc))
1504 if (
Attrs.hasAttributes() || !FwdRefAttrGrps.empty()) {
1506 ForwardRefAttrGroups[GV] = FwdRefAttrGrps;
1514bool LLParser::parseUnnamedAttrGrp() {
1516 LocTy AttrGrpLoc = Lex.getLoc();
1520 return tokError(
"expected attribute group id");
1522 unsigned VarID = Lex.getUIntVal();
1523 std::vector<unsigned> unused;
1531 auto R = NumberedAttrBuilders.find(
VarID);
1532 if (R == NumberedAttrBuilders.end())
1533 R = NumberedAttrBuilders.emplace(
VarID, AttrBuilder(M->getContext())).first;
1535 if (parseFnAttributeValuePairs(
R->second, unused,
true, BuiltinLoc) ||
1536 parseToken(
lltok::rbrace,
"expected end of attribute group"))
1539 if (!
R->second.hasAttributes())
1540 return error(AttrGrpLoc,
"attribute group has no attributes");
1547#define GET_ATTR_NAMES
1548#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME) \
1549 case lltok::kw_##DISPLAY_NAME: \
1550 return Attribute::ENUM_NAME;
1551#include "llvm/IR/Attributes.inc"
1560 return parseRequiredTypeAttr(
B, Lex.getKind(), Attr);
1563 case Attribute::Alignment: {
1564 MaybeAlign Alignment;
1572 if (parseOptionalAlignment(Alignment,
true))
1575 B.addAlignmentAttr(Alignment);
1578 case Attribute::StackAlignment: {
1583 parseUInt32(Alignment))
1586 if (parseOptionalStackAlignment(Alignment))
1589 B.addStackAlignmentAttr(Alignment);
1592 case Attribute::AllocSize: {
1593 unsigned ElemSizeArg;
1594 std::optional<unsigned> NumElemsArg;
1595 if (parseAllocSizeArguments(ElemSizeArg, NumElemsArg))
1597 B.addAllocSizeAttr(ElemSizeArg, NumElemsArg);
1600 case Attribute::VScaleRange: {
1601 unsigned MinValue, MaxValue;
1602 if (parseVScaleRangeArguments(MinValue, MaxValue))
1604 B.addVScaleRangeAttr(MinValue,
1605 MaxValue > 0 ? MaxValue : std::optional<unsigned>());
1608 case Attribute::Dereferenceable: {
1610 if (parseOptionalDerefAttrBytes(lltok::kw_dereferenceable, Bytes))
1612 B.addDereferenceableAttr(Bytes);
1615 case Attribute::DereferenceableOrNull: {
1617 if (parseOptionalDerefAttrBytes(lltok::kw_dereferenceable_or_null, Bytes))
1619 B.addDereferenceableOrNullAttr(Bytes);
1622 case Attribute::UWTable: {
1624 if (parseOptionalUWTableKind(Kind))
1626 B.addUWTableAttr(Kind);
1629 case Attribute::AllocKind: {
1631 if (parseAllocKind(Kind))
1633 B.addAllocKindAttr(Kind);
1636 case Attribute::Memory: {
1637 std::optional<MemoryEffects> ME = parseMemoryAttr();
1640 B.addMemoryAttr(*ME);
1643 case Attribute::NoFPClass: {
1646 B.addNoFPClassAttr(NoFPClass);
1652 case Attribute::Range:
1653 return parseRangeAttr(
B);
1654 case Attribute::Initializes:
1655 return parseInitializesAttr(
B);
1656 case Attribute::Captures:
1657 return parseCapturesAttr(
B);
1659 B.addAttribute(Attr);
1667 case lltok::kw_readnone:
1670 case lltok::kw_readonly:
1673 case lltok::kw_writeonly:
1692bool LLParser::parseFnAttributeValuePairs(AttrBuilder &
B,
1693 std::vector<unsigned> &FwdRefAttrGrps,
1694 bool InAttrGrp, LocTy &BuiltinLoc) {
1695 bool HaveError =
false;
1706 if (parseStringAttribute(
B))
1718 "cannot have an attribute group reference in an attribute group");
1721 FwdRefAttrGrps.push_back(Lex.getUIntVal());
1727 SMLoc Loc = Lex.getLoc();
1728 if (Token == lltok::kw_builtin)
1740 return error(Lex.getLoc(),
"unterminated attribute group");
1743 if (parseEnumAttribute(Attr,
B, InAttrGrp))
1750 HaveError |=
error(Loc,
"this attribute does not apply to functions");
1754 B.addMemoryAttr(ME);
1768 PTy->getAddressSpace());
1777 error(Loc,
"'" + Name +
"' is not a basic block");
1779 error(Loc,
"'" + Name +
"' defined with type '" +
1792 error(Loc,
"global variable reference must have pointer type");
1803 auto I = ForwardRefVals.find(Name);
1804 if (
I != ForwardRefVals.end())
1805 Val =
I->second.first;
1811 checkValidVariableType(Loc,
"@" + Name, Ty, Val));
1815 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
1822 error(Loc,
"global variable reference must have pointer type");
1826 GlobalValue *Val = NumberedVals.get(
ID);
1831 auto I = ForwardRefValIDs.find(
ID);
1832 if (
I != ForwardRefValIDs.end())
1833 Val =
I->second.first;
1839 checkValidVariableType(Loc,
"@" + Twine(
ID), Ty, Val));
1843 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
1851Comdat *LLParser::getComdat(
const std::string &Name, LocTy
Loc) {
1855 if (
I != ComdatSymTab.
end())
1859 Comdat *
C = M->getOrInsertComdat(Name);
1860 ForwardRefComdats[
Name] = Loc;
1870bool LLParser::parseToken(
lltok::Kind T,
const char *ErrMsg) {
1871 if (Lex.getKind() !=
T)
1872 return tokError(ErrMsg);
1879bool LLParser::parseStringConstant(std::string &Result) {
1881 return tokError(
"expected string constant");
1882 Result = Lex.getStrVal();
1889bool LLParser::parseUInt32(uint32_t &Val) {
1890 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1891 return tokError(
"expected integer");
1892 uint64_t Val64 = Lex.getAPSIntVal().getLimitedValue(0xFFFFFFFFULL+1);
1893 if (Val64 !=
unsigned(Val64))
1894 return tokError(
"expected 32-bit integer (too large)");
1902bool LLParser::parseUInt64(uint64_t &Val) {
1903 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1904 return tokError(
"expected integer");
1905 Val = Lex.getAPSIntVal().getLimitedValue();
1915 switch (Lex.getKind()) {
1917 return tokError(
"expected localdynamic, initialexec or localexec");
1945 return parseTLSModel(TLM) ||
1946 parseToken(
lltok::rparen,
"expected ')' after thread local model");
1954bool LLParser::parseOptionalAddrSpace(
unsigned &AddrSpace,
unsigned DefaultAS) {
1955 AddrSpace = DefaultAS;
1959 auto ParseAddrspaceValue = [&](
unsigned &AddrSpace) ->
bool {
1961 const std::string &AddrSpaceStr = Lex.getStrVal();
1962 if (AddrSpaceStr ==
"A") {
1963 AddrSpace = M->getDataLayout().getAllocaAddrSpace();
1964 }
else if (AddrSpaceStr ==
"G") {
1965 AddrSpace = M->getDataLayout().getDefaultGlobalsAddressSpace();
1966 }
else if (AddrSpaceStr ==
"P") {
1967 AddrSpace = M->getDataLayout().getProgramAddressSpace();
1968 }
else if (std::optional<unsigned> AS =
1969 M->getDataLayout().getNamedAddressSpace(AddrSpaceStr)) {
1972 return tokError(
"invalid symbolic addrspace '" + AddrSpaceStr +
"'");
1978 return tokError(
"expected integer or string constant");
1979 SMLoc Loc = Lex.getLoc();
1980 if (parseUInt32(AddrSpace))
1983 return error(Loc,
"invalid address space, must be a 24-bit integer");
1987 return parseToken(
lltok::lparen,
"expected '(' in address space") ||
1988 ParseAddrspaceValue(AddrSpace) ||
1995bool LLParser::parseStringAttribute(AttrBuilder &
B) {
1996 std::string Attr = Lex.getStrVal();
1999 if (EatIfPresent(
lltok::equal) && parseStringConstant(Val))
2001 B.addAttribute(Attr, Val);
2006bool LLParser::parseOptionalParamOrReturnAttrs(AttrBuilder &
B,
bool IsParam) {
2007 bool HaveError =
false;
2014 if (parseStringAttribute(
B))
2025 SMLoc Loc = Lex.getLoc();
2030 if (parseEnumAttribute(Attr,
B,
false))
2034 HaveError |=
error(Loc,
"this attribute does not apply to parameters");
2036 HaveError |=
error(Loc,
"this attribute does not apply to return values");
2084bool LLParser::parseOptionalLinkage(
unsigned &Res,
bool &HasLinkage,
2085 unsigned &Visibility,
2086 unsigned &DLLStorageClass,
bool &DSOLocal) {
2090 parseOptionalDSOLocal(DSOLocal);
2091 parseOptionalVisibility(Visibility);
2092 parseOptionalDLLStorageClass(DLLStorageClass);
2095 return error(Lex.getLoc(),
"dso_location and DLL-StorageClass mismatch");
2101void LLParser::parseOptionalDSOLocal(
bool &DSOLocal) {
2102 switch (Lex.getKind()) {
2123void LLParser::parseOptionalVisibility(
unsigned &Res) {
2124 switch (Lex.getKind()) {
2141bool LLParser::parseOptionalImportType(
lltok::Kind Kind,
2145 return tokError(
"unknown import kind. Expect definition or declaration.");
2160void LLParser::parseOptionalDLLStorageClass(
unsigned &Res) {
2161 switch (Lex.getKind()) {
2231bool LLParser::parseOptionalCallingConv(
unsigned &CC) {
2232 switch (Lex.getKind()) {
2319 return tokError(
"unknown RISC-V ABI VLEN");
2320#define CC_VLS_CASE(ABIVlen) \
2322 CC = CallingConv::RISCV_VLSCall_##ABIVlen; \
2350 return parseUInt32(CC);
2360bool LLParser::parseMetadataAttachment(
unsigned &Kind,
MDNode *&MD) {
2363 std::string
Name = Lex.getStrVal();
2364 Kind = M->getMDKindID(Name);
2367 return parseMDNode(MD);
2372bool LLParser::parseInstructionMetadata(
Instruction &Inst) {
2375 return tokError(
"expected metadata after comma");
2379 if (parseMetadataAttachment(MDK,
N))
2382 if (MDK == LLVMContext::MD_DIAssignID)
2383 TempDIAssignIDAttachments[
N].push_back(&Inst);
2387 if (MDK == LLVMContext::MD_tbaa)
2388 InstsWithTBAATag.push_back(&Inst);
2397bool LLParser::parseGlobalObjectMetadataAttachment(
GlobalObject &GO) {
2400 if (parseMetadataAttachment(MDK,
N))
2409bool LLParser::parseOptionalFunctionMetadata(
Function &
F) {
2411 if (parseGlobalObjectMetadataAttachment(
F))
2419bool LLParser::parseOptionalAlignment(
MaybeAlign &Alignment,
bool AllowParens) {
2420 Alignment = std::nullopt;
2421 if (!EatIfPresent(lltok::kw_align))
2423 LocTy AlignLoc = Lex.getLoc();
2426 LocTy ParenLoc = Lex.getLoc();
2427 bool HaveParens =
false;
2433 if (parseUInt64(
Value))
2437 return error(ParenLoc,
"expected ')'");
2440 return error(AlignLoc,
"alignment is not a power of two");
2442 return error(AlignLoc,
"huge alignments are not supported yet");
2452 auto StrVal = Lex.getStrVal();
2453 auto ErrMsg =
"expected global code model string";
2454 if (StrVal ==
"tiny")
2456 else if (StrVal ==
"small")
2458 else if (StrVal ==
"kernel")
2460 else if (StrVal ==
"medium")
2462 else if (StrVal ==
"large")
2465 return tokError(ErrMsg);
2476bool LLParser::parseOptionalDerefAttrBytes(
lltok::Kind AttrKind,
2478 assert((AttrKind == lltok::kw_dereferenceable ||
2479 AttrKind == lltok::kw_dereferenceable_or_null) &&
2483 if (!EatIfPresent(AttrKind))
2485 LocTy ParenLoc = Lex.getLoc();
2487 return error(ParenLoc,
"expected '('");
2488 LocTy DerefLoc = Lex.getLoc();
2489 if (parseUInt64(Bytes))
2491 ParenLoc = Lex.getLoc();
2493 return error(ParenLoc,
"expected ')'");
2495 return error(DerefLoc,
"dereferenceable bytes must be non-zero");
2499bool LLParser::parseOptionalUWTableKind(
UWTableKind &Kind) {
2504 LocTy KindLoc = Lex.getLoc();
2510 return error(KindLoc,
"expected unwind table kind");
2517 LocTy ParenLoc = Lex.getLoc();
2519 return error(ParenLoc,
"expected '('");
2520 LocTy KindLoc = Lex.getLoc();
2522 if (parseStringConstant(Arg))
2523 return error(KindLoc,
"expected allockind value");
2527 }
else if (
A ==
"realloc") {
2529 }
else if (
A ==
"free") {
2531 }
else if (
A ==
"uninitialized") {
2533 }
else if (
A ==
"zeroed") {
2535 }
else if (
A ==
"aligned") {
2538 return error(KindLoc, Twine(
"unknown allockind ") +
A);
2541 ParenLoc = Lex.getLoc();
2543 return error(ParenLoc,
"expected ')'");
2545 return error(KindLoc,
"expected allockind value");
2562 return std::nullopt;
2577 return std::nullopt;
2581std::optional<MemoryEffects> LLParser::parseMemoryAttr() {
2586 Lex.setIgnoreColonInIdentifiers(
true);
2591 tokError(
"expected '('");
2592 return std::nullopt;
2595 bool SeenLoc =
false;
2597 std::optional<IRMemLocation> Loc =
keywordToLoc(Lex.getKind());
2601 tokError(
"expected ':' after location");
2602 return std::nullopt;
2609 tokError(
"expected memory location (argmem, inaccessiblemem, errnomem) "
2610 "or access kind (none, read, write, readwrite)");
2612 tokError(
"expected access kind (none, read, write, readwrite)");
2613 return std::nullopt;
2622 tokError(
"default access kind must be specified first");
2623 return std::nullopt;
2632 tokError(
"unterminated memory attribute");
2633 return std::nullopt;
2675unsigned LLParser::parseNoFPClassAttr() {
2680 tokError(
"expected '('");
2687 if (TestMask != 0) {
2691 !parseUInt64(
Value)) {
2693 error(Lex.getLoc(),
"invalid mask value for 'nofpclass'");
2698 error(Lex.getLoc(),
"expected ')'");
2704 error(Lex.getLoc(),
"expected nofpclass test mask");
2722bool LLParser::parseOptionalCommaAlign(
MaybeAlign &Alignment,
2723 bool &AteExtraComma) {
2724 AteExtraComma =
false;
2728 AteExtraComma =
true;
2732 if (Lex.getKind() != lltok::kw_align)
2733 return error(Lex.getLoc(),
"expected metadata or 'align'");
2735 if (parseOptionalAlignment(Alignment))
2748bool LLParser::parseOptionalCommaAddrSpace(
unsigned &AddrSpace, LocTy &
Loc,
2749 bool &AteExtraComma) {
2750 AteExtraComma =
false;
2754 AteExtraComma =
true;
2760 return error(Lex.getLoc(),
"expected metadata or 'addrspace'");
2762 if (parseOptionalAddrSpace(AddrSpace))
2769bool LLParser::parseAllocSizeArguments(
unsigned &BaseSizeArg,
2770 std::optional<unsigned> &HowManyArg) {
2773 auto StartParen = Lex.getLoc();
2775 return error(StartParen,
"expected '('");
2777 if (parseUInt32(BaseSizeArg))
2781 auto HowManyAt = Lex.getLoc();
2783 if (parseUInt32(HowMany))
2785 if (HowMany == BaseSizeArg)
2786 return error(HowManyAt,
2787 "'allocsize' indices can't refer to the same parameter");
2788 HowManyArg = HowMany;
2790 HowManyArg = std::nullopt;
2792 auto EndParen = Lex.getLoc();
2794 return error(EndParen,
"expected ')'");
2798bool LLParser::parseVScaleRangeArguments(
unsigned &MinValue,
2799 unsigned &MaxValue) {
2802 auto StartParen = Lex.getLoc();
2804 return error(StartParen,
"expected '('");
2806 if (parseUInt32(MinValue))
2810 if (parseUInt32(MaxValue))
2813 MaxValue = MinValue;
2815 auto EndParen = Lex.getLoc();
2817 return error(EndParen,
"expected ')'");
2826bool LLParser::parseScopeAndOrdering(
bool IsAtomic,
SyncScope::ID &SSID,
2831 return parseScope(SSID) || parseOrdering(Ordering);
2841 auto StartParenAt = Lex.getLoc();
2843 return error(StartParenAt,
"Expected '(' in syncscope");
2846 auto SSNAt = Lex.getLoc();
2847 if (parseStringConstant(SSN))
2848 return error(SSNAt,
"Expected synchronization scope name");
2850 auto EndParenAt = Lex.getLoc();
2852 return error(EndParenAt,
"Expected ')' in syncscope");
2854 SSID = Context.getOrInsertSyncScopeID(SSN);
2865 switch (Lex.getKind()) {
2867 return tokError(
"Expected ordering on atomic instruction");
2886bool LLParser::parseOptionalStackAlignment(
unsigned &Alignment) {
2888 if (!EatIfPresent(lltok::kw_alignstack))
2890 LocTy ParenLoc = Lex.getLoc();
2892 return error(ParenLoc,
"expected '('");
2893 LocTy AlignLoc = Lex.getLoc();
2894 if (parseUInt32(Alignment))
2896 ParenLoc = Lex.getLoc();
2898 return error(ParenLoc,
"expected ')'");
2900 return error(AlignLoc,
"stack alignment is not a power of two");
2914 bool &AteExtraComma) {
2915 AteExtraComma =
false;
2918 return tokError(
"expected ',' as start of index list");
2922 if (Indices.
empty())
2923 return tokError(
"expected index");
2924 AteExtraComma =
true;
2928 if (parseUInt32(Idx))
2941bool LLParser::parseType(
Type *&Result,
const Twine &Msg,
bool AllowVoid) {
2942 SMLoc TypeLoc = Lex.getLoc();
2943 switch (Lex.getKind()) {
2945 return tokError(Msg);
2954 if (
Result->isPointerTy()) {
2956 if (parseOptionalAddrSpace(AddrSpace))
2962 return tokError(
"ptr* is invalid - use ptr instead");
2973 if (parseTargetExtType(Result))
2979 if (parseAnonStructType(Result,
false))
2985 if (parseArrayVectorType(Result,
false))
2992 if (parseAnonStructType(Result,
true) ||
2993 parseToken(
lltok::greater,
"expected '>' at end of packed struct"))
2995 }
else if (parseArrayVectorType(Result,
true))
3000 std::pair<Type*, LocTy> &
Entry = NamedTypes[Lex.getStrVal()];
3006 Entry.second = Lex.getLoc();
3015 std::pair<Type*, LocTy> &
Entry = NumberedTypes[Lex.getUIntVal()];
3021 Entry.second = Lex.getLoc();
3031 switch (Lex.getKind()) {
3034 if (!AllowVoid &&
Result->isVoidTy())
3035 return error(TypeLoc,
"void type only allowed for function results");
3041 return tokError(
"basic block pointers are invalid");
3043 return tokError(
"pointers to void are invalid - use i8* instead");
3045 return tokError(
"pointer to this type is invalid");
3053 return tokError(
"basic block pointers are invalid");
3055 return tokError(
"pointers to void are invalid; use i8* instead");
3057 return tokError(
"pointer to this type is invalid");
3059 if (parseOptionalAddrSpace(AddrSpace) ||
3060 parseToken(
lltok::star,
"expected '*' in address space"))
3069 if (parseFunctionType(Result))
3082 PerFunctionState &PFS,
bool IsMustTailCall,
3083 bool InVarArgsFunc) {
3089 if (!ArgList.
empty() &&
3090 parseToken(
lltok::comma,
"expected ',' in argument list"))
3095 const char *Msg =
"unexpected ellipsis in argument list for ";
3096 if (!IsMustTailCall)
3097 return tokError(Twine(Msg) +
"non-musttail call");
3099 return tokError(Twine(Msg) +
"musttail call in non-varargs function");
3101 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3106 Type *ArgTy =
nullptr;
3108 if (parseType(ArgTy, ArgLoc))
3111 return error(ArgLoc,
"invalid type for function argument");
3113 AttrBuilder ArgAttrs(M->getContext());
3116 if (parseMetadataAsValue(V, PFS))
3120 if (parseOptionalParamAttrs(ArgAttrs) || parseValue(ArgTy, V, PFS))
3127 if (IsMustTailCall && InVarArgsFunc)
3128 return tokError(
"expected '...' at end of argument list for musttail call "
3129 "in varargs function");
3137bool LLParser::parseRequiredTypeAttr(AttrBuilder &
B,
lltok::Kind AttrToken,
3140 if (!EatIfPresent(AttrToken))
3143 return error(Lex.getLoc(),
"expected '('");
3147 return error(Lex.getLoc(),
"expected ')'");
3149 B.addTypeAttr(AttrKind, Ty);
3155bool LLParser::parseRangeAttr(AttrBuilder &
B) {
3163 auto ParseAPSInt = [&](
unsigned BitWidth, APInt &Val) {
3165 return tokError(
"expected integer");
3166 if (Lex.getAPSIntVal().getBitWidth() >
BitWidth)
3168 "integer is too large for the bit width of specified type");
3169 Val = Lex.getAPSIntVal().extend(
BitWidth);
3174 if (parseToken(
lltok::lparen,
"expected '('") || parseType(Ty, TyLoc))
3177 return error(TyLoc,
"the range must have integer type!");
3185 return tokError(
"the range represent the empty set but limits aren't 0!");
3196bool LLParser::parseInitializesAttr(AttrBuilder &
B) {
3199 auto ParseAPSInt = [&](APInt &Val) {
3201 return tokError(
"expected integer");
3202 Val = Lex.getAPSIntVal().extend(64);
3222 return tokError(
"the range should not represent the full or empty set!");
3234 if (!CRLOrNull.has_value())
3235 return tokError(
"Invalid (unordered or overlapping) range list");
3236 B.addInitializesAttr(*CRLOrNull);
3240bool LLParser::parseCapturesAttr(AttrBuilder &
B) {
3242 std::optional<CaptureComponents> Ret;
3246 Lex.setIgnoreColonInIdentifiers(
true);
3254 bool SeenComponent =
false;
3260 return tokError(
"duplicate 'ret' location");
3263 SeenComponent =
false;
3268 return tokError(
"cannot use 'none' with other component");
3272 return tokError(
"cannot use 'none' with other component");
3283 return tokError(
"expected one of 'none', 'address', 'address_is_null', "
3284 "'provenance' or 'read_provenance'");
3287 SeenComponent =
true;
3295 B.addCapturesAttr(CaptureInfo(
Other, Ret.value_or(
Other)));
3308bool LLParser::parseOptionalOperandBundles(
3310 LocTy BeginLoc = Lex.getLoc();
3316 if (!BundleList.
empty() &&
3317 parseToken(
lltok::comma,
"expected ',' in input list"))
3321 if (parseStringConstant(
Tag))
3324 if (parseToken(
lltok::lparen,
"expected '(' in operand bundle"))
3327 std::vector<Value *> Inputs;
3330 if (!Inputs.empty() &&
3331 parseToken(
lltok::comma,
"expected ',' in input list"))
3335 Value *Input =
nullptr;
3339 if (parseMetadataAsValue(Input, PFS))
3341 }
else if (parseValue(Ty, Input, PFS)) {
3344 Inputs.push_back(Input);
3352 if (BundleList.
empty())
3353 return error(BeginLoc,
"operand bundle set must not be empty");
3360 unsigned NextID,
unsigned ID) {
3362 return error(Loc, Kind +
" expected to be numbered '" + Prefix +
3363 Twine(NextID) +
"' or greater");
3380 unsigned CurValID = 0;
3394 LocTy TypeLoc = Lex.getLoc();
3395 Type *ArgTy =
nullptr;
3396 AttrBuilder
Attrs(M->getContext());
3397 if (parseType(ArgTy) || parseOptionalParamAttrs(Attrs))
3401 return error(TypeLoc,
"argument can not have void type");
3405 Name = Lex.getStrVal();
3410 ArgID = Lex.getUIntVal();
3411 if (checkValueID(TypeLoc,
"argument",
"%", CurValID, ArgID))
3418 CurValID = ArgID + 1;
3422 return error(TypeLoc,
"invalid type for function argument");
3430 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3435bool LLParser::parseFunctionType(
Type *&Result) {
3439 return tokError(
"invalid function return type");
3443 SmallVector<unsigned> UnnamedArgNums;
3444 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg))
3448 for (
const ArgInfo &Arg : ArgList) {
3449 if (!Arg.Name.empty())
3450 return error(Arg.Loc,
"argument name invalid in function type");
3451 if (Arg.Attrs.hasAttributes())
3452 return error(Arg.Loc,
"argument attributes invalid in function type");
3456 for (
const ArgInfo &Arg : ArgList)
3465bool LLParser::parseAnonStructType(
Type *&Result,
bool Packed) {
3467 if (parseStructBody(Elts))
3475bool LLParser::parseStructDefinition(
SMLoc TypeLoc,
StringRef Name,
3476 std::pair<Type *, LocTy> &Entry,
3480 return error(TypeLoc,
"redefinition of type");
3486 Entry.second = SMLoc();
3491 ResultTy =
Entry.first;
3503 return error(TypeLoc,
"forward references to non-struct type");
3507 return parseArrayVectorType(ResultTy,
true);
3508 return parseType(ResultTy);
3512 Entry.second = SMLoc();
3521 if (parseStructBody(Body) ||
3522 (isPacked && parseToken(
lltok::greater,
"expected '>' in packed struct")))
3526 return tokError(
toString(std::move(
E)));
3546 LocTy EltTyLoc = Lex.getLoc();
3553 return error(EltTyLoc,
"invalid element type for struct");
3556 EltTyLoc = Lex.getLoc();
3561 return error(EltTyLoc,
"invalid element type for struct");
3566 return parseToken(
lltok::rbrace,
"expected '}' at end of struct");
3575bool LLParser::parseArrayVectorType(
Type *&Result,
bool IsVector) {
3576 bool Scalable =
false;
3580 if (parseToken(
lltok::kw_x,
"expected 'x' after vscale"))
3586 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned() ||
3587 Lex.getAPSIntVal().getBitWidth() > 64)
3588 return tokError(
"expected number in address space");
3590 LocTy SizeLoc = Lex.getLoc();
3591 uint64_t
Size = Lex.getAPSIntVal().getZExtValue();
3594 if (parseToken(
lltok::kw_x,
"expected 'x' after element count"))
3597 LocTy TypeLoc = Lex.getLoc();
3598 Type *EltTy =
nullptr;
3599 if (parseType(EltTy))
3603 "expected end of sequential type"))
3608 return error(SizeLoc,
"zero element vector is illegal");
3610 return error(SizeLoc,
"size too large for vector");
3612 return error(TypeLoc,
"invalid vector element type");
3616 return error(TypeLoc,
"invalid array element type");
3633bool LLParser::parseTargetExtType(
Type *&Result) {
3638 if (parseToken(
lltok::lparen,
"expected '(' in target extension type") ||
3639 parseStringConstant(TypeName))
3646 SmallVector<unsigned> IntParams;
3647 bool SeenInt =
false;
3654 if (parseUInt32(IntVal))
3657 }
else if (SeenInt) {
3660 return tokError(
"expected uint32 param");
3663 if (parseType(TypeParam,
true))
3669 if (parseToken(
lltok::rparen,
"expected ')' in target extension type"))
3674 if (
auto E = TTy.takeError())
3675 return tokError(
toString(std::move(
E)));
3688 :
P(
p),
F(
f), FunctionNumber(functionNumber) {
3691 auto It = UnnamedArgNums.
begin();
3694 unsigned ArgNum = *It++;
3695 NumberedVals.add(ArgNum, &A);
3700LLParser::PerFunctionState::~PerFunctionState() {
3703 for (
const auto &P : ForwardRefVals) {
3706 P.second.first->replaceAllUsesWith(
3708 P.second.first->deleteValue();
3711 for (
const auto &P : ForwardRefValIDs) {
3714 P.second.first->replaceAllUsesWith(
3716 P.second.first->deleteValue();
3720bool LLParser::PerFunctionState::finishFunction() {
3721 if (!ForwardRefVals.empty())
3722 return P.error(ForwardRefVals.begin()->second.second,
3723 "use of undefined value '%" + ForwardRefVals.begin()->first +
3725 if (!ForwardRefValIDs.empty())
3726 return P.error(ForwardRefValIDs.begin()->second.second,
3727 "use of undefined value '%" +
3728 Twine(ForwardRefValIDs.begin()->first) +
"'");
3735Value *LLParser::PerFunctionState::getVal(
const std::string &Name,
Type *Ty,
3738 Value *Val =
F.getValueSymbolTable()->lookup(Name);
3743 auto I = ForwardRefVals.find(Name);
3744 if (
I != ForwardRefVals.end())
3745 Val =
I->second.first;
3750 return P.checkValidVariableType(Loc,
"%" + Name, Ty, Val);
3754 P.error(Loc,
"invalid use of a non-first-class type");
3765 if (FwdVal->
getName() != Name) {
3766 P.error(Loc,
"name is too long which can result in name collisions, "
3767 "consider making the name shorter or "
3768 "increasing -non-global-value-max-name-size");
3772 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
3776Value *LLParser::PerFunctionState::getVal(
unsigned ID,
Type *Ty,
LocTy Loc) {
3778 Value *Val = NumberedVals.get(
ID);
3783 auto I = ForwardRefValIDs.find(
ID);
3784 if (
I != ForwardRefValIDs.end())
3785 Val =
I->second.first;
3790 return P.checkValidVariableType(Loc,
"%" + Twine(
ID), Ty, Val);
3793 P.error(Loc,
"invalid use of a non-first-class type");
3805 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
3811bool LLParser::PerFunctionState::setInstName(
int NameID,
3812 const std::string &NameStr,
3813 LocTy NameLoc, Instruction *Inst) {
3816 if (NameID != -1 || !NameStr.empty())
3817 return P.error(NameLoc,
"instructions returning void cannot have a name");
3823 if (NameStr.empty()) {
3826 NameID = NumberedVals.getNext();
3828 if (
P.checkValueID(NameLoc,
"instruction",
"%", NumberedVals.getNext(),
3832 auto FI = ForwardRefValIDs.find(NameID);
3833 if (FI != ForwardRefValIDs.end()) {
3836 return P.error(NameLoc,
"instruction forward referenced with type '" +
3840 Sentinel->replaceAllUsesWith(Inst);
3842 ForwardRefValIDs.erase(FI);
3845 NumberedVals.add(NameID, Inst);
3850 auto FI = ForwardRefVals.find(NameStr);
3851 if (FI != ForwardRefVals.end()) {
3854 return P.error(NameLoc,
"instruction forward referenced with type '" +
3858 Sentinel->replaceAllUsesWith(Inst);
3860 ForwardRefVals.erase(FI);
3866 if (Inst->
getName() != NameStr)
3867 return P.error(NameLoc,
"multiple definition of local value named '" +
3874BasicBlock *LLParser::PerFunctionState::getBB(
const std::string &Name,
3888BasicBlock *LLParser::PerFunctionState::defineBB(
const std::string &Name,
3889 int NameID,
LocTy Loc) {
3893 if (
P.checkValueID(Loc,
"label",
"", NumberedVals.getNext(), NameID))
3896 NameID = NumberedVals.getNext();
3898 BB = getBB(NameID, Loc);
3900 P.error(Loc,
"unable to create block numbered '" + Twine(NameID) +
"'");
3904 BB = getBB(Name, Loc);
3906 P.error(Loc,
"unable to create block named '" + Name +
"'");
3917 ForwardRefValIDs.erase(NameID);
3918 NumberedVals.add(NameID, BB);
3921 ForwardRefVals.erase(Name);
3938bool LLParser::parseValID(ValID &
ID, PerFunctionState *PFS,
Type *ExpectedTy) {
3939 ID.Loc = Lex.getLoc();
3940 switch (Lex.getKind()) {
3942 return tokError(
"expected value token");
3944 ID.UIntVal = Lex.getUIntVal();
3948 ID.StrVal = Lex.getStrVal();
3952 ID.UIntVal = Lex.getUIntVal();
3956 ID.StrVal = Lex.getStrVal();
3960 ID.APSIntVal = Lex.getAPSIntVal();
3964 ID.APFloatVal = Lex.getAPFloatVal();
3985 if (parseGlobalValueVector(Elts) ||
3986 parseToken(
lltok::rbrace,
"expected end of struct constant"))
3989 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
3990 ID.UIntVal = Elts.
size();
3991 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
3992 Elts.
size() *
sizeof(Elts[0]));
4003 LocTy FirstEltLoc = Lex.getLoc();
4004 if (parseGlobalValueVector(Elts) ||
4006 parseToken(
lltok::rbrace,
"expected end of packed struct")) ||
4010 if (isPackedStruct) {
4011 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4012 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4013 Elts.
size() *
sizeof(Elts[0]));
4014 ID.UIntVal = Elts.
size();
4020 return error(
ID.Loc,
"constant vector must not be empty");
4022 if (!Elts[0]->
getType()->isIntegerTy() &&
4023 !Elts[0]->
getType()->isFloatingPointTy() &&
4027 "vector elements must have integer, pointer or floating point type");
4030 for (
unsigned i = 1, e = Elts.
size(); i != e; ++i)
4032 return error(FirstEltLoc,
"vector element #" + Twine(i) +
4033 " is not of type '" +
4043 LocTy FirstEltLoc = Lex.getLoc();
4044 if (parseGlobalValueVector(Elts) ||
4056 if (!Elts[0]->
getType()->isFirstClassType())
4057 return error(FirstEltLoc,
"invalid array element type: " +
4063 for (
unsigned i = 0, e = Elts.
size(); i != e; ++i) {
4065 return error(FirstEltLoc,
"array element #" + Twine(i) +
4066 " is not of type '" +
4086 bool HasSideEffect, AlignStack, AsmDialect, CanThrow;
4089 parseOptionalToken(lltok::kw_alignstack, AlignStack) ||
4092 parseStringConstant(
ID.StrVal) ||
4093 parseToken(
lltok::comma,
"expected comma in inline asm expression") ||
4096 ID.StrVal2 = Lex.getStrVal();
4097 ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack) << 1) |
4098 (
unsigned(AsmDialect) << 2) | (unsigned(CanThrow) << 3);
4109 if (parseToken(
lltok::lparen,
"expected '(' in block address expression") ||
4110 parseValID(Fn, PFS) ||
4112 "expected comma in block address expression") ||
4113 parseValID(Label, PFS) ||
4114 parseToken(
lltok::rparen,
"expected ')' in block address expression"))
4118 return error(Fn.
Loc,
"expected function name in blockaddress");
4120 return error(
Label.Loc,
"expected basic block name in blockaddress");
4123 GlobalValue *GV =
nullptr;
4125 GV = NumberedVals.get(Fn.
UIntVal);
4126 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4127 GV = M->getNamedValue(Fn.
StrVal);
4133 return error(Fn.
Loc,
"expected function name in blockaddress");
4135 if (
F->isDeclaration())
4136 return error(Fn.
Loc,
"cannot take blockaddress inside a declaration");
4141 GlobalValue *&FwdRef =
4142 ForwardRefBlockAddresses[std::move(Fn)][std::move(Label)];
4150 "type of blockaddress must be a pointer and not '" +
4155 FwdDeclAS = PFS->getFunction().getAddressSpace();
4159 FwdRef =
new GlobalVariable(
4164 ID.ConstantVal = FwdRef;
4172 if (BlockAddressPFS &&
F == &BlockAddressPFS->getFunction()) {
4174 BB = BlockAddressPFS->getBB(
Label.UIntVal,
Label.Loc);
4176 BB = BlockAddressPFS->getBB(
Label.StrVal,
Label.Loc);
4178 return error(
Label.Loc,
"referenced value is not a basic block");
4181 return error(
Label.Loc,
"cannot take address of numeric label after "
4182 "the function is defined");
4184 F->getValueSymbolTable()->lookup(
Label.StrVal));
4186 return error(
Label.Loc,
"referenced value is not a basic block");
4200 if (parseValID(Fn, PFS))
4205 "expected global value name in dso_local_equivalent");
4208 GlobalValue *GV =
nullptr;
4210 GV = NumberedVals.get(Fn.
UIntVal);
4211 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4212 GV = M->getNamedValue(Fn.
StrVal);
4218 ? ForwardRefDSOLocalEquivalentIDs
4219 : ForwardRefDSOLocalEquivalentNames;
4220 GlobalValue *&FwdRef = FwdRefMap[Fn];
4227 ID.ConstantVal = FwdRef;
4233 return error(Fn.
Loc,
"expected a function, alias to function, or ifunc "
4234 "in dso_local_equivalent");
4245 if (parseValID(
ID, PFS))
4249 return error(
ID.Loc,
"expected global value name in no_cfi");
4261 Constant *Disc =
nullptr, *AddrDisc =
nullptr,
4262 *DeactivationSymbol =
nullptr;
4265 "expected '(' in constant ptrauth expression") ||
4266 parseGlobalTypeAndValue(Ptr) ||
4268 "expected comma in constant ptrauth expression") ||
4269 parseGlobalTypeAndValue(
Key))
4272 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(Disc))
4274 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(AddrDisc))
4277 parseGlobalTypeAndValue(DeactivationSymbol))
4280 "expected ')' in constant ptrauth expression"))
4284 return error(
ID.Loc,
"constant ptrauth base pointer must be a pointer");
4287 if (!KeyC || KeyC->getBitWidth() != 32)
4288 return error(
ID.Loc,
"constant ptrauth key must be i32 constant");
4290 ConstantInt *DiscC =
nullptr;
4296 "constant ptrauth integer discriminator must be i64 constant");
4302 if (!AddrDisc->getType()->isPointerTy())
4304 ID.Loc,
"constant ptrauth address discriminator must be a pointer");
4309 if (!DeactivationSymbol)
4310 DeactivationSymbol =
4312 if (!DeactivationSymbol->getType()->isPointerTy())
4314 "constant ptrauth deactivation symbol must be a pointer");
4328 unsigned Opc = Lex.getUIntVal();
4329 Type *DestTy =
nullptr;
4332 if (parseToken(
lltok::lparen,
"expected '(' after constantexpr cast") ||
4333 parseGlobalTypeAndValue(SrcVal) ||
4334 parseToken(
lltok::kw_to,
"expected 'to' in constantexpr cast") ||
4335 parseType(DestTy) ||
4336 parseToken(
lltok::rparen,
"expected ')' at end of constantexpr cast"))
4339 return error(
ID.Loc,
"invalid cast opcode for cast from '" +
4348 return error(
ID.Loc,
"extractvalue constexprs are no longer supported");
4350 return error(
ID.Loc,
"insertvalue constexprs are no longer supported");
4352 return error(
ID.Loc,
"udiv constexprs are no longer supported");
4354 return error(
ID.Loc,
"sdiv constexprs are no longer supported");
4356 return error(
ID.Loc,
"urem constexprs are no longer supported");
4358 return error(
ID.Loc,
"srem constexprs are no longer supported");
4360 return error(
ID.Loc,
"fadd constexprs are no longer supported");
4362 return error(
ID.Loc,
"fsub constexprs are no longer supported");
4364 return error(
ID.Loc,
"fmul constexprs are no longer supported");
4366 return error(
ID.Loc,
"fdiv constexprs are no longer supported");
4368 return error(
ID.Loc,
"frem constexprs are no longer supported");
4370 return error(
ID.Loc,
"and constexprs are no longer supported");
4372 return error(
ID.Loc,
"or constexprs are no longer supported");
4374 return error(
ID.Loc,
"lshr constexprs are no longer supported");
4376 return error(
ID.Loc,
"ashr constexprs are no longer supported");
4378 return error(
ID.Loc,
"shl constexprs are no longer supported");
4380 return error(
ID.Loc,
"mul constexprs are no longer supported");
4382 return error(
ID.Loc,
"fneg constexprs are no longer supported");
4384 return error(
ID.Loc,
"select constexprs are no longer supported");
4386 return error(
ID.Loc,
"zext constexprs are no longer supported");
4388 return error(
ID.Loc,
"sext constexprs are no longer supported");
4390 return error(
ID.Loc,
"fptrunc constexprs are no longer supported");
4392 return error(
ID.Loc,
"fpext constexprs are no longer supported");
4394 return error(
ID.Loc,
"uitofp constexprs are no longer supported");
4396 return error(
ID.Loc,
"sitofp constexprs are no longer supported");
4398 return error(
ID.Loc,
"fptoui constexprs are no longer supported");
4400 return error(
ID.Loc,
"fptosi constexprs are no longer supported");
4402 return error(
ID.Loc,
"icmp constexprs are no longer supported");
4404 return error(
ID.Loc,
"fcmp constexprs are no longer supported");
4412 unsigned Opc = Lex.getUIntVal();
4415 if (
Opc == Instruction::Add ||
Opc == Instruction::Sub ||
4416 Opc == Instruction::Mul) {
4425 if (parseToken(
lltok::lparen,
"expected '(' in binary constantexpr") ||
4426 parseGlobalTypeAndValue(Val0) ||
4427 parseToken(
lltok::comma,
"expected comma in binary constantexpr") ||
4428 parseGlobalTypeAndValue(Val1) ||
4429 parseToken(
lltok::rparen,
"expected ')' in binary constantexpr"))
4432 return error(
ID.Loc,
"operands of constexpr must have same type");
4436 "constexpr requires integer or integer vector operands");
4447 if (parseToken(
lltok::lparen,
"expected '(' after vector splat"))
4450 if (parseGlobalTypeAndValue(
C))
4452 if (parseToken(
lltok::rparen,
"expected ')' at end of vector splat"))
4464 unsigned Opc = Lex.getUIntVal();
4467 bool HasInRange =
false;
4473 if (
Opc == Instruction::GetElementPtr) {
4489 return tokError(
"expected integer");
4490 InRangeStart = Lex.getAPSIntVal();
4495 return tokError(
"expected integer");
4496 InRangeEnd = Lex.getAPSIntVal();
4504 if (parseToken(
lltok::lparen,
"expected '(' in constantexpr"))
4507 if (
Opc == Instruction::GetElementPtr) {
4508 if (parseType(Ty) ||
4509 parseToken(
lltok::comma,
"expected comma after getelementptr's type"))
4513 if (parseGlobalValueVector(Elts) ||
4517 if (
Opc == Instruction::GetElementPtr) {
4518 if (Elts.
size() == 0 ||
4519 !Elts[0]->getType()->isPtrOrPtrVectorTy())
4520 return error(
ID.Loc,
"base of getelementptr must be a pointer");
4523 std::optional<ConstantRange>
InRange;
4525 unsigned IndexWidth =
4526 M->getDataLayout().getIndexTypeSizeInBits(
BaseType);
4527 InRangeStart = InRangeStart.
extOrTrunc(IndexWidth);
4528 InRangeEnd = InRangeEnd.
extOrTrunc(IndexWidth);
4529 if (InRangeStart.
sge(InRangeEnd))
4530 return error(
ID.Loc,
"expected end to be larger than start");
4540 for (Constant *Val : Indices) {
4543 return error(
ID.Loc,
"getelementptr index must be an integer");
4546 if (GEPWidth && (ValNumEl != GEPWidth))
4549 "getelementptr vector index has a wrong number of elements");
4552 GEPWidth = ValNumEl;
4556 SmallPtrSet<Type*, 4> Visited;
4557 if (!Indices.empty() && !Ty->
isSized(&Visited))
4558 return error(
ID.Loc,
"base element of getelementptr must be sized");
4561 return error(
ID.Loc,
"invalid base element for constant getelementptr");
4564 return error(
ID.Loc,
"invalid getelementptr indices");
4568 }
else if (
Opc == Instruction::ShuffleVector) {
4569 if (Elts.
size() != 3)
4570 return error(
ID.Loc,
"expected three operands to shufflevector");
4572 return error(
ID.Loc,
"invalid operands to shufflevector");
4573 SmallVector<int, 16>
Mask;
4576 }
else if (
Opc == Instruction::ExtractElement) {
4577 if (Elts.
size() != 2)
4578 return error(
ID.Loc,
"expected two operands to extractelement");
4580 return error(
ID.Loc,
"invalid extractelement operands");
4583 assert(
Opc == Instruction::InsertElement &&
"Unknown opcode");
4584 if (Elts.
size() != 3)
4585 return error(
ID.Loc,
"expected three operands to insertelement");
4587 return error(
ID.Loc,
"invalid insertelement operands");
4602bool LLParser::parseGlobalValue(
Type *Ty, Constant *&
C) {
4606 bool Parsed = parseValID(
ID,
nullptr, Ty) ||
4607 convertValIDToValue(Ty,
ID, V,
nullptr);
4609 return error(
ID.Loc,
"global values must be constants");
4613bool LLParser::parseGlobalTypeAndValue(Constant *&V) {
4615 return parseType(Ty) || parseGlobalValue(Ty, V);
4618bool LLParser::parseOptionalComdat(StringRef GlobalName, Comdat *&
C) {
4621 LocTy KwLoc = Lex.getLoc();
4627 return tokError(
"expected comdat variable");
4628 C = getComdat(Lex.getStrVal(), Lex.getLoc());
4630 if (parseToken(
lltok::rparen,
"expected ')' after comdat var"))
4633 if (GlobalName.
empty())
4634 return tokError(
"comdat cannot be unnamed");
4635 C = getComdat(std::string(GlobalName), KwLoc);
4644bool LLParser::parseGlobalValueVector(SmallVectorImpl<Constant *> &Elts) {
4658 if (parseGlobalTypeAndValue(
C))
4666bool LLParser::parseMDTuple(MDNode *&MD,
bool IsDistinct) {
4668 if (parseMDNodeVector(Elts))
4679bool LLParser::parseMDNode(MDNode *&
N) {
4681 return parseSpecializedMDNode(
N);
4683 return parseToken(
lltok::exclaim,
"expected '!' here") || parseMDNodeTail(
N);
4686bool LLParser::parseMDNodeTail(MDNode *&
N) {
4689 return parseMDTuple(
N);
4692 return parseMDNodeID(
N);
4698template <
class FieldTy>
struct MDFieldImpl {
4699 typedef MDFieldImpl ImplTy;
4703 void assign(FieldTy Val) {
4705 this->Val = std::move(Val);
4708 explicit MDFieldImpl(FieldTy
Default)
4716template <
class FieldTypeA,
class FieldTypeB>
struct MDEitherFieldImpl {
4717 typedef MDEitherFieldImpl<FieldTypeA, FieldTypeB> ImplTy;
4728 void assign(FieldTypeA
A) {
4730 this->
A = std::move(
A);
4734 void assign(FieldTypeB
B) {
4736 this->
B = std::move(
B);
4740 explicit MDEitherFieldImpl(FieldTypeA DefaultA, FieldTypeB DefaultB)
4742 WhatIs(IsInvalid) {}
4745struct MDUnsignedField :
public MDFieldImpl<uint64_t> {
4752struct LineField :
public MDUnsignedField {
4753 LineField() : MDUnsignedField(0, UINT32_MAX) {}
4756struct ColumnField :
public MDUnsignedField {
4757 ColumnField() : MDUnsignedField(0, UINT16_MAX) {}
4760struct DwarfTagField :
public MDUnsignedField {
4766struct DwarfMacinfoTypeField :
public MDUnsignedField {
4772struct DwarfAttEncodingField :
public MDUnsignedField {
4773 DwarfAttEncodingField() : MDUnsignedField(0, dwarf::
DW_ATE_hi_user) {}
4776struct DwarfVirtualityField :
public MDUnsignedField {
4780struct DwarfLangField :
public MDUnsignedField {
4784struct DwarfSourceLangNameField :
public MDUnsignedField {
4785 DwarfSourceLangNameField() : MDUnsignedField(0, UINT32_MAX) {}
4788struct DwarfCCField :
public MDUnsignedField {
4789 DwarfCCField() : MDUnsignedField(0, dwarf::
DW_CC_hi_user) {}
4792struct DwarfEnumKindField :
public MDUnsignedField {
4793 DwarfEnumKindField()
4798struct EmissionKindField :
public MDUnsignedField {
4799 EmissionKindField() : MDUnsignedField(0, DICompileUnit::LastEmissionKind) {}
4802struct FixedPointKindField :
public MDUnsignedField {
4803 FixedPointKindField()
4804 : MDUnsignedField(0, DIFixedPointType::LastFixedPointKind) {}
4807struct NameTableKindField :
public MDUnsignedField {
4808 NameTableKindField()
4811 DICompileUnit::DebugNameTableKind::LastDebugNameTableKind) {}
4814struct DIFlagField :
public MDFieldImpl<DINode::DIFlags> {
4815 DIFlagField() : MDFieldImpl(DINode::FlagZero) {}
4818struct DISPFlagField :
public MDFieldImpl<DISubprogram::DISPFlags> {
4819 DISPFlagField() : MDFieldImpl(DISubprogram::SPFlagZero) {}
4822struct MDAPSIntField :
public MDFieldImpl<APSInt> {
4823 MDAPSIntField() : ImplTy(
APSInt()) {}
4826struct MDSignedField :
public MDFieldImpl<int64_t> {
4830 MDSignedField(int64_t
Default = 0)
4832 MDSignedField(int64_t
Default, int64_t Min, int64_t Max)
4836struct MDBoolField :
public MDFieldImpl<bool> {
4840struct MDField :
public MDFieldImpl<Metadata *> {
4843 MDField(
bool AllowNull =
true) : ImplTy(nullptr), AllowNull(AllowNull) {}
4846struct MDStringField :
public MDFieldImpl<MDString *> {
4847 enum class EmptyIs {
4852 MDStringField(
enum EmptyIs EmptyIs = EmptyIs::Null)
4853 : ImplTy(nullptr), EmptyIs(EmptyIs) {}
4856struct MDFieldList :
public MDFieldImpl<SmallVector<Metadata *, 4>> {
4860struct ChecksumKindField :
public MDFieldImpl<DIFile::ChecksumKind> {
4864struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
4865 MDSignedOrMDField(int64_t
Default = 0,
bool AllowNull =
true)
4866 : ImplTy(MDSignedField(
Default), MDField(AllowNull)) {}
4868 MDSignedOrMDField(int64_t
Default, int64_t Min, int64_t Max,
4869 bool AllowNull =
true)
4870 : ImplTy(MDSignedField(
Default, Min,
Max), MDField(AllowNull)) {}
4872 bool isMDSignedField()
const {
return WhatIs == IsTypeA; }
4873 bool isMDField()
const {
return WhatIs == IsTypeB; }
4874 int64_t getMDSignedValue()
const {
4875 assert(isMDSignedField() &&
"Wrong field type");
4878 Metadata *getMDFieldValue()
const {
4879 assert(isMDField() &&
"Wrong field type");
4884struct MDUnsignedOrMDField : MDEitherFieldImpl<MDUnsignedField, MDField> {
4885 MDUnsignedOrMDField(uint64_t
Default = 0,
bool AllowNull =
true)
4886 : ImplTy(MDUnsignedField(
Default), MDField(AllowNull)) {}
4888 MDUnsignedOrMDField(uint64_t
Default, uint64_t Max,
bool AllowNull =
true)
4889 : ImplTy(MDUnsignedField(
Default,
Max), MDField(AllowNull)) {}
4891 bool isMDUnsignedField()
const {
return WhatIs == IsTypeA; }
4892 bool isMDField()
const {
return WhatIs == IsTypeB; }
4893 uint64_t getMDUnsignedValue()
const {
4894 assert(isMDUnsignedField() &&
"Wrong field type");
4897 Metadata *getMDFieldValue()
const {
4898 assert(isMDField() &&
"Wrong field type");
4903 if (isMDUnsignedField())
4905 ConstantInt::get(Type::getInt64Ty(
Context), getMDUnsignedValue()));
4907 return getMDFieldValue();
4919 return tokError(
"expected integer");
4921 Result.assign(Lex.getAPSIntVal());
4928 MDUnsignedField &Result) {
4929 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
4930 return tokError(
"expected unsigned integer");
4932 auto &U = Lex.getAPSIntVal();
4933 if (U.ugt(Result.Max))
4934 return tokError(
"value for '" + Name +
"' too large, limit is " +
4936 Result.assign(U.getZExtValue());
4937 assert(Result.Val <= Result.Max &&
"Expected value in range");
4944 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4948 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4954 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4957 return tokError(
"expected DWARF tag");
4961 return tokError(
"invalid DWARF tag" +
Twine(
" '") + Lex.getStrVal() +
"'");
4962 assert(
Tag <= Result.Max &&
"Expected valid DWARF tag");
4971 DwarfMacinfoTypeField &Result) {
4973 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4976 return tokError(
"expected DWARF macinfo type");
4980 return tokError(
"invalid DWARF macinfo type" +
Twine(
" '") +
4981 Lex.getStrVal() +
"'");
4982 assert(Macinfo <= Result.Max &&
"Expected valid DWARF macinfo type");
4984 Result.assign(Macinfo);
4991 DwarfVirtualityField &Result) {
4993 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
4996 return tokError(
"expected DWARF virtuality code");
5000 return tokError(
"invalid DWARF virtuality code" +
Twine(
" '") +
5001 Lex.getStrVal() +
"'");
5002 assert(Virtuality <= Result.Max &&
"Expected valid DWARF virtuality code");
5003 Result.assign(Virtuality);
5010 DwarfEnumKindField &Result) {
5012 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5015 return tokError(
"expected DWARF enum kind code");
5019 return tokError(
"invalid DWARF enum kind code" +
Twine(
" '") +
5020 Lex.getStrVal() +
"'");
5021 assert(EnumKind <= Result.Max &&
"Expected valid DWARF enum kind code");
5022 Result.assign(EnumKind);
5030 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5033 return tokError(
"expected DWARF language");
5037 return tokError(
"invalid DWARF language" +
Twine(
" '") + Lex.getStrVal() +
5039 assert(Lang <= Result.Max &&
"Expected valid DWARF language");
5040 Result.assign(Lang);
5047 DwarfSourceLangNameField &Result) {
5049 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5052 return tokError(
"expected DWARF source language name");
5056 return tokError(
"invalid DWARF source language name" +
Twine(
" '") +
5057 Lex.getStrVal() +
"'");
5058 assert(Lang <= Result.Max &&
"Expected valid DWARF source language name");
5059 Result.assign(Lang);
5067 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5070 return tokError(
"expected DWARF calling convention");
5074 return tokError(
"invalid DWARF calling convention" +
Twine(
" '") +
5075 Lex.getStrVal() +
"'");
5076 assert(CC <= Result.Max &&
"Expected valid DWARF calling convention");
5084 EmissionKindField &Result) {
5086 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5089 return tokError(
"expected emission kind");
5093 return tokError(
"invalid emission kind" +
Twine(
" '") + Lex.getStrVal() +
5095 assert(*Kind <= Result.Max &&
"Expected valid emission kind");
5096 Result.assign(*Kind);
5103 FixedPointKindField &Result) {
5105 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5108 return tokError(
"expected fixed-point kind");
5112 return tokError(
"invalid fixed-point kind" +
Twine(
" '") + Lex.getStrVal() +
5114 assert(*Kind <= Result.Max &&
"Expected valid fixed-point kind");
5115 Result.assign(*Kind);
5122 NameTableKindField &Result) {
5124 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5127 return tokError(
"expected nameTable kind");
5131 return tokError(
"invalid nameTable kind" +
Twine(
" '") + Lex.getStrVal() +
5133 assert(((
unsigned)*Kind) <= Result.Max &&
"Expected valid nameTable kind");
5134 Result.assign((
unsigned)*Kind);
5141 DwarfAttEncodingField &Result) {
5143 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5146 return tokError(
"expected DWARF type attribute encoding");
5150 return tokError(
"invalid DWARF type attribute encoding" +
Twine(
" '") +
5151 Lex.getStrVal() +
"'");
5152 assert(Encoding <= Result.Max &&
"Expected valid DWARF language");
5153 Result.assign(Encoding);
5167 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5169 bool Res = parseUInt32(TempVal);
5175 return tokError(
"expected debug info flag");
5179 return tokError(
Twine(
"invalid debug info flag '") + Lex.getStrVal() +
5194 Result.assign(Combined);
5207 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5209 bool Res = parseUInt32(TempVal);
5215 return tokError(
"expected debug info flag");
5219 return tokError(
Twine(
"invalid subprogram debug info flag '") +
5220 Lex.getStrVal() +
"'");
5234 Result.assign(Combined);
5241 return tokError(
"expected signed integer");
5243 auto &S = Lex.getAPSIntVal();
5245 return tokError(
"value for '" + Name +
"' too small, limit is " +
5248 return tokError(
"value for '" + Name +
"' too large, limit is " +
5250 Result.assign(S.getExtValue());
5251 assert(Result.Val >= Result.Min &&
"Expected value in range");
5252 assert(Result.Val <= Result.Max &&
"Expected value in range");
5259 switch (Lex.getKind()) {
5261 return tokError(
"expected 'true' or 'false'");
5263 Result.assign(
true);
5266 Result.assign(
false);
5276 if (!Result.AllowNull)
5277 return tokError(
"'" + Name +
"' cannot be null");
5279 Result.assign(
nullptr);
5284 if (parseMetadata(MD,
nullptr))
5293 MDSignedOrMDField &Result) {
5296 MDSignedField Res = Result.A;
5297 if (!parseMDField(
Loc, Name, Res)) {
5305 MDField Res = Result.B;
5306 if (!parseMDField(
Loc, Name, Res)) {
5316 MDUnsignedOrMDField &Result) {
5319 MDUnsignedField Res = Result.A;
5320 if (!parseMDField(
Loc, Name, Res)) {
5328 MDField Res = Result.B;
5329 if (!parseMDField(
Loc, Name, Res)) {
5339 LocTy ValueLoc = Lex.getLoc();
5341 if (parseStringConstant(S))
5345 switch (Result.EmptyIs) {
5346 case MDStringField::EmptyIs::Null:
5347 Result.assign(
nullptr);
5349 case MDStringField::EmptyIs::Empty:
5351 case MDStringField::EmptyIs::Error:
5352 return error(ValueLoc,
"'" + Name +
"' cannot be empty");
5363 if (parseMDNodeVector(MDs))
5366 Result.assign(std::move(MDs));
5372 ChecksumKindField &Result) {
5373 std::optional<DIFile::ChecksumKind> CSKind =
5377 return tokError(
"invalid checksum kind" +
Twine(
" '") + Lex.getStrVal() +
5380 Result.assign(*CSKind);
5387template <
class ParserTy>
5388bool LLParser::parseMDFieldsImplBody(ParserTy ParseField) {
5391 return tokError(
"expected field label here");
5400template <
class ParserTy>
5401bool LLParser::parseMDFieldsImpl(ParserTy ParseField, LocTy &ClosingLoc) {
5408 if (parseMDFieldsImplBody(ParseField))
5411 ClosingLoc = Lex.getLoc();
5415template <
class FieldTy>
5416bool LLParser::parseMDField(
StringRef Name, FieldTy &Result) {
5418 return tokError(
"field '" + Name +
"' cannot be specified more than once");
5420 LocTy Loc = Lex.getLoc();
5422 return parseMDField(Loc, Name, Result);
5425bool LLParser::parseSpecializedMDNode(
MDNode *&
N,
bool IsDistinct) {
5428#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
5429 if (Lex.getStrVal() == #CLASS) \
5430 return parse##CLASS(N, IsDistinct);
5431#include "llvm/IR/Metadata.def"
5433 return tokError(
"expected metadata type");
5436#define DECLARE_FIELD(NAME, TYPE, INIT) TYPE NAME INIT
5437#define NOP_FIELD(NAME, TYPE, INIT)
5438#define REQUIRE_FIELD(NAME, TYPE, INIT) \
5440 return error(ClosingLoc, "missing required field '" #NAME "'");
5441#define PARSE_MD_FIELD(NAME, TYPE, DEFAULT) \
5442 if (Lex.getStrVal() == #NAME) \
5443 return parseMDField(#NAME, NAME);
5444#define PARSE_MD_FIELDS() \
5445 VISIT_MD_FIELDS(DECLARE_FIELD, DECLARE_FIELD) \
5448 if (parseMDFieldsImpl( \
5450 VISIT_MD_FIELDS(PARSE_MD_FIELD, PARSE_MD_FIELD) \
5451 return tokError(Twine("invalid field '") + Lex.getStrVal() + \
5456 VISIT_MD_FIELDS(NOP_FIELD, REQUIRE_FIELD) \
5458#define GET_OR_DISTINCT(CLASS, ARGS) \
5459 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
5464bool LLParser::parseDILocation(
MDNode *&Result,
bool IsDistinct) {
5465#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5466 OPTIONAL(line, LineField, ); \
5467 OPTIONAL(column, ColumnField, ); \
5468 REQUIRED(scope, MDField, ( false)); \
5469 OPTIONAL(inlinedAt, MDField, ); \
5470 OPTIONAL(isImplicitCode, MDBoolField, (false)); \
5471 OPTIONAL(atomGroup, MDUnsignedField, (0, UINT64_MAX)); \
5472 OPTIONAL(atomRank, MDUnsignedField, (0, UINT8_MAX));
5474#undef VISIT_MD_FIELDS
5477 DILocation, (Context, line.Val, column.Val, scope.Val, inlinedAt.Val,
5478 isImplicitCode.Val, atomGroup.Val, atomRank.Val));
5484bool LLParser::parseDIAssignID(
MDNode *&Result,
bool IsDistinct) {
5486 return tokError(
"missing 'distinct', required for !DIAssignID()");
5502bool LLParser::parseGenericDINode(
MDNode *&Result,
bool IsDistinct) {
5503#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5504 REQUIRED(tag, DwarfTagField, ); \
5505 OPTIONAL(header, MDStringField, ); \
5506 OPTIONAL(operands, MDFieldList, );
5508#undef VISIT_MD_FIELDS
5511 (Context, tag.Val, header.Val, operands.Val));
5520bool LLParser::parseDISubrangeType(
MDNode *&Result,
bool IsDistinct) {
5521#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5522 OPTIONAL(name, MDStringField, ); \
5523 OPTIONAL(file, MDField, ); \
5524 OPTIONAL(line, LineField, ); \
5525 OPTIONAL(scope, MDField, ); \
5526 OPTIONAL(baseType, MDField, ); \
5527 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5528 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5529 OPTIONAL(flags, DIFlagField, ); \
5530 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5531 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5532 OPTIONAL(stride, MDSignedOrMDField, ); \
5533 OPTIONAL(bias, MDSignedOrMDField, );
5535#undef VISIT_MD_FIELDS
5537 auto convToMetadata = [&](MDSignedOrMDField Bound) ->
Metadata * {
5538 if (Bound.isMDSignedField())
5541 if (Bound.isMDField())
5542 return Bound.getMDFieldValue();
5546 Metadata *LowerBound = convToMetadata(lowerBound);
5548 Metadata *Stride = convToMetadata(stride);
5549 Metadata *Bias = convToMetadata(bias);
5552 DISubrangeType, (Context,
name.Val,
file.Val, line.Val, scope.Val,
5553 size.getValueAsMetadata(Context), align.Val, flags.Val,
5554 baseType.Val, LowerBound, UpperBound, Stride, Bias));
5563bool LLParser::parseDISubrange(
MDNode *&Result,
bool IsDistinct) {
5564#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5565 OPTIONAL(count, MDSignedOrMDField, (-1, -1, INT64_MAX, false)); \
5566 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5567 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5568 OPTIONAL(stride, MDSignedOrMDField, );
5570#undef VISIT_MD_FIELDS
5577 auto convToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5578 if (Bound.isMDSignedField())
5581 if (Bound.isMDField())
5582 return Bound.getMDFieldValue();
5587 LowerBound = convToMetadata(lowerBound);
5589 Stride = convToMetadata(stride);
5592 (Context,
Count, LowerBound, UpperBound, Stride));
5600bool LLParser::parseDIGenericSubrange(
MDNode *&Result,
bool IsDistinct) {
5601#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5602 OPTIONAL(count, MDSignedOrMDField, ); \
5603 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5604 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5605 OPTIONAL(stride, MDSignedOrMDField, );
5607#undef VISIT_MD_FIELDS
5609 auto ConvToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5610 if (Bound.isMDSignedField())
5612 Context, {dwarf::DW_OP_consts,
5613 static_cast<uint64_t
>(Bound.getMDSignedValue())});
5614 if (Bound.isMDField())
5615 return Bound.getMDFieldValue();
5620 Metadata *LowerBound = ConvToMetadata(lowerBound);
5622 Metadata *Stride = ConvToMetadata(stride);
5625 (Context,
Count, LowerBound, UpperBound, Stride));
5632bool LLParser::parseDIEnumerator(
MDNode *&Result,
bool IsDistinct) {
5633#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5634 REQUIRED(name, MDStringField, ); \
5635 REQUIRED(value, MDAPSIntField, ); \
5636 OPTIONAL(isUnsigned, MDBoolField, (false));
5638#undef VISIT_MD_FIELDS
5640 if (isUnsigned.Val && value.Val.isNegative())
5641 return tokError(
"unsigned enumerator with negative value");
5646 if (!isUnsigned.Val && value.Val.isUnsigned() && value.Val.isSignBitSet())
5658bool LLParser::parseDIBasicType(
MDNode *&Result,
bool IsDistinct) {
5659#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5660 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5661 OPTIONAL(name, MDStringField, ); \
5662 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5663 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5664 OPTIONAL(dataSize, MDUnsignedField, (0, UINT32_MAX)); \
5665 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5666 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5667 OPTIONAL(flags, DIFlagField, );
5669#undef VISIT_MD_FIELDS
5673 (Context, tag.Val,
name.Val,
size.getValueAsMetadata(Context), align.Val,
5674 encoding.Val, num_extra_inhabitants.Val, dataSize.Val, flags.Val));
5683bool LLParser::parseDIFixedPointType(
MDNode *&Result,
bool IsDistinct) {
5684#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5685 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5686 OPTIONAL(name, MDStringField, ); \
5687 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5688 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5689 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5690 OPTIONAL(flags, DIFlagField, ); \
5691 OPTIONAL(kind, FixedPointKindField, ); \
5692 OPTIONAL(factor, MDSignedField, ); \
5693 OPTIONAL(numerator, MDAPSIntField, ); \
5694 OPTIONAL(denominator, MDAPSIntField, );
5696#undef VISIT_MD_FIELDS
5699 (Context, tag.Val,
name.Val,
5700 size.getValueAsMetadata(Context), align.Val,
5701 encoding.Val, flags.Val, kind.Val, factor.Val,
5702 numerator.Val, denominator.Val));
5708bool LLParser::parseDIStringType(
MDNode *&Result,
bool IsDistinct) {
5709#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5710 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_string_type)); \
5711 OPTIONAL(name, MDStringField, ); \
5712 OPTIONAL(stringLength, MDField, ); \
5713 OPTIONAL(stringLengthExpression, MDField, ); \
5714 OPTIONAL(stringLocationExpression, MDField, ); \
5715 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5716 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5717 OPTIONAL(encoding, DwarfAttEncodingField, );
5719#undef VISIT_MD_FIELDS
5723 (Context, tag.Val,
name.Val, stringLength.Val, stringLengthExpression.Val,
5724 stringLocationExpression.Val,
size.getValueAsMetadata(Context),
5725 align.Val, encoding.Val));
5738bool LLParser::parseDIDerivedType(
MDNode *&Result,
bool IsDistinct) {
5739#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5740 REQUIRED(tag, DwarfTagField, ); \
5741 OPTIONAL(name, MDStringField, ); \
5742 OPTIONAL(file, MDField, ); \
5743 OPTIONAL(line, LineField, ); \
5744 OPTIONAL(scope, MDField, ); \
5745 REQUIRED(baseType, MDField, ); \
5746 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5747 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5748 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5749 OPTIONAL(flags, DIFlagField, ); \
5750 OPTIONAL(extraData, MDField, ); \
5751 OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
5752 OPTIONAL(annotations, MDField, ); \
5753 OPTIONAL(ptrAuthKey, MDUnsignedField, (0, 7)); \
5754 OPTIONAL(ptrAuthIsAddressDiscriminated, MDBoolField, ); \
5755 OPTIONAL(ptrAuthExtraDiscriminator, MDUnsignedField, (0, 0xffff)); \
5756 OPTIONAL(ptrAuthIsaPointer, MDBoolField, ); \
5757 OPTIONAL(ptrAuthAuthenticatesNullValues, MDBoolField, );
5759#undef VISIT_MD_FIELDS
5761 std::optional<unsigned> DWARFAddressSpace;
5762 if (dwarfAddressSpace.Val != UINT32_MAX)
5763 DWARFAddressSpace = dwarfAddressSpace.Val;
5764 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
5766 PtrAuthData.emplace(
5767 (
unsigned)ptrAuthKey.Val, ptrAuthIsAddressDiscriminated.Val,
5768 (
unsigned)ptrAuthExtraDiscriminator.Val, ptrAuthIsaPointer.Val,
5769 ptrAuthAuthenticatesNullValues.Val);
5772 DIDerivedType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
5773 baseType.Val,
size.getValueAsMetadata(Context), align.Val,
5774 offset.getValueAsMetadata(Context), DWARFAddressSpace,
5775 PtrAuthData, flags.Val, extraData.Val, annotations.Val));
5779bool LLParser::parseDICompositeType(
MDNode *&Result,
bool IsDistinct) {
5780#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5781 REQUIRED(tag, DwarfTagField, ); \
5782 OPTIONAL(name, MDStringField, ); \
5783 OPTIONAL(file, MDField, ); \
5784 OPTIONAL(line, LineField, ); \
5785 OPTIONAL(scope, MDField, ); \
5786 OPTIONAL(baseType, MDField, ); \
5787 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5788 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5789 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5790 OPTIONAL(flags, DIFlagField, ); \
5791 OPTIONAL(elements, MDField, ); \
5792 OPTIONAL(runtimeLang, DwarfLangField, ); \
5793 OPTIONAL(enumKind, DwarfEnumKindField, ); \
5794 OPTIONAL(vtableHolder, MDField, ); \
5795 OPTIONAL(templateParams, MDField, ); \
5796 OPTIONAL(identifier, MDStringField, ); \
5797 OPTIONAL(discriminator, MDField, ); \
5798 OPTIONAL(dataLocation, MDField, ); \
5799 OPTIONAL(associated, MDField, ); \
5800 OPTIONAL(allocated, MDField, ); \
5801 OPTIONAL(rank, MDSignedOrMDField, ); \
5802 OPTIONAL(annotations, MDField, ); \
5803 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5804 OPTIONAL(specification, MDField, ); \
5805 OPTIONAL(bitStride, MDField, );
5807#undef VISIT_MD_FIELDS
5810 if (rank.isMDSignedField())
5813 else if (rank.isMDField())
5814 Rank = rank.getMDFieldValue();
5816 std::optional<unsigned> EnumKind;
5818 EnumKind = enumKind.Val;
5823 Context, *identifier.Val, tag.Val,
name.Val,
file.Val, line.Val,
5824 scope.Val, baseType.Val,
size.getValueAsMetadata(Context),
5825 align.Val, offset.getValueAsMetadata(Context), specification.Val,
5826 num_extra_inhabitants.Val, flags.Val, elements.Val, runtimeLang.Val,
5827 EnumKind, vtableHolder.Val, templateParams.Val, discriminator.Val,
5828 dataLocation.Val, associated.Val, allocated.Val, Rank,
5829 annotations.Val, bitStride.Val)) {
5838 (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val, baseType.Val,
5839 size.getValueAsMetadata(Context), align.Val,
5840 offset.getValueAsMetadata(Context), flags.Val, elements.Val,
5841 runtimeLang.Val, EnumKind, vtableHolder.Val, templateParams.Val,
5842 identifier.Val, discriminator.Val, dataLocation.Val, associated.Val,
5843 allocated.Val, Rank, annotations.Val, specification.Val,
5844 num_extra_inhabitants.Val, bitStride.Val));
5848bool LLParser::parseDISubroutineType(
MDNode *&Result,
bool IsDistinct) {
5849#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5850 OPTIONAL(flags, DIFlagField, ); \
5851 OPTIONAL(cc, DwarfCCField, ); \
5852 REQUIRED(types, MDField, );
5854#undef VISIT_MD_FIELDS
5857 (Context, flags.Val, cc.Val, types.Val));
5866bool LLParser::parseDIFile(
MDNode *&Result,
bool IsDistinct) {
5870#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5871 REQUIRED(filename, MDStringField, ); \
5872 REQUIRED(directory, MDStringField, ); \
5873 OPTIONAL(checksumkind, ChecksumKindField, (DIFile::CSK_MD5)); \
5874 OPTIONAL(checksum, MDStringField, ); \
5875 OPTIONAL(source, MDStringField, (MDStringField::EmptyIs::Empty));
5877#undef VISIT_MD_FIELDS
5879 std::optional<DIFile::ChecksumInfo<MDString *>> OptChecksum;
5880 if (checksumkind.Seen && checksum.Seen)
5881 OptChecksum.emplace(checksumkind.Val, checksum.Val);
5882 else if (checksumkind.Seen || checksum.Seen)
5883 return tokError(
"'checksumkind' and 'checksum' must be provided together");
5885 MDString *
Source =
nullptr;
5889 DIFile, (Context,
filename.Val, directory.Val, OptChecksum, Source));
5900bool LLParser::parseDICompileUnit(
MDNode *&Result,
bool IsDistinct) {
5902 return tokError(
"missing 'distinct', required for !DICompileUnit");
5904 LocTy Loc = Lex.getLoc();
5906#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5907 REQUIRED(file, MDField, ( false)); \
5908 OPTIONAL(language, DwarfLangField, ); \
5909 OPTIONAL(sourceLanguageName, DwarfSourceLangNameField, ); \
5910 OPTIONAL(sourceLanguageVersion, MDUnsignedField, (0, UINT32_MAX)); \
5911 OPTIONAL(producer, MDStringField, ); \
5912 OPTIONAL(isOptimized, MDBoolField, ); \
5913 OPTIONAL(flags, MDStringField, ); \
5914 OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); \
5915 OPTIONAL(splitDebugFilename, MDStringField, ); \
5916 OPTIONAL(emissionKind, EmissionKindField, ); \
5917 OPTIONAL(enums, MDField, ); \
5918 OPTIONAL(retainedTypes, MDField, ); \
5919 OPTIONAL(globals, MDField, ); \
5920 OPTIONAL(imports, MDField, ); \
5921 OPTIONAL(macros, MDField, ); \
5922 OPTIONAL(dwoId, MDUnsignedField, ); \
5923 OPTIONAL(splitDebugInlining, MDBoolField, = true); \
5924 OPTIONAL(debugInfoForProfiling, MDBoolField, = false); \
5925 OPTIONAL(nameTableKind, NameTableKindField, ); \
5926 OPTIONAL(rangesBaseAddress, MDBoolField, = false); \
5927 OPTIONAL(sysroot, MDStringField, ); \
5928 OPTIONAL(sdk, MDStringField, );
5930#undef VISIT_MD_FIELDS
5932 if (!language.Seen && !sourceLanguageName.Seen)
5933 return error(Loc,
"missing one of 'language' or 'sourceLanguageName', "
5934 "required for !DICompileUnit");
5936 if (language.Seen && sourceLanguageName.Seen)
5937 return error(Loc,
"can only specify one of 'language' and "
5938 "'sourceLanguageName' on !DICompileUnit");
5940 if (sourceLanguageVersion.Seen && !sourceLanguageName.Seen)
5941 return error(Loc,
"'sourceLanguageVersion' requires an associated "
5942 "'sourceLanguageName' on !DICompileUnit");
5946 language.Seen ? DISourceLanguageName(language.Val)
5947 : DISourceLanguageName(sourceLanguageName.Val,
5948 sourceLanguageVersion.Val),
5949 file.Val, producer.Val, isOptimized.Val, flags.Val, runtimeVersion.Val,
5950 splitDebugFilename.Val, emissionKind.Val, enums.Val, retainedTypes.Val,
5951 globals.Val, imports.Val, macros.Val, dwoId.Val, splitDebugInlining.Val,
5952 debugInfoForProfiling.Val, nameTableKind.Val, rangesBaseAddress.Val,
5953 sysroot.Val, sdk.Val);
5966bool LLParser::parseDISubprogram(
MDNode *&Result,
bool IsDistinct) {
5967 auto Loc = Lex.getLoc();
5968#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5969 OPTIONAL(scope, MDField, ); \
5970 OPTIONAL(name, MDStringField, ); \
5971 OPTIONAL(linkageName, MDStringField, ); \
5972 OPTIONAL(file, MDField, ); \
5973 OPTIONAL(line, LineField, ); \
5974 OPTIONAL(type, MDField, ); \
5975 OPTIONAL(isLocal, MDBoolField, ); \
5976 OPTIONAL(isDefinition, MDBoolField, (true)); \
5977 OPTIONAL(scopeLine, LineField, ); \
5978 OPTIONAL(containingType, MDField, ); \
5979 OPTIONAL(virtuality, DwarfVirtualityField, ); \
5980 OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); \
5981 OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); \
5982 OPTIONAL(flags, DIFlagField, ); \
5983 OPTIONAL(spFlags, DISPFlagField, ); \
5984 OPTIONAL(isOptimized, MDBoolField, ); \
5985 OPTIONAL(unit, MDField, ); \
5986 OPTIONAL(templateParams, MDField, ); \
5987 OPTIONAL(declaration, MDField, ); \
5988 OPTIONAL(retainedNodes, MDField, ); \
5989 OPTIONAL(thrownTypes, MDField, ); \
5990 OPTIONAL(annotations, MDField, ); \
5991 OPTIONAL(targetFuncName, MDStringField, ); \
5992 OPTIONAL(keyInstructions, MDBoolField, );
5994#undef VISIT_MD_FIELDS
5999 spFlags.Seen ? spFlags.Val
6001 isOptimized.Val, virtuality.Val);
6002 if ((SPFlags & DISubprogram::SPFlagDefinition) && !IsDistinct)
6005 "missing 'distinct', required for !DISubprogram that is a Definition");
6008 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val, line.Val,
6009 type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
6010 thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
6011 declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
6012 targetFuncName.Val, keyInstructions.Val));
6018bool LLParser::parseDILexicalBlock(
MDNode *&Result,
bool IsDistinct) {
6019#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6020 REQUIRED(scope, MDField, ( false)); \
6021 OPTIONAL(file, MDField, ); \
6022 OPTIONAL(line, LineField, ); \
6023 OPTIONAL(column, ColumnField, );
6025#undef VISIT_MD_FIELDS
6028 DILexicalBlock, (Context, scope.Val,
file.Val, line.Val, column.Val));
6034bool LLParser::parseDILexicalBlockFile(
MDNode *&Result,
bool IsDistinct) {
6035#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6036 REQUIRED(scope, MDField, ( false)); \
6037 OPTIONAL(file, MDField, ); \
6038 REQUIRED(discriminator, MDUnsignedField, (0, UINT32_MAX));
6040#undef VISIT_MD_FIELDS
6043 (Context, scope.Val,
file.Val, discriminator.Val));
6049bool LLParser::parseDICommonBlock(
MDNode *&Result,
bool IsDistinct) {
6050#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6051 REQUIRED(scope, MDField, ); \
6052 OPTIONAL(declaration, MDField, ); \
6053 OPTIONAL(name, MDStringField, ); \
6054 OPTIONAL(file, MDField, ); \
6055 OPTIONAL(line, LineField, );
6057#undef VISIT_MD_FIELDS
6060 (Context, scope.Val, declaration.Val,
name.Val,
6061 file.Val, line.Val));
6067bool LLParser::parseDINamespace(
MDNode *&Result,
bool IsDistinct) {
6068#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6069 REQUIRED(scope, MDField, ); \
6070 OPTIONAL(name, MDStringField, ); \
6071 OPTIONAL(exportSymbols, MDBoolField, );
6073#undef VISIT_MD_FIELDS
6076 (Context, scope.Val,
name.Val, exportSymbols.Val));
6083bool LLParser::parseDIMacro(
MDNode *&Result,
bool IsDistinct) {
6084#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6085 REQUIRED(type, DwarfMacinfoTypeField, ); \
6086 OPTIONAL(line, LineField, ); \
6087 REQUIRED(name, MDStringField, ); \
6088 OPTIONAL(value, MDStringField, );
6090#undef VISIT_MD_FIELDS
6093 (Context, type.Val, line.Val,
name.Val, value.Val));
6099bool LLParser::parseDIMacroFile(
MDNode *&Result,
bool IsDistinct) {
6100#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6101 OPTIONAL(type, DwarfMacinfoTypeField, (dwarf::DW_MACINFO_start_file)); \
6102 OPTIONAL(line, LineField, ); \
6103 REQUIRED(file, MDField, ); \
6104 OPTIONAL(nodes, MDField, );
6106#undef VISIT_MD_FIELDS
6109 (Context, type.Val, line.Val,
file.Val,
nodes.Val));
6117bool LLParser::parseDIModule(
MDNode *&Result,
bool IsDistinct) {
6118#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6119 REQUIRED(scope, MDField, ); \
6120 REQUIRED(name, MDStringField, ); \
6121 OPTIONAL(configMacros, MDStringField, ); \
6122 OPTIONAL(includePath, MDStringField, ); \
6123 OPTIONAL(apinotes, MDStringField, ); \
6124 OPTIONAL(file, MDField, ); \
6125 OPTIONAL(line, LineField, ); \
6126 OPTIONAL(isDecl, MDBoolField, );
6128#undef VISIT_MD_FIELDS
6131 configMacros.Val, includePath.Val,
6132 apinotes.Val, line.Val, isDecl.Val));
6138bool LLParser::parseDITemplateTypeParameter(
MDNode *&Result,
bool IsDistinct) {
6139#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6140 OPTIONAL(name, MDStringField, ); \
6141 REQUIRED(type, MDField, ); \
6142 OPTIONAL(defaulted, MDBoolField, );
6144#undef VISIT_MD_FIELDS
6147 (Context,
name.Val, type.Val, defaulted.Val));
6155bool LLParser::parseDITemplateValueParameter(
MDNode *&Result,
bool IsDistinct) {
6156#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6157 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_template_value_parameter)); \
6158 OPTIONAL(name, MDStringField, ); \
6159 OPTIONAL(type, MDField, ); \
6160 OPTIONAL(defaulted, MDBoolField, ); \
6161 REQUIRED(value, MDField, );
6164#undef VISIT_MD_FIELDS
6167 DITemplateValueParameter,
6168 (Context, tag.Val,
name.Val, type.Val, defaulted.Val, value.Val));
6177bool LLParser::parseDIGlobalVariable(
MDNode *&Result,
bool IsDistinct) {
6178#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6179 OPTIONAL(name, MDStringField, (MDStringField::EmptyIs::Error)); \
6180 OPTIONAL(scope, MDField, ); \
6181 OPTIONAL(linkageName, MDStringField, ); \
6182 OPTIONAL(file, MDField, ); \
6183 OPTIONAL(line, LineField, ); \
6184 OPTIONAL(type, MDField, ); \
6185 OPTIONAL(isLocal, MDBoolField, ); \
6186 OPTIONAL(isDefinition, MDBoolField, (true)); \
6187 OPTIONAL(templateParams, MDField, ); \
6188 OPTIONAL(declaration, MDField, ); \
6189 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6190 OPTIONAL(annotations, MDField, );
6192#undef VISIT_MD_FIELDS
6196 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val,
6197 line.Val, type.Val, isLocal.Val, isDefinition.Val,
6198 declaration.Val, templateParams.Val, align.Val,
6210bool LLParser::parseDILocalVariable(
MDNode *&Result,
bool IsDistinct) {
6211#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6212 REQUIRED(scope, MDField, ( false)); \
6213 OPTIONAL(name, MDStringField, ); \
6214 OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); \
6215 OPTIONAL(file, MDField, ); \
6216 OPTIONAL(line, LineField, ); \
6217 OPTIONAL(type, MDField, ); \
6218 OPTIONAL(flags, DIFlagField, ); \
6219 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6220 OPTIONAL(annotations, MDField, );
6222#undef VISIT_MD_FIELDS
6225 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6226 type.Val, arg.Val, flags.Val, align.Val,
6233bool LLParser::parseDILabel(
MDNode *&Result,
bool IsDistinct) {
6234#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6235 REQUIRED(scope, MDField, ( false)); \
6236 REQUIRED(name, MDStringField, ); \
6237 REQUIRED(file, MDField, ); \
6238 REQUIRED(line, LineField, ); \
6239 OPTIONAL(column, ColumnField, ); \
6240 OPTIONAL(isArtificial, MDBoolField, ); \
6241 OPTIONAL(coroSuspendIdx, MDUnsignedField, );
6243#undef VISIT_MD_FIELDS
6245 std::optional<unsigned> CoroSuspendIdx =
6246 coroSuspendIdx.Seen ? std::optional<unsigned>(coroSuspendIdx.Val)
6250 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6251 column.Val, isArtificial.Val, CoroSuspendIdx));
6257bool LLParser::parseDIExpressionBody(
MDNode *&Result,
bool IsDistinct) {
6270 return tokError(Twine(
"invalid DWARF op '") + Lex.getStrVal() +
"'");
6279 return tokError(Twine(
"invalid DWARF attribute encoding '") +
6280 Lex.getStrVal() +
"'");
6283 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
6284 return tokError(
"expected unsigned integer");
6286 auto &
U = Lex.getAPSIntVal();
6288 return tokError(
"element too large, limit is " + Twine(
UINT64_MAX));
6302bool LLParser::parseDIExpression(
MDNode *&Result,
bool IsDistinct) {
6304 assert(Lex.getStrVal() ==
"DIExpression" &&
"Expected '!DIExpression'");
6307 return parseDIExpressionBody(Result, IsDistinct);
6312bool LLParser::parseDIArgList(
Metadata *&MD, PerFunctionState *PFS) {
6313 assert(PFS &&
"Expected valid function state");
6324 if (parseValueAsMetadata(MD,
"expected value-as-metadata operand", PFS))
6338bool LLParser::parseDIGlobalVariableExpression(
MDNode *&Result,
6340#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6341 REQUIRED(var, MDField, ); \
6342 REQUIRED(expr, MDField, );
6344#undef VISIT_MD_FIELDS
6347 GET_OR_DISTINCT(DIGlobalVariableExpression, (Context, var.Val, expr.Val));
6354bool LLParser::parseDIObjCProperty(
MDNode *&Result,
bool IsDistinct) {
6355#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6356 OPTIONAL(name, MDStringField, ); \
6357 OPTIONAL(file, MDField, ); \
6358 OPTIONAL(line, LineField, ); \
6359 OPTIONAL(setter, MDStringField, ); \
6360 OPTIONAL(getter, MDStringField, ); \
6361 OPTIONAL(attributes, MDUnsignedField, (0, UINT32_MAX)); \
6362 OPTIONAL(type, MDField, );
6364#undef VISIT_MD_FIELDS
6367 (Context,
name.Val,
file.Val, line.Val, getter.Val,
6368 setter.Val, attributes.Val, type.Val));
6375bool LLParser::parseDIImportedEntity(
MDNode *&Result,
bool IsDistinct) {
6376#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6377 REQUIRED(tag, DwarfTagField, ); \
6378 REQUIRED(scope, MDField, ); \
6379 OPTIONAL(entity, MDField, ); \
6380 OPTIONAL(file, MDField, ); \
6381 OPTIONAL(line, LineField, ); \
6382 OPTIONAL(name, MDStringField, ); \
6383 OPTIONAL(elements, MDField, );
6385#undef VISIT_MD_FIELDS
6388 (Context, tag.Val, scope.Val, entity.Val,
file.Val,
6389 line.Val,
name.Val, elements.Val));
6393#undef PARSE_MD_FIELD
6405bool LLParser::parseMetadataAsValue(
Value *&V, PerFunctionState &PFS) {
6408 if (parseMetadata(MD, &PFS))
6419bool LLParser::parseValueAsMetadata(
Metadata *&MD,
const Twine &TypeMsg,
6420 PerFunctionState *PFS) {
6423 if (parseType(Ty, TypeMsg, Loc))
6426 return error(Loc,
"invalid metadata-value-metadata roundtrip");
6429 if (parseValue(Ty, V, PFS))
6444bool LLParser::parseMetadata(
Metadata *&MD, PerFunctionState *PFS) {
6448 if (Lex.getStrVal() ==
"DIArgList") {
6450 if (parseDIArgList(AL, PFS))
6456 if (parseSpecializedMDNode(
N)) {
6466 return parseValueAsMetadata(MD,
"expected metadata operand", PFS);
6476 if (parseMDString(S))
6486 if (parseMDNodeTail(
N))
6497 PerFunctionState *PFS) {
6499 return error(
ID.Loc,
"functions are not values, refer to them as pointers");
6504 return error(
ID.Loc,
"invalid use of function-local name");
6505 V = PFS->getVal(
ID.UIntVal, Ty,
ID.Loc);
6506 return V ==
nullptr;
6509 return error(
ID.Loc,
"invalid use of function-local name");
6510 V = PFS->getVal(
ID.StrVal, Ty,
ID.Loc);
6511 return V ==
nullptr;
6514 return error(
ID.Loc,
"invalid type for inline asm constraint string");
6518 ID.FTy,
ID.StrVal,
ID.StrVal2,
ID.UIntVal & 1, (
ID.UIntVal >> 1) & 1,
6523 V = getGlobalVal(
ID.StrVal, Ty,
ID.Loc);
6526 return V ==
nullptr;
6528 V = getGlobalVal(
ID.UIntVal, Ty,
ID.Loc);
6531 return V ==
nullptr;
6534 return error(
ID.Loc,
"integer constant must have integer type");
6536 V = ConstantInt::get(Context,
ID.APSIntVal);
6541 return error(
ID.Loc,
"floating point constant invalid for type");
6547 bool IsSNAN =
ID.APFloatVal.isSignaling();
6562 APInt Payload =
ID.APFloatVal.bitcastToAPInt();
6564 ID.APFloatVal.isNegative(), &Payload);
6567 V = ConstantFP::get(Context,
ID.APFloatVal);
6569 if (
V->getType() != Ty)
6570 return error(
ID.Loc,
"floating point constant does not have type '" +
6576 return error(
ID.Loc,
"null must be a pointer type");
6582 return error(
ID.Loc,
"invalid type for undef constant");
6587 return error(
ID.Loc,
"invalid empty array initializer");
6593 return error(
ID.Loc,
"invalid type for null constant");
6596 return error(
ID.Loc,
"invalid type for null constant");
6601 return error(
ID.Loc,
"invalid type for none constant");
6607 return error(
ID.Loc,
"invalid type for poison constant");
6611 if (
ID.ConstantVal->getType() != Ty)
6612 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6619 return error(
ID.Loc,
"vector constant must have vector type");
6621 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6623 "' but expected '" +
6631 if (
ST->getNumElements() !=
ID.UIntVal)
6633 "initializer with struct type has wrong # elements");
6635 return error(
ID.Loc,
"packed'ness of initializer and type don't match");
6638 for (
unsigned i = 0, e =
ID.UIntVal; i != e; ++i)
6639 if (
ID.ConstantStructElts[i]->getType() !=
ST->getElementType(i))
6642 "element " + Twine(i) +
6643 " of struct initializer doesn't match struct element type");
6646 ST,
ArrayRef(
ID.ConstantStructElts.get(),
ID.UIntVal));
6648 return error(
ID.Loc,
"constant expression type mismatch");
6657 auto Loc = Lex.getLoc();
6658 if (parseValID(
ID,
nullptr))
6671 if (convertValIDToValue(Ty,
ID, V,
nullptr))
6681 return error(Loc,
"expected a constant value");
6685bool LLParser::parseValue(
Type *Ty,
Value *&V, PerFunctionState *PFS) {
6688 return parseValID(
ID, PFS, Ty) ||
6689 convertValIDToValue(Ty,
ID, V, PFS);
6692bool LLParser::parseTypeAndValue(
Value *&V, PerFunctionState *PFS) {
6694 return parseType(Ty) || parseValue(Ty, V, PFS);
6697bool LLParser::parseTypeAndBasicBlock(
BasicBlock *&BB, LocTy &
Loc,
6698 PerFunctionState &PFS) {
6701 if (parseTypeAndValue(V, PFS))
6704 return error(Loc,
"expected a basic block");
6713 if (!Name.starts_with(
"llvm.dbg."))
6716 return FnID == Intrinsic::dbg_declare || FnID == Intrinsic::dbg_value ||
6717 FnID == Intrinsic::dbg_assign;
6725bool LLParser::parseFunctionHeader(
Function *&Fn,
bool IsDefine,
6726 unsigned &FunctionNumber,
6729 LocTy LinkageLoc = Lex.getLoc();
6731 unsigned Visibility;
6732 unsigned DLLStorageClass;
6734 AttrBuilder RetAttrs(M->getContext());
6737 Type *RetType =
nullptr;
6738 LocTy RetTypeLoc = Lex.getLoc();
6739 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
6741 parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
6742 parseType(RetType, RetTypeLoc,
true ))
6751 return error(LinkageLoc,
"invalid linkage for function definition");
6761 return error(LinkageLoc,
"invalid linkage for function declaration");
6765 return error(LinkageLoc,
"invalid function linkage type");
6769 return error(LinkageLoc,
6770 "symbol with local linkage must have default visibility");
6773 return error(LinkageLoc,
6774 "symbol with local linkage cannot have a DLL storage class");
6777 return error(RetTypeLoc,
"invalid function return type");
6779 LocTy NameLoc = Lex.getLoc();
6781 std::string FunctionName;
6783 FunctionName = Lex.getStrVal();
6785 FunctionNumber = Lex.getUIntVal();
6786 if (checkValueID(NameLoc,
"function",
"@", NumberedVals.getNext(),
6790 return tokError(
"expected function name");
6796 return tokError(
"expected '(' in function argument list");
6800 AttrBuilder FuncAttrs(M->getContext());
6801 std::vector<unsigned> FwdRefAttrGrps;
6804 std::string Partition;
6805 MaybeAlign Alignment;
6808 unsigned AddrSpace = 0;
6814 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg) ||
6815 parseOptionalUnnamedAddr(UnnamedAddr) ||
6816 parseOptionalProgramAddrSpace(AddrSpace) ||
6817 parseFnAttributeValuePairs(FuncAttrs, FwdRefAttrGrps,
false,
6821 parseOptionalComdat(FunctionName,
C) ||
6822 parseOptionalAlignment(Alignment) ||
6823 (EatIfPresent(
lltok::kw_gc) && parseStringConstant(GC)) ||
6827 parseGlobalTypeAndValue(PersonalityFn)))
6830 if (FuncAttrs.contains(Attribute::Builtin))
6831 return error(BuiltinLoc,
"'builtin' attribute not valid on function");
6834 if (MaybeAlign
A = FuncAttrs.getAlignment()) {
6836 FuncAttrs.removeAttribute(Attribute::Alignment);
6841 std::vector<Type*> ParamTypeList;
6844 for (
const ArgInfo &Arg : ArgList) {
6845 ParamTypeList.push_back(Arg.Ty);
6846 Attrs.push_back(Arg.Attrs);
6853 if (PAL.hasParamAttr(0, Attribute::StructRet) && !RetType->
isVoidTy())
6854 return error(RetTypeLoc,
"functions with 'sret' argument must return void");
6860 GlobalValue *FwdFn =
nullptr;
6861 if (!FunctionName.empty()) {
6864 auto FRVI = ForwardRefVals.find(FunctionName);
6865 if (FRVI != ForwardRefVals.end()) {
6866 FwdFn = FRVI->second.first;
6868 return error(FRVI->second.second,
6869 "invalid forward reference to "
6872 "' with wrong type: "
6876 ForwardRefVals.erase(FRVI);
6877 }
else if ((Fn = M->getFunction(FunctionName))) {
6879 return error(NameLoc,
6880 "invalid redefinition of function '" + FunctionName +
"'");
6881 }
else if (M->getNamedValue(FunctionName)) {
6882 return error(NameLoc,
"redefinition of function '@" + FunctionName +
"'");
6888 if (FunctionNumber == (
unsigned)-1)
6889 FunctionNumber = NumberedVals.getNext();
6893 auto I = ForwardRefValIDs.find(FunctionNumber);
6894 if (
I != ForwardRefValIDs.end()) {
6895 FwdFn =
I->second.first;
6897 return error(NameLoc,
"type of definition and forward reference of '@" +
6898 Twine(FunctionNumber) +
6903 ForwardRefValIDs.erase(
I);
6912 if (FunctionName.empty())
6913 NumberedVals.add(FunctionNumber, Fn);
6928 if (!
GC.empty()) Fn->
setGC(GC);
6931 ForwardRefAttrGroups[Fn] = FwdRefAttrGrps;
6935 for (
unsigned i = 0, e = ArgList.size(); i != e; ++i, ++ArgIt) {
6937 if (ArgList[i].
Name.empty())
continue;
6940 ArgIt->
setName(ArgList[i].Name);
6942 if (ArgIt->
getName() != ArgList[i].Name)
6943 return error(ArgList[i].Loc,
6944 "redefinition of argument '%" + ArgList[i].Name +
"'");
6957 if (FunctionName.empty()) {
6959 ID.UIntVal = FunctionNumber;
6962 ID.StrVal = FunctionName;
6964 auto Blocks = ForwardRefBlockAddresses.find(
ID);
6965 if (Blocks != ForwardRefBlockAddresses.end())
6966 return error(Blocks->first.Loc,
6967 "cannot take blockaddress inside a declaration");
6971bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
6973 if (FunctionNumber == -1) {
6975 ID.StrVal = std::string(F.getName());
6978 ID.UIntVal = FunctionNumber;
6981 auto Blocks = P.ForwardRefBlockAddresses.find(
ID);
6982 if (Blocks == P.ForwardRefBlockAddresses.end())
6985 for (
const auto &
I : Blocks->second) {
6986 const ValID &BBID =
I.first;
6987 GlobalValue *GV =
I.second;
6990 "Expected local id or name");
6997 return P.error(BBID.
Loc,
"referenced value is not a basic block");
7000 ResolvedVal = P.checkValidVariableType(BBID.
Loc, BBID.
StrVal, GV->
getType(),
7008 P.ForwardRefBlockAddresses.erase(Blocks);
7014bool LLParser::parseFunctionBody(Function &Fn,
unsigned FunctionNumber,
7015 ArrayRef<unsigned> UnnamedArgNums) {
7017 return tokError(
"expected '{' in function body");
7020 PerFunctionState PFS(*
this, Fn, FunctionNumber, UnnamedArgNums);
7024 if (PFS.resolveForwardRefBlockAddresses())
7030 return tokError(
"function body requires at least one basic block");
7034 if (parseBasicBlock(PFS))
7038 if (parseUseListOrder(&PFS))
7045 return PFS.finishFunction();
7050bool LLParser::parseBasicBlock(PerFunctionState &PFS) {
7051 FileLoc BBStart(Lex.getTokLineColumnPos());
7056 LocTy NameLoc = Lex.getLoc();
7058 Name = Lex.getStrVal();
7061 NameID = Lex.getUIntVal();
7065 BasicBlock *BB = PFS.defineBB(Name, NameID, NameLoc);
7069 std::string NameStr;
7074 auto DeleteDbgRecord = [](DbgRecord *DR) { DR->deleteRecord(); };
7075 using DbgRecordPtr = std::unique_ptr<DbgRecord,
decltype(DeleteDbgRecord)>;
7082 if (SeenOldDbgInfoFormat)
7083 return error(Lex.getLoc(),
"debug record should not appear in a module "
7084 "containing debug info intrinsics");
7085 SeenNewDbgInfoFormat =
true;
7089 if (parseDebugRecord(DR, PFS))
7091 TrailingDbgRecord.emplace_back(DR, DeleteDbgRecord);
7094 FileLoc InstStart(Lex.getTokLineColumnPos());
7097 LocTy NameLoc = Lex.getLoc();
7102 NameID = Lex.getUIntVal();
7104 if (parseToken(
lltok::equal,
"expected '=' after instruction id"))
7107 NameStr = Lex.getStrVal();
7109 if (parseToken(
lltok::equal,
"expected '=' after instruction name"))
7113 switch (parseInstruction(Inst, BB, PFS)) {
7116 case InstError:
return true;
7123 if (parseInstructionMetadata(*Inst))
7126 case InstExtraComma:
7131 if (parseInstructionMetadata(*Inst))
7137 if (PFS.setInstName(NameID, NameStr, NameLoc, Inst))
7141 for (DbgRecordPtr &DR : TrailingDbgRecord)
7143 TrailingDbgRecord.clear();
7144 if (ParserContext) {
7145 ParserContext->addInstructionLocation(
7146 Inst, FileLocRange(InstStart, Lex.getPrevTokEndLineColumnPos()));
7151 ParserContext->addBlockLocation(
7152 BB, FileLocRange(BBStart, Lex.getPrevTokEndLineColumnPos()));
7154 assert(TrailingDbgRecord.empty() &&
7155 "All debug values should have been attached to an instruction.");
7164bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
7167 LocTy DVRLoc = Lex.getLoc();
7169 return error(DVRLoc,
"expected debug record type here");
7170 RecordKind
RecordType = StringSwitch<RecordKind>(Lex.getStrVal())
7171 .Case(
"declare", RecordKind::ValueKind)
7172 .Case(
"value", RecordKind::ValueKind)
7173 .Case(
"assign", RecordKind::ValueKind)
7174 .Case(
"label", RecordKind::LabelKind)
7175 .Case(
"declare_value", RecordKind::ValueKind);
7184 if (parseMDNode(Label))
7189 if (parseMDNode(DbgLoc))
7197 LocType
ValueType = StringSwitch<LocType>(Lex.getStrVal())
7198 .Case(
"declare", LocType::Declare)
7199 .Case(
"value", LocType::Value)
7200 .Case(
"assign", LocType::Assign)
7201 .Case(
"declare_value", LocType::DeclareValue);
7209 if (parseMetadata(ValLocMD, &PFS))
7216 if (parseMDNode(Variable))
7223 if (parseMDNode(Expression))
7229 MDNode *AssignID =
nullptr;
7230 Metadata *AddressLocation =
nullptr;
7231 MDNode *AddressExpression =
nullptr;
7234 if (parseMDNode(AssignID))
7240 if (parseMetadata(AddressLocation, &PFS))
7246 if (parseMDNode(AddressExpression))
7260 ValueType, ValLocMD, Variable, Expression, AssignID, AddressLocation,
7270int LLParser::parseInstruction(Instruction *&Inst, BasicBlock *BB,
7271 PerFunctionState &PFS) {
7274 return tokError(
"found end of file when expecting more instructions");
7275 LocTy Loc = Lex.getLoc();
7276 unsigned KeywordVal = Lex.getUIntVal();
7281 return error(Loc,
"expected instruction opcode");
7285 return parseRet(Inst, BB, PFS);
7287 return parseBr(Inst, PFS);
7289 return parseSwitch(Inst, PFS);
7291 return parseIndirectBr(Inst, PFS);
7293 return parseInvoke(Inst, PFS);
7295 return parseResume(Inst, PFS);
7297 return parseCleanupRet(Inst, PFS);
7299 return parseCatchRet(Inst, PFS);
7301 return parseCatchSwitch(Inst, PFS);
7303 return parseCatchPad(Inst, PFS);
7305 return parseCleanupPad(Inst, PFS);
7307 return parseCallBr(Inst, PFS);
7310 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7311 int Res = parseUnaryOp(Inst, PFS, KeywordVal,
true);
7327 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7339 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7340 int Res = parseArithmetic(Inst, PFS, KeywordVal,
true);
7354 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7362 return parseArithmetic(Inst, PFS, KeywordVal,
7366 if (parseLogical(Inst, PFS, KeywordVal))
7374 return parseLogical(Inst, PFS, KeywordVal);
7377 if (parseCompare(Inst, PFS, KeywordVal))
7384 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7385 int Res = parseCompare(Inst, PFS, KeywordVal);
7397 bool Res = parseCast(Inst, PFS, KeywordVal);
7409 if (parseCast(Inst, PFS, KeywordVal))
7426 return parseCast(Inst, PFS, KeywordVal);
7429 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7430 if (parseCast(Inst, PFS, KeywordVal))
7439 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7440 int Res = parseSelect(Inst, PFS);
7445 return error(Loc,
"fast-math-flags specified for select without "
7446 "floating-point scalar or vector return type");
7452 return parseVAArg(Inst, PFS);
7454 return parseExtractElement(Inst, PFS);
7456 return parseInsertElement(Inst, PFS);
7458 return parseShuffleVector(Inst, PFS);
7460 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7461 int Res = parsePHI(Inst, PFS);
7466 return error(Loc,
"fast-math-flags specified for phi without "
7467 "floating-point scalar or vector return type");
7473 return parseLandingPad(Inst, PFS);
7475 return parseFreeze(Inst, PFS);
7487 return parseAlloc(Inst, PFS);
7489 return parseLoad(Inst, PFS);
7491 return parseStore(Inst, PFS);
7493 return parseCmpXchg(Inst, PFS);
7495 return parseAtomicRMW(Inst, PFS);
7497 return parseFence(Inst, PFS);
7499 return parseGetElementPtr(Inst, PFS);
7501 return parseExtractValue(Inst, PFS);
7503 return parseInsertValue(Inst, PFS);
7508bool LLParser::parseCmpPredicate(
unsigned &
P,
unsigned Opc) {
7509 if (
Opc == Instruction::FCmp) {
7510 switch (Lex.getKind()) {
7512 return tokError(
"expected fcmp predicate (e.g. 'oeq')");
7531 switch (Lex.getKind()) {
7533 return tokError(
"expected icmp predicate (e.g. 'eq')");
7557bool LLParser::parseRet(Instruction *&Inst, BasicBlock *BB,
7558 PerFunctionState &PFS) {
7559 SMLoc TypeLoc = Lex.getLoc();
7561 if (parseType(Ty,
true ))
7564 Type *ResType = PFS.getFunction().getReturnType();
7568 return error(TypeLoc,
"value doesn't match function result type '" +
7576 if (parseValue(Ty, RV, PFS))
7580 return error(TypeLoc,
"value doesn't match function result type '" +
7590bool LLParser::parseBr(Instruction *&Inst, PerFunctionState &PFS) {
7594 if (parseTypeAndValue(Op0, Loc, PFS))
7603 return error(Loc,
"branch condition must have 'i1' type");
7605 if (parseToken(
lltok::comma,
"expected ',' after branch condition") ||
7606 parseTypeAndBasicBlock(Op1, Loc, PFS) ||
7607 parseToken(
lltok::comma,
"expected ',' after true destination") ||
7608 parseTypeAndBasicBlock(Op2, Loc2, PFS))
7620bool LLParser::parseSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7621 LocTy CondLoc, BBLoc;
7624 if (parseTypeAndValue(
Cond, CondLoc, PFS) ||
7625 parseToken(
lltok::comma,
"expected ',' after switch condition") ||
7626 parseTypeAndBasicBlock(DefaultBB, BBLoc, PFS) ||
7630 if (!
Cond->getType()->isIntegerTy())
7631 return error(CondLoc,
"switch condition must have integer type");
7634 SmallPtrSet<Value*, 32> SeenCases;
7640 if (parseTypeAndValue(Constant, CondLoc, PFS) ||
7641 parseToken(
lltok::comma,
"expected ',' after case value") ||
7642 parseTypeAndBasicBlock(DestBB, PFS))
7645 if (!SeenCases.
insert(Constant).second)
7646 return error(CondLoc,
"duplicate case value in switch");
7648 return error(CondLoc,
"case value is not a constant integer");
7656 for (
const auto &[OnVal, Dest] : Table)
7657 SI->addCase(OnVal, Dest);
7665bool LLParser::parseIndirectBr(Instruction *&Inst, PerFunctionState &PFS) {
7668 if (parseTypeAndValue(
Address, AddrLoc, PFS) ||
7669 parseToken(
lltok::comma,
"expected ',' after indirectbr address") ||
7673 if (!
Address->getType()->isPointerTy())
7674 return error(AddrLoc,
"indirectbr address must have pointer type");
7677 SmallVector<BasicBlock*, 16> DestList;
7681 if (parseTypeAndBasicBlock(DestBB, PFS))
7686 if (parseTypeAndBasicBlock(DestBB, PFS))
7692 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
7696 for (BasicBlock *Dest : DestList)
7706 FunctionType *&FuncTy) {
7712 for (
const ParamInfo &Arg : ArgList)
7726bool LLParser::parseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
7727 LocTy CallLoc = Lex.getLoc();
7728 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
7729 std::vector<unsigned> FwdRefAttrGrps;
7732 unsigned InvokeAddrSpace;
7733 Type *RetType =
nullptr;
7740 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7741 parseOptionalProgramAddrSpace(InvokeAddrSpace) ||
7742 parseType(RetType, RetTypeLoc,
true ) ||
7743 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
7744 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
7746 parseOptionalOperandBundles(BundleList, PFS) ||
7748 parseTypeAndBasicBlock(NormalBB, PFS) ||
7750 parseTypeAndBasicBlock(UnwindBB, PFS))
7757 if (resolveFunctionType(RetType, ArgList, Ty))
7758 return error(RetTypeLoc,
"Invalid result type for LLVM function");
7764 if (convertValIDToValue(
PointerType::get(Context, InvokeAddrSpace), CalleeID,
7769 SmallVector<Value *, 8>
Args;
7776 for (
const ParamInfo &Arg : ArgList) {
7777 Type *ExpectedTy =
nullptr;
7780 }
else if (!Ty->isVarArg()) {
7781 return error(Arg.Loc,
"too many arguments specified");
7784 if (ExpectedTy && ExpectedTy != Arg.V->getType())
7785 return error(Arg.Loc,
"argument is not of expected type '" +
7787 Args.push_back(Arg.V);
7792 return error(CallLoc,
"not enough parameters specified for call");
7801 II->setCallingConv(CC);
7802 II->setAttributes(PAL);
7803 ForwardRefAttrGroups[
II] = FwdRefAttrGrps;
7810bool LLParser::parseResume(Instruction *&Inst, PerFunctionState &PFS) {
7812 if (parseTypeAndValue(Exn, ExnLoc, PFS))
7820bool LLParser::parseExceptionArgs(SmallVectorImpl<Value *> &Args,
7821 PerFunctionState &PFS) {
7822 if (parseToken(
lltok::lsquare,
"expected '[' in catchpad/cleanuppad"))
7827 if (!
Args.empty() &&
7828 parseToken(
lltok::comma,
"expected ',' in argument list"))
7833 Type *ArgTy =
nullptr;
7834 if (parseType(ArgTy, ArgLoc))
7839 if (parseMetadataAsValue(V, PFS))
7842 if (parseValue(ArgTy, V, PFS))
7854bool LLParser::parseCleanupRet(Instruction *&Inst, PerFunctionState &PFS) {
7855 Value *CleanupPad =
nullptr;
7857 if (parseToken(
lltok::kw_from,
"expected 'from' after cleanupret"))
7872 if (parseTypeAndBasicBlock(UnwindBB, PFS)) {
7883bool LLParser::parseCatchRet(Instruction *&Inst, PerFunctionState &PFS) {
7884 Value *CatchPad =
nullptr;
7886 if (parseToken(
lltok::kw_from,
"expected 'from' after catchret"))
7893 if (parseToken(
lltok::kw_to,
"expected 'to' in catchret") ||
7894 parseTypeAndBasicBlock(BB, PFS))
7903bool LLParser::parseCatchSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7911 return tokError(
"expected scope value for catchswitch");
7916 if (parseToken(
lltok::lsquare,
"expected '[' with catchswitch labels"))
7922 if (parseTypeAndBasicBlock(DestBB, PFS))
7927 if (parseToken(
lltok::rsquare,
"expected ']' after catchswitch labels"))
7930 if (parseToken(
lltok::kw_unwind,
"expected 'unwind' after catchswitch scope"))
7938 if (parseTypeAndBasicBlock(UnwindBB, PFS))
7944 for (BasicBlock *DestBB : Table)
7945 CatchSwitch->addHandler(DestBB);
7952bool LLParser::parseCatchPad(Instruction *&Inst, PerFunctionState &PFS) {
7953 Value *CatchSwitch =
nullptr;
7959 return tokError(
"expected scope value for catchpad");
7964 SmallVector<Value *, 8>
Args;
7965 if (parseExceptionArgs(Args, PFS))
7974bool LLParser::parseCleanupPad(Instruction *&Inst, PerFunctionState &PFS) {
7975 Value *ParentPad =
nullptr;
7982 return tokError(
"expected scope value for cleanuppad");
7987 SmallVector<Value *, 8>
Args;
7988 if (parseExceptionArgs(Args, PFS))
8004bool LLParser::parseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
8005 unsigned Opc,
bool IsFP) {
8007 if (parseTypeAndValue(
LHS, Loc, PFS))
8014 return error(Loc,
"invalid operand type for instruction");
8024bool LLParser::parseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
8025 LocTy CallLoc = Lex.getLoc();
8026 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8027 std::vector<unsigned> FwdRefAttrGrps;
8030 Type *RetType =
nullptr;
8037 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8038 parseType(RetType, RetTypeLoc,
true ) ||
8039 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
8040 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
8042 parseOptionalOperandBundles(BundleList, PFS) ||
8044 parseTypeAndBasicBlock(DefaultDest, PFS) ||
8049 SmallVector<BasicBlock *, 16> IndirectDests;
8053 if (parseTypeAndBasicBlock(DestBB, PFS))
8058 if (parseTypeAndBasicBlock(DestBB, PFS))
8064 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
8071 if (resolveFunctionType(RetType, ArgList, Ty))
8072 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8083 SmallVector<Value *, 8>
Args;
8090 for (
const ParamInfo &Arg : ArgList) {
8091 Type *ExpectedTy =
nullptr;
8094 }
else if (!Ty->isVarArg()) {
8095 return error(Arg.Loc,
"too many arguments specified");
8098 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8099 return error(Arg.Loc,
"argument is not of expected type '" +
8101 Args.push_back(Arg.V);
8106 return error(CallLoc,
"not enough parameters specified for call");
8118 ForwardRefAttrGroups[CBI] = FwdRefAttrGrps;
8132bool LLParser::parseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
8133 unsigned Opc,
bool IsFP) {
8135 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8136 parseToken(
lltok::comma,
"expected ',' in arithmetic operation") ||
8144 return error(Loc,
"invalid operand type for instruction");
8152bool LLParser::parseLogical(Instruction *&Inst, PerFunctionState &PFS,
8155 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8156 parseToken(
lltok::comma,
"expected ',' in logical operation") ||
8162 "instruction requires integer or integer vector operands");
8171bool LLParser::parseCompare(Instruction *&Inst, PerFunctionState &PFS,
8177 if (parseCmpPredicate(Pred,
Opc) || parseTypeAndValue(
LHS, Loc, PFS) ||
8178 parseToken(
lltok::comma,
"expected ',' after compare value") ||
8182 if (
Opc == Instruction::FCmp) {
8184 return error(Loc,
"fcmp requires floating point operands");
8187 assert(
Opc == Instruction::ICmp &&
"Unknown opcode for CmpInst!");
8190 return error(Loc,
"icmp requires integer operands");
8202bool LLParser::parseCast(Instruction *&Inst, PerFunctionState &PFS,
8206 Type *DestTy =
nullptr;
8207 if (parseTypeAndValue(
Op, Loc, PFS) ||
8208 parseToken(
lltok::kw_to,
"expected 'to' after cast value") ||
8213 return error(Loc,
"invalid cast opcode for cast from '" +
8222bool LLParser::parseSelect(Instruction *&Inst, PerFunctionState &PFS) {
8224 Value *Op0, *Op1, *Op2;
8225 if (parseTypeAndValue(Op0, Loc, PFS) ||
8226 parseToken(
lltok::comma,
"expected ',' after select condition") ||
8227 parseTypeAndValue(Op1, PFS) ||
8228 parseToken(
lltok::comma,
"expected ',' after select value") ||
8229 parseTypeAndValue(Op2, PFS))
8233 return error(Loc, Reason);
8241bool LLParser::parseVAArg(Instruction *&Inst, PerFunctionState &PFS) {
8243 Type *EltTy =
nullptr;
8245 if (parseTypeAndValue(
Op, PFS) ||
8246 parseToken(
lltok::comma,
"expected ',' after vaarg operand") ||
8247 parseType(EltTy, TypeLoc))
8251 return error(TypeLoc,
"va_arg requires operand with first class type");
8253 Inst =
new VAArgInst(
Op, EltTy);
8259bool LLParser::parseExtractElement(Instruction *&Inst, PerFunctionState &PFS) {
8262 if (parseTypeAndValue(Op0, Loc, PFS) ||
8263 parseToken(
lltok::comma,
"expected ',' after extract value") ||
8264 parseTypeAndValue(Op1, PFS))
8268 return error(Loc,
"invalid extractelement operands");
8276bool LLParser::parseInsertElement(Instruction *&Inst, PerFunctionState &PFS) {
8278 Value *Op0, *Op1, *Op2;
8279 if (parseTypeAndValue(Op0, Loc, PFS) ||
8280 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8281 parseTypeAndValue(Op1, PFS) ||
8282 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8283 parseTypeAndValue(Op2, PFS))
8287 return error(Loc,
"invalid insertelement operands");
8295bool LLParser::parseShuffleVector(Instruction *&Inst, PerFunctionState &PFS) {
8297 Value *Op0, *Op1, *Op2;
8298 if (parseTypeAndValue(Op0, Loc, PFS) ||
8299 parseToken(
lltok::comma,
"expected ',' after shuffle mask") ||
8300 parseTypeAndValue(Op1, PFS) ||
8301 parseToken(
lltok::comma,
"expected ',' after shuffle value") ||
8302 parseTypeAndValue(Op2, PFS))
8306 return error(Loc,
"invalid shufflevector operands");
8308 Inst =
new ShuffleVectorInst(Op0, Op1, Op2);
8314int LLParser::parsePHI(Instruction *&Inst, PerFunctionState &PFS) {
8318 if (parseType(Ty, TypeLoc))
8322 return error(TypeLoc,
"phi node must have first class type");
8325 bool AteExtraComma =
false;
8337 AteExtraComma =
true;
8341 if (parseToken(
lltok::lsquare,
"expected '[' in phi value list") ||
8342 parseValue(Ty, Op0, PFS) ||
8343 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8352 for (
const auto &[Val, BB] : PHIVals)
8355 return AteExtraComma ? InstExtraComma : InstNormal;
8364bool LLParser::parseLandingPad(Instruction *&Inst, PerFunctionState &PFS) {
8367 if (parseType(Ty, TyLoc))
8380 return tokError(
"expected 'catch' or 'filter' clause type");
8384 if (parseTypeAndValue(V, VLoc, PFS))
8391 return error(VLoc,
"'catch' clause has an invalid type");
8394 return error(VLoc,
"'filter' clause has an invalid type");
8399 return error(VLoc,
"clause argument must be a constant");
8403 Inst = LP.release();
8409bool LLParser::parseFreeze(Instruction *&Inst, PerFunctionState &PFS) {
8412 if (parseTypeAndValue(
Op, Loc, PFS))
8415 Inst =
new FreezeInst(
Op);
8428bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS,
8430 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8431 std::vector<unsigned> FwdRefAttrGrps;
8433 unsigned CallAddrSpace;
8435 Type *RetType =
nullptr;
8440 LocTy CallLoc = Lex.getLoc();
8444 "expected 'tail call', 'musttail call', or 'notail call'"))
8447 FastMathFlags FMF = EatFastMathFlagsIfPresent();
8449 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8450 parseOptionalProgramAddrSpace(CallAddrSpace) ||
8451 parseType(RetType, RetTypeLoc,
true ) ||
8452 parseValID(CalleeID, &PFS) ||
8454 PFS.getFunction().isVarArg()) ||
8455 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false, BuiltinLoc) ||
8456 parseOptionalOperandBundles(BundleList, PFS))
8463 if (resolveFunctionType(RetType, ArgList, Ty))
8464 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8470 if (convertValIDToValue(
PointerType::get(Context, CallAddrSpace), CalleeID,
8477 SmallVector<Value*, 8>
Args;
8483 for (
const ParamInfo &Arg : ArgList) {
8484 Type *ExpectedTy =
nullptr;
8487 }
else if (!Ty->isVarArg()) {
8488 return error(Arg.Loc,
"too many arguments specified");
8491 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8492 return error(Arg.Loc,
"argument is not of expected type '" +
8494 Args.push_back(Arg.V);
8495 Attrs.push_back(Arg.Attrs);
8499 return error(CallLoc,
"not enough parameters specified for call");
8512 return error(CallLoc,
"fast-math-flags specified for call without "
8513 "floating-point scalar or vector return type");
8520 if (SeenNewDbgInfoFormat) {
8522 return error(CallLoc,
"llvm.dbg intrinsic should not appear in a module "
8523 "using non-intrinsic debug info");
8525 SeenOldDbgInfoFormat =
true;
8528 ForwardRefAttrGroups[CI] = FwdRefAttrGrps;
8540int LLParser::parseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
8542 LocTy SizeLoc, TyLoc, ASLoc;
8543 MaybeAlign Alignment;
8544 unsigned AddrSpace = 0;
8547 bool IsInAlloca = EatIfPresent(lltok::kw_inalloca);
8548 bool IsSwiftError = EatIfPresent(lltok::kw_swifterror);
8550 if (parseType(Ty, TyLoc))
8554 return error(TyLoc,
"invalid type for alloca");
8556 bool AteExtraComma =
false;
8558 if (Lex.getKind() == lltok::kw_align) {
8559 if (parseOptionalAlignment(Alignment))
8561 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8564 ASLoc = Lex.getLoc();
8565 if (parseOptionalAddrSpace(AddrSpace))
8568 AteExtraComma =
true;
8570 if (parseTypeAndValue(
Size, SizeLoc, PFS))
8573 if (Lex.getKind() == lltok::kw_align) {
8574 if (parseOptionalAlignment(Alignment))
8576 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8579 ASLoc = Lex.getLoc();
8580 if (parseOptionalAddrSpace(AddrSpace))
8583 AteExtraComma =
true;
8589 if (
Size && !
Size->getType()->isIntegerTy())
8590 return error(SizeLoc,
"element count must have integer type");
8592 SmallPtrSet<Type *, 4> Visited;
8593 if (!Alignment && !Ty->
isSized(&Visited))
8594 return error(TyLoc,
"Cannot allocate unsized type");
8596 Alignment = M->getDataLayout().getPrefTypeAlign(Ty);
8597 AllocaInst *AI =
new AllocaInst(Ty, AddrSpace,
Size, *Alignment);
8601 return AteExtraComma ? InstExtraComma : InstNormal;
8608int LLParser::parseLoad(Instruction *&Inst, PerFunctionState &PFS) {
8610 MaybeAlign Alignment;
8611 bool AteExtraComma =
false;
8612 bool isAtomic =
false;
8621 bool isVolatile =
false;
8628 LocTy ExplicitTypeLoc = Lex.getLoc();
8629 if (parseType(Ty) ||
8630 parseToken(
lltok::comma,
"expected comma after load's type") ||
8631 parseTypeAndValue(Val, Loc, PFS) ||
8632 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8633 parseOptionalCommaAlign(Alignment, AteExtraComma))
8637 return error(Loc,
"load operand must be a pointer to a first class type");
8638 if (isAtomic && !Alignment)
8639 return error(Loc,
"atomic load must have explicit non-zero alignment");
8642 return error(Loc,
"atomic load cannot use Release ordering");
8644 SmallPtrSet<Type *, 4> Visited;
8645 if (!Alignment && !Ty->
isSized(&Visited))
8646 return error(ExplicitTypeLoc,
"loading unsized types is not allowed");
8648 Alignment = M->getDataLayout().getABITypeAlign(Ty);
8649 Inst =
new LoadInst(Ty, Val,
"", isVolatile, *Alignment, Ordering, SSID);
8650 return AteExtraComma ? InstExtraComma : InstNormal;
8658int LLParser::parseStore(Instruction *&Inst, PerFunctionState &PFS) {
8660 MaybeAlign Alignment;
8661 bool AteExtraComma =
false;
8662 bool isAtomic =
false;
8671 bool isVolatile =
false;
8677 if (parseTypeAndValue(Val, Loc, PFS) ||
8678 parseToken(
lltok::comma,
"expected ',' after store operand") ||
8679 parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8680 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8681 parseOptionalCommaAlign(Alignment, AteExtraComma))
8685 return error(PtrLoc,
"store operand must be a pointer");
8687 return error(Loc,
"store operand must be a first class value");
8688 if (isAtomic && !Alignment)
8689 return error(Loc,
"atomic store must have explicit non-zero alignment");
8692 return error(Loc,
"atomic store cannot use Acquire ordering");
8693 SmallPtrSet<Type *, 4> Visited;
8695 return error(Loc,
"storing unsized types is not allowed");
8697 Alignment = M->getDataLayout().getABITypeAlign(Val->
getType());
8699 Inst =
new StoreInst(Val, Ptr, isVolatile, *Alignment, Ordering, SSID);
8700 return AteExtraComma ? InstExtraComma : InstNormal;
8707int LLParser::parseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {
8709 bool AteExtraComma =
false;
8713 bool isVolatile =
false;
8714 bool isWeak =
false;
8715 MaybeAlign Alignment;
8723 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8724 parseToken(
lltok::comma,
"expected ',' after cmpxchg address") ||
8725 parseTypeAndValue(Cmp, CmpLoc, PFS) ||
8726 parseToken(
lltok::comma,
"expected ',' after cmpxchg cmp operand") ||
8727 parseTypeAndValue(New, NewLoc, PFS) ||
8728 parseScopeAndOrdering(
true , SSID, SuccessOrdering) ||
8729 parseOrdering(FailureOrdering) ||
8730 parseOptionalCommaAlign(Alignment, AteExtraComma))
8734 return tokError(
"invalid cmpxchg success ordering");
8736 return tokError(
"invalid cmpxchg failure ordering");
8738 return error(PtrLoc,
"cmpxchg operand must be a pointer");
8739 if (
Cmp->getType() !=
New->getType())
8740 return error(NewLoc,
"compare value and new value type do not match");
8741 if (!
New->getType()->isFirstClassType())
8742 return error(NewLoc,
"cmpxchg operand must be a first class value");
8744 const Align DefaultAlignment(
8745 PFS.getFunction().getDataLayout().getTypeStoreSize(
8748 AtomicCmpXchgInst *CXI =
8749 new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment.value_or(DefaultAlignment),
8750 SuccessOrdering, FailureOrdering, SSID);
8755 return AteExtraComma ? InstExtraComma : InstNormal;
8761int LLParser::parseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {
8763 bool AteExtraComma =
false;
8766 bool isVolatile =
false;
8769 MaybeAlign Alignment;
8774 switch (Lex.getKind()) {
8776 return tokError(
"expected binary operation in atomicrmw");
8827 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8828 parseToken(
lltok::comma,
"expected ',' after atomicrmw address") ||
8829 parseTypeAndValue(Val, ValLoc, PFS) ||
8830 parseScopeAndOrdering(
true , SSID, Ordering) ||
8831 parseOptionalCommaAlign(Alignment, AteExtraComma))
8835 return tokError(
"atomicrmw cannot be unordered");
8837 return error(PtrLoc,
"atomicrmw operand must be a pointer");
8839 return error(ValLoc,
"atomicrmw operand may not be scalable");
8848 " operand must be an integer, floating point, or pointer type");
8852 return error(ValLoc,
"atomicrmw " +
8854 " operand must be a floating point type");
8858 return error(ValLoc,
"atomicrmw " +
8860 " operand must be an integer");
8865 PFS.getFunction().getDataLayout().getTypeStoreSizeInBits(
8868 return error(ValLoc,
"atomicrmw operand must be power-of-two byte-sized"
8870 const Align DefaultAlignment(
8871 PFS.getFunction().getDataLayout().getTypeStoreSize(
8873 AtomicRMWInst *RMWI =
8875 Alignment.value_or(DefaultAlignment), Ordering, SSID);
8878 return AteExtraComma ? InstExtraComma : InstNormal;
8883int LLParser::parseFence(Instruction *&Inst, PerFunctionState &PFS) {
8886 if (parseScopeAndOrdering(
true , SSID, Ordering))
8890 return tokError(
"fence cannot be unordered");
8892 return tokError(
"fence cannot be monotonic");
8894 Inst =
new FenceInst(Context, Ordering, SSID);
8900int LLParser::parseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
8901 Value *Ptr =
nullptr;
8902 Value *Val =
nullptr;
8918 if (parseType(Ty) ||
8919 parseToken(
lltok::comma,
"expected comma after getelementptr's type") ||
8920 parseTypeAndValue(Ptr, Loc, PFS))
8925 if (!BasePointerType)
8926 return error(Loc,
"base of getelementptr must be a pointer");
8928 SmallVector<Value*, 16> Indices;
8929 bool AteExtraComma =
false;
8932 ElementCount GEPWidth =
BaseType->isVectorTy()
8938 AteExtraComma =
true;
8941 if (parseTypeAndValue(Val, EltLoc, PFS))
8944 return error(EltLoc,
"getelementptr index must be an integer");
8947 ElementCount ValNumEl = ValVTy->getElementCount();
8951 "getelementptr vector index has a wrong number of elements");
8952 GEPWidth = ValNumEl;
8957 SmallPtrSet<Type*, 4> Visited;
8959 return error(Loc,
"base element of getelementptr must be sized");
8963 return error(Loc,
"getelementptr cannot target structure that contains "
8964 "scalable vector type");
8967 return error(Loc,
"invalid getelementptr indices");
8970 GEP->setNoWrapFlags(NW);
8971 return AteExtraComma ? InstExtraComma : InstNormal;
8976int LLParser::parseExtractValue(Instruction *&Inst, PerFunctionState &PFS) {
8978 SmallVector<unsigned, 4> Indices;
8980 if (parseTypeAndValue(Val, Loc, PFS) ||
8981 parseIndexList(Indices, AteExtraComma))
8985 return error(Loc,
"extractvalue operand must be aggregate type");
8988 return error(Loc,
"invalid indices for extractvalue");
8990 return AteExtraComma ? InstExtraComma : InstNormal;
8995int LLParser::parseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
8997 SmallVector<unsigned, 4> Indices;
8999 if (parseTypeAndValue(Val0, Loc0, PFS) ||
9000 parseToken(
lltok::comma,
"expected comma after insertvalue operand") ||
9001 parseTypeAndValue(Val1, Loc1, PFS) ||
9002 parseIndexList(Indices, AteExtraComma))
9006 return error(Loc0,
"insertvalue operand must be aggregate type");
9010 return error(Loc0,
"invalid indices for insertvalue");
9011 if (IndexedType != Val1->
getType())
9012 return error(Loc1,
"insertvalue operand and field disagree in type: '" +
9016 return AteExtraComma ? InstExtraComma : InstNormal;
9027bool LLParser::parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts) {
9042 if (parseMetadata(MD,
nullptr))
9047 return parseToken(
lltok::rbrace,
"expected end of metadata node");
9053bool LLParser::sortUseListOrder(
Value *V, ArrayRef<unsigned> Indexes,
9055 if (!
V->hasUseList())
9058 return error(Loc,
"value has no uses");
9060 unsigned NumUses = 0;
9061 SmallDenseMap<const Use *, unsigned, 16> Order;
9062 for (
const Use &U :
V->uses()) {
9063 if (++NumUses > Indexes.
size())
9065 Order[&
U] = Indexes[NumUses - 1];
9068 return error(Loc,
"value only has one use");
9069 if (Order.
size() != Indexes.
size() || NumUses > Indexes.
size())
9071 "wrong number of indexes, expected " + Twine(
V->getNumUses()));
9073 V->sortUseList([&](
const Use &L,
const Use &R) {
9081bool LLParser::parseUseListOrderIndexes(SmallVectorImpl<unsigned> &Indexes) {
9082 SMLoc Loc = Lex.getLoc();
9086 return tokError(
"expected non-empty list of uselistorder indexes");
9093 bool IsOrdered =
true;
9094 assert(Indexes.
empty() &&
"Expected empty order vector");
9097 if (parseUInt32(Index))
9102 Max = std::max(Max, Index);
9103 IsOrdered &= Index == Indexes.
size();
9111 if (Indexes.
size() < 2)
9112 return error(Loc,
"expected >= 2 uselistorder indexes");
9115 "expected distinct uselistorder indexes in range [0, size)");
9117 return error(Loc,
"expected uselistorder indexes to change the order");
9124bool LLParser::parseUseListOrder(PerFunctionState *PFS) {
9125 SMLoc Loc = Lex.getLoc();
9130 SmallVector<unsigned, 16> Indexes;
9131 if (parseTypeAndValue(V, PFS) ||
9132 parseToken(
lltok::comma,
"expected comma in uselistorder directive") ||
9133 parseUseListOrderIndexes(Indexes))
9136 return sortUseListOrder(V, Indexes, Loc);
9141bool LLParser::parseUseListOrderBB() {
9143 SMLoc Loc = Lex.getLoc();
9147 SmallVector<unsigned, 16> Indexes;
9148 if (parseValID(Fn,
nullptr) ||
9149 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9150 parseValID(Label,
nullptr) ||
9151 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9152 parseUseListOrderIndexes(Indexes))
9158 GV = M->getNamedValue(Fn.
StrVal);
9160 GV = NumberedVals.get(Fn.
UIntVal);
9162 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9165 "invalid function forward reference in uselistorder_bb");
9168 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9169 if (
F->isDeclaration())
9170 return error(Fn.
Loc,
"invalid declaration in uselistorder_bb");
9174 return error(
Label.Loc,
"invalid numeric label in uselistorder_bb");
9176 return error(
Label.Loc,
"expected basic block name in uselistorder_bb");
9177 Value *
V =
F->getValueSymbolTable()->lookup(
Label.StrVal);
9179 return error(
Label.Loc,
"invalid basic block in uselistorder_bb");
9181 return error(
Label.Loc,
"expected basic block in uselistorder_bb");
9183 return sortUseListOrder(V, Indexes, Loc);
9189bool LLParser::parseModuleEntry(
unsigned ID) {
9198 parseStringConstant(Path) ||
9206 if (parseUInt32(Hash[0]) || parseToken(
lltok::comma,
"expected ',' here") ||
9207 parseUInt32(Hash[1]) || parseToken(
lltok::comma,
"expected ',' here") ||
9208 parseUInt32(Hash[2]) || parseToken(
lltok::comma,
"expected ',' here") ||
9209 parseUInt32(Hash[3]) || parseToken(
lltok::comma,
"expected ',' here") ||
9210 parseUInt32(Hash[4]))
9217 auto ModuleEntry = Index->addModule(Path, Hash);
9218 ModuleIdMap[
ID] = ModuleEntry->first();
9225bool LLParser::parseTypeIdEntry(
unsigned ID) {
9234 parseStringConstant(Name))
9237 TypeIdSummary &TIS = Index->getOrInsertTypeIdSummary(Name);
9239 parseTypeIdSummary(TIS) || parseToken(
lltok::rparen,
"expected ')' here"))
9244 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9245 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9246 for (
auto TIDRef : FwdRefTIDs->second) {
9248 "Forward referenced type id GUID expected to be 0");
9251 ForwardRefTypeIds.erase(FwdRefTIDs);
9259bool LLParser::parseTypeIdSummary(TypeIdSummary &TIS) {
9263 parseTypeTestResolution(TIS.
TTRes))
9268 if (parseOptionalWpdResolutions(TIS.
WPDRes))
9279 ValueInfo(
false, (GlobalValueSummaryMapTy::value_type *)-8);
9285bool LLParser::parseTypeIdCompatibleVtableEntry(
unsigned ID) {
9294 parseStringConstant(Name))
9298 Index->getOrInsertTypeIdCompatibleVtableSummary(Name);
9305 IdToIndexMapType IdToIndexMap;
9318 if (parseGVReference(VI, GVId))
9325 IdToIndexMap[GVId].push_back(std::make_pair(TI.size(),
Loc));
9326 TI.push_back({
Offset, VI});
9334 for (
auto I : IdToIndexMap) {
9335 auto &Infos = ForwardRefValueInfos[
I.first];
9336 for (
auto P :
I.second) {
9338 "Forward referenced ValueInfo expected to be empty");
9339 Infos.emplace_back(&TI[
P.first].VTableVI,
P.second);
9349 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9350 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9351 for (
auto TIDRef : FwdRefTIDs->second) {
9353 "Forward referenced type id GUID expected to be 0");
9356 ForwardRefTypeIds.erase(FwdRefTIDs);
9368bool LLParser::parseTypeTestResolution(TypeTestResolution &TTRes) {
9376 switch (Lex.getKind()) {
9396 return error(Lex.getLoc(),
"unexpected TypeTestResolution kind");
9408 switch (Lex.getKind()) {
9423 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(Val))
9436 return error(Lex.getLoc(),
"expected optional TypeTestResolution field");
9449bool LLParser::parseOptionalWpdResolutions(
9450 std::map<uint64_t, WholeProgramDevirtResolution> &WPDResMap) {
9458 WholeProgramDevirtResolution WPDRes;
9462 parseToken(
lltok::comma,
"expected ',' here") || parseWpdRes(WPDRes) ||
9465 WPDResMap[
Offset] = WPDRes;
9482bool LLParser::parseWpdRes(WholeProgramDevirtResolution &WPDRes) {
9490 switch (Lex.getKind()) {
9501 return error(Lex.getLoc(),
"unexpected WholeProgramDevirtResolution kind");
9507 switch (Lex.getKind()) {
9515 if (parseOptionalResByArg(WPDRes.
ResByArg))
9519 return error(Lex.getLoc(),
9520 "expected optional WholeProgramDevirtResolution field");
9537bool LLParser::parseOptionalResByArg(
9538 std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>
9546 std::vector<uint64_t>
Args;
9547 if (parseArgs(Args) || parseToken(
lltok::comma,
"expected ',' here") ||
9555 WholeProgramDevirtResolution::ByArg ByArg;
9556 switch (Lex.getKind()) {
9570 return error(Lex.getLoc(),
9571 "unexpected WholeProgramDevirtResolution::ByArg kind");
9577 switch (Lex.getKind()) {
9581 parseUInt64(ByArg.
Info))
9587 parseUInt32(ByArg.
Byte))
9593 parseUInt32(ByArg.
Bit))
9597 return error(Lex.getLoc(),
9598 "expected optional whole program devirt field");
9605 ResByArg[
Args] = ByArg;
9616bool LLParser::parseArgs(std::vector<uint64_t> &Args) {
9624 if (parseUInt64(Val))
9626 Args.push_back(Val);
9635static const auto FwdVIRef = (GlobalValueSummaryMapTy::value_type *)-8;
9640 assert(!(ReadOnly && WriteOnly));
9650bool LLParser::addGlobalValueToIndex(
9652 unsigned ID, std::unique_ptr<GlobalValueSummary> Summary,
LocTy Loc) {
9657 VI = Index->getOrInsertValueInfo(GUID);
9661 auto *GV = M->getNamedValue(Name);
9663 return error(Loc,
"Reference to undefined global \"" + Name +
"\"");
9665 VI = Index->getOrInsertValueInfo(GV);
9669 "Need a source_filename to compute GUID for local");
9672 VI = Index->getOrInsertValueInfo(GUID, Index->saveString(Name));
9677 auto FwdRefVIs = ForwardRefValueInfos.find(
ID);
9678 if (FwdRefVIs != ForwardRefValueInfos.end()) {
9679 for (
auto VIRef : FwdRefVIs->second) {
9681 "Forward referenced ValueInfo expected to be empty");
9684 ForwardRefValueInfos.erase(FwdRefVIs);
9688 auto FwdRefAliasees = ForwardRefAliasees.find(
ID);
9689 if (FwdRefAliasees != ForwardRefAliasees.end()) {
9690 for (
auto AliaseeRef : FwdRefAliasees->second) {
9691 assert(!AliaseeRef.first->hasAliasee() &&
9692 "Forward referencing alias already has aliasee");
9693 assert(Summary &&
"Aliasee must be a definition");
9694 AliaseeRef.first->setAliasee(VI,
Summary.get());
9696 ForwardRefAliasees.erase(FwdRefAliasees);
9701 Index->addGlobalValueSummary(VI, std::move(Summary));
9704 if (
ID == NumberedValueInfos.size())
9705 NumberedValueInfos.push_back(VI);
9708 if (
ID > NumberedValueInfos.size())
9709 NumberedValueInfos.resize(
ID + 1);
9710 NumberedValueInfos[
ID] =
VI;
9718bool LLParser::parseSummaryIndexFlags() {
9725 if (parseUInt64(Flags))
9728 Index->setFlags(Flags);
9734bool LLParser::parseBlockCount() {
9740 uint64_t BlockCount;
9741 if (parseUInt64(BlockCount))
9744 Index->setBlockCount(BlockCount);
9752bool LLParser::parseGVEntry(
unsigned ID) {
9760 LocTy Loc = Lex.getLoc();
9763 switch (Lex.getKind()) {
9767 parseStringConstant(Name))
9773 if (parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(GUID))
9777 return error(Lex.getLoc(),
"expected name or guid tag");
9800 switch (Lex.getKind()) {
9802 if (parseFunctionSummary(Name, GUID,
ID))
9806 if (parseVariableSummary(Name, GUID,
ID))
9810 if (parseAliasSummary(Name, GUID,
ID))
9814 return error(Lex.getLoc(),
"expected summary type");
9832 LocTy Loc = Lex.getLoc();
9836 StringRef ModulePath;
9837 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9840 false,
false,
false,
9844 FunctionSummary::TypeIdInfo TypeIdInfo;
9845 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
9847 std::vector<CallsiteInfo> Callsites;
9848 std::vector<AllocInfo> Allocs;
9850 FunctionSummary::FFlags FFlags = {};
9853 parseModuleReference(ModulePath) ||
9854 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9857 parseToken(
lltok::colon,
"expected ':' here") || parseUInt32(InstCount))
9862 switch (Lex.getKind()) {
9864 if (parseOptionalFFlags(FFlags))
9868 if (parseOptionalCalls(Calls))
9872 if (parseOptionalTypeIdInfo(TypeIdInfo))
9876 if (parseOptionalRefs(Refs))
9880 if (parseOptionalParamAccesses(ParamAccesses))
9884 if (parseOptionalAllocs(Allocs))
9888 if (parseOptionalCallsites(Callsites))
9892 return error(Lex.getLoc(),
"expected optional function summary field");
9899 auto FS = std::make_unique<FunctionSummary>(
9900 GVFlags, InstCount, FFlags, std::move(Refs), std::move(Calls),
9906 std::move(ParamAccesses), std::move(Callsites), std::move(Allocs));
9908 FS->setModulePath(ModulePath);
9910 return addGlobalValueToIndex(Name, GUID,
9912 std::move(FS), Loc);
9920 LocTy Loc = Lex.getLoc();
9924 StringRef ModulePath;
9925 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9928 false,
false,
false,
9930 GlobalVarSummary::GVarFlags GVarFlags(
false,
9938 parseModuleReference(ModulePath) ||
9939 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9941 parseGVarFlags(GVarFlags))
9946 switch (Lex.getKind()) {
9948 if (parseOptionalVTableFuncs(VTableFuncs))
9952 if (parseOptionalRefs(Refs))
9956 return error(Lex.getLoc(),
"expected optional variable summary field");
9964 std::make_unique<GlobalVarSummary>(GVFlags, GVarFlags, std::move(Refs));
9966 GS->setModulePath(ModulePath);
9967 GS->setVTableFuncs(std::move(VTableFuncs));
9969 return addGlobalValueToIndex(Name, GUID,
9971 std::move(GS), Loc);
9980 LocTy Loc = Lex.getLoc();
9983 StringRef ModulePath;
9984 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
9987 false,
false,
false,
9991 parseModuleReference(ModulePath) ||
9992 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
9998 ValueInfo AliaseeVI;
10000 auto AS = std::make_unique<AliasSummary>(GVFlags);
10001 AS->setModulePath(ModulePath);
10004 if (parseGVReference(AliaseeVI, GVId))
10009 ForwardRefAliasees[GVId].emplace_back(AS.get(), Loc);
10011 auto Summary = Index->findSummaryInModule(AliaseeVI, ModulePath);
10012 assert(Summary &&
"Aliasee must be a definition");
10013 AS->setAliasee(AliaseeVI, Summary);
10020 return addGlobalValueToIndex(Name, GUID,
10022 std::move(AS), Loc);
10027bool LLParser::parseFlag(
unsigned &Val) {
10028 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
10029 return tokError(
"expected integer");
10030 Val = (unsigned)Lex.getAPSIntVal().getBoolValue();
10046bool LLParser::parseOptionalFFlags(FunctionSummary::FFlags &FFlags) {
10050 if (parseToken(
lltok::colon,
"expected ':' in funcFlags") ||
10056 switch (Lex.getKind()) {
10059 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10065 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10071 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10077 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10083 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10089 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10095 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10101 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10107 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10113 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10118 return error(Lex.getLoc(),
"expected function flag type");
10122 if (parseToken(
lltok::rparen,
"expected ')' in funcFlags"))
10133bool LLParser::parseOptionalCalls(
10134 SmallVectorImpl<FunctionSummary::EdgeTy> &Calls) {
10138 if (parseToken(
lltok::colon,
"expected ':' in calls") ||
10142 IdToIndexMapType IdToIndexMap;
10151 LocTy Loc = Lex.getLoc();
10153 if (parseGVReference(VI, GVId))
10157 unsigned RelBF = 0;
10158 unsigned HasTailCall =
false;
10162 switch (Lex.getKind()) {
10165 if (parseToken(
lltok::colon,
"expected ':'") || parseHotness(Hotness))
10170 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(RelBF))
10175 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(HasTailCall))
10179 return error(Lex.getLoc(),
"expected hotness, relbf, or tail");
10183 return tokError(
"Expected only one of hotness or relbf");
10188 IdToIndexMap[GVId].push_back(std::make_pair(Calls.
size(), Loc));
10198 for (
auto I : IdToIndexMap) {
10199 auto &Infos = ForwardRefValueInfos[
I.first];
10200 for (
auto P :
I.second) {
10202 "Forward referenced ValueInfo expected to be empty");
10203 Infos.emplace_back(&Calls[
P.first].first,
P.second);
10216 switch (Lex.getKind()) {
10220 case lltok::kw_cold:
10226 case lltok::kw_hot:
10233 return error(Lex.getLoc(),
"invalid call edge hotness");
10242bool LLParser::parseOptionalVTableFuncs(
VTableFuncList &VTableFuncs) {
10246 if (parseToken(
lltok::colon,
"expected ':' in vTableFuncs") ||
10250 IdToIndexMapType IdToIndexMap;
10254 if (parseToken(
lltok::lparen,
"expected '(' in vTableFunc") ||
10259 LocTy Loc = Lex.getLoc();
10261 if (parseGVReference(VI, GVId))
10274 IdToIndexMap[GVId].push_back(std::make_pair(VTableFuncs.size(), Loc));
10275 VTableFuncs.push_back({
VI,
Offset});
10277 if (parseToken(
lltok::rparen,
"expected ')' in vTableFunc"))
10283 for (
auto I : IdToIndexMap) {
10284 auto &Infos = ForwardRefValueInfos[
I.first];
10285 for (
auto P :
I.second) {
10287 "Forward referenced ValueInfo expected to be empty");
10288 Infos.emplace_back(&VTableFuncs[
P.first].FuncVI,
P.second);
10292 if (parseToken(
lltok::rparen,
"expected ')' in vTableFuncs"))
10299bool LLParser::parseParamNo(uint64_t &ParamNo) {
10301 parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(ParamNo))
10307bool LLParser::parseParamAccessOffset(ConstantRange &
Range) {
10310 auto ParseAPSInt = [&](
APSInt &Val) {
10312 return tokError(
"expected integer");
10313 Val = Lex.getAPSIntVal();
10315 Val.setIsSigned(
true);
10337bool LLParser::parseParamAccessCall(FunctionSummary::ParamAccess::Call &
Call,
10338 IdLocListType &IdLocList) {
10346 LocTy Loc = Lex.getLoc();
10347 if (parseGVReference(VI, GVId))
10351 IdLocList.emplace_back(GVId, Loc);
10354 parseParamNo(
Call.ParamNo) ||
10356 parseParamAccessOffset(
Call.Offsets))
10368bool LLParser::parseParamAccess(FunctionSummary::ParamAccess &Param,
10369 IdLocListType &IdLocList) {
10371 parseParamNo(
Param.ParamNo) ||
10373 parseParamAccessOffset(
Param.Use))
10382 FunctionSummary::ParamAccess::Call
Call;
10383 if (parseParamAccessCall(
Call, IdLocList))
10400bool LLParser::parseOptionalParamAccesses(
10401 std::vector<FunctionSummary::ParamAccess> &Params) {
10409 IdLocListType VContexts;
10410 size_t CallsNum = 0;
10412 FunctionSummary::ParamAccess ParamAccess;
10413 if (parseParamAccess(ParamAccess, VContexts))
10415 CallsNum += ParamAccess.
Calls.size();
10416 assert(VContexts.size() == CallsNum);
10418 Params.emplace_back(std::move(ParamAccess));
10426 IdLocListType::const_iterator ItContext = VContexts.begin();
10427 for (
auto &PA : Params) {
10428 for (
auto &
C : PA.Calls) {
10430 ForwardRefValueInfos[ItContext->first].emplace_back(&
C.Callee,
10431 ItContext->second);
10435 assert(ItContext == VContexts.end());
10442bool LLParser::parseOptionalRefs(SmallVectorImpl<ValueInfo> &Refs) {
10446 if (parseToken(
lltok::colon,
"expected ':' in refs") ||
10450 struct ValueContext {
10455 std::vector<ValueContext> VContexts;
10459 VC.Loc = Lex.getLoc();
10460 if (parseGVReference(
VC.VI,
VC.GVId))
10462 VContexts.push_back(VC);
10468 llvm::sort(VContexts, [](
const ValueContext &VC1,
const ValueContext &VC2) {
10469 return VC1.VI.getAccessSpecifier() < VC2.VI.getAccessSpecifier();
10472 IdToIndexMapType IdToIndexMap;
10473 for (
auto &VC : VContexts) {
10478 IdToIndexMap[
VC.GVId].push_back(std::make_pair(Refs.
size(),
VC.Loc));
10484 for (
auto I : IdToIndexMap) {
10485 auto &Infos = ForwardRefValueInfos[
I.first];
10486 for (
auto P :
I.second) {
10488 "Forward referenced ValueInfo expected to be empty");
10489 Infos.emplace_back(&Refs[
P.first],
P.second);
10503bool LLParser::parseOptionalTypeIdInfo(
10504 FunctionSummary::TypeIdInfo &TypeIdInfo) {
10513 switch (Lex.getKind()) {
10515 if (parseTypeTests(TypeIdInfo.
TypeTests))
10539 return error(Lex.getLoc(),
"invalid typeIdInfo list type");
10543 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10552bool LLParser::parseTypeTests(std::vector<GlobalValue::GUID> &TypeTests) {
10560 IdToIndexMapType IdToIndexMap;
10564 unsigned ID = Lex.getUIntVal();
10565 LocTy Loc = Lex.getLoc();
10569 IdToIndexMap[
ID].push_back(std::make_pair(TypeTests.size(), Loc));
10571 }
else if (parseUInt64(GUID))
10573 TypeTests.push_back(GUID);
10578 for (
auto I : IdToIndexMap) {
10579 auto &Ids = ForwardRefTypeIds[
I.first];
10580 for (
auto P :
I.second) {
10581 assert(TypeTests[
P.first] == 0 &&
10582 "Forward referenced type id GUID expected to be 0");
10583 Ids.emplace_back(&TypeTests[
P.first],
P.second);
10587 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10595bool LLParser::parseVFuncIdList(
10596 lltok::Kind Kind, std::vector<FunctionSummary::VFuncId> &VFuncIdList) {
10597 assert(Lex.getKind() == Kind);
10604 IdToIndexMapType IdToIndexMap;
10606 FunctionSummary::VFuncId VFuncId;
10607 if (parseVFuncId(VFuncId, IdToIndexMap, VFuncIdList.size()))
10609 VFuncIdList.push_back(VFuncId);
10617 for (
auto I : IdToIndexMap) {
10618 auto &Ids = ForwardRefTypeIds[
I.first];
10619 for (
auto P :
I.second) {
10620 assert(VFuncIdList[
P.first].GUID == 0 &&
10621 "Forward referenced type id GUID expected to be 0");
10622 Ids.emplace_back(&VFuncIdList[
P.first].GUID,
P.second);
10631bool LLParser::parseConstVCallList(
10633 std::vector<FunctionSummary::ConstVCall> &ConstVCallList) {
10634 assert(Lex.getKind() == Kind);
10641 IdToIndexMapType IdToIndexMap;
10643 FunctionSummary::ConstVCall ConstVCall;
10644 if (parseConstVCall(ConstVCall, IdToIndexMap, ConstVCallList.size()))
10646 ConstVCallList.push_back(ConstVCall);
10654 for (
auto I : IdToIndexMap) {
10655 auto &Ids = ForwardRefTypeIds[
I.first];
10656 for (
auto P :
I.second) {
10657 assert(ConstVCallList[
P.first].VFunc.GUID == 0 &&
10658 "Forward referenced type id GUID expected to be 0");
10659 Ids.emplace_back(&ConstVCallList[
P.first].VFunc.GUID,
P.second);
10668bool LLParser::parseConstVCall(FunctionSummary::ConstVCall &ConstVCall,
10669 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10671 parseVFuncId(ConstVCall.
VFunc, IdToIndexMap, Index))
10675 if (parseArgs(ConstVCall.
Args))
10687bool LLParser::parseVFuncId(FunctionSummary::VFuncId &VFuncId,
10688 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10698 unsigned ID = Lex.getUIntVal();
10699 LocTy Loc = Lex.getLoc();
10703 IdToIndexMap[
ID].push_back(std::make_pair(Index, Loc));
10705 }
else if (parseToken(
lltok::kw_guid,
"expected 'guid' here") ||
10707 parseUInt64(VFuncId.
GUID))
10713 parseUInt64(VFuncId.
Offset) ||
10725bool LLParser::parseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
10735 switch (Lex.getKind()) {
10742 assert(HasLinkage &&
"Linkage not optional in summary entry");
10749 parseOptionalVisibility(Flag);
10754 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10760 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10766 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10772 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
10781 if (parseOptionalImportType(Lex.getKind(), IK))
10783 GVFlags.
ImportType =
static_cast<unsigned>(IK);
10787 return error(Lex.getLoc(),
"expected gv flag type");
10801bool LLParser::parseGVarFlags(GlobalVarSummary::GVarFlags &GVarFlags) {
10809 auto ParseRest = [
this](
unsigned int &Val) {
10813 return parseFlag(Val);
10818 switch (Lex.getKind()) {
10819 case lltok::kw_readonly:
10820 if (ParseRest(Flag))
10824 case lltok::kw_writeonly:
10825 if (ParseRest(Flag))
10830 if (ParseRest(Flag))
10835 if (ParseRest(Flag))
10840 return error(Lex.getLoc(),
"expected gvar flag type");
10848bool LLParser::parseModuleReference(StringRef &ModulePath) {
10855 unsigned ModuleID = Lex.getUIntVal();
10856 auto I = ModuleIdMap.find(ModuleID);
10858 assert(
I != ModuleIdMap.end());
10859 ModulePath =
I->second;
10865bool LLParser::parseGVReference(ValueInfo &VI,
unsigned &GVId) {
10868 WriteOnly = EatIfPresent(lltok::kw_writeonly);
10872 GVId = Lex.getUIntVal();
10874 if (GVId < NumberedValueInfos.size() && NumberedValueInfos[GVId]) {
10876 VI = NumberedValueInfos[GVId];
10893bool LLParser::parseOptionalAllocs(std::vector<AllocInfo> &Allocs) {
10897 if (parseToken(
lltok::colon,
"expected ':' in allocs") ||
10909 SmallVector<uint8_t> Versions;
10912 if (parseAllocType(V))
10917 if (parseToken(
lltok::rparen,
"expected ')' in versions") ||
10921 std::vector<MIBInfo> MIBs;
10922 if (parseMemProfs(MIBs))
10925 Allocs.push_back({Versions, MIBs});
10942bool LLParser::parseMemProfs(std::vector<MIBInfo> &MIBs) {
10946 if (parseToken(
lltok::colon,
"expected ':' in memprof") ||
10952 if (parseToken(
lltok::lparen,
"expected '(' in memprof") ||
10961 if (parseToken(
lltok::comma,
"expected ',' in memprof") ||
10967 SmallVector<unsigned> StackIdIndices;
10971 uint64_t StackId = 0;
10972 if (parseUInt64(StackId))
10974 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
10995bool LLParser::parseAllocType(uint8_t &
AllocType) {
10996 switch (Lex.getKind()) {
11003 case lltok::kw_cold:
11006 case lltok::kw_hot:
11010 return error(Lex.getLoc(),
"invalid alloc type");
11023bool LLParser::parseOptionalCallsites(std::vector<CallsiteInfo> &Callsites) {
11027 if (parseToken(
lltok::colon,
"expected ':' in callsites") ||
11031 IdToIndexMapType IdToIndexMap;
11034 if (parseToken(
lltok::lparen,
"expected '(' in callsite") ||
11041 LocTy Loc = Lex.getLoc();
11043 if (parseGVReference(VI, GVId))
11047 if (parseToken(
lltok::comma,
"expected ',' in callsite") ||
11053 SmallVector<unsigned> Clones;
11056 if (parseUInt32(V))
11062 parseToken(
lltok::comma,
"expected ',' in callsite") ||
11068 SmallVector<unsigned> StackIdIndices;
11072 uint64_t StackId = 0;
11073 if (parseUInt64(StackId))
11075 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
11086 IdToIndexMap[GVId].
push_back(std::make_pair(Callsites.size(), Loc));
11087 Callsites.push_back({
VI, Clones, StackIdIndices});
11095 for (
auto I : IdToIndexMap) {
11096 auto &Infos = ForwardRefValueInfos[
I.first];
11097 for (
auto P :
I.second) {
11099 "Forward referenced ValueInfo expected to be empty");
11100 Infos.emplace_back(&Callsites[
P.first].Callee,
P.second);
11104 if (parseToken(
lltok::rparen,
"expected ')' in callsites"))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Unify divergent function exit nodes
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
Function Alias Analysis false
Expand Atomic instructions
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
GlobalValue::SanitizerMetadata SanitizerMetadata
Module.h This file contains the declarations for the Module class.
static GlobalValue * createGlobalFwdRef(Module *M, PointerType *PTy)
static cl::opt< bool > AllowIncompleteIR("allow-incomplete-ir", cl::init(false), cl::Hidden, cl::desc("Allow incomplete IR on a best effort basis (references to unknown " "metadata will be dropped)"))
static void maybeSetDSOLocal(bool DSOLocal, GlobalValue &GV)
static bool upgradeMemoryAttr(MemoryEffects &ME, lltok::Kind Kind)
static std::optional< MemoryEffects::Location > keywordToLoc(lltok::Kind Tok)
static void resolveFwdRef(ValueInfo *Fwd, ValueInfo &Resolved)
static unsigned parseOptionalLinkageAux(lltok::Kind Kind, bool &HasLinkage)
static unsigned keywordToFPClassTest(lltok::Kind Tok)
#define CC_VLS_CASE(ABIVlen)
static std::optional< ModRefInfo > keywordToModRef(lltok::Kind Tok)
static bool isSanitizer(lltok::Kind Kind)
static void dropIntrinsicWithUnknownMetadataArgument(IntrinsicInst *II)
#define PARSE_MD_FIELDS()
static Attribute::AttrKind tokenToAttribute(lltok::Kind Kind)
#define GET_OR_DISTINCT(CLASS, ARGS)
bool isOldDbgFormatIntrinsic(StringRef Name)
static bool isValidVisibilityForLinkage(unsigned V, unsigned L)
static std::string getTypeString(Type *T)
static bool isValidDLLStorageClassForLinkage(unsigned S, unsigned L)
static const auto FwdVIRef
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
PowerPC Reduce CR logical Operation
static bool getVal(MDTuple *MD, const char *Key, uint64_t &Val)
const SmallVectorImpl< MachineOperand > & Cond
dot regions Print regions of function to dot file(with no function bodies)"
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file provides utility classes that use RAII to save and restore values.
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
This file defines the SmallPtrSet class.
FunctionLoweringInfo::StatepointRelocationRecord RecordType
static SymbolRef::Type getType(const Symbol *Sym)
LocallyHashedType DenseMapInfo< LocallyHashedType >::Empty
static 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)
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.
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
LLVM_ABI 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.