summaryrefslogtreecommitdiff
path: root/src/sim
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2019-01-28 16:14:41 +0000
committerAndreas Sandberg <andreas.sandberg@arm.com>2019-02-12 09:38:12 +0000
commit6ba4545b1f9553e68e992305c92cf46246a79dae (patch)
treee109a5ad3a32447725657200ce58e4f159c66750 /src/sim
parent15e497d3f11504f957406feee9797cbf6449fffd (diff)
downloadgem5-6ba4545b1f9553e68e992305c92cf46246a79dae.tar.xz
python: Fix native module initialisation on Python 3
The approach we currently use to register our native modules doesn't work on Python 3. Convert the code to use the Python inittab instead of the old ad-hoc method. Change-Id: I961f8a33993c621473732faeaab955a882769a4b Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/15979 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/sim')
-rw-r--r--src/sim/init.cc24
-rw-r--r--src/sim/init.hh8
-rw-r--r--src/sim/main.cc6
3 files changed, 24 insertions, 14 deletions
diff --git a/src/sim/init.cc b/src/sim/init.cc
index 66ec40895..5a49f360a 100644
--- a/src/sim/init.cc
+++ b/src/sim/init.cc
@@ -191,7 +191,11 @@ EmbeddedPyBind::getMap()
return objs;
}
+#if PY_MAJOR_VERSION >= 3
+PyObject *
+#else
void
+#endif
EmbeddedPyBind::initAll()
{
std::list<EmbeddedPyBind *> pending;
@@ -226,13 +230,18 @@ EmbeddedPyBind::initAll()
}
}
}
+
+#if PY_MAJOR_VERSION >= 3
+ return m_m5.ptr();
+#endif
}
-int
-initM5Python()
+void
+registerNativeModules()
{
- EmbeddedPyBind::initAll();
- return EmbeddedPython::initAll();
+ auto result = PyImport_AppendInittab("_m5", EmbeddedPyBind::initAll);
+ if (result == -1)
+ panic("Failed to add _m5 to Python's inittab\n");
}
/*
@@ -307,10 +316,3 @@ m5Main(int argc, char **_argv)
return 0;
}
-
-PyMODINIT_FUNC
-initm5(void)
-{
- initM5Python();
- PyImport_ImportModule(PyCC("m5"));
-}
diff --git a/src/sim/init.hh b/src/sim/init.hh
index de6b44de4..40ff9aea0 100644
--- a/src/sim/init.hh
+++ b/src/sim/init.hh
@@ -90,7 +90,11 @@ class EmbeddedPyBind
EmbeddedPyBind(const char *_name,
void (*init_func)(pybind11::module &));
+#if PY_MAJOR_VERSION >= 3
+ static PyObject *initAll();
+#else
static void initAll();
+#endif
private:
void (*initFunc)(pybind11::module &);
@@ -105,8 +109,8 @@ class EmbeddedPyBind
static std::map<std::string, EmbeddedPyBind *> &getMap();
};
-int initM5Python();
+void registerNativeModules();
+
int m5Main(int argc, char **argv);
-PyMODINIT_FUNC initm5(void);
#endif // __SIM_INIT_HH__
diff --git a/src/sim/main.cc b/src/sim/main.cc
index a77c5f578..168e4390f 100644
--- a/src/sim/main.cc
+++ b/src/sim/main.cc
@@ -54,11 +54,15 @@ main(int argc, char **argv)
Py_SetProgramName(argv[0]);
#endif
+ // Register native modules with Python's init system before
+ // initializing the interpreter.
+ registerNativeModules();
+
// initialize embedded Python interpreter
Py_Initialize();
// Initialize the embedded m5 python library
- ret = initM5Python();
+ ret = EmbeddedPython::initAll();
if (ret == 0) {
// start m5