Merge pull request #1906 from esdrubal/xbuild-CopyLocal-fix
[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 *global_prefix, gboolean emit_dwarf);
18 typedef void (*MonoLLVMEmitAotFunc)(const char *filename, const char *cu_name);
19 typedef void (*MonoLLVMEmitAotInfoFunc)(MonoAotFileInfo *info, gboolean has_jitted_code);
20 typedef void (*MonoLLVMEmitAotDataFunc)(const char *symbol, guint8 *data, int data_len);
21 typedef void (*MonoLLVMFreeDomainFunc)(MonoDomain *domain);
22
23 static MonoLLVMVoidFunc mono_llvm_init_fptr;
24 static MonoLLVMVoidFunc mono_llvm_cleanup_fptr;
25 static MonoLLVMCFGFunc mono_llvm_emit_method_fptr;
26 static MonoLLVMEmitCallFunc mono_llvm_emit_call_fptr;
27 static MonoLLVMCreateAotFunc mono_llvm_create_aot_module_fptr;
28 static MonoLLVMEmitAotFunc mono_llvm_emit_aot_module_fptr;
29 static MonoLLVMCFGFunc mono_llvm_check_method_supported_fptr;
30 static MonoLLVMEmitAotInfoFunc mono_llvm_emit_aot_file_info_fptr;
31 static MonoLLVMEmitAotDataFunc mono_llvm_emit_aot_data_fptr;
32 static MonoLLVMFreeDomainFunc mono_llvm_free_domain_info_fptr;
33
34 void
35 mono_llvm_init (void)
36 {
37         mono_llvm_init_fptr ();
38 }
39
40 void
41 mono_llvm_cleanup (void)
42 {
43         mono_llvm_cleanup_fptr ();
44 }
45
46 void
47 mono_llvm_emit_method (MonoCompile *cfg)
48 {
49         mono_llvm_emit_method_fptr (cfg);
50 }
51
52 void
53 mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
54 {
55         mono_llvm_emit_call_fptr (cfg, call);
56 }
57
58 void
59 mono_llvm_create_aot_module (const char *global_prefix, gboolean emit_dwarf)
60 {
61         g_assert (mono_llvm_create_aot_module_fptr);
62         mono_llvm_create_aot_module_fptr (global_prefix, emit_dwarf);
63 }
64
65 void
66 mono_llvm_emit_aot_module (const char *filename, const char *cu_name)
67 {
68         g_assert (mono_llvm_emit_aot_module_fptr);
69         mono_llvm_emit_aot_module_fptr (filename, cu_name);
70 }
71
72 void
73 mono_llvm_check_method_supported (MonoCompile *cfg)
74 {
75         mono_llvm_check_method_supported_fptr (cfg);
76 }
77
78 void
79 mono_llvm_free_domain_info (MonoDomain *domain)
80 {
81         if (mono_llvm_free_domain_info_fptr)
82                 mono_llvm_free_domain_info_fptr (domain);
83 }
84
85 void
86 mono_llvm_emit_aot_file_info (MonoAotFileInfo *info, gboolean has_jitted_code)
87 {
88         if (mono_llvm_emit_aot_file_info_fptr)
89                 mono_llvm_emit_aot_file_info_fptr (info, has_jitted_code);
90 }
91
92 void
93 mono_llvm_emit_aot_data (const char *symbol, guint8 *data, int data_len)
94 {
95         if (mono_llvm_emit_aot_data_fptr)
96                 mono_llvm_emit_aot_data_fptr (symbol, data, data_len);
97 }
98
99 int
100 mono_llvm_load (const char* bpath)
101 {
102         char *err = NULL;
103         MonoDl *llvm_lib = mono_dl_open_runtime_lib ("mono-llvm", MONO_DL_LAZY, &err);
104
105         if (!llvm_lib) {
106                 g_warning ("llvm load failed: %s\n", err);
107                 g_free (err);
108                 return FALSE;
109         }
110
111         err = mono_dl_symbol (llvm_lib, "mono_llvm_init", (void**)&mono_llvm_init_fptr);
112         if (err) goto symbol_error;
113         err = mono_dl_symbol (llvm_lib, "mono_llvm_cleanup", (void**)&mono_llvm_cleanup_fptr);
114         if (err) goto symbol_error;
115         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_method", (void**)&mono_llvm_emit_method_fptr);
116         if (err) goto symbol_error;
117         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_call", (void**)&mono_llvm_emit_call_fptr);
118         if (err) goto symbol_error;
119         err = mono_dl_symbol (llvm_lib, "mono_llvm_create_aot_module", (void**)&mono_llvm_create_aot_module_fptr);
120         if (err) goto symbol_error;
121         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_module", (void**)&mono_llvm_emit_aot_module_fptr);
122         if (err) goto symbol_error;
123         err = mono_dl_symbol (llvm_lib, "mono_llvm_check_method_supported", (void**)&mono_llvm_check_method_supported_fptr);
124         if (err) goto symbol_error;
125         err = mono_dl_symbol (llvm_lib, "mono_llvm_free_domain_info", (void**)&mono_llvm_free_domain_info_fptr);
126         if (err) goto symbol_error;
127         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_file_info", (void**)&mono_llvm_emit_aot_file_info_fptr);
128         if (err) goto symbol_error;
129         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_data", (void**)&mono_llvm_emit_aot_data_fptr);
130         if (err) goto symbol_error;
131         return TRUE;
132 symbol_error:
133         g_warning ("llvm symbol load failed: %s\n", err);
134         g_free (err);
135         return FALSE;
136 }
137
138 #else
139
140 int
141 mono_llvm_load (const char* bpath)
142 {
143         return TRUE;
144 }
145
146 #endif /* MONO_LLVM_LOADED */
147