From: Gabe Black Date: Fri, 22 Jun 2018 21:15:28 +0000 (-0700) Subject: systemc: Get sc_main to work even when dynamically linked. X-Git-Tag: v19.0.0.0~1870 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=97018a3b20c129a3413011d205f18189dd1a75c9;p=gem5.git systemc: Get sc_main to work even when dynamically linked. Unfortunately multiply defined weak symbols don't work like they're supposed to when the different versions are across dynamic linking boundaries. Fortunately, a weak symbol with no definition at all will still consistently evaluate as 0, and a singularly defined weak symbol will still resolve correctly. Instead of relying on a weak version of sc_main being overridden by a strong/non-default definition, this change leaves it as undefined and detects at run time whether the symbol resolves to 0 or to an actual code location. Change-Id: I31c4ff769b0c52277c6cf4845ca3f85000009583 Reviewed-on: https://gem5-review.googlesource.com/11610 Reviewed-by: Gabe Black Maintainer: Gabe Black --- diff --git a/src/systemc/core/sc_main.cc b/src/systemc/core/sc_main.cc index 2ca5ed494..fec3faeb0 100644 --- a/src/systemc/core/sc_main.cc +++ b/src/systemc/core/sc_main.cc @@ -38,16 +38,8 @@ #include "systemc/ext/core/sc_main.hh" #include "systemc/ext/utils/sc_report_handler.hh" -// A default version of this function in case one isn't otherwise defined. -// This ensures everything will link properly whether or not the user defined -// a custom sc_main function. If they didn't but still try to call it, throw -// an error and die. -[[gnu::weak]] int -sc_main(int argc, char *argv[]) -{ - // If python attempts to call sc_main but no sc_main was defined... - fatal("sc_main called but not defined.\n"); -} +// A weak symbol to detect if sc_main has been defined, and if so where it is. +[[gnu::weak]] int sc_main(int argc, char *argv[]); namespace sc_core { @@ -65,7 +57,12 @@ class ScMainFiber : public Fiber void main() { - ::sc_main(_argc, _argv); + if (::sc_main) { + ::sc_main(_argc, _argv); + } else { + // If python tries to call sc_main but no sc_main was defined... + fatal("sc_main called but not defined.\n"); + } } };