X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/5c33ef14a6c1c95ec3ebeeea0966bd28fdedf02e..8e5fd16d72295f8ddcb7181f5c2760cd2f10c72d:/src/smpi/internals/smpi_global.cpp diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index a8f461be9a..5f63d1a6b8 100644 --- a/src/smpi/internals/smpi_global.cpp +++ b/src/smpi/internals/smpi_global.cpp @@ -42,6 +42,15 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke #include #include /* trim_right / trim_left */ +#if defined(__INTEL_COMPILER) || defined(__ICC) + extern "C" void for_rtl_init_ (int *, char **); +#elif defined(__GNUC__) + extern "C" void _gfortran_set_args(int, char **); +#elif defined(__FLANG) + extern "C" void __io_set_argc(int); + extern "C" void __io_set_argv(char **); +#endif + #ifndef RTLD_DEEPBIND /* RTLD_DEEPBIND is a bad idea of GNU ld that obviously does not exist on other platforms * See https://www.akkadia.org/drepper/dsohowto.pdf @@ -417,13 +426,22 @@ typedef void (*smpi_fortran_entry_point_type)(); static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector args) { char noarg[] = {'\0'}; - const int argc = args.size(); + int argc = args.size(); std::unique_ptr argv(new char*[argc + 1]); for (int i = 0; i != argc; ++i) argv[i] = args[i].empty() ? noarg : &args[i].front(); argv[argc] = nullptr; - - int res = entry_point(argc, argv.get()); + char ** argvptr=argv.get(); + simgrid::smpi::ActorExt::init(&argc, &argvptr); +#if defined(__GNUC__) + _gfortran_set_args(argc, argvptr); +#elif defined(__FLANG) + __io_set_argc(argc); + __io_set_argv(argvptr); +#elif defined(__INTEL_COMPILER) || defined(__ICC) + for_rtl_init_ (&argc, argvptr); +#endif + int res = entry_point(argc, argvptr); if (res != 0){ XBT_WARN("SMPI process did not return 0. Return value : %d", res); if (smpi_exit_status == 0) @@ -439,7 +457,6 @@ static smpi_entry_point_type smpi_resolve_function(void* handle) smpi_fortran_entry_point_type entry_point_fortran = (smpi_fortran_entry_point_type)dlsym(handle, "user_main_"); if (entry_point_fortran != nullptr) { return [entry_point_fortran](int argc, char** argv) { - smpi_process_init(&argc, &argv); entry_point_fortran(); return 0; };