2626#include < string>
2727#include < utility>
2828
29- #define DEBUG_TYPE " detailed-records-backend"
30-
31- #define NL " \n "
32-
3329using namespace llvm ;
3430
3531namespace {
3632
3733class DetailedRecordsEmitter {
3834private:
39- RecordKeeper &Records;
35+ const RecordKeeper &Records;
4036
4137public:
42- DetailedRecordsEmitter (RecordKeeper &RK) : Records(RK) {}
38+ DetailedRecordsEmitter (const RecordKeeper &RK) : Records(RK) {}
4339
4440 void run (raw_ostream &OS);
4541 void printReportHeading (raw_ostream &OS);
42+ void printSectionHeading (StringRef Title, int Count, raw_ostream &OS);
4643 void printVariables (raw_ostream &OS);
4744 void printClasses (raw_ostream &OS);
4845 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);
5450}; // emitter class
5551
5652} // anonymous namespace
@@ -68,14 +64,21 @@ void DetailedRecordsEmitter::printReportHeading(raw_ostream &OS) {
6864 OS << formatv (" DETAILED RECORDS for file {0}\n " , Records.getInputFilename ());
6965}
7066
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+
7174// Print the global variables.
7275void DetailedRecordsEmitter::printVariables (raw_ostream &OS) {
7376 const auto GlobalList = Records.getGlobals ();
7477 printSectionHeading (" Global Variables" , GlobalList.size (), OS);
7578
76- OS << NL ;
79+ OS << " \n " ;
7780 for (const auto &Var : GlobalList) {
78- OS << Var.first << " = " << Var.second ->getAsString () << NL ;
81+ OS << Var.first << " = " << Var.second ->getAsString () << " \n " ;
7982 }
8083}
8184
@@ -85,13 +88,12 @@ void DetailedRecordsEmitter::printClasses(raw_ostream &OS) {
8588 const auto &ClassList = Records.getClasses ();
8689 printSectionHeading (" Classes" , ClassList.size (), OS);
8790
88- for (const auto &ClassPair : ClassList) {
89- auto *const Class = ClassPair.second .get ();
91+ for (const auto &[Name, Class] : ClassList) {
9092 OS << formatv (" \n {0} |{1}|\n " , Class->getNameInitAsString (),
9193 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);
9597 }
9698}
9799
@@ -101,40 +103,31 @@ void DetailedRecordsEmitter::printRecords(raw_ostream &OS) {
101103 const auto &RecordList = Records.getDefs ();
102104 printSectionHeading (" Records" , RecordList.size (), OS);
103105
104- for (const auto &RecPair : RecordList) {
105- auto *const Rec = RecPair.second .get ();
106+ for (const auto &[DefName, Rec] : RecordList) {
106107 std::string Name = Rec->getNameInitAsString ();
107108 OS << formatv (" \n {0} |{1}|\n " , Name.empty () ? " \"\" " : Name,
108109 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);
112113 }
113114}
114115
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-
122116// Print the record's defm source locations, if any. Note that they
123117// 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) {
125119 const auto &LocList = Rec->getLoc ();
126120 if (LocList.size () < 2 )
127121 return ;
128122
129123 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 " ;
134127}
135128
136129// Print the template arguments of a class.
137- void DetailedRecordsEmitter::printTemplateArgs (Record *Rec,
130+ void DetailedRecordsEmitter::printTemplateArgs (const Record *Rec,
138131 raw_ostream &OS) {
139132 ArrayRef<Init *> Args = Rec->getTemplateArgs ();
140133 if (Args.empty ()) {
@@ -149,32 +142,32 @@ void DetailedRecordsEmitter::printTemplateArgs(Record *Rec,
149142 OS << " " ;
150143 Value->print (OS, false );
151144 OS << formatv (" |{0}|" , SrcMgr.getFormattedLocationNoOffset (Value->getLoc ()));
152- OS << NL ;
145+ OS << " \n " ;
153146 }
154147}
155148
156149// Print the superclasses of a class or record. Indirect superclasses
157150// are enclosed in parentheses.
158- void DetailedRecordsEmitter::printSuperclasses (Record *Rec, raw_ostream &OS) {
151+ void DetailedRecordsEmitter::printSuperclasses (const Record *Rec,
152+ raw_ostream &OS) {
159153 ArrayRef<std::pair<Record *, SMRange>> Superclasses = Rec->getSuperClasses ();
160154 if (Superclasses.empty ()) {
161155 OS << " Superclasses: (none)\n " ;
162156 return ;
163157 }
164158
165159 OS << " Superclasses:" ;
166- for (const auto &SuperclassPair : Superclasses) {
167- auto *ClassRec = SuperclassPair.first ;
160+ for (const auto &[ClassRec, Loc] : Superclasses) {
168161 if (Rec->hasDirectSuperClass (ClassRec))
169162 OS << formatv (" {0}" , ClassRec->getNameInitAsString ());
170163 else
171164 OS << formatv (" ({0})" , ClassRec->getNameInitAsString ());
172165 }
173- OS << NL ;
166+ OS << " \n " ;
174167}
175168
176169// 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) {
178171 const auto &ValueList = Rec->getValues ();
179172 if (ValueList.empty ()) {
180173 OS << " Fields: (none)\n " ;
@@ -191,13 +184,8 @@ void DetailedRecordsEmitter::printFields(Record *Rec, raw_ostream &OS) {
191184 }
192185}
193186
194- namespace llvm {
195-
196187// 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) {
199189 // Instantiate the emitter class and invoke run().
200190 DetailedRecordsEmitter (RK).run (OS);
201191}
202-
203- } // namespace llvm
0 commit comments