Skip to content

Commit

Permalink
[NFC][TableGen] Change Record::getSuperClasses to use const Record*
Browse files Browse the repository at this point in the history
Change `Record::getSuperClasses` to return a const pointer to the
superclass records.
  • Loading branch information
jurahul committed Oct 2, 2024
1 parent 9bf02a8 commit fe014eb
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 38 deletions.
16 changes: 7 additions & 9 deletions clang/utils/TableGen/ClangAttrEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1529,9 +1529,8 @@ createArgument(const Record &Arg, StringRef Attr,

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

ArrayRef<std::pair<Record *, SMRange>> Supers = R.getSuperClasses();
ArrayRef<std::pair<const Record *, SMRange>> Supers = R.getSuperClasses();
assert(!Supers.empty() && "Forgot to specify a superclass for the attr");
std::string SuperName;
bool Inheritable = false;
for (const auto &Super : reverse(Supers)) {
const Record *R = Super.first;
for (const auto &[R, _] : reverse(Supers)) {
if (R->getName() != "TargetSpecificAttr" &&
R->getName() != "DeclOrTypeAttr" && SuperName.empty())
SuperName = std::string(R->getName());
Expand Down Expand Up @@ -3434,7 +3432,7 @@ namespace {
}

private:
AttrClass *findClassByRecord(Record *R) const {
AttrClass *findClassByRecord(const Record *R) const {
for (auto &Class : Classes) {
if (Class->TheRecord == R)
return Class.get();
Expand Down Expand Up @@ -4739,8 +4737,8 @@ void EmitClangAttrParsedAttrImpl(const RecordKeeper &Records, raw_ostream &OS) {
if (Arg->getValueAsBitOrUnset("Fake", UnusedUnset))
continue;
ArgNames.push_back(Arg->getValueAsString("Name").str());
for (const auto &Class : Arg->getSuperClasses()) {
if (Class.first->getName().starts_with("Variadic")) {
for (const auto &[Class, _] : Arg->getSuperClasses()) {
if (Class->getName().starts_with("Variadic")) {
ArgNames.back().append("...");
break;
}
Expand Down
2 changes: 1 addition & 1 deletion llvm/docs/TableGen/BackGuide.rst
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,7 @@ iterates over the pairs in the returned array.

.. code-block:: text
ArrayRef<std::pair<Record *, SMRange>>
ArrayRef<std::pair<const Record *, SMRange>>
Superclasses = Prototype->getSuperClasses();
for (const auto &SuperPair : Superclasses) {
...
Expand Down
16 changes: 8 additions & 8 deletions llvm/include/llvm/TableGen/Record.h
Original file line number Diff line number Diff line change
Expand Up @@ -1668,7 +1668,7 @@ class Record {

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

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

ArrayRef<std::pair<Record *, SMRange>> getSuperClasses() const {
ArrayRef<std::pair<const Record *, SMRange>> getSuperClasses() const {
return SuperClasses;
}

Expand Down Expand Up @@ -1832,25 +1832,25 @@ class Record {
void checkUnusedTemplateArgs();

bool isSubClassOf(const Record *R) const {
for (const auto &SCPair : SuperClasses)
if (SCPair.first == R)
for (const auto &[SC, _] : SuperClasses)
if (SC == R)
return true;
return false;
}

bool isSubClassOf(StringRef Name) const {
for (const auto &SCPair : SuperClasses) {
if (const auto *SI = dyn_cast<StringInit>(SCPair.first->getNameInit())) {
for (const auto &[SC, _] : SuperClasses) {
if (const auto *SI = dyn_cast<StringInit>(SC->getNameInit())) {
if (SI->getValue() == Name)
return true;
} else if (SCPair.first->getNameInitAsString() == Name) {
} else if (SC->getNameInitAsString() == Name) {
return true;
}
}
return false;
}

void addSuperClass(Record *R, SMRange Range) {
void addSuperClass(const Record *R, SMRange Range) {
assert(!CorrespondingDefInit &&
"changing type of record after it has been referenced");
assert(!isSubClassOf(R) && "Already subclassing record!");
Expand Down
3 changes: 2 additions & 1 deletion llvm/lib/TableGen/DetailedRecordsBackend.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,8 @@ void DetailedRecordsEmitter::printTemplateArgs(const Record &Rec,
// are enclosed in parentheses.
void DetailedRecordsEmitter::printSuperclasses(const Record &Rec,
raw_ostream &OS) {
ArrayRef<std::pair<Record *, SMRange>> Superclasses = Rec.getSuperClasses();
ArrayRef<std::pair<const Record *, SMRange>> Superclasses =
Rec.getSuperClasses();
if (Superclasses.empty()) {
OS << " Superclasses: (none)\n";
return;
Expand Down
17 changes: 8 additions & 9 deletions llvm/lib/TableGen/Record.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2357,9 +2357,8 @@ DefInit *VarDefInit::instantiate() {
NewRec->resolveReferences(R);

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

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

bool Record::hasDirectSuperClass(const Record *Superclass) const {
ArrayRef<std::pair<Record *, SMRange>> SCs = getSuperClasses();
ArrayRef<std::pair<const Record *, SMRange>> SCs = getSuperClasses();

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

void Record::getDirectSuperClasses(
SmallVectorImpl<const Record *> &Classes) const {
ArrayRef<std::pair<Record *, SMRange>> SCs = getSuperClasses();
ArrayRef<std::pair<const Record *, SMRange>> SCs = getSuperClasses();

while (!SCs.empty()) {
Record *SC = SCs.back().first;
const Record *SC = SCs.back().first;
SCs = SCs.drop_back(1 + SC->getSuperClasses().size());
Classes.push_back(SC);
}
Expand Down Expand Up @@ -2965,11 +2964,11 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, const Record &R) {
}

OS << " {";
ArrayRef<std::pair<Record *, SMRange>> SC = R.getSuperClasses();
ArrayRef<std::pair<const Record *, SMRange>> SC = R.getSuperClasses();
if (!SC.empty()) {
OS << "\t//";
for (const auto &SuperPair : SC)
OS << " " << SuperPair.first->getNameInitAsString();
for (const auto &[SC, _] : SC)
OS << " " << SC->getNameInitAsString();
}
OS << "\n";

Expand Down
9 changes: 4 additions & 5 deletions llvm/lib/TableGen/TGParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -328,12 +328,11 @@ bool TGParser::AddSubClass(Record *CurRec, SubClassReference &SubClass) {

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

if (CurRec->isSubClassOf(SC))
Expand Down
2 changes: 1 addition & 1 deletion llvm/utils/TableGen/CallingConvEmitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ void CallingConvEmitter::EmitCallingConv(const Record *CC, raw_ostream &O) {
const Record *Action = CCActions->getElementAsRecord(i);
SwiftAction =
llvm::any_of(Action->getSuperClasses(),
[](const std::pair<Record *, SMRange> &Class) {
[](const std::pair<const Record *, SMRange> &Class) {
std::string Name = Class.first->getNameInitAsString();
return StringRef(Name).starts_with("CCIfSwift");
});
Expand Down
5 changes: 2 additions & 3 deletions llvm/utils/TableGen/Common/CodeGenRegisters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -697,9 +697,8 @@ struct TupleExpander : SetTheory::Expander {
"Register tuple redefines register '" + Name + "'.");

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

// Copy Proto fields.
for (unsigned i = 0, e = Proto->getValues().size(); i != e; ++i) {
Expand Down
2 changes: 1 addition & 1 deletion mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ getBaseValue(const llvm::Record *record, const llvm::RecordVal *value) {
// On success, `record` is updated to the new parent record.
StringRef valueName = value->getName();
auto findValueInSupers =
[&](const llvm::Record *&record) -> llvm::RecordVal * {
[&](const llvm::Record *&record) -> const llvm::RecordVal * {
for (auto [parentRecord, loc] : record->getSuperClasses()) {
if (auto *newBase = parentRecord->getValue(valueName)) {
record = parentRecord;
Expand Down

0 comments on commit fe014eb

Please sign in to comment.