summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-08-22 19:24:18 -0700
committerGabe Black <gabeblack@google.com>2018-09-25 23:57:06 +0000
commitf17f15e57fa16c2ce7eb4c951165b4978d686f87 (patch)
treeb3180c3996dd146c007f0c4d3270f8a46913e2a2
parent46b85b66374f30af7e97254e45d534ef8a7a11ba (diff)
downloadgem5-f17f15e57fa16c2ce7eb4c951165b4978d686f87.tar.xz
systemc: If no sc_module_name was used, throw an error.
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>
-rw-r--r--src/systemc/core/module.cc21
-rw-r--r--src/systemc/core/module.hh1
-rw-r--r--src/systemc/core/sc_module.cc2
3 files changed, 22 insertions, 2 deletions
diff --git a/src/systemc/core/module.cc b/src/systemc/core/module.cc
index b13b50d28..0c118e0c5 100644
--- a/src/systemc/core/module.cc
+++ b/src/systemc/core/module.cc
@@ -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)
@@ -86,6 +94,17 @@ currentModule()
}
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()
{
return _new_module;
diff --git a/src/systemc/core/module.hh b/src/systemc/core/module.hh
index e988b9667..e276dad19 100644
--- a/src/systemc/core/module.hh
+++ b/src/systemc/core/module.hh
@@ -116,6 +116,7 @@ class Module
};
Module *currentModule();
+Module *newModuleChecked();
Module *newModule();
void callbackModule(Module *m);
diff --git a/src/systemc/core/sc_module.cc b/src/systemc/core/sc_module.cc
index 016b9edbe..c515aaf09 100644
--- a/src/systemc/core/sc_module.cc
+++ b/src/systemc/core/sc_module.cc
@@ -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())
{}