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);
20 typedef void (*MonoLLVMFreeDomainFunc)(MonoDomain *domain);
22 static MonoLLVMVoidFunc mono_llvm_init_fptr;
23 static MonoLLVMVoidFunc mono_llvm_cleanup_fptr;
24 static MonoLLVMCFGFunc mono_llvm_emit_method_fptr;
25 static MonoLLVMEmitCallFunc mono_llvm_emit_call_fptr;
26 static MonoLLVMCreateAotFunc mono_llvm_create_aot_module_fptr;
27 static MonoLLVMEmitAotFunc mono_llvm_emit_aot_module_fptr;
28 static MonoLLVMCFGFunc mono_llvm_check_method_supported_fptr;
29 static MonoLLVMFreeDomainFunc mono_llvm_free_domain_info_fptr;
34 mono_llvm_init_fptr ();
38 mono_llvm_cleanup (void)
40 mono_llvm_cleanup_fptr ();
44 mono_llvm_emit_method (MonoCompile *cfg)
46 mono_llvm_emit_method_fptr (cfg);
50 mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
52 mono_llvm_emit_call_fptr (cfg, call);
56 mono_llvm_create_aot_module (const char *got_symbol)
58 g_assert (mono_llvm_create_aot_module_fptr);
59 mono_llvm_create_aot_module_fptr (got_symbol);
63 mono_llvm_emit_aot_module (const char *filename, int got_size)
65 g_assert (mono_llvm_emit_aot_module_fptr);
66 mono_llvm_emit_aot_module_fptr (filename, got_size);
70 mono_llvm_check_method_supported (MonoCompile *cfg)
72 mono_llvm_check_method_supported_fptr (cfg);
76 mono_llvm_free_domain_info (MonoDomain *domain)
78 mono_llvm_free_domain_info_fptr (domain);
82 try_llvm_load (char *dir, char **err)
89 while ((path = mono_dl_build_path (dir, "mono-llvm", &iter))) {
91 llvm_lib = mono_dl_open (path, MONO_DL_LAZY, err);
100 mono_llvm_load (const char* bpath)
102 MonoDl *llvm_lib = NULL;
106 binl = readlink ("/proc/self/exe", buf, sizeof (buf)-1);
109 uint32_t bsize = sizeof (buf);
110 if (_NSGetExecutablePath (buf, &bsize) == 0) {
117 char *resolvedname, *name;
119 resolvedname = mono_path_resolve_symlinks (buf);
120 base = g_path_get_dirname (resolvedname);
121 name = g_strdup_printf ("%s/.libs", base);
123 llvm_lib = try_llvm_load (name, &err);
126 char *newbase = g_path_get_dirname (base);
127 name = g_strdup_printf ("%s/lib", newbase);
129 llvm_lib = try_llvm_load (name, &err);
134 char *newbase = g_path_get_dirname (base);
135 name = g_strdup_printf ("%s/Libraries", newbase);
137 llvm_lib = try_llvm_load (name, &err);
142 g_free (resolvedname);
145 llvm_lib = try_llvm_load (NULL, &err);
147 g_warning ("llvm load failed: %s\n", err);
152 err = mono_dl_symbol (llvm_lib, "mono_llvm_init", (void**)&mono_llvm_init_fptr);
153 if (err) goto symbol_error;
154 err = mono_dl_symbol (llvm_lib, "mono_llvm_cleanup", (void**)&mono_llvm_cleanup_fptr);
155 if (err) goto symbol_error;
156 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_method", (void**)&mono_llvm_emit_method_fptr);
157 if (err) goto symbol_error;
158 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_call", (void**)&mono_llvm_emit_call_fptr);
159 if (err) goto symbol_error;
160 err = mono_dl_symbol (llvm_lib, "mono_llvm_create_aot_module", (void**)&mono_llvm_create_aot_module_fptr);
161 if (err) goto symbol_error;
162 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_module", (void**)&mono_llvm_emit_aot_module_fptr);
163 if (err) goto symbol_error;
164 err = mono_dl_symbol (llvm_lib, "mono_llvm_check_method_supported", (void**)&mono_llvm_check_method_supported_fptr);
165 if (err) goto symbol_error;
166 err = mono_dl_symbol (llvm_lib, "mono_llvm_free_domain_info", (void**)&mono_llvm_free_domain_info_fptr);
167 if (err) goto symbol_error;
170 g_warning ("llvm symbol load failed: %s\n", err);
178 #define mono_llvm_load(bpath) TRUE
179 #endif /* MONO_LLVM_LOADED */