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 17917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene#include "llvm/TableGen/Record.h" 18f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#include "TGLexer.h" 197c788888872233748da10a8177a9a1eb176c1bc8Peter Collingbourne#include "llvm/TableGen/Error.h" 20d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer#include "llvm/ADT/Twine.h" 21099e198ae84c1a6cfe2a7c79ee9f47fa67caac8fChris Lattner#include "llvm/Support/SourceMgr.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; 33f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 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 }; 44f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 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 { 48cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene Init *IterVar; 49cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene Init *ListValue; 50cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 51ed1242184cabdd3357f035da9ad30ba4c08ff50aDaniel Dunbar ForeachLoop(Init *IVar, Init *LValue) : IterVar(IVar), ListValue(LValue) {} 52cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene }; 53cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 54f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerclass TGParser { 55f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner TGLexer Lex; 56f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<std::vector<LetRecord> > LetStack; 57f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::map<std::string, MultiClass*> MultiClasses; 58f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 59cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene /// Loops - Keep track of any foreach loops we are within. 60cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene /// 61cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene typedef std::vector<ForeachLoop> LoopVector; 62cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene LoopVector Loops; 63cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 64f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// CurMultiClass - If we are parsing a 'multiclass' definition, this is the 65f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// current value. 66f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner MultiClass *CurMultiClass; 6767db883487fca3472fdde51e931657e22d4d0495Chris Lattner 6867db883487fca3472fdde51e931657e22d4d0495Chris Lattner // Record tracker 699c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner RecordKeeper &Records; 70f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene 71f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene // A "named boolean" indicating how to parse identifiers. Usually 72f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene // identifiers map to some existing object but in special cases 73f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene // (e.g. parsing def names) no such object exists yet because we are 74f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene // in the middle of creating in. For those situations, allow the 75f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene // parser to ignore missing object errors. 76f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene enum IDParseMode { 77cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene ParseValueMode, // We are parsing a value we expect to look up. 78cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene ParseNameMode, // We are parsing a name of an object that does not yet 79cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene // exist. 80cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene ParseForeachMode // We are parsing a foreach init. 81f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene }; 82f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene 83f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerpublic: 849c6b60eb28d2717008f8d6ff52f7666ebc81113dChris Lattner TGParser(SourceMgr &SrcMgr, RecordKeeper &records) : 8567db883487fca3472fdde51e931657e22d4d0495Chris Lattner Lex(SrcMgr), CurMultiClass(0), Records(records) {} 86f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 87f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// ParseFile - Main entrypoint for parsing a tblgen file. These parser 88f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// routines return true on error, or false on success. 89f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseFile(); 90f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 91d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer bool Error(SMLoc L, const Twine &Msg) const { 920b6a44afb92fed0365b6709c1f46b0c5e49e1a72Jim Grosbach PrintError(L, Msg); 93f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return true; 94f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 95d1e1703c39742f3c9fc3d27a442ff59bbdbfb5aaBenjamin Kramer bool TokError(const Twine &Msg) const { 96f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return Error(Lex.getLoc(), Msg); 97f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 98dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger const std::vector<std::string> &getDependencies() const { 99dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger return Lex.getDependencies(); 100dd137903e47fdb5822724baaddae88f119badc86Joerg Sonnenberger } 101cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 102f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerprivate: // Semantic analysis methods. 1031e3a8a492471f5dc3f50452af9eb9a2dfb1aeb39Chris Lattner bool AddValue(Record *TheRec, SMLoc Loc, const RecordVal &RV); 104917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene bool SetValue(Record *TheRec, SMLoc Loc, Init *ValName, 10505bce0beee87512e52428d4b80f5a8e79a949576David Greene const std::vector<unsigned> &BitList, Init *V); 106917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene bool SetValue(Record *TheRec, SMLoc Loc, const std::string &ValName, 107917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene const std::vector<unsigned> &BitList, Init *V) { 108917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene return SetValue(TheRec, Loc, StringInit::get(ValName), BitList, V); 109917924d9912df76ba2e639c8c5b00cdcac91a16eDavid Greene } 110aff9c270de8de7d1a0bc138d391bc67136bad58eCedric Venet bool AddSubClass(Record *Rec, SubClassReference &SubClass); 111440548dd1f78682e372a38cacccf7c5ac1781b2cBob Wilson bool AddSubMultiClass(MultiClass *CurMC, 112440548dd1f78682e372a38cacccf7c5ac1781b2cBob Wilson SubMultiClassReference &SubMultiClass); 113f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 114cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene // IterRecord: Map an iterator name to a value. 115cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene struct IterRecord { 116cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene Init *IterVar; 117cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene Init *IterValue; 118cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene IterRecord(Init *Var, Init *Val) : IterVar(Var), IterValue(Val) {} 119cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene }; 120cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 121cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene // IterSet: The set of all iterator values at some point in the 122cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene // iteration space. 123cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene typedef std::vector<IterRecord> IterSet; 124cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 125cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene bool ProcessForeachDefs(Record *CurRec, MultiClass *CurMultiClass, 126cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene SMLoc Loc); 127cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene bool ProcessForeachDefs(Record *CurRec, MultiClass *CurMultiClass, 128cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene SMLoc Loc, IterSet &IterVals, ForeachLoop &CurLoop, 129cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene LoopVector::iterator NextLoop); 130cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene 131f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerprivate: // Parser methods. 132ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes bool ParseObjectList(MultiClass *MC = 0); 133ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes bool ParseObject(MultiClass *MC); 134f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseClass(); 135f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseMultiClass(); 136e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene Record *InstantiateMulticlassDef(MultiClass &MC, 137e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene Record *DefProto, 1387be867e48300861b7b1bf614eb204463533d6724David Greene Init *DefmPrefix, 139e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene SMLoc DefmPrefixLoc); 140e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene bool ResolveMulticlassDefArgs(MultiClass &MC, 141e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene Record *DefProto, 142e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene SMLoc DefmPrefixLoc, 143e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene SMLoc SubClassLoc, 144e22b321d2276b634519165b101b02d92c2fcf5c7David Greene const std::vector<Init *> &TArgs, 145e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene std::vector<Init *> &TemplateVals, 146e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene bool DeleteArgs); 147e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene bool ResolveMulticlassDef(MultiClass &MC, 148e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene Record *CurRec, 149e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene Record *DefProto, 150e499a2df4492dab21a50d74f3f687b989f910a2fDavid Greene SMLoc DefmPrefixLoc); 151ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes bool ParseDefm(MultiClass *CurMultiClass); 152ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes bool ParseDef(MultiClass *CurMultiClass); 153cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene bool ParseForeach(MultiClass *CurMultiClass); 154ee65db3add855bfbc4ddc7e45926d1b9bafca8a4Bruno Cardoso Lopes bool ParseTopLevelLet(MultiClass *CurMultiClass); 155f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<LetRecord> ParseLetList(); 156f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 157f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseObjectBody(Record *CurRec); 158f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseBody(Record *CurRec); 159f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseBodyItem(Record *CurRec); 160f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 161f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseTemplateArgList(Record *CurRec); 162e22b321d2276b634519165b101b02d92c2fcf5c7David Greene Init *ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs); 163cebb4ee93a0064e4a2cb1fd1da7455b01e5655cbDavid Greene Init *ParseForeachDeclaration(Init *&ForeachListValue); 164f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 165f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm); 166440548dd1f78682e372a38cacccf7c5ac1781b2cBob Wilson SubMultiClassReference ParseSubMultiClassReference(MultiClass *CurMC); 167f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 168f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene Init *ParseIDValue(Record *CurRec, IDParseMode Mode = ParseValueMode); 169f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene Init *ParseIDValue(Record *CurRec, const std::string &Name, SMLoc NameLoc, 170f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene IDParseMode Mode = ParseValueMode); 171f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene Init *ParseSimpleValue(Record *CurRec, RecTy *ItemType = 0, 172f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene IDParseMode Mode = ParseValueMode); 173f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene Init *ParseValue(Record *CurRec, RecTy *ItemType = 0, 174f3744a0cf9f622e0879a80c1fdcb0f6072e5a6c3David Greene IDParseMode Mode = ParseValueMode); 17505bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<Init*> ParseValueList(Record *CurRec, Record *ArgsRec = 0, RecTy *EltTy = 0); 17605bce0beee87512e52428d4b80f5a8e79a949576David Greene std::vector<std::pair<llvm::Init*, std::string> > ParseDagArgList(Record *); 177f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseOptionalRangeList(std::vector<unsigned> &Ranges); 178f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseOptionalBitList(std::vector<unsigned> &Ranges); 179f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<unsigned> ParseRangeList(); 180f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseRangePiece(std::vector<unsigned> &Ranges); 181f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner RecTy *ParseType(); 18205bce0beee87512e52428d4b80f5a8e79a949576David Greene Init *ParseOperation(Record *CurRec); 183d418c1b768b5ff26afe05a5ce84d920bbbc99583David Greene RecTy *ParseOperatorType(); 184a9e07dd66dcd951900f9e360fafc1ea30edcc9cdDavid Greene Init *ParseObjectName(MultiClass *CurMultiClass); 185f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Record *ParseClassID(); 186de444af6bb9a8a7bb95e2a274d8fa8697e8f4e3fDavid Greene MultiClass *ParseMultiClassID(); 187f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Record *ParseDefmID(); 188f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner}; 189f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 190f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner} // end namespace llvm 191f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 192f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#endif 193