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