base: remove Trace::enabled flag
authorCurtis Dunham <Curtis.Dunham@arm.com>
Wed, 30 Sep 2015 20:21:55 +0000 (15:21 -0500)
committerCurtis Dunham <Curtis.Dunham@arm.com>
Wed, 30 Sep 2015 20:21:55 +0000 (15:21 -0500)
The DTRACE() macro tests both Trace::enabled and the specific flag. This
change uses the same administrative interface for enabling/disabling
tracing, but masks the SimpleFlags settings directly. This eliminates a
load for every DTRACE() test, e.g. DPRINTF.

13 files changed:
src/base/debug.cc
src/base/debug.hh
src/base/trace.cc
src/base/trace.hh
src/cpu/exetrace.hh
src/cpu/inst_pb_trace.cc
src/cpu/inteltrace.hh
src/python/m5/trace.py
src/python/swig/trace.i
util/cxx_config/main.cc
util/systemc/main.cc
util/systemc/sc_gem5_control.cc
util/tlm/main.cc

index 2780344a442afe349daa10c4a813243594453cea..6161c9e82f7c2f14e8869124755bebd42b6cb39c 100644 (file)
@@ -68,6 +68,8 @@ allFlags()
     return flags;
 }
 
+bool SimpleFlag::_active = false;
+
 Flag *
 findFlag(const std::string &name)
 {
@@ -94,18 +96,34 @@ Flag::~Flag()
     // should find and remove flag.
 }
 
+void
+SimpleFlag::enableAll()
+{
+    _active = true;
+    for (auto& i : allFlags())
+        i.second->sync();
+}
+
+void
+SimpleFlag::disableAll()
+{
+    _active = false;
+    for (auto& i : allFlags())
+        i.second->sync();
+}
+
 void
 CompoundFlag::enable()
 {
-    SimpleFlag::enable();
-    for_each(_kids.begin(), _kids.end(), mem_fun(&Flag::enable));
+    for (auto& k : _kids)
+        k->enable();
 }
 
 void
 CompoundFlag::disable()
 {
-    SimpleFlag::disable();
-    for_each(_kids.begin(), _kids.end(), mem_fun(&Flag::disable));
+    for (auto& k : _kids)
+        k->disable();
 }
 
 struct AllFlags : public Flag
index 5a03574f11a307c1a234870d9684904675c0a609..59a0b6efcb7ac966c335c6809a1741ee50bfc2b7 100644 (file)
@@ -45,7 +45,6 @@ class Flag
   protected:
     const char *_name;
     const char *_desc;
-    std::vector<Flag *> _kids;
 
   public:
     Flag(const char *name, const char *desc);
@@ -53,33 +52,43 @@ class Flag
 
     std::string name() const { return _name; }
     std::string desc() const { return _desc; }
-    std::vector<Flag *> kids() { return _kids; }
+    virtual std::vector<Flag *> kids() { return std::vector<Flag*>(); }
 
     virtual void enable() = 0;
     virtual void disable() = 0;
+    virtual void sync() {}
 };
 
 class SimpleFlag : public Flag
 {
+    static bool _active; // whether debug tracings are enabled
   protected:
-    bool _status;
+    bool _tracing; // tracing is enabled and flag is on
+    bool _status;  // flag status
 
   public:
     SimpleFlag(const char *name, const char *desc)
         : Flag(name, desc), _status(false)
     { }
 
-    bool status() const { return _status; }
-    operator bool() const { return _status; }
-    bool operator!() const { return !_status; }
+    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; }
 
-    void enable() { _status = true; }
-    void disable() { _status = false; }
+    static void enableAll();
+    static void disableAll();
 };
 
-class CompoundFlag : public SimpleFlag
+class CompoundFlag : public Flag
 {
   protected:
+    std::vector<Flag *> _kids;
+
     void
     addFlag(Flag *f)
     {
@@ -99,7 +108,7 @@ class CompoundFlag : public SimpleFlag
         Flag *f14 = nullptr, Flag *f15 = nullptr,
         Flag *f16 = nullptr, Flag *f17 = nullptr,
         Flag *f18 = nullptr, Flag *f19 = nullptr)
-        : SimpleFlag(name, desc)
+        : Flag(name, desc)
     {
         addFlag(f00); addFlag(f01); addFlag(f02); addFlag(f03); addFlag(f04);
         addFlag(f05); addFlag(f06); addFlag(f07); addFlag(f08); addFlag(f09);
@@ -107,6 +116,8 @@ class CompoundFlag : public SimpleFlag
         addFlag(f15); addFlag(f16); addFlag(f17); addFlag(f18); addFlag(f19);
     }
 
+    std::vector<Flag *> kids() { return _kids; }
+
     void enable();
     void disable();
 };
index 711d496554391e928206ce7d5f7841777eb68266..ff17782499b5da3179d1ef8aeab0501c88b48a54 100644 (file)
@@ -39,6 +39,7 @@
 #include <sstream>
 #include <string>
 
+#include "base/debug.hh"
 #include "base/misc.hh"
 #include "base/output.hh"
 #include "base/str.hh"
@@ -54,8 +55,6 @@ const std::string &name()
 namespace Trace
 {
 
-bool enabled = false;
-
 // This variable holds the output logger for debug information.  Other
 // than setting up/redirecting this logger, do *NOT* reference this
 // directly
@@ -87,6 +86,18 @@ setDebugLogger(Logger *logger)
         debug_logger = logger;
 }
 
+void
+enable()
+{
+    Debug::SimpleFlag::enableAll();
+}
+
+void
+disable()
+{
+    Debug::SimpleFlag::disableAll();
+}
+
 ObjectMatch ignore;
 
 void
index 70e85bf353e357bee47d9a8d090004b54c547895..2b1d03eff0e61395cf2dbb59081c333c22df6e0a 100644 (file)
@@ -116,8 +116,9 @@ std::ostream &output();
 /** Delete the current global logger and assign a new one */
 void setDebugLogger(Logger *logger);
 
-/** Enable debug logging */
-extern bool enabled;
+/** Enable/disable debug logging */
+void enable();
+void disable();
 
 } // namespace Trace
 
@@ -160,7 +161,7 @@ class Named
 
 #if TRACING_ON
 
-#define DTRACE(x) ((Debug::x) && Trace::enabled)
+#define DTRACE(x) (Debug::x)
 
 #define DDUMP(x, data, count) do {                                        \
     using namespace Debug;                                                \
index 51a8c05c9c47867c12d961d2bcffbdd606c6f095..b7e808a2a66a866240bff2630f5544c3a05e735f 100644 (file)
@@ -75,9 +75,6 @@ class ExeTracer : public InstTracer
         if (!Debug::ExecEnable)
             return NULL;
 
-        if (!Trace::enabled)
-            return NULL;
-
         return new ExeTracerRecord(when, tc,
                 staticInst, pc, macroStaticInst);
     }
index e6ed425ecf78d1037aa8b29f50ab5f73e74e4b16..400360078cb5eeb5f928ff87df88c24f1a1374bc 100644 (file)
@@ -123,8 +123,8 @@ InstPBTraceRecord*
 InstPBTrace::getInstRecord(Tick when, ThreadContext *tc, const StaticInstPtr si,
                            TheISA::PCState pc, const StaticInstPtr mi)
 {
-    // Only record the trace if Exec debugging in enabled
-    if (!Trace::enabled || !Debug::ExecEnable)
+    // Only record the trace if Exec debugging is enabled
+    if (!Debug::ExecEnable)
         return NULL;
 
     return new InstPBTraceRecord(*this, when, tc, si, pc, mi);
index 4ddf5eac9ec533872373e6ff73aadf011f075239..fa1b51602f0c661ad7c5b37dd9cfe5c073a6b5ea 100644 (file)
@@ -71,9 +71,6 @@ class IntelTrace : public InstTracer
         if (!Debug::ExecEnable)
             return NULL;
 
-        if (!Trace::enabled)
-            return NULL;
-
         return new IntelTraceRecord(when, tc, staticInst, pc, macroStaticInst);
     }
 };
index f34444810c9df97127ffd7f4486becb4eb5df780..a78b77fc1223616178004a0f0d47357ee687fad9 100644 (file)
@@ -32,7 +32,7 @@ import util
 from internal.trace import output, ignore
 
 def disable():
-    internal.trace.cvar.enabled = False
+    internal.trace.disable()
 
 def enable():
-    internal.trace.cvar.enabled = True
+    internal.trace.enable()
index 6525b3e515cae3ec66caed2c2f53268a22e59f5f..50ff7fd3d00f5255d90c41ea332daeaaf998509f 100644 (file)
@@ -54,9 +54,11 @@ ignore(const char *expr)
     Trace::getDebugLogger()->setIgnore(ignore);
 }
 
-using Trace::enabled;
+inline void enable()  { Trace::enable(); }
+inline void disable() { Trace::disable(); }
 %}
 
 extern void output(const char *string);
 extern void ignore(const char *expr);
-extern bool enabled;
+extern void enable();
+extern void disable();
index afc166174bfddded0d0155b0c4698a2597f506dd..2a9588f2e2ca34dee39d370664948ae6185c69ef 100644 (file)
@@ -117,7 +117,7 @@ main(int argc, char **argv)
     Stats::initSimStats();
     Stats::registerHandlers(CxxConfig::statsReset, CxxConfig::statsDump);
 
-    Trace::enabled = true;
+    Trace::enable();
     setDebugFlag("Terminal");
     // setDebugFlag("CxxConfig");
 
index 2ca6bbe65cae724168bc3b3ac77dc2d9b6373875..f4c7b63054473af7a62089499f69a02130b17892 100644 (file)
@@ -162,7 +162,7 @@ SimControl::SimControl(sc_core::sc_module_name name,
     Stats::initSimStats();
     Stats::registerHandlers(CxxConfig::statsReset, CxxConfig::statsDump);
 
-    Trace::enabled = true;
+    Trace::enable();
     setDebugFlag("Terminal");
 
     checkpoint_restore = false;
index 5dd3b1ed5baa8944f7dca9a09f7b6e1e9fb86580..cf6e0d57cd50b1b3e1f86f9137f22b392d51ee78 100644 (file)
@@ -241,7 +241,7 @@ Gem5TopLevelModule::Gem5TopLevelModule(sc_core::sc_module_name name,
     Stats::initSimStats();
     Stats::registerHandlers(CxxConfig::statsReset, CxxConfig::statsDump);
 
-    Trace::enabled = true;
+    Trace::enable();
 
     config_file = new CxxIniFile();
 
index 517e4ad434bc090853151939bc71d56bd86c2480..8add0aeefdcb2a7843da0193fedc062f570000d0 100644 (file)
@@ -142,7 +142,7 @@ SimControl::SimControl(sc_core::sc_module_name name,
     Stats::initSimStats();
     Stats::registerHandlers(CxxConfig::statsReset, CxxConfig::statsDump);
 
-    Trace::enabled = true;
+    Trace::enable();
 
     sim_end = 0;
     debug = false;