1 //===- llvm/TableGen/Record.h - Classes for Table Records -------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the main TableGen data structures, including the TableGen
10 // types, values, and high-level data structures.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_TABLEGEN_RECORD_H
15 #define LLVM_TABLEGEN_RECORD_H
16 
17 #include "llvm/ADT/ArrayRef.h"
18 #include "llvm/ADT/DenseMap.h"
19 #include "llvm/ADT/DenseSet.h"
20 #include "llvm/ADT/FoldingSet.h"
21 #include "llvm/ADT/PointerIntPair.h"
22 #include "llvm/ADT/SmallVector.h"
23 #include "llvm/ADT/StringExtras.h"
24 #include "llvm/ADT/StringRef.h"
25 #include "llvm/Support/Casting.h"
26 #include "llvm/Support/ErrorHandling.h"
27 #include "llvm/Support/SMLoc.h"
28 #include "llvm/Support/Timer.h"
29 #include "llvm/Support/TrailingObjects.h"
30 #include "llvm/Support/raw_ostream.h"
31 #include <cassert>
32 #include <cstddef>
33 #include <cstdint>
34 #include <map>
35 #include <memory>
36 #include <optional>
37 #include <string>
38 #include <utility>
39 #include <vector>
40 
41 namespace llvm {
42 namespace detail {
43 struct RecordKeeperImpl;
44 } // namespace detail
45 
46 class ListRecTy;
47 class Record;
48 class RecordKeeper;
49 class RecordVal;
50 class Resolver;
51 class StringInit;
52 class TypedInit;
53 
54 //===----------------------------------------------------------------------===//
55 //  Type Classes
56 //===----------------------------------------------------------------------===//
57 
58 class RecTy {
59 public:
60   /// Subclass discriminator (for dyn_cast<> et al.)
61   enum RecTyKind {
62     BitRecTyKind,
63     BitsRecTyKind,
64     IntRecTyKind,
65     StringRecTyKind,
66     ListRecTyKind,
67     DagRecTyKind,
68     RecordRecTyKind
69   };
70 
71 private:
72   RecTyKind Kind;
73   /// The RecordKeeper that uniqued this Type.
74   RecordKeeper &RK;
75   /// ListRecTy of the list that has elements of this type.
76   ListRecTy *ListTy = nullptr;
77 
78 public:
RecTy(RecTyKind K,RecordKeeper & RK)79   RecTy(RecTyKind K, RecordKeeper &RK) : Kind(K), RK(RK) {}
80   virtual ~RecTy() = default;
81 
getRecTyKind()82   RecTyKind getRecTyKind() const { return Kind; }
83 
84   /// Return the RecordKeeper that uniqued this Type.
getRecordKeeper()85   RecordKeeper &getRecordKeeper() const { return RK; }
86 
87   virtual std::string getAsString() const = 0;
print(raw_ostream & OS)88   void print(raw_ostream &OS) const { OS << getAsString(); }
89   void dump() const;
90 
91   /// Return true if all values of 'this' type can be converted to the specified
92   /// type.
93   virtual bool typeIsConvertibleTo(const RecTy *RHS) const;
94 
95   /// Return true if 'this' type is equal to or a subtype of RHS. For example,
96   /// a bit set is not an int, but they are convertible.
97   virtual bool typeIsA(const RecTy *RHS) const;
98 
99   /// Returns the type representing list<thistype>.
100   ListRecTy *getListTy();
101 };
102 
103 inline raw_ostream &operator<<(raw_ostream &OS, const RecTy &Ty) {
104   Ty.print(OS);
105   return OS;
106 }
107 
108 /// 'bit' - Represent a single bit
109 class BitRecTy : public RecTy {
110   friend detail::RecordKeeperImpl;
111 
BitRecTy(RecordKeeper & RK)112   BitRecTy(RecordKeeper &RK) : RecTy(BitRecTyKind, RK) {}
113 
114 public:
classof(const RecTy * RT)115   static bool classof(const RecTy *RT) {
116     return RT->getRecTyKind() == BitRecTyKind;
117   }
118 
119   static BitRecTy *get(RecordKeeper &RK);
120 
getAsString()121   std::string getAsString() const override { return "bit"; }
122 
123   bool typeIsConvertibleTo(const RecTy *RHS) const override;
124 };
125 
126 /// 'bits<n>' - Represent a fixed number of bits
127 class BitsRecTy : public RecTy {
128   unsigned Size;
129 
BitsRecTy(RecordKeeper & RK,unsigned Sz)130   explicit BitsRecTy(RecordKeeper &RK, unsigned Sz)
131       : RecTy(BitsRecTyKind, RK), Size(Sz) {}
132 
133 public:
classof(const RecTy * RT)134   static bool classof(const RecTy *RT) {
135     return RT->getRecTyKind() == BitsRecTyKind;
136   }
137 
138   static BitsRecTy *get(RecordKeeper &RK, unsigned Sz);
139 
getNumBits()140   unsigned getNumBits() const { return Size; }
141 
142   std::string getAsString() const override;
143 
144   bool typeIsConvertibleTo(const RecTy *RHS) const override;
145 
146   bool typeIsA(const RecTy *RHS) const override;
147 };
148 
149 /// 'int' - Represent an integer value of no particular size
150 class IntRecTy : public RecTy {
151   friend detail::RecordKeeperImpl;
152 
IntRecTy(RecordKeeper & RK)153   IntRecTy(RecordKeeper &RK) : RecTy(IntRecTyKind, RK) {}
154 
155 public:
classof(const RecTy * RT)156   static bool classof(const RecTy *RT) {
157     return RT->getRecTyKind() == IntRecTyKind;
158   }
159 
160   static IntRecTy *get(RecordKeeper &RK);
161 
getAsString()162   std::string getAsString() const override { return "int"; }
163 
164   bool typeIsConvertibleTo(const RecTy *RHS) const override;
165 };
166 
167 /// 'string' - Represent an string value
168 class StringRecTy : public RecTy {
169   friend detail::RecordKeeperImpl;
170 
StringRecTy(RecordKeeper & RK)171   StringRecTy(RecordKeeper &RK) : RecTy(StringRecTyKind, RK) {}
172 
173 public:
classof(const RecTy * RT)174   static bool classof(const RecTy *RT) {
175     return RT->getRecTyKind() == StringRecTyKind;
176   }
177 
178   static StringRecTy *get(RecordKeeper &RK);
179 
180   std::string getAsString() const override;
181 
182   bool typeIsConvertibleTo(const RecTy *RHS) const override;
183 };
184 
185 /// 'list<Ty>' - Represent a list of element values, all of which must be of
186 /// the specified type. The type is stored in ElementTy.
187 class ListRecTy : public RecTy {
188   friend ListRecTy *RecTy::getListTy();
189 
190   RecTy *ElementTy;
191 
ListRecTy(RecTy * T)192   explicit ListRecTy(RecTy *T)
193       : RecTy(ListRecTyKind, T->getRecordKeeper()), ElementTy(T) {}
194 
195 public:
classof(const RecTy * RT)196   static bool classof(const RecTy *RT) {
197     return RT->getRecTyKind() == ListRecTyKind;
198   }
199 
get(RecTy * T)200   static ListRecTy *get(RecTy *T) { return T->getListTy(); }
getElementType()201   RecTy *getElementType() const { return ElementTy; }
202 
203   std::string getAsString() const override;
204 
205   bool typeIsConvertibleTo(const RecTy *RHS) const override;
206 
207   bool typeIsA(const RecTy *RHS) const override;
208 };
209 
210 /// 'dag' - Represent a dag fragment
211 class DagRecTy : public RecTy {
212   friend detail::RecordKeeperImpl;
213 
DagRecTy(RecordKeeper & RK)214   DagRecTy(RecordKeeper &RK) : RecTy(DagRecTyKind, RK) {}
215 
216 public:
classof(const RecTy * RT)217   static bool classof(const RecTy *RT) {
218     return RT->getRecTyKind() == DagRecTyKind;
219   }
220 
221   static DagRecTy *get(RecordKeeper &RK);
222 
223   std::string getAsString() const override;
224 };
225 
226 /// '[classname]' - Type of record values that have zero or more superclasses.
227 ///
228 /// The list of superclasses is non-redundant, i.e. only contains classes that
229 /// are not the superclass of some other listed class.
230 class RecordRecTy final : public RecTy, public FoldingSetNode,
231                           public TrailingObjects<RecordRecTy, Record *> {
232   friend class Record;
233   friend detail::RecordKeeperImpl;
234 
235   unsigned NumClasses;
236 
RecordRecTy(RecordKeeper & RK,unsigned Num)237   explicit RecordRecTy(RecordKeeper &RK, unsigned Num)
238       : RecTy(RecordRecTyKind, RK), NumClasses(Num) {}
239 
240 public:
241   RecordRecTy(const RecordRecTy &) = delete;
242   RecordRecTy &operator=(const RecordRecTy &) = delete;
243 
244   // Do not use sized deallocation due to trailing objects.
delete(void * p)245   void operator delete(void *p) { ::operator delete(p); }
246 
classof(const RecTy * RT)247   static bool classof(const RecTy *RT) {
248     return RT->getRecTyKind() == RecordRecTyKind;
249   }
250 
251   /// Get the record type with the given non-redundant list of superclasses.
252   static RecordRecTy *get(RecordKeeper &RK, ArrayRef<Record *> Classes);
253   static RecordRecTy *get(Record *Class);
254 
255   void Profile(FoldingSetNodeID &ID) const;
256 
getClasses()257   ArrayRef<Record *> getClasses() const {
258     return ArrayRef(getTrailingObjects<Record *>(), NumClasses);
259   }
260 
261   using const_record_iterator = Record * const *;
262 
classes_begin()263   const_record_iterator classes_begin() const { return getClasses().begin(); }
classes_end()264   const_record_iterator classes_end() const { return getClasses().end(); }
265 
266   std::string getAsString() const override;
267 
268   bool isSubClassOf(Record *Class) const;
269   bool typeIsConvertibleTo(const RecTy *RHS) const override;
270 
271   bool typeIsA(const RecTy *RHS) const override;
272 };
273 
274 /// Find a common type that T1 and T2 convert to.
275 /// Return 0 if no such type exists.
276 RecTy *resolveTypes(RecTy *T1, RecTy *T2);
277 
278 //===----------------------------------------------------------------------===//
279 //  Initializer Classes
280 //===----------------------------------------------------------------------===//
281 
282 class Init {
283 protected:
284   /// Discriminator enum (for isa<>, dyn_cast<>, et al.)
285   ///
286   /// This enum is laid out by a preorder traversal of the inheritance
287   /// hierarchy, and does not contain an entry for abstract classes, as per
288   /// the recommendation in docs/HowToSetUpLLVMStyleRTTI.rst.
289   ///
290   /// We also explicitly include "first" and "last" values for each
291   /// interior node of the inheritance tree, to make it easier to read the
292   /// corresponding classof().
293   ///
294   /// We could pack these a bit tighter by not having the IK_FirstXXXInit
295   /// and IK_LastXXXInit be their own values, but that would degrade
296   /// readability for really no benefit.
297   enum InitKind : uint8_t {
298     IK_First, // unused; silence a spurious warning
299     IK_FirstTypedInit,
300     IK_BitInit,
301     IK_BitsInit,
302     IK_DagInit,
303     IK_DefInit,
304     IK_FieldInit,
305     IK_IntInit,
306     IK_ListInit,
307     IK_FirstOpInit,
308     IK_BinOpInit,
309     IK_TernOpInit,
310     IK_UnOpInit,
311     IK_LastOpInit,
312     IK_CondOpInit,
313     IK_FoldOpInit,
314     IK_IsAOpInit,
315     IK_ExistsOpInit,
316     IK_AnonymousNameInit,
317     IK_StringInit,
318     IK_VarInit,
319     IK_VarListElementInit,
320     IK_VarBitInit,
321     IK_VarDefInit,
322     IK_LastTypedInit,
323     IK_UnsetInit
324   };
325 
326 private:
327   const InitKind Kind;
328 
329 protected:
330   uint8_t Opc; // Used by UnOpInit, BinOpInit, and TernOpInit
331 
332 private:
333   virtual void anchor();
334 
335 public:
336   /// Get the kind (type) of the value.
getKind()337   InitKind getKind() const { return Kind; }
338 
339   /// Get the record keeper that initialized this Init.
340   RecordKeeper &getRecordKeeper() const;
341 
342 protected:
Kind(K)343   explicit Init(InitKind K, uint8_t Opc = 0) : Kind(K), Opc(Opc) {}
344 
345 public:
346   Init(const Init &) = delete;
347   Init &operator=(const Init &) = delete;
348   virtual ~Init() = default;
349 
350   /// Is this a complete value with no unset (uninitialized) subvalues?
isComplete()351   virtual bool isComplete() const { return true; }
352 
353   /// Is this a concrete and fully resolved value without any references or
354   /// stuck operations? Unset values are concrete.
isConcrete()355   virtual bool isConcrete() const { return false; }
356 
357   /// Print this value.
print(raw_ostream & OS)358   void print(raw_ostream &OS) const { OS << getAsString(); }
359 
360   /// Convert this value to a literal form.
361   virtual std::string getAsString() const = 0;
362 
363   /// Convert this value to a literal form,
364   /// without adding quotes around a string.
getAsUnquotedString()365   virtual std::string getAsUnquotedString() const { return getAsString(); }
366 
367   /// Debugging method that may be called through a debugger; just
368   /// invokes print on stderr.
369   void dump() const;
370 
371   /// If this value is convertible to type \p Ty, return a value whose
372   /// type is \p Ty, generating a !cast operation if required.
373   /// Otherwise, return null.
374   virtual Init *getCastTo(RecTy *Ty) const = 0;
375 
376   /// Convert to a value whose type is \p Ty, or return null if this
377   /// is not possible. This can happen if the value's type is convertible
378   /// to \p Ty, but there are unresolved references.
379   virtual Init *convertInitializerTo(RecTy *Ty) const = 0;
380 
381   /// This function is used to implement the bit range
382   /// selection operator. Given a value, it selects the specified bits,
383   /// returning them as a new \p Init of type \p bits. If it is not legal
384   /// to use the bit selection operator on this value, null is returned.
convertInitializerBitRange(ArrayRef<unsigned> Bits)385   virtual Init *convertInitializerBitRange(ArrayRef<unsigned> Bits) const {
386     return nullptr;
387   }
388 
389   /// This function is used to implement the list slice
390   /// selection operator.  Given a value, it selects the specified list
391   /// elements, returning them as a new \p Init of type \p list. If it
392   /// is not legal to use the slice operator, null is returned.
convertInitListSlice(ArrayRef<unsigned> Elements)393   virtual Init *convertInitListSlice(ArrayRef<unsigned> Elements) const {
394     return nullptr;
395   }
396 
397   /// This function is used to implement the FieldInit class.
398   /// Implementors of this method should return the type of the named
399   /// field if they are of type record.
getFieldType(StringInit * FieldName)400   virtual RecTy *getFieldType(StringInit *FieldName) const {
401     return nullptr;
402   }
403 
404   /// This function is used by classes that refer to other
405   /// variables which may not be defined at the time the expression is formed.
406   /// If a value is set for the variable later, this method will be called on
407   /// users of the value to allow the value to propagate out.
resolveReferences(Resolver & R)408   virtual Init *resolveReferences(Resolver &R) const {
409     return const_cast<Init *>(this);
410   }
411 
412   /// Get the \p Init value of the specified bit.
413   virtual Init *getBit(unsigned Bit) const = 0;
414 };
415 
416 inline raw_ostream &operator<<(raw_ostream &OS, const Init &I) {
417   I.print(OS); return OS;
418 }
419 
420 /// This is the common superclass of types that have a specific,
421 /// explicit type, stored in ValueTy.
422 class TypedInit : public Init {
423   RecTy *ValueTy;
424 
425 protected:
426   explicit TypedInit(InitKind K, RecTy *T, uint8_t Opc = 0)
Init(K,Opc)427       : Init(K, Opc), ValueTy(T) {}
428 
429 public:
430   TypedInit(const TypedInit &) = delete;
431   TypedInit &operator=(const TypedInit &) = delete;
432 
classof(const Init * I)433   static bool classof(const Init *I) {
434     return I->getKind() >= IK_FirstTypedInit &&
435            I->getKind() <= IK_LastTypedInit;
436   }
437 
438   /// Get the type of the Init as a RecTy.
getType()439   RecTy *getType() const { return ValueTy; }
440 
441   /// Get the record keeper that initialized this Init.
getRecordKeeper()442   RecordKeeper &getRecordKeeper() const { return ValueTy->getRecordKeeper(); }
443 
444   Init *getCastTo(RecTy *Ty) const override;
445   Init *convertInitializerTo(RecTy *Ty) const override;
446 
447   Init *convertInitializerBitRange(ArrayRef<unsigned> Bits) const override;
448   Init *convertInitListSlice(ArrayRef<unsigned> Elements) const override;
449 
450   /// This method is used to implement the FieldInit class.
451   /// Implementors of this method should return the type of the named field if
452   /// they are of type record.
453   RecTy *getFieldType(StringInit *FieldName) const override;
454 };
455 
456 /// '?' - Represents an uninitialized value.
457 class UnsetInit : public Init {
458   friend detail::RecordKeeperImpl;
459 
460   /// The record keeper that initialized this Init.
461   RecordKeeper &RK;
462 
UnsetInit(RecordKeeper & RK)463   UnsetInit(RecordKeeper &RK) : Init(IK_UnsetInit), RK(RK) {}
464 
465 public:
466   UnsetInit(const UnsetInit &) = delete;
467   UnsetInit &operator=(const UnsetInit &) = delete;
468 
classof(const Init * I)469   static bool classof(const Init *I) {
470     return I->getKind() == IK_UnsetInit;
471   }
472 
473   /// Get the singleton unset Init.
474   static UnsetInit *get(RecordKeeper &RK);
475 
476   /// Get the record keeper that initialized this Init.
getRecordKeeper()477   RecordKeeper &getRecordKeeper() const { return RK; }
478 
479   Init *getCastTo(RecTy *Ty) const override;
480   Init *convertInitializerTo(RecTy *Ty) const override;
481 
getBit(unsigned Bit)482   Init *getBit(unsigned Bit) const override {
483     return const_cast<UnsetInit*>(this);
484   }
485 
486   /// Is this a complete value with no unset (uninitialized) subvalues?
isComplete()487   bool isComplete() const override { return false; }
488 
isConcrete()489   bool isConcrete() const override { return true; }
490 
491   /// Get the string representation of the Init.
getAsString()492   std::string getAsString() const override { return "?"; }
493 };
494 
495 /// 'true'/'false' - Represent a concrete initializer for a bit.
496 class BitInit final : public TypedInit {
497   friend detail::RecordKeeperImpl;
498 
499   bool Value;
500 
BitInit(bool V,RecTy * T)501   explicit BitInit(bool V, RecTy *T) : TypedInit(IK_BitInit, T), Value(V) {}
502 
503 public:
504   BitInit(const BitInit &) = delete;
505   BitInit &operator=(BitInit &) = delete;
506 
classof(const Init * I)507   static bool classof(const Init *I) {
508     return I->getKind() == IK_BitInit;
509   }
510 
511   static BitInit *get(RecordKeeper &RK, bool V);
512 
getValue()513   bool getValue() const { return Value; }
514 
515   Init *convertInitializerTo(RecTy *Ty) const override;
516 
getBit(unsigned Bit)517   Init *getBit(unsigned Bit) const override {
518     assert(Bit < 1 && "Bit index out of range!");
519     return const_cast<BitInit*>(this);
520   }
521 
isConcrete()522   bool isConcrete() const override { return true; }
getAsString()523   std::string getAsString() const override { return Value ? "1" : "0"; }
524 };
525 
526 /// '{ a, b, c }' - Represents an initializer for a BitsRecTy value.
527 /// It contains a vector of bits, whose size is determined by the type.
528 class BitsInit final : public TypedInit, public FoldingSetNode,
529                        public TrailingObjects<BitsInit, Init *> {
530   unsigned NumBits;
531 
BitsInit(RecordKeeper & RK,unsigned N)532   BitsInit(RecordKeeper &RK, unsigned N)
533       : TypedInit(IK_BitsInit, BitsRecTy::get(RK, N)), NumBits(N) {}
534 
535 public:
536   BitsInit(const BitsInit &) = delete;
537   BitsInit &operator=(const BitsInit &) = delete;
538 
539   // Do not use sized deallocation due to trailing objects.
delete(void * p)540   void operator delete(void *p) { ::operator delete(p); }
541 
classof(const Init * I)542   static bool classof(const Init *I) {
543     return I->getKind() == IK_BitsInit;
544   }
545 
546   static BitsInit *get(RecordKeeper &RK, ArrayRef<Init *> Range);
547 
548   void Profile(FoldingSetNodeID &ID) const;
549 
getNumBits()550   unsigned getNumBits() const { return NumBits; }
551 
552   Init *convertInitializerTo(RecTy *Ty) const override;
553   Init *convertInitializerBitRange(ArrayRef<unsigned> Bits) const override;
554 
isComplete()555   bool isComplete() const override {
556     for (unsigned i = 0; i != getNumBits(); ++i)
557       if (!getBit(i)->isComplete()) return false;
558     return true;
559   }
560 
allInComplete()561   bool allInComplete() const {
562     for (unsigned i = 0; i != getNumBits(); ++i)
563       if (getBit(i)->isComplete()) return false;
564     return true;
565   }
566 
567   bool isConcrete() const override;
568   std::string getAsString() const override;
569 
570   Init *resolveReferences(Resolver &R) const override;
571 
getBit(unsigned Bit)572   Init *getBit(unsigned Bit) const override {
573     assert(Bit < NumBits && "Bit index out of range!");
574     return getTrailingObjects<Init *>()[Bit];
575   }
576 };
577 
578 /// '7' - Represent an initialization by a literal integer value.
579 class IntInit : public TypedInit {
580   int64_t Value;
581 
IntInit(RecordKeeper & RK,int64_t V)582   explicit IntInit(RecordKeeper &RK, int64_t V)
583       : TypedInit(IK_IntInit, IntRecTy::get(RK)), Value(V) {}
584 
585 public:
586   IntInit(const IntInit &) = delete;
587   IntInit &operator=(const IntInit &) = delete;
588 
classof(const Init * I)589   static bool classof(const Init *I) {
590     return I->getKind() == IK_IntInit;
591   }
592 
593   static IntInit *get(RecordKeeper &RK, int64_t V);
594 
getValue()595   int64_t getValue() const { return Value; }
596 
597   Init *convertInitializerTo(RecTy *Ty) const override;
598   Init *convertInitializerBitRange(ArrayRef<unsigned> Bits) const override;
599 
isConcrete()600   bool isConcrete() const override { return true; }
601   std::string getAsString() const override;
602 
getBit(unsigned Bit)603   Init *getBit(unsigned Bit) const override {
604     return BitInit::get(getRecordKeeper(), (Value & (1ULL << Bit)) != 0);
605   }
606 };
607 
608 /// "anonymous_n" - Represent an anonymous record name
609 class AnonymousNameInit : public TypedInit {
610   unsigned Value;
611 
AnonymousNameInit(RecordKeeper & RK,unsigned V)612   explicit AnonymousNameInit(RecordKeeper &RK, unsigned V)
613       : TypedInit(IK_AnonymousNameInit, StringRecTy::get(RK)), Value(V) {}
614 
615 public:
616   AnonymousNameInit(const AnonymousNameInit &) = delete;
617   AnonymousNameInit &operator=(const AnonymousNameInit &) = delete;
618 
classof(const Init * I)619   static bool classof(const Init *I) {
620     return I->getKind() == IK_AnonymousNameInit;
621   }
622 
623   static AnonymousNameInit *get(RecordKeeper &RK, unsigned);
624 
getValue()625   unsigned getValue() const { return Value; }
626 
627   StringInit *getNameInit() const;
628 
629   std::string getAsString() const override;
630 
631   Init *resolveReferences(Resolver &R) const override;
632 
getBit(unsigned Bit)633   Init *getBit(unsigned Bit) const override {
634     llvm_unreachable("Illegal bit reference off string");
635   }
636 };
637 
638 /// "foo" - Represent an initialization by a string value.
639 class StringInit : public TypedInit {
640 public:
641   enum StringFormat {
642     SF_String, // Format as "text"
643     SF_Code,   // Format as [{text}]
644   };
645 
646 private:
647   StringRef Value;
648   StringFormat Format;
649 
StringInit(RecordKeeper & RK,StringRef V,StringFormat Fmt)650   explicit StringInit(RecordKeeper &RK, StringRef V, StringFormat Fmt)
651       : TypedInit(IK_StringInit, StringRecTy::get(RK)), Value(V), Format(Fmt) {}
652 
653 public:
654   StringInit(const StringInit &) = delete;
655   StringInit &operator=(const StringInit &) = delete;
656 
classof(const Init * I)657   static bool classof(const Init *I) {
658     return I->getKind() == IK_StringInit;
659   }
660 
661   static StringInit *get(RecordKeeper &RK, StringRef,
662                          StringFormat Fmt = SF_String);
663 
determineFormat(StringFormat Fmt1,StringFormat Fmt2)664   static StringFormat determineFormat(StringFormat Fmt1, StringFormat Fmt2) {
665     return (Fmt1 == SF_Code || Fmt2 == SF_Code) ? SF_Code : SF_String;
666   }
667 
getValue()668   StringRef getValue() const { return Value; }
getFormat()669   StringFormat getFormat() const { return Format; }
hasCodeFormat()670   bool hasCodeFormat() const { return Format == SF_Code; }
671 
672   Init *convertInitializerTo(RecTy *Ty) const override;
673 
isConcrete()674   bool isConcrete() const override { return true; }
675 
getAsString()676   std::string getAsString() const override {
677     if (Format == SF_String)
678       return "\"" + Value.str() + "\"";
679     else
680       return "[{" + Value.str() + "}]";
681   }
682 
getAsUnquotedString()683   std::string getAsUnquotedString() const override {
684     return std::string(Value);
685   }
686 
getBit(unsigned Bit)687   Init *getBit(unsigned Bit) const override {
688     llvm_unreachable("Illegal bit reference off string");
689   }
690 };
691 
692 /// [AL, AH, CL] - Represent a list of defs
693 ///
694 class ListInit final : public TypedInit, public FoldingSetNode,
695                        public TrailingObjects<ListInit, Init *> {
696   unsigned NumValues;
697 
698 public:
699   using const_iterator = Init *const *;
700 
701 private:
ListInit(unsigned N,RecTy * EltTy)702   explicit ListInit(unsigned N, RecTy *EltTy)
703       : TypedInit(IK_ListInit, ListRecTy::get(EltTy)), NumValues(N) {}
704 
705 public:
706   ListInit(const ListInit &) = delete;
707   ListInit &operator=(const ListInit &) = delete;
708 
709   // Do not use sized deallocation due to trailing objects.
delete(void * p)710   void operator delete(void *p) { ::operator delete(p); }
711 
classof(const Init * I)712   static bool classof(const Init *I) {
713     return I->getKind() == IK_ListInit;
714   }
715   static ListInit *get(ArrayRef<Init *> Range, RecTy *EltTy);
716 
717   void Profile(FoldingSetNodeID &ID) const;
718 
getElement(unsigned i)719   Init *getElement(unsigned i) const {
720     assert(i < NumValues && "List element index out of range!");
721     return getTrailingObjects<Init *>()[i];
722   }
getElementType()723   RecTy *getElementType() const {
724     return cast<ListRecTy>(getType())->getElementType();
725   }
726 
727   Record *getElementAsRecord(unsigned i) const;
728 
729   Init *convertInitListSlice(ArrayRef<unsigned> Elements) const override;
730 
731   Init *convertInitializerTo(RecTy *Ty) const override;
732 
733   /// This method is used by classes that refer to other
734   /// variables which may not be defined at the time they expression is formed.
735   /// If a value is set for the variable later, this method will be called on
736   /// users of the value to allow the value to propagate out.
737   ///
738   Init *resolveReferences(Resolver &R) const override;
739 
740   bool isComplete() const override;
741   bool isConcrete() const override;
742   std::string getAsString() const override;
743 
getValues()744   ArrayRef<Init*> getValues() const {
745     return ArrayRef(getTrailingObjects<Init *>(), NumValues);
746   }
747 
begin()748   const_iterator begin() const { return getTrailingObjects<Init *>(); }
end()749   const_iterator end  () const { return begin() + NumValues; }
750 
size()751   size_t         size () const { return NumValues;  }
empty()752   bool           empty() const { return NumValues == 0; }
753 
getBit(unsigned Bit)754   Init *getBit(unsigned Bit) const override {
755     llvm_unreachable("Illegal bit reference off list");
756   }
757 };
758 
759 /// Base class for operators
760 ///
761 class OpInit : public TypedInit {
762 protected:
OpInit(InitKind K,RecTy * Type,uint8_t Opc)763   explicit OpInit(InitKind K, RecTy *Type, uint8_t Opc)
764     : TypedInit(K, Type, Opc) {}
765 
766 public:
767   OpInit(const OpInit &) = delete;
768   OpInit &operator=(OpInit &) = delete;
769 
classof(const Init * I)770   static bool classof(const Init *I) {
771     return I->getKind() >= IK_FirstOpInit &&
772            I->getKind() <= IK_LastOpInit;
773   }
774 
775   // Clone - Clone this operator, replacing arguments with the new list
776   virtual OpInit *clone(ArrayRef<Init *> Operands) const = 0;
777 
778   virtual unsigned getNumOperands() const = 0;
779   virtual Init *getOperand(unsigned i) const = 0;
780 
781   Init *getBit(unsigned Bit) const override;
782 };
783 
784 /// !op (X) - Transform an init.
785 ///
786 class UnOpInit : public OpInit, public FoldingSetNode {
787 public:
788   enum UnaryOp : uint8_t { CAST, NOT, HEAD, TAIL, SIZE, EMPTY, GETDAGOP, LOG2 };
789 
790 private:
791   Init *LHS;
792 
UnOpInit(UnaryOp opc,Init * lhs,RecTy * Type)793   UnOpInit(UnaryOp opc, Init *lhs, RecTy *Type)
794     : OpInit(IK_UnOpInit, Type, opc), LHS(lhs) {}
795 
796 public:
797   UnOpInit(const UnOpInit &) = delete;
798   UnOpInit &operator=(const UnOpInit &) = delete;
799 
classof(const Init * I)800   static bool classof(const Init *I) {
801     return I->getKind() == IK_UnOpInit;
802   }
803 
804   static UnOpInit *get(UnaryOp opc, Init *lhs, RecTy *Type);
805 
806   void Profile(FoldingSetNodeID &ID) const;
807 
808   // Clone - Clone this operator, replacing arguments with the new list
clone(ArrayRef<Init * > Operands)809   OpInit *clone(ArrayRef<Init *> Operands) const override {
810     assert(Operands.size() == 1 &&
811            "Wrong number of operands for unary operation");
812     return UnOpInit::get(getOpcode(), *Operands.begin(), getType());
813   }
814 
getNumOperands()815   unsigned getNumOperands() const override { return 1; }
816 
getOperand(unsigned i)817   Init *getOperand(unsigned i) const override {
818     assert(i == 0 && "Invalid operand id for unary operator");
819     return getOperand();
820   }
821 
getOpcode()822   UnaryOp getOpcode() const { return (UnaryOp)Opc; }
getOperand()823   Init *getOperand() const { return LHS; }
824 
825   // Fold - If possible, fold this to a simpler init.  Return this if not
826   // possible to fold.
827   Init *Fold(Record *CurRec, bool IsFinal = false) const;
828 
829   Init *resolveReferences(Resolver &R) const override;
830 
831   std::string getAsString() const override;
832 };
833 
834 /// !op (X, Y) - Combine two inits.
835 class BinOpInit : public OpInit, public FoldingSetNode {
836 public:
837   enum BinaryOp : uint8_t {
838     ADD,
839     SUB,
840     MUL,
841     DIV,
842     AND,
843     OR,
844     XOR,
845     SHL,
846     SRA,
847     SRL,
848     LISTCONCAT,
849     LISTSPLAT,
850     LISTREMOVE,
851     STRCONCAT,
852     INTERLEAVE,
853     CONCAT,
854     EQ,
855     NE,
856     LE,
857     LT,
858     GE,
859     GT,
860     SETDAGOP
861   };
862 
863 private:
864   Init *LHS, *RHS;
865 
BinOpInit(BinaryOp opc,Init * lhs,Init * rhs,RecTy * Type)866   BinOpInit(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type) :
867       OpInit(IK_BinOpInit, Type, opc), LHS(lhs), RHS(rhs) {}
868 
869 public:
870   BinOpInit(const BinOpInit &) = delete;
871   BinOpInit &operator=(const BinOpInit &) = delete;
872 
classof(const Init * I)873   static bool classof(const Init *I) {
874     return I->getKind() == IK_BinOpInit;
875   }
876 
877   static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs,
878                         RecTy *Type);
879   static Init *getStrConcat(Init *lhs, Init *rhs);
880   static Init *getListConcat(TypedInit *lhs, Init *rhs);
881 
882   void Profile(FoldingSetNodeID &ID) const;
883 
884   // Clone - Clone this operator, replacing arguments with the new list
clone(ArrayRef<Init * > Operands)885   OpInit *clone(ArrayRef<Init *> Operands) const override {
886     assert(Operands.size() == 2 &&
887            "Wrong number of operands for binary operation");
888     return BinOpInit::get(getOpcode(), Operands[0], Operands[1], getType());
889   }
890 
getNumOperands()891   unsigned getNumOperands() const override { return 2; }
getOperand(unsigned i)892   Init *getOperand(unsigned i) const override {
893     switch (i) {
894     default: llvm_unreachable("Invalid operand id for binary operator");
895     case 0: return getLHS();
896     case 1: return getRHS();
897     }
898   }
899 
getOpcode()900   BinaryOp getOpcode() const { return (BinaryOp)Opc; }
getLHS()901   Init *getLHS() const { return LHS; }
getRHS()902   Init *getRHS() const { return RHS; }
903 
904   std::optional<bool> CompareInit(unsigned Opc, Init *LHS, Init *RHS) const;
905 
906   // Fold - If possible, fold this to a simpler init.  Return this if not
907   // possible to fold.
908   Init *Fold(Record *CurRec) const;
909 
910   Init *resolveReferences(Resolver &R) const override;
911 
912   std::string getAsString() const override;
913 };
914 
915 /// !op (X, Y, Z) - Combine two inits.
916 class TernOpInit : public OpInit, public FoldingSetNode {
917 public:
918   enum TernaryOp : uint8_t { SUBST, FOREACH, FILTER, IF, DAG, SUBSTR, FIND };
919 
920 private:
921   Init *LHS, *MHS, *RHS;
922 
TernOpInit(TernaryOp opc,Init * lhs,Init * mhs,Init * rhs,RecTy * Type)923   TernOpInit(TernaryOp opc, Init *lhs, Init *mhs, Init *rhs,
924              RecTy *Type) :
925       OpInit(IK_TernOpInit, Type, opc), LHS(lhs), MHS(mhs), RHS(rhs) {}
926 
927 public:
928   TernOpInit(const TernOpInit &) = delete;
929   TernOpInit &operator=(const TernOpInit &) = delete;
930 
classof(const Init * I)931   static bool classof(const Init *I) {
932     return I->getKind() == IK_TernOpInit;
933   }
934 
935   static TernOpInit *get(TernaryOp opc, Init *lhs,
936                          Init *mhs, Init *rhs,
937                          RecTy *Type);
938 
939   void Profile(FoldingSetNodeID &ID) const;
940 
941   // Clone - Clone this operator, replacing arguments with the new list
clone(ArrayRef<Init * > Operands)942   OpInit *clone(ArrayRef<Init *> Operands) const override {
943     assert(Operands.size() == 3 &&
944            "Wrong number of operands for ternary operation");
945     return TernOpInit::get(getOpcode(), Operands[0], Operands[1], Operands[2],
946                            getType());
947   }
948 
getNumOperands()949   unsigned getNumOperands() const override { return 3; }
getOperand(unsigned i)950   Init *getOperand(unsigned i) const override {
951     switch (i) {
952     default: llvm_unreachable("Invalid operand id for ternary operator");
953     case 0: return getLHS();
954     case 1: return getMHS();
955     case 2: return getRHS();
956     }
957   }
958 
getOpcode()959   TernaryOp getOpcode() const { return (TernaryOp)Opc; }
getLHS()960   Init *getLHS() const { return LHS; }
getMHS()961   Init *getMHS() const { return MHS; }
getRHS()962   Init *getRHS() const { return RHS; }
963 
964   // Fold - If possible, fold this to a simpler init.  Return this if not
965   // possible to fold.
966   Init *Fold(Record *CurRec) const;
967 
isComplete()968   bool isComplete() const override {
969     return LHS->isComplete() && MHS->isComplete() && RHS->isComplete();
970   }
971 
972   Init *resolveReferences(Resolver &R) const override;
973 
974   std::string getAsString() const override;
975 };
976 
977 /// !cond(condition_1: value1, ... , condition_n: value)
978 /// Selects the first value for which condition is true.
979 /// Otherwise reports an error.
980 class CondOpInit final : public TypedInit, public FoldingSetNode,
981                       public TrailingObjects<CondOpInit, Init *> {
982   unsigned NumConds;
983   RecTy *ValType;
984 
CondOpInit(unsigned NC,RecTy * Type)985   CondOpInit(unsigned NC, RecTy *Type)
986     : TypedInit(IK_CondOpInit, Type),
987       NumConds(NC), ValType(Type) {}
988 
numTrailingObjects(OverloadToken<Init * >)989   size_t numTrailingObjects(OverloadToken<Init *>) const {
990     return 2*NumConds;
991   }
992 
993 public:
994   CondOpInit(const CondOpInit &) = delete;
995   CondOpInit &operator=(const CondOpInit &) = delete;
996 
classof(const Init * I)997   static bool classof(const Init *I) {
998     return I->getKind() == IK_CondOpInit;
999   }
1000 
1001   static CondOpInit *get(ArrayRef<Init*> C, ArrayRef<Init*> V,
1002                         RecTy *Type);
1003 
1004   void Profile(FoldingSetNodeID &ID) const;
1005 
getValType()1006   RecTy *getValType() const { return ValType; }
1007 
getNumConds()1008   unsigned getNumConds() const { return NumConds; }
1009 
getCond(unsigned Num)1010   Init *getCond(unsigned Num) const {
1011     assert(Num < NumConds && "Condition number out of range!");
1012     return getTrailingObjects<Init *>()[Num];
1013   }
1014 
getVal(unsigned Num)1015   Init *getVal(unsigned Num) const {
1016     assert(Num < NumConds && "Val number out of range!");
1017     return getTrailingObjects<Init *>()[Num+NumConds];
1018   }
1019 
getConds()1020   ArrayRef<Init *> getConds() const {
1021     return ArrayRef(getTrailingObjects<Init *>(), NumConds);
1022   }
1023 
getVals()1024   ArrayRef<Init *> getVals() const {
1025     return ArrayRef(getTrailingObjects<Init *>() + NumConds, NumConds);
1026   }
1027 
1028   Init *Fold(Record *CurRec) const;
1029 
1030   Init *resolveReferences(Resolver &R) const override;
1031 
1032   bool isConcrete() const override;
1033   bool isComplete() const override;
1034   std::string getAsString() const override;
1035 
1036   using const_case_iterator = SmallVectorImpl<Init*>::const_iterator;
1037   using const_val_iterator = SmallVectorImpl<Init*>::const_iterator;
1038 
arg_begin()1039   inline const_case_iterator  arg_begin() const { return getConds().begin(); }
arg_end()1040   inline const_case_iterator  arg_end  () const { return getConds().end(); }
1041 
case_size()1042   inline size_t              case_size () const { return NumConds; }
case_empty()1043   inline bool                case_empty() const { return NumConds == 0; }
1044 
name_begin()1045   inline const_val_iterator name_begin() const { return getVals().begin();}
name_end()1046   inline const_val_iterator name_end  () const { return getVals().end(); }
1047 
val_size()1048   inline size_t              val_size () const { return NumConds; }
val_empty()1049   inline bool                val_empty() const { return NumConds == 0; }
1050 
1051   Init *getBit(unsigned Bit) const override;
1052 };
1053 
1054 /// !foldl (a, b, expr, start, lst) - Fold over a list.
1055 class FoldOpInit : public TypedInit, public FoldingSetNode {
1056 private:
1057   Init *Start;
1058   Init *List;
1059   Init *A;
1060   Init *B;
1061   Init *Expr;
1062 
FoldOpInit(Init * Start,Init * List,Init * A,Init * B,Init * Expr,RecTy * Type)1063   FoldOpInit(Init *Start, Init *List, Init *A, Init *B, Init *Expr, RecTy *Type)
1064       : TypedInit(IK_FoldOpInit, Type), Start(Start), List(List), A(A), B(B),
1065         Expr(Expr) {}
1066 
1067 public:
1068   FoldOpInit(const FoldOpInit &) = delete;
1069   FoldOpInit &operator=(const FoldOpInit &) = delete;
1070 
classof(const Init * I)1071   static bool classof(const Init *I) { return I->getKind() == IK_FoldOpInit; }
1072 
1073   static FoldOpInit *get(Init *Start, Init *List, Init *A, Init *B, Init *Expr,
1074                          RecTy *Type);
1075 
1076   void Profile(FoldingSetNodeID &ID) const;
1077 
1078   // Fold - If possible, fold this to a simpler init.  Return this if not
1079   // possible to fold.
1080   Init *Fold(Record *CurRec) const;
1081 
isComplete()1082   bool isComplete() const override { return false; }
1083 
1084   Init *resolveReferences(Resolver &R) const override;
1085 
1086   Init *getBit(unsigned Bit) const override;
1087 
1088   std::string getAsString() const override;
1089 };
1090 
1091 /// !isa<type>(expr) - Dynamically determine the type of an expression.
1092 class IsAOpInit : public TypedInit, public FoldingSetNode {
1093 private:
1094   RecTy *CheckType;
1095   Init *Expr;
1096 
IsAOpInit(RecTy * CheckType,Init * Expr)1097   IsAOpInit(RecTy *CheckType, Init *Expr)
1098       : TypedInit(IK_IsAOpInit, IntRecTy::get(CheckType->getRecordKeeper())),
1099         CheckType(CheckType), Expr(Expr) {}
1100 
1101 public:
1102   IsAOpInit(const IsAOpInit &) = delete;
1103   IsAOpInit &operator=(const IsAOpInit &) = delete;
1104 
classof(const Init * I)1105   static bool classof(const Init *I) { return I->getKind() == IK_IsAOpInit; }
1106 
1107   static IsAOpInit *get(RecTy *CheckType, Init *Expr);
1108 
1109   void Profile(FoldingSetNodeID &ID) const;
1110 
1111   // Fold - If possible, fold this to a simpler init.  Return this if not
1112   // possible to fold.
1113   Init *Fold() const;
1114 
isComplete()1115   bool isComplete() const override { return false; }
1116 
1117   Init *resolveReferences(Resolver &R) const override;
1118 
1119   Init *getBit(unsigned Bit) const override;
1120 
1121   std::string getAsString() const override;
1122 };
1123 
1124 /// !exists<type>(expr) - Dynamically determine if a record of `type` named
1125 /// `expr` exists.
1126 class ExistsOpInit : public TypedInit, public FoldingSetNode {
1127 private:
1128   RecTy *CheckType;
1129   Init *Expr;
1130 
ExistsOpInit(RecTy * CheckType,Init * Expr)1131   ExistsOpInit(RecTy *CheckType, Init *Expr)
1132       : TypedInit(IK_ExistsOpInit, IntRecTy::get(CheckType->getRecordKeeper())),
1133         CheckType(CheckType), Expr(Expr) {}
1134 
1135 public:
1136   ExistsOpInit(const ExistsOpInit &) = delete;
1137   ExistsOpInit &operator=(const ExistsOpInit &) = delete;
1138 
classof(const Init * I)1139   static bool classof(const Init *I) { return I->getKind() == IK_ExistsOpInit; }
1140 
1141   static ExistsOpInit *get(RecTy *CheckType, Init *Expr);
1142 
1143   void Profile(FoldingSetNodeID &ID) const;
1144 
1145   // Fold - If possible, fold this to a simpler init.  Return this if not
1146   // possible to fold.
1147   Init *Fold(Record *CurRec, bool IsFinal = false) const;
1148 
isComplete()1149   bool isComplete() const override { return false; }
1150 
1151   Init *resolveReferences(Resolver &R) const override;
1152 
1153   Init *getBit(unsigned Bit) const override;
1154 
1155   std::string getAsString() const override;
1156 };
1157 
1158 /// 'Opcode' - Represent a reference to an entire variable object.
1159 class VarInit : public TypedInit {
1160   Init *VarName;
1161 
VarInit(Init * VN,RecTy * T)1162   explicit VarInit(Init *VN, RecTy *T)
1163       : TypedInit(IK_VarInit, T), VarName(VN) {}
1164 
1165 public:
1166   VarInit(const VarInit &) = delete;
1167   VarInit &operator=(const VarInit &) = delete;
1168 
classof(const Init * I)1169   static bool classof(const Init *I) {
1170     return I->getKind() == IK_VarInit;
1171   }
1172 
1173   static VarInit *get(StringRef VN, RecTy *T);
1174   static VarInit *get(Init *VN, RecTy *T);
1175 
1176   StringRef getName() const;
getNameInit()1177   Init *getNameInit() const { return VarName; }
1178 
getNameInitAsString()1179   std::string getNameInitAsString() const {
1180     return getNameInit()->getAsUnquotedString();
1181   }
1182 
1183   /// This method is used by classes that refer to other
1184   /// variables which may not be defined at the time they expression is formed.
1185   /// If a value is set for the variable later, this method will be called on
1186   /// users of the value to allow the value to propagate out.
1187   ///
1188   Init *resolveReferences(Resolver &R) const override;
1189 
1190   Init *getBit(unsigned Bit) const override;
1191 
getAsString()1192   std::string getAsString() const override { return std::string(getName()); }
1193 };
1194 
1195 /// Opcode{0} - Represent access to one bit of a variable or field.
1196 class VarBitInit final : public TypedInit {
1197   TypedInit *TI;
1198   unsigned Bit;
1199 
VarBitInit(TypedInit * T,unsigned B)1200   VarBitInit(TypedInit *T, unsigned B)
1201       : TypedInit(IK_VarBitInit, BitRecTy::get(T->getRecordKeeper())), TI(T),
1202         Bit(B) {
1203     assert(T->getType() &&
1204            (isa<IntRecTy>(T->getType()) ||
1205             (isa<BitsRecTy>(T->getType()) &&
1206              cast<BitsRecTy>(T->getType())->getNumBits() > B)) &&
1207            "Illegal VarBitInit expression!");
1208   }
1209 
1210 public:
1211   VarBitInit(const VarBitInit &) = delete;
1212   VarBitInit &operator=(const VarBitInit &) = delete;
1213 
classof(const Init * I)1214   static bool classof(const Init *I) {
1215     return I->getKind() == IK_VarBitInit;
1216   }
1217 
1218   static VarBitInit *get(TypedInit *T, unsigned B);
1219 
getBitVar()1220   Init *getBitVar() const { return TI; }
getBitNum()1221   unsigned getBitNum() const { return Bit; }
1222 
1223   std::string getAsString() const override;
1224   Init *resolveReferences(Resolver &R) const override;
1225 
getBit(unsigned B)1226   Init *getBit(unsigned B) const override {
1227     assert(B < 1 && "Bit index out of range!");
1228     return const_cast<VarBitInit*>(this);
1229   }
1230 };
1231 
1232 /// List[4] - Represent access to one element of a var or
1233 /// field.
1234 class VarListElementInit : public TypedInit {
1235   TypedInit *TI;
1236   unsigned Element;
1237 
VarListElementInit(TypedInit * T,unsigned E)1238   VarListElementInit(TypedInit *T, unsigned E)
1239       : TypedInit(IK_VarListElementInit,
1240                   cast<ListRecTy>(T->getType())->getElementType()),
1241         TI(T), Element(E) {
1242     assert(T->getType() && isa<ListRecTy>(T->getType()) &&
1243            "Illegal VarBitInit expression!");
1244   }
1245 
1246 public:
1247   VarListElementInit(const VarListElementInit &) = delete;
1248   VarListElementInit &operator=(const VarListElementInit &) = delete;
1249 
classof(const Init * I)1250   static bool classof(const Init *I) {
1251     return I->getKind() == IK_VarListElementInit;
1252   }
1253 
1254   static VarListElementInit *get(TypedInit *T, unsigned E);
1255 
getVariable()1256   TypedInit *getVariable() const { return TI; }
getElementNum()1257   unsigned getElementNum() const { return Element; }
1258 
1259   std::string getAsString() const override;
1260   Init *resolveReferences(Resolver &R) const override;
1261 
1262   Init *getBit(unsigned Bit) const override;
1263 };
1264 
1265 /// AL - Represent a reference to a 'def' in the description
1266 class DefInit : public TypedInit {
1267   friend class Record;
1268 
1269   Record *Def;
1270 
1271   explicit DefInit(Record *D);
1272 
1273 public:
1274   DefInit(const DefInit &) = delete;
1275   DefInit &operator=(const DefInit &) = delete;
1276 
classof(const Init * I)1277   static bool classof(const Init *I) {
1278     return I->getKind() == IK_DefInit;
1279   }
1280 
1281   static DefInit *get(Record*);
1282 
1283   Init *convertInitializerTo(RecTy *Ty) const override;
1284 
getDef()1285   Record *getDef() const { return Def; }
1286 
1287   //virtual Init *convertInitializerBitRange(ArrayRef<unsigned> Bits);
1288 
1289   RecTy *getFieldType(StringInit *FieldName) const override;
1290 
isConcrete()1291   bool isConcrete() const override { return true; }
1292   std::string getAsString() const override;
1293 
getBit(unsigned Bit)1294   Init *getBit(unsigned Bit) const override {
1295     llvm_unreachable("Illegal bit reference off def");
1296   }
1297 };
1298 
1299 /// classname<targs...> - Represent an uninstantiated anonymous class
1300 /// instantiation.
1301 class VarDefInit final : public TypedInit, public FoldingSetNode,
1302                          public TrailingObjects<VarDefInit, Init *> {
1303   Record *Class;
1304   DefInit *Def = nullptr; // after instantiation
1305   unsigned NumArgs;
1306 
1307   explicit VarDefInit(Record *Class, unsigned N);
1308 
1309   DefInit *instantiate();
1310 
1311 public:
1312   VarDefInit(const VarDefInit &) = delete;
1313   VarDefInit &operator=(const VarDefInit &) = delete;
1314 
1315   // Do not use sized deallocation due to trailing objects.
delete(void * p)1316   void operator delete(void *p) { ::operator delete(p); }
1317 
classof(const Init * I)1318   static bool classof(const Init *I) {
1319     return I->getKind() == IK_VarDefInit;
1320   }
1321   static VarDefInit *get(Record *Class, ArrayRef<Init *> Args);
1322 
1323   void Profile(FoldingSetNodeID &ID) const;
1324 
1325   Init *resolveReferences(Resolver &R) const override;
1326   Init *Fold() const;
1327 
1328   std::string getAsString() const override;
1329 
getArg(unsigned i)1330   Init *getArg(unsigned i) const {
1331     assert(i < NumArgs && "Argument index out of range!");
1332     return getTrailingObjects<Init *>()[i];
1333   }
1334 
1335   using const_iterator = Init *const *;
1336 
args_begin()1337   const_iterator args_begin() const { return getTrailingObjects<Init *>(); }
args_end()1338   const_iterator args_end  () const { return args_begin() + NumArgs; }
1339 
args_size()1340   size_t         args_size () const { return NumArgs; }
args_empty()1341   bool           args_empty() const { return NumArgs == 0; }
1342 
args()1343   ArrayRef<Init *> args() const { return ArrayRef(args_begin(), NumArgs); }
1344 
getBit(unsigned Bit)1345   Init *getBit(unsigned Bit) const override {
1346     llvm_unreachable("Illegal bit reference off anonymous def");
1347   }
1348 };
1349 
1350 /// X.Y - Represent a reference to a subfield of a variable
1351 class FieldInit : public TypedInit {
1352   Init *Rec;                // Record we are referring to
1353   StringInit *FieldName;    // Field we are accessing
1354 
FieldInit(Init * R,StringInit * FN)1355   FieldInit(Init *R, StringInit *FN)
1356       : TypedInit(IK_FieldInit, R->getFieldType(FN)), Rec(R), FieldName(FN) {
1357 #ifndef NDEBUG
1358     if (!getType()) {
1359       llvm::errs() << "In Record = " << Rec->getAsString()
1360                    << ", got FieldName = " << *FieldName
1361                    << " with non-record type!\n";
1362       llvm_unreachable("FieldInit with non-record type!");
1363     }
1364 #endif
1365   }
1366 
1367 public:
1368   FieldInit(const FieldInit &) = delete;
1369   FieldInit &operator=(const FieldInit &) = delete;
1370 
classof(const Init * I)1371   static bool classof(const Init *I) {
1372     return I->getKind() == IK_FieldInit;
1373   }
1374 
1375   static FieldInit *get(Init *R, StringInit *FN);
1376 
getRecord()1377   Init *getRecord() const { return Rec; }
getFieldName()1378   StringInit *getFieldName() const { return FieldName; }
1379 
1380   Init *getBit(unsigned Bit) const override;
1381 
1382   Init *resolveReferences(Resolver &R) const override;
1383   Init *Fold(Record *CurRec) const;
1384 
1385   bool isConcrete() const override;
getAsString()1386   std::string getAsString() const override {
1387     return Rec->getAsString() + "." + FieldName->getValue().str();
1388   }
1389 };
1390 
1391 /// (v a, b) - Represent a DAG tree value.  DAG inits are required
1392 /// to have at least one value then a (possibly empty) list of arguments.  Each
1393 /// argument can have a name associated with it.
1394 class DagInit final : public TypedInit, public FoldingSetNode,
1395                       public TrailingObjects<DagInit, Init *, StringInit *> {
1396   friend TrailingObjects;
1397 
1398   Init *Val;
1399   StringInit *ValName;
1400   unsigned NumArgs;
1401   unsigned NumArgNames;
1402 
DagInit(Init * V,StringInit * VN,unsigned NumArgs,unsigned NumArgNames)1403   DagInit(Init *V, StringInit *VN, unsigned NumArgs, unsigned NumArgNames)
1404       : TypedInit(IK_DagInit, DagRecTy::get(V->getRecordKeeper())), Val(V),
1405         ValName(VN), NumArgs(NumArgs), NumArgNames(NumArgNames) {}
1406 
numTrailingObjects(OverloadToken<Init * >)1407   size_t numTrailingObjects(OverloadToken<Init *>) const { return NumArgs; }
1408 
1409 public:
1410   DagInit(const DagInit &) = delete;
1411   DagInit &operator=(const DagInit &) = delete;
1412 
classof(const Init * I)1413   static bool classof(const Init *I) {
1414     return I->getKind() == IK_DagInit;
1415   }
1416 
1417   static DagInit *get(Init *V, StringInit *VN, ArrayRef<Init *> ArgRange,
1418                       ArrayRef<StringInit*> NameRange);
1419   static DagInit *get(Init *V, StringInit *VN,
1420                       ArrayRef<std::pair<Init*, StringInit*>> Args);
1421 
1422   void Profile(FoldingSetNodeID &ID) const;
1423 
getOperator()1424   Init *getOperator() const { return Val; }
1425   Record *getOperatorAsDef(ArrayRef<SMLoc> Loc) const;
1426 
getName()1427   StringInit *getName() const { return ValName; }
1428 
getNameStr()1429   StringRef getNameStr() const {
1430     return ValName ? ValName->getValue() : StringRef();
1431   }
1432 
getNumArgs()1433   unsigned getNumArgs() const { return NumArgs; }
1434 
getArg(unsigned Num)1435   Init *getArg(unsigned Num) const {
1436     assert(Num < NumArgs && "Arg number out of range!");
1437     return getTrailingObjects<Init *>()[Num];
1438   }
1439 
getArgName(unsigned Num)1440   StringInit *getArgName(unsigned Num) const {
1441     assert(Num < NumArgNames && "Arg number out of range!");
1442     return getTrailingObjects<StringInit *>()[Num];
1443   }
1444 
getArgNameStr(unsigned Num)1445   StringRef getArgNameStr(unsigned Num) const {
1446     StringInit *Init = getArgName(Num);
1447     return Init ? Init->getValue() : StringRef();
1448   }
1449 
getArgs()1450   ArrayRef<Init *> getArgs() const {
1451     return ArrayRef(getTrailingObjects<Init *>(), NumArgs);
1452   }
1453 
getArgNames()1454   ArrayRef<StringInit *> getArgNames() const {
1455     return ArrayRef(getTrailingObjects<StringInit *>(), NumArgNames);
1456   }
1457 
1458   Init *resolveReferences(Resolver &R) const override;
1459 
1460   bool isConcrete() const override;
1461   std::string getAsString() const override;
1462 
1463   using const_arg_iterator = SmallVectorImpl<Init*>::const_iterator;
1464   using const_name_iterator = SmallVectorImpl<StringInit*>::const_iterator;
1465 
arg_begin()1466   inline const_arg_iterator  arg_begin() const { return getArgs().begin(); }
arg_end()1467   inline const_arg_iterator  arg_end  () const { return getArgs().end(); }
1468 
arg_size()1469   inline size_t              arg_size () const { return NumArgs; }
arg_empty()1470   inline bool                arg_empty() const { return NumArgs == 0; }
1471 
name_begin()1472   inline const_name_iterator name_begin() const { return getArgNames().begin();}
name_end()1473   inline const_name_iterator name_end  () const { return getArgNames().end(); }
1474 
name_size()1475   inline size_t              name_size () const { return NumArgNames; }
name_empty()1476   inline bool                name_empty() const { return NumArgNames == 0; }
1477 
getBit(unsigned Bit)1478   Init *getBit(unsigned Bit) const override {
1479     llvm_unreachable("Illegal bit reference off dag");
1480   }
1481 };
1482 
1483 //===----------------------------------------------------------------------===//
1484 //  High-Level Classes
1485 //===----------------------------------------------------------------------===//
1486 
1487 /// This class represents a field in a record, including its name, type,
1488 /// value, and source location.
1489 class RecordVal {
1490   friend class Record;
1491 
1492 public:
1493   enum FieldKind {
1494     FK_Normal,        // A normal record field.
1495     FK_NonconcreteOK, // A field that can be nonconcrete ('field' keyword).
1496     FK_TemplateArg,   // A template argument.
1497   };
1498 
1499 private:
1500   Init *Name;
1501   SMLoc Loc; // Source location of definition of name.
1502   PointerIntPair<RecTy *, 2, FieldKind> TyAndKind;
1503   Init *Value;
1504   bool IsUsed = false;
1505 
1506   /// Reference locations to this record value.
1507   SmallVector<SMRange> ReferenceLocs;
1508 
1509 public:
1510   RecordVal(Init *N, RecTy *T, FieldKind K);
1511   RecordVal(Init *N, SMLoc Loc, RecTy *T, FieldKind K);
1512 
1513   /// Get the record keeper used to unique this value.
getRecordKeeper()1514   RecordKeeper &getRecordKeeper() const { return Name->getRecordKeeper(); }
1515 
1516   /// Get the name of the field as a StringRef.
1517   StringRef getName() const;
1518 
1519   /// Get the name of the field as an Init.
getNameInit()1520   Init *getNameInit() const { return Name; }
1521 
1522   /// Get the name of the field as a std::string.
getNameInitAsString()1523   std::string getNameInitAsString() const {
1524     return getNameInit()->getAsUnquotedString();
1525   }
1526 
1527   /// Get the source location of the point where the field was defined.
getLoc()1528   const SMLoc &getLoc() const { return Loc; }
1529 
1530   /// Is this a field where nonconcrete values are okay?
isNonconcreteOK()1531   bool isNonconcreteOK() const {
1532     return TyAndKind.getInt() == FK_NonconcreteOK;
1533   }
1534 
1535   /// Is this a template argument?
isTemplateArg()1536   bool isTemplateArg() const {
1537     return TyAndKind.getInt() == FK_TemplateArg;
1538   }
1539 
1540   /// Get the type of the field value as a RecTy.
getType()1541   RecTy *getType() const { return TyAndKind.getPointer(); }
1542 
1543   /// Get the type of the field for printing purposes.
1544   std::string getPrintType() const;
1545 
1546   /// Get the value of the field as an Init.
getValue()1547   Init *getValue() const { return Value; }
1548 
1549   /// Set the value of the field from an Init.
1550   bool setValue(Init *V);
1551 
1552   /// Set the value and source location of the field.
1553   bool setValue(Init *V, SMLoc NewLoc);
1554 
1555   /// Add a reference to this record value.
addReferenceLoc(SMRange Loc)1556   void addReferenceLoc(SMRange Loc) { ReferenceLocs.push_back(Loc); }
1557 
1558   /// Return the references of this record value.
getReferenceLocs()1559   ArrayRef<SMRange> getReferenceLocs() const { return ReferenceLocs; }
1560 
1561   /// Whether this value is used. Useful for reporting warnings, for example
1562   /// when a template argument is unused.
setUsed(bool Used)1563   void setUsed(bool Used) { IsUsed = Used; }
isUsed()1564   bool isUsed() const { return IsUsed; }
1565 
1566   void dump() const;
1567 
1568   /// Print the value to an output stream, possibly with a semicolon.
1569   void print(raw_ostream &OS, bool PrintSem = true) const;
1570 };
1571 
1572 inline raw_ostream &operator<<(raw_ostream &OS, const RecordVal &RV) {
1573   RV.print(OS << "  ");
1574   return OS;
1575 }
1576 
1577 class Record {
1578 public:
1579   struct AssertionInfo {
1580     SMLoc Loc;
1581     Init *Condition;
1582     Init *Message;
1583 
1584     // User-defined constructor to support std::make_unique(). It can be
1585     // removed in C++20 when braced initialization is supported.
AssertionInfoAssertionInfo1586     AssertionInfo(SMLoc Loc, Init *Condition, Init *Message)
1587         : Loc(Loc), Condition(Condition), Message(Message) {}
1588   };
1589 
1590 private:
1591   Init *Name;
1592   // Location where record was instantiated, followed by the location of
1593   // multiclass prototypes used, and finally by the locations of references to
1594   // this record.
1595   SmallVector<SMLoc, 4> Locs;
1596   SmallVector<SMLoc, 0> ForwardDeclarationLocs;
1597   SmallVector<SMRange, 0> ReferenceLocs;
1598   SmallVector<Init *, 0> TemplateArgs;
1599   SmallVector<RecordVal, 0> Values;
1600   SmallVector<AssertionInfo, 0> Assertions;
1601 
1602   // All superclasses in the inheritance forest in post-order (yes, it
1603   // must be a forest; diamond-shaped inheritance is not allowed).
1604   SmallVector<std::pair<Record *, SMRange>, 0> SuperClasses;
1605 
1606   // Tracks Record instances. Not owned by Record.
1607   RecordKeeper &TrackedRecords;
1608 
1609   // The DefInit corresponding to this record.
1610   DefInit *CorrespondingDefInit = nullptr;
1611 
1612   // Unique record ID.
1613   unsigned ID;
1614 
1615   bool IsAnonymous;
1616   bool IsClass;
1617 
1618   void checkName();
1619 
1620 public:
1621   // Constructs a record.
1622   explicit Record(Init *N, ArrayRef<SMLoc> locs, RecordKeeper &records,
1623                   bool Anonymous = false, bool Class = false)
Name(N)1624       : Name(N), Locs(locs.begin(), locs.end()), TrackedRecords(records),
1625         ID(getNewUID(N->getRecordKeeper())), IsAnonymous(Anonymous),
1626         IsClass(Class) {
1627     checkName();
1628   }
1629 
1630   explicit Record(StringRef N, ArrayRef<SMLoc> locs, RecordKeeper &records,
1631                   bool Class = false)
Record(StringInit::get (records,N),locs,records,false,Class)1632       : Record(StringInit::get(records, N), locs, records, false, Class) {}
1633 
1634   // When copy-constructing a Record, we must still guarantee a globally unique
1635   // ID number. Don't copy CorrespondingDefInit either, since it's owned by the
1636   // original record. All other fields can be copied normally.
Record(const Record & O)1637   Record(const Record &O)
1638       : Name(O.Name), Locs(O.Locs), TemplateArgs(O.TemplateArgs),
1639         Values(O.Values), Assertions(O.Assertions),
1640         SuperClasses(O.SuperClasses), TrackedRecords(O.TrackedRecords),
1641         ID(getNewUID(O.getRecords())), IsAnonymous(O.IsAnonymous),
1642         IsClass(O.IsClass) {}
1643 
1644   static unsigned getNewUID(RecordKeeper &RK);
1645 
getID()1646   unsigned getID() const { return ID; }
1647 
getName()1648   StringRef getName() const { return cast<StringInit>(Name)->getValue(); }
1649 
getNameInit()1650   Init *getNameInit() const {
1651     return Name;
1652   }
1653 
getNameInitAsString()1654   std::string getNameInitAsString() const {
1655     return getNameInit()->getAsUnquotedString();
1656   }
1657 
1658   void setName(Init *Name);      // Also updates RecordKeeper.
1659 
getLoc()1660   ArrayRef<SMLoc> getLoc() const { return Locs; }
appendLoc(SMLoc Loc)1661   void appendLoc(SMLoc Loc) { Locs.push_back(Loc); }
1662 
getForwardDeclarationLocs()1663   ArrayRef<SMLoc> getForwardDeclarationLocs() const {
1664     return ForwardDeclarationLocs;
1665   }
1666 
1667   /// Add a reference to this record value.
appendReferenceLoc(SMRange Loc)1668   void appendReferenceLoc(SMRange Loc) { ReferenceLocs.push_back(Loc); }
1669 
1670   /// Return the references of this record value.
getReferenceLocs()1671   ArrayRef<SMRange> getReferenceLocs() const { return ReferenceLocs; }
1672 
1673   // Update a class location when encountering a (re-)definition.
1674   void updateClassLoc(SMLoc Loc);
1675 
1676   // Make the type that this record should have based on its superclasses.
1677   RecordRecTy *getType();
1678 
1679   /// get the corresponding DefInit.
1680   DefInit *getDefInit();
1681 
isClass()1682   bool isClass() const { return IsClass; }
1683 
getTemplateArgs()1684   ArrayRef<Init *> getTemplateArgs() const {
1685     return TemplateArgs;
1686   }
1687 
getValues()1688   ArrayRef<RecordVal> getValues() const { return Values; }
1689 
getAssertions()1690   ArrayRef<AssertionInfo> getAssertions() const { return Assertions; }
1691 
getSuperClasses()1692   ArrayRef<std::pair<Record *, SMRange>>  getSuperClasses() const {
1693     return SuperClasses;
1694   }
1695 
1696   /// Determine whether this record has the specified direct superclass.
1697   bool hasDirectSuperClass(const Record *SuperClass) const;
1698 
1699   /// Append the direct superclasses of this record to Classes.
1700   void getDirectSuperClasses(SmallVectorImpl<Record *> &Classes) const;
1701 
isTemplateArg(Init * Name)1702   bool isTemplateArg(Init *Name) const {
1703     return llvm::is_contained(TemplateArgs, Name);
1704   }
1705 
getValue(const Init * Name)1706   const RecordVal *getValue(const Init *Name) const {
1707     for (const RecordVal &Val : Values)
1708       if (Val.Name == Name) return &Val;
1709     return nullptr;
1710   }
1711 
getValue(StringRef Name)1712   const RecordVal *getValue(StringRef Name) const {
1713     return getValue(StringInit::get(getRecords(), Name));
1714   }
1715 
getValue(const Init * Name)1716   RecordVal *getValue(const Init *Name) {
1717     return const_cast<RecordVal *>(static_cast<const Record *>(this)->getValue(Name));
1718   }
1719 
getValue(StringRef Name)1720   RecordVal *getValue(StringRef Name) {
1721     return const_cast<RecordVal *>(static_cast<const Record *>(this)->getValue(Name));
1722   }
1723 
addTemplateArg(Init * Name)1724   void addTemplateArg(Init *Name) {
1725     assert(!isTemplateArg(Name) && "Template arg already defined!");
1726     TemplateArgs.push_back(Name);
1727   }
1728 
addValue(const RecordVal & RV)1729   void addValue(const RecordVal &RV) {
1730     assert(getValue(RV.getNameInit()) == nullptr && "Value already added!");
1731     Values.push_back(RV);
1732   }
1733 
removeValue(Init * Name)1734   void removeValue(Init *Name) {
1735     for (unsigned i = 0, e = Values.size(); i != e; ++i)
1736       if (Values[i].getNameInit() == Name) {
1737         Values.erase(Values.begin()+i);
1738         return;
1739       }
1740     llvm_unreachable("Cannot remove an entry that does not exist!");
1741   }
1742 
removeValue(StringRef Name)1743   void removeValue(StringRef Name) {
1744     removeValue(StringInit::get(getRecords(), Name));
1745   }
1746 
addAssertion(SMLoc Loc,Init * Condition,Init * Message)1747   void addAssertion(SMLoc Loc, Init *Condition, Init *Message) {
1748     Assertions.push_back(AssertionInfo(Loc, Condition, Message));
1749   }
1750 
appendAssertions(const Record * Rec)1751   void appendAssertions(const Record *Rec) {
1752     Assertions.append(Rec->Assertions);
1753   }
1754 
1755   void checkRecordAssertions();
1756   void checkUnusedTemplateArgs();
1757 
isSubClassOf(const Record * R)1758   bool isSubClassOf(const Record *R) const {
1759     for (const auto &SCPair : SuperClasses)
1760       if (SCPair.first == R)
1761         return true;
1762     return false;
1763   }
1764 
isSubClassOf(StringRef Name)1765   bool isSubClassOf(StringRef Name) const {
1766     for (const auto &SCPair : SuperClasses) {
1767       if (const auto *SI = dyn_cast<StringInit>(SCPair.first->getNameInit())) {
1768         if (SI->getValue() == Name)
1769           return true;
1770       } else if (SCPair.first->getNameInitAsString() == Name) {
1771         return true;
1772       }
1773     }
1774     return false;
1775   }
1776 
addSuperClass(Record * R,SMRange Range)1777   void addSuperClass(Record *R, SMRange Range) {
1778     assert(!CorrespondingDefInit &&
1779            "changing type of record after it has been referenced");
1780     assert(!isSubClassOf(R) && "Already subclassing record!");
1781     SuperClasses.push_back(std::make_pair(R, Range));
1782   }
1783 
1784   /// If there are any field references that refer to fields that have been
1785   /// filled in, we can propagate the values now.
1786   ///
1787   /// This is a final resolve: any error messages, e.g. due to undefined !cast
1788   /// references, are generated now.
1789   void resolveReferences(Init *NewName = nullptr);
1790 
1791   /// Apply the resolver to the name of the record as well as to the
1792   /// initializers of all fields of the record except SkipVal.
1793   ///
1794   /// The resolver should not resolve any of the fields itself, to avoid
1795   /// recursion / infinite loops.
1796   void resolveReferences(Resolver &R, const RecordVal *SkipVal = nullptr);
1797 
getRecords()1798   RecordKeeper &getRecords() const {
1799     return TrackedRecords;
1800   }
1801 
isAnonymous()1802   bool isAnonymous() const {
1803     return IsAnonymous;
1804   }
1805 
1806   void dump() const;
1807 
1808   //===--------------------------------------------------------------------===//
1809   // High-level methods useful to tablegen back-ends
1810   //
1811 
1812   /// Return the source location for the named field.
1813   SMLoc getFieldLoc(StringRef FieldName) const;
1814 
1815   /// Return the initializer for a value with the specified name, or throw an
1816   /// exception if the field does not exist.
1817   Init *getValueInit(StringRef FieldName) const;
1818 
1819   /// Return true if the named field is unset.
isValueUnset(StringRef FieldName)1820   bool isValueUnset(StringRef FieldName) const {
1821     return isa<UnsetInit>(getValueInit(FieldName));
1822   }
1823 
1824   /// This method looks up the specified field and returns its value as a
1825   /// string, throwing an exception if the field does not exist or if the value
1826   /// is not a string.
1827   StringRef getValueAsString(StringRef FieldName) const;
1828 
1829   /// This method looks up the specified field and returns its value as a
1830   /// string, throwing an exception if the value is not a string and
1831   /// llvm::Optional() if the field does not exist.
1832   std::optional<StringRef> getValueAsOptionalString(StringRef FieldName) const;
1833 
1834   /// This method looks up the specified field and returns its value as a
1835   /// BitsInit, throwing an exception if the field does not exist or if the
1836   /// value is not the right type.
1837   BitsInit *getValueAsBitsInit(StringRef FieldName) const;
1838 
1839   /// This method looks up the specified field and returns its value as a
1840   /// ListInit, throwing an exception if the field does not exist or if the
1841   /// value is not the right type.
1842   ListInit *getValueAsListInit(StringRef FieldName) const;
1843 
1844   /// This method looks up the specified field and returns its value as a
1845   /// vector of records, throwing an exception if the field does not exist or
1846   /// if the value is not the right type.
1847   std::vector<Record*> getValueAsListOfDefs(StringRef FieldName) const;
1848 
1849   /// This method looks up the specified field and returns its value as a
1850   /// vector of integers, throwing an exception if the field does not exist or
1851   /// if the value is not the right type.
1852   std::vector<int64_t> getValueAsListOfInts(StringRef FieldName) const;
1853 
1854   /// This method looks up the specified field and returns its value as a
1855   /// vector of strings, throwing an exception if the field does not exist or
1856   /// if the value is not the right type.
1857   std::vector<StringRef> getValueAsListOfStrings(StringRef FieldName) const;
1858 
1859   /// This method looks up the specified field and returns its value as a
1860   /// Record, throwing an exception if the field does not exist or if the value
1861   /// is not the right type.
1862   Record *getValueAsDef(StringRef FieldName) const;
1863 
1864   /// This method looks up the specified field and returns its value as a
1865   /// Record, returning null if the field exists but is "uninitialized" (i.e.
1866   /// set to `?`), and throwing an exception if the field does not exist or if
1867   /// its value is not the right type.
1868   Record *getValueAsOptionalDef(StringRef FieldName) const;
1869 
1870   /// This method looks up the specified field and returns its value as a bit,
1871   /// throwing an exception if the field does not exist or if the value is not
1872   /// the right type.
1873   bool getValueAsBit(StringRef FieldName) const;
1874 
1875   /// This method looks up the specified field and returns its value as a bit.
1876   /// If the field is unset, sets Unset to true and returns false.
1877   bool getValueAsBitOrUnset(StringRef FieldName, bool &Unset) const;
1878 
1879   /// This method looks up the specified field and returns its value as an
1880   /// int64_t, throwing an exception if the field does not exist or if the
1881   /// value is not the right type.
1882   int64_t getValueAsInt(StringRef FieldName) const;
1883 
1884   /// This method looks up the specified field and returns its value as an Dag,
1885   /// throwing an exception if the field does not exist or if the value is not
1886   /// the right type.
1887   DagInit *getValueAsDag(StringRef FieldName) const;
1888 };
1889 
1890 raw_ostream &operator<<(raw_ostream &OS, const Record &R);
1891 
1892 class RecordKeeper {
1893   using RecordMap = std::map<std::string, std::unique_ptr<Record>, std::less<>>;
1894   using GlobalMap = std::map<std::string, Init *, std::less<>>;
1895 
1896 public:
1897   RecordKeeper();
1898   ~RecordKeeper();
1899 
1900   /// Return the internal implementation of the RecordKeeper.
getImpl()1901   detail::RecordKeeperImpl &getImpl() { return *Impl; }
1902 
1903   /// Get the main TableGen input file's name.
getInputFilename()1904   const std::string getInputFilename() const { return InputFilename; }
1905 
1906   /// Get the map of classes.
getClasses()1907   const RecordMap &getClasses() const { return Classes; }
1908 
1909   /// Get the map of records (defs).
getDefs()1910   const RecordMap &getDefs() const { return Defs; }
1911 
1912   /// Get the map of global variables.
getGlobals()1913   const GlobalMap &getGlobals() const { return ExtraGlobals; }
1914 
1915   /// Get the class with the specified name.
getClass(StringRef Name)1916   Record *getClass(StringRef Name) const {
1917     auto I = Classes.find(Name);
1918     return I == Classes.end() ? nullptr : I->second.get();
1919   }
1920 
1921   /// Get the concrete record with the specified name.
getDef(StringRef Name)1922   Record *getDef(StringRef Name) const {
1923     auto I = Defs.find(Name);
1924     return I == Defs.end() ? nullptr : I->second.get();
1925   }
1926 
1927   /// Get the \p Init value of the specified global variable.
getGlobal(StringRef Name)1928   Init *getGlobal(StringRef Name) const {
1929     if (Record *R = getDef(Name))
1930       return R->getDefInit();
1931     auto It = ExtraGlobals.find(Name);
1932     return It == ExtraGlobals.end() ? nullptr : It->second;
1933   }
1934 
saveInputFilename(std::string Filename)1935   void saveInputFilename(std::string Filename) {
1936     InputFilename = Filename;
1937   }
1938 
addClass(std::unique_ptr<Record> R)1939   void addClass(std::unique_ptr<Record> R) {
1940     bool Ins = Classes.insert(std::make_pair(std::string(R->getName()),
1941                                              std::move(R))).second;
1942     (void)Ins;
1943     assert(Ins && "Class already exists");
1944   }
1945 
addDef(std::unique_ptr<Record> R)1946   void addDef(std::unique_ptr<Record> R) {
1947     bool Ins = Defs.insert(std::make_pair(std::string(R->getName()),
1948                                           std::move(R))).second;
1949     (void)Ins;
1950     assert(Ins && "Record already exists");
1951   }
1952 
addExtraGlobal(StringRef Name,Init * I)1953   void addExtraGlobal(StringRef Name, Init *I) {
1954     bool Ins = ExtraGlobals.insert(std::make_pair(std::string(Name), I)).second;
1955     (void)Ins;
1956     assert(!getDef(Name));
1957     assert(Ins && "Global already exists");
1958   }
1959 
1960   Init *getNewAnonymousName();
1961 
1962   /// Start phase timing; called if the --time-phases option is specified.
startPhaseTiming()1963   void startPhaseTiming() {
1964     TimingGroup = new TimerGroup("TableGen", "TableGen Phase Timing");
1965   }
1966 
1967   /// Start timing a phase. Automatically stops any previous phase timer.
1968   void startTimer(StringRef Name);
1969 
1970   /// Stop timing a phase.
1971   void stopTimer();
1972 
1973   /// Start timing the overall backend. If the backend itself starts a timer,
1974   /// then this timer is cleared.
1975   void startBackendTimer(StringRef Name);
1976 
1977   /// Stop timing the overall backend.
1978   void stopBackendTimer();
1979 
1980   /// Stop phase timing and print the report.
stopPhaseTiming()1981   void stopPhaseTiming() {
1982     if (TimingGroup)
1983       delete TimingGroup;
1984   }
1985 
1986   //===--------------------------------------------------------------------===//
1987   // High-level helper methods, useful for tablegen backends.
1988 
1989   /// Get all the concrete records that inherit from the one specified
1990   /// class. The class must be defined.
1991   std::vector<Record *> getAllDerivedDefinitions(StringRef ClassName) const;
1992 
1993   /// Get all the concrete records that inherit from all the specified
1994   /// classes. The classes must be defined.
1995   std::vector<Record *> getAllDerivedDefinitions(
1996       ArrayRef<StringRef> ClassNames) const;
1997 
1998   /// Get all the concrete records that inherit from specified class, if the
1999   /// class is defined. Returns an empty vector if the class is not defined.
2000   std::vector<Record *>
2001   getAllDerivedDefinitionsIfDefined(StringRef ClassName) const;
2002 
2003   void dump() const;
2004 
2005 private:
2006   RecordKeeper(RecordKeeper &&) = delete;
2007   RecordKeeper(const RecordKeeper &) = delete;
2008   RecordKeeper &operator=(RecordKeeper &&) = delete;
2009   RecordKeeper &operator=(const RecordKeeper &) = delete;
2010 
2011   std::string InputFilename;
2012   RecordMap Classes, Defs;
2013   mutable StringMap<std::vector<Record *>> ClassRecordsMap;
2014   GlobalMap ExtraGlobals;
2015 
2016   // These members are for the phase timing feature. We need a timer group,
2017   // the last timer started, and a flag to say whether the last timer
2018   // is the special "backend overall timer."
2019   TimerGroup *TimingGroup = nullptr;
2020   Timer *LastTimer = nullptr;
2021   bool BackendTimer = false;
2022 
2023   /// The internal uniquer implementation of the RecordKeeper.
2024   std::unique_ptr<detail::RecordKeeperImpl> Impl;
2025 };
2026 
2027 /// Sorting predicate to sort record pointers by name.
2028 struct LessRecord {
operatorLessRecord2029   bool operator()(const Record *Rec1, const Record *Rec2) const {
2030     return StringRef(Rec1->getName()).compare_numeric(Rec2->getName()) < 0;
2031   }
2032 };
2033 
2034 /// Sorting predicate to sort record pointers by their
2035 /// unique ID. If you just need a deterministic order, use this, since it
2036 /// just compares two `unsigned`; the other sorting predicates require
2037 /// string manipulation.
2038 struct LessRecordByID {
operatorLessRecordByID2039   bool operator()(const Record *LHS, const Record *RHS) const {
2040     return LHS->getID() < RHS->getID();
2041   }
2042 };
2043 
2044 /// Sorting predicate to sort record pointers by their
2045 /// name field.
2046 struct LessRecordFieldName {
operatorLessRecordFieldName2047   bool operator()(const Record *Rec1, const Record *Rec2) const {
2048     return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name");
2049   }
2050 };
2051 
2052 struct LessRecordRegister {
2053   struct RecordParts {
2054     SmallVector<std::pair< bool, StringRef>, 4> Parts;
2055 
RecordPartsLessRecordRegister::RecordParts2056     RecordParts(StringRef Rec) {
2057       if (Rec.empty())
2058         return;
2059 
2060       size_t Len = 0;
2061       const char *Start = Rec.data();
2062       const char *Curr = Start;
2063       bool IsDigitPart = isDigit(Curr[0]);
2064       for (size_t I = 0, E = Rec.size(); I != E; ++I, ++Len) {
2065         bool IsDigit = isDigit(Curr[I]);
2066         if (IsDigit != IsDigitPart) {
2067           Parts.push_back(std::make_pair(IsDigitPart, StringRef(Start, Len)));
2068           Len = 0;
2069           Start = &Curr[I];
2070           IsDigitPart = isDigit(Curr[I]);
2071         }
2072       }
2073       // Push the last part.
2074       Parts.push_back(std::make_pair(IsDigitPart, StringRef(Start, Len)));
2075     }
2076 
sizeLessRecordRegister::RecordParts2077     size_t size() { return Parts.size(); }
2078 
getPartLessRecordRegister::RecordParts2079     std::pair<bool, StringRef> getPart(size_t i) {
2080       assert (i < Parts.size() && "Invalid idx!");
2081       return Parts[i];
2082     }
2083   };
2084 
operatorLessRecordRegister2085   bool operator()(const Record *Rec1, const Record *Rec2) const {
2086     RecordParts LHSParts(StringRef(Rec1->getName()));
2087     RecordParts RHSParts(StringRef(Rec2->getName()));
2088 
2089     size_t LHSNumParts = LHSParts.size();
2090     size_t RHSNumParts = RHSParts.size();
2091     assert (LHSNumParts && RHSNumParts && "Expected at least one part!");
2092 
2093     if (LHSNumParts != RHSNumParts)
2094       return LHSNumParts < RHSNumParts;
2095 
2096     // We expect the registers to be of the form [_a-zA-Z]+([0-9]*[_a-zA-Z]*)*.
2097     for (size_t I = 0, E = LHSNumParts; I < E; I+=2) {
2098       std::pair<bool, StringRef> LHSPart = LHSParts.getPart(I);
2099       std::pair<bool, StringRef> RHSPart = RHSParts.getPart(I);
2100       // Expect even part to always be alpha.
2101       assert (LHSPart.first == false && RHSPart.first == false &&
2102               "Expected both parts to be alpha.");
2103       if (int Res = LHSPart.second.compare(RHSPart.second))
2104         return Res < 0;
2105     }
2106     for (size_t I = 1, E = LHSNumParts; I < E; I+=2) {
2107       std::pair<bool, StringRef> LHSPart = LHSParts.getPart(I);
2108       std::pair<bool, StringRef> RHSPart = RHSParts.getPart(I);
2109       // Expect odd part to always be numeric.
2110       assert (LHSPart.first == true && RHSPart.first == true &&
2111               "Expected both parts to be numeric.");
2112       if (LHSPart.second.size() != RHSPart.second.size())
2113         return LHSPart.second.size() < RHSPart.second.size();
2114 
2115       unsigned LHSVal, RHSVal;
2116 
2117       bool LHSFailed = LHSPart.second.getAsInteger(10, LHSVal); (void)LHSFailed;
2118       assert(!LHSFailed && "Unable to convert LHS to integer.");
2119       bool RHSFailed = RHSPart.second.getAsInteger(10, RHSVal); (void)RHSFailed;
2120       assert(!RHSFailed && "Unable to convert RHS to integer.");
2121 
2122       if (LHSVal != RHSVal)
2123         return LHSVal < RHSVal;
2124     }
2125     return LHSNumParts < RHSNumParts;
2126   }
2127 };
2128 
2129 raw_ostream &operator<<(raw_ostream &OS, const RecordKeeper &RK);
2130 
2131 //===----------------------------------------------------------------------===//
2132 //  Resolvers
2133 //===----------------------------------------------------------------------===//
2134 
2135 /// Interface for looking up the initializer for a variable name, used by
2136 /// Init::resolveReferences.
2137 class Resolver {
2138   Record *CurRec;
2139   bool IsFinal = false;
2140 
2141 public:
Resolver(Record * CurRec)2142   explicit Resolver(Record *CurRec) : CurRec(CurRec) {}
2143   virtual ~Resolver() = default;
2144 
getCurrentRecord()2145   Record *getCurrentRecord() const { return CurRec; }
2146 
2147   /// Return the initializer for the given variable name (should normally be a
2148   /// StringInit), or nullptr if the name could not be resolved.
2149   virtual Init *resolve(Init *VarName) = 0;
2150 
2151   // Whether bits in a BitsInit should stay unresolved if resolving them would
2152   // result in a ? (UnsetInit). This behavior is used to represent instruction
2153   // encodings by keeping references to unset variables within a record.
keepUnsetBits()2154   virtual bool keepUnsetBits() const { return false; }
2155 
2156   // Whether this is the final resolve step before adding a record to the
2157   // RecordKeeper. Error reporting during resolve and related constant folding
2158   // should only happen when this is true.
isFinal()2159   bool isFinal() const { return IsFinal; }
2160 
setFinal(bool Final)2161   void setFinal(bool Final) { IsFinal = Final; }
2162 };
2163 
2164 /// Resolve arbitrary mappings.
2165 class MapResolver final : public Resolver {
2166   struct MappedValue {
2167     Init *V;
2168     bool Resolved;
2169 
MappedValueMappedValue2170     MappedValue() : V(nullptr), Resolved(false) {}
MappedValueMappedValue2171     MappedValue(Init *V, bool Resolved) : V(V), Resolved(Resolved) {}
2172   };
2173 
2174   DenseMap<Init *, MappedValue> Map;
2175 
2176 public:
Resolver(CurRec)2177   explicit MapResolver(Record *CurRec = nullptr) : Resolver(CurRec) {}
2178 
set(Init * Key,Init * Value)2179   void set(Init *Key, Init *Value) { Map[Key] = {Value, false}; }
2180 
isComplete(Init * VarName)2181   bool isComplete(Init *VarName) const {
2182     auto It = Map.find(VarName);
2183     assert(It != Map.end() && "key must be present in map");
2184     return It->second.V->isComplete();
2185   }
2186 
2187   Init *resolve(Init *VarName) override;
2188 };
2189 
2190 /// Resolve all variables from a record except for unset variables.
2191 class RecordResolver final : public Resolver {
2192   DenseMap<Init *, Init *> Cache;
2193   SmallVector<Init *, 4> Stack;
2194   Init *Name = nullptr;
2195 
2196 public:
RecordResolver(Record & R)2197   explicit RecordResolver(Record &R) : Resolver(&R) {}
2198 
setName(Init * NewName)2199   void setName(Init *NewName) { Name = NewName; }
2200 
2201   Init *resolve(Init *VarName) override;
2202 
keepUnsetBits()2203   bool keepUnsetBits() const override { return true; }
2204 };
2205 
2206 /// Delegate resolving to a sub-resolver, but shadow some variable names.
2207 class ShadowResolver final : public Resolver {
2208   Resolver &R;
2209   DenseSet<Init *> Shadowed;
2210 
2211 public:
ShadowResolver(Resolver & R)2212   explicit ShadowResolver(Resolver &R)
2213       : Resolver(R.getCurrentRecord()), R(R) {
2214     setFinal(R.isFinal());
2215   }
2216 
addShadow(Init * Key)2217   void addShadow(Init *Key) { Shadowed.insert(Key); }
2218 
resolve(Init * VarName)2219   Init *resolve(Init *VarName) override {
2220     if (Shadowed.count(VarName))
2221       return nullptr;
2222     return R.resolve(VarName);
2223   }
2224 };
2225 
2226 /// (Optionally) delegate resolving to a sub-resolver, and keep track whether
2227 /// there were unresolved references.
2228 class TrackUnresolvedResolver final : public Resolver {
2229   Resolver *R;
2230   bool FoundUnresolved = false;
2231 
2232 public:
2233   explicit TrackUnresolvedResolver(Resolver *R = nullptr)
2234       : Resolver(R ? R->getCurrentRecord() : nullptr), R(R) {}
2235 
foundUnresolved()2236   bool foundUnresolved() const { return FoundUnresolved; }
2237 
2238   Init *resolve(Init *VarName) override;
2239 };
2240 
2241 /// Do not resolve anything, but keep track of whether a given variable was
2242 /// referenced.
2243 class HasReferenceResolver final : public Resolver {
2244   Init *VarNameToTrack;
2245   bool Found = false;
2246 
2247 public:
HasReferenceResolver(Init * VarNameToTrack)2248   explicit HasReferenceResolver(Init *VarNameToTrack)
2249       : Resolver(nullptr), VarNameToTrack(VarNameToTrack) {}
2250 
found()2251   bool found() const { return Found; }
2252 
2253   Init *resolve(Init *VarName) override;
2254 };
2255 
2256 void EmitDetailedRecords(RecordKeeper &RK, raw_ostream &OS);
2257 void EmitJSON(RecordKeeper &RK, raw_ostream &OS);
2258 
2259 } // end namespace llvm
2260 
2261 #endif // LLVM_TABLEGEN_RECORD_H
2262