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