Fix CHECK_CANARY_FOR_OBJECT. (#11957)
[mono-project.git] / mono / mini / mini-llvm-loaded.c
blob8da76a139015d828918e080ac800364fc1a94abf
1 /**
2 * \file
3 * Handle the differences between the llvm backend beeing embedded
4 * or loaded at runtime.
5 */
7 #include "mini.h"
8 #include "mini-llvm.h"
10 #ifdef MONO_LLVM_LOADED
12 typedef struct {
13 void (*init)(void);
14 void (*cleanup)(void);
15 void (*emit_method)(MonoCompile *cfg);
16 void (*emit_call)(MonoCompile *cfg, MonoCallInst *call);
17 void (*create_aot_module)(MonoAssembly *assembly, const char *global_prefix, int initial_got_size, gboolean emit_dwarf, gboolean static_link, gboolean llvm_only);
18 void (*fixup_aot_module)(void);
19 void (*emit_aot_module)(const char *filename, const char *cu_name);
20 void (*check_method_supported)(MonoCompile *cfg);
21 void (*emit_aot_file_info)(MonoAotFileInfo *info, gboolean has_jitted_code);
22 void (*emit_aot_data)(const char *symbol, guint8 *data, int data_len);
23 void (*free_domain_info)(MonoDomain *domain);
24 void (*create_vars)(MonoCompile *cfg);
25 } LoadedBackend;
27 static LoadedBackend backend;
29 void
30 mono_llvm_init (void)
32 backend.init ();
35 void
36 mono_llvm_cleanup (void)
38 backend.cleanup ();
41 void
42 mono_llvm_emit_method (MonoCompile *cfg)
44 backend.emit_method (cfg);
47 void
48 mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
50 backend.emit_call (cfg, call);
53 void
54 mono_llvm_create_aot_module (MonoAssembly *assembly, const char *global_prefix, int initial_got_size, gboolean emit_dwarf, gboolean static_link, gboolean llvm_only)
56 backend.create_aot_module (assembly, global_prefix, initial_got_size, emit_dwarf, static_link, llvm_only);
59 void
60 mono_llvm_emit_aot_module (const char *filename, const char *cu_name)
62 backend.emit_aot_module (filename, cu_name);
65 void
66 mono_llvm_fixup_aot_module (void)
68 backend.fixup_aot_module ();
71 void
72 mono_llvm_check_method_supported (MonoCompile *cfg)
74 backend.check_method_supported (cfg);
77 void
78 mono_llvm_free_domain_info (MonoDomain *domain)
80 /* This is called even when llvm is not enabled */
81 if (backend.free_domain_info)
82 backend.free_domain_info (domain);
85 void
86 mono_llvm_emit_aot_file_info (MonoAotFileInfo *info, gboolean has_jitted_code)
88 backend.emit_aot_file_info (info, has_jitted_code);
91 void
92 mono_llvm_emit_aot_data (const char *symbol, guint8 *data, int data_len)
94 backend.emit_aot_data (symbol, data, data_len);
97 void
98 mono_llvm_create_vars (MonoCompile *cfg)
100 backend.create_vars (cfg);
104 mono_llvm_load (const char* bpath)
106 char *err = NULL;
107 MonoDl *llvm_lib = mono_dl_open_runtime_lib ("mono-llvm", MONO_DL_LAZY, &err);
109 if (!llvm_lib) {
110 g_warning ("llvm load failed: %s\n", err);
111 g_free (err);
112 return FALSE;
115 err = mono_dl_symbol (llvm_lib, "mono_llvm_init", (void**)&backend.init);
116 if (err) goto symbol_error;
117 err = mono_dl_symbol (llvm_lib, "mono_llvm_cleanup", (void**)&backend.cleanup);
118 if (err) goto symbol_error;
119 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_method", (void**)&backend.emit_method);
120 if (err) goto symbol_error;
121 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_call", (void**)&backend.emit_call);
122 if (err) goto symbol_error;
123 err = mono_dl_symbol (llvm_lib, "mono_llvm_create_aot_module", (void**)&backend.create_aot_module);
124 if (err) goto symbol_error;
125 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_module", (void**)&backend.emit_aot_module);
126 if (err) goto symbol_error;
127 err = mono_dl_symbol (llvm_lib, "mono_llvm_fixup_aot_module", (void**)&backend.fixup_aot_module);
128 if (err) goto symbol_error;
129 err = mono_dl_symbol (llvm_lib, "mono_llvm_check_method_supported", (void**)&backend.check_method_supported);
130 if (err) goto symbol_error;
131 err = mono_dl_symbol (llvm_lib, "mono_llvm_free_domain_info", (void**)&backend.free_domain_info);
132 if (err) goto symbol_error;
133 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_file_info", (void**)&backend.emit_aot_file_info);
134 if (err) goto symbol_error;
135 err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_data", (void**)&backend.emit_aot_data);
136 if (err) goto symbol_error;
137 err = mono_dl_symbol (llvm_lib, "mono_llvm_create_vars", (void**)&backend.create_vars);
138 if (err) goto symbol_error;
139 return TRUE;
140 symbol_error:
141 g_warning ("llvm symbol load failed: %s\n", err);
142 g_free (err);
143 return FALSE;
146 #else
149 mono_llvm_load (const char* bpath)
151 return TRUE;
154 #endif /* MONO_LLVM_LOADED */