@@ -230,14 +230,14 @@ class DagRecTy : public RecTy {
230230// / are not the superclass of some other listed class.
231231class RecordRecTy final : public RecTy,
232232 public FoldingSetNode,
233- public TrailingObjects<RecordRecTy, const Record *> {
233+ private TrailingObjects<RecordRecTy, const Record *> {
234+ friend TrailingObjects;
234235 friend class Record ;
235236 friend detail::RecordKeeperImpl;
236237
237238 unsigned NumClasses;
238239
239- explicit RecordRecTy (RecordKeeper &RK, unsigned Num)
240- : RecTy(RecordRecTyKind, RK), NumClasses(Num) {}
240+ explicit RecordRecTy (RecordKeeper &RK, ArrayRef<const Record *> Classes);
241241
242242public:
243243 RecordRecTy (const RecordRecTy &) = delete ;
@@ -587,11 +587,11 @@ class BitInit final : public TypedInit {
587587// / It contains a vector of bits, whose size is determined by the type.
588588class BitsInit final : public TypedInit,
589589 public FoldingSetNode,
590- public TrailingObjects<BitsInit, const Init *> {
590+ private TrailingObjects<BitsInit, const Init *> {
591+ friend TrailingObjects;
591592 unsigned NumBits;
592593
593- BitsInit (RecordKeeper &RK, unsigned N)
594- : TypedInit(IK_BitsInit, BitsRecTy::get(RK, N)), NumBits(N) {}
594+ BitsInit (RecordKeeper &RK, ArrayRef<const Init *> Bits);
595595
596596public:
597597 BitsInit (const BitsInit &) = delete ;
@@ -757,15 +757,15 @@ class StringInit final : public TypedInit {
757757// /
758758class ListInit final : public TypedInit,
759759 public FoldingSetNode,
760- public TrailingObjects<ListInit, const Init *> {
760+ private TrailingObjects<ListInit, const Init *> {
761+ friend TrailingObjects;
761762 unsigned NumValues;
762763
763764public:
764765 using const_iterator = const Init *const *;
765766
766767private:
767- explicit ListInit (unsigned N, const RecTy *EltTy)
768- : TypedInit(IK_ListInit, ListRecTy::get(EltTy)), NumValues(N) {}
768+ explicit ListInit (ArrayRef<const Init *> Elements, const RecTy *EltTy);
769769
770770public:
771771 ListInit (const ListInit &) = delete ;
@@ -1019,12 +1019,13 @@ class TernOpInit final : public OpInit, public FoldingSetNode {
10191019// / Otherwise reports an error.
10201020class CondOpInit final : public TypedInit,
10211021 public FoldingSetNode,
1022- public TrailingObjects<CondOpInit, const Init *> {
1022+ private TrailingObjects<CondOpInit, const Init *> {
1023+ friend TrailingObjects;
10231024 unsigned NumConds;
10241025 const RecTy *ValType;
10251026
1026- CondOpInit (unsigned NC, const RecTy *Type)
1027- : TypedInit(IK_CondOpInit, Type), NumConds(NC), ValType( Type) {}
1027+ CondOpInit (ArrayRef< const Init *> Conds, ArrayRef< const Init *> Values,
1028+ const RecTy * Type);
10281029
10291030 size_t numTrailingObjects (OverloadToken<Init *>) const {
10301031 return 2 *NumConds;
@@ -1038,24 +1039,19 @@ class CondOpInit final : public TypedInit,
10381039 return I->getKind () == IK_CondOpInit;
10391040 }
10401041
1041- static const CondOpInit *get (ArrayRef<const Init *> C,
1042- ArrayRef<const Init *> V, const RecTy *Type);
1042+ static const CondOpInit *get (ArrayRef<const Init *> Conds,
1043+ ArrayRef<const Init *> Values,
1044+ const RecTy *Type);
10431045
10441046 void Profile (FoldingSetNodeID &ID) const ;
10451047
10461048 const RecTy *getValType () const { return ValType; }
10471049
10481050 unsigned getNumConds () const { return NumConds; }
10491051
1050- const Init *getCond (unsigned Num) const {
1051- assert (Num < NumConds && " Condition number out of range!" );
1052- return getTrailingObjects<const Init *>()[Num];
1053- }
1052+ const Init *getCond (unsigned Num) const { return getConds ()[Num]; }
10541053
1055- const Init *getVal (unsigned Num) const {
1056- assert (Num < NumConds && " Val number out of range!" );
1057- return getTrailingObjects<const Init *>()[Num + NumConds];
1058- }
1054+ const Init *getVal (unsigned Num) const { return getVals ()[Num]; }
10591055
10601056 ArrayRef<const Init *> getConds () const {
10611057 return ArrayRef (getTrailingObjects<const Init *>(), NumConds);
@@ -1337,13 +1333,15 @@ class DefInit final : public TypedInit {
13371333class VarDefInit final
13381334 : public TypedInit,
13391335 public FoldingSetNode,
1340- public TrailingObjects<VarDefInit, const ArgumentInit *> {
1336+ private TrailingObjects<VarDefInit, const ArgumentInit *> {
1337+ friend TrailingObjects;
13411338 SMLoc Loc;
13421339 const Record *Class;
13431340 const DefInit *Def = nullptr ; // after instantiation
13441341 unsigned NumArgs;
13451342
1346- explicit VarDefInit (SMLoc Loc, const Record *Class, unsigned N);
1343+ explicit VarDefInit (SMLoc Loc, const Record *Class,
1344+ ArrayRef<const ArgumentInit *> Args);
13471345
13481346 const DefInit *instantiate ();
13491347
@@ -1367,23 +1365,18 @@ class VarDefInit final
13671365
13681366 std::string getAsString () const override ;
13691367
1370- const ArgumentInit *getArg (unsigned i) const {
1371- assert (i < NumArgs && " Argument index out of range!" );
1372- return getTrailingObjects<const ArgumentInit *>()[i];
1373- }
1368+ const ArgumentInit *getArg (unsigned i) const { return args ()[i]; }
13741369
13751370 using const_iterator = const ArgumentInit *const *;
13761371
1377- const_iterator args_begin () const {
1378- return getTrailingObjects<const ArgumentInit *>();
1379- }
1380- const_iterator args_end () const { return args_begin () + NumArgs; }
1372+ const_iterator args_begin () const { return args ().begin (); }
1373+ const_iterator args_end () const { return args ().end (); }
13811374
13821375 size_t args_size () const { return NumArgs; }
13831376 bool args_empty () const { return NumArgs == 0 ; }
13841377
13851378 ArrayRef<const ArgumentInit *> args () const {
1386- return ArrayRef (args_begin (), NumArgs);
1379+ return ArrayRef (getTrailingObjects< const ArgumentInit *> (), NumArgs);
13871380 }
13881381
13891382 const Init *getBit (unsigned Bit) const override {
@@ -1438,18 +1431,15 @@ class FieldInit final : public TypedInit {
14381431class DagInit final
14391432 : public TypedInit,
14401433 public FoldingSetNode,
1441- public TrailingObjects<DagInit, const Init *, const StringInit *> {
1434+ private TrailingObjects<DagInit, const Init *, const StringInit *> {
14421435 friend TrailingObjects;
14431436
14441437 const Init *Val;
14451438 const StringInit *ValName;
14461439 unsigned NumArgs;
1447- unsigned NumArgNames;
14481440
1449- DagInit (const Init *V, const StringInit *VN, unsigned NumArgs,
1450- unsigned NumArgNames)
1451- : TypedInit(IK_DagInit, DagRecTy::get(V->getRecordKeeper ())), Val(V),
1452- ValName(VN), NumArgs(NumArgs), NumArgNames(NumArgNames) {}
1441+ DagInit (const Init *V, const StringInit *VN, ArrayRef<const Init *> Args,
1442+ ArrayRef<const StringInit *> ArgNames);
14531443
14541444 size_t numTrailingObjects (OverloadToken<const Init *>) const {
14551445 return NumArgs;
@@ -1483,18 +1473,14 @@ class DagInit final
14831473
14841474 unsigned getNumArgs () const { return NumArgs; }
14851475
1486- const Init *getArg (unsigned Num) const {
1487- assert (Num < NumArgs && " Arg number out of range!" );
1488- return getTrailingObjects<const Init *>()[Num];
1489- }
1476+ const Init *getArg (unsigned Num) const { return getArgs ()[Num]; }
14901477
14911478 // / This method looks up the specified argument name and returns its argument
14921479 // / number or std::nullopt if that argument name does not exist.
14931480 std::optional<unsigned > getArgNo (StringRef Name) const ;
14941481
14951482 const StringInit *getArgName (unsigned Num) const {
1496- assert (Num < NumArgNames && " Arg number out of range!" );
1497- return getTrailingObjects<const StringInit *>()[Num];
1483+ return getArgNames ()[Num];
14981484 }
14991485
15001486 StringRef getArgNameStr (unsigned Num) const {
@@ -1507,7 +1493,7 @@ class DagInit final
15071493 }
15081494
15091495 ArrayRef<const StringInit *> getArgNames () const {
1510- return ArrayRef (getTrailingObjects<const StringInit *>(), NumArgNames );
1496+ return ArrayRef (getTrailingObjects<const StringInit *>(), NumArgs );
15111497 }
15121498
15131499 const Init *resolveReferences (Resolver &R) const override ;
@@ -1528,9 +1514,6 @@ class DagInit final
15281514 inline const_name_iterator name_begin () const { return getArgNames ().begin ();}
15291515 inline const_name_iterator name_end () const { return getArgNames ().end (); }
15301516
1531- inline size_t name_size () const { return NumArgNames; }
1532- inline bool name_empty () const { return NumArgNames == 0 ; }
1533-
15341517 const Init *getBit (unsigned Bit) const override {
15351518 llvm_unreachable (" Illegal bit reference off dag" );
15361519 }
0 commit comments