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