Skip to content

Commit 74ca51e

Browse files
authored
[NFC][TableGen] Use private inheritance for TrailingObjects (#138027)
- Use private inheritance for `TrailingObjects` as suggested in the documentation for `TrailingObjects` class. - Move std::uninitialized_copy calls from various `get` functions to the constructors of respective classes. - Eliminate `NumArgNames` from `DagInit`. Its always equal to `NumArgs`. - Eliminate unused `name_size/name_empty` from `DagInit`.
1 parent f33dc8e commit 74ca51e

File tree

2 files changed

+117
-114
lines changed

2 files changed

+117
-114
lines changed

llvm/include/llvm/TableGen/Record.h

Lines changed: 32 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -230,14 +230,14 @@ class DagRecTy : public RecTy {
230230
/// are not the superclass of some other listed class.
231231
class 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

242242
public:
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.
588588
class 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

596596
public:
597597
BitsInit(const BitsInit &) = delete;
@@ -757,15 +757,15 @@ class StringInit final : public TypedInit {
757757
///
758758
class 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

763764
public:
764765
using const_iterator = const Init *const *;
765766

766767
private:
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

770770
public:
771771
ListInit(const ListInit &) = delete;
@@ -1019,12 +1019,13 @@ class TernOpInit final : public OpInit, public FoldingSetNode {
10191019
/// Otherwise reports an error.
10201020
class 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 {
13371333
class 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 {
14381431
class 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

Comments
 (0)