21
21
#include " llvm/Support/raw_ostream.h"
22
22
#include " llvm/TableGen/Error.h"
23
23
#include " llvm/TableGen/Record.h"
24
- #include < map>
25
- #include < memory>
26
24
#include < string>
27
25
#include < utility>
28
26
29
- #define DEBUG_TYPE " detailed-records-backend"
30
-
31
- #define NL " \n "
32
-
33
27
using namespace llvm ;
34
28
35
29
namespace {
36
30
37
31
class DetailedRecordsEmitter {
38
32
private:
39
- RecordKeeper &Records;
33
+ const RecordKeeper &Records;
40
34
41
35
public:
42
- DetailedRecordsEmitter (RecordKeeper &RK) : Records(RK) {}
36
+ explicit DetailedRecordsEmitter (const RecordKeeper &RK) : Records(RK) {}
43
37
44
38
void run (raw_ostream &OS);
45
39
void printReportHeading (raw_ostream &OS);
40
+ void printSectionHeading (StringRef Title, int Count, raw_ostream &OS);
46
41
void printVariables (raw_ostream &OS);
47
42
void printClasses (raw_ostream &OS);
48
43
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);
54
48
}; // emitter class
55
49
56
50
} // anonymous namespace
@@ -68,15 +62,21 @@ void DetailedRecordsEmitter::printReportHeading(raw_ostream &OS) {
68
62
OS << formatv (" DETAILED RECORDS for file {0}\n " , Records.getInputFilename ());
69
63
}
70
64
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
+
71
72
// Print the global variables.
72
73
void DetailedRecordsEmitter::printVariables (raw_ostream &OS) {
73
74
const auto GlobalList = Records.getGlobals ();
74
75
printSectionHeading (" Global Variables" , GlobalList.size (), OS);
75
76
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 ' ;
80
80
}
81
81
82
82
// Print the classes, including the template arguments, superclasses,
@@ -85,13 +85,12 @@ void DetailedRecordsEmitter::printClasses(raw_ostream &OS) {
85
85
const auto &ClassList = Records.getClasses ();
86
86
printSectionHeading (" Classes" , ClassList.size (), OS);
87
87
88
- for (const auto &ClassPair : ClassList) {
89
- auto *const Class = ClassPair.second .get ();
88
+ for (const auto &[Name, Class] : ClassList) {
90
89
OS << formatv (" \n {0} |{1}|\n " , Class->getNameInitAsString (),
91
90
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);
95
94
}
96
95
}
97
96
@@ -101,103 +100,89 @@ void DetailedRecordsEmitter::printRecords(raw_ostream &OS) {
101
100
const auto &RecordList = Records.getDefs ();
102
101
printSectionHeading (" Records" , RecordList.size (), OS);
103
102
104
- for (const auto &RecPair : RecordList) {
105
- auto *const Rec = RecPair.second .get ();
103
+ for (const auto &[DefName, Rec] : RecordList) {
106
104
std::string Name = Rec->getNameInitAsString ();
107
105
OS << formatv (" \n {0} |{1}|\n " , Name.empty () ? " \"\" " : Name,
108
106
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);
112
110
}
113
111
}
114
112
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
113
// Print the record's defm source locations, if any. Note that they
123
114
// 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 ();
126
117
if (LocList.size () < 2 )
127
118
return ;
128
119
129
120
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 ' ;
134
124
}
135
125
136
126
// Print the template arguments of a class.
137
- void DetailedRecordsEmitter::printTemplateArgs (Record * Rec,
127
+ void DetailedRecordsEmitter::printTemplateArgs (const Record & Rec,
138
128
raw_ostream &OS) {
139
- ArrayRef<Init *> Args = Rec-> getTemplateArgs ();
129
+ ArrayRef<Init *> Args = Rec. getTemplateArgs ();
140
130
if (Args.empty ()) {
141
131
OS << " Template args: (none)\n " ;
142
132
return ;
143
133
}
144
134
145
135
OS << " Template args:\n " ;
146
136
for (const Init *ArgName : Args) {
147
- const RecordVal *Value = Rec-> getValue (ArgName);
137
+ const RecordVal *Value = Rec. getValue (ArgName);
148
138
assert (Value && " Template argument value not found." );
149
139
OS << " " ;
150
140
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 ())) ;
153
143
}
154
144
}
155
145
156
146
// Print the superclasses of a class or record. Indirect superclasses
157
147
// 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 ();
160
151
if (Superclasses.empty ()) {
161
152
OS << " Superclasses: (none)\n " ;
162
153
return ;
163
154
}
164
155
165
156
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))
169
159
OS << formatv (" {0}" , ClassRec->getNameInitAsString ());
170
160
else
171
161
OS << formatv (" ({0})" , ClassRec->getNameInitAsString ());
172
162
}
173
- OS << NL ;
163
+ OS << ' \n ' ;
174
164
}
175
165
176
166
// 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 ();
179
169
if (ValueList.empty ()) {
180
170
OS << " Fields: (none)\n " ;
181
171
return ;
182
172
}
183
173
184
174
OS << " Fields:\n " ;
185
175
for (const RecordVal &Value : ValueList)
186
- if (!Rec-> isTemplateArg (Value.getNameInit ())) {
176
+ if (!Rec. isTemplateArg (Value.getNameInit ())) {
187
177
OS << " " ;
188
178
Value.print (OS, false );
189
179
OS << formatv (" |{0}|\n " ,
190
180
SrcMgr.getFormattedLocationNoOffset (Value.getLoc ()));
191
181
}
192
182
}
193
183
194
- namespace llvm {
195
-
196
184
// 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) {
199
186
// Instantiate the emitter class and invoke run().
200
187
DetailedRecordsEmitter (RK).run (OS);
201
188
}
202
-
203
- } // namespace llvm
0 commit comments