65 "Allow incomplete IR on a best effort basis (references to unknown "
66 "metadata will be dropped)"));
81 if (Context.shouldDiscardValueNames())
84 "Can't read textual IR with a Context that discards named Values");
87 if (parseTargetDefinitions(DataLayoutCallback))
91 return parseTopLevelEntities() || validateEndOfModule(UpgradeDebugInfo) ||
97 restoreParsingState(Slots);
101 if (parseType(Ty) || parseConstantValue(Ty,
C))
104 return error(Lex.getLoc(),
"expected end of string");
110 restoreParsingState(Slots);
114 SMLoc Start = Lex.getLoc();
118 SMLoc End = Lex.getLoc();
126 restoreParsingState(Slots);
130 SMLoc Start = Lex.getLoc();
132 bool Status = parseDIExpressionBody(Result,
false);
133 SMLoc End = Lex.getLoc();
139void LLParser::restoreParsingState(
const SlotMapping *Slots) {
146 std::make_pair(
I.getKey(), std::make_pair(
I.second,
LocTy())));
147 for (
const auto &
I : Slots->
Types)
148 NumberedTypes.insert(
149 std::make_pair(
I.first, std::make_pair(
I.second,
LocTy())));
155 II->getIntrinsicID() != Intrinsic::experimental_noalias_scope_decl)
162 if (MD->isTemporary())
166 assert(
II->use_empty() &&
"Cannot have uses");
167 II->eraseFromParent();
176void LLParser::dropUnknownMetadataReferences() {
177 auto Pred = [](
unsigned MDKind, MDNode *
Node) {
return Node->isTemporary(); };
178 for (Function &
F : *M) {
179 F.eraseMetadataIf(Pred);
181 I.eraseMetadataIf(Pred);
188 for (GlobalVariable &GV : M->globals())
189 GV.eraseMetadataIf(Pred);
194 if (
Info.first->getNumTemporaryUses() == 1) {
195 NumberedMetadata.erase(
ID);
196 ForwardRefMDNodes.erase(
ID);
209 assert(!(SeenNewDbgInfoFormat && SeenOldDbgInfoFormat) &&
210 "Mixed debug intrinsics/records seen without a parsing error?");
213 for (
const auto &RAG : ForwardRefAttrGroups) {
215 const std::vector<unsigned> &
Attrs = RAG.second;
216 AttrBuilder
B(Context);
218 for (
const auto &Attr : Attrs) {
219 auto R = NumberedAttrBuilders.find(Attr);
220 if (R != NumberedAttrBuilders.end())
225 AttributeList AS = Fn->getAttributes();
226 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
227 AS = AS.removeFnAttributes(Context);
233 if (MaybeAlign
A = FnAttrs.getAlignment()) {
234 Fn->setAlignment(*
A);
235 FnAttrs.removeAttribute(Attribute::Alignment);
238 AS = AS.addFnAttributes(Context, FnAttrs);
239 Fn->setAttributes(AS);
241 AttributeList AS = CI->getAttributes();
242 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
243 AS = AS.removeFnAttributes(Context);
245 AS = AS.addFnAttributes(Context, FnAttrs);
246 CI->setAttributes(AS);
248 AttributeList AS =
II->getAttributes();
249 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
250 AS = AS.removeFnAttributes(Context);
252 AS = AS.addFnAttributes(Context, FnAttrs);
253 II->setAttributes(AS);
255 AttributeList AS = CBI->getAttributes();
256 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
257 AS = AS.removeFnAttributes(Context);
259 AS = AS.addFnAttributes(Context, FnAttrs);
260 CBI->setAttributes(AS);
262 AttrBuilder
Attrs(M->getContext(), GV->getAttributes());
272 if (!ForwardRefBlockAddresses.empty())
273 return error(ForwardRefBlockAddresses.begin()->first.Loc,
274 "expected function name in blockaddress");
276 auto ResolveForwardRefDSOLocalEquivalents = [&](
const ValID &GVRef,
277 GlobalValue *FwdRef) {
278 GlobalValue *GV =
nullptr;
280 GV = M->getNamedValue(GVRef.
StrVal);
282 GV = NumberedVals.get(GVRef.
UIntVal);
287 "' referenced by dso_local_equivalent");
291 "expected a function, alias to function, or ifunc "
292 "in dso_local_equivalent");
295 FwdRef->replaceAllUsesWith(Equiv);
296 FwdRef->eraseFromParent();
303 for (
auto &Iter : ForwardRefDSOLocalEquivalentIDs) {
304 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
307 for (
auto &Iter : ForwardRefDSOLocalEquivalentNames) {
308 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
311 ForwardRefDSOLocalEquivalentIDs.clear();
312 ForwardRefDSOLocalEquivalentNames.clear();
314 for (
const auto &NT : NumberedTypes)
315 if (
NT.second.second.isValid())
317 "use of undefined type '%" + Twine(
NT.first) +
"'");
319 for (
const auto &[Name, TypeInfo] : NamedTypes)
320 if (TypeInfo.second.isValid())
321 return error(TypeInfo.second,
322 "use of undefined type named '" + Name +
"'");
324 if (!ForwardRefComdats.empty())
325 return error(ForwardRefComdats.begin()->second,
326 "use of undefined comdat '$" +
327 ForwardRefComdats.begin()->first +
"'");
341 if (!CB || !CB->isCallee(&U))
342 return error(
Info.second,
"intrinsic can only be used as callee");
344 std::string ErrorMsg;
345 raw_string_ostream ErrorOS(ErrorMsg);
359 return error(
Info.second,
"unknown intrinsic '" + Name +
"'");
370 Info.first->eraseFromParent();
371 ForwardRefVals.erase(Name);
380 auto GetCommonFunctionType = [](
Value *
V) -> FunctionType * {
381 FunctionType *FTy =
nullptr;
382 for (Use &U :
V->uses()) {
384 if (!CB || !CB->isCallee(&U) || (FTy && FTy != CB->getFunctionType()))
386 FTy = CB->getFunctionType();
394 Type *Ty = GetCommonFunctionType(
Info.first);
402 GV =
new GlobalVariable(*M, Ty,
false,
405 Info.first->replaceAllUsesWith(GV);
406 Info.first->eraseFromParent();
407 ForwardRefVals.erase(Name);
410 if (!ForwardRefVals.empty())
411 return error(ForwardRefVals.begin()->second.second,
412 "use of undefined value '@" + ForwardRefVals.begin()->first +
415 if (!ForwardRefValIDs.empty())
416 return error(ForwardRefValIDs.begin()->second.second,
417 "use of undefined value '@" +
418 Twine(ForwardRefValIDs.begin()->first) +
"'");
421 dropUnknownMetadataReferences();
423 if (!ForwardRefMDNodes.empty())
424 return error(ForwardRefMDNodes.begin()->second.second,
425 "use of undefined metadata '!" +
426 Twine(ForwardRefMDNodes.begin()->first) +
"'");
429 for (
auto &
N : NumberedMetadata) {
430 if (
N.second && !
N.second->isResolved())
431 N.second->resolveCycles();
435 NewDistinctSPs.clear();
437 for (
auto *Inst : InstsWithTBAATag) {
438 MDNode *MD = Inst->getMetadata(LLVMContext::MD_tbaa);
441 assert(MD &&
"UpgradeInstWithTBAATag should have a TBAA tag");
444 if (MD != UpgradedMD)
445 Inst->setMetadata(LLVMContext::MD_tbaa, UpgradedMD);
454 if (UpgradeDebugInfo)
467 Slots->GlobalValues = std::move(NumberedVals);
468 Slots->MetadataNodes = std::move(NumberedMetadata);
469 for (
const auto &
I : NamedTypes)
470 Slots->NamedTypes.insert(std::make_pair(
I.getKey(),
I.second.first));
471 for (
const auto &
I : NumberedTypes)
472 Slots->Types.insert(std::make_pair(
I.first,
I.second.first));
478bool LLParser::validateEndOfIndex() {
482 if (!ForwardRefValueInfos.empty())
483 return error(ForwardRefValueInfos.begin()->second.front().second,
484 "use of undefined summary '^" +
485 Twine(ForwardRefValueInfos.begin()->first) +
"'");
487 if (!ForwardRefAliasees.empty())
488 return error(ForwardRefAliasees.begin()->second.front().second,
489 "use of undefined summary '^" +
490 Twine(ForwardRefAliasees.begin()->first) +
"'");
492 if (!ForwardRefTypeIds.empty())
493 return error(ForwardRefTypeIds.begin()->second.front().second,
494 "use of undefined type id summary '^" +
495 Twine(ForwardRefTypeIds.begin()->first) +
"'");
509 std::string TentativeDLStr = M->getDataLayoutStr();
514 switch (Lex.getKind()) {
516 if (parseTargetDefinition(TentativeDLStr, DLStrLoc))
520 if (parseSourceFileName())
529 if (
auto LayoutOverride =
530 DataLayoutCallback(M->getTargetTriple().str(), TentativeDLStr)) {
531 TentativeDLStr = *LayoutOverride;
537 M->setDataLayout(MaybeDL.
get());
541bool LLParser::parseTopLevelEntities() {
545 switch (Lex.getKind()) {
549 if (parseSummaryEntry())
553 if (parseSourceFileName())
563 switch (Lex.getKind()) {
565 return tokError(
"expected top-level entity");
576 if (parseModuleAsm())
580 if (parseUnnamedType())
584 if (parseNamedType())
588 if (parseUnnamedGlobal())
592 if (parseNamedGlobal())
597 if (parseStandaloneMetadata())
601 if (parseSummaryEntry())
605 if (parseNamedMetadata())
609 if (parseUnnamedAttrGrp())
613 if (parseUseListOrder())
617 if (parseUseListOrderBB())
626bool LLParser::parseModuleAsm() {
632 parseStringConstant(AsmStr))
635 M->appendModuleInlineAsm(AsmStr);
642bool LLParser::parseTargetDefinition(std::string &TentativeDLStr,
648 return tokError(
"unknown target property");
651 if (parseToken(
lltok::equal,
"expected '=' after target triple") ||
652 parseStringConstant(Str))
654 M->setTargetTriple(Triple(std::move(Str)));
658 if (parseToken(
lltok::equal,
"expected '=' after target datalayout"))
660 DLStrLoc = Lex.getLoc();
661 if (parseStringConstant(TentativeDLStr))
669bool LLParser::parseSourceFileName() {
672 if (parseToken(
lltok::equal,
"expected '=' after source_filename") ||
673 parseStringConstant(SourceFileName))
676 M->setSourceFileName(SourceFileName);
682bool LLParser::parseUnnamedType() {
683 LocTy TypeLoc = Lex.getLoc();
684 unsigned TypeID = Lex.getUIntVal();
687 if (parseToken(
lltok::equal,
"expected '=' after name") ||
692 if (parseStructDefinition(TypeLoc,
"", NumberedTypes[
TypeID], Result))
696 std::pair<Type*, LocTy> &
Entry = NumberedTypes[
TypeID];
698 return error(TypeLoc,
"non-struct types may not be recursive");
700 Entry.second = SMLoc();
708bool LLParser::parseNamedType() {
709 std::string
Name = Lex.getStrVal();
710 LocTy NameLoc = Lex.getLoc();
713 if (parseToken(
lltok::equal,
"expected '=' after name") ||
718 if (parseStructDefinition(NameLoc, Name, NamedTypes[Name], Result))
722 std::pair<Type*, LocTy> &
Entry = NamedTypes[
Name];
724 return error(NameLoc,
"non-struct types may not be recursive");
726 Entry.second = SMLoc();
734bool LLParser::parseDeclare() {
738 std::vector<std::pair<unsigned, MDNode *>> MDs;
742 if (parseMetadataAttachment(MDK,
N))
744 MDs.push_back({MDK,
N});
748 unsigned FunctionNumber = -1;
749 SmallVector<unsigned> UnnamedArgNums;
750 if (parseFunctionHeader(
F,
false, FunctionNumber, UnnamedArgNums))
753 F->addMetadata(MD.first, *MD.second);
759bool LLParser::parseDefine() {
762 FileLoc FunctionStart = getTokLineColumnPos();
766 unsigned FunctionNumber = -1;
767 SmallVector<unsigned> UnnamedArgNums;
769 parseFunctionHeader(
F,
true, FunctionNumber, UnnamedArgNums) ||
770 parseOptionalFunctionMetadata(*
F) ||
771 parseFunctionBody(*
F, FunctionNumber, UnnamedArgNums);
773 ParserContext->addFunctionLocation(
774 F, FileLocRange(FunctionStart, getPrevTokEndLineColumnPos()));
782bool LLParser::parseGlobalType(
bool &IsConstant) {
789 return tokError(
"expected 'global' or 'constant'");
795bool LLParser::parseOptionalUnnamedAddr(
816bool LLParser::parseUnnamedGlobal() {
819 LocTy NameLoc = Lex.getLoc();
823 VarID = Lex.getUIntVal();
824 if (checkValueID(NameLoc,
"global",
"@", NumberedVals.getNext(),
VarID))
828 if (parseToken(
lltok::equal,
"expected '=' after name"))
831 VarID = NumberedVals.getNext();
835 unsigned Linkage, Visibility, DLLStorageClass;
839 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
841 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
844 switch (Lex.getKind()) {
846 return parseGlobal(Name,
VarID, NameLoc,
Linkage, HasLinkage, Visibility,
847 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
850 return parseAliasOrIFunc(Name,
VarID, NameLoc,
Linkage, Visibility,
851 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
860bool LLParser::parseNamedGlobal() {
862 LocTy NameLoc = Lex.getLoc();
863 std::string
Name = Lex.getStrVal();
867 unsigned Linkage, Visibility, DLLStorageClass;
871 if (parseToken(
lltok::equal,
"expected '=' in global variable") ||
872 parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
874 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
877 switch (Lex.getKind()) {
879 return parseGlobal(Name, -1, NameLoc,
Linkage, HasLinkage, Visibility,
880 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
883 return parseAliasOrIFunc(Name, -1, NameLoc,
Linkage, Visibility,
884 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
888bool LLParser::parseComdat() {
890 std::string
Name = Lex.getStrVal();
891 LocTy NameLoc = Lex.getLoc();
898 return tokError(
"expected comdat type");
901 switch (Lex.getKind()) {
903 return tokError(
"unknown selection kind");
925 if (
I != ComdatSymTab.
end() && !ForwardRefComdats.erase(Name))
926 return error(NameLoc,
"redefinition of comdat '$" + Name +
"'");
929 if (
I != ComdatSymTab.
end())
932 C = M->getOrInsertComdat(Name);
933 C->setSelectionKind(SK);
940bool LLParser::parseMDString(
MDString *&Result) {
942 if (parseStringConstant(Str))
950bool LLParser::parseMDNodeID(
MDNode *&Result) {
952 LocTy IDLoc = Lex.getLoc();
954 if (parseUInt32(MID))
958 auto [It,
Inserted] = NumberedMetadata.try_emplace(MID);
965 auto &FwdRef = ForwardRefMDNodes[MID];
968 Result = FwdRef.first.get();
969 It->second.reset(Result);
975bool LLParser::parseNamedMetadata() {
977 std::string
Name = Lex.getStrVal();
985 NamedMDNode *NMD = M->getOrInsertNamedMetadata(Name);
993 Lex.getStrVal() ==
"DIExpression") {
994 if (parseDIExpression(
N,
false))
999 Lex.getStrVal() ==
"DIArgList") {
1000 return tokError(
"found DIArgList outside of function");
1008 return parseToken(
lltok::rbrace,
"expected end of metadata node");
1013bool LLParser::parseStandaloneMetadata() {
1016 unsigned MetadataID = 0;
1019 if (parseUInt32(MetadataID) || parseToken(
lltok::equal,
"expected '=' here"))
1024 return tokError(
"unexpected type in metadata definition");
1028 if (parseSpecializedMDNode(Init, IsDistinct))
1031 parseMDTuple(Init, IsDistinct))
1035 auto FI = ForwardRefMDNodes.find(MetadataID);
1036 if (FI != ForwardRefMDNodes.end()) {
1037 auto *ToReplace = FI->second.first.get();
1041 for (
auto *Inst : TempDIAssignIDAttachments[ToReplace]) {
1042 assert(!Inst->getMetadata(LLVMContext::MD_DIAssignID) &&
1043 "Inst unexpectedly already has DIAssignID attachment");
1044 Inst->setMetadata(LLVMContext::MD_DIAssignID, Init);
1048 ToReplace->replaceAllUsesWith(Init);
1049 ForwardRefMDNodes.erase(FI);
1051 assert(NumberedMetadata[MetadataID] == Init &&
"Tracking VH didn't work");
1053 auto [It,
Inserted] = NumberedMetadata.try_emplace(MetadataID);
1055 return tokError(
"Metadata id is already used");
1056 It->second.reset(Init);
1063bool LLParser::skipModuleSummaryEntry() {
1073 "Expected 'gv', 'module', 'typeid', 'flags' or 'blockcount' at the "
1074 "start of summary entry");
1076 return parseSummaryIndexFlags();
1078 return parseBlockCount();
1080 if (parseToken(
lltok::colon,
"expected ':' at start of summary entry") ||
1081 parseToken(
lltok::lparen,
"expected '(' at start of summary entry"))
1085 unsigned NumOpenParen = 1;
1087 switch (Lex.getKind()) {
1095 return tokError(
"found end of file while parsing summary entry");
1101 }
while (NumOpenParen > 0);
1107bool LLParser::parseSummaryEntry() {
1113 Lex.setIgnoreColonInIdentifiers(
true);
1121 return skipModuleSummaryEntry();
1123 bool result =
false;
1124 switch (Lex.getKind()) {
1126 result = parseGVEntry(SummaryID);
1129 result = parseModuleEntry(SummaryID);
1132 result = parseTypeIdEntry(SummaryID);
1135 result = parseTypeIdCompatibleVtableEntry(SummaryID);
1138 result = parseSummaryIndexFlags();
1141 result = parseBlockCount();
1144 result =
error(Lex.getLoc(),
"unexpected summary kind");
1147 Lex.setIgnoreColonInIdentifiers(
false);
1181bool LLParser::parseAliasOrIFunc(
const std::string &Name,
unsigned NameID,
1182 LocTy NameLoc,
unsigned L,
unsigned Visibility,
1183 unsigned DLLStorageClass,
bool DSOLocal,
1198 return error(NameLoc,
"invalid linkage type for alias");
1201 return error(NameLoc,
1202 "symbol with local linkage must have default visibility");
1205 return error(NameLoc,
1206 "symbol with local linkage cannot have a DLL storage class");
1209 LocTy ExplicitTypeLoc = Lex.getLoc();
1210 if (parseType(Ty) ||
1211 parseToken(
lltok::comma,
"expected comma after alias or ifunc's type"))
1215 LocTy AliaseeLoc = Lex.getLoc();
1220 if (parseGlobalTypeAndValue(Aliasee))
1225 if (parseValID(
ID,
nullptr))
1228 return error(AliaseeLoc,
"invalid aliasee");
1229 Aliasee =
ID.ConstantVal;
1235 return error(AliaseeLoc,
"An alias or ifunc must have pointer type");
1236 unsigned AddrSpace = PTy->getAddressSpace();
1238 GlobalValue *GVal =
nullptr;
1242 if (!
Name.empty()) {
1243 auto I = ForwardRefVals.find(Name);
1244 if (
I != ForwardRefVals.end()) {
1245 GVal =
I->second.first;
1246 ForwardRefVals.erase(Name);
1247 }
else if (M->getNamedValue(Name)) {
1248 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1251 auto I = ForwardRefValIDs.find(NameID);
1252 if (
I != ForwardRefValIDs.end()) {
1253 GVal =
I->second.first;
1254 ForwardRefValIDs.erase(
I);
1259 std::unique_ptr<GlobalAlias> GA;
1260 std::unique_ptr<GlobalIFunc> GI;
1288 if (parseGlobalObjectMetadataAttachment(*GI))
1291 return tokError(
"unknown alias or ifunc property!");
1296 NumberedVals.add(NameID, GV);
1303 "forward reference and definition of alias have different types");
1313 M->insertAlias(GA.release());
1315 M->insertIFunc(GI.release());
1316 assert(GV->
getName() == Name &&
"Should not be a name conflict!");
1325 case lltok::kw_sanitize_memtag:
1339 switch (Lex.getKind()) {
1341 Meta.NoAddress =
true;
1344 Meta.NoHWAddress =
true;
1346 case lltok::kw_sanitize_memtag:
1350 Meta.IsDynInit =
true;
1353 return tokError(
"non-sanitizer token passed to LLParser::parseSanitizer()");
1373bool LLParser::parseGlobal(
const std::string &Name,
unsigned NameID,
1374 LocTy NameLoc,
unsigned Linkage,
bool HasLinkage,
1375 unsigned Visibility,
unsigned DLLStorageClass,
1379 return error(NameLoc,
1380 "symbol with local linkage must have default visibility");
1383 return error(NameLoc,
1384 "symbol with local linkage cannot have a DLL storage class");
1388 LocTy IsExternallyInitializedLoc;
1392 if (parseOptionalAddrSpace(AddrSpace) ||
1394 IsExternallyInitialized,
1395 &IsExternallyInitializedLoc) ||
1396 parseGlobalType(IsConstant) || parseType(Ty, TyLoc))
1405 if (parseGlobalValue(Ty, Init))
1410 return error(TyLoc,
"invalid type for global variable");
1412 GlobalValue *GVal =
nullptr;
1415 if (!
Name.empty()) {
1416 auto I = ForwardRefVals.find(Name);
1417 if (
I != ForwardRefVals.end()) {
1418 GVal =
I->second.first;
1419 ForwardRefVals.erase(
I);
1420 }
else if (M->getNamedValue(Name)) {
1421 return error(NameLoc,
"redefinition of global '@" + Name +
"'");
1426 if (NameID == (
unsigned)-1)
1427 NameID = NumberedVals.getNext();
1429 auto I = ForwardRefValIDs.find(NameID);
1430 if (
I != ForwardRefValIDs.end()) {
1431 GVal =
I->second.first;
1432 ForwardRefValIDs.erase(
I);
1436 GlobalVariable *GV =
new GlobalVariable(
1441 NumberedVals.add(NameID, GV);
1459 "forward reference and definition of global have different types");
1479 }
else if (Lex.getKind() == lltok::kw_align) {
1480 MaybeAlign Alignment;
1481 if (parseOptionalAlignment(Alignment))
1487 if (parseOptionalCodeModel(CodeModel))
1491 if (parseGlobalObjectMetadataAttachment(*GV))
1494 if (parseSanitizer(GV))
1498 if (parseOptionalComdat(Name,
C))
1503 return tokError(
"unknown global variable property!");
1507 AttrBuilder
Attrs(M->getContext());
1509 std::vector<unsigned> FwdRefAttrGrps;
1510 if (parseFnAttributeValuePairs(Attrs, FwdRefAttrGrps,
false, BuiltinLoc))
1512 if (
Attrs.hasAttributes() || !FwdRefAttrGrps.empty()) {
1514 ForwardRefAttrGroups[GV] = FwdRefAttrGrps;
1522bool LLParser::parseUnnamedAttrGrp() {
1524 LocTy AttrGrpLoc = Lex.getLoc();
1528 return tokError(
"expected attribute group id");
1530 unsigned VarID = Lex.getUIntVal();
1531 std::vector<unsigned> unused;
1539 auto R = NumberedAttrBuilders.find(
VarID);
1540 if (R == NumberedAttrBuilders.end())
1541 R = NumberedAttrBuilders.emplace(
VarID, AttrBuilder(M->getContext())).first;
1543 if (parseFnAttributeValuePairs(
R->second, unused,
true, BuiltinLoc) ||
1544 parseToken(
lltok::rbrace,
"expected end of attribute group"))
1547 if (!
R->second.hasAttributes())
1548 return error(AttrGrpLoc,
"attribute group has no attributes");
1555#define GET_ATTR_NAMES
1556#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME) \
1557 case lltok::kw_##DISPLAY_NAME: \
1558 return Attribute::ENUM_NAME;
1559#include "llvm/IR/Attributes.inc"
1568 return parseRequiredTypeAttr(
B, Lex.getKind(), Attr);
1571 case Attribute::Alignment: {
1572 MaybeAlign Alignment;
1580 if (parseOptionalAlignment(Alignment,
true))
1583 B.addAlignmentAttr(Alignment);
1586 case Attribute::StackAlignment: {
1591 parseUInt32(Alignment))
1594 if (parseOptionalStackAlignment(Alignment))
1597 B.addStackAlignmentAttr(Alignment);
1600 case Attribute::AllocSize: {
1601 unsigned ElemSizeArg;
1602 std::optional<unsigned> NumElemsArg;
1603 if (parseAllocSizeArguments(ElemSizeArg, NumElemsArg))
1605 B.addAllocSizeAttr(ElemSizeArg, NumElemsArg);
1608 case Attribute::VScaleRange: {
1609 unsigned MinValue, MaxValue;
1610 if (parseVScaleRangeArguments(MinValue, MaxValue))
1612 B.addVScaleRangeAttr(MinValue,
1613 MaxValue > 0 ? MaxValue : std::optional<unsigned>());
1616 case Attribute::Dereferenceable: {
1617 std::optional<uint64_t> Bytes;
1618 if (parseOptionalAttrBytes(lltok::kw_dereferenceable, Bytes))
1620 assert(Bytes.has_value());
1621 B.addDereferenceableAttr(Bytes.value());
1624 case Attribute::DeadOnReturn: {
1625 std::optional<uint64_t> Bytes;
1626 if (parseOptionalAttrBytes(lltok::kw_dead_on_return, Bytes,
1629 if (Bytes.has_value()) {
1630 B.addDeadOnReturnAttr(DeadOnReturnInfo(Bytes.value()));
1632 B.addDeadOnReturnAttr(DeadOnReturnInfo());
1636 case Attribute::DereferenceableOrNull: {
1637 std::optional<uint64_t> Bytes;
1638 if (parseOptionalAttrBytes(lltok::kw_dereferenceable_or_null, Bytes))
1640 assert(Bytes.has_value());
1641 B.addDereferenceableOrNullAttr(Bytes.value());
1644 case Attribute::UWTable: {
1646 if (parseOptionalUWTableKind(Kind))
1648 B.addUWTableAttr(Kind);
1651 case Attribute::AllocKind: {
1653 if (parseAllocKind(Kind))
1655 B.addAllocKindAttr(Kind);
1658 case Attribute::Memory: {
1659 std::optional<MemoryEffects> ME = parseMemoryAttr();
1662 B.addMemoryAttr(*ME);
1665 case Attribute::DenormalFPEnv: {
1666 std::optional<DenormalFPEnv>
Mode = parseDenormalFPEnvAttr();
1670 B.addDenormalFPEnvAttr(*
Mode);
1673 case Attribute::NoFPClass: {
1676 B.addNoFPClassAttr(NoFPClass);
1682 case Attribute::Range:
1683 return parseRangeAttr(
B);
1684 case Attribute::Initializes:
1685 return parseInitializesAttr(
B);
1686 case Attribute::Captures:
1687 return parseCapturesAttr(
B);
1689 B.addAttribute(Attr);
1697 case lltok::kw_readnone:
1700 case lltok::kw_readonly:
1703 case lltok::kw_writeonly:
1722bool LLParser::parseFnAttributeValuePairs(AttrBuilder &
B,
1723 std::vector<unsigned> &FwdRefAttrGrps,
1724 bool InAttrGrp, LocTy &BuiltinLoc) {
1725 bool HaveError =
false;
1736 if (parseStringAttribute(
B))
1748 "cannot have an attribute group reference in an attribute group");
1751 FwdRefAttrGrps.push_back(Lex.getUIntVal());
1757 SMLoc Loc = Lex.getLoc();
1758 if (Token == lltok::kw_builtin)
1770 return error(Lex.getLoc(),
"unterminated attribute group");
1773 if (parseEnumAttribute(Attr,
B, InAttrGrp))
1780 HaveError |=
error(Loc,
"this attribute does not apply to functions");
1784 B.addMemoryAttr(ME);
1798 PTy->getAddressSpace());
1807 error(Loc,
"'" + Name +
"' is not a basic block");
1809 error(Loc,
"'" + Name +
"' defined with type '" +
1822 error(Loc,
"global variable reference must have pointer type");
1833 auto I = ForwardRefVals.find(Name);
1834 if (
I != ForwardRefVals.end())
1835 Val =
I->second.first;
1841 checkValidVariableType(Loc,
"@" + Name, Ty, Val));
1845 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
1852 error(Loc,
"global variable reference must have pointer type");
1856 GlobalValue *Val = NumberedVals.get(
ID);
1861 auto I = ForwardRefValIDs.find(
ID);
1862 if (
I != ForwardRefValIDs.end())
1863 Val =
I->second.first;
1869 checkValidVariableType(Loc,
"@" + Twine(
ID), Ty, Val));
1873 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
1881Comdat *LLParser::getComdat(
const std::string &Name, LocTy
Loc) {
1885 if (
I != ComdatSymTab.
end())
1889 Comdat *
C = M->getOrInsertComdat(Name);
1890 ForwardRefComdats[
Name] = Loc;
1900bool LLParser::parseToken(
lltok::Kind T,
const char *ErrMsg) {
1901 if (Lex.getKind() !=
T)
1902 return tokError(ErrMsg);
1909bool LLParser::parseStringConstant(std::string &Result) {
1911 return tokError(
"expected string constant");
1912 Result = Lex.getStrVal();
1919bool LLParser::parseUInt32(uint32_t &Val) {
1920 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1921 return tokError(
"expected integer");
1922 uint64_t Val64 = Lex.getAPSIntVal().getLimitedValue(0xFFFFFFFFULL+1);
1923 if (Val64 !=
unsigned(Val64))
1924 return tokError(
"expected 32-bit integer (too large)");
1932bool LLParser::parseUInt64(uint64_t &Val) {
1933 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
1934 return tokError(
"expected integer");
1935 Val = Lex.getAPSIntVal().getLimitedValue();
1945 switch (Lex.getKind()) {
1947 return tokError(
"expected localdynamic, initialexec or localexec");
1975 return parseTLSModel(TLM) ||
1976 parseToken(
lltok::rparen,
"expected ')' after thread local model");
1984bool LLParser::parseOptionalAddrSpace(
unsigned &AddrSpace,
unsigned DefaultAS) {
1985 AddrSpace = DefaultAS;
1989 auto ParseAddrspaceValue = [&](
unsigned &AddrSpace) ->
bool {
1991 const std::string &AddrSpaceStr = Lex.getStrVal();
1992 if (AddrSpaceStr ==
"A") {
1993 AddrSpace = M->getDataLayout().getAllocaAddrSpace();
1994 }
else if (AddrSpaceStr ==
"G") {
1995 AddrSpace = M->getDataLayout().getDefaultGlobalsAddressSpace();
1996 }
else if (AddrSpaceStr ==
"P") {
1997 AddrSpace = M->getDataLayout().getProgramAddressSpace();
1998 }
else if (std::optional<unsigned> AS =
1999 M->getDataLayout().getNamedAddressSpace(AddrSpaceStr)) {
2002 return tokError(
"invalid symbolic addrspace '" + AddrSpaceStr +
"'");
2008 return tokError(
"expected integer or string constant");
2009 SMLoc Loc = Lex.getLoc();
2010 if (parseUInt32(AddrSpace))
2013 return error(Loc,
"invalid address space, must be a 24-bit integer");
2017 return parseToken(
lltok::lparen,
"expected '(' in address space") ||
2018 ParseAddrspaceValue(AddrSpace) ||
2025bool LLParser::parseStringAttribute(AttrBuilder &
B) {
2026 std::string Attr = Lex.getStrVal();
2029 if (EatIfPresent(
lltok::equal) && parseStringConstant(Val))
2031 B.addAttribute(Attr, Val);
2036bool LLParser::parseOptionalParamOrReturnAttrs(AttrBuilder &
B,
bool IsParam) {
2037 bool HaveError =
false;
2044 if (parseStringAttribute(
B))
2055 SMLoc Loc = Lex.getLoc();
2060 if (parseEnumAttribute(Attr,
B,
false))
2064 HaveError |=
error(Loc,
"this attribute does not apply to parameters");
2066 HaveError |=
error(Loc,
"this attribute does not apply to return values");
2114bool LLParser::parseOptionalLinkage(
unsigned &Res,
bool &HasLinkage,
2115 unsigned &Visibility,
2116 unsigned &DLLStorageClass,
bool &DSOLocal) {
2120 parseOptionalDSOLocal(DSOLocal);
2121 parseOptionalVisibility(Visibility);
2122 parseOptionalDLLStorageClass(DLLStorageClass);
2125 return error(Lex.getLoc(),
"dso_location and DLL-StorageClass mismatch");
2131void LLParser::parseOptionalDSOLocal(
bool &DSOLocal) {
2132 switch (Lex.getKind()) {
2153void LLParser::parseOptionalVisibility(
unsigned &Res) {
2154 switch (Lex.getKind()) {
2171bool LLParser::parseOptionalImportType(
lltok::Kind Kind,
2175 return tokError(
"unknown import kind. Expect definition or declaration.");
2190void LLParser::parseOptionalDLLStorageClass(
unsigned &Res) {
2191 switch (Lex.getKind()) {
2261bool LLParser::parseOptionalCallingConv(
unsigned &CC) {
2262 switch (Lex.getKind()) {
2349 return tokError(
"unknown RISC-V ABI VLEN");
2350#define CC_VLS_CASE(ABIVlen) \
2352 CC = CallingConv::RISCV_VLSCall_##ABIVlen; \
2380 return parseUInt32(CC);
2390bool LLParser::parseMetadataAttachment(
unsigned &Kind,
MDNode *&MD) {
2393 std::string
Name = Lex.getStrVal();
2394 Kind = M->getMDKindID(Name);
2397 return parseMDNode(MD);
2402bool LLParser::parseInstructionMetadata(
Instruction &Inst) {
2405 return tokError(
"expected metadata after comma");
2409 if (parseMetadataAttachment(MDK,
N))
2412 if (MDK == LLVMContext::MD_DIAssignID)
2413 TempDIAssignIDAttachments[
N].push_back(&Inst);
2417 if (MDK == LLVMContext::MD_tbaa)
2418 InstsWithTBAATag.push_back(&Inst);
2427bool LLParser::parseGlobalObjectMetadataAttachment(
GlobalObject &GO) {
2430 if (parseMetadataAttachment(MDK,
N))
2439bool LLParser::parseOptionalFunctionMetadata(
Function &
F) {
2441 if (parseGlobalObjectMetadataAttachment(
F))
2449bool LLParser::parseOptionalAlignment(
MaybeAlign &Alignment,
bool AllowParens) {
2450 Alignment = std::nullopt;
2451 if (!EatIfPresent(lltok::kw_align))
2453 LocTy AlignLoc = Lex.getLoc();
2456 LocTy ParenLoc = Lex.getLoc();
2457 bool HaveParens =
false;
2463 if (parseUInt64(
Value))
2467 return error(ParenLoc,
"expected ')'");
2470 return error(AlignLoc,
"alignment is not a power of two");
2472 return error(AlignLoc,
"huge alignments are not supported yet");
2480bool LLParser::parseOptionalPrefAlignment(
MaybeAlign &Alignment) {
2481 Alignment = std::nullopt;
2484 LocTy AlignLoc = Lex.getLoc();
2487 LocTy ParenLoc = Lex.getLoc();
2489 return error(ParenLoc,
"expected '('");
2491 if (parseUInt64(
Value))
2494 ParenLoc = Lex.getLoc();
2496 return error(ParenLoc,
"expected ')'");
2499 return error(AlignLoc,
"alignment is not a power of two");
2501 return error(AlignLoc,
"huge alignments are not supported yet");
2511 auto StrVal = Lex.getStrVal();
2512 auto ErrMsg =
"expected global code model string";
2513 if (StrVal ==
"tiny")
2515 else if (StrVal ==
"small")
2517 else if (StrVal ==
"kernel")
2519 else if (StrVal ==
"medium")
2521 else if (StrVal ==
"large")
2524 return tokError(ErrMsg);
2536bool LLParser::parseOptionalAttrBytes(
lltok::Kind AttrKind,
2537 std::optional<uint64_t> &Bytes,
2538 bool ErrorNoBytes) {
2539 assert((AttrKind == lltok::kw_dereferenceable ||
2540 AttrKind == lltok::kw_dereferenceable_or_null ||
2541 AttrKind == lltok::kw_dead_on_return) &&
2545 if (!EatIfPresent(AttrKind))
2547 LocTy ParenLoc = Lex.getLoc();
2550 return error(ParenLoc,
"expected '('");
2551 Bytes = std::nullopt;
2554 LocTy DerefLoc = Lex.getLoc();
2555 if (parseUInt64(Bytes.value()))
2557 ParenLoc = Lex.getLoc();
2559 return error(ParenLoc,
"expected ')'");
2561 return error(DerefLoc,
"byte count specified must be non-zero");
2565bool LLParser::parseOptionalUWTableKind(
UWTableKind &Kind) {
2570 LocTy KindLoc = Lex.getLoc();
2576 return error(KindLoc,
"expected unwind table kind");
2583 LocTy ParenLoc = Lex.getLoc();
2585 return error(ParenLoc,
"expected '('");
2586 LocTy KindLoc = Lex.getLoc();
2588 if (parseStringConstant(Arg))
2589 return error(KindLoc,
"expected allockind value");
2593 }
else if (
A ==
"realloc") {
2595 }
else if (
A ==
"free") {
2597 }
else if (
A ==
"uninitialized") {
2599 }
else if (
A ==
"zeroed") {
2601 }
else if (
A ==
"aligned") {
2604 return error(KindLoc, Twine(
"unknown allockind ") +
A);
2607 ParenLoc = Lex.getLoc();
2609 return error(ParenLoc,
"expected ')'");
2611 return error(KindLoc,
"expected allockind value");
2620 return {Loc::ArgMem};
2622 return {Loc::InaccessibleMem};
2624 return {Loc::ErrnoMem};
2626 return {Loc::TargetMem0};
2628 return {Loc::TargetMem1};
2651 return std::nullopt;
2655static std::optional<DenormalMode::DenormalModeKind>
2667 return std::nullopt;
2671std::optional<MemoryEffects> LLParser::parseMemoryAttr() {
2676 Lex.setIgnoreColonInIdentifiers(
true);
2681 tokError(
"expected '('");
2682 return std::nullopt;
2685 bool SeenLoc =
false;
2686 bool SeenTargetLoc =
false;
2689 if (!Locs.
empty()) {
2692 tokError(
"expected ':' after location");
2693 return std::nullopt;
2700 tokError(
"expected memory location (argmem, inaccessiblemem, errnomem) "
2701 "or access kind (none, read, write, readwrite)");
2703 tokError(
"expected access kind (none, read, write, readwrite)");
2704 return std::nullopt;
2708 if (!Locs.
empty()) {
2713 SeenTargetLoc =
true;
2715 if (Locs.size() > 1 && SeenTargetLoc) {
2716 tokError(
"target memory default access kind must be specified first");
2717 return std::nullopt;
2722 tokError(
"default access kind must be specified first");
2723 return std::nullopt;
2732 tokError(
"unterminated memory attribute");
2733 return std::nullopt;
2736std::optional<DenormalMode> LLParser::parseDenormalFPEnvEntry() {
2737 std::optional<DenormalMode::DenormalModeKind> OutputMode =
2740 tokError(
"expected denormal behavior kind (ieee, preservesign, "
2741 "positivezero, dynamic)");
2747 std::optional<DenormalMode::DenormalModeKind> InputMode;
2751 tokError(
"expected denormal behavior kind (ieee, preservesign, "
2752 "positivezero, dynamic)");
2759 InputMode = OutputMode;
2762 return DenormalMode(*OutputMode, *InputMode);
2765std::optional<DenormalFPEnv> LLParser::parseDenormalFPEnvAttr() {
2768 Lex.setIgnoreColonInIdentifiers(
true);
2779 bool HasDefaultSection =
false;
2781 std::optional<DenormalMode> ParsedDefaultMode = parseDenormalFPEnvEntry();
2782 if (!ParsedDefaultMode)
2784 DefaultMode = *ParsedDefaultMode;
2785 HasDefaultSection =
true;
2790 if (HasDefaultSection && !HasComma) {
2791 tokError(
"expected ',' before float:");
2796 if (parseType(Ty) || !Ty->
isFloatTy()) {
2797 tokError(
"expected float:");
2801 if (parseToken(
lltok::colon,
"expected ':' before float denormal_fpenv"))
2804 std::optional<DenormalMode> ParsedF32Mode = parseDenormalFPEnvEntry();
2808 F32Mode = *ParsedF32Mode;
2811 if (parseToken(
lltok::rparen,
"unterminated denormal_fpenv"))
2814 return DenormalFPEnv(DefaultMode, F32Mode);
2856unsigned LLParser::parseNoFPClassAttr() {
2861 tokError(
"expected '('");
2868 if (TestMask != 0) {
2872 !parseUInt64(
Value)) {
2874 error(Lex.getLoc(),
"invalid mask value for 'nofpclass'");
2879 error(Lex.getLoc(),
"expected ')'");
2885 error(Lex.getLoc(),
"expected nofpclass test mask");
2903bool LLParser::parseOptionalCommaAlign(
MaybeAlign &Alignment,
2904 bool &AteExtraComma) {
2905 AteExtraComma =
false;
2909 AteExtraComma =
true;
2913 if (Lex.getKind() != lltok::kw_align)
2914 return error(Lex.getLoc(),
"expected metadata or 'align'");
2916 if (parseOptionalAlignment(Alignment))
2929bool LLParser::parseOptionalCommaAddrSpace(
unsigned &AddrSpace, LocTy &
Loc,
2930 bool &AteExtraComma) {
2931 AteExtraComma =
false;
2935 AteExtraComma =
true;
2941 return error(Lex.getLoc(),
"expected metadata or 'addrspace'");
2943 if (parseOptionalAddrSpace(AddrSpace))
2950bool LLParser::parseAllocSizeArguments(
unsigned &BaseSizeArg,
2951 std::optional<unsigned> &HowManyArg) {
2954 auto StartParen = Lex.getLoc();
2956 return error(StartParen,
"expected '('");
2958 if (parseUInt32(BaseSizeArg))
2962 auto HowManyAt = Lex.getLoc();
2964 if (parseUInt32(HowMany))
2966 if (HowMany == BaseSizeArg)
2967 return error(HowManyAt,
2968 "'allocsize' indices can't refer to the same parameter");
2969 HowManyArg = HowMany;
2971 HowManyArg = std::nullopt;
2973 auto EndParen = Lex.getLoc();
2975 return error(EndParen,
"expected ')'");
2979bool LLParser::parseVScaleRangeArguments(
unsigned &MinValue,
2980 unsigned &MaxValue) {
2983 auto StartParen = Lex.getLoc();
2985 return error(StartParen,
"expected '('");
2987 if (parseUInt32(MinValue))
2991 if (parseUInt32(MaxValue))
2994 MaxValue = MinValue;
2996 auto EndParen = Lex.getLoc();
2998 return error(EndParen,
"expected ')'");
3007bool LLParser::parseScopeAndOrdering(
bool IsAtomic,
SyncScope::ID &SSID,
3012 return parseScope(SSID) || parseOrdering(Ordering);
3022 auto StartParenAt = Lex.getLoc();
3024 return error(StartParenAt,
"Expected '(' in syncscope");
3027 auto SSNAt = Lex.getLoc();
3028 if (parseStringConstant(SSN))
3029 return error(SSNAt,
"Expected synchronization scope name");
3031 auto EndParenAt = Lex.getLoc();
3033 return error(EndParenAt,
"Expected ')' in syncscope");
3035 SSID = Context.getOrInsertSyncScopeID(SSN);
3046 switch (Lex.getKind()) {
3048 return tokError(
"Expected ordering on atomic instruction");
3067bool LLParser::parseOptionalStackAlignment(
unsigned &Alignment) {
3069 if (!EatIfPresent(lltok::kw_alignstack))
3071 LocTy ParenLoc = Lex.getLoc();
3073 return error(ParenLoc,
"expected '('");
3074 LocTy AlignLoc = Lex.getLoc();
3075 if (parseUInt32(Alignment))
3077 ParenLoc = Lex.getLoc();
3079 return error(ParenLoc,
"expected ')'");
3081 return error(AlignLoc,
"stack alignment is not a power of two");
3095 bool &AteExtraComma) {
3096 AteExtraComma =
false;
3099 return tokError(
"expected ',' as start of index list");
3103 if (Indices.
empty())
3104 return tokError(
"expected index");
3105 AteExtraComma =
true;
3109 if (parseUInt32(Idx))
3122bool LLParser::parseType(
Type *&Result,
const Twine &Msg,
bool AllowVoid) {
3123 SMLoc TypeLoc = Lex.getLoc();
3124 switch (Lex.getKind()) {
3126 return tokError(Msg);
3135 if (
Result->isPointerTy()) {
3137 if (parseOptionalAddrSpace(AddrSpace))
3143 return tokError(
"ptr* is invalid - use ptr instead");
3154 if (parseTargetExtType(Result))
3160 if (parseAnonStructType(Result,
false))
3166 if (parseArrayVectorType(Result,
false))
3173 if (parseAnonStructType(Result,
true) ||
3174 parseToken(
lltok::greater,
"expected '>' at end of packed struct"))
3176 }
else if (parseArrayVectorType(Result,
true))
3181 std::pair<Type*, LocTy> &
Entry = NamedTypes[Lex.getStrVal()];
3187 Entry.second = Lex.getLoc();
3196 std::pair<Type*, LocTy> &
Entry = NumberedTypes[Lex.getUIntVal()];
3202 Entry.second = Lex.getLoc();
3212 switch (Lex.getKind()) {
3215 if (!AllowVoid &&
Result->isVoidTy())
3216 return error(TypeLoc,
"void type only allowed for function results");
3222 return tokError(
"basic block pointers are invalid");
3224 return tokError(
"pointers to void are invalid - use i8* instead");
3226 return tokError(
"pointer to this type is invalid");
3234 return tokError(
"basic block pointers are invalid");
3236 return tokError(
"pointers to void are invalid; use i8* instead");
3238 return tokError(
"pointer to this type is invalid");
3240 if (parseOptionalAddrSpace(AddrSpace) ||
3241 parseToken(
lltok::star,
"expected '*' in address space"))
3250 if (parseFunctionType(Result))
3263 PerFunctionState &PFS,
bool IsMustTailCall,
3264 bool InVarArgsFunc) {
3270 if (!ArgList.
empty() &&
3271 parseToken(
lltok::comma,
"expected ',' in argument list"))
3276 const char *Msg =
"unexpected ellipsis in argument list for ";
3277 if (!IsMustTailCall)
3278 return tokError(Twine(Msg) +
"non-musttail call");
3280 return tokError(Twine(Msg) +
"musttail call in non-varargs function");
3282 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3287 Type *ArgTy =
nullptr;
3289 if (parseType(ArgTy, ArgLoc))
3292 return error(ArgLoc,
"invalid type for function argument");
3294 AttrBuilder ArgAttrs(M->getContext());
3297 if (parseMetadataAsValue(V, PFS))
3301 if (parseOptionalParamAttrs(ArgAttrs) || parseValue(ArgTy, V, PFS))
3308 if (IsMustTailCall && InVarArgsFunc)
3309 return tokError(
"expected '...' at end of argument list for musttail call "
3310 "in varargs function");
3318bool LLParser::parseRequiredTypeAttr(AttrBuilder &
B,
lltok::Kind AttrToken,
3321 if (!EatIfPresent(AttrToken))
3324 return error(Lex.getLoc(),
"expected '('");
3328 return error(Lex.getLoc(),
"expected ')'");
3330 B.addTypeAttr(AttrKind, Ty);
3336bool LLParser::parseRangeAttr(AttrBuilder &
B) {
3344 auto ParseAPSInt = [&](
unsigned BitWidth, APInt &Val) {
3346 return tokError(
"expected integer");
3347 if (Lex.getAPSIntVal().getBitWidth() >
BitWidth)
3349 "integer is too large for the bit width of specified type");
3350 Val = Lex.getAPSIntVal().extend(
BitWidth);
3355 if (parseToken(
lltok::lparen,
"expected '('") || parseType(Ty, TyLoc))
3358 return error(TyLoc,
"the range must have integer type!");
3366 return tokError(
"the range represent the empty set but limits aren't 0!");
3377bool LLParser::parseInitializesAttr(AttrBuilder &
B) {
3380 auto ParseAPSInt = [&](APInt &Val) {
3382 return tokError(
"expected integer");
3383 Val = Lex.getAPSIntVal().extend(64);
3403 return tokError(
"the range should not represent the full or empty set!");
3415 if (!CRLOrNull.has_value())
3416 return tokError(
"Invalid (unordered or overlapping) range list");
3417 B.addInitializesAttr(*CRLOrNull);
3421bool LLParser::parseCapturesAttr(AttrBuilder &
B) {
3423 std::optional<CaptureComponents> Ret;
3427 Lex.setIgnoreColonInIdentifiers(
true);
3435 bool SeenComponent =
false;
3441 return tokError(
"duplicate 'ret' location");
3444 SeenComponent =
false;
3449 return tokError(
"cannot use 'none' with other component");
3453 return tokError(
"cannot use 'none' with other component");
3464 return tokError(
"expected one of 'none', 'address', 'address_is_null', "
3465 "'provenance' or 'read_provenance'");
3468 SeenComponent =
true;
3476 B.addCapturesAttr(CaptureInfo(
Other, Ret.value_or(
Other)));
3489bool LLParser::parseOptionalOperandBundles(
3491 LocTy BeginLoc = Lex.getLoc();
3497 if (!BundleList.
empty() &&
3498 parseToken(
lltok::comma,
"expected ',' in input list"))
3502 if (parseStringConstant(
Tag))
3505 if (parseToken(
lltok::lparen,
"expected '(' in operand bundle"))
3508 std::vector<Value *> Inputs;
3511 if (!Inputs.empty() &&
3512 parseToken(
lltok::comma,
"expected ',' in input list"))
3516 Value *Input =
nullptr;
3520 if (parseMetadataAsValue(Input, PFS))
3522 }
else if (parseValue(Ty, Input, PFS)) {
3525 Inputs.push_back(Input);
3533 if (BundleList.
empty())
3534 return error(BeginLoc,
"operand bundle set must not be empty");
3541 unsigned NextID,
unsigned ID) {
3543 return error(Loc, Kind +
" expected to be numbered '" + Prefix +
3544 Twine(NextID) +
"' or greater");
3561 unsigned CurValID = 0;
3575 LocTy TypeLoc = Lex.getLoc();
3576 Type *ArgTy =
nullptr;
3577 AttrBuilder
Attrs(M->getContext());
3578 if (parseType(ArgTy) || parseOptionalParamAttrs(Attrs))
3582 return error(TypeLoc,
"argument can not have void type");
3587 bool Unnamed =
false;
3589 Name = Lex.getStrVal();
3590 IdentStart = getTokLineColumnPos();
3592 IdentEnd = getPrevTokEndLineColumnPos();
3596 ArgID = Lex.getUIntVal();
3597 IdentStart = getTokLineColumnPos();
3598 if (checkValueID(TypeLoc,
"argument",
"%", CurValID, ArgID))
3601 IdentEnd = getPrevTokEndLineColumnPos();
3607 CurValID = ArgID + 1;
3611 return error(TypeLoc,
"invalid type for function argument");
3615 Unnamed ? std::nullopt
3616 : std::make_optional(FileLocRange(IdentStart, IdentEnd)),
3621 return parseToken(
lltok::rparen,
"expected ')' at end of argument list");
3626bool LLParser::parseFunctionType(
Type *&Result) {
3630 return tokError(
"invalid function return type");
3634 SmallVector<unsigned> UnnamedArgNums;
3635 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg))
3639 for (
const ArgInfo &Arg : ArgList) {
3640 if (!Arg.Name.empty())
3641 return error(Arg.Loc,
"argument name invalid in function type");
3642 if (Arg.Attrs.hasAttributes())
3643 return error(Arg.Loc,
"argument attributes invalid in function type");
3647 for (
const ArgInfo &Arg : ArgList)
3656bool LLParser::parseAnonStructType(
Type *&Result,
bool Packed) {
3658 if (parseStructBody(Elts))
3666bool LLParser::parseStructDefinition(
SMLoc TypeLoc,
StringRef Name,
3667 std::pair<Type *, LocTy> &Entry,
3671 return error(TypeLoc,
"redefinition of type");
3677 Entry.second = SMLoc();
3682 ResultTy =
Entry.first;
3694 return error(TypeLoc,
"forward references to non-struct type");
3698 return parseArrayVectorType(ResultTy,
true);
3699 return parseType(ResultTy);
3703 Entry.second = SMLoc();
3712 if (parseStructBody(Body) ||
3713 (isPacked && parseToken(
lltok::greater,
"expected '>' in packed struct")))
3717 return tokError(
toString(std::move(
E)));
3737 LocTy EltTyLoc = Lex.getLoc();
3744 return error(EltTyLoc,
"invalid element type for struct");
3747 EltTyLoc = Lex.getLoc();
3752 return error(EltTyLoc,
"invalid element type for struct");
3757 return parseToken(
lltok::rbrace,
"expected '}' at end of struct");
3766bool LLParser::parseArrayVectorType(
Type *&Result,
bool IsVector) {
3767 bool Scalable =
false;
3771 if (parseToken(
lltok::kw_x,
"expected 'x' after vscale"))
3777 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned() ||
3778 Lex.getAPSIntVal().getBitWidth() > 64)
3779 return tokError(
"expected number in address space");
3781 LocTy SizeLoc = Lex.getLoc();
3782 uint64_t
Size = Lex.getAPSIntVal().getZExtValue();
3785 if (parseToken(
lltok::kw_x,
"expected 'x' after element count"))
3788 LocTy TypeLoc = Lex.getLoc();
3789 Type *EltTy =
nullptr;
3790 if (parseType(EltTy))
3794 "expected end of sequential type"))
3799 return error(SizeLoc,
"zero element vector is illegal");
3801 return error(SizeLoc,
"size too large for vector");
3803 return error(TypeLoc,
"invalid vector element type");
3807 return error(TypeLoc,
"invalid array element type");
3824bool LLParser::parseTargetExtType(
Type *&Result) {
3829 if (parseToken(
lltok::lparen,
"expected '(' in target extension type") ||
3830 parseStringConstant(TypeName))
3837 SmallVector<unsigned> IntParams;
3838 bool SeenInt =
false;
3845 if (parseUInt32(IntVal))
3848 }
else if (SeenInt) {
3851 return tokError(
"expected uint32 param");
3854 if (parseType(TypeParam,
true))
3860 if (parseToken(
lltok::rparen,
"expected ')' in target extension type"))
3865 if (
auto E = TTy.takeError())
3866 return tokError(
toString(std::move(
E)));
3879 :
P(
p),
F(
f), FunctionNumber(functionNumber) {
3882 auto It = UnnamedArgNums.
begin();
3885 unsigned ArgNum = *It++;
3886 NumberedVals.add(ArgNum, &A);
3891LLParser::PerFunctionState::~PerFunctionState() {
3894 for (
const auto &P : ForwardRefVals) {
3897 P.second.first->replaceAllUsesWith(
3899 P.second.first->deleteValue();
3902 for (
const auto &P : ForwardRefValIDs) {
3905 P.second.first->replaceAllUsesWith(
3907 P.second.first->deleteValue();
3911bool LLParser::PerFunctionState::finishFunction() {
3912 if (!ForwardRefVals.empty())
3913 return P.error(ForwardRefVals.begin()->second.second,
3914 "use of undefined value '%" + ForwardRefVals.begin()->first +
3916 if (!ForwardRefValIDs.empty())
3917 return P.error(ForwardRefValIDs.begin()->second.second,
3918 "use of undefined value '%" +
3919 Twine(ForwardRefValIDs.begin()->first) +
"'");
3926Value *LLParser::PerFunctionState::getVal(
const std::string &Name,
Type *Ty,
3929 Value *Val =
F.getValueSymbolTable()->lookup(Name);
3934 auto I = ForwardRefVals.find(Name);
3935 if (
I != ForwardRefVals.end())
3936 Val =
I->second.first;
3941 return P.checkValidVariableType(Loc,
"%" + Name, Ty, Val);
3945 P.error(Loc,
"invalid use of a non-first-class type");
3956 if (FwdVal->
getName() != Name) {
3957 P.error(Loc,
"name is too long which can result in name collisions, "
3958 "consider making the name shorter or "
3959 "increasing -non-global-value-max-name-size");
3963 ForwardRefVals[
Name] = std::make_pair(FwdVal, Loc);
3967Value *LLParser::PerFunctionState::getVal(
unsigned ID,
Type *Ty,
LocTy Loc) {
3969 Value *Val = NumberedVals.get(
ID);
3974 auto I = ForwardRefValIDs.find(
ID);
3975 if (
I != ForwardRefValIDs.end())
3976 Val =
I->second.first;
3981 return P.checkValidVariableType(Loc,
"%" + Twine(
ID), Ty, Val);
3984 P.error(Loc,
"invalid use of a non-first-class type");
3996 ForwardRefValIDs[
ID] = std::make_pair(FwdVal, Loc);
4002bool LLParser::PerFunctionState::setInstName(
int NameID,
4003 const std::string &NameStr,
4004 LocTy NameLoc, Instruction *Inst) {
4007 if (NameID != -1 || !NameStr.empty())
4008 return P.error(NameLoc,
"instructions returning void cannot have a name");
4014 if (NameStr.empty()) {
4017 NameID = NumberedVals.getNext();
4019 if (
P.checkValueID(NameLoc,
"instruction",
"%", NumberedVals.getNext(),
4023 auto FI = ForwardRefValIDs.find(NameID);
4024 if (FI != ForwardRefValIDs.end()) {
4027 return P.error(NameLoc,
"instruction forward referenced with type '" +
4031 Sentinel->replaceAllUsesWith(Inst);
4033 ForwardRefValIDs.erase(FI);
4036 NumberedVals.add(NameID, Inst);
4041 auto FI = ForwardRefVals.find(NameStr);
4042 if (FI != ForwardRefVals.end()) {
4045 return P.error(NameLoc,
"instruction forward referenced with type '" +
4049 Sentinel->replaceAllUsesWith(Inst);
4051 ForwardRefVals.erase(FI);
4057 if (Inst->
getName() != NameStr)
4058 return P.error(NameLoc,
"multiple definition of local value named '" +
4065BasicBlock *LLParser::PerFunctionState::getBB(
const std::string &Name,
4079BasicBlock *LLParser::PerFunctionState::defineBB(
const std::string &Name,
4080 int NameID,
LocTy Loc) {
4084 if (
P.checkValueID(Loc,
"label",
"", NumberedVals.getNext(), NameID))
4087 NameID = NumberedVals.getNext();
4089 BB = getBB(NameID, Loc);
4091 P.error(Loc,
"unable to create block numbered '" + Twine(NameID) +
"'");
4095 BB = getBB(Name, Loc);
4097 P.error(Loc,
"unable to create block named '" + Name +
"'");
4108 ForwardRefValIDs.erase(NameID);
4109 NumberedVals.add(NameID, BB);
4112 ForwardRefVals.erase(Name);
4129bool LLParser::parseValID(ValID &
ID, PerFunctionState *PFS,
Type *ExpectedTy) {
4130 ID.Loc = Lex.getLoc();
4131 switch (Lex.getKind()) {
4133 return tokError(
"expected value token");
4135 ID.UIntVal = Lex.getUIntVal();
4139 ID.StrVal = Lex.getStrVal();
4143 ID.UIntVal = Lex.getUIntVal();
4147 ID.StrVal = Lex.getStrVal();
4151 ID.APSIntVal = Lex.getAPSIntVal();
4155 ID.APFloatVal = Lex.getAPFloatVal();
4161 return error(
ID.Loc,
"unexpected floating-point literal");
4163 return error(
ID.Loc,
"floating-point constant invalid for type");
4165 auto Except =
ID.APFloatVal.convertFromString(
4167 assert(Except &&
"Invalid float strings should be caught by the lexer");
4172 return error(
ID.Loc,
"floating-point constant overflowed type");
4174 return error(
ID.Loc,
"floating-point constant underflowed type");
4180 return error(
ID.Loc,
"unexpected floating-point literal");
4182 const APInt &
Bits = Lex.getAPSIntVal();
4184 return error(
ID.Loc,
"float hex literal has incorrect number of bits");
4185 ID.APFloatVal =
APFloat(Semantics, Bits);
4207 if (parseGlobalValueVector(Elts) ||
4208 parseToken(
lltok::rbrace,
"expected end of struct constant"))
4211 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4212 ID.UIntVal = Elts.
size();
4213 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4214 Elts.
size() *
sizeof(Elts[0]));
4225 LocTy FirstEltLoc = Lex.getLoc();
4226 if (parseGlobalValueVector(Elts) ||
4228 parseToken(
lltok::rbrace,
"expected end of packed struct")) ||
4232 if (isPackedStruct) {
4233 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.
size());
4234 memcpy(
ID.ConstantStructElts.get(), Elts.
data(),
4235 Elts.
size() *
sizeof(Elts[0]));
4236 ID.UIntVal = Elts.
size();
4242 return error(
ID.Loc,
"constant vector must not be empty");
4244 if (!Elts[0]->
getType()->isIntegerTy() && !Elts[0]->
getType()->isByteTy() &&
4245 !Elts[0]->
getType()->isFloatingPointTy() &&
4249 "vector elements must have integer, byte, pointer or floating point "
4253 for (
unsigned i = 1, e = Elts.
size(); i != e; ++i)
4255 return error(FirstEltLoc,
"vector element #" + Twine(i) +
4256 " is not of type '" +
4266 LocTy FirstEltLoc = Lex.getLoc();
4267 if (parseGlobalValueVector(Elts) ||
4279 if (!Elts[0]->
getType()->isFirstClassType())
4280 return error(FirstEltLoc,
"invalid array element type: " +
4286 for (
unsigned i = 0, e = Elts.
size(); i != e; ++i) {
4288 return error(FirstEltLoc,
"array element #" + Twine(i) +
4289 " is not of type '" +
4301 Context, Lex.getStrVal(),
false, ATy->getElementType()->isByteTy());
4310 bool HasSideEffect, AlignStack, AsmDialect, CanThrow;
4313 parseOptionalToken(lltok::kw_alignstack, AlignStack) ||
4316 parseStringConstant(
ID.StrVal) ||
4317 parseToken(
lltok::comma,
"expected comma in inline asm expression") ||
4320 ID.StrVal2 = Lex.getStrVal();
4321 ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack) << 1) |
4322 (
unsigned(AsmDialect) << 2) | (unsigned(CanThrow) << 3);
4333 if (parseToken(
lltok::lparen,
"expected '(' in block address expression") ||
4334 parseValID(Fn, PFS) ||
4336 "expected comma in block address expression") ||
4337 parseValID(Label, PFS) ||
4338 parseToken(
lltok::rparen,
"expected ')' in block address expression"))
4342 return error(Fn.
Loc,
"expected function name in blockaddress");
4344 return error(
Label.Loc,
"expected basic block name in blockaddress");
4347 GlobalValue *GV =
nullptr;
4349 GV = NumberedVals.get(Fn.
UIntVal);
4350 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4351 GV = M->getNamedValue(Fn.
StrVal);
4357 return error(Fn.
Loc,
"expected function name in blockaddress");
4359 if (
F->isDeclaration())
4360 return error(Fn.
Loc,
"cannot take blockaddress inside a declaration");
4365 GlobalValue *&FwdRef =
4366 ForwardRefBlockAddresses[std::move(Fn)][std::move(Label)];
4374 "type of blockaddress must be a pointer and not '" +
4379 FwdDeclAS = PFS->getFunction().getAddressSpace();
4383 FwdRef =
new GlobalVariable(
4388 ID.ConstantVal = FwdRef;
4396 if (BlockAddressPFS &&
F == &BlockAddressPFS->getFunction()) {
4398 BB = BlockAddressPFS->getBB(
Label.UIntVal,
Label.Loc);
4400 BB = BlockAddressPFS->getBB(
Label.StrVal,
Label.Loc);
4402 return error(
Label.Loc,
"referenced value is not a basic block");
4405 return error(
Label.Loc,
"cannot take address of numeric label after "
4406 "the function is defined");
4408 F->getValueSymbolTable()->lookup(
Label.StrVal));
4410 return error(
Label.Loc,
"referenced value is not a basic block");
4424 if (parseValID(Fn, PFS))
4429 "expected global value name in dso_local_equivalent");
4432 GlobalValue *GV =
nullptr;
4434 GV = NumberedVals.get(Fn.
UIntVal);
4435 }
else if (!ForwardRefVals.count(Fn.
StrVal)) {
4436 GV = M->getNamedValue(Fn.
StrVal);
4442 ? ForwardRefDSOLocalEquivalentIDs
4443 : ForwardRefDSOLocalEquivalentNames;
4444 GlobalValue *&FwdRef = FwdRefMap[Fn];
4451 ID.ConstantVal = FwdRef;
4457 return error(Fn.
Loc,
"expected a function, alias to function, or ifunc "
4458 "in dso_local_equivalent");
4469 if (parseValID(
ID, PFS))
4473 return error(
ID.Loc,
"expected global value name in no_cfi");
4485 Constant *Disc =
nullptr, *AddrDisc =
nullptr,
4486 *DeactivationSymbol =
nullptr;
4489 "expected '(' in constant ptrauth expression") ||
4490 parseGlobalTypeAndValue(Ptr) ||
4492 "expected comma in constant ptrauth expression") ||
4493 parseGlobalTypeAndValue(
Key))
4496 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(Disc))
4498 if (EatIfPresent(
lltok::comma) && parseGlobalTypeAndValue(AddrDisc))
4501 parseGlobalTypeAndValue(DeactivationSymbol))
4504 "expected ')' in constant ptrauth expression"))
4508 return error(
ID.Loc,
"constant ptrauth base pointer must be a pointer");
4511 if (!KeyC || KeyC->getBitWidth() != 32)
4512 return error(
ID.Loc,
"constant ptrauth key must be i32 constant");
4514 ConstantInt *DiscC =
nullptr;
4520 "constant ptrauth integer discriminator must be i64 constant");
4526 if (!AddrDisc->getType()->isPointerTy())
4528 ID.Loc,
"constant ptrauth address discriminator must be a pointer");
4533 if (!DeactivationSymbol)
4534 DeactivationSymbol =
4536 if (!DeactivationSymbol->getType()->isPointerTy())
4538 "constant ptrauth deactivation symbol must be a pointer");
4552 unsigned Opc = Lex.getUIntVal();
4553 Type *DestTy =
nullptr;
4556 if (parseToken(
lltok::lparen,
"expected '(' after constantexpr cast") ||
4557 parseGlobalTypeAndValue(SrcVal) ||
4558 parseToken(
lltok::kw_to,
"expected 'to' in constantexpr cast") ||
4559 parseType(DestTy) ||
4560 parseToken(
lltok::rparen,
"expected ')' at end of constantexpr cast"))
4563 return error(
ID.Loc,
"invalid cast opcode for cast from '" +
4572 return error(
ID.Loc,
"extractvalue constexprs are no longer supported");
4574 return error(
ID.Loc,
"insertvalue constexprs are no longer supported");
4576 return error(
ID.Loc,
"udiv constexprs are no longer supported");
4578 return error(
ID.Loc,
"sdiv constexprs are no longer supported");
4580 return error(
ID.Loc,
"urem constexprs are no longer supported");
4582 return error(
ID.Loc,
"srem constexprs are no longer supported");
4584 return error(
ID.Loc,
"fadd constexprs are no longer supported");
4586 return error(
ID.Loc,
"fsub constexprs are no longer supported");
4588 return error(
ID.Loc,
"fmul constexprs are no longer supported");
4590 return error(
ID.Loc,
"fdiv constexprs are no longer supported");
4592 return error(
ID.Loc,
"frem constexprs are no longer supported");
4594 return error(
ID.Loc,
"and constexprs are no longer supported");
4596 return error(
ID.Loc,
"or constexprs are no longer supported");
4598 return error(
ID.Loc,
"lshr constexprs are no longer supported");
4600 return error(
ID.Loc,
"ashr constexprs are no longer supported");
4602 return error(
ID.Loc,
"shl constexprs are no longer supported");
4604 return error(
ID.Loc,
"mul constexprs are no longer supported");
4606 return error(
ID.Loc,
"fneg constexprs are no longer supported");
4608 return error(
ID.Loc,
"select constexprs are no longer supported");
4610 return error(
ID.Loc,
"zext constexprs are no longer supported");
4612 return error(
ID.Loc,
"sext constexprs are no longer supported");
4614 return error(
ID.Loc,
"fptrunc constexprs are no longer supported");
4616 return error(
ID.Loc,
"fpext constexprs are no longer supported");
4618 return error(
ID.Loc,
"uitofp constexprs are no longer supported");
4620 return error(
ID.Loc,
"sitofp constexprs are no longer supported");
4622 return error(
ID.Loc,
"fptoui constexprs are no longer supported");
4624 return error(
ID.Loc,
"fptosi constexprs are no longer supported");
4626 return error(
ID.Loc,
"icmp constexprs are no longer supported");
4628 return error(
ID.Loc,
"fcmp constexprs are no longer supported");
4636 unsigned Opc = Lex.getUIntVal();
4639 if (
Opc == Instruction::Add ||
Opc == Instruction::Sub ||
4640 Opc == Instruction::Mul) {
4649 if (parseToken(
lltok::lparen,
"expected '(' in binary constantexpr") ||
4650 parseGlobalTypeAndValue(Val0) ||
4651 parseToken(
lltok::comma,
"expected comma in binary constantexpr") ||
4652 parseGlobalTypeAndValue(Val1) ||
4653 parseToken(
lltok::rparen,
"expected ')' in binary constantexpr"))
4656 return error(
ID.Loc,
"operands of constexpr must have same type");
4660 "constexpr requires integer or integer vector operands");
4671 if (parseToken(
lltok::lparen,
"expected '(' after vector splat"))
4674 if (parseGlobalTypeAndValue(
C))
4676 if (parseToken(
lltok::rparen,
"expected ')' at end of vector splat"))
4688 unsigned Opc = Lex.getUIntVal();
4691 bool HasInRange =
false;
4697 if (
Opc == Instruction::GetElementPtr) {
4713 return tokError(
"expected integer");
4714 InRangeStart = Lex.getAPSIntVal();
4719 return tokError(
"expected integer");
4720 InRangeEnd = Lex.getAPSIntVal();
4728 if (parseToken(
lltok::lparen,
"expected '(' in constantexpr"))
4731 if (
Opc == Instruction::GetElementPtr) {
4732 if (parseType(Ty) ||
4733 parseToken(
lltok::comma,
"expected comma after getelementptr's type"))
4737 if (parseGlobalValueVector(Elts) ||
4741 if (
Opc == Instruction::GetElementPtr) {
4742 if (Elts.
size() == 0 ||
4743 !Elts[0]->getType()->isPtrOrPtrVectorTy())
4744 return error(
ID.Loc,
"base of getelementptr must be a pointer");
4747 std::optional<ConstantRange>
InRange;
4749 unsigned IndexWidth =
4750 M->getDataLayout().getIndexTypeSizeInBits(
BaseType);
4751 InRangeStart = InRangeStart.
extOrTrunc(IndexWidth);
4752 InRangeEnd = InRangeEnd.
extOrTrunc(IndexWidth);
4753 if (InRangeStart.
sge(InRangeEnd))
4754 return error(
ID.Loc,
"expected end to be larger than start");
4764 for (Constant *Val : Indices) {
4767 return error(
ID.Loc,
"getelementptr index must be an integer");
4770 if (GEPWidth && (ValNumEl != GEPWidth))
4773 "getelementptr vector index has a wrong number of elements");
4776 GEPWidth = ValNumEl;
4780 SmallPtrSet<Type*, 4> Visited;
4781 if (!Indices.empty() && !Ty->
isSized(&Visited))
4782 return error(
ID.Loc,
"base element of getelementptr must be sized");
4785 return error(
ID.Loc,
"invalid base element for constant getelementptr");
4788 return error(
ID.Loc,
"invalid getelementptr indices");
4792 }
else if (
Opc == Instruction::ShuffleVector) {
4793 if (Elts.
size() != 3)
4794 return error(
ID.Loc,
"expected three operands to shufflevector");
4796 return error(
ID.Loc,
"invalid operands to shufflevector");
4797 SmallVector<int, 16>
Mask;
4800 }
else if (
Opc == Instruction::ExtractElement) {
4801 if (Elts.
size() != 2)
4802 return error(
ID.Loc,
"expected two operands to extractelement");
4804 return error(
ID.Loc,
"invalid extractelement operands");
4807 assert(
Opc == Instruction::InsertElement &&
"Unknown opcode");
4808 if (Elts.
size() != 3)
4809 return error(
ID.Loc,
"expected three operands to insertelement");
4811 return error(
ID.Loc,
"invalid insertelement operands");
4826bool LLParser::parseGlobalValue(
Type *Ty, Constant *&
C) {
4830 bool Parsed = parseValID(
ID,
nullptr, Ty) ||
4831 convertValIDToValue(Ty,
ID, V,
nullptr);
4833 return error(
ID.Loc,
"global values must be constants");
4837bool LLParser::parseGlobalTypeAndValue(Constant *&V) {
4839 return parseType(Ty) || parseGlobalValue(Ty, V);
4842bool LLParser::parseOptionalComdat(StringRef GlobalName, Comdat *&
C) {
4845 LocTy KwLoc = Lex.getLoc();
4851 return tokError(
"expected comdat variable");
4852 C = getComdat(Lex.getStrVal(), Lex.getLoc());
4854 if (parseToken(
lltok::rparen,
"expected ')' after comdat var"))
4857 if (GlobalName.
empty())
4858 return tokError(
"comdat cannot be unnamed");
4859 C = getComdat(std::string(GlobalName), KwLoc);
4868bool LLParser::parseGlobalValueVector(SmallVectorImpl<Constant *> &Elts) {
4882 if (parseGlobalTypeAndValue(
C))
4890bool LLParser::parseMDTuple(MDNode *&MD,
bool IsDistinct) {
4892 if (parseMDNodeVector(Elts))
4903bool LLParser::parseMDNode(MDNode *&
N) {
4905 return parseSpecializedMDNode(
N);
4907 return parseToken(
lltok::exclaim,
"expected '!' here") || parseMDNodeTail(
N);
4910bool LLParser::parseMDNodeTail(MDNode *&
N) {
4913 return parseMDTuple(
N);
4916 return parseMDNodeID(
N);
4922template <
class FieldTy>
struct MDFieldImpl {
4923 typedef MDFieldImpl ImplTy;
4927 void assign(FieldTy Val) {
4929 this->Val = std::move(Val);
4932 explicit MDFieldImpl(FieldTy
Default)
4940template <
class FieldTypeA,
class FieldTypeB>
struct MDEitherFieldImpl {
4941 typedef MDEitherFieldImpl<FieldTypeA, FieldTypeB> ImplTy;
4952 void assign(FieldTypeA
A) {
4954 this->
A = std::move(
A);
4958 void assign(FieldTypeB
B) {
4960 this->
B = std::move(
B);
4964 explicit MDEitherFieldImpl(FieldTypeA DefaultA, FieldTypeB DefaultB)
4966 WhatIs(IsInvalid) {}
4969struct MDUnsignedField :
public MDFieldImpl<uint64_t> {
4976struct LineField :
public MDUnsignedField {
4977 LineField() : MDUnsignedField(0, UINT32_MAX) {}
4980struct ColumnField :
public MDUnsignedField {
4981 ColumnField() : MDUnsignedField(0, UINT16_MAX) {}
4984struct DwarfTagField :
public MDUnsignedField {
4990struct DwarfMacinfoTypeField :
public MDUnsignedField {
4996struct DwarfAttEncodingField :
public MDUnsignedField {
4997 DwarfAttEncodingField() : MDUnsignedField(0, dwarf::
DW_ATE_hi_user) {}
5000struct DwarfVirtualityField :
public MDUnsignedField {
5004struct DwarfLangField :
public MDUnsignedField {
5008struct DwarfSourceLangNameField :
public MDUnsignedField {
5009 DwarfSourceLangNameField() : MDUnsignedField(0, UINT32_MAX) {}
5012struct DwarfCCField :
public MDUnsignedField {
5013 DwarfCCField() : MDUnsignedField(0, dwarf::
DW_CC_hi_user) {}
5016struct DwarfEnumKindField :
public MDUnsignedField {
5017 DwarfEnumKindField()
5022struct EmissionKindField :
public MDUnsignedField {
5023 EmissionKindField() : MDUnsignedField(0, DICompileUnit::LastEmissionKind) {}
5026struct FixedPointKindField :
public MDUnsignedField {
5027 FixedPointKindField()
5028 : MDUnsignedField(0, DIFixedPointType::LastFixedPointKind) {}
5031struct NameTableKindField :
public MDUnsignedField {
5032 NameTableKindField()
5035 DICompileUnit::DebugNameTableKind::LastDebugNameTableKind) {}
5038struct DIFlagField :
public MDFieldImpl<DINode::DIFlags> {
5039 DIFlagField() : MDFieldImpl(DINode::FlagZero) {}
5042struct DISPFlagField :
public MDFieldImpl<DISubprogram::DISPFlags> {
5043 DISPFlagField() : MDFieldImpl(DISubprogram::SPFlagZero) {}
5046struct MDAPSIntField :
public MDFieldImpl<APSInt> {
5047 MDAPSIntField() : ImplTy(
APSInt()) {}
5050struct MDSignedField :
public MDFieldImpl<int64_t> {
5054 MDSignedField(int64_t
Default = 0)
5056 MDSignedField(int64_t
Default, int64_t Min, int64_t Max)
5060struct MDBoolField :
public MDFieldImpl<bool> {
5064struct MDField :
public MDFieldImpl<Metadata *> {
5067 MDField(
bool AllowNull =
true) : ImplTy(nullptr), AllowNull(AllowNull) {}
5070struct MDStringField :
public MDFieldImpl<MDString *> {
5071 enum class EmptyIs {
5076 MDStringField(
enum EmptyIs EmptyIs = EmptyIs::Null)
5077 : ImplTy(nullptr), EmptyIs(EmptyIs) {}
5080struct MDFieldList :
public MDFieldImpl<SmallVector<Metadata *, 4>> {
5084struct ChecksumKindField :
public MDFieldImpl<DIFile::ChecksumKind> {
5088struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
5089 MDSignedOrMDField(int64_t
Default = 0,
bool AllowNull =
true)
5090 : ImplTy(MDSignedField(
Default), MDField(AllowNull)) {}
5092 MDSignedOrMDField(int64_t
Default, int64_t Min, int64_t Max,
5093 bool AllowNull =
true)
5094 : ImplTy(MDSignedField(
Default, Min,
Max), MDField(AllowNull)) {}
5096 bool isMDSignedField()
const {
return WhatIs == IsTypeA; }
5097 bool isMDField()
const {
return WhatIs == IsTypeB; }
5098 int64_t getMDSignedValue()
const {
5099 assert(isMDSignedField() &&
"Wrong field type");
5102 Metadata *getMDFieldValue()
const {
5103 assert(isMDField() &&
"Wrong field type");
5108struct MDUnsignedOrMDField : MDEitherFieldImpl<MDUnsignedField, MDField> {
5109 MDUnsignedOrMDField(uint64_t
Default = 0,
bool AllowNull =
true)
5110 : ImplTy(MDUnsignedField(
Default), MDField(AllowNull)) {}
5112 MDUnsignedOrMDField(uint64_t
Default, uint64_t Max,
bool AllowNull =
true)
5113 : ImplTy(MDUnsignedField(
Default,
Max), MDField(AllowNull)) {}
5115 bool isMDUnsignedField()
const {
return WhatIs == IsTypeA; }
5116 bool isMDField()
const {
return WhatIs == IsTypeB; }
5117 uint64_t getMDUnsignedValue()
const {
5118 assert(isMDUnsignedField() &&
"Wrong field type");
5121 Metadata *getMDFieldValue()
const {
5122 assert(isMDField() &&
"Wrong field type");
5127 if (isMDUnsignedField())
5129 ConstantInt::get(Type::getInt64Ty(
Context), getMDUnsignedValue()));
5131 return getMDFieldValue();
5143 return tokError(
"expected integer");
5145 Result.assign(Lex.getAPSIntVal());
5152 MDUnsignedField &Result) {
5153 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
5154 return tokError(
"expected unsigned integer");
5156 auto &U = Lex.getAPSIntVal();
5157 if (U.ugt(Result.Max))
5158 return tokError(
"value for '" + Name +
"' too large, limit is " +
5160 Result.assign(U.getZExtValue());
5161 assert(Result.Val <= Result.Max &&
"Expected value in range");
5168 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5172 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5178 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5181 return tokError(
"expected DWARF tag");
5185 return tokError(
"invalid DWARF tag" +
Twine(
" '") + Lex.getStrVal() +
"'");
5186 assert(
Tag <= Result.Max &&
"Expected valid DWARF tag");
5195 DwarfMacinfoTypeField &Result) {
5197 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5200 return tokError(
"expected DWARF macinfo type");
5204 return tokError(
"invalid DWARF macinfo type" +
Twine(
" '") +
5205 Lex.getStrVal() +
"'");
5206 assert(Macinfo <= Result.Max &&
"Expected valid DWARF macinfo type");
5208 Result.assign(Macinfo);
5215 DwarfVirtualityField &Result) {
5217 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5220 return tokError(
"expected DWARF virtuality code");
5224 return tokError(
"invalid DWARF virtuality code" +
Twine(
" '") +
5225 Lex.getStrVal() +
"'");
5226 assert(Virtuality <= Result.Max &&
"Expected valid DWARF virtuality code");
5227 Result.assign(Virtuality);
5234 DwarfEnumKindField &Result) {
5236 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5239 return tokError(
"expected DWARF enum kind code");
5243 return tokError(
"invalid DWARF enum kind code" +
Twine(
" '") +
5244 Lex.getStrVal() +
"'");
5245 assert(EnumKind <= Result.Max &&
"Expected valid DWARF enum kind code");
5246 Result.assign(EnumKind);
5254 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5257 return tokError(
"expected DWARF language");
5261 return tokError(
"invalid DWARF language" +
Twine(
" '") + Lex.getStrVal() +
5263 assert(Lang <= Result.Max &&
"Expected valid DWARF language");
5264 Result.assign(Lang);
5271 DwarfSourceLangNameField &Result) {
5273 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5276 return tokError(
"expected DWARF source language name");
5280 return tokError(
"invalid DWARF source language name" +
Twine(
" '") +
5281 Lex.getStrVal() +
"'");
5282 assert(Lang <= Result.Max &&
"Expected valid DWARF source language name");
5283 Result.assign(Lang);
5291 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5294 return tokError(
"expected DWARF calling convention");
5298 return tokError(
"invalid DWARF calling convention" +
Twine(
" '") +
5299 Lex.getStrVal() +
"'");
5300 assert(CC <= Result.Max &&
"Expected valid DWARF calling convention");
5308 EmissionKindField &Result) {
5310 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5313 return tokError(
"expected emission kind");
5317 return tokError(
"invalid emission kind" +
Twine(
" '") + Lex.getStrVal() +
5319 assert(*Kind <= Result.Max &&
"Expected valid emission kind");
5320 Result.assign(*Kind);
5327 FixedPointKindField &Result) {
5329 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5332 return tokError(
"expected fixed-point kind");
5336 return tokError(
"invalid fixed-point kind" +
Twine(
" '") + Lex.getStrVal() +
5338 assert(*Kind <= Result.Max &&
"Expected valid fixed-point kind");
5339 Result.assign(*Kind);
5346 NameTableKindField &Result) {
5348 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5351 return tokError(
"expected nameTable kind");
5355 return tokError(
"invalid nameTable kind" +
Twine(
" '") + Lex.getStrVal() +
5357 assert(((
unsigned)*Kind) <= Result.Max &&
"Expected valid nameTable kind");
5358 Result.assign((
unsigned)*Kind);
5365 DwarfAttEncodingField &Result) {
5367 return parseMDField(
Loc, Name,
static_cast<MDUnsignedField &
>(Result));
5370 return tokError(
"expected DWARF type attribute encoding");
5374 return tokError(
"invalid DWARF type attribute encoding" +
Twine(
" '") +
5375 Lex.getStrVal() +
"'");
5376 assert(Encoding <= Result.Max &&
"Expected valid DWARF language");
5377 Result.assign(Encoding);
5391 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5393 bool Res = parseUInt32(TempVal);
5399 return tokError(
"expected debug info flag");
5403 return tokError(
Twine(
"invalid debug info flag '") + Lex.getStrVal() +
5418 Result.assign(Combined);
5431 if (Lex.getKind() ==
lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
5433 bool Res = parseUInt32(TempVal);
5439 return tokError(
"expected debug info flag");
5443 return tokError(
Twine(
"invalid subprogram debug info flag '") +
5444 Lex.getStrVal() +
"'");
5458 Result.assign(Combined);
5465 return tokError(
"expected signed integer");
5467 auto &S = Lex.getAPSIntVal();
5469 return tokError(
"value for '" + Name +
"' too small, limit is " +
5472 return tokError(
"value for '" + Name +
"' too large, limit is " +
5474 Result.assign(S.getExtValue());
5475 assert(Result.Val >= Result.Min &&
"Expected value in range");
5476 assert(Result.Val <= Result.Max &&
"Expected value in range");
5483 switch (Lex.getKind()) {
5485 return tokError(
"expected 'true' or 'false'");
5487 Result.assign(
true);
5490 Result.assign(
false);
5500 if (!Result.AllowNull)
5501 return tokError(
"'" + Name +
"' cannot be null");
5503 Result.assign(
nullptr);
5508 if (parseMetadata(MD,
nullptr))
5517 MDSignedOrMDField &Result) {
5520 MDSignedField Res = Result.A;
5521 if (!parseMDField(
Loc, Name, Res)) {
5529 MDField Res = Result.B;
5530 if (!parseMDField(
Loc, Name, Res)) {
5540 MDUnsignedOrMDField &Result) {
5543 MDUnsignedField Res = Result.A;
5544 if (!parseMDField(
Loc, Name, Res)) {
5552 MDField Res = Result.B;
5553 if (!parseMDField(
Loc, Name, Res)) {
5563 LocTy ValueLoc = Lex.getLoc();
5565 if (parseStringConstant(S))
5569 switch (Result.EmptyIs) {
5570 case MDStringField::EmptyIs::Null:
5571 Result.assign(
nullptr);
5573 case MDStringField::EmptyIs::Empty:
5575 case MDStringField::EmptyIs::Error:
5576 return error(ValueLoc,
"'" + Name +
"' cannot be empty");
5587 if (parseMDNodeVector(MDs))
5590 Result.assign(std::move(MDs));
5596 ChecksumKindField &Result) {
5597 std::optional<DIFile::ChecksumKind> CSKind =
5601 return tokError(
"invalid checksum kind" +
Twine(
" '") + Lex.getStrVal() +
5604 Result.assign(*CSKind);
5611template <
class ParserTy>
5612bool LLParser::parseMDFieldsImplBody(ParserTy ParseField) {
5615 return tokError(
"expected field label here");
5624template <
class ParserTy>
5625bool LLParser::parseMDFieldsImpl(ParserTy ParseField, LocTy &ClosingLoc) {
5632 if (parseMDFieldsImplBody(ParseField))
5635 ClosingLoc = Lex.getLoc();
5639template <
class FieldTy>
5640bool LLParser::parseMDField(
StringRef Name, FieldTy &Result) {
5642 return tokError(
"field '" + Name +
"' cannot be specified more than once");
5644 LocTy Loc = Lex.getLoc();
5646 return parseMDField(Loc, Name, Result);
5649bool LLParser::parseSpecializedMDNode(
MDNode *&
N,
bool IsDistinct) {
5652#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
5653 if (Lex.getStrVal() == #CLASS) \
5654 return parse##CLASS(N, IsDistinct);
5655#include "llvm/IR/Metadata.def"
5657 return tokError(
"expected metadata type");
5660#define DECLARE_FIELD(NAME, TYPE, INIT) TYPE NAME INIT
5661#define NOP_FIELD(NAME, TYPE, INIT)
5662#define REQUIRE_FIELD(NAME, TYPE, INIT) \
5664 return error(ClosingLoc, "missing required field '" #NAME "'");
5665#define PARSE_MD_FIELD(NAME, TYPE, DEFAULT) \
5666 if (Lex.getStrVal() == #NAME) \
5667 return parseMDField(#NAME, NAME);
5668#define PARSE_MD_FIELDS() \
5669 VISIT_MD_FIELDS(DECLARE_FIELD, DECLARE_FIELD) \
5672 if (parseMDFieldsImpl( \
5674 VISIT_MD_FIELDS(PARSE_MD_FIELD, PARSE_MD_FIELD) \
5675 return tokError(Twine("invalid field '") + Lex.getStrVal() + \
5680 VISIT_MD_FIELDS(NOP_FIELD, REQUIRE_FIELD) \
5682#define GET_OR_DISTINCT(CLASS, ARGS) \
5683 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
5688bool LLParser::parseDILocation(
MDNode *&Result,
bool IsDistinct) {
5689#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5690 OPTIONAL(line, LineField, ); \
5691 OPTIONAL(column, ColumnField, ); \
5692 REQUIRED(scope, MDField, ( false)); \
5693 OPTIONAL(inlinedAt, MDField, ); \
5694 OPTIONAL(isImplicitCode, MDBoolField, (false)); \
5695 OPTIONAL(atomGroup, MDUnsignedField, (0, UINT64_MAX)); \
5696 OPTIONAL(atomRank, MDUnsignedField, (0, UINT8_MAX));
5698#undef VISIT_MD_FIELDS
5701 DILocation, (Context, line.Val, column.Val, scope.Val, inlinedAt.Val,
5702 isImplicitCode.Val, atomGroup.Val, atomRank.Val));
5708bool LLParser::parseDIAssignID(
MDNode *&Result,
bool IsDistinct) {
5710 return tokError(
"missing 'distinct', required for !DIAssignID()");
5726bool LLParser::parseGenericDINode(
MDNode *&Result,
bool IsDistinct) {
5727#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5728 REQUIRED(tag, DwarfTagField, ); \
5729 OPTIONAL(header, MDStringField, ); \
5730 OPTIONAL(operands, MDFieldList, );
5732#undef VISIT_MD_FIELDS
5735 (Context, tag.Val, header.Val, operands.Val));
5744bool LLParser::parseDISubrangeType(
MDNode *&Result,
bool IsDistinct) {
5745#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5746 OPTIONAL(name, MDStringField, ); \
5747 OPTIONAL(file, MDField, ); \
5748 OPTIONAL(line, LineField, ); \
5749 OPTIONAL(scope, MDField, ); \
5750 OPTIONAL(baseType, MDField, ); \
5751 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5752 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5753 OPTIONAL(flags, DIFlagField, ); \
5754 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5755 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5756 OPTIONAL(stride, MDSignedOrMDField, ); \
5757 OPTIONAL(bias, MDSignedOrMDField, );
5759#undef VISIT_MD_FIELDS
5761 auto convToMetadata = [&](MDSignedOrMDField Bound) ->
Metadata * {
5762 if (Bound.isMDSignedField())
5765 if (Bound.isMDField())
5766 return Bound.getMDFieldValue();
5770 Metadata *LowerBound = convToMetadata(lowerBound);
5772 Metadata *Stride = convToMetadata(stride);
5773 Metadata *Bias = convToMetadata(bias);
5776 DISubrangeType, (Context,
name.Val,
file.Val, line.Val, scope.Val,
5777 size.getValueAsMetadata(Context), align.Val, flags.Val,
5778 baseType.Val, LowerBound, UpperBound, Stride, Bias));
5787bool LLParser::parseDISubrange(
MDNode *&Result,
bool IsDistinct) {
5788#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5789 OPTIONAL(count, MDSignedOrMDField, (-1, -1, INT64_MAX, false)); \
5790 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5791 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5792 OPTIONAL(stride, MDSignedOrMDField, );
5794#undef VISIT_MD_FIELDS
5801 auto convToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5802 if (Bound.isMDSignedField())
5805 if (Bound.isMDField())
5806 return Bound.getMDFieldValue();
5811 LowerBound = convToMetadata(lowerBound);
5813 Stride = convToMetadata(stride);
5816 (Context,
Count, LowerBound, UpperBound, Stride));
5824bool LLParser::parseDIGenericSubrange(
MDNode *&Result,
bool IsDistinct) {
5825#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5826 OPTIONAL(count, MDSignedOrMDField, ); \
5827 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5828 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5829 OPTIONAL(stride, MDSignedOrMDField, );
5831#undef VISIT_MD_FIELDS
5833 auto ConvToMetadata = [&](
const MDSignedOrMDField &Bound) ->
Metadata * {
5834 if (Bound.isMDSignedField())
5836 Context, {dwarf::DW_OP_consts,
5837 static_cast<uint64_t
>(Bound.getMDSignedValue())});
5838 if (Bound.isMDField())
5839 return Bound.getMDFieldValue();
5844 Metadata *LowerBound = ConvToMetadata(lowerBound);
5846 Metadata *Stride = ConvToMetadata(stride);
5849 (Context,
Count, LowerBound, UpperBound, Stride));
5856bool LLParser::parseDIEnumerator(
MDNode *&Result,
bool IsDistinct) {
5857#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5858 REQUIRED(name, MDStringField, ); \
5859 REQUIRED(value, MDAPSIntField, ); \
5860 OPTIONAL(isUnsigned, MDBoolField, (false));
5862#undef VISIT_MD_FIELDS
5864 if (isUnsigned.Val && value.Val.isNegative())
5865 return tokError(
"unsigned enumerator with negative value");
5870 if (!isUnsigned.Val && value.Val.isUnsigned() && value.Val.isSignBitSet())
5882bool LLParser::parseDIBasicType(
MDNode *&Result,
bool IsDistinct) {
5883#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5884 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5885 OPTIONAL(name, MDStringField, ); \
5886 OPTIONAL(file, MDField, ); \
5887 OPTIONAL(line, LineField, ); \
5888 OPTIONAL(scope, MDField, ); \
5889 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5890 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5891 OPTIONAL(dataSize, MDUnsignedField, (0, UINT32_MAX)); \
5892 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5893 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5894 OPTIONAL(flags, DIFlagField, );
5896#undef VISIT_MD_FIELDS
5899 DIBasicType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
5900 size.getValueAsMetadata(Context), align.Val, encoding.Val,
5901 num_extra_inhabitants.Val, dataSize.Val, flags.Val));
5910bool LLParser::parseDIFixedPointType(
MDNode *&Result,
bool IsDistinct) {
5911#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5912 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5913 OPTIONAL(name, MDStringField, ); \
5914 OPTIONAL(file, MDField, ); \
5915 OPTIONAL(line, LineField, ); \
5916 OPTIONAL(scope, MDField, ); \
5917 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5918 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5919 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5920 OPTIONAL(flags, DIFlagField, ); \
5921 OPTIONAL(kind, FixedPointKindField, ); \
5922 OPTIONAL(factor, MDSignedField, ); \
5923 OPTIONAL(numerator, MDAPSIntField, ); \
5924 OPTIONAL(denominator, MDAPSIntField, );
5926#undef VISIT_MD_FIELDS
5929 (Context, tag.Val,
name.Val,
file.Val, line.Val,
5930 scope.Val,
size.getValueAsMetadata(Context),
5931 align.Val, encoding.Val, flags.Val, kind.Val,
5932 factor.Val, numerator.Val, denominator.Val));
5938bool LLParser::parseDIStringType(
MDNode *&Result,
bool IsDistinct) {
5939#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5940 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_string_type)); \
5941 OPTIONAL(name, MDStringField, ); \
5942 OPTIONAL(stringLength, MDField, ); \
5943 OPTIONAL(stringLengthExpression, MDField, ); \
5944 OPTIONAL(stringLocationExpression, MDField, ); \
5945 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5946 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5947 OPTIONAL(encoding, DwarfAttEncodingField, );
5949#undef VISIT_MD_FIELDS
5953 (Context, tag.Val,
name.Val, stringLength.Val, stringLengthExpression.Val,
5954 stringLocationExpression.Val,
size.getValueAsMetadata(Context),
5955 align.Val, encoding.Val));
5968bool LLParser::parseDIDerivedType(
MDNode *&Result,
bool IsDistinct) {
5969#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5970 REQUIRED(tag, DwarfTagField, ); \
5971 OPTIONAL(name, MDStringField, ); \
5972 OPTIONAL(file, MDField, ); \
5973 OPTIONAL(line, LineField, ); \
5974 OPTIONAL(scope, MDField, ); \
5975 REQUIRED(baseType, MDField, ); \
5976 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5977 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5978 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
5979 OPTIONAL(flags, DIFlagField, ); \
5980 OPTIONAL(extraData, MDField, ); \
5981 OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
5982 OPTIONAL(annotations, MDField, ); \
5983 OPTIONAL(ptrAuthKey, MDUnsignedField, (0, 7)); \
5984 OPTIONAL(ptrAuthIsAddressDiscriminated, MDBoolField, ); \
5985 OPTIONAL(ptrAuthExtraDiscriminator, MDUnsignedField, (0, 0xffff)); \
5986 OPTIONAL(ptrAuthIsaPointer, MDBoolField, ); \
5987 OPTIONAL(ptrAuthAuthenticatesNullValues, MDBoolField, );
5989#undef VISIT_MD_FIELDS
5991 std::optional<unsigned> DWARFAddressSpace;
5992 if (dwarfAddressSpace.Val != UINT32_MAX)
5993 DWARFAddressSpace = dwarfAddressSpace.Val;
5994 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
5996 PtrAuthData.emplace(
5997 (
unsigned)ptrAuthKey.Val, ptrAuthIsAddressDiscriminated.Val,
5998 (
unsigned)ptrAuthExtraDiscriminator.Val, ptrAuthIsaPointer.Val,
5999 ptrAuthAuthenticatesNullValues.Val);
6002 DIDerivedType, (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val,
6003 baseType.Val,
size.getValueAsMetadata(Context), align.Val,
6004 offset.getValueAsMetadata(Context), DWARFAddressSpace,
6005 PtrAuthData, flags.Val, extraData.Val, annotations.Val));
6009bool LLParser::parseDICompositeType(
MDNode *&Result,
bool IsDistinct) {
6010#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6011 REQUIRED(tag, DwarfTagField, ); \
6012 OPTIONAL(name, MDStringField, ); \
6013 OPTIONAL(file, MDField, ); \
6014 OPTIONAL(line, LineField, ); \
6015 OPTIONAL(scope, MDField, ); \
6016 OPTIONAL(baseType, MDField, ); \
6017 OPTIONAL(size, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6018 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6019 OPTIONAL(offset, MDUnsignedOrMDField, (0, UINT64_MAX)); \
6020 OPTIONAL(flags, DIFlagField, ); \
6021 OPTIONAL(elements, MDField, ); \
6022 OPTIONAL(runtimeLang, DwarfLangField, ); \
6023 OPTIONAL(enumKind, DwarfEnumKindField, ); \
6024 OPTIONAL(vtableHolder, MDField, ); \
6025 OPTIONAL(templateParams, MDField, ); \
6026 OPTIONAL(identifier, MDStringField, ); \
6027 OPTIONAL(discriminator, MDField, ); \
6028 OPTIONAL(dataLocation, MDField, ); \
6029 OPTIONAL(associated, MDField, ); \
6030 OPTIONAL(allocated, MDField, ); \
6031 OPTIONAL(rank, MDSignedOrMDField, ); \
6032 OPTIONAL(annotations, MDField, ); \
6033 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
6034 OPTIONAL(specification, MDField, ); \
6035 OPTIONAL(bitStride, MDField, );
6037#undef VISIT_MD_FIELDS
6040 if (rank.isMDSignedField())
6043 else if (rank.isMDField())
6044 Rank = rank.getMDFieldValue();
6046 std::optional<unsigned> EnumKind;
6048 EnumKind = enumKind.Val;
6053 Context, *identifier.Val, tag.Val,
name.Val,
file.Val, line.Val,
6054 scope.Val, baseType.Val,
size.getValueAsMetadata(Context),
6055 align.Val, offset.getValueAsMetadata(Context), specification.Val,
6056 num_extra_inhabitants.Val, flags.Val, elements.Val, runtimeLang.Val,
6057 EnumKind, vtableHolder.Val, templateParams.Val, discriminator.Val,
6058 dataLocation.Val, associated.Val, allocated.Val, Rank,
6059 annotations.Val, bitStride.Val)) {
6068 (Context, tag.Val,
name.Val,
file.Val, line.Val, scope.Val, baseType.Val,
6069 size.getValueAsMetadata(Context), align.Val,
6070 offset.getValueAsMetadata(Context), flags.Val, elements.Val,
6071 runtimeLang.Val, EnumKind, vtableHolder.Val, templateParams.Val,
6072 identifier.Val, discriminator.Val, dataLocation.Val, associated.Val,
6073 allocated.Val, Rank, annotations.Val, specification.Val,
6074 num_extra_inhabitants.Val, bitStride.Val));
6078bool LLParser::parseDISubroutineType(
MDNode *&Result,
bool IsDistinct) {
6079#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6080 OPTIONAL(flags, DIFlagField, ); \
6081 OPTIONAL(cc, DwarfCCField, ); \
6082 REQUIRED(types, MDField, );
6084#undef VISIT_MD_FIELDS
6087 (Context, flags.Val, cc.Val, types.Val));
6096bool LLParser::parseDIFile(
MDNode *&Result,
bool IsDistinct) {
6100#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6101 REQUIRED(filename, MDStringField, ); \
6102 REQUIRED(directory, MDStringField, ); \
6103 OPTIONAL(checksumkind, ChecksumKindField, (DIFile::CSK_MD5)); \
6104 OPTIONAL(checksum, MDStringField, ); \
6105 OPTIONAL(source, MDStringField, (MDStringField::EmptyIs::Empty));
6107#undef VISIT_MD_FIELDS
6109 std::optional<DIFile::ChecksumInfo<MDString *>> OptChecksum;
6110 if (checksumkind.Seen && checksum.Seen)
6111 OptChecksum.emplace(checksumkind.Val, checksum.Val);
6112 else if (checksumkind.Seen || checksum.Seen)
6113 return tokError(
"'checksumkind' and 'checksum' must be provided together");
6115 MDString *
Source =
nullptr;
6119 DIFile, (Context,
filename.Val, directory.Val, OptChecksum, Source));
6130bool LLParser::parseDICompileUnit(
MDNode *&Result,
bool IsDistinct) {
6132 return tokError(
"missing 'distinct', required for !DICompileUnit");
6134 LocTy Loc = Lex.getLoc();
6136#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6137 REQUIRED(file, MDField, ( false)); \
6138 OPTIONAL(language, DwarfLangField, ); \
6139 OPTIONAL(sourceLanguageName, DwarfSourceLangNameField, ); \
6140 OPTIONAL(sourceLanguageVersion, MDUnsignedField, (0, UINT32_MAX)); \
6141 OPTIONAL(producer, MDStringField, ); \
6142 OPTIONAL(isOptimized, MDBoolField, ); \
6143 OPTIONAL(flags, MDStringField, ); \
6144 OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); \
6145 OPTIONAL(splitDebugFilename, MDStringField, ); \
6146 OPTIONAL(emissionKind, EmissionKindField, ); \
6147 OPTIONAL(enums, MDField, ); \
6148 OPTIONAL(retainedTypes, MDField, ); \
6149 OPTIONAL(globals, MDField, ); \
6150 OPTIONAL(imports, MDField, ); \
6151 OPTIONAL(macros, MDField, ); \
6152 OPTIONAL(dwoId, MDUnsignedField, ); \
6153 OPTIONAL(splitDebugInlining, MDBoolField, = true); \
6154 OPTIONAL(debugInfoForProfiling, MDBoolField, = false); \
6155 OPTIONAL(nameTableKind, NameTableKindField, ); \
6156 OPTIONAL(rangesBaseAddress, MDBoolField, = false); \
6157 OPTIONAL(sysroot, MDStringField, ); \
6158 OPTIONAL(sdk, MDStringField, );
6160#undef VISIT_MD_FIELDS
6162 if (!language.Seen && !sourceLanguageName.Seen)
6163 return error(Loc,
"missing one of 'language' or 'sourceLanguageName', "
6164 "required for !DICompileUnit");
6166 if (language.Seen && sourceLanguageName.Seen)
6167 return error(Loc,
"can only specify one of 'language' and "
6168 "'sourceLanguageName' on !DICompileUnit");
6170 if (sourceLanguageVersion.Seen && !sourceLanguageName.Seen)
6171 return error(Loc,
"'sourceLanguageVersion' requires an associated "
6172 "'sourceLanguageName' on !DICompileUnit");
6176 language.Seen ? DISourceLanguageName(language.Val)
6177 : DISourceLanguageName(sourceLanguageName.Val,
6178 sourceLanguageVersion.Val),
6179 file.Val, producer.Val, isOptimized.Val, flags.Val, runtimeVersion.Val,
6180 splitDebugFilename.Val, emissionKind.Val, enums.Val, retainedTypes.Val,
6181 globals.Val, imports.Val, macros.Val, dwoId.Val, splitDebugInlining.Val,
6182 debugInfoForProfiling.Val, nameTableKind.Val, rangesBaseAddress.Val,
6183 sysroot.Val, sdk.Val);
6196bool LLParser::parseDISubprogram(
MDNode *&Result,
bool IsDistinct) {
6197 auto Loc = Lex.getLoc();
6198#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6199 OPTIONAL(scope, MDField, ); \
6200 OPTIONAL(name, MDStringField, ); \
6201 OPTIONAL(linkageName, MDStringField, ); \
6202 OPTIONAL(file, MDField, ); \
6203 OPTIONAL(line, LineField, ); \
6204 OPTIONAL(type, MDField, ); \
6205 OPTIONAL(isLocal, MDBoolField, ); \
6206 OPTIONAL(isDefinition, MDBoolField, (true)); \
6207 OPTIONAL(scopeLine, LineField, ); \
6208 OPTIONAL(containingType, MDField, ); \
6209 OPTIONAL(virtuality, DwarfVirtualityField, ); \
6210 OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); \
6211 OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); \
6212 OPTIONAL(flags, DIFlagField, ); \
6213 OPTIONAL(spFlags, DISPFlagField, ); \
6214 OPTIONAL(isOptimized, MDBoolField, ); \
6215 OPTIONAL(unit, MDField, ); \
6216 OPTIONAL(templateParams, MDField, ); \
6217 OPTIONAL(declaration, MDField, ); \
6218 OPTIONAL(retainedNodes, MDField, ); \
6219 OPTIONAL(thrownTypes, MDField, ); \
6220 OPTIONAL(annotations, MDField, ); \
6221 OPTIONAL(targetFuncName, MDStringField, ); \
6222 OPTIONAL(keyInstructions, MDBoolField, );
6224#undef VISIT_MD_FIELDS
6229 spFlags.Seen ? spFlags.Val
6231 isOptimized.Val, virtuality.Val);
6232 if ((SPFlags & DISubprogram::SPFlagDefinition) && !IsDistinct)
6235 "missing 'distinct', required for !DISubprogram that is a Definition");
6238 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val, line.Val,
6239 type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
6240 thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
6241 declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
6242 targetFuncName.Val, keyInstructions.Val));
6252bool LLParser::parseDILexicalBlock(
MDNode *&Result,
bool IsDistinct) {
6253#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6254 REQUIRED(scope, MDField, ( false)); \
6255 OPTIONAL(file, MDField, ); \
6256 OPTIONAL(line, LineField, ); \
6257 OPTIONAL(column, ColumnField, );
6259#undef VISIT_MD_FIELDS
6262 DILexicalBlock, (Context, scope.Val,
file.Val, line.Val, column.Val));
6268bool LLParser::parseDILexicalBlockFile(
MDNode *&Result,
bool IsDistinct) {
6269#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6270 REQUIRED(scope, MDField, ( false)); \
6271 OPTIONAL(file, MDField, ); \
6272 REQUIRED(discriminator, MDUnsignedField, (0, UINT32_MAX));
6274#undef VISIT_MD_FIELDS
6277 (Context, scope.Val,
file.Val, discriminator.Val));
6283bool LLParser::parseDICommonBlock(
MDNode *&Result,
bool IsDistinct) {
6284#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6285 REQUIRED(scope, MDField, ); \
6286 OPTIONAL(declaration, MDField, ); \
6287 OPTIONAL(name, MDStringField, ); \
6288 OPTIONAL(file, MDField, ); \
6289 OPTIONAL(line, LineField, );
6291#undef VISIT_MD_FIELDS
6294 (Context, scope.Val, declaration.Val,
name.Val,
6295 file.Val, line.Val));
6301bool LLParser::parseDINamespace(
MDNode *&Result,
bool IsDistinct) {
6302#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6303 REQUIRED(scope, MDField, ); \
6304 OPTIONAL(name, MDStringField, ); \
6305 OPTIONAL(exportSymbols, MDBoolField, );
6307#undef VISIT_MD_FIELDS
6310 (Context, scope.Val,
name.Val, exportSymbols.Val));
6317bool LLParser::parseDIMacro(
MDNode *&Result,
bool IsDistinct) {
6318#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6319 REQUIRED(type, DwarfMacinfoTypeField, ); \
6320 OPTIONAL(line, LineField, ); \
6321 REQUIRED(name, MDStringField, ); \
6322 OPTIONAL(value, MDStringField, );
6324#undef VISIT_MD_FIELDS
6327 (Context, type.Val, line.Val,
name.Val, value.Val));
6333bool LLParser::parseDIMacroFile(
MDNode *&Result,
bool IsDistinct) {
6334#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6335 OPTIONAL(type, DwarfMacinfoTypeField, (dwarf::DW_MACINFO_start_file)); \
6336 OPTIONAL(line, LineField, ); \
6337 REQUIRED(file, MDField, ); \
6338 OPTIONAL(nodes, MDField, );
6340#undef VISIT_MD_FIELDS
6343 (Context, type.Val, line.Val,
file.Val,
nodes.Val));
6351bool LLParser::parseDIModule(
MDNode *&Result,
bool IsDistinct) {
6352#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6353 REQUIRED(scope, MDField, ); \
6354 REQUIRED(name, MDStringField, ); \
6355 OPTIONAL(configMacros, MDStringField, ); \
6356 OPTIONAL(includePath, MDStringField, ); \
6357 OPTIONAL(apinotes, MDStringField, ); \
6358 OPTIONAL(file, MDField, ); \
6359 OPTIONAL(line, LineField, ); \
6360 OPTIONAL(isDecl, MDBoolField, );
6362#undef VISIT_MD_FIELDS
6365 configMacros.Val, includePath.Val,
6366 apinotes.Val, line.Val, isDecl.Val));
6372bool LLParser::parseDITemplateTypeParameter(
MDNode *&Result,
bool IsDistinct) {
6373#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6374 OPTIONAL(name, MDStringField, ); \
6375 REQUIRED(type, MDField, ); \
6376 OPTIONAL(defaulted, MDBoolField, );
6378#undef VISIT_MD_FIELDS
6381 (Context,
name.Val, type.Val, defaulted.Val));
6389bool LLParser::parseDITemplateValueParameter(
MDNode *&Result,
bool IsDistinct) {
6390#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6391 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_template_value_parameter)); \
6392 OPTIONAL(name, MDStringField, ); \
6393 OPTIONAL(type, MDField, ); \
6394 OPTIONAL(defaulted, MDBoolField, ); \
6395 REQUIRED(value, MDField, );
6398#undef VISIT_MD_FIELDS
6401 DITemplateValueParameter,
6402 (Context, tag.Val,
name.Val, type.Val, defaulted.Val, value.Val));
6411bool LLParser::parseDIGlobalVariable(
MDNode *&Result,
bool IsDistinct) {
6412#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6413 OPTIONAL(name, MDStringField, (MDStringField::EmptyIs::Error)); \
6414 OPTIONAL(scope, MDField, ); \
6415 OPTIONAL(linkageName, MDStringField, ); \
6416 OPTIONAL(file, MDField, ); \
6417 OPTIONAL(line, LineField, ); \
6418 OPTIONAL(type, MDField, ); \
6419 OPTIONAL(isLocal, MDBoolField, ); \
6420 OPTIONAL(isDefinition, MDBoolField, (true)); \
6421 OPTIONAL(templateParams, MDField, ); \
6422 OPTIONAL(declaration, MDField, ); \
6423 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6424 OPTIONAL(annotations, MDField, );
6426#undef VISIT_MD_FIELDS
6430 (Context, scope.Val,
name.Val, linkageName.Val,
file.Val,
6431 line.Val, type.Val, isLocal.Val, isDefinition.Val,
6432 declaration.Val, templateParams.Val, align.Val,
6444bool LLParser::parseDILocalVariable(
MDNode *&Result,
bool IsDistinct) {
6445#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6446 REQUIRED(scope, MDField, ( false)); \
6447 OPTIONAL(name, MDStringField, ); \
6448 OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); \
6449 OPTIONAL(file, MDField, ); \
6450 OPTIONAL(line, LineField, ); \
6451 OPTIONAL(type, MDField, ); \
6452 OPTIONAL(flags, DIFlagField, ); \
6453 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
6454 OPTIONAL(annotations, MDField, );
6456#undef VISIT_MD_FIELDS
6459 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6460 type.Val, arg.Val, flags.Val, align.Val,
6467bool LLParser::parseDILabel(
MDNode *&Result,
bool IsDistinct) {
6468#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6469 REQUIRED(scope, MDField, ( false)); \
6470 REQUIRED(name, MDStringField, ); \
6471 REQUIRED(file, MDField, ); \
6472 REQUIRED(line, LineField, ); \
6473 OPTIONAL(column, ColumnField, ); \
6474 OPTIONAL(isArtificial, MDBoolField, ); \
6475 OPTIONAL(coroSuspendIdx, MDUnsignedField, );
6477#undef VISIT_MD_FIELDS
6479 std::optional<unsigned> CoroSuspendIdx =
6480 coroSuspendIdx.Seen ? std::optional<unsigned>(coroSuspendIdx.Val)
6484 (Context, scope.Val,
name.Val,
file.Val, line.Val,
6485 column.Val, isArtificial.Val, CoroSuspendIdx));
6491bool LLParser::parseDIExpressionBody(
MDNode *&Result,
bool IsDistinct) {
6504 return tokError(Twine(
"invalid DWARF op '") + Lex.getStrVal() +
"'");
6513 return tokError(Twine(
"invalid DWARF attribute encoding '") +
6514 Lex.getStrVal() +
"'");
6517 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
6518 return tokError(
"expected unsigned integer");
6520 auto &
U = Lex.getAPSIntVal();
6522 return tokError(
"element too large, limit is " + Twine(
UINT64_MAX));
6536bool LLParser::parseDIExpression(
MDNode *&Result,
bool IsDistinct) {
6538 assert(Lex.getStrVal() ==
"DIExpression" &&
"Expected '!DIExpression'");
6541 return parseDIExpressionBody(Result, IsDistinct);
6546bool LLParser::parseDIArgList(
Metadata *&MD, PerFunctionState *PFS) {
6547 assert(PFS &&
"Expected valid function state");
6558 if (parseValueAsMetadata(MD,
"expected value-as-metadata operand", PFS))
6572bool LLParser::parseDIGlobalVariableExpression(
MDNode *&Result,
6574#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6575 REQUIRED(var, MDField, ); \
6576 REQUIRED(expr, MDField, );
6578#undef VISIT_MD_FIELDS
6581 GET_OR_DISTINCT(DIGlobalVariableExpression, (Context, var.Val, expr.Val));
6588bool LLParser::parseDIObjCProperty(
MDNode *&Result,
bool IsDistinct) {
6589#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6590 OPTIONAL(name, MDStringField, ); \
6591 OPTIONAL(file, MDField, ); \
6592 OPTIONAL(line, LineField, ); \
6593 OPTIONAL(setter, MDStringField, ); \
6594 OPTIONAL(getter, MDStringField, ); \
6595 OPTIONAL(attributes, MDUnsignedField, (0, UINT32_MAX)); \
6596 OPTIONAL(type, MDField, );
6598#undef VISIT_MD_FIELDS
6601 (Context,
name.Val,
file.Val, line.Val, getter.Val,
6602 setter.Val, attributes.Val, type.Val));
6609bool LLParser::parseDIImportedEntity(
MDNode *&Result,
bool IsDistinct) {
6610#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
6611 REQUIRED(tag, DwarfTagField, ); \
6612 REQUIRED(scope, MDField, ); \
6613 OPTIONAL(entity, MDField, ); \
6614 OPTIONAL(file, MDField, ); \
6615 OPTIONAL(line, LineField, ); \
6616 OPTIONAL(name, MDStringField, ); \
6617 OPTIONAL(elements, MDField, );
6619#undef VISIT_MD_FIELDS
6622 (Context, tag.Val, scope.Val, entity.Val,
file.Val,
6623 line.Val,
name.Val, elements.Val));
6627#undef PARSE_MD_FIELD
6639bool LLParser::parseMetadataAsValue(
Value *&V, PerFunctionState &PFS) {
6642 if (parseMetadata(MD, &PFS))
6653bool LLParser::parseValueAsMetadata(
Metadata *&MD,
const Twine &TypeMsg,
6654 PerFunctionState *PFS) {
6657 if (parseType(Ty, TypeMsg, Loc))
6660 return error(Loc,
"invalid metadata-value-metadata roundtrip");
6663 if (parseValue(Ty, V, PFS))
6678bool LLParser::parseMetadata(
Metadata *&MD, PerFunctionState *PFS) {
6682 if (Lex.getStrVal() ==
"DIArgList") {
6684 if (parseDIArgList(AL, PFS))
6690 if (parseSpecializedMDNode(
N)) {
6700 return parseValueAsMetadata(MD,
"expected metadata operand", PFS);
6710 if (parseMDString(S))
6720 if (parseMDNodeTail(
N))
6731 PerFunctionState *PFS) {
6733 return error(
ID.Loc,
"functions are not values, refer to them as pointers");
6738 return error(
ID.Loc,
"invalid use of function-local name");
6739 V = PFS->getVal(
ID.UIntVal, Ty,
ID.Loc);
6740 return V ==
nullptr;
6743 return error(
ID.Loc,
"invalid use of function-local name");
6744 V = PFS->getVal(
ID.StrVal, Ty,
ID.Loc);
6745 return V ==
nullptr;
6748 return error(
ID.Loc,
"invalid type for inline asm constraint string");
6752 ID.FTy,
ID.StrVal,
ID.StrVal2,
ID.UIntVal & 1, (
ID.UIntVal >> 1) & 1,
6757 V = getGlobalVal(
ID.StrVal, Ty,
ID.Loc);
6760 return V ==
nullptr;
6762 V = getGlobalVal(
ID.UIntVal, Ty,
ID.Loc);
6765 return V ==
nullptr;
6768 return error(
ID.Loc,
"integer/byte constant must have integer/byte type");
6771 :
V = ConstantByte::
get(Context,
ID.APSIntVal);
6776 return error(
ID.Loc,
"floating point constant invalid for type");
6782 bool IsSNAN = ID.APFloatVal.isSignaling();
6785 ID.APFloatVal.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven,
6787 else if (Ty->isBFloatTy())
6788 ID.APFloatVal.convert(APFloat::BFloat(), APFloat::rmNearestTiesToEven,
6790 else if (Ty->isFloatTy())
6791 ID.APFloatVal.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven,
6797 APInt Payload = ID.APFloatVal.bitcastToAPInt();
6798 ID.APFloatVal = APFloat::getSNaN(ID.APFloatVal.getSemantics(),
6799 ID.APFloatVal.isNegative(), &Payload);
6802 V = ConstantFP::get(Context,
ID.APFloatVal);
6804 if (
V->getType() != Ty)
6805 return error(
ID.Loc,
"floating point constant does not have type '" +
6811 return error(
ID.Loc,
"null must be a pointer type");
6817 return error(
ID.Loc,
"invalid type for undef constant");
6822 return error(
ID.Loc,
"invalid empty array initializer");
6828 return error(
ID.Loc,
"invalid type for null constant");
6831 return error(
ID.Loc,
"invalid type for null constant");
6836 return error(
ID.Loc,
"invalid type for none constant");
6842 return error(
ID.Loc,
"invalid type for poison constant");
6846 if (
ID.ConstantVal->getType() != Ty)
6847 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6854 return error(
ID.Loc,
"vector constant must have vector type");
6856 return error(
ID.Loc,
"constant expression type mismatch: got type '" +
6858 "' but expected '" +
6866 if (
ST->getNumElements() !=
ID.UIntVal)
6868 "initializer with struct type has wrong # elements");
6870 return error(
ID.Loc,
"packed'ness of initializer and type don't match");
6873 for (
unsigned i = 0, e =
ID.UIntVal; i != e; ++i)
6874 if (
ID.ConstantStructElts[i]->getType() !=
ST->getElementType(i))
6877 "element " + Twine(i) +
6878 " of struct initializer doesn't match struct element type");
6881 ST,
ArrayRef(
ID.ConstantStructElts.get(),
ID.UIntVal));
6883 return error(
ID.Loc,
"constant expression type mismatch");
6892 auto Loc = Lex.getLoc();
6893 if (parseValID(
ID,
nullptr, Ty))
6906 if (convertValIDToValue(Ty,
ID, V,
nullptr))
6916 return error(Loc,
"expected a constant value");
6920bool LLParser::parseValue(
Type *Ty,
Value *&V, PerFunctionState *PFS) {
6924 FileLoc
Start = getTokLineColumnPos();
6925 bool Ret = parseValID(
ID, PFS, Ty) || convertValIDToValue(Ty,
ID, V, PFS);
6926 if (!Ret && ParserContext) {
6927 FileLoc End = getPrevTokEndLineColumnPos();
6928 ParserContext->addValueReferenceAtLocation(V, FileLocRange(Start, End));
6933bool LLParser::parseTypeAndValue(
Value *&V, PerFunctionState *PFS) {
6935 return parseType(Ty) || parseValue(Ty, V, PFS);
6938bool LLParser::parseTypeAndBasicBlock(
BasicBlock *&BB, LocTy &
Loc,
6939 PerFunctionState &PFS) {
6942 if (parseTypeAndValue(V, PFS))
6945 return error(Loc,
"expected a basic block");
6954 if (!Name.starts_with(
"llvm.dbg."))
6957 return FnID == Intrinsic::dbg_declare || FnID == Intrinsic::dbg_value ||
6958 FnID == Intrinsic::dbg_assign;
6966bool LLParser::parseFunctionHeader(
Function *&Fn,
bool IsDefine,
6967 unsigned &FunctionNumber,
6970 LocTy LinkageLoc = Lex.getLoc();
6972 unsigned Visibility;
6973 unsigned DLLStorageClass;
6975 AttrBuilder RetAttrs(M->getContext());
6978 Type *RetType =
nullptr;
6979 LocTy RetTypeLoc = Lex.getLoc();
6980 if (parseOptionalLinkage(
Linkage, HasLinkage, Visibility, DLLStorageClass,
6982 parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
6983 parseType(RetType, RetTypeLoc,
true ))
6992 return error(LinkageLoc,
"invalid linkage for function definition");
7002 return error(LinkageLoc,
"invalid linkage for function declaration");
7006 return error(LinkageLoc,
"invalid function linkage type");
7010 return error(LinkageLoc,
7011 "symbol with local linkage must have default visibility");
7014 return error(LinkageLoc,
7015 "symbol with local linkage cannot have a DLL storage class");
7018 return error(RetTypeLoc,
"invalid function return type");
7020 LocTy NameLoc = Lex.getLoc();
7022 std::string FunctionName;
7024 FunctionName = Lex.getStrVal();
7026 FunctionNumber = Lex.getUIntVal();
7027 if (checkValueID(NameLoc,
"function",
"@", NumberedVals.getNext(),
7031 return tokError(
"expected function name");
7037 return tokError(
"expected '(' in function argument list");
7041 AttrBuilder FuncAttrs(M->getContext());
7042 std::vector<unsigned> FwdRefAttrGrps;
7045 std::string Partition;
7046 MaybeAlign Alignment, PrefAlignment;
7049 unsigned AddrSpace = 0;
7055 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg) ||
7056 parseOptionalUnnamedAddr(UnnamedAddr) ||
7057 parseOptionalProgramAddrSpace(AddrSpace) ||
7058 parseFnAttributeValuePairs(FuncAttrs, FwdRefAttrGrps,
false,
7062 parseOptionalComdat(FunctionName,
C) ||
7063 parseOptionalAlignment(Alignment) ||
7064 parseOptionalPrefAlignment(PrefAlignment) ||
7065 (EatIfPresent(
lltok::kw_gc) && parseStringConstant(GC)) ||
7069 parseGlobalTypeAndValue(PersonalityFn)))
7072 if (FuncAttrs.contains(Attribute::Builtin))
7073 return error(BuiltinLoc,
"'builtin' attribute not valid on function");
7076 if (MaybeAlign
A = FuncAttrs.getAlignment()) {
7078 FuncAttrs.removeAttribute(Attribute::Alignment);
7083 std::vector<Type*> ParamTypeList;
7086 for (
const ArgInfo &Arg : ArgList) {
7087 ParamTypeList.push_back(Arg.Ty);
7088 Attrs.push_back(Arg.Attrs);
7095 if (PAL.hasParamAttr(0, Attribute::StructRet) && !RetType->
isVoidTy())
7096 return error(RetTypeLoc,
"functions with 'sret' argument must return void");
7102 GlobalValue *FwdFn =
nullptr;
7103 if (!FunctionName.empty()) {
7106 auto FRVI = ForwardRefVals.find(FunctionName);
7107 if (FRVI != ForwardRefVals.end()) {
7108 FwdFn = FRVI->second.first;
7110 return error(FRVI->second.second,
7111 "invalid forward reference to "
7114 "' with wrong type: "
7118 ForwardRefVals.erase(FRVI);
7119 }
else if ((Fn = M->getFunction(FunctionName))) {
7121 return error(NameLoc,
7122 "invalid redefinition of function '" + FunctionName +
"'");
7123 }
else if (M->getNamedValue(FunctionName)) {
7124 return error(NameLoc,
"redefinition of function '@" + FunctionName +
"'");
7130 if (FunctionNumber == (
unsigned)-1)
7131 FunctionNumber = NumberedVals.getNext();
7135 auto I = ForwardRefValIDs.find(FunctionNumber);
7136 if (
I != ForwardRefValIDs.end()) {
7137 FwdFn =
I->second.first;
7139 return error(NameLoc,
"type of definition and forward reference of '@" +
7140 Twine(FunctionNumber) +
7145 ForwardRefValIDs.erase(
I);
7154 if (FunctionName.empty())
7155 NumberedVals.add(FunctionNumber, Fn);
7171 if (!
GC.empty()) Fn->
setGC(GC);
7174 ForwardRefAttrGroups[Fn] = FwdRefAttrGrps;
7178 for (
unsigned i = 0, e = ArgList.size(); i != e; ++i, ++ArgIt) {
7179 if (ParserContext && ArgList[i].IdentLoc)
7180 ParserContext->addInstructionOrArgumentLocation(
7181 &*ArgIt, ArgList[i].IdentLoc.value());
7183 if (ArgList[i].
Name.empty())
continue;
7186 ArgIt->
setName(ArgList[i].Name);
7188 if (ArgIt->
getName() != ArgList[i].Name)
7189 return error(ArgList[i].Loc,
7190 "redefinition of argument '%" + ArgList[i].Name +
"'");
7203 if (FunctionName.empty()) {
7205 ID.UIntVal = FunctionNumber;
7208 ID.StrVal = FunctionName;
7210 auto Blocks = ForwardRefBlockAddresses.find(
ID);
7211 if (Blocks != ForwardRefBlockAddresses.end())
7212 return error(Blocks->first.Loc,
7213 "cannot take blockaddress inside a declaration");
7217bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
7219 if (FunctionNumber == -1) {
7221 ID.StrVal = std::string(F.getName());
7224 ID.UIntVal = FunctionNumber;
7227 auto Blocks = P.ForwardRefBlockAddresses.find(
ID);
7228 if (Blocks == P.ForwardRefBlockAddresses.end())
7231 for (
const auto &
I : Blocks->second) {
7232 const ValID &BBID =
I.first;
7233 GlobalValue *GV =
I.second;
7236 "Expected local id or name");
7243 return P.error(BBID.
Loc,
"referenced value is not a basic block");
7246 ResolvedVal = P.checkValidVariableType(BBID.
Loc, BBID.
StrVal, GV->
getType(),
7254 P.ForwardRefBlockAddresses.erase(Blocks);
7260bool LLParser::parseFunctionBody(Function &Fn,
unsigned FunctionNumber,
7261 ArrayRef<unsigned> UnnamedArgNums) {
7263 return tokError(
"expected '{' in function body");
7266 PerFunctionState PFS(*
this, Fn, FunctionNumber, UnnamedArgNums);
7270 if (PFS.resolveForwardRefBlockAddresses())
7276 return tokError(
"function body requires at least one basic block");
7280 if (parseBasicBlock(PFS))
7284 if (parseUseListOrder(&PFS))
7291 return PFS.finishFunction();
7296bool LLParser::parseBasicBlock(PerFunctionState &PFS) {
7297 FileLoc BBStart = getTokLineColumnPos();
7302 LocTy NameLoc = Lex.getLoc();
7304 Name = Lex.getStrVal();
7307 NameID = Lex.getUIntVal();
7311 BasicBlock *BB = PFS.defineBB(Name, NameID, NameLoc);
7315 std::string NameStr;
7320 auto DeleteDbgRecord = [](DbgRecord *DR) { DR->deleteRecord(); };
7321 using DbgRecordPtr = std::unique_ptr<DbgRecord,
decltype(DeleteDbgRecord)>;
7328 if (SeenOldDbgInfoFormat)
7329 return error(Lex.getLoc(),
"debug record should not appear in a module "
7330 "containing debug info intrinsics");
7331 SeenNewDbgInfoFormat =
true;
7335 if (parseDebugRecord(DR, PFS))
7337 TrailingDbgRecord.emplace_back(DR, DeleteDbgRecord);
7340 FileLoc InstStart = getTokLineColumnPos();
7343 LocTy NameLoc = Lex.getLoc();
7348 NameID = Lex.getUIntVal();
7350 if (parseToken(
lltok::equal,
"expected '=' after instruction id"))
7353 NameStr = Lex.getStrVal();
7355 if (parseToken(
lltok::equal,
"expected '=' after instruction name"))
7359 switch (parseInstruction(Inst, BB, PFS)) {
7362 case InstError:
return true;
7369 if (parseInstructionMetadata(*Inst))
7372 case InstExtraComma:
7377 if (parseInstructionMetadata(*Inst))
7383 if (PFS.setInstName(NameID, NameStr, NameLoc, Inst))
7387 for (DbgRecordPtr &DR : TrailingDbgRecord)
7389 TrailingDbgRecord.clear();
7390 if (ParserContext) {
7391 ParserContext->addInstructionOrArgumentLocation(
7392 Inst, FileLocRange(InstStart, getPrevTokEndLineColumnPos()));
7397 ParserContext->addBlockLocation(
7398 BB, FileLocRange(BBStart, getPrevTokEndLineColumnPos()));
7400 assert(TrailingDbgRecord.empty() &&
7401 "All debug values should have been attached to an instruction.");
7410bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
7413 LocTy DVRLoc = Lex.getLoc();
7415 return error(DVRLoc,
"expected debug record type here");
7416 RecordKind
RecordType = StringSwitch<RecordKind>(Lex.getStrVal())
7417 .Case(
"declare", RecordKind::ValueKind)
7418 .Case(
"value", RecordKind::ValueKind)
7419 .Case(
"assign", RecordKind::ValueKind)
7420 .Case(
"label", RecordKind::LabelKind)
7421 .Case(
"declare_value", RecordKind::ValueKind);
7430 if (parseMDNode(Label))
7435 if (parseMDNode(DbgLoc))
7443 LocType
ValueType = StringSwitch<LocType>(Lex.getStrVal())
7444 .Case(
"declare", LocType::Declare)
7445 .Case(
"value", LocType::Value)
7446 .Case(
"assign", LocType::Assign)
7447 .Case(
"declare_value", LocType::DeclareValue);
7455 if (parseMetadata(ValLocMD, &PFS))
7462 if (parseMDNode(Variable))
7469 if (parseMDNode(Expression))
7475 MDNode *AssignID =
nullptr;
7476 Metadata *AddressLocation =
nullptr;
7477 MDNode *AddressExpression =
nullptr;
7480 if (parseMDNode(AssignID))
7486 if (parseMetadata(AddressLocation, &PFS))
7492 if (parseMDNode(AddressExpression))
7506 ValueType, ValLocMD, Variable, Expression, AssignID, AddressLocation,
7516int LLParser::parseInstruction(Instruction *&Inst, BasicBlock *BB,
7517 PerFunctionState &PFS) {
7520 return tokError(
"found end of file when expecting more instructions");
7521 LocTy Loc = Lex.getLoc();
7522 unsigned KeywordVal = Lex.getUIntVal();
7527 return error(Loc,
"expected instruction opcode");
7531 return parseRet(Inst, BB, PFS);
7533 return parseBr(Inst, PFS);
7535 return parseSwitch(Inst, PFS);
7537 return parseIndirectBr(Inst, PFS);
7539 return parseInvoke(Inst, PFS);
7541 return parseResume(Inst, PFS);
7543 return parseCleanupRet(Inst, PFS);
7545 return parseCatchRet(Inst, PFS);
7547 return parseCatchSwitch(Inst, PFS);
7549 return parseCatchPad(Inst, PFS);
7551 return parseCleanupPad(Inst, PFS);
7553 return parseCallBr(Inst, PFS);
7556 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7557 int Res = parseUnaryOp(Inst, PFS, KeywordVal,
true);
7573 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7585 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7586 int Res = parseArithmetic(Inst, PFS, KeywordVal,
true);
7600 if (parseArithmetic(Inst, PFS, KeywordVal,
false))
7608 return parseArithmetic(Inst, PFS, KeywordVal,
7612 if (parseLogical(Inst, PFS, KeywordVal))
7620 return parseLogical(Inst, PFS, KeywordVal);
7623 if (parseCompare(Inst, PFS, KeywordVal))
7630 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7631 int Res = parseCompare(Inst, PFS, KeywordVal);
7643 bool Res = parseCast(Inst, PFS, KeywordVal);
7655 if (parseCast(Inst, PFS, KeywordVal))
7672 return parseCast(Inst, PFS, KeywordVal);
7675 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7676 if (parseCast(Inst, PFS, KeywordVal))
7685 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7686 int Res = parseSelect(Inst, PFS);
7691 return error(Loc,
"fast-math-flags specified for select without "
7692 "floating-point scalar or vector return type");
7698 return parseVAArg(Inst, PFS);
7700 return parseExtractElement(Inst, PFS);
7702 return parseInsertElement(Inst, PFS);
7704 return parseShuffleVector(Inst, PFS);
7706 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7707 int Res = parsePHI(Inst, PFS);
7712 return error(Loc,
"fast-math-flags specified for phi without "
7713 "floating-point scalar or vector return type");
7719 return parseLandingPad(Inst, PFS);
7721 return parseFreeze(Inst, PFS);
7733 return parseAlloc(Inst, PFS);
7735 return parseLoad(Inst, PFS);
7737 return parseStore(Inst, PFS);
7739 return parseCmpXchg(Inst, PFS);
7741 return parseAtomicRMW(Inst, PFS);
7743 return parseFence(Inst, PFS);
7745 return parseGetElementPtr(Inst, PFS);
7747 return parseExtractValue(Inst, PFS);
7749 return parseInsertValue(Inst, PFS);
7754bool LLParser::parseCmpPredicate(
unsigned &
P,
unsigned Opc) {
7755 if (
Opc == Instruction::FCmp) {
7756 switch (Lex.getKind()) {
7758 return tokError(
"expected fcmp predicate (e.g. 'oeq')");
7777 switch (Lex.getKind()) {
7779 return tokError(
"expected icmp predicate (e.g. 'eq')");
7803bool LLParser::parseRet(Instruction *&Inst, BasicBlock *BB,
7804 PerFunctionState &PFS) {
7805 SMLoc TypeLoc = Lex.getLoc();
7807 if (parseType(Ty,
true ))
7810 Type *ResType = PFS.getFunction().getReturnType();
7814 return error(TypeLoc,
"value doesn't match function result type '" +
7822 if (parseValue(Ty, RV, PFS))
7826 return error(TypeLoc,
"value doesn't match function result type '" +
7836bool LLParser::parseBr(Instruction *&Inst, PerFunctionState &PFS) {
7840 if (parseTypeAndValue(Op0, Loc, PFS))
7849 return error(Loc,
"branch condition must have 'i1' type");
7851 if (parseToken(
lltok::comma,
"expected ',' after branch condition") ||
7852 parseTypeAndBasicBlock(Op1, Loc, PFS) ||
7853 parseToken(
lltok::comma,
"expected ',' after true destination") ||
7854 parseTypeAndBasicBlock(Op2, Loc2, PFS))
7866bool LLParser::parseSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7867 LocTy CondLoc, BBLoc;
7870 if (parseTypeAndValue(
Cond, CondLoc, PFS) ||
7871 parseToken(
lltok::comma,
"expected ',' after switch condition") ||
7872 parseTypeAndBasicBlock(DefaultBB, BBLoc, PFS) ||
7876 if (!
Cond->getType()->isIntegerTy())
7877 return error(CondLoc,
"switch condition must have integer type");
7880 SmallPtrSet<Value*, 32> SeenCases;
7886 if (parseTypeAndValue(Constant, CondLoc, PFS) ||
7887 parseToken(
lltok::comma,
"expected ',' after case value") ||
7888 parseTypeAndBasicBlock(DestBB, PFS))
7891 if (!SeenCases.
insert(Constant).second)
7892 return error(CondLoc,
"duplicate case value in switch");
7894 return error(CondLoc,
"case value is not a constant integer");
7902 for (
const auto &[OnVal, Dest] : Table)
7903 SI->addCase(OnVal, Dest);
7911bool LLParser::parseIndirectBr(Instruction *&Inst, PerFunctionState &PFS) {
7914 if (parseTypeAndValue(
Address, AddrLoc, PFS) ||
7915 parseToken(
lltok::comma,
"expected ',' after indirectbr address") ||
7919 if (!
Address->getType()->isPointerTy())
7920 return error(AddrLoc,
"indirectbr address must have pointer type");
7923 SmallVector<BasicBlock*, 16> DestList;
7927 if (parseTypeAndBasicBlock(DestBB, PFS))
7932 if (parseTypeAndBasicBlock(DestBB, PFS))
7938 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
7942 for (BasicBlock *Dest : DestList)
7952 FunctionType *&FuncTy) {
7958 for (
const ParamInfo &Arg : ArgList)
7972bool LLParser::parseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
7973 LocTy CallLoc = Lex.getLoc();
7974 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
7975 std::vector<unsigned> FwdRefAttrGrps;
7978 unsigned InvokeAddrSpace;
7979 Type *RetType =
nullptr;
7986 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7987 parseOptionalProgramAddrSpace(InvokeAddrSpace) ||
7988 parseType(RetType, RetTypeLoc,
true ) ||
7989 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
7990 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
7992 parseOptionalOperandBundles(BundleList, PFS) ||
7994 parseTypeAndBasicBlock(NormalBB, PFS) ||
7996 parseTypeAndBasicBlock(UnwindBB, PFS))
8003 if (resolveFunctionType(RetType, ArgList, Ty))
8004 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8010 if (convertValIDToValue(
PointerType::get(Context, InvokeAddrSpace), CalleeID,
8015 SmallVector<Value *, 8>
Args;
8022 for (
const ParamInfo &Arg : ArgList) {
8023 Type *ExpectedTy =
nullptr;
8026 }
else if (!Ty->isVarArg()) {
8027 return error(Arg.Loc,
"too many arguments specified");
8030 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8031 return error(Arg.Loc,
"argument is not of expected type '" +
8033 Args.push_back(Arg.V);
8038 return error(CallLoc,
"not enough parameters specified for call");
8047 II->setCallingConv(CC);
8048 II->setAttributes(PAL);
8049 ForwardRefAttrGroups[
II] = FwdRefAttrGrps;
8056bool LLParser::parseResume(Instruction *&Inst, PerFunctionState &PFS) {
8058 if (parseTypeAndValue(Exn, ExnLoc, PFS))
8066bool LLParser::parseExceptionArgs(SmallVectorImpl<Value *> &Args,
8067 PerFunctionState &PFS) {
8068 if (parseToken(
lltok::lsquare,
"expected '[' in catchpad/cleanuppad"))
8073 if (!
Args.empty() &&
8074 parseToken(
lltok::comma,
"expected ',' in argument list"))
8079 Type *ArgTy =
nullptr;
8080 if (parseType(ArgTy, ArgLoc))
8085 if (parseMetadataAsValue(V, PFS))
8088 if (parseValue(ArgTy, V, PFS))
8100bool LLParser::parseCleanupRet(Instruction *&Inst, PerFunctionState &PFS) {
8101 Value *CleanupPad =
nullptr;
8103 if (parseToken(
lltok::kw_from,
"expected 'from' after cleanupret"))
8118 if (parseTypeAndBasicBlock(UnwindBB, PFS)) {
8129bool LLParser::parseCatchRet(Instruction *&Inst, PerFunctionState &PFS) {
8130 Value *CatchPad =
nullptr;
8132 if (parseToken(
lltok::kw_from,
"expected 'from' after catchret"))
8139 if (parseToken(
lltok::kw_to,
"expected 'to' in catchret") ||
8140 parseTypeAndBasicBlock(BB, PFS))
8149bool LLParser::parseCatchSwitch(Instruction *&Inst, PerFunctionState &PFS) {
8157 return tokError(
"expected scope value for catchswitch");
8162 if (parseToken(
lltok::lsquare,
"expected '[' with catchswitch labels"))
8168 if (parseTypeAndBasicBlock(DestBB, PFS))
8173 if (parseToken(
lltok::rsquare,
"expected ']' after catchswitch labels"))
8176 if (parseToken(
lltok::kw_unwind,
"expected 'unwind' after catchswitch scope"))
8184 if (parseTypeAndBasicBlock(UnwindBB, PFS))
8190 for (BasicBlock *DestBB : Table)
8191 CatchSwitch->addHandler(DestBB);
8198bool LLParser::parseCatchPad(Instruction *&Inst, PerFunctionState &PFS) {
8199 Value *CatchSwitch =
nullptr;
8205 return tokError(
"expected scope value for catchpad");
8210 SmallVector<Value *, 8>
Args;
8211 if (parseExceptionArgs(Args, PFS))
8220bool LLParser::parseCleanupPad(Instruction *&Inst, PerFunctionState &PFS) {
8221 Value *ParentPad =
nullptr;
8228 return tokError(
"expected scope value for cleanuppad");
8233 SmallVector<Value *, 8>
Args;
8234 if (parseExceptionArgs(Args, PFS))
8250bool LLParser::parseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
8251 unsigned Opc,
bool IsFP) {
8253 if (parseTypeAndValue(
LHS, Loc, PFS))
8260 return error(Loc,
"invalid operand type for instruction");
8270bool LLParser::parseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
8271 LocTy CallLoc = Lex.getLoc();
8272 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8273 std::vector<unsigned> FwdRefAttrGrps;
8276 Type *RetType =
nullptr;
8283 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8284 parseType(RetType, RetTypeLoc,
true ) ||
8285 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
8286 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false,
8288 parseOptionalOperandBundles(BundleList, PFS) ||
8290 parseTypeAndBasicBlock(DefaultDest, PFS) ||
8295 SmallVector<BasicBlock *, 16> IndirectDests;
8299 if (parseTypeAndBasicBlock(DestBB, PFS))
8304 if (parseTypeAndBasicBlock(DestBB, PFS))
8310 if (parseToken(
lltok::rsquare,
"expected ']' at end of block list"))
8317 if (resolveFunctionType(RetType, ArgList, Ty))
8318 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8329 SmallVector<Value *, 8>
Args;
8336 for (
const ParamInfo &Arg : ArgList) {
8337 Type *ExpectedTy =
nullptr;
8340 }
else if (!Ty->isVarArg()) {
8341 return error(Arg.Loc,
"too many arguments specified");
8344 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8345 return error(Arg.Loc,
"argument is not of expected type '" +
8347 Args.push_back(Arg.V);
8352 return error(CallLoc,
"not enough parameters specified for call");
8364 ForwardRefAttrGroups[CBI] = FwdRefAttrGrps;
8378bool LLParser::parseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
8379 unsigned Opc,
bool IsFP) {
8381 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8382 parseToken(
lltok::comma,
"expected ',' in arithmetic operation") ||
8390 return error(Loc,
"invalid operand type for instruction");
8398bool LLParser::parseLogical(Instruction *&Inst, PerFunctionState &PFS,
8401 if (parseTypeAndValue(
LHS, Loc, PFS) ||
8402 parseToken(
lltok::comma,
"expected ',' in logical operation") ||
8408 "instruction requires integer or integer vector operands");
8417bool LLParser::parseCompare(Instruction *&Inst, PerFunctionState &PFS,
8423 if (parseCmpPredicate(Pred,
Opc) || parseTypeAndValue(
LHS, Loc, PFS) ||
8424 parseToken(
lltok::comma,
"expected ',' after compare value") ||
8428 if (
Opc == Instruction::FCmp) {
8430 return error(Loc,
"fcmp requires floating point operands");
8433 assert(
Opc == Instruction::ICmp &&
"Unknown opcode for CmpInst!");
8436 return error(Loc,
"icmp requires integer operands");
8448bool LLParser::parseCast(Instruction *&Inst, PerFunctionState &PFS,
8452 Type *DestTy =
nullptr;
8453 if (parseTypeAndValue(
Op, Loc, PFS) ||
8454 parseToken(
lltok::kw_to,
"expected 'to' after cast value") ||
8459 return error(Loc,
"invalid cast opcode for cast from '" +
8468bool LLParser::parseSelect(Instruction *&Inst, PerFunctionState &PFS) {
8470 Value *Op0, *Op1, *Op2;
8471 if (parseTypeAndValue(Op0, Loc, PFS) ||
8472 parseToken(
lltok::comma,
"expected ',' after select condition") ||
8473 parseTypeAndValue(Op1, PFS) ||
8474 parseToken(
lltok::comma,
"expected ',' after select value") ||
8475 parseTypeAndValue(Op2, PFS))
8479 return error(Loc, Reason);
8487bool LLParser::parseVAArg(Instruction *&Inst, PerFunctionState &PFS) {
8489 Type *EltTy =
nullptr;
8491 if (parseTypeAndValue(
Op, PFS) ||
8492 parseToken(
lltok::comma,
"expected ',' after vaarg operand") ||
8493 parseType(EltTy, TypeLoc))
8497 return error(TypeLoc,
"va_arg requires operand with first class type");
8499 Inst =
new VAArgInst(
Op, EltTy);
8505bool LLParser::parseExtractElement(Instruction *&Inst, PerFunctionState &PFS) {
8508 if (parseTypeAndValue(Op0, Loc, PFS) ||
8509 parseToken(
lltok::comma,
"expected ',' after extract value") ||
8510 parseTypeAndValue(Op1, PFS))
8514 return error(Loc,
"invalid extractelement operands");
8522bool LLParser::parseInsertElement(Instruction *&Inst, PerFunctionState &PFS) {
8524 Value *Op0, *Op1, *Op2;
8525 if (parseTypeAndValue(Op0, Loc, PFS) ||
8526 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8527 parseTypeAndValue(Op1, PFS) ||
8528 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8529 parseTypeAndValue(Op2, PFS))
8533 return error(Loc,
"invalid insertelement operands");
8541bool LLParser::parseShuffleVector(Instruction *&Inst, PerFunctionState &PFS) {
8543 Value *Op0, *Op1, *Op2;
8544 if (parseTypeAndValue(Op0, Loc, PFS) ||
8545 parseToken(
lltok::comma,
"expected ',' after shuffle mask") ||
8546 parseTypeAndValue(Op1, PFS) ||
8547 parseToken(
lltok::comma,
"expected ',' after shuffle value") ||
8548 parseTypeAndValue(Op2, PFS))
8552 return error(Loc,
"invalid shufflevector operands");
8554 Inst =
new ShuffleVectorInst(Op0, Op1, Op2);
8560int LLParser::parsePHI(Instruction *&Inst, PerFunctionState &PFS) {
8564 if (parseType(Ty, TypeLoc))
8568 return error(TypeLoc,
"phi node must have first class type");
8571 bool AteExtraComma =
false;
8583 AteExtraComma =
true;
8587 if (parseToken(
lltok::lsquare,
"expected '[' in phi value list") ||
8588 parseValue(Ty, Op0, PFS) ||
8589 parseToken(
lltok::comma,
"expected ',' after insertelement value") ||
8598 for (
const auto &[Val, BB] : PHIVals)
8601 return AteExtraComma ? InstExtraComma : InstNormal;
8610bool LLParser::parseLandingPad(Instruction *&Inst, PerFunctionState &PFS) {
8613 if (parseType(Ty, TyLoc))
8626 return tokError(
"expected 'catch' or 'filter' clause type");
8630 if (parseTypeAndValue(V, VLoc, PFS))
8637 return error(VLoc,
"'catch' clause has an invalid type");
8640 return error(VLoc,
"'filter' clause has an invalid type");
8645 return error(VLoc,
"clause argument must be a constant");
8649 Inst = LP.release();
8655bool LLParser::parseFreeze(Instruction *&Inst, PerFunctionState &PFS) {
8658 if (parseTypeAndValue(
Op, Loc, PFS))
8661 Inst =
new FreezeInst(
Op);
8674bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS,
8676 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8677 std::vector<unsigned> FwdRefAttrGrps;
8679 unsigned CallAddrSpace;
8681 Type *RetType =
nullptr;
8686 LocTy CallLoc = Lex.getLoc();
8690 "expected 'tail call', 'musttail call', or 'notail call'"))
8693 FastMathFlags FMF = EatFastMathFlagsIfPresent();
8695 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8696 parseOptionalProgramAddrSpace(CallAddrSpace) ||
8697 parseType(RetType, RetTypeLoc,
true ) ||
8698 parseValID(CalleeID, &PFS) ||
8700 PFS.getFunction().isVarArg()) ||
8701 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps,
false, BuiltinLoc) ||
8702 parseOptionalOperandBundles(BundleList, PFS))
8709 if (resolveFunctionType(RetType, ArgList, Ty))
8710 return error(RetTypeLoc,
"Invalid result type for LLVM function");
8716 if (convertValIDToValue(
PointerType::get(Context, CallAddrSpace), CalleeID,
8723 SmallVector<Value*, 8>
Args;
8729 for (
const ParamInfo &Arg : ArgList) {
8730 Type *ExpectedTy =
nullptr;
8733 }
else if (!Ty->isVarArg()) {
8734 return error(Arg.Loc,
"too many arguments specified");
8737 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8738 return error(Arg.Loc,
"argument is not of expected type '" +
8740 Args.push_back(Arg.V);
8741 Attrs.push_back(Arg.Attrs);
8745 return error(CallLoc,
"not enough parameters specified for call");
8758 return error(CallLoc,
"fast-math-flags specified for call without "
8759 "floating-point scalar or vector return type");
8766 if (SeenNewDbgInfoFormat) {
8768 return error(CallLoc,
"llvm.dbg intrinsic should not appear in a module "
8769 "using non-intrinsic debug info");
8771 SeenOldDbgInfoFormat =
true;
8774 ForwardRefAttrGroups[CI] = FwdRefAttrGrps;
8786int LLParser::parseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
8788 LocTy SizeLoc, TyLoc, ASLoc;
8789 MaybeAlign Alignment;
8790 unsigned AddrSpace = 0;
8793 bool IsInAlloca = EatIfPresent(lltok::kw_inalloca);
8794 bool IsSwiftError = EatIfPresent(lltok::kw_swifterror);
8796 if (parseType(Ty, TyLoc))
8800 return error(TyLoc,
"invalid type for alloca");
8802 bool AteExtraComma =
false;
8804 if (Lex.getKind() == lltok::kw_align) {
8805 if (parseOptionalAlignment(Alignment))
8807 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8810 ASLoc = Lex.getLoc();
8811 if (parseOptionalAddrSpace(AddrSpace))
8814 AteExtraComma =
true;
8816 if (parseTypeAndValue(
Size, SizeLoc, PFS))
8819 if (Lex.getKind() == lltok::kw_align) {
8820 if (parseOptionalAlignment(Alignment))
8822 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8825 ASLoc = Lex.getLoc();
8826 if (parseOptionalAddrSpace(AddrSpace))
8829 AteExtraComma =
true;
8835 if (
Size && !
Size->getType()->isIntegerTy())
8836 return error(SizeLoc,
"element count must have integer type");
8838 SmallPtrSet<Type *, 4> Visited;
8839 if (!Alignment && !Ty->
isSized(&Visited))
8840 return error(TyLoc,
"Cannot allocate unsized type");
8842 Alignment = M->getDataLayout().getPrefTypeAlign(Ty);
8843 AllocaInst *AI =
new AllocaInst(Ty, AddrSpace,
Size, *Alignment);
8847 return AteExtraComma ? InstExtraComma : InstNormal;
8854int LLParser::parseLoad(Instruction *&Inst, PerFunctionState &PFS) {
8856 MaybeAlign Alignment;
8857 bool AteExtraComma =
false;
8858 bool isAtomic =
false;
8867 bool isVolatile =
false;
8874 LocTy ExplicitTypeLoc = Lex.getLoc();
8875 if (parseType(Ty) ||
8876 parseToken(
lltok::comma,
"expected comma after load's type") ||
8877 parseTypeAndValue(Val, Loc, PFS) ||
8878 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8879 parseOptionalCommaAlign(Alignment, AteExtraComma))
8883 return error(Loc,
"load operand must be a pointer to a first class type");
8884 if (isAtomic && !Alignment)
8885 return error(Loc,
"atomic load must have explicit non-zero alignment");
8888 return error(Loc,
"atomic load cannot use Release ordering");
8890 SmallPtrSet<Type *, 4> Visited;
8891 if (!Alignment && !Ty->
isSized(&Visited))
8892 return error(ExplicitTypeLoc,
"loading unsized types is not allowed");
8894 Alignment = M->getDataLayout().getABITypeAlign(Ty);
8895 Inst =
new LoadInst(Ty, Val,
"", isVolatile, *Alignment, Ordering, SSID);
8896 return AteExtraComma ? InstExtraComma : InstNormal;
8904int LLParser::parseStore(Instruction *&Inst, PerFunctionState &PFS) {
8906 MaybeAlign Alignment;
8907 bool AteExtraComma =
false;
8908 bool isAtomic =
false;
8917 bool isVolatile =
false;
8923 if (parseTypeAndValue(Val, Loc, PFS) ||
8924 parseToken(
lltok::comma,
"expected ',' after store operand") ||
8925 parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8926 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8927 parseOptionalCommaAlign(Alignment, AteExtraComma))
8931 return error(PtrLoc,
"store operand must be a pointer");
8933 return error(Loc,
"store operand must be a first class value");
8934 if (isAtomic && !Alignment)
8935 return error(Loc,
"atomic store must have explicit non-zero alignment");
8938 return error(Loc,
"atomic store cannot use Acquire ordering");
8939 SmallPtrSet<Type *, 4> Visited;
8941 return error(Loc,
"storing unsized types is not allowed");
8943 Alignment = M->getDataLayout().getABITypeAlign(Val->
getType());
8945 Inst =
new StoreInst(Val, Ptr, isVolatile, *Alignment, Ordering, SSID);
8946 return AteExtraComma ? InstExtraComma : InstNormal;
8953int LLParser::parseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {
8955 bool AteExtraComma =
false;
8959 bool isVolatile =
false;
8960 bool isWeak =
false;
8961 MaybeAlign Alignment;
8969 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8970 parseToken(
lltok::comma,
"expected ',' after cmpxchg address") ||
8971 parseTypeAndValue(Cmp, CmpLoc, PFS) ||
8972 parseToken(
lltok::comma,
"expected ',' after cmpxchg cmp operand") ||
8973 parseTypeAndValue(New, NewLoc, PFS) ||
8974 parseScopeAndOrdering(
true , SSID, SuccessOrdering) ||
8975 parseOrdering(FailureOrdering) ||
8976 parseOptionalCommaAlign(Alignment, AteExtraComma))
8980 return tokError(
"invalid cmpxchg success ordering");
8982 return tokError(
"invalid cmpxchg failure ordering");
8984 return error(PtrLoc,
"cmpxchg operand must be a pointer");
8985 if (
Cmp->getType() !=
New->getType())
8986 return error(NewLoc,
"compare value and new value type do not match");
8987 if (!
New->getType()->isFirstClassType())
8988 return error(NewLoc,
"cmpxchg operand must be a first class value");
8990 const Align DefaultAlignment(
8991 PFS.getFunction().getDataLayout().getTypeStoreSize(
8994 AtomicCmpXchgInst *CXI =
8995 new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment.value_or(DefaultAlignment),
8996 SuccessOrdering, FailureOrdering, SSID);
9001 return AteExtraComma ? InstExtraComma : InstNormal;
9007int LLParser::parseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {
9009 bool AteExtraComma =
false;
9012 bool isVolatile =
false;
9015 MaybeAlign Alignment;
9020 switch (Lex.getKind()) {
9022 return tokError(
"expected binary operation in atomicrmw");
9081 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
9082 parseToken(
lltok::comma,
"expected ',' after atomicrmw address") ||
9083 parseTypeAndValue(Val, ValLoc, PFS) ||
9084 parseScopeAndOrdering(
true , SSID, Ordering) ||
9085 parseOptionalCommaAlign(Alignment, AteExtraComma))
9089 return tokError(
"atomicrmw cannot be unordered");
9091 return error(PtrLoc,
"atomicrmw operand must be a pointer");
9093 return error(ValLoc,
"atomicrmw operand may not be scalable");
9102 " operand must be an integer, floating point, or pointer type");
9106 return error(ValLoc,
"atomicrmw " +
9108 " operand must be a floating point type");
9112 return error(ValLoc,
"atomicrmw " +
9114 " operand must be an integer");
9119 PFS.getFunction().getDataLayout().getTypeStoreSizeInBits(
9122 return error(ValLoc,
"atomicrmw operand must be power-of-two byte-sized"
9124 const Align DefaultAlignment(
9125 PFS.getFunction().getDataLayout().getTypeStoreSize(
9127 AtomicRMWInst *RMWI =
9129 Alignment.value_or(DefaultAlignment), Ordering, SSID);
9132 return AteExtraComma ? InstExtraComma : InstNormal;
9137int LLParser::parseFence(Instruction *&Inst, PerFunctionState &PFS) {
9140 if (parseScopeAndOrdering(
true , SSID, Ordering))
9144 return tokError(
"fence cannot be unordered");
9146 return tokError(
"fence cannot be monotonic");
9148 Inst =
new FenceInst(Context, Ordering, SSID);
9154int LLParser::parseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
9155 Value *Ptr =
nullptr;
9156 Value *Val =
nullptr;
9172 if (parseType(Ty) ||
9173 parseToken(
lltok::comma,
"expected comma after getelementptr's type") ||
9174 parseTypeAndValue(Ptr, Loc, PFS))
9179 if (!BasePointerType)
9180 return error(Loc,
"base of getelementptr must be a pointer");
9182 SmallVector<Value*, 16> Indices;
9183 bool AteExtraComma =
false;
9186 ElementCount GEPWidth =
BaseType->isVectorTy()
9192 AteExtraComma =
true;
9195 if (parseTypeAndValue(Val, EltLoc, PFS))
9198 return error(EltLoc,
"getelementptr index must be an integer");
9201 ElementCount ValNumEl = ValVTy->getElementCount();
9205 "getelementptr vector index has a wrong number of elements");
9206 GEPWidth = ValNumEl;
9211 SmallPtrSet<Type*, 4> Visited;
9213 return error(Loc,
"base element of getelementptr must be sized");
9217 return error(Loc,
"getelementptr cannot target structure that contains "
9218 "scalable vector type");
9221 return error(Loc,
"invalid getelementptr indices");
9224 GEP->setNoWrapFlags(NW);
9225 return AteExtraComma ? InstExtraComma : InstNormal;
9230int LLParser::parseExtractValue(Instruction *&Inst, PerFunctionState &PFS) {
9232 SmallVector<unsigned, 4> Indices;
9234 if (parseTypeAndValue(Val, Loc, PFS) ||
9235 parseIndexList(Indices, AteExtraComma))
9239 return error(Loc,
"extractvalue operand must be aggregate type");
9242 return error(Loc,
"invalid indices for extractvalue");
9244 return AteExtraComma ? InstExtraComma : InstNormal;
9249int LLParser::parseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
9251 SmallVector<unsigned, 4> Indices;
9253 if (parseTypeAndValue(Val0, Loc0, PFS) ||
9254 parseToken(
lltok::comma,
"expected comma after insertvalue operand") ||
9255 parseTypeAndValue(Val1, Loc1, PFS) ||
9256 parseIndexList(Indices, AteExtraComma))
9260 return error(Loc0,
"insertvalue operand must be aggregate type");
9264 return error(Loc0,
"invalid indices for insertvalue");
9265 if (IndexedType != Val1->
getType())
9266 return error(Loc1,
"insertvalue operand and field disagree in type: '" +
9270 return AteExtraComma ? InstExtraComma : InstNormal;
9281bool LLParser::parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts) {
9296 if (parseMetadata(MD,
nullptr))
9301 return parseToken(
lltok::rbrace,
"expected end of metadata node");
9307bool LLParser::sortUseListOrder(
Value *V, ArrayRef<unsigned> Indexes,
9309 if (!
V->hasUseList())
9312 return error(Loc,
"value has no uses");
9314 unsigned NumUses = 0;
9315 SmallDenseMap<const Use *, unsigned, 16> Order;
9316 for (
const Use &U :
V->uses()) {
9317 if (++NumUses > Indexes.
size())
9319 Order[&
U] = Indexes[NumUses - 1];
9322 return error(Loc,
"value only has one use");
9323 if (Order.
size() != Indexes.
size() || NumUses > Indexes.
size())
9325 "wrong number of indexes, expected " + Twine(
V->getNumUses()));
9327 V->sortUseList([&](
const Use &L,
const Use &R) {
9335bool LLParser::parseUseListOrderIndexes(SmallVectorImpl<unsigned> &Indexes) {
9336 SMLoc Loc = Lex.getLoc();
9340 return tokError(
"expected non-empty list of uselistorder indexes");
9347 bool IsOrdered =
true;
9348 assert(Indexes.
empty() &&
"Expected empty order vector");
9351 if (parseUInt32(Index))
9356 Max = std::max(Max, Index);
9357 IsOrdered &= Index == Indexes.
size();
9365 if (Indexes.
size() < 2)
9366 return error(Loc,
"expected >= 2 uselistorder indexes");
9369 "expected distinct uselistorder indexes in range [0, size)");
9371 return error(Loc,
"expected uselistorder indexes to change the order");
9378bool LLParser::parseUseListOrder(PerFunctionState *PFS) {
9379 SMLoc Loc = Lex.getLoc();
9384 SmallVector<unsigned, 16> Indexes;
9385 if (parseTypeAndValue(V, PFS) ||
9386 parseToken(
lltok::comma,
"expected comma in uselistorder directive") ||
9387 parseUseListOrderIndexes(Indexes))
9390 return sortUseListOrder(V, Indexes, Loc);
9395bool LLParser::parseUseListOrderBB() {
9397 SMLoc Loc = Lex.getLoc();
9401 SmallVector<unsigned, 16> Indexes;
9402 if (parseValID(Fn,
nullptr) ||
9403 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9404 parseValID(Label,
nullptr) ||
9405 parseToken(
lltok::comma,
"expected comma in uselistorder_bb directive") ||
9406 parseUseListOrderIndexes(Indexes))
9412 GV = M->getNamedValue(Fn.
StrVal);
9414 GV = NumberedVals.get(Fn.
UIntVal);
9416 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9419 "invalid function forward reference in uselistorder_bb");
9422 return error(Fn.
Loc,
"expected function name in uselistorder_bb");
9423 if (
F->isDeclaration())
9424 return error(Fn.
Loc,
"invalid declaration in uselistorder_bb");
9428 return error(
Label.Loc,
"invalid numeric label in uselistorder_bb");
9430 return error(
Label.Loc,
"expected basic block name in uselistorder_bb");
9431 Value *
V =
F->getValueSymbolTable()->lookup(
Label.StrVal);
9433 return error(
Label.Loc,
"invalid basic block in uselistorder_bb");
9435 return error(
Label.Loc,
"expected basic block in uselistorder_bb");
9437 return sortUseListOrder(V, Indexes, Loc);
9443bool LLParser::parseModuleEntry(
unsigned ID) {
9452 parseStringConstant(Path) ||
9460 if (parseUInt32(Hash[0]) || parseToken(
lltok::comma,
"expected ',' here") ||
9461 parseUInt32(Hash[1]) || parseToken(
lltok::comma,
"expected ',' here") ||
9462 parseUInt32(Hash[2]) || parseToken(
lltok::comma,
"expected ',' here") ||
9463 parseUInt32(Hash[3]) || parseToken(
lltok::comma,
"expected ',' here") ||
9464 parseUInt32(Hash[4]))
9471 auto ModuleEntry = Index->addModule(Path, Hash);
9472 ModuleIdMap[
ID] = ModuleEntry->first();
9479bool LLParser::parseTypeIdEntry(
unsigned ID) {
9488 parseStringConstant(Name))
9491 TypeIdSummary &TIS = Index->getOrInsertTypeIdSummary(Name);
9493 parseTypeIdSummary(TIS) || parseToken(
lltok::rparen,
"expected ')' here"))
9498 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9499 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9500 for (
auto TIDRef : FwdRefTIDs->second) {
9502 "Forward referenced type id GUID expected to be 0");
9505 ForwardRefTypeIds.erase(FwdRefTIDs);
9513bool LLParser::parseTypeIdSummary(TypeIdSummary &TIS) {
9517 parseTypeTestResolution(TIS.
TTRes))
9522 if (parseOptionalWpdResolutions(TIS.
WPDRes))
9533 ValueInfo(
false, (GlobalValueSummaryMapTy::value_type *)-8);
9539bool LLParser::parseTypeIdCompatibleVtableEntry(
unsigned ID) {
9548 parseStringConstant(Name))
9552 Index->getOrInsertTypeIdCompatibleVtableSummary(Name);
9559 IdToIndexMapType IdToIndexMap;
9572 if (parseGVReference(VI, GVId))
9579 IdToIndexMap[GVId].push_back(std::make_pair(TI.size(),
Loc));
9580 TI.push_back({
Offset, VI});
9588 for (
auto I : IdToIndexMap) {
9589 auto &Infos = ForwardRefValueInfos[
I.first];
9590 for (
auto P :
I.second) {
9592 "Forward referenced ValueInfo expected to be empty");
9593 Infos.emplace_back(&TI[
P.first].VTableVI,
P.second);
9603 auto FwdRefTIDs = ForwardRefTypeIds.find(
ID);
9604 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
9605 for (
auto TIDRef : FwdRefTIDs->second) {
9607 "Forward referenced type id GUID expected to be 0");
9610 ForwardRefTypeIds.erase(FwdRefTIDs);
9622bool LLParser::parseTypeTestResolution(TypeTestResolution &TTRes) {
9630 switch (Lex.getKind()) {
9650 return error(Lex.getLoc(),
"unexpected TypeTestResolution kind");
9662 switch (Lex.getKind()) {
9677 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(Val))
9690 return error(Lex.getLoc(),
"expected optional TypeTestResolution field");
9703bool LLParser::parseOptionalWpdResolutions(
9704 std::map<uint64_t, WholeProgramDevirtResolution> &WPDResMap) {
9712 WholeProgramDevirtResolution WPDRes;
9716 parseToken(
lltok::comma,
"expected ',' here") || parseWpdRes(WPDRes) ||
9719 WPDResMap[
Offset] = WPDRes;
9736bool LLParser::parseWpdRes(WholeProgramDevirtResolution &WPDRes) {
9744 switch (Lex.getKind()) {
9755 return error(Lex.getLoc(),
"unexpected WholeProgramDevirtResolution kind");
9761 switch (Lex.getKind()) {
9769 if (parseOptionalResByArg(WPDRes.
ResByArg))
9773 return error(Lex.getLoc(),
9774 "expected optional WholeProgramDevirtResolution field");
9791bool LLParser::parseOptionalResByArg(
9792 std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>
9800 std::vector<uint64_t>
Args;
9801 if (parseArgs(Args) || parseToken(
lltok::comma,
"expected ',' here") ||
9809 WholeProgramDevirtResolution::ByArg ByArg;
9810 switch (Lex.getKind()) {
9824 return error(Lex.getLoc(),
9825 "unexpected WholeProgramDevirtResolution::ByArg kind");
9831 switch (Lex.getKind()) {
9835 parseUInt64(ByArg.
Info))
9841 parseUInt32(ByArg.
Byte))
9847 parseUInt32(ByArg.
Bit))
9851 return error(Lex.getLoc(),
9852 "expected optional whole program devirt field");
9859 ResByArg[
Args] = ByArg;
9870bool LLParser::parseArgs(std::vector<uint64_t> &Args) {
9878 if (parseUInt64(Val))
9880 Args.push_back(Val);
9889static const auto FwdVIRef = (GlobalValueSummaryMapTy::value_type *)-8;
9904bool LLParser::addGlobalValueToIndex(
9906 unsigned ID, std::unique_ptr<GlobalValueSummary> Summary,
LocTy Loc) {
9911 VI = Index->getOrInsertValueInfo(GUID);
9915 auto *GV = M->getNamedValue(Name);
9917 return error(Loc,
"Reference to undefined global \"" + Name +
"\"");
9919 VI = Index->getOrInsertValueInfo(GV);
9923 "Need a source_filename to compute GUID for local");
9926 VI = Index->getOrInsertValueInfo(GUID, Index->saveString(Name));
9931 auto FwdRefVIs = ForwardRefValueInfos.find(
ID);
9932 if (FwdRefVIs != ForwardRefValueInfos.end()) {
9933 for (
auto VIRef : FwdRefVIs->second) {
9935 "Forward referenced ValueInfo expected to be empty");
9938 ForwardRefValueInfos.erase(FwdRefVIs);
9942 auto FwdRefAliasees = ForwardRefAliasees.find(
ID);
9943 if (FwdRefAliasees != ForwardRefAliasees.end()) {
9944 for (
auto AliaseeRef : FwdRefAliasees->second) {
9945 assert(!AliaseeRef.first->hasAliasee() &&
9946 "Forward referencing alias already has aliasee");
9947 assert(Summary &&
"Aliasee must be a definition");
9948 AliaseeRef.first->setAliasee(VI,
Summary.get());
9950 ForwardRefAliasees.erase(FwdRefAliasees);
9955 Index->addGlobalValueSummary(VI, std::move(Summary));
9958 if (
ID == NumberedValueInfos.size())
9959 NumberedValueInfos.push_back(VI);
9962 if (
ID > NumberedValueInfos.size())
9963 NumberedValueInfos.resize(
ID + 1);
9964 NumberedValueInfos[
ID] =
VI;
9972bool LLParser::parseSummaryIndexFlags() {
9979 if (parseUInt64(Flags))
9982 Index->setFlags(Flags);
9988bool LLParser::parseBlockCount() {
9994 uint64_t BlockCount;
9995 if (parseUInt64(BlockCount))
9998 Index->setBlockCount(BlockCount);
10006bool LLParser::parseGVEntry(
unsigned ID) {
10014 LocTy Loc = Lex.getLoc();
10017 switch (Lex.getKind()) {
10021 parseStringConstant(Name))
10027 if (parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(GUID))
10031 return error(Lex.getLoc(),
"expected name or guid tag");
10054 switch (Lex.getKind()) {
10056 if (parseFunctionSummary(Name, GUID,
ID))
10060 if (parseVariableSummary(Name, GUID,
ID))
10064 if (parseAliasSummary(Name, GUID,
ID))
10068 return error(Lex.getLoc(),
"expected summary type");
10086 LocTy Loc = Lex.getLoc();
10090 StringRef ModulePath;
10091 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
10094 false,
false,
false,
10096 unsigned InstCount;
10098 FunctionSummary::TypeIdInfo TypeIdInfo;
10099 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
10101 std::vector<CallsiteInfo> Callsites;
10102 std::vector<AllocInfo> Allocs;
10104 FunctionSummary::FFlags FFlags = {};
10107 parseModuleReference(ModulePath) ||
10108 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
10111 parseToken(
lltok::colon,
"expected ':' here") || parseUInt32(InstCount))
10116 switch (Lex.getKind()) {
10118 if (parseOptionalFFlags(FFlags))
10122 if (parseOptionalCalls(Calls))
10126 if (parseOptionalTypeIdInfo(TypeIdInfo))
10130 if (parseOptionalRefs(Refs))
10134 if (parseOptionalParamAccesses(ParamAccesses))
10138 if (parseOptionalAllocs(Allocs))
10142 if (parseOptionalCallsites(Callsites))
10146 return error(Lex.getLoc(),
"expected optional function summary field");
10153 auto FS = std::make_unique<FunctionSummary>(
10154 GVFlags, InstCount, FFlags, std::move(Refs), std::move(Calls),
10160 std::move(ParamAccesses), std::move(Callsites), std::move(Allocs));
10162 FS->setModulePath(ModulePath);
10164 return addGlobalValueToIndex(Name, GUID,
10166 std::move(FS), Loc);
10174 LocTy Loc = Lex.getLoc();
10178 StringRef ModulePath;
10179 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
10182 false,
false,
false,
10184 GlobalVarSummary::GVarFlags GVarFlags(
false,
10192 parseModuleReference(ModulePath) ||
10193 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
10195 parseGVarFlags(GVarFlags))
10200 switch (Lex.getKind()) {
10202 if (parseOptionalVTableFuncs(VTableFuncs))
10206 if (parseOptionalRefs(Refs))
10210 return error(Lex.getLoc(),
"expected optional variable summary field");
10218 std::make_unique<GlobalVarSummary>(GVFlags, GVarFlags, std::move(Refs));
10220 GS->setModulePath(ModulePath);
10221 GS->setVTableFuncs(std::move(VTableFuncs));
10223 return addGlobalValueToIndex(Name, GUID,
10225 std::move(GS), Loc);
10234 LocTy Loc = Lex.getLoc();
10237 StringRef ModulePath;
10238 GlobalValueSummary::GVFlags GVFlags = GlobalValueSummary::GVFlags(
10241 false,
false,
false,
10245 parseModuleReference(ModulePath) ||
10246 parseToken(
lltok::comma,
"expected ',' here") || parseGVFlags(GVFlags) ||
10252 ValueInfo AliaseeVI;
10254 auto AS = std::make_unique<AliasSummary>(GVFlags);
10255 AS->setModulePath(ModulePath);
10258 if (parseGVReference(AliaseeVI, GVId))
10263 ForwardRefAliasees[GVId].emplace_back(AS.get(), Loc);
10265 auto Summary = Index->findSummaryInModule(AliaseeVI, ModulePath);
10266 assert(Summary &&
"Aliasee must be a definition");
10267 AS->setAliasee(AliaseeVI, Summary);
10274 return addGlobalValueToIndex(Name, GUID,
10276 std::move(AS), Loc);
10281bool LLParser::parseFlag(
unsigned &Val) {
10282 if (Lex.getKind() !=
lltok::APSInt || Lex.getAPSIntVal().isSigned())
10283 return tokError(
"expected integer");
10284 Val = (unsigned)Lex.getAPSIntVal().getBoolValue();
10300bool LLParser::parseOptionalFFlags(FunctionSummary::FFlags &FFlags) {
10304 if (parseToken(
lltok::colon,
"expected ':' in funcFlags") ||
10310 switch (Lex.getKind()) {
10313 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10319 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10325 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10331 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10337 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10343 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10349 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10355 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10361 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10367 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Val))
10372 return error(Lex.getLoc(),
"expected function flag type");
10376 if (parseToken(
lltok::rparen,
"expected ')' in funcFlags"))
10387bool LLParser::parseOptionalCalls(
10388 SmallVectorImpl<FunctionSummary::EdgeTy> &Calls) {
10392 if (parseToken(
lltok::colon,
"expected ':' in calls") ||
10396 IdToIndexMapType IdToIndexMap;
10405 LocTy Loc = Lex.getLoc();
10407 if (parseGVReference(VI, GVId))
10411 unsigned RelBF = 0;
10412 unsigned HasTailCall =
false;
10416 switch (Lex.getKind()) {
10419 if (parseToken(
lltok::colon,
"expected ':'") || parseHotness(Hotness))
10425 if (parseToken(
lltok::colon,
"expected ':'") || parseUInt32(RelBF))
10430 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(HasTailCall))
10434 return error(Lex.getLoc(),
"expected hotness, relbf, or tail");
10441 IdToIndexMap[GVId].push_back(std::make_pair(Calls.
size(), Loc));
10451 for (
auto I : IdToIndexMap) {
10452 auto &Infos = ForwardRefValueInfos[
I.first];
10453 for (
auto P :
I.second) {
10455 "Forward referenced ValueInfo expected to be empty");
10456 Infos.emplace_back(&Calls[
P.first].first,
P.second);
10469 switch (Lex.getKind()) {
10473 case lltok::kw_cold:
10479 case lltok::kw_hot:
10486 return error(Lex.getLoc(),
"invalid call edge hotness");
10495bool LLParser::parseOptionalVTableFuncs(
VTableFuncList &VTableFuncs) {
10499 if (parseToken(
lltok::colon,
"expected ':' in vTableFuncs") ||
10503 IdToIndexMapType IdToIndexMap;
10507 if (parseToken(
lltok::lparen,
"expected '(' in vTableFunc") ||
10512 LocTy Loc = Lex.getLoc();
10514 if (parseGVReference(VI, GVId))
10527 IdToIndexMap[GVId].push_back(std::make_pair(VTableFuncs.size(), Loc));
10528 VTableFuncs.push_back({
VI,
Offset});
10530 if (parseToken(
lltok::rparen,
"expected ')' in vTableFunc"))
10536 for (
auto I : IdToIndexMap) {
10537 auto &Infos = ForwardRefValueInfos[
I.first];
10538 for (
auto P :
I.second) {
10540 "Forward referenced ValueInfo expected to be empty");
10541 Infos.emplace_back(&VTableFuncs[
P.first].FuncVI,
P.second);
10545 if (parseToken(
lltok::rparen,
"expected ')' in vTableFuncs"))
10552bool LLParser::parseParamNo(uint64_t &ParamNo) {
10554 parseToken(
lltok::colon,
"expected ':' here") || parseUInt64(ParamNo))
10560bool LLParser::parseParamAccessOffset(ConstantRange &
Range) {
10563 auto ParseAPSInt = [&](
APSInt &Val) {
10565 return tokError(
"expected integer");
10566 Val = Lex.getAPSIntVal();
10568 Val.setIsSigned(
true);
10590bool LLParser::parseParamAccessCall(FunctionSummary::ParamAccess::Call &
Call,
10591 IdLocListType &IdLocList) {
10599 LocTy Loc = Lex.getLoc();
10600 if (parseGVReference(VI, GVId))
10604 IdLocList.emplace_back(GVId, Loc);
10607 parseParamNo(
Call.ParamNo) ||
10609 parseParamAccessOffset(
Call.Offsets))
10621bool LLParser::parseParamAccess(FunctionSummary::ParamAccess &Param,
10622 IdLocListType &IdLocList) {
10624 parseParamNo(
Param.ParamNo) ||
10626 parseParamAccessOffset(
Param.Use))
10635 FunctionSummary::ParamAccess::Call
Call;
10636 if (parseParamAccessCall(
Call, IdLocList))
10653bool LLParser::parseOptionalParamAccesses(
10654 std::vector<FunctionSummary::ParamAccess> &Params) {
10662 IdLocListType VContexts;
10663 size_t CallsNum = 0;
10665 FunctionSummary::ParamAccess ParamAccess;
10666 if (parseParamAccess(ParamAccess, VContexts))
10668 CallsNum += ParamAccess.
Calls.size();
10669 assert(VContexts.size() == CallsNum);
10671 Params.emplace_back(std::move(ParamAccess));
10679 IdLocListType::const_iterator ItContext = VContexts.begin();
10680 for (
auto &PA : Params) {
10681 for (
auto &
C : PA.Calls) {
10683 ForwardRefValueInfos[ItContext->first].emplace_back(&
C.Callee,
10684 ItContext->second);
10688 assert(ItContext == VContexts.end());
10695bool LLParser::parseOptionalRefs(SmallVectorImpl<ValueInfo> &Refs) {
10699 if (parseToken(
lltok::colon,
"expected ':' in refs") ||
10703 struct ValueContext {
10708 std::vector<ValueContext> VContexts;
10712 VC.Loc = Lex.getLoc();
10713 if (parseGVReference(
VC.VI,
VC.GVId))
10715 VContexts.push_back(VC);
10721 llvm::sort(VContexts, [](
const ValueContext &VC1,
const ValueContext &VC2) {
10722 return VC1.VI.getAccessSpecifier() < VC2.VI.getAccessSpecifier();
10725 IdToIndexMapType IdToIndexMap;
10726 for (
auto &VC : VContexts) {
10731 IdToIndexMap[
VC.GVId].push_back(std::make_pair(Refs.
size(),
VC.Loc));
10737 for (
auto I : IdToIndexMap) {
10738 auto &Infos = ForwardRefValueInfos[
I.first];
10739 for (
auto P :
I.second) {
10741 "Forward referenced ValueInfo expected to be empty");
10742 Infos.emplace_back(&Refs[
P.first],
P.second);
10756bool LLParser::parseOptionalTypeIdInfo(
10757 FunctionSummary::TypeIdInfo &TypeIdInfo) {
10766 switch (Lex.getKind()) {
10768 if (parseTypeTests(TypeIdInfo.
TypeTests))
10792 return error(Lex.getLoc(),
"invalid typeIdInfo list type");
10796 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10805bool LLParser::parseTypeTests(std::vector<GlobalValue::GUID> &TypeTests) {
10813 IdToIndexMapType IdToIndexMap;
10817 unsigned ID = Lex.getUIntVal();
10818 LocTy Loc = Lex.getLoc();
10822 IdToIndexMap[
ID].push_back(std::make_pair(TypeTests.size(), Loc));
10824 }
else if (parseUInt64(GUID))
10826 TypeTests.push_back(GUID);
10831 for (
auto I : IdToIndexMap) {
10832 auto &Ids = ForwardRefTypeIds[
I.first];
10833 for (
auto P :
I.second) {
10834 assert(TypeTests[
P.first] == 0 &&
10835 "Forward referenced type id GUID expected to be 0");
10836 Ids.emplace_back(&TypeTests[
P.first],
P.second);
10840 if (parseToken(
lltok::rparen,
"expected ')' in typeIdInfo"))
10848bool LLParser::parseVFuncIdList(
10849 lltok::Kind Kind, std::vector<FunctionSummary::VFuncId> &VFuncIdList) {
10850 assert(Lex.getKind() == Kind);
10857 IdToIndexMapType IdToIndexMap;
10859 FunctionSummary::VFuncId VFuncId;
10860 if (parseVFuncId(VFuncId, IdToIndexMap, VFuncIdList.size()))
10862 VFuncIdList.push_back(VFuncId);
10870 for (
auto I : IdToIndexMap) {
10871 auto &Ids = ForwardRefTypeIds[
I.first];
10872 for (
auto P :
I.second) {
10873 assert(VFuncIdList[
P.first].GUID == 0 &&
10874 "Forward referenced type id GUID expected to be 0");
10875 Ids.emplace_back(&VFuncIdList[
P.first].GUID,
P.second);
10884bool LLParser::parseConstVCallList(
10886 std::vector<FunctionSummary::ConstVCall> &ConstVCallList) {
10887 assert(Lex.getKind() == Kind);
10894 IdToIndexMapType IdToIndexMap;
10896 FunctionSummary::ConstVCall ConstVCall;
10897 if (parseConstVCall(ConstVCall, IdToIndexMap, ConstVCallList.size()))
10899 ConstVCallList.push_back(ConstVCall);
10907 for (
auto I : IdToIndexMap) {
10908 auto &Ids = ForwardRefTypeIds[
I.first];
10909 for (
auto P :
I.second) {
10910 assert(ConstVCallList[
P.first].VFunc.GUID == 0 &&
10911 "Forward referenced type id GUID expected to be 0");
10912 Ids.emplace_back(&ConstVCallList[
P.first].VFunc.GUID,
P.second);
10921bool LLParser::parseConstVCall(FunctionSummary::ConstVCall &ConstVCall,
10922 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10924 parseVFuncId(ConstVCall.
VFunc, IdToIndexMap, Index))
10928 if (parseArgs(ConstVCall.
Args))
10940bool LLParser::parseVFuncId(FunctionSummary::VFuncId &VFuncId,
10941 IdToIndexMapType &IdToIndexMap,
unsigned Index) {
10951 unsigned ID = Lex.getUIntVal();
10952 LocTy Loc = Lex.getLoc();
10956 IdToIndexMap[
ID].push_back(std::make_pair(Index, Loc));
10958 }
else if (parseToken(
lltok::kw_guid,
"expected 'guid' here") ||
10960 parseUInt64(VFuncId.
GUID))
10966 parseUInt64(VFuncId.
Offset) ||
10978bool LLParser::parseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
10988 switch (Lex.getKind()) {
10995 assert(HasLinkage &&
"Linkage not optional in summary entry");
11002 parseOptionalVisibility(Flag);
11007 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
11013 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
11019 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
11025 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
11034 if (parseOptionalImportType(Lex.getKind(), IK))
11036 GVFlags.
ImportType =
static_cast<unsigned>(IK);
11041 if (parseToken(
lltok::colon,
"expected ':'") || parseFlag(Flag))
11046 return error(Lex.getLoc(),
"expected gv flag type");
11060bool LLParser::parseGVarFlags(GlobalVarSummary::GVarFlags &GVarFlags) {
11068 auto ParseRest = [
this](
unsigned int &Val) {
11072 return parseFlag(Val);
11077 switch (Lex.getKind()) {
11078 case lltok::kw_readonly:
11079 if (ParseRest(Flag))
11083 case lltok::kw_writeonly:
11084 if (ParseRest(Flag))
11089 if (ParseRest(Flag))
11094 if (ParseRest(Flag))
11099 return error(Lex.getLoc(),
"expected gvar flag type");
11107bool LLParser::parseModuleReference(StringRef &ModulePath) {
11114 unsigned ModuleID = Lex.getUIntVal();
11115 auto I = ModuleIdMap.find(ModuleID);
11117 assert(
I != ModuleIdMap.end());
11118 ModulePath =
I->second;
11124bool LLParser::parseGVReference(ValueInfo &VI,
unsigned &GVId) {
11127 WriteOnly = EatIfPresent(lltok::kw_writeonly);
11131 GVId = Lex.getUIntVal();
11133 if (GVId < NumberedValueInfos.size() && NumberedValueInfos[GVId]) {
11135 VI = NumberedValueInfos[GVId];
11152bool LLParser::parseOptionalAllocs(std::vector<AllocInfo> &Allocs) {
11156 if (parseToken(
lltok::colon,
"expected ':' in allocs") ||
11168 SmallVector<uint8_t> Versions;
11171 if (parseAllocType(V))
11176 if (parseToken(
lltok::rparen,
"expected ')' in versions") ||
11180 std::vector<MIBInfo> MIBs;
11181 if (parseMemProfs(MIBs))
11184 Allocs.push_back({Versions, MIBs});
11201bool LLParser::parseMemProfs(std::vector<MIBInfo> &MIBs) {
11205 if (parseToken(
lltok::colon,
"expected ':' in memprof") ||
11211 if (parseToken(
lltok::lparen,
"expected '(' in memprof") ||
11220 if (parseToken(
lltok::comma,
"expected ',' in memprof") ||
11226 SmallVector<unsigned> StackIdIndices;
11230 uint64_t StackId = 0;
11231 if (parseUInt64(StackId))
11233 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
11254bool LLParser::parseAllocType(uint8_t &
AllocType) {
11255 switch (Lex.getKind()) {
11262 case lltok::kw_cold:
11265 case lltok::kw_hot:
11269 return error(Lex.getLoc(),
"invalid alloc type");
11282bool LLParser::parseOptionalCallsites(std::vector<CallsiteInfo> &Callsites) {
11286 if (parseToken(
lltok::colon,
"expected ':' in callsites") ||
11290 IdToIndexMapType IdToIndexMap;
11293 if (parseToken(
lltok::lparen,
"expected '(' in callsite") ||
11300 LocTy Loc = Lex.getLoc();
11302 if (parseGVReference(VI, GVId))
11306 if (parseToken(
lltok::comma,
"expected ',' in callsite") ||
11312 SmallVector<unsigned> Clones;
11315 if (parseUInt32(V))
11321 parseToken(
lltok::comma,
"expected ',' in callsite") ||
11327 SmallVector<unsigned> StackIdIndices;
11331 uint64_t StackId = 0;
11332 if (parseUInt64(StackId))
11334 StackIdIndices.
push_back(Index->addOrGetStackIdIndex(StackId));
11345 IdToIndexMap[GVId].
push_back(std::make_pair(Callsites.size(), Loc));
11346 Callsites.push_back({
VI, Clones, StackIdIndices});
11354 for (
auto I : IdToIndexMap) {
11355 auto &Infos = ForwardRefValueInfos[
I.first];
11356 for (
auto P :
I.second) {
11358 "Forward referenced ValueInfo expected to be empty");
11359 Infos.emplace_back(&Callsites[
P.first].Callee,
P.second);
11363 if (parseToken(
lltok::rparen,
"expected ')' in callsites"))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Unify divergent function exit nodes
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
Function Alias Analysis false
Expand Atomic instructions
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
GlobalValue::SanitizerMetadata SanitizerMetadata
Module.h This file contains the declarations for the Module class.
static GlobalValue * createGlobalFwdRef(Module *M, PointerType *PTy)
static cl::opt< bool > AllowIncompleteIR("allow-incomplete-ir", cl::init(false), cl::Hidden, cl::desc("Allow incomplete IR on a best effort basis (references to unknown " "metadata will be dropped)"))
static void maybeSetDSOLocal(bool DSOLocal, GlobalValue &GV)
static bool upgradeMemoryAttr(MemoryEffects &ME, lltok::Kind Kind)
static void resolveFwdRef(ValueInfo *Fwd, ValueInfo &Resolved)
static SmallVector< MemoryEffects::Location, 2 > keywordToLoc(lltok::Kind Tok)
static std::optional< DenormalMode::DenormalModeKind > keywordToDenormalModeKind(lltok::Kind Tok)
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
static cl::opt< RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode > Mode("regalloc-enable-advisor", cl::Hidden, cl::init(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default), cl::desc("Enable regalloc advisor mode"), cl::values(clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Default, "default", "Default"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Release, "release", "precompiled"), clEnumValN(RegAllocEvictionAdvisorAnalysisLegacy::AdvisorMode::Development, "development", "for training")))
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 & IEEEdouble()
static LLVM_ABI unsigned getSizeInBits(const fltSemantics &Sem)
Returns the size of the floating point number (in bits) in the given semantics.
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
@ FMaximumNum
*p = maximumnum(old, v) maximumnum matches the behavior of llvm.maximumnum.
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ FMinimumNum
*p = minimumnum(old, v) minimumnum matches the behavior of llvm.minimumnum.
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.
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 CondBrInst * Create(Value *Cond, BasicBlock *IfTrue, BasicBlock *IfFalse, InsertPosition InsertBefore=nullptr)
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true, bool ByteString=false)
This method constructs a CDS and initializes it with a text string.
static LLVM_ABI Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static LLVM_ABI Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
static LLVM_ABI Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
static bool isSupportedGetElementPtr(const Type *SrcElemTy)
Whether creating a constant expression for this getelementptr type is supported.
static LLVM_ABI Constant * get(unsigned Opcode, Constant *C1, Constant *C2, unsigned Flags=0, Type *OnlyIfReducedTy=nullptr)
get - Return a binary or shift operator constant expression, folding if possible.
static Constant * getGetElementPtr(Type *Ty, Constant *C, ArrayRef< Constant * > IdxList, GEPNoWrapFlags NW=GEPNoWrapFlags::none(), std::optional< ConstantRange > InRange=std::nullopt, Type *OnlyIfReducedTy=nullptr)
Getelementptr form.
static LLVM_ABI bool isValueValidForType(Type *Ty, const APFloat &V)
Return true if Ty is big enough to represent V.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
static LLVM_ABI ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc, Constant *DeactivationSymbol)
Return a pointer signed with the specified parameters.
static LLVM_ABI std::optional< ConstantRangeList > getConstantRangeList(ArrayRef< ConstantRange > RangesRef)
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
static LLVM_ABI Constant * get(StructType *T, ArrayRef< Constant * > V)
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
static LLVM_ABI DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
static DIAssignID * getDistinct(LLVMContext &Context)
DebugEmissionKind getEmissionKind() const
DebugNameTableKind getNameTableKind() const
static LLVM_ABI DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, std::optional< uint32_t > EnumKind, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, Metadata *Rank, Metadata *Annotations, Metadata *BitStride)
Build a DICompositeType with the given ODR identifier.
static LLVM_ABI std::optional< ChecksumKind > getChecksumKind(StringRef CSKindStr)
ChecksumKind
Which algorithm (e.g.
static LLVM_ABI std::optional< FixedPointKind > getFixedPointKind(StringRef Str)
static LLVM_ABI DIFlags getFlag(StringRef Flag)
void cleanupRetainedNodes()
When IR modules are merged, typically during LTO, the merged module may contain several types having ...
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 setPreferredAlignment(MaybeAlign Align)
Sets the prefalign attribute of the 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 auto targetMemLocations()
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
bool isTargetMemLoc(IRMemLocation Loc) const
Whether location is target memory location.
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 isByteTy() const
True if this is an instance of ByteType.
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.
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.
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.
LLVM_ABI const fltSemantics & getFltSemantics() const
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 UncondBrInst * Create(BasicBlock *Target, InsertPosition InsertBefore=nullptr)
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 * > OverloadTys={})
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 isSignatureValid(Intrinsic::ID ID, FunctionType *FT, SmallVectorImpl< Type * > &OverloadTys, raw_ostream &OS=nulls())
Returns true if FT is a valid function type for intrinsic ID.
Flag
These should be considered private to the implementation of the MCInstrDesc class.
@ System
Synchronized with respect to all concurrently executing threads.
@ Valid
The data is already valid.
initializer< Ty > init(const Ty &Val)
@ DW_TAG_invalid
LLVM mock tags (see also llvm/BinaryFormat/Dwarf.def).
@ DW_MACINFO_invalid
Macinfo type for invalid results.
@ DW_APPLE_ENUM_KIND_invalid
Enum kind for invalid results.
@ DW_VIRTUALITY_invalid
Virtuality for invalid results.
@ kw_aarch64_sme_preservemost_from_x1
@ kw_no_sanitize_hwaddress
@ kw_cheriot_librarycallcc
@ kw_cheriot_compartmentcalleecc
@ kw_typeCheckedLoadConstVCalls
@ kw_aarch64_sve_vector_pcs
@ kw_cheriot_compartmentcallcc
@ kw_amdgpu_gfx_whole_wave
@ kw_typeTestAssumeConstVCalls
@ kw_typeidCompatibleVTable
@ kw_typeCheckedLoadVCalls
@ kw_inaccessiblemem_or_argmemonly
@ kw_externally_initialized
@ kw_sanitize_address_dyninit
@ kw_amdgpu_cs_chain_preserve
@ kw_available_externally
@ kw_typeTestAssumeVCalls
@ kw_aarch64_sme_preservemost_from_x0
@ kw_dso_local_equivalent
@ kw_aarch64_sme_preservemost_from_x2
NodeAddr< NodeBase * > Node
friend class Instruction
Iterator for Instructions in a `BasicBlock.
LLVM_ABI StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
std::tuple< const DIScope *, const DIScope *, const DILocalVariable * > VarID
A unique key that represents a debug variable.
LLVM_ABI void UpgradeIntrinsicCall(CallBase *CB, Function *NewFn)
This is the complement to the above, replacing a specific call to an intrinsic function with a call t...
LLVM_ABI void UpgradeSectionAttributes(Module &M)
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
SaveAndRestore(T &) -> SaveAndRestore< T >
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
scope_exit(Callable) -> scope_exit< Callable >
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
LLVM_ABI bool UpgradeIntrinsicFunction(Function *F, Function *&NewFn, bool CanUpgradeDebugIntrinsicsToRecords=true)
This is a more granular function that simply checks an intrinsic function for upgrading,...
LLVM_ABI void UpgradeCallsToIntrinsic(Function *F)
This is an auto-upgrade hook for any old intrinsic function syntaxes which need to have both the func...
LLVM_ABI void UpgradeNVVMAnnotations(Module &M)
Convert legacy nvvm.annotations metadata to appropriate function attributes.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
auto cast_or_null(const Y &Val)
LLVM_ABI bool UpgradeModuleFlags(Module &M)
This checks for module flags which should be upgraded.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
void copyModuleAttrToFunctions(Module &M)
Copies module attributes to the functions in the module.
auto dyn_cast_or_null(const Y &Val)
@ Async
"Asynchronous" unwind tables (instr precise)
@ Sync
"Synchronous" unwind tables
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
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.
IRMemLocation
The locations at which a function might access memory.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
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
@ NearestTiesToEven
roundTiesToEven.
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 ...
@ PreserveSign
The sign of a flushed-to-zero number is preserved in the sign of 0.
@ PositiveZero
Denormals are flushed to positive zero.
@ Dynamic
Denormals have unknown treatment.
@ IEEE
IEEE-754 denormal numbers preserved.
static constexpr DenormalMode getInvalid()
static constexpr DenormalMode getIEEE()
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 NoRenameOnPromotion
This field is written by the ThinLTO prelink stage to decide whether a particular static global value...
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.