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>
This commit is contained in:
Gabe Black
2018-08-22 19:24:18 -07:00
parent 46b85b6637
commit f17f15e57f
3 changed files with 22 additions and 2 deletions

View 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()
{

View File

@@ -116,6 +116,7 @@ class Module
};
Module *currentModule();
Module *newModuleChecked();
Module *newModule();
void callbackModule(Module *m);

View 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())
{}