scons: Separate debug flags from debug-format flags
Debug flags are flags that aid with debugging by printing relevant information when enabled. Debug-formatting flags define how the debug flags will print the information. Although a viability, this patch does not support declaring compound format flags. As a side effect, now debug flags and debug-formatting flags are printed in different lists, when using --debug-help. Change-Id: Ieae68745276218cf4e9c1d37d7bf3bd1f19709ae Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br> Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/39076 Reviewed-by: Jason Lowe-Power <power.jg@gmail.com> Maintainer: Jason Lowe-Power <power.jg@gmail.com> Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
committed by
Daniel Carvalho
parent
58ccc6287e
commit
4ff5fa567b
@@ -618,20 +618,24 @@ Export('GTest')
|
||||
# Debug Flags
|
||||
#
|
||||
debug_flags = {}
|
||||
def DebugFlag(name, desc=None):
|
||||
def DebugFlag(name, desc=None, fmt=False):
|
||||
if name in debug_flags:
|
||||
raise AttributeError("Flag {} already specified".format(name))
|
||||
debug_flags[name] = (name, (), desc)
|
||||
debug_flags[name] = (name, (), desc, fmt)
|
||||
|
||||
def CompoundFlag(name, flags, desc=None):
|
||||
if name in debug_flags:
|
||||
raise AttributeError("Flag {} already specified".format(name))
|
||||
|
||||
compound = tuple(flags)
|
||||
debug_flags[name] = (name, compound, desc)
|
||||
debug_flags[name] = (name, compound, desc, False)
|
||||
|
||||
def DebugFormatFlag(name, desc=None):
|
||||
DebugFlag(name, desc, True)
|
||||
|
||||
Export('DebugFlag')
|
||||
Export('CompoundFlag')
|
||||
Export('DebugFormatFlag')
|
||||
|
||||
########################################################################
|
||||
#
|
||||
@@ -1109,11 +1113,14 @@ namespace Debug {
|
||||
''')
|
||||
|
||||
for name, flag in sorted(source[0].read().items()):
|
||||
n, compound, desc = flag
|
||||
n, compound, desc, fmt = flag
|
||||
assert n == name
|
||||
|
||||
if not compound:
|
||||
code('SimpleFlag $name("$name", "$desc");')
|
||||
if fmt:
|
||||
code('SimpleFlag $name("$name", "$desc", true);')
|
||||
else:
|
||||
code('SimpleFlag $name("$name", "$desc", false);')
|
||||
else:
|
||||
comp_code('CompoundFlag $name("$name", "$desc", {')
|
||||
comp_code.indent()
|
||||
@@ -1132,7 +1139,7 @@ def makeDebugFlagHH(target, source, env):
|
||||
assert(len(target) == 1 and len(source) == 1)
|
||||
|
||||
val = eval(source[0].get_contents())
|
||||
name, compound, desc = val
|
||||
name, compound, desc, fmt = val
|
||||
|
||||
code = code_formatter()
|
||||
|
||||
@@ -1168,7 +1175,7 @@ namespace Debug {
|
||||
code.write(str(target[0]))
|
||||
|
||||
for name,flag in sorted(debug_flags.items()):
|
||||
n, compound, desc = flag
|
||||
n, compound, desc, fmt = flag
|
||||
assert n == name
|
||||
|
||||
hh_file = 'debug/%s.hh' % name
|
||||
|
||||
@@ -102,10 +102,6 @@ GTest('chunk_generator.test', 'chunk_generator.test.cc')
|
||||
DebugFlag('Annotate', "State machine annotation debugging")
|
||||
DebugFlag('AnnotateQ', "State machine annotation queue debugging")
|
||||
DebugFlag('AnnotateVerbose', "Dump all state machine annotation details")
|
||||
DebugFlag('FmtFlag', "Show the --debug-flag that enabled each debug message")
|
||||
DebugFlag('FmtStackTrace',
|
||||
"Print a stack trace after every debug message")
|
||||
DebugFlag('FmtTicksOff', "Don't show tick count on debug messages")
|
||||
DebugFlag('GDBAcc', "Remote debugger accesses")
|
||||
DebugFlag('GDBExtra', "Dump extra information on reads and writes")
|
||||
DebugFlag('GDBMisc', "Breakpoints, traps, watchpoints, etc.")
|
||||
@@ -124,3 +120,8 @@ CompoundFlag('GDBAll',
|
||||
CompoundFlag('AnnotateAll', ['Annotate', 'AnnotateQ', 'AnnotateVerbose'],
|
||||
desc="All Annotation flags")
|
||||
|
||||
DebugFormatFlag('FmtFlag',
|
||||
"Show the --debug-flag that enabled each debug message")
|
||||
DebugFormatFlag('FmtStackTrace',
|
||||
"Print a stack trace after every debug message")
|
||||
DebugFormatFlag('FmtTicksOff', "Don't show tick count on debug messages")
|
||||
|
||||
@@ -81,18 +81,31 @@ class Flag
|
||||
class SimpleFlag : public Flag
|
||||
{
|
||||
protected:
|
||||
/** Whether this flag changes debug formatting. */
|
||||
const bool _isFormat = false;
|
||||
|
||||
bool _tracing = false; // tracing is enabled and flag is on
|
||||
bool _enabled = false; // flag enablement status
|
||||
|
||||
void sync() override { _tracing = _globalEnable && _enabled; }
|
||||
|
||||
public:
|
||||
SimpleFlag(const char *name, const char *desc) : Flag(name, desc) {}
|
||||
SimpleFlag(const char *name, const char *desc, bool is_format=false)
|
||||
: Flag(name, desc), _isFormat(is_format)
|
||||
{}
|
||||
|
||||
bool enabled() const override { return _tracing; }
|
||||
|
||||
void enable() override { _enabled = true; sync(); }
|
||||
void disable() override { _enabled = false; sync(); }
|
||||
|
||||
/**
|
||||
* Checks whether this flag is a conventional debug flag, or a flag that
|
||||
* modifies the way debug information is printed.
|
||||
*
|
||||
* @return True if this flag is a debug-formatting flag.
|
||||
*/
|
||||
bool isFormat() const { return _isFormat; }
|
||||
};
|
||||
|
||||
class CompoundFlag : public Flag
|
||||
|
||||
@@ -60,6 +60,17 @@ TEST(DebugFlagDeathTest, UniqueNames)
|
||||
EXPECT_EQ(expected, actual);
|
||||
}
|
||||
|
||||
/** Test format attribute. */
|
||||
TEST(DebugFlagTest, IsFormat)
|
||||
{
|
||||
Debug::SimpleFlag flag_a("FlagIsFormatTestA", "", true);
|
||||
EXPECT_TRUE(flag_a.isFormat());
|
||||
Debug::SimpleFlag flag_b("FlagIsFormatTestB", "", false);
|
||||
EXPECT_FALSE(flag_b.isFormat());
|
||||
Debug::SimpleFlag flag_c("FlagIsFormatTestC", "");
|
||||
EXPECT_FALSE(flag_c.isFormat());
|
||||
}
|
||||
|
||||
/** Test enabling and disabling simple flags, as well as the global enabler. */
|
||||
TEST(DebugSimpleFlagTest, Enabled)
|
||||
{
|
||||
|
||||
@@ -35,8 +35,8 @@ def help():
|
||||
sorted_flags = sorted(flags.items(), key=lambda kv: kv[0])
|
||||
|
||||
print("Base Flags:")
|
||||
for name, flag in filter(lambda kv: not isinstance(kv[1], CompoundFlag),
|
||||
sorted_flags):
|
||||
for name, flag in filter(lambda kv: isinstance(kv[1], SimpleFlag)
|
||||
and not kv[1].isFormat, sorted_flags):
|
||||
print(" %s: %s" % (name, flag.desc))
|
||||
print()
|
||||
print("Compound Flags:")
|
||||
@@ -45,6 +45,11 @@ def help():
|
||||
print(" %s: %s" % (name, flag.desc))
|
||||
printList([ c.name for c in flag.kids() ], indent=8)
|
||||
print()
|
||||
print("Formatting Flags:")
|
||||
for name, flag in filter(lambda kv: isinstance(kv[1], SimpleFlag)
|
||||
and kv[1].isFormat, sorted_flags):
|
||||
print(" %s: %s" % (name, flag.desc))
|
||||
print()
|
||||
|
||||
class AllFlags(Mapping):
|
||||
def __init__(self):
|
||||
|
||||
@@ -110,7 +110,9 @@ pybind_init_debug(py::module_ &m_native)
|
||||
})
|
||||
;
|
||||
|
||||
py::class_<Debug::SimpleFlag>(m_debug, "SimpleFlag", c_flag);
|
||||
py::class_<Debug::SimpleFlag>(m_debug, "SimpleFlag", c_flag)
|
||||
.def_property_readonly("isFormat", &Debug::SimpleFlag::isFormat)
|
||||
;
|
||||
py::class_<Debug::CompoundFlag>(m_debug, "CompoundFlag", c_flag)
|
||||
.def("kids", &Debug::CompoundFlag::kids)
|
||||
;
|
||||
|
||||
Reference in New Issue
Block a user