1226584Sdim//===- TGParser.h - Parser for TableGen Files -------------------*- C++ -*-===//
2226584Sdim//
3226584Sdim//                     The LLVM Compiler Infrastructure
4226584Sdim//
5226584Sdim// This file is distributed under the University of Illinois Open Source
6226584Sdim// License. See LICENSE.TXT for details.
7226584Sdim//
8226584Sdim//===----------------------------------------------------------------------===//
9226584Sdim//
10226584Sdim// This class represents the Parser for tablegen files.
11226584Sdim//
12226584Sdim//===----------------------------------------------------------------------===//
13226584Sdim
14226584Sdim#ifndef TGPARSER_H
15226584Sdim#define TGPARSER_H
16226584Sdim
17226584Sdim#include "TGLexer.h"
18226584Sdim#include "llvm/ADT/Twine.h"
19226584Sdim#include "llvm/Support/SourceMgr.h"
20249423Sdim#include "llvm/TableGen/Error.h"
21249423Sdim#include "llvm/TableGen/Record.h"
22226584Sdim#include <map>
23226584Sdim
24226584Sdimnamespace llvm {
25226584Sdim  class Record;
26226584Sdim  class RecordVal;
27226584Sdim  class RecordKeeper;
28226584Sdim  class RecTy;
29226584Sdim  class Init;
30226584Sdim  struct MultiClass;
31226584Sdim  struct SubClassReference;
32226584Sdim  struct SubMultiClassReference;
33243830Sdim
34226584Sdim  struct LetRecord {
35226584Sdim    std::string Name;
36226584Sdim    std::vector<unsigned> Bits;
37226584Sdim    Init *Value;
38226584Sdim    SMLoc Loc;
39226584Sdim    LetRecord(const std::string &N, const std::vector<unsigned> &B, Init *V,
40226584Sdim              SMLoc L)
41226584Sdim      : Name(N), Bits(B), Value(V), Loc(L) {
42226584Sdim    }
43226584Sdim  };
44243830Sdim
45234353Sdim  /// ForeachLoop - Record the iteration state associated with a for loop.
46234353Sdim  /// This is used to instantiate items in the loop body.
47234353Sdim  struct ForeachLoop {
48239462Sdim    VarInit *IterVar;
49239462Sdim    ListInit *ListValue;
50234353Sdim
51239462Sdim    ForeachLoop(VarInit *IVar, ListInit *LValue)
52239462Sdim      : IterVar(IVar), ListValue(LValue) {}
53234353Sdim  };
54234353Sdim
55226584Sdimclass TGParser {
56226584Sdim  TGLexer Lex;
57226584Sdim  std::vector<std::vector<LetRecord> > LetStack;
58226584Sdim  std::map<std::string, MultiClass*> MultiClasses;
59243830Sdim
60234353Sdim  /// Loops - Keep track of any foreach loops we are within.
61234353Sdim  ///
62234353Sdim  typedef std::vector<ForeachLoop> LoopVector;
63234353Sdim  LoopVector Loops;
64234353Sdim
65243830Sdim  /// CurMultiClass - If we are parsing a 'multiclass' definition, this is the
66226584Sdim  /// current value.
67226584Sdim  MultiClass *CurMultiClass;
68226584Sdim
69226584Sdim  // Record tracker
70226584Sdim  RecordKeeper &Records;
71234353Sdim
72234353Sdim  // A "named boolean" indicating how to parse identifiers.  Usually
73234353Sdim  // identifiers map to some existing object but in special cases
74234353Sdim  // (e.g. parsing def names) no such object exists yet because we are
75234353Sdim  // in the middle of creating in.  For those situations, allow the
76234353Sdim  // parser to ignore missing object errors.
77234353Sdim  enum IDParseMode {
78234353Sdim    ParseValueMode,   // We are parsing a value we expect to look up.
79234353Sdim    ParseNameMode,    // We are parsing a name of an object that does not yet
80234353Sdim                      // exist.
81234353Sdim    ParseForeachMode  // We are parsing a foreach init.
82234353Sdim  };
83234353Sdim
84226584Sdimpublic:
85243830Sdim  TGParser(SourceMgr &SrcMgr, RecordKeeper &records) :
86226584Sdim    Lex(SrcMgr), CurMultiClass(0), Records(records) {}
87243830Sdim
88226584Sdim  /// ParseFile - Main entrypoint for parsing a tblgen file.  These parser
89226584Sdim  /// routines return true on error, or false on success.
90226584Sdim  bool ParseFile();
91243830Sdim
92226584Sdim  bool Error(SMLoc L, const Twine &Msg) const {
93226584Sdim    PrintError(L, Msg);
94226584Sdim    return true;
95226584Sdim  }
96226584Sdim  bool TokError(const Twine &Msg) const {
97226584Sdim    return Error(Lex.getLoc(), Msg);
98226584Sdim  }
99249423Sdim  const TGLexer::DependenciesMapTy &getDependencies() const {
100226584Sdim    return Lex.getDependencies();
101226584Sdim  }
102234353Sdim
103226584Sdimprivate:  // Semantic analysis methods.
104226584Sdim  bool AddValue(Record *TheRec, SMLoc Loc, const RecordVal &RV);
105243830Sdim  bool SetValue(Record *TheRec, SMLoc Loc, Init *ValName,
106234353Sdim                const std::vector<unsigned> &BitList, Init *V);
107243830Sdim  bool SetValue(Record *TheRec, SMLoc Loc, const std::string &ValName,
108234353Sdim                const std::vector<unsigned> &BitList, Init *V) {
109234353Sdim    return SetValue(TheRec, Loc, StringInit::get(ValName), BitList, V);
110234353Sdim  }
111226584Sdim  bool AddSubClass(Record *Rec, SubClassReference &SubClass);
112226584Sdim  bool AddSubMultiClass(MultiClass *CurMC,
113226584Sdim                        SubMultiClassReference &SubMultiClass);
114226584Sdim
115234353Sdim  // IterRecord: Map an iterator name to a value.
116234353Sdim  struct IterRecord {
117239462Sdim    VarInit *IterVar;
118234353Sdim    Init *IterValue;
119239462Sdim    IterRecord(VarInit *Var, Init *Val) : IterVar(Var), IterValue(Val) {}
120234353Sdim  };
121234353Sdim
122234353Sdim  // IterSet: The set of all iterator values at some point in the
123234353Sdim  // iteration space.
124234353Sdim  typedef std::vector<IterRecord> IterSet;
125234353Sdim
126239462Sdim  bool ProcessForeachDefs(Record *CurRec, SMLoc Loc);
127239462Sdim  bool ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals);
128234353Sdim
129226584Sdimprivate:  // Parser methods.
130226584Sdim  bool ParseObjectList(MultiClass *MC = 0);
131226584Sdim  bool ParseObject(MultiClass *MC);
132226584Sdim  bool ParseClass();
133226584Sdim  bool ParseMultiClass();
134226584Sdim  Record *InstantiateMulticlassDef(MultiClass &MC,
135226584Sdim                                   Record *DefProto,
136234353Sdim                                   Init *DefmPrefix,
137249423Sdim                                   SMRange DefmPrefixRange);
138226584Sdim  bool ResolveMulticlassDefArgs(MultiClass &MC,
139226584Sdim                                Record *DefProto,
140226584Sdim                                SMLoc DefmPrefixLoc,
141226584Sdim                                SMLoc SubClassLoc,
142234353Sdim                                const std::vector<Init *> &TArgs,
143226584Sdim                                std::vector<Init *> &TemplateVals,
144226584Sdim                                bool DeleteArgs);
145226584Sdim  bool ResolveMulticlassDef(MultiClass &MC,
146226584Sdim                            Record *CurRec,
147226584Sdim                            Record *DefProto,
148226584Sdim                            SMLoc DefmPrefixLoc);
149226584Sdim  bool ParseDefm(MultiClass *CurMultiClass);
150226584Sdim  bool ParseDef(MultiClass *CurMultiClass);
151234353Sdim  bool ParseForeach(MultiClass *CurMultiClass);
152226584Sdim  bool ParseTopLevelLet(MultiClass *CurMultiClass);
153226584Sdim  std::vector<LetRecord> ParseLetList();
154226584Sdim
155226584Sdim  bool ParseObjectBody(Record *CurRec);
156226584Sdim  bool ParseBody(Record *CurRec);
157226584Sdim  bool ParseBodyItem(Record *CurRec);
158226584Sdim
159226584Sdim  bool ParseTemplateArgList(Record *CurRec);
160234353Sdim  Init *ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs);
161239462Sdim  VarInit *ParseForeachDeclaration(ListInit *&ForeachListValue);
162226584Sdim
163226584Sdim  SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm);
164226584Sdim  SubMultiClassReference ParseSubMultiClassReference(MultiClass *CurMC);
165226584Sdim
166234353Sdim  Init *ParseIDValue(Record *CurRec, IDParseMode Mode = ParseValueMode);
167234353Sdim  Init *ParseIDValue(Record *CurRec, const std::string &Name, SMLoc NameLoc,
168234353Sdim                     IDParseMode Mode = ParseValueMode);
169234353Sdim  Init *ParseSimpleValue(Record *CurRec, RecTy *ItemType = 0,
170234353Sdim                         IDParseMode Mode = ParseValueMode);
171234353Sdim  Init *ParseValue(Record *CurRec, RecTy *ItemType = 0,
172234353Sdim                   IDParseMode Mode = ParseValueMode);
173243830Sdim  std::vector<Init*> ParseValueList(Record *CurRec, Record *ArgsRec = 0,
174243830Sdim                                    RecTy *EltTy = 0);
175226584Sdim  std::vector<std::pair<llvm::Init*, std::string> > ParseDagArgList(Record *);
176226584Sdim  bool ParseOptionalRangeList(std::vector<unsigned> &Ranges);
177226584Sdim  bool ParseOptionalBitList(std::vector<unsigned> &Ranges);
178226584Sdim  std::vector<unsigned> ParseRangeList();
179226584Sdim  bool ParseRangePiece(std::vector<unsigned> &Ranges);
180226584Sdim  RecTy *ParseType();
181226584Sdim  Init *ParseOperation(Record *CurRec);
182226584Sdim  RecTy *ParseOperatorType();
183234353Sdim  Init *ParseObjectName(MultiClass *CurMultiClass);
184226584Sdim  Record *ParseClassID();
185226584Sdim  MultiClass *ParseMultiClassID();
186249423Sdim  bool ApplyLetStack(Record *CurRec);
187226584Sdim};
188243830Sdim
189226584Sdim} // end namespace llvm
190226584Sdim
191226584Sdim#endif
192