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-
3327using namespace llvm ;
3428
3529namespace {
3630
3731class DetailedRecordsEmitter {
3832private:
39- RecordKeeper &Records;
33+ const RecordKeeper &Records;
4034
4135public:
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.
7273void 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