AMPI: Add fsglobals (filesystem) and pipglobals (Process-in-Process) privatization...
[charm.git] / src / libs / ck-libs / ampi / ampi_funcptr_loader.C
1
2 #include "ampi_funcptr_loader.h"
3
4 #include <stdio.h>
5 #include <string.h>
6
7
8 static void AMPI_FuncPtr_Pack(struct AMPI_FuncPtr_Transport * x)
9 {
10 #define AMPI_CUSTOM_FUNC(return_type, function_name, ...) \
11     x->function_name = function_name;
12 #if AMPI_HAVE_PMPI
13   #define AMPI_FUNC(return_type, function_name, ...) \
14       x->function_name = function_name; \
15       x->P##function_name = P##function_name;
16 #else
17   #define AMPI_FUNC AMPI_CUSTOM_FUNC
18 #endif
19 #define AMPI_FUNC_NOIMPL AMPI_FUNC
20
21 #include "ampi_functions.h"
22
23 #undef AMPI_FUNC
24 #undef AMPI_FUNC_NOIMPL
25 #undef AMPI_CUSTOM_FUNC
26 }
27
28 static void AMPI_FuncPtr_Unpack_Dispatch(SharedObject myexe, struct AMPI_FuncPtr_Transport * x)
29 {
30   typedef int (*myPtrUnpackType)(struct AMPI_FuncPtr_Transport *);
31   auto myPtrUnpack = (myPtrUnpackType)dlsym(myexe, "AMPI_FuncPtr_Unpack");
32
33   if (myPtrUnpack == nullptr)
34   {
35     CkError("dlsym error: %s\n", dlerror());
36     CkAbort("Could not complete AMPI_FuncPtr_Unpack!");
37   }
38
39   myPtrUnpack(x);
40 }
41
42
43 static int AMPI_Main_Dispatch(SharedObject myexe, int argc, char ** argv)
44 {
45   typedef int (*maintype)(int, char **);
46   typedef void (*fmpimaintype)(void);
47
48   auto AMPI_Main_cpp_ptr = (maintype)dlsym(myexe, "AMPI_Main_cpp");
49   if (AMPI_Main_cpp_ptr)
50     return AMPI_Main_cpp_ptr(argc, argv);
51
52   auto AMPI_Main_c_ptr = (maintype)dlsym(myexe, "AMPI_Main_c");
53   if (AMPI_Main_c_ptr)
54     return AMPI_Main_c_ptr(argc, argv);
55
56   auto AMPI_Main_ptr = (maintype)dlsym(myexe, "AMPI_Main");
57   if (AMPI_Main_ptr)
58     return AMPI_Main_ptr(argc, argv);
59
60   auto fmpi_main_ptr = (fmpimaintype)dlsym(myexe, STRINGIZE(FTN_NAME(MPI_MAIN,mpi_main)));
61   if (fmpi_main_ptr)
62   {
63     fmpi_main_ptr();
64     return 0;
65   }
66
67   CkAbort("Could not find any AMPI entry points!");
68
69   return 1;
70 }
71
72
73 int AMPI_FuncPtr_Loader(SharedObject myexe, int argc, char ** argv)
74 {
75   // populate the user binary's function pointer shim
76   {
77     AMPI_FuncPtr_Transport x;
78     AMPI_FuncPtr_Pack(&x);
79     AMPI_FuncPtr_Unpack_Dispatch(myexe, &x);
80   }
81
82   // jump to the user binary
83   return AMPI_Main_Dispatch(myexe, argc, argv);
84 }