Skip to content

Commit 65e69f7

Browse files
authored
[NFC][TableGen] Change Record::getSuperClasses to use const Record* (#110845)
Change `Record::getSuperClasses` to return a const pointer to the superclass records. 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 bccd37f commit 65e69f7

File tree

9 files changed

+34
-38
lines changed

9 files changed

+34
-38
lines changed

clang/utils/TableGen/ClangAttrEmitter.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,9 +1529,8 @@ createArgument(const Record &Arg, StringRef Attr,
15291529

15301530
if (!Ptr) {
15311531
// Search in reverse order so that the most-derived type is handled first.
1532-
ArrayRef<std::pair<Record*, SMRange>> Bases = Search->getSuperClasses();
1533-
for (const auto &Base : reverse(Bases)) {
1534-
if ((Ptr = createArgument(Arg, Attr, Base.first)))
1532+
for (const auto &[Base, _] : reverse(Search->getSuperClasses())) {
1533+
if ((Ptr = createArgument(Arg, Attr, Base)))
15351534
break;
15361535
}
15371536
}
@@ -2744,12 +2743,11 @@ static void emitAttributes(const RecordKeeper &Records, raw_ostream &OS,
27442743
if (!R.getValueAsBit("ASTNode"))
27452744
continue;
27462745

2747-
ArrayRef<std::pair<Record *, SMRange>> Supers = R.getSuperClasses();
2746+
ArrayRef<std::pair<const Record *, SMRange>> Supers = R.getSuperClasses();
27482747
assert(!Supers.empty() && "Forgot to specify a superclass for the attr");
27492748
std::string SuperName;
27502749
bool Inheritable = false;
2751-
for (const auto &Super : reverse(Supers)) {
2752-
const Record *R = Super.first;
2750+
for (const auto &[R, _] : reverse(Supers)) {
27532751
if (R->getName() != "TargetSpecificAttr" &&
27542752
R->getName() != "DeclOrTypeAttr" && SuperName.empty())
27552753
SuperName = std::string(R->getName());
@@ -3434,7 +3432,7 @@ namespace {
34343432
}
34353433

34363434
private:
3437-
AttrClass *findClassByRecord(Record *R) const {
3435+
AttrClass *findClassByRecord(const Record *R) const {
34383436
for (auto &Class : Classes) {
34393437
if (Class->TheRecord == R)
34403438
return Class.get();
@@ -4739,8 +4737,8 @@ void EmitClangAttrParsedAttrImpl(const RecordKeeper &Records, raw_ostream &OS) {
47394737
if (Arg->getValueAsBitOrUnset("Fake", UnusedUnset))
47404738
continue;
47414739
ArgNames.push_back(Arg->getValueAsString("Name").str());
4742-
for (const auto &Class : Arg->getSuperClasses()) {
4743-
if (Class.first->getName().starts_with("Variadic")) {
4740+
for (const auto &[Class, _] : Arg->getSuperClasses()) {
4741+
if (Class->getName().starts_with("Variadic")) {
47444742
ArgNames.back().append("...");
47454743
break;
47464744
}

llvm/docs/TableGen/BackGuide.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ iterates over the pairs in the returned array.
624624

625625
.. code-block:: text
626626
627-
ArrayRef<std::pair<Record *, SMRange>>
627+
ArrayRef<std::pair<const Record *, SMRange>>
628628
Superclasses = Prototype->getSuperClasses();
629629
for (const auto &SuperPair : Superclasses) {
630630
...

llvm/include/llvm/TableGen/Record.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1668,7 +1668,7 @@ class Record {
16681668

16691669
// All superclasses in the inheritance forest in post-order (yes, it
16701670
// must be a forest; diamond-shaped inheritance is not allowed).
1671-
SmallVector<std::pair<Record *, SMRange>, 0> SuperClasses;
1671+
SmallVector<std::pair<const Record *, SMRange>, 0> SuperClasses;
16721672

16731673
// Tracks Record instances. Not owned by Record.
16741674
RecordKeeper &TrackedRecords;
@@ -1758,7 +1758,7 @@ class Record {
17581758
ArrayRef<AssertionInfo> getAssertions() const { return Assertions; }
17591759
ArrayRef<DumpInfo> getDumps() const { return Dumps; }
17601760

1761-
ArrayRef<std::pair<Record *, SMRange>> getSuperClasses() const {
1761+
ArrayRef<std::pair<const Record *, SMRange>> getSuperClasses() const {
17621762
return SuperClasses;
17631763
}
17641764

@@ -1832,25 +1832,25 @@ class Record {
18321832
void checkUnusedTemplateArgs();
18331833

18341834
bool isSubClassOf(const Record *R) const {
1835-
for (const auto &SCPair : SuperClasses)
1836-
if (SCPair.first == R)
1835+
for (const auto &[SC, _] : SuperClasses)
1836+
if (SC == R)
18371837
return true;
18381838
return false;
18391839
}
18401840

18411841
bool isSubClassOf(StringRef Name) const {
1842-
for (const auto &SCPair : SuperClasses) {
1843-
if (const auto *SI = dyn_cast<StringInit>(SCPair.first->getNameInit())) {
1842+
for (const auto &[SC, _] : SuperClasses) {
1843+
if (const auto *SI = dyn_cast<StringInit>(SC->getNameInit())) {
18441844
if (SI->getValue() == Name)
18451845
return true;
1846-
} else if (SCPair.first->getNameInitAsString() == Name) {
1846+
} else if (SC->getNameInitAsString() == Name) {
18471847
return true;
18481848
}
18491849
}
18501850
return false;
18511851
}
18521852

1853-
void addSuperClass(Record *R, SMRange Range) {
1853+
void addSuperClass(const Record *R, SMRange Range) {
18541854
assert(!CorrespondingDefInit &&
18551855
"changing type of record after it has been referenced");
18561856
assert(!isSubClassOf(R) && "Already subclassing record!");

llvm/lib/TableGen/DetailedRecordsBackend.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ void DetailedRecordsEmitter::printTemplateArgs(const Record &Rec,
152152
// are enclosed in parentheses.
153153
void DetailedRecordsEmitter::printSuperclasses(const Record &Rec,
154154
raw_ostream &OS) {
155-
ArrayRef<std::pair<Record *, SMRange>> Superclasses = Rec.getSuperClasses();
155+
ArrayRef<std::pair<const Record *, SMRange>> Superclasses =
156+
Rec.getSuperClasses();
156157
if (Superclasses.empty()) {
157158
OS << " Superclasses: (none)\n";
158159
return;

llvm/lib/TableGen/Record.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2357,9 +2357,8 @@ DefInit *VarDefInit::instantiate() {
23572357
NewRec->resolveReferences(R);
23582358

23592359
// Add superclasses.
2360-
ArrayRef<std::pair<Record *, SMRange>> SCs = Class->getSuperClasses();
2361-
for (const auto &SCPair : SCs)
2362-
NewRec->addSuperClass(SCPair.first, SCPair.second);
2360+
for (const auto &[SC, Loc] : Class->getSuperClasses())
2361+
NewRec->addSuperClass(SC, Loc);
23632362

23642363
NewRec->addSuperClass(
23652364
Class, SMRange(Class->getLoc().back(), Class->getLoc().back()));
@@ -2869,7 +2868,7 @@ void Record::setName(Init *NewName) {
28692868
// so we can step through the direct superclasses in reverse order.
28702869

28712870
bool Record::hasDirectSuperClass(const Record *Superclass) const {
2872-
ArrayRef<std::pair<Record *, SMRange>> SCs = getSuperClasses();
2871+
ArrayRef<std::pair<const Record *, SMRange>> SCs = getSuperClasses();
28732872

28742873
for (int I = SCs.size() - 1; I >= 0; --I) {
28752874
const Record *SC = SCs[I].first;
@@ -2883,10 +2882,10 @@ bool Record::hasDirectSuperClass(const Record *Superclass) const {
28832882

28842883
void Record::getDirectSuperClasses(
28852884
SmallVectorImpl<const Record *> &Classes) const {
2886-
ArrayRef<std::pair<Record *, SMRange>> SCs = getSuperClasses();
2885+
ArrayRef<std::pair<const Record *, SMRange>> SCs = getSuperClasses();
28872886

28882887
while (!SCs.empty()) {
2889-
Record *SC = SCs.back().first;
2888+
const Record *SC = SCs.back().first;
28902889
SCs = SCs.drop_back(1 + SC->getSuperClasses().size());
28912890
Classes.push_back(SC);
28922891
}
@@ -2965,11 +2964,11 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, const Record &R) {
29652964
}
29662965

29672966
OS << " {";
2968-
ArrayRef<std::pair<Record *, SMRange>> SC = R.getSuperClasses();
2967+
ArrayRef<std::pair<const Record *, SMRange>> SC = R.getSuperClasses();
29692968
if (!SC.empty()) {
29702969
OS << "\t//";
2971-
for (const auto &SuperPair : SC)
2972-
OS << " " << SuperPair.first->getNameInitAsString();
2970+
for (const auto &[SC, _] : SC)
2971+
OS << " " << SC->getNameInitAsString();
29732972
}
29742973
OS << "\n";
29752974

llvm/lib/TableGen/TGParser.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -328,12 +328,11 @@ bool TGParser::AddSubClass(Record *CurRec, SubClassReference &SubClass) {
328328

329329
// Since everything went well, we can now set the "superclass" list for the
330330
// current record.
331-
ArrayRef<std::pair<Record *, SMRange>> SCs = SC->getSuperClasses();
332-
for (const auto &SCPair : SCs) {
333-
if (CurRec->isSubClassOf(SCPair.first))
331+
for (const auto &[SC, Loc] : SC->getSuperClasses()) {
332+
if (CurRec->isSubClassOf(SC))
334333
return Error(SubClass.RefRange.Start,
335-
"Already subclass of '" + SCPair.first->getName() + "'!\n");
336-
CurRec->addSuperClass(SCPair.first, SCPair.second);
334+
"Already subclass of '" + SC->getName() + "'!\n");
335+
CurRec->addSuperClass(SC, Loc);
337336
}
338337

339338
if (CurRec->isSubClassOf(SC))

llvm/utils/TableGen/CallingConvEmitter.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ void CallingConvEmitter::EmitCallingConv(const Record *CC, raw_ostream &O) {
110110
const Record *Action = CCActions->getElementAsRecord(i);
111111
SwiftAction =
112112
llvm::any_of(Action->getSuperClasses(),
113-
[](const std::pair<Record *, SMRange> &Class) {
113+
[](const std::pair<const Record *, SMRange> &Class) {
114114
std::string Name = Class.first->getNameInitAsString();
115115
return StringRef(Name).starts_with("CCIfSwift");
116116
});

llvm/utils/TableGen/Common/CodeGenRegisters.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -697,9 +697,8 @@ struct TupleExpander : SetTheory::Expander {
697697
"Register tuple redefines register '" + Name + "'.");
698698

699699
// Copy Proto super-classes.
700-
ArrayRef<std::pair<Record *, SMRange>> Supers = Proto->getSuperClasses();
701-
for (const auto &SuperPair : Supers)
702-
NewReg->addSuperClass(SuperPair.first, SuperPair.second);
700+
for (const auto &[Super, Loc] : Proto->getSuperClasses())
701+
NewReg->addSuperClass(Super, Loc);
703702

704703
// Copy Proto fields.
705704
for (unsigned i = 0, e = Proto->getValues().size(); i != e; ++i) {

mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ getBaseValue(const Record *record, const RecordVal *value) {
112112
// Find a base value for the field in the super classes of the given record.
113113
// On success, `record` is updated to the new parent record.
114114
StringRef valueName = value->getName();
115-
auto findValueInSupers = [&](const Record *&record) -> RecordVal * {
115+
auto findValueInSupers = [&](const Record *&record) -> const RecordVal * {
116116
for (auto [parentRecord, loc] : record->getSuperClasses()) {
117117
if (auto *newBase = parentRecord->getValue(valueName)) {
118118
record = parentRecord;

0 commit comments

Comments
 (0)