Skip to content

Commit 6f69fd5

Browse files
committed
[NFC][TableGen] Refactor JSON and detailed record emitter
- Fix JSON and detailed record emitters to use const reference and pointers. - Fix code to use C++ structured bindings and range based loops, include reverse() range for locations. - Eliminate `NL` define for "\n". - Change JSON emitter to populate `instance_list` in an earlier loop over superclasses instead of a separate loop.
1 parent 34dee0a commit 6f69fd5

File tree

3 files changed

+137
-157
lines changed

3 files changed

+137
-157
lines changed

llvm/include/llvm/TableGen/Record.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2328,8 +2328,8 @@ class HasReferenceResolver final : public Resolver {
23282328
Init *resolve(Init *VarName) override;
23292329
};
23302330

2331-
void EmitDetailedRecords(RecordKeeper &RK, raw_ostream &OS);
2332-
void EmitJSON(RecordKeeper &RK, raw_ostream &OS);
2331+
void EmitDetailedRecords(const RecordKeeper &RK, raw_ostream &OS);
2332+
void EmitJSON(const RecordKeeper &RK, raw_ostream &OS);
23332333

23342334
} // end namespace llvm
23352335

llvm/lib/TableGen/DetailedRecordsBackend.cpp

Lines changed: 45 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -21,36 +21,30 @@
2121
#include "llvm/Support/raw_ostream.h"
2222
#include "llvm/TableGen/Error.h"
2323
#include "llvm/TableGen/Record.h"
24-
#include <map>
25-
#include <memory>
2624
#include <string>
2725
#include <utility>
2826

29-
#define DEBUG_TYPE "detailed-records-backend"
30-
31-
#define NL "\n"
32-
3327
using namespace llvm;
3428

3529
namespace {
3630

3731
class DetailedRecordsEmitter {
3832
private:
39-
RecordKeeper &Records;
33+
const RecordKeeper &Records;
4034

4135
public:
42-
DetailedRecordsEmitter(RecordKeeper &RK) : Records(RK) {}
36+
explicit DetailedRecordsEmitter(const RecordKeeper &RK) : Records(RK) {}
4337

4438
void run(raw_ostream &OS);
4539
void printReportHeading(raw_ostream &OS);
40+
void printSectionHeading(StringRef Title, int Count, raw_ostream &OS);
4641
void printVariables(raw_ostream &OS);
4742
void printClasses(raw_ostream &OS);
4843
void printRecords(raw_ostream &OS);
49-
void printSectionHeading(StringRef Title, int Count, raw_ostream &OS);
50-
void printDefms(Record *Rec, raw_ostream &OS);
51-
void printTemplateArgs(Record *Rec, raw_ostream &OS);
52-
void printSuperclasses(Record *Rec, raw_ostream &OS);
53-
void printFields(Record *Rec, raw_ostream &OS);
44+
void printDefms(const Record &Rec, raw_ostream &OS);
45+
void printTemplateArgs(const Record &Rec, raw_ostream &OS);
46+
void printSuperclasses(const Record &Rec, raw_ostream &OS);
47+
void printFields(const Record &Rec, raw_ostream &OS);
5448
}; // emitter class
5549

5650
} // anonymous namespace
@@ -68,15 +62,21 @@ void DetailedRecordsEmitter::printReportHeading(raw_ostream &OS) {
6862
OS << formatv("DETAILED RECORDS for file {0}\n", Records.getInputFilename());
6963
}
7064

65+
// Print a section heading with the name of the section and
66+
// the item count.
67+
void DetailedRecordsEmitter::printSectionHeading(StringRef Title, int Count,
68+
raw_ostream &OS) {
69+
OS << formatv("\n{0} {1} ({2}) {0}\n", "--------------------", Title, Count);
70+
}
71+
7172
// Print the global variables.
7273
void DetailedRecordsEmitter::printVariables(raw_ostream &OS) {
7374
const auto GlobalList = Records.getGlobals();
7475
printSectionHeading("Global Variables", GlobalList.size(), OS);
7576

76-
OS << NL;
77-
for (const auto &Var : GlobalList) {
78-
OS << Var.first << " = " << Var.second->getAsString() << NL;
79-
}
77+
OS << '\n';
78+
for (const auto &Var : GlobalList)
79+
OS << Var.first << " = " << Var.second->getAsString() << '\n';
8080
}
8181

8282
// Print the classes, including the template arguments, superclasses,
@@ -85,13 +85,12 @@ void DetailedRecordsEmitter::printClasses(raw_ostream &OS) {
8585
const auto &ClassList = Records.getClasses();
8686
printSectionHeading("Classes", ClassList.size(), OS);
8787

88-
for (const auto &ClassPair : ClassList) {
89-
auto *const Class = ClassPair.second.get();
88+
for (const auto &[Name, Class] : ClassList) {
9089
OS << formatv("\n{0} |{1}|\n", Class->getNameInitAsString(),
9190
SrcMgr.getFormattedLocationNoOffset(Class->getLoc().front()));
92-
printTemplateArgs(Class, OS);
93-
printSuperclasses(Class, OS);
94-
printFields(Class, OS);
91+
printTemplateArgs(*Class, OS);
92+
printSuperclasses(*Class, OS);
93+
printFields(*Class, OS);
9594
}
9695
}
9796

@@ -101,103 +100,89 @@ void DetailedRecordsEmitter::printRecords(raw_ostream &OS) {
101100
const auto &RecordList = Records.getDefs();
102101
printSectionHeading("Records", RecordList.size(), OS);
103102

104-
for (const auto &RecPair : RecordList) {
105-
auto *const Rec = RecPair.second.get();
103+
for (const auto &[DefName, Rec] : RecordList) {
106104
std::string Name = Rec->getNameInitAsString();
107105
OS << formatv("\n{0} |{1}|\n", Name.empty() ? "\"\"" : Name,
108106
SrcMgr.getFormattedLocationNoOffset(Rec->getLoc().front()));
109-
printDefms(Rec, OS);
110-
printSuperclasses(Rec, OS);
111-
printFields(Rec, OS);
107+
printDefms(*Rec, OS);
108+
printSuperclasses(*Rec, OS);
109+
printFields(*Rec, OS);
112110
}
113111
}
114112

115-
// Print a section heading with the name of the section and
116-
// the item count.
117-
void DetailedRecordsEmitter::printSectionHeading(StringRef Title, int Count,
118-
raw_ostream &OS) {
119-
OS << formatv("\n{0} {1} ({2}) {0}\n", "--------------------", Title, Count);
120-
}
121-
122113
// Print the record's defm source locations, if any. Note that they
123114
// are stored in the reverse order of their invocation.
124-
void DetailedRecordsEmitter::printDefms(Record *Rec, raw_ostream &OS) {
125-
const auto &LocList = Rec->getLoc();
115+
void DetailedRecordsEmitter::printDefms(const Record &Rec, raw_ostream &OS) {
116+
const auto &LocList = Rec.getLoc();
126117
if (LocList.size() < 2)
127118
return;
128119

129120
OS << " Defm sequence:";
130-
for (unsigned I = LocList.size() - 1; I >= 1; --I) {
131-
OS << formatv(" |{0}|", SrcMgr.getFormattedLocationNoOffset(LocList[I]));
132-
}
133-
OS << NL;
121+
for (const SMLoc Loc : reverse(LocList))
122+
OS << formatv(" |{0}|", SrcMgr.getFormattedLocationNoOffset(Loc));
123+
OS << '\n';
134124
}
135125

136126
// Print the template arguments of a class.
137-
void DetailedRecordsEmitter::printTemplateArgs(Record *Rec,
127+
void DetailedRecordsEmitter::printTemplateArgs(const Record &Rec,
138128
raw_ostream &OS) {
139-
ArrayRef<Init *> Args = Rec->getTemplateArgs();
129+
ArrayRef<Init *> Args = Rec.getTemplateArgs();
140130
if (Args.empty()) {
141131
OS << " Template args: (none)\n";
142132
return;
143133
}
144134

145135
OS << " Template args:\n";
146136
for (const Init *ArgName : Args) {
147-
const RecordVal *Value = Rec->getValue(ArgName);
137+
const RecordVal *Value = Rec.getValue(ArgName);
148138
assert(Value && "Template argument value not found.");
149139
OS << " ";
150140
Value->print(OS, false);
151-
OS << formatv(" |{0}|", SrcMgr.getFormattedLocationNoOffset(Value->getLoc()));
152-
OS << NL;
141+
OS << formatv(" |{0}|\n",
142+
SrcMgr.getFormattedLocationNoOffset(Value->getLoc()));
153143
}
154144
}
155145

156146
// Print the superclasses of a class or record. Indirect superclasses
157147
// are enclosed in parentheses.
158-
void DetailedRecordsEmitter::printSuperclasses(Record *Rec, raw_ostream &OS) {
159-
ArrayRef<std::pair<Record *, SMRange>> Superclasses = Rec->getSuperClasses();
148+
void DetailedRecordsEmitter::printSuperclasses(const Record &Rec,
149+
raw_ostream &OS) {
150+
ArrayRef<std::pair<Record *, SMRange>> Superclasses = Rec.getSuperClasses();
160151
if (Superclasses.empty()) {
161152
OS << " Superclasses: (none)\n";
162153
return;
163154
}
164155

165156
OS << " Superclasses:";
166-
for (const auto &SuperclassPair : Superclasses) {
167-
auto *ClassRec = SuperclassPair.first;
168-
if (Rec->hasDirectSuperClass(ClassRec))
157+
for (const auto &[ClassRec, Loc] : Superclasses) {
158+
if (Rec.hasDirectSuperClass(ClassRec))
169159
OS << formatv(" {0}", ClassRec->getNameInitAsString());
170160
else
171161
OS << formatv(" ({0})", ClassRec->getNameInitAsString());
172162
}
173-
OS << NL;
163+
OS << '\n';
174164
}
175165

176166
// Print the fields of a class or record, including their source locations.
177-
void DetailedRecordsEmitter::printFields(Record *Rec, raw_ostream &OS) {
178-
const auto &ValueList = Rec->getValues();
167+
void DetailedRecordsEmitter::printFields(const Record &Rec, raw_ostream &OS) {
168+
const auto &ValueList = Rec.getValues();
179169
if (ValueList.empty()) {
180170
OS << " Fields: (none)\n";
181171
return;
182172
}
183173

184174
OS << " Fields:\n";
185175
for (const RecordVal &Value : ValueList)
186-
if (!Rec->isTemplateArg(Value.getNameInit())) {
176+
if (!Rec.isTemplateArg(Value.getNameInit())) {
187177
OS << " ";
188178
Value.print(OS, false);
189179
OS << formatv(" |{0}|\n",
190180
SrcMgr.getFormattedLocationNoOffset(Value.getLoc()));
191181
}
192182
}
193183

194-
namespace llvm {
195-
196184
// This function is called by TableGen after parsing the files.
197-
198-
void EmitDetailedRecords(RecordKeeper &RK, raw_ostream &OS) {
185+
void llvm::EmitDetailedRecords(const RecordKeeper &RK, raw_ostream &OS) {
199186
// Instantiate the emitter class and invoke run().
200187
DetailedRecordsEmitter(RK).run(OS);
201188
}
202-
203-
} // namespace llvm

0 commit comments

Comments
 (0)