Merge pull request #1508 from slluis/fix-20966
[mono.git] / mono / mini / mini-llvm.h
1 /*
2  * Handle the differences between the llvm backend beeing embedded
3  * or loaded at runtime.
4  */
5 #ifdef MONO_LLVM_LOADED
6
7 int mono_llvm_load (const char* bpath) MONO_INTERNAL;
8
9 #ifdef MONO_LLVM_IN_MINI
10
11 #ifdef __MACH__
12 #include <mach-o/dyld.h>
13 #endif
14
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, gboolean external_symbols, gboolean emit_dwarf);
19 typedef void (*MonoLLVMEmitAotFunc)(const char *filename, const char *cu_name);
20 typedef void (*MonoLLVMFreeDomainFunc)(MonoDomain *domain);
21
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;
30
31 void
32 mono_llvm_init (void)
33 {
34         mono_llvm_init_fptr ();
35 }
36
37 void
38 mono_llvm_cleanup (void)
39 {
40         mono_llvm_cleanup_fptr ();
41 }
42
43 void
44 mono_llvm_emit_method (MonoCompile *cfg)
45 {
46         mono_llvm_emit_method_fptr (cfg);
47 }
48
49 void
50 mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
51 {
52         mono_llvm_emit_call_fptr (cfg, call);
53 }
54
55 void
56 mono_llvm_create_aot_module (const char *got_symbol, gboolean external_symbols, gboolean emit_dwarf)
57 {
58         g_assert (mono_llvm_create_aot_module_fptr);
59         mono_llvm_create_aot_module_fptr (got_symbol, external_symbols, emit_dwarf);
60 }
61
62 void
63 mono_llvm_emit_aot_module (const char *filename, const char *cu_name)
64 {
65         g_assert (mono_llvm_emit_aot_module_fptr);
66         mono_llvm_emit_aot_module_fptr (filename, cu_name);
67 }
68
69 void
70 mono_llvm_check_method_supported (MonoCompile *cfg)
71 {
72         mono_llvm_check_method_supported_fptr (cfg);
73 }
74
75 void
76 mono_llvm_free_domain_info (MonoDomain *domain)
77 {
78         if (mono_llvm_free_domain_info_fptr)
79                 mono_llvm_free_domain_info_fptr (domain);
80 }
81
82 int
83 mono_llvm_load (const char* bpath)
84 {
85         char *err = NULL;
86         MonoDl *llvm_lib = mono_dl_open_runtime_lib ("mono-llvm", MONO_DL_LAZY, &err);
87
88         if (!llvm_lib) {
89                 g_warning ("llvm load failed: %s\n", err);
90                 g_free (err);
91                 return FALSE;
92         }
93
94         err = mono_dl_symbol (llvm_lib, "mono_llvm_init", (void**)&mono_llvm_init_fptr);
95         if (err) goto symbol_error;
96         err = mono_dl_symbol (llvm_lib, "mono_llvm_cleanup", (void**)&mono_llvm_cleanup_fptr);
97         if (err) goto symbol_error;
98         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_method", (void**)&mono_llvm_emit_method_fptr);
99         if (err) goto symbol_error;
100         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_call", (void**)&mono_llvm_emit_call_fptr);
101         if (err) goto symbol_error;
102         err = mono_dl_symbol (llvm_lib, "mono_llvm_create_aot_module", (void**)&mono_llvm_create_aot_module_fptr);
103         if (err) goto symbol_error;
104         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_module", (void**)&mono_llvm_emit_aot_module_fptr);
105         if (err) goto symbol_error;
106         err = mono_dl_symbol (llvm_lib, "mono_llvm_check_method_supported", (void**)&mono_llvm_check_method_supported_fptr);
107         if (err) goto symbol_error;
108         err = mono_dl_symbol (llvm_lib, "mono_llvm_free_domain_info", (void**)&mono_llvm_free_domain_info_fptr);
109         if (err) goto symbol_error;
110         return TRUE;
111 symbol_error:
112         g_warning ("llvm symbol load failed: %s\n", err);
113         g_free (err);
114         return FALSE;
115 }
116
117 #endif
118
119 #else
120 #define mono_llvm_load(bpath) TRUE
121 #endif /* MONO_LLVM_LOADED */
122