trace: reimplement the DTRACE function so it doesn't use a vector
At the same time, rename the trace flags to debug flags since they have broader usage than simply tracing. This means that --trace-flags is now --debug-flags and --trace-help is now --debug-help
This commit is contained in:
@@ -29,3 +29,65 @@
|
||||
import internal
|
||||
|
||||
from internal.debug import schedBreakCycle, setRemoteGDBPort
|
||||
|
||||
def help():
|
||||
print "Base Flags:"
|
||||
for flag in flags.basic:
|
||||
print " %s: %s" % (flag, flags.descriptions[flag])
|
||||
print
|
||||
print "Compound Flags:"
|
||||
for flag in flags.compound:
|
||||
if flag == 'All':
|
||||
continue
|
||||
print " %s: %s" % (flag, flags.descriptions[flag])
|
||||
util.printList(flags.compoundMap[flag], indent=8)
|
||||
print
|
||||
|
||||
class AllFlags(object):
|
||||
def __init__(self):
|
||||
self._version = -1
|
||||
self._dict = {}
|
||||
|
||||
def _update(self):
|
||||
current_version = internal.debug.getAllFlagsVersion()
|
||||
if self._version == current_version:
|
||||
return
|
||||
|
||||
self._dict.clear()
|
||||
for flag in internal.debug.getAllFlags():
|
||||
self._dict[flag.name()] = flag
|
||||
self._version = current_version
|
||||
|
||||
def __contains__(self, item):
|
||||
self._update()
|
||||
return item in self._dict
|
||||
|
||||
def __getitem__(self, item):
|
||||
self._update()
|
||||
return self._dict[item]
|
||||
|
||||
def keys(self):
|
||||
self._update()
|
||||
return self._dict.keys()
|
||||
|
||||
def values(self):
|
||||
self._update()
|
||||
return self._dict.values()
|
||||
|
||||
def items(self):
|
||||
self._update()
|
||||
return self._dict.items()
|
||||
|
||||
def iterkeys(self):
|
||||
self._update()
|
||||
return self._dict.iterkeys()
|
||||
|
||||
def itervalues(self):
|
||||
self._update()
|
||||
return self._dict.itervalues()
|
||||
|
||||
def iteritems(self):
|
||||
self._update()
|
||||
return self._dict.iteritems()
|
||||
|
||||
flags = AllFlags()
|
||||
|
||||
@@ -98,15 +98,15 @@ add_option("--dump-config", metavar="FILE", default="config.ini",
|
||||
set_group("Debugging Options")
|
||||
add_option("--debug-break", metavar="TIME[,TIME]", action='append', split=',',
|
||||
help="Cycle to create a breakpoint")
|
||||
add_option("--debug-help", action='store_true',
|
||||
help="Print help on debug flags")
|
||||
add_option("--debug-flags", metavar="FLAG[,FLAG]", action='append', split=',',
|
||||
help="Sets the flags for debugging (-FLAG disables a flag)")
|
||||
add_option("--remote-gdb-port", type='int', default=7000,
|
||||
help="Remote gdb base port (set to 0 to disable listening)")
|
||||
|
||||
# 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 (-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",
|
||||
@@ -214,10 +214,10 @@ def main():
|
||||
print info.README
|
||||
print
|
||||
|
||||
if options.trace_help:
|
||||
if options.debug_help:
|
||||
done = True
|
||||
check_tracing()
|
||||
trace.help()
|
||||
debug.help()
|
||||
|
||||
if options.list_sim_objects:
|
||||
import SimObject
|
||||
@@ -284,30 +284,25 @@ def main():
|
||||
for when in options.debug_break:
|
||||
debug.schedBreakCycle(int(when))
|
||||
|
||||
if options.trace_flags:
|
||||
if options.debug_flags:
|
||||
check_tracing()
|
||||
|
||||
on_flags = []
|
||||
off_flags = []
|
||||
for flag in options.trace_flags:
|
||||
for flag in options.debug_flags:
|
||||
off = False
|
||||
if flag.startswith('-'):
|
||||
flag = flag[1:]
|
||||
off = True
|
||||
if flag not in trace.flags.all and flag != "All":
|
||||
print >>sys.stderr, "invalid trace flag '%s'" % flag
|
||||
|
||||
if flag not in debug.flags:
|
||||
print >>sys.stderr, "invalid debug flag '%s'" % flag
|
||||
sys.exit(1)
|
||||
|
||||
if off:
|
||||
off_flags.append(flag)
|
||||
debug.flags[flag].disable()
|
||||
else:
|
||||
on_flags.append(flag)
|
||||
|
||||
for flag in on_flags:
|
||||
trace.set(flag)
|
||||
|
||||
for flag in off_flags:
|
||||
trace.clear(flag)
|
||||
debug.flags[flag].enable()
|
||||
|
||||
if options.trace_start:
|
||||
check_tracing()
|
||||
|
||||
@@ -27,26 +27,12 @@
|
||||
# Authors: Nathan Binkert
|
||||
|
||||
import internal
|
||||
import traceflags as flags
|
||||
import util
|
||||
|
||||
from internal.trace import clear, output, set, ignore
|
||||
from internal.trace import output, ignore
|
||||
|
||||
def disable():
|
||||
internal.trace.cvar.enabled = False
|
||||
|
||||
def enable():
|
||||
internal.trace.cvar.enabled = True
|
||||
|
||||
def help():
|
||||
print "Base Flags:"
|
||||
for flag in flags.basic:
|
||||
print " %s: %s" % (flag, flags.descriptions[flag])
|
||||
print
|
||||
print "Compound Flags:"
|
||||
for flag in flags.compound:
|
||||
if flag == 'All':
|
||||
continue
|
||||
print " %s: %s" % (flag, flags.descriptions[flag])
|
||||
util.printList(flags.compoundMap[flag], indent=8)
|
||||
print
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2006 The Regents of The University of Michigan
|
||||
* Copyright (c) 2010 The Hewlett-Packard Development Company
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
@@ -31,11 +32,62 @@
|
||||
%module(package="m5.internal") debug
|
||||
|
||||
%{
|
||||
#include <cassert>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "base/debug.hh"
|
||||
#include "base/types.hh"
|
||||
#include "sim/debug.hh"
|
||||
|
||||
using namespace std;
|
||||
|
||||
typedef map<string, Debug::Flag *> FlagsMap;
|
||||
typedef vector<Debug::Flag *> FlagsVec;
|
||||
|
||||
namespace Debug {
|
||||
extern int allFlagsVersion;
|
||||
FlagsMap &allFlags();
|
||||
}
|
||||
|
||||
inline int
|
||||
getAllFlagsVersion()
|
||||
{
|
||||
return Debug::allFlagsVersion;
|
||||
}
|
||||
|
||||
inline FlagsVec
|
||||
getAllFlags()
|
||||
{
|
||||
FlagsMap &flagsMap = Debug::allFlags();
|
||||
|
||||
FlagsVec flags(flagsMap.size());
|
||||
|
||||
int index = 0;
|
||||
FlagsMap::iterator i = flagsMap.begin();
|
||||
FlagsMap::iterator end = flagsMap.end();
|
||||
for (; i != end; ++i) {
|
||||
assert(index < flags.size());
|
||||
flags[index++] = i->second;
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
%ignore Debug::SimpleFlag::operator!;
|
||||
|
||||
%include <std_string.i>
|
||||
%include <std_vector.i>
|
||||
%include <stdint.i>
|
||||
|
||||
%include "base/debug.hh"
|
||||
%include "base/types.hh"
|
||||
%include "sim/debug.hh"
|
||||
|
||||
%template(AllFlags) std::vector<Debug::Flag *>;
|
||||
|
||||
int getAllFlagsVersion();
|
||||
std::vector<Debug::Flag *> getAllFlags();
|
||||
|
||||
@@ -40,18 +40,6 @@ output(const char *filename)
|
||||
Trace::setOutput(filename);
|
||||
}
|
||||
|
||||
inline void
|
||||
set(const char *flag)
|
||||
{
|
||||
Trace::changeFlag(flag, true);
|
||||
}
|
||||
|
||||
inline void
|
||||
clear(const char *flag)
|
||||
{
|
||||
Trace::changeFlag(flag, false);
|
||||
}
|
||||
|
||||
inline void
|
||||
ignore(const char *expr)
|
||||
{
|
||||
@@ -61,10 +49,6 @@ ignore(const char *expr)
|
||||
using Trace::enabled;
|
||||
%}
|
||||
|
||||
%inline %{
|
||||
extern void output(const char *string);
|
||||
extern void set(const char *string);
|
||||
extern void clear(const char *string);
|
||||
extern void ignore(const char *expr);
|
||||
extern bool enabled;
|
||||
%}
|
||||
|
||||
Reference in New Issue
Block a user