Merge pull request #2541 from ludovic-henry/fix-coop-hang
[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 typedef struct {
12         void (*init)(void);
13         void (*cleanup)(void);
14         void (*emit_method)(MonoCompile *cfg);
15         void (*emit_call)(MonoCompile *cfg, MonoCallInst *call);
16         void (*create_aot_module)(MonoAssembly *assembly, const char *global_prefix, gboolean emit_dwarf, gboolean static_link, gboolean llvm_only);
17         void (*emit_aot_module)(const char *filename, const char *cu_name);
18         void (*check_method_supported)(MonoCompile *cfg);
19         void (*emit_aot_file_info)(MonoAotFileInfo *info, gboolean has_jitted_code);
20         void (*emit_aot_data)(const char *symbol, guint8 *data, int data_len);
21         void (*free_domain_info)(MonoDomain *domain);
22         void (*create_vars)(MonoCompile *cfg);
23 } LoadedBackend;
24
25 static LoadedBackend backend;
26
27 void
28 mono_llvm_init (void)
29 {
30         backend.init ();
31 }
32
33 void
34 mono_llvm_cleanup (void)
35 {
36         backend.cleanup ();
37 }
38
39 void
40 mono_llvm_emit_method (MonoCompile *cfg)
41 {
42         backend.emit_method (cfg);
43 }
44
45 void
46 mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
47 {
48         backend.emit_call (cfg, call);
49 }
50
51 void
52 mono_llvm_create_aot_module (MonoAssembly *assembly, const char *global_prefix, gboolean emit_dwarf, gboolean static_link, gboolean llvm_only)
53 {
54         backend.create_aot_module (assembly, global_prefix, emit_dwarf, static_link, llvm_only);
55 }
56
57 void
58 mono_llvm_emit_aot_module (const char *filename, const char *cu_name)
59 {
60         backend.emit_aot_module (filename, cu_name);
61 }
62
63 void
64 mono_llvm_check_method_supported (MonoCompile *cfg)
65 {
66         backend.check_method_supported (cfg);
67 }
68
69 void
70 mono_llvm_free_domain_info (MonoDomain *domain)
71 {
72         backend.free_domain_info (domain);
73 }
74
75 void
76 mono_llvm_emit_aot_file_info (MonoAotFileInfo *info, gboolean has_jitted_code)
77 {
78         backend.emit_aot_file_info (info, has_jitted_code);
79 }
80
81 void
82 mono_llvm_emit_aot_data (const char *symbol, guint8 *data, int data_len)
83 {
84         backend.emit_aot_data (symbol, data, data_len);
85 }
86
87 void
88 mono_llvm_create_vars (MonoCompile *cfg)
89 {
90         backend.create_vars (cfg);
91 }
92
93 int
94 mono_llvm_load (const char* bpath)
95 {
96         char *err = NULL;
97         MonoDl *llvm_lib = mono_dl_open_runtime_lib ("mono-llvm", MONO_DL_LAZY, &err);
98
99         if (!llvm_lib) {
100                 g_warning ("llvm load failed: %s\n", err);
101                 g_free (err);
102                 return FALSE;
103         }
104
105         err = mono_dl_symbol (llvm_lib, "mono_llvm_init", (void**)&backend.init);
106         if (err) goto symbol_error;
107         err = mono_dl_symbol (llvm_lib, "mono_llvm_cleanup", (void**)&backend.cleanup);
108         if (err) goto symbol_error;
109         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_method", (void**)&backend.emit_method);
110         if (err) goto symbol_error;
111         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_call", (void**)&backend.emit_call);
112         if (err) goto symbol_error;
113         err = mono_dl_symbol (llvm_lib, "mono_llvm_create_aot_module", (void**)&backend.create_aot_module);
114         if (err) goto symbol_error;
115         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_module", (void**)&backend.emit_aot_module);
116         if (err) goto symbol_error;
117         err = mono_dl_symbol (llvm_lib, "mono_llvm_check_method_supported", (void**)&backend.check_method_supported);
118         if (err) goto symbol_error;
119         err = mono_dl_symbol (llvm_lib, "mono_llvm_free_domain_info", (void**)&backend.free_domain_info);
120         if (err) goto symbol_error;
121         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_file_info", (void**)&backend.emit_aot_file_info);
122         if (err) goto symbol_error;
123         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_data", (void**)&backend.emit_aot_data);
124         if (err) goto symbol_error;
125         err = mono_dl_symbol (llvm_lib, "mono_llvm_create_vars", (void**)&backend.create_vars);
126         if (err) goto symbol_error;
127         return TRUE;
128 symbol_error:
129         g_warning ("llvm symbol load failed: %s\n", err);
130         g_free (err);
131         return FALSE;
132 }
133
134 #else
135
136 int
137 mono_llvm_load (const char* bpath)
138 {
139         return TRUE;
140 }
141
142 #endif /* MONO_LLVM_LOADED */
143