# 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')
########################################################################
#
''')
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()
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()
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
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.")
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")
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
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)
{
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:")
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):
})
;
- 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)
;