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 72f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene // A "named boolean" indicating how to parse identifiers. Usually 73f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene // identifiers map to some existing object but in special cases 74f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene // (e.g. parsing def names) no such object exists yet because we are 75f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene // in the middle of creating in. For those situations, allow the 76f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene // parser to ignore missing object errors. 77f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene enum IDParseMode { 78cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene ParseValueMode, // We are parsing a value we expect to look up. 79cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene ParseNameMode, // We are parsing a name of an object that does not yet 80cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene // exist. 81cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene ParseForeachMode // We are parsing a foreach init. 82f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene }; 83f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene 84f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerpublic: 85047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva TGParser(SourceMgr &SrcMgr, RecordKeeper &records) : 8667db883487fca3472fdde51e931657e22d4d0495Chris Lattner Lex(SrcMgr), CurMultiClass(0), Records(records) {} 87047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva 88f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// ParseFile - Main entrypoint for parsing a tblgen file. These parser 89f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// routines return true on error, or false on success. 90f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseFile(); 91047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva 92d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer bool Error(SMLoc L, const Twine &Msg) const { 930b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach PrintError(L, Msg); 94f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return true; 95f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 96d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer bool TokError(const Twine &Msg) const { 97f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return Error(Lex.getLoc(), Msg); 98f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 99a170f520a990a50c35f72d81b4415dc4c3ec50deSean Silva const TGLexer::DependenciesMapTy &getDependencies() const { 100dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger return Lex.getDependencies(); 101dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger } 102cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 103f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerprivate: // Semantic analysis methods. 1041e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner bool AddValue(Record *TheRec, SMLoc Loc, const RecordVal &RV); 105047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva bool SetValue(Record *TheRec, SMLoc Loc, Init *ValName, 10605bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::vector<unsigned> &BitList, Init *V); 107047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva bool SetValue(Record *TheRec, SMLoc Loc, const std::string &ValName, 108917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene const std::vector<unsigned> &BitList, Init *V) { 109917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene return SetValue(TheRec, Loc, StringInit::get(ValName), BitList, V); 110917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene } 111aff9c270de8de7d1a0bc138d391bc67136bad58eCedric Venet bool AddSubClass(Record *Rec, SubClassReference &SubClass); 112440548dd1f78682e372a38cacccf7c5ac1781b2cBob Wilson bool AddSubMultiClass(MultiClass *CurMC, 113440548dd1f78682e372a38cacccf7c5ac1781b2cBob Wilson SubMultiClassReference &SubMultiClass); 114f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 115cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene // IterRecord: Map an iterator name to a value. 116cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene struct IterRecord { 1178e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen VarInit *IterVar; 118cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene Init *IterValue; 1198e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen IterRecord(VarInit *Var, Init *Val) : IterVar(Var), IterValue(Val) {} 120cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene }; 121cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 122cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene // IterSet: The set of all iterator values at some point in the 123cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene // iteration space. 124cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene typedef std::vector<IterRecord> IterSet; 125cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 1268e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen bool ProcessForeachDefs(Record *CurRec, SMLoc Loc); 1278e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen bool ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals); 128cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 129f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerprivate: // Parser methods. 130ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes bool ParseObjectList(MultiClass *MC = 0); 131ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes bool ParseObject(MultiClass *MC); 132f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseClass(); 133f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseMultiClass(); 134e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene Record *InstantiateMulticlassDef(MultiClass &MC, 135e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene Record *DefProto, 1367be867e48300861b7b1bf614eb204463533d6724David Greene Init *DefmPrefix, 137b50df4a3df6db2ace3c011267934d3d10bdcc8dbJordan Rose SMRange DefmPrefixRange); 138e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene bool ResolveMulticlassDefArgs(MultiClass &MC, 139e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene Record *DefProto, 140e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene SMLoc DefmPrefixLoc, 141e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene SMLoc SubClassLoc, 142e22b321d2276b634519165b101b02d92c2fcf5c7David Greene const std::vector<Init *> &TArgs, 143e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene std::vector<Init *> &TemplateVals, 144e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene bool DeleteArgs); 145e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene bool ResolveMulticlassDef(MultiClass &MC, 146e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene Record *CurRec, 147e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene Record *DefProto, 148e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene SMLoc DefmPrefixLoc); 149ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes bool ParseDefm(MultiClass *CurMultiClass); 150ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes bool ParseDef(MultiClass *CurMultiClass); 151cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene bool ParseForeach(MultiClass *CurMultiClass); 152ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes bool ParseTopLevelLet(MultiClass *CurMultiClass); 153f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<LetRecord> ParseLetList(); 154f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 155f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseObjectBody(Record *CurRec); 156f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseBody(Record *CurRec); 157f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseBodyItem(Record *CurRec); 158f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 159f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseTemplateArgList(Record *CurRec); 160e22b321d2276b634519165b101b02d92c2fcf5c7David Greene Init *ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs); 1618e5286e18ffbe4716ef92cd1de8901942d685e1bJakob Stoklund Olesen VarInit *ParseForeachDeclaration(ListInit *&ForeachListValue); 162f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 163f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm); 164440548dd1f78682e372a38cacccf7c5ac1781b2cBob Wilson SubMultiClassReference ParseSubMultiClassReference(MultiClass *CurMC); 165f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 166f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene Init *ParseIDValue(Record *CurRec, IDParseMode Mode = ParseValueMode); 167f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene Init *ParseIDValue(Record *CurRec, const std::string &Name, SMLoc NameLoc, 168f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene IDParseMode Mode = ParseValueMode); 169f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene Init *ParseSimpleValue(Record *CurRec, RecTy *ItemType = 0, 170f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene IDParseMode Mode = ParseValueMode); 171f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene Init *ParseValue(Record *CurRec, RecTy *ItemType = 0, 172f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene IDParseMode Mode = ParseValueMode); 173047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva std::vector<Init*> ParseValueList(Record *CurRec, Record *ArgsRec = 0, 174047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva RecTy *EltTy = 0); 17505bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<std::pair<llvm::Init*, std::string> > ParseDagArgList(Record *); 176f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseOptionalRangeList(std::vector<unsigned> &Ranges); 177f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseOptionalBitList(std::vector<unsigned> &Ranges); 178f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<unsigned> ParseRangeList(); 179f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseRangePiece(std::vector<unsigned> &Ranges); 180f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner RecTy *ParseType(); 18105bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *ParseOperation(Record *CurRec); 182d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene RecTy *ParseOperatorType(); 183a9e07dd66dcd951900f9e360fafc1ea30edcc9cdDavid Greene Init *ParseObjectName(MultiClass *CurMultiClass); 184f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Record *ParseClassID(); 185de444af6bb9a8a7bb95e2a274d8fa8697e8f4e3fDavid Greene MultiClass *ParseMultiClassID(); 1869cceede447118852df76e340252387d1a2cce37dSean Silva bool ApplyLetStack(Record *CurRec); 187f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner}; 188047d3617cb9cfba07b6c982e9597b937c7d7115aSean Silva 189f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner} // end namespace llvm 190f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 191f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#endif 192