2 * Handle the differences between the llvm backend beeing embedded
3 * or loaded at runtime.
5 #ifdef MONO_LLVM_LOADED
7 int mono_llvm_load (const char* bpath) MONO_INTERNAL;
9 #ifdef MONO_LLVM_IN_MINI
12 #include <mach-o/dyld.h>
15 typedef void (*MonoLLVMVoidFunc)(void);
16 typedef void (*MonoLLVMCFGFunc)(MonoCompile *cfg);
17 typedef void (*MonoLLVMEmitCallFunc)(MonoCompile *cfg, MonoCallInst *call);
18 typedef void (*MonoLLVMCreateAotFunc)(const char *got_symbol);
19 typedef void (*MonoLLVMEmitAotFunc)(const char *filename, int got_size);
21 static MonoLLVMVoidFunc mono_llvm_init_fptr;
22 static MonoLLVMVoidFunc mono_llvm_cleanup_fptr;
23 static MonoLLVMCFGFunc mono_llvm_emit_method_fptr;
24 static MonoLLVMEmitCallFunc mono_llvm_emit_call_fptr;
25 static MonoLLVMCreateAotFunc mono_llvm_create_aot_module_fptr;
26 static MonoLLVMEmitAotFunc mono_llvm_emit_aot_module_fptr;
27 static MonoLLVMCFGFunc mono_llvm_check_method_supported_fptr;
32 mono_llvm_init_fptr ();
36 mono_llvm_cleanup (void)
38 mono_llvm_cleanup_fptr ();
42 mono_llvm_emit_method (MonoCompile *cfg)
44 mono_llvm_emit_method_fptr (cfg);
48 mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
50 mono_llvm_emit_call_fptr (cfg, call);
54 mono_llvm_create_aot_module (const char *got_symbol)
56 g_assert (mono_llvm_create_aot_module_fptr);
57 mono_llvm_create_aot_module_fptr (got_symbol);
61 mono_llvm_emit_aot_module (const char *filename, int got_size)
63 g_assert (mono_llvm_emit_aot_module_fptr);
64 mono_llvm_emit_aot_module_fptr (filename, got_size);
68 mono_llvm_check_method_supported (MonoCompile *cfg)
70 mono_llvm_check_method_supported_fptr (cfg);
74 try_llvm_load (char *dir, char **err)
81 while ((path = mono_dl_build_path (dir, "mono-llvm", &iter))) {
83 llvm_lib = mono_dl_open (path, MONO_DL_LAZY, err);
92 mono_llvm_load (const char* bpath)
94 MonoDl *llvm_lib = NULL;
98 binl = readlink ("/proc/self/exe", buf, sizeof (buf)-1);
101 uint32_t bsize = sizeof (buf);
102 if (_NSGetExecutablePath (buf, &bsize) == 0) {
111 base = g_path_get_dirname (buf);
112 name = g_strdup_printf ("%s/.libs", base);
114 llvm_lib = try_llvm_load (name, &err);
117 char *newbase = g_path_get_dirname (base);
118 name = g_strdup_printf ("%s/lib", newbase);
120 llvm_lib = try_llvm_load (name, &err);
126 llvm_lib = try_llvm_load (NULL, &err);
128 g_warning ("llvm load failed: %s\n", err);
133 err = mono_dl_symbol (llvm_lib, "mono_llvm_init", (void**)&mono_llvm_init_fptr);
134 if (err) goto symbol_error;
135 err = mono_dl_symbol (llvm_lib, "mono_llvm_cleanup", (void**)&mono_llvm_cleanup_fptr);
136 if (err) goto symbol_error;
137 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_method", (void**)&mono_llvm_emit_method_fptr);
138 if (err) goto symbol_error;
139 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_call", (void**)&mono_llvm_emit_call_fptr);
140 if (err) goto symbol_error;
141 err = mono_dl_symbol (llvm_lib, "mono_llvm_create_aot_module", (void**)&mono_llvm_create_aot_module_fptr);
142 if (err) goto symbol_error;
143 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_module", (void**)&mono_llvm_emit_aot_module_fptr);
144 if (err) goto symbol_error;
145 err = mono_dl_symbol (llvm_lib, "mono_llvm_check_method_supported", (void**)&mono_llvm_check_method_supported_fptr);
146 if (err) goto symbol_error;
149 g_warning ("llvm symbol load failed: %s\n", err);
157 #define mono_llvm_load(bpath) TRUE
158 #endif /* MONO_LLVM_LOADED */