1 //===-- LLParser.h - Parser Class -------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines the parser class for .ll files.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_ASMPARSER_LLPARSER_H
15 #define LLVM_LIB_ASMPARSER_LLPARSER_H
18 #include "llvm/ADT/Optional.h"
19 #include "llvm/ADT/StringMap.h"
20 #include "llvm/IR/Attributes.h"
21 #include "llvm/IR/Instructions.h"
22 #include "llvm/IR/Module.h"
23 #include "llvm/IR/ModuleSummaryIndex.h"
24 #include "llvm/IR/Operator.h"
25 #include "llvm/IR/Type.h"
26 #include "llvm/IR/ValueHandle.h"
44 /// ValID - Represents a reference of a definition of some sort with no type.
45 /// There are several cases where we have to parse the value but where the
46 /// type can depend on later context. This may either be a numeric reference
47 /// or a symbolic (%var) reference. This is just a discriminated union.
50 t_LocalID
, t_GlobalID
, // ID in UIntVal.
51 t_LocalName
, t_GlobalName
, // Name in StrVal.
52 t_APSInt
, t_APFloat
, // Value in APSIntVal/APFloatVal.
53 t_Null
, t_Undef
, t_Zero
, t_None
, // No value.
54 t_EmptyArray
, // No value: []
55 t_Constant
, // Value in ConstantVal.
56 t_InlineAsm
, // Value in FTy/StrVal/StrVal2/UIntVal.
57 t_ConstantStruct
, // Value in ConstantStructElts.
58 t_PackedConstantStruct
// Value in ConstantStructElts.
63 FunctionType
*FTy
= nullptr;
64 std::string StrVal
, StrVal2
;
66 APFloat APFloatVal
{0.0};
67 Constant
*ConstantVal
;
68 std::unique_ptr
<Constant
*[]> ConstantStructElts
;
71 ValID(const ValID
&RHS
)
72 : Kind(RHS
.Kind
), Loc(RHS
.Loc
), UIntVal(RHS
.UIntVal
), FTy(RHS
.FTy
),
73 StrVal(RHS
.StrVal
), StrVal2(RHS
.StrVal2
), APSIntVal(RHS
.APSIntVal
),
74 APFloatVal(RHS
.APFloatVal
), ConstantVal(RHS
.ConstantVal
) {
75 assert(!RHS
.ConstantStructElts
);
78 bool operator<(const ValID
&RHS
) const {
79 if (Kind
== t_LocalID
|| Kind
== t_GlobalID
)
80 return UIntVal
< RHS
.UIntVal
;
81 assert((Kind
== t_LocalName
|| Kind
== t_GlobalName
||
82 Kind
== t_ConstantStruct
|| Kind
== t_PackedConstantStruct
) &&
83 "Ordering not defined for this ValID kind yet");
84 return StrVal
< RHS
.StrVal
;
90 typedef LLLexer::LocTy LocTy
;
94 // Module being parsed, null if we are only parsing summary index.
96 // Summary index being parsed, null if we are only parsing Module.
97 ModuleSummaryIndex
*Index
;
100 // Instruction metadata resolution. Each instruction can have a list of
101 // MDRef info associated with them.
103 // The simpler approach of just creating temporary MDNodes and then calling
104 // RAUW on them when the definition is processed doesn't work because some
105 // instruction metadata kinds, such as dbg, get stored in the IR in an
106 // "optimized" format which doesn't participate in the normal value use
107 // lists. This means that RAUW doesn't work, even on temporary MDNodes
108 // which otherwise support RAUW. Instead, we defer resolving MDNode
109 // references until the definitions have been processed.
112 unsigned MDKind
, MDSlot
;
115 SmallVector
<Instruction
*, 64> InstsWithTBAATag
;
117 // Type resolution handling data structures. The location is set when we
118 // have processed a use of the type but not a definition yet.
119 StringMap
<std::pair
<Type
*, LocTy
> > NamedTypes
;
120 std::map
<unsigned, std::pair
<Type
*, LocTy
> > NumberedTypes
;
122 std::map
<unsigned, TrackingMDNodeRef
> NumberedMetadata
;
123 std::map
<unsigned, std::pair
<TempMDTuple
, LocTy
>> ForwardRefMDNodes
;
125 // Global Value reference information.
126 std::map
<std::string
, std::pair
<GlobalValue
*, LocTy
> > ForwardRefVals
;
127 std::map
<unsigned, std::pair
<GlobalValue
*, LocTy
> > ForwardRefValIDs
;
128 std::vector
<GlobalValue
*> NumberedVals
;
130 // Comdat forward reference information.
131 std::map
<std::string
, LocTy
> ForwardRefComdats
;
133 // References to blockaddress. The key is the function ValID, the value is
134 // a list of references to blocks in that function.
135 std::map
<ValID
, std::map
<ValID
, GlobalValue
*>> ForwardRefBlockAddresses
;
136 class PerFunctionState
;
137 /// Reference to per-function state to allow basic blocks to be
138 /// forward-referenced by blockaddress instructions within the same
140 PerFunctionState
*BlockAddressPFS
;
142 // Attribute builder reference information.
143 std::map
<Value
*, std::vector
<unsigned> > ForwardRefAttrGroups
;
144 std::map
<unsigned, AttrBuilder
> NumberedAttrBuilders
;
146 // Summary global value reference information.
147 std::map
<unsigned, std::vector
<std::pair
<ValueInfo
*, LocTy
>>>
148 ForwardRefValueInfos
;
149 std::map
<unsigned, std::vector
<std::pair
<AliasSummary
*, LocTy
>>>
151 std::vector
<ValueInfo
> NumberedValueInfos
;
153 // Summary type id reference information.
154 std::map
<unsigned, std::vector
<std::pair
<GlobalValue::GUID
*, LocTy
>>>
157 // Map of module ID to path.
158 std::map
<unsigned, StringRef
> ModuleIdMap
;
160 /// Only the llvm-as tool may set this to false to bypass
161 /// UpgradeDebuginfo so it can generate broken bitcode.
162 bool UpgradeDebugInfo
;
164 /// DataLayout string to override that in LLVM assembly.
165 StringRef DataLayoutStr
;
167 std::string SourceFileName
;
170 LLParser(StringRef F
, SourceMgr
&SM
, SMDiagnostic
&Err
, Module
*M
,
171 ModuleSummaryIndex
*Index
, LLVMContext
&Context
,
172 SlotMapping
*Slots
= nullptr, bool UpgradeDebugInfo
= true,
173 StringRef DataLayoutString
= "")
174 : Context(Context
), Lex(F
, SM
, Err
, Context
), M(M
), Index(Index
),
175 Slots(Slots
), BlockAddressPFS(nullptr),
176 UpgradeDebugInfo(UpgradeDebugInfo
), DataLayoutStr(DataLayoutString
) {
177 if (!DataLayoutStr
.empty())
178 M
->setDataLayout(DataLayoutStr
);
182 bool parseStandaloneConstantValue(Constant
*&C
, const SlotMapping
*Slots
);
184 bool parseTypeAtBeginning(Type
*&Ty
, unsigned &Read
,
185 const SlotMapping
*Slots
);
187 LLVMContext
&getContext() { return Context
; }
191 bool Error(LocTy L
, const Twine
&Msg
) const {
192 return Lex
.Error(L
, Msg
);
194 bool TokError(const Twine
&Msg
) const {
195 return Error(Lex
.getLoc(), Msg
);
198 /// Restore the internal name and slot mappings using the mappings that
199 /// were created at an earlier parsing stage.
200 void restoreParsingState(const SlotMapping
*Slots
);
202 /// GetGlobalVal - Get a value with the specified name or ID, creating a
203 /// forward reference record if needed. This can return null if the value
204 /// exists but does not have the right type.
205 GlobalValue
*GetGlobalVal(const std::string
&N
, Type
*Ty
, LocTy Loc
,
207 GlobalValue
*GetGlobalVal(unsigned ID
, Type
*Ty
, LocTy Loc
, bool IsCall
);
209 /// Get a Comdat with the specified name, creating a forward reference
210 /// record if needed.
211 Comdat
*getComdat(const std::string
&Name
, LocTy Loc
);
214 bool ParseToken(lltok::Kind T
, const char *ErrMsg
);
215 bool EatIfPresent(lltok::Kind T
) {
216 if (Lex
.getKind() != T
) return false;
221 FastMathFlags
EatFastMathFlagsIfPresent() {
224 switch (Lex
.getKind()) {
225 case lltok::kw_fast
: FMF
.setFast(); Lex
.Lex(); continue;
226 case lltok::kw_nnan
: FMF
.setNoNaNs(); Lex
.Lex(); continue;
227 case lltok::kw_ninf
: FMF
.setNoInfs(); Lex
.Lex(); continue;
228 case lltok::kw_nsz
: FMF
.setNoSignedZeros(); Lex
.Lex(); continue;
229 case lltok::kw_arcp
: FMF
.setAllowReciprocal(); Lex
.Lex(); continue;
230 case lltok::kw_contract
:
231 FMF
.setAllowContract(true);
234 case lltok::kw_reassoc
: FMF
.setAllowReassoc(); Lex
.Lex(); continue;
235 case lltok::kw_afn
: FMF
.setApproxFunc(); Lex
.Lex(); continue;
241 bool ParseOptionalToken(lltok::Kind T
, bool &Present
,
242 LocTy
*Loc
= nullptr) {
243 if (Lex
.getKind() != T
) {
253 bool ParseStringConstant(std::string
&Result
);
254 bool ParseUInt32(unsigned &Val
);
255 bool ParseUInt32(unsigned &Val
, LocTy
&Loc
) {
257 return ParseUInt32(Val
);
259 bool ParseUInt64(uint64_t &Val
);
260 bool ParseUInt64(uint64_t &Val
, LocTy
&Loc
) {
262 return ParseUInt64(Val
);
264 bool ParseFlag(unsigned &Val
);
266 bool ParseStringAttribute(AttrBuilder
&B
);
268 bool ParseTLSModel(GlobalVariable::ThreadLocalMode
&TLM
);
269 bool ParseOptionalThreadLocal(GlobalVariable::ThreadLocalMode
&TLM
);
270 bool ParseOptionalUnnamedAddr(GlobalVariable::UnnamedAddr
&UnnamedAddr
);
271 bool ParseOptionalAddrSpace(unsigned &AddrSpace
, unsigned DefaultAS
= 0);
272 bool ParseOptionalProgramAddrSpace(unsigned &AddrSpace
) {
273 return ParseOptionalAddrSpace(
274 AddrSpace
, M
->getDataLayout().getProgramAddressSpace());
276 bool ParseOptionalParamAttrs(AttrBuilder
&B
);
277 bool ParseOptionalReturnAttrs(AttrBuilder
&B
);
278 bool ParseOptionalLinkage(unsigned &Res
, bool &HasLinkage
,
279 unsigned &Visibility
, unsigned &DLLStorageClass
,
281 void ParseOptionalDSOLocal(bool &DSOLocal
);
282 void ParseOptionalVisibility(unsigned &Res
);
283 void ParseOptionalDLLStorageClass(unsigned &Res
);
284 bool ParseOptionalCallingConv(unsigned &CC
);
285 bool ParseOptionalAlignment(unsigned &Alignment
);
286 bool ParseOptionalDerefAttrBytes(lltok::Kind AttrKind
, uint64_t &Bytes
);
287 bool ParseScopeAndOrdering(bool isAtomic
, SyncScope::ID
&SSID
,
288 AtomicOrdering
&Ordering
);
289 bool ParseScope(SyncScope::ID
&SSID
);
290 bool ParseOrdering(AtomicOrdering
&Ordering
);
291 bool ParseOptionalStackAlignment(unsigned &Alignment
);
292 bool ParseOptionalCommaAlign(unsigned &Alignment
, bool &AteExtraComma
);
293 bool ParseOptionalCommaAddrSpace(unsigned &AddrSpace
, LocTy
&Loc
,
294 bool &AteExtraComma
);
295 bool ParseOptionalCommaInAlloca(bool &IsInAlloca
);
296 bool parseAllocSizeArguments(unsigned &BaseSizeArg
,
297 Optional
<unsigned> &HowManyArg
);
298 bool ParseIndexList(SmallVectorImpl
<unsigned> &Indices
,
299 bool &AteExtraComma
);
300 bool ParseIndexList(SmallVectorImpl
<unsigned> &Indices
) {
302 if (ParseIndexList(Indices
, AteExtraComma
)) return true;
304 return TokError("expected index");
308 // Top-Level Entities
309 bool ParseTopLevelEntities();
310 bool ValidateEndOfModule();
311 bool ValidateEndOfIndex();
312 bool ParseTargetDefinition();
313 bool ParseModuleAsm();
314 bool ParseSourceFileName();
315 bool ParseDepLibs(); // FIXME: Remove in 4.0.
316 bool ParseUnnamedType();
317 bool ParseNamedType();
321 bool ParseGlobalType(bool &IsConstant
);
322 bool ParseUnnamedGlobal();
323 bool ParseNamedGlobal();
324 bool ParseGlobal(const std::string
&Name
, LocTy NameLoc
, unsigned Linkage
,
325 bool HasLinkage
, unsigned Visibility
,
326 unsigned DLLStorageClass
, bool DSOLocal
,
327 GlobalVariable::ThreadLocalMode TLM
,
328 GlobalVariable::UnnamedAddr UnnamedAddr
);
329 bool parseIndirectSymbol(const std::string
&Name
, LocTy NameLoc
,
330 unsigned L
, unsigned Visibility
,
331 unsigned DLLStorageClass
, bool DSOLocal
,
332 GlobalVariable::ThreadLocalMode TLM
,
333 GlobalVariable::UnnamedAddr UnnamedAddr
);
335 bool ParseStandaloneMetadata();
336 bool ParseNamedMetadata();
337 bool ParseMDString(MDString
*&Result
);
338 bool ParseMDNodeID(MDNode
*&Result
);
339 bool ParseUnnamedAttrGrp();
340 bool ParseFnAttributeValuePairs(AttrBuilder
&B
,
341 std::vector
<unsigned> &FwdRefAttrGrps
,
342 bool inAttrGrp
, LocTy
&BuiltinLoc
);
344 // Module Summary Index Parsing.
345 bool SkipModuleSummaryEntry();
346 bool ParseSummaryEntry();
347 bool ParseModuleEntry(unsigned ID
);
348 bool ParseModuleReference(StringRef
&ModulePath
);
349 bool ParseGVReference(ValueInfo
&VI
, unsigned &GVId
);
350 bool ParseGVEntry(unsigned ID
);
351 bool ParseFunctionSummary(std::string Name
, GlobalValue::GUID
, unsigned ID
);
352 bool ParseVariableSummary(std::string Name
, GlobalValue::GUID
, unsigned ID
);
353 bool ParseAliasSummary(std::string Name
, GlobalValue::GUID
, unsigned ID
);
354 bool ParseGVFlags(GlobalValueSummary::GVFlags
&GVFlags
);
355 bool ParseOptionalFFlags(FunctionSummary::FFlags
&FFlags
);
356 bool ParseOptionalCalls(std::vector
<FunctionSummary::EdgeTy
> &Calls
);
357 bool ParseHotness(CalleeInfo::HotnessType
&Hotness
);
358 bool ParseOptionalTypeIdInfo(FunctionSummary::TypeIdInfo
&TypeIdInfo
);
359 bool ParseTypeTests(std::vector
<GlobalValue::GUID
> &TypeTests
);
360 bool ParseVFuncIdList(lltok::Kind Kind
,
361 std::vector
<FunctionSummary::VFuncId
> &VFuncIdList
);
362 bool ParseConstVCallList(
364 std::vector
<FunctionSummary::ConstVCall
> &ConstVCallList
);
365 using IdToIndexMapType
=
366 std::map
<unsigned, std::vector
<std::pair
<unsigned, LocTy
>>>;
367 bool ParseConstVCall(FunctionSummary::ConstVCall
&ConstVCall
,
368 IdToIndexMapType
&IdToIndexMap
, unsigned Index
);
369 bool ParseVFuncId(FunctionSummary::VFuncId
&VFuncId
,
370 IdToIndexMapType
&IdToIndexMap
, unsigned Index
);
371 bool ParseOptionalRefs(std::vector
<ValueInfo
> &Refs
);
372 bool ParseTypeIdEntry(unsigned ID
);
373 bool ParseTypeIdSummary(TypeIdSummary
&TIS
);
374 bool ParseTypeTestResolution(TypeTestResolution
&TTRes
);
375 bool ParseOptionalWpdResolutions(
376 std::map
<uint64_t, WholeProgramDevirtResolution
> &WPDResMap
);
377 bool ParseWpdRes(WholeProgramDevirtResolution
&WPDRes
);
378 bool ParseOptionalResByArg(
379 std::map
<std::vector
<uint64_t>, WholeProgramDevirtResolution::ByArg
>
381 bool ParseArgs(std::vector
<uint64_t> &Args
);
382 void AddGlobalValueToIndex(std::string Name
, GlobalValue::GUID
,
383 GlobalValue::LinkageTypes Linkage
, unsigned ID
,
384 std::unique_ptr
<GlobalValueSummary
> Summary
);
387 bool ParseType(Type
*&Result
, const Twine
&Msg
, bool AllowVoid
= false);
388 bool ParseType(Type
*&Result
, bool AllowVoid
= false) {
389 return ParseType(Result
, "expected type", AllowVoid
);
391 bool ParseType(Type
*&Result
, const Twine
&Msg
, LocTy
&Loc
,
392 bool AllowVoid
= false) {
394 return ParseType(Result
, Msg
, AllowVoid
);
396 bool ParseType(Type
*&Result
, LocTy
&Loc
, bool AllowVoid
= false) {
398 return ParseType(Result
, AllowVoid
);
400 bool ParseAnonStructType(Type
*&Result
, bool Packed
);
401 bool ParseStructBody(SmallVectorImpl
<Type
*> &Body
);
402 bool ParseStructDefinition(SMLoc TypeLoc
, StringRef Name
,
403 std::pair
<Type
*, LocTy
> &Entry
,
406 bool ParseArrayVectorType(Type
*&Result
, bool isVector
);
407 bool ParseFunctionType(Type
*&Result
);
409 // Function Semantic Analysis.
410 class PerFunctionState
{
413 std::map
<std::string
, std::pair
<Value
*, LocTy
> > ForwardRefVals
;
414 std::map
<unsigned, std::pair
<Value
*, LocTy
> > ForwardRefValIDs
;
415 std::vector
<Value
*> NumberedVals
;
417 /// FunctionNumber - If this is an unnamed function, this is the slot
418 /// number of it, otherwise it is -1.
421 PerFunctionState(LLParser
&p
, Function
&f
, int functionNumber
);
424 Function
&getFunction() const { return F
; }
426 bool FinishFunction();
428 /// GetVal - Get a value with the specified name or ID, creating a
429 /// forward reference record if needed. This can return null if the value
430 /// exists but does not have the right type.
431 Value
*GetVal(const std::string
&Name
, Type
*Ty
, LocTy Loc
, bool IsCall
);
432 Value
*GetVal(unsigned ID
, Type
*Ty
, LocTy Loc
, bool IsCall
);
434 /// SetInstName - After an instruction is parsed and inserted into its
435 /// basic block, this installs its name.
436 bool SetInstName(int NameID
, const std::string
&NameStr
, LocTy NameLoc
,
439 /// GetBB - Get a basic block with the specified name or ID, creating a
440 /// forward reference record if needed. This can return null if the value
441 /// is not a BasicBlock.
442 BasicBlock
*GetBB(const std::string
&Name
, LocTy Loc
);
443 BasicBlock
*GetBB(unsigned ID
, LocTy Loc
);
445 /// DefineBB - Define the specified basic block, which is either named or
446 /// unnamed. If there is an error, this returns null otherwise it returns
447 /// the block being defined.
448 BasicBlock
*DefineBB(const std::string
&Name
, LocTy Loc
);
450 bool resolveForwardRefBlockAddresses();
453 bool ConvertValIDToValue(Type
*Ty
, ValID
&ID
, Value
*&V
,
454 PerFunctionState
*PFS
, bool IsCall
);
456 Value
*checkValidVariableType(LocTy Loc
, const Twine
&Name
, Type
*Ty
,
457 Value
*Val
, bool IsCall
);
459 bool parseConstantValue(Type
*Ty
, Constant
*&C
);
460 bool ParseValue(Type
*Ty
, Value
*&V
, PerFunctionState
*PFS
);
461 bool ParseValue(Type
*Ty
, Value
*&V
, PerFunctionState
&PFS
) {
462 return ParseValue(Ty
, V
, &PFS
);
465 bool ParseValue(Type
*Ty
, Value
*&V
, LocTy
&Loc
,
466 PerFunctionState
&PFS
) {
468 return ParseValue(Ty
, V
, &PFS
);
471 bool ParseTypeAndValue(Value
*&V
, PerFunctionState
*PFS
);
472 bool ParseTypeAndValue(Value
*&V
, PerFunctionState
&PFS
) {
473 return ParseTypeAndValue(V
, &PFS
);
475 bool ParseTypeAndValue(Value
*&V
, LocTy
&Loc
, PerFunctionState
&PFS
) {
477 return ParseTypeAndValue(V
, PFS
);
479 bool ParseTypeAndBasicBlock(BasicBlock
*&BB
, LocTy
&Loc
,
480 PerFunctionState
&PFS
);
481 bool ParseTypeAndBasicBlock(BasicBlock
*&BB
, PerFunctionState
&PFS
) {
483 return ParseTypeAndBasicBlock(BB
, Loc
, PFS
);
491 ParamInfo(LocTy loc
, Value
*v
, AttributeSet attrs
)
492 : Loc(loc
), V(v
), Attrs(attrs
) {}
494 bool ParseParameterList(SmallVectorImpl
<ParamInfo
> &ArgList
,
495 PerFunctionState
&PFS
,
496 bool IsMustTailCall
= false,
497 bool InVarArgsFunc
= false);
500 ParseOptionalOperandBundles(SmallVectorImpl
<OperandBundleDef
> &BundleList
,
501 PerFunctionState
&PFS
);
503 bool ParseExceptionArgs(SmallVectorImpl
<Value
*> &Args
,
504 PerFunctionState
&PFS
);
507 bool ParseValID(ValID
&ID
, PerFunctionState
*PFS
= nullptr);
508 bool ParseGlobalValue(Type
*Ty
, Constant
*&C
);
509 bool ParseGlobalTypeAndValue(Constant
*&V
);
510 bool ParseGlobalValueVector(SmallVectorImpl
<Constant
*> &Elts
,
511 Optional
<unsigned> *InRangeOp
= nullptr);
512 bool parseOptionalComdat(StringRef GlobalName
, Comdat
*&C
);
513 bool ParseMetadataAsValue(Value
*&V
, PerFunctionState
&PFS
);
514 bool ParseValueAsMetadata(Metadata
*&MD
, const Twine
&TypeMsg
,
515 PerFunctionState
*PFS
);
516 bool ParseMetadata(Metadata
*&MD
, PerFunctionState
*PFS
);
517 bool ParseMDTuple(MDNode
*&MD
, bool IsDistinct
= false);
518 bool ParseMDNode(MDNode
*&N
);
519 bool ParseMDNodeTail(MDNode
*&N
);
520 bool ParseMDNodeVector(SmallVectorImpl
<Metadata
*> &Elts
);
521 bool ParseMetadataAttachment(unsigned &Kind
, MDNode
*&MD
);
522 bool ParseInstructionMetadata(Instruction
&Inst
);
523 bool ParseGlobalObjectMetadataAttachment(GlobalObject
&GO
);
524 bool ParseOptionalFunctionMetadata(Function
&F
);
526 template <class FieldTy
>
527 bool ParseMDField(LocTy Loc
, StringRef Name
, FieldTy
&Result
);
528 template <class FieldTy
> bool ParseMDField(StringRef Name
, FieldTy
&Result
);
529 template <class ParserTy
>
530 bool ParseMDFieldsImplBody(ParserTy parseField
);
531 template <class ParserTy
>
532 bool ParseMDFieldsImpl(ParserTy parseField
, LocTy
&ClosingLoc
);
533 bool ParseSpecializedMDNode(MDNode
*&N
, bool IsDistinct
= false);
535 #define HANDLE_SPECIALIZED_MDNODE_LEAF(CLASS) \
536 bool Parse##CLASS(MDNode *&Result, bool IsDistinct);
537 #include "llvm/IR/Metadata.def"
545 ArgInfo(LocTy L
, Type
*ty
, AttributeSet Attr
, const std::string
&N
)
546 : Loc(L
), Ty(ty
), Attrs(Attr
), Name(N
) {}
548 bool ParseArgumentList(SmallVectorImpl
<ArgInfo
> &ArgList
, bool &isVarArg
);
549 bool ParseFunctionHeader(Function
*&Fn
, bool isDefine
);
550 bool ParseFunctionBody(Function
&Fn
);
551 bool ParseBasicBlock(PerFunctionState
&PFS
);
553 enum TailCallType
{ TCT_None
, TCT_Tail
, TCT_MustTail
};
555 // Instruction Parsing. Each instruction parsing routine can return with a
556 // normal result, an error result, or return having eaten an extra comma.
557 enum InstResult
{ InstNormal
= 0, InstError
= 1, InstExtraComma
= 2 };
558 int ParseInstruction(Instruction
*&Inst
, BasicBlock
*BB
,
559 PerFunctionState
&PFS
);
560 bool ParseCmpPredicate(unsigned &P
, unsigned Opc
);
562 bool ParseRet(Instruction
*&Inst
, BasicBlock
*BB
, PerFunctionState
&PFS
);
563 bool ParseBr(Instruction
*&Inst
, PerFunctionState
&PFS
);
564 bool ParseSwitch(Instruction
*&Inst
, PerFunctionState
&PFS
);
565 bool ParseIndirectBr(Instruction
*&Inst
, PerFunctionState
&PFS
);
566 bool ParseInvoke(Instruction
*&Inst
, PerFunctionState
&PFS
);
567 bool ParseResume(Instruction
*&Inst
, PerFunctionState
&PFS
);
568 bool ParseCleanupRet(Instruction
*&Inst
, PerFunctionState
&PFS
);
569 bool ParseCatchRet(Instruction
*&Inst
, PerFunctionState
&PFS
);
570 bool ParseCatchSwitch(Instruction
*&Inst
, PerFunctionState
&PFS
);
571 bool ParseCatchPad(Instruction
*&Inst
, PerFunctionState
&PFS
);
572 bool ParseCleanupPad(Instruction
*&Inst
, PerFunctionState
&PFS
);
574 bool ParseArithmetic(Instruction
*&Inst
, PerFunctionState
&PFS
, unsigned Opc
,
575 unsigned OperandType
);
576 bool ParseLogical(Instruction
*&Inst
, PerFunctionState
&PFS
, unsigned Opc
);
577 bool ParseCompare(Instruction
*&Inst
, PerFunctionState
&PFS
, unsigned Opc
);
578 bool ParseCast(Instruction
*&Inst
, PerFunctionState
&PFS
, unsigned Opc
);
579 bool ParseSelect(Instruction
*&Inst
, PerFunctionState
&PFS
);
580 bool ParseVA_Arg(Instruction
*&Inst
, PerFunctionState
&PFS
);
581 bool ParseExtractElement(Instruction
*&Inst
, PerFunctionState
&PFS
);
582 bool ParseInsertElement(Instruction
*&Inst
, PerFunctionState
&PFS
);
583 bool ParseShuffleVector(Instruction
*&Inst
, PerFunctionState
&PFS
);
584 int ParsePHI(Instruction
*&Inst
, PerFunctionState
&PFS
);
585 bool ParseLandingPad(Instruction
*&Inst
, PerFunctionState
&PFS
);
586 bool ParseCall(Instruction
*&Inst
, PerFunctionState
&PFS
,
587 CallInst::TailCallKind TCK
);
588 int ParseAlloc(Instruction
*&Inst
, PerFunctionState
&PFS
);
589 int ParseLoad(Instruction
*&Inst
, PerFunctionState
&PFS
);
590 int ParseStore(Instruction
*&Inst
, PerFunctionState
&PFS
);
591 int ParseCmpXchg(Instruction
*&Inst
, PerFunctionState
&PFS
);
592 int ParseAtomicRMW(Instruction
*&Inst
, PerFunctionState
&PFS
);
593 int ParseFence(Instruction
*&Inst
, PerFunctionState
&PFS
);
594 int ParseGetElementPtr(Instruction
*&Inst
, PerFunctionState
&PFS
);
595 int ParseExtractValue(Instruction
*&Inst
, PerFunctionState
&PFS
);
596 int ParseInsertValue(Instruction
*&Inst
, PerFunctionState
&PFS
);
598 // Use-list order directives.
599 bool ParseUseListOrder(PerFunctionState
*PFS
= nullptr);
600 bool ParseUseListOrderBB();
601 bool ParseUseListOrderIndexes(SmallVectorImpl
<unsigned> &Indexes
);
602 bool sortUseListOrder(Value
*V
, ArrayRef
<unsigned> Indexes
, SMLoc Loc
);
604 } // End llvm namespace