26
26
#include < string>
27
27
#include < utility>
28
28
29
- #define DEBUG_TYPE " detailed-records-backend"
30
-
31
- #define NL " \n "
32
-
33
29
using namespace llvm ;
34
30
35
31
namespace {
36
32
37
33
class DetailedRecordsEmitter {
38
34
private:
39
- RecordKeeper &Records;
35
+ const RecordKeeper &Records;
40
36
41
37
public:
42
- DetailedRecordsEmitter (RecordKeeper &RK) : Records(RK) {}
38
+ DetailedRecordsEmitter (const RecordKeeper &RK) : Records(RK) {}
43
39
44
40
void run (raw_ostream &OS);
45
41
void printReportHeading (raw_ostream &OS);
42
+ void printSectionHeading (StringRef Title, int Count, raw_ostream &OS);
46
43
void printVariables (raw_ostream &OS);
47
44
void printClasses (raw_ostream &OS);
48
45
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);
46
+ void printDefms (const Record *Rec, raw_ostream &OS);
47
+ void printTemplateArgs (const Record *Rec, raw_ostream &OS);
48
+ void printSuperclasses (const Record *Rec, raw_ostream &OS);
49
+ void printFields (const Record *Rec, raw_ostream &OS);
54
50
}; // emitter class
55
51
56
52
} // anonymous namespace
@@ -68,14 +64,21 @@ void DetailedRecordsEmitter::printReportHeading(raw_ostream &OS) {
68
64
OS << formatv (" DETAILED RECORDS for file {0}\n " , Records.getInputFilename ());
69
65
}
70
66
67
+ // Print a section heading with the name of the section and
68
+ // the item count.
69
+ void DetailedRecordsEmitter::printSectionHeading (StringRef Title, int Count,
70
+ raw_ostream &OS) {
71
+ OS << formatv (" \n {0} {1} ({2}) {0}\n " , " --------------------" , Title, Count);
72
+ }
73
+
71
74
// Print the global variables.
72
75
void DetailedRecordsEmitter::printVariables (raw_ostream &OS) {
73
76
const auto GlobalList = Records.getGlobals ();
74
77
printSectionHeading (" Global Variables" , GlobalList.size (), OS);
75
78
76
- OS << NL ;
79
+ OS << " \n " ;
77
80
for (const auto &Var : GlobalList) {
78
- OS << Var.first << " = " << Var.second ->getAsString () << NL ;
81
+ OS << Var.first << " = " << Var.second ->getAsString () << " \n " ;
79
82
}
80
83
}
81
84
@@ -85,13 +88,12 @@ void DetailedRecordsEmitter::printClasses(raw_ostream &OS) {
85
88
const auto &ClassList = Records.getClasses ();
86
89
printSectionHeading (" Classes" , ClassList.size (), OS);
87
90
88
- for (const auto &ClassPair : ClassList) {
89
- auto *const Class = ClassPair.second .get ();
91
+ for (const auto &[Name, Class] : ClassList) {
90
92
OS << formatv (" \n {0} |{1}|\n " , Class->getNameInitAsString (),
91
93
SrcMgr.getFormattedLocationNoOffset (Class->getLoc ().front ()));
92
- printTemplateArgs (Class, OS);
93
- printSuperclasses (Class, OS);
94
- printFields (Class, OS);
94
+ printTemplateArgs (Class. get () , OS);
95
+ printSuperclasses (Class. get () , OS);
96
+ printFields (Class. get () , OS);
95
97
}
96
98
}
97
99
@@ -101,40 +103,31 @@ void DetailedRecordsEmitter::printRecords(raw_ostream &OS) {
101
103
const auto &RecordList = Records.getDefs ();
102
104
printSectionHeading (" Records" , RecordList.size (), OS);
103
105
104
- for (const auto &RecPair : RecordList) {
105
- auto *const Rec = RecPair.second .get ();
106
+ for (const auto &[DefName, Rec] : RecordList) {
106
107
std::string Name = Rec->getNameInitAsString ();
107
108
OS << formatv (" \n {0} |{1}|\n " , Name.empty () ? " \"\" " : Name,
108
109
SrcMgr.getFormattedLocationNoOffset (Rec->getLoc ().front ()));
109
- printDefms (Rec, OS);
110
- printSuperclasses (Rec, OS);
111
- printFields (Rec, OS);
110
+ printDefms (Rec. get () , OS);
111
+ printSuperclasses (Rec. get () , OS);
112
+ printFields (Rec. get () , OS);
112
113
}
113
114
}
114
115
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
-
122
116
// Print the record's defm source locations, if any. Note that they
123
117
// are stored in the reverse order of their invocation.
124
- void DetailedRecordsEmitter::printDefms (Record *Rec, raw_ostream &OS) {
118
+ void DetailedRecordsEmitter::printDefms (const Record *Rec, raw_ostream &OS) {
125
119
const auto &LocList = Rec->getLoc ();
126
120
if (LocList.size () < 2 )
127
121
return ;
128
122
129
123
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;
124
+ for (const SMLoc Loc : reverse (LocList))
125
+ OS << formatv (" |{0}|" , SrcMgr.getFormattedLocationNoOffset (Loc));
126
+ OS << " \n " ;
134
127
}
135
128
136
129
// Print the template arguments of a class.
137
- void DetailedRecordsEmitter::printTemplateArgs (Record *Rec,
130
+ void DetailedRecordsEmitter::printTemplateArgs (const Record *Rec,
138
131
raw_ostream &OS) {
139
132
ArrayRef<Init *> Args = Rec->getTemplateArgs ();
140
133
if (Args.empty ()) {
@@ -149,32 +142,32 @@ void DetailedRecordsEmitter::printTemplateArgs(Record *Rec,
149
142
OS << " " ;
150
143
Value->print (OS, false );
151
144
OS << formatv (" |{0}|" , SrcMgr.getFormattedLocationNoOffset (Value->getLoc ()));
152
- OS << NL ;
145
+ OS << " \n " ;
153
146
}
154
147
}
155
148
156
149
// Print the superclasses of a class or record. Indirect superclasses
157
150
// are enclosed in parentheses.
158
- void DetailedRecordsEmitter::printSuperclasses (Record *Rec, raw_ostream &OS) {
151
+ void DetailedRecordsEmitter::printSuperclasses (const Record *Rec,
152
+ raw_ostream &OS) {
159
153
ArrayRef<std::pair<Record *, SMRange>> Superclasses = Rec->getSuperClasses ();
160
154
if (Superclasses.empty ()) {
161
155
OS << " Superclasses: (none)\n " ;
162
156
return ;
163
157
}
164
158
165
159
OS << " Superclasses:" ;
166
- for (const auto &SuperclassPair : Superclasses) {
167
- auto *ClassRec = SuperclassPair.first ;
160
+ for (const auto &[ClassRec, Loc] : Superclasses) {
168
161
if (Rec->hasDirectSuperClass (ClassRec))
169
162
OS << formatv (" {0}" , ClassRec->getNameInitAsString ());
170
163
else
171
164
OS << formatv (" ({0})" , ClassRec->getNameInitAsString ());
172
165
}
173
- OS << NL ;
166
+ OS << " \n " ;
174
167
}
175
168
176
169
// Print the fields of a class or record, including their source locations.
177
- void DetailedRecordsEmitter::printFields (Record *Rec, raw_ostream &OS) {
170
+ void DetailedRecordsEmitter::printFields (const Record *Rec, raw_ostream &OS) {
178
171
const auto &ValueList = Rec->getValues ();
179
172
if (ValueList.empty ()) {
180
173
OS << " Fields: (none)\n " ;
@@ -191,13 +184,8 @@ void DetailedRecordsEmitter::printFields(Record *Rec, raw_ostream &OS) {
191
184
}
192
185
}
193
186
194
- namespace llvm {
195
-
196
187
// This function is called by TableGen after parsing the files.
197
-
198
- void EmitDetailedRecords (RecordKeeper &RK, raw_ostream &OS) {
188
+ void llvm::EmitDetailedRecords (RecordKeeper &RK, raw_ostream &OS) {
199
189
// Instantiate the emitter class and invoke run().
200
190
DetailedRecordsEmitter (RK).run (OS);
201
191
}
202
-
203
- } // namespace llvm
0 commit comments