LLParser.h revision 3ed88efb03c63aae5542efcdfc5cedec9bc4c18a
1df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//===-- LLParser.h - Parser Class -------------------------------*- C++ -*-===//
2df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//
3df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//                     The LLVM Compiler Infrastructure
4df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//
5df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// This file is distributed under the University of Illinois Open Source
6df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// License. See LICENSE.TXT for details.
7df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//
8df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//===----------------------------------------------------------------------===//
9df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//
10df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//  This file defines the parser class for .ll files.
11df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//
12df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//===----------------------------------------------------------------------===//
13df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
14df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#ifndef LLVM_ASMPARSER_LLPARSER_H
15df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#define LLVM_ASMPARSER_LLPARSER_H
16df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
17df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "LLLexer.h"
18df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Type.h"
19df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include <map>
20df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
21df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnernamespace llvm {
22df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  class Module;
23df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  class OpaqueType;
24df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  class Function;
25df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  class Value;
26df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  class BasicBlock;
27df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  class Instruction;
28df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  class Constant;
29df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  class GlobalValue;
30df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  struct ValID;
31df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
32df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  class LLParser {
33df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  public:
34df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    typedef LLLexer::LocTy LocTy;
35df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  private:
36df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
37df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    LLLexer Lex;
38df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    Module *M;
39df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
40df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    // Type resolution handling data structures.
41df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    std::map<std::string, std::pair<PATypeHolder, LocTy> > ForwardRefTypes;
42df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    std::map<unsigned, std::pair<PATypeHolder, LocTy> > ForwardRefTypeIDs;
43df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    std::vector<PATypeHolder> NumberedTypes;
44df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
45df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    struct UpRefRecord {
46df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// Loc - This is the location of the upref.
47df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      LocTy Loc;
48df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
49df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// NestingLevel - The number of nesting levels that need to be popped
50df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// before this type is resolved.
51df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      unsigned NestingLevel;
52df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
53df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// LastContainedTy - This is the type at the current binding level for
54df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// the type.  Every time we reduce the nesting level, this gets updated.
55df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      const Type *LastContainedTy;
56df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
57df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// UpRefTy - This is the actual opaque type that the upreference is
58df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// represented with.
59df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      OpaqueType *UpRefTy;
60df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
61df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      UpRefRecord(LocTy L, unsigned NL, OpaqueType *URTy)
62df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner        : Loc(L), NestingLevel(NL), LastContainedTy((Type*)URTy),
63df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner          UpRefTy(URTy) {}
64df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    };
65df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    std::vector<UpRefRecord> UpRefs;
66df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
67df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    // Global Value reference information.
68df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    std::map<std::string, std::pair<GlobalValue*, LocTy> > ForwardRefVals;
69df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    std::map<unsigned, std::pair<GlobalValue*, LocTy> > ForwardRefValIDs;
70df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    std::vector<GlobalValue*> NumberedVals;
71df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  public:
72df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    LLParser(MemoryBuffer *F, ParseError &Err) : Lex(F, Err), M(0) {}
73df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    Module *Run();
74df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
75df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  private:
76df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
77df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool Error(LocTy L, const std::string &Msg) const {
78df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      return Lex.Error(L, Msg);
79df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    }
80df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool TokError(const std::string &Msg) const {
81df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      return Error(Lex.getLoc(), Msg);
82df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    }
83df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
84df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    /// GetGlobalVal - Get a value with the specified name or ID, creating a
85df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    /// forward reference record if needed.  This can return null if the value
86df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    /// exists but does not have the right type.
87df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    GlobalValue *GetGlobalVal(const std::string &N, const Type *Ty, LocTy Loc);
88df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    GlobalValue *GetGlobalVal(unsigned ID, const Type *Ty, LocTy Loc);
89df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
90df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    // Helper Routines.
91df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseToken(lltok::Kind T, const char *ErrMsg);
923ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner    bool EatIfPresent(lltok::Kind T) {
933ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner      if (Lex.getKind() != T) return false;
943ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner      Lex.Lex();
953ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner      return true;
963ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner    }
97df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseOptionalToken(lltok::Kind T, bool &Present) {
98df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      if (Lex.getKind() != T) {
99df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner        Present = false;
100df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      } else {
101df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner        Lex.Lex();
102df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner        Present = true;
103df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      }
104df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      return false;
105df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    }
1063ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner    bool ParseStringConstant(std::string &Result);
1073ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner    bool ParseUInt32(unsigned &Val);
1083ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner    bool ParseUInt32(unsigned &Val, LocTy &Loc) {
109df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      Loc = Lex.getLoc();
1103ed88efb03c63aae5542efcdfc5cedec9bc4c18aChris Lattner      return ParseUInt32(Val);
111df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    }
112df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseOptionalAddrSpace(unsigned &AddrSpace);
113df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind);
114df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseOptionalLinkage(unsigned &Linkage, bool &HasLinkage);
115df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseOptionalLinkage(unsigned &Linkage) {
116df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      bool HasLinkage; return ParseOptionalLinkage(Linkage, HasLinkage);
117df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    }
118df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseOptionalVisibility(unsigned &Visibility);
119df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseOptionalCallingConv(unsigned &CC);
120df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseOptionalAlignment(unsigned &Alignment);
121df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseOptionalCommaAlignment(unsigned &Alignment);
122df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseIndexList(SmallVectorImpl<unsigned> &Indices);
123df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
124df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    // Top-Level Entities
125df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseTopLevelEntities();
126df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ValidateEndOfModule();
127df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseTargetDefinition();
128df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseDepLibs();
129df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseModuleAsm();
130df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseUnnamedType();
131df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseNamedType();
132df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseDeclare();
133df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseDefine();
134df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
135df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseGlobalType(bool &IsConstant);
136df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseNamedGlobal();
137df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseGlobal(const std::string &Name, LocTy Loc, unsigned Linkage,
138df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner                     bool HasLinkage, unsigned Visibility);
139df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseAlias(const std::string &Name, LocTy Loc, unsigned Visibility);
140df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
141df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    // Type Parsing.
142df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseType(PATypeHolder &Result);
143df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseType(PATypeHolder &Result, LocTy &Loc) {
144df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      Loc = Lex.getLoc();
145df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      return ParseType(Result);
146df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    }
147df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseTypeRec(PATypeHolder &H);
148df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseStructType(PATypeHolder &H, bool Packed);
149df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseArrayVectorType(PATypeHolder &H, bool isVector);
150df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseFunctionType(PATypeHolder &Result);
151df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    PATypeHolder HandleUpRefs(const Type *Ty);
152df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
153df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    // Constants.
154df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseValID(ValID &ID);
155df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ConvertGlobalValIDToValue(const Type *Ty, ValID &ID, Constant *&V);
156df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseGlobalValue(const Type *Ty, Constant *&V);
157df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseGlobalTypeAndValue(Constant *&V);
158df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseGlobalValueVector(SmallVectorImpl<Constant*> &Elts);
159df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
160df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
161df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    // Function Semantic Analysis.
162df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    class PerFunctionState {
163df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      LLParser &P;
164df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      Function &F;
165df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      std::map<std::string, std::pair<Value*, LocTy> > ForwardRefVals;
166df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      std::map<unsigned, std::pair<Value*, LocTy> > ForwardRefValIDs;
167df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      std::vector<Value*> NumberedVals;
168df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    public:
169df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      PerFunctionState(LLParser &p, Function &f);
170df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      ~PerFunctionState();
171df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
172df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      Function &getFunction() const { return F; }
173df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
174df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      bool VerifyFunctionComplete();
175df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
176df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// GetVal - Get a value with the specified name or ID, creating a
177df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// forward reference record if needed.  This can return null if the value
178df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// exists but does not have the right type.
179df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      Value *GetVal(const std::string &Name, const Type *Ty, LocTy Loc);
180df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      Value *GetVal(unsigned ID, const Type *Ty, LocTy Loc);
181df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
182df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// SetInstName - After an instruction is parsed and inserted into its
183df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// basic block, this installs its name.
184df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      bool SetInstName(int NameID, const std::string &NameStr, LocTy NameLoc,
185df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner                       Instruction *Inst);
186df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
187df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// GetBB - Get a basic block with the specified name or ID, creating a
188df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// forward reference record if needed.  This can return null if the value
189df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// is not a BasicBlock.
190df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      BasicBlock *GetBB(const std::string &Name, LocTy Loc);
191df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      BasicBlock *GetBB(unsigned ID, LocTy Loc);
192df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
193df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// DefineBB - Define the specified basic block, which is either named or
194df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// unnamed.  If there is an error, this returns null otherwise it returns
195df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      /// the block being defined.
196df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      BasicBlock *DefineBB(const std::string &Name, LocTy Loc);
197df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    };
198df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
199df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V,
200df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner                             PerFunctionState &PFS);
201df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
202df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseValue(const Type *Ty, Value *&V, PerFunctionState &PFS);
203df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseValue(const Type *Ty, Value *&V, LocTy &Loc,
204df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner                    PerFunctionState &PFS) {
205df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      Loc = Lex.getLoc();
206df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      return ParseValue(Ty, V, PFS);
207df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    }
208df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
209df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseTypeAndValue(Value *&V, PerFunctionState &PFS);
210df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseTypeAndValue(Value *&V, LocTy &Loc, PerFunctionState &PFS) {
211df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      Loc = Lex.getLoc();
212df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      return ParseTypeAndValue(V, PFS);
213df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    }
214df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
215df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    struct ParamInfo {
216df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      LocTy Loc;
217df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      Value *V;
218df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      unsigned Attrs;
219df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      ParamInfo(LocTy loc, Value *v, unsigned attrs)
220df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner        : Loc(loc), V(v), Attrs(attrs) {}
221df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    };
222df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
223df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner                            PerFunctionState &PFS);
224df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
225df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    // Function Parsing.
226df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    struct ArgInfo {
227df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      LocTy Loc;
228df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      PATypeHolder Type;
229df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      unsigned Attrs;
230df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      std::string Name;
231df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner      ArgInfo(LocTy L, PATypeHolder Ty, unsigned Attr, const std::string &N)
232df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner        : Loc(L), Type(Ty), Attrs(Attr), Name(N) {}
233df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    };
234df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseArgumentList(std::vector<ArgInfo> &ArgList,
235df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner                           bool &isVarArg);
236df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseFunctionHeader(Function *&Fn, bool isDefine);
237df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseFunctionBody(Function &Fn);
238df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseBasicBlock(PerFunctionState &PFS);
239df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
240df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    // Instruction Parsing.
241df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseInstruction(Instruction *&Inst, BasicBlock *BB,
242df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner                          PerFunctionState &PFS);
243df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseCmpPredicate(unsigned &Pred, unsigned Opc);
244df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
245df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS);
246df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseBr(Instruction *&Inst, PerFunctionState &PFS);
247df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS);
248df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseInvoke(Instruction *&Inst, PerFunctionState &PFS);
249df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
250df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseArithmetic(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
251df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseLogical(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
252df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
253df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
254df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseSelect(Instruction *&I, PerFunctionState &PFS);
255df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseVAArg(Instruction *&I, PerFunctionState &PFS);
256df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseExtractElement(Instruction *&I, PerFunctionState &PFS);
257df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseInsertElement(Instruction *&I, PerFunctionState &PFS);
258df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseShuffleVector(Instruction *&I, PerFunctionState &PFS);
259df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParsePHI(Instruction *&I, PerFunctionState &PFS);
260df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseCall(Instruction *&I, PerFunctionState &PFS, bool isTail);
261df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseAlloc(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
262df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseFree(Instruction *&I, PerFunctionState &PFS);
263df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseLoad(Instruction *&I, PerFunctionState &PFS, bool isVolatile);
264df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseStore(Instruction *&I, PerFunctionState &PFS, bool isVolatile);
265df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseGetResult(Instruction *&I, PerFunctionState &PFS);
266df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseGetElementPtr(Instruction *&I, PerFunctionState &PFS);
267df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseExtractValue(Instruction *&I, PerFunctionState &PFS);
268df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner    bool ParseInsertValue(Instruction *&I, PerFunctionState &PFS);
269df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner  };
270df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner} // End llvm namespace
271df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner
272df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#endif
273