TGParser.h revision aff9c270de8de7d1a0bc138d391bc67136bad58e
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" 18f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#include <map> 19f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 20f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnernamespace llvm { 21f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner class Record; 22f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner class RecordVal; 2341b2340b74fa27344c79b0cbd2d8b2ad2b7d2b62Chris Lattner struct RecTy; 2441b2340b74fa27344c79b0cbd2d8b2ad2b7d2b62Chris Lattner struct Init; 25f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner struct MultiClass; 26aff9c270de8de7d1a0bc138d391bc67136bad58eCedric Venet class SubClassReference; 27f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 28f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner struct LetRecord { 29f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::string Name; 30f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<unsigned> Bits; 31f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Init *Value; 32f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner TGLexer::LocTy Loc; 33f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner LetRecord(const std::string &N, const std::vector<unsigned> &B, Init *V, 34f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner TGLexer::LocTy L) 35f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner : Name(N), Bits(B), Value(V), Loc(L) { 36f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 37f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner }; 38f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 39f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerclass TGParser { 40f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner TGLexer Lex; 41f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<std::vector<LetRecord> > LetStack; 42f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::map<std::string, MultiClass*> MultiClasses; 43f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 44f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// CurMultiClass - If we are parsing a 'multiclass' definition, this is the 45f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// current value. 46f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner MultiClass *CurMultiClass; 47f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerpublic: 48f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner typedef TGLexer::LocTy LocTy; 49f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 50f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner TGParser(MemoryBuffer *StartBuf) : Lex(StartBuf), CurMultiClass(0) {} 51f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 52f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner void setIncludeDirs(const std::vector<std::string> &D){Lex.setIncludeDirs(D);} 53f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 54f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// ParseFile - Main entrypoint for parsing a tblgen file. These parser 55f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner /// routines return true on error, or false on success. 56f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseFile(); 57f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 58f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool Error(LocTy L, const std::string &Msg) const { 59f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Lex.PrintError(L, Msg); 60f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return true; 61f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 62f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool TokError(const std::string &Msg) const { 63f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner return Error(Lex.getLoc(), Msg); 64f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner } 65f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerprivate: // Semantic analysis methods. 66f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool AddValue(Record *TheRec, LocTy Loc, const RecordVal &RV); 67f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool SetValue(Record *TheRec, LocTy Loc, const std::string &ValName, 68f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner const std::vector<unsigned> &BitList, Init *V); 69aff9c270de8de7d1a0bc138d391bc67136bad58eCedric Venet bool AddSubClass(Record *Rec, SubClassReference &SubClass); 70f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 71f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattnerprivate: // Parser methods. 72f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseObjectList(); 73f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseObject(); 74f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseClass(); 75f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseMultiClass(); 76f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseMultiClassDef(MultiClass *CurMC); 77f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseDefm(); 78f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseTopLevelLet(); 79f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<LetRecord> ParseLetList(); 80f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 81f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Record *ParseDef(MultiClass *CurMultiClass); 82f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseObjectBody(Record *CurRec); 83f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseBody(Record *CurRec); 84f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseBodyItem(Record *CurRec); 85f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 86f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseTemplateArgList(Record *CurRec); 87f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::string ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs); 88f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 89f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm); 90f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 91f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Init *ParseIDValue(Record *CurRec); 92f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Init *ParseIDValue(Record *CurRec, const std::string &Name, LocTy NameLoc); 93f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Init *ParseSimpleValue(Record *CurRec); 94f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Init *ParseValue(Record *CurRec); 95f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<Init*> ParseValueList(Record *CurRec); 96f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<std::pair<llvm::Init*, std::string> > ParseDagArgList(Record *); 97f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseOptionalRangeList(std::vector<unsigned> &Ranges); 98f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseOptionalBitList(std::vector<unsigned> &Ranges); 99f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::vector<unsigned> ParseRangeList(); 100f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner bool ParseRangePiece(std::vector<unsigned> &Ranges); 101f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner RecTy *ParseType(); 102f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner std::string ParseObjectName(); 103f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Record *ParseClassID(); 104f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner Record *ParseDefmID(); 105f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner}; 106f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 107f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner} // end namespace llvm 108f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner 109f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#endif 110