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:
Daniel R. Carvalho
2021-01-13 20:58:47 -03:00
committed by Daniel Carvalho
parent 58ccc6287e
commit 4ff5fa567b
6 changed files with 54 additions and 15 deletions

View File

@@ -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

View File

@@ -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")

View File

@@ -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

View File

@@ -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)
{

View File

@@ -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):

View File

@@ -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)
;