blob: 924c9293cb186d87294e17e5da56dfccb39f484e [file] [log] [blame]
Chris Lattnerdf986172009-01-02 07:01:27 +00001//===-- LLParser.h - Parser Class -------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the parser class for .ll files.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_ASMPARSER_LLPARSER_H
15#define LLVM_ASMPARSER_LLPARSER_H
16
17#include "LLLexer.h"
Owen Andersonc137ea62009-07-01 21:57:44 +000018#include "llvm/Module.h"
Chris Lattnerdf986172009-01-02 07:01:27 +000019#include "llvm/Type.h"
20#include <map>
21
22namespace llvm {
23 class Module;
24 class OpaqueType;
25 class Function;
26 class Value;
27 class BasicBlock;
28 class Instruction;
29 class Constant;
30 class GlobalValue;
Nick Lewycky21cc4462009-04-04 07:22:01 +000031 class MDString;
32 class MDNode;
Owen Andersonc137ea62009-07-01 21:57:44 +000033 class LLVMContext;
Chris Lattnerdf986172009-01-02 07:01:27 +000034 struct ValID;
Misha Brukman9ea40342009-01-02 22:46:48 +000035
Chris Lattnerdf986172009-01-02 07:01:27 +000036 class LLParser {
37 public:
38 typedef LLLexer::LocTy LocTy;
39 private:
Owen Andersonc137ea62009-07-01 21:57:44 +000040 const LLVMContext& Context;
Chris Lattnerdf986172009-01-02 07:01:27 +000041 LLLexer Lex;
42 Module *M;
Misha Brukman9ea40342009-01-02 22:46:48 +000043
Chris Lattnerdf986172009-01-02 07:01:27 +000044 // Type resolution handling data structures.
45 std::map<std::string, std::pair<PATypeHolder, LocTy> > ForwardRefTypes;
46 std::map<unsigned, std::pair<PATypeHolder, LocTy> > ForwardRefTypeIDs;
47 std::vector<PATypeHolder> NumberedTypes;
Devang Patel923078c2009-07-01 19:21:12 +000048 /// MetadataCache - This map keeps track of parsed metadata constants.
49 std::map<unsigned, Constant *> MetadataCache;
Chris Lattnerdf986172009-01-02 07:01:27 +000050 struct UpRefRecord {
51 /// Loc - This is the location of the upref.
52 LocTy Loc;
Misha Brukman9ea40342009-01-02 22:46:48 +000053
Chris Lattnerdf986172009-01-02 07:01:27 +000054 /// NestingLevel - The number of nesting levels that need to be popped
55 /// before this type is resolved.
56 unsigned NestingLevel;
Misha Brukman9ea40342009-01-02 22:46:48 +000057
Chris Lattnerdf986172009-01-02 07:01:27 +000058 /// LastContainedTy - This is the type at the current binding level for
59 /// the type. Every time we reduce the nesting level, this gets updated.
60 const Type *LastContainedTy;
Misha Brukman9ea40342009-01-02 22:46:48 +000061
Chris Lattnerdf986172009-01-02 07:01:27 +000062 /// UpRefTy - This is the actual opaque type that the upreference is
63 /// represented with.
64 OpaqueType *UpRefTy;
Misha Brukman9ea40342009-01-02 22:46:48 +000065
Chris Lattnerdf986172009-01-02 07:01:27 +000066 UpRefRecord(LocTy L, unsigned NL, OpaqueType *URTy)
67 : Loc(L), NestingLevel(NL), LastContainedTy((Type*)URTy),
68 UpRefTy(URTy) {}
69 };
70 std::vector<UpRefRecord> UpRefs;
71
72 // Global Value reference information.
73 std::map<std::string, std::pair<GlobalValue*, LocTy> > ForwardRefVals;
74 std::map<unsigned, std::pair<GlobalValue*, LocTy> > ForwardRefValIDs;
75 std::vector<GlobalValue*> NumberedVals;
76 public:
Owen Andersonc137ea62009-07-01 21:57:44 +000077 LLParser(MemoryBuffer *F, ParseError &Err, Module *m) :
78 Context(M->getContext()), Lex(F, Err), M(m) {}
Chris Lattnerad7d1e22009-01-04 20:44:11 +000079 bool Run();
Misha Brukman9ea40342009-01-02 22:46:48 +000080
Chris Lattnerdf986172009-01-02 07:01:27 +000081 private:
82
83 bool Error(LocTy L, const std::string &Msg) const {
84 return Lex.Error(L, Msg);
85 }
86 bool TokError(const std::string &Msg) const {
87 return Error(Lex.getLoc(), Msg);
88 }
Misha Brukman9ea40342009-01-02 22:46:48 +000089
Chris Lattnerdf986172009-01-02 07:01:27 +000090 /// GetGlobalVal - Get a value with the specified name or ID, creating a
91 /// forward reference record if needed. This can return null if the value
92 /// exists but does not have the right type.
93 GlobalValue *GetGlobalVal(const std::string &N, const Type *Ty, LocTy Loc);
94 GlobalValue *GetGlobalVal(unsigned ID, const Type *Ty, LocTy Loc);
Misha Brukman9ea40342009-01-02 22:46:48 +000095
Chris Lattnerdf986172009-01-02 07:01:27 +000096 // Helper Routines.
97 bool ParseToken(lltok::Kind T, const char *ErrMsg);
Chris Lattner3ed88ef2009-01-02 08:05:26 +000098 bool EatIfPresent(lltok::Kind T) {
99 if (Lex.getKind() != T) return false;
100 Lex.Lex();
101 return true;
102 }
Chris Lattnerdf986172009-01-02 07:01:27 +0000103 bool ParseOptionalToken(lltok::Kind T, bool &Present) {
104 if (Lex.getKind() != T) {
105 Present = false;
106 } else {
107 Lex.Lex();
108 Present = true;
109 }
110 return false;
111 }
Chris Lattner3ed88ef2009-01-02 08:05:26 +0000112 bool ParseStringConstant(std::string &Result);
113 bool ParseUInt32(unsigned &Val);
114 bool ParseUInt32(unsigned &Val, LocTy &Loc) {
Chris Lattnerdf986172009-01-02 07:01:27 +0000115 Loc = Lex.getLoc();
Chris Lattner3ed88ef2009-01-02 08:05:26 +0000116 return ParseUInt32(Val);
Chris Lattnerdf986172009-01-02 07:01:27 +0000117 }
118 bool ParseOptionalAddrSpace(unsigned &AddrSpace);
119 bool ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind);
120 bool ParseOptionalLinkage(unsigned &Linkage, bool &HasLinkage);
121 bool ParseOptionalLinkage(unsigned &Linkage) {
122 bool HasLinkage; return ParseOptionalLinkage(Linkage, HasLinkage);
123 }
124 bool ParseOptionalVisibility(unsigned &Visibility);
125 bool ParseOptionalCallingConv(unsigned &CC);
126 bool ParseOptionalAlignment(unsigned &Alignment);
127 bool ParseOptionalCommaAlignment(unsigned &Alignment);
128 bool ParseIndexList(SmallVectorImpl<unsigned> &Indices);
Misha Brukman9ea40342009-01-02 22:46:48 +0000129
Chris Lattnerdf986172009-01-02 07:01:27 +0000130 // Top-Level Entities
131 bool ParseTopLevelEntities();
132 bool ValidateEndOfModule();
133 bool ParseTargetDefinition();
134 bool ParseDepLibs();
135 bool ParseModuleAsm();
136 bool ParseUnnamedType();
137 bool ParseNamedType();
138 bool ParseDeclare();
139 bool ParseDefine();
Misha Brukman9ea40342009-01-02 22:46:48 +0000140
Chris Lattnerdf986172009-01-02 07:01:27 +0000141 bool ParseGlobalType(bool &IsConstant);
142 bool ParseNamedGlobal();
143 bool ParseGlobal(const std::string &Name, LocTy Loc, unsigned Linkage,
144 bool HasLinkage, unsigned Visibility);
145 bool ParseAlias(const std::string &Name, LocTy Loc, unsigned Visibility);
Devang Patel923078c2009-07-01 19:21:12 +0000146 bool ParseStandaloneMetadata();
Misha Brukman9ea40342009-01-02 22:46:48 +0000147
Chris Lattnerdf986172009-01-02 07:01:27 +0000148 // Type Parsing.
Chris Lattnera9a9e072009-03-09 04:49:14 +0000149 bool ParseType(PATypeHolder &Result, bool AllowVoid = false);
150 bool ParseType(PATypeHolder &Result, LocTy &Loc, bool AllowVoid = false) {
Chris Lattnerdf986172009-01-02 07:01:27 +0000151 Loc = Lex.getLoc();
Chris Lattnera9a9e072009-03-09 04:49:14 +0000152 return ParseType(Result, AllowVoid);
Chris Lattnerdf986172009-01-02 07:01:27 +0000153 }
154 bool ParseTypeRec(PATypeHolder &H);
155 bool ParseStructType(PATypeHolder &H, bool Packed);
156 bool ParseArrayVectorType(PATypeHolder &H, bool isVector);
157 bool ParseFunctionType(PATypeHolder &Result);
158 PATypeHolder HandleUpRefs(const Type *Ty);
159
160 // Constants.
161 bool ParseValID(ValID &ID);
162 bool ConvertGlobalValIDToValue(const Type *Ty, ValID &ID, Constant *&V);
163 bool ParseGlobalValue(const Type *Ty, Constant *&V);
164 bool ParseGlobalTypeAndValue(Constant *&V);
165 bool ParseGlobalValueVector(SmallVectorImpl<Constant*> &Elts);
Nick Lewyckycb337992009-05-10 20:57:05 +0000166 bool ParseMDNodeVector(SmallVectorImpl<Value*> &);
Chris Lattnerdf986172009-01-02 07:01:27 +0000167
Misha Brukman9ea40342009-01-02 22:46:48 +0000168
Chris Lattnerdf986172009-01-02 07:01:27 +0000169 // Function Semantic Analysis.
170 class PerFunctionState {
171 LLParser &P;
172 Function &F;
173 std::map<std::string, std::pair<Value*, LocTy> > ForwardRefVals;
174 std::map<unsigned, std::pair<Value*, LocTy> > ForwardRefValIDs;
175 std::vector<Value*> NumberedVals;
176 public:
177 PerFunctionState(LLParser &p, Function &f);
178 ~PerFunctionState();
Misha Brukman9ea40342009-01-02 22:46:48 +0000179
Chris Lattnerdf986172009-01-02 07:01:27 +0000180 Function &getFunction() const { return F; }
Misha Brukman9ea40342009-01-02 22:46:48 +0000181
Chris Lattnerdf986172009-01-02 07:01:27 +0000182 bool VerifyFunctionComplete();
Misha Brukman9ea40342009-01-02 22:46:48 +0000183
Chris Lattnerdf986172009-01-02 07:01:27 +0000184 /// GetVal - Get a value with the specified name or ID, creating a
185 /// forward reference record if needed. This can return null if the value
186 /// exists but does not have the right type.
187 Value *GetVal(const std::string &Name, const Type *Ty, LocTy Loc);
188 Value *GetVal(unsigned ID, const Type *Ty, LocTy Loc);
Misha Brukman9ea40342009-01-02 22:46:48 +0000189
Chris Lattnerdf986172009-01-02 07:01:27 +0000190 /// SetInstName - After an instruction is parsed and inserted into its
191 /// basic block, this installs its name.
192 bool SetInstName(int NameID, const std::string &NameStr, LocTy NameLoc,
193 Instruction *Inst);
Misha Brukman9ea40342009-01-02 22:46:48 +0000194
Chris Lattnerdf986172009-01-02 07:01:27 +0000195 /// GetBB - Get a basic block with the specified name or ID, creating a
196 /// forward reference record if needed. This can return null if the value
197 /// is not a BasicBlock.
198 BasicBlock *GetBB(const std::string &Name, LocTy Loc);
199 BasicBlock *GetBB(unsigned ID, LocTy Loc);
Misha Brukman9ea40342009-01-02 22:46:48 +0000200
Chris Lattnerdf986172009-01-02 07:01:27 +0000201 /// DefineBB - Define the specified basic block, which is either named or
202 /// unnamed. If there is an error, this returns null otherwise it returns
203 /// the block being defined.
204 BasicBlock *DefineBB(const std::string &Name, LocTy Loc);
205 };
Misha Brukman9ea40342009-01-02 22:46:48 +0000206
Chris Lattnerdf986172009-01-02 07:01:27 +0000207 bool ConvertValIDToValue(const Type *Ty, ValID &ID, Value *&V,
208 PerFunctionState &PFS);
Misha Brukman9ea40342009-01-02 22:46:48 +0000209
Chris Lattnerdf986172009-01-02 07:01:27 +0000210 bool ParseValue(const Type *Ty, Value *&V, PerFunctionState &PFS);
211 bool ParseValue(const Type *Ty, Value *&V, LocTy &Loc,
212 PerFunctionState &PFS) {
213 Loc = Lex.getLoc();
214 return ParseValue(Ty, V, PFS);
215 }
Misha Brukman9ea40342009-01-02 22:46:48 +0000216
Chris Lattnerdf986172009-01-02 07:01:27 +0000217 bool ParseTypeAndValue(Value *&V, PerFunctionState &PFS);
218 bool ParseTypeAndValue(Value *&V, LocTy &Loc, PerFunctionState &PFS) {
219 Loc = Lex.getLoc();
220 return ParseTypeAndValue(V, PFS);
221 }
Misha Brukman9ea40342009-01-02 22:46:48 +0000222
Chris Lattnerdf986172009-01-02 07:01:27 +0000223 struct ParamInfo {
224 LocTy Loc;
225 Value *V;
226 unsigned Attrs;
Misha Brukman9ea40342009-01-02 22:46:48 +0000227 ParamInfo(LocTy loc, Value *v, unsigned attrs)
Chris Lattnerdf986172009-01-02 07:01:27 +0000228 : Loc(loc), V(v), Attrs(attrs) {}
229 };
230 bool ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
231 PerFunctionState &PFS);
Misha Brukman9ea40342009-01-02 22:46:48 +0000232
Chris Lattnerdf986172009-01-02 07:01:27 +0000233 // Function Parsing.
234 struct ArgInfo {
235 LocTy Loc;
236 PATypeHolder Type;
237 unsigned Attrs;
238 std::string Name;
239 ArgInfo(LocTy L, PATypeHolder Ty, unsigned Attr, const std::string &N)
240 : Loc(L), Type(Ty), Attrs(Attr), Name(N) {}
241 };
242 bool ParseArgumentList(std::vector<ArgInfo> &ArgList,
Chris Lattnerdfd19dd2009-01-05 18:34:07 +0000243 bool &isVarArg, bool inType);
Chris Lattnerdf986172009-01-02 07:01:27 +0000244 bool ParseFunctionHeader(Function *&Fn, bool isDefine);
245 bool ParseFunctionBody(Function &Fn);
246 bool ParseBasicBlock(PerFunctionState &PFS);
Misha Brukman9ea40342009-01-02 22:46:48 +0000247
Chris Lattnerdf986172009-01-02 07:01:27 +0000248 // Instruction Parsing.
249 bool ParseInstruction(Instruction *&Inst, BasicBlock *BB,
250 PerFunctionState &PFS);
251 bool ParseCmpPredicate(unsigned &Pred, unsigned Opc);
Misha Brukman9ea40342009-01-02 22:46:48 +0000252
Chris Lattnerdf986172009-01-02 07:01:27 +0000253 bool ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS);
254 bool ParseBr(Instruction *&Inst, PerFunctionState &PFS);
255 bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS);
256 bool ParseInvoke(Instruction *&Inst, PerFunctionState &PFS);
Misha Brukman9ea40342009-01-02 22:46:48 +0000257
Chris Lattnere914b592009-01-05 08:24:46 +0000258 bool ParseArithmetic(Instruction *&I, PerFunctionState &PFS, unsigned Opc,
259 unsigned OperandType);
Chris Lattnerdf986172009-01-02 07:01:27 +0000260 bool ParseLogical(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
261 bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
262 bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
263 bool ParseSelect(Instruction *&I, PerFunctionState &PFS);
Chris Lattner0088a5c2009-01-05 08:18:44 +0000264 bool ParseVA_Arg(Instruction *&I, PerFunctionState &PFS);
Chris Lattnerdf986172009-01-02 07:01:27 +0000265 bool ParseExtractElement(Instruction *&I, PerFunctionState &PFS);
266 bool ParseInsertElement(Instruction *&I, PerFunctionState &PFS);
267 bool ParseShuffleVector(Instruction *&I, PerFunctionState &PFS);
268 bool ParsePHI(Instruction *&I, PerFunctionState &PFS);
269 bool ParseCall(Instruction *&I, PerFunctionState &PFS, bool isTail);
270 bool ParseAlloc(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
271 bool ParseFree(Instruction *&I, PerFunctionState &PFS);
272 bool ParseLoad(Instruction *&I, PerFunctionState &PFS, bool isVolatile);
273 bool ParseStore(Instruction *&I, PerFunctionState &PFS, bool isVolatile);
274 bool ParseGetResult(Instruction *&I, PerFunctionState &PFS);
275 bool ParseGetElementPtr(Instruction *&I, PerFunctionState &PFS);
276 bool ParseExtractValue(Instruction *&I, PerFunctionState &PFS);
277 bool ParseInsertValue(Instruction *&I, PerFunctionState &PFS);
278 };
279} // End llvm namespace
280
281#endif