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