1f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//===- TGParser.h - Parser for TableGen Files -------------------*- C++ -*-===//
2f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//
3f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//                     The LLVM Compiler Infrastructure
4f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//
53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source
63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details.
7f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//
8f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//===----------------------------------------------------------------------===//
9f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//
10f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner// This class represents the Parser for tablegen files.
11f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//
12f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner//===----------------------------------------------------------------------===//
13f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
14f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#ifndef TGPARSER_H
15f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#define TGPARSER_H
16f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
17f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#include "TGLexer.h"
18d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer#include "llvm/ADT/Twine.h"
19099e198ae84c1a6cfe2a7c79ee9f47fa67caac8fChris Lattner#include "llvm/Support/SourceMgr.h"
20a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/TableGen/Error.h"
21a1514e24cc24b050f53a12650e047799358833a1Chandler Carruth#include "llvm/TableGen/Record.h"
22f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#include <map>
23f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
24f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnernamespace llvm {
25f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  class Record;
26f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  class RecordVal;
2767db883487fca3472fdde51e931657e22d4d0495Chris Lattner  class RecordKeeper;
2877f8274c7d4bfb5e2a449eb49dc78dcae37e5457Jakob Stoklund Olesen  class RecTy;
29afd54269ab9951c0dcdea076c4d6f48a345e9d27David Greene  class Init;
30f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  struct MultiClass;
3148fe63526e35ddaee7e98879596a569911f41319Sebastian Redl  struct SubClassReference;
32de444af6bb9a8a7bb95e2a274d8fa8697e8f4e3fDavid Greene  struct SubMultiClassReference;
33047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva
34f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  struct LetRecord {
35f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    std::string Name;
36f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    std::vector<unsigned> Bits;
3705bce0beee87512e52428d4b80f5a8e79a949576David Greene    Init *Value;
381e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner    SMLoc Loc;
3905bce0beee87512e52428d4b80f5a8e79a949576David Greene    LetRecord(const std::string &N, const std::vector<unsigned> &B, Init *V,
40d568b3f55294917d1cc701da14a8a7daeb6563e6Eric Christopher              SMLoc L)
41f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner      : Name(N), Bits(B), Value(V), Loc(L) {
42f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    }
43f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  };
44047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva
45cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  /// ForeachLoop - Record the iteration state associated with a for loop.
46cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  /// This is used to instantiate items in the loop body.
47cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  struct ForeachLoop {
488e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen    VarInit *IterVar;
498e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen    ListInit *ListValue;
50cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene
518e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen    ForeachLoop(VarInit *IVar, ListInit *LValue)
528e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen      : IterVar(IVar), ListValue(LValue) {}
53cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  };
54cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene
55f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerclass TGParser {
56f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  TGLexer Lex;
57f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::vector<std::vector<LetRecord> > LetStack;
58f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::map<std::string, MultiClass*> MultiClasses;
59047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva
60cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  /// Loops - Keep track of any foreach loops we are within.
61cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  ///
62cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  typedef std::vector<ForeachLoop> LoopVector;
63cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  LoopVector Loops;
64cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene
65047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva  /// CurMultiClass - If we are parsing a 'multiclass' definition, this is the
66f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  /// current value.
67f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  MultiClass *CurMultiClass;
6867db883487fca3472fdde51e931657e22d4d0495Chris Lattner
6967db883487fca3472fdde51e931657e22d4d0495Chris Lattner  // Record tracker
709c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner  RecordKeeper &Records;
71f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned AnonCounter;
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
74f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene  // A "named boolean" indicating how to parse identifiers.  Usually
75f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene  // identifiers map to some existing object but in special cases
76f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene  // (e.g. parsing def names) no such object exists yet because we are
77f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene  // in the middle of creating in.  For those situations, allow the
78f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene  // parser to ignore missing object errors.
79f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene  enum IDParseMode {
80cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene    ParseValueMode,   // We are parsing a value we expect to look up.
81cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene    ParseNameMode,    // We are parsing a name of an object that does not yet
82cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene                      // exist.
83cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene    ParseForeachMode  // We are parsing a foreach init.
84f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene  };
85f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene
86f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerpublic:
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  TGParser(SourceMgr &SrcMgr, RecordKeeper &records)
88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      : Lex(SrcMgr), CurMultiClass(nullptr), Records(records), AnonCounter(0) {}
89047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva
90f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  /// ParseFile - Main entrypoint for parsing a tblgen file.  These parser
91f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  /// routines return true on error, or false on success.
92f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseFile();
93047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva
94d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer  bool Error(SMLoc L, const Twine &Msg) const {
950b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach    PrintError(L, Msg);
96f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return true;
97f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
98d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer  bool TokError(const Twine &Msg) const {
99f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return Error(Lex.getLoc(), Msg);
100f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
101a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva  const TGLexer::DependenciesMapTy &getDependencies() const {
102dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger    return Lex.getDependencies();
103dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger  }
104cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene
105f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerprivate:  // Semantic analysis methods.
1061e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner  bool AddValue(Record *TheRec, SMLoc Loc, const RecordVal &RV);
107047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva  bool SetValue(Record *TheRec, SMLoc Loc, Init *ValName,
10805bce0beee87512e52428d4b80f5a8e79a949576David Greene                const std::vector<unsigned> &BitList, Init *V);
109047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva  bool SetValue(Record *TheRec, SMLoc Loc, const std::string &ValName,
110917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene                const std::vector<unsigned> &BitList, Init *V) {
111917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene    return SetValue(TheRec, Loc, StringInit::get(ValName), BitList, V);
112917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene  }
113aff9c270de8de7d1a0bc138d391bc67136bad58eCedric Venet  bool AddSubClass(Record *Rec, SubClassReference &SubClass);
114440548dd1f78682e372a38cacccf7c5ac1781b2cBob Wilson  bool AddSubMultiClass(MultiClass *CurMC,
115440548dd1f78682e372a38cacccf7c5ac1781b2cBob Wilson                        SubMultiClassReference &SubMultiClass);
116f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  std::string GetNewAnonymousName();
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
119cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  // IterRecord: Map an iterator name to a value.
120cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  struct IterRecord {
1218e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen    VarInit *IterVar;
122cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene    Init *IterValue;
1238e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen    IterRecord(VarInit *Var, Init *Val) : IterVar(Var), IterValue(Val) {}
124cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  };
125cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene
126cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  // IterSet: The set of all iterator values at some point in the
127cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  // iteration space.
128cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  typedef std::vector<IterRecord> IterSet;
129cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene
1308e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen  bool ProcessForeachDefs(Record *CurRec, SMLoc Loc);
1318e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen  bool ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals);
132cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene
133f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerprivate:  // Parser methods.
134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool ParseObjectList(MultiClass *MC = nullptr);
135ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes  bool ParseObject(MultiClass *MC);
136f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseClass();
137f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseMultiClass();
138e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene  Record *InstantiateMulticlassDef(MultiClass &MC,
139e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene                                   Record *DefProto,
14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                                   Init *&DefmPrefix,
141b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose                                   SMRange DefmPrefixRange);
142e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene  bool ResolveMulticlassDefArgs(MultiClass &MC,
143e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene                                Record *DefProto,
144e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene                                SMLoc DefmPrefixLoc,
145e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene                                SMLoc SubClassLoc,
146e22b321d2276b634519165b101b02d92c2fcf5c7David Greene                                const std::vector<Init *> &TArgs,
147e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene                                std::vector<Init *> &TemplateVals,
148e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene                                bool DeleteArgs);
149e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene  bool ResolveMulticlassDef(MultiClass &MC,
150e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene                            Record *CurRec,
151e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene                            Record *DefProto,
152e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene                            SMLoc DefmPrefixLoc);
153ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes  bool ParseDefm(MultiClass *CurMultiClass);
154ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes  bool ParseDef(MultiClass *CurMultiClass);
155cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene  bool ParseForeach(MultiClass *CurMultiClass);
156ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes  bool ParseTopLevelLet(MultiClass *CurMultiClass);
157f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::vector<LetRecord> ParseLetList();
158f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
159f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseObjectBody(Record *CurRec);
160f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseBody(Record *CurRec);
161f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseBodyItem(Record *CurRec);
162f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
163f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseTemplateArgList(Record *CurRec);
164e22b321d2276b634519165b101b02d92c2fcf5c7David Greene  Init *ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs);
1658e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen  VarInit *ParseForeachDeclaration(ListInit *&ForeachListValue);
166f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
167f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm);
168440548dd1f78682e372a38cacccf7c5ac1781b2cBob Wilson  SubMultiClassReference ParseSubMultiClassReference(MultiClass *CurMC);
169f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
170f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene  Init *ParseIDValue(Record *CurRec, const std::string &Name, SMLoc NameLoc,
171f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene                     IDParseMode Mode = ParseValueMode);
172dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Init *ParseSimpleValue(Record *CurRec, RecTy *ItemType = nullptr,
173f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene                         IDParseMode Mode = ParseValueMode);
174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Init *ParseValue(Record *CurRec, RecTy *ItemType = nullptr,
175f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene                   IDParseMode Mode = ParseValueMode);
176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  std::vector<Init*> ParseValueList(Record *CurRec, Record *ArgsRec = nullptr,
177dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    RecTy *EltTy = nullptr);
17805bce0beee87512e52428d4b80f5a8e79a949576David Greene  std::vector<std::pair<llvm::Init*, std::string> > ParseDagArgList(Record *);
179f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseOptionalRangeList(std::vector<unsigned> &Ranges);
180f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseOptionalBitList(std::vector<unsigned> &Ranges);
181f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::vector<unsigned> ParseRangeList();
182f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  bool ParseRangePiece(std::vector<unsigned> &Ranges);
183f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  RecTy *ParseType();
184cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  Init *ParseOperation(Record *CurRec, RecTy *ItemType);
185d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene  RecTy *ParseOperatorType();
186a9e07dd66dcd951900f9e360fafc1ea30edcc9cdDavid Greene  Init *ParseObjectName(MultiClass *CurMultiClass);
187f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  Record *ParseClassID();
188de444af6bb9a8a7bb95e2a274d8fa8697e8f4e3fDavid Greene  MultiClass *ParseMultiClassID();
1899cceede447118852df76e340252387d1a2cce37dSean Silva  bool ApplyLetStack(Record *CurRec);
190f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner};
191047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva
192f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner} // end namespace llvm
193f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
194f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#endif
195