Skip to content

Commit 7ac474b

Browse files
authored
[LLVM][TableGen] Change SeachableTableEmitter to use const RecordKeeper (#110032)
Change SeachableTableEmitter to use const RecordKeeper. Also change RecordRecTy to use const Record pointers for its classes. This is a part of effort to have better const correctness in TableGen backends: https://discourse.llvm.org/t/psa-planned-changes-to-tablegen-getallderiveddefinitions-api-potential-downstream-breakages/81089
1 parent 4b95806 commit 7ac474b

File tree

7 files changed

+115
-106
lines changed

7 files changed

+115
-106
lines changed

clang/utils/TableGen/ClangAttrEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1866,7 +1866,7 @@ static LateAttrParseKind getLateAttrParseKind(const Record *Attr) {
18661866
auto *LAPK = Attr->getValueAsDef(LateParsedStr);
18671867

18681868
// Typecheck the `LateParsed` field.
1869-
SmallVector<Record *, 1> SuperClasses;
1869+
SmallVector<const Record *, 1> SuperClasses;
18701870
LAPK->getDirectSuperClasses(SuperClasses);
18711871
if (SuperClasses.size() != 1)
18721872
PrintFatalError(Attr, "Field `" + Twine(LateParsedStr) +

llvm/include/llvm/TableGen/Record.h

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -226,8 +226,9 @@ class DagRecTy : public RecTy {
226226
///
227227
/// The list of superclasses is non-redundant, i.e. only contains classes that
228228
/// are not the superclass of some other listed class.
229-
class RecordRecTy final : public RecTy, public FoldingSetNode,
230-
public TrailingObjects<RecordRecTy, Record *> {
229+
class RecordRecTy final : public RecTy,
230+
public FoldingSetNode,
231+
public TrailingObjects<RecordRecTy, const Record *> {
231232
friend class Record;
232233
friend detail::RecordKeeperImpl;
233234

@@ -248,23 +249,23 @@ class RecordRecTy final : public RecTy, public FoldingSetNode,
248249
}
249250

250251
/// 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);
252+
static RecordRecTy *get(RecordKeeper &RK, ArrayRef<const Record *> Classes);
253+
static RecordRecTy *get(const Record *Class);
253254

254255
void Profile(FoldingSetNodeID &ID) const;
255256

256-
ArrayRef<Record *> getClasses() const {
257-
return ArrayRef(getTrailingObjects<Record *>(), NumClasses);
257+
ArrayRef<const Record *> getClasses() const {
258+
return ArrayRef(getTrailingObjects<const Record *>(), NumClasses);
258259
}
259260

260-
using const_record_iterator = Record * const *;
261+
using const_record_iterator = const Record *const *;
261262

262263
const_record_iterator classes_begin() const { return getClasses().begin(); }
263264
const_record_iterator classes_end() const { return getClasses().end(); }
264265

265266
std::string getAsString() const override;
266267

267-
bool isSubClassOf(Record *Class) const;
268+
bool isSubClassOf(const Record *Class) const;
268269
bool typeIsConvertibleTo(const RecTy *RHS) const override;
269270

270271
bool typeIsA(const RecTy *RHS) const override;
@@ -1763,7 +1764,7 @@ class Record {
17631764
bool hasDirectSuperClass(const Record *SuperClass) const;
17641765

17651766
/// Append the direct superclasses of this record to Classes.
1766-
void getDirectSuperClasses(SmallVectorImpl<Record *> &Classes) const;
1767+
void getDirectSuperClasses(SmallVectorImpl<const Record *> &Classes) const;
17671768

17681769
bool isTemplateArg(Init *Name) const {
17691770
return llvm::is_contained(TemplateArgs, Name);

llvm/lib/TableGen/Record.cpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -226,22 +226,22 @@ std::string DagRecTy::getAsString() const {
226226
}
227227

228228
static void ProfileRecordRecTy(FoldingSetNodeID &ID,
229-
ArrayRef<Record *> Classes) {
229+
ArrayRef<const Record *> Classes) {
230230
ID.AddInteger(Classes.size());
231-
for (Record *R : Classes)
231+
for (const Record *R : Classes)
232232
ID.AddPointer(R);
233233
}
234234

235235
RecordRecTy *RecordRecTy::get(RecordKeeper &RK,
236-
ArrayRef<Record *> UnsortedClasses) {
236+
ArrayRef<const Record *> UnsortedClasses) {
237237
detail::RecordKeeperImpl &RKImpl = RK.getImpl();
238238
if (UnsortedClasses.empty())
239239
return &RKImpl.AnyRecord;
240240

241241
FoldingSet<RecordRecTy> &ThePool = RKImpl.RecordTypePool;
242242

243-
SmallVector<Record *, 4> Classes(UnsortedClasses);
244-
llvm::sort(Classes, [](Record *LHS, Record *RHS) {
243+
SmallVector<const Record *, 4> Classes(UnsortedClasses);
244+
llvm::sort(Classes, [](const Record *LHS, const Record *RHS) {
245245
return LHS->getNameInitAsString() < RHS->getNameInitAsString();
246246
});
247247

@@ -263,16 +263,16 @@ RecordRecTy *RecordRecTy::get(RecordKeeper &RK,
263263
#endif
264264

265265
void *Mem = RKImpl.Allocator.Allocate(
266-
totalSizeToAlloc<Record *>(Classes.size()), alignof(RecordRecTy));
266+
totalSizeToAlloc<const Record *>(Classes.size()), alignof(RecordRecTy));
267267
RecordRecTy *Ty = new (Mem) RecordRecTy(RK, Classes.size());
268268
std::uninitialized_copy(Classes.begin(), Classes.end(),
269-
Ty->getTrailingObjects<Record *>());
269+
Ty->getTrailingObjects<const Record *>());
270270
ThePool.InsertNode(Ty, IP);
271271
return Ty;
272272
}
273-
RecordRecTy *RecordRecTy::get(Record *Class) {
273+
RecordRecTy *RecordRecTy::get(const Record *Class) {
274274
assert(Class && "unexpected null class");
275-
return get(Class->getRecords(), Class);
275+
return get(Class->getRecords(), {Class});
276276
}
277277

278278
void RecordRecTy::Profile(FoldingSetNodeID &ID) const {
@@ -285,7 +285,7 @@ std::string RecordRecTy::getAsString() const {
285285

286286
std::string Str = "{";
287287
bool First = true;
288-
for (Record *R : getClasses()) {
288+
for (const Record *R : getClasses()) {
289289
if (!First)
290290
Str += ", ";
291291
First = false;
@@ -295,11 +295,10 @@ std::string RecordRecTy::getAsString() const {
295295
return Str;
296296
}
297297

298-
bool RecordRecTy::isSubClassOf(Record *Class) const {
299-
return llvm::any_of(getClasses(), [Class](Record *MySuperClass) {
300-
return MySuperClass == Class ||
301-
MySuperClass->isSubClassOf(Class);
302-
});
298+
bool RecordRecTy::isSubClassOf(const Record *Class) const {
299+
return llvm::any_of(getClasses(), [Class](const Record *MySuperClass) {
300+
return MySuperClass == Class || MySuperClass->isSubClassOf(Class);
301+
});
303302
}
304303

305304
bool RecordRecTy::typeIsConvertibleTo(const RecTy *RHS) const {
@@ -310,21 +309,21 @@ bool RecordRecTy::typeIsConvertibleTo(const RecTy *RHS) const {
310309
if (!RTy)
311310
return false;
312311

313-
return llvm::all_of(RTy->getClasses(), [this](Record *TargetClass) {
314-
return isSubClassOf(TargetClass);
315-
});
312+
return llvm::all_of(RTy->getClasses(), [this](const Record *TargetClass) {
313+
return isSubClassOf(TargetClass);
314+
});
316315
}
317316

318317
bool RecordRecTy::typeIsA(const RecTy *RHS) const {
319318
return typeIsConvertibleTo(RHS);
320319
}
321320

322321
static RecordRecTy *resolveRecordTypes(RecordRecTy *T1, RecordRecTy *T2) {
323-
SmallVector<Record *, 4> CommonSuperClasses;
324-
SmallVector<Record *, 4> Stack(T1->getClasses());
322+
SmallVector<const Record *, 4> CommonSuperClasses;
323+
SmallVector<const Record *, 4> Stack(T1->getClasses());
325324

326325
while (!Stack.empty()) {
327-
Record *R = Stack.pop_back_val();
326+
const Record *R = Stack.pop_back_val();
328327

329328
if (T2->isSubClassOf(R)) {
330329
CommonSuperClasses.push_back(R);
@@ -2162,8 +2161,8 @@ std::string ExistsOpInit::getAsString() const {
21622161

21632162
RecTy *TypedInit::getFieldType(StringInit *FieldName) const {
21642163
if (RecordRecTy *RecordType = dyn_cast<RecordRecTy>(getType())) {
2165-
for (Record *Rec : RecordType->getClasses()) {
2166-
if (RecordVal *Field = Rec->getValue(FieldName))
2164+
for (const Record *Rec : RecordType->getClasses()) {
2165+
if (const RecordVal *Field = Rec->getValue(FieldName))
21672166
return Field->getType();
21682167
}
21692168
}
@@ -2831,7 +2830,7 @@ void Record::checkName() {
28312830
}
28322831

28332832
RecordRecTy *Record::getType() const {
2834-
SmallVector<Record *, 4> DirectSCs;
2833+
SmallVector<const Record *, 4> DirectSCs;
28352834
getDirectSuperClasses(DirectSCs);
28362835
return RecordRecTy::get(TrackedRecords, DirectSCs);
28372836
}
@@ -2882,7 +2881,8 @@ bool Record::hasDirectSuperClass(const Record *Superclass) const {
28822881
return false;
28832882
}
28842883

2885-
void Record::getDirectSuperClasses(SmallVectorImpl<Record *> &Classes) const {
2884+
void Record::getDirectSuperClasses(
2885+
SmallVectorImpl<const Record *> &Classes) const {
28862886
ArrayRef<std::pair<Record *, SMRange>> SCs = getSuperClasses();
28872887

28882888
while (!SCs.empty()) {

llvm/lib/TableGen/TGParser.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3004,9 +3004,9 @@ Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) {
30043004
DI->getDef()->getValue(FieldName)->addReferenceLoc(FieldNameLoc);
30053005
} else if (auto *TI = dyn_cast<TypedInit>(Result)) {
30063006
if (auto *RecTy = dyn_cast<RecordRecTy>(TI->getType())) {
3007-
for (Record *R : RecTy->getClasses())
3007+
for (const Record *R : RecTy->getClasses())
30083008
if (auto *RV = R->getValue(FieldName))
3009-
RV->addReferenceLoc(FieldNameLoc);
3009+
const_cast<RecordVal *>(RV)->addReferenceLoc(FieldNameLoc);
30103010
}
30113011
}
30123012
}

0 commit comments

Comments
 (0)