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:
parent
f72a999393
commit
d7c1436a44
|
@ -29,19 +29,7 @@
|
||||||
# Authors: Nathan Binkert
|
# Authors: Nathan Binkert
|
||||||
# Steve Reinhardt
|
# Steve Reinhardt
|
||||||
|
|
||||||
#
|
__all__ = [ 'allFlags', 'baseFlags', 'compoundFlagsMap', 'compoundFlags' ]
|
||||||
# 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'
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# The list of trace flags that can be used to condition DPRINTFs etc.
|
# The list of trace flags that can be used to condition DPRINTFs etc.
|
||||||
|
@ -196,6 +184,13 @@ compoundFlagMap = {
|
||||||
'ScsiAll' : [ 'ScsiDisk', 'ScsiCtrl', 'ScsiNone' ]
|
'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++
|
# Everything below this point generates the appropriate C++
|
||||||
|
@ -203,93 +198,84 @@ compoundFlagMap = {
|
||||||
# adding or modifying flag definitions, you should not have to change
|
# adding or modifying flag definitions, you should not have to change
|
||||||
# anything below.
|
# anything below.
|
||||||
#
|
#
|
||||||
|
def gen_hh(filename):
|
||||||
import sys
|
#
|
||||||
|
# First generate the header file. This defines the Flag enum
|
||||||
# extract just the compound flag names into a list
|
# and some extern declarations for the .cc file.
|
||||||
compoundFlags = []
|
#
|
||||||
compoundFlags.extend(compoundFlagMap.keys())
|
try:
|
||||||
compoundFlags.sort()
|
hhfile = file(filename, 'w')
|
||||||
|
except IOError, e:
|
||||||
#
|
|
||||||
# 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))
|
sys.exit("can't open %s: %s" % (hhfilename, e))
|
||||||
|
|
||||||
# file header boilerplate
|
# file header boilerplate
|
||||||
print >>hhfile, '''
|
print >>hhfile, '''
|
||||||
/*
|
/*
|
||||||
* DO NOT EDIT THIS FILE!
|
* DO NOT EDIT THIS FILE!
|
||||||
*
|
*
|
||||||
* Automatically generated from traceflags.py
|
* Automatically generated from traceflags.py
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __BASE_TRACE_FLAGS_HH__
|
#ifndef __BASE_TRACE_FLAGS_HH__
|
||||||
#define __BASE_TRACE_FLAGS_HH__
|
#define __BASE_TRACE_FLAGS_HH__
|
||||||
|
|
||||||
namespace Trace {
|
namespace Trace {
|
||||||
|
|
||||||
enum Flags {
|
enum Flags {
|
||||||
''',
|
''',
|
||||||
|
|
||||||
# Generate the enum. Base flags come first, then compound flags.
|
# Generate the enum. Base flags come first, then compound flags.
|
||||||
idx = 0
|
idx = 0
|
||||||
for flag in baseFlags:
|
for flag in baseFlags:
|
||||||
print >>hhfile, ' %s = %d,' % (flag, idx)
|
print >>hhfile, ' %s = %d,' % (flag, idx)
|
||||||
idx += 1
|
idx += 1
|
||||||
|
|
||||||
numBaseFlags = idx
|
numBaseFlags = idx
|
||||||
print >>hhfile, ' NumFlags = %d,' % idx
|
print >>hhfile, ' NumFlags = %d,' % idx
|
||||||
|
|
||||||
# put a comment in here to separate base from compound flags
|
# put a comment in here to separate base from compound flags
|
||||||
print >>hhfile, '''
|
print >>hhfile, '''
|
||||||
// The remaining enum values are *not* valid indices for Trace::flags.
|
// The remaining enum values are *not* valid indices for Trace::flags.
|
||||||
// They are "compound" flags, which correspond to sets of base
|
// They are "compound" flags, which correspond to sets of base
|
||||||
// flags, and are used only by TraceParamContext::setFlags().
|
// flags, and are used only by TraceParamContext::setFlags().
|
||||||
''',
|
''',
|
||||||
|
|
||||||
for flag in compoundFlags:
|
for flag in compoundFlags:
|
||||||
print >>hhfile, ' %s = %d,' % (flag, idx)
|
print >>hhfile, ' %s = %d,' % (flag, idx)
|
||||||
idx += 1
|
idx += 1
|
||||||
|
|
||||||
numCompoundFlags = idx - numBaseFlags
|
numCompoundFlags = idx - numBaseFlags
|
||||||
print >>hhfile, ' NumCompoundFlags = %d' % numCompoundFlags
|
print >>hhfile, ' NumCompoundFlags = %d' % numCompoundFlags
|
||||||
|
|
||||||
# trailer boilerplate
|
# trailer boilerplate
|
||||||
print >>hhfile, '''\
|
print >>hhfile, '''\
|
||||||
}; // enum Flags
|
}; // enum Flags
|
||||||
|
|
||||||
// Array of strings for SimpleEnumParam
|
// Array of strings for SimpleEnumParam
|
||||||
extern const char *flagStrings[];
|
extern const char *flagStrings[];
|
||||||
extern const int numFlagStrings;
|
extern const int numFlagStrings;
|
||||||
|
|
||||||
// Array of arraay pointers: for each compound flag, gives the list of
|
// Array of arraay pointers: for each compound flag, gives the list of
|
||||||
// base flags to set. Inidividual flag arrays are terminated by -1.
|
// base flags to set. Inidividual flag arrays are terminated by -1.
|
||||||
extern const Flags *compoundFlags[];
|
extern const Flags *compoundFlags[];
|
||||||
|
|
||||||
/* namespace Trace */ }
|
/* namespace Trace */ }
|
||||||
|
|
||||||
#endif // __BASE_TRACE_FLAGS_HH__
|
#endif // __BASE_TRACE_FLAGS_HH__
|
||||||
''',
|
''',
|
||||||
|
|
||||||
hhfile.close()
|
hhfile.close()
|
||||||
|
|
||||||
#
|
def gen_cc(filename):
|
||||||
#
|
'''Print out .cc file with array definitions.'''
|
||||||
# Print out .cc file with array definitions.
|
|
||||||
#
|
try:
|
||||||
#
|
ccfile = file(filename, 'w')
|
||||||
try:
|
except OSError, e:
|
||||||
ccfile = file(ccfilename, 'w')
|
|
||||||
except OSError, e:
|
|
||||||
sys.exit("can't open %s: %s" % (ccfilename, e))
|
sys.exit("can't open %s: %s" % (ccfilename, e))
|
||||||
|
|
||||||
# file header
|
# file header
|
||||||
print >>ccfile, '''
|
print >>ccfile, '''
|
||||||
/*
|
/*
|
||||||
* DO NOT EDIT THIS FILE!
|
* DO NOT EDIT THIS FILE!
|
||||||
*
|
*
|
||||||
|
@ -304,45 +290,57 @@ const char *Trace::flagStrings[] =
|
||||||
{
|
{
|
||||||
''',
|
''',
|
||||||
|
|
||||||
# The string array is used by SimpleEnumParam to map the strings
|
# The string array is used by SimpleEnumParam to map the strings
|
||||||
# provided by the user to enum values.
|
# provided by the user to enum values.
|
||||||
for flag in baseFlags:
|
for flag in baseFlags:
|
||||||
print >>ccfile, ' "%s",' % flag
|
print >>ccfile, ' "%s",' % flag
|
||||||
|
|
||||||
for flag in compoundFlags:
|
for flag in compoundFlags:
|
||||||
print >>ccfile, ' "%s",' % flag
|
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, 'const int Trace::numFlagStrings = %d;' % numFlagStrings
|
||||||
print >>ccfile
|
print >>ccfile
|
||||||
|
|
||||||
#
|
#
|
||||||
# Now define the individual compound flag arrays. There is an array
|
# Now define the individual compound flag arrays. There is an array
|
||||||
# for each compound flag listing the component base flags.
|
# for each compound flag listing the component base flags.
|
||||||
#
|
#
|
||||||
|
|
||||||
for flag in compoundFlags:
|
for flag in compoundFlags:
|
||||||
flags = compoundFlagMap[flag]
|
flags = compoundFlagMap[flag]
|
||||||
flags.append('(Flags)-1')
|
flags.append('(Flags)-1')
|
||||||
print >>ccfile, 'static const Flags %sMap[] =' % flag
|
print >>ccfile, 'static const Flags %sMap[] =' % flag
|
||||||
print >>ccfile, '{ %s };' % (', '.join(flags))
|
print >>ccfile, '{ %s };' % (', '.join(flags))
|
||||||
print >>ccfile
|
print >>ccfile
|
||||||
|
|
||||||
#
|
#
|
||||||
# Finally the compoundFlags[] array maps the compound flags
|
# Finally the compoundFlags[] array maps the compound flags
|
||||||
# to their individual arrays/
|
# to their individual arrays/
|
||||||
#
|
#
|
||||||
print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
|
print >>ccfile, 'const Flags *Trace::compoundFlags[] ='
|
||||||
print >>ccfile, '{'
|
print >>ccfile, '{'
|
||||||
|
|
||||||
for flag in compoundFlags:
|
for flag in compoundFlags:
|
||||||
print >>ccfile, ' %sMap,' % flag
|
print >>ccfile, ' %sMap,' % flag
|
||||||
|
|
||||||
# file trailer
|
# file trailer
|
||||||
print >>ccfile, '};'
|
print >>ccfile, '};'
|
||||||
|
|
||||||
ccfile.close()
|
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')
|
||||||
|
|
|
@ -97,6 +97,7 @@ addPkg('m5')
|
||||||
pyzip_files.append('m5/defines.py')
|
pyzip_files.append('m5/defines.py')
|
||||||
pyzip_files.append('m5/info.py')
|
pyzip_files.append('m5/info.py')
|
||||||
pyzip_files.append(join(env['ROOT'], 'util/pbs/jobfile.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):
|
def swig_it(basename):
|
||||||
env.Command(['swig/%s_wrap.cc' % basename, 'm5/internal/%s.py' % basename],
|
env.Command(['swig/%s_wrap.cc' % basename, 'm5/internal/%s.py' % basename],
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
import code, optparse, os, socket, sys
|
import code, optparse, os, socket, sys
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from attrdict import attrdict
|
from attrdict import attrdict
|
||||||
|
import traceflags
|
||||||
|
|
||||||
__all__ = [ 'options', 'arguments', 'main' ]
|
__all__ = [ 'options', 'arguments', 'main' ]
|
||||||
|
|
||||||
|
@ -40,6 +41,19 @@ The Regents of The University of Michigan
|
||||||
All Rights Reserved
|
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
|
# there's only one option parsing done, so make it global and add some
|
||||||
# helper functions to make it work well.
|
# helper functions to make it work well.
|
||||||
parser = optparse.OptionParser(usage=usage, version=version,
|
parser = optparse.OptionParser(usage=usage, version=version,
|
||||||
|
@ -135,8 +149,10 @@ add_option("--debug-break", metavar="TIME[,TIME]", action='append', split=',',
|
||||||
|
|
||||||
# Tracing options
|
# Tracing options
|
||||||
set_group("Trace 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=',',
|
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',
|
add_option("--trace-start", metavar="TIME", type='int',
|
||||||
help="Start tracing at TIME (must be in ticks)")
|
help="Start tracing at TIME (must be in ticks)")
|
||||||
add_option("--trace-file", metavar="FILE", default="cout",
|
add_option("--trace-file", metavar="FILE", default="cout",
|
||||||
|
@ -231,6 +247,19 @@ def main():
|
||||||
print info.RELEASE_NOTES
|
print info.RELEASE_NOTES
|
||||||
print
|
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:
|
if done:
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
@ -250,6 +279,7 @@ def main():
|
||||||
if not arguments or not os.path.isfile(arguments[0]):
|
if not arguments or not os.path.isfile(arguments[0]):
|
||||||
if arguments and not os.path.isfile(arguments[0]):
|
if arguments and not os.path.isfile(arguments[0]):
|
||||||
print "Script %s not found" % arguments[0]
|
print "Script %s not found" % arguments[0]
|
||||||
|
|
||||||
usage(2)
|
usage(2)
|
||||||
|
|
||||||
# tell C++ about output directory
|
# tell C++ about output directory
|
||||||
|
@ -267,9 +297,28 @@ def main():
|
||||||
for when in options.debug_break:
|
for when in options.debug_break:
|
||||||
internal.debug.schedBreakCycle(int(when))
|
internal.debug.schedBreakCycle(int(when))
|
||||||
|
|
||||||
|
on_flags = []
|
||||||
|
off_flags = []
|
||||||
for flag in options.trace_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)
|
internal.trace.set(flag)
|
||||||
|
|
||||||
|
for flag in off_flags:
|
||||||
|
internal.trace.clear(flag)
|
||||||
|
|
||||||
if options.trace_start is not None:
|
if options.trace_start is not None:
|
||||||
internal.trace.enabled = False
|
internal.trace.enabled = False
|
||||||
def enable_trace():
|
def enable_trace():
|
||||||
|
|
Loading…
Reference in a new issue