X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2818cfc3410f2a4b4aebc56514c823f2b4b5e856..b5545f5600ada39b54a57fa643746c99b3fe01b7:/src/smpi/internals/smpi_global.cpp diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index 5e70fb2eb6..de959a9891 100644 --- a/src/smpi/internals/smpi_global.cpp +++ b/src/smpi/internals/smpi_global.cpp @@ -42,6 +42,16 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke #include #include /* trim_right / trim_left */ +#if SMPI_IFORT + extern "C" void for_rtl_init_ (int *, char **); + extern "C" void for_rtl_finish_ (); +#elif SMPI_FLANG + extern "C" void __io_set_argc(int); + extern "C" void __io_set_argv(char **); +#elif SMPI_GFORTRAN + extern "C" void _gfortran_set_args(int, 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 @@ -418,15 +428,28 @@ static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector argv(new char*[argc + 1]); + char** argv = new char*[argc + 1]; for (int i = 0; i != argc; ++i) - argv[i] = args[i].empty() ? noarg : &args[i].front(); + argv[i] = args[i].empty() ? noarg : xbt_strdup(&args[i].front()); argv[argc] = nullptr; - char ** argvptr=argv.get(); - - simgrid::smpi::ActorExt::init(&argc, &argvptr); + simgrid::smpi::ActorExt::init(&argc, &argv); +#if SMPI_IFORT + for_rtl_init_ (&argc, argv); +#elif SMPI_FLANG + __io_set_argc(argc); + __io_set_argv(argvptr); +#elif SMPI_GFORTRAN + _gfortran_set_args(argc, argv); +#endif + int res = entry_point(argc, argv); + +#if SMPI_IFORT + for_rtl_finish_ (); +#endif - int res = entry_point(argc, argvptr); + for (int i = 0; i != argc; ++i) + xbt_free(argv[i]); + xbt_free(argv); if (res != 0){ XBT_WARN("SMPI process did not return 0. Return value : %d", res); if (smpi_exit_status == 0)