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