Rearrange traceflags.py so that the file generation only happens if

the script is invoked as main.  This allows us to import traceflags.py
if we just want the list of available flags.
Embed traceflags.py into the zipfile so it can be accessed from the
python side of things.  With this, print an error on invalid flags and
add --trace-help option that will print out the list of trace flags
that are compiled in.  If a flag is prefixed with a '-', now that flag
will be disabled.

--HG--
extra : convert_revision : 2260a596b07d127c582ff73474dbbdb0583db524
This commit is contained in:
Nathan Binkert 2007-02-13 00:16:41 -08:00
parent f72a999393
commit d7c1436a44
3 changed files with 163 additions and 115 deletions

View file

@ -29,19 +29,7 @@
# Authors: Nathan Binkert
# Steve Reinhardt
#
# This file generates the header and source files for the flags
# that control the tracing facility.
#
import sys
if len(sys.argv) != 2:
print "%s: Need argument (basename of cc/hh files)" % sys.argv[0]
sys.exit(1)
hhfilename = sys.argv[1] + '.hh'
ccfilename = sys.argv[1] + '.cc'
__all__ = [ 'allFlags', 'baseFlags', 'compoundFlagsMap', 'compoundFlags' ]
#
# The list of trace flags that can be used to condition DPRINTFs etc.
@ -196,6 +184,13 @@ compoundFlagMap = {
'ScsiAll' : [ 'ScsiDisk', 'ScsiCtrl', 'ScsiNone' ]
}
# extract just the compound flag names into a list
compoundFlags = []
compoundFlags.extend(compoundFlagMap.keys())
compoundFlags.sort()
allFlags = frozenset(baseFlags + compoundFlags)
#############################################################
#
# Everything below this point generates the appropriate C++
@ -203,93 +198,84 @@ compoundFlagMap = {
# adding or modifying flag definitions, you should not have to change
# anything below.
#
def gen_hh(filename):
#
# First generate the header file. This defines the Flag enum
# and some extern declarations for the .cc file.
#
try:
hhfile = file(filename, 'w')
except IOError, e:
sys.exit("can't open %s: %s" % (hhfilename, e))
import sys
# file header boilerplate
print >>hhfile, '''
/*
* DO NOT EDIT THIS FILE!
*
* Automatically generated from traceflags.py
*/
# extract just the compound flag names into a list
compoundFlags = []
compoundFlags.extend(compoundFlagMap.keys())
compoundFlags.sort()
#ifndef __BASE_TRACE_FLAGS_HH__
#define __BASE_TRACE_FLAGS_HH__
#
# First generate the header file. This defines the Flag enum
# and some extern declarations for the .cc file.
#
try:
hhfile = file(hhfilename, 'w')
except IOError, e:
sys.exit("can't open %s: %s" % (hhfilename, e))
namespace Trace {
# file header boilerplate
print >>hhfile, '''
/*
* DO NOT EDIT THIS FILE!
*
* Automatically generated from traceflags.py
*/
enum Flags {
''',
#ifndef __BASE_TRACE_FLAGS_HH__
#define __BASE_TRACE_FLAGS_HH__
# Generate the enum. Base flags come first, then compound flags.
idx = 0
for flag in baseFlags:
print >>hhfile, ' %s = %d,' % (flag, idx)
idx += 1
namespace Trace {
numBaseFlags = idx
print >>hhfile, ' NumFlags = %d,' % idx
enum Flags {
''',
# put a comment in here to separate base from compound flags
print >>hhfile, '''
// The remaining enum values are *not* valid indices for Trace::flags.
// They are "compound" flags, which correspond to sets of base
// flags, and are used only by TraceParamContext::setFlags().
''',
# Generate the enum. Base flags come first, then compound flags.
idx = 0
for flag in baseFlags:
print >>hhfile, ' %s = %d,' % (flag, idx)
idx += 1
for flag in compoundFlags:
print >>hhfile, ' %s = %d,' % (flag, idx)
idx += 1
numBaseFlags = idx
print >>hhfile, ' NumFlags = %d,' % idx
numCompoundFlags = idx - numBaseFlags
print >>hhfile, ' NumCompoundFlags = %d' % numCompoundFlags
# put a comment in here to separate base from compound flags
print >>hhfile, '''
// The remaining enum values are *not* valid indices for Trace::flags.
// They are "compound" flags, which correspond to sets of base
// flags, and are used only by TraceParamContext::setFlags().
''',
# trailer boilerplate
print >>hhfile, '''\
}; // enum Flags
for flag in compoundFlags:
print >>hhfile, ' %s = %d,' % (flag, idx)
idx += 1
// Array of strings for SimpleEnumParam
extern const char *flagStrings[];
extern const int numFlagStrings;
numCompoundFlags = idx - numBaseFlags
print >>hhfile, ' NumCompoundFlags = %d' % numCompoundFlags
// Array of arraay pointers: for each compound flag, gives the list of
// base flags to set. Inidividual flag arrays are terminated by -1.
extern const Flags *compoundFlags[];
# trailer boilerplate
print >>hhfile, '''\
}; // enum Flags
/* namespace Trace */ }
// Array of strings for SimpleEnumParam
extern const char *flagStrings[];
extern const int numFlagStrings;
#endif // __BASE_TRACE_FLAGS_HH__
''',
// Array of arraay pointers: for each compound flag, gives the list of
// base flags to set. Inidividual flag arrays are terminated by -1.
extern const Flags *compoundFlags[];
hhfile.close()
/* namespace Trace */ }
def gen_cc(filename):
'''Print out .cc file with array definitions.'''
#endif // __BASE_TRACE_FLAGS_HH__
''',
try:
ccfile = file(filename, 'w')
except OSError, e:
sys.exit("can't open %s: %s" % (ccfilename, e))
hhfile.close()
#
#
# Print out .cc file with array definitions.
#
#
try:
ccfile = file(ccfilename, 'w')
except OSError, e:
sys.exit("can't open %s: %s" % (ccfilename, e))
# file header
print >>ccfile, '''
# file header
print >>ccfile, '''
/*
* DO NOT EDIT THIS FILE!
*
@ -304,45 +290,57 @@ const char *Trace::flagStrings[] =
{
''',
# The string array is used by SimpleEnumParam to map the strings
# provided by the user to enum values.
for flag in baseFlags:
print >>ccfile, ' "%s",' % flag
# The string array is used by SimpleEnumParam to map the strings
# provided by the user to enum values.
for flag in baseFlags:
print >>ccfile, ' "%s",' % flag
for flag in compoundFlags:
print >>ccfile, ' "%s",' % flag
for flag in compoundFlags:
print >>ccfile, ' "%s",' % flag
print >>ccfile, '};\n'
print >>ccfile, '};\n'
numFlagStrings = len(baseFlags) + len(compoundFlags);
numFlagStrings = len(baseFlags) + len(compoundFlags);
print >>ccfile, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
print >>ccfile
#
# Now define the individual compound flag arrays. There is an array
# for each compound flag listing the component base flags.
#
for flag in compoundFlags:
flags = compoundFlagMap[flag]
flags.append('(Flags)-1')
print >>ccfile, 'static const Flags %sMap[] =' % flag
print >>ccfile, '{ %s };' % (', '.join(flags))
print >>ccfile, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
print >>ccfile
#
# Finally the compoundFlags[] array maps the compound flags
# to their individual arrays/
#
print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
print >>ccfile, '{'
#
# Now define the individual compound flag arrays. There is an array
# for each compound flag listing the component base flags.
#
for flag in compoundFlags:
print >>ccfile, ' %sMap,' % flag
for flag in compoundFlags:
flags = compoundFlagMap[flag]
flags.append('(Flags)-1')
print >>ccfile, 'static const Flags %sMap[] =' % flag
print >>ccfile, '{ %s };' % (', '.join(flags))
print >>ccfile
# file trailer
print >>ccfile, '};'
#
# Finally the compoundFlags[] array maps the compound flags
# to their individual arrays/
#
print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
print >>ccfile, '{'
ccfile.close()
for flag in compoundFlags:
print >>ccfile, ' %sMap,' % flag
# file trailer
print >>ccfile, '};'
ccfile.close()
if __name__ == '__main__':
# This file generates the header and source files for the flags
# that control the tracing facility.
import sys
if len(sys.argv) != 2:
print "%s: Need argument (basename of cc/hh files)" % sys.argv[0]
sys.exit(1)
gen_hh(sys.argv[1] + '.hh')
gen_cc(sys.argv[1] + '.cc')

View file

@ -97,6 +97,7 @@ addPkg('m5')
pyzip_files.append('m5/defines.py')
pyzip_files.append('m5/info.py')
pyzip_files.append(join(env['ROOT'], 'util/pbs/jobfile.py'))
pyzip_files.append(join(env['ROOT'], 'src/base/traceflags.py'))
def swig_it(basename):
env.Command(['swig/%s_wrap.cc' % basename, 'm5/internal/%s.py' % basename],

View file

@ -29,6 +29,7 @@
import code, optparse, os, socket, sys
from datetime import datetime
from attrdict import attrdict
import traceflags
__all__ = [ 'options', 'arguments', 'main' ]
@ -40,6 +41,19 @@ The Regents of The University of Michigan
All Rights Reserved
'''
def print_list(items, indent=4):
line = ' ' * indent
for i,item in enumerate(items):
if len(line) + len(item) > 76:
print line
line = ' ' * indent
if i < len(items) - 1:
line += '%s, ' % item
else:
line += item
print line
# there's only one option parsing done, so make it global and add some
# helper functions to make it work well.
parser = optparse.OptionParser(usage=usage, version=version,
@ -135,8 +149,10 @@ add_option("--debug-break", metavar="TIME[,TIME]", action='append', split=',',
# Tracing options
set_group("Trace Options")
add_option("--trace-help", action='store_true',
help="Print help on trace flags")
add_option("--trace-flags", metavar="FLAG[,FLAG]", action='append', split=',',
help="Sets the flags for tracing")
help="Sets the flags for tracing (-FLAG disables a flag)")
add_option("--trace-start", metavar="TIME", type='int',
help="Start tracing at TIME (must be in ticks)")
add_option("--trace-file", metavar="FILE", default="cout",
@ -231,6 +247,19 @@ def main():
print info.RELEASE_NOTES
print
if options.trace_help:
done = True
print "Base Flags:"
print_list(traceflags.baseFlags, indent=4)
print
print "Compound Flags:"
for flag in traceflags.compoundFlags:
if flag == 'All':
continue
print " %s:" % flag
print_list(traceflags.compoundFlagMap[flag], indent=8)
print
if done:
sys.exit(0)
@ -250,6 +279,7 @@ def main():
if not arguments or not os.path.isfile(arguments[0]):
if arguments and not os.path.isfile(arguments[0]):
print "Script %s not found" % arguments[0]
usage(2)
# tell C++ about output directory
@ -267,9 +297,28 @@ def main():
for when in options.debug_break:
internal.debug.schedBreakCycle(int(when))
on_flags = []
off_flags = []
for flag in options.trace_flags:
off = False
if flag.startswith('-'):
flag = flag[1:]
off = True
if flag not in traceflags.allFlags:
print >>sys.stderr, "invalid trace flag '%s'" % flag
sys.exit(1)
if off:
off_flags.append(flag)
else:
on_flags.append(flag)
for flag in on_flags:
internal.trace.set(flag)
for flag in off_flags:
internal.trace.clear(flag)
if options.trace_start is not None:
internal.trace.enabled = False
def enable_trace():