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 <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
This commit is contained in:
@@ -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");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user