Skip to content

Commit 463c9d2

Browse files
authored
[clang][TableGen] Change ASTTableGen to use const Record pointers (#108193)
Change ASTTableGen to use const Record pointers. 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 7c6592f commit 463c9d2

File tree

2 files changed

+27
-29
lines changed

2 files changed

+27
-29
lines changed

clang/utils/TableGen/ASTTableGen.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ llvm::StringRef clang::tblgen::HasProperties::getName() const {
3131
}
3232
}
3333

34-
static StringRef removeExpectedNodeNameSuffix(Record *node, StringRef suffix) {
34+
static StringRef removeExpectedNodeNameSuffix(const Record *node,
35+
StringRef suffix) {
3536
StringRef nodeName = node->getName();
3637
if (!nodeName.ends_with(suffix)) {
3738
PrintFatalError(node->getLoc(),
@@ -105,22 +106,18 @@ static void visitASTNodeRecursive(ASTNode node, ASTNode base,
105106
}
106107
}
107108

108-
static void visitHierarchy(RecordKeeper &records,
109-
StringRef nodeClassName,
109+
static void visitHierarchy(const RecordKeeper &records, StringRef nodeClassName,
110110
ASTNodeHierarchyVisitor<ASTNode> visit) {
111111
// Check for the node class, just as a basic correctness check.
112112
if (!records.getClass(nodeClassName)) {
113113
PrintFatalError(Twine("cannot find definition for node class ")
114114
+ nodeClassName);
115115
}
116116

117-
// Find all the nodes in the hierarchy.
118-
auto nodes = records.getAllDerivedDefinitions(nodeClassName);
119-
120-
// Derive the child map.
117+
// Derive the child map for all nodes in the hierarchy.
121118
ChildMap hierarchy;
122119
ASTNode root;
123-
for (ASTNode node : nodes) {
120+
for (ASTNode node : records.getAllDerivedDefinitions(nodeClassName)) {
124121
if (auto base = node.getBase())
125122
hierarchy.insert(std::make_pair(base, node));
126123
else if (root)
@@ -136,8 +133,8 @@ static void visitHierarchy(RecordKeeper &records,
136133
visitASTNodeRecursive(root, ASTNode(), hierarchy, visit);
137134
}
138135

139-
void clang::tblgen::visitASTNodeHierarchyImpl(RecordKeeper &records,
140-
StringRef nodeClassName,
141-
ASTNodeHierarchyVisitor<ASTNode> visit) {
136+
void clang::tblgen::visitASTNodeHierarchyImpl(
137+
const RecordKeeper &records, StringRef nodeClassName,
138+
ASTNodeHierarchyVisitor<ASTNode> visit) {
142139
visitHierarchy(records, nodeClassName, visit);
143140
}

clang/utils/TableGen/ASTTableGen.h

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,18 @@ namespace clang {
8787
namespace tblgen {
8888

8989
class WrappedRecord {
90-
llvm::Record *Record;
90+
const llvm::Record *Record;
9191

9292
protected:
93-
WrappedRecord(llvm::Record *record = nullptr) : Record(record) {}
93+
WrappedRecord(const llvm::Record *record = nullptr) : Record(record) {}
9494

95-
llvm::Record *get() const {
95+
const llvm::Record *get() const {
9696
assert(Record && "accessing null record");
9797
return Record;
9898
}
9999

100100
public:
101-
llvm::Record *getRecord() const { return Record; }
101+
const llvm::Record *getRecord() const { return Record; }
102102

103103
explicit operator bool() const { return Record != nullptr; }
104104

@@ -144,7 +144,7 @@ class HasProperties : public WrappedRecord {
144144
public:
145145
static constexpr llvm::StringRef ClassName = HasPropertiesClassName;
146146

147-
HasProperties(llvm::Record *record = nullptr) : WrappedRecord(record) {}
147+
HasProperties(const llvm::Record *record = nullptr) : WrappedRecord(record) {}
148148

149149
llvm::StringRef getName() const;
150150

@@ -157,7 +157,7 @@ class HasProperties : public WrappedRecord {
157157
/// in one of Clang's AST hierarchies.
158158
class ASTNode : public HasProperties {
159159
public:
160-
ASTNode(llvm::Record *record = nullptr) : HasProperties(record) {}
160+
ASTNode(const llvm::Record *record = nullptr) : HasProperties(record) {}
161161

162162
llvm::StringRef getName() const {
163163
return get()->getName();
@@ -180,7 +180,7 @@ class ASTNode : public HasProperties {
180180

181181
class DeclNode : public ASTNode {
182182
public:
183-
DeclNode(llvm::Record *record = nullptr) : ASTNode(record) {}
183+
DeclNode(const llvm::Record *record = nullptr) : ASTNode(record) {}
184184

185185
llvm::StringRef getId() const;
186186
std::string getClassName() const;
@@ -202,7 +202,7 @@ class DeclNode : public ASTNode {
202202

203203
class TypeNode : public ASTNode {
204204
public:
205-
TypeNode(llvm::Record *record = nullptr) : ASTNode(record) {}
205+
TypeNode(const llvm::Record *record = nullptr) : ASTNode(record) {}
206206

207207
llvm::StringRef getId() const;
208208
llvm::StringRef getClassName() const;
@@ -224,7 +224,7 @@ class TypeNode : public ASTNode {
224224

225225
class StmtNode : public ASTNode {
226226
public:
227-
StmtNode(llvm::Record *record = nullptr) : ASTNode(record) {}
227+
StmtNode(const llvm::Record *record = nullptr) : ASTNode(record) {}
228228

229229
std::string getId() const;
230230
llvm::StringRef getClassName() const;
@@ -247,7 +247,7 @@ class StmtNode : public ASTNode {
247247
/// The type of a property.
248248
class PropertyType : public WrappedRecord {
249249
public:
250-
PropertyType(llvm::Record *record = nullptr) : WrappedRecord(record) {}
250+
PropertyType(const llvm::Record *record = nullptr) : WrappedRecord(record) {}
251251

252252
/// Is this a generic specialization (i.e. `Array<T>` or `Optional<T>`)?
253253
bool isGenericSpecialization() const {
@@ -331,7 +331,7 @@ class PropertyType : public WrappedRecord {
331331
/// A rule for returning the kind of a type.
332332
class TypeKindRule : public WrappedRecord {
333333
public:
334-
TypeKindRule(llvm::Record *record = nullptr) : WrappedRecord(record) {}
334+
TypeKindRule(const llvm::Record *record = nullptr) : WrappedRecord(record) {}
335335

336336
/// Return the type to which this applies.
337337
PropertyType getParentType() const {
@@ -361,7 +361,7 @@ class TypeKindRule : public WrappedRecord {
361361
/// An implementation case of a property type.
362362
class TypeCase : public HasProperties {
363363
public:
364-
TypeCase(llvm::Record *record = nullptr) : HasProperties(record) {}
364+
TypeCase(const llvm::Record *record = nullptr) : HasProperties(record) {}
365365

366366
/// Return the name of this case.
367367
llvm::StringRef getCaseName() const {
@@ -381,7 +381,7 @@ class TypeCase : public HasProperties {
381381
/// A property of an AST node.
382382
class Property : public WrappedRecord {
383383
public:
384-
Property(llvm::Record *record = nullptr) : WrappedRecord(record) {}
384+
Property(const llvm::Record *record = nullptr) : WrappedRecord(record) {}
385385

386386
/// Return the name of this property.
387387
llvm::StringRef getName() const {
@@ -417,7 +417,8 @@ class Property : public WrappedRecord {
417417
/// a value (which is actually done when writing the value out).
418418
class ReadHelperRule : public WrappedRecord {
419419
public:
420-
ReadHelperRule(llvm::Record *record = nullptr) : WrappedRecord(record) {}
420+
ReadHelperRule(const llvm::Record *record = nullptr)
421+
: WrappedRecord(record) {}
421422

422423
/// Return the class for which this is a creation rule.
423424
/// Should never be abstract.
@@ -437,7 +438,7 @@ class ReadHelperRule : public WrappedRecord {
437438
/// A rule for how to create an AST node from its properties.
438439
class CreationRule : public WrappedRecord {
439440
public:
440-
CreationRule(llvm::Record *record = nullptr) : WrappedRecord(record) {}
441+
CreationRule(const llvm::Record *record = nullptr) : WrappedRecord(record) {}
441442

442443
/// Return the class for which this is a creation rule.
443444
/// Should never be abstract.
@@ -457,7 +458,7 @@ class CreationRule : public WrappedRecord {
457458
/// A rule which overrides the standard rules for serializing an AST node.
458459
class OverrideRule : public WrappedRecord {
459460
public:
460-
OverrideRule(llvm::Record *record = nullptr) : WrappedRecord(record) {}
461+
OverrideRule(const llvm::Record *record = nullptr) : WrappedRecord(record) {}
461462

462463
/// Return the class for which this is an override rule.
463464
/// Should never be abstract.
@@ -483,12 +484,12 @@ template <class NodeClass>
483484
using ASTNodeHierarchyVisitor =
484485
llvm::function_ref<void(NodeClass node, NodeClass base)>;
485486

486-
void visitASTNodeHierarchyImpl(llvm::RecordKeeper &records,
487+
void visitASTNodeHierarchyImpl(const llvm::RecordKeeper &records,
487488
llvm::StringRef nodeClassName,
488489
ASTNodeHierarchyVisitor<ASTNode> visit);
489490

490491
template <class NodeClass>
491-
void visitASTNodeHierarchy(llvm::RecordKeeper &records,
492+
void visitASTNodeHierarchy(const llvm::RecordKeeper &records,
492493
ASTNodeHierarchyVisitor<NodeClass> visit) {
493494
visitASTNodeHierarchyImpl(records, NodeClass::getTableGenNodeClassName(),
494495
[visit](ASTNode node, ASTNode base) {

0 commit comments

Comments
 (0)