sim: Eliminate m5MainCommands and simplify calling m5.main.

m5MainCommands had been a way to override the python code which would
get the python side of gem5 started, used by some "unit" tests which
were really tests of all of gem5 but focus on a particular area. Those
tests have either been converted into real unit tests or eliminated,
and so that mechanism is no longer needed.

This change eliminates that mechanism, and also uses pybind11 to
significantly simplify the code that calls m5.main().

Change-Id: I553ae17074cd5389708f1b7313630a13a6946d76
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/49412
Reviewed-by: Gabe Black <gabe.black@gmail.com>
Maintainer: Gabe Black <gabe.black@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Gabe Black
2021-08-17 02:19:42 -07:00
parent 15157710f8
commit 7cee5a02d5

View File

@@ -224,16 +224,6 @@ registerNativeModules()
panic("Failed to add _m5 to Python's inittab\n");
}
/*
* Make the commands array weak so that they can be overridden (used
* by unit tests to specify a different python main function.
*/
GEM5_WEAK const char *m5MainCommands[] = {
"import m5",
"m5.main()",
0 // sentinel is required
};
/*
* Start up the M5 simulator. This mostly vectors into the python
* main function.
@@ -263,27 +253,14 @@ m5Main(int argc, char **_argv)
PySys_SetArgv(argc, argv);
// We have to set things up in the special __main__ module
PyObject *module = PyImport_AddModule(PyCC("__main__"));
if (module == NULL)
panic("Could not import __main__");
PyObject *dict = PyModule_GetDict(module);
try {
py::module_::import("m5").attr("main")();
} catch (py::error_already_set &e) {
if (e.matches(PyExc_SystemExit))
return e.value().attr("code").cast<int>();
// import the main m5 module
PyObject *result;
const char **command = m5MainCommands;
// evaluate each command in the m5MainCommands array (basically a
// bunch of python statements.
while (*command) {
result = PyRun_String(*command, Py_file_input, dict, dict);
if (!result) {
PyErr_Print();
return 1;
}
Py_DECREF(result);
command++;
std::cerr << e.what();
return 1;
}
#if HAVE_PROTOBUF