Mercurial > hg > CbC > CbC_llvm
comparison lib/TableGen/TGParser.h @ 148:63bd29f05246
merged
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Aug 2019 19:46:37 +0900 |
parents | c2174574ed3a |
children |
comparison
equal
deleted
inserted
replaced
146:3fc4d5c3e21e | 148:63bd29f05246 |
---|---|
1 //===- TGParser.h - Parser for TableGen Files -------------------*- C++ -*-===// | 1 //===- TGParser.h - Parser for TableGen Files -------------------*- C++ -*-===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 // | 4 // See https://llvm.org/LICENSE.txt for license information. |
5 // This file is distributed under the University of Illinois Open Source | 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 // License. See LICENSE.TXT for details. | |
7 // | 6 // |
8 //===----------------------------------------------------------------------===// | 7 //===----------------------------------------------------------------------===// |
9 // | 8 // |
10 // This class represents the Parser for tablegen files. | 9 // This class represents the Parser for tablegen files. |
11 // | 10 // |
25 class Record; | 24 class Record; |
26 class RecordVal; | 25 class RecordVal; |
27 class RecordKeeper; | 26 class RecordKeeper; |
28 class RecTy; | 27 class RecTy; |
29 class Init; | 28 class Init; |
29 struct ForeachLoop; | |
30 struct MultiClass; | 30 struct MultiClass; |
31 struct SubClassReference; | 31 struct SubClassReference; |
32 struct SubMultiClassReference; | 32 struct SubMultiClassReference; |
33 | 33 |
34 struct LetRecord { | 34 struct LetRecord { |
39 LetRecord(StringInit *N, ArrayRef<unsigned> B, Init *V, SMLoc L) | 39 LetRecord(StringInit *N, ArrayRef<unsigned> B, Init *V, SMLoc L) |
40 : Name(N), Bits(B), Value(V), Loc(L) { | 40 : Name(N), Bits(B), Value(V), Loc(L) { |
41 } | 41 } |
42 }; | 42 }; |
43 | 43 |
44 /// RecordsEntry - Can be either a record or a foreach loop. | |
45 struct RecordsEntry { | |
46 std::unique_ptr<Record> Rec; | |
47 std::unique_ptr<ForeachLoop> Loop; | |
48 | |
49 void dump() const; | |
50 | |
51 RecordsEntry() {} | |
52 RecordsEntry(std::unique_ptr<Record> Rec) : Rec(std::move(Rec)) {} | |
53 RecordsEntry(std::unique_ptr<ForeachLoop> Loop) | |
54 : Loop(std::move(Loop)) {} | |
55 }; | |
56 | |
44 /// ForeachLoop - Record the iteration state associated with a for loop. | 57 /// ForeachLoop - Record the iteration state associated with a for loop. |
45 /// This is used to instantiate items in the loop body. | 58 /// This is used to instantiate items in the loop body. |
46 struct ForeachLoop { | 59 struct ForeachLoop { |
60 SMLoc Loc; | |
47 VarInit *IterVar; | 61 VarInit *IterVar; |
48 ListInit *ListValue; | 62 Init *ListValue; |
49 | 63 std::vector<RecordsEntry> Entries; |
50 ForeachLoop(VarInit *IVar, ListInit *LValue) | 64 |
51 : IterVar(IVar), ListValue(LValue) {} | 65 void dump() const; |
52 }; | 66 |
67 ForeachLoop(SMLoc Loc, VarInit *IVar, Init *LValue) | |
68 : Loc(Loc), IterVar(IVar), ListValue(LValue) {} | |
69 }; | |
70 | |
71 struct DefsetRecord { | |
72 SMLoc Loc; | |
73 RecTy *EltTy; | |
74 SmallVector<Init *, 16> Elements; | |
75 }; | |
76 | |
77 struct MultiClass { | |
78 Record Rec; // Placeholder for template args and Name. | |
79 std::vector<RecordsEntry> Entries; | |
80 | |
81 void dump() const; | |
82 | |
83 MultiClass(StringRef Name, SMLoc Loc, RecordKeeper &Records) : | |
84 Rec(Name, Loc, Records) {} | |
85 }; | |
53 | 86 |
54 class TGParser { | 87 class TGParser { |
55 TGLexer Lex; | 88 TGLexer Lex; |
56 std::vector<SmallVector<LetRecord, 4>> LetStack; | 89 std::vector<SmallVector<LetRecord, 4>> LetStack; |
57 std::map<std::string, std::unique_ptr<MultiClass>> MultiClasses; | 90 std::map<std::string, std::unique_ptr<MultiClass>> MultiClasses; |
58 | 91 |
59 /// Loops - Keep track of any foreach loops we are within. | 92 /// Loops - Keep track of any foreach loops we are within. |
60 /// | 93 /// |
61 typedef std::vector<ForeachLoop> LoopVector; | 94 std::vector<std::unique_ptr<ForeachLoop>> Loops; |
62 LoopVector Loops; | 95 |
96 SmallVector<DefsetRecord *, 2> Defsets; | |
63 | 97 |
64 /// CurMultiClass - If we are parsing a 'multiclass' definition, this is the | 98 /// CurMultiClass - If we are parsing a 'multiclass' definition, this is the |
65 /// current value. | 99 /// current value. |
66 MultiClass *CurMultiClass; | 100 MultiClass *CurMultiClass; |
67 | 101 |
68 // Record tracker | 102 // Record tracker |
69 RecordKeeper &Records; | 103 RecordKeeper &Records; |
70 | |
71 unsigned AnonCounter; | |
72 | 104 |
73 // A "named boolean" indicating how to parse identifiers. Usually | 105 // A "named boolean" indicating how to parse identifiers. Usually |
74 // identifiers map to some existing object but in special cases | 106 // identifiers map to some existing object but in special cases |
75 // (e.g. parsing def names) no such object exists yet because we are | 107 // (e.g. parsing def names) no such object exists yet because we are |
76 // in the middle of creating in. For those situations, allow the | 108 // in the middle of creating in. For those situations, allow the |
77 // parser to ignore missing object errors. | 109 // parser to ignore missing object errors. |
78 enum IDParseMode { | 110 enum IDParseMode { |
79 ParseValueMode, // We are parsing a value we expect to look up. | 111 ParseValueMode, // We are parsing a value we expect to look up. |
80 ParseNameMode, // We are parsing a name of an object that does not yet | 112 ParseNameMode, // We are parsing a name of an object that does not yet |
81 // exist. | 113 // exist. |
82 ParseForeachMode // We are parsing a foreach init. | |
83 }; | 114 }; |
84 | 115 |
85 public: | 116 public: |
86 TGParser(SourceMgr &SrcMgr, RecordKeeper &records) | 117 TGParser(SourceMgr &SrcMgr, ArrayRef<std::string> Macros, |
87 : Lex(SrcMgr), CurMultiClass(nullptr), Records(records), AnonCounter(0) {} | 118 RecordKeeper &records) |
119 : Lex(SrcMgr, Macros), CurMultiClass(nullptr), Records(records) {} | |
88 | 120 |
89 /// ParseFile - Main entrypoint for parsing a tblgen file. These parser | 121 /// ParseFile - Main entrypoint for parsing a tblgen file. These parser |
90 /// routines return true on error, or false on success. | 122 /// routines return true on error, or false on success. |
91 bool ParseFile(); | 123 bool ParseFile(); |
92 | 124 |
105 bool AddValue(Record *TheRec, SMLoc Loc, const RecordVal &RV); | 137 bool AddValue(Record *TheRec, SMLoc Loc, const RecordVal &RV); |
106 bool SetValue(Record *TheRec, SMLoc Loc, Init *ValName, | 138 bool SetValue(Record *TheRec, SMLoc Loc, Init *ValName, |
107 ArrayRef<unsigned> BitList, Init *V, | 139 ArrayRef<unsigned> BitList, Init *V, |
108 bool AllowSelfAssignment = false); | 140 bool AllowSelfAssignment = false); |
109 bool AddSubClass(Record *Rec, SubClassReference &SubClass); | 141 bool AddSubClass(Record *Rec, SubClassReference &SubClass); |
142 bool AddSubClass(RecordsEntry &Entry, SubClassReference &SubClass); | |
110 bool AddSubMultiClass(MultiClass *CurMC, | 143 bool AddSubMultiClass(MultiClass *CurMC, |
111 SubMultiClassReference &SubMultiClass); | 144 SubMultiClassReference &SubMultiClass); |
112 | 145 |
113 Init *GetNewAnonymousName(); | 146 using SubstStack = SmallVector<std::pair<Init *, Init *>, 8>; |
114 | 147 |
115 // IterRecord: Map an iterator name to a value. | 148 bool addEntry(RecordsEntry E); |
116 struct IterRecord { | 149 bool resolve(const ForeachLoop &Loop, SubstStack &Stack, bool Final, |
117 VarInit *IterVar; | 150 std::vector<RecordsEntry> *Dest, SMLoc *Loc = nullptr); |
118 Init *IterValue; | 151 bool resolve(const std::vector<RecordsEntry> &Source, SubstStack &Substs, |
119 IterRecord(VarInit *Var, Init *Val) : IterVar(Var), IterValue(Val) {} | 152 bool Final, std::vector<RecordsEntry> *Dest, |
120 }; | 153 SMLoc *Loc = nullptr); |
121 | 154 bool addDefOne(std::unique_ptr<Record> Rec); |
122 // IterSet: The set of all iterator values at some point in the | |
123 // iteration space. | |
124 typedef std::vector<IterRecord> IterSet; | |
125 | |
126 bool ProcessForeachDefs(Record *CurRec, SMLoc Loc); | |
127 bool ProcessForeachDefs(Record *CurRec, SMLoc Loc, IterSet &IterVals); | |
128 | 155 |
129 private: // Parser methods. | 156 private: // Parser methods. |
130 bool ParseObjectList(MultiClass *MC = nullptr); | 157 bool ParseObjectList(MultiClass *MC = nullptr); |
131 bool ParseObject(MultiClass *MC); | 158 bool ParseObject(MultiClass *MC); |
132 bool ParseClass(); | 159 bool ParseClass(); |
133 bool ParseMultiClass(); | 160 bool ParseMultiClass(); |
134 Record *InstantiateMulticlassDef(MultiClass &MC, Record *DefProto, | |
135 Init *&DefmPrefix, SMRange DefmPrefixRange, | |
136 ArrayRef<Init *> TArgs, | |
137 ArrayRef<Init *> TemplateVals); | |
138 bool ResolveMulticlassDefArgs(MultiClass &MC, Record *DefProto, | |
139 SMLoc DefmPrefixLoc, SMLoc SubClassLoc, | |
140 ArrayRef<Init *> TArgs, | |
141 ArrayRef<Init *> TemplateVals, bool DeleteArgs); | |
142 bool ResolveMulticlassDef(MultiClass &MC, | |
143 Record *CurRec, | |
144 Record *DefProto, | |
145 SMLoc DefmPrefixLoc); | |
146 bool ParseDefm(MultiClass *CurMultiClass); | 161 bool ParseDefm(MultiClass *CurMultiClass); |
147 bool ParseDef(MultiClass *CurMultiClass); | 162 bool ParseDef(MultiClass *CurMultiClass); |
163 bool ParseDefset(); | |
148 bool ParseForeach(MultiClass *CurMultiClass); | 164 bool ParseForeach(MultiClass *CurMultiClass); |
149 bool ParseTopLevelLet(MultiClass *CurMultiClass); | 165 bool ParseTopLevelLet(MultiClass *CurMultiClass); |
150 void ParseLetList(SmallVectorImpl<LetRecord> &Result); | 166 void ParseLetList(SmallVectorImpl<LetRecord> &Result); |
151 | 167 |
152 bool ParseObjectBody(Record *CurRec); | 168 bool ParseObjectBody(Record *CurRec); |
153 bool ParseBody(Record *CurRec); | 169 bool ParseBody(Record *CurRec); |
154 bool ParseBodyItem(Record *CurRec); | 170 bool ParseBodyItem(Record *CurRec); |
155 | 171 |
156 bool ParseTemplateArgList(Record *CurRec); | 172 bool ParseTemplateArgList(Record *CurRec); |
157 Init *ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs); | 173 Init *ParseDeclaration(Record *CurRec, bool ParsingTemplateArgs); |
158 VarInit *ParseForeachDeclaration(ListInit *&ForeachListValue); | 174 VarInit *ParseForeachDeclaration(Init *&ForeachListValue); |
159 | 175 |
160 SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm); | 176 SubClassReference ParseSubClassReference(Record *CurRec, bool isDefm); |
161 SubMultiClassReference ParseSubMultiClassReference(MultiClass *CurMC); | 177 SubMultiClassReference ParseSubMultiClassReference(MultiClass *CurMC); |
162 | 178 |
163 Init *ParseIDValue(Record *CurRec, StringInit *Name, SMLoc NameLoc, | 179 Init *ParseIDValue(Record *CurRec, StringInit *Name, SMLoc NameLoc, |
172 SmallVectorImpl<std::pair<llvm::Init*, StringInit*>> &Result, | 188 SmallVectorImpl<std::pair<llvm::Init*, StringInit*>> &Result, |
173 Record *CurRec); | 189 Record *CurRec); |
174 bool ParseOptionalRangeList(SmallVectorImpl<unsigned> &Ranges); | 190 bool ParseOptionalRangeList(SmallVectorImpl<unsigned> &Ranges); |
175 bool ParseOptionalBitList(SmallVectorImpl<unsigned> &Ranges); | 191 bool ParseOptionalBitList(SmallVectorImpl<unsigned> &Ranges); |
176 void ParseRangeList(SmallVectorImpl<unsigned> &Result); | 192 void ParseRangeList(SmallVectorImpl<unsigned> &Result); |
177 bool ParseRangePiece(SmallVectorImpl<unsigned> &Ranges); | 193 bool ParseRangePiece(SmallVectorImpl<unsigned> &Ranges, |
194 TypedInit *FirstItem = nullptr); | |
178 RecTy *ParseType(); | 195 RecTy *ParseType(); |
179 Init *ParseOperation(Record *CurRec, RecTy *ItemType); | 196 Init *ParseOperation(Record *CurRec, RecTy *ItemType); |
197 Init *ParseOperationCond(Record *CurRec, RecTy *ItemType); | |
180 RecTy *ParseOperatorType(); | 198 RecTy *ParseOperatorType(); |
181 Init *ParseObjectName(MultiClass *CurMultiClass); | 199 Init *ParseObjectName(MultiClass *CurMultiClass); |
182 Record *ParseClassID(); | 200 Record *ParseClassID(); |
183 MultiClass *ParseMultiClassID(); | 201 MultiClass *ParseMultiClassID(); |
184 bool ApplyLetStack(Record *CurRec); | 202 bool ApplyLetStack(Record *CurRec); |
203 bool ApplyLetStack(RecordsEntry &Entry); | |
185 }; | 204 }; |
186 | 205 |
187 } // end namespace llvm | 206 } // end namespace llvm |
188 | 207 |
189 #endif | 208 #endif |