base: Cleanup debug flags API
authorAndreas Sandberg <andreas.sandberg@arm.com>
Fri, 4 Sep 2020 15:01:24 +0000 (16:01 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Mon, 7 Sep 2020 08:42:07 +0000 (08:42 +0000)
The debug flags API has a couple of quirks that should be cleaned
up. Specifically:

 * Only CompoundFlag should expose a list of children.
 * The global enable flag is just called "active", this isn't very
   descriptive.
 * Only SimpleFlag exposed a status member. This should be in the base
   class to make the API symmetric.
 * Flag::Sync() is an implementation detail and needs to be protected.

Change-Id: I4d7fd32c80891191aa04f0bd0c334c8cf8d372f5
Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/34118
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/base/debug.cc
src/base/debug.hh
src/base/trace.cc
src/python/m5/debug.py
src/python/pybind11/debug.cc

index 47febd0cd7e8f8d0ea9908aa0148be17a3a9ceaa..45d9f9d59c7038cf21ea0aca87c7fdadb47314fc 100644 (file)
@@ -1,4 +1,16 @@
 /*
+ * Copyright (c) 2020 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
  * Copyright (c) 2003-2005 The Regents of The University of Michigan
  * All rights reserved.
  *
@@ -67,7 +79,7 @@ allFlags()
     return flags;
 }
 
-bool SimpleFlag::_active = false;
+bool Flag::_globalEnable = false;
 
 Flag *
 findFlag(const std::string &name)
@@ -96,17 +108,17 @@ Flag::~Flag()
 }
 
 void
-SimpleFlag::enableAll()
+Flag::globalEnable()
 {
-    _active = true;
+    _globalEnable = true;
     for (auto& i : allFlags())
         i.second->sync();
 }
 
 void
-SimpleFlag::disableAll()
+Flag::globalDisable()
 {
-    _active = false;
+    _globalEnable = false;
     for (auto& i : allFlags())
         i.second->sync();
 }
@@ -125,6 +137,19 @@ CompoundFlag::disable()
         k->disable();
 }
 
+bool
+CompoundFlag::status() const
+{
+    if (_kids.empty())
+        return false;
+
+    for (auto& k : _kids) {
+        if (!k->status())
+            return false;
+    }
+
+    return true;
+}
 
 bool
 changeFlag(const char *s, bool value)
index 1d35be055a81d577c3998e149cbd881a9ce6fad0..a5dc43c43ca658c7c3eeac9952ae89d1ba2dcef1 100644 (file)
@@ -1,4 +1,16 @@
 /*
+ * Copyright (c) 2020 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
  * Copyright (c) 2003-2005 The Regents of The University of Michigan
  * Copyright (c) 2010 The Hewlett-Packard Development Company
  * All rights reserved.
@@ -42,45 +54,48 @@ void breakpoint();
 class Flag
 {
   protected:
+    static bool _globalEnable; // whether debug tracings are enabled
+
     const char *_name;
     const char *_desc;
 
+    virtual void sync() { }
+
   public:
     Flag(const char *name, const char *desc);
     virtual ~Flag();
 
     std::string name() const { return _name; }
     std::string desc() const { return _desc; }
-    virtual std::vector<Flag *> kids() { return std::vector<Flag*>(); }
 
     virtual void enable() = 0;
     virtual void disable() = 0;
-    virtual void sync() {}
+    virtual bool status() const = 0;
+
+    operator bool() const { return status(); }
+    bool operator!() const { return !status(); }
+
+    static void globalEnable();
+    static void globalDisable();
 };
 
 class SimpleFlag : public Flag
 {
-    static bool _active; // whether debug tracings are enabled
   protected:
     bool _tracing; // tracing is enabled and flag is on
     bool _status;  // flag status
 
+    void sync() override { _tracing = _globalEnable && _status; }
+
   public:
     SimpleFlag(const char *name, const char *desc)
         : Flag(name, desc), _status(false)
     { }
 
-    bool status() const { return _tracing; }
-    operator bool() const { return _tracing; }
-    bool operator!() const { return !_tracing; }
-
-    void enable()  { _status = true;  sync(); }
-    void disable() { _status = false; sync(); }
-
-    void sync() { _tracing = _active && _status; }
+    bool status() const override { return _tracing; }
 
-    static void enableAll();
-    static void disableAll();
+    void enable() override  { _status = true;  sync(); }
+    void disable() override { _status = false; sync(); }
 };
 
 class CompoundFlag : public Flag
@@ -97,10 +112,11 @@ class CompoundFlag : public Flag
     {
     }
 
-    std::vector<Flag *> kids() { return _kids; }
+    const std::vector<Flag *> &kids() const { return _kids; }
 
-    void enable();
-    void disable();
+    void enable() override;
+    void disable() override;
+    bool status() const override;
 };
 
 typedef std::map<std::string, Flag *> FlagsMap;
index 8f97a9499a3c3f6a1d027f55c3aa02e5360e4816..ed6fbd21a51b8beafa9bb501dcad945920588488 100644 (file)
@@ -91,13 +91,13 @@ setDebugLogger(Logger *logger)
 void
 enable()
 {
-    Debug::SimpleFlag::enableAll();
+    Debug::Flag::globalEnable();
 }
 
 void
 disable()
 {
-    Debug::SimpleFlag::disableAll();
+    Debug::Flag::globalDisable();
 }
 
 ObjectMatch ignore;
index a3d5e35ed93dda0b3313f8926ea660c1d5343c81..6b45b16ff7920229868119f7753d0103a00deffa 100644 (file)
@@ -34,24 +34,18 @@ from _m5.debug import schedBreak, setRemoteGDBPort
 from m5.util import printList
 
 def help():
+    sorted_flags = sorted(flags.items(), key=lambda kv: kv[0])
+
     print("Base Flags:")
-    for name in sorted(flags):
-        if name == 'All':
-            continue
-        flag = flags[name]
-        children = [c for c in flag.kids() ]
-        if not children:
-            print("    %s: %s" % (name, flag.desc()))
+    for name, flag in filter(lambda kv: not isinstance(kv[1], CompoundFlag),
+                             sorted_flags):
+        print("    %s: %s" % (name, flag.desc))
     print()
     print("Compound Flags:")
-    for name in sorted(flags):
-        if name == 'All':
-            continue
-        flag = flags[name]
-        children = [c for c in flag.kids() ]
-        if children:
-            print("    %s: %s" % (name, flag.desc()))
-            printList([ c.name() for c in children ], indent=8)
+    for name, flag in filter(lambda kv: isinstance(kv[1], CompoundFlag),
+                             sorted_flags):
+        print("    %s: %s" % (name, flag.desc))
+        printList([ c.name for c in flag.kids() ], indent=8)
     print()
 
 class AllFlags(Mapping):
index 766ccea7ba6aea044f66e05e7bdfe6cd613ec751..ed2942bc7ad241041a975f0aba18539d77612817 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 ARM Limited
+ * Copyright (c) 2017, 2020 ARM Limited
  * All rights reserved
  *
  * The license below extends only to copyright in the software and shall
@@ -94,16 +94,16 @@ pybind_init_debug(py::module &m_native)
 
     py::class_<Debug::Flag> c_flag(m_debug, "Flag");
     c_flag
-        .def("name", &Debug::Flag::name)
-        .def("desc", &Debug::Flag::desc)
-        .def("kids", &Debug::Flag::kids)
+        .def_property_readonly("name", &Debug::Flag::name)
+        .def_property_readonly("desc", &Debug::Flag::desc)
         .def("enable", &Debug::Flag::enable)
         .def("disable", &Debug::Flag::disable)
-        .def("sync", &Debug::Flag::sync)
         ;
 
     py::class_<Debug::SimpleFlag>(m_debug, "SimpleFlag", c_flag);
-    py::class_<Debug::CompoundFlag>(m_debug, "CompoundFlag", c_flag);
+    py::class_<Debug::CompoundFlag>(m_debug, "CompoundFlag", c_flag)
+        .def("kids", &Debug::CompoundFlag::kids)
+        ;
 
 
     py::module m_trace = m_native.def_submodule("trace");