LLVM 20.0.0git
LLParser.cpp
Go to the documentation of this file.
1//===-- LLParser.cpp - Parser Class ---------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines the parser class for .ll files.
10//
11//===----------------------------------------------------------------------===//
12
14#include "llvm/ADT/APSInt.h"
15#include "llvm/ADT/DenseMap.h"
16#include "llvm/ADT/STLExtras.h"
17#include "llvm/ADT/ScopeExit.h"
22#include "llvm/IR/Argument.h"
23#include "llvm/IR/AutoUpgrade.h"
24#include "llvm/IR/BasicBlock.h"
25#include "llvm/IR/CallingConv.h"
26#include "llvm/IR/Comdat.h"
29#include "llvm/IR/Constants.h"
32#include "llvm/IR/Function.h"
33#include "llvm/IR/GlobalIFunc.h"
35#include "llvm/IR/InlineAsm.h"
39#include "llvm/IR/Intrinsics.h"
40#include "llvm/IR/LLVMContext.h"
41#include "llvm/IR/Metadata.h"
42#include "llvm/IR/Module.h"
43#include "llvm/IR/Operator.h"
44#include "llvm/IR/Value.h"
49#include "llvm/Support/ModRef.h"
52#include <algorithm>
53#include <cassert>
54#include <cstring>
55#include <optional>
56#include <vector>
57
58using namespace llvm;
59
61 "allow-incomplete-ir", cl::init(false), cl::Hidden,
63 "Allow incomplete IR on a best effort basis (references to unknown "
64 "metadata will be dropped)"));
65
70
71static std::string getTypeString(Type *T) {
72 std::string Result;
73 raw_string_ostream Tmp(Result);
74 Tmp << *T;
75 return Tmp.str();
76}
77
78/// Run: module ::= toplevelentity*
80 DataLayoutCallbackTy DataLayoutCallback) {
81 // Prime the lexer.
82 Lex.Lex();
83
84 if (Context.shouldDiscardValueNames())
85 return error(
86 Lex.getLoc(),
87 "Can't read textual IR with a Context that discards named Values");
88
89 if (M) {
90 if (parseTargetDefinitions(DataLayoutCallback))
91 return true;
92 }
93
94 return parseTopLevelEntities() || validateEndOfModule(UpgradeDebugInfo) ||
95 validateEndOfIndex();
96}
97
99 const SlotMapping *Slots) {
100 restoreParsingState(Slots);
101 Lex.Lex();
102
103 Type *Ty = nullptr;
104 if (parseType(Ty) || parseConstantValue(Ty, C))
105 return true;
106 if (Lex.getKind() != lltok::Eof)
107 return error(Lex.getLoc(), "expected end of string");
108 return false;
109}
110
112 const SlotMapping *Slots) {
113 restoreParsingState(Slots);
114 Lex.Lex();
115
116 Read = 0;
117 SMLoc Start = Lex.getLoc();
118 Ty = nullptr;
119 if (parseType(Ty))
120 return true;
121 SMLoc End = Lex.getLoc();
122 Read = End.getPointer() - Start.getPointer();
123
124 return false;
125}
126
128 const SlotMapping *Slots) {
129 restoreParsingState(Slots);
130 Lex.Lex();
131
132 Read = 0;
133 SMLoc Start = Lex.getLoc();
134 Result = nullptr;
135 bool Status = parseDIExpressionBody(Result, /*IsDistinct=*/false);
136 SMLoc End = Lex.getLoc();
137 Read = End.getPointer() - Start.getPointer();
138
139 return Status;
140}
141
142void LLParser::restoreParsingState(const SlotMapping *Slots) {
143 if (!Slots)
144 return;
145 NumberedVals = Slots->GlobalValues;
146 NumberedMetadata = Slots->MetadataNodes;
147 for (const auto &I : Slots->NamedTypes)
148 NamedTypes.insert(
149 std::make_pair(I.getKey(), std::make_pair(I.second, LocTy())));
150 for (const auto &I : Slots->Types)
151 NumberedTypes.insert(
152 std::make_pair(I.first, std::make_pair(I.second, LocTy())));
153}
154
156 // White-list intrinsics that are safe to drop.
157 if (!isa<DbgInfoIntrinsic>(II) &&
158 II->getIntrinsicID() != Intrinsic::experimental_noalias_scope_decl)
159 return;
160
162 for (Value *V : II->args())
163 if (auto *MV = dyn_cast<MetadataAsValue>(V))
164 if (auto *MD = dyn_cast<MDNode>(MV->getMetadata()))
165 if (MD->isTemporary())
166 MVs.push_back(MV);
167
168 if (!MVs.empty()) {
169 assert(II->use_empty() && "Cannot have uses");
170 II->eraseFromParent();
171
172 // Also remove no longer used MetadataAsValue wrappers.
173 for (MetadataAsValue *MV : MVs)
174 if (MV->use_empty())
175 delete MV;
176 }
177}
178
179void LLParser::dropUnknownMetadataReferences() {
180 auto Pred = [](unsigned MDKind, MDNode *Node) { return Node->isTemporary(); };
181 for (Function &F : *M) {
182 F.eraseMetadataIf(Pred);
184 I.eraseMetadataIf(Pred);
185
186 if (auto *II = dyn_cast<IntrinsicInst>(&I))
188 }
189 }
190
191 for (GlobalVariable &GV : M->globals())
192 GV.eraseMetadataIf(Pred);
193
194 for (const auto &[ID, Info] : make_early_inc_range(ForwardRefMDNodes)) {
195 // Check whether there is only a single use left, which would be in our
196 // own NumberedMetadata.
197 if (Info.first->getNumTemporaryUses() == 1) {
198 NumberedMetadata.erase(ID);
199 ForwardRefMDNodes.erase(ID);
200 }
201 }
202}
203
204/// validateEndOfModule - Do final validity and basic correctness checks at the
205/// end of the module.
206bool LLParser::validateEndOfModule(bool UpgradeDebugInfo) {
207 if (!M)
208 return false;
209
210 // We should have already returned an error if we observed both intrinsics and
211 // records in this IR.
212 assert(!(SeenNewDbgInfoFormat && SeenOldDbgInfoFormat) &&
213 "Mixed debug intrinsics/records seen without a parsing error?");
215 UseNewDbgInfoFormat = SeenNewDbgInfoFormat;
216 WriteNewDbgInfoFormatToBitcode = SeenNewDbgInfoFormat;
217 WriteNewDbgInfoFormat = SeenNewDbgInfoFormat;
218 M->setNewDbgInfoFormatFlag(SeenNewDbgInfoFormat);
219 }
220
221 // Handle any function attribute group forward references.
222 for (const auto &RAG : ForwardRefAttrGroups) {
223 Value *V = RAG.first;
224 const std::vector<unsigned> &Attrs = RAG.second;
225 AttrBuilder B(Context);
226
227 for (const auto &Attr : Attrs) {
228 auto R = NumberedAttrBuilders.find(Attr);
229 if (R != NumberedAttrBuilders.end())
230 B.merge(R->second);
231 }
232
233 if (Function *Fn = dyn_cast<Function>(V)) {
234 AttributeList AS = Fn->getAttributes();
235 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
236 AS = AS.removeFnAttributes(Context);
237
238 FnAttrs.merge(B);
239
240 // If the alignment was parsed as an attribute, move to the alignment
241 // field.
242 if (MaybeAlign A = FnAttrs.getAlignment()) {
243 Fn->setAlignment(*A);
244 FnAttrs.removeAttribute(Attribute::Alignment);
245 }
246
247 AS = AS.addFnAttributes(Context, FnAttrs);
248 Fn->setAttributes(AS);
249 } else if (CallInst *CI = dyn_cast<CallInst>(V)) {
250 AttributeList AS = CI->getAttributes();
251 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
252 AS = AS.removeFnAttributes(Context);
253 FnAttrs.merge(B);
254 AS = AS.addFnAttributes(Context, FnAttrs);
255 CI->setAttributes(AS);
256 } else if (InvokeInst *II = dyn_cast<InvokeInst>(V)) {
257 AttributeList AS = II->getAttributes();
258 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
259 AS = AS.removeFnAttributes(Context);
260 FnAttrs.merge(B);
261 AS = AS.addFnAttributes(Context, FnAttrs);
262 II->setAttributes(AS);
263 } else if (CallBrInst *CBI = dyn_cast<CallBrInst>(V)) {
264 AttributeList AS = CBI->getAttributes();
265 AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
266 AS = AS.removeFnAttributes(Context);
267 FnAttrs.merge(B);
268 AS = AS.addFnAttributes(Context, FnAttrs);
269 CBI->setAttributes(AS);
270 } else if (auto *GV = dyn_cast<GlobalVariable>(V)) {
271 AttrBuilder Attrs(M->getContext(), GV->getAttributes());
272 Attrs.merge(B);
273 GV->setAttributes(AttributeSet::get(Context,Attrs));
274 } else {
275 llvm_unreachable("invalid object with forward attribute group reference");
276 }
277 }
278
279 // If there are entries in ForwardRefBlockAddresses at this point, the
280 // function was never defined.
281 if (!ForwardRefBlockAddresses.empty())
282 return error(ForwardRefBlockAddresses.begin()->first.Loc,
283 "expected function name in blockaddress");
284
285 auto ResolveForwardRefDSOLocalEquivalents = [&](const ValID &GVRef,
286 GlobalValue *FwdRef) {
287 GlobalValue *GV = nullptr;
288 if (GVRef.Kind == ValID::t_GlobalName) {
289 GV = M->getNamedValue(GVRef.StrVal);
290 } else {
291 GV = NumberedVals.get(GVRef.UIntVal);
292 }
293
294 if (!GV)
295 return error(GVRef.Loc, "unknown function '" + GVRef.StrVal +
296 "' referenced by dso_local_equivalent");
297
298 if (!GV->getValueType()->isFunctionTy())
299 return error(GVRef.Loc,
300 "expected a function, alias to function, or ifunc "
301 "in dso_local_equivalent");
302
303 auto *Equiv = DSOLocalEquivalent::get(GV);
304 FwdRef->replaceAllUsesWith(Equiv);
305 FwdRef->eraseFromParent();
306 return false;
307 };
308
309 // If there are entries in ForwardRefDSOLocalEquivalentIDs/Names at this
310 // point, they are references after the function was defined. Resolve those
311 // now.
312 for (auto &Iter : ForwardRefDSOLocalEquivalentIDs) {
313 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
314 return true;
315 }
316 for (auto &Iter : ForwardRefDSOLocalEquivalentNames) {
317 if (ResolveForwardRefDSOLocalEquivalents(Iter.first, Iter.second))
318 return true;
319 }
320 ForwardRefDSOLocalEquivalentIDs.clear();
321 ForwardRefDSOLocalEquivalentNames.clear();
322
323 for (const auto &NT : NumberedTypes)
324 if (NT.second.second.isValid())
325 return error(NT.second.second,
326 "use of undefined type '%" + Twine(NT.first) + "'");
327
328 for (StringMap<std::pair<Type*, LocTy> >::iterator I =
329 NamedTypes.begin(), E = NamedTypes.end(); I != E; ++I)
330 if (I->second.second.isValid())
331 return error(I->second.second,
332 "use of undefined type named '" + I->getKey() + "'");
333
334 if (!ForwardRefComdats.empty())
335 return error(ForwardRefComdats.begin()->second,
336 "use of undefined comdat '$" +
337 ForwardRefComdats.begin()->first + "'");
338
339 for (const auto &[Name, Info] : make_early_inc_range(ForwardRefVals)) {
340 if (StringRef(Name).starts_with("llvm.")) {
342 if (IID == Intrinsic::not_intrinsic)
343 // Don't do anything for unknown intrinsics.
344 continue;
345
346 // Automatically create declarations for intrinsics. Intrinsics can only
347 // be called directly, so the call function type directly determines the
348 // declaration function type.
349 //
350 // Additionally, automatically add the required mangling suffix to the
351 // intrinsic name. This means that we may replace a single forward
352 // declaration with multiple functions here.
353 for (Use &U : make_early_inc_range(Info.first->uses())) {
354 auto *CB = dyn_cast<CallBase>(U.getUser());
355 if (!CB || !CB->isCallee(&U))
356 return error(Info.second, "intrinsic can only be used as callee");
357
358 SmallVector<Type *> OverloadTys;
359 if (!Intrinsic::getIntrinsicSignature(IID, CB->getFunctionType(),
360 OverloadTys))
361 return error(Info.second, "invalid intrinsic signature");
362
363 U.set(Intrinsic::getOrInsertDeclaration(M, IID, OverloadTys));
364 }
365
366 Info.first->eraseFromParent();
367 ForwardRefVals.erase(Name);
368 continue;
369 }
370
371 // If incomplete IR is allowed, also add declarations for
372 // non-intrinsics.
374 continue;
375
376 auto GetCommonFunctionType = [](Value *V) -> FunctionType * {
377 FunctionType *FTy = nullptr;
378 for (Use &U : V->uses()) {
379 auto *CB = dyn_cast<CallBase>(U.getUser());
380 if (!CB || !CB->isCallee(&U) || (FTy && FTy != CB->getFunctionType()))
381 return nullptr;
382 FTy = CB->getFunctionType();
383 }
384 return FTy;
385 };
386
387 // First check whether this global is only used in calls with the same
388 // type, in which case we'll insert a function. Otherwise, fall back to
389 // using a dummy i8 type.
390 Type *Ty = GetCommonFunctionType(Info.first);
391 if (!Ty)
392 Ty = Type::getInt8Ty(Context);
393
394 GlobalValue *GV;
395 if (auto *FTy = dyn_cast<FunctionType>(Ty))
397 else
398 GV = new GlobalVariable(*M, Ty, /*isConstant*/ false,
400 /*Initializer*/ nullptr, Name);
401 Info.first->replaceAllUsesWith(GV);
402 Info.first->eraseFromParent();
403 ForwardRefVals.erase(Name);
404 }
405
406 if (!ForwardRefVals.empty())
407 return error(ForwardRefVals.begin()->second.second,
408 "use of undefined value '@" + ForwardRefVals.begin()->first +
409 "'");
410
411 if (!ForwardRefValIDs.empty())
412 return error(ForwardRefValIDs.begin()->second.second,
413 "use of undefined value '@" +
414 Twine(ForwardRefValIDs.begin()->first) + "'");
415
416 if (AllowIncompleteIR && !ForwardRefMDNodes.empty())
417 dropUnknownMetadataReferences();
418
419 if (!ForwardRefMDNodes.empty())
420 return error(ForwardRefMDNodes.begin()->second.second,
421 "use of undefined metadata '!" +
422 Twine(ForwardRefMDNodes.begin()->first) + "'");
423
424 // Resolve metadata cycles.
425 for (auto &N : NumberedMetadata) {
426 if (N.second && !N.second->isResolved())
427 N.second->resolveCycles();
428 }
429
430 for (auto *Inst : InstsWithTBAATag) {
431 MDNode *MD = Inst->getMetadata(LLVMContext::MD_tbaa);
432 // With incomplete IR, the tbaa metadata may have been dropped.
434 assert(MD && "UpgradeInstWithTBAATag should have a TBAA tag");
435 if (MD) {
436 auto *UpgradedMD = UpgradeTBAANode(*MD);
437 if (MD != UpgradedMD)
438 Inst->setMetadata(LLVMContext::MD_tbaa, UpgradedMD);
439 }
440 }
441
442 // Look for intrinsic functions and CallInst that need to be upgraded. We use
443 // make_early_inc_range here because we may remove some functions.
446
447 if (UpgradeDebugInfo)
449
452
454 M->setIsNewDbgInfoFormat(UseNewDbgInfoFormat);
455
456 if (!Slots)
457 return false;
458 // Initialize the slot mapping.
459 // Because by this point we've parsed and validated everything, we can "steal"
460 // the mapping from LLParser as it doesn't need it anymore.
461 Slots->GlobalValues = std::move(NumberedVals);
462 Slots->MetadataNodes = std::move(NumberedMetadata);
463 for (const auto &I : NamedTypes)
464 Slots->NamedTypes.insert(std::make_pair(I.getKey(), I.second.first));
465 for (const auto &I : NumberedTypes)
466 Slots->Types.insert(std::make_pair(I.first, I.second.first));
467
468 return false;
469}
470
471/// Do final validity and basic correctness checks at the end of the index.
472bool LLParser::validateEndOfIndex() {
473 if (!Index)
474 return false;
475
476 if (!ForwardRefValueInfos.empty())
477 return error(ForwardRefValueInfos.begin()->second.front().second,
478 "use of undefined summary '^" +
479 Twine(ForwardRefValueInfos.begin()->first) + "'");
480
481 if (!ForwardRefAliasees.empty())
482 return error(ForwardRefAliasees.begin()->second.front().second,
483 "use of undefined summary '^" +
484 Twine(ForwardRefAliasees.begin()->first) + "'");
485
486 if (!ForwardRefTypeIds.empty())
487 return error(ForwardRefTypeIds.begin()->second.front().second,
488 "use of undefined type id summary '^" +
489 Twine(ForwardRefTypeIds.begin()->first) + "'");
490
491 return false;
492}
493
494//===----------------------------------------------------------------------===//
495// Top-Level Entities
496//===----------------------------------------------------------------------===//
497
498bool LLParser::parseTargetDefinitions(DataLayoutCallbackTy DataLayoutCallback) {
499 // Delay parsing of the data layout string until the target triple is known.
500 // Then, pass both the the target triple and the tentative data layout string
501 // to DataLayoutCallback, allowing to override the DL string.
502 // This enables importing modules with invalid DL strings.
503 std::string TentativeDLStr = M->getDataLayoutStr();
504 LocTy DLStrLoc;
505
506 bool Done = false;
507 while (!Done) {
508 switch (Lex.getKind()) {
509 case lltok::kw_target:
510 if (parseTargetDefinition(TentativeDLStr, DLStrLoc))
511 return true;
512 break;
514 if (parseSourceFileName())
515 return true;
516 break;
517 default:
518 Done = true;
519 }
520 }
521 // Run the override callback to potentially change the data layout string, and
522 // parse the data layout string.
523 if (auto LayoutOverride =
524 DataLayoutCallback(M->getTargetTriple(), TentativeDLStr)) {
525 TentativeDLStr = *LayoutOverride;
526 DLStrLoc = {};
527 }
528 Expected<DataLayout> MaybeDL = DataLayout::parse(TentativeDLStr);
529 if (!MaybeDL)
530 return error(DLStrLoc, toString(MaybeDL.takeError()));
531 M->setDataLayout(MaybeDL.get());
532 return false;
533}
534
535bool LLParser::parseTopLevelEntities() {
536 // If there is no Module, then parse just the summary index entries.
537 if (!M) {
538 while (true) {
539 switch (Lex.getKind()) {
540 case lltok::Eof:
541 return false;
542 case lltok::SummaryID:
543 if (parseSummaryEntry())
544 return true;
545 break;
547 if (parseSourceFileName())
548 return true;
549 break;
550 default:
551 // Skip everything else
552 Lex.Lex();
553 }
554 }
555 }
556 while (true) {
557 switch (Lex.getKind()) {
558 default:
559 return tokError("expected top-level entity");
560 case lltok::Eof: return false;
562 if (parseDeclare())
563 return true;
564 break;
565 case lltok::kw_define:
566 if (parseDefine())
567 return true;
568 break;
569 case lltok::kw_module:
570 if (parseModuleAsm())
571 return true;
572 break;
574 if (parseUnnamedType())
575 return true;
576 break;
577 case lltok::LocalVar:
578 if (parseNamedType())
579 return true;
580 break;
581 case lltok::GlobalID:
582 if (parseUnnamedGlobal())
583 return true;
584 break;
585 case lltok::GlobalVar:
586 if (parseNamedGlobal())
587 return true;
588 break;
589 case lltok::ComdatVar: if (parseComdat()) return true; break;
590 case lltok::exclaim:
591 if (parseStandaloneMetadata())
592 return true;
593 break;
594 case lltok::SummaryID:
595 if (parseSummaryEntry())
596 return true;
597 break;
599 if (parseNamedMetadata())
600 return true;
601 break;
603 if (parseUnnamedAttrGrp())
604 return true;
605 break;
607 if (parseUseListOrder())
608 return true;
609 break;
611 if (parseUseListOrderBB())
612 return true;
613 break;
614 }
615 }
616}
617
618/// toplevelentity
619/// ::= 'module' 'asm' STRINGCONSTANT
620bool LLParser::parseModuleAsm() {
622 Lex.Lex();
623
624 std::string AsmStr;
625 if (parseToken(lltok::kw_asm, "expected 'module asm'") ||
626 parseStringConstant(AsmStr))
627 return true;
628
629 M->appendModuleInlineAsm(AsmStr);
630 return false;
631}
632
633/// toplevelentity
634/// ::= 'target' 'triple' '=' STRINGCONSTANT
635/// ::= 'target' 'datalayout' '=' STRINGCONSTANT
636bool LLParser::parseTargetDefinition(std::string &TentativeDLStr,
637 LocTy &DLStrLoc) {
639 std::string Str;
640 switch (Lex.Lex()) {
641 default:
642 return tokError("unknown target property");
643 case lltok::kw_triple:
644 Lex.Lex();
645 if (parseToken(lltok::equal, "expected '=' after target triple") ||
646 parseStringConstant(Str))
647 return true;
648 M->setTargetTriple(Str);
649 return false;
651 Lex.Lex();
652 if (parseToken(lltok::equal, "expected '=' after target datalayout"))
653 return true;
654 DLStrLoc = Lex.getLoc();
655 if (parseStringConstant(TentativeDLStr))
656 return true;
657 return false;
658 }
659}
660
661/// toplevelentity
662/// ::= 'source_filename' '=' STRINGCONSTANT
663bool LLParser::parseSourceFileName() {
665 Lex.Lex();
666 if (parseToken(lltok::equal, "expected '=' after source_filename") ||
667 parseStringConstant(SourceFileName))
668 return true;
669 if (M)
670 M->setSourceFileName(SourceFileName);
671 return false;
672}
673
674/// parseUnnamedType:
675/// ::= LocalVarID '=' 'type' type
676bool LLParser::parseUnnamedType() {
677 LocTy TypeLoc = Lex.getLoc();
678 unsigned TypeID = Lex.getUIntVal();
679 Lex.Lex(); // eat LocalVarID;
680
681 if (parseToken(lltok::equal, "expected '=' after name") ||
682 parseToken(lltok::kw_type, "expected 'type' after '='"))
683 return true;
684
685 Type *Result = nullptr;
686 if (parseStructDefinition(TypeLoc, "", NumberedTypes[TypeID], Result))
687 return true;
688
689 if (!isa<StructType>(Result)) {
690 std::pair<Type*, LocTy> &Entry = NumberedTypes[TypeID];
691 if (Entry.first)
692 return error(TypeLoc, "non-struct types may not be recursive");
693 Entry.first = Result;
694 Entry.second = SMLoc();
695 }
696
697 return false;
698}
699
700/// toplevelentity
701/// ::= LocalVar '=' 'type' type
702bool LLParser::parseNamedType() {
703 std::string Name = Lex.getStrVal();
704 LocTy NameLoc = Lex.getLoc();
705 Lex.Lex(); // eat LocalVar.
706
707 if (parseToken(lltok::equal, "expected '=' after name") ||
708 parseToken(lltok::kw_type, "expected 'type' after name"))
709 return true;
710
711 Type *Result = nullptr;
712 if (parseStructDefinition(NameLoc, Name, NamedTypes[Name], Result))
713 return true;
714
715 if (!isa<StructType>(Result)) {
716 std::pair<Type*, LocTy> &Entry = NamedTypes[Name];
717 if (Entry.first)
718 return error(NameLoc, "non-struct types may not be recursive");
719 Entry.first = Result;
720 Entry.second = SMLoc();
721 }
722
723 return false;
724}
725
726/// toplevelentity
727/// ::= 'declare' FunctionHeader
728bool LLParser::parseDeclare() {
730 Lex.Lex();
731
732 std::vector<std::pair<unsigned, MDNode *>> MDs;
733 while (Lex.getKind() == lltok::MetadataVar) {
734 unsigned MDK;
735 MDNode *N;
736 if (parseMetadataAttachment(MDK, N))
737 return true;
738 MDs.push_back({MDK, N});
739 }
740
741 Function *F;
742 unsigned FunctionNumber = -1;
743 SmallVector<unsigned> UnnamedArgNums;
744 if (parseFunctionHeader(F, false, FunctionNumber, UnnamedArgNums))
745 return true;
746 for (auto &MD : MDs)
747 F->addMetadata(MD.first, *MD.second);
748 return false;
749}
750
751/// toplevelentity
752/// ::= 'define' FunctionHeader (!dbg !56)* '{' ...
753bool LLParser::parseDefine() {
755 Lex.Lex();
756
757 Function *F;
758 unsigned FunctionNumber = -1;
759 SmallVector<unsigned> UnnamedArgNums;
760 return parseFunctionHeader(F, true, FunctionNumber, UnnamedArgNums) ||
761 parseOptionalFunctionMetadata(*F) ||
762 parseFunctionBody(*F, FunctionNumber, UnnamedArgNums);
763}
764
765/// parseGlobalType
766/// ::= 'constant'
767/// ::= 'global'
768bool LLParser::parseGlobalType(bool &IsConstant) {
769 if (Lex.getKind() == lltok::kw_constant)
770 IsConstant = true;
771 else if (Lex.getKind() == lltok::kw_global)
772 IsConstant = false;
773 else {
774 IsConstant = false;
775 return tokError("expected 'global' or 'constant'");
776 }
777 Lex.Lex();
778 return false;
779}
780
781bool LLParser::parseOptionalUnnamedAddr(
782 GlobalVariable::UnnamedAddr &UnnamedAddr) {
783 if (EatIfPresent(lltok::kw_unnamed_addr))
785 else if (EatIfPresent(lltok::kw_local_unnamed_addr))
787 else
788 UnnamedAddr = GlobalValue::UnnamedAddr::None;
789 return false;
790}
791
792/// parseUnnamedGlobal:
793/// OptionalVisibility (ALIAS | IFUNC) ...
794/// OptionalLinkage OptionalPreemptionSpecifier OptionalVisibility
795/// OptionalDLLStorageClass
796/// ... -> global variable
797/// GlobalID '=' OptionalVisibility (ALIAS | IFUNC) ...
798/// GlobalID '=' OptionalLinkage OptionalPreemptionSpecifier
799/// OptionalVisibility
800/// OptionalDLLStorageClass
801/// ... -> global variable
802bool LLParser::parseUnnamedGlobal() {
803 unsigned VarID;
804 std::string Name;
805 LocTy NameLoc = Lex.getLoc();
806
807 // Handle the GlobalID form.
808 if (Lex.getKind() == lltok::GlobalID) {
809 VarID = Lex.getUIntVal();
810 if (checkValueID(NameLoc, "global", "@", NumberedVals.getNext(), VarID))
811 return true;
812
813 Lex.Lex(); // eat GlobalID;
814 if (parseToken(lltok::equal, "expected '=' after name"))
815 return true;
816 } else {
817 VarID = NumberedVals.getNext();
818 }
819
820 bool HasLinkage;
821 unsigned Linkage, Visibility, DLLStorageClass;
822 bool DSOLocal;
824 GlobalVariable::UnnamedAddr UnnamedAddr;
825 if (parseOptionalLinkage(Linkage, HasLinkage, Visibility, DLLStorageClass,
826 DSOLocal) ||
827 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
828 return true;
829
830 switch (Lex.getKind()) {
831 default:
832 return parseGlobal(Name, VarID, NameLoc, Linkage, HasLinkage, Visibility,
833 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
834 case lltok::kw_alias:
835 case lltok::kw_ifunc:
836 return parseAliasOrIFunc(Name, VarID, NameLoc, Linkage, Visibility,
837 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
838 }
839}
840
841/// parseNamedGlobal:
842/// GlobalVar '=' OptionalVisibility (ALIAS | IFUNC) ...
843/// GlobalVar '=' OptionalLinkage OptionalPreemptionSpecifier
844/// OptionalVisibility OptionalDLLStorageClass
845/// ... -> global variable
846bool LLParser::parseNamedGlobal() {
848 LocTy NameLoc = Lex.getLoc();
849 std::string Name = Lex.getStrVal();
850 Lex.Lex();
851
852 bool HasLinkage;
853 unsigned Linkage, Visibility, DLLStorageClass;
854 bool DSOLocal;
856 GlobalVariable::UnnamedAddr UnnamedAddr;
857 if (parseToken(lltok::equal, "expected '=' in global variable") ||
858 parseOptionalLinkage(Linkage, HasLinkage, Visibility, DLLStorageClass,
859 DSOLocal) ||
860 parseOptionalThreadLocal(TLM) || parseOptionalUnnamedAddr(UnnamedAddr))
861 return true;
862
863 switch (Lex.getKind()) {
864 default:
865 return parseGlobal(Name, -1, NameLoc, Linkage, HasLinkage, Visibility,
866 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
867 case lltok::kw_alias:
868 case lltok::kw_ifunc:
869 return parseAliasOrIFunc(Name, -1, NameLoc, Linkage, Visibility,
870 DLLStorageClass, DSOLocal, TLM, UnnamedAddr);
871 }
872}
873
874bool LLParser::parseComdat() {
876 std::string Name = Lex.getStrVal();
877 LocTy NameLoc = Lex.getLoc();
878 Lex.Lex();
879
880 if (parseToken(lltok::equal, "expected '=' here"))
881 return true;
882
883 if (parseToken(lltok::kw_comdat, "expected comdat keyword"))
884 return tokError("expected comdat type");
885
887 switch (Lex.getKind()) {
888 default:
889 return tokError("unknown selection kind");
890 case lltok::kw_any:
891 SK = Comdat::Any;
892 break;
895 break;
897 SK = Comdat::Largest;
898 break;
901 break;
903 SK = Comdat::SameSize;
904 break;
905 }
906 Lex.Lex();
907
908 // See if the comdat was forward referenced, if so, use the comdat.
909 Module::ComdatSymTabType &ComdatSymTab = M->getComdatSymbolTable();
911 if (I != ComdatSymTab.end() && !ForwardRefComdats.erase(Name))
912 return error(NameLoc, "redefinition of comdat '$" + Name + "'");
913
914 Comdat *C;
915 if (I != ComdatSymTab.end())
916 C = &I->second;
917 else
918 C = M->getOrInsertComdat(Name);
919 C->setSelectionKind(SK);
920
921 return false;
922}
923
924// MDString:
925// ::= '!' STRINGCONSTANT
926bool LLParser::parseMDString(MDString *&Result) {
927 std::string Str;
928 if (parseStringConstant(Str))
929 return true;
930 Result = MDString::get(Context, Str);
931 return false;
932}
933
934// MDNode:
935// ::= '!' MDNodeNumber
936bool LLParser::parseMDNodeID(MDNode *&Result) {
937 // !{ ..., !42, ... }
938 LocTy IDLoc = Lex.getLoc();
939 unsigned MID = 0;
940 if (parseUInt32(MID))
941 return true;
942
943 // If not a forward reference, just return it now.
944 if (NumberedMetadata.count(MID)) {
945 Result = NumberedMetadata[MID];
946 return false;
947 }
948
949 // Otherwise, create MDNode forward reference.
950 auto &FwdRef = ForwardRefMDNodes[MID];
951 FwdRef = std::make_pair(MDTuple::getTemporary(Context, {}), IDLoc);
952
953 Result = FwdRef.first.get();
954 NumberedMetadata[MID].reset(Result);
955 return false;
956}
957
958/// parseNamedMetadata:
959/// !foo = !{ !1, !2 }
960bool LLParser::parseNamedMetadata() {
962 std::string Name = Lex.getStrVal();
963 Lex.Lex();
964
965 if (parseToken(lltok::equal, "expected '=' here") ||
966 parseToken(lltok::exclaim, "Expected '!' here") ||
967 parseToken(lltok::lbrace, "Expected '{' here"))
968 return true;
969
970 NamedMDNode *NMD = M->getOrInsertNamedMetadata(Name);
971 if (Lex.getKind() != lltok::rbrace)
972 do {
973 MDNode *N = nullptr;
974 // parse DIExpressions inline as a special case. They are still MDNodes,
975 // so they can still appear in named metadata. Remove this logic if they
976 // become plain Metadata.
977 if (Lex.getKind() == lltok::MetadataVar &&
978 Lex.getStrVal() == "DIExpression") {
979 if (parseDIExpression(N, /*IsDistinct=*/false))
980 return true;
981 // DIArgLists should only appear inline in a function, as they may
982 // contain LocalAsMetadata arguments which require a function context.
983 } else if (Lex.getKind() == lltok::MetadataVar &&
984 Lex.getStrVal() == "DIArgList") {
985 return tokError("found DIArgList outside of function");
986 } else if (parseToken(lltok::exclaim, "Expected '!' here") ||
987 parseMDNodeID(N)) {
988 return true;
989 }
990 NMD->addOperand(N);
991 } while (EatIfPresent(lltok::comma));
992
993 return parseToken(lltok::rbrace, "expected end of metadata node");
994}
995
996/// parseStandaloneMetadata:
997/// !42 = !{...}
998bool LLParser::parseStandaloneMetadata() {
999 assert(Lex.getKind() == lltok::exclaim);
1000 Lex.Lex();
1001 unsigned MetadataID = 0;
1002
1003 MDNode *Init;
1004 if (parseUInt32(MetadataID) || parseToken(lltok::equal, "expected '=' here"))
1005 return true;
1006
1007 // Detect common error, from old metadata syntax.
1008 if (Lex.getKind() == lltok::Type)
1009 return tokError("unexpected type in metadata definition");
1010
1011 bool IsDistinct = EatIfPresent(lltok::kw_distinct);
1012 if (Lex.getKind() == lltok::MetadataVar) {
1013 if (parseSpecializedMDNode(Init, IsDistinct))
1014 return true;
1015 } else if (parseToken(lltok::exclaim, "Expected '!' here") ||
1016 parseMDTuple(Init, IsDistinct))
1017 return true;
1018
1019 // See if this was forward referenced, if so, handle it.
1020 auto FI = ForwardRefMDNodes.find(MetadataID);
1021 if (FI != ForwardRefMDNodes.end()) {
1022 auto *ToReplace = FI->second.first.get();
1023 // DIAssignID has its own special forward-reference "replacement" for
1024 // attachments (the temporary attachments are never actually attached).
1025 if (isa<DIAssignID>(Init)) {
1026 for (auto *Inst : TempDIAssignIDAttachments[ToReplace]) {
1027 assert(!Inst->getMetadata(LLVMContext::MD_DIAssignID) &&
1028 "Inst unexpectedly already has DIAssignID attachment");
1029 Inst->setMetadata(LLVMContext::MD_DIAssignID, Init);
1030 }
1031 }
1032
1033 ToReplace->replaceAllUsesWith(Init);
1034 ForwardRefMDNodes.erase(FI);
1035
1036 assert(NumberedMetadata[MetadataID] == Init && "Tracking VH didn't work");
1037 } else {
1038 if (NumberedMetadata.count(MetadataID))
1039 return tokError("Metadata id is already used");
1040 NumberedMetadata[MetadataID].reset(Init);
1041 }
1042
1043 return false;
1044}
1045
1046// Skips a single module summary entry.
1047bool LLParser::skipModuleSummaryEntry() {
1048 // Each module summary entry consists of a tag for the entry
1049 // type, followed by a colon, then the fields which may be surrounded by
1050 // nested sets of parentheses. The "tag:" looks like a Label. Once parsing
1051 // support is in place we will look for the tokens corresponding to the
1052 // expected tags.
1053 if (Lex.getKind() != lltok::kw_gv && Lex.getKind() != lltok::kw_module &&
1054 Lex.getKind() != lltok::kw_typeid && Lex.getKind() != lltok::kw_flags &&
1056 return tokError(
1057 "Expected 'gv', 'module', 'typeid', 'flags' or 'blockcount' at the "
1058 "start of summary entry");
1059 if (Lex.getKind() == lltok::kw_flags)
1060 return parseSummaryIndexFlags();
1061 if (Lex.getKind() == lltok::kw_blockcount)
1062 return parseBlockCount();
1063 Lex.Lex();
1064 if (parseToken(lltok::colon, "expected ':' at start of summary entry") ||
1065 parseToken(lltok::lparen, "expected '(' at start of summary entry"))
1066 return true;
1067 // Now walk through the parenthesized entry, until the number of open
1068 // parentheses goes back down to 0 (the first '(' was parsed above).
1069 unsigned NumOpenParen = 1;
1070 do {
1071 switch (Lex.getKind()) {
1072 case lltok::lparen:
1073 NumOpenParen++;
1074 break;
1075 case lltok::rparen:
1076 NumOpenParen--;
1077 break;
1078 case lltok::Eof:
1079 return tokError("found end of file while parsing summary entry");
1080 default:
1081 // Skip everything in between parentheses.
1082 break;
1083 }
1084 Lex.Lex();
1085 } while (NumOpenParen > 0);
1086 return false;
1087}
1088
1089/// SummaryEntry
1090/// ::= SummaryID '=' GVEntry | ModuleEntry | TypeIdEntry
1091bool LLParser::parseSummaryEntry() {
1093 unsigned SummaryID = Lex.getUIntVal();
1094
1095 // For summary entries, colons should be treated as distinct tokens,
1096 // not an indication of the end of a label token.
1098
1099 Lex.Lex();
1100 if (parseToken(lltok::equal, "expected '=' here"))
1101 return true;
1102
1103 // If we don't have an index object, skip the summary entry.
1104 if (!Index)
1105 return skipModuleSummaryEntry();
1106
1107 bool result = false;
1108 switch (Lex.getKind()) {
1109 case lltok::kw_gv:
1110 result = parseGVEntry(SummaryID);
1111 break;
1112 case lltok::kw_module:
1113 result = parseModuleEntry(SummaryID);
1114 break;
1115 case lltok::kw_typeid:
1116 result = parseTypeIdEntry(SummaryID);
1117 break;
1119 result = parseTypeIdCompatibleVtableEntry(SummaryID);
1120 break;
1121 case lltok::kw_flags:
1122 result = parseSummaryIndexFlags();
1123 break;
1125 result = parseBlockCount();
1126 break;
1127 default:
1128 result = error(Lex.getLoc(), "unexpected summary kind");
1129 break;
1130 }
1131 Lex.setIgnoreColonInIdentifiers(false);
1132 return result;
1133}
1134
1135static bool isValidVisibilityForLinkage(unsigned V, unsigned L) {
1138}
1139static bool isValidDLLStorageClassForLinkage(unsigned S, unsigned L) {
1142}
1143
1144// If there was an explicit dso_local, update GV. In the absence of an explicit
1145// dso_local we keep the default value.
1146static void maybeSetDSOLocal(bool DSOLocal, GlobalValue &GV) {
1147 if (DSOLocal)
1148 GV.setDSOLocal(true);
1149}
1150
1151/// parseAliasOrIFunc:
1152/// ::= GlobalVar '=' OptionalLinkage OptionalPreemptionSpecifier
1153/// OptionalVisibility OptionalDLLStorageClass
1154/// OptionalThreadLocal OptionalUnnamedAddr
1155/// 'alias|ifunc' AliaseeOrResolver SymbolAttrs*
1156///
1157/// AliaseeOrResolver
1158/// ::= TypeAndValue
1159///
1160/// SymbolAttrs
1161/// ::= ',' 'partition' StringConstant
1162///
1163/// Everything through OptionalUnnamedAddr has already been parsed.
1164///
1165bool LLParser::parseAliasOrIFunc(const std::string &Name, unsigned NameID,
1166 LocTy NameLoc, unsigned L, unsigned Visibility,
1167 unsigned DLLStorageClass, bool DSOLocal,
1169 GlobalVariable::UnnamedAddr UnnamedAddr) {
1170 bool IsAlias;
1171 if (Lex.getKind() == lltok::kw_alias)
1172 IsAlias = true;
1173 else if (Lex.getKind() == lltok::kw_ifunc)
1174 IsAlias = false;
1175 else
1176 llvm_unreachable("Not an alias or ifunc!");
1177 Lex.Lex();
1178
1180
1181 if(IsAlias && !GlobalAlias::isValidLinkage(Linkage))
1182 return error(NameLoc, "invalid linkage type for alias");
1183
1184 if (!isValidVisibilityForLinkage(Visibility, L))
1185 return error(NameLoc,
1186 "symbol with local linkage must have default visibility");
1187
1188 if (!isValidDLLStorageClassForLinkage(DLLStorageClass, L))
1189 return error(NameLoc,
1190 "symbol with local linkage cannot have a DLL storage class");
1191
1192 Type *Ty;
1193 LocTy ExplicitTypeLoc = Lex.getLoc();
1194 if (parseType(Ty) ||
1195 parseToken(lltok::comma, "expected comma after alias or ifunc's type"))
1196 return true;
1197
1198 Constant *Aliasee;
1199 LocTy AliaseeLoc = Lex.getLoc();
1200 if (Lex.getKind() != lltok::kw_bitcast &&
1203 Lex.getKind() != lltok::kw_inttoptr) {
1204 if (parseGlobalTypeAndValue(Aliasee))
1205 return true;
1206 } else {
1207 // The bitcast dest type is not present, it is implied by the dest type.
1208 ValID ID;
1209 if (parseValID(ID, /*PFS=*/nullptr))
1210 return true;
1211 if (ID.Kind != ValID::t_Constant)
1212 return error(AliaseeLoc, "invalid aliasee");
1213 Aliasee = ID.ConstantVal;
1214 }
1215
1216 Type *AliaseeType = Aliasee->getType();
1217 auto *PTy = dyn_cast<PointerType>(AliaseeType);
1218 if (!PTy)
1219 return error(AliaseeLoc, "An alias or ifunc must have pointer type");
1220 unsigned AddrSpace = PTy->getAddressSpace();
1221
1222 GlobalValue *GVal = nullptr;
1223
1224 // See if the alias was forward referenced, if so, prepare to replace the
1225 // forward reference.
1226 if (!Name.empty()) {
1227 auto I = ForwardRefVals.find(Name);
1228 if (I != ForwardRefVals.end()) {
1229 GVal = I->second.first;
1230 ForwardRefVals.erase(Name);
1231 } else if (M->getNamedValue(Name)) {
1232 return error(NameLoc, "redefinition of global '@" + Name + "'");
1233 }
1234 } else {
1235 auto I = ForwardRefValIDs.find(NameID);
1236 if (I != ForwardRefValIDs.end()) {
1237 GVal = I->second.first;
1238 ForwardRefValIDs.erase(I);
1239 }
1240 }
1241
1242 // Okay, create the alias/ifunc but do not insert it into the module yet.
1243 std::unique_ptr<GlobalAlias> GA;
1244 std::unique_ptr<GlobalIFunc> GI;
1245 GlobalValue *GV;
1246 if (IsAlias) {
1247 GA.reset(GlobalAlias::create(Ty, AddrSpace,
1249 Aliasee, /*Parent*/ nullptr));
1250 GV = GA.get();
1251 } else {
1252 GI.reset(GlobalIFunc::create(Ty, AddrSpace,
1254 Aliasee, /*Parent*/ nullptr));
1255 GV = GI.get();
1256 }
1257 GV->setThreadLocalMode(TLM);
1260 GV->setUnnamedAddr(UnnamedAddr);
1261 maybeSetDSOLocal(DSOLocal, *GV);
1262
1263 // At this point we've parsed everything except for the IndirectSymbolAttrs.
1264 // Now parse them if there are any.
1265 while (Lex.getKind() == lltok::comma) {
1266 Lex.Lex();
1267
1268 if (Lex.getKind() == lltok::kw_partition) {
1269 Lex.Lex();
1270 GV->setPartition(Lex.getStrVal());
1271 if (parseToken(lltok::StringConstant, "expected partition string"))
1272 return true;
1273 } else {
1274 return tokError("unknown alias or ifunc property!");
1275 }
1276 }
1277
1278 if (Name.empty())
1279 NumberedVals.add(NameID, GV);
1280
1281 if (GVal) {
1282 // Verify that types agree.
1283 if (GVal->getType() != GV->getType())
1284 return error(
1285 ExplicitTypeLoc,
1286 "forward reference and definition of alias have different types");
1287
1288 // If they agree, just RAUW the old value with the alias and remove the
1289 // forward ref info.
1290 GVal->replaceAllUsesWith(GV);
1291 GVal->eraseFromParent();
1292 }
1293
1294 // Insert into the module, we know its name won't collide now.
1295 if (IsAlias)
1296 M->insertAlias(GA.release());
1297 else
1298 M->insertIFunc(GI.release());
1299 assert(GV->getName() == Name && "Should not be a name conflict!");
1300
1301 return false;
1302}
1303
1304static bool isSanitizer(lltok::Kind Kind) {
1305 switch (Kind) {
1308 case lltok::kw_sanitize_memtag:
1310 return true;
1311 default:
1312 return false;
1313 }
1314}
1315
1316bool LLParser::parseSanitizer(GlobalVariable *GV) {
1319 if (GV->hasSanitizerMetadata())
1320 Meta = GV->getSanitizerMetadata();
1321
1322 switch (Lex.getKind()) {
1324 Meta.NoAddress = true;
1325 break;
1327 Meta.NoHWAddress = true;
1328 break;
1329 case lltok::kw_sanitize_memtag:
1330 Meta.Memtag = true;
1331 break;
1333 Meta.IsDynInit = true;
1334 break;
1335 default:
1336 return tokError("non-sanitizer token passed to LLParser::parseSanitizer()");
1337 }
1338 GV->setSanitizerMetadata(Meta);
1339 Lex.Lex();
1340 return false;
1341}
1342
1343/// parseGlobal
1344/// ::= GlobalVar '=' OptionalLinkage OptionalPreemptionSpecifier
1345/// OptionalVisibility OptionalDLLStorageClass
1346/// OptionalThreadLocal OptionalUnnamedAddr OptionalAddrSpace
1347/// OptionalExternallyInitialized GlobalType Type Const OptionalAttrs
1348/// ::= OptionalLinkage OptionalPreemptionSpecifier OptionalVisibility
1349/// OptionalDLLStorageClass OptionalThreadLocal OptionalUnnamedAddr
1350/// OptionalAddrSpace OptionalExternallyInitialized GlobalType Type
1351/// Const OptionalAttrs
1352///
1353/// Everything up to and including OptionalUnnamedAddr has been parsed
1354/// already.
1355///
1356bool LLParser::parseGlobal(const std::string &Name, unsigned NameID,
1357 LocTy NameLoc, unsigned Linkage, bool HasLinkage,
1358 unsigned Visibility, unsigned DLLStorageClass,
1359 bool DSOLocal, GlobalVariable::ThreadLocalMode TLM,
1360 GlobalVariable::UnnamedAddr UnnamedAddr) {
1361 if (!isValidVisibilityForLinkage(Visibility, Linkage))
1362 return error(NameLoc,
1363 "symbol with local linkage must have default visibility");
1364
1365 if (!isValidDLLStorageClassForLinkage(DLLStorageClass, Linkage))
1366 return error(NameLoc,
1367 "symbol with local linkage cannot have a DLL storage class");
1368
1369 unsigned AddrSpace;
1370 bool IsConstant, IsExternallyInitialized;
1371 LocTy IsExternallyInitializedLoc;
1372 LocTy TyLoc;
1373
1374 Type *Ty = nullptr;
1375 if (parseOptionalAddrSpace(AddrSpace) ||
1376 parseOptionalToken(lltok::kw_externally_initialized,
1377 IsExternallyInitialized,
1378 &IsExternallyInitializedLoc) ||
1379 parseGlobalType(IsConstant) || parseType(Ty, TyLoc))
1380 return true;
1381
1382 // If the linkage is specified and is external, then no initializer is
1383 // present.
1384 Constant *Init = nullptr;
1385 if (!HasLinkage ||
1387 (GlobalValue::LinkageTypes)Linkage)) {
1388 if (parseGlobalValue(Ty, Init))
1389 return true;
1390 }
1391
1393 return error(TyLoc, "invalid type for global variable");
1394
1395 GlobalValue *GVal = nullptr;
1396
1397 // See if the global was forward referenced, if so, use the global.
1398 if (!Name.empty()) {
1399 auto I = ForwardRefVals.find(Name);
1400 if (I != ForwardRefVals.end()) {
1401 GVal = I->second.first;
1402 ForwardRefVals.erase(I);
1403 } else if (M->getNamedValue(Name)) {
1404 return error(NameLoc, "redefinition of global '@" + Name + "'");
1405 }
1406 } else {
1407 // Handle @"", where a name is syntactically specified, but semantically
1408 // missing.
1409 if (NameID == (unsigned)-1)
1410 NameID = NumberedVals.getNext();
1411
1412 auto I = ForwardRefValIDs.find(NameID);
1413 if (I != ForwardRefValIDs.end()) {
1414 GVal = I->second.first;
1415 ForwardRefValIDs.erase(I);
1416 }
1417 }
1418
1420 *M, Ty, false, GlobalValue::ExternalLinkage, nullptr, Name, nullptr,
1422
1423 if (Name.empty())
1424 NumberedVals.add(NameID, GV);
1425
1426 // Set the parsed properties on the global.
1427 if (Init)
1428 GV->setInitializer(Init);
1429 GV->setConstant(IsConstant);
1431 maybeSetDSOLocal(DSOLocal, *GV);
1434 GV->setExternallyInitialized(IsExternallyInitialized);
1435 GV->setThreadLocalMode(TLM);
1436 GV->setUnnamedAddr(UnnamedAddr);
1437
1438 if (GVal) {
1439 if (GVal->getAddressSpace() != AddrSpace)
1440 return error(
1441 TyLoc,
1442 "forward reference and definition of global have different types");
1443
1444 GVal->replaceAllUsesWith(GV);
1445 GVal->eraseFromParent();
1446 }
1447
1448 // parse attributes on the global.
1449 while (Lex.getKind() == lltok::comma) {
1450 Lex.Lex();
1451
1452 if (Lex.getKind() == lltok::kw_section) {
1453 Lex.Lex();
1454 GV->setSection(Lex.getStrVal());
1455 if (parseToken(lltok::StringConstant, "expected global section string"))
1456 return true;
1457 } else if (Lex.getKind() == lltok::kw_partition) {
1458 Lex.Lex();
1459 GV->setPartition(Lex.getStrVal());
1460 if (parseToken(lltok::StringConstant, "expected partition string"))
1461 return true;
1462 } else if (Lex.getKind() == lltok::kw_align) {
1463 MaybeAlign Alignment;
1464 if (parseOptionalAlignment(Alignment))
1465 return true;
1466 if (Alignment)
1467 GV->setAlignment(*Alignment);
1468 } else if (Lex.getKind() == lltok::kw_code_model) {
1470 if (parseOptionalCodeModel(CodeModel))
1471 return true;
1472 GV->setCodeModel(CodeModel);
1473 } else if (Lex.getKind() == lltok::MetadataVar) {
1474 if (parseGlobalObjectMetadataAttachment(*GV))
1475 return true;
1476 } else if (isSanitizer(Lex.getKind())) {
1477 if (parseSanitizer(GV))
1478 return true;
1479 } else {
1480 Comdat *C;
1481 if (parseOptionalComdat(Name, C))
1482 return true;
1483 if (C)
1484 GV->setComdat(C);
1485 else
1486 return tokError("unknown global variable property!");
1487 }
1488 }
1489
1490 AttrBuilder Attrs(M->getContext());
1491 LocTy BuiltinLoc;
1492 std::vector<unsigned> FwdRefAttrGrps;
1493 if (parseFnAttributeValuePairs(Attrs, FwdRefAttrGrps, false, BuiltinLoc))
1494 return true;
1495 if (Attrs.hasAttributes() || !FwdRefAttrGrps.empty()) {
1496 GV->setAttributes(AttributeSet::get(Context, Attrs));
1497 ForwardRefAttrGroups[GV] = FwdRefAttrGrps;
1498 }
1499
1500 return false;
1501}
1502
1503/// parseUnnamedAttrGrp
1504/// ::= 'attributes' AttrGrpID '=' '{' AttrValPair+ '}'
1505bool LLParser::parseUnnamedAttrGrp() {
1507 LocTy AttrGrpLoc = Lex.getLoc();
1508 Lex.Lex();
1509
1510 if (Lex.getKind() != lltok::AttrGrpID)
1511 return tokError("expected attribute group id");
1512
1513 unsigned VarID = Lex.getUIntVal();
1514 std::vector<unsigned> unused;
1515 LocTy BuiltinLoc;
1516 Lex.Lex();
1517
1518 if (parseToken(lltok::equal, "expected '=' here") ||
1519 parseToken(lltok::lbrace, "expected '{' here"))
1520 return true;
1521
1522 auto R = NumberedAttrBuilders.find(VarID);
1523 if (R == NumberedAttrBuilders.end())
1524 R = NumberedAttrBuilders.emplace(VarID, AttrBuilder(M->getContext())).first;
1525
1526 if (parseFnAttributeValuePairs(R->second, unused, true, BuiltinLoc) ||
1527 parseToken(lltok::rbrace, "expected end of attribute group"))
1528 return true;
1529
1530 if (!R->second.hasAttributes())
1531 return error(AttrGrpLoc, "attribute group has no attributes");
1532
1533 return false;
1534}
1535
1537 switch (Kind) {
1538#define GET_ATTR_NAMES
1539#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME) \
1540 case lltok::kw_##DISPLAY_NAME: \
1541 return Attribute::ENUM_NAME;
1542#include "llvm/IR/Attributes.inc"
1543 default:
1544 return Attribute::None;
1545 }
1546}
1547
1548bool LLParser::parseEnumAttribute(Attribute::AttrKind Attr, AttrBuilder &B,
1549 bool InAttrGroup) {
1550 if (Attribute::isTypeAttrKind(Attr))
1551 return parseRequiredTypeAttr(B, Lex.getKind(), Attr);
1552
1553 switch (Attr) {
1554 case Attribute::Alignment: {
1555 MaybeAlign Alignment;
1556 if (InAttrGroup) {
1557 uint32_t Value = 0;
1558 Lex.Lex();
1559 if (parseToken(lltok::equal, "expected '=' here") || parseUInt32(Value))
1560 return true;
1561 Alignment = Align(Value);
1562 } else {
1563 if (parseOptionalAlignment(Alignment, true))
1564 return true;
1565 }
1566 B.addAlignmentAttr(Alignment);
1567 return false;
1568 }
1569 case Attribute::StackAlignment: {
1570 unsigned Alignment;
1571 if (InAttrGroup) {
1572 Lex.Lex();
1573 if (parseToken(lltok::equal, "expected '=' here") ||
1574 parseUInt32(Alignment))
1575 return true;
1576 } else {
1577 if (parseOptionalStackAlignment(Alignment))
1578 return true;
1579 }
1580 B.addStackAlignmentAttr(Alignment);
1581 return false;
1582 }
1583 case Attribute::AllocSize: {
1584 unsigned ElemSizeArg;
1585 std::optional<unsigned> NumElemsArg;
1586 if (parseAllocSizeArguments(ElemSizeArg, NumElemsArg))
1587 return true;
1588 B.addAllocSizeAttr(ElemSizeArg, NumElemsArg);
1589 return false;
1590 }
1591 case Attribute::VScaleRange: {
1592 unsigned MinValue, MaxValue;
1593 if (parseVScaleRangeArguments(MinValue, MaxValue))
1594 return true;
1595 B.addVScaleRangeAttr(MinValue,
1596 MaxValue > 0 ? MaxValue : std::optional<unsigned>());
1597 return false;
1598 }
1599 case Attribute::Dereferenceable: {
1600 uint64_t Bytes;
1601 if (parseOptionalDerefAttrBytes(lltok::kw_dereferenceable, Bytes))
1602 return true;
1603 B.addDereferenceableAttr(Bytes);
1604 return false;
1605 }
1606 case Attribute::DereferenceableOrNull: {
1607 uint64_t Bytes;
1608 if (parseOptionalDerefAttrBytes(lltok::kw_dereferenceable_or_null, Bytes))
1609 return true;
1610 B.addDereferenceableOrNullAttr(Bytes);
1611 return false;
1612 }
1613 case Attribute::UWTable: {
1615 if (parseOptionalUWTableKind(Kind))
1616 return true;
1617 B.addUWTableAttr(Kind);
1618 return false;
1619 }
1620 case Attribute::AllocKind: {
1622 if (parseAllocKind(Kind))
1623 return true;
1624 B.addAllocKindAttr(Kind);
1625 return false;
1626 }
1627 case Attribute::Memory: {
1628 std::optional<MemoryEffects> ME = parseMemoryAttr();
1629 if (!ME)
1630 return true;
1631 B.addMemoryAttr(*ME);
1632 return false;
1633 }
1634 case Attribute::NoFPClass: {
1635 if (FPClassTest NoFPClass =
1636 static_cast<FPClassTest>(parseNoFPClassAttr())) {
1637 B.addNoFPClassAttr(NoFPClass);
1638 return false;
1639 }
1640
1641 return true;
1642 }
1643 case Attribute::Range:
1644 return parseRangeAttr(B);
1645 case Attribute::Initializes:
1646 return parseInitializesAttr(B);
1647 default:
1648 B.addAttribute(Attr);
1649 Lex.Lex();
1650 return false;
1651 }
1652}
1653
1655 switch (Kind) {
1656 case lltok::kw_readnone:
1657 ME &= MemoryEffects::none();
1658 return true;
1659 case lltok::kw_readonly:
1661 return true;
1662 case lltok::kw_writeonly:
1664 return true;
1667 return true;
1670 return true;
1673 return true;
1674 default:
1675 return false;
1676 }
1677}
1678
1679/// parseFnAttributeValuePairs
1680/// ::= <attr> | <attr> '=' <value>
1681bool LLParser::parseFnAttributeValuePairs(AttrBuilder &B,
1682 std::vector<unsigned> &FwdRefAttrGrps,
1683 bool InAttrGrp, LocTy &BuiltinLoc) {
1684 bool HaveError = false;
1685
1686 B.clear();
1687
1689 while (true) {
1690 lltok::Kind Token = Lex.getKind();
1691 if (Token == lltok::rbrace)
1692 break; // Finished.
1693
1694 if (Token == lltok::StringConstant) {
1695 if (parseStringAttribute(B))
1696 return true;
1697 continue;
1698 }
1699
1700 if (Token == lltok::AttrGrpID) {
1701 // Allow a function to reference an attribute group:
1702 //
1703 // define void @foo() #1 { ... }
1704 if (InAttrGrp) {
1705 HaveError |= error(
1706 Lex.getLoc(),
1707 "cannot have an attribute group reference in an attribute group");
1708 } else {
1709 // Save the reference to the attribute group. We'll fill it in later.
1710 FwdRefAttrGrps.push_back(Lex.getUIntVal());
1711 }
1712 Lex.Lex();
1713 continue;
1714 }
1715
1716 SMLoc Loc = Lex.getLoc();
1717 if (Token == lltok::kw_builtin)
1718 BuiltinLoc = Loc;
1719
1720 if (upgradeMemoryAttr(ME, Token)) {
1721 Lex.Lex();
1722 continue;
1723 }
1724
1726 if (Attr == Attribute::None) {
1727 if (!InAttrGrp)
1728 break;
1729 return error(Lex.getLoc(), "unterminated attribute group");
1730 }
1731
1732 if (parseEnumAttribute(Attr, B, InAttrGrp))
1733 return true;
1734
1735 // As a hack, we allow function alignment to be initially parsed as an
1736 // attribute on a function declaration/definition or added to an attribute
1737 // group and later moved to the alignment field.
1738 if (!Attribute::canUseAsFnAttr(Attr) && Attr != Attribute::Alignment)
1739 HaveError |= error(Loc, "this attribute does not apply to functions");
1740 }
1741
1742 if (ME != MemoryEffects::unknown())
1743 B.addMemoryAttr(ME);
1744 return HaveError;
1745}
1746
1747//===----------------------------------------------------------------------===//
1748// GlobalValue Reference/Resolution Routines.
1749//===----------------------------------------------------------------------===//
1750
1752 // The used global type does not matter. We will later RAUW it with a
1753 // global/function of the correct type.
1754 return new GlobalVariable(*M, Type::getInt8Ty(M->getContext()), false,
1757 PTy->getAddressSpace());
1758}
1759
1760Value *LLParser::checkValidVariableType(LocTy Loc, const Twine &Name, Type *Ty,
1761 Value *Val) {
1762 Type *ValTy = Val->getType();
1763 if (ValTy == Ty)
1764 return Val;
1765 if (Ty->isLabelTy())
1766 error(Loc, "'" + Name + "' is not a basic block");
1767 else
1768 error(Loc, "'" + Name + "' defined with type '" +
1769 getTypeString(Val->getType()) + "' but expected '" +
1770 getTypeString(Ty) + "'");
1771 return nullptr;
1772}
1773
1774/// getGlobalVal - Get a value with the specified name or ID, creating a
1775/// forward reference record if needed. This can return null if the value
1776/// exists but does not have the right type.
1777GlobalValue *LLParser::getGlobalVal(const std::string &Name, Type *Ty,
1778 LocTy Loc) {
1779 PointerType *PTy = dyn_cast<PointerType>(Ty);
1780 if (!PTy) {
1781 error(Loc, "global variable reference must have pointer type");
1782 return nullptr;
1783 }
1784
1785 // Look this name up in the normal function symbol table.
1786 GlobalValue *Val =
1787 cast_or_null<GlobalValue>(M->getValueSymbolTable().lookup(Name));
1788
1789 // If this is a forward reference for the value, see if we already created a
1790 // forward ref record.
1791 if (!Val) {
1792 auto I = ForwardRefVals.find(Name);
1793 if (I != ForwardRefVals.end())
1794 Val = I->second.first;
1795 }
1796
1797 // If we have the value in the symbol table or fwd-ref table, return it.
1798 if (Val)
1799 return cast_or_null<GlobalValue>(
1800 checkValidVariableType(Loc, "@" + Name, Ty, Val));
1801
1802 // Otherwise, create a new forward reference for this value and remember it.
1803 GlobalValue *FwdVal = createGlobalFwdRef(M, PTy);
1804 ForwardRefVals[Name] = std::make_pair(FwdVal, Loc);
1805 return FwdVal;
1806}
1807
1808GlobalValue *LLParser::getGlobalVal(unsigned ID, Type *Ty, LocTy Loc) {
1809 PointerType *PTy = dyn_cast<PointerType>(Ty);
1810 if (!PTy) {
1811 error(Loc, "global variable reference must have pointer type");
1812 return nullptr;
1813 }
1814
1815 GlobalValue *Val = NumberedVals.get(ID);
1816
1817 // If this is a forward reference for the value, see if we already created a
1818 // forward ref record.
1819 if (!Val) {
1820 auto I = ForwardRefValIDs.find(ID);
1821 if (I != ForwardRefValIDs.end())
1822 Val = I->second.first;
1823 }
1824
1825 // If we have the value in the symbol table or fwd-ref table, return it.
1826 if (Val)
1827 return cast_or_null<GlobalValue>(
1828 checkValidVariableType(Loc, "@" + Twine(ID), Ty, Val));
1829
1830 // Otherwise, create a new forward reference for this value and remember it.
1831 GlobalValue *FwdVal = createGlobalFwdRef(M, PTy);
1832 ForwardRefValIDs[ID] = std::make_pair(FwdVal, Loc);
1833 return FwdVal;
1834}
1835
1836//===----------------------------------------------------------------------===//
1837// Comdat Reference/Resolution Routines.
1838//===----------------------------------------------------------------------===//
1839
1840Comdat *LLParser::getComdat(const std::string &Name, LocTy Loc) {
1841 // Look this name up in the comdat symbol table.
1842 Module::ComdatSymTabType &ComdatSymTab = M->getComdatSymbolTable();
1844 if (I != ComdatSymTab.end())
1845 return &I->second;
1846
1847 // Otherwise, create a new forward reference for this value and remember it.
1848 Comdat *C = M->getOrInsertComdat(Name);
1849 ForwardRefComdats[Name] = Loc;
1850 return C;
1851}
1852
1853//===----------------------------------------------------------------------===//
1854// Helper Routines.
1855//===----------------------------------------------------------------------===//
1856
1857/// parseToken - If the current token has the specified kind, eat it and return
1858/// success. Otherwise, emit the specified error and return failure.
1859bool LLParser::parseToken(lltok::Kind T, const char *ErrMsg) {
1860 if (Lex.getKind() != T)
1861 return tokError(ErrMsg);
1862 Lex.Lex();
1863 return false;
1864}
1865
1866/// parseStringConstant
1867/// ::= StringConstant
1868bool LLParser::parseStringConstant(std::string &Result) {
1869 if (Lex.getKind() != lltok::StringConstant)
1870 return tokError("expected string constant");
1871 Result = Lex.getStrVal();
1872 Lex.Lex();
1873 return false;
1874}
1875
1876/// parseUInt32
1877/// ::= uint32
1878bool LLParser::parseUInt32(uint32_t &Val) {
1879 if (Lex.getKind() != lltok::APSInt || Lex.getAPSIntVal().isSigned())
1880 return tokError("expected integer");
1881 uint64_t Val64 = Lex.getAPSIntVal().getLimitedValue(0xFFFFFFFFULL+1);
1882 if (Val64 != unsigned(Val64))
1883 return tokError("expected 32-bit integer (too large)");
1884 Val = Val64;
1885 Lex.Lex();
1886 return false;
1887}
1888
1889/// parseUInt64
1890/// ::= uint64
1891bool LLParser::parseUInt64(uint64_t &Val) {
1892 if (Lex.getKind() != lltok::APSInt || Lex.getAPSIntVal().isSigned())
1893 return tokError("expected integer");
1894 Val = Lex.getAPSIntVal().getLimitedValue();
1895 Lex.Lex();
1896 return false;
1897}
1898
1899/// parseTLSModel
1900/// := 'localdynamic'
1901/// := 'initialexec'
1902/// := 'localexec'
1903bool LLParser::parseTLSModel(GlobalVariable::ThreadLocalMode &TLM) {
1904 switch (Lex.getKind()) {
1905 default:
1906 return tokError("expected localdynamic, initialexec or localexec");
1909 break;
1912 break;
1915 break;
1916 }
1917
1918 Lex.Lex();
1919 return false;
1920}
1921
1922/// parseOptionalThreadLocal
1923/// := /*empty*/
1924/// := 'thread_local'
1925/// := 'thread_local' '(' tlsmodel ')'
1926bool LLParser::parseOptionalThreadLocal(GlobalVariable::ThreadLocalMode &TLM) {
1928 if (!EatIfPresent(lltok::kw_thread_local))
1929 return false;
1930
1932 if (Lex.getKind() == lltok::lparen) {
1933 Lex.Lex();
1934 return parseTLSModel(TLM) ||
1935 parseToken(lltok::rparen, "expected ')' after thread local model");
1936 }
1937 return false;
1938}
1939
1940/// parseOptionalAddrSpace
1941/// := /*empty*/
1942/// := 'addrspace' '(' uint32 ')'
1943bool LLParser::parseOptionalAddrSpace(unsigned &AddrSpace, unsigned DefaultAS) {
1944 AddrSpace = DefaultAS;
1945 if (!EatIfPresent(lltok::kw_addrspace))
1946 return false;
1947
1948 auto ParseAddrspaceValue = [&](unsigned &AddrSpace) -> bool {
1949 if (Lex.getKind() == lltok::StringConstant) {
1950 auto AddrSpaceStr = Lex.getStrVal();
1951 if (AddrSpaceStr == "A") {
1952 AddrSpace = M->getDataLayout().getAllocaAddrSpace();
1953 } else if (AddrSpaceStr == "G") {
1954 AddrSpace = M->getDataLayout().getDefaultGlobalsAddressSpace();
1955 } else if (AddrSpaceStr == "P") {
1956 AddrSpace = M->getDataLayout().getProgramAddressSpace();
1957 } else {
1958 return tokError("invalid symbolic addrspace '" + AddrSpaceStr + "'");
1959 }
1960 Lex.Lex();
1961 return false;
1962 }
1963 if (Lex.getKind() != lltok::APSInt)
1964 return tokError("expected integer or string constant");
1965 SMLoc Loc = Lex.getLoc();
1966 if (parseUInt32(AddrSpace))
1967 return true;
1968 if (!isUInt<24>(AddrSpace))
1969 return error(Loc, "invalid address space, must be a 24-bit integer");
1970 return false;
1971 };
1972
1973 return parseToken(lltok::lparen, "expected '(' in address space") ||
1974 ParseAddrspaceValue(AddrSpace) ||
1975 parseToken(lltok::rparen, "expected ')' in address space");
1976}
1977
1978/// parseStringAttribute
1979/// := StringConstant
1980/// := StringConstant '=' StringConstant
1981bool LLParser::parseStringAttribute(AttrBuilder &B) {
1982 std::string Attr = Lex.getStrVal();
1983 Lex.Lex();
1984 std::string Val;
1985 if (EatIfPresent(lltok::equal) && parseStringConstant(Val))
1986 return true;
1987 B.addAttribute(Attr, Val);
1988 return false;
1989}
1990
1991/// Parse a potentially empty list of parameter or return attributes.
1992bool LLParser::parseOptionalParamOrReturnAttrs(AttrBuilder &B, bool IsParam) {
1993 bool HaveError = false;
1994
1995 B.clear();
1996
1997 while (true) {
1998 lltok::Kind Token = Lex.getKind();
1999 if (Token == lltok::StringConstant) {
2000 if (parseStringAttribute(B))
2001 return true;
2002 continue;
2003 }
2004
2005 SMLoc Loc = Lex.getLoc();
2007 if (Attr == Attribute::None)
2008 return HaveError;
2009
2010 if (parseEnumAttribute(Attr, B, /* InAttrGroup */ false))
2011 return true;
2012
2013 if (IsParam && !Attribute::canUseAsParamAttr(Attr))
2014 HaveError |= error(Loc, "this attribute does not apply to parameters");
2015 if (!IsParam && !Attribute::canUseAsRetAttr(Attr))
2016 HaveError |= error(Loc, "this attribute does not apply to return values");
2017 }
2018}
2019
2020static unsigned parseOptionalLinkageAux(lltok::Kind Kind, bool &HasLinkage) {
2021 HasLinkage = true;
2022 switch (Kind) {
2023 default:
2024 HasLinkage = false;
2026 case lltok::kw_private:
2028 case lltok::kw_internal:
2030 case lltok::kw_weak:
2032 case lltok::kw_weak_odr:
2034 case lltok::kw_linkonce:
2042 case lltok::kw_common:
2046 case lltok::kw_external:
2048 }
2049}
2050
2051/// parseOptionalLinkage
2052/// ::= /*empty*/
2053/// ::= 'private'
2054/// ::= 'internal'
2055/// ::= 'weak'
2056/// ::= 'weak_odr'
2057/// ::= 'linkonce'
2058/// ::= 'linkonce_odr'
2059/// ::= 'available_externally'
2060/// ::= 'appending'
2061/// ::= 'common'
2062/// ::= 'extern_weak'
2063/// ::= 'external'
2064bool LLParser::parseOptionalLinkage(unsigned &Res, bool &HasLinkage,
2065 unsigned &Visibility,
2066 unsigned &DLLStorageClass, bool &DSOLocal) {
2067 Res = parseOptionalLinkageAux(Lex.getKind(), HasLinkage);
2068 if (HasLinkage)
2069 Lex.Lex();
2070 parseOptionalDSOLocal(DSOLocal);
2071 parseOptionalVisibility(Visibility);
2072 parseOptionalDLLStorageClass(DLLStorageClass);
2073
2074 if (DSOLocal && DLLStorageClass == GlobalValue::DLLImportStorageClass) {
2075 return error(Lex.getLoc(), "dso_location and DLL-StorageClass mismatch");
2076 }
2077
2078 return false;
2079}
2080
2081void LLParser::parseOptionalDSOLocal(bool &DSOLocal) {
2082 switch (Lex.getKind()) {
2083 default:
2084 DSOLocal = false;
2085 break;
2087 DSOLocal = true;
2088 Lex.Lex();
2089 break;
2091 DSOLocal = false;
2092 Lex.Lex();
2093 break;
2094 }
2095}
2096
2097/// parseOptionalVisibility
2098/// ::= /*empty*/
2099/// ::= 'default'
2100/// ::= 'hidden'
2101/// ::= 'protected'
2102///
2103void LLParser::parseOptionalVisibility(unsigned &Res) {
2104 switch (Lex.getKind()) {
2105 default:
2107 return;
2108 case lltok::kw_default:
2110 break;
2111 case lltok::kw_hidden:
2113 break;
2116 break;
2117 }
2118 Lex.Lex();
2119}
2120
2121bool LLParser::parseOptionalImportType(lltok::Kind Kind,
2123 switch (Kind) {
2124 default:
2125 return tokError("unknown import kind. Expect definition or declaration.");
2128 return false;
2131 return false;
2132 }
2133}
2134
2135/// parseOptionalDLLStorageClass
2136/// ::= /*empty*/
2137/// ::= 'dllimport'
2138/// ::= 'dllexport'
2139///
2140void LLParser::parseOptionalDLLStorageClass(unsigned &Res) {
2141 switch (Lex.getKind()) {
2142 default:
2144 return;
2147 break;
2150 break;
2151 }
2152 Lex.Lex();
2153}
2154
2155/// parseOptionalCallingConv
2156/// ::= /*empty*/
2157/// ::= 'ccc'
2158/// ::= 'fastcc'
2159/// ::= 'intel_ocl_bicc'
2160/// ::= 'coldcc'
2161/// ::= 'cfguard_checkcc'
2162/// ::= 'x86_stdcallcc'
2163/// ::= 'x86_fastcallcc'
2164/// ::= 'x86_thiscallcc'
2165/// ::= 'x86_vectorcallcc'
2166/// ::= 'arm_apcscc'
2167/// ::= 'arm_aapcscc'
2168/// ::= 'arm_aapcs_vfpcc'
2169/// ::= 'aarch64_vector_pcs'
2170/// ::= 'aarch64_sve_vector_pcs'
2171/// ::= 'aarch64_sme_preservemost_from_x0'
2172/// ::= 'aarch64_sme_preservemost_from_x1'
2173/// ::= 'aarch64_sme_preservemost_from_x2'
2174/// ::= 'msp430_intrcc'
2175/// ::= 'avr_intrcc'
2176/// ::= 'avr_signalcc'
2177/// ::= 'ptx_kernel'
2178/// ::= 'ptx_device'
2179/// ::= 'spir_func'
2180/// ::= 'spir_kernel'
2181/// ::= 'x86_64_sysvcc'
2182/// ::= 'win64cc'
2183/// ::= 'anyregcc'
2184/// ::= 'preserve_mostcc'
2185/// ::= 'preserve_allcc'
2186/// ::= 'preserve_nonecc'
2187/// ::= 'ghccc'
2188/// ::= 'swiftcc'
2189/// ::= 'swifttailcc'
2190/// ::= 'x86_intrcc'
2191/// ::= 'hhvmcc'
2192/// ::= 'hhvm_ccc'
2193/// ::= 'cxx_fast_tlscc'
2194/// ::= 'amdgpu_vs'
2195/// ::= 'amdgpu_ls'
2196/// ::= 'amdgpu_hs'
2197/// ::= 'amdgpu_es'
2198/// ::= 'amdgpu_gs'
2199/// ::= 'amdgpu_ps'
2200/// ::= 'amdgpu_cs'
2201/// ::= 'amdgpu_cs_chain'
2202/// ::= 'amdgpu_cs_chain_preserve'
2203/// ::= 'amdgpu_kernel'
2204/// ::= 'tailcc'
2205/// ::= 'm68k_rtdcc'
2206/// ::= 'graalcc'
2207/// ::= 'riscv_vector_cc'
2208/// ::= 'cc' UINT
2209///
2210bool LLParser::parseOptionalCallingConv(unsigned &CC) {
2211 switch (Lex.getKind()) {
2212 default: CC = CallingConv::C; return false;
2213 case lltok::kw_ccc: CC = CallingConv::C; break;
2214 case lltok::kw_fastcc: CC = CallingConv::Fast; break;
2215 case lltok::kw_coldcc: CC = CallingConv::Cold; break;
2228 break;
2231 break;
2234 break;
2237 break;
2252 case lltok::kw_ghccc: CC = CallingConv::GHC; break;
2256 case lltok::kw_hhvmcc:
2258 break;
2259 case lltok::kw_hhvm_ccc:
2261 break;
2273 break;
2276 break;
2278 case lltok::kw_tailcc: CC = CallingConv::Tail; break;
2283 break;
2284 case lltok::kw_cc: {
2285 Lex.Lex();
2286 return parseUInt32(CC);
2287 }
2288 }
2289
2290 Lex.Lex();
2291 return false;
2292}
2293
2294/// parseMetadataAttachment
2295/// ::= !dbg !42
2296bool LLParser::parseMetadataAttachment(unsigned &Kind, MDNode *&MD) {
2297 assert(Lex.getKind() == lltok::MetadataVar && "Expected metadata attachment");
2298
2299 std::string Name = Lex.getStrVal();
2300 Kind = M->getMDKindID(Name);
2301 Lex.Lex();
2302
2303 return parseMDNode(MD);
2304}
2305
2306/// parseInstructionMetadata
2307/// ::= !dbg !42 (',' !dbg !57)*
2308bool LLParser::parseInstructionMetadata(Instruction &Inst) {
2309 do {
2310 if (Lex.getKind() != lltok::MetadataVar)
2311 return tokError("expected metadata after comma");
2312
2313 unsigned MDK;
2314 MDNode *N;
2315 if (parseMetadataAttachment(MDK, N))
2316 return true;
2317
2318 if (MDK == LLVMContext::MD_DIAssignID)
2319 TempDIAssignIDAttachments[N].push_back(&Inst);
2320 else
2321 Inst.setMetadata(MDK, N);
2322
2323 if (MDK == LLVMContext::MD_tbaa)
2324 InstsWithTBAATag.push_back(&Inst);
2325
2326 // If this is the end of the list, we're done.
2327 } while (EatIfPresent(lltok::comma));
2328 return false;
2329}
2330
2331/// parseGlobalObjectMetadataAttachment
2332/// ::= !dbg !57
2333bool LLParser::parseGlobalObjectMetadataAttachment(GlobalObject &GO) {
2334 unsigned MDK;
2335 MDNode *N;
2336 if (parseMetadataAttachment(MDK, N))
2337 return true;
2338
2339 GO.addMetadata(MDK, *N);
2340 return false;
2341}
2342
2343/// parseOptionalFunctionMetadata
2344/// ::= (!dbg !57)*
2345bool LLParser::parseOptionalFunctionMetadata(Function &F) {
2346 while (Lex.getKind() == lltok::MetadataVar)
2347 if (parseGlobalObjectMetadataAttachment(F))
2348 return true;
2349 return false;
2350}
2351
2352/// parseOptionalAlignment
2353/// ::= /* empty */
2354/// ::= 'align' 4
2355bool LLParser::parseOptionalAlignment(MaybeAlign &Alignment, bool AllowParens) {
2356 Alignment = std::nullopt;
2357 if (!EatIfPresent(lltok::kw_align))
2358 return false;
2359 LocTy AlignLoc = Lex.getLoc();
2360 uint64_t Value = 0;
2361
2362 LocTy ParenLoc = Lex.getLoc();
2363 bool HaveParens = false;
2364 if (AllowParens) {
2365 if (EatIfPresent(lltok::lparen))
2366 HaveParens = true;
2367 }
2368
2369 if (parseUInt64(Value))
2370 return true;
2371
2372 if (HaveParens && !EatIfPresent(lltok::rparen))
2373 return error(ParenLoc, "expected ')'");
2374
2375 if (!isPowerOf2_64(Value))
2376 return error(AlignLoc, "alignment is not a power of two");
2378 return error(AlignLoc, "huge alignments are not supported yet");
2379 Alignment = Align(Value);
2380 return false;
2381}
2382
2383/// parseOptionalCodeModel
2384/// ::= /* empty */
2385/// ::= 'code_model' "large"
2386bool LLParser::parseOptionalCodeModel(CodeModel::Model &model) {
2387 Lex.Lex();
2388 auto StrVal = Lex.getStrVal();
2389 auto ErrMsg = "expected global code model string";
2390 if (StrVal == "tiny")
2391 model = CodeModel::Tiny;
2392 else if (StrVal == "small")
2393 model = CodeModel::Small;
2394 else if (StrVal == "kernel")
2395 model = CodeModel::Kernel;
2396 else if (StrVal == "medium")
2397 model = CodeModel::Medium;
2398 else if (StrVal == "large")
2399 model = CodeModel::Large;
2400 else
2401 return tokError(ErrMsg);
2402 if (parseToken(lltok::StringConstant, ErrMsg))
2403 return true;
2404 return false;
2405}
2406
2407/// parseOptionalDerefAttrBytes
2408/// ::= /* empty */
2409/// ::= AttrKind '(' 4 ')'
2410///
2411/// where AttrKind is either 'dereferenceable' or 'dereferenceable_or_null'.
2412bool LLParser::parseOptionalDerefAttrBytes(lltok::Kind AttrKind,
2413 uint64_t &Bytes) {
2414 assert((AttrKind == lltok::kw_dereferenceable ||
2415 AttrKind == lltok::kw_dereferenceable_or_null) &&
2416 "contract!");
2417
2418 Bytes = 0;
2419 if (!EatIfPresent(AttrKind))
2420 return false;
2421 LocTy ParenLoc = Lex.getLoc();
2422 if (!EatIfPresent(lltok::lparen))
2423 return error(ParenLoc, "expected '('");
2424 LocTy DerefLoc = Lex.getLoc();
2425 if (parseUInt64(Bytes))
2426 return true;
2427 ParenLoc = Lex.getLoc();
2428 if (!EatIfPresent(lltok::rparen))
2429 return error(ParenLoc, "expected ')'");
2430 if (!Bytes)
2431 return error(DerefLoc, "dereferenceable bytes must be non-zero");
2432 return false;
2433}
2434
2435bool LLParser::parseOptionalUWTableKind(UWTableKind &Kind) {
2436 Lex.Lex();
2438 if (!EatIfPresent(lltok::lparen))
2439 return false;
2440 LocTy KindLoc = Lex.getLoc();
2441 if (Lex.getKind() == lltok::kw_sync)
2443 else if (Lex.getKind() == lltok::kw_async)
2445 else
2446 return error(KindLoc, "expected unwind table kind");
2447 Lex.Lex();
2448 return parseToken(lltok::rparen, "expected ')'");
2449}
2450
2451bool LLParser::parseAllocKind(AllocFnKind &Kind) {
2452 Lex.Lex();
2453 LocTy ParenLoc = Lex.getLoc();
2454 if (!EatIfPresent(lltok::lparen))
2455 return error(ParenLoc, "expected '('");
2456 LocTy KindLoc = Lex.getLoc();
2457 std::string Arg;
2458 if (parseStringConstant(Arg))
2459 return error(KindLoc, "expected allockind value");
2460 for (StringRef A : llvm::split(Arg, ",")) {
2461 if (A == "alloc") {
2463 } else if (A == "realloc") {
2465 } else if (A == "free") {
2467 } else if (A == "uninitialized") {
2469 } else if (A == "zeroed") {
2471 } else if (A == "aligned") {
2473 } else {
2474 return error(KindLoc, Twine("unknown allockind ") + A);
2475 }
2476 }
2477 ParenLoc = Lex.getLoc();
2478 if (!EatIfPresent(lltok::rparen))
2479 return error(ParenLoc, "expected ')'");
2480 if (Kind == AllocFnKind::Unknown)
2481 return error(KindLoc, "expected allockind value");
2482 return false;
2483}
2484
2485static std::optional<MemoryEffects::Location> keywordToLoc(lltok::Kind Tok) {
2486 switch (Tok) {
2487 case lltok::kw_argmem:
2488 return IRMemLocation::ArgMem;
2491 default:
2492 return std::nullopt;
2493 }
2494}
2495
2496static std::optional<ModRefInfo> keywordToModRef(lltok::Kind Tok) {
2497 switch (Tok) {
2498 case lltok::kw_none:
2499 return ModRefInfo::NoModRef;
2500 case lltok::kw_read:
2501 return ModRefInfo::Ref;
2502 case lltok::kw_write:
2503 return ModRefInfo::Mod;
2505 return ModRefInfo::ModRef;
2506 default:
2507 return std::nullopt;
2508 }
2509}
2510
2511std::optional<MemoryEffects> LLParser::parseMemoryAttr() {
2513
2514 // We use syntax like memory(argmem: read), so the colon should not be
2515 // interpreted as a label terminator.
2517 auto _ = make_scope_exit([&] { Lex.setIgnoreColonInIdentifiers(false); });
2518
2519 Lex.Lex();
2520 if (!EatIfPresent(lltok::lparen)) {
2521 tokError("expected '('");
2522 return std::nullopt;
2523 }
2524
2525 bool SeenLoc = false;
2526 do {
2527 std::optional<IRMemLocation> Loc = keywordToLoc(Lex.getKind());
2528 if (Loc) {
2529 Lex.Lex();
2530 if (!EatIfPresent(lltok::colon)) {
2531 tokError("expected ':' after location");
2532 return std::nullopt;
2533 }
2534 }
2535
2536 std::optional<ModRefInfo> MR = keywordToModRef(Lex.getKind());
2537 if (!MR) {
2538 if (!Loc)
2539 tokError("expected memory location (argmem, inaccessiblemem) "
2540 "or access kind (none, read, write, readwrite)");
2541 else
2542 tokError("expected access kind (none, read, write, readwrite)");
2543 return std::nullopt;
2544 }
2545
2546 Lex.Lex();
2547 if (Loc) {
2548 SeenLoc = true;
2549 ME = ME.getWithModRef(*Loc, *MR);
2550 } else {
2551 if (SeenLoc) {
2552 tokError("default access kind must be specified first");
2553 return std::nullopt;
2554 }
2555 ME = MemoryEffects(*MR);
2556 }
2557
2558 if (EatIfPresent(lltok::rparen))
2559 return ME;
2560 } while (EatIfPresent(lltok::comma));
2561
2562 tokError("unterminated memory attribute");
2563 return std::nullopt;
2564}
2565
2566static unsigned keywordToFPClassTest(lltok::Kind Tok) {
2567 switch (Tok) {
2568 case lltok::kw_all:
2569 return fcAllFlags;
2570 case lltok::kw_nan:
2571 return fcNan;
2572 case lltok::kw_snan:
2573 return fcSNan;
2574 case lltok::kw_qnan:
2575 return fcQNan;
2576 case lltok::kw_inf:
2577 return fcInf;
2578 case lltok::kw_ninf:
2579 return fcNegInf;
2580 case lltok::kw_pinf:
2581 return fcPosInf;
2582 case lltok::kw_norm:
2583 return fcNormal;
2584 case lltok::kw_nnorm:
2585 return fcNegNormal;
2586 case lltok::kw_pnorm:
2587 return fcPosNormal;
2588 case lltok::kw_sub:
2589 return fcSubnormal;
2590 case lltok::kw_nsub:
2591 return fcNegSubnormal;
2592 case lltok::kw_psub:
2593 return fcPosSubnormal;
2594 case lltok::kw_zero:
2595 return fcZero;
2596 case lltok::kw_nzero:
2597 return fcNegZero;
2598 case lltok::kw_pzero:
2599 return fcPosZero;
2600 default:
2601 return 0;
2602 }
2603}
2604
2605unsigned LLParser::parseNoFPClassAttr() {
2606 unsigned Mask = fcNone;
2607
2608 Lex.Lex();
2609 if (!EatIfPresent(lltok::lparen)) {
2610 tokError("expected '('");
2611 return 0;
2612 }
2613
2614 do {
2615 uint64_t Value = 0;
2616 unsigned TestMask = keywordToFPClassTest(Lex.getKind());
2617 if (TestMask != 0) {
2618 Mask |= TestMask;
2619 // TODO: Disallow overlapping masks to avoid copy paste errors
2620 } else if (Mask == 0 && Lex.getKind() == lltok::APSInt &&
2621 !parseUInt64(Value)) {
2622 if (Value == 0 || (Value & ~static_cast<unsigned>(fcAllFlags)) != 0) {
2623 error(Lex.getLoc(), "invalid mask value for 'nofpclass'");
2624 return 0;
2625 }
2626
2627 if (!EatIfPresent(lltok::rparen)) {
2628 error(Lex.getLoc(), "expected ')'");
2629 return 0;
2630 }
2631
2632 return Value;
2633 } else {
2634 error(Lex.getLoc(), "expected nofpclass test mask");
2635 return 0;
2636 }
2637
2638 Lex.Lex();
2639 if (EatIfPresent(lltok::rparen))
2640 return Mask;
2641 } while (1);
2642
2643 llvm_unreachable("unterminated nofpclass attribute");
2644}
2645
2646/// parseOptionalCommaAlign
2647/// ::=
2648/// ::= ',' align 4
2649///
2650/// This returns with AteExtraComma set to true if it ate an excess comma at the
2651/// end.
2652bool LLParser::parseOptionalCommaAlign(MaybeAlign &Alignment,
2653 bool &AteExtraComma) {
2654 AteExtraComma = false;
2655 while (EatIfPresent(lltok::comma)) {
2656 // Metadata at the end is an early exit.
2657 if (Lex.getKind() == lltok::MetadataVar) {
2658 AteExtraComma = true;
2659 return false;
2660 }
2661
2662 if (Lex.getKind() != lltok::kw_align)
2663 return error(Lex.getLoc(), "expected metadata or 'align'");
2664
2665 if (parseOptionalAlignment(Alignment))
2666 return true;
2667 }
2668
2669 return false;
2670}
2671
2672/// parseOptionalCommaAddrSpace
2673/// ::=
2674/// ::= ',' addrspace(1)
2675///
2676/// This returns with AteExtraComma set to true if it ate an excess comma at the
2677/// end.
2678bool LLParser::parseOptionalCommaAddrSpace(unsigned &AddrSpace, LocTy &Loc,
2679 bool &AteExtraComma) {
2680 AteExtraComma = false;
2681 while (EatIfPresent(lltok::comma)) {
2682 // Metadata at the end is an early exit.
2683 if (Lex.getKind() == lltok::MetadataVar) {
2684 AteExtraComma = true;
2685 return false;
2686 }
2687
2688 Loc = Lex.getLoc();
2689 if (Lex.getKind() != lltok::kw_addrspace)
2690 return error(Lex.getLoc(), "expected metadata or 'addrspace'");
2691
2692 if (parseOptionalAddrSpace(AddrSpace))
2693 return true;
2694 }
2695
2696 return false;
2697}
2698
2699bool LLParser::parseAllocSizeArguments(unsigned &BaseSizeArg,
2700 std::optional<unsigned> &HowManyArg) {
2701 Lex.Lex();
2702
2703 auto StartParen = Lex.getLoc();
2704 if (!EatIfPresent(lltok::lparen))
2705 return error(StartParen, "expected '('");
2706
2707 if (parseUInt32(BaseSizeArg))
2708 return true;
2709
2710 if (EatIfPresent(lltok::comma)) {
2711 auto HowManyAt = Lex.getLoc();
2712 unsigned HowMany;
2713 if (parseUInt32(HowMany))
2714 return true;
2715 if (HowMany == BaseSizeArg)
2716 return error(HowManyAt,
2717 "'allocsize' indices can't refer to the same parameter");
2718 HowManyArg = HowMany;
2719 } else
2720 HowManyArg = std::nullopt;
2721
2722 auto EndParen = Lex.getLoc();
2723 if (!EatIfPresent(lltok::rparen))
2724 return error(EndParen, "expected ')'");
2725 return false;
2726}
2727
2728bool LLParser::parseVScaleRangeArguments(unsigned &MinValue,
2729 unsigned &MaxValue) {
2730 Lex.Lex();
2731
2732 auto StartParen = Lex.getLoc();
2733 if (!EatIfPresent(lltok::lparen))
2734 return error(StartParen, "expected '('");
2735
2736 if (parseUInt32(MinValue))
2737 return true;
2738
2739 if (EatIfPresent(lltok::comma)) {
2740 if (parseUInt32(MaxValue))
2741 return true;
2742 } else
2743 MaxValue = MinValue;
2744
2745 auto EndParen = Lex.getLoc();
2746 if (!EatIfPresent(lltok::rparen))
2747 return error(EndParen, "expected ')'");
2748 return false;
2749}
2750
2751/// parseScopeAndOrdering
2752/// if isAtomic: ::= SyncScope? AtomicOrdering
2753/// else: ::=
2754///
2755/// This sets Scope and Ordering to the parsed values.
2756bool LLParser::parseScopeAndOrdering(bool IsAtomic, SyncScope::ID &SSID,
2757 AtomicOrdering &Ordering) {
2758 if (!IsAtomic)
2759 return false;
2760
2761 return parseScope(SSID) || parseOrdering(Ordering);
2762}
2763
2764/// parseScope
2765/// ::= syncscope("singlethread" | "<target scope>")?
2766///
2767/// This sets synchronization scope ID to the ID of the parsed value.
2768bool LLParser::parseScope(SyncScope::ID &SSID) {
2769 SSID = SyncScope::System;
2770 if (EatIfPresent(lltok::kw_syncscope)) {
2771 auto StartParenAt = Lex.getLoc();
2772 if (!EatIfPresent(lltok::lparen))
2773 return error(StartParenAt, "Expected '(' in syncscope");
2774
2775 std::string SSN;
2776 auto SSNAt = Lex.getLoc();
2777 if (parseStringConstant(SSN))
2778 return error(SSNAt, "Expected synchronization scope name");
2779
2780 auto EndParenAt = Lex.getLoc();
2781 if (!EatIfPresent(lltok::rparen))
2782 return error(EndParenAt, "Expected ')' in syncscope");
2783
2784 SSID = Context.getOrInsertSyncScopeID(SSN);
2785 }
2786
2787 return false;
2788}
2789
2790/// parseOrdering
2791/// ::= AtomicOrdering
2792///
2793/// This sets Ordering to the parsed value.
2794bool LLParser::parseOrdering(AtomicOrdering &Ordering) {
2795 switch (Lex.getKind()) {
2796 default:
2797 return tokError("Expected ordering on atomic instruction");
2800 // Not specified yet:
2801 // case lltok::kw_consume: Ordering = AtomicOrdering::Consume; break;
2805 case lltok::kw_seq_cst:
2807 break;
2808 }
2809 Lex.Lex();
2810 return false;
2811}
2812
2813/// parseOptionalStackAlignment
2814/// ::= /* empty */
2815/// ::= 'alignstack' '(' 4 ')'
2816bool LLParser::parseOptionalStackAlignment(unsigned &Alignment) {
2817 Alignment = 0;
2818 if (!EatIfPresent(lltok::kw_alignstack))
2819 return false;
2820 LocTy ParenLoc = Lex.getLoc();
2821 if (!EatIfPresent(lltok::lparen))
2822 return error(ParenLoc, "expected '('");
2823 LocTy AlignLoc = Lex.getLoc();
2824 if (parseUInt32(Alignment))
2825 return true;
2826 ParenLoc = Lex.getLoc();
2827 if (!EatIfPresent(lltok::rparen))
2828 return error(ParenLoc, "expected ')'");
2829 if (!isPowerOf2_32(Alignment))
2830 return error(AlignLoc, "stack alignment is not a power of two");
2831 return false;
2832}
2833
2834/// parseIndexList - This parses the index list for an insert/extractvalue
2835/// instruction. This sets AteExtraComma in the case where we eat an extra
2836/// comma at the end of the line and find that it is followed by metadata.
2837/// Clients that don't allow metadata can call the version of this function that
2838/// only takes one argument.
2839///
2840/// parseIndexList
2841/// ::= (',' uint32)+
2842///
2843bool LLParser::parseIndexList(SmallVectorImpl<unsigned> &Indices,
2844 bool &AteExtraComma) {
2845 AteExtraComma = false;
2846
2847 if (Lex.getKind() != lltok::comma)
2848 return tokError("expected ',' as start of index list");
2849
2850 while (EatIfPresent(lltok::comma)) {
2851 if (Lex.getKind() == lltok::MetadataVar) {
2852 if (Indices.empty())
2853 return tokError("expected index");
2854 AteExtraComma = true;
2855 return false;
2856 }
2857 unsigned Idx = 0;
2858 if (parseUInt32(Idx))
2859 return true;
2860 Indices.push_back(Idx);
2861 }
2862
2863 return false;
2864}
2865
2866//===----------------------------------------------------------------------===//
2867// Type Parsing.
2868//===----------------------------------------------------------------------===//
2869
2870/// parseType - parse a type.
2871bool LLParser::parseType(Type *&Result, const Twine &Msg, bool AllowVoid) {
2872 SMLoc TypeLoc = Lex.getLoc();
2873 switch (Lex.getKind()) {
2874 default:
2875 return tokError(Msg);
2876 case lltok::Type:
2877 // Type ::= 'float' | 'void' (etc)
2878 Result = Lex.getTyVal();
2879 Lex.Lex();
2880
2881 // Handle "ptr" opaque pointer type.
2882 //
2883 // Type ::= ptr ('addrspace' '(' uint32 ')')?
2884 if (Result->isPointerTy()) {
2885 unsigned AddrSpace;
2886 if (parseOptionalAddrSpace(AddrSpace))
2887 return true;
2888 Result = PointerType::get(getContext(), AddrSpace);
2889
2890 // Give a nice error for 'ptr*'.
2891 if (Lex.getKind() == lltok::star)
2892 return tokError("ptr* is invalid - use ptr instead");
2893
2894 // Fall through to parsing the type suffixes only if this 'ptr' is a
2895 // function return. Otherwise, return success, implicitly rejecting other
2896 // suffixes.
2897 if (Lex.getKind() != lltok::lparen)
2898 return false;
2899 }
2900 break;
2901 case lltok::kw_target: {
2902 // Type ::= TargetExtType
2903 if (parseTargetExtType(Result))
2904 return true;
2905 break;
2906 }
2907 case lltok::lbrace:
2908 // Type ::= StructType
2909 if (parseAnonStructType(Result, false))
2910 return true;
2911 break;
2912 case lltok::lsquare:
2913 // Type ::= '[' ... ']'
2914 Lex.Lex(); // eat the lsquare.
2915 if (parseArrayVectorType(Result, false))
2916 return true;
2917 break;
2918 case lltok::less: // Either vector or packed struct.
2919 // Type ::= '<' ... '>'
2920 Lex.Lex();
2921 if (Lex.getKind() == lltok::lbrace) {
2922 if (parseAnonStructType(Result, true) ||
2923 parseToken(lltok::greater, "expected '>' at end of packed struct"))
2924 return true;
2925 } else if (parseArrayVectorType(Result, true))
2926 return true;
2927 break;
2928 case lltok::LocalVar: {
2929 // Type ::= %foo
2930 std::pair<Type*, LocTy> &Entry = NamedTypes[Lex.getStrVal()];
2931
2932 // If the type hasn't been defined yet, create a forward definition and
2933 // remember where that forward def'n was seen (in case it never is defined).
2934 if (!Entry.first) {
2935 Entry.first = StructType::create(Context, Lex.getStrVal());
2936 Entry.second = Lex.getLoc();
2937 }
2938 Result = Entry.first;
2939 Lex.Lex();
2940 break;
2941 }
2942
2943 case lltok::LocalVarID: {
2944 // Type ::= %4
2945 std::pair<Type*, LocTy> &Entry = NumberedTypes[Lex.getUIntVal()];
2946
2947 // If the type hasn't been defined yet, create a forward definition and
2948 // remember where that forward def'n was seen (in case it never is defined).
2949 if (!Entry.first) {
2950 Entry.first = StructType::create(Context);
2951 Entry.second = Lex.getLoc();
2952 }
2953 Result = Entry.first;
2954 Lex.Lex();
2955 break;
2956 }
2957 }
2958
2959 // parse the type suffixes.
2960 while (true) {
2961 switch (Lex.getKind()) {
2962 // End of type.
2963 default:
2964 if (!AllowVoid && Result->isVoidTy())
2965 return error(TypeLoc, "void type only allowed for function results");
2966 return false;
2967
2968 // Type ::= Type '*'
2969 case lltok::star:
2970 if (Result->isLabelTy())
2971 return tokError("basic block pointers are invalid");
2972 if (Result->isVoidTy())
2973 return tokError("pointers to void are invalid - use i8* instead");
2975 return tokError("pointer to this type is invalid");
2977 Lex.Lex();
2978 break;
2979
2980 // Type ::= Type 'addrspace' '(' uint32 ')' '*'
2981 case lltok::kw_addrspace: {
2982 if (Result->isLabelTy())
2983 return tokError("basic block pointers are invalid");
2984 if (Result->isVoidTy())
2985 return tokError("pointers to void are invalid; use i8* instead");
2987 return tokError("pointer to this type is invalid");
2988 unsigned AddrSpace;
2989 if (parseOptionalAddrSpace(AddrSpace) ||
2990 parseToken(lltok::star, "expected '*' in address space"))
2991 return true;
2992
2993 Result = PointerType::get(Result, AddrSpace);
2994 break;
2995 }
2996
2997 /// Types '(' ArgTypeListI ')' OptFuncAttrs
2998 case lltok::lparen:
2999 if (parseFunctionType(Result))
3000 return true;
3001 break;
3002 }
3003 }
3004}
3005
3006/// parseParameterList
3007/// ::= '(' ')'
3008/// ::= '(' Arg (',' Arg)* ')'
3009/// Arg
3010/// ::= Type OptionalAttributes Value OptionalAttributes
3011bool LLParser::parseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
3012 PerFunctionState &PFS, bool IsMustTailCall,
3013 bool InVarArgsFunc) {
3014 if (parseToken(lltok::lparen, "expected '(' in call"))
3015 return true;
3016
3017 while (Lex.getKind() != lltok::rparen) {
3018 // If this isn't the first argument, we need a comma.
3019 if (!ArgList.empty() &&
3020 parseToken(lltok::comma, "expected ',' in argument list"))
3021 return true;
3022
3023 // parse an ellipsis if this is a musttail call in a variadic function.
3024 if (Lex.getKind() == lltok::dotdotdot) {
3025 const char *Msg = "unexpected ellipsis in argument list for ";
3026 if (!IsMustTailCall)
3027 return tokError(Twine(Msg) + "non-musttail call");
3028 if (!InVarArgsFunc)
3029 return tokError(Twine(Msg) + "musttail call in non-varargs function");
3030 Lex.Lex(); // Lex the '...', it is purely for readability.
3031 return parseToken(lltok::rparen, "expected ')' at end of argument list");
3032 }
3033
3034 // parse the argument.
3035 LocTy ArgLoc;
3036 Type *ArgTy = nullptr;
3037 Value *V;
3038 if (parseType(ArgTy, ArgLoc))
3039 return true;
3040
3041 AttrBuilder ArgAttrs(M->getContext());
3042
3043 if (ArgTy->isMetadataTy()) {
3044 if (parseMetadataAsValue(V, PFS))
3045 return true;
3046 } else {
3047 // Otherwise, handle normal operands.
3048 if (parseOptionalParamAttrs(ArgAttrs) || parseValue(ArgTy, V, PFS))
3049 return true;
3050 }
3051 ArgList.push_back(ParamInfo(
3052 ArgLoc, V, AttributeSet::get(V->getContext(), ArgAttrs)));
3053 }
3054
3055 if (IsMustTailCall && InVarArgsFunc)
3056 return tokError("expected '...' at end of argument list for musttail call "
3057 "in varargs function");
3058
3059 Lex.Lex(); // Lex the ')'.
3060 return false;
3061}
3062
3063/// parseRequiredTypeAttr
3064/// ::= attrname(<ty>)
3065bool LLParser::parseRequiredTypeAttr(AttrBuilder &B, lltok::Kind AttrToken,
3066 Attribute::AttrKind AttrKind) {
3067 Type *Ty = nullptr;
3068 if (!EatIfPresent(AttrToken))
3069 return true;
3070 if (!EatIfPresent(lltok::lparen))
3071 return error(Lex.getLoc(), "expected '('");
3072 if (parseType(Ty))
3073 return true;
3074 if (!EatIfPresent(lltok::rparen))
3075 return error(Lex.getLoc(), "expected ')'");
3076
3077 B.addTypeAttr(AttrKind, Ty);
3078 return false;
3079}
3080
3081/// parseRangeAttr
3082/// ::= range(<ty> <n>,<n>)
3083bool LLParser::parseRangeAttr(AttrBuilder &B) {
3084 Lex.Lex();
3085
3086 APInt Lower;
3087 APInt Upper;
3088 Type *Ty = nullptr;
3089 LocTy TyLoc;
3090
3091 auto ParseAPSInt = [&](unsigned BitWidth, APInt &Val) {
3092 if (Lex.getKind() != lltok::APSInt)
3093 return tokError("expected integer");
3094 if (Lex.getAPSIntVal().getBitWidth() > BitWidth)
3095 return tokError(
3096 "integer is too large for the bit width of specified type");
3097 Val = Lex.getAPSIntVal().extend(BitWidth);
3098 Lex.Lex();
3099 return false;
3100 };
3101
3102 if (parseToken(lltok::lparen, "expected '('") || parseType(Ty, TyLoc))
3103 return true;
3104 if (!Ty->isIntegerTy())
3105 return error(TyLoc, "the range must have integer type!");
3106
3107 unsigned BitWidth = Ty->getPrimitiveSizeInBits();
3108
3109 if (ParseAPSInt(BitWidth, Lower) ||
3110 parseToken(lltok::comma, "expected ','") || ParseAPSInt(BitWidth, Upper))
3111 return true;
3112 if (Lower == Upper && !Lower.isZero())
3113 return tokError("the range represent the empty set but limits aren't 0!");
3114
3115 if (parseToken(lltok::rparen, "expected ')'"))
3116 return true;
3117
3118 B.addRangeAttr(ConstantRange(Lower, Upper));
3119 return false;
3120}
3121
3122/// parseInitializesAttr
3123/// ::= initializes((Lo1,Hi1),(Lo2,Hi2),...)
3124bool LLParser::parseInitializesAttr(AttrBuilder &B) {
3125 Lex.Lex();
3126
3127 auto ParseAPSInt = [&](APInt &Val) {
3128 if (Lex.getKind() != lltok::APSInt)
3129 return tokError("expected integer");
3130 Val = Lex.getAPSIntVal().extend(64);
3131 Lex.Lex();
3132 return false;
3133 };
3134
3135 if (parseToken(lltok::lparen, "expected '('"))
3136 return true;
3137
3139 // Parse each constant range.
3140 do {
3141 APInt Lower, Upper;
3142 if (parseToken(lltok::lparen, "expected '('"))
3143 return true;
3144
3145 if (ParseAPSInt(Lower) || parseToken(lltok::comma, "expected ','") ||
3146 ParseAPSInt(Upper))
3147 return true;
3148
3149 if (Lower == Upper)
3150 return tokError("the range should not represent the full or empty set!");
3151
3152 if (parseToken(lltok::rparen, "expected ')'"))
3153 return true;
3154
3155 RangeList.push_back(ConstantRange(Lower, Upper));
3156 } while (EatIfPresent(lltok::comma));
3157
3158 if (parseToken(lltok::rparen, "expected ')'"))
3159 return true;
3160
3161 auto CRLOrNull = ConstantRangeList::getConstantRangeList(RangeList);
3162 if (!CRLOrNull.has_value())
3163 return tokError("Invalid (unordered or overlapping) range list");
3164 B.addInitializesAttr(*CRLOrNull);
3165 return false;
3166}
3167
3168/// parseOptionalOperandBundles
3169/// ::= /*empty*/
3170/// ::= '[' OperandBundle [, OperandBundle ]* ']'
3171///
3172/// OperandBundle
3173/// ::= bundle-tag '(' ')'
3174/// ::= bundle-tag '(' Type Value [, Type Value ]* ')'
3175///
3176/// bundle-tag ::= String Constant
3177bool LLParser::parseOptionalOperandBundles(
3178 SmallVectorImpl<OperandBundleDef> &BundleList, PerFunctionState &PFS) {
3179 LocTy BeginLoc = Lex.getLoc();
3180 if (!EatIfPresent(lltok::lsquare))
3181 return false;
3182
3183 while (Lex.getKind() != lltok::rsquare) {
3184 // If this isn't the first operand bundle, we need a comma.
3185 if (!BundleList.empty() &&
3186 parseToken(lltok::comma, "expected ',' in input list"))
3187 return true;
3188
3189 std::string Tag;
3190 if (parseStringConstant(Tag))
3191 return true;
3192
3193 if (parseToken(lltok::lparen, "expected '(' in operand bundle"))
3194 return true;
3195
3196 std::vector<Value *> Inputs;
3197 while (Lex.getKind() != lltok::rparen) {
3198 // If this isn't the first input, we need a comma.
3199 if (!Inputs.empty() &&
3200 parseToken(lltok::comma, "expected ',' in input list"))
3201 return true;
3202
3203 Type *Ty = nullptr;
3204 Value *Input = nullptr;
3205 if (parseType(Ty))
3206 return true;
3207 if (Ty->isMetadataTy()) {
3208 if (parseMetadataAsValue(Input, PFS))
3209 return true;
3210 } else if (parseValue(Ty, Input, PFS)) {
3211 return true;
3212 }
3213 Inputs.push_back(Input);
3214 }
3215
3216 BundleList.emplace_back(std::move(Tag), std::move(Inputs));
3217
3218 Lex.Lex(); // Lex the ')'.
3219 }
3220
3221 if (BundleList.empty())
3222 return error(BeginLoc, "operand bundle set must not be empty");
3223
3224 Lex.Lex(); // Lex the ']'.
3225 return false;
3226}
3227
3228bool LLParser::checkValueID(LocTy Loc, StringRef Kind, StringRef Prefix,
3229 unsigned NextID, unsigned ID) {
3230 if (ID < NextID)
3231 return error(Loc, Kind + " expected to be numbered '" + Prefix +
3232 Twine(NextID) + "' or greater");
3233
3234 return false;
3235}
3236
3237/// parseArgumentList - parse the argument list for a function type or function
3238/// prototype.
3239/// ::= '(' ArgTypeListI ')'
3240/// ArgTypeListI
3241/// ::= /*empty*/
3242/// ::= '...'
3243/// ::= ArgTypeList ',' '...'
3244/// ::= ArgType (',' ArgType)*
3245///
3246bool LLParser::parseArgumentList(SmallVectorImpl<ArgInfo> &ArgList,
3247 SmallVectorImpl<unsigned> &UnnamedArgNums,
3248 bool &IsVarArg) {
3249 unsigned CurValID = 0;
3250 IsVarArg = false;
3251 assert(Lex.getKind() == lltok::lparen);
3252 Lex.Lex(); // eat the (.
3253
3254 if (Lex.getKind() != lltok::rparen) {
3255 do {
3256 // Handle ... at end of arg list.
3257 if (EatIfPresent(lltok::dotdotdot)) {
3258 IsVarArg = true;
3259 break;
3260 }
3261
3262 // Otherwise must be an argument type.
3263 LocTy TypeLoc = Lex.getLoc();
3264 Type *ArgTy = nullptr;
3265 AttrBuilder Attrs(M->getContext());
3266 if (parseType(ArgTy) || parseOptionalParamAttrs(Attrs))
3267 return true;
3268
3269 if (ArgTy->isVoidTy())
3270 return error(TypeLoc, "argument can not have void type");
3271
3272 std::string Name;
3273 if (Lex.getKind() == lltok::LocalVar) {
3274 Name = Lex.getStrVal();
3275 Lex.Lex();
3276 } else {
3277 unsigned ArgID;
3278 if (Lex.getKind() == lltok::LocalVarID) {
3279 ArgID = Lex.getUIntVal();
3280 if (checkValueID(TypeLoc, "argument", "%", CurValID, ArgID))
3281 return true;
3282 Lex.Lex();
3283 } else {
3284 ArgID = CurValID;
3285 }
3286 UnnamedArgNums.push_back(ArgID);
3287 CurValID = ArgID + 1;
3288 }
3289
3290 if (!ArgTy->isFirstClassType())
3291 return error(TypeLoc, "invalid type for function argument");
3292
3293 ArgList.emplace_back(TypeLoc, ArgTy,
3294 AttributeSet::get(ArgTy->getContext(), Attrs),
3295 std::move(Name));
3296 } while (EatIfPresent(lltok::comma));
3297 }
3298
3299 return parseToken(lltok::rparen, "expected ')' at end of argument list");
3300}
3301
3302/// parseFunctionType
3303/// ::= Type ArgumentList OptionalAttrs
3304bool LLParser::parseFunctionType(Type *&Result) {
3305 assert(Lex.getKind() == lltok::lparen);
3306
3308 return tokError("invalid function return type");
3309
3311 bool IsVarArg;
3312 SmallVector<unsigned> UnnamedArgNums;
3313 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg))
3314 return true;
3315
3316 // Reject names on the arguments lists.
3317 for (const ArgInfo &Arg : ArgList) {
3318 if (!Arg.Name.empty())
3319 return error(Arg.Loc, "argument name invalid in function type");
3320 if (Arg.Attrs.hasAttributes())
3321 return error(Arg.Loc, "argument attributes invalid in function type");
3322 }
3323
3324 SmallVector<Type*, 16> ArgListTy;
3325 for (const ArgInfo &Arg : ArgList)
3326 ArgListTy.push_back(Arg.Ty);
3327
3328 Result = FunctionType::get(Result, ArgListTy, IsVarArg);
3329 return false;
3330}
3331
3332/// parseAnonStructType - parse an anonymous struct type, which is inlined into
3333/// other structs.
3334bool LLParser::parseAnonStructType(Type *&Result, bool Packed) {
3336 if (parseStructBody(Elts))
3337 return true;
3338
3339 Result = StructType::get(Context, Elts, Packed);
3340 return false;
3341}
3342
3343/// parseStructDefinition - parse a struct in a 'type' definition.
3344bool LLParser::parseStructDefinition(SMLoc TypeLoc, StringRef Name,
3345 std::pair<Type *, LocTy> &Entry,
3346 Type *&ResultTy) {
3347 // If the type was already defined, diagnose the redefinition.
3348 if (Entry.first && !Entry.second.isValid())
3349 return error(TypeLoc, "redefinition of type");
3350
3351 // If we have opaque, just return without filling in the definition for the
3352 // struct. This counts as a definition as far as the .ll file goes.
3353 if (EatIfPresent(lltok::kw_opaque)) {
3354 // This type is being defined, so clear the location to indicate this.
3355 Entry.second = SMLoc();
3356
3357 // If this type number has never been uttered, create it.
3358 if (!Entry.first)
3359 Entry.first = StructType::create(Context, Name);
3360 ResultTy = Entry.first;
3361 return false;
3362 }
3363
3364 // If the type starts with '<', then it is either a packed struct or a vector.
3365 bool isPacked = EatIfPresent(lltok::less);
3366
3367 // If we don't have a struct, then we have a random type alias, which we
3368 // accept for compatibility with old files. These types are not allowed to be
3369 // forward referenced and not allowed to be recursive.
3370 if (Lex.getKind() != lltok::lbrace) {
3371 if (Entry.first)
3372 return error(TypeLoc, "forward references to non-struct type");
3373
3374 ResultTy = nullptr;
3375 if (isPacked)
3376 return parseArrayVectorType(ResultTy, true);
3377 return parseType(ResultTy);
3378 }
3379
3380 // This type is being defined, so clear the location to indicate this.
3381 Entry.second = SMLoc();
3382
3383 // If this type number has never been uttered, create it.
3384 if (!Entry.first)
3385 Entry.first = StructType::create(Context, Name);
3386
3387 StructType *STy = cast<StructType>(Entry.first);
3388
3390 if (parseStructBody(Body) ||
3391 (isPacked && parseToken(lltok::greater, "expected '>' in packed struct")))
3392 return true;
3393
3394 if (auto E = STy->setBodyOrError(Body, isPacked))
3395 return tokError(toString(std::move(E)));
3396
3397 ResultTy = STy;
3398 return false;
3399}
3400
3401/// parseStructType: Handles packed and unpacked types. </> parsed elsewhere.
3402/// StructType
3403/// ::= '{' '}'
3404/// ::= '{' Type (',' Type)* '}'
3405/// ::= '<' '{' '}' '>'
3406/// ::= '<' '{' Type (',' Type)* '}' '>'
3407bool LLParser::parseStructBody(SmallVectorImpl<Type *> &Body) {
3408 assert(Lex.getKind() == lltok::lbrace);
3409 Lex.Lex(); // Consume the '{'
3410
3411 // Handle the empty struct.
3412 if (EatIfPresent(lltok::rbrace))
3413 return false;
3414
3415 LocTy EltTyLoc = Lex.getLoc();
3416 Type *Ty = nullptr;
3417 if (parseType(Ty))
3418 return true;
3419 Body.push_back(Ty);
3420
3422 return error(EltTyLoc, "invalid element type for struct");
3423
3424 while (EatIfPresent(lltok::comma)) {
3425 EltTyLoc = Lex.getLoc();
3426 if (parseType(Ty))
3427 return true;
3428
3430 return error(EltTyLoc, "invalid element type for struct");
3431
3432 Body.push_back(Ty);
3433 }
3434
3435 return parseToken(lltok::rbrace, "expected '}' at end of struct");
3436}
3437
3438/// parseArrayVectorType - parse an array or vector type, assuming the first
3439/// token has already been consumed.
3440/// Type
3441/// ::= '[' APSINTVAL 'x' Types ']'
3442/// ::= '<' APSINTVAL 'x' Types '>'
3443/// ::= '<' 'vscale' 'x' APSINTVAL 'x' Types '>'
3444bool LLParser::parseArrayVectorType(Type *&Result, bool IsVector) {
3445 bool Scalable = false;
3446
3447 if (IsVector && Lex.getKind() == lltok::kw_vscale) {
3448 Lex.Lex(); // consume the 'vscale'
3449 if (parseToken(lltok::kw_x, "expected 'x' after vscale"))
3450 return true;
3451
3452 Scalable = true;
3453 }
3454
3455 if (Lex.getKind() != lltok::APSInt || Lex.getAPSIntVal().isSigned() ||
3456 Lex.getAPSIntVal().getBitWidth() > 64)
3457 return tokError("expected number in address space");
3458
3459 LocTy SizeLoc = Lex.getLoc();
3461 Lex.Lex();
3462
3463 if (parseToken(lltok::kw_x, "expected 'x' after element count"))
3464 return true;
3465
3466 LocTy TypeLoc = Lex.getLoc();
3467 Type *EltTy = nullptr;
3468 if (parseType(EltTy))
3469 return true;
3470
3471 if (parseToken(IsVector ? lltok::greater : lltok::rsquare,
3472 "expected end of sequential type"))
3473 return true;
3474
3475 if (IsVector) {
3476 if (Size == 0)
3477 return error(SizeLoc, "zero element vector is illegal");
3478 if ((unsigned)Size != Size)
3479 return error(SizeLoc, "size too large for vector");
3481 return error(TypeLoc, "invalid vector element type");
3482 Result = VectorType::get(EltTy, unsigned(Size), Scalable);
3483 } else {
3485 return error(TypeLoc, "invalid array element type");
3486 Result = ArrayType::get(EltTy, Size);
3487 }
3488 return false;
3489}
3490
3491/// parseTargetExtType - handle target extension type syntax
3492/// TargetExtType
3493/// ::= 'target' '(' STRINGCONSTANT TargetExtTypeParams TargetExtIntParams ')'
3494///
3495/// TargetExtTypeParams
3496/// ::= /*empty*/
3497/// ::= ',' Type TargetExtTypeParams
3498///
3499/// TargetExtIntParams
3500/// ::= /*empty*/
3501/// ::= ',' uint32 TargetExtIntParams
3502bool LLParser::parseTargetExtType(Type *&Result) {
3503 Lex.Lex(); // Eat the 'target' keyword.
3504
3505 // Get the mandatory type name.
3506 std::string TypeName;
3507 if (parseToken(lltok::lparen, "expected '(' in target extension type") ||
3508 parseStringConstant(TypeName))
3509 return true;
3510
3511 // Parse all of the integer and type parameters at the same time; the use of
3512 // SeenInt will allow us to catch cases where type parameters follow integer
3513 // parameters.
3514 SmallVector<Type *> TypeParams;
3515 SmallVector<unsigned> IntParams;
3516 bool SeenInt = false;
3517 while (Lex.getKind() == lltok::comma) {
3518 Lex.Lex(); // Eat the comma.
3519
3520 if (Lex.getKind() == lltok::APSInt) {
3521 SeenInt = true;
3522 unsigned IntVal;
3523 if (parseUInt32(IntVal))
3524 return true;
3525 IntParams.push_back(IntVal);
3526 } else if (SeenInt) {
3527 // The only other kind of parameter we support is type parameters, which
3528 // must precede the integer parameters. This is therefore an error.
3529 return tokError("expected uint32 param");
3530 } else {
3531 Type *TypeParam;
3532 if (parseType(TypeParam, /*AllowVoid=*/true))
3533 return true;
3534 TypeParams.push_back(TypeParam);
3535 }
3536 }
3537
3538 if (parseToken(lltok::rparen, "expected ')' in target extension type"))
3539 return true;
3540
3541 auto TTy =
3542 TargetExtType::getOrError(Context, TypeName, TypeParams, IntParams);
3543 if (auto E = TTy.takeError())
3544 return tokError(toString(std::move(E)));
3545
3546 Result = *TTy;
3547 return false;
3548}
3549
3550//===----------------------------------------------------------------------===//
3551// Function Semantic Analysis.
3552//===----------------------------------------------------------------------===//
3553
3554LLParser::PerFunctionState::PerFunctionState(LLParser &p, Function &f,
3555 int functionNumber,
3556 ArrayRef<unsigned> UnnamedArgNums)
3557 : P(p), F(f), FunctionNumber(functionNumber) {
3558
3559 // Insert unnamed arguments into the NumberedVals list.
3560 auto It = UnnamedArgNums.begin();
3561 for (Argument &A : F.args()) {
3562 if (!A.hasName()) {
3563 unsigned ArgNum = *It++;
3564 NumberedVals.add(ArgNum, &A);
3565 }
3566 }
3567}
3568
3569LLParser::PerFunctionState::~PerFunctionState() {
3570 // If there were any forward referenced non-basicblock values, delete them.
3571
3572 for (const auto &P : ForwardRefVals) {
3573 if (isa<BasicBlock>(P.second.first))
3574 continue;
3575 P.second.first->replaceAllUsesWith(
3576 PoisonValue::get(P.second.first->getType()));
3577 P.second.first->deleteValue();
3578 }
3579
3580 for (const auto &P : ForwardRefValIDs) {
3581 if (isa<BasicBlock>(P.second.first))
3582 continue;
3583 P.second.first->replaceAllUsesWith(
3584 PoisonValue::get(P.second.first->getType()));
3585 P.second.first->deleteValue();
3586 }
3587}
3588
3589bool LLParser::PerFunctionState::finishFunction() {
3590 if (!ForwardRefVals.empty())
3591 return P.error(ForwardRefVals.begin()->second.second,
3592 "use of undefined value '%" + ForwardRefVals.begin()->first +
3593 "'");
3594 if (!ForwardRefValIDs.empty())
3595 return P.error(ForwardRefValIDs.begin()->second.second,
3596 "use of undefined value '%" +
3597 Twine(ForwardRefValIDs.begin()->first) + "'");
3598 return false;
3599}
3600
3601/// getVal - Get a value with the specified name or ID, creating a
3602/// forward reference record if needed. This can return null if the value
3603/// exists but does not have the right type.
3604Value *LLParser::PerFunctionState::getVal(const std::string &Name, Type *Ty,
3605 LocTy Loc) {
3606 // Look this name up in the normal function symbol table.
3607 Value *Val = F.getValueSymbolTable()->lookup(Name);
3608
3609 // If this is a forward reference for the value, see if we already created a
3610 // forward ref record.
3611 if (!Val) {
3612 auto I = ForwardRefVals.find(Name);
3613 if (I != ForwardRefVals.end())
3614 Val = I->second.first;
3615 }
3616
3617 // If we have the value in the symbol table or fwd-ref table, return it.
3618 if (Val)
3619 return P.checkValidVariableType(Loc, "%" + Name, Ty, Val);
3620
3621 // Don't make placeholders with invalid type.
3622 if (!Ty->isFirstClassType()) {
3623 P.error(Loc, "invalid use of a non-first-class type");
3624 return nullptr;
3625 }
3626
3627 // Otherwise, create a new forward reference for this value and remember it.
3628 Value *FwdVal;
3629 if (Ty->isLabelTy()) {
3630 FwdVal = BasicBlock::Create(F.getContext(), Name, &F);
3631 } else {
3632 FwdVal = new Argument(Ty, Name);
3633 }
3634 if (FwdVal->getName() != Name) {
3635 P.error(Loc, "name is too long which can result in name collisions, "
3636 "consider making the name shorter or "
3637 "increasing -non-global-value-max-name-size");
3638 return nullptr;
3639 }
3640
3641 ForwardRefVals[Name] = std::make_pair(FwdVal, Loc);
3642 return FwdVal;
3643}
3644
3645Value *LLParser::PerFunctionState::getVal(unsigned ID, Type *Ty, LocTy Loc) {
3646 // Look this name up in the normal function symbol table.
3647 Value *Val = NumberedVals.get(ID);
3648
3649 // If this is a forward reference for the value, see if we already created a
3650 // forward ref record.
3651 if (!Val) {
3652 auto I = ForwardRefValIDs.find(ID);
3653 if (I != ForwardRefValIDs.end())
3654 Val = I->second.first;
3655 }
3656
3657 // If we have the value in the symbol table or fwd-ref table, return it.
3658 if (Val)
3659 return P.checkValidVariableType(Loc, "%" + Twine(ID), Ty, Val);
3660
3661 if (!Ty->isFirstClassType()) {
3662 P.error(Loc, "invalid use of a non-first-class type");
3663 return nullptr;
3664 }
3665
3666 // Otherwise, create a new forward reference for this value and remember it.
3667 Value *FwdVal;
3668 if (Ty->isLabelTy()) {
3669 FwdVal = BasicBlock::Create(F.getContext(), "", &F);
3670 } else {
3671 FwdVal = new Argument(Ty);
3672 }
3673
3674 ForwardRefValIDs[ID] = std::make_pair(FwdVal, Loc);
3675 return FwdVal;
3676}
3677
3678/// setInstName - After an instruction is parsed and inserted into its
3679/// basic block, this installs its name.
3680bool LLParser::PerFunctionState::setInstName(int NameID,
3681 const std::string &NameStr,
3682 LocTy NameLoc, Instruction *Inst) {
3683 // If this instruction has void type, it cannot have a name or ID specified.
3684 if (Inst->getType()->isVoidTy()) {
3685 if (NameID != -1 || !NameStr.empty())
3686 return P.error(NameLoc, "instructions returning void cannot have a name");
3687 return false;
3688 }
3689
3690 // If this was a numbered instruction, verify that the instruction is the
3691 // expected value and resolve any forward references.
3692 if (NameStr.empty()) {
3693 // If neither a name nor an ID was specified, just use the next ID.
3694 if (NameID == -1)
3695 NameID = NumberedVals.getNext();
3696
3697 if (P.checkValueID(NameLoc, "instruction", "%", NumberedVals.getNext(),
3698 NameID))
3699 return true;
3700
3701 auto FI = ForwardRefValIDs.find(NameID);
3702 if (FI != ForwardRefValIDs.end()) {
3703 Value *Sentinel = FI->second.first;
3704 if (Sentinel->getType() != Inst->getType())
3705 return P.error(NameLoc, "instruction forward referenced with type '" +
3706 getTypeString(FI->second.first->getType()) +
3707 "'");
3708
3709 Sentinel->replaceAllUsesWith(Inst);
3710 Sentinel->deleteValue();
3711 ForwardRefValIDs.erase(FI);
3712 }
3713
3714 NumberedVals.add(NameID, Inst);
3715 return false;
3716 }
3717
3718 // Otherwise, the instruction had a name. Resolve forward refs and set it.
3719 auto FI = ForwardRefVals.find(NameStr);
3720 if (FI != ForwardRefVals.end()) {
3721 Value *Sentinel = FI->second.first;
3722 if (Sentinel->getType() != Inst->getType())
3723 return P.error(NameLoc, "instruction forward referenced with type '" +
3724 getTypeString(FI->second.first->getType()) +
3725 "'");
3726
3727 Sentinel->replaceAllUsesWith(Inst);
3728 Sentinel->deleteValue();
3729 ForwardRefVals.erase(FI);
3730 }
3731
3732 // Set the name on the instruction.
3733 Inst->setName(NameStr);
3734
3735 if (Inst->getName() != NameStr)
3736 return P.error(NameLoc, "multiple definition of local value named '" +
3737 NameStr + "'");
3738 return false;
3739}
3740
3741/// getBB - Get a basic block with the specified name or ID, creating a
3742/// forward reference record if needed.
3743BasicBlock *LLParser::PerFunctionState::getBB(const std::string &Name,
3744 LocTy Loc) {
3745 return dyn_cast_or_null<BasicBlock>(
3746 getVal(Name, Type::getLabelTy(F.getContext()), Loc));
3747}
3748
3749BasicBlock *LLParser::PerFunctionState::getBB(unsigned ID, LocTy Loc) {
3750 return dyn_cast_or_null<BasicBlock>(
3751 getVal(ID, Type::getLabelTy(F.getContext()), Loc));
3752}
3753
3754/// defineBB - Define the specified basic block, which is either named or
3755/// unnamed. If there is an error, this returns null otherwise it returns
3756/// the block being defined.
3757BasicBlock *LLParser::PerFunctionState::defineBB(const std::string &Name,
3758 int NameID, LocTy Loc) {
3759 BasicBlock *BB;
3760 if (Name.empty()) {
3761 if (NameID != -1) {
3762 if (P.checkValueID(Loc, "label", "", NumberedVals.getNext(), NameID))
3763 return nullptr;
3764 } else {
3765 NameID = NumberedVals.getNext();
3766 }
3767 BB = getBB(NameID, Loc);
3768 if (!BB) {
3769 P.error(Loc, "unable to create block numbered '" + Twine(NameID) + "'");
3770 return nullptr;
3771 }
3772 } else {
3773 BB = getBB(Name, Loc);
3774 if (!BB) {
3775 P.error(Loc, "unable to create block named '" + Name + "'");
3776 return nullptr;
3777 }
3778 }
3779
3780 // Move the block to the end of the function. Forward ref'd blocks are
3781 // inserted wherever they happen to be referenced.
3782 F.splice(F.end(), &F, BB->getIterator());
3783
3784 // Remove the block from forward ref sets.
3785 if (Name.empty()) {
3786 ForwardRefValIDs.erase(NameID);
3787 NumberedVals.add(NameID, BB);
3788 } else {
3789 // BB forward references are already in the function symbol table.
3790 ForwardRefVals.erase(Name);
3791 }
3792
3793 return BB;
3794}
3795
3796//===----------------------------------------------------------------------===//
3797// Constants.
3798//===----------------------------------------------------------------------===//
3799
3800/// parseValID - parse an abstract value that doesn't necessarily have a
3801/// type implied. For example, if we parse "4" we don't know what integer type
3802/// it has. The value will later be combined with its type and checked for
3803/// basic correctness. PFS is used to convert function-local operands of
3804/// metadata (since metadata operands are not just parsed here but also
3805/// converted to values). PFS can be null when we are not parsing metadata
3806/// values inside a function.
3807bool LLParser::parseValID(ValID &ID, PerFunctionState *PFS, Type *ExpectedTy) {
3808 ID.Loc = Lex.getLoc();
3809 switch (Lex.getKind()) {
3810 default:
3811 return tokError("expected value token");
3812 case lltok::GlobalID: // @42
3813 ID.UIntVal = Lex.getUIntVal();
3814 ID.Kind = ValID::t_GlobalID;
3815 break;
3816 case lltok::GlobalVar: // @foo
3817 ID.StrVal = Lex.getStrVal();
3818 ID.Kind = ValID::t_GlobalName;
3819 break;
3820 case lltok::LocalVarID: // %42
3821 ID.UIntVal = Lex.getUIntVal();
3822 ID.Kind = ValID::t_LocalID;
3823 break;
3824 case lltok::LocalVar: // %foo
3825 ID.StrVal = Lex.getStrVal();
3826 ID.Kind = ValID::t_LocalName;
3827 break;
3828 case lltok::APSInt:
3829 ID.APSIntVal = Lex.getAPSIntVal();
3830 ID.Kind = ValID::t_APSInt;
3831 break;
3832 case lltok::APFloat:
3833 ID.APFloatVal = Lex.getAPFloatVal();
3834 ID.Kind = ValID::t_APFloat;
3835 break;
3836 case lltok::kw_true:
3837 ID.ConstantVal = ConstantInt::getTrue(Context);
3838 ID.Kind = ValID::t_Constant;
3839 break;
3840 case lltok::kw_false:
3841 ID.ConstantVal = ConstantInt::getFalse(Context);
3842 ID.Kind = ValID::t_Constant;
3843 break;
3844 case lltok::kw_null: ID.Kind = ValID::t_Null; break;
3845 case lltok::kw_undef: ID.Kind = ValID::t_Undef; break;
3846 case lltok::kw_poison: ID.Kind = ValID::t_Poison; break;
3847 case lltok::kw_zeroinitializer: ID.Kind = ValID::t_Zero; break;
3848 case lltok::kw_none: ID.Kind = ValID::t_None; break;
3849
3850 case lltok::lbrace: {
3851 // ValID ::= '{' ConstVector '}'
3852 Lex.Lex();
3854 if (parseGlobalValueVector(Elts) ||
3855 parseToken(lltok::rbrace, "expected end of struct constant"))
3856 return true;
3857
3858 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.size());
3859 ID.UIntVal = Elts.size();
3860 memcpy(ID.ConstantStructElts.get(), Elts.data(),
3861 Elts.size() * sizeof(Elts[0]));
3863 return false;
3864 }
3865 case lltok::less: {
3866 // ValID ::= '<' ConstVector '>' --> Vector.
3867 // ValID ::= '<' '{' ConstVector '}' '>' --> Packed Struct.
3868 Lex.Lex();
3869 bool isPackedStruct = EatIfPresent(lltok::lbrace);
3870
3872 LocTy FirstEltLoc = Lex.getLoc();
3873 if (parseGlobalValueVector(Elts) ||
3874 (isPackedStruct &&
3875 parseToken(lltok::rbrace, "expected end of packed struct")) ||
3876 parseToken(lltok::greater, "expected end of constant"))
3877 return true;
3878
3879 if (isPackedStruct) {
3880 ID.ConstantStructElts = std::make_unique<Constant *[]>(Elts.size());
3881 memcpy(ID.ConstantStructElts.get(), Elts.data(),
3882 Elts.size() * sizeof(Elts[0]));
3883 ID.UIntVal = Elts.size();
3885 return false;
3886 }
3887
3888 if (Elts.empty())
3889 return error(ID.Loc, "constant vector must not be empty");
3890
3891 if (!Elts[0]->getType()->isIntegerTy() &&
3892 !Elts[0]->getType()->isFloatingPointTy() &&
3893 !Elts[0]->getType()->isPointerTy())
3894 return error(
3895 FirstEltLoc,
3896 "vector elements must have integer, pointer or floating point type");
3897
3898 // Verify that all the vector elements have the same type.
3899 for (unsigned i = 1, e = Elts.size(); i != e; ++i)
3900 if (Elts[i]->getType() != Elts[0]->getType())
3901 return error(FirstEltLoc, "vector element #" + Twine(i) +
3902 " is not of type '" +
3903 getTypeString(Elts[0]->getType()));
3904
3905 ID.ConstantVal = ConstantVector::get(Elts);
3906 ID.Kind = ValID::t_Constant;
3907 return false;
3908 }
3909 case lltok::lsquare: { // Array Constant
3910 Lex.Lex();
3912 LocTy FirstEltLoc = Lex.getLoc();
3913 if (parseGlobalValueVector(Elts) ||
3914 parseToken(lltok::rsquare, "expected end of array constant"))
3915 return true;
3916
3917 // Handle empty element.
3918 if (Elts.empty()) {
3919 // Use undef instead of an array because it's inconvenient to determine
3920 // the element type at this point, there being no elements to examine.
3921 ID.Kind = ValID::t_EmptyArray;
3922 return false;
3923 }
3924
3925 if (!Elts[0]->getType()->isFirstClassType())
3926 return error(FirstEltLoc, "invalid array element type: " +
3927 getTypeString(Elts[0]->getType()));
3928
3929 ArrayType *ATy = ArrayType::get(Elts[0]->getType(), Elts.size());
3930
3931 // Verify all elements are correct type!
3932 for (unsigned i = 0, e = Elts.size(); i != e; ++i) {
3933 if (Elts[i]->getType() != Elts[0]->getType())
3934 return error(FirstEltLoc, "array element #" + Twine(i) +
3935 " is not of type '" +
3936 getTypeString(Elts[0]->getType()));
3937 }
3938
3939 ID.ConstantVal = ConstantArray::get(ATy, Elts);
3940 ID.Kind = ValID::t_Constant;
3941 return false;
3942 }
3943 case lltok::kw_c: // c "foo"
3944 Lex.Lex();
3945 ID.ConstantVal = ConstantDataArray::getString(Context, Lex.getStrVal(),
3946 false);
3947 if (parseToken(lltok::StringConstant, "expected string"))
3948 return true;
3949 ID.Kind = ValID::t_Constant;
3950 return false;
3951
3952 case lltok::kw_asm: {
3953 // ValID ::= 'asm' SideEffect? AlignStack? IntelDialect? STRINGCONSTANT ','
3954 // STRINGCONSTANT
3955 bool HasSideEffect, AlignStack, AsmDialect, CanThrow;
3956 Lex.Lex();
3957 if (parseOptionalToken(lltok::kw_sideeffect, HasSideEffect) ||
3958 parseOptionalToken(lltok::kw_alignstack, AlignStack) ||
3959 parseOptionalToken(lltok::kw_inteldialect, AsmDialect) ||
3960 parseOptionalToken(lltok::kw_unwind, CanThrow) ||
3961 parseStringConstant(ID.StrVal) ||
3962 parseToken(lltok::comma, "expected comma in inline asm expression") ||
3963 parseToken(lltok::StringConstant, "expected constraint string"))
3964 return true;
3965 ID.StrVal2 = Lex.getStrVal();
3966 ID.UIntVal = unsigned(HasSideEffect) | (unsigned(AlignStack) << 1) |
3967 (unsigned(AsmDialect) << 2) | (unsigned(CanThrow) << 3);
3968 ID.Kind = ValID::t_InlineAsm;
3969 return false;
3970 }
3971
3973 // ValID ::= 'blockaddress' '(' @foo ',' %bar ')'
3974 Lex.Lex();
3975
3976 ValID Fn, Label;
3977
3978 if (parseToken(lltok::lparen, "expected '(' in block address expression") ||
3979 parseValID(Fn, PFS) ||
3980 parseToken(lltok::comma,
3981 "expected comma in block address expression") ||
3982 parseValID(Label, PFS) ||
3983 parseToken(lltok::rparen, "expected ')' in block address expression"))
3984 return true;
3985
3987 return error(Fn.Loc, "expected function name in blockaddress");
3988 if (Label.Kind != ValID::t_LocalID && Label.Kind != ValID::t_LocalName)
3989 return error(Label.Loc, "expected basic block name in blockaddress");
3990
3991 // Try to find the function (but skip it if it's forward-referenced).
3992 GlobalValue *GV = nullptr;
3993 if (Fn.Kind == ValID::t_GlobalID) {
3994 GV = NumberedVals.get(Fn.UIntVal);
3995 } else if (!ForwardRefVals.count(Fn.StrVal)) {
3996 GV = M->getNamedValue(Fn.StrVal);
3997 }
3998 Function *F = nullptr;
3999 if (GV) {
4000 // Confirm that it's actually a function with a definition.
4001 if (!isa<Function>(GV))
4002 return error(Fn.Loc, "expected function name in blockaddress");
4003 F = cast<Function>(GV);
4004 if (F->isDeclaration())
4005 return error(Fn.Loc, "cannot take blockaddress inside a declaration");
4006 }
4007
4008 if (!F) {
4009 // Make a global variable as a placeholder for this reference.
4010 GlobalValue *&FwdRef =
4011 ForwardRefBlockAddresses[std::move(Fn)][std::move(Label)];
4012 if (!FwdRef) {
4013 unsigned FwdDeclAS;
4014 if (ExpectedTy) {
4015 // If we know the type that the blockaddress is being assigned to,
4016 // we can use the address space of that type.
4017 if (!ExpectedTy->isPointerTy())
4018 return error(ID.Loc,
4019 "type of blockaddress must be a pointer and not '" +
4020 getTypeString(ExpectedTy) + "'");
4021 FwdDeclAS = ExpectedTy->getPointerAddressSpace();
4022 } else if (PFS) {
4023 // Otherwise, we default the address space of the current function.
4024 FwdDeclAS = PFS->getFunction().getAddressSpace();
4025 } else {
4026 llvm_unreachable("Unknown address space for blockaddress");
4027 }
4028 FwdRef = new GlobalVariable(
4029 *M, Type::getInt8Ty(Context), false, GlobalValue::InternalLinkage,
4030 nullptr, "", nullptr, GlobalValue::NotThreadLocal, FwdDeclAS);
4031 }
4032
4033 ID.ConstantVal = FwdRef;
4034 ID.Kind = ValID::t_Constant;
4035 return false;
4036 }
4037
4038 // We found the function; now find the basic block. Don't use PFS, since we
4039 // might be inside a constant expression.
4040 BasicBlock *BB;
4041 if (BlockAddressPFS && F == &BlockAddressPFS->getFunction()) {
4042 if (Label.Kind == ValID::t_LocalID)
4043 BB = BlockAddressPFS->getBB(Label.UIntVal, Label.Loc);
4044 else
4045 BB = BlockAddressPFS->getBB(Label.StrVal, Label.Loc);
4046 if (!BB)
4047 return error(Label.Loc, "referenced value is not a basic block");
4048 } else {
4049 if (Label.Kind == ValID::t_LocalID)
4050 return error(Label.Loc, "cannot take address of numeric label after "
4051 "the function is defined");
4052 BB = dyn_cast_or_null<BasicBlock>(
4053 F->getValueSymbolTable()->lookup(Label.StrVal));
4054 if (!BB)
4055 return error(Label.Loc, "referenced value is not a basic block");
4056 }
4057
4058 ID.ConstantVal = BlockAddress::get(F, BB);
4059 ID.Kind = ValID::t_Constant;
4060 return false;
4061 }
4062
4064 // ValID ::= 'dso_local_equivalent' @foo
4065 Lex.Lex();
4066
4067 ValID Fn;
4068
4069 if (parseValID(Fn, PFS))
4070 return true;
4071
4073 return error(Fn.Loc,
4074 "expected global value name in dso_local_equivalent");
4075
4076 // Try to find the function (but skip it if it's forward-referenced).
4077 GlobalValue *GV = nullptr;
4078 if (Fn.Kind == ValID::t_GlobalID) {
4079 GV = NumberedVals.get(Fn.UIntVal);
4080 } else if (!ForwardRefVals.count(Fn.StrVal)) {
4081 GV = M->getNamedValue(Fn.StrVal);
4082 }
4083
4084 if (!GV) {
4085 // Make a placeholder global variable as a placeholder for this reference.
4086 auto &FwdRefMap = (Fn.Kind == ValID::t_GlobalID)
4087 ? ForwardRefDSOLocalEquivalentIDs
4088 : ForwardRefDSOLocalEquivalentNames;
4089 GlobalValue *&FwdRef = FwdRefMap[Fn];
4090 if (!FwdRef) {
4091 FwdRef = new GlobalVariable(*M, Type::getInt8Ty(Context), false,
4092 GlobalValue::InternalLinkage, nullptr, "",
4094 }
4095
4096 ID.ConstantVal = FwdRef;
4097 ID.Kind = ValID::t_Constant;
4098 return false;
4099 }
4100
4101 if (!GV->getValueType()->isFunctionTy())
4102 return error(Fn.Loc, "expected a function, alias to function, or ifunc "
4103 "in dso_local_equivalent");
4104
4105 ID.ConstantVal = DSOLocalEquivalent::get(GV);
4106 ID.Kind = ValID::t_Constant;
4107 return false;
4108 }
4109
4110 case lltok::kw_no_cfi: {
4111 // ValID ::= 'no_cfi' @foo
4112 Lex.Lex();
4113
4114 if (parseValID(ID, PFS))
4115 return true;
4116
4117 if (ID.Kind != ValID::t_GlobalID && ID.Kind != ValID::t_GlobalName)
4118 return error(ID.Loc, "expected global value name in no_cfi");
4119
4120 ID.NoCFI = true;
4121 return false;
4122 }
4123 case lltok::kw_ptrauth: {
4124 // ValID ::= 'ptrauth' '(' ptr @foo ',' i32 <key>
4125 // (',' i64 <disc> (',' ptr addrdisc)? )? ')'
4126 Lex.Lex();
4127
4128 Constant *Ptr, *Key;
4129 Constant *Disc = nullptr, *AddrDisc = nullptr;
4130
4131 if (parseToken(lltok::lparen,
4132 "expected '(' in constant ptrauth expression") ||
4133 parseGlobalTypeAndValue(Ptr) ||
4134 parseToken(lltok::comma,
4135 "expected comma in constant ptrauth expression") ||
4136 parseGlobalTypeAndValue(Key))
4137 return true;
4138 // If present, parse the optional disc/addrdisc.
4139 if (EatIfPresent(lltok::comma))
4140 if (parseGlobalTypeAndValue(Disc) ||
4141 (EatIfPresent(lltok::comma) && parseGlobalTypeAndValue(AddrDisc)))
4142 return true;
4143 if (parseToken(lltok::rparen,
4144 "expected ')' in constant ptrauth expression"))
4145 return true;
4146
4147 if (!Ptr->getType()->isPointerTy())
4148 return error(ID.Loc, "constant ptrauth base pointer must be a pointer");
4149
4150 auto *KeyC = dyn_cast<ConstantInt>(Key);
4151 if (!KeyC || KeyC->getBitWidth() != 32)
4152 return error(ID.Loc, "constant ptrauth key must be i32 constant");
4153
4154 ConstantInt *DiscC = nullptr;
4155 if (Disc) {
4156 DiscC = dyn_cast<ConstantInt>(Disc);
4157 if (!DiscC || DiscC->getBitWidth() != 64)
4158 return error(
4159 ID.Loc,
4160 "constant ptrauth integer discriminator must be i64 constant");
4161 } else {
4162 DiscC = ConstantInt::get(Type::getInt64Ty(Context), 0);
4163 }
4164
4165 if (AddrDisc) {
4166 if (!AddrDisc->getType()->isPointerTy())
4167 return error(
4168 ID.Loc, "constant ptrauth address discriminator must be a pointer");
4169 } else {
4170 AddrDisc = ConstantPointerNull::get(PointerType::get(Context, 0));
4171 }
4172
4173 ID.ConstantVal = ConstantPtrAuth::get(Ptr, KeyC, DiscC, AddrDisc);
4174 ID.Kind = ValID::t_Constant;
4175 return false;
4176 }
4177
4178 case lltok::kw_trunc:
4179 case lltok::kw_bitcast:
4181 case lltok::kw_inttoptr:
4182 case lltok::kw_ptrtoint: {
4183 unsigned Opc = Lex.getUIntVal();
4184 Type *DestTy = nullptr;
4185 Constant *SrcVal;
4186 Lex.Lex();
4187 if (parseToken(lltok::lparen, "expected '(' after constantexpr cast") ||
4188 parseGlobalTypeAndValue(SrcVal) ||
4189 parseToken(lltok::kw_to, "expected 'to' in constantexpr cast") ||
4190 parseType(DestTy) ||
4191 parseToken(lltok::rparen, "expected ')' at end of constantexpr cast"))
4192 return true;
4193 if (!CastInst::castIsValid((Instruction::CastOps)Opc, SrcVal, DestTy))
4194 return error(ID.Loc, "invalid cast opcode for cast from '" +
4195 getTypeString(SrcVal->getType()) + "' to '" +
4196 getTypeString(DestTy) + "'");
4198 SrcVal, DestTy);
4199 ID.Kind = ValID::t_Constant;
4200 return false;
4201 }
4203 return error(ID.Loc, "extractvalue constexprs are no longer supported");
4205 return error(ID.Loc, "insertvalue constexprs are no longer supported");
4206 case lltok::kw_udiv:
4207 return error(ID.Loc, "udiv constexprs are no longer supported");
4208 case lltok::kw_sdiv:
4209 return error(ID.Loc, "sdiv constexprs are no longer supported");
4210 case lltok::kw_urem:
4211 return error(ID.Loc, "urem constexprs are no longer supported");
4212 case lltok::kw_srem:
4213 return error(ID.Loc, "srem constexprs are no longer supported");
4214 case lltok::kw_fadd:
4215 return error(ID.Loc, "fadd constexprs are no longer supported");
4216 case lltok::kw_fsub:
4217 return error(ID.Loc, "fsub constexprs are no longer supported");
4218 case lltok::kw_fmul:
4219 return error(ID.Loc, "fmul constexprs are no longer supported");
4220 case lltok::kw_fdiv:
4221 return error(ID.Loc, "fdiv constexprs are no longer supported");
4222 case lltok::kw_frem:
4223 return error(ID.Loc, "frem constexprs are no longer supported");
4224 case lltok::kw_and:
4225 return error(ID.Loc, "and constexprs are no longer supported");
4226 case lltok::kw_or:
4227 return error(ID.Loc, "or constexprs are no longer supported");
4228 case lltok::kw_lshr:
4229 return error(ID.Loc, "lshr constexprs are no longer supported");
4230 case lltok::kw_ashr:
4231 return error(ID.Loc, "ashr constexprs are no longer supported");
4232 case lltok::kw_shl:
4233 return error(ID.Loc, "shl constexprs are no longer supported");
4234 case lltok::kw_fneg:
4235 return error(ID.Loc, "fneg constexprs are no longer supported");
4236 case lltok::kw_select:
4237 return error(ID.Loc, "select constexprs are no longer supported");
4238 case lltok::kw_zext:
4239 return error(ID.Loc, "zext constexprs are no longer supported");
4240 case lltok::kw_sext:
4241 return error(ID.Loc, "sext constexprs are no longer supported");
4242 case lltok::kw_fptrunc:
4243 return error(ID.Loc, "fptrunc constexprs are no longer supported");
4244 case lltok::kw_fpext:
4245 return error(ID.Loc, "fpext constexprs are no longer supported");
4246 case lltok::kw_uitofp:
4247 return error(ID.Loc, "uitofp constexprs are no longer supported");
4248 case lltok::kw_sitofp:
4249 return error(ID.Loc, "sitofp constexprs are no longer supported");
4250 case lltok::kw_fptoui:
4251 return error(ID.Loc, "fptoui constexprs are no longer supported");
4252 case lltok::kw_fptosi:
4253 return error(ID.Loc, "fptosi constexprs are no longer supported");
4254 case lltok::kw_icmp:
4255 return error(ID.Loc, "icmp constexprs are no longer supported");
4256 case lltok::kw_fcmp:
4257 return error(ID.Loc, "fcmp constexprs are no longer supported");
4258
4259 // Binary Operators.
4260 case lltok::kw_add:
4261 case lltok::kw_sub:
4262 case lltok::kw_mul:
4263 case lltok::kw_xor: {
4264 bool NUW = false;
4265 bool NSW = false;
4266 unsigned Opc = Lex.getUIntVal();
4267 Constant *Val0, *Val1;
4268 Lex.Lex();
4269 if (Opc == Instruction::Add || Opc == Instruction::Sub ||
4270 Opc == Instruction::Mul) {
4271 if (EatIfPresent(lltok::kw_nuw))
4272 NUW = true;
4273 if (EatIfPresent(lltok::kw_nsw)) {
4274 NSW = true;
4275 if (EatIfPresent(lltok::kw_nuw))
4276 NUW = true;
4277 }
4278 }
4279 if (parseToken(lltok::lparen, "expected '(' in binary constantexpr") ||
4280 parseGlobalTypeAndValue(Val0) ||
4281 parseToken(lltok::comma, "expected comma in binary constantexpr") ||
4282 parseGlobalTypeAndValue(Val1) ||
4283 parseToken(lltok::rparen, "expected ')' in binary constantexpr"))
4284 return true;
4285 if (Val0->getType() != Val1->getType())
4286 return error(ID.Loc, "operands of constexpr must have same type");
4287 // Check that the type is valid for the operator.
4288 if (!Val0->getType()->isIntOrIntVectorTy())
4289 return error(ID.Loc,
4290 "constexpr requires integer or integer vector operands");
4291 unsigned Flags = 0;
4294 ID.ConstantVal = ConstantExpr::get(Opc, Val0, Val1, Flags);
4295 ID.Kind = ValID::t_Constant;
4296 return false;
4297 }
4298
4299 case lltok::kw_splat: {
4300 Lex.Lex();
4301 if (parseToken(lltok::lparen, "expected '(' after vector splat"))
4302 return true;
4303 Constant *C;
4304 if (parseGlobalTypeAndValue(C))
4305 return true;
4306 if (parseToken(lltok::rparen, "expected ')' at end of vector splat"))
4307 return true;
4308
4309 ID.ConstantVal = C;
4311 return false;
4312 }
4313
4318 unsigned Opc = Lex.getUIntVal();
4320 GEPNoWrapFlags NW;
4321 bool HasInRange = false;
4322 APSInt InRangeStart;
4323 APSInt InRangeEnd;
4324 Type *Ty;
4325 Lex.Lex();
4326
4327 if (Opc == Instruction::GetElementPtr) {
4328 while (true) {
4329 if (EatIfPresent(lltok::kw_inbounds))
4331 else if (EatIfPresent(lltok::kw_nusw))
4333 else if (EatIfPresent(lltok::kw_nuw))
4335 else
4336 break;
4337 }
4338
4339 if (EatIfPresent(lltok::kw_inrange)) {
4340 if (parseToken(lltok::lparen, "expected '('"))
4341 return true;
4342 if (Lex.getKind() != lltok::APSInt)
4343 return tokError("expected integer");
4344 InRangeStart = Lex.getAPSIntVal();
4345 Lex.Lex();
4346 if (parseToken(lltok::comma, "expected ','"))
4347 return true;
4348 if (Lex.getKind() != lltok::APSInt)
4349 return tokError("expected integer");
4350 InRangeEnd = Lex.getAPSIntVal();
4351 Lex.Lex();
4352 if (parseToken(lltok::rparen, "expected ')'"))
4353 return true;
4354 HasInRange = true;
4355 }
4356 }
4357
4358 if (parseToken(lltok::lparen, "expected '(' in constantexpr"))
4359 return true;
4360
4361 if (Opc == Instruction::GetElementPtr) {
4362 if (parseType(Ty) ||
4363 parseToken(lltok::comma, "expected comma after getelementptr's type"))
4364 return true;
4365 }
4366
4367 if (parseGlobalValueVector(Elts) ||
4368 parseToken(lltok::rparen, "expected ')' in constantexpr"))
4369 return true;
4370
4371 if (Opc == Instruction::GetElementPtr) {
4372 if (Elts.size() == 0 ||
4373 !Elts[0]->getType()->isPtrOrPtrVectorTy())
4374 return error(ID.Loc, "base of getelementptr must be a pointer");
4375
4376 Type *BaseType = Elts[0]->getType();
4377 std::optional<ConstantRange> InRange;
4378 if (HasInRange) {
4379 unsigned IndexWidth =
4380 M->getDataLayout().getIndexTypeSizeInBits(BaseType);
4381 InRangeStart = InRangeStart.extOrTrunc(IndexWidth);
4382 InRangeEnd = InRangeEnd.extOrTrunc(IndexWidth);
4383 if (InRangeStart.sge(InRangeEnd))
4384 return error(ID.Loc, "expected end to be larger than start");
4385 InRange = ConstantRange::getNonEmpty(InRangeStart, InRangeEnd);
4386 }
4387
4388 unsigned GEPWidth =
4389 BaseType->isVectorTy()
4390 ? cast<FixedVectorType>(BaseType)->getNumElements()
4391 : 0;
4392
4393 ArrayRef<Constant *> Indices(Elts.begin() + 1, Elts.end());
4394 for (Constant *Val : Indices) {
4395 Type *ValTy = Val->getType();
4396 if (!ValTy->isIntOrIntVectorTy())
4397 return error(ID.Loc, "getelementptr index must be an integer");
4398 if (auto *ValVTy = dyn_cast<VectorType>(ValTy)) {
4399 unsigned ValNumEl = cast<FixedVectorType>(ValVTy)->getNumElements();
4400 if (GEPWidth && (ValNumEl != GEPWidth))
4401 return error(
4402 ID.Loc,
4403 "getelementptr vector index has a wrong number of elements");
4404 // GEPWidth may have been unknown because the base is a scalar,
4405 // but it is known now.
4406 GEPWidth = ValNumEl;
4407 }
4408 }
4409
4410 SmallPtrSet<Type*, 4> Visited;
4411 if (!Indices.empty() && !Ty->isSized(&Visited))
4412 return error(ID.Loc, "base element of getelementptr must be sized");
4413
4414 if (!GetElementPtrInst::getIndexedType(Ty, Indices))
4415 return error(ID.Loc, "invalid getelementptr indices");
4416
4417 ID.ConstantVal =
4418 ConstantExpr::getGetElementPtr(Ty, Elts[0], Indices, NW, InRange);
4419 } else if (Opc == Instruction::ShuffleVector) {
4420 if (Elts.size() != 3)
4421 return error(ID.Loc, "expected three operands to shufflevector");
4422 if (!ShuffleVectorInst::isValidOperands(Elts[0], Elts[1], Elts[2]))
4423 return error(ID.Loc, "invalid operands to shufflevector");
4425 ShuffleVectorInst::getShuffleMask(cast<Constant>(Elts[2]), Mask);
4426 ID.ConstantVal = ConstantExpr::getShuffleVector(Elts[0], Elts[1], Mask);
4427 } else if (Opc == Instruction::ExtractElement) {
4428 if (Elts.size() != 2)
4429 return error(ID.Loc, "expected two operands to extractelement");
4430 if (!ExtractElementInst::isValidOperands(Elts[0], Elts[1]))
4431 return error(ID.Loc, "invalid extractelement operands");
4432 ID.ConstantVal = ConstantExpr::getExtractElement(Elts[0], Elts[1]);
4433 } else {
4434 assert(Opc == Instruction::InsertElement && "Unknown opcode");
4435 if (Elts.size() != 3)
4436 return error(ID.Loc, "expected three operands to insertelement");
4437 if (!InsertElementInst::isValidOperands(Elts[0], Elts[1], Elts[2]))
4438 return error(ID.Loc, "invalid insertelement operands");
4439 ID.ConstantVal =
4440 ConstantExpr::getInsertElement(Elts[0], Elts[1],Elts[2]);
4441 }
4442
4443 ID.Kind = ValID::t_Constant;
4444 return false;
4445 }
4446 }
4447
4448 Lex.Lex();
4449 return false;
4450}
4451
4452/// parseGlobalValue - parse a global value with the specified type.
4453bool LLParser::parseGlobalValue(Type *Ty, Constant *&C) {
4454 C = nullptr;
4455 ValID ID;
4456 Value *V = nullptr;
4457 bool Parsed = parseValID(ID, /*PFS=*/nullptr, Ty) ||
4458 convertValIDToValue(Ty, ID, V, nullptr);
4459 if (V && !(C = dyn_cast<Constant>(V)))
4460 return error(ID.Loc, "global values must be constants");
4461 return Parsed;
4462}
4463
4464bool LLParser::parseGlobalTypeAndValue(Constant *&V) {
4465 Type *Ty = nullptr;
4466 return parseType(Ty) || parseGlobalValue(Ty, V);
4467}
4468
4469bool LLParser::parseOptionalComdat(StringRef GlobalName, Comdat *&C) {
4470 C = nullptr;
4471
4472 LocTy KwLoc = Lex.getLoc();
4473 if (!EatIfPresent(lltok::kw_comdat))
4474 return false;
4475
4476 if (EatIfPresent(lltok::lparen)) {
4477 if (Lex.getKind() != lltok::ComdatVar)
4478 return tokError("expected comdat variable");
4479 C = getComdat(Lex.getStrVal(), Lex.getLoc());
4480 Lex.Lex();
4481 if (parseToken(lltok::rparen, "expected ')' after comdat var"))
4482 return true;
4483 } else {
4484 if (GlobalName.empty())
4485 return tokError("comdat cannot be unnamed");
4486 C = getComdat(std::string(GlobalName), KwLoc);
4487 }
4488
4489 return false;
4490}
4491
4492/// parseGlobalValueVector
4493/// ::= /*empty*/
4494/// ::= TypeAndValue (',' TypeAndValue)*
4495bool LLParser::parseGlobalValueVector(SmallVectorImpl<Constant *> &Elts) {
4496 // Empty list.
4497 if (Lex.getKind() == lltok::rbrace ||
4498 Lex.getKind() == lltok::rsquare ||
4499 Lex.getKind() == lltok::greater ||
4500 Lex.getKind() == lltok::rparen)
4501 return false;
4502
4503 do {
4504 // Let the caller deal with inrange.
4505 if (Lex.getKind() == lltok::kw_inrange)
4506 return false;
4507
4508 Constant *C;
4509 if (parseGlobalTypeAndValue(C))
4510 return true;
4511 Elts.push_back(C);
4512 } while (EatIfPresent(lltok::comma));
4513
4514 return false;
4515}
4516
4517bool LLParser::parseMDTuple(MDNode *&MD, bool IsDistinct) {
4519 if (parseMDNodeVector(Elts))
4520 return true;
4521
4522 MD = (IsDistinct ? MDTuple::getDistinct : MDTuple::get)(Context, Elts);
4523 return false;
4524}
4525
4526/// MDNode:
4527/// ::= !{ ... }
4528/// ::= !7
4529/// ::= !DILocation(...)
4530bool LLParser::parseMDNode(MDNode *&N) {
4531 if (Lex.getKind() == lltok::MetadataVar)
4532 return parseSpecializedMDNode(N);
4533
4534 return parseToken(lltok::exclaim, "expected '!' here") || parseMDNodeTail(N);
4535}
4536
4537bool LLParser::parseMDNodeTail(MDNode *&N) {
4538 // !{ ... }
4539 if (Lex.getKind() == lltok::lbrace)
4540 return parseMDTuple(N);
4541
4542 // !42
4543 return parseMDNodeID(N);
4544}
4545
4546namespace {
4547
4548/// Structure to represent an optional metadata field.
4549template <class FieldTy> struct MDFieldImpl {
4550 typedef MDFieldImpl ImplTy;
4551 FieldTy Val;
4552 bool Seen;
4553
4554 void assign(FieldTy Val) {
4555 Seen = true;
4556 this->Val = std::move(Val);
4557 }
4558
4559 explicit MDFieldImpl(FieldTy Default)
4560 : Val(std::move(Default)), Seen(false) {}
4561};
4562
4563/// Structure to represent an optional metadata field that
4564/// can be of either type (A or B) and encapsulates the
4565/// MD<typeofA>Field and MD<typeofB>Field structs, so not
4566/// to reimplement the specifics for representing each Field.
4567template <class FieldTypeA, class FieldTypeB> struct MDEitherFieldImpl {
4568 typedef MDEitherFieldImpl<FieldTypeA, FieldTypeB> ImplTy;
4569 FieldTypeA A;
4570 FieldTypeB B;
4571 bool Seen;
4572
4573 enum {
4574 IsInvalid = 0,
4575 IsTypeA = 1,
4576 IsTypeB = 2
4577 } WhatIs;
4578
4579 void assign(FieldTypeA A) {
4580 Seen = true;
4581 this->A = std::move(A);
4582 WhatIs = IsTypeA;
4583 }
4584
4585 void assign(FieldTypeB B) {
4586 Seen = true;
4587 this->B = std::move(B);
4588 WhatIs = IsTypeB;
4589 }
4590
4591 explicit MDEitherFieldImpl(FieldTypeA DefaultA, FieldTypeB DefaultB)
4592 : A(std::move(DefaultA)), B(std::move(DefaultB)), Seen(false),
4593 WhatIs(IsInvalid) {}
4594};
4595
4596struct MDUnsignedField : public MDFieldImpl<uint64_t> {
4597 uint64_t Max;
4598
4599 MDUnsignedField(uint64_t Default = 0, uint64_t Max = UINT64_MAX)
4600 : ImplTy(Default), Max(Max) {}
4601};
4602
4603struct LineField : public MDUnsignedField {
4604 LineField() : MDUnsignedField(0, UINT32_MAX) {}
4605};
4606
4607struct ColumnField : public MDUnsignedField {
4608 ColumnField() : MDUnsignedField(0, UINT16_MAX) {}
4609};
4610
4611struct DwarfTagField : public MDUnsignedField {
4612 DwarfTagField() : MDUnsignedField(0, dwarf::DW_TAG_hi_user) {}
4613 DwarfTagField(dwarf::Tag DefaultTag)
4614 : MDUnsignedField(DefaultTag, dwarf::DW_TAG_hi_user) {}
4615};
4616
4617struct DwarfMacinfoTypeField : public MDUnsignedField {
4618 DwarfMacinfoTypeField() : MDUnsignedField(0, dwarf::DW_MACINFO_vendor_ext) {}
4619 DwarfMacinfoTypeField(dwarf::MacinfoRecordType DefaultType)
4620 : MDUnsignedField(DefaultType, dwarf::DW_MACINFO_vendor_ext) {}
4621};
4622
4623struct DwarfAttEncodingField : public MDUnsignedField {
4624 DwarfAttEncodingField() : MDUnsignedField(0, dwarf::DW_ATE_hi_user) {}
4625};
4626
4627struct DwarfVirtualityField : public MDUnsignedField {
4628 DwarfVirtualityField() : MDUnsignedField(0, dwarf::DW_VIRTUALITY_max) {}
4629};
4630
4631struct DwarfLangField : public MDUnsignedField {
4632 DwarfLangField() : MDUnsignedField(0, dwarf::DW_LANG_hi_user) {}
4633};
4634
4635struct DwarfCCField : public MDUnsignedField {
4636 DwarfCCField() : MDUnsignedField(0, dwarf::DW_CC_hi_user) {}
4637};
4638
4639struct EmissionKindField : public MDUnsignedField {
4640 EmissionKindField() : MDUnsignedField(0, DICompileUnit::LastEmissionKind) {}
4641};
4642
4643struct NameTableKindField : public MDUnsignedField {
4644 NameTableKindField()
4645 : MDUnsignedField(
4646 0, (unsigned)
4647 DICompileUnit::DebugNameTableKind::LastDebugNameTableKind) {}
4648};
4649
4650struct DIFlagField : public MDFieldImpl<DINode::DIFlags> {
4651 DIFlagField() : MDFieldImpl(DINode::FlagZero) {}
4652};
4653
4654struct DISPFlagField : public MDFieldImpl<DISubprogram::DISPFlags> {
4655 DISPFlagField() : MDFieldImpl(DISubprogram::SPFlagZero) {}
4656};
4657
4658struct MDAPSIntField : public MDFieldImpl<APSInt> {
4659 MDAPSIntField() : ImplTy(APSInt()) {}
4660};
4661
4662struct MDSignedField : public MDFieldImpl<int64_t> {
4663 int64_t Min = INT64_MIN;
4664 int64_t Max = INT64_MAX;
4665
4666 MDSignedField(int64_t Default = 0)
4667 : ImplTy(Default) {}
4668 MDSignedField(int64_t Default, int64_t Min, int64_t Max)
4669 : ImplTy(Default), Min(Min), Max(Max) {}
4670};
4671
4672struct MDBoolField : public MDFieldImpl<bool> {
4673 MDBoolField(bool Default = false) : ImplTy(Default) {}
4674};
4675
4676struct MDField : public MDFieldImpl<Metadata *> {
4677 bool AllowNull;
4678
4679 MDField(bool AllowNull = true) : ImplTy(nullptr), AllowNull(AllowNull) {}
4680};
4681
4682struct MDStringField : public MDFieldImpl<MDString *> {
4683 bool AllowEmpty;
4684 MDStringField(bool AllowEmpty = true)
4685 : ImplTy(nullptr), AllowEmpty(AllowEmpty) {}
4686};
4687
4688struct MDFieldList : public MDFieldImpl<SmallVector<Metadata *, 4>> {
4689 MDFieldList() : ImplTy(SmallVector<Metadata *, 4>()) {}
4690};
4691
4692struct ChecksumKindField : public MDFieldImpl<DIFile::ChecksumKind> {
4693 ChecksumKindField(DIFile::ChecksumKind CSKind) : ImplTy(CSKind) {}
4694};
4695
4696struct MDSignedOrMDField : MDEitherFieldImpl<MDSignedField, MDField> {
4697 MDSignedOrMDField(int64_t Default = 0, bool AllowNull = true)
4698 : ImplTy(MDSignedField(Default), MDField(AllowNull)) {}
4699
4700 MDSignedOrMDField(int64_t Default, int64_t Min, int64_t Max,
4701 bool AllowNull = true)
4702 : ImplTy(MDSignedField(Default, Min, Max), MDField(AllowNull)) {}
4703
4704 bool isMDSignedField() const { return WhatIs == IsTypeA; }
4705 bool isMDField() const { return WhatIs == IsTypeB; }
4706 int64_t getMDSignedValue() const {
4707 assert(isMDSignedField() && "Wrong field type");
4708 return A.Val;
4709 }
4710 Metadata *getMDFieldValue() const {
4711 assert(isMDField() && "Wrong field type");
4712 return B.Val;
4713 }
4714};
4715
4716} // end anonymous namespace
4717
4718namespace llvm {
4719
4720template <>
4721bool LLParser::parseMDField(LocTy Loc, StringRef Name, MDAPSIntField &Result) {
4722 if (Lex.getKind() != lltok::APSInt)
4723 return tokError("expected integer");
4724
4725 Result.assign(Lex.getAPSIntVal());
4726 Lex.Lex();
4727 return false;
4728}
4729
4730template <>
4731bool LLParser::parseMDField(LocTy Loc, StringRef Name,
4732 MDUnsignedField &Result) {
4733 if (Lex.getKind() != lltok::APSInt || Lex.getAPSIntVal().isSigned())
4734 return tokError("expected unsigned integer");
4735
4736 auto &U = Lex.getAPSIntVal();
4737 if (U.ugt(Result.Max))
4738 return tokError("value for '" + Name + "' too large, limit is " +
4739 Twine(Result.Max));
4740 Result.assign(U.getZExtValue());
4741 assert(Result.Val <= Result.Max && "Expected value in range");
4742 Lex.Lex();
4743 return false;
4744}
4745
4746template <>
4747bool LLParser::parseMDField(LocTy Loc, StringRef Name, LineField &Result) {
4748 return parseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
4749}
4750template <>
4751bool LLParser::parseMDField(LocTy Loc, StringRef Name, ColumnField &Result) {
4752 return parseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
4753}
4754
4755template <>
4756bool LLParser::parseMDField(LocTy Loc, StringRef Name, DwarfTagField &Result) {
4757 if (Lex.getKind() == lltok::APSInt)
4758 return parseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
4759
4760 if (Lex.getKind() != lltok::DwarfTag)
4761 return tokError("expected DWARF tag");
4762
4763 unsigned Tag = dwarf::getTag(Lex.getStrVal());
4765 return tokError("invalid DWARF tag" + Twine(" '") + Lex.getStrVal() + "'");
4766 assert(Tag <= Result.Max && "Expected valid DWARF tag");
4767
4768 Result.assign(Tag);
4769 Lex.Lex();
4770 return false;
4771}
4772
4773template <>
4774bool LLParser::parseMDField(LocTy Loc, StringRef Name,
4775 DwarfMacinfoTypeField &Result) {
4776 if (Lex.getKind() == lltok::APSInt)
4777 return parseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
4778
4779 if (Lex.getKind() != lltok::DwarfMacinfo)
4780 return tokError("expected DWARF macinfo type");
4781
4782 unsigned Macinfo = dwarf::getMacinfo(Lex.getStrVal());
4783 if (Macinfo == dwarf::DW_MACINFO_invalid)
4784 return tokError("invalid DWARF macinfo type" + Twine(" '") +
4785 Lex.getStrVal() + "'");
4786 assert(Macinfo <= Result.Max && "Expected valid DWARF macinfo type");
4787
4788 Result.assign(Macinfo);
4789 Lex.Lex();
4790 return false;
4791}
4792
4793template <>
4794bool LLParser::parseMDField(LocTy Loc, StringRef Name,
4795 DwarfVirtualityField &Result) {
4796 if (Lex.getKind() == lltok::APSInt)
4797 return parseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
4798
4799 if (Lex.getKind() != lltok::DwarfVirtuality)
4800 return tokError("expected DWARF virtuality code");
4801
4802 unsigned Virtuality = dwarf::getVirtuality(Lex.getStrVal());
4803 if (Virtuality == dwarf::DW_VIRTUALITY_invalid)
4804 return tokError("invalid DWARF virtuality code" + Twine(" '") +
4805 Lex.getStrVal() + "'");
4806 assert(Virtuality <= Result.Max && "Expected valid DWARF virtuality code");
4807 Result.assign(Virtuality);
4808 Lex.Lex();
4809 return false;
4810}
4811
4812template <>
4813bool LLParser::parseMDField(LocTy Loc, StringRef Name, DwarfLangField &Result) {
4814 if (Lex.getKind() == lltok::APSInt)
4815 return parseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
4816
4817 if (Lex.getKind() != lltok::DwarfLang)
4818 return tokError("expected DWARF language");
4819
4820 unsigned Lang = dwarf::getLanguage(Lex.getStrVal());
4821 if (!Lang)
4822 return tokError("invalid DWARF language" + Twine(" '") + Lex.getStrVal() +
4823 "'");
4824 assert(Lang <= Result.Max && "Expected valid DWARF language");
4825 Result.assign(Lang);
4826 Lex.Lex();
4827 return false;
4828}
4829
4830template <>
4831bool LLParser::parseMDField(LocTy Loc, StringRef Name, DwarfCCField &Result) {
4832 if (Lex.getKind() == lltok::APSInt)
4833 return parseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
4834
4835 if (Lex.getKind() != lltok::DwarfCC)
4836 return tokError("expected DWARF calling convention");
4837
4838 unsigned CC = dwarf::getCallingConvention(Lex.getStrVal());
4839 if (!CC)
4840 return tokError("invalid DWARF calling convention" + Twine(" '") +
4841 Lex.getStrVal() + "'");
4842 assert(CC <= Result.Max && "Expected valid DWARF calling convention");
4843 Result.assign(CC);
4844 Lex.Lex();
4845 return false;
4846}
4847
4848template <>
4849bool LLParser::parseMDField(LocTy Loc, StringRef Name,
4850 EmissionKindField &Result) {
4851 if (Lex.getKind() == lltok::APSInt)
4852 return parseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
4853
4854 if (Lex.getKind() != lltok::EmissionKind)
4855 return tokError("expected emission kind");
4856
4857 auto Kind = DICompileUnit::getEmissionKind(Lex.getStrVal());
4858 if (!Kind)
4859 return tokError("invalid emission kind" + Twine(" '") + Lex.getStrVal() +
4860 "'");
4861 assert(*Kind <= Result.Max && "Expected valid emission kind");
4862 Result.assign(*Kind);
4863 Lex.Lex();
4864 return false;
4865}
4866
4867template <>
4868bool LLParser::parseMDField(LocTy Loc, StringRef Name,
4869 NameTableKindField &Result) {
4870 if (Lex.getKind() == lltok::APSInt)
4871 return parseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
4872
4873 if (Lex.getKind() != lltok::NameTableKind)
4874 return tokError("expected nameTable kind");
4875
4876 auto Kind = DICompileUnit::getNameTableKind(Lex.getStrVal());
4877 if (!Kind)
4878 return tokError("invalid nameTable kind" + Twine(" '") + Lex.getStrVal() +
4879 "'");
4880 assert(((unsigned)*Kind) <= Result.Max && "Expected valid nameTable kind");
4881 Result.assign((unsigned)*Kind);
4882 Lex.Lex();
4883 return false;
4884}
4885
4886template <>
4887bool LLParser::parseMDField(LocTy Loc, StringRef Name,
4888 DwarfAttEncodingField &Result) {
4889 if (Lex.getKind() == lltok::APSInt)
4890 return parseMDField(Loc, Name, static_cast<MDUnsignedField &>(Result));
4891
4892 if (Lex.getKind() != lltok::DwarfAttEncoding)
4893 return tokError("expected DWARF type attribute encoding");
4894
4895 unsigned Encoding = dwarf::getAttributeEncoding(Lex.getStrVal());
4896 if (!Encoding)
4897 return tokError("invalid DWARF type attribute encoding" + Twine(" '") +
4898 Lex.getStrVal() + "'");
4899 assert(Encoding <= Result.Max && "Expected valid DWARF language");
4900 Result.assign(Encoding);
4901 Lex.Lex();
4902 return false;
4903}
4904
4905/// DIFlagField
4906/// ::= uint32
4907/// ::= DIFlagVector
4908/// ::= DIFlagVector '|' DIFlagFwdDecl '|' uint32 '|' DIFlagPublic
4909template <>
4910bool LLParser::parseMDField(LocTy Loc, StringRef Name, DIFlagField &Result) {
4911
4912 // parser for a single flag.
4913 auto parseFlag = [&](DINode::DIFlags &Val) {
4914 if (Lex.getKind() == lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
4915 uint32_t TempVal = static_cast<uint32_t>(Val);
4916 bool Res = parseUInt32(TempVal);
4917 Val = static_cast<DINode::DIFlags>(TempVal);
4918 return Res;
4919 }
4920
4921 if (Lex.getKind() != lltok::DIFlag)
4922 return tokError("expected debug info flag");
4923
4924 Val = DINode::getFlag(Lex.getStrVal());
4925 if (!Val)
4926 return tokError(Twine("invalid debug info flag '") + Lex.getStrVal() +
4927 "'");
4928 Lex.Lex();
4929 return false;
4930 };
4931
4932 // parse the flags and combine them together.
4933 DINode::DIFlags Combined = DINode::FlagZero;
4934 do {
4935 DINode::DIFlags Val;
4936 if (parseFlag(Val))
4937 return true;
4938 Combined |= Val;
4939 } while (EatIfPresent(lltok::bar));
4940
4941 Result.assign(Combined);
4942 return false;
4943}
4944
4945/// DISPFlagField
4946/// ::= uint32
4947/// ::= DISPFlagVector
4948/// ::= DISPFlagVector '|' DISPFlag* '|' uint32
4949template <>
4950bool LLParser::parseMDField(LocTy Loc, StringRef Name, DISPFlagField &Result) {
4951
4952 // parser for a single flag.
4953 auto parseFlag = [&](DISubprogram::DISPFlags &Val) {
4954 if (Lex.getKind() == lltok::APSInt && !Lex.getAPSIntVal().isSigned()) {
4955 uint32_t TempVal = static_cast<uint32_t>(Val);
4956 bool Res = parseUInt32(TempVal);
4957 Val = static_cast<DISubprogram::DISPFlags>(TempVal);
4958 return Res;
4959 }
4960
4961 if (Lex.getKind() != lltok::DISPFlag)
4962 return tokError("expected debug info flag");
4963
4964 Val = DISubprogram::getFlag(Lex.getStrVal());
4965 if (!Val)
4966 return tokError(Twine("invalid subprogram debug info flag '") +
4967 Lex.getStrVal() + "'");
4968 Lex.Lex();
4969 return false;
4970 };
4971
4972 // parse the flags and combine them together.
4973 DISubprogram::DISPFlags Combined = DISubprogram::SPFlagZero;
4974 do {
4976 if (parseFlag(Val))
4977 return true;
4978 Combined |= Val;
4979 } while (EatIfPresent(lltok::bar));
4980
4981 Result.assign(Combined);
4982 return false;
4983}
4984
4985template <>
4986bool LLParser::parseMDField(LocTy Loc, StringRef Name, MDSignedField &Result) {
4987 if (Lex.getKind() != lltok::APSInt)
4988 return tokError("expected signed integer");
4989
4990 auto &S = Lex.getAPSIntVal();
4991 if (S < Result.Min)
4992 return tokError("value for '" + Name + "' too small, limit is " +
4993 Twine(Result.Min));
4994 if (S > Result.Max)
4995 return tokError("value for '" + Name + "' too large, limit is " +
4996 Twine(Result.Max));
4997 Result.assign(S.getExtValue());
4998 assert(Result.Val >= Result.Min && "Expected value in range");
4999 assert(Result.Val <= Result.Max && "Expected value in range");
5000 Lex.Lex();
5001 return false;
5002}
5003
5004template <>
5005bool LLParser::parseMDField(LocTy Loc, StringRef Name, MDBoolField &Result) {
5006 switch (Lex.getKind()) {
5007 default:
5008 return tokError("expected 'true' or 'false'");
5009 case lltok::kw_true:
5010 Result.assign(true);
5011 break;
5012 case lltok::kw_false:
5013 Result.assign(false);
5014 break;
5015 }
5016 Lex.Lex();
5017 return false;
5018}
5019
5020template <>
5021bool LLParser::parseMDField(LocTy Loc, StringRef Name, MDField &Result) {
5022 if (Lex.getKind() == lltok::kw_null) {
5023 if (!Result.AllowNull)
5024 return tokError("'" + Name + "' cannot be null");
5025 Lex.Lex();
5026 Result.assign(nullptr);
5027 return false;
5028 }
5029
5030 Metadata *MD;
5031 if (parseMetadata(MD, nullptr))
5032 return true;
5033
5034 Result.assign(MD);
5035 return false;
5036}
5037
5038template <>
5039bool LLParser::parseMDField(LocTy Loc, StringRef Name,
5040 MDSignedOrMDField &Result) {
5041 // Try to parse a signed int.
5042 if (Lex.getKind() == lltok::APSInt) {
5043 MDSignedField Res = Result.A;
5044 if (!parseMDField(Loc, Name, Res)) {
5045 Result.assign(Res);
5046 return false;
5047 }
5048 return true;
5049 }
5050
5051 // Otherwise, try to parse as an MDField.
5052 MDField Res = Result.B;
5053 if (!parseMDField(Loc, Name, Res)) {
5054 Result.assign(Res);
5055 return false;
5056 }
5057
5058 return true;
5059}
5060
5061template <>
5062bool LLParser::parseMDField(LocTy Loc, StringRef Name, MDStringField &Result) {
5063 LocTy ValueLoc = Lex.getLoc();
5064 std::string S;
5065 if (parseStringConstant(S))
5066 return true;
5067
5068 if (!Result.AllowEmpty && S.empty())
5069 return error(ValueLoc, "'" + Name + "' cannot be empty");
5070
5071 Result.assign(S.empty() ? nullptr : MDString::get(Context, S));
5072 return false;
5073}
5074
5075template <>
5076bool LLParser::parseMDField(LocTy Loc, StringRef Name, MDFieldList &Result) {
5078 if (parseMDNodeVector(MDs))
5079 return true;
5080
5081 Result.assign(std::move(MDs));
5082 return false;
5083}
5084
5085template <>
5086bool LLParser::parseMDField(LocTy Loc, StringRef Name,
5087 ChecksumKindField &Result) {
5088 std::optional<DIFile::ChecksumKind> CSKind =
5090
5091 if (Lex.getKind() != lltok::ChecksumKind || !CSKind)
5092 return tokError("invalid checksum kind" + Twine(" '") + Lex.getStrVal() +
5093 "'");
5094
5095 Result.assign(*CSKind);
5096 Lex.Lex();
5097 return false;
5098}
5099
5100} // end namespace llvm
5101
5102template <class ParserTy>
5103bool LLParser::parseMDFieldsImplBody(ParserTy ParseField) {
5104 do {
5105 if (Lex.getKind() != lltok::LabelStr)
5106 return tokError("expected field label here");
5107
5108 if (ParseField())
5109 return true;
5110 } while (EatIfPresent(lltok::comma));
5111
5112 return false;
5113}
5114
5115template <class ParserTy>
5116bool LLParser::parseMDFieldsImpl(ParserTy ParseField, LocTy &ClosingLoc) {
5117 assert(Lex.getKind() == lltok::MetadataVar && "Expected metadata type name");
5118 Lex.Lex();
5119
5120 if (parseToken(lltok::lparen, "expected '(' here"))
5121 return true;
5122 if (Lex.getKind() != lltok::rparen)
5123 if (parseMDFieldsImplBody(ParseField))
5124 return true;
5125
5126 ClosingLoc = Lex.getLoc();
5127 return parseToken(lltok::rparen, "expected ')' here");
5128}
5129
5130template <class FieldTy>
5131bool LLParser::parseMDField(StringRef Name, FieldTy &Result) {
5132 if (Result.Seen)
5133 return tokError("field '" + Name + "' cannot be specified more than once");
5134
5135 LocTy Loc = Lex.getLoc();
5136 Lex.Lex();
5137 return parseMDField(Loc, Name, Result);
5138}
5139
5140bool LLParser::parseSpecializedMDNode(MDNode *&N, bool IsDistinct) {
5141 assert(Lex.getKind() == lltok::MetadataVar && "Expected metadata type name");
5142
5143#define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
5144 if (Lex.getStrVal() == #CLASS) \
5145 return parse##CLASS(N, IsDistinct);
5146#include "llvm/IR/Metadata.def"
5147
5148 return tokError("expected metadata type");
5149}
5150
5151#define DECLARE_FIELD(NAME, TYPE, INIT) TYPE NAME INIT
5152#define NOP_FIELD(NAME, TYPE, INIT)
5153#define REQUIRE_FIELD(NAME, TYPE, INIT) \
5154 if (!NAME.Seen) \
5155 return error(ClosingLoc, "missing required field '" #NAME "'");
5156#define PARSE_MD_FIELD(NAME, TYPE, DEFAULT) \
5157 if (Lex.getStrVal() == #NAME) \
5158 return parseMDField(#NAME, NAME);
5159#define PARSE_MD_FIELDS() \
5160 VISIT_MD_FIELDS(DECLARE_FIELD, DECLARE_FIELD) \
5161 do { \
5162 LocTy ClosingLoc; \
5163 if (parseMDFieldsImpl( \
5164 [&]() -> bool { \
5165 VISIT_MD_FIELDS(PARSE_MD_FIELD, PARSE_MD_FIELD) \
5166 return tokError(Twine("invalid field '") + Lex.getStrVal() + \
5167 "'"); \
5168 }, \
5169 ClosingLoc)) \
5170 return true; \
5171 VISIT_MD_FIELDS(NOP_FIELD, REQUIRE_FIELD) \
5172 } while (false)
5173#define GET_OR_DISTINCT(CLASS, ARGS) \
5174 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
5175
5176/// parseDILocationFields:
5177/// ::= !DILocation(line: 43, column: 8, scope: !5, inlinedAt: !6,
5178/// isImplicitCode: true)
5179bool LLParser::parseDILocation(MDNode *&Result, bool IsDistinct) {
5180#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5181 OPTIONAL(line, LineField, ); \
5182 OPTIONAL(column, ColumnField, ); \
5183 REQUIRED(scope, MDField, (/* AllowNull */ false)); \
5184 OPTIONAL(inlinedAt, MDField, ); \
5185 OPTIONAL(isImplicitCode, MDBoolField, (false));
5187#undef VISIT_MD_FIELDS
5188
5189 Result =
5190 GET_OR_DISTINCT(DILocation, (Context, line.Val, column.Val, scope.Val,
5191 inlinedAt.Val, isImplicitCode.Val));
5192 return false;
5193}
5194
5195/// parseDIAssignID:
5196/// ::= distinct !DIAssignID()
5197bool LLParser::parseDIAssignID(MDNode *&Result, bool IsDistinct) {
5198 if (!IsDistinct)
5199 return tokError("missing 'distinct', required for !DIAssignID()");
5200
5201 Lex.Lex();
5202
5203 // Now eat the parens.
5204 if (parseToken(lltok::lparen, "expected '(' here"))
5205 return true;
5206 if (parseToken(lltok::rparen, "expected ')' here"))
5207 return true;
5208
5210 return false;
5211}
5212
5213/// parseGenericDINode:
5214/// ::= !GenericDINode(tag: 15, header: "...", operands: {...})
5215bool LLParser::parseGenericDINode(MDNode *&Result, bool IsDistinct) {
5216#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5217 REQUIRED(tag, DwarfTagField, ); \
5218 OPTIONAL(header, MDStringField, ); \
5219 OPTIONAL(operands, MDFieldList, );
5221#undef VISIT_MD_FIELDS
5222
5224 (Context, tag.Val, header.Val, operands.Val));
5225 return false;
5226}
5227
5228/// parseDISubrange:
5229/// ::= !DISubrange(count: 30, lowerBound: 2)
5230/// ::= !DISubrange(count: !node, lowerBound: 2)
5231/// ::= !DISubrange(lowerBound: !node1, upperBound: !node2, stride: !node3)
5232bool LLParser::parseDISubrange(MDNode *&Result, bool IsDistinct) {
5233#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5234 OPTIONAL(count, MDSignedOrMDField, (-1, -1, INT64_MAX, false)); \
5235 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5236 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5237 OPTIONAL(stride, MDSignedOrMDField, );
5239#undef VISIT_MD_FIELDS
5240
5241 Metadata *Count = nullptr;
5242 Metadata *LowerBound = nullptr;
5243 Metadata *UpperBound = nullptr;
5244 Metadata *Stride = nullptr;
5245
5246 auto convToMetadata = [&](const MDSignedOrMDField &Bound) -> Metadata * {
5247 if (Bound.isMDSignedField())
5249 Type::getInt64Ty(Context), Bound.getMDSignedValue()));
5250 if (Bound.isMDField())
5251 return Bound.getMDFieldValue();
5252 return nullptr;
5253 };
5254
5255 Count = convToMetadata(count);
5256 LowerBound = convToMetadata(lowerBound);
5257 UpperBound = convToMetadata(upperBound);
5258 Stride = convToMetadata(stride);
5259
5261 (Context, Count, LowerBound, UpperBound, Stride));
5262
5263 return false;
5264}
5265
5266/// parseDIGenericSubrange:
5267/// ::= !DIGenericSubrange(lowerBound: !node1, upperBound: !node2, stride:
5268/// !node3)
5269bool LLParser::parseDIGenericSubrange(MDNode *&Result, bool IsDistinct) {
5270#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5271 OPTIONAL(count, MDSignedOrMDField, ); \
5272 OPTIONAL(lowerBound, MDSignedOrMDField, ); \
5273 OPTIONAL(upperBound, MDSignedOrMDField, ); \
5274 OPTIONAL(stride, MDSignedOrMDField, );
5276#undef VISIT_MD_FIELDS
5277
5278 auto ConvToMetadata = [&](const MDSignedOrMDField &Bound) -> Metadata * {
5279 if (Bound.isMDSignedField())
5280 return DIExpression::get(
5281 Context, {dwarf::DW_OP_consts,
5282 static_cast<uint64_t>(Bound.getMDSignedValue())});
5283 if (Bound.isMDField())
5284 return Bound.getMDFieldValue();
5285 return nullptr;
5286 };
5287
5288 Metadata *Count = ConvToMetadata(count);
5289 Metadata *LowerBound = ConvToMetadata(lowerBound);
5290 Metadata *UpperBound = ConvToMetadata(upperBound);
5291 Metadata *Stride = ConvToMetadata(stride);
5292
5294 (Context, Count, LowerBound, UpperBound, Stride));
5295
5296 return false;
5297}
5298
5299/// parseDIEnumerator:
5300/// ::= !DIEnumerator(value: 30, isUnsigned: true, name: "SomeKind")
5301bool LLParser::parseDIEnumerator(MDNode *&Result, bool IsDistinct) {
5302#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5303 REQUIRED(name, MDStringField, ); \
5304 REQUIRED(value, MDAPSIntField, ); \
5305 OPTIONAL(isUnsigned, MDBoolField, (false));
5307#undef VISIT_MD_FIELDS
5308
5309 if (isUnsigned.Val && value.Val.isNegative())
5310 return tokError("unsigned enumerator with negative value");
5311
5312 APSInt Value(value.Val);
5313 // Add a leading zero so that unsigned values with the msb set are not
5314 // mistaken for negative values when used for signed enumerators.
5315 if (!isUnsigned.Val && value.Val.isUnsigned() && value.Val.isSignBitSet())
5316 Value = Value.zext(Value.getBitWidth() + 1);
5317
5318 Result =
5319 GET_OR_DISTINCT(DIEnumerator, (Context, Value, isUnsigned.Val, name.Val));
5320
5321 return false;
5322}
5323
5324/// parseDIBasicType:
5325/// ::= !DIBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32,
5326/// encoding: DW_ATE_encoding, flags: 0)
5327bool LLParser::parseDIBasicType(MDNode *&Result, bool IsDistinct) {
5328#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5329 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_base_type)); \
5330 OPTIONAL(name, MDStringField, ); \
5331 OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
5332 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5333 OPTIONAL(encoding, DwarfAttEncodingField, ); \
5334 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5335 OPTIONAL(flags, DIFlagField, );
5337#undef VISIT_MD_FIELDS
5338
5339 Result = GET_OR_DISTINCT(DIBasicType, (Context, tag.Val, name.Val, size.Val,
5340 align.Val, encoding.Val,
5341 num_extra_inhabitants.Val, flags.Val));
5342 return false;
5343}
5344
5345/// parseDIStringType:
5346/// ::= !DIStringType(name: "character(4)", size: 32, align: 32)
5347bool LLParser::parseDIStringType(MDNode *&Result, bool IsDistinct) {
5348#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5349 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_string_type)); \
5350 OPTIONAL(name, MDStringField, ); \
5351 OPTIONAL(stringLength, MDField, ); \
5352 OPTIONAL(stringLengthExpression, MDField, ); \
5353 OPTIONAL(stringLocationExpression, MDField, ); \
5354 OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
5355 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5356 OPTIONAL(encoding, DwarfAttEncodingField, );
5358#undef VISIT_MD_FIELDS
5359
5362 (Context, tag.Val, name.Val, stringLength.Val, stringLengthExpression.Val,
5363 stringLocationExpression.Val, size.Val, align.Val, encoding.Val));
5364 return false;
5365}
5366
5367/// parseDIDerivedType:
5368/// ::= !DIDerivedType(tag: DW_TAG_pointer_type, name: "int", file: !0,
5369/// line: 7, scope: !1, baseType: !2, size: 32,
5370/// align: 32, offset: 0, flags: 0, extraData: !3,
5371/// dwarfAddressSpace: 3, ptrAuthKey: 1,
5372/// ptrAuthIsAddressDiscriminated: true,
5373/// ptrAuthExtraDiscriminator: 0x1234,
5374/// ptrAuthIsaPointer: 1, ptrAuthAuthenticatesNullValues:1
5375/// )
5376bool LLParser::parseDIDerivedType(MDNode *&Result, bool IsDistinct) {
5377#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5378 REQUIRED(tag, DwarfTagField, ); \
5379 OPTIONAL(name, MDStringField, ); \
5380 OPTIONAL(file, MDField, ); \
5381 OPTIONAL(line, LineField, ); \
5382 OPTIONAL(scope, MDField, ); \
5383 REQUIRED(baseType, MDField, ); \
5384 OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
5385 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5386 OPTIONAL(offset, MDUnsignedField, (0, UINT64_MAX)); \
5387 OPTIONAL(flags, DIFlagField, ); \
5388 OPTIONAL(extraData, MDField, ); \
5389 OPTIONAL(dwarfAddressSpace, MDUnsignedField, (UINT32_MAX, UINT32_MAX)); \
5390 OPTIONAL(annotations, MDField, ); \
5391 OPTIONAL(ptrAuthKey, MDUnsignedField, (0, 7)); \
5392 OPTIONAL(ptrAuthIsAddressDiscriminated, MDBoolField, ); \
5393 OPTIONAL(ptrAuthExtraDiscriminator, MDUnsignedField, (0, 0xffff)); \
5394 OPTIONAL(ptrAuthIsaPointer, MDBoolField, ); \
5395 OPTIONAL(ptrAuthAuthenticatesNullValues, MDBoolField, );
5397#undef VISIT_MD_FIELDS
5398
5399 std::optional<unsigned> DWARFAddressSpace;
5400 if (dwarfAddressSpace.Val != UINT32_MAX)
5401 DWARFAddressSpace = dwarfAddressSpace.Val;
5402 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
5403 if (ptrAuthKey.Val)
5404 PtrAuthData.emplace(
5405 (unsigned)ptrAuthKey.Val, ptrAuthIsAddressDiscriminated.Val,
5406 (unsigned)ptrAuthExtraDiscriminator.Val, ptrAuthIsaPointer.Val,
5407 ptrAuthAuthenticatesNullValues.Val);
5408
5410 (Context, tag.Val, name.Val, file.Val, line.Val,
5411 scope.Val, baseType.Val, size.Val, align.Val,
5412 offset.Val, DWARFAddressSpace, PtrAuthData,
5413 flags.Val, extraData.Val, annotations.Val));
5414 return false;
5415}
5416
5417bool LLParser::parseDICompositeType(MDNode *&Result, bool IsDistinct) {
5418#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5419 REQUIRED(tag, DwarfTagField, ); \
5420 OPTIONAL(name, MDStringField, ); \
5421 OPTIONAL(file, MDField, ); \
5422 OPTIONAL(line, LineField, ); \
5423 OPTIONAL(scope, MDField, ); \
5424 OPTIONAL(baseType, MDField, ); \
5425 OPTIONAL(size, MDUnsignedField, (0, UINT64_MAX)); \
5426 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5427 OPTIONAL(offset, MDUnsignedField, (0, UINT64_MAX)); \
5428 OPTIONAL(flags, DIFlagField, ); \
5429 OPTIONAL(elements, MDField, ); \
5430 OPTIONAL(runtimeLang, DwarfLangField, ); \
5431 OPTIONAL(vtableHolder, MDField, ); \
5432 OPTIONAL(templateParams, MDField, ); \
5433 OPTIONAL(identifier, MDStringField, ); \
5434 OPTIONAL(discriminator, MDField, ); \
5435 OPTIONAL(dataLocation, MDField, ); \
5436 OPTIONAL(associated, MDField, ); \
5437 OPTIONAL(allocated, MDField, ); \
5438 OPTIONAL(rank, MDSignedOrMDField, ); \
5439 OPTIONAL(annotations, MDField, ); \
5440 OPTIONAL(num_extra_inhabitants, MDUnsignedField, (0, UINT32_MAX)); \
5441 OPTIONAL(specification, MDField, );
5443#undef VISIT_MD_FIELDS
5444
5445 Metadata *Rank = nullptr;
5446 if (rank.isMDSignedField())
5448 Type::getInt64Ty(Context), rank.getMDSignedValue()));
5449 else if (rank.isMDField())
5450 Rank = rank.getMDFieldValue();
5451
5452 // If this has an identifier try to build an ODR type.
5453 if (identifier.Val)
5454 if (auto *CT = DICompositeType::buildODRType(
5455 Context, *identifier.Val, tag.Val, name.Val, file.Val, line.Val,
5456 scope.Val, baseType.Val, size.Val, align.Val, offset.Val,
5457 specification.Val, num_extra_inhabitants.Val, flags.Val,
5458 elements.Val, runtimeLang.Val, vtableHolder.Val, templateParams.Val,
5459 discriminator.Val, dataLocation.Val, associated.Val, allocated.Val,
5460 Rank, annotations.Val)) {
5461 Result = CT;
5462 return false;
5463 }
5464
5465 // Create a new node, and save it in the context if it belongs in the type
5466 // map.
5469 (Context, tag.Val, name.Val, file.Val, line.Val, scope.Val, baseType.Val,
5470 size.Val, align.Val, offset.Val, flags.Val, elements.Val,
5471 runtimeLang.Val, vtableHolder.Val, templateParams.Val, identifier.Val,
5472 discriminator.Val, dataLocation.Val, associated.Val, allocated.Val, Rank,
5473 annotations.Val, specification.Val, num_extra_inhabitants.Val));
5474 return false;
5475}
5476
5477bool LLParser::parseDISubroutineType(MDNode *&Result, bool IsDistinct) {
5478#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5479 OPTIONAL(flags, DIFlagField, ); \
5480 OPTIONAL(cc, DwarfCCField, ); \
5481 REQUIRED(types, MDField, );
5483#undef VISIT_MD_FIELDS
5484
5486 (Context, flags.Val, cc.Val, types.Val));
5487 return false;
5488}
5489
5490/// parseDIFileType:
5491/// ::= !DIFileType(filename: "path/to/file", directory: "/path/to/dir",
5492/// checksumkind: CSK_MD5,
5493/// checksum: "000102030405060708090a0b0c0d0e0f",
5494/// source: "source file contents")
5495bool LLParser::parseDIFile(MDNode *&Result, bool IsDistinct) {
5496 // The default constructed value for checksumkind is required, but will never
5497 // be used, as the parser checks if the field was actually Seen before using
5498 // the Val.
5499#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5500 REQUIRED(filename, MDStringField, ); \
5501 REQUIRED(directory, MDStringField, ); \
5502 OPTIONAL(checksumkind, ChecksumKindField, (DIFile::CSK_MD5)); \
5503 OPTIONAL(checksum, MDStringField, ); \
5504 OPTIONAL(source, MDStringField, );
5506#undef VISIT_MD_FIELDS
5507
5508 std::optional<DIFile::ChecksumInfo<MDString *>> OptChecksum;
5509 if (checksumkind.Seen && checksum.Seen)
5510 OptChecksum.emplace(checksumkind.Val, checksum.Val);
5511 else if (checksumkind.Seen || checksum.Seen)
5512 return tokError("'checksumkind' and 'checksum' must be provided together");
5513
5514 MDString *Source = nullptr;
5515 if (source.Seen)
5516 Source = source.Val;
5518 DIFile, (Context, filename.Val, directory.Val, OptChecksum, Source));
5519 return false;
5520}
5521
5522/// parseDICompileUnit:
5523/// ::= !DICompileUnit(language: DW_LANG_C99, file: !0, producer: "clang",
5524/// isOptimized: true, flags: "-O2", runtimeVersion: 1,
5525/// splitDebugFilename: "abc.debug",
5526/// emissionKind: FullDebug, enums: !1, retainedTypes: !2,
5527/// globals: !4, imports: !5, macros: !6, dwoId: 0x0abcd,
5528/// sysroot: "/", sdk: "MacOSX.sdk")
5529bool LLParser::parseDICompileUnit(MDNode *&Result, bool IsDistinct) {
5530 if (!IsDistinct)
5531 return tokError("missing 'distinct', required for !DICompileUnit");
5532
5533#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5534 REQUIRED(language, DwarfLangField, ); \
5535 REQUIRED(file, MDField, (/* AllowNull */ false)); \
5536 OPTIONAL(producer, MDStringField, ); \
5537 OPTIONAL(isOptimized, MDBoolField, ); \
5538 OPTIONAL(flags, MDStringField, ); \
5539 OPTIONAL(runtimeVersion, MDUnsignedField, (0, UINT32_MAX)); \
5540 OPTIONAL(splitDebugFilename, MDStringField, ); \
5541 OPTIONAL(emissionKind, EmissionKindField, ); \
5542 OPTIONAL(enums, MDField, ); \
5543 OPTIONAL(retainedTypes, MDField, ); \
5544 OPTIONAL(globals, MDField, ); \
5545 OPTIONAL(imports, MDField, ); \
5546 OPTIONAL(macros, MDField, ); \
5547 OPTIONAL(dwoId, MDUnsignedField, ); \
5548 OPTIONAL(splitDebugInlining, MDBoolField, = true); \
5549 OPTIONAL(debugInfoForProfiling, MDBoolField, = false); \
5550 OPTIONAL(nameTableKind, NameTableKindField, ); \
5551 OPTIONAL(rangesBaseAddress, MDBoolField, = false); \
5552 OPTIONAL(sysroot, MDStringField, ); \
5553 OPTIONAL(sdk, MDStringField, );
5555#undef VISIT_MD_FIELDS
5556
5558 Context, language.Val, file.Val, producer.Val, isOptimized.Val, flags.Val,
5559 runtimeVersion.Val, splitDebugFilename.Val, emissionKind.Val, enums.Val,
5560 retainedTypes.Val, globals.Val, imports.Val, macros.Val, dwoId.Val,
5561 splitDebugInlining.Val, debugInfoForProfiling.Val, nameTableKind.Val,
5562 rangesBaseAddress.Val, sysroot.Val, sdk.Val);
5563 return false;
5564}
5565
5566/// parseDISubprogram:
5567/// ::= !DISubprogram(scope: !0, name: "foo", linkageName: "_Zfoo",
5568/// file: !1, line: 7, type: !2, isLocal: false,
5569/// isDefinition: true, scopeLine: 8, containingType: !3,
5570/// virtuality: DW_VIRTUALTIY_pure_virtual,
5571/// virtualIndex: 10, thisAdjustment: 4, flags: 11,
5572/// spFlags: 10, isOptimized: false, templateParams: !4,
5573/// declaration: !5, retainedNodes: !6, thrownTypes: !7,
5574/// annotations: !8)
5575bool LLParser::parseDISubprogram(MDNode *&Result, bool IsDistinct) {
5576 auto Loc = Lex.getLoc();
5577#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5578 OPTIONAL(scope, MDField, ); \
5579 OPTIONAL(name, MDStringField, ); \
5580 OPTIONAL(linkageName, MDStringField, ); \
5581 OPTIONAL(file, MDField, ); \
5582 OPTIONAL(line, LineField, ); \
5583 OPTIONAL(type, MDField, ); \
5584 OPTIONAL(isLocal, MDBoolField, ); \
5585 OPTIONAL(isDefinition, MDBoolField, (true)); \
5586 OPTIONAL(scopeLine, LineField, ); \
5587 OPTIONAL(containingType, MDField, ); \
5588 OPTIONAL(virtuality, DwarfVirtualityField, ); \
5589 OPTIONAL(virtualIndex, MDUnsignedField, (0, UINT32_MAX)); \
5590 OPTIONAL(thisAdjustment, MDSignedField, (0, INT32_MIN, INT32_MAX)); \
5591 OPTIONAL(flags, DIFlagField, ); \
5592 OPTIONAL(spFlags, DISPFlagField, ); \
5593 OPTIONAL(isOptimized, MDBoolField, ); \
5594 OPTIONAL(unit, MDField, ); \
5595 OPTIONAL(templateParams, MDField, ); \
5596 OPTIONAL(declaration, MDField, ); \
5597 OPTIONAL(retainedNodes, MDField, ); \
5598 OPTIONAL(thrownTypes, MDField, ); \
5599 OPTIONAL(annotations, MDField, ); \
5600 OPTIONAL(targetFuncName, MDStringField, );
5602#undef VISIT_MD_FIELDS
5603
5604 // An explicit spFlags field takes precedence over individual fields in
5605 // older IR versions.
5606 DISubprogram::DISPFlags SPFlags =
5607 spFlags.Seen ? spFlags.Val
5608 : DISubprogram::toSPFlags(isLocal.Val, isDefinition.Val,
5609 isOptimized.Val, virtuality.Val);
5610 if ((SPFlags & DISubprogram::SPFlagDefinition) && !IsDistinct)
5611 return error(
5612 Loc,
5613 "missing 'distinct', required for !DISubprogram that is a Definition");
5616 (Context, scope.Val, name.Val, linkageName.Val, file.Val, line.Val,
5617 type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
5618 thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
5619 declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
5620 targetFuncName.Val));
5621 return false;
5622}
5623
5624/// parseDILexicalBlock:
5625/// ::= !DILexicalBlock(scope: !0, file: !2, line: 7, column: 9)
5626bool LLParser::parseDILexicalBlock(MDNode *&Result, bool IsDistinct) {
5627#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5628 REQUIRED(scope, MDField, (/* AllowNull */ false)); \
5629 OPTIONAL(file, MDField, ); \
5630 OPTIONAL(line, LineField, ); \
5631 OPTIONAL(column, ColumnField, );
5633#undef VISIT_MD_FIELDS
5634
5636 DILexicalBlock, (Context, scope.Val, file.Val, line.Val, column.Val));
5637 return false;
5638}
5639
5640/// parseDILexicalBlockFile:
5641/// ::= !DILexicalBlockFile(scope: !0, file: !2, discriminator: 9)
5642bool LLParser::parseDILexicalBlockFile(MDNode *&Result, bool IsDistinct) {
5643#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5644 REQUIRED(scope, MDField, (/* AllowNull */ false)); \
5645 OPTIONAL(file, MDField, ); \
5646 REQUIRED(discriminator, MDUnsignedField, (0, UINT32_MAX));
5648#undef VISIT_MD_FIELDS
5649
5651 (Context, scope.Val, file.Val, discriminator.Val));
5652 return false;
5653}
5654
5655/// parseDICommonBlock:
5656/// ::= !DICommonBlock(scope: !0, file: !2, name: "COMMON name", line: 9)
5657bool LLParser::parseDICommonBlock(MDNode *&Result, bool IsDistinct) {
5658#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5659 REQUIRED(scope, MDField, ); \
5660 OPTIONAL(declaration, MDField, ); \
5661 OPTIONAL(name, MDStringField, ); \
5662 OPTIONAL(file, MDField, ); \
5663 OPTIONAL(line, LineField, );
5665#undef VISIT_MD_FIELDS
5666
5668 (Context, scope.Val, declaration.Val, name.Val,
5669 file.Val, line.Val));
5670 return false;
5671}
5672
5673/// parseDINamespace:
5674/// ::= !DINamespace(scope: !0, file: !2, name: "SomeNamespace", line: 9)
5675bool LLParser::parseDINamespace(MDNode *&Result, bool IsDistinct) {
5676#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5677 REQUIRED(scope, MDField, ); \
5678 OPTIONAL(name, MDStringField, ); \
5679 OPTIONAL(exportSymbols, MDBoolField, );
5681#undef VISIT_MD_FIELDS
5682
5684 (Context, scope.Val, name.Val, exportSymbols.Val));
5685 return false;
5686}
5687
5688/// parseDIMacro:
5689/// ::= !DIMacro(macinfo: type, line: 9, name: "SomeMacro", value:
5690/// "SomeValue")
5691bool LLParser::parseDIMacro(MDNode *&Result, bool IsDistinct) {
5692#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5693 REQUIRED(type, DwarfMacinfoTypeField, ); \
5694 OPTIONAL(line, LineField, ); \
5695 REQUIRED(name, MDStringField, ); \
5696 OPTIONAL(value, MDStringField, );
5698#undef VISIT_MD_FIELDS
5699
5701 (Context, type.Val, line.Val, name.Val, value.Val));
5702 return false;
5703}
5704
5705/// parseDIMacroFile:
5706/// ::= !DIMacroFile(line: 9, file: !2, nodes: !3)
5707bool LLParser::parseDIMacroFile(MDNode *&Result, bool IsDistinct) {
5708#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5709 OPTIONAL(type, DwarfMacinfoTypeField, (dwarf::DW_MACINFO_start_file)); \
5710 OPTIONAL(line, LineField, ); \
5711 REQUIRED(file, MDField, ); \
5712 OPTIONAL(nodes, MDField, );
5714#undef VISIT_MD_FIELDS
5715
5717 (Context, type.Val, line.Val, file.Val, nodes.Val));
5718 return false;
5719}
5720
5721/// parseDIModule:
5722/// ::= !DIModule(scope: !0, name: "SomeModule", configMacros:
5723/// "-DNDEBUG", includePath: "/usr/include", apinotes: "module.apinotes",
5724/// file: !1, line: 4, isDecl: false)
5725bool LLParser::parseDIModule(MDNode *&Result, bool IsDistinct) {
5726#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5727 REQUIRED(scope, MDField, ); \
5728 REQUIRED(name, MDStringField, ); \
5729 OPTIONAL(configMacros, MDStringField, ); \
5730 OPTIONAL(includePath, MDStringField, ); \
5731 OPTIONAL(apinotes, MDStringField, ); \
5732 OPTIONAL(file, MDField, ); \
5733 OPTIONAL(line, LineField, ); \
5734 OPTIONAL(isDecl, MDBoolField, );
5736#undef VISIT_MD_FIELDS
5737
5738 Result = GET_OR_DISTINCT(DIModule, (Context, file.Val, scope.Val, name.Val,
5739 configMacros.Val, includePath.Val,
5740 apinotes.Val, line.Val, isDecl.Val));
5741 return false;
5742}
5743
5744/// parseDITemplateTypeParameter:
5745/// ::= !DITemplateTypeParameter(name: "Ty", type: !1, defaulted: false)
5746bool LLParser::parseDITemplateTypeParameter(MDNode *&Result, bool IsDistinct) {
5747#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5748 OPTIONAL(name, MDStringField, ); \
5749 REQUIRED(type, MDField, ); \
5750 OPTIONAL(defaulted, MDBoolField, );
5752#undef VISIT_MD_FIELDS
5753
5755 (Context, name.Val, type.Val, defaulted.Val));
5756 return false;
5757}
5758
5759/// parseDITemplateValueParameter:
5760/// ::= !DITemplateValueParameter(tag: DW_TAG_template_value_parameter,
5761/// name: "V", type: !1, defaulted: false,
5762/// value: i32 7)
5763bool LLParser::parseDITemplateValueParameter(MDNode *&Result, bool IsDistinct) {
5764#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5765 OPTIONAL(tag, DwarfTagField, (dwarf::DW_TAG_template_value_parameter)); \
5766 OPTIONAL(name, MDStringField, ); \
5767 OPTIONAL(type, MDField, ); \
5768 OPTIONAL(defaulted, MDBoolField, ); \
5769 REQUIRED(value, MDField, );
5770
5772#undef VISIT_MD_FIELDS
5773
5776 (Context, tag.Val, name.Val, type.Val, defaulted.Val, value.Val));
5777 return false;
5778}
5779
5780/// parseDIGlobalVariable:
5781/// ::= !DIGlobalVariable(scope: !0, name: "foo", linkageName: "foo",
5782/// file: !1, line: 7, type: !2, isLocal: false,
5783/// isDefinition: true, templateParams: !3,
5784/// declaration: !4, align: 8)
5785bool LLParser::parseDIGlobalVariable(MDNode *&Result, bool IsDistinct) {
5786#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5787 OPTIONAL(name, MDStringField, (/* AllowEmpty */ false)); \
5788 OPTIONAL(scope, MDField, ); \
5789 OPTIONAL(linkageName, MDStringField, ); \
5790 OPTIONAL(file, MDField, ); \
5791 OPTIONAL(line, LineField, ); \
5792 OPTIONAL(type, MDField, ); \
5793 OPTIONAL(isLocal, MDBoolField, ); \
5794 OPTIONAL(isDefinition, MDBoolField, (true)); \
5795 OPTIONAL(templateParams, MDField, ); \
5796 OPTIONAL(declaration, MDField, ); \
5797 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5798 OPTIONAL(annotations, MDField, );
5800#undef VISIT_MD_FIELDS
5801
5802 Result =
5804 (Context, scope.Val, name.Val, linkageName.Val, file.Val,
5805 line.Val, type.Val, isLocal.Val, isDefinition.Val,
5806 declaration.Val, templateParams.Val, align.Val,
5807 annotations.Val));
5808 return false;
5809}
5810
5811/// parseDILocalVariable:
5812/// ::= !DILocalVariable(arg: 7, scope: !0, name: "foo",
5813/// file: !1, line: 7, type: !2, arg: 2, flags: 7,
5814/// align: 8)
5815/// ::= !DILocalVariable(scope: !0, name: "foo",
5816/// file: !1, line: 7, type: !2, arg: 2, flags: 7,
5817/// align: 8)
5818bool LLParser::parseDILocalVariable(MDNode *&Result, bool IsDistinct) {
5819#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5820 REQUIRED(scope, MDField, (/* AllowNull */ false)); \
5821 OPTIONAL(name, MDStringField, ); \
5822 OPTIONAL(arg, MDUnsignedField, (0, UINT16_MAX)); \
5823 OPTIONAL(file, MDField, ); \
5824 OPTIONAL(line, LineField, ); \
5825 OPTIONAL(type, MDField, ); \
5826 OPTIONAL(flags, DIFlagField, ); \
5827 OPTIONAL(align, MDUnsignedField, (0, UINT32_MAX)); \
5828 OPTIONAL(annotations, MDField, );
5830#undef VISIT_MD_FIELDS
5831
5833 (Context, scope.Val, name.Val, file.Val, line.Val,
5834 type.Val, arg.Val, flags.Val, align.Val,
5835 annotations.Val));
5836 return false;
5837}
5838
5839/// parseDILabel:
5840/// ::= !DILabel(scope: !0, name: "foo", file: !1, line: 7)
5841bool LLParser::parseDILabel(MDNode *&Result, bool IsDistinct) {
5842#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5843 REQUIRED(scope, MDField, (/* AllowNull */ false)); \
5844 REQUIRED(name, MDStringField, ); \
5845 REQUIRED(file, MDField, ); \
5846 REQUIRED(line, LineField, );
5848#undef VISIT_MD_FIELDS
5849
5851 (Context, scope.Val, name.Val, file.Val, line.Val));
5852 return false;
5853}
5854
5855/// parseDIExpressionBody:
5856/// ::= (0, 7, -1)
5857bool LLParser::parseDIExpressionBody(MDNode *&Result, bool IsDistinct) {
5858 if (parseToken(lltok::lparen, "expected '(' here"))
5859 return true;
5860
5862 if (Lex.getKind() != lltok::rparen)
5863 do {
5864 if (Lex.getKind() == lltok::DwarfOp) {
5865 if (unsigned Op = dwarf::getOperationEncoding(Lex.getStrVal())) {
5866 Lex.Lex();
5867 Elements.push_back(Op);
5868 continue;
5869 }
5870 return tokError(Twine("invalid DWARF op '") + Lex.getStrVal() + "'");
5871 }
5872
5873 if (Lex.getKind() == lltok::DwarfAttEncoding) {
5874 if (unsigned Op = dwarf::getAttributeEncoding(Lex.getStrVal())) {
5875 Lex.Lex();
5876 Elements.push_back(Op);
5877 continue;
5878 }
5879 return tokError(Twine("invalid DWARF attribute encoding '") +
5880 Lex.getStrVal() + "'");
5881 }
5882
5883 if (Lex.getKind() != lltok::APSInt || Lex.getAPSIntVal().isSigned())
5884 return tokError("expected unsigned integer");
5885
5886 auto &U = Lex.getAPSIntVal();
5887 if (U.ugt(UINT64_MAX))
5888 return tokError("element too large, limit is " + Twine(UINT64_MAX));
5889 Elements.push_back(U.getZExtValue());
5890 Lex.Lex();
5891 } while (EatIfPresent(lltok::comma));
5892
5893 if (parseToken(lltok::rparen, "expected ')' here"))
5894 return true;
5895
5896 Result = GET_OR_DISTINCT(DIExpression, (Context, Elements));
5897 return false;
5898}
5899
5900/// parseDIExpression:
5901/// ::= !DIExpression(0, 7, -1)
5902bool LLParser::parseDIExpression(MDNode *&Result, bool IsDistinct) {
5903 assert(Lex.getKind() == lltok::MetadataVar && "Expected metadata type name");
5904 assert(Lex.getStrVal() == "DIExpression" && "Expected '!DIExpression'");
5905 Lex.Lex();
5906
5907 return parseDIExpressionBody(Result, IsDistinct);
5908}
5909
5910/// ParseDIArgList:
5911/// ::= !DIArgList(i32 7, i64 %0)
5912bool LLParser::parseDIArgList(Metadata *&MD, PerFunctionState *PFS) {
5913 assert(PFS && "Expected valid function state");
5914 assert(Lex.getKind() == lltok::MetadataVar && "Expected metadata type name");
5915 Lex.Lex();
5916
5917 if (parseToken(lltok::lparen, "expected '(' here"))
5918 return true;
5919
5921 if (Lex.getKind() != lltok::rparen)
5922 do {
5923 Metadata *MD;
5924 if (parseValueAsMetadata(MD, "expected value-as-metadata operand", PFS))
5925 return true;
5926 Args.push_back(dyn_cast<ValueAsMetadata>(MD));
5927 } while (EatIfPresent(lltok::comma));
5928
5929 if (parseToken(lltok::rparen, "expected ')' here"))
5930 return true;
5931
5932 MD = DIArgList::get(Context, Args);
5933 return false;
5934}
5935
5936/// parseDIGlobalVariableExpression:
5937/// ::= !DIGlobalVariableExpression(var: !0, expr: !1)
5938bool LLParser::parseDIGlobalVariableExpression(MDNode *&Result,
5939 bool IsDistinct) {
5940#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5941 REQUIRED(var, MDField, ); \
5942 REQUIRED(expr, MDField, );
5944#undef VISIT_MD_FIELDS
5945
5946 Result =
5947 GET_OR_DISTINCT(DIGlobalVariableExpression, (Context, var.Val, expr.Val));
5948 return false;
5949}
5950
5951/// parseDIObjCProperty:
5952/// ::= !DIObjCProperty(name: "foo", file: !1, line: 7, setter: "setFoo",
5953/// getter: "getFoo", attributes: 7, type: !2)
5954bool LLParser::parseDIObjCProperty(MDNode *&Result, bool IsDistinct) {
5955#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5956 OPTIONAL(name, MDStringField, ); \
5957 OPTIONAL(file, MDField, ); \
5958 OPTIONAL(line, LineField, ); \
5959 OPTIONAL(setter, MDStringField, ); \
5960 OPTIONAL(getter, MDStringField, ); \
5961 OPTIONAL(attributes, MDUnsignedField, (0, UINT32_MAX)); \
5962 OPTIONAL(type, MDField, );
5964#undef VISIT_MD_FIELDS
5965
5967 (Context, name.Val, file.Val, line.Val, setter.Val,
5968 getter.Val, attributes.Val, type.Val));
5969 return false;
5970}
5971
5972/// parseDIImportedEntity:
5973/// ::= !DIImportedEntity(tag: DW_TAG_imported_module, scope: !0, entity: !1,
5974/// line: 7, name: "foo", elements: !2)
5975bool LLParser::parseDIImportedEntity(MDNode *&Result, bool IsDistinct) {
5976#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
5977 REQUIRED(tag, DwarfTagField, ); \
5978 REQUIRED(scope, MDField, ); \
5979 OPTIONAL(entity, MDField, ); \
5980 OPTIONAL(file, MDField, ); \
5981 OPTIONAL(line, LineField, ); \
5982 OPTIONAL(name, MDStringField, ); \
5983 OPTIONAL(elements, MDField, );
5985#undef VISIT_MD_FIELDS
5986
5988 (Context, tag.Val, scope.Val, entity.Val, file.Val,
5989 line.Val, name.Val, elements.Val));
5990 return false;
5991}
5992
5993#undef PARSE_MD_FIELD
5994#undef NOP_FIELD
5995#undef REQUIRE_FIELD
5996#undef DECLARE_FIELD
5997
5998/// parseMetadataAsValue
5999/// ::= metadata i32 %local
6000/// ::= metadata i32 @global
6001/// ::= metadata i32 7
6002/// ::= metadata !0
6003/// ::= metadata !{...}
6004/// ::= metadata !"string"
6005bool LLParser::parseMetadataAsValue(Value *&V, PerFunctionState &PFS) {
6006 // Note: the type 'metadata' has already been parsed.
6007 Metadata *MD;
6008 if (parseMetadata(MD, &PFS))
6009 return true;
6010
6011 V = MetadataAsValue::get(Context, MD);
6012 return false;
6013}
6014
6015/// parseValueAsMetadata
6016/// ::= i32 %local
6017/// ::= i32 @global
6018/// ::= i32 7
6019bool LLParser::parseValueAsMetadata(Metadata *&MD, const Twine &TypeMsg,
6020 PerFunctionState *PFS) {
6021 Type *Ty;
6022 LocTy Loc;
6023 if (parseType(Ty, TypeMsg, Loc))
6024 return true;
6025 if (Ty->isMetadataTy())
6026 return error(Loc, "invalid metadata-value-metadata roundtrip");
6027
6028 Value *V;
6029 if (parseValue(Ty, V, PFS))
6030 return true;
6031
6032 MD = ValueAsMetadata::get(V);
6033 return false;
6034}
6035
6036/// parseMetadata
6037/// ::= i32 %local
6038/// ::= i32 @global
6039/// ::= i32 7
6040/// ::= !42
6041/// ::= !{...}
6042/// ::= !"string"
6043/// ::= !DILocation(...)
6044bool LLParser::parseMetadata(Metadata *&MD, PerFunctionState *PFS) {
6045 if (Lex.getKind() == lltok::MetadataVar) {
6046 // DIArgLists are a special case, as they are a list of ValueAsMetadata and
6047 // so parsing this requires a Function State.
6048 if (Lex.getStrVal() == "DIArgList") {
6049 Metadata *AL;
6050 if (parseDIArgList(AL, PFS))
6051 return true;
6052 MD = AL;
6053 return false;
6054 }
6055 MDNode *N;
6056 if (parseSpecializedMDNode(N)) {
6057 return true;
6058 }
6059 MD = N;
6060 return false;
6061 }
6062
6063 // ValueAsMetadata:
6064 // <type> <value>
6065 if (Lex.getKind() != lltok::exclaim)
6066 return parseValueAsMetadata(MD, "expected metadata operand", PFS);
6067
6068 // '!'.
6069 assert(Lex.getKind() == lltok::exclaim && "Expected '!' here");
6070 Lex.Lex();
6071
6072 // MDString:
6073 // ::= '!' STRINGCONSTANT
6074 if (Lex.getKind() == lltok::StringConstant) {
6075 MDString *S;
6076 if (parseMDString(S))
6077 return true;
6078 MD = S;
6079 return false;
6080 }
6081
6082 // MDNode:
6083 // !{ ... }
6084 // !7
6085 MDNode *N;
6086 if (parseMDNodeTail(N))
6087 return true;
6088 MD = N;
6089 return false;
6090}
6091
6092//===----------------------------------------------------------------------===//
6093// Function Parsing.
6094//===----------------------------------------------------------------------===//
6095
6096bool LLParser::convertValIDToValue(Type *Ty, ValID &ID, Value *&V,
6097 PerFunctionState *PFS) {
6098 if (Ty->isFunctionTy())
6099 return error(ID.Loc, "functions are not values, refer to them as pointers");
6100
6101 switch (ID.Kind) {
6102 case ValID::t_LocalID:
6103 if (!PFS)
6104 return error(ID.Loc, "invalid use of function-local name");
6105 V = PFS->getVal(ID.UIntVal, Ty, ID.Loc);
6106 return V == nullptr;
6107 case ValID::t_LocalName:
6108 if (!PFS)
6109 return error(ID.Loc, "invalid use of function-local name");
6110 V = PFS->getVal(ID.StrVal, Ty, ID.Loc);
6111 return V == nullptr;
6112 case ValID::t_InlineAsm: {
6113 if (!ID.FTy)
6114 return error(ID.Loc, "invalid type for inline asm constraint string");
6115 if (Error Err = InlineAsm::verify(ID.FTy, ID.StrVal2))
6116 return error(ID.Loc, toString(std::move(Err)));
6117 V = InlineAsm::get(
6118 ID.FTy, ID.StrVal, ID.StrVal2, ID.UIntVal & 1, (ID.UIntVal >> 1) & 1,
6119 InlineAsm::AsmDialect((ID.UIntVal >> 2) & 1), (ID.UIntVal >> 3) & 1);
6120 return false;
6121 }
6123 V = getGlobalVal(ID.StrVal, Ty, ID.Loc);
6124 if (V && ID.NoCFI)
6125 V = NoCFIValue::get(cast<GlobalValue>(V));
6126 return V == nullptr;
6127 case ValID::t_GlobalID:
6128 V = getGlobalVal(ID.UIntVal, Ty, ID.Loc);
6129 if (V && ID.NoCFI)
6130 V = NoCFIValue::get(cast<GlobalValue>(V));
6131 return V == nullptr;
6132 case ValID::t_APSInt:
6133 if (!Ty->isIntegerTy())
6134 return error(ID.Loc, "integer constant must have integer type");
6135 ID.APSIntVal = ID.APSIntVal.extOrTrunc(Ty->getPrimitiveSizeInBits());
6136 V = ConstantInt::get(Context, ID.APSIntVal);
6137 return false;
6138 case ValID::t_APFloat:
6139 if (!Ty->isFloatingPointTy() ||
6140 !ConstantFP::isValueValidForType(Ty, ID.APFloatVal))
6141 return error(ID.Loc, "floating point constant invalid for type");
6142
6143 // The lexer has no type info, so builds all half, bfloat, float, and double
6144 // FP constants as double. Fix this here. Long double does not need this.
6145 if (&ID.APFloatVal.getSemantics() == &APFloat::IEEEdouble()) {
6146 // Check for signaling before potentially converting and losing that info.
6147 bool IsSNAN = ID.APFloatVal.isSignaling();
6148 bool Ignored;
6149 if (Ty->isHalfTy())
6151 &Ignored);
6152 else if (Ty->isBFloatTy())
6153 ID.APFloatVal.convert(APFloat::BFloat(), APFloat::rmNearestTiesToEven,
6154 &Ignored);
6155 else if (Ty->isFloatTy())
6157 &Ignored);
6158 if (IsSNAN) {
6159 // The convert call above may quiet an SNaN, so manufacture another
6160 // SNaN. The bitcast works because the payload (significand) parameter
6161 // is truncated to fit.
6162 APInt Payload = ID.APFloatVal.bitcastToAPInt();
6163 ID.APFloatVal = APFloat::getSNaN(ID.APFloatVal.getSemantics(),
6164 ID.APFloatVal.isNegative(), &Payload);
6165 }
6166 }
6167 V = ConstantFP::get(Context, ID.APFloatVal);
6168
6169 if (V->getType() != Ty)
6170 return error(ID.Loc, "floating point constant does not have type '" +
6171 getTypeString(Ty) + "'");
6172
6173 return false;
6174 case ValID::t_Null:
6175 if (!Ty->isPointerTy())
6176 return error(ID.Loc, "null must be a pointer type");
6177 V = ConstantPointerNull::get(cast<PointerType>(Ty));
6178 return false;
6179 case ValID::t_Undef:
6180 // FIXME: LabelTy should not be a first-class type.
6181 if (!Ty->isFirstClassType() || Ty->isLabelTy())
6182 return error(ID.Loc, "invalid type for undef constant");
6183 V = UndefValue::get(Ty);
6184 return false;
6186 if (!Ty->isArrayTy() || cast<ArrayType>(Ty)->getNumElements() != 0)
6187 return error(ID.Loc, "invalid empty array initializer");
6188 V = PoisonValue::get(Ty);
6189 return false;
6190 case ValID::t_Zero:
6191 // FIXME: LabelTy should not be a first-class type.
6192 if (!Ty->isFirstClassType() || Ty->isLabelTy())
6193 return error(ID.Loc, "invalid type for null constant");
6194 if (auto *TETy = dyn_cast<TargetExtType>(Ty))
6195 if (!TETy->hasProperty(TargetExtType::HasZeroInit))
6196 return error(ID.Loc, "invalid type for null constant");
6198 return false;
6199 case ValID::t_None:
6200 if (!Ty->isTokenTy())
6201 return error(ID.Loc, "invalid type for none constant");
6203 return false;
6204 case ValID::t_Poison:
6205 // FIXME: LabelTy should not be a first-class type.
6206 if (!Ty->isFirstClassType() || Ty->isLabelTy())
6207 return error(ID.Loc, "invalid type for poison constant");
6208 V = PoisonValue::get(Ty);
6209 return false;
6210 case ValID::t_Constant:
6211 if (ID.ConstantVal->getType() != Ty)
6212 return error(ID.Loc, "constant expression type mismatch: got type '" +
6213 getTypeString(ID.ConstantVal->getType()) +
6214 "' but expected '" + getTypeString(Ty) + "'");
6215 V = ID.ConstantVal;
6216 return false;
6218 if (!Ty->isVectorTy())
6219 return error(ID.Loc, "vector constant must have vector type");
6220 if (ID.ConstantVal->getType() != Ty->getScalarType())
6221 return error(ID.Loc, "constant expression type mismatch: got type '" +
6222 getTypeString(ID.ConstantVal->getType()) +
6223 "' but expected '" +
6224 getTypeString(Ty->getScalarType()) + "'");
6225 V = ConstantVector::getSplat(cast<VectorType>(Ty)->getElementCount(),
6226 ID.ConstantVal);
6227 return false;
6230 if (StructType *ST = dyn_cast<StructType>(Ty)) {
6231 if (ST->getNumElements() != ID.UIntVal)
6232 return error(ID.Loc,
6233 "initializer with struct type has wrong # elements");
6234 if (ST->isPacked() != (ID.Kind == ValID::t_PackedConstantStruct))
6235 return error(ID.Loc, "packed'ness of initializer and type don't match");
6236
6237 // Verify that the elements are compatible with the structtype.
6238 for (unsigned i = 0, e = ID.UIntVal; i != e; ++i)
6239 if (ID.ConstantStructElts[i]->getType() != ST->getElementType(i))
6240 return error(
6241 ID.Loc,
6242 "element " + Twine(i) +
6243 " of struct initializer doesn't match struct element type");
6244
6246 ST, ArrayRef(ID.ConstantStructElts.get(), ID.UIntVal));
6247 } else
6248 return error(ID.Loc, "constant expression type mismatch");
6249 return false;
6250 }
6251 llvm_unreachable("Invalid ValID");
6252}
6253
6254bool LLParser::parseConstantValue(Type *Ty, Constant *&C) {
6255 C = nullptr;
6256 ValID ID;
6257 auto Loc = Lex.getLoc();
6258 if (parseValID(ID, /*PFS=*/nullptr))
6259 return true;
6260 switch (ID.Kind) {
6261 case ValID::t_APSInt:
6262 case ValID::t_APFloat:
6263 case ValID::t_Undef:
6264 case ValID::t_Poison:
6265 case ValID::t_Zero:
6266 case ValID::t_Constant:
6270 Value *V;
6271 if (convertValIDToValue(Ty, ID, V, /*PFS=*/nullptr))
6272 return true;
6273 assert(isa<Constant>(V) && "Expected a constant value");
6274 C = cast<Constant>(V);
6275 return false;
6276 }
6277 case ValID::t_Null:
6279 return false;
6280 default:
6281 return error(Loc, "expected a constant value");
6282 }
6283}
6284
6285bool LLParser::parseValue(Type *Ty, Value *&V, PerFunctionState *PFS) {
6286 V = nullptr;
6287 ValID ID;
6288 return parseValID(ID, PFS, Ty) ||
6289 convertValIDToValue(Ty, ID, V, PFS);
6290}
6291
6292bool LLParser::parseTypeAndValue(Value *&V, PerFunctionState *PFS) {
6293 Type *Ty = nullptr;
6294 return parseType(Ty) || parseValue(Ty, V, PFS);
6295}
6296
6297bool LLParser::parseTypeAndBasicBlock(BasicBlock *&BB, LocTy &Loc,
6298 PerFunctionState &PFS) {
6299 Value *V;
6300 Loc = Lex.getLoc();
6301 if (parseTypeAndValue(V, PFS))
6302 return true;
6303 if (!isa<BasicBlock>(V))
6304 return error(Loc, "expected a basic block");
6305 BB = cast<BasicBlock>(V);
6306 return false;
6307}
6308
6310 // Exit early for the common (non-debug-intrinsic) case.
6311 // We can make this the only check when we begin supporting all "llvm.dbg"
6312 // intrinsics in the new debug info format.
6313 if (!Name.starts_with("llvm.dbg."))
6314 return false;
6316 return FnID == Intrinsic::dbg_declare || FnID == Intrinsic::dbg_value ||
6317 FnID == Intrinsic::dbg_assign;
6318}
6319
6320/// FunctionHeader
6321/// ::= OptionalLinkage OptionalPreemptionSpecifier OptionalVisibility
6322/// OptionalCallingConv OptRetAttrs OptUnnamedAddr Type GlobalName
6323/// '(' ArgList ')' OptAddrSpace OptFuncAttrs OptSection OptionalAlign
6324/// OptGC OptionalPrefix OptionalPrologue OptPersonalityFn
6325bool LLParser::parseFunctionHeader(Function *&Fn, bool IsDefine,
6326 unsigned &FunctionNumber,
6327 SmallVectorImpl<unsigned> &UnnamedArgNums) {
6328 // parse the linkage.
6329 LocTy LinkageLoc = Lex.getLoc();
6330 unsigned Linkage;
6331 unsigned Visibility;
6332 unsigned DLLStorageClass;
6333 bool DSOLocal;
6334 AttrBuilder RetAttrs(M->getContext());
6335 unsigned CC;
6336 bool HasLinkage;
6337 Type *RetType = nullptr;
6338 LocTy RetTypeLoc = Lex.getLoc();
6339 if (parseOptionalLinkage(Linkage, HasLinkage, Visibility, DLLStorageClass,
6340 DSOLocal) ||
6341 parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
6342 parseType(RetType, RetTypeLoc, true /*void allowed*/))
6343 return true;
6344
6345 // Verify that the linkage is ok.
6346 switch ((GlobalValue::LinkageTypes)Linkage) {
6348 break; // always ok.
6350 if (IsDefine)
6351 return error(LinkageLoc, "invalid linkage for function definition");
6352 break;
6360 if (!IsDefine)
6361 return error(LinkageLoc, "invalid linkage for function declaration");
6362 break;
6365 return error(LinkageLoc, "invalid function linkage type");
6366 }
6367
6368 if (!isValidVisibilityForLinkage(Visibility, Linkage))
6369 return error(LinkageLoc,
6370 "symbol with local linkage must have default visibility");
6371
6372 if (!isValidDLLStorageClassForLinkage(DLLStorageClass, Linkage))
6373 return error(LinkageLoc,
6374 "symbol with local linkage cannot have a DLL storage class");
6375
6376 if (!FunctionType::isValidReturnType(RetType))
6377 return error(RetTypeLoc, "invalid function return type");
6378
6379 LocTy NameLoc = Lex.getLoc();
6380
6381 std::string FunctionName;
6382 if (Lex.getKind() == lltok::GlobalVar) {
6383 FunctionName = Lex.getStrVal();
6384 } else if (Lex.getKind() == lltok::GlobalID) { // @42 is ok.
6385 FunctionNumber = Lex.getUIntVal();
6386 if (checkValueID(NameLoc, "function", "@", NumberedVals.getNext(),
6387 FunctionNumber))
6388 return true;
6389 } else {
6390 return tokError("expected function name");
6391 }
6392
6393 Lex.Lex();
6394
6395 if (Lex.getKind() != lltok::lparen)
6396 return tokError("expected '(' in function argument list");
6397
6399 bool IsVarArg;
6400 AttrBuilder FuncAttrs(M->getContext());
6401 std::vector<unsigned> FwdRefAttrGrps;
6402 LocTy BuiltinLoc;
6403 std::string Section;
6404 std::string Partition;
6405 MaybeAlign Alignment;
6406 std::string GC;
6408 unsigned AddrSpace = 0;
6409 Constant *Prefix = nullptr;
6410 Constant *Prologue = nullptr;
6411 Constant *PersonalityFn = nullptr;
6412 Comdat *C;
6413
6414 if (parseArgumentList(ArgList, UnnamedArgNums, IsVarArg) ||
6415 parseOptionalUnnamedAddr(UnnamedAddr) ||
6416 parseOptionalProgramAddrSpace(AddrSpace) ||
6417 parseFnAttributeValuePairs(FuncAttrs, FwdRefAttrGrps, false,
6418 BuiltinLoc) ||
6419 (EatIfPresent(lltok::kw_section) && parseStringConstant(Section)) ||
6420 (EatIfPresent(lltok::kw_partition) && parseStringConstant(Partition)) ||
6421 parseOptionalComdat(FunctionName, C) ||
6422 parseOptionalAlignment(Alignment) ||
6423 (EatIfPresent(lltok::kw_gc) && parseStringConstant(GC)) ||
6424 (EatIfPresent(lltok::kw_prefix) && parseGlobalTypeAndValue(Prefix)) ||
6425 (EatIfPresent(lltok::kw_prologue) && parseGlobalTypeAndValue(Prologue)) ||
6426 (EatIfPresent(lltok::kw_personality) &&
6427 parseGlobalTypeAndValue(PersonalityFn)))
6428 return true;
6429
6430 if (FuncAttrs.contains(Attribute::Builtin))
6431 return error(BuiltinLoc, "'builtin' attribute not valid on function");
6432
6433 // If the alignment was parsed as an attribute, move to the alignment field.
6434 if (MaybeAlign A = FuncAttrs.getAlignment()) {
6435 Alignment = A;
6436 FuncAttrs.removeAttribute(Attribute::Alignment);
6437 }
6438
6439 // Okay, if we got here, the function is syntactically valid. Convert types
6440 // and do semantic checks.
6441 std::vector<Type*> ParamTypeList;
6443
6444 for (const ArgInfo &Arg : ArgList) {
6445 ParamTypeList.push_back(Arg.Ty);
6446 Attrs.push_back(Arg.Attrs);
6447 }
6448
6449 AttributeList PAL =
6450 AttributeList::get(Context, AttributeSet::get(Context, FuncAttrs),
6451 AttributeSet::get(Context, RetAttrs), Attrs);
6452
6453 if (PAL.hasParamAttr(0, Attribute::StructRet) && !RetType->isVoidTy())
6454 return error(RetTypeLoc, "functions with 'sret' argument must return void");
6455
6456 FunctionType *FT = FunctionType::get(RetType, ParamTypeList, IsVarArg);
6457 PointerType *PFT = PointerType::get(FT, AddrSpace);
6458
6459 Fn = nullptr;
6460 GlobalValue *FwdFn = nullptr;
6461 if (!FunctionName.empty()) {
6462 // If this was a definition of a forward reference, remove the definition
6463 // from the forward reference table and fill in the forward ref.
6464 auto FRVI = ForwardRefVals.find(FunctionName);
6465 if (FRVI != ForwardRefVals.end()) {
6466 FwdFn = FRVI->second.first;
6467 if (FwdFn->getType() != PFT)
6468 return error(FRVI->second.second,
6469 "invalid forward reference to "
6470 "function '" +
6471 FunctionName +
6472 "' with wrong type: "
6473 "expected '" +
6474 getTypeString(PFT) + "' but was '" +
6475 getTypeString(FwdFn->getType()) + "'");
6476 ForwardRefVals.erase(FRVI);
6477 } else if ((Fn = M->getFunction(FunctionName))) {
6478 // Reject redefinitions.
6479 return error(NameLoc,
6480 "invalid redefinition of function '" + FunctionName + "'");
6481 } else if (M->getNamedValue(FunctionName)) {
6482 return error(NameLoc, "redefinition of function '@" + FunctionName + "'");
6483 }
6484
6485 } else {
6486 // Handle @"", where a name is syntactically specified, but semantically
6487 // missing.
6488 if (FunctionNumber == (unsigned)-1)
6489 FunctionNumber = NumberedVals.getNext();
6490
6491 // If this is a definition of a forward referenced function, make sure the
6492 // types agree.
6493 auto I = ForwardRefValIDs.find(FunctionNumber);
6494 if (I != ForwardRefValIDs.end()) {
6495 FwdFn = I->second.first;
6496 if (FwdFn->getType() != PFT)
6497 return error(NameLoc, "type of definition and forward reference of '@" +
6498 Twine(FunctionNumber) +
6499 "' disagree: "
6500 "expected '" +
6501 getTypeString(PFT) + "' but was '" +
6502 getTypeString(FwdFn->getType()) + "'");
6503 ForwardRefValIDs.erase(I);
6504 }
6505 }
6506
6508 FunctionName, M);
6509
6510 assert(Fn->getAddressSpace() == AddrSpace && "Created function in wrong AS");
6511
6512 if (FunctionName.empty())
6513 NumberedVals.add(FunctionNumber, Fn);
6514
6516 maybeSetDSOLocal(DSOLocal, *Fn);
6519 Fn->setCallingConv(CC);
6520 Fn->setAttributes(PAL);
6521 Fn->setUnnamedAddr(UnnamedAddr);
6522 if (Alignment)
6523 Fn->setAlignment(*Alignment);
6524 Fn->setSection(Section);
6525 Fn->setPartition(Partition);
6526 Fn->setComdat(C);
6527 Fn->setPersonalityFn(PersonalityFn);
6528 if (!GC.empty()) Fn->setGC(GC);
6529 Fn->setPrefixData(Prefix);
6530 Fn->setPrologueData(Prologue);
6531 ForwardRefAttrGroups[Fn] = FwdRefAttrGrps;
6532
6533 // Add all of the arguments we parsed to the function.
6534 Function::arg_iterator ArgIt = Fn->arg_begin();
6535 for (unsigned i = 0, e = ArgList.size(); i != e; ++i, ++ArgIt) {
6536 // If the argument has a name, insert it into the argument symbol table.
6537 if (ArgList[i].Name.empty()) continue;
6538
6539 // Set the name, if it conflicted, it will be auto-renamed.
6540 ArgIt->setName(ArgList[i].Name);
6541
6542 if (ArgIt->getName() != ArgList[i].Name)
6543 return error(ArgList[i].Loc,
6544 "redefinition of argument '%" + ArgList[i].Name + "'");
6545 }
6546
6547 if (FwdFn) {
6548 FwdFn->replaceAllUsesWith(Fn);
6549 FwdFn->eraseFromParent();
6550 }
6551
6552 if (IsDefine)
6553 return false;
6554
6555 // Check the declaration has no block address forward references.
6556 ValID ID;
6557 if (FunctionName.empty()) {
6558 ID.Kind = ValID::t_GlobalID;
6559 ID.UIntVal = FunctionNumber;
6560 } else {
6561 ID.Kind = ValID::t_GlobalName;
6562 ID.StrVal = FunctionName;
6563 }
6564 auto Blocks = ForwardRefBlockAddresses.find(ID);
6565 if (Blocks != ForwardRefBlockAddresses.end())
6566 return error(Blocks->first.Loc,
6567 "cannot take blockaddress inside a declaration");
6568 return false;
6569}
6570
6571bool LLParser::PerFunctionState::resolveForwardRefBlockAddresses() {
6572 ValID ID;
6573 if (FunctionNumber == -1) {
6574 ID.Kind = ValID::t_GlobalName;
6575 ID.StrVal = std::string(F.getName());
6576 } else {
6577 ID.Kind = ValID::t_GlobalID;
6578 ID.UIntVal = FunctionNumber;
6579 }
6580
6581 auto Blocks = P.ForwardRefBlockAddresses.find(ID);
6582 if (Blocks == P.ForwardRefBlockAddresses.end())
6583 return false;
6584
6585 for (const auto &I : Blocks->second) {
6586 const ValID &BBID = I.first;
6587 GlobalValue *GV = I.second;
6588
6589 assert((BBID.Kind == ValID::t_LocalID || BBID.Kind == ValID::t_LocalName) &&
6590 "Expected local id or name");
6591 BasicBlock *BB;
6592 if (BBID.Kind == ValID::t_LocalName)
6593 BB = getBB(BBID.StrVal, BBID.Loc);
6594 else
6595 BB = getBB(BBID.UIntVal, BBID.Loc);
6596 if (!BB)
6597 return P.error(BBID.Loc, "referenced value is not a basic block");
6598
6599 Value *ResolvedVal = BlockAddress::get(&F, BB);
6600 ResolvedVal = P.checkValidVariableType(BBID.Loc, BBID.StrVal, GV->getType(),
6601 ResolvedVal);
6602 if (!ResolvedVal)
6603 return true;
6604 GV->replaceAllUsesWith(ResolvedVal);
6605 GV->eraseFromParent();
6606 }
6607
6608 P.ForwardRefBlockAddresses.erase(Blocks);
6609 return false;
6610}
6611
6612/// parseFunctionBody
6613/// ::= '{' BasicBlock+ UseListOrderDirective* '}'
6614bool LLParser::parseFunctionBody(Function &Fn, unsigned FunctionNumber,
6615 ArrayRef<unsigned> UnnamedArgNums) {
6616 if (Lex.getKind() != lltok::lbrace)
6617 return tokError("expected '{' in function body");
6618 Lex.Lex(); // eat the {.
6619
6620 PerFunctionState PFS(*this, Fn, FunctionNumber, UnnamedArgNums);
6621
6622 // Resolve block addresses and allow basic blocks to be forward-declared
6623 // within this function.
6624 if (PFS.resolveForwardRefBlockAddresses())
6625 return true;
6626 SaveAndRestore ScopeExit(BlockAddressPFS, &PFS);
6627
6628 // We need at least one basic block.
6629 if (Lex.getKind() == lltok::rbrace || Lex.getKind() == lltok::kw_uselistorder)
6630 return tokError("function body requires at least one basic block");
6631
6632 while (Lex.getKind() != lltok::rbrace &&
6634 if (parseBasicBlock(PFS))
6635 return true;
6636
6637 while (Lex.getKind() != lltok::rbrace)
6638 if (parseUseListOrder(&PFS))
6639 return true;
6640
6641 // Eat the }.
6642 Lex.Lex();
6643
6644 // Verify function is ok.
6645 return PFS.finishFunction();
6646}
6647
6648/// parseBasicBlock
6649/// ::= (LabelStr|LabelID)? Instruction*
6650bool LLParser::parseBasicBlock(PerFunctionState &PFS) {
6651 // If this basic block starts out with a name, remember it.
6652 std::string Name;
6653 int NameID = -1;
6654 LocTy NameLoc = Lex.getLoc();
6655 if (Lex.getKind() == lltok::LabelStr) {
6656 Name = Lex.getStrVal();
6657 Lex.Lex();
6658 } else if (Lex.getKind() == lltok::LabelID) {
6659 NameID = Lex.getUIntVal();
6660 Lex.Lex();
6661 }
6662
6663 BasicBlock *BB = PFS.defineBB(Name, NameID, NameLoc);
6664 if (!BB)
6665 return true;
6666
6667 std::string NameStr;
6668
6669 // Parse the instructions and debug values in this block until we get a
6670 // terminator.
6671 Instruction *Inst;
6672 auto DeleteDbgRecord = [](DbgRecord *DR) { DR->deleteRecord(); };
6673 using DbgRecordPtr = std::unique_ptr<DbgRecord, decltype(DeleteDbgRecord)>;
6674 SmallVector<DbgRecordPtr> TrailingDbgRecord;
6675 do {
6676 // Handle debug records first - there should always be an instruction
6677 // following the debug records, i.e. they cannot appear after the block
6678 // terminator.
6679 while (Lex.getKind() == lltok::hash) {
6680 if (SeenOldDbgInfoFormat)
6681 return error(Lex.getLoc(), "debug record should not appear in a module "
6682 "containing debug info intrinsics");
6683 if (!SeenNewDbgInfoFormat)
6684 M->setNewDbgInfoFormatFlag(true);
6685 SeenNewDbgInfoFormat = true;
6686 Lex.Lex();
6687
6688 DbgRecord *DR;
6689 if (parseDebugRecord(DR, PFS))
6690 return true;
6691 TrailingDbgRecord.emplace_back(DR, DeleteDbgRecord);
6692 }
6693
6694 // This instruction may have three possibilities for a name: a) none
6695 // specified, b) name specified "%foo =", c) number specified: "%4 =".
6696 LocTy NameLoc = Lex.getLoc();
6697 int NameID = -1;
6698 NameStr = "";
6699
6700 if (Lex.getKind() == lltok::LocalVarID) {
6701 NameID = Lex.getUIntVal();
6702 Lex.Lex();
6703 if (parseToken(lltok::equal, "expected '=' after instruction id"))
6704 return true;
6705 } else if (Lex.getKind() == lltok::LocalVar) {
6706 NameStr = Lex.getStrVal();
6707 Lex.Lex();
6708 if (parseToken(lltok::equal, "expected '=' after instruction name"))
6709 return true;
6710 }
6711
6712 switch (parseInstruction(Inst, BB, PFS)) {
6713 default:
6714 llvm_unreachable("Unknown parseInstruction result!");
6715 case InstError: return true;
6716 case InstNormal:
6717 Inst->insertInto(BB, BB->end());
6718
6719 // With a normal result, we check to see if the instruction is followed by
6720 // a comma and metadata.
6721 if (EatIfPresent(lltok::comma))
6722 if (parseInstructionMetadata(*Inst))
6723 return true;
6724 break;
6725 case InstExtraComma:
6726 Inst->insertInto(BB, BB->end());
6727
6728 // If the instruction parser ate an extra comma at the end of it, it
6729 // *must* be followed by metadata.
6730 if (parseInstructionMetadata(*Inst))
6731 return true;
6732 break;
6733 }
6734
6735 // Set the name on the instruction.
6736 if (PFS.setInstName(NameID, NameStr, NameLoc, Inst))
6737 return true;
6738
6739 // Attach any preceding debug values to this instruction.
6740 for (DbgRecordPtr &DR : TrailingDbgRecord)
6741 BB->insertDbgRecordBefore(DR.release(), Inst->getIterator());
6742 TrailingDbgRecord.clear();
6743 } while (!Inst->isTerminator());
6744
6745 assert(TrailingDbgRecord.empty() &&
6746 "All debug values should have been attached to an instruction.");
6747
6748 return false;
6749}
6750
6751/// parseDebugRecord
6752/// ::= #dbg_label '(' MDNode ')'
6753/// ::= #dbg_type '(' Metadata ',' MDNode ',' Metadata ','
6754/// (MDNode ',' Metadata ',' Metadata ',')? MDNode ')'
6755bool LLParser::parseDebugRecord(DbgRecord *&DR, PerFunctionState &PFS) {
6756 using RecordKind = DbgRecord::Kind;
6757 using LocType = DbgVariableRecord::LocationType;
6758 LocTy DVRLoc = Lex.getLoc();
6759 if (Lex.getKind() != lltok::DbgRecordType)
6760 return error(DVRLoc, "expected debug record type here");
6762 .Case("declare", RecordKind::ValueKind)
6763 .Case("value", RecordKind::ValueKind)
6764 .Case("assign", RecordKind::ValueKind)
6765 .Case("label", RecordKind::LabelKind);
6766
6767 // Parsing labels is trivial; parse here and early exit, otherwise go into the
6768 // full DbgVariableRecord processing stage.
6769 if (RecordType == RecordKind::LabelKind) {
6770 Lex.Lex();
6771 if (parseToken(lltok::lparen, "Expected '(' here"))
6772 return true;
6773 MDNode *Label;
6774 if (parseMDNode(Label))
6775 return true;
6776 if (parseToken(lltok::comma, "Expected ',' here"))
6777 return true;
6778 MDNode *DbgLoc;
6779 if (parseMDNode(DbgLoc))
6780 return true;
6781 if (parseToken(lltok::rparen, "Expected ')' here"))
6782 return true;
6784 return false;
6785 }
6786
6788 .Case("declare", LocType::Declare)
6789 .Case("value", LocType::Value)
6790 .Case("assign", LocType::Assign);
6791
6792 Lex.Lex();
6793 if (parseToken(lltok::lparen, "Expected '(' here"))
6794 return true;
6795
6796 // Parse Value field.
6797 Metadata *ValLocMD;
6798 if (parseMetadata(ValLocMD, &PFS))
6799 return true;
6800 if (parseToken(lltok::comma, "Expected ',' here"))
6801 return true;
6802
6803 // Parse Variable field.
6804 MDNode *Variable;
6805 if (parseMDNode(Variable))
6806 return true;
6807 if (parseToken(lltok::comma, "Expected ',' here"))
6808 return true;
6809
6810 // Parse Expression field.
6812 if (parseMDNode(Expression))
6813 return true;
6814 if (parseToken(lltok::comma, "Expected ',' here"))
6815 return true;
6816
6817 // Parse additional fields for #dbg_assign.
6818 MDNode *AssignID = nullptr;
6819 Metadata *AddressLocation = nullptr;
6820 MDNode *AddressExpression = nullptr;
6821 if (ValueType == LocType::Assign) {
6822 // Parse DIAssignID.
6823 if (parseMDNode(AssignID))
6824 return true;
6825 if (parseToken(lltok::comma, "Expected ',' here"))
6826 return true;
6827
6828 // Parse address ValueAsMetadata.
6829 if (parseMetadata(AddressLocation, &PFS))
6830 return true;
6831 if (parseToken(lltok::comma, "Expected ',' here"))
6832 return true;
6833
6834 // Parse address DIExpression.
6835 if (parseMDNode(AddressExpression))
6836 return true;
6837 if (parseToken(lltok::comma, "Expected ',' here"))
6838 return true;
6839 }
6840
6841 /// Parse DILocation.
6843 if (parseMDNode(DebugLoc))
6844 return true;
6845
6846 if (parseToken(lltok::rparen, "Expected ')' here"))
6847 return true;
6849 ValueType, ValLocMD, Variable, Expression, AssignID, AddressLocation,
6850 AddressExpression, DebugLoc);
6851 return false;
6852}
6853//===----------------------------------------------------------------------===//
6854// Instruction Parsing.
6855//===----------------------------------------------------------------------===//
6856
6857/// parseInstruction - parse one of the many different instructions.
6858///
6859int LLParser::parseInstruction(Instruction *&Inst, BasicBlock *BB,
6860 PerFunctionState &PFS) {
6861 lltok::Kind Token = Lex.getKind();
6862 if (Token == lltok::Eof)
6863 return tokError("found end of file when expecting more instructions");
6864 LocTy Loc = Lex.getLoc();
6865 unsigned KeywordVal = Lex.getUIntVal();
6866 Lex.Lex(); // Eat the keyword.
6867
6868 switch (Token) {
6869 default:
6870 return error(Loc, "expected instruction opcode");
6871 // Terminator Instructions.
6872 case lltok::kw_unreachable: Inst = new UnreachableInst(Context); return false;
6873 case lltok::kw_ret:
6874 return parseRet(Inst, BB, PFS);
6875 case lltok::kw_br:
6876 return parseBr(Inst, PFS);
6877 case lltok::kw_switch:
6878 return parseSwitch(Inst, PFS);
6880 return parseIndirectBr(Inst, PFS);
6881 case lltok::kw_invoke:
6882 return parseInvoke(Inst, PFS);
6883 case lltok::kw_resume:
6884 return parseResume(Inst, PFS);
6886 return parseCleanupRet(Inst, PFS);
6887 case lltok::kw_catchret:
6888 return parseCatchRet(Inst, PFS);
6890 return parseCatchSwitch(Inst, PFS);
6891 case lltok::kw_catchpad:
6892 return parseCatchPad(Inst, PFS);
6894 return parseCleanupPad(Inst, PFS);
6895 case lltok::kw_callbr:
6896 return parseCallBr(Inst, PFS);
6897 // Unary Operators.
6898 case lltok::kw_fneg: {
6899 FastMathFlags FMF = EatFastMathFlagsIfPresent();
6900 int Res = parseUnaryOp(Inst, PFS, KeywordVal, /*IsFP*/ true);
6901 if (Res != 0)
6902 return Res;
6903 if (FMF.any())
6904 Inst->setFastMathFlags(FMF);
6905 return false;
6906 }
6907 // Binary Operators.
6908 case lltok::kw_add:
6909 case lltok::kw_sub:
6910 case lltok::kw_mul:
6911 case lltok::kw_shl: {
6912 bool NUW = EatIfPresent(lltok::kw_nuw);
6913 bool NSW = EatIfPresent(lltok::kw_nsw);
6914 if (!NUW) NUW = EatIfPresent(lltok::kw_nuw);
6915
6916 if (parseArithmetic(Inst, PFS, KeywordVal, /*IsFP*/ false))
6917 return true;
6918
6919 if (NUW) cast<BinaryOperator>(Inst)->setHasNoUnsignedWrap(true);
6920 if (NSW) cast<BinaryOperator>(Inst)->setHasNoSignedWrap(true);
6921 return false;
6922 }
6923 case lltok::kw_fadd:
6924 case lltok::kw_fsub:
6925 case lltok::kw_fmul:
6926 case lltok::kw_fdiv:
6927 case lltok::kw_frem: {
6928 FastMathFlags FMF = EatFastMathFlagsIfPresent();
6929 int Res = parseArithmetic(Inst, PFS, KeywordVal, /*IsFP*/ true);
6930 if (Res != 0)
6931 return Res;
6932 if (FMF.any())
6933 Inst->setFastMathFlags(FMF);
6934 return 0;
6935 }
6936
6937 case lltok::kw_sdiv:
6938 case lltok::kw_udiv:
6939 case lltok::kw_lshr:
6940 case lltok::kw_ashr: {
6941 bool Exact = EatIfPresent(lltok::kw_exact);
6942
6943 if (parseArithmetic(Inst, PFS, KeywordVal, /*IsFP*/ false))
6944 return true;
6945 if (Exact) cast<BinaryOperator>(Inst)->setIsExact(true);
6946 return false;
6947 }
6948
6949 case lltok::kw_urem:
6950 case lltok::kw_srem:
6951 return parseArithmetic(Inst, PFS, KeywordVal,
6952 /*IsFP*/ false);
6953 case lltok::kw_or: {
6954 bool Disjoint = EatIfPresent(lltok::kw_disjoint);
6955 if (parseLogical(Inst, PFS, KeywordVal))
6956 return true;
6957 if (Disjoint)
6958 cast<PossiblyDisjointInst>(Inst)->setIsDisjoint(true);
6959 return false;
6960 }
6961 case lltok::kw_and:
6962 case lltok::kw_xor:
6963 return parseLogical(Inst, PFS, KeywordVal);
6964 case lltok::kw_icmp: {
6965 bool SameSign = EatIfPresent(lltok::kw_samesign);
6966 if (parseCompare(Inst, PFS, KeywordVal))
6967 return true;
6968 if (SameSign)
6969 cast<ICmpInst>(Inst)->setSameSign();
6970 return false;
6971 }
6972 case lltok::kw_fcmp: {
6973 FastMathFlags FMF = EatFastMathFlagsIfPresent();
6974 int Res = parseCompare(Inst, PFS, KeywordVal);
6975 if (Res != 0)
6976 return Res;
6977 if (FMF.any())
6978 Inst->setFastMathFlags(FMF);
6979 return 0;
6980 }
6981
6982 // Casts.
6983 case lltok::kw_uitofp:
6984 case lltok::kw_zext: {
6985 bool NonNeg = EatIfPresent(lltok::kw_nneg);
6986 bool Res = parseCast(Inst, PFS, KeywordVal);
6987 if (Res != 0)
6988 return Res;
6989 if (NonNeg)
6990 Inst->setNonNeg();
6991 return 0;
6992 }
6993 case lltok::kw_trunc: {
6994 bool NUW = EatIfPresent(lltok::kw_nuw);
6995 bool NSW = EatIfPresent(lltok::kw_nsw);
6996 if (!NUW)
6997 NUW = EatIfPresent(lltok::kw_nuw);
6998 if (parseCast(Inst, PFS, KeywordVal))
6999 return true;
7000 if (NUW)
7001 cast<TruncInst>(Inst)->setHasNoUnsignedWrap(true);
7002 if (NSW)
7003 cast<TruncInst>(Inst)->setHasNoSignedWrap(true);
7004 return false;
7005 }
7006 case lltok::kw_sext:
7007 case lltok::kw_bitcast:
7009 case lltok::kw_sitofp:
7010 case lltok::kw_fptoui:
7011 case lltok::kw_fptosi:
7012 case lltok::kw_inttoptr:
7013 case lltok::kw_ptrtoint:
7014 return parseCast(Inst, PFS, KeywordVal);
7015 case lltok::kw_fptrunc:
7016 case lltok::kw_fpext: {
7017 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7018 if (parseCast(Inst, PFS, KeywordVal))
7019 return true;
7020 if (FMF.any())
7021 Inst->setFastMathFlags(FMF);
7022 return false;
7023 }
7024
7025 // Other.
7026 case lltok::kw_select: {
7027 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7028 int Res = parseSelect(Inst, PFS);
7029 if (Res != 0)
7030 return Res;
7031 if (FMF.any()) {
7032 if (!isa<FPMathOperator>(Inst))
7033 return error(Loc, "fast-math-flags specified for select without "
7034 "floating-point scalar or vector return type");
7035 Inst->setFastMathFlags(FMF);
7036 }
7037 return 0;
7038 }
7039 case lltok::kw_va_arg:
7040 return parseVAArg(Inst, PFS);
7042 return parseExtractElement(Inst, PFS);
7044 return parseInsertElement(Inst, PFS);
7046 return parseShuffleVector(Inst, PFS);
7047 case lltok::kw_phi: {
7048 FastMathFlags FMF = EatFastMathFlagsIfPresent();
7049 int Res = parsePHI(Inst, PFS);
7050 if (Res != 0)
7051 return Res;
7052 if (FMF.any()) {
7053 if (!isa<FPMathOperator>(Inst))
7054 return error(Loc, "fast-math-flags specified for phi without "
7055 "floating-point scalar or vector return type");
7056 Inst->setFastMathFlags(FMF);
7057 }
7058 return 0;
7059 }
7061 return parseLandingPad(Inst, PFS);
7062 case lltok::kw_freeze:
7063 return parseFreeze(Inst, PFS);
7064 // Call.
7065 case lltok::kw_call:
7066 return parseCall(Inst, PFS, CallInst::TCK_None);
7067 case lltok::kw_tail:
7068 return parseCall(Inst, PFS, CallInst::TCK_Tail);
7069 case lltok::kw_musttail:
7070 return parseCall(Inst, PFS, CallInst::TCK_MustTail);
7071 case lltok::kw_notail:
7072 return parseCall(Inst, PFS, CallInst::TCK_NoTail);
7073 // Memory.
7074 case lltok::kw_alloca:
7075 return parseAlloc(Inst, PFS);
7076 case lltok::kw_load:
7077 return parseLoad(Inst, PFS);
7078 case lltok::kw_store:
7079 return parseStore(Inst, PFS);
7080 case lltok::kw_cmpxchg:
7081 return parseCmpXchg(Inst, PFS);
7083 return parseAtomicRMW(Inst, PFS);
7084 case lltok::kw_fence:
7085 return parseFence(Inst, PFS);
7087 return parseGetElementPtr(Inst, PFS);
7089 return parseExtractValue(Inst, PFS);
7091 return parseInsertValue(Inst, PFS);
7092 }
7093}
7094
7095/// parseCmpPredicate - parse an integer or fp predicate, based on Kind.
7096bool LLParser::parseCmpPredicate(unsigned &P, unsigned Opc) {
7097 if (Opc == Instruction::FCmp) {
7098 switch (Lex.getKind()) {
7099 default:
7100 return tokError("expected fcmp predicate (e.g. 'oeq')");
7101 case lltok::kw_oeq: P = CmpInst::FCMP_OEQ; break;
7102 case lltok::kw_one: P = CmpInst::FCMP_ONE; break;
7103 case lltok::kw_olt: P = CmpInst::FCMP_OLT; break;
7104 case lltok::kw_ogt: P = CmpInst::FCMP_OGT; break;
7105 case lltok::kw_ole: P = CmpInst::FCMP_OLE; break;
7106 case lltok::kw_oge: P = CmpInst::FCMP_OGE; break;
7107 case lltok::kw_ord: P = CmpInst::FCMP_ORD; break;
7108 case lltok::kw_uno: P = CmpInst::FCMP_UNO; break;
7109 case lltok::kw_ueq: P = CmpInst::FCMP_UEQ; break;
7110 case lltok::kw_une: P = CmpInst::FCMP_UNE; break;
7111 case lltok::kw_ult: P = CmpInst::FCMP_ULT; break;
7112 case lltok::kw_ugt: P = CmpInst::FCMP_UGT; break;
7113 case lltok::kw_ule: P = CmpInst::FCMP_ULE; break;
7114 case lltok::kw_uge: P = CmpInst::FCMP_UGE; break;
7115 case lltok::kw_true: P = CmpInst::FCMP_TRUE; break;
7116 case lltok::kw_false: P = CmpInst::FCMP_FALSE; break;
7117 }
7118 } else {
7119 switch (Lex.getKind()) {
7120 default:
7121 return tokError("expected icmp predicate (e.g. 'eq')");
7122 case lltok::kw_eq: P = CmpInst::ICMP_EQ; break;
7123 case lltok::kw_ne: P = CmpInst::ICMP_NE; break;
7124 case lltok::kw_slt: P = CmpInst::ICMP_SLT; break;
7125 case lltok::kw_sgt: P = CmpInst::ICMP_SGT; break;
7126 case lltok::kw_sle: P = CmpInst::ICMP_SLE; break;
7127 case lltok::kw_sge: P = CmpInst::ICMP_SGE; break;
7128 case lltok::kw_ult: P = CmpInst::ICMP_ULT; break;
7129 case lltok::kw_ugt: P = CmpInst::ICMP_UGT; break;
7130 case lltok::kw_ule: P = CmpInst::ICMP_ULE; break;
7131 case lltok::kw_uge: P = CmpInst::ICMP_UGE; break;
7132 }
7133 }
7134 Lex.Lex();
7135 return false;
7136}
7137
7138//===----------------------------------------------------------------------===//
7139// Terminator Instructions.
7140//===----------------------------------------------------------------------===//
7141
7142/// parseRet - parse a return instruction.
7143/// ::= 'ret' void (',' !dbg, !1)*
7144/// ::= 'ret' TypeAndValue (',' !dbg, !1)*
7145bool LLParser::parseRet(Instruction *&Inst, BasicBlock *BB,
7146 PerFunctionState &PFS) {
7147 SMLoc TypeLoc = Lex.getLoc();
7148 Type *Ty = nullptr;
7149 if (parseType(Ty, true /*void allowed*/))
7150 return true;
7151
7152 Type *ResType = PFS.getFunction().getReturnType();
7153
7154 if (Ty->isVoidTy()) {
7155 if (!ResType->isVoidTy())
7156 return error(TypeLoc, "value doesn't match function result type '" +
7157 getTypeString(ResType) + "'");
7158
7159 Inst = ReturnInst::Create(Context);
7160 return false;
7161 }
7162
7163 Value *RV;
7164 if (parseValue(Ty, RV, PFS))
7165 return true;
7166
7167 if (ResType != RV->getType())
7168 return error(TypeLoc, "value doesn't match function result type '" +
7169 getTypeString(ResType) + "'");
7170
7171 Inst = ReturnInst::Create(Context, RV);
7172 return false;
7173}
7174
7175/// parseBr
7176/// ::= 'br' TypeAndValue
7177/// ::= 'br' TypeAndValue ',' TypeAndValue ',' TypeAndValue
7178bool LLParser::parseBr(Instruction *&Inst, PerFunctionState &PFS) {
7179 LocTy Loc, Loc2;
7180 Value *Op0;
7181 BasicBlock *Op1, *Op2;
7182 if (parseTypeAndValue(Op0, Loc, PFS))
7183 return true;
7184
7185 if (BasicBlock *BB = dyn_cast<BasicBlock>(Op0)) {
7186 Inst = BranchInst::Create(BB);
7187 return false;
7188 }
7189
7190 if (Op0->getType() != Type::getInt1Ty(Context))
7191 return error(Loc, "branch condition must have 'i1' type");
7192
7193 if (parseToken(lltok::comma, "expected ',' after branch condition") ||
7194 parseTypeAndBasicBlock(Op1, Loc, PFS) ||
7195 parseToken(lltok::comma, "expected ',' after true destination") ||
7196 parseTypeAndBasicBlock(Op2, Loc2, PFS))
7197 return true;
7198
7199 Inst = BranchInst::Create(Op1, Op2, Op0);
7200 return false;
7201}
7202
7203/// parseSwitch
7204/// Instruction
7205/// ::= 'switch' TypeAndValue ',' TypeAndValue '[' JumpTable ']'
7206/// JumpTable
7207/// ::= (TypeAndValue ',' TypeAndValue)*
7208bool LLParser::parseSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7209 LocTy CondLoc, BBLoc;
7210 Value *Cond;
7211 BasicBlock *DefaultBB;
7212 if (parseTypeAndValue(Cond, CondLoc, PFS) ||
7213 parseToken(lltok::comma, "expected ',' after switch condition") ||
7214 parseTypeAndBasicBlock(DefaultBB, BBLoc, PFS) ||
7215 parseToken(lltok::lsquare, "expected '[' with switch table"))
7216 return true;
7217
7218 if (!Cond->getType()->isIntegerTy())
7219 return error(CondLoc, "switch condition must have integer type");
7220
7221 // parse the jump table pairs.
7222 SmallPtrSet<Value*, 32> SeenCases;
7224 while (Lex.getKind() != lltok::rsquare) {
7225 Value *Constant;
7226 BasicBlock *DestBB;
7227
7228 if (parseTypeAndValue(Constant, CondLoc, PFS) ||
7229 parseToken(lltok::comma, "expected ',' after case value") ||
7230 parseTypeAndBasicBlock(DestBB, PFS))
7231 return true;
7232
7233 if (!SeenCases.insert(Constant).second)
7234 return error(CondLoc, "duplicate case value in switch");
7235 if (!isa<ConstantInt>(Constant))
7236 return error(CondLoc, "case value is not a constant integer");
7237
7238 Table.push_back(std::make_pair(cast<ConstantInt>(Constant), DestBB));
7239 }
7240
7241 Lex.Lex(); // Eat the ']'.
7242
7243 SwitchInst *SI = SwitchInst::Create(Cond, DefaultBB, Table.size());
7244 for (unsigned i = 0, e = Table.size(); i != e; ++i)
7245 SI->addCase(Table[i].first, Table[i].second);
7246 Inst = SI;
7247 return false;
7248}
7249
7250/// parseIndirectBr
7251/// Instruction
7252/// ::= 'indirectbr' TypeAndValue ',' '[' LabelList ']'
7253bool LLParser::parseIndirectBr(Instruction *&Inst, PerFunctionState &PFS) {
7254 LocTy AddrLoc;
7255 Value *Address;
7256 if (parseTypeAndValue(Address, AddrLoc, PFS) ||
7257 parseToken(lltok::comma, "expected ',' after indirectbr address") ||
7258 parseToken(lltok::lsquare, "expected '[' with indirectbr"))
7259 return true;
7260
7261 if (!Address->getType()->isPointerTy())
7262 return error(AddrLoc, "indirectbr address must have pointer type");
7263
7264 // parse the destination list.
7266
7267 if (Lex.getKind() != lltok::rsquare) {
7268 BasicBlock *DestBB;
7269 if (parseTypeAndBasicBlock(DestBB, PFS))
7270 return true;
7271 DestList.push_back(DestBB);
7272
7273 while (EatIfPresent(lltok::comma)) {
7274 if (parseTypeAndBasicBlock(DestBB, PFS))
7275 return true;
7276 DestList.push_back(DestBB);
7277 }
7278 }
7279
7280 if (parseToken(lltok::rsquare, "expected ']' at end of block list"))
7281 return true;
7282
7284 for (BasicBlock *Dest : DestList)
7285 IBI->addDestination(Dest);
7286 Inst = IBI;
7287 return false;
7288}
7289
7290// If RetType is a non-function pointer type, then this is the short syntax
7291// for the call, which means that RetType is just the return type. Infer the
7292// rest of the function argument types from the arguments that are present.
7293bool LLParser::resolveFunctionType(Type *RetType, ArrayRef<ParamInfo> ArgList,
7294 FunctionType *&FuncTy) {
7295 FuncTy = dyn_cast<FunctionType>(RetType);
7296 if (!FuncTy) {
7297 // Pull out the types of all of the arguments...
7298 SmallVector<Type *, 8> ParamTypes;
7299 ParamTypes.reserve(ArgList.size());
7300 for (const ParamInfo &Arg : ArgList)
7301 ParamTypes.push_back(Arg.V->getType());
7302
7303 if (!FunctionType::isValidReturnType(RetType))
7304 return true;
7305
7306 FuncTy = FunctionType::get(RetType, ParamTypes, false);
7307 }
7308 return false;
7309}
7310
7311/// parseInvoke
7312/// ::= 'invoke' OptionalCallingConv OptionalAttrs Type Value ParamList
7313/// OptionalAttrs 'to' TypeAndValue 'unwind' TypeAndValue
7314bool LLParser::parseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
7315 LocTy CallLoc = Lex.getLoc();
7316 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
7317 std::vector<unsigned> FwdRefAttrGrps;
7318 LocTy NoBuiltinLoc;
7319 unsigned CC;
7320 unsigned InvokeAddrSpace;
7321 Type *RetType = nullptr;
7322 LocTy RetTypeLoc;
7323 ValID CalleeID;
7326
7327 BasicBlock *NormalBB, *UnwindBB;
7328 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7329 parseOptionalProgramAddrSpace(InvokeAddrSpace) ||
7330 parseType(RetType, RetTypeLoc, true /*void allowed*/) ||
7331 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
7332 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps, false,
7333 NoBuiltinLoc) ||
7334 parseOptionalOperandBundles(BundleList, PFS) ||
7335 parseToken(lltok::kw_to, "expected 'to' in invoke") ||
7336 parseTypeAndBasicBlock(NormalBB, PFS) ||
7337 parseToken(lltok::kw_unwind, "expected 'unwind' in invoke") ||
7338 parseTypeAndBasicBlock(UnwindBB, PFS))
7339 return true;
7340
7341 // If RetType is a non-function pointer type, then this is the short syntax
7342 // for the call, which means that RetType is just the return type. Infer the
7343 // rest of the function argument types from the arguments that are present.
7344 FunctionType *Ty;
7345 if (resolveFunctionType(RetType, ArgList, Ty))
7346 return error(RetTypeLoc, "Invalid result type for LLVM function");
7347
7348 CalleeID.FTy = Ty;
7349
7350 // Look up the callee.
7351 Value *Callee;
7352 if (convertValIDToValue(PointerType::get(Ty, InvokeAddrSpace), CalleeID,
7353 Callee, &PFS))
7354 return true;
7355
7356 // Set up the Attribute for the function.
7359
7360 // Loop through FunctionType's arguments and ensure they are specified
7361 // correctly. Also, gather any parameter attributes.
7362 FunctionType::param_iterator I = Ty->param_begin();
7363 FunctionType::param_iterator E = Ty->param_end();
7364 for (const ParamInfo &Arg : ArgList) {
7365 Type *ExpectedTy = nullptr;
7366 if (I != E) {
7367 ExpectedTy = *I++;
7368 } else if (!Ty->isVarArg()) {
7369 return error(Arg.Loc, "too many arguments specified");
7370 }
7371
7372 if (ExpectedTy && ExpectedTy != Arg.V->getType())
7373 return error(Arg.Loc, "argument is not of expected type '" +
7374 getTypeString(ExpectedTy) + "'");
7375 Args.push_back(Arg.V);
7376 ArgAttrs.push_back(Arg.Attrs);
7377 }
7378
7379 if (I != E)
7380 return error(CallLoc, "not enough parameters specified for call");
7381
7382 // Finish off the Attribute and check them
7383 AttributeList PAL =
7384 AttributeList::get(Context, AttributeSet::get(Context, FnAttrs),
7385 AttributeSet::get(Context, RetAttrs), ArgAttrs);
7386
7387 InvokeInst *II =
7388 InvokeInst::Create(Ty, Callee, NormalBB, UnwindBB, Args, BundleList);
7389 II->setCallingConv(CC);
7390 II->setAttributes(PAL);
7391 ForwardRefAttrGroups[II] = FwdRefAttrGrps;
7392 Inst = II;
7393 return false;
7394}
7395
7396/// parseResume
7397/// ::= 'resume' TypeAndValue
7398bool LLParser::parseResume(Instruction *&Inst, PerFunctionState &PFS) {
7399 Value *Exn; LocTy ExnLoc;
7400 if (parseTypeAndValue(Exn, ExnLoc, PFS))
7401 return true;
7402
7403 ResumeInst *RI = ResumeInst::Create(Exn);
7404 Inst = RI;
7405 return false;
7406}
7407
7408bool LLParser::parseExceptionArgs(SmallVectorImpl<Value *> &Args,
7409 PerFunctionState &PFS) {
7410 if (parseToken(lltok::lsquare, "expected '[' in catchpad/cleanuppad"))
7411 return true;
7412
7413 while (Lex.getKind() != lltok::rsquare) {
7414 // If this isn't the first argument, we need a comma.
7415 if (!Args.empty() &&
7416 parseToken(lltok::comma, "expected ',' in argument list"))
7417 return true;
7418
7419 // parse the argument.
7420 LocTy ArgLoc;
7421 Type *ArgTy = nullptr;
7422 if (parseType(ArgTy, ArgLoc))
7423 return true;
7424
7425 Value *V;
7426 if (ArgTy->isMetadataTy()) {
7427 if (parseMetadataAsValue(V, PFS))
7428 return true;
7429 } else {
7430 if (parseValue(ArgTy, V, PFS))
7431 return true;
7432 }
7433 Args.push_back(V);
7434 }
7435
7436 Lex.Lex(); // Lex the ']'.
7437 return false;
7438}
7439
7440/// parseCleanupRet
7441/// ::= 'cleanupret' from Value unwind ('to' 'caller' | TypeAndValue)
7442bool LLParser::parseCleanupRet(Instruction *&Inst, PerFunctionState &PFS) {
7443 Value *CleanupPad = nullptr;
7444
7445 if (parseToken(lltok::kw_from, "expected 'from' after cleanupret"))
7446 return true;
7447
7448 if (parseValue(Type::getTokenTy(Context), CleanupPad, PFS))
7449 return true;
7450
7451 if (parseToken(lltok::kw_unwind, "expected 'unwind' in cleanupret"))
7452 return true;
7453
7454 BasicBlock *UnwindBB = nullptr;
7455 if (Lex.getKind() == lltok::kw_to) {
7456 Lex.Lex();
7457 if (parseToken(lltok::kw_caller, "expected 'caller' in cleanupret"))
7458 return true;
7459 } else {
7460 if (parseTypeAndBasicBlock(UnwindBB, PFS)) {
7461 return true;
7462 }
7463 }
7464
7465 Inst = CleanupReturnInst::Create(CleanupPad, UnwindBB);
7466 return false;
7467}
7468
7469/// parseCatchRet
7470/// ::= 'catchret' from Parent Value 'to' TypeAndValue
7471bool LLParser::parseCatchRet(Instruction *&Inst, PerFunctionState &PFS) {
7472 Value *CatchPad = nullptr;
7473
7474 if (parseToken(lltok::kw_from, "expected 'from' after catchret"))
7475 return true;
7476
7477 if (parseValue(Type::getTokenTy(Context), CatchPad, PFS))
7478 return true;
7479
7480 BasicBlock *BB;
7481 if (parseToken(lltok::kw_to, "expected 'to' in catchret") ||
7482 parseTypeAndBasicBlock(BB, PFS))
7483 return true;
7484
7485 Inst = CatchReturnInst::Create(CatchPad, BB);
7486 return false;
7487}
7488
7489/// parseCatchSwitch
7490/// ::= 'catchswitch' within Parent
7491bool LLParser::parseCatchSwitch(Instruction *&Inst, PerFunctionState &PFS) {
7492 Value *ParentPad;
7493
7494 if (parseToken(lltok::kw_within, "expected 'within' after catchswitch"))
7495 return true;
7496
7497 if (Lex.getKind() != lltok::kw_none && Lex.getKind() != lltok::LocalVar &&
7498 Lex.getKind() != lltok::LocalVarID)
7499 return tokError("expected scope value for catchswitch");
7500
7501 if (parseValue(Type::getTokenTy(Context), ParentPad, PFS))
7502 return true;
7503
7504 if (parseToken(lltok::lsquare, "expected '[' with catchswitch labels"))
7505 return true;
7506
7508 do {
7509 BasicBlock *DestBB;
7510 if (parseTypeAndBasicBlock(DestBB, PFS))
7511 return true;
7512 Table.push_back(DestBB);
7513 } while (EatIfPresent(lltok::comma));
7514
7515 if (parseToken(lltok::rsquare, "expected ']' after catchswitch labels"))
7516 return true;
7517
7518 if (parseToken(lltok::kw_unwind, "expected 'unwind' after catchswitch scope"))
7519 return true;
7520
7521 BasicBlock *UnwindBB = nullptr;
7522 if (EatIfPresent(lltok::kw_to)) {
7523 if (parseToken(lltok::kw_caller, "expected 'caller' in catchswitch"))
7524 return true;
7525 } else {
7526 if (parseTypeAndBasicBlock(UnwindBB, PFS))
7527 return true;
7528 }
7529
7530 auto *CatchSwitch =
7531 CatchSwitchInst::Create(ParentPad, UnwindBB, Table.size());
7532 for (BasicBlock *DestBB : Table)
7533 CatchSwitch->addHandler(DestBB);
7534 Inst = CatchSwitch;
7535 return false;
7536}
7537
7538/// parseCatchPad
7539/// ::= 'catchpad' ParamList 'to' TypeAndValue 'unwind' TypeAndValue
7540bool LLParser::parseCatchPad(Instruction *&Inst, PerFunctionState &PFS) {
7541 Value *CatchSwitch = nullptr;
7542
7543 if (parseToken(lltok::kw_within, "expected 'within' after catchpad"))
7544 return true;
7545
7546 if (Lex.getKind() != lltok::LocalVar && Lex.getKind() != lltok::LocalVarID)
7547 return tokError("expected scope value for catchpad");
7548
7549 if (parseValue(Type::getTokenTy(Context), CatchSwitch, PFS))
7550 return true;
7551
7553 if (parseExceptionArgs(Args, PFS))
7554 return true;
7555
7556 Inst = CatchPadInst::Create(CatchSwitch, Args);
7557 return false;
7558}
7559
7560/// parseCleanupPad
7561/// ::= 'cleanuppad' within Parent ParamList
7562bool LLParser::parseCleanupPad(Instruction *&Inst, PerFunctionState &PFS) {
7563 Value *ParentPad = nullptr;
7564
7565 if (parseToken(lltok::kw_within, "expected 'within' after cleanuppad"))
7566 return true;
7567
7568 if (Lex.getKind() != lltok::kw_none && Lex.getKind() != lltok::LocalVar &&
7569 Lex.getKind() != lltok::LocalVarID)
7570 return tokError("expected scope value for cleanuppad");
7571
7572 if (parseValue(Type::getTokenTy(Context), ParentPad, PFS))
7573 return true;
7574
7576 if (parseExceptionArgs(Args, PFS))
7577 return true;
7578
7579 Inst = CleanupPadInst::Create(ParentPad, Args);
7580 return false;
7581}
7582
7583//===----------------------------------------------------------------------===//
7584// Unary Operators.
7585//===----------------------------------------------------------------------===//
7586
7587/// parseUnaryOp
7588/// ::= UnaryOp TypeAndValue ',' Value
7589///
7590/// If IsFP is false, then any integer operand is allowed, if it is true, any fp
7591/// operand is allowed.
7592bool LLParser::parseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
7593 unsigned Opc, bool IsFP) {
7594 LocTy Loc; Value *LHS;
7595 if (parseTypeAndValue(LHS, Loc, PFS))
7596 return true;
7597
7598 bool Valid = IsFP ? LHS->getType()->isFPOrFPVectorTy()
7600
7601 if (!Valid)
7602 return error(Loc, "invalid operand type for instruction");
7603
7605 return false;
7606}
7607
7608/// parseCallBr
7609/// ::= 'callbr' OptionalCallingConv OptionalAttrs Type Value ParamList
7610/// OptionalAttrs OptionalOperandBundles 'to' TypeAndValue
7611/// '[' LabelList ']'
7612bool LLParser::parseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
7613 LocTy CallLoc = Lex.getLoc();
7614 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
7615 std::vector<unsigned> FwdRefAttrGrps;
7616 LocTy NoBuiltinLoc;
7617 unsigned CC;
7618 Type *RetType = nullptr;
7619 LocTy RetTypeLoc;
7620 ValID CalleeID;
7623
7624 BasicBlock *DefaultDest;
7625 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
7626 parseType(RetType, RetTypeLoc, true /*void allowed*/) ||
7627 parseValID(CalleeID, &PFS) || parseParameterList(ArgList, PFS) ||
7628 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps, false,
7629 NoBuiltinLoc) ||
7630 parseOptionalOperandBundles(BundleList, PFS) ||
7631 parseToken(lltok::kw_to, "expected 'to' in callbr") ||
7632 parseTypeAndBasicBlock(DefaultDest, PFS) ||
7633 parseToken(lltok::lsquare, "expected '[' in callbr"))
7634 return true;
7635
7636 // parse the destination list.
7637 SmallVector<BasicBlock *, 16> IndirectDests;
7638
7639 if (Lex.getKind() != lltok::rsquare) {
7640 BasicBlock *DestBB;
7641 if (parseTypeAndBasicBlock(DestBB, PFS))
7642 return true;
7643 IndirectDests.push_back(DestBB);
7644
7645 while (EatIfPresent(lltok::comma)) {
7646 if (parseTypeAndBasicBlock(DestBB, PFS))
7647 return true;
7648 IndirectDests.push_back(DestBB);
7649 }
7650 }
7651
7652 if (parseToken(lltok::rsquare, "expected ']' at end of block list"))
7653 return true;
7654
7655 // If RetType is a non-function pointer type, then this is the short syntax
7656 // for the call, which means that RetType is just the return type. Infer the
7657 // rest of the function argument types from the arguments that are present.
7658 FunctionType *Ty;
7659 if (resolveFunctionType(RetType, ArgList, Ty))
7660 return error(RetTypeLoc, "Invalid result type for LLVM function");
7661
7662 CalleeID.FTy = Ty;
7663
7664 // Look up the callee.
7665 Value *Callee;
7666 if (convertValIDToValue(PointerType::getUnqual(Ty), CalleeID, Callee, &PFS))
7667 return true;
7668
7669 // Set up the Attribute for the function.
7672
7673 // Loop through FunctionType's arguments and ensure they are specified
7674 // correctly. Also, gather any parameter attributes.
7675 FunctionType::param_iterator I = Ty->param_begin();
7676 FunctionType::param_iterator E = Ty->param_end();
7677 for (const ParamInfo &Arg : ArgList) {
7678 Type *ExpectedTy = nullptr;
7679 if (I != E) {
7680 ExpectedTy = *I++;
7681 } else if (!Ty->isVarArg()) {
7682 return error(Arg.Loc, "too many arguments specified");
7683 }
7684
7685 if (ExpectedTy && ExpectedTy != Arg.V->getType())
7686 return error(Arg.Loc, "argument is not of expected type '" +
7687 getTypeString(ExpectedTy) + "'");
7688 Args.push_back(Arg.V);
7689 ArgAttrs.push_back(Arg.Attrs);
7690 }
7691
7692 if (I != E)
7693 return error(CallLoc, "not enough parameters specified for call");
7694
7695 // Finish off the Attribute and check them
7696 AttributeList PAL =
7697 AttributeList::get(Context, AttributeSet::get(Context, FnAttrs),
7698 AttributeSet::get(Context, RetAttrs), ArgAttrs);
7699
7700 CallBrInst *CBI =
7701 CallBrInst::Create(Ty, Callee, DefaultDest, IndirectDests, Args,
7702 BundleList);
7703 CBI->setCallingConv(CC);
7704 CBI->setAttributes(PAL);
7705 ForwardRefAttrGroups[CBI] = FwdRefAttrGrps;
7706 Inst = CBI;
7707 return false;
7708}
7709
7710//===----------------------------------------------------------------------===//
7711// Binary Operators.
7712//===----------------------------------------------------------------------===//
7713
7714/// parseArithmetic
7715/// ::= ArithmeticOps TypeAndValue ',' Value
7716///
7717/// If IsFP is false, then any integer operand is allowed, if it is true, any fp
7718/// operand is allowed.
7719bool LLParser::parseArithmetic(Instruction *&Inst, PerFunctionState &PFS,
7720 unsigned Opc, bool IsFP) {
7721 LocTy Loc; Value *LHS, *RHS;
7722 if (parseTypeAndValue(LHS, Loc, PFS) ||
7723 parseToken(lltok::comma, "expected ',' in arithmetic operation") ||
7724 parseValue(LHS->getType(), RHS, PFS))
7725 return true;
7726
7727 bool Valid = IsFP ? LHS->getType()->isFPOrFPVectorTy()
7729
7730 if (!Valid)
7731 return error(Loc, "invalid operand type for instruction");
7732
7733 Inst = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS);
7734 return false;
7735}
7736
7737/// parseLogical
7738/// ::= ArithmeticOps TypeAndValue ',' Value {
7739bool LLParser::parseLogical(Instruction *&Inst, PerFunctionState &PFS,
7740 unsigned Opc) {
7741 LocTy Loc; Value *LHS, *RHS;
7742 if (parseTypeAndValue(LHS, Loc, PFS) ||
7743 parseToken(lltok::comma, "expected ',' in logical operation") ||
7744 parseValue(LHS->getType(), RHS, PFS))
7745 return true;
7746
7747 if (!LHS->getType()->isIntOrIntVectorTy())
7748 return error(Loc,
7749 "instruction requires integer or integer vector operands");
7750
7751 Inst = BinaryOperator::Create((Instruction::BinaryOps)Opc, LHS, RHS);
7752 return false;
7753}
7754
7755/// parseCompare
7756/// ::= 'icmp' IPredicates TypeAndValue ',' Value
7757/// ::= 'fcmp' FPredicates TypeAndValue ',' Value
7758bool LLParser::parseCompare(Instruction *&Inst, PerFunctionState &PFS,
7759 unsigned Opc) {
7760 // parse the integer/fp comparison predicate.
7761 LocTy Loc;
7762 unsigned Pred;
7763 Value *LHS, *RHS;
7764 if (parseCmpPredicate(Pred, Opc) || parseTypeAndValue(LHS, Loc, PFS) ||
7765 parseToken(lltok::comma, "expected ',' after compare value") ||
7766 parseValue(LHS->getType(), RHS, PFS))
7767 return true;
7768
7769 if (Opc == Instruction::FCmp) {
7770 if (!LHS->getType()->isFPOrFPVectorTy())
7771 return error(Loc, "fcmp requires floating point operands");
7772 Inst = new FCmpInst(CmpInst::Predicate(Pred), LHS, RHS);
7773 } else {
7774 assert(Opc == Instruction::ICmp && "Unknown opcode for CmpInst!");
7775 if (!LHS->getType()->isIntOrIntVectorTy() &&
7777 return error(Loc, "icmp requires integer operands");
7778 Inst = new ICmpInst(CmpInst::Predicate(Pred), LHS, RHS);
7779 }
7780 return false;
7781}
7782
7783//===----------------------------------------------------------------------===//
7784// Other Instructions.
7785//===----------------------------------------------------------------------===//
7786
7787/// parseCast
7788/// ::= CastOpc TypeAndValue 'to' Type
7789bool LLParser::parseCast(Instruction *&Inst, PerFunctionState &PFS,
7790 unsigned Opc) {
7791 LocTy Loc;
7792 Value *Op;
7793 Type *DestTy = nullptr;
7794 if (parseTypeAndValue(Op, Loc, PFS) ||
7795 parseToken(lltok::kw_to, "expected 'to' after cast value") ||
7796 parseType(DestTy))
7797 return true;
7798
7799 if (!CastInst::castIsValid((Instruction::CastOps)Opc, Op, DestTy))
7800 return error(Loc, "invalid cast opcode for cast from '" +
7801 getTypeString(Op->getType()) + "' to '" +
7802 getTypeString(DestTy) + "'");
7803 Inst = CastInst::Create((Instruction::CastOps)Opc, Op, DestTy);
7804 return false;
7805}
7806
7807/// parseSelect
7808/// ::= 'select' TypeAndValue ',' TypeAndValue ',' TypeAndValue
7809bool LLParser::parseSelect(Instruction *&Inst, PerFunctionState &PFS) {
7810 LocTy Loc;
7811 Value *Op0, *Op1, *Op2;
7812 if (parseTypeAndValue(Op0, Loc, PFS) ||
7813 parseToken(lltok::comma, "expected ',' after select condition") ||
7814 parseTypeAndValue(Op1, PFS) ||
7815 parseToken(lltok::comma, "expected ',' after select value") ||
7816 parseTypeAndValue(Op2, PFS))
7817 return true;
7818
7819 if (const char *Reason = SelectInst::areInvalidOperands(Op0, Op1, Op2))
7820 return error(Loc, Reason);
7821
7822 Inst = SelectInst::Create(Op0, Op1, Op2);
7823 return false;
7824}
7825
7826/// parseVAArg
7827/// ::= 'va_arg' TypeAndValue ',' Type
7828bool LLParser::parseVAArg(Instruction *&Inst, PerFunctionState &PFS) {
7829 Value *Op;
7830 Type *EltTy = nullptr;
7831 LocTy TypeLoc;
7832 if (parseTypeAndValue(Op, PFS) ||
7833 parseToken(lltok::comma, "expected ',' after vaarg operand") ||
7834 parseType(EltTy, TypeLoc))
7835 return true;
7836
7837 if (!EltTy->isFirstClassType())
7838 return error(TypeLoc, "va_arg requires operand with first class type");
7839
7840 Inst = new VAArgInst(Op, EltTy);
7841 return false;
7842}
7843
7844/// parseExtractElement
7845/// ::= 'extractelement' TypeAndValue ',' TypeAndValue
7846bool LLParser::parseExtractElement(Instruction *&Inst, PerFunctionState &PFS) {
7847 LocTy Loc;
7848 Value *Op0, *Op1;
7849 if (parseTypeAndValue(Op0, Loc, PFS) ||
7850 parseToken(lltok::comma, "expected ',' after extract value") ||
7851 parseTypeAndValue(Op1, PFS))
7852 return true;
7853
7855 return error(Loc, "invalid extractelement operands");
7856
7857 Inst = ExtractElementInst::Create(Op0, Op1);
7858 return false;
7859}
7860
7861/// parseInsertElement
7862/// ::= 'insertelement' TypeAndValue ',' TypeAndValue ',' TypeAndValue
7863bool LLParser::parseInsertElement(Instruction *&Inst, PerFunctionState &PFS) {
7864 LocTy Loc;
7865 Value *Op0, *Op1, *Op2;
7866 if (parseTypeAndValue(Op0, Loc, PFS) ||
7867 parseToken(lltok::comma, "expected ',' after insertelement value") ||
7868 parseTypeAndValue(Op1, PFS) ||
7869 parseToken(lltok::comma, "expected ',' after insertelement value") ||
7870 parseTypeAndValue(Op2, PFS))
7871 return true;
7872
7873 if (!InsertElementInst::isValidOperands(Op0, Op1, Op2))
7874 return error(Loc, "invalid insertelement operands");
7875
7876 Inst = InsertElementInst::Create(Op0, Op1, Op2);
7877 return false;
7878}
7879
7880/// parseShuffleVector
7881/// ::= 'shufflevector' TypeAndValue ',' TypeAndValue ',' TypeAndValue
7882bool LLParser::parseShuffleVector(Instruction *&Inst, PerFunctionState &PFS) {
7883 LocTy Loc;
7884 Value *Op0, *Op1, *Op2;
7885 if (parseTypeAndValue(Op0, Loc, PFS) ||
7886 parseToken(lltok::comma, "expected ',' after shuffle mask") ||
7887 parseTypeAndValue(Op1, PFS) ||
7888 parseToken(lltok::comma, "expected ',' after shuffle value") ||
7889 parseTypeAndValue(Op2, PFS))
7890 return true;
7891
7892 if (!ShuffleVectorInst::isValidOperands(Op0, Op1, Op2))
7893 return error(Loc, "invalid shufflevector operands");
7894
7895 Inst = new ShuffleVectorInst(Op0, Op1, Op2);
7896 return false;
7897}
7898
7899/// parsePHI
7900/// ::= 'phi' Type '[' Value ',' Value ']' (',' '[' Value ',' Value ']')*
7901int LLParser::parsePHI(Instruction *&Inst, PerFunctionState &PFS) {
7902 Type *Ty = nullptr; LocTy TypeLoc;
7903 Value *Op0, *Op1;
7904
7905 if (parseType(Ty, TypeLoc))
7906 return true;
7907
7908 if (!Ty->isFirstClassType())
7909 return error(TypeLoc, "phi node must have first class type");
7910
7911 bool First = true;
7912 bool AteExtraComma = false;
7914
7915 while (true) {
7916 if (First) {
7917 if (Lex.getKind() != lltok::lsquare)
7918 break;
7919 First = false;
7920 } else if (!EatIfPresent(lltok::comma))
7921 break;
7922
7923 if (Lex.getKind() == lltok::MetadataVar) {
7924 AteExtraComma = true;
7925 break;
7926 }
7927
7928 if (parseToken(lltok::lsquare, "expected '[' in phi value list") ||
7929 parseValue(Ty, Op0, PFS) ||
7930 parseToken(lltok::comma, "expected ',' after insertelement value") ||
7931 parseValue(Type::getLabelTy(Context), Op1, PFS) ||
7932 parseToken(lltok::rsquare, "expected ']' in phi value list"))
7933 return true;
7934
7935 PHIVals.push_back(std::make_pair(Op0, cast<BasicBlock>(Op1)));
7936 }
7937
7938 PHINode *PN = PHINode::Create(Ty, PHIVals.size());
7939 for (unsigned i = 0, e = PHIVals.size(); i != e; ++i)
7940 PN->addIncoming(PHIVals[i].first, PHIVals[i].second);
7941 Inst = PN;
7942 return AteExtraComma ? InstExtraComma : InstNormal;
7943}
7944
7945/// parseLandingPad
7946/// ::= 'landingpad' Type 'personality' TypeAndValue 'cleanup'? Clause+
7947/// Clause
7948/// ::= 'catch' TypeAndValue
7949/// ::= 'filter'
7950/// ::= 'filter' TypeAndValue ( ',' TypeAndValue )*
7951bool LLParser::parseLandingPad(Instruction *&Inst, PerFunctionState &PFS) {
7952 Type *Ty = nullptr; LocTy TyLoc;
7953
7954 if (parseType(Ty, TyLoc))
7955 return true;
7956
7957 std::unique_ptr<LandingPadInst> LP(LandingPadInst::Create(Ty, 0));
7958 LP->setCleanup(EatIfPresent(lltok::kw_cleanup));
7959
7960 while (Lex.getKind() == lltok::kw_catch || Lex.getKind() == lltok::kw_filter){
7962 if (EatIfPresent(lltok::kw_catch))
7964 else if (EatIfPresent(lltok::kw_filter))
7966 else
7967 return tokError("expected 'catch' or 'filter' clause type");
7968
7969 Value *V;
7970 LocTy VLoc;
7971 if (parseTypeAndValue(V, VLoc, PFS))
7972 return true;
7973
7974 // A 'catch' type expects a non-array constant. A filter clause expects an
7975 // array constant.
7976 if (CT == LandingPadInst::Catch) {
7977 if (isa<ArrayType>(V->getType()))
7978 return error(VLoc, "'catch' clause has an invalid type");
7979 } else {
7980 if (!isa<ArrayType>(V->getType()))
7981 return error(VLoc, "'filter' clause has an invalid type");
7982 }
7983
7984 Constant *CV = dyn_cast<Constant>(V);
7985 if (!CV)
7986 return error(VLoc, "clause argument must be a constant");
7987 LP->addClause(CV);
7988 }
7989
7990 Inst = LP.release();
7991 return false;
7992}
7993
7994/// parseFreeze
7995/// ::= 'freeze' Type Value
7996bool LLParser::parseFreeze(Instruction *&Inst, PerFunctionState &PFS) {
7997 LocTy Loc;
7998 Value *Op;
7999 if (parseTypeAndValue(Op, Loc, PFS))
8000 return true;
8001
8002 Inst = new FreezeInst(Op);
8003 return false;
8004}
8005
8006/// parseCall
8007/// ::= 'call' OptionalFastMathFlags OptionalCallingConv
8008/// OptionalAttrs Type Value ParameterList OptionalAttrs
8009/// ::= 'tail' 'call' OptionalFastMathFlags OptionalCallingConv
8010/// OptionalAttrs Type Value ParameterList OptionalAttrs
8011/// ::= 'musttail' 'call' OptionalFastMathFlags OptionalCallingConv
8012/// OptionalAttrs Type Value ParameterList OptionalAttrs
8013/// ::= 'notail' 'call' OptionalFastMathFlags OptionalCallingConv
8014/// OptionalAttrs Type Value ParameterList OptionalAttrs
8015bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS,
8017 AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
8018 std::vector<unsigned> FwdRefAttrGrps;
8019 LocTy BuiltinLoc;
8020 unsigned CallAddrSpace;
8021 unsigned CC;
8022 Type *RetType = nullptr;
8023 LocTy RetTypeLoc;
8024 ValID CalleeID;
8027 LocTy CallLoc = Lex.getLoc();
8028
8029 if (TCK != CallInst::TCK_None &&
8030 parseToken(lltok::kw_call,
8031 "expected 'tail call', 'musttail call', or 'notail call'"))
8032 return true;
8033
8034 FastMathFlags FMF = EatFastMathFlagsIfPresent();
8035
8036 if (parseOptionalCallingConv(CC) || parseOptionalReturnAttrs(RetAttrs) ||
8037 parseOptionalProgramAddrSpace(CallAddrSpace) ||
8038 parseType(RetType, RetTypeLoc, true /*void allowed*/) ||
8039 parseValID(CalleeID, &PFS) ||
8040 parseParameterList(ArgList, PFS, TCK == CallInst::TCK_MustTail,
8041 PFS.getFunction().isVarArg()) ||
8042 parseFnAttributeValuePairs(FnAttrs, FwdRefAttrGrps, false, BuiltinLoc) ||
8043 parseOptionalOperandBundles(BundleList, PFS))
8044 return true;
8045
8046 // If RetType is a non-function pointer type, then this is the short syntax
8047 // for the call, which means that RetType is just the return type. Infer the
8048 // rest of the function argument types from the arguments that are present.
8049 FunctionType *Ty;
8050 if (resolveFunctionType(RetType, ArgList, Ty))
8051 return error(RetTypeLoc, "Invalid result type for LLVM function");
8052
8053 CalleeID.FTy = Ty;
8054
8055 // Look up the callee.
8056 Value *Callee;
8057 if (convertValIDToValue(PointerType::get(Ty, CallAddrSpace), CalleeID, Callee,
8058 &PFS))
8059 return true;
8060
8061 // Set up the Attribute for the function.
8063
8065
8066 // Loop through FunctionType's arguments and ensure they are specified
8067 // correctly. Also, gather any parameter attributes.
8068 FunctionType::param_iterator I = Ty->param_begin();
8069 FunctionType::param_iterator E = Ty->param_end();
8070 for (const ParamInfo &Arg : ArgList) {
8071 Type *ExpectedTy = nullptr;
8072 if (I != E) {
8073 ExpectedTy = *I++;
8074 } else if (!Ty->isVarArg()) {
8075 return error(Arg.Loc, "too many arguments specified");
8076 }
8077
8078 if (ExpectedTy && ExpectedTy != Arg.V->getType())
8079 return error(Arg.Loc, "argument is not of expected type '" +
8080 getTypeString(ExpectedTy) + "'");
8081 Args.push_back(Arg.V);
8082 Attrs.push_back(Arg.Attrs);
8083 }
8084
8085 if (I != E)
8086 return error(CallLoc, "not enough parameters specified for call");
8087
8088 // Finish off the Attribute and check them
8089 AttributeList PAL =
8090 AttributeList::get(Context, AttributeSet::get(Context, FnAttrs),
8091 AttributeSet::get(Context, RetAttrs), Attrs);
8092
8093 CallInst *CI = CallInst::Create(Ty, Callee, Args, BundleList);
8094 CI->setTailCallKind(TCK);
8095 CI->setCallingConv(CC);
8096 if (FMF.any()) {
8097 if (!isa<FPMathOperator>(CI)) {
8098 CI->deleteValue();
8099 return error(CallLoc, "fast-math-flags specified for call without "
8100 "floating-point scalar or vector return type");
8101 }
8102 CI->setFastMathFlags(FMF);
8103 }
8104
8105 if (CalleeID.Kind == ValID::t_GlobalName &&
8106 isOldDbgFormatIntrinsic(CalleeID.StrVal)) {
8107 if (SeenNewDbgInfoFormat) {
8108 CI->deleteValue();
8109 return error(CallLoc, "llvm.dbg intrinsic should not appear in a module "
8110 "using non-intrinsic debug info");
8111 }
8112 if (!SeenOldDbgInfoFormat)
8113 M->setNewDbgInfoFormatFlag(false);
8114 SeenOldDbgInfoFormat = true;
8115 }
8116 CI->setAttributes(PAL);
8117 ForwardRefAttrGroups[CI] = FwdRefAttrGrps;
8118 Inst = CI;
8119 return false;
8120}
8121
8122//===----------------------------------------------------------------------===//
8123// Memory Instructions.
8124//===----------------------------------------------------------------------===//
8125
8126/// parseAlloc
8127/// ::= 'alloca' 'inalloca'? 'swifterror'? Type (',' TypeAndValue)?
8128/// (',' 'align' i32)? (',', 'addrspace(n))?
8129int LLParser::parseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
8130 Value *Size = nullptr;
8131 LocTy SizeLoc, TyLoc, ASLoc;
8132 MaybeAlign Alignment;
8133 unsigned AddrSpace = 0;
8134 Type *Ty = nullptr;
8135
8136 bool IsInAlloca = EatIfPresent(lltok::kw_inalloca);
8137 bool IsSwiftError = EatIfPresent(lltok::kw_swifterror);
8138
8139 if (parseType(Ty, TyLoc))
8140 return true;
8141
8143 return error(TyLoc, "invalid type for alloca");
8144
8145 bool AteExtraComma = false;
8146 if (EatIfPresent(lltok::comma)) {
8147 if (Lex.getKind() == lltok::kw_align) {
8148 if (parseOptionalAlignment(Alignment))
8149 return true;
8150 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8151 return true;
8152 } else if (Lex.getKind() == lltok::kw_addrspace) {
8153 ASLoc = Lex.getLoc();
8154 if (parseOptionalAddrSpace(AddrSpace))
8155 return true;
8156 } else if (Lex.getKind() == lltok::MetadataVar) {
8157 AteExtraComma = true;
8158 } else {
8159 if (parseTypeAndValue(Size, SizeLoc, PFS))
8160 return true;
8161 if (EatIfPresent(lltok::comma)) {
8162 if (Lex.getKind() == lltok::kw_align) {
8163 if (parseOptionalAlignment(Alignment))
8164 return true;
8165 if (parseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
8166 return true;
8167 } else if (Lex.getKind() == lltok::kw_addrspace) {
8168 ASLoc = Lex.getLoc();
8169 if (parseOptionalAddrSpace(AddrSpace))
8170 return true;
8171 } else if (Lex.getKind() == lltok::MetadataVar) {
8172 AteExtraComma = true;
8173 }
8174 }
8175 }
8176 }
8177
8178 if (Size && !Size->getType()->isIntegerTy())
8179 return error(SizeLoc, "element count must have integer type");
8180
8181 SmallPtrSet<Type *, 4> Visited;
8182 if (!Alignment && !Ty->isSized(&Visited))
8183 return error(TyLoc, "Cannot allocate unsized type");
8184 if (!Alignment)
8185 Alignment = M->getDataLayout().getPrefTypeAlign(Ty);
8186 AllocaInst *AI = new AllocaInst(Ty, AddrSpace, Size, *Alignment);
8187 AI->setUsedWithInAlloca(IsInAlloca);
8188 AI->setSwiftError(IsSwiftError);
8189 Inst = AI;
8190 return AteExtraComma ? InstExtraComma : InstNormal;
8191}
8192
8193/// parseLoad
8194/// ::= 'load' 'volatile'? TypeAndValue (',' 'align' i32)?
8195/// ::= 'load' 'atomic' 'volatile'? TypeAndValue
8196/// 'singlethread'? AtomicOrdering (',' 'align' i32)?
8197int LLParser::parseLoad(Instruction *&Inst, PerFunctionState &PFS) {
8198 Value *Val; LocTy Loc;
8199 MaybeAlign Alignment;
8200 bool AteExtraComma = false;
8201 bool isAtomic = false;
8204
8205 if (Lex.getKind() == lltok::kw_atomic) {
8206 isAtomic = true;
8207 Lex.Lex();
8208 }
8209
8210 bool isVolatile = false;
8211 if (Lex.getKind() == lltok::kw_volatile) {
8212 isVolatile = true;
8213 Lex.Lex();
8214 }
8215
8216 Type *Ty;
8217 LocTy ExplicitTypeLoc = Lex.getLoc();
8218 if (parseType(Ty) ||
8219 parseToken(lltok::comma, "expected comma after load's type") ||
8220 parseTypeAndValue(Val, Loc, PFS) ||
8221 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8222 parseOptionalCommaAlign(Alignment, AteExtraComma))
8223 return true;
8224
8225 if (!Val->getType()->isPointerTy() || !Ty->isFirstClassType())
8226 return error(Loc, "load operand must be a pointer to a first class type");
8227 if (isAtomic && !Alignment)
8228 return error(Loc, "atomic load must have explicit non-zero alignment");
8229 if (Ordering == AtomicOrdering::Release ||
8231 return error(Loc, "atomic load cannot use Release ordering");
8232
8233 SmallPtrSet<Type *, 4> Visited;
8234 if (!Alignment && !Ty->isSized(&Visited))
8235 return error(ExplicitTypeLoc, "loading unsized types is not allowed");
8236 if (!Alignment)
8237 Alignment = M->getDataLayout().getABITypeAlign(Ty);
8238 Inst = new LoadInst(Ty, Val, "", isVolatile, *Alignment, Ordering, SSID);
8239 return AteExtraComma ? InstExtraComma : InstNormal;
8240}
8241
8242/// parseStore
8243
8244/// ::= 'store' 'volatile'? TypeAndValue ',' TypeAndValue (',' 'align' i32)?
8245/// ::= 'store' 'atomic' 'volatile'? TypeAndValue ',' TypeAndValue
8246/// 'singlethread'? AtomicOrdering (',' 'align' i32)?
8247int LLParser::parseStore(Instruction *&Inst, PerFunctionState &PFS) {
8248 Value *Val, *Ptr; LocTy Loc, PtrLoc;
8249 MaybeAlign Alignment;
8250 bool AteExtraComma = false;
8251 bool isAtomic = false;
8254
8255 if (Lex.getKind() == lltok::kw_atomic) {
8256 isAtomic = true;
8257 Lex.Lex();
8258 }
8259
8260 bool isVolatile = false;
8261 if (Lex.getKind() == lltok::kw_volatile) {
8262 isVolatile = true;
8263 Lex.Lex();
8264 }
8265
8266 if (parseTypeAndValue(Val, Loc, PFS) ||
8267 parseToken(lltok::comma, "expected ',' after store operand") ||
8268 parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8269 parseScopeAndOrdering(isAtomic, SSID, Ordering) ||
8270 parseOptionalCommaAlign(Alignment, AteExtraComma))
8271 return true;
8272
8273 if (!Ptr->getType()->isPointerTy())
8274 return error(PtrLoc, "store operand must be a pointer");
8275 if (!Val->getType()->isFirstClassType())
8276 return error(Loc, "store operand must be a first class value");
8277 if (isAtomic && !Alignment)
8278 return error(Loc, "atomic store must have explicit non-zero alignment");
8279 if (Ordering == AtomicOrdering::Acquire ||
8281 return error(Loc, "atomic store cannot use Acquire ordering");
8282 SmallPtrSet<Type *, 4> Visited;
8283 if (!Alignment && !Val->getType()->isSized(&Visited))
8284 return error(Loc, "storing unsized types is not allowed");
8285 if (!Alignment)
8286 Alignment = M->getDataLayout().getABITypeAlign(Val->getType());
8287
8288 Inst = new StoreInst(Val, Ptr, isVolatile, *Alignment, Ordering, SSID);
8289 return AteExtraComma ? InstExtraComma : InstNormal;
8290}
8291
8292/// parseCmpXchg
8293/// ::= 'cmpxchg' 'weak'? 'volatile'? TypeAndValue ',' TypeAndValue ','
8294/// TypeAndValue 'singlethread'? AtomicOrdering AtomicOrdering ','
8295/// 'Align'?
8296int LLParser::parseCmpXchg(Instruction *&Inst, PerFunctionState &PFS) {
8297 Value *Ptr, *Cmp, *New; LocTy PtrLoc, CmpLoc, NewLoc;
8298 bool AteExtraComma = false;
8299 AtomicOrdering SuccessOrdering = AtomicOrdering::NotAtomic;
8300 AtomicOrdering FailureOrdering = AtomicOrdering::NotAtomic;
8302 bool isVolatile = false;
8303 bool isWeak = false;
8304 MaybeAlign Alignment;
8305
8306 if (EatIfPresent(lltok::kw_weak))
8307 isWeak = true;
8308
8309 if (EatIfPresent(lltok::kw_volatile))
8310 isVolatile = true;
8311
8312 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8313 parseToken(lltok::comma, "expected ',' after cmpxchg address") ||
8314 parseTypeAndValue(Cmp, CmpLoc, PFS) ||
8315 parseToken(lltok::comma, "expected ',' after cmpxchg cmp operand") ||
8316 parseTypeAndValue(New, NewLoc, PFS) ||
8317 parseScopeAndOrdering(true /*Always atomic*/, SSID, SuccessOrdering) ||
8318 parseOrdering(FailureOrdering) ||
8319 parseOptionalCommaAlign(Alignment, AteExtraComma))
8320 return true;
8321
8322 if (!AtomicCmpXchgInst::isValidSuccessOrdering(SuccessOrdering))
8323 return tokError("invalid cmpxchg success ordering");
8324 if (!AtomicCmpXchgInst::isValidFailureOrdering(FailureOrdering))
8325 return tokError("invalid cmpxchg failure ordering");
8326 if (!Ptr->getType()->isPointerTy())
8327 return error(PtrLoc, "cmpxchg operand must be a pointer");
8328 if (Cmp->getType() != New->getType())
8329 return error(NewLoc, "compare value and new value type do not match");
8330 if (!New->getType()->isFirstClassType())
8331 return error(NewLoc, "cmpxchg operand must be a first class value");
8332
8333 const Align DefaultAlignment(
8334 PFS.getFunction().getDataLayout().getTypeStoreSize(
8335 Cmp->getType()));
8336
8337 AtomicCmpXchgInst *CXI =
8338 new AtomicCmpXchgInst(Ptr, Cmp, New, Alignment.value_or(DefaultAlignment),
8339 SuccessOrdering, FailureOrdering, SSID);
8340 CXI->setVolatile(isVolatile);
8341 CXI->setWeak(isWeak);
8342
8343 Inst = CXI;
8344 return AteExtraComma ? InstExtraComma : InstNormal;
8345}
8346
8347/// parseAtomicRMW
8348/// ::= 'atomicrmw' 'volatile'? BinOp TypeAndValue ',' TypeAndValue
8349/// 'singlethread'? AtomicOrdering
8350int LLParser::parseAtomicRMW(Instruction *&Inst, PerFunctionState &PFS) {
8351 Value *Ptr, *Val; LocTy PtrLoc, ValLoc;
8352 bool AteExtraComma = false;
8355 bool isVolatile = false;
8356 bool IsFP = false;
8358 MaybeAlign Alignment;
8359
8360 if (EatIfPresent(lltok::kw_volatile))
8361 isVolatile = true;
8362
8363 switch (Lex.getKind()) {
8364 default:
8365 return tokError("expected binary operation in atomicrmw");
8379 break;
8382 break;
8385 break;
8386 case lltok::kw_usub_sat:
8388 break;
8389 case lltok::kw_fadd:
8391 IsFP = true;
8392 break;
8393 case lltok::kw_fsub:
8395 IsFP = true;
8396 break;
8397 case lltok::kw_fmax:
8399 IsFP = true;
8400 break;
8401 case lltok::kw_fmin:
8403 IsFP = true;
8404 break;
8405 }
8406 Lex.Lex(); // Eat the operation.
8407
8408 if (parseTypeAndValue(Ptr, PtrLoc, PFS) ||
8409 parseToken(lltok::comma, "expected ',' after atomicrmw address") ||
8410 parseTypeAndValue(Val, ValLoc, PFS) ||
8411 parseScopeAndOrdering(true /*Always atomic*/, SSID, Ordering) ||
8412 parseOptionalCommaAlign(Alignment, AteExtraComma))
8413 return true;
8414
8415 if (Ordering == AtomicOrdering::Unordered)
8416 return tokError("atomicrmw cannot be unordered");
8417 if (!Ptr->getType()->isPointerTy())
8418 return error(PtrLoc, "atomicrmw operand must be a pointer");
8419 if (Val->getType()->isScalableTy())
8420 return error(ValLoc, "atomicrmw operand may not be scalable");
8421
8423 if (!Val->getType()->isIntegerTy() &&
8424 !Val->getType()->isFloatingPointTy() &&
8425 !Val->getType()->isPointerTy()) {
8426 return error(
8427 ValLoc,
8429 " operand must be an integer, floating point, or pointer type");
8430 }
8431 } else if (IsFP) {
8432 if (!Val->getType()->isFPOrFPVectorTy()) {
8433 return error(ValLoc, "atomicrmw " +
8435 " operand must be a floating point type");
8436 }
8437 } else {
8438 if (!Val->getType()->isIntegerTy()) {
8439 return error(ValLoc, "atomicrmw " +
8441 " operand must be an integer");
8442 }
8443 }
8444
8445 unsigned Size =
8446 PFS.getFunction().getDataLayout().getTypeStoreSizeInBits(
8447 Val->getType());
8448 if (Size < 8 || (Size & (Size - 1)))
8449 return error(ValLoc, "atomicrmw operand must be power-of-two byte-sized"
8450 " integer");
8451 const Align DefaultAlignment(
8452 PFS.getFunction().getDataLayout().getTypeStoreSize(
8453 Val->getType()));
8454 AtomicRMWInst *RMWI =
8455 new AtomicRMWInst(Operation, Ptr, Val,
8456 Alignment.value_or(DefaultAlignment), Ordering, SSID);
8457 RMWI->setVolatile(isVolatile);
8458 Inst = RMWI;
8459 return AteExtraComma ? InstExtraComma : InstNormal;
8460}
8461
8462/// parseFence
8463/// ::= 'fence' 'singlethread'? AtomicOrdering
8464int LLParser::parseFence(Instruction *&Inst, PerFunctionState &PFS) {
8467 if (parseScopeAndOrdering(true /*Always atomic*/, SSID, Ordering))
8468 return true;
8469
8470 if (Ordering == AtomicOrdering::Unordered)
8471 return tokError("fence cannot be unordered");
8472 if (Ordering == AtomicOrdering::Monotonic)
8473 return tokError("fence cannot be monotonic");
8474
8475 Inst = new FenceInst(Context, Ordering, SSID);
8476 return InstNormal;
8477}
8478
8479/// parseGetElementPtr
8480/// ::= 'getelementptr' 'inbounds'? TypeAndValue (',' TypeAndValue)*
8481int LLParser::parseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) {
8482 Value *Ptr = nullptr;
8483 Value *Val = nullptr;
8484 LocTy Loc, EltLoc;
8485 GEPNoWrapFlags NW;
8486
8487 while (true) {
8488 if (EatIfPresent(lltok::kw_inbounds))
8490 else if (EatIfPresent(lltok::kw_nusw))
8492 else if (EatIfPresent(lltok::kw_nuw))
8494 else
8495 break;
8496 }
8497
8498 Type *Ty = nullptr;
8499 if (parseType(Ty) ||
8500 parseToken(lltok::comma, "expected comma after getelementptr's type") ||
8501 parseTypeAndValue(Ptr, Loc, PFS))
8502 return true;
8503
8504 Type *BaseType = Ptr->getType();
8505 PointerType *BasePointerType = dyn_cast<PointerType>(BaseType->getScalarType());
8506 if (!BasePointerType)
8507 return error(Loc, "base of getelementptr must be a pointer");
8508
8510 bool AteExtraComma = false;
8511 // GEP returns a vector of pointers if at least one of parameters is a vector.
8512 // All vector parameters should have the same vector width.
8513 ElementCount GEPWidth = BaseType->isVectorTy()
8514 ? cast<VectorType>(BaseType)->getElementCount()
8516
8517 while (EatIfPresent(lltok::comma)) {
8518 if (Lex.getKind() == lltok::MetadataVar) {
8519 AteExtraComma = true;
8520 break;
8521 }
8522 if (parseTypeAndValue(Val, EltLoc, PFS))
8523 return true;
8524 if (!Val->getType()->isIntOrIntVectorTy())
8525 return error(EltLoc, "getelementptr index must be an integer");
8526
8527 if (auto *ValVTy = dyn_cast<VectorType>(Val->getType())) {
8528 ElementCount ValNumEl = ValVTy->getElementCount();
8529 if (GEPWidth != ElementCount::getFixed(0) && GEPWidth != ValNumEl)
8530 return error(
8531 EltLoc,
8532 "getelementptr vector index has a wrong number of elements");
8533 GEPWidth = ValNumEl;
8534 }
8535 Indices.push_back(Val);
8536 }
8537
8538 SmallPtrSet<Type*, 4> Visited;
8539 if (!Indices.empty() && !Ty->isSized(&Visited))
8540 return error(Loc, "base element of getelementptr must be sized");
8541
8542 auto *STy = dyn_cast<StructType>(Ty);
8543 if (STy && STy->isScalableTy())
8544 return error(Loc, "getelementptr cannot target structure that contains "
8545 "scalable vector type");
8546
8547 if (!GetElementPtrInst::getIndexedType(Ty, Indices))
8548 return error(Loc, "invalid getelementptr indices");
8550 Inst = GEP;
8551 GEP->setNoWrapFlags(NW);
8552 return AteExtraComma ? InstExtraComma : InstNormal;
8553}
8554
8555/// parseExtractValue
8556/// ::= 'extractvalue' TypeAndValue (',' uint32)+
8557int LLParser::parseExtractValue(Instruction *&Inst, PerFunctionState &PFS) {
8558 Value *Val; LocTy Loc;
8560 bool AteExtraComma;
8561 if (parseTypeAndValue(Val, Loc, PFS) ||
8562 parseIndexList(Indices, AteExtraComma))
8563 return true;
8564
8565 if (!Val->getType()->isAggregateType())
8566 return error(Loc, "extractvalue operand must be aggregate type");
8567
8568 if (!ExtractValueInst::getIndexedType(Val->getType(), Indices))
8569 return error(Loc, "invalid indices for extractvalue");
8570 Inst = ExtractValueInst::Create(Val, Indices);
8571 return AteExtraComma ? InstExtraComma : InstNormal;
8572}
8573
8574/// parseInsertValue
8575/// ::= 'insertvalue' TypeAndValue ',' TypeAndValue (',' uint32)+
8576int LLParser::parseInsertValue(Instruction *&Inst, PerFunctionState &PFS) {
8577 Value *Val0, *Val1; LocTy Loc0, Loc1;
8579 bool AteExtraComma;
8580 if (parseTypeAndValue(Val0, Loc0, PFS) ||
8581 parseToken(lltok::comma, "expected comma after insertvalue operand") ||
8582 parseTypeAndValue(Val1, Loc1, PFS) ||
8583 parseIndexList(Indices, AteExtraComma))
8584 return true;
8585
8586 if (!Val0->getType()->isAggregateType())
8587 return error(Loc0, "insertvalue operand must be aggregate type");
8588
8589 Type *IndexedType = ExtractValueInst::getIndexedType(Val0->getType(), Indices);
8590 if (!IndexedType)
8591 return error(Loc0, "invalid indices for insertvalue");
8592 if (IndexedType != Val1->getType())
8593 return error(Loc1, "insertvalue operand and field disagree in type: '" +
8594 getTypeString(Val1->getType()) + "' instead of '" +
8595 getTypeString(IndexedType) + "'");
8596 Inst = InsertValueInst::Create(Val0, Val1, Indices);
8597 return AteExtraComma ? InstExtraComma : InstNormal;
8598}
8599
8600//===----------------------------------------------------------------------===//
8601// Embedded metadata.
8602//===----------------------------------------------------------------------===//
8603
8604/// parseMDNodeVector
8605/// ::= { Element (',' Element)* }
8606/// Element
8607/// ::= 'null' | Metadata
8608bool LLParser::parseMDNodeVector(SmallVectorImpl<Metadata *> &Elts) {
8609 if (parseToken(lltok::lbrace, "expected '{' here"))
8610 return true;
8611
8612 // Check for an empty list.
8613 if (EatIfPresent(lltok::rbrace))
8614 return false;
8615
8616 do {
8617 if (EatIfPresent(lltok::kw_null)) {
8618 Elts.push_back(nullptr);
8619 continue;
8620 }
8621
8622 Metadata *MD;
8623 if (parseMetadata(MD, nullptr))
8624 return true;
8625 Elts.push_back(MD);
8626 } while (EatIfPresent(lltok::comma));
8627
8628 return parseToken(lltok::rbrace, "expected end of metadata node");
8629}
8630
8631//===----------------------------------------------------------------------===//
8632// Use-list order directives.
8633//===----------------------------------------------------------------------===//
8634bool LLParser::sortUseListOrder(Value *V, ArrayRef<unsigned> Indexes,
8635 SMLoc Loc) {
8636 if (V->use_empty())
8637 return error(Loc, "value has no uses");
8638
8639 unsigned NumUses = 0;
8641 for (const Use &U : V->uses()) {
8642 if (++NumUses > Indexes.size())
8643 break;
8644 Order[&U] = Indexes[NumUses - 1];
8645 }
8646 if (NumUses < 2)
8647 return error(Loc, "value only has one use");
8648 if (Order.size() != Indexes.size() || NumUses > Indexes.size())
8649 return error(Loc,
8650 "wrong number of indexes, expected " + Twine(V->getNumUses()));
8651
8652 V->sortUseList([&](const Use &L, const Use &R) {
8653 return Order.lookup(&L) < Order.lookup(&R);
8654 });
8655 return false;
8656}
8657
8658/// parseUseListOrderIndexes
8659/// ::= '{' uint32 (',' uint32)+ '}'
8660bool LLParser::parseUseListOrderIndexes(SmallVectorImpl<unsigned> &Indexes) {
8661 SMLoc Loc = Lex.getLoc();
8662 if (parseToken(lltok::lbrace, "expected '{' here"))
8663 return true;
8664 if (Lex.getKind() == lltok::rbrace)
8665 return tokError("expected non-empty list of uselistorder indexes");
8666
8667 // Use Offset, Max, and IsOrdered to check consistency of indexes. The
8668 // indexes should be distinct numbers in the range [0, size-1], and should
8669 // not be in order.
8670 unsigned Offset = 0;
8671 unsigned Max = 0;
8672 bool IsOrdered = true;
8673 assert(Indexes.empty() && "Expected empty order vector");
8674 do {
8675 unsigned Index;
8676 if (parseUInt32(Index))
8677 return true;
8678
8679 // Update consistency checks.
8680 Offset += Index - Indexes.size();
8681 Max = std::max(Max, Index);
8682 IsOrdered &= Index == Indexes.size();
8683
8684 Indexes.push_back(Index);
8685 } while (EatIfPresent(lltok::comma));
8686
8687 if (parseToken(lltok::rbrace, "expected '}' here"))
8688 return true;
8689
8690 if (Indexes.size() < 2)
8691 return error(Loc, "expected >= 2 uselistorder indexes");
8692 if (Offset != 0 || Max >= Indexes.size())
8693 return error(Loc,
8694 "expected distinct uselistorder indexes in range [0, size)");
8695 if (IsOrdered)
8696 return error(Loc, "expected uselistorder indexes to change the order");
8697
8698 return false;
8699}
8700
8701/// parseUseListOrder
8702/// ::= 'uselistorder' Type Value ',' UseListOrderIndexes
8703bool LLParser::parseUseListOrder(PerFunctionState *PFS) {
8704 SMLoc Loc = Lex.getLoc();
8705 if (parseToken(lltok::kw_uselistorder, "expected uselistorder directive"))
8706 return true;
8707
8708 Value *V;
8710 if (parseTypeAndValue(V, PFS) ||
8711 parseToken(lltok::comma, "expected comma in uselistorder directive") ||
8712 parseUseListOrderIndexes(Indexes))
8713 return true;
8714
8715 return sortUseListOrder(V, Indexes, Loc);
8716}
8717
8718/// parseUseListOrderBB
8719/// ::= 'uselistorder_bb' @foo ',' %bar ',' UseListOrderIndexes
8720bool LLParser::parseUseListOrderBB() {
8722 SMLoc Loc = Lex.getLoc();
8723 Lex.Lex();
8724
8725 ValID Fn, Label;
8727 if (parseValID(Fn, /*PFS=*/nullptr) ||
8728 parseToken(lltok::comma, "expected comma in uselistorder_bb directive") ||
8729 parseValID(Label, /*PFS=*/nullptr) ||
8730 parseToken(lltok::comma, "expected comma in uselistorder_bb directive") ||
8731 parseUseListOrderIndexes(Indexes))
8732 return true;
8733
8734 // Check the function.
8735 GlobalValue *GV;
8736 if (Fn.Kind == ValID::t_GlobalName)
8737 GV = M->getNamedValue(Fn.StrVal);
8738 else if (Fn.Kind == ValID::t_GlobalID)
8739 GV = NumberedVals.get(Fn.UIntVal);
8740 else
8741 return error(Fn.Loc, "expected function name in uselistorder_bb");
8742 if (!GV)
8743 return error(Fn.Loc,
8744 "invalid function forward reference in uselistorder_bb");
8745 auto *F = dyn_cast<Function>(GV);
8746 if (!F)
8747 return error(Fn.Loc, "expected function name in uselistorder_bb");
8748 if (F->isDeclaration())
8749 return error(Fn.Loc, "invalid declaration in uselistorder_bb");
8750
8751 // Check the basic block.
8752 if (Label.Kind == ValID::t_LocalID)
8753 return error(Label.Loc, "invalid numeric label in uselistorder_bb");
8754 if (Label.Kind != ValID::t_LocalName)
8755 return error(Label.Loc, "expected basic block name in uselistorder_bb");
8756 Value *V = F->getValueSymbolTable()->lookup(Label.StrVal);
8757 if (!V)
8758 return error(Label.Loc, "invalid basic block in uselistorder_bb");
8759 if (!isa<BasicBlock>(V))
8760 return error(Label.Loc, "expected basic block in uselistorder_bb");
8761
8762 return sortUseListOrder(V, Indexes, Loc);
8763}
8764
8765/// ModuleEntry
8766/// ::= 'module' ':' '(' 'path' ':' STRINGCONSTANT ',' 'hash' ':' Hash ')'
8767/// Hash ::= '(' UInt32 ',' UInt32 ',' UInt32 ',' UInt32 ',' UInt32 ')'
8768bool LLParser::parseModuleEntry(unsigned ID) {
8770 Lex.Lex();
8771
8772 std::string Path;
8773 if (parseToken(lltok::colon, "expected ':' here") ||
8774 parseToken(lltok::lparen, "expected '(' here") ||
8775 parseToken(lltok::kw_path, "expected 'path' here") ||
8776 parseToken(lltok::colon, "expected ':' here") ||
8777 parseStringConstant(Path) ||
8778 parseToken(lltok::comma, "expected ',' here") ||
8779 parseToken(lltok::kw_hash, "expected 'hash' here") ||
8780 parseToken(lltok::colon, "expected ':' here") ||
8781 parseToken(lltok::lparen, "expected '(' here"))
8782 return true;
8783
8784 ModuleHash Hash;
8785 if (parseUInt32(Hash[0]) || parseToken(lltok::comma, "expected ',' here") ||
8786 parseUInt32(Hash[1]) || parseToken(lltok::comma, "expected ',' here") ||
8787 parseUInt32(Hash[2]) || parseToken(lltok::comma, "expected ',' here") ||
8788 parseUInt32(Hash[3]) || parseToken(lltok::comma, "expected ',' here") ||
8789 parseUInt32(Hash[4]))
8790 return true;
8791
8792 if (parseToken(lltok::rparen, "expected ')' here") ||
8793 parseToken(lltok::rparen, "expected ')' here"))
8794 return true;
8795
8796 auto ModuleEntry = Index->addModule(Path, Hash);
8797 ModuleIdMap[ID] = ModuleEntry->first();
8798
8799 return false;
8800}
8801
8802/// TypeIdEntry
8803/// ::= 'typeid' ':' '(' 'name' ':' STRINGCONSTANT ',' TypeIdSummary ')'
8804bool LLParser::parseTypeIdEntry(unsigned ID) {
8806 Lex.Lex();
8807
8808 std::string Name;
8809 if (parseToken(lltok::colon, "expected ':' here") ||
8810 parseToken(lltok::lparen, "expected '(' here") ||
8811 parseToken(lltok::kw_name, "expected 'name' here") ||
8812 parseToken(lltok::colon, "expected ':' here") ||
8813 parseStringConstant(Name))
8814 return true;
8815
8816 TypeIdSummary &TIS = Index->getOrInsertTypeIdSummary(Name);
8817 if (parseToken(lltok::comma, "expected ',' here") ||
8818 parseTypeIdSummary(TIS) || parseToken(lltok::rparen, "expected ')' here"))
8819 return true;
8820
8821 // Check if this ID was forward referenced, and if so, update the
8822 // corresponding GUIDs.
8823 auto FwdRefTIDs = ForwardRefTypeIds.find(ID);
8824 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
8825 for (auto TIDRef : FwdRefTIDs->second) {
8826 assert(!*TIDRef.first &&
8827 "Forward referenced type id GUID expected to be 0");
8828 *TIDRef.first = GlobalValue::getGUID(Name);
8829 }
8830 ForwardRefTypeIds.erase(FwdRefTIDs);
8831 }
8832
8833 return false;
8834}
8835
8836/// TypeIdSummary
8837/// ::= 'summary' ':' '(' TypeTestResolution [',' OptionalWpdResolutions]? ')'
8838bool LLParser::parseTypeIdSummary(TypeIdSummary &TIS) {
8839 if (parseToken(lltok::kw_summary, "expected 'summary' here") ||
8840 parseToken(lltok::colon, "expected ':' here") ||
8841 parseToken(lltok::lparen, "expected '(' here") ||
8842 parseTypeTestResolution(TIS.TTRes))
8843 return true;
8844
8845 if (EatIfPresent(lltok::comma)) {
8846 // Expect optional wpdResolutions field
8847 if (parseOptionalWpdResolutions(TIS.WPDRes))
8848 return true;
8849 }
8850
8851 if (parseToken(lltok::rparen, "expected ')' here"))
8852 return true;
8853
8854 return false;
8855}
8856
8858 ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-8);
8859
8860/// TypeIdCompatibleVtableEntry
8861/// ::= 'typeidCompatibleVTable' ':' '(' 'name' ':' STRINGCONSTANT ','
8862/// TypeIdCompatibleVtableInfo
8863/// ')'
8864bool LLParser::parseTypeIdCompatibleVtableEntry(unsigned ID) {
8866 Lex.Lex();
8867
8868 std::string Name;
8869 if (parseToken(lltok::colon, "expected ':' here") ||
8870 parseToken(lltok::lparen, "expected '(' here") ||
8871 parseToken(lltok::kw_name, "expected 'name' here") ||
8872 parseToken(lltok::colon, "expected ':' here") ||
8873 parseStringConstant(Name))
8874 return true;
8875
8877 Index->getOrInsertTypeIdCompatibleVtableSummary(Name);
8878 if (parseToken(lltok::comma, "expected ',' here") ||
8879 parseToken(lltok::kw_summary, "expected 'summary' here") ||
8880 parseToken(lltok::colon, "expected ':' here") ||
8881 parseToken(lltok::lparen, "expected '(' here"))
8882 return true;
8883
8884 IdToIndexMapType IdToIndexMap;
8885 // parse each call edge
8886 do {
8888 if (parseToken(lltok::lparen, "expected '(' here") ||
8889 parseToken(lltok::kw_offset, "expected 'offset' here") ||
8890 parseToken(lltok::colon, "expected ':' here") || parseUInt64(Offset) ||
8891 parseToken(lltok::comma, "expected ',' here"))
8892 return true;
8893
8894 LocTy Loc = Lex.getLoc();
8895 unsigned GVId;
8896 ValueInfo VI;
8897 if (parseGVReference(VI, GVId))
8898 return true;
8899
8900 // Keep track of the TypeIdCompatibleVtableInfo array index needing a
8901 // forward reference. We will save the location of the ValueInfo needing an
8902 // update, but can only do so once the std::vector is finalized.
8903 if (VI == EmptyVI)
8904 IdToIndexMap[GVId].push_back(std::make_pair(TI.size(), Loc));
8905 TI.push_back({Offset, VI});
8906
8907 if (parseToken(lltok::rparen, "expected ')' in call"))
8908 return true;
8909 } while (EatIfPresent(lltok::comma));
8910
8911 // Now that the TI vector is finalized, it is safe to save the locations
8912 // of any forward GV references that need updating later.
8913 for (auto I : IdToIndexMap) {
8914 auto &Infos = ForwardRefValueInfos[I.first];
8915 for (auto P : I.second) {
8916 assert(TI[P.first].VTableVI == EmptyVI &&
8917 "Forward referenced ValueInfo expected to be empty");
8918 Infos.emplace_back(&TI[P.first].VTableVI, P.second);
8919 }
8920 }
8921
8922 if (parseToken(lltok::rparen, "expected ')' here") ||
8923 parseToken(lltok::rparen, "expected ')' here"))
8924 return true;
8925
8926 // Check if this ID was forward referenced, and if so, update the
8927 // corresponding GUIDs.
8928 auto FwdRefTIDs = ForwardRefTypeIds.find(ID);
8929 if (FwdRefTIDs != ForwardRefTypeIds.end()) {
8930 for (auto TIDRef : FwdRefTIDs->second) {
8931 assert(!*TIDRef.first &&
8932 "Forward referenced type id GUID expected to be 0");
8933 *TIDRef.first = GlobalValue::getGUID(Name);
8934 }
8935 ForwardRefTypeIds.erase(FwdRefTIDs);
8936 }
8937
8938 return false;
8939}
8940
8941/// TypeTestResolution
8942/// ::= 'typeTestRes' ':' '(' 'kind' ':'
8943/// ( 'unsat' | 'byteArray' | 'inline' | 'single' | 'allOnes' ) ','
8944/// 'sizeM1BitWidth' ':' SizeM1BitWidth [',' 'alignLog2' ':' UInt64]?
8945/// [',' 'sizeM1' ':' UInt64]? [',' 'bitMask' ':' UInt8]?
8946/// [',' 'inlinesBits' ':' UInt64]? ')'
8947bool LLParser::parseTypeTestResolution(TypeTestResolution &TTRes) {
8948 if (parseToken(lltok::kw_typeTestRes, "expected 'typeTestRes' here") ||
8949 parseToken(lltok::colon, "expected ':' here") ||
8950 parseToken(lltok::lparen, "expected '(' here") ||
8951 parseToken(lltok::kw_kind, "expected 'kind' here") ||
8952 parseToken(lltok::colon, "expected ':' here"))
8953 return true;
8954
8955 switch (Lex.getKind()) {
8956 case lltok::kw_unknown:
8958 break;
8959 case lltok::kw_unsat:
8961 break;
8964 break;
8965 case lltok::kw_inline:
8967 break;
8968 case lltok::kw_single:
8970 break;
8971 case lltok::kw_allOnes:
8973 break;
8974 default:
8975 return error(Lex.getLoc(), "unexpected TypeTestResolution kind");
8976 }
8977 Lex.Lex();
8978
8979 if (parseToken(lltok::comma, "expected ',' here") ||
8980 parseToken(lltok::kw_sizeM1BitWidth, "expected 'sizeM1BitWidth' here") ||
8981 parseToken(lltok::colon, "expected ':' here") ||
8982 parseUInt32(TTRes.SizeM1BitWidth))
8983 return true;
8984
8985 // parse optional fields
8986 while (EatIfPresent(lltok::comma)) {
8987 switch (Lex.getKind()) {
8989 Lex.Lex();
8990 if (parseToken(lltok::colon, "expected ':'") ||
8991 parseUInt64(TTRes.AlignLog2))
8992 return true;
8993 break;
8994 case lltok::kw_sizeM1:
8995 Lex.Lex();
8996 if (parseToken(lltok::colon, "expected ':'") || parseUInt64(TTRes.SizeM1))
8997 return true;
8998 break;
8999 case lltok::kw_bitMask: {
9000 unsigned Val;
9001 Lex.Lex();
9002 if (parseToken(lltok::colon, "expected ':'") || parseUInt32(Val))
9003 return true;
9004 assert(Val <= 0xff);
9005 TTRes.BitMask = (uint8_t)Val;
9006 break;
9007 }
9009 Lex.Lex();
9010 if (parseToken(lltok::colon, "expected ':'") ||
9011 parseUInt64(TTRes.InlineBits))
9012 return true;
9013 break;
9014 default:
9015 return error(Lex.getLoc(), "expected optional TypeTestResolution field");
9016 }
9017 }
9018
9019 if (parseToken(lltok::rparen, "expected ')' here"))
9020 return true;
9021
9022 return false;
9023}
9024
9025/// OptionalWpdResolutions
9026/// ::= 'wpsResolutions' ':' '(' WpdResolution [',' WpdResolution]* ')'
9027/// WpdResolution ::= '(' 'offset' ':' UInt64 ',' WpdRes ')'
9028bool LLParser::parseOptionalWpdResolutions(
9029 std::map<uint64_t, WholeProgramDevirtResolution> &WPDResMap) {
9030 if (parseToken(lltok::kw_wpdResolutions, "expected 'wpdResolutions' here") ||
9031 parseToken(lltok::colon, "expected ':' here") ||
9032 parseToken(lltok::lparen, "expected '(' here"))
9033 return true;
9034
9035 do {
9038 if (parseToken(lltok::lparen, "expected '(' here") ||
9039 parseToken(lltok::kw_offset, "expected 'offset' here") ||
9040 parseToken(lltok::colon, "expected ':' here") || parseUInt64(Offset) ||
9041 parseToken(lltok::comma, "expected ',' here") || parseWpdRes(WPDRes) ||
9042 parseToken(lltok::rparen, "expected ')' here"))
9043 return true;
9044 WPDResMap[Offset] = WPDRes;
9045 } while (EatIfPresent(lltok::comma));
9046
9047 if (parseToken(lltok::rparen, "expected ')' here"))
9048 return true;
9049
9050 return false;
9051}
9052
9053/// WpdRes
9054/// ::= 'wpdRes' ':' '(' 'kind' ':' 'indir'
9055/// [',' OptionalResByArg]? ')'
9056/// ::= 'wpdRes' ':' '(' 'kind' ':' 'singleImpl'
9057/// ',' 'singleImplName' ':' STRINGCONSTANT ','
9058/// [',' OptionalResByArg]? ')'
9059/// ::= 'wpdRes' ':' '(' 'kind' ':' 'branchFunnel'
9060/// [',' OptionalResByArg]? ')'
9061bool LLParser::parseWpdRes(WholeProgramDevirtResolution &WPDRes) {
9062 if (parseToken(lltok::kw_wpdRes, "expected 'wpdRes' here") ||
9063 parseToken(lltok::colon, "expected ':' here") ||
9064 parseToken(lltok::lparen, "expected '(' here") ||
9065 parseToken(lltok::kw_kind, "expected 'kind' here") ||
9066 parseToken(lltok::colon, "expected ':' here"))
9067 return true;
9068
9069 switch (Lex.getKind()) {
9070 case lltok::kw_indir:
9072 break;
9075 break;
9078 break;
9079 default:
9080 return error(Lex.getLoc(), "unexpected WholeProgramDevirtResolution kind");
9081 }
9082 Lex.Lex();
9083
9084 // parse optional fields
9085 while (EatIfPresent(lltok::comma)) {
9086 switch (Lex.getKind()) {
9088 Lex.Lex();
9089 if (parseToken(lltok::colon, "expected ':' here") ||
9090 parseStringConstant(WPDRes.SingleImplName))
9091 return true;
9092 break;
9093 case lltok::kw_resByArg:
9094 if (parseOptionalResByArg(WPDRes.ResByArg))
9095 return true;
9096 break;
9097 default:
9098 return error(Lex.getLoc(),
9099 "expected optional WholeProgramDevirtResolution field");
9100 }
9101 }
9102
9103 if (parseToken(lltok::rparen, "expected ')' here"))
9104 return true;
9105
9106 return false;
9107}
9108
9109/// OptionalResByArg
9110/// ::= 'wpdRes' ':' '(' ResByArg[, ResByArg]* ')'
9111/// ResByArg ::= Args ',' 'byArg' ':' '(' 'kind' ':'
9112/// ( 'indir' | 'uniformRetVal' | 'UniqueRetVal' |
9113/// 'virtualConstProp' )
9114/// [',' 'info' ':' UInt64]? [',' 'byte' ':' UInt32]?
9115/// [',' 'bit' ':' UInt32]? ')'
9116bool LLParser::parseOptionalResByArg(
9117 std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>
9118 &ResByArg) {
9119 if (parseToken(lltok::kw_resByArg, "expected 'resByArg' here") ||
9120 parseToken(lltok::colon, "expected ':' here") ||
9121 parseToken(lltok::lparen, "expected '(' here"))
9122 return true;
9123
9124 do {
9125 std::vector<uint64_t> Args;
9126 if (parseArgs(Args) || parseToken(lltok::comma, "expected ',' here") ||
9127 parseToken(lltok::kw_byArg, "expected 'byArg here") ||
9128 parseToken(lltok::colon, "expected ':' here") ||
9129 parseToken(lltok::lparen, "expected '(' here") ||
9130 parseToken(lltok::kw_kind, "expected 'kind' here") ||
9131 parseToken(lltok::colon, "expected ':' here"))
9132 return true;
9133
9135 switch (Lex.getKind()) {
9136 case lltok::kw_indir:
9138 break;
9141 break;
9144 break;
9147 break;
9148 default:
9149 return error(Lex.getLoc(),
9150 "unexpected WholeProgramDevirtResolution::ByArg kind");
9151 }
9152 Lex.Lex();
9153
9154 // parse optional fields
9155 while (EatIfPresent(lltok::comma)) {
9156 switch (Lex.getKind()) {
9157 case lltok::kw_info:
9158 Lex.Lex();
9159 if (parseToken(lltok::colon, "expected ':' here") ||
9160 parseUInt64(ByArg.Info))
9161 return true;
9162 break;
9163 case lltok::kw_byte:
9164 Lex.Lex();
9165 if (parseToken(lltok::colon, "expected ':' here") ||
9166 parseUInt32(ByArg.Byte))
9167 return true;
9168 break;
9169 case lltok::kw_bit:
9170 Lex.Lex();
9171 if (parseToken(lltok::colon, "expected ':' here") ||
9172 parseUInt32(ByArg.Bit))
9173 return true;
9174 break;
9175 default:
9176 return error(Lex.getLoc(),
9177 "expected optional whole program devirt field");
9178 }
9179 }
9180
9181 if (parseToken(lltok::rparen, "expected ')' here"))
9182 return true;
9183
9184 ResByArg[Args] = ByArg;
9185 } while (EatIfPresent(lltok::comma));
9186
9187 if (parseToken(lltok::rparen, "expected ')' here"))
9188 return true;
9189
9190 return false;
9191}
9192
9193/// OptionalResByArg
9194/// ::= 'args' ':' '(' UInt64[, UInt64]* ')'
9195bool LLParser::parseArgs(std::vector<uint64_t> &Args) {
9196 if (parseToken(lltok::kw_args, "expected 'args' here") ||
9197 parseToken(lltok::colon, "expected ':' here") ||
9198 parseToken(lltok::lparen, "expected '(' here"))
9199 return true;
9200
9201 do {
9202 uint64_t Val;
9203 if (parseUInt64(Val))
9204 return true;
9205 Args.push_back(Val);
9206 } while (EatIfPresent(lltok::comma));
9207
9208 if (parseToken(lltok::rparen, "expected ')' here"))
9209 return true;
9210
9211 return false;
9212}
9213
9214static const auto FwdVIRef = (GlobalValueSummaryMapTy::value_type *)-8;
9215
9216static void resolveFwdRef(ValueInfo *Fwd, ValueInfo &Resolved) {
9217 bool ReadOnly = Fwd->isReadOnly();
9218 bool WriteOnly = Fwd->isWriteOnly();
9219 assert(!(ReadOnly && WriteOnly));
9220 *Fwd = Resolved;
9221 if (ReadOnly)
9222 Fwd->setReadOnly();
9223 if (WriteOnly)
9224 Fwd->setWriteOnly();
9225}
9226
9227/// Stores the given Name/GUID and associated summary into the Index.
9228/// Also updates any forward references to the associated entry ID.
9229bool LLParser::addGlobalValueToIndex(
9230 std::string Name, GlobalValue::GUID GUID, GlobalValue::LinkageTypes Linkage,
9231 unsigned ID, std::unique_ptr<GlobalValueSummary> Summary, LocTy Loc) {
9232 // First create the ValueInfo utilizing the Name or GUID.
9233 ValueInfo VI;
9234 if (GUID != 0) {
9235 assert(Name.empty());
9236 VI = Index->getOrInsertValueInfo(GUID);
9237 } else {
9238 assert(!Name.empty());
9239 if (M) {
9240 auto *GV = M->getNamedValue(Name);
9241 if (!GV)
9242 return error(Loc, "Reference to undefined global \"" + Name + "\"");
9243
9244 VI = Index->getOrInsertValueInfo(GV);
9245 } else {
9246 assert(
9247 (!GlobalValue::isLocalLinkage(Linkage) || !SourceFileName.empty()) &&
9248 "Need a source_filename to compute GUID for local");
9250 GlobalValue::getGlobalIdentifier(Name, Linkage, SourceFileName));
9251 VI = Index->getOrInsertValueInfo(GUID, Index->saveString(Name));
9252 }
9253 }
9254
9255 // Resolve forward references from calls/refs
9256 auto FwdRefVIs = ForwardRefValueInfos.find(ID);
9257 if (FwdRefVIs != ForwardRefValueInfos.end()) {
9258 for (auto VIRef : FwdRefVIs->second) {
9259 assert(VIRef.first->getRef() == FwdVIRef &&
9260 "Forward referenced ValueInfo expected to be empty");
9261 resolveFwdRef(VIRef.first, VI);
9262 }
9263 ForwardRefValueInfos.erase(FwdRefVIs);
9264 }
9265
9266 // Resolve forward references from aliases
9267 auto FwdRefAliasees = ForwardRefAliasees.find(ID);
9268 if (FwdRefAliasees != ForwardRefAliasees.end()) {
9269 for (auto AliaseeRef : FwdRefAliasees->second) {
9270 assert(!AliaseeRef.first->hasAliasee() &&
9271 "Forward referencing alias already has aliasee");
9272 assert(Summary && "Aliasee must be a definition");
9273 AliaseeRef.first->setAliasee(VI, Summary.get());
9274 }
9275 ForwardRefAliasees.erase(FwdRefAliasees);
9276 }
9277
9278 // Add the summary if one was provided.
9279 if (Summary)
9280 Index->addGlobalValueSummary(VI, std::move(Summary));
9281
9282 // Save the associated ValueInfo for use in later references by ID.
9283 if (ID == NumberedValueInfos.size())
9284 NumberedValueInfos.push_back(VI);
9285 else {
9286 // Handle non-continuous numbers (to make test simplification easier).
9287 if (ID > NumberedValueInfos.size())
9288 NumberedValueInfos.resize(ID + 1);
9289 NumberedValueInfos[ID] = VI;
9290 }
9291
9292 return false;
9293}
9294
9295/// parseSummaryIndexFlags
9296/// ::= 'flags' ':' UInt64
9297bool LLParser::parseSummaryIndexFlags() {
9298 assert(Lex.getKind() == lltok::kw_flags);
9299 Lex.Lex();
9300
9301 if (parseToken(lltok::colon, "expected ':' here"))
9302 return true;
9304 if (parseUInt64(Flags))
9305 return true;
9306 if (Index)
9307 Index->setFlags(Flags);
9308 return false;
9309}
9310
9311/// parseBlockCount
9312/// ::= 'blockcount' ':' UInt64
9313bool LLParser::parseBlockCount() {
9315 Lex.Lex();
9316
9317 if (parseToken(lltok::colon, "expected ':' here"))
9318 return true;
9319 uint64_t BlockCount;
9320 if (parseUInt64(BlockCount))
9321 return true;
9322 if (Index)
9323 Index->setBlockCount(BlockCount);
9324 return false;
9325}
9326
9327/// parseGVEntry
9328/// ::= 'gv' ':' '(' ('name' ':' STRINGCONSTANT | 'guid' ':' UInt64)
9329/// [',' 'summaries' ':' Summary[',' Summary]* ]? ')'
9330/// Summary ::= '(' (FunctionSummary | VariableSummary | AliasSummary) ')'
9331bool LLParser::parseGVEntry(unsigned ID) {
9332 assert(Lex.getKind() == lltok::kw_gv);
9333 Lex.Lex();
9334
9335 if (parseToken(lltok::colon, "expected ':' here") ||
9336 parseToken(lltok::lparen, "expected '(' here"))
9337 return true;
9338
9339 LocTy Loc = Lex.getLoc();
9340 std::string Name;
9342 switch (Lex.getKind()) {
9343 case lltok::kw_name:
9344 Lex.Lex();
9345 if (parseToken(lltok::colon, "expected ':' here") ||
9346 parseStringConstant(Name))
9347 return true;
9348 // Can't create GUID/ValueInfo until we have the linkage.
9349 break;
9350 case lltok::kw_guid:
9351 Lex.Lex();
9352 if (parseToken(lltok::colon, "expected ':' here") || parseUInt64(GUID))
9353 return true;
9354 break;
9355 default:
9356 return error(Lex.getLoc(), "expected name or guid tag");
9357 }
9358
9359 if (!EatIfPresent(lltok::comma)) {
9360 // No summaries. Wrap up.
9361 if (parseToken(lltok::rparen, "expected ')' here"))
9362 return true;
9363 // This was created for a call to an external or indirect target.
9364 // A GUID with no summary came from a VALUE_GUID record, dummy GUID
9365 // created for indirect calls with VP. A Name with no GUID came from
9366 // an external definition. We pass ExternalLinkage since that is only
9367 // used when the GUID must be computed from Name, and in that case
9368 // the symbol must have external linkage.
9369 return addGlobalValueToIndex(Name, GUID, GlobalValue::ExternalLinkage, ID,
9370 nullptr, Loc);
9371 }
9372
9373 // Have a list of summaries
9374 if (parseToken(lltok::kw_summaries, "expected 'summaries' here") ||
9375 parseToken(lltok::colon, "expected ':' here") ||
9376 parseToken(lltok::lparen, "expected '(' here"))
9377 return true;
9378 do {
9379 switch (Lex.getKind()) {
9380 case lltok::kw_function:
9381 if (parseFunctionSummary(Name, GUID, ID))
9382 return true;
9383 break;
9384 case lltok::kw_variable:
9385 if (parseVariableSummary(Name, GUID, ID))
9386 return true;
9387 break;
9388 case lltok::kw_alias:
9389 if (parseAliasSummary(Name, GUID, ID))
9390 return true;
9391 break;
9392 default:
9393 return error(Lex.getLoc(), "expected summary type");
9394 }
9395 } while (EatIfPresent(lltok::comma));
9396
9397 if (parseToken(lltok::rparen, "expected ')' here") ||
9398 parseToken(lltok::rparen, "expected ')' here"))
9399 return true;
9400
9401 return false;
9402}
9403
9404/// FunctionSummary
9405/// ::= 'function' ':' '(' 'module' ':' ModuleReference ',' GVFlags
9406/// ',' 'insts' ':' UInt32 [',' OptionalFFlags]? [',' OptionalCalls]?
9407/// [',' OptionalTypeIdInfo]? [',' OptionalParamAccesses]?
9408/// [',' OptionalRefs]? ')'
9409bool LLParser::parseFunctionSummary(std::string Name, GlobalValue::GUID GUID,
9410 unsigned ID) {
9411 LocTy Loc = Lex.getLoc();
9413 Lex.Lex();
9414
9415 StringRef ModulePath;
9418 /*NotEligibleToImport=*/false,
9419 /*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false,
9421 unsigned InstCount;
9423 FunctionSummary::TypeIdInfo TypeIdInfo;
9424 std::vector<FunctionSummary::ParamAccess> ParamAccesses;
9426 std::vector<CallsiteInfo> Callsites;
9427 std::vector<AllocInfo> Allocs;
9428 // Default is all-zeros (conservative values).
9429 FunctionSummary::FFlags FFlags = {};
9430 if (parseToken(lltok::colon, "expected ':' here") ||
9431 parseToken(lltok::lparen, "expected '(' here") ||
9432 parseModuleReference(ModulePath) ||
9433 parseToken(lltok::comma, "expected ',' here") || parseGVFlags(GVFlags) ||
9434 parseToken(lltok::comma, "expected ',' here") ||
9435 parseToken(lltok::kw_insts, "expected 'insts' here") ||
9436 parseToken(lltok::colon, "expected ':' here") || parseUInt32(InstCount))
9437 return true;
9438
9439 // parse optional fields
9440 while (EatIfPresent(lltok::comma)) {
9441 switch (Lex.getKind()) {
9443 if (parseOptionalFFlags(FFlags))
9444 return true;
9445 break;
9446 case lltok::kw_calls:
9447 if (parseOptionalCalls(Calls))
9448 return true;
9449 break;
9451 if (parseOptionalTypeIdInfo(TypeIdInfo))
9452 return true;
9453 break;
9454 case lltok::kw_refs:
9455 if (parseOptionalRefs(Refs))
9456 return true;
9457 break;
9458 case lltok::kw_params:
9459 if (parseOptionalParamAccesses(ParamAccesses))
9460 return true;
9461 break;
9462 case lltok::kw_allocs:
9463 if (parseOptionalAllocs(Allocs))
9464 return true;
9465 break;
9467 if (parseOptionalCallsites(Callsites))
9468 return true;
9469 break;
9470 default:
9471 return error(Lex.getLoc(), "expected optional function summary field");
9472 }
9473 }
9474
9475 if (parseToken(lltok::rparen, "expected ')' here"))
9476 return true;
9477
9478 auto FS = std::make_unique<FunctionSummary>(
9479 GVFlags, InstCount, FFlags, std::move(Refs), std::move(Calls),
9480 std::move(TypeIdInfo.TypeTests),
9481 std::move(TypeIdInfo.TypeTestAssumeVCalls),
9482 std::move(TypeIdInfo.TypeCheckedLoadVCalls),
9483 std::move(TypeIdInfo.TypeTestAssumeConstVCalls),
9484 std::move(TypeIdInfo.TypeCheckedLoadConstVCalls),
9485 std::move(ParamAccesses), std::move(Callsites), std::move(Allocs));
9486
9487 FS->setModulePath(ModulePath);
9488
9489 return addGlobalValueToIndex(Name, GUID,
9491 std::move(FS), Loc);
9492}
9493
9494/// VariableSummary
9495/// ::= 'variable' ':' '(' 'module' ':' ModuleReference ',' GVFlags
9496/// [',' OptionalRefs]? ')'
9497bool LLParser::parseVariableSummary(std::string Name, GlobalValue::GUID GUID,
9498 unsigned ID) {
9499 LocTy Loc = Lex.getLoc();
9501 Lex.Lex();
9502
9503 StringRef ModulePath;
9506 /*NotEligibleToImport=*/false,
9507 /*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false,
9509 GlobalVarSummary::GVarFlags GVarFlags(/*ReadOnly*/ false,
9510 /* WriteOnly */ false,
9511 /* Constant */ false,
9514 VTableFuncList VTableFuncs;
9515 if (parseToken(lltok::colon, "expected ':' here") ||
9516 parseToken(lltok::lparen, "expected '(' here") ||
9517 parseModuleReference(ModulePath) ||
9518 parseToken(lltok::comma, "expected ',' here") || parseGVFlags(GVFlags) ||
9519 parseToken(lltok::comma, "expected ',' here") ||
9520 parseGVarFlags(GVarFlags))
9521 return true;
9522
9523 // parse optional fields
9524 while (EatIfPresent(lltok::comma)) {
9525 switch (Lex.getKind()) {
9527 if (parseOptionalVTableFuncs(VTableFuncs))
9528 return true;
9529 break;
9530 case lltok::kw_refs:
9531 if (parseOptionalRefs(Refs))
9532 return true;
9533 break;
9534 default:
9535 return error(Lex.getLoc(), "expected optional variable summary field");
9536 }
9537 }
9538
9539 if (parseToken(lltok::rparen, "expected ')' here"))
9540 return true;
9541
9542 auto GS =
9543 std::make_unique<GlobalVarSummary>(GVFlags, GVarFlags, std::move(Refs));
9544
9545 GS->setModulePath(ModulePath);
9546 GS->setVTableFuncs(std::move(VTableFuncs));
9547
9548 return addGlobalValueToIndex(Name, GUID,
9550 std::move(GS), Loc);
9551}
9552
9553/// AliasSummary
9554/// ::= 'alias' ':' '(' 'module' ':' ModuleReference ',' GVFlags ','
9555/// 'aliasee' ':' GVReference ')'
9556bool LLParser::parseAliasSummary(std::string Name, GlobalValue::GUID GUID,
9557 unsigned ID) {
9558 assert(Lex.getKind() == lltok::kw_alias);
9559 LocTy Loc = Lex.getLoc();
9560 Lex.Lex();
9561
9562 StringRef ModulePath;
9565 /*NotEligibleToImport=*/false,
9566 /*Live=*/false, /*IsLocal=*/false, /*CanAutoHide=*/false,
9568 if (parseToken(lltok::colon, "expected ':' here") ||
9569 parseToken(lltok::lparen, "expected '(' here") ||
9570 parseModuleReference(ModulePath) ||
9571 parseToken(lltok::comma, "expected ',' here") || parseGVFlags(GVFlags) ||
9572 parseToken(lltok::comma, "expected ',' here") ||
9573 parseToken(lltok::kw_aliasee, "expected 'aliasee' here") ||
9574 parseToken(lltok::colon, "expected ':' here"))
9575 return true;
9576
9577 ValueInfo AliaseeVI;
9578 unsigned GVId;
9579 if (parseGVReference(AliaseeVI, GVId))
9580 return true;
9581
9582 if (parseToken(lltok::rparen, "expected ')' here"))
9583 return true;
9584
9585 auto AS = std::make_unique<AliasSummary>(GVFlags);
9586
9587 AS->setModulePath(ModulePath);
9588
9589 // Record forward reference if the aliasee is not parsed yet.
9590 if (AliaseeVI.getRef() == FwdVIRef) {
9591 ForwardRefAliasees[GVId].emplace_back(AS.get(), Loc);
9592 } else {
9593 auto Summary = Index->findSummaryInModule(AliaseeVI, ModulePath);
9594 assert(Summary && "Aliasee must be a definition");
9595 AS->setAliasee(AliaseeVI, Summary);
9596 }
9597
9598 return addGlobalValueToIndex(Name, GUID,
9600 std::move(AS), Loc);
9601}
9602
9603/// Flag
9604/// ::= [0|1]
9605bool LLParser::parseFlag(unsigned &Val) {
9606 if (Lex.getKind() != lltok::APSInt || Lex.getAPSIntVal().isSigned())
9607 return tokError("expected integer");
9608 Val = (unsigned)Lex.getAPSIntVal().getBoolValue();
9609 Lex.Lex();
9610 return false;
9611}
9612
9613/// OptionalFFlags
9614/// := 'funcFlags' ':' '(' ['readNone' ':' Flag]?
9615/// [',' 'readOnly' ':' Flag]? [',' 'noRecurse' ':' Flag]?
9616/// [',' 'returnDoesNotAlias' ':' Flag]? ')'
9617/// [',' 'noInline' ':' Flag]? ')'
9618/// [',' 'alwaysInline' ':' Flag]? ')'
9619/// [',' 'noUnwind' ':' Flag]? ')'
9620/// [',' 'mayThrow' ':' Flag]? ')'
9621/// [',' 'hasUnknownCall' ':' Flag]? ')'
9622/// [',' 'mustBeUnreachable' ':' Flag]? ')'
9623
9624bool LLParser::parseOptionalFFlags(FunctionSummary::FFlags &FFlags) {
9626 Lex.Lex();
9627
9628 if (parseToken(lltok::colon, "expected ':' in funcFlags") ||
9629 parseToken(lltok::lparen, "expected '(' in funcFlags"))
9630 return true;
9631
9632 do {
9633 unsigned Val = 0;
9634 switch (Lex.getKind()) {
9635 case lltok::kw_readNone:
9636 Lex.Lex();
9637 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Val))
9638 return true;
9639 FFlags.ReadNone = Val;
9640 break;
9641 case lltok::kw_readOnly:
9642 Lex.Lex();
9643 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Val))
9644 return true;
9645 FFlags.ReadOnly = Val;
9646 break;
9648 Lex.Lex();
9649 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Val))
9650 return true;
9651 FFlags.NoRecurse = Val;
9652 break;
9654 Lex.Lex();
9655 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Val))
9656 return true;
9657 FFlags.ReturnDoesNotAlias = Val;
9658 break;
9659 case lltok::kw_noInline:
9660 Lex.Lex();
9661 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Val))
9662 return true;
9663 FFlags.NoInline = Val;
9664 break;
9666 Lex.Lex();
9667 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Val))
9668 return true;
9669 FFlags.AlwaysInline = Val;
9670 break;
9671 case lltok::kw_noUnwind:
9672 Lex.Lex();
9673 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Val))
9674 return true;
9675 FFlags.NoUnwind = Val;
9676 break;
9677 case lltok::kw_mayThrow:
9678 Lex.Lex();
9679 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Val))
9680 return true;
9681 FFlags.MayThrow = Val;
9682 break;
9684 Lex.Lex();
9685 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Val))
9686 return true;
9687 FFlags.HasUnknownCall = Val;
9688 break;
9690 Lex.Lex();
9691 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Val))
9692 return true;
9693 FFlags.MustBeUnreachable = Val;
9694 break;
9695 default:
9696 return error(Lex.getLoc(), "expected function flag type");
9697 }
9698 } while (EatIfPresent(lltok::comma));
9699
9700 if (parseToken(lltok::rparen, "expected ')' in funcFlags"))
9701 return true;
9702
9703 return false;
9704}
9705
9706/// OptionalCalls
9707/// := 'calls' ':' '(' Call [',' Call]* ')'
9708/// Call ::= '(' 'callee' ':' GVReference
9709/// [( ',' 'hotness' ':' Hotness | ',' 'relbf' ':' UInt32 )]?
9710/// [ ',' 'tail' ]? ')'
9711bool LLParser::parseOptionalCalls(
9713 assert(Lex.getKind() == lltok::kw_calls);
9714 Lex.Lex();
9715
9716 if (parseToken(lltok::colon, "expected ':' in calls") ||
9717 parseToken(lltok::lparen, "expected '(' in calls"))
9718 return true;
9719
9720 IdToIndexMapType IdToIndexMap;
9721 // parse each call edge
9722 do {
9723 ValueInfo VI;
9724 if (parseToken(lltok::lparen, "expected '(' in call") ||
9725 parseToken(lltok::kw_callee, "expected 'callee' in call") ||
9726 parseToken(lltok::colon, "expected ':'"))
9727 return true;
9728
9729 LocTy Loc = Lex.getLoc();
9730 unsigned GVId;
9731 if (parseGVReference(VI, GVId))
9732 return true;
9733
9735 unsigned RelBF = 0;
9736 unsigned HasTailCall = false;
9737
9738 // parse optional fields
9739 while (EatIfPresent(lltok::comma)) {
9740 switch (Lex.getKind()) {
9741 case lltok::kw_hotness:
9742 Lex.Lex();
9743 if (parseToken(lltok::colon, "expected ':'") || parseHotness(Hotness))
9744 return true;
9745 break;
9746 case lltok::kw_relbf:
9747 Lex.Lex();
9748 if (parseToken(lltok::colon, "expected ':'") || parseUInt32(RelBF))
9749 return true;
9750 break;
9751 case lltok::kw_tail:
9752 Lex.Lex();
9753 if (parseToken(lltok::colon, "expected ':'") || parseFlag(HasTailCall))
9754 return true;
9755 break;
9756 default:
9757 return error(Lex.getLoc(), "expected hotness, relbf, or tail");
9758 }
9759 }
9760 if (Hotness != CalleeInfo::HotnessType::Unknown && RelBF > 0)
9761 return tokError("Expected only one of hotness or relbf");
9762 // Keep track of the Call array index needing a forward reference.
9763 // We will save the location of the ValueInfo needing an update, but
9764 // can only do so once the std::vector is finalized.
9765 if (VI.getRef() == FwdVIRef)
9766 IdToIndexMap[GVId].push_back(std::make_pair(Calls.size(), Loc));
9767 Calls.push_back(
9768 FunctionSummary::EdgeTy{VI, CalleeInfo(Hotness, HasTailCall, RelBF)});
9769
9770 if (parseToken(lltok::rparen, "expected ')' in call"))
9771 return true;
9772 } while (EatIfPresent(lltok::comma));
9773
9774 // Now that the Calls vector is finalized, it is safe to save the locations
9775 // of any forward GV references that need updating later.
9776 for (auto I : IdToIndexMap) {
9777 auto &Infos = ForwardRefValueInfos[I.first];
9778 for (auto P : I.second) {
9779 assert(Calls[P.first].first.getRef() == FwdVIRef &&
9780 "Forward referenced ValueInfo expected to be empty");
9781 Infos.emplace_back(&Calls[P.first].first, P.second);
9782 }
9783 }
9784
9785 if (parseToken(lltok::rparen, "expected ')' in calls"))
9786 return true;
9787
9788 return false;
9789}
9790
9791/// Hotness
9792/// := ('unknown'|'cold'|'none'|'hot'|'critical')
9793bool LLParser::parseHotness(CalleeInfo::HotnessType &Hotness) {
9794 switch (Lex.getKind()) {
9795 case lltok::kw_unknown:
9797 break;
9798 case lltok::kw_cold:
9800 break;
9801 case lltok::kw_none:
9803 break;
9804 case lltok::kw_hot:
9806 break;
9807 case lltok::kw_critical:
9809 break;
9810 default:
9811 return error(Lex.getLoc(), "invalid call edge hotness");
9812 }
9813 Lex.Lex();
9814 return false;
9815}
9816
9817/// OptionalVTableFuncs
9818/// := 'vTableFuncs' ':' '(' VTableFunc [',' VTableFunc]* ')'
9819/// VTableFunc ::= '(' 'virtFunc' ':' GVReference ',' 'offset' ':' UInt64 ')'
9820bool LLParser::parseOptionalVTableFuncs(VTableFuncList &VTableFuncs) {
9822 Lex.Lex();
9823
9824 if (parseToken(lltok::colon, "expected ':' in vTableFuncs") ||
9825 parseToken(lltok::lparen, "expected '(' in vTableFuncs"))
9826 return true;
9827
9828 IdToIndexMapType IdToIndexMap;
9829 // parse each virtual function pair
9830 do {
9831 ValueInfo VI;
9832 if (parseToken(lltok::lparen, "expected '(' in vTableFunc") ||
9833 parseToken(lltok::kw_virtFunc, "expected 'callee' in vTableFunc") ||
9834 parseToken(lltok::colon, "expected ':'"))
9835 return true;
9836
9837 LocTy Loc = Lex.getLoc();
9838 unsigned GVId;
9839 if (parseGVReference(VI, GVId))
9840 return true;
9841
9843 if (parseToken(lltok::comma, "expected comma") ||
9844 parseToken(lltok::kw_offset, "expected offset") ||
9845 parseToken(lltok::colon, "expected ':'") || parseUInt64(Offset))
9846 return true;
9847
9848 // Keep track of the VTableFuncs array index needing a forward reference.
9849 // We will save the location of the ValueInfo needing an update, but
9850 // can only do so once the std::vector is finalized.
9851 if (VI == EmptyVI)
9852 IdToIndexMap[GVId].push_back(std::make_pair(VTableFuncs.size(), Loc));
9853 VTableFuncs.push_back({VI, Offset});
9854
9855 if (parseToken(lltok::rparen, "expected ')' in vTableFunc"))
9856 return true;
9857 } while (EatIfPresent(lltok::comma));
9858
9859 // Now that the VTableFuncs vector is finalized, it is safe to save the
9860 // locations of any forward GV references that need updating later.
9861 for (auto I : IdToIndexMap) {
9862 auto &Infos = ForwardRefValueInfos[I.first];
9863 for (auto P : I.second) {
9864 assert(VTableFuncs[P.first].FuncVI == EmptyVI &&
9865 "Forward referenced ValueInfo expected to be empty");
9866 Infos.emplace_back(&VTableFuncs[P.first].FuncVI, P.second);
9867 }
9868 }
9869
9870 if (parseToken(lltok::rparen, "expected ')' in vTableFuncs"))
9871 return true;
9872
9873 return false;
9874}
9875
9876/// ParamNo := 'param' ':' UInt64
9877bool LLParser::parseParamNo(uint64_t &ParamNo) {
9878 if (parseToken(lltok::kw_param, "expected 'param' here") ||
9879 parseToken(lltok::colon, "expected ':' here") || parseUInt64(ParamNo))
9880 return true;
9881 return false;
9882}
9883
9884/// ParamAccessOffset := 'offset' ':' '[' APSINTVAL ',' APSINTVAL ']'
9885bool LLParser::parseParamAccessOffset(ConstantRange &Range) {
9886 APSInt Lower;
9887 APSInt Upper;
9888 auto ParseAPSInt = [&](APSInt &Val) {
9889 if (Lex.getKind() != lltok::APSInt)
9890 return tokError("expected integer");
9891 Val = Lex.getAPSIntVal();
9892 Val = Val.extOrTrunc(FunctionSummary::ParamAccess::RangeWidth);
9893 Val.setIsSigned(true);
9894 Lex.Lex();
9895 return false;
9896 };
9897 if (parseToken(lltok::kw_offset, "expected 'offset' here") ||
9898 parseToken(lltok::colon, "expected ':' here") ||
9899 parseToken(lltok::lsquare, "expected '[' here") || ParseAPSInt(Lower) ||
9900 parseToken(lltok::comma, "expected ',' here") || ParseAPSInt(Upper) ||
9901 parseToken(lltok::rsquare, "expected ']' here"))
9902 return true;
9903
9904 ++Upper;
9905 Range =
9906 (Lower == Upper && !Lower.isMaxValue())
9907 ? ConstantRange::getEmpty(FunctionSummary::ParamAccess::RangeWidth)
9909
9910 return false;
9911}
9912
9913/// ParamAccessCall
9914/// := '(' 'callee' ':' GVReference ',' ParamNo ',' ParamAccessOffset ')'
9915bool LLParser::parseParamAccessCall(FunctionSummary::ParamAccess::Call &Call,
9916 IdLocListType &IdLocList) {
9917 if (parseToken(lltok::lparen, "expected '(' here") ||
9918 parseToken(lltok::kw_callee, "expected 'callee' here") ||
9919 parseToken(lltok::colon, "expected ':' here"))
9920 return true;
9921
9922 unsigned GVId;
9923 ValueInfo VI;
9924 LocTy Loc = Lex.getLoc();
9925 if (parseGVReference(VI, GVId))
9926 return true;
9927
9928 Call.Callee = VI;
9929 IdLocList.emplace_back(GVId, Loc);
9930
9931 if (parseToken(lltok::comma, "expected ',' here") ||
9932 parseParamNo(Call.ParamNo) ||
9933 parseToken(lltok::comma, "expected ',' here") ||
9934 parseParamAccessOffset(Call.Offsets))
9935 return true;
9936
9937 if (parseToken(lltok::rparen, "expected ')' here"))
9938 return true;
9939
9940 return false;
9941}
9942
9943/// ParamAccess
9944/// := '(' ParamNo ',' ParamAccessOffset [',' OptionalParamAccessCalls]? ')'
9945/// OptionalParamAccessCalls := '(' Call [',' Call]* ')'
9946bool LLParser::parseParamAccess(FunctionSummary::ParamAccess &Param,
9947 IdLocListType &IdLocList) {
9948 if (parseToken(lltok::lparen, "expected '(' here") ||
9949 parseParamNo(Param.ParamNo) ||
9950 parseToken(lltok::comma, "expected ',' here") ||
9951 parseParamAccessOffset(Param.Use))
9952 return true;
9953
9954 if (EatIfPresent(lltok::comma)) {
9955 if (parseToken(lltok::kw_calls, "expected 'calls' here") ||
9956 parseToken(lltok::colon, "expected ':' here") ||
9957 parseToken(lltok::lparen, "expected '(' here"))
9958 return true;
9959 do {
9961 if (parseParamAccessCall(Call, IdLocList))
9962 return true;
9963 Param.Calls.push_back(Call);
9964 } while (EatIfPresent(lltok::comma));
9965
9966 if (parseToken(lltok::rparen, "expected ')' here"))
9967 return true;
9968 }
9969
9970 if (parseToken(lltok::rparen, "expected ')' here"))
9971 return true;
9972
9973 return false;
9974}
9975
9976/// OptionalParamAccesses
9977/// := 'params' ':' '(' ParamAccess [',' ParamAccess]* ')'
9978bool LLParser::parseOptionalParamAccesses(
9979 std::vector<FunctionSummary::ParamAccess> &Params) {
9981 Lex.Lex();
9982
9983 if (parseToken(lltok::colon, "expected ':' here") ||
9984 parseToken(lltok::lparen, "expected '(' here"))
9985 return true;
9986
9987 IdLocListType VContexts;
9988 size_t CallsNum = 0;
9989 do {
9990 FunctionSummary::ParamAccess ParamAccess;
9991 if (parseParamAccess(ParamAccess, VContexts))
9992 return true;
9993 CallsNum += ParamAccess.Calls.size();
9994 assert(VContexts.size() == CallsNum);
9995 (void)CallsNum;
9996 Params.emplace_back(std::move(ParamAccess));
9997 } while (EatIfPresent(lltok::comma));
9998
9999 if (parseToken(lltok::rparen, "expected ')' here"))
10000 return true;
10001
10002 // Now that the Params is finalized, it is safe to save the locations
10003 // of any forward GV references that need updating later.
10004 IdLocListType::const_iterator ItContext = VContexts.begin();
10005 for (auto &PA : Params) {
10006 for (auto &C : PA.Calls) {
10007 if (C.Callee.getRef() == FwdVIRef)
10008 ForwardRefValueInfos[ItContext->first].emplace_back(&C.Callee,
10009 ItContext->second);
10010 ++ItContext;
10011 }
10012 }
10013 assert(ItContext == VContexts.end());
10014
10015 return false;
10016}
10017
10018/// OptionalRefs
10019/// := 'refs' ':' '(' GVReference [',' GVReference]* ')'
10020bool LLParser::parseOptionalRefs(SmallVectorImpl<ValueInfo> &Refs) {
10021 assert(Lex.getKind() == lltok::kw_refs);
10022 Lex.Lex();
10023
10024 if (parseToken(lltok::colon, "expected ':' in refs") ||
10025 parseToken(lltok::lparen, "expected '(' in refs"))
10026 return true;
10027
10028 struct ValueContext {
10029 ValueInfo VI;
10030 unsigned GVId;
10031 LocTy Loc;
10032 };
10033 std::vector<ValueContext> VContexts;
10034 // parse each ref edge
10035 do {
10036 ValueContext VC;
10037 VC.Loc = Lex.getLoc();
10038 if (parseGVReference(VC.VI, VC.GVId))
10039 return true;
10040 VContexts.push_back(VC);
10041 } while (EatIfPresent(lltok::comma));
10042
10043 // Sort value contexts so that ones with writeonly
10044 // and readonly ValueInfo are at the end of VContexts vector.
10045 // See FunctionSummary::specialRefCounts()
10046 llvm::sort(VContexts, [](const ValueContext &VC1, const ValueContext &VC2) {
10047 return VC1.VI.getAccessSpecifier() < VC2.VI.getAccessSpecifier();
10048 });
10049
10050 IdToIndexMapType IdToIndexMap;
10051 for (auto &VC : VContexts) {
10052 // Keep track of the Refs array index needing a forward reference.
10053 // We will save the location of the ValueInfo needing an update, but
10054 // can only do so once the std::vector is finalized.
10055 if (VC.VI.getRef() == FwdVIRef)
10056 IdToIndexMap[VC.GVId].push_back(std::make_pair(Refs.size(), VC.Loc));
10057 Refs.push_back(VC.VI);
10058 }
10059
10060 // Now that the Refs vector is finalized, it is safe to save the locations
10061 // of any forward GV references that need updating later.
10062 for (auto I : IdToIndexMap) {
10063 auto &Infos = ForwardRefValueInfos[I.first];
10064 for (auto P : I.second) {
10065 assert(Refs[P.first].getRef() == FwdVIRef &&
10066 "Forward referenced ValueInfo expected to be empty");
10067 Infos.emplace_back(&Refs[P.first], P.second);
10068 }
10069 }
10070
10071 if (parseToken(lltok::rparen, "expected ')' in refs"))
10072 return true;
10073
10074 return false;
10075}
10076
10077/// OptionalTypeIdInfo
10078/// := 'typeidinfo' ':' '(' [',' TypeTests]? [',' TypeTestAssumeVCalls]?
10079/// [',' TypeCheckedLoadVCalls]? [',' TypeTestAssumeConstVCalls]?
10080/// [',' TypeCheckedLoadConstVCalls]? ')'
10081bool LLParser::parseOptionalTypeIdInfo(
10082 FunctionSummary::TypeIdInfo &TypeIdInfo) {
10084 Lex.Lex();
10085
10086 if (parseToken(lltok::colon, "expected ':' here") ||
10087 parseToken(lltok::lparen, "expected '(' in typeIdInfo"))
10088 return true;
10089
10090 do {
10091 switch (Lex.getKind()) {
10093 if (parseTypeTests(TypeIdInfo.TypeTests))
10094 return true;
10095 break;
10097 if (parseVFuncIdList(lltok::kw_typeTestAssumeVCalls,
10098 TypeIdInfo.TypeTestAssumeVCalls))
10099 return true;
10100 break;
10102 if (parseVFuncIdList(lltok::kw_typeCheckedLoadVCalls,
10103 TypeIdInfo.TypeCheckedLoadVCalls))
10104 return true;
10105 break;
10107 if (parseConstVCallList(lltok::kw_typeTestAssumeConstVCalls,
10108 TypeIdInfo.TypeTestAssumeConstVCalls))
10109 return true;
10110 break;
10112 if (parseConstVCallList(lltok::kw_typeCheckedLoadConstVCalls,
10113 TypeIdInfo.TypeCheckedLoadConstVCalls))
10114 return true;
10115 break;
10116 default:
10117 return error(Lex.getLoc(), "invalid typeIdInfo list type");
10118 }
10119 } while (EatIfPresent(lltok::comma));
10120
10121 if (parseToken(lltok::rparen, "expected ')' in typeIdInfo"))
10122 return true;
10123
10124 return false;
10125}
10126
10127/// TypeTests
10128/// ::= 'typeTests' ':' '(' (SummaryID | UInt64)
10129/// [',' (SummaryID | UInt64)]* ')'
10130bool LLParser::parseTypeTests(std::vector<GlobalValue::GUID> &TypeTests) {
10132 Lex.Lex();
10133
10134 if (parseToken(lltok::colon, "expected ':' here") ||
10135 parseToken(lltok::lparen, "expected '(' in typeIdInfo"))
10136 return true;
10137
10138 IdToIndexMapType IdToIndexMap;
10139 do {
10141 if (Lex.getKind() == lltok::SummaryID) {
10142 unsigned ID = Lex.getUIntVal();
10143 LocTy Loc = Lex.getLoc();
10144 // Keep track of the TypeTests array index needing a forward reference.
10145 // We will save the location of the GUID needing an update, but
10146 // can only do so once the std::vector is finalized.
10147 IdToIndexMap[ID].push_back(std::make_pair(TypeTests.size(), Loc));
10148 Lex.Lex();
10149 } else if (parseUInt64(GUID))
10150 return true;
10151 TypeTests.push_back(GUID);
10152 } while (EatIfPresent(lltok::comma));
10153
10154 // Now that the TypeTests vector is finalized, it is safe to save the
10155 // locations of any forward GV references that need updating later.
10156 for (auto I : IdToIndexMap) {
10157 auto &Ids = ForwardRefTypeIds[I.first];
10158 for (auto P : I.second) {
10159 assert(TypeTests[P.first] == 0 &&
10160 "Forward referenced type id GUID expected to be 0");
10161 Ids.emplace_back(&TypeTests[P.first], P.second);
10162 }
10163 }
10164
10165 if (parseToken(lltok::rparen, "expected ')' in typeIdInfo"))
10166 return true;
10167
10168 return false;
10169}
10170
10171/// VFuncIdList
10172/// ::= Kind ':' '(' VFuncId [',' VFuncId]* ')'
10173bool LLParser::parseVFuncIdList(
10174 lltok::Kind Kind, std::vector<FunctionSummary::VFuncId> &VFuncIdList) {
10175 assert(Lex.getKind() == Kind);
10176 Lex.Lex();
10177
10178 if (parseToken(lltok::colon, "expected ':' here") ||
10179 parseToken(lltok::lparen, "expected '(' here"))
10180 return true;
10181
10182 IdToIndexMapType IdToIndexMap;
10183 do {
10185 if (parseVFuncId(VFuncId, IdToIndexMap, VFuncIdList.size()))
10186 return true;
10187 VFuncIdList.push_back(VFuncId);
10188 } while (EatIfPresent(lltok::comma));
10189
10190 if (parseToken(lltok::rparen, "expected ')' here"))
10191 return true;
10192
10193 // Now that the VFuncIdList vector is finalized, it is safe to save the
10194 // locations of any forward GV references that need updating later.
10195 for (auto I : IdToIndexMap) {
10196 auto &Ids = ForwardRefTypeIds[I.first];
10197 for (auto P : I.second) {
10198 assert(VFuncIdList[P.first].GUID == 0 &&
10199 "Forward referenced type id GUID expected to be 0");
10200 Ids.emplace_back(&VFuncIdList[P.first].GUID, P.second);
10201 }
10202 }
10203
10204 return false;
10205}
10206
10207/// ConstVCallList
10208/// ::= Kind ':' '(' ConstVCall [',' ConstVCall]* ')'
10209bool LLParser::parseConstVCallList(
10210 lltok::Kind Kind,
10211 std::vector<FunctionSummary::ConstVCall> &ConstVCallList) {
10212 assert(Lex.getKind() == Kind);
10213 Lex.Lex();
10214
10215 if (parseToken(lltok::colon, "expected ':' here") ||
10216 parseToken(lltok::lparen, "expected '(' here"))
10217 return true;
10218
10219 IdToIndexMapType IdToIndexMap;
10220 do {
10221 FunctionSummary::ConstVCall ConstVCall;
10222 if (parseConstVCall(ConstVCall, IdToIndexMap, ConstVCallList.size()))
10223 return true;
10224 ConstVCallList.push_back(ConstVCall);
10225 } while (EatIfPresent(lltok::comma));
10226
10227 if (parseToken(lltok::rparen, "expected ')' here"))
10228 return true;
10229
10230 // Now that the ConstVCallList vector is finalized, it is safe to save the
10231 // locations of any forward GV references that need updating later.
10232 for (auto I : IdToIndexMap) {
10233 auto &Ids = ForwardRefTypeIds[I.first];
10234 for (auto P : I.second) {
10235 assert(ConstVCallList[P.first].VFunc.GUID == 0 &&
10236 "Forward referenced type id GUID expected to be 0");
10237 Ids.emplace_back(&ConstVCallList[P.first].VFunc.GUID, P.second);
10238 }
10239 }
10240
10241 return false;
10242}
10243
10244/// ConstVCall
10245/// ::= '(' VFuncId ',' Args ')'
10246bool LLParser::parseConstVCall(FunctionSummary::ConstVCall &ConstVCall,
10247 IdToIndexMapType &IdToIndexMap, unsigned Index) {
10248 if (parseToken(lltok::lparen, "expected '(' here") ||
10249 parseVFuncId(ConstVCall.VFunc, IdToIndexMap, Index))
10250 return true;
10251
10252 if (EatIfPresent(lltok::comma))
10253 if (parseArgs(ConstVCall.Args))
10254 return true;
10255
10256 if (parseToken(lltok::rparen, "expected ')' here"))
10257 return true;
10258
10259 return false;
10260}
10261
10262/// VFuncId
10263/// ::= 'vFuncId' ':' '(' (SummaryID | 'guid' ':' UInt64) ','
10264/// 'offset' ':' UInt64 ')'
10265bool LLParser::parseVFuncId(FunctionSummary::VFuncId &VFuncId,
10266 IdToIndexMapType &IdToIndexMap, unsigned Index) {
10268 Lex.Lex();
10269
10270 if (parseToken(lltok::colon, "expected ':' here") ||
10271 parseToken(lltok::lparen, "expected '(' here"))
10272 return true;
10273
10274 if (Lex.getKind() == lltok::SummaryID) {
10275 VFuncId.GUID = 0;
10276 unsigned ID = Lex.getUIntVal();
10277 LocTy Loc = Lex.getLoc();
10278 // Keep track of the array index needing a forward reference.
10279 // We will save the location of the GUID needing an update, but
10280 // can only do so once the caller's std::vector is finalized.
10281 IdToIndexMap[ID].push_back(std::make_pair(Index, Loc));
10282 Lex.Lex();
10283 } else if (parseToken(lltok::kw_guid, "expected 'guid' here") ||
10284 parseToken(lltok::colon, "expected ':' here") ||
10285 parseUInt64(VFuncId.GUID))
10286 return true;
10287
10288 if (parseToken(lltok::comma, "expected ',' here") ||
10289 parseToken(lltok::kw_offset, "expected 'offset' here") ||
10290 parseToken(lltok::colon, "expected ':' here") ||
10291 parseUInt64(VFuncId.Offset) ||
10292 parseToken(lltok::rparen, "expected ')' here"))
10293 return true;
10294
10295 return false;
10296}
10297
10298/// GVFlags
10299/// ::= 'flags' ':' '(' 'linkage' ':' OptionalLinkageAux ','
10300/// 'visibility' ':' Flag 'notEligibleToImport' ':' Flag ','
10301/// 'live' ':' Flag ',' 'dsoLocal' ':' Flag ','
10302/// 'canAutoHide' ':' Flag ',' ')'
10303bool LLParser::parseGVFlags(GlobalValueSummary::GVFlags &GVFlags) {
10304 assert(Lex.getKind() == lltok::kw_flags);
10305 Lex.Lex();
10306
10307 if (parseToken(lltok::colon, "expected ':' here") ||
10308 parseToken(lltok::lparen, "expected '(' here"))
10309 return true;
10310
10311 do {
10312 unsigned Flag = 0;
10313 switch (Lex.getKind()) {
10314 case lltok::kw_linkage:
10315 Lex.Lex();
10316 if (parseToken(lltok::colon, "expected ':'"))
10317 return true;
10318 bool HasLinkage;
10319 GVFlags.Linkage = parseOptionalLinkageAux(Lex.getKind(), HasLinkage);
10320 assert(HasLinkage && "Linkage not optional in summary entry");
10321 Lex.Lex();
10322 break;
10324 Lex.Lex();
10325 if (parseToken(lltok::colon, "expected ':'"))
10326 return true;
10327 parseOptionalVisibility(Flag);
10328 GVFlags.Visibility = Flag;
10329 break;
10331 Lex.Lex();
10332 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Flag))
10333 return true;
10334 GVFlags.NotEligibleToImport = Flag;
10335 break;
10336 case lltok::kw_live:
10337 Lex.Lex();
10338 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Flag))
10339 return true;
10340 GVFlags.Live = Flag;
10341 break;
10342 case lltok::kw_dsoLocal:
10343 Lex.Lex();
10344 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Flag))
10345 return true;
10346 GVFlags.DSOLocal = Flag;
10347 break;
10349 Lex.Lex();
10350 if (parseToken(lltok::colon, "expected ':'") || parseFlag(Flag))
10351 return true;
10352 GVFlags.CanAutoHide = Flag;
10353 break;
10355 Lex.Lex();
10356 if (parseToken(lltok::colon, "expected ':'"))
10357 return true;
10359 if (parseOptionalImportType(Lex.getKind(), IK))
10360 return true;
10361 GVFlags.ImportType = static_cast<unsigned>(IK);
10362 Lex.Lex();
10363 break;
10364 default:
10365 return error(Lex.getLoc(), "expected gv flag type");
10366 }
10367 } while (EatIfPresent(lltok::comma));
10368
10369 if (parseToken(lltok::rparen, "expected ')' here"))
10370 return true;
10371
10372 return false;
10373}
10374
10375/// GVarFlags
10376/// ::= 'varFlags' ':' '(' 'readonly' ':' Flag
10377/// ',' 'writeonly' ':' Flag
10378/// ',' 'constant' ':' Flag ')'
10379bool LLParser::parseGVarFlags(GlobalVarSummary::GVarFlags &GVarFlags) {
10381 Lex.Lex();
10382
10383 if (parseToken(lltok::colon, "expected ':' here") ||
10384 parseToken(lltok::lparen, "expected '(' here"))
10385 return true;
10386
10387 auto ParseRest = [this](unsigned int &Val) {
10388 Lex.Lex();
10389 if (parseToken(lltok::colon, "expected ':'"))
10390 return true;
10391 return parseFlag(Val);
10392 };
10393
10394 do {
10395 unsigned Flag = 0;
10396 switch (Lex.getKind()) {
10397 case lltok::kw_readonly:
10398 if (ParseRest(Flag))
10399 return true;
10400 GVarFlags.MaybeReadOnly = Flag;
10401 break;
10402 case lltok::kw_writeonly:
10403 if (ParseRest(Flag))
10404 return true;
10405 GVarFlags.MaybeWriteOnly = Flag;
10406 break;
10407 case lltok::kw_constant:
10408 if (ParseRest(Flag))
10409 return true;
10410 GVarFlags.Constant = Flag;
10411 break;
10413 if (ParseRest(Flag))
10414 return true;
10415 GVarFlags.VCallVisibility = Flag;
10416 break;
10417 default:
10418 return error(Lex.getLoc(), "expected gvar flag type");
10419 }
10420 } while (EatIfPresent(lltok::comma));
10421 return parseToken(lltok::rparen, "expected ')' here");
10422}
10423
10424/// ModuleReference
10425/// ::= 'module' ':' UInt
10426bool LLParser::parseModuleReference(StringRef &ModulePath) {
10427 // parse module id.
10428 if (parseToken(lltok::kw_module, "expected 'module' here") ||
10429 parseToken(lltok::colon, "expected ':' here") ||
10430 parseToken(lltok::SummaryID, "expected module ID"))
10431 return true;
10432
10433 unsigned ModuleID = Lex.getUIntVal();
10434 auto I = ModuleIdMap.find(ModuleID);
10435 // We should have already parsed all module IDs
10436 assert(I != ModuleIdMap.end());
10437 ModulePath = I->second;
10438 return false;
10439}
10440
10441/// GVReference
10442/// ::= SummaryID
10443bool LLParser::parseGVReference(ValueInfo &VI, unsigned &GVId) {
10444 bool WriteOnly = false, ReadOnly = EatIfPresent(lltok::kw_readonly);
10445 if (!ReadOnly)
10446 WriteOnly = EatIfPresent(lltok::kw_writeonly);
10447 if (parseToken(lltok::SummaryID, "expected GV ID"))
10448 return true;
10449
10450 GVId = Lex.getUIntVal();
10451 // Check if we already have a VI for this GV
10452 if (GVId < NumberedValueInfos.size() && NumberedValueInfos[GVId]) {
10453 assert(NumberedValueInfos[GVId].getRef() != FwdVIRef);
10454 VI = NumberedValueInfos[GVId];
10455 } else
10456 // We will create a forward reference to the stored location.
10457 VI = ValueInfo(false, FwdVIRef);
10458
10459 if (ReadOnly)
10460 VI.setReadOnly();
10461 if (WriteOnly)
10462 VI.setWriteOnly();
10463 return false;
10464}
10465
10466/// OptionalAllocs
10467/// := 'allocs' ':' '(' Alloc [',' Alloc]* ')'
10468/// Alloc ::= '(' 'versions' ':' '(' Version [',' Version]* ')'
10469/// ',' MemProfs ')'
10470/// Version ::= UInt32
10471bool LLParser::parseOptionalAllocs(std::vector<AllocInfo> &Allocs) {
10473 Lex.Lex();
10474
10475 if (parseToken(lltok::colon, "expected ':' in allocs") ||
10476 parseToken(lltok::lparen, "expected '(' in allocs"))
10477 return true;
10478
10479 // parse each alloc
10480 do {
10481 if (parseToken(lltok::lparen, "expected '(' in alloc") ||
10482 parseToken(lltok::kw_versions, "expected 'versions' in alloc") ||
10483 parseToken(lltok::colon, "expected ':'") ||
10484 parseToken(lltok::lparen, "expected '(' in versions"))
10485 return true;
10486
10487 SmallVector<uint8_t> Versions;
10488 do {
10489 uint8_t V = 0;
10490 if (parseAllocType(V))
10491 return true;
10492 Versions.push_back(V);
10493 } while (EatIfPresent(lltok::comma));
10494
10495 if (parseToken(lltok::rparen, "expected ')' in versions") ||
10496 parseToken(lltok::comma, "expected ',' in alloc"))
10497 return true;
10498
10499 std::vector<MIBInfo> MIBs;
10500 if (parseMemProfs(MIBs))
10501 return true;
10502
10503 Allocs.push_back({Versions, MIBs});
10504
10505 if (parseToken(lltok::rparen, "expected ')' in alloc"))
10506 return true;
10507 } while (EatIfPresent(lltok::comma));
10508
10509 if (parseToken(lltok::rparen, "expected ')' in allocs"))
10510 return true;
10511
10512 return false;
10513}
10514
10515/// MemProfs
10516/// := 'memProf' ':' '(' MemProf [',' MemProf]* ')'
10517/// MemProf ::= '(' 'type' ':' AllocType
10518/// ',' 'stackIds' ':' '(' StackId [',' StackId]* ')' ')'
10519/// StackId ::= UInt64
10520bool LLParser::parseMemProfs(std::vector<MIBInfo> &MIBs) {
10522 Lex.Lex();
10523
10524 if (parseToken(lltok::colon, "expected ':' in memprof") ||
10525 parseToken(lltok::lparen, "expected '(' in memprof"))
10526 return true;
10527
10528 // parse each MIB
10529 do {
10530 if (parseToken(lltok::lparen, "expected '(' in memprof") ||
10531 parseToken(lltok::kw_type, "expected 'type' in memprof") ||
10532 parseToken(lltok::colon, "expected ':'"))
10533 return true;
10534
10536 if (parseAllocType(AllocType))
10537 return true;
10538
10539 if (parseToken(lltok::comma, "expected ',' in memprof") ||
10540 parseToken(lltok::kw_stackIds, "expected 'stackIds' in memprof") ||
10541 parseToken(lltok::colon, "expected ':'") ||
10542 parseToken(lltok::lparen, "expected '(' in stackIds"))
10543 return true;
10544
10545 SmallVector<unsigned> StackIdIndices;
10546 do {
10547 uint64_t StackId = 0;
10548 if (parseUInt64(StackId))
10549 return true;
10550 StackIdIndices.push_back(Index->addOrGetStackIdIndex(StackId));
10551 } while (EatIfPresent(lltok::comma));
10552
10553 if (parseToken(lltok::rparen, "expected ')' in stackIds"))
10554 return true;
10555
10556 MIBs.push_back({(AllocationType)AllocType, StackIdIndices});
10557
10558 if (parseToken(lltok::rparen, "expected ')' in memprof"))
10559 return true;
10560 } while (EatIfPresent(lltok::comma));
10561
10562 if (parseToken(lltok::rparen, "expected ')' in memprof"))
10563 return true;
10564
10565 return false;
10566}
10567
10568/// AllocType
10569/// := ('none'|'notcold'|'cold'|'hot')
10570bool LLParser::parseAllocType(uint8_t &AllocType) {
10571 switch (Lex.getKind()) {
10572 case lltok::kw_none:
10574 break;
10575 case lltok::kw_notcold:
10577 break;
10578 case lltok::kw_cold:
10580 break;
10581 case lltok::kw_hot:
10583 break;
10584 default:
10585 return error(Lex.getLoc(), "invalid alloc type");
10586 }
10587 Lex.Lex();
10588 return false;
10589}
10590
10591/// OptionalCallsites
10592/// := 'callsites' ':' '(' Callsite [',' Callsite]* ')'
10593/// Callsite ::= '(' 'callee' ':' GVReference
10594/// ',' 'clones' ':' '(' Version [',' Version]* ')'
10595/// ',' 'stackIds' ':' '(' StackId [',' StackId]* ')' ')'
10596/// Version ::= UInt32
10597/// StackId ::= UInt64
10598bool LLParser::parseOptionalCallsites(std::vector<CallsiteInfo> &Callsites) {
10600 Lex.Lex();
10601
10602 if (parseToken(lltok::colon, "expected ':' in callsites") ||
10603 parseToken(lltok::lparen, "expected '(' in callsites"))
10604 return true;
10605
10606 IdToIndexMapType IdToIndexMap;
10607 // parse each callsite
10608 do {
10609 if (parseToken(lltok::lparen, "expected '(' in callsite") ||
10610 parseToken(lltok::kw_callee, "expected 'callee' in callsite") ||
10611 parseToken(lltok::colon, "expected ':'"))
10612 return true;
10613
10614 ValueInfo VI;
10615 unsigned GVId = 0;
10616 LocTy Loc = Lex.getLoc();
10617 if (!EatIfPresent(lltok::kw_null)) {
10618 if (parseGVReference(VI, GVId))
10619 return true;
10620 }
10621
10622 if (parseToken(lltok::comma, "expected ',' in callsite") ||
10623 parseToken(lltok::kw_clones, "expected 'clones' in callsite") ||
10624 parseToken(lltok::colon, "expected ':'") ||
10625 parseToken(lltok::lparen, "expected '(' in clones"))
10626 return true;
10627
10628 SmallVector<unsigned> Clones;
10629 do {
10630 unsigned V = 0;
10631 if (parseUInt32(V))
10632 return true;
10633 Clones.push_back(V);
10634 } while (EatIfPresent(lltok::comma));
10635
10636 if (parseToken(lltok::rparen, "expected ')' in clones") ||
10637 parseToken(lltok::comma, "expected ',' in callsite") ||
10638 parseToken(lltok::kw_stackIds, "expected 'stackIds' in callsite") ||
10639 parseToken(lltok::colon, "expected ':'") ||
10640 parseToken(lltok::lparen, "expected '(' in stackIds"))
10641 return true;
10642
10643 SmallVector<unsigned> StackIdIndices;
10644 do {
10645 uint64_t StackId = 0;
10646 if (parseUInt64(StackId))
10647 return true;
10648 StackIdIndices.push_back(Index->addOrGetStackIdIndex(StackId));
10649 } while (EatIfPresent(lltok::comma));
10650
10651 if (parseToken(lltok::rparen, "expected ')' in stackIds"))
10652 return true;
10653
10654 // Keep track of the Callsites array index needing a forward reference.
10655 // We will save the location of the ValueInfo needing an update, but
10656 // can only do so once the SmallVector is finalized.
10657 if (VI.getRef() == FwdVIRef)
10658 IdToIndexMap[GVId].push_back(std::make_pair(Callsites.size(), Loc));
10659 Callsites.push_back({VI, Clones, StackIdIndices});
10660
10661 if (parseToken(lltok::rparen, "expected ')' in callsite"))
10662 return true;
10663 } while (EatIfPresent(lltok::comma));
10664
10665 // Now that the Callsites vector is finalized, it is safe to save the
10666 // locations of any forward GV references that need updating later.
10667 for (auto I : IdToIndexMap) {
10668 auto &Infos = ForwardRefValueInfos[I.first];
10669 for (auto P : I.second) {
10670 assert(Callsites[P.first].Callee.getRef() == FwdVIRef &&
10671 "Forward referenced ValueInfo expected to be empty");
10672 Infos.emplace_back(&Callsites[P.first].Callee, P.second);
10673 }
10674 }
10675
10676 if (parseToken(lltok::rparen, "expected ')' in callsites"))
10677 return true;
10678
10679 return false;
10680}
static int64_t upperBound(StackOffset Size)
Unify divergent function exit nodes
This file implements the APSInt class, which is a simple class that represents an arbitrary sized int...
Expand Atomic instructions
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
Analysis containing CSE Info
Definition: CSEInfo.cpp:27
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil globals
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
Given that RA is a live value
This file defines the DenseMap class.
@ Default
Definition: DwarfDebug.cpp:87
This file contains constants used for implementing Dwarf debug support.
std::string Name
uint64_t Size
bool End
Definition: ELF_riscv.cpp:480
DenseMap< Block *, BlockRelaxAux > Blocks
Definition: ELF_riscv.cpp:507
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Hexagon Common GEP
#define _
Module.h This file contains the declarations for the Module class.
static GlobalValue * createGlobalFwdRef(Module *M, PointerType *PTy)
Definition: LLParser.cpp:1751
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)
Definition: LLParser.cpp:1146
cl::opt< cl::boolOrDefault > PreserveInputDbgFormat
static bool upgradeMemoryAttr(MemoryEffects &ME, lltok::Kind Kind)
Definition: LLParser.cpp:1654
static std::optional< MemoryEffects::Location > keywordToLoc(lltok::Kind Tok)
Definition: LLParser.cpp:2485
static void resolveFwdRef(ValueInfo *Fwd, ValueInfo &Resolved)
Definition: LLParser.cpp:9216
cl::opt< bool > WriteNewDbgInfoFormat
static unsigned parseOptionalLinkageAux(lltok::Kind Kind, bool &HasLinkage)
Definition: LLParser.cpp:2020
bool WriteNewDbgInfoFormatToBitcode
Definition: BasicBlock.cpp:47
static unsigned keywordToFPClassTest(lltok::Kind Tok)
Definition: LLParser.cpp:2566
llvm::cl::opt< bool > UseNewDbgInfoFormat
static std::optional< ModRefInfo > keywordToModRef(lltok::Kind Tok)
Definition: LLParser.cpp:2496
static bool isSanitizer(lltok::Kind Kind)
Definition: LLParser.cpp:1304
static void dropIntrinsicWithUnknownMetadataArgument(IntrinsicInst *II)
Definition: LLParser.cpp:155
#define PARSE_MD_FIELDS()
Definition: LLParser.cpp:5159
static Attribute::AttrKind tokenToAttribute(lltok::Kind Kind)
Definition: LLParser.cpp:1536
static ValueInfo EmptyVI
Definition: LLParser.cpp:8857
#define GET_OR_DISTINCT(CLASS, ARGS)
Definition: LLParser.cpp:5173
bool isOldDbgFormatIntrinsic(StringRef Name)
Definition: LLParser.cpp:6309
static bool isValidVisibilityForLinkage(unsigned V, unsigned L)
Definition: LLParser.cpp:1135
static std::string getTypeString(Type *T)
Definition: LLParser.cpp:71
static bool isValidDLLStorageClassForLinkage(unsigned S, unsigned L)
Definition: LLParser.cpp:1139
static const auto FwdVIRef
Definition: LLParser.cpp:9214
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
AllocType
This file contains the declarations for metadata subclasses.
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
#define P(N)
PowerPC Reduce CR logical Operation
llvm::cl::opt< bool > UseNewDbgInfoFormat
static bool getVal(MDTuple *MD, const char *Key, uint64_t &Val)
const SmallVectorImpl< MachineOperand > & Cond
dot regions Print regions of function to dot file(with no function bodies)"
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static const char * name
Definition: SMEABIPass.cpp:46
This file contains some templates that are useful if you are working with the STL at all.
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.
DEMANGLE_NAMESPACE_BEGIN bool starts_with(std::string_view self, char C) noexcept
#define error(X)
static SymbolRef::Type getType(const Symbol *Sym)
Definition: TapiFile.cpp:39
Value * RHS
Value * LHS
static APFloat getSNaN(const fltSemantics &Sem, bool Negative=false, const APInt *payload=nullptr)
Factory for SNaN values.
Definition: APFloat.h:1125
Class for arbitrary precision integers.
Definition: APInt.h:78
uint64_t getZExtValue() const
Get zero extended value.
Definition: APInt.h:1520
unsigned getBitWidth() const
Return the number of bits in the APInt.
Definition: APInt.h:1468
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
Definition: APInt.h:475
bool getBoolValue() const
Convert APInt to a boolean value.
Definition: APInt.h:471
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
Definition: APInt.h:1237
An arbitrary precision integer that knows its signedness.
Definition: APSInt.h:23
APSInt extOrTrunc(uint32_t width) const
Definition: APSInt.h:119
APSInt extend(uint32_t width) const
Definition: APSInt.h:112
bool isSigned() const
Definition: APSInt.h:77
an instruction to allocate memory on the stack
Definition: Instructions.h:63
void setSwiftError(bool V)
Specify whether this alloca is used to represent a swifterror.
Definition: Instructions.h:151
void setUsedWithInAlloca(bool V)
Specify whether this alloca is used to represent the arguments to a call.
Definition: Instructions.h:144
This class represents an incoming formal argument to a Function.
Definition: Argument.h:31
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:168
iterator begin() const
Definition: ArrayRef.h:156
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
Definition: Type.cpp:758
static ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
An instruction that atomically checks whether a specified value is in a memory location,...
Definition: Instructions.h:501
void setWeak(bool IsWeak)
Definition: Instructions.h:564
static bool isValidFailureOrdering(AtomicOrdering Ordering)
Definition: Instructions.h:574
void setVolatile(bool V)
Specify whether this is a volatile cmpxchg.
Definition: Instructions.h:559
static bool isValidSuccessOrdering(AtomicOrdering Ordering)
Definition: Instructions.h:569
an instruction that atomically reads a memory location, combines it with another value,...
Definition: Instructions.h:704
void setVolatile(bool V)
Specify whether this is a volatile RMW or not.
Definition: Instructions.h:841
BinOp
This enumeration lists the possible modifications atomicrmw can make.
Definition: Instructions.h:716
@ Add
*p = old + v
Definition: Instructions.h:720
@ FAdd
*p = old + v
Definition: Instructions.h:741
@ USubCond
Subtract only if no unsigned overflow.
Definition: Instructions.h:764
@ Min
*p = old <signed v ? old : v
Definition: Instructions.h:734
@ Or
*p = old | v
Definition: Instructions.h:728
@ Sub
*p = old - v
Definition: Instructions.h:722
@ And
*p = old & v
Definition: Instructions.h:724
@ Xor
*p = old ^ v
Definition: Instructions.h:730
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
Definition: Instructions.h:768
@ FSub
*p = old - v
Definition: Instructions.h:744
@ UIncWrap
Increment one up to a maximum value.
Definition: Instructions.h:756
@ Max
*p = old >signed v ? old : v
Definition: Instructions.h:732
@ UMin
*p = old <unsigned v ? old : v
Definition: Instructions.h:738
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
Definition: Instructions.h:752
@ UMax
*p = old >unsigned v ? old : v
Definition: Instructions.h:736
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
Definition: Instructions.h:748
@ UDecWrap
Decrement one until a minimum value or zero.
Definition: Instructions.h:760
@ Nand
*p = ~(old & v)
Definition: Instructions.h:726
static StringRef getOperationName(BinOp Op)
AttributeSet getFnAttrs() const
The function attributes are returned.
static AttributeList get(LLVMContext &C, ArrayRef< std::pair< unsigned, Attribute > > Attrs)
Create an AttributeList with the specified parameters in it.
AttributeList removeAttribute(LLVMContext &C, unsigned Index, StringRef Kind) const
Definition: Attributes.h:660
AttributeList addFnAttributes(LLVMContext &C, const AttrBuilder &B) const
Add function attribute to the list.
Definition: Attributes.h:595
bool hasParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Return true if the attribute exists for the given argument.
Definition: Attributes.h:829
AttributeSet getAttributes(unsigned Index) const
The attributes for the specified index are returned.
AttributeList removeFnAttributes(LLVMContext &C, const AttributeMask &AttrsToRemove) const
Remove the specified attribute at the function index from this attribute list.
Definition: Attributes.h:693
static AttributeSet get(LLVMContext &C, const AttrBuilder &B)
Definition: Attributes.cpp:897
static bool canUseAsRetAttr(AttrKind Kind)
Definition: Attributes.cpp:769
static bool isTypeAttrKind(AttrKind Kind)
Definition: Attributes.h:105
static bool canUseAsFnAttr(AttrKind Kind)
Definition: Attributes.cpp:761
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition: Attributes.h:86
@ None
No attributes have been set.
Definition: Attributes.h:88
static bool canUseAsParamAttr(AttrKind Kind)
Definition: Attributes.cpp:765
LLVM Basic Block Representation.
Definition: BasicBlock.h:61
iterator end()
Definition: BasicBlock.h:461
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.
Definition: BasicBlock.h:212
static 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 BlockAddress * get(Function *F, BasicBlock *BB)
Return a BlockAddress for the specified function and basic block.
Definition: Constants.cpp:1897
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
void setCallingConv(CallingConv::ID CC)
Definition: InstrTypes.h:1411
void setAttributes(AttributeList A)
Set the attributes for this call.
Definition: InstrTypes.h:1428
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
static CallBrInst * Create(FunctionType *Ty, Value *Func, BasicBlock *DefaultDest, ArrayRef< BasicBlock * > IndirectDests, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
This class represents a function call, abstracting a target machine's calling convention.
void setTailCallKind(TailCallKind TCK)
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static 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 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.
Definition: InstrTypes.h:673
@ FCMP_OEQ
0 0 0 1 True if ordered and equal
Definition: InstrTypes.h:676
@ FCMP_TRUE
1 1 1 1 Always true (always folded)
Definition: InstrTypes.h:690
@ ICMP_SLT
signed less than
Definition: InstrTypes.h:702
@ ICMP_SLE
signed less or equal
Definition: InstrTypes.h:703
@ FCMP_OLT
0 1 0 0 True if ordered and less than
Definition: InstrTypes.h:679
@ FCMP_ULE
1 1 0 1 True if unordered, less than, or equal
Definition: InstrTypes.h:688
@ FCMP_OGT
0 0 1 0 True if ordered and greater than
Definition: InstrTypes.h:677
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition: InstrTypes.h:678
@ ICMP_UGE
unsigned greater or equal
Definition: InstrTypes.h:697
@ ICMP_UGT
unsigned greater than
Definition: InstrTypes.h:696
@ ICMP_SGT
signed greater than
Definition: InstrTypes.h:700
@ FCMP_ULT
1 1 0 0 True if unordered or less than
Definition: InstrTypes.h:687
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition: InstrTypes.h:681
@ FCMP_UEQ
1 0 0 1 True if unordered or equal
Definition: InstrTypes.h:684
@ ICMP_ULT
unsigned less than
Definition: InstrTypes.h:698
@ FCMP_UGT
1 0 1 0 True if unordered or greater than
Definition: InstrTypes.h:685
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition: InstrTypes.h:680
@ FCMP_ORD
0 1 1 1 True if ordered (no nans)
Definition: InstrTypes.h:682
@ ICMP_EQ
equal
Definition: InstrTypes.h:694
@ ICMP_NE
not equal
Definition: InstrTypes.h:695
@ ICMP_SGE
signed greater or equal
Definition: InstrTypes.h:701
@ FCMP_UNE
1 1 1 0 True if unordered or not equal
Definition: InstrTypes.h:689
@ ICMP_ULE
unsigned less or equal
Definition: InstrTypes.h:699
@ FCMP_UGE
1 0 1 1 True if unordered, greater than, or equal
Definition: InstrTypes.h:686
@ FCMP_FALSE
0 0 0 0 Always false (always folded)
Definition: InstrTypes.h:675
@ FCMP_UNO
1 0 0 0 True if unordered: isnan(X) | isnan(Y)
Definition: InstrTypes.h:683
@ Largest
The linker will choose the largest COMDAT.
Definition: Comdat.h:38
@ SameSize
The data referenced by the COMDAT must be the same size.
Definition: Comdat.h:40
@ Any
The linker may choose any COMDAT.
Definition: Comdat.h:36
@ NoDeduplicate
No deduplication is performed.
Definition: Comdat.h:39
@ ExactMatch
The data referenced by the COMDAT must be the same.
Definition: Comdat.h:37
static Constant * get(ArrayType *T, ArrayRef< Constant * > V)
Definition: Constants.cpp:1312
static ConstantAsMetadata * get(Constant *C)
Definition: Metadata.h:528
static Constant * getString(LLVMContext &Context, StringRef Initializer, bool AddNull=true)
This method constructs a CDS and initializes it with a text string.
Definition: Constants.cpp:2990
static Constant * getExtractElement(Constant *Vec, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
Definition: Constants.cpp:2554
static Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
Definition: Constants.cpp:2222
static Constant * getInsertElement(Constant *Vec, Constant *Elt, Constant *Idx, Type *OnlyIfReducedTy=nullptr)
Definition: Constants.cpp:2576
static Constant * getShuffleVector(Constant *V1, Constant *V2, ArrayRef< int > Mask, Type *OnlyIfReducedTy=nullptr)
Definition: Constants.cpp:2599
static 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.
Definition: Constants.cpp:2340
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.
Definition: Constants.h:1267
static bool isValueValidForType(Type *Ty, const APFloat &V)
Return true if Ty is big enough to represent V.
Definition: Constants.cpp:1611
This is the shared class of boolean and integer constants.
Definition: Constants.h:83
static ConstantInt * getTrue(LLVMContext &Context)
Definition: Constants.cpp:866
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
Definition: Constants.h:126
static ConstantInt * getFalse(LLVMContext &Context)
Definition: Constants.cpp:873
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
Definition: Constants.h:151
static ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
Definition: Constants.cpp:1826
static ConstantPtrAuth * get(Constant *Ptr, ConstantInt *Key, ConstantInt *Disc, Constant *AddrDisc)
Return a pointer signed with the specified parameters.
Definition: Constants.cpp:2072
static std::optional< ConstantRangeList > getConstantRangeList(ArrayRef< ConstantRange > RangesRef)
This class represents a range of values.
Definition: ConstantRange.h:47
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
Definition: ConstantRange.h:84
static Constant * get(StructType *T, ArrayRef< Constant * > V)
Definition: Constants.cpp:1378
static Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
Definition: Constants.cpp:1472
static Constant * get(ArrayRef< Constant * > V)
Definition: Constants.cpp:1421
This is an important base class in LLVM.
Definition: Constant.h:42
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
Definition: Constants.cpp:373
static DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
static DIAssignID * getDistinct(LLVMContext &Context)
Basic type, like 'int' or 'float'.
Debug common block.
DebugEmissionKind getEmissionKind() const
DebugNameTableKind getNameTableKind() const
static DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, Metadata *Rank, Metadata *Annotations)
Build a DICompositeType with the given ODR identifier.
Enumeration value.
DWARF expression.
static std::optional< ChecksumKind > getChecksumKind(StringRef CSKindStr)
ChecksumKind
Which algorithm (e.g.
A pair of DIGlobalVariable and DIExpression.
An imported module (C++ using directive or similar).
Debug lexical block.
Debug location.
Represents a module in the programming language, for example, a Clang module, or a Fortran module.
Debug lexical block.
Tagged DWARF-like metadata node.
static DIFlags getFlag(StringRef Flag)
DIFlags
Debug info flags.
String type, Fortran CHARACTER(n)
Subprogram description.
static DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
static DISPFlags getFlag(StringRef Flag)
DISPFlags
Debug info subprogram flags.
Array subrange.
Type array for a subprogram.
static DSOLocalEquivalent * get(GlobalValue *GV)
Return a DSOLocalEquivalent for the specified global value.
Definition: Constants.cpp:1970
This class represents an Operation in the Expression.
static Expected< DataLayout > parse(StringRef LayoutString)
Parse a data layout string and return the layout.
Definition: DataLayout.cpp:264
static DbgLabelRecord * createUnresolvedDbgLabelRecord(MDNode *Label, MDNode *DL)
For use during parsing; creates a DbgLabelRecord from as-of-yet unresolved MDNodes.
Base class for non-instruction debug metadata records that have positions within IR.
Kind
Subclass discriminator.
static 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...
A debug info location.
Definition: DebugLoc.h:33
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...
Definition: DenseMap.h:194
unsigned size() const
Definition: DenseMap.h:99
static constexpr ElementCount getFixed(ScalarTy MinVal)
Definition: TypeSize.h:311
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
Tagged union holding either a T or a Error.
Definition: Error.h:481
Error takeError()
Take ownership of the stored error.
Definition: Error.h:608
reference get()
Returns a reference to the stored T value.
Definition: Error.h:578
Class representing an expression and its matching format.
static ExtractElementInst * Create(Value *Vec, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static bool isValidOperands(const Value *Vec, const Value *Idx)
Return true if an extractelement instruction can be formed with the specified operands.
static Type * getIndexedType(Type *Agg, ArrayRef< unsigned > Idxs)
Returns the type of the element that would be extracted with an extractvalue instruction with the spe...
static ExtractValueInst * Create(Value *Agg, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This instruction compares its operands according to the predicate given to the constructor.
Convenience struct for specifying and reasoning about fast-math flags.
Definition: FMF.h:20
bool any() const
Definition: FMF.h:57
An instruction for ordering other memory operations.
Definition: Instructions.h:424
This class represents a freeze function that returns random concrete value if an operand is either a ...
std::pair< ValueInfo, CalleeInfo > EdgeTy
<CalleeValueInfo, CalleeInfo> call edge pair.
Type::subtype_iterator param_iterator
Definition: DerivedTypes.h:128
static bool isValidReturnType(Type *RetTy)
Return true if the specified type is valid as a return type.
Definition: Type.cpp:391
static 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)
Definition: Function.h:173
void setPrefixData(Constant *PrefixData)
Definition: Function.cpp:1063
void setGC(std::string Str)
Definition: Function.cpp:840
void setPersonalityFn(Constant *Fn)
Definition: Function.cpp:1053
arg_iterator arg_begin()
Definition: Function.h:868
void setAttributes(AttributeList Attrs)
Set the attribute list for this Function.
Definition: Function.h:356
void setPrologueData(Constant *PrologueData)
Definition: Function.cpp:1073
void setCallingConv(CallingConv::ID CC)
Definition: Function.h:281
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags noUnsignedSignedWrap()
Generic tagged DWARF-like metadata node.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Definition: Instructions.h:933
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Definition: Instructions.h:956
static 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)
Definition: GlobalAlias.h:97
static 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...
Definition: Globals.cpp:557
static 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...
Definition: Globals.cpp:614
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalObject.
Definition: Globals.cpp:143
void setComdat(Comdat *C)
Definition: Globals.cpp:212
void setSection(StringRef S)
Change the section for this global.
Definition: Globals.cpp:273
void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
Definition: Metadata.cpp:1565
const SanitizerMetadata & getSanitizerMetadata() const
Definition: Globals.cpp:243
static bool isLocalLinkage(LinkageTypes Linkage)
Definition: GlobalValue.h:409
void setUnnamedAddr(UnnamedAddr Val)
Definition: GlobalValue.h:231
void setDLLStorageClass(DLLStorageClassTypes C)
Definition: GlobalValue.h:284
void setThreadLocalMode(ThreadLocalMode Val)
Definition: GlobalValue.h:267
void setLinkage(LinkageTypes LT)
Definition: GlobalValue.h:537
DLLStorageClassTypes
Storage classes of global values for PE targets.
Definition: GlobalValue.h:73
@ DLLExportStorageClass
Function to be accessible from DLL.
Definition: GlobalValue.h:76
@ DLLImportStorageClass
Function to be imported from DLL.
Definition: GlobalValue.h:75
bool hasSanitizerMetadata() const
Definition: GlobalValue.h:355
unsigned getAddressSpace() const
Definition: GlobalValue.h:205
GUID getGUID() const
Return a 64-bit global unique ID constructed from global value name (i.e.
Definition: GlobalValue.h:595
void setDSOLocal(bool Local)
Definition: GlobalValue.h:303
void eraseFromParent()
This method unlinks 'this' from the containing module and deletes it.
Definition: Globals.cpp:91
PointerType * getType() const
Global values are always pointers.
Definition: GlobalValue.h:294
VisibilityTypes
An enumeration for the kinds of visibility of global values.
Definition: GlobalValue.h:66
@ DefaultVisibility
The GV is visible.
Definition: GlobalValue.h:67
@ HiddenVisibility
The GV is hidden.
Definition: GlobalValue.h:68
@ ProtectedVisibility
The GV is protected.
Definition: GlobalValue.h:69
static bool isValidDeclarationLinkage(LinkageTypes Linkage)
Definition: GlobalValue.h:418
void setVisibility(VisibilityTypes V)
Definition: GlobalValue.h:254
void setSanitizerMetadata(SanitizerMetadata Meta)
Definition: Globals.cpp:249
std::string getGlobalIdentifier() const
Return the modified name for this global value suitable to be used as the key for a global lookup (e....
Definition: Globals.cpp:184
LinkageTypes
An enumeration for the kinds of linkage for global values.
Definition: GlobalValue.h:51
@ PrivateLinkage
Like Internal, but omit from symbol table.
Definition: GlobalValue.h:60
@ CommonLinkage
Tentative definitions.
Definition: GlobalValue.h:62
@ InternalLinkage
Rename collisions when linking (static functions).
Definition: GlobalValue.h:59
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
Definition: GlobalValue.h:54
@ WeakODRLinkage
Same, but only replaced by something equivalent.
Definition: GlobalValue.h:57
@ ExternalLinkage
Externally visible function.
Definition: GlobalValue.h:52
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
Definition: GlobalValue.h:56
@ AppendingLinkage
Special purpose, only applies to global arrays.
Definition: GlobalValue.h:58
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition: GlobalValue.h:53
@ ExternalWeakLinkage
ExternalWeak linkage description.
Definition: GlobalValue.h:61
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Definition: GlobalValue.h:55
Type * getValueType() const
Definition: GlobalValue.h:296
void setPartition(StringRef Part)
Definition: Globals.cpp:226
void setInitializer(Constant *InitVal)
setInitializer - Sets the initializer for this global variable, removing any existing initializer if ...
Definition: Globals.cpp:492
void setAttributes(AttributeSet A)
Set attribute list for this global.
void setConstant(bool Val)
void setCodeModel(CodeModel::Model CM)
Change the code model for this global.
Definition: Globals.cpp:534
void setExternallyInitialized(bool Val)
This instruction compares its operands according to the predicate given to the constructor.
Indirect Branch Instruction.
void addDestination(BasicBlock *Dest)
Add a destination.
static IndirectBrInst * Create(Value *Address, unsigned NumDests, InsertPosition InsertBefore=nullptr)
static 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.
Definition: InlineAsm.cpp:43
static 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...
Definition: InlineAsm.cpp:273
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static 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)
void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
void setNonNeg(bool b=true)
Set or clear the nneg flag on this instruction, which must be a zext instruction.
bool isTerminator() const
Definition: Instruction.h:277
void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
Definition: Metadata.cpp:1679
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.
Definition: IntrinsicInst.h:48
Invoke instruction.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
lltok::Kind Lex()
Definition: LLLexer.h:65
unsigned getUIntVal() const
Definition: LLLexer.h:74
lltok::Kind getKind() const
Definition: LLLexer.h:71
const std::string & getStrVal() const
Definition: LLLexer.h:72
Type * getTyVal() const
Definition: LLLexer.h:73
LocTy getLoc() const
Definition: LLLexer.h:70
const APSInt & getAPSIntVal() const
Definition: LLLexer.h:75
void setIgnoreColonInIdentifiers(bool val)
Definition: LLLexer.h:78
const APFloat & getAPFloatVal() const
Definition: LLLexer.h:76
bool parseDIExpressionBodyAtBeginning(MDNode *&Result, unsigned &Read, const SlotMapping *Slots)
Definition: LLParser.cpp:127
LLLexer::LocTy LocTy
Definition: LLParser.h:109
LLVMContext & getContext()
Definition: LLParser.h:210
bool parseTypeAtBeginning(Type *&Ty, unsigned &Read, const SlotMapping *Slots)
Definition: LLParser.cpp:111
bool parseStandaloneConstantValue(Constant *&C, const SlotMapping *Slots)
Definition: LLParser.cpp:98
bool Run(bool UpgradeDebugInfo, DataLayoutCallbackTy DataLayoutCallback=[](StringRef, StringRef) { return std::nullopt;})
Run: module ::= toplevelentity*.
Definition: LLParser.cpp:79
bool shouldDiscardValueNames() const
Return true if the Context runtime configuration is set to discard all value names.
SyncScope::ID getOrInsertSyncScopeID(StringRef SSN)
getOrInsertSyncScopeID - Maps synchronization scope name to synchronization scope ID.
static 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...
An instruction for reading from memory.
Definition: Instructions.h:176
Metadata node.
Definition: Metadata.h:1069
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1551
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1543
A single uniqued string.
Definition: Metadata.h:720
static MDString * get(LLVMContext &Context, StringRef Str)
Definition: Metadata.cpp:606
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a distinct node.
Definition: Metadata.h:1511
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1500
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
Definition: Metadata.h:1520
static MemoryEffectsBase readOnly()
Create MemoryEffectsBase that can read any memory.
Definition: ModRef.h:122
MemoryEffectsBase getWithModRef(Location Loc, ModRefInfo MR) const
Get new MemoryEffectsBase with modified ModRefInfo for Loc.
Definition: ModRef.h:170
static MemoryEffectsBase argMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access argument memory.
Definition: ModRef.h:132
static MemoryEffectsBase inaccessibleMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access inaccessible memory.
Definition: ModRef.h:138
static MemoryEffectsBase writeOnly()
Create MemoryEffectsBase that can write any memory.
Definition: ModRef.h:127
static MemoryEffectsBase inaccessibleOrArgMemOnly(ModRefInfo MR=ModRefInfo::ModRef)
Create MemoryEffectsBase that can only access inaccessible or argument memory.
Definition: ModRef.h:145
static MemoryEffectsBase none()
Create MemoryEffectsBase that cannot read or write any memory.
Definition: ModRef.h:117
static MemoryEffectsBase unknown()
Create MemoryEffectsBase that can read and write any memory.
Definition: ModRef.h:112
Metadata wrapper in the Value hierarchy.
Definition: Metadata.h:176
static MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition: Metadata.cpp:103
Root of the metadata hierarchy.
Definition: Metadata.h:62
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
A tuple of MDNodes.
Definition: Metadata.h:1731
void addOperand(MDNode *M)
Definition: Metadata.cpp:1431
static NoCFIValue * get(GlobalValue *GV)
Return a NoCFIValue for the specified function.
Definition: Constants.cpp:2028
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 PointerType * get(Type *ElementType, unsigned AddressSpace)
This constructs a pointer to an object of the specified type in a numbered address space.
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
Definition: Type.cpp:863
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Definition: DerivedTypes.h:686
static PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Definition: Constants.cpp:1878
Resume the propagation of an exception.
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.
Definition: SMLoc.h:23
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, Instruction *MDFrom=nullptr)
static 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.
This instruction constructs a fixed permutation of two input vectors.
ArrayRef< int > getShuffleMask() const
static 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.
Definition: SmallPtrSet.h:384
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:519
bool empty() const
Definition: SmallVector.h:81
size_t size() const
Definition: SmallVector.h:78
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:573
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:937
void reserve(size_type N)
Definition: SmallVector.h:663
void push_back(const T &Elt)
Definition: SmallVector.h:413
pointer data()
Return a pointer to the vector's buffer, even if empty().
Definition: SmallVector.h:286
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
An instruction for storing to memory.
Definition: Instructions.h:292
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition: StringMap.h:128
iterator end()
Definition: StringMap.h:220
iterator find(StringRef Key)
Definition: StringMap.h:233
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
constexpr bool empty() const
empty - Check if the string is empty.
Definition: StringRef.h:147
A switch()-like statement whose cases are string literals.
Definition: StringSwitch.h:44
StringSwitch & Case(StringLiteral S, T Value)
Definition: StringSwitch.h:69
Class to represent struct types.
Definition: DerivedTypes.h:218
static StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition: Type.cpp:406
static StructType * create(LLVMContext &Context, StringRef Name)
This creates an identified struct.
Definition: Type.cpp:612
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
Definition: Type.cpp:696
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.
Definition: Type.cpp:531
bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Returns true if this struct contains a scalable vector.
Definition: Type.cpp:433
Multiway switch.
static SwitchInst * Create(Value *Value, BasicBlock *Default, unsigned NumCases, InsertPosition InsertBefore=nullptr)
@ HasZeroInit
zeroinitializer is valid for this target extension type.
Definition: DerivedTypes.h:806
static 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,...
Definition: Type.cpp:901
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition: Type.h:270
bool isArrayTy() const
True if this is an instance of ArrayType.
Definition: Type.h:261
bool isLabelTy() const
Return true if this is 'label'.
Definition: Type.h:228
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition: Type.h:243
bool isPointerTy() const
True if this is an instance of PointerType.
Definition: Type.h:264
static IntegerType * getInt1Ty(LLVMContext &C)
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition: Type.h:153
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
Definition: Type.h:145
unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
TypeID
Definitions of all of the base types for the Type system.
Definition: Type.h:54
static Type * getLabelTy(LLVMContext &C)
bool isFirstClassType() const
Return true if the type is "first class", meaning it is a valid type for a Value.
Definition: Type.h:289
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
Definition: Type.h:310
bool isAggregateType() const
Return true if the type is an aggregate type.
Definition: Type.h:303
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
Definition: Type.h:142
bool isScalableTy(SmallPtrSetImpl< const Type * > &Visited) const
Return true if this is a type whose size is a known multiple of vscale.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition: Type.h:128
static IntegerType * getInt8Ty(LLVMContext &C)
static Type * getTokenTy(LLVMContext &C)
bool isFloatingPointTy() const
Return true if this is one of the floating-point types.
Definition: Type.h:184
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
Definition: Type.h:267
bool isFunctionTy() const
True if this is an instance of FunctionType.
Definition: Type.h:255
static IntegerType * getInt64Ty(LLVMContext &C)
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:237
bool isTokenTy() const
Return true if this is 'token'.
Definition: Type.h:234
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Definition: Type.h:225
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isVoidTy() const
Return true if this is 'void'.
Definition: Type.h:139
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition: Type.h:355
bool isMetadataTy() const
Return true if this is 'metadata'.
Definition: Type.h:231
static UnaryOperator * Create(UnaryOps Op, Value *S, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a unary instruction, given the opcode and an operand.
static UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
Definition: Constants.cpp:1859
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
This class represents the va_arg llvm instruction, which returns an argument of the specified type gi...
static ValueAsMetadata * get(Value *V)
Definition: Metadata.cpp:501
LLVM Value Representation.
Definition: Value.h:74
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:255
static constexpr uint64_t MaximumAlignment
Definition: Value.h:811
void setName(const Twine &Name)
Change the name of the value.
Definition: Value.cpp:377
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition: Value.cpp:534
void deleteValue()
Delete a pointer to a generic Value.
Definition: Value.cpp:110
StringRef getName() const
Return a constant reference to the value's name.
Definition: Value.cpp:309
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
An efficient, type-erasing, non-owning reference to a callable.
self_iterator getIterator()
Definition: ilist_node.h:132
A raw_ostream that writes to an std::string.
Definition: raw_ostream.h:661
std::string & str()
Returns the string's reference.
Definition: raw_ostream.h:679
unsigned getOperationEncoding(StringRef OperationEncodingString)
Definition: Dwarf.cpp:165
unsigned getAttributeEncoding(StringRef EncodingString)
Definition: Dwarf.cpp:274
unsigned getTag(StringRef TagString)
Definition: Dwarf.cpp:32
unsigned getCallingConvention(StringRef LanguageString)
Definition: Dwarf.cpp:481
unsigned getLanguage(StringRef LanguageString)
Definition: Dwarf.cpp:404
unsigned getVirtuality(StringRef VirtualityString)
Definition: Dwarf.cpp:385
unsigned getMacinfo(StringRef MacinfoString)
Definition: Dwarf.cpp:553
#define UINT64_MAX
Definition: DataTypes.h:77
#define INT64_MIN
Definition: DataTypes.h:74
#define INT64_MAX
Definition: DataTypes.h:71
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 TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
Key
PAL metadata keys.
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.
Definition: BitmaskEnum.h:125
@ Entry
Definition: COFF.h:844
@ AArch64_VectorCall
Used between AArch64 Advanced SIMD functions.
Definition: CallingConv.h:221
@ X86_64_SysV
The C convention as specified in the x86-64 supplement to the System V ABI, used on most non-Windows ...
Definition: CallingConv.h:151
@ RISCV_VectorCall
Calling convention used for RISC-V V-extension.
Definition: CallingConv.h:268
@ AMDGPU_CS
Used for Mesa/AMDPAL compute shaders.
Definition: CallingConv.h:197
@ AMDGPU_VS
Used for Mesa vertex shaders, or AMDPAL last shader stage before rasterization (vertex shader if tess...
Definition: CallingConv.h:188
@ AVR_SIGNAL
Used for AVR signal routines.
Definition: CallingConv.h:179
@ Swift
Calling convention for Swift.
Definition: CallingConv.h:69
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
Definition: CallingConv.h:200
@ AArch64_SVE_VectorCall
Used between AArch64 SVE functions.
Definition: CallingConv.h:224
@ ARM_APCS
ARM Procedure Calling Standard (obsolete, but still used on some targets).
Definition: CallingConv.h:107
@ CFGuard_Check
Special calling convention on Windows for calling the Control Guard Check ICall funtion.
Definition: CallingConv.h:82
@ AVR_INTR
Used for AVR interrupt routines.
Definition: CallingConv.h:176
@ PreserveMost
Used for runtime calls that preserves most registers.
Definition: CallingConv.h:63
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
Definition: CallingConv.h:60
@ AMDGPU_Gfx
Used for AMD graphics targets.
Definition: CallingConv.h:232
@ DUMMY_HHVM
Placeholders for HHVM calling conventions (deprecated, removed).
Definition: CallingConv.h:166
@ AMDGPU_CS_ChainPreserve
Used on AMDGPUs to give the middle-end more control over argument placement.
Definition: CallingConv.h:249
@ AMDGPU_HS
Used for Mesa/AMDPAL hull shaders (= tessellation control shaders).
Definition: CallingConv.h:206
@ ARM_AAPCS
ARM Architecture Procedure Calling Standard calling convention (aka EABI).
Definition: CallingConv.h:111
@ AMDGPU_GS
Used for Mesa/AMDPAL geometry shaders.
Definition: CallingConv.h:191
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2
Preserve X2-X15, X19-X29, SP, Z0-Z31, P0-P15.
Definition: CallingConv.h:241
@ CXX_FAST_TLS
Used for access functions.
Definition: CallingConv.h:72
@ X86_INTR
x86 hardware interrupt context.
Definition: CallingConv.h:173
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0
Preserve X0-X13, X19-X29, SP, Z0-Z31, P0-P15.
Definition: CallingConv.h:238
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
Definition: CallingConv.h:245
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
Definition: CallingConv.h:50
@ AMDGPU_PS
Used for Mesa/AMDPAL pixel shaders.
Definition: CallingConv.h:194
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
Definition: CallingConv.h:47
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1
Preserve X1-X15, X19-X29, SP, Z0-Z31, P0-P15.
Definition: CallingConv.h:271
@ X86_ThisCall
Similar to X86_StdCall.
Definition: CallingConv.h:122
@ PTX_Device
Call to a PTX device function.
Definition: CallingConv.h:129
@ SPIR_KERNEL
Used for SPIR kernel functions.
Definition: CallingConv.h:144
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
Definition: CallingConv.h:66
@ X86_StdCall
stdcall is mostly used by the Win32 API.
Definition: CallingConv.h:99
@ SPIR_FUNC
Used for SPIR non-kernel device functions.
Definition: CallingConv.h:138
@ Fast
Attempts to make calls as fast as possible (e.g.
Definition: CallingConv.h:41
@ MSP430_INTR
Used for MSP430 interrupt routines.
Definition: CallingConv.h:117
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
Definition: CallingConv.h:163
@ Intel_OCL_BI
Used for Intel OpenCL built-ins.
Definition: CallingConv.h:147
@ PreserveNone
Used for runtime calls that preserves none general registers.
Definition: CallingConv.h:90
@ AMDGPU_ES
Used for AMDPAL shader stage before geometry shader if geometry is in use.
Definition: CallingConv.h:218
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
Definition: CallingConv.h:76
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
Definition: CallingConv.h:159
@ PTX_Kernel
Call to a PTX kernel. Passes all arguments in parameter space.
Definition: CallingConv.h:125
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
Definition: CallingConv.h:87
@ GRAAL
Used by GraalVM. Two additional registers are reserved.
Definition: CallingConv.h:255
@ AMDGPU_LS
Used for AMDPAL vertex shader if tessellation is in use.
Definition: CallingConv.h:213
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
Definition: CallingConv.h:114
@ X86_RegCall
Register calling convention used for parameters transfer optimization.
Definition: CallingConv.h:203
@ M68k_RTD
Used for M68k rtd-based CC (similar to X86's stdcall).
Definition: CallingConv.h:252
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ X86_FastCall
'fast' analog of X86_StdCall.
Definition: CallingConv.h:103
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
Definition: Intrinsics.cpp:731
ID lookupIntrinsicID(StringRef Name)
This does the actual lookup of an intrinsic ID which matches the given function name.
Definition: Intrinsics.cpp:706
bool getIntrinsicSignature(Intrinsic::ID, FunctionType *FT, SmallVectorImpl< Type * > &ArgTys)
Gets the type arguments of an intrinsic call by matching type contraints specified by the ....
Flag
These should be considered private to the implementation of the MCInstrDesc class.
Definition: MCInstrDesc.h:148
@ System
Synchronized with respect to all concurrently executing threads.
Definition: LLVMContext.h:57
@ FS
Definition: X86.h:211
@ GS
Definition: X86.h:210
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:443
@ DW_CC_hi_user
Definition: Dwarf.h:750
@ DW_ATE_hi_user
Definition: Dwarf.h:161
@ DW_LANG_hi_user
Definition: Dwarf.h:212
MacinfoRecordType
Definition: Dwarf.h:794
@ DW_MACINFO_vendor_ext
Definition: Dwarf.h:800
@ DW_VIRTUALITY_max
Definition: Dwarf.h:198
@ DW_TAG_hi_user
Definition: Dwarf.h:107
@ DW_TAG_invalid
LLVM mock tags (see also llvm/BinaryFormat/Dwarf.def).
Definition: Dwarf.h:47
@ DW_MACINFO_invalid
Macinfo type for invalid results.
Definition: Dwarf.h:49
@ DW_VIRTUALITY_invalid
Virtuality for invalid results.
Definition: Dwarf.h:48
@ kw_samesize
Definition: LLToken.h:238
@ kw_msp430_intrcc
Definition: LLToken.h:153
@ kw_acquire
Definition: LLToken.h:97
@ kw_cxx_fast_tlscc
Definition: LLToken.h:172
@ kw_extractvalue
Definition: LLToken.h:348
@ kw_dso_preemptable
Definition: LLToken.h:51
@ DwarfVirtuality
Definition: LLToken.h:483
@ kw_arm_apcscc
Definition: LLToken.h:145
@ kw_inteldialect
Definition: LLToken.h:128
@ kw_x86_stdcallcc
Definition: LLToken.h:140
@ kw_constant
Definition: LLToken.h:48
@ kw_graalcc
Definition: LLToken.h:186
@ kw_initialexec
Definition: LLToken.h:74
@ kw_aarch64_sme_preservemost_from_x1
Definition: LLToken.h:151
@ kw_mustBeUnreachable
Definition: LLToken.h:394
@ kw_internal
Definition: LLToken.h:54
@ kw_hhvm_ccc
Definition: LLToken.h:171
@ kw_ptrtoint
Definition: LLToken.h:310
@ kw_anyregcc
Definition: LLToken.h:162
@ kw_no_sanitize_hwaddress
Definition: LLToken.h:462
@ kw_win64cc
Definition: LLToken.h:161
@ kw_datalayout
Definition: LLToken.h:92
@ kw_wpdResolutions
Definition: LLToken.h:433
@ kw_cleanup
Definition: LLToken.h:318
@ kw_ptrauth
Definition: LLToken.h:353
@ kw_canAutoHide
Definition: LLToken.h:378
@ kw_alwaysInline
Definition: LLToken.h:390
@ kw_notail
Definition: LLToken.h:87
@ kw_insertelement
Definition: LLToken.h:345
@ kw_linkonce
Definition: LLToken.h:55
@ kw_fptrunc
Definition: LLToken.h:303
@ kw_inaccessiblememonly
Definition: LLToken.h:207
@ kw_amdgpu_gfx
Definition: LLToken.h:183
@ kw_getelementptr
Definition: LLToken.h:342
@ kw_m68k_rtdcc
Definition: LLToken.h:185
@ kw_preserve_nonecc
Definition: LLToken.h:167
@ kw_x86_fastcallcc
Definition: LLToken.h:141
@ kw_readOnly
Definition: LLToken.h:386
@ kw_varFlags
Definition: LLToken.h:447
@ kw_partition
Definition: LLToken.h:121
@ kw_visibility
Definition: LLToken.h:374
@ kw_vFuncId
Definition: LLToken.h:414
@ kw_noUnwind
Definition: LLToken.h:391
@ kw_disjoint
Definition: LLToken.h:114
@ kw_bitMask
Definition: LLToken.h:430
@ kw_unordered
Definition: LLToken.h:95
@ kw_singleImpl
Definition: LLToken.h:436
@ kw_swiftcc
Definition: LLToken.h:163
@ kw_localexec
Definition: LLToken.h:75
@ kw_cfguard_checkcc
Definition: LLToken.h:139
@ kw_stackIds
Definition: LLToken.h:451
@ kw_typeCheckedLoadConstVCalls
Definition: LLToken.h:413
@ kw_private
Definition: LLToken.h:53
@ kw_aarch64_sve_vector_pcs
Definition: LLToken.h:149
@ kw_amdgpu_kernel
Definition: LLToken.h:182
@ kw_acq_rel
Definition: LLToken.h:99
@ kw_uselistorder
Definition: LLToken.h:361
@ MetadataVar
Definition: LLToken.h:479
@ kw_blockcount
Definition: LLToken.h:372
@ kw_notEligibleToImport
Definition: LLToken.h:375
@ kw_noRecurse
Definition: LLToken.h:387
@ kw_dsoLocal
Definition: LLToken.h:377
@ kw_linkonce_odr
Definition: LLToken.h:56
@ kw_protected
Definition: LLToken.h:66
@ kw_samesign
Definition: LLToken.h:117
@ kw_variable
Definition: LLToken.h:403
@ kw_dllexport
Definition: LLToken.h:61
@ kw_hotness
Definition: LLToken.h:399
@ kw_x86_vectorcallcc
Definition: LLToken.h:143
@ kw_ptx_device
Definition: LLToken.h:157
@ kw_personality
Definition: LLToken.h:317
@ kw_catchpad
Definition: LLToken.h:332
@ kw_spir_func
Definition: LLToken.h:159
@ kw_inbounds
Definition: LLToken.h:115
@ kw_atomic
Definition: LLToken.h:94
@ kw_readNone
Definition: LLToken.h:385
@ kw_declaration
Definition: LLToken.h:381
@ kw_define
Definition: LLToken.h:46
@ DwarfAttEncoding
Definition: LLToken.h:482
@ kw_critical
Definition: LLToken.h:401
@ kw_external
Definition: LLToken.h:71
@ kw_largest
Definition: LLToken.h:236
@ kw_amdgpu_hs
Definition: LLToken.h:175
@ kw_spir_kernel
Definition: LLToken.h:158
@ kw_local_unnamed_addr
Definition: LLToken.h:68
@ kw_amdgpu_es
Definition: LLToken.h:176
@ kw_hasUnknownCall
Definition: LLToken.h:393
@ LocalVarID
Definition: LLToken.h:470
@ kw_seq_cst
Definition: LLToken.h:100
@ kw_unwind
Definition: LLToken.h:91
@ kw_distinct
Definition: LLToken.h:358
@ kw_linkage
Definition: LLToken.h:373
@ kw_amdgpu_gs
Definition: LLToken.h:177
@ kw_x86_intrcc
Definition: LLToken.h:169
@ kw_addrspacecast
Definition: LLToken.h:312
@ kw_callsites
Definition: LLToken.h:449
@ kw_zeroinitializer
Definition: LLToken.h:76
@ StringConstant
Definition: LLToken.h:480
@ kw_x86_thiscallcc
Definition: LLToken.h:142
@ kw_false
Definition: LLToken.h:44
@ kw_unnamed_addr
Definition: LLToken.h:67
@ kw_uselistorder_bb
Definition: LLToken.h:362
@ NameTableKind
Definition: LLToken.h:487
@ kw_amdgpu_vs
Definition: LLToken.h:173
@ kw_inlineBits
Definition: LLToken.h:431
@ kw_weak_odr
Definition: LLToken.h:58
@ kw_udec_wrap
Definition: LLToken.h:271
@ kw_resByArg
Definition: LLToken.h:439
@ kw_inttoptr
Definition: LLToken.h:309
@ kw_dllimport
Definition: LLToken.h:60
@ kw_argmemonly
Definition: LLToken.h:206
@ kw_blockaddress
Definition: LLToken.h:350
@ kw_landingpad
Definition: LLToken.h:316
@ kw_aarch64_vector_pcs
Definition: LLToken.h:148
@ kw_amdgpu_cs
Definition: LLToken.h:179
@ kw_syncscope
Definition: LLToken.h:101
@ kw_noInline
Definition: LLToken.h:389
@ kw_source_filename
Definition: LLToken.h:90
@ kw_typeTestAssumeConstVCalls
Definition: LLToken.h:412
@ kw_inrange
Definition: LLToken.h:118
@ kw_ptx_kernel
Definition: LLToken.h:156
@ kw_summaries
Definition: LLToken.h:370
@ kw_extractelement
Definition: LLToken.h:344
@ kw_branchFunnel
Definition: LLToken.h:437
@ kw_typeidCompatibleVTable
Definition: LLToken.h:418
@ kw_bitcast
Definition: LLToken.h:311
@ kw_declare
Definition: LLToken.h:45
@ kw_allOnes
Definition: LLToken.h:426
@ kw_vTableFuncs
Definition: LLToken.h:404
@ ChecksumKind
Definition: LLToken.h:492
@ DwarfMacinfo
Definition: LLToken.h:491
@ kw_volatile
Definition: LLToken.h:93
@ kw_typeCheckedLoadVCalls
Definition: LLToken.h:411
@ kw_function
Definition: LLToken.h:382
@ kw_default
Definition: LLToken.h:64
@ kw_no_sanitize_address
Definition: LLToken.h:459
@ kw_inaccessiblemem_or_argmemonly
Definition: LLToken.h:208
@ kw_uinc_wrap
Definition: LLToken.h:270
@ kw_externally_initialized
Definition: LLToken.h:69
@ kw_sanitize_address_dyninit
Definition: LLToken.h:465
@ kw_atomicrmw
Definition: LLToken.h:341
@ kw_hidden
Definition: LLToken.h:65
@ EmissionKind
Definition: LLToken.h:486
@ kw_amdgpu_cs_chain_preserve
Definition: LLToken.h:181
@ kw_usub_sat
Definition: LLToken.h:273
@ kw_readwrite
Definition: LLToken.h:201
@ kw_within
Definition: LLToken.h:83
@ kw_section
Definition: LLToken.h:120
@ kw_triple
Definition: LLToken.h:89
@ kw_thread_local
Definition: LLToken.h:72
@ kw_catchswitch
Definition: LLToken.h:330
@ kw_extern_weak
Definition: LLToken.h:70
@ kw_arm_aapcscc
Definition: LLToken.h:146
@ kw_usub_cond
Definition: LLToken.h:272
@ kw_memProf
Definition: LLToken.h:454
@ kw_alignLog2
Definition: LLToken.h:428
@ kw_cleanuppad
Definition: LLToken.h:333
@ kw_available_externally
Definition: LLToken.h:63
@ kw_singleImplName
Definition: LLToken.h:438
@ kw_typeTests
Definition: LLToken.h:409
@ kw_versions
Definition: LLToken.h:453
@ kw_notcold
Definition: LLToken.h:455
@ kw_mayThrow
Definition: LLToken.h:392
@ kw_swifttailcc
Definition: LLToken.h:164
@ kw_monotonic
Definition: LLToken.h:96
@ kw_typeTestAssumeVCalls
Definition: LLToken.h:410
@ kw_amdgpu_ls
Definition: LLToken.h:174
@ kw_caller
Definition: LLToken.h:82
@ kw_vscale
Definition: LLToken.h:41
@ kw_target
Definition: LLToken.h:88
@ kw_attributes
Definition: LLToken.h:190
@ kw_code_model
Definition: LLToken.h:122
@ kw_cmpxchg
Definition: LLToken.h:340
@ kw_funcFlags
Definition: LLToken.h:384
@ kw_localdynamic
Definition: LLToken.h:73
@ kw_uniformRetVal
Definition: LLToken.h:441
@ kw_sideeffect
Definition: LLToken.h:127
@ kw_amdgpu_ps
Definition: LLToken.h:178
@ kw_sizeM1BitWidth
Definition: LLToken.h:427
@ kw_catchret
Definition: LLToken.h:331
@ kw_nodeduplicate
Definition: LLToken.h:237
@ kw_avr_signalcc
Definition: LLToken.h:155
@ kw_exactmatch
Definition: LLToken.h:235
@ kw_aliasee
Definition: LLToken.h:406
@ kw_common
Definition: LLToken.h:62
@ kw_unreachable
Definition: LLToken.h:328
@ kw_intel_ocl_bicc
Definition: LLToken.h:138
@ kw_global
Definition: LLToken.h:47
@ kw_dso_local
Definition: LLToken.h:50
@ kw_undef
Definition: LLToken.h:77
@ kw_addrspace
Definition: LLToken.h:119
@ kw_release
Definition: LLToken.h:98
@ kw_returnDoesNotAlias
Definition: LLToken.h:388
@ kw_aarch64_sme_preservemost_from_x0
Definition: LLToken.h:150
@ kw_preserve_allcc
Definition: LLToken.h:166
@ kw_importType
Definition: LLToken.h:379
@ dotdotdot
Definition: LLToken.h:24
@ kw_cleanupret
Definition: LLToken.h:329
@ kw_shufflevector
Definition: LLToken.h:346
@ kw_riscv_vector_cc
Definition: LLToken.h:187
@ kw_avr_intrcc
Definition: LLToken.h:154
@ kw_definition
Definition: LLToken.h:380
@ kw_prologue
Definition: LLToken.h:131
@ kw_virtualConstProp
Definition: LLToken.h:443
@ kw_vcall_visibility
Definition: LLToken.h:432
@ kw_poison
Definition: LLToken.h:78
@ kw_appending
Definition: LLToken.h:59
@ kw_inaccessiblemem
Definition: LLToken.h:203
@ kw_preserve_mostcc
Definition: LLToken.h:165
@ kw_arm_aapcs_vfpcc
Definition: LLToken.h:147
@ kw_typeTestRes
Definition: LLToken.h:420
@ kw_unknown
Definition: LLToken.h:400
@ kw_x86_regcallcc
Definition: LLToken.h:144
@ kw_typeIdInfo
Definition: LLToken.h:408
@ kw_amdgpu_cs_chain
Definition: LLToken.h:180
@ kw_dso_local_equivalent
Definition: LLToken.h:351
@ kw_x86_64_sysvcc
Definition: LLToken.h:160
@ DbgRecordType
Definition: LLToken.h:493
@ kw_summary
Definition: LLToken.h:419
@ kw_virtFunc
Definition: LLToken.h:405
@ kw_musttail
Definition: LLToken.h:86
@ kw_aarch64_sme_preservemost_from_x2
Definition: LLToken.h:152
@ kw_byteArray
Definition: LLToken.h:423
@ kw_uniqueRetVal
Definition: LLToken.h:442
@ kw_insertvalue
Definition: LLToken.h:349
@ kw_indirectbr
Definition: LLToken.h:325
StringRef filename(StringRef path, Style style=Style::native)
Get filename.
Definition: Path.cpp:577
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
void UpgradeSectionAttributes(Module &M)
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.
Definition: STLExtras.h:1697
@ Read
Definition: CodeGenData.h:107
detail::scope_exit< std::decay_t< Callable > > make_scope_exit(Callable &&F)
Definition: ScopeExit.h:59
@ Done
Definition: Threading.h:61
AllocFnKind
Definition: Attributes.h:49
void UpgradeCallsToIntrinsic(Function *F)
This is an auto-upgrade hook for any old intrinsic function syntaxes which need to have both the func...
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...
Definition: STLExtras.h:657
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.)
Definition: MathExtras.h:296
std::vector< VirtFuncOffset > VTableFuncList
List of functions referenced by a particular vtable definition.
UWTableKind
Definition: CodeGen.h:120
@ 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.
Definition: MathExtras.h:291
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1664
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
MemoryEffectsBase< IRMemLocation > MemoryEffects
Summary of how a function affects memory in the program.
Definition: ModRef.h:268
std::tuple< const DIScope *, const DIScope *, const DILocalVariable * > VarID
A unique key that represents a debug variable.
bool isPointerTy(const Type *T)
Definition: SPIRVUtils.h:250
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Ref
The access may reference the value stored in memory.
@ ModRef
The access may reference and may modify the value stored in memory.
@ Mod
The access may modify the value stored in memory.
@ NoModRef
The access neither references nor modifies the value stored in memory.
@ ArgMem
Access to memory via argument pointers.
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
@ InaccessibleMem
Memory that is inaccessible via LLVM IR.
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...
Definition: STLExtras.h:1938
DWARFExpression::Operation Op
constexpr unsigned BitWidth
Definition: BitmaskEnum.h:217
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1873
const char * toString(DWARFSectionKind Kind)
bool UpgradeDebugInfo(Module &M)
Check the debug info version number, if it is out-dated, drop the debug info.
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
MDNode * UpgradeTBAANode(MDNode &TBAANode)
If the given TBAA tag uses the scalar TBAA format, create a new node corresponding to the upgrade to ...
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
#define N
static const fltSemantics & IEEEsingle() LLVM_READNONE
Definition: APFloat.cpp:265
static constexpr roundingMode rmNearestTiesToEven
Definition: APFloat.h:297
static const fltSemantics & IEEEdouble() LLVM_READNONE
Definition: APFloat.cpp:266
static const fltSemantics & IEEEhalf() LLVM_READNONE
Definition: APFloat.cpp:263
static const fltSemantics & BFloat() LLVM_READNONE
Definition: APFloat.cpp:264
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
Helper struct shared between Function Specialization and SCCP Solver.
Definition: SCCPSolver.h:41
Class to accumulate and hold information about a callee.
Helper object to track which of three possible relocation mechanisms are used for a particular value ...
A specification for a virtual function call with all constant integer arguments.
Flags specific to function summaries.
Describes the use of a value in a call instruction, specifying the call's target, the value's paramet...
Describes the uses of a parameter by the function.
std::vector< Call > Calls
In the per-module summary, it summarizes the byte offset applied to each pointer parameter before pas...
static constexpr uint32_t RangeWidth
All type identifier related information.
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....
An "identifier" for a virtual function.
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
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.
Definition: Alignment.h:117
A utility class that uses RAII to save and restore the value of a variable.
This struct contains the mappings from the slot numbers to unnamed metadata nodes,...
Definition: SlotMapping.h:33
std::map< unsigned, Type * > Types
Definition: SlotMapping.h:37
StringMap< Type * > NamedTypes
Definition: SlotMapping.h:36
std::map< unsigned, TrackingMDNodeRef > MetadataNodes
Definition: SlotMapping.h:35
NumberedValues< GlobalValue * > GlobalValues
Definition: SlotMapping.h:34
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
TypeTestResolution TTRes
@ 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.
Definition: LLParser.h:53
@ t_Constant
Definition: LLParser.h:67
@ t_PackedConstantStruct
Definition: LLParser.h:71
@ t_GlobalID
Definition: LLParser.h:56
@ t_EmptyArray
Definition: LLParser.h:66
@ t_GlobalName
Definition: LLParser.h:58
@ t_ConstantStruct
Definition: LLParser.h:70
@ t_LocalName
Definition: LLParser.h:57
@ t_ConstantSplat
Definition: LLParser.h:68
@ t_InlineAsm
Definition: LLParser.h:69
unsigned UIntVal
Definition: LLParser.h:75
enum llvm::ValID::@40 Kind
FunctionType * FTy
Definition: LLParser.h:76
LLLexer::LocTy Loc
Definition: LLParser.h:74
std::string StrVal
Definition: LLParser.h:77
Struct that holds a reference to a particular GUID in a global value summary.
const GlobalValueSummaryMapTy::value_type * getRef() const
bool isWriteOnly() const
bool isReadOnly() 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,...
@ 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.
Utility type to build an inheritance chain that makes it easy to rank overload candidates.
Definition: STLExtras.h:1496