fix compiling problems
[gem5.git] / src / base / traceflags.py
1 #!/usr/bin/env python
2
3 # Copyright (c) 2004-2005 The Regents of The University of Michigan
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions are
8 # met: redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer;
10 # redistributions in binary form must reproduce the above copyright
11 # notice, this list of conditions and the following disclaimer in the
12 # documentation and/or other materials provided with the distribution;
13 # neither the name of the copyright holders nor the names of its
14 # contributors may be used to endorse or promote products derived from
15 # this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #
29 # Authors: Nathan Binkert
30 # Steve Reinhardt
31
32 __all__ = [ 'allFlags', 'baseFlags', 'compoundFlagsMap', 'compoundFlags' ]
33
34 #
35 # The list of trace flags that can be used to condition DPRINTFs etc.
36 # To define a new flag, simply add it to this list.
37 #
38 baseFlags = [
39 'Activity',
40 'AlphaConsole',
41 'Annotate',
42 'BADADDR',
43 'BE',
44 'BPredRAS',
45 'Bus',
46 'BusAddrRanges',
47 'BusBridge',
48 'Cache',
49 'CachePort',
50 'Chains',
51 'Checker',
52 'Clock',
53 'Commit',
54 'CommitRate',
55 'Config',
56 'Console',
57 'ConsolePoll',
58 'ConsoleVerbose',
59 'Context',
60 'Cycle',
61 'DMA',
62 'DMAReadVerbose',
63 'DMAWriteVerbose',
64 'DebugPrintf',
65 'Decode',
66 'DiskImage',
67 'DiskImageRead',
68 'DiskImageWrite',
69 'DynInst',
70 'Ethernet',
71 'EthernetCksum',
72 'EthernetDMA',
73 'EthernetData',
74 'EthernetDesc',
75 'EthernetEEPROM',
76 'EthernetIntr',
77 'EthernetPIO',
78 'EthernetSM',
79 'Event',
80 'ExecEnable',
81 'ExecCPSeq',
82 'ExecEffAddr',
83 'ExecFetchSeq',
84 'ExecIntRegs',
85 'ExecIntel',
86 'ExecLegion',
87 'ExecOpClass',
88 'ExecRegDelta',
89 'ExecResult',
90 'ExecSpeculative',
91 'ExecSymbol',
92 'ExecThread',
93 'ExecTicks',
94 'FE',
95 'Fault',
96 'Fetch',
97 'Flow',
98 'FreeList',
99 'FullCPU',
100 'FunctionalAccess',
101 'GDBAcc',
102 'GDBExtra',
103 'GDBMisc',
104 'GDBRead',
105 'GDBRecv',
106 'GDBSend',
107 'GDBWrite',
108 'HWPrefetch',
109 'IBE',
110 'IEW',
111 'IIC',
112 'IICMore',
113 'IPI',
114 'IPR',
115 'IQ',
116 'ISP',
117 'IdeCtrl',
118 'IdeDisk',
119 'Interrupt',
120 'LLSC',
121 'LSQ',
122 'LSQUnit',
123 'Loader',
124 'MC146818',
125 'MMU',
126 'MSHR',
127 'Mbox',
128 'MemDepUnit',
129 'MemoryAccess',
130 'O3CPU',
131 'OzoneCPU',
132 'OzoneLSQ',
133 'PCEvent',
134 'PCIA',
135 'PCIDEV',
136 'PciConfigAll',
137 'Pipeline',
138 'Printf',
139 'Quiesce',
140 'ROB',
141 'Regs',
142 'Rename',
143 'RenameMap',
144 'SQL',
145 'Sampler',
146 'Scoreboard',
147 'ScsiCtrl',
148 'ScsiDisk',
149 'ScsiNone',
150 'Serialize',
151 'SimpleCPU',
152 'SimpleDisk',
153 'SimpleDiskData',
154 'Sparc',
155 'Split',
156 'Stack',
157 'StatEvents',
158 'Stats',
159 'StoreSet',
160 'Syscall',
161 'SyscallVerbose',
162 'TCPIP',
163 'TLB',
164 'Thread',
165 'Timer',
166 'Tsunami',
167 'Uart',
168 'VtoPhys',
169 'WriteBarrier',
170 'Writeback',
171 ]
172
173 #
174 # "Compound" flags correspond to a set of base flags. These exist
175 # solely for convenience in setting them via the command line: if a
176 # compound flag is specified, all of the corresponding base flags are
177 # set. Compound flags cannot be used directly in DPRINTFs etc.
178 # To define a new compound flag, add a new entry to this hash
179 # following the existing examples.
180 #
181 compoundFlagMap = {
182 'All' : baseFlags,
183 'DiskImageAll' : [ 'DiskImage', 'DiskImageRead', 'DiskImageWrite' ],
184 'EthernetAll' : [ 'Ethernet', 'EthernetPIO', 'EthernetDMA',
185 'EthernetData' , 'EthernetDesc', 'EthernetIntr',
186 'EthernetSM', 'EthernetCksum' ],
187 'EthernetNoData' : [ 'Ethernet', 'EthernetPIO', 'EthernetDesc',
188 'EthernetIntr', 'EthernetSM', 'EthernetCksum' ],
189 'Exec' : [ 'ExecEnable', 'ExecTicks', 'ExecOpClass',
190 'ExecThread', 'ExecEffAddr', 'ExecResult',
191 'ExecSymbol' ],
192 'GDBAll' : [ 'GDBMisc', 'GDBAcc', 'GDBRead', 'GDBWrite', 'GDBSend',
193 'GDBRecv', 'GDBExtra' ],
194 'IdeAll' : [ 'IdeCtrl', 'IdeDisk' ],
195 'O3CPUAll' : [ 'Fetch', 'Decode', 'Rename', 'IEW', 'Commit', 'IQ',
196 'ROB', 'FreeList', 'RenameMap', 'LSQ', 'LSQUnit',
197 'StoreSet', 'MemDepUnit', 'DynInst', 'FullCPU',
198 'O3CPU', 'Activity','Scoreboard','Writeback' ],
199 'OzoneCPUAll' : [ 'BE', 'FE', 'IBE', 'OzoneLSQ', 'OzoneCPU' ],
200 'ScsiAll' : [ 'ScsiDisk', 'ScsiCtrl', 'ScsiNone' ]
201 }
202
203 # extract just the compound flag names into a list
204 compoundFlags = []
205 compoundFlags.extend(compoundFlagMap.keys())
206 compoundFlags.sort()
207
208 allFlags = frozenset(baseFlags + compoundFlags)
209
210 #############################################################
211 #
212 # Everything below this point generates the appropriate C++
213 # declarations and definitions for the trace flags. If you are simply
214 # adding or modifying flag definitions, you should not have to change
215 # anything below.
216 #
217 def gen_hh(filename):
218 #
219 # First generate the header file. This defines the Flag enum
220 # and some extern declarations for the .cc file.
221 #
222 try:
223 hhfile = file(filename, 'w')
224 except IOError, e:
225 sys.exit("can't open %s: %s" % (hhfilename, e))
226
227 # file header boilerplate
228 print >>hhfile, '''
229 /*
230 * DO NOT EDIT THIS FILE!
231 *
232 * Automatically generated from traceflags.py
233 */
234
235 #ifndef __BASE_TRACE_FLAGS_HH__
236 #define __BASE_TRACE_FLAGS_HH__
237
238 namespace Trace {
239
240 enum Flags {
241 ''',
242
243 # Generate the enum. Base flags come first, then compound flags.
244 idx = 0
245 for flag in baseFlags:
246 print >>hhfile, ' %s = %d,' % (flag, idx)
247 idx += 1
248
249 numBaseFlags = idx
250 print >>hhfile, ' NumFlags = %d,' % idx
251
252 # put a comment in here to separate base from compound flags
253 print >>hhfile, '''
254 // The remaining enum values are *not* valid indices for Trace::flags.
255 // They are "compound" flags, which correspond to sets of base
256 // flags, and are used only by TraceParamContext::setFlags().
257 ''',
258
259 for flag in compoundFlags:
260 print >>hhfile, ' %s = %d,' % (flag, idx)
261 idx += 1
262
263 numCompoundFlags = idx - numBaseFlags
264 print >>hhfile, ' NumCompoundFlags = %d' % numCompoundFlags
265
266 # trailer boilerplate
267 print >>hhfile, '''\
268 }; // enum Flags
269
270 // Array of strings for SimpleEnumParam
271 extern const char *flagStrings[];
272 extern const int numFlagStrings;
273
274 // Array of arraay pointers: for each compound flag, gives the list of
275 // base flags to set. Inidividual flag arrays are terminated by -1.
276 extern const Flags *compoundFlags[];
277
278 /* namespace Trace */ }
279
280 #endif // __BASE_TRACE_FLAGS_HH__
281 \n''',
282
283 hhfile.close()
284
285 def gen_cc(filename):
286 '''Print out .cc file with array definitions.'''
287
288 try:
289 ccfile = file(filename, 'w')
290 except OSError, e:
291 sys.exit("can't open %s: %s" % (ccfilename, e))
292
293 # file header
294 print >>ccfile, '''
295 /*
296 * DO NOT EDIT THIS FILE!
297 *
298 * Automatically generated from traceflags.pl.
299 */
300
301 #include "base/traceflags.hh"
302
303 using namespace Trace;
304
305 const char *Trace::flagStrings[] =
306 {
307 ''',
308
309 # The string array is used by SimpleEnumParam to map the strings
310 # provided by the user to enum values.
311 for flag in baseFlags:
312 print >>ccfile, ' "%s",' % flag
313
314 for flag in compoundFlags:
315 print >>ccfile, ' "%s",' % flag
316
317 print >>ccfile, '};\n'
318
319 numFlagStrings = len(baseFlags) + len(compoundFlags);
320
321 print >>ccfile, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
322 print >>ccfile
323
324 #
325 # Now define the individual compound flag arrays. There is an array
326 # for each compound flag listing the component base flags.
327 #
328
329 for flag in compoundFlags:
330 flags = compoundFlagMap[flag]
331 flags.append('(Flags)-1')
332 print >>ccfile, 'static const Flags %sMap[] =' % flag
333 print >>ccfile, '{ %s };' % (', '.join(flags))
334 print >>ccfile
335
336 #
337 # Finally the compoundFlags[] array maps the compound flags
338 # to their individual arrays/
339 #
340 print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
341 print >>ccfile, '{'
342
343 for flag in compoundFlags:
344 print >>ccfile, ' %sMap,' % flag
345
346 # file trailer
347 print >>ccfile, '};'
348
349 ccfile.close()
350
351 if __name__ == '__main__':
352 # This file generates the header and source files for the flags
353 # that control the tracing facility.
354
355 import sys
356
357 if len(sys.argv) != 2:
358 print "%s: Need argument (basename of cc/hh files)" % sys.argv[0]
359 sys.exit(1)
360
361 gen_hh(sys.argv[1] + '.hh')
362 gen_cc(sys.argv[1] + '.cc')