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