LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
LLParser.h
Go to the documentation of this file.
1 //===-- 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"
18 #include "llvm/ADT/DenseMap.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/Operator.h"
24 #include "llvm/IR/Type.h"
26 #include <map>
27 
28 namespace llvm {
29  class Module;
30  class OpaqueType;
31  class Function;
32  class Value;
33  class BasicBlock;
34  class Instruction;
35  class Constant;
36  class GlobalValue;
37  class MDString;
38  class MDNode;
39  class StructType;
40 
41  /// ValID - Represents a reference of a definition of some sort with no type.
42  /// There are several cases where we have to parse the value but where the
43  /// type can depend on later context. This may either be a numeric reference
44  /// or a symbolic (%var) reference. This is just a discriminated union.
45  struct ValID {
46  enum {
47  t_LocalID, t_GlobalID, // ID in UIntVal.
48  t_LocalName, t_GlobalName, // Name in StrVal.
49  t_APSInt, t_APFloat, // Value in APSIntVal/APFloatVal.
50  t_Null, t_Undef, t_Zero, // No value.
51  t_EmptyArray, // No value: []
52  t_Constant, // Value in ConstantVal.
53  t_InlineAsm, // Value in StrVal/StrVal2/UIntVal.
54  t_MDNode, // Value in MDNodeVal.
55  t_MDString, // Value in MDStringVal.
56  t_ConstantStruct, // Value in ConstantStructElts.
57  t_PackedConstantStruct // Value in ConstantStructElts.
58  } Kind;
59 
61  unsigned UIntVal;
62  std::string StrVal, StrVal2;
69 
71  ~ValID() {
73  delete [] ConstantStructElts;
74  }
75 
76  bool operator<(const ValID &RHS) const {
77  if (Kind == t_LocalID || Kind == t_GlobalID)
78  return UIntVal < RHS.UIntVal;
79  assert((Kind == t_LocalName || Kind == t_GlobalName ||
81  "Ordering not defined for this ValID kind yet");
82  return StrVal < RHS.StrVal;
83  }
84  };
85 
86  class LLParser {
87  public:
89  private:
90  LLVMContext &Context;
91  LLLexer Lex;
92  Module *M;
93 
94  // Instruction metadata resolution. Each instruction can have a list of
95  // MDRef info associated with them.
96  //
97  // The simpler approach of just creating temporary MDNodes and then calling
98  // RAUW on them when the definition is processed doesn't work because some
99  // instruction metadata kinds, such as dbg, get stored in the IR in an
100  // "optimized" format which doesn't participate in the normal value use
101  // lists. This means that RAUW doesn't work, even on temporary MDNodes
102  // which otherwise support RAUW. Instead, we defer resolving MDNode
103  // references until the definitions have been processed.
104  struct MDRef {
105  SMLoc Loc;
106  unsigned MDKind, MDSlot;
107  };
108  DenseMap<Instruction*, std::vector<MDRef> > ForwardRefInstMetadata;
109 
110  SmallVector<Instruction*, 64> InstsWithTBAATag;
111 
112  // Type resolution handling data structures. The location is set when we
113  // have processed a use of the type but not a definition yet.
115  std::vector<std::pair<Type*, LocTy> > NumberedTypes;
116 
117  std::vector<TrackingVH<MDNode> > NumberedMetadata;
118  std::map<unsigned, std::pair<TrackingVH<MDNode>, LocTy> > ForwardRefMDNodes;
119 
120  // Global Value reference information.
121  std::map<std::string, std::pair<GlobalValue*, LocTy> > ForwardRefVals;
122  std::map<unsigned, std::pair<GlobalValue*, LocTy> > ForwardRefValIDs;
123  std::vector<GlobalValue*> NumberedVals;
124 
125  // References to blockaddress. The key is the function ValID, the value is
126  // a list of references to blocks in that function.
127  std::map<ValID, std::vector<std::pair<ValID, GlobalValue*> > >
128  ForwardRefBlockAddresses;
129 
130  // Attribute builder reference information.
131  std::map<Value*, std::vector<unsigned> > ForwardRefAttrGroups;
132  std::map<unsigned, AttrBuilder> NumberedAttrBuilders;
133 
134  public:
136  Context(m->getContext()), Lex(F, SM, Err, m->getContext()),
137  M(m) {}
138  bool Run();
139 
140  LLVMContext &getContext() { return Context; }
141 
142  private:
143 
144  bool Error(LocTy L, const Twine &Msg) const {
145  return Lex.Error(L, Msg);
146  }
147  bool TokError(const Twine &Msg) const {
148  return Error(Lex.getLoc(), Msg);
149  }
150 
151  /// GetGlobalVal - Get a value with the specified name or ID, creating a
152  /// forward reference record if needed. This can return null if the value
153  /// exists but does not have the right type.
154  GlobalValue *GetGlobalVal(const std::string &N, Type *Ty, LocTy Loc);
155  GlobalValue *GetGlobalVal(unsigned ID, Type *Ty, LocTy Loc);
156 
157  // Helper Routines.
158  bool ParseToken(lltok::Kind T, const char *ErrMsg);
159  bool EatIfPresent(lltok::Kind T) {
160  if (Lex.getKind() != T) return false;
161  Lex.Lex();
162  return true;
163  }
164 
165  FastMathFlags EatFastMathFlagsIfPresent() {
166  FastMathFlags FMF;
167  while (true)
168  switch (Lex.getKind()) {
169  case lltok::kw_fast: FMF.setUnsafeAlgebra(); Lex.Lex(); continue;
170  case lltok::kw_nnan: FMF.setNoNaNs(); Lex.Lex(); continue;
171  case lltok::kw_ninf: FMF.setNoInfs(); Lex.Lex(); continue;
172  case lltok::kw_nsz: FMF.setNoSignedZeros(); Lex.Lex(); continue;
173  case lltok::kw_arcp: FMF.setAllowReciprocal(); Lex.Lex(); continue;
174  default: return FMF;
175  }
176  return FMF;
177  }
178 
179  bool ParseOptionalToken(lltok::Kind T, bool &Present, LocTy *Loc = 0) {
180  if (Lex.getKind() != T) {
181  Present = false;
182  } else {
183  if (Loc)
184  *Loc = Lex.getLoc();
185  Lex.Lex();
186  Present = true;
187  }
188  return false;
189  }
190  bool ParseStringConstant(std::string &Result);
191  bool ParseUInt32(unsigned &Val);
192  bool ParseUInt32(unsigned &Val, LocTy &Loc) {
193  Loc = Lex.getLoc();
194  return ParseUInt32(Val);
195  }
196 
197  bool ParseTLSModel(GlobalVariable::ThreadLocalMode &TLM);
198  bool ParseOptionalThreadLocal(GlobalVariable::ThreadLocalMode &TLM);
199  bool ParseOptionalAddrSpace(unsigned &AddrSpace);
200  bool ParseOptionalParamAttrs(AttrBuilder &B);
201  bool ParseOptionalReturnAttrs(AttrBuilder &B);
202  bool ParseOptionalLinkage(unsigned &Linkage, bool &HasLinkage);
203  bool ParseOptionalLinkage(unsigned &Linkage) {
204  bool HasLinkage; return ParseOptionalLinkage(Linkage, HasLinkage);
205  }
206  bool ParseOptionalVisibility(unsigned &Visibility);
207  bool ParseOptionalCallingConv(CallingConv::ID &CC);
208  bool ParseOptionalAlignment(unsigned &Alignment);
209  bool ParseScopeAndOrdering(bool isAtomic, SynchronizationScope &Scope,
210  AtomicOrdering &Ordering);
211  bool ParseOptionalStackAlignment(unsigned &Alignment);
212  bool ParseOptionalCommaAlign(unsigned &Alignment, bool &AteExtraComma);
213  bool ParseIndexList(SmallVectorImpl<unsigned> &Indices,bool &AteExtraComma);
214  bool ParseIndexList(SmallVectorImpl<unsigned> &Indices) {
215  bool AteExtraComma;
216  if (ParseIndexList(Indices, AteExtraComma)) return true;
217  if (AteExtraComma)
218  return TokError("expected index");
219  return false;
220  }
221 
222  // Top-Level Entities
223  bool ParseTopLevelEntities();
224  bool ValidateEndOfModule();
225  bool ParseTargetDefinition();
226  bool ParseModuleAsm();
227  bool ParseDepLibs(); // FIXME: Remove in 4.0.
228  bool ParseUnnamedType();
229  bool ParseNamedType();
230  bool ParseDeclare();
231  bool ParseDefine();
232 
233  bool ParseGlobalType(bool &IsConstant);
234  bool ParseUnnamedGlobal();
235  bool ParseNamedGlobal();
236  bool ParseGlobal(const std::string &Name, LocTy Loc, unsigned Linkage,
237  bool HasLinkage, unsigned Visibility);
238  bool ParseAlias(const std::string &Name, LocTy Loc, unsigned Visibility);
239  bool ParseStandaloneMetadata();
240  bool ParseNamedMetadata();
241  bool ParseMDString(MDString *&Result);
242  bool ParseMDNodeID(MDNode *&Result);
243  bool ParseMDNodeID(MDNode *&Result, unsigned &SlotNo);
244  bool ParseUnnamedAttrGrp();
245  bool ParseFnAttributeValuePairs(AttrBuilder &B,
246  std::vector<unsigned> &FwdRefAttrGrps,
247  bool inAttrGrp, LocTy &BuiltinLoc);
248 
249  // Type Parsing.
250  bool ParseType(Type *&Result, bool AllowVoid = false);
251  bool ParseType(Type *&Result, LocTy &Loc, bool AllowVoid = false) {
252  Loc = Lex.getLoc();
253  return ParseType(Result, AllowVoid);
254  }
255  bool ParseAnonStructType(Type *&Result, bool Packed);
256  bool ParseStructBody(SmallVectorImpl<Type*> &Body);
257  bool ParseStructDefinition(SMLoc TypeLoc, StringRef Name,
258  std::pair<Type*, LocTy> &Entry,
259  Type *&ResultTy);
260 
261  bool ParseArrayVectorType(Type *&Result, bool isVector);
262  bool ParseFunctionType(Type *&Result);
263 
264  // Function Semantic Analysis.
265  class PerFunctionState {
266  LLParser &P;
267  Function &F;
268  std::map<std::string, std::pair<Value*, LocTy> > ForwardRefVals;
269  std::map<unsigned, std::pair<Value*, LocTy> > ForwardRefValIDs;
270  std::vector<Value*> NumberedVals;
271 
272  /// FunctionNumber - If this is an unnamed function, this is the slot
273  /// number of it, otherwise it is -1.
274  int FunctionNumber;
275  public:
276  PerFunctionState(LLParser &p, Function &f, int FunctionNumber);
277  ~PerFunctionState();
278 
279  Function &getFunction() const { return F; }
280 
281  bool FinishFunction();
282 
283  /// GetVal - Get a value with the specified name or ID, creating a
284  /// forward reference record if needed. This can return null if the value
285  /// exists but does not have the right type.
286  Value *GetVal(const std::string &Name, Type *Ty, LocTy Loc);
287  Value *GetVal(unsigned ID, Type *Ty, LocTy Loc);
288 
289  /// SetInstName - After an instruction is parsed and inserted into its
290  /// basic block, this installs its name.
291  bool SetInstName(int NameID, const std::string &NameStr, LocTy NameLoc,
292  Instruction *Inst);
293 
294  /// GetBB - Get a basic block with the specified name or ID, creating a
295  /// forward reference record if needed. This can return null if the value
296  /// is not a BasicBlock.
297  BasicBlock *GetBB(const std::string &Name, LocTy Loc);
298  BasicBlock *GetBB(unsigned ID, LocTy Loc);
299 
300  /// DefineBB - Define the specified basic block, which is either named or
301  /// unnamed. If there is an error, this returns null otherwise it returns
302  /// the block being defined.
303  BasicBlock *DefineBB(const std::string &Name, LocTy Loc);
304  };
305 
306  bool ConvertValIDToValue(Type *Ty, ValID &ID, Value *&V,
307  PerFunctionState *PFS);
308 
309  bool ParseValue(Type *Ty, Value *&V, PerFunctionState *PFS);
310  bool ParseValue(Type *Ty, Value *&V, PerFunctionState &PFS) {
311  return ParseValue(Ty, V, &PFS);
312  }
313  bool ParseValue(Type *Ty, Value *&V, LocTy &Loc,
314  PerFunctionState &PFS) {
315  Loc = Lex.getLoc();
316  return ParseValue(Ty, V, &PFS);
317  }
318 
319  bool ParseTypeAndValue(Value *&V, PerFunctionState *PFS);
320  bool ParseTypeAndValue(Value *&V, PerFunctionState &PFS) {
321  return ParseTypeAndValue(V, &PFS);
322  }
323  bool ParseTypeAndValue(Value *&V, LocTy &Loc, PerFunctionState &PFS) {
324  Loc = Lex.getLoc();
325  return ParseTypeAndValue(V, PFS);
326  }
327  bool ParseTypeAndBasicBlock(BasicBlock *&BB, LocTy &Loc,
328  PerFunctionState &PFS);
329  bool ParseTypeAndBasicBlock(BasicBlock *&BB, PerFunctionState &PFS) {
330  LocTy Loc;
331  return ParseTypeAndBasicBlock(BB, Loc, PFS);
332  }
333 
334 
335  struct ParamInfo {
336  LocTy Loc;
337  Value *V;
338  AttributeSet Attrs;
339  ParamInfo(LocTy loc, Value *v, AttributeSet attrs)
340  : Loc(loc), V(v), Attrs(attrs) {}
341  };
342  bool ParseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
343  PerFunctionState &PFS);
344 
345  // Constant Parsing.
346  bool ParseValID(ValID &ID, PerFunctionState *PFS = NULL);
347  bool ParseGlobalValue(Type *Ty, Constant *&V);
348  bool ParseGlobalTypeAndValue(Constant *&V);
349  bool ParseGlobalValueVector(SmallVectorImpl<Constant*> &Elts);
350  bool ParseMetadataListValue(ValID &ID, PerFunctionState *PFS);
351  bool ParseMetadataValue(ValID &ID, PerFunctionState *PFS);
352  bool ParseMDNodeVector(SmallVectorImpl<Value*> &, PerFunctionState *PFS);
353  bool ParseInstructionMetadata(Instruction *Inst, PerFunctionState *PFS);
354 
355  // Function Parsing.
356  struct ArgInfo {
357  LocTy Loc;
358  Type *Ty;
359  AttributeSet Attrs;
360  std::string Name;
361  ArgInfo(LocTy L, Type *ty, AttributeSet Attr, const std::string &N)
362  : Loc(L), Ty(ty), Attrs(Attr), Name(N) {}
363  };
364  bool ParseArgumentList(SmallVectorImpl<ArgInfo> &ArgList, bool &isVarArg);
365  bool ParseFunctionHeader(Function *&Fn, bool isDefine);
366  bool ParseFunctionBody(Function &Fn);
367  bool ParseBasicBlock(PerFunctionState &PFS);
368 
369  // Instruction Parsing. Each instruction parsing routine can return with a
370  // normal result, an error result, or return having eaten an extra comma.
371  enum InstResult { InstNormal = 0, InstError = 1, InstExtraComma = 2 };
372  int ParseInstruction(Instruction *&Inst, BasicBlock *BB,
373  PerFunctionState &PFS);
374  bool ParseCmpPredicate(unsigned &Pred, unsigned Opc);
375 
376  bool ParseRet(Instruction *&Inst, BasicBlock *BB, PerFunctionState &PFS);
377  bool ParseBr(Instruction *&Inst, PerFunctionState &PFS);
378  bool ParseSwitch(Instruction *&Inst, PerFunctionState &PFS);
379  bool ParseIndirectBr(Instruction *&Inst, PerFunctionState &PFS);
380  bool ParseInvoke(Instruction *&Inst, PerFunctionState &PFS);
381  bool ParseResume(Instruction *&Inst, PerFunctionState &PFS);
382 
383  bool ParseArithmetic(Instruction *&I, PerFunctionState &PFS, unsigned Opc,
384  unsigned OperandType);
385  bool ParseLogical(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
386  bool ParseCompare(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
387  bool ParseCast(Instruction *&I, PerFunctionState &PFS, unsigned Opc);
388  bool ParseSelect(Instruction *&I, PerFunctionState &PFS);
389  bool ParseVA_Arg(Instruction *&I, PerFunctionState &PFS);
390  bool ParseExtractElement(Instruction *&I, PerFunctionState &PFS);
391  bool ParseInsertElement(Instruction *&I, PerFunctionState &PFS);
392  bool ParseShuffleVector(Instruction *&I, PerFunctionState &PFS);
393  int ParsePHI(Instruction *&I, PerFunctionState &PFS);
394  bool ParseLandingPad(Instruction *&I, PerFunctionState &PFS);
395  bool ParseCall(Instruction *&I, PerFunctionState &PFS, bool isTail);
396  int ParseAlloc(Instruction *&I, PerFunctionState &PFS);
397  int ParseLoad(Instruction *&I, PerFunctionState &PFS);
398  int ParseStore(Instruction *&I, PerFunctionState &PFS);
399  int ParseCmpXchg(Instruction *&I, PerFunctionState &PFS);
400  int ParseAtomicRMW(Instruction *&I, PerFunctionState &PFS);
401  int ParseFence(Instruction *&I, PerFunctionState &PFS);
402  int ParseGetElementPtr(Instruction *&I, PerFunctionState &PFS);
403  int ParseExtractValue(Instruction *&I, PerFunctionState &PFS);
404  int ParseInsertValue(Instruction *&I, PerFunctionState &PFS);
405 
406  bool ResolveForwardRefBlockAddresses(Function *TheFn,
407  std::vector<std::pair<ValID, GlobalValue*> > &Refs,
408  PerFunctionState *PFS);
409  };
410 } // End llvm namespace
411 
412 #endif
LLLexer::LocTy Loc
Definition: LLParser.h:60
COFF::RelocationTypeX86 Type
Definition: COFFYAML.cpp:227
MDString * MDStringVal
Definition: LLParser.h:67
Various leaf nodes.
Definition: ISDOpcodes.h:60
The main container class for the LLVM Intermediate Representation.
Definition: Module.h:112
LLVMContext & getContext()
Definition: LLParser.h:140
MDNode - a tuple of other values.
Definition: Metadata.h:69
F(f)
unsigned UIntVal
Definition: LLParser.h:61
LLParser(MemoryBuffer *F, SourceMgr &SM, SMDiagnostic &Err, Module *m)
Definition: LLParser.h:135
bool Run()
Run: module ::= toplevelentity*.
Definition: LLParser.cpp:38
This file contains the simple types necessary to represent the attributes associated with functions a...
lltok::Kind Lex()
Definition: LLLexer.h:50
SynchronizationScope
Definition: Instructions.h:47
ID
LLVM Calling Convention Representation.
Definition: CallingConv.h:26
AtomicOrdering
Definition: Instructions.h:36
MDNode * MDNodeVal
Definition: LLParser.h:66
#define T
bool operator<(const ValID &RHS) const
Definition: LLParser.h:76
std::string StrVal
Definition: LLParser.h:62
A self-contained host- and target-independent arbitrary-precision floating-point software implementat...
Definition: APFloat.h:122
#define P(N)
LLVM Constant Representation.
Definition: Constant.h:41
Constant * ConstantVal
Definition: LLParser.h:65
LocTy getLoc() const
Definition: LLLexer.h:55
APFloat APFloatVal
Definition: LLParser.h:64
bool Error(LocTy L, const Twine &Msg) const
Definition: LLLexer.cpp:32
static bool isAtomic(Instruction *I)
Constant ** ConstantStructElts
Definition: LLParser.h:68
APSInt APSIntVal
Definition: LLParser.h:63
enum llvm::ValID::@149 Kind
FunctionNumber(functionNumber)
Definition: LLParser.cpp:1964
#define I(x, y, z)
Definition: MD5.cpp:54
#define N
lltok::Kind getKind() const
Definition: LLLexer.h:56
std::string StrVal2
Definition: LLParser.h:62
LLLexer::LocTy LocTy
Definition: LLParser.h:88
Represents a location in source code.
Definition: SMLoc.h:23
TLM
Definition: LLParser.cpp:1117