sim: Clean up and simplify main().
Use pybind11 to simplify the python parts, update some inaccurate comments, rename m5Main to gem5Main, remove code which supported python versions less than 3. Change-Id: I139af7d3d1052cfbce779a87e34d7ce997876a60 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/49414 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:
@@ -29,10 +29,13 @@
|
||||
#include "pybind11/pybind11.h"
|
||||
#include "python/m5ImporterCode.hh"
|
||||
|
||||
#include "sim/init.hh"
|
||||
|
||||
namespace py = pybind11;
|
||||
|
||||
PYBIND11_EMBEDDED_MODULE(importer, m)
|
||||
{
|
||||
m.def("_init_all_embedded", gem5::EmbeddedPython::initAll);
|
||||
py::str importer_code(
|
||||
reinterpret_cast<const char *>(gem5::Blobs::m5ImporterCode),
|
||||
gem5::Blobs::m5ImporterCode_len);
|
||||
|
||||
@@ -74,7 +74,12 @@ class CodeImporter(object):
|
||||
# Create an importer and add it to the meta_path so future imports can
|
||||
# use it. There's currently nothing in the importer, but calls to
|
||||
# add_module can be used to add code.
|
||||
import sys
|
||||
importer = CodeImporter()
|
||||
add_module = importer.add_module
|
||||
sys.meta_path.insert(0, importer)
|
||||
def install():
|
||||
importer = CodeImporter()
|
||||
global add_module
|
||||
add_module = importer.add_module
|
||||
import sys
|
||||
sys.meta_path.insert(0, importer)
|
||||
|
||||
# Injected into this module's namespace by the c++ code that loads it.
|
||||
_init_all_embedded()
|
||||
|
||||
@@ -202,7 +202,7 @@ PYBIND11_EMBEDDED_MODULE(_m5, _m5)
|
||||
* main function.
|
||||
*/
|
||||
int
|
||||
m5Main(int argc, char **argv)
|
||||
gem5Main(int argc, char **argv)
|
||||
{
|
||||
#if HAVE_PROTOBUF
|
||||
// Verify that the version of the protobuf library that we linked
|
||||
|
||||
@@ -98,7 +98,7 @@ class EmbeddedPyBind
|
||||
static std::map<std::string, EmbeddedPyBind *> &getMap();
|
||||
};
|
||||
|
||||
int m5Main(int argc, char **argv);
|
||||
int gem5Main(int argc, char **argv);
|
||||
|
||||
} // namespace gem5
|
||||
|
||||
|
||||
@@ -28,45 +28,40 @@
|
||||
|
||||
#include <Python.h>
|
||||
|
||||
#include "pybind11/embed.h"
|
||||
#include "pybind11/pybind11.h"
|
||||
|
||||
#include "sim/init.hh"
|
||||
#include "sim/init_signals.hh"
|
||||
|
||||
using namespace gem5;
|
||||
|
||||
namespace py = pybind11;
|
||||
|
||||
// main() is now pretty stripped down and just sets up python and then
|
||||
// calls initM5Python which loads the various embedded python modules
|
||||
// into the python environment and then starts things running by
|
||||
// calling m5Main.
|
||||
// calls EmbeddedPython::initAll which loads the various embedded python
|
||||
// modules into the python environment and then starts things running by
|
||||
// calling gem5Main.
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
{
|
||||
int ret;
|
||||
|
||||
// Initialize m5 special signal handling.
|
||||
// Initialize gem5 special signal handling.
|
||||
initSignals();
|
||||
|
||||
#if PY_MAJOR_VERSION >= 3
|
||||
// Convert argv[0] to a wchar_t string, using python's locale and cleanup
|
||||
// functions.
|
||||
std::unique_ptr<wchar_t[], decltype(&PyMem_RawFree)> program(
|
||||
Py_DecodeLocale(argv[0], NULL),
|
||||
Py_DecodeLocale(argv[0], nullptr),
|
||||
&PyMem_RawFree);
|
||||
|
||||
// This can help python find libraries at run time relative to this binary.
|
||||
// It's probably not necessary, but is mostly harmless and might be useful.
|
||||
Py_SetProgramName(program.get());
|
||||
#else
|
||||
Py_SetProgramName(argv[0]);
|
||||
#endif
|
||||
|
||||
// initialize embedded Python interpreter
|
||||
Py_Initialize();
|
||||
py::scoped_interpreter guard;
|
||||
|
||||
// Initialize the embedded m5 python library
|
||||
ret = EmbeddedPython::initAll();
|
||||
auto importer = py::module_::import("importer");
|
||||
importer.attr("install")();
|
||||
|
||||
if (ret == 0) {
|
||||
// start m5
|
||||
ret = m5Main(argc, argv);
|
||||
}
|
||||
|
||||
// clean up Python intepreter.
|
||||
Py_Finalize();
|
||||
|
||||
return ret;
|
||||
return gem5Main(argc, argv);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user