systemc: If no sc_module_name was used, throw an error.
authorGabe Black <gabeblack@google.com>
Thu, 23 Aug 2018 02:24:18 +0000 (19:24 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 25 Sep 2018 23:57:06 +0000 (23:57 +0000)
This is tested by the regression tests. Also make sure the handshake
which sets up instances of sc_module is cleaned up if we bail partway
through for some reason, for instance if an intermediate class throws
an exception as part of its constructor.

Change-Id: I89afe5f76832cc132aa2bb8f19916dea64546784
Reviewed-on: https://gem5-review.googlesource.com/12251
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/core/module.cc
src/systemc/core/module.hh
src/systemc/core/sc_module.cc

index b13b50d2875ab62917ff0b8fb7e1e0e4a0c4a9ea..0c118e0c5d17a33cbf7c74ffd2f52f55c32c4be9 100644 (file)
@@ -32,6 +32,7 @@
 #include <cassert>
 
 #include "base/logging.hh"
+#include "systemc/ext/utils/sc_report_handler.hh"
 
 namespace sc_gem5
 {
@@ -52,7 +53,14 @@ Module::Module(const char *name) : _name(name), _sc_mod(nullptr), _obj(nullptr)
     _new_module = this;
 }
 
-Module::~Module() { allModules.remove(this); }
+Module::~Module()
+{
+    if (_new_module == this) {
+        // Aborted module construction?
+        _new_module = nullptr;
+    }
+    allModules.remove(this);
+}
 
 void
 Module::finish(Object *this_obj)
@@ -85,6 +93,17 @@ currentModule()
     return _modules.back();
 }
 
+Module *
+newModuleChecked()
+{
+    if (!_new_module) {
+        SC_REPORT_ERROR("(E533) module name stack is empty: "
+                "did you forget to add a sc_module_name parameter to "
+                "your module constructor?", nullptr);
+    }
+    return _new_module;
+}
+
 Module *
 newModule()
 {
index e988b9667e9c17c927737d47de539cd75ac0bd05..e276dad199dce12f1a1dfd25fdb7ad42e47a4db5 100644 (file)
@@ -116,6 +116,7 @@ class Module
 };
 
 Module *currentModule();
+Module *newModuleChecked();
 Module *newModule();
 
 void callbackModule(Module *m);
index 016b9edbe9c2a268e009ffd7fdc4a553e75b70c5..c515aaf0980795fbbf6122f44d9eb3045f8af7a1 100644 (file)
@@ -168,7 +168,7 @@ sc_module::get_child_events() const
 }
 
 sc_module::sc_module() :
-    sc_object(sc_gem5::newModule()->name()),
+    sc_object(sc_gem5::newModuleChecked()->name()),
     _gem5_module(sc_gem5::currentModule())
 {}