Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
intel somehow also matches __GNUC__
[simgrid.git] / src / smpi / internals / smpi_global.cpp
index a8f461b..5f63d1a 100644 (file)
@@ -42,6 +42,15 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke
 #include <boost/tokenizer.hpp>
 #include <boost/algorithm/string.hpp> /* 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<std::string> args)
 {
   char noarg[]   = {'\0'};
-  const int argc = args.size();
+  int argc = args.size();
   std::unique_ptr<char*[]> 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;
     };