1226584Sdim//===- TGParser.h - Parser for TableGen Files -------------------*- C++ -*-===// 2226584Sdim// 3226584Sdim// The LLVM Compiler Infrastructure 4226584Sdim// 5226584Sdim// This file is distributed under the University of Illinois Open Source 6226584Sdim// License. See LICENSE.TXT for details. 7226584Sdim// 8226584Sdim//===----------------------------------------------------------------------===// 9226584Sdim// 10226584Sdim// This class represents the Parser for tablegen files. 11226584Sdim// 12226584Sdim//===----------------------------------------------------------------------===// 13226584Sdim 14226584Sdim#ifndef TGPARSER_H 15226584Sdim#define TGPARSER_H 16226584Sdim 17226584Sdim#include "TGLexer.h" 18226584Sdim#include "llvm/ADT/Twine.h" 19226584Sdim#include "llvm/Support/SourceMgr.h" 20249423Sdim#include "llvm/TableGen/Error.h" 21249423Sdim#include "llvm/TableGen/Record.h" 22226584Sdim#include <map> 23226584Sdim 24226584Sdimnamespace llvm { 25226584Sdim class Record; 26226584Sdim class RecordVal; 27226584Sdim class RecordKeeper; 28226584Sdim class RecTy; 29226584Sdim class Init; 30226584Sdim struct MultiClass; 31226584Sdim struct SubClassReference; 32226584Sdim struct SubMultiClassReference; 33243830Sdim 34226584Sdim struct LetRecord { 35226584Sdim std::string Name; 36226584Sdim std::vector<unsigned> Bits; 37226584Sdim Init *Value; 38226584Sdim SMLoc Loc; 39226584Sdim LetRecord(const std::string &N, const std::vector<unsigned> &B, Init *V, 40226584Sdim SMLoc L) 41226584Sdim : Name(N), Bits(B), Value(V), Loc(L) { 42226584Sdim } 43226584Sdim }; 44243830Sdim 45234353Sdim /// ForeachLoop - Record the iteration state associated with a for loop. 46234353Sdim /// This is used to instantiate items in the loop body. 47234353Sdim struct ForeachLoop { 48239462Sdim VarInit *IterVar; 49239462Sdim ListInit *ListValue; 50234353Sdim 51239462Sdim ForeachLoop(VarInit *IVar, ListInit *LValue) 52239462Sdim : IterVar(IVar), ListValue(LValue) {} 53234353Sdim }; 54234353Sdim 55226584Sdimclass TGParser { 56226584Sdim TGLexer Lex; 57226584Sdim std::vector<std::vector<LetRecord> > LetStack; 58226584Sdim std::map<std::string, MultiClass*> MultiClasses; 59243830Sdim 60234353Sdim /// Loops - Keep track of any foreach loops we are within. 61234353Sdim /// 62234353Sdim typedef std::vector<ForeachLoop> LoopVector; 63234353Sdim LoopVector Loops; 64234353Sdim 65243830Sdim /// CurMultiClass - If we are parsing a 'multiclass' definition, this is the 66226584Sdim /// current value. 67226584Sdim MultiClass *CurMultiClass; 68226584Sdim 69226584Sdim // Record tracker 70226584Sdim RecordKeeper &Records; 71234353Sdim 72234353Sdim // A "named boolean" indicating how to parse identifiers. Usually 73234353Sdim // identifiers map to some existing object but in special cases 74234353Sdim // (e.g. parsing def names) no such object exists yet because we are 75234353Sdim // in the middle of creating in. For those situations, allow the 76234353Sdim // parser to ignore missing object errors. 77234353Sdim enum IDParseMode { 78234353Sdim ParseValueMode, // We are parsing a value we expect to look up. 79234353Sdim ParseNameMode, // We are parsing a name of an object that does not yet 80234353Sdim // exist. 81234353Sdim ParseForeachMode // We are parsing a foreach init. 82234353Sdim }; 83234353Sdim 84226584Sdimpublic: 85243830Sdim TGParser(SourceMgr &SrcMgr, RecordKeeper &records) : 86226584Sdim Lex(SrcMgr), CurMultiClass(0), Records(records) {} 87243830Sdim 88226584Sdim /// ParseFile - Main entrypoint for parsing a tblgen file. These parser 89226584Sdim /// routines return true on error, or false on success. 90226584Sdim bool ParseFile(); 91243830Sdim 92226584Sdim bool Error(SMLoc L, const Twine &Msg) const { 93226584Sdim PrintError(L, Msg); 94226584Sdim return true; 95226584Sdim } 96226584Sdim bool TokError(const Twine &Msg) const { 97226584Sdim return Error(Lex.getLoc(), Msg); 98226584Sdim } 99249423Sdim const TGLexer::DependenciesMapTy &getDependencies() const { 100226584Sdim return Lex.getDependencies(); 101226584Sdim } 102234353Sdim 103226584Sdimprivate: // Semantic analysis methods. 104226584Sdim bool AddValue(Record *TheRec, SMLoc Loc, const RecordVal &RV); 105243830Sdim bool SetValue(Record *TheRec, SMLoc Loc, Init *ValName, 106234353Sdim const std::vector<unsigned> &BitList, Init *V); 107243830Sdim bool SetValue(Record *TheRec, SMLoc Loc, const std::string &ValName, 108234353Sdim const std::vector<unsigned> &BitList, Init *V) { 109234353Sdim return SetValue(TheRec, Loc, StringInit::get(ValName), BitList, V); 110234353Sdim } 111226584Sdim bool AddSubClass(Record *Rec, SubClassReference &SubClass); 112226584Sdim bool AddSubMultiClass(MultiClass *CurMC, 113226584Sdim SubMultiClassReference &SubMultiClass); 114226584Sdim 115234353Sdim // IterRecord: Map an iterator name to a value. 116234353Sdim struct IterRecord { 117239462Sdim VarInit *IterVar; 118234353Sdim Init *IterValue; 119239462Sdim IterRecord(VarInit *Var, Init *Val) : IterVar(Var), IterValue(Val) {} 120234353Sdim }; 121234353Sdim 122234353Sdim // IterSet: The set of all iterator values at some point in the 123234353Sdim // iteration space. 124234353Sdim typedef std::vector<IterRecord> IterSet; 125234353Sdim 126239462Sdim bool ProcessForeachDefs(Record *CurRec, SMLoc Loc); 127239462Sdim bool ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals); 128234353Sdim 129226584Sdimprivate: // Parser methods. 130226584Sdim bool ParseObjectList(MultiClass *MC = 0); 131226584Sdim bool ParseObject(MultiClass *MC); 132226584Sdim bool ParseClass(); 133226584Sdim bool ParseMultiClass(); 134226584Sdim Record *InstantiateMulticlassDef(MultiClass &MC, 135226584Sdim Record *DefProto, 136234353Sdim Init *DefmPrefix, 137249423Sdim SMRange DefmPrefixRange); 138226584Sdim bool ResolveMulticlassDefArgs(MultiClass &MC, 139226584Sdim Record *DefProto, 140226584Sdim SMLoc DefmPrefixLoc, 141226584Sdim SMLoc SubClassLoc, 142234353Sdim const std::vector<Init *> &TArgs, 143226584Sdim std::vector<Init *> &TemplateVals, 144226584Sdim bool DeleteArgs); 145226584Sdim bool ResolveMulticlassDef(MultiClass &MC, 146226584Sdim Record *CurRec, 147226584Sdim Record *DefProto, 148226584Sdim SMLoc DefmPrefixLoc); 149226584Sdim bool ParseDefm(MultiClass *CurMultiClass); 150226584Sdim bool ParseDef(MultiClass *CurMultiClass); 151234353Sdim bool ParseForeach(MultiClass *CurMultiClass); 152226584Sdim bool ParseTopLevelLet(MultiClass *CurMultiClass); 153226584Sdim std::vector<LetRecord> ParseLetList(); 154226584Sdim 155226584Sdim bool ParseObjectBody(Record *CurRec); 156226584Sdim bool ParseBody(Record *CurRec); 157226584Sdim bool ParseBodyItem(Record *CurRec); 158226584Sdim 159226584Sdim bool ParseTemplateArgList(Record *CurRec); 160234353Sdim Init *ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs); 161239462Sdim VarInit *ParseForeachDeclaration(ListInit *&ForeachListValue); 162226584Sdim 163226584Sdim SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm); 164226584Sdim SubMultiClassReference ParseSubMultiClassReference(MultiClass *CurMC); 165226584Sdim 166234353Sdim Init *ParseIDValue(Record *CurRec, IDParseMode Mode = ParseValueMode); 167234353Sdim Init *ParseIDValue(Record *CurRec, const std::string &Name, SMLoc NameLoc, 168234353Sdim IDParseMode Mode = ParseValueMode); 169234353Sdim Init *ParseSimpleValue(Record *CurRec, RecTy *ItemType = 0, 170234353Sdim IDParseMode Mode = ParseValueMode); 171234353Sdim Init *ParseValue(Record *CurRec, RecTy *ItemType = 0, 172234353Sdim IDParseMode Mode = ParseValueMode); 173243830Sdim std::vector<Init*> ParseValueList(Record *CurRec, Record *ArgsRec = 0, 174243830Sdim RecTy *EltTy = 0); 175226584Sdim std::vector<std::pair<llvm::Init*, std::string> > ParseDagArgList(Record *); 176226584Sdim bool ParseOptionalRangeList(std::vector<unsigned> &Ranges); 177226584Sdim bool ParseOptionalBitList(std::vector<unsigned> &Ranges); 178226584Sdim std::vector<unsigned> ParseRangeList(); 179226584Sdim bool ParseRangePiece(std::vector<unsigned> &Ranges); 180226584Sdim RecTy *ParseType(); 181226584Sdim Init *ParseOperation(Record *CurRec); 182226584Sdim RecTy *ParseOperatorType(); 183234353Sdim Init *ParseObjectName(MultiClass *CurMultiClass); 184226584Sdim Record *ParseClassID(); 185226584Sdim MultiClass *ParseMultiClassID(); 186249423Sdim bool ApplyLetStack(Record *CurRec); 187226584Sdim}; 188243830Sdim 189226584Sdim} // end namespace llvm 190226584Sdim 191226584Sdim#endif 192