Merged in rest of Native Client changes, untested
[mono.git] / mono / mini / mini-llvm.h
1 /*
2  * Handle the differences between the llvm backend beeing embedded
3  * or loaded at runtime.
4  */
5 #ifdef MONO_LLVM_LOADED
6
7 int mono_llvm_load (const char* bpath) MONO_INTERNAL;
8
9 #ifdef MONO_LLVM_IN_MINI
10 typedef void (*MonoLLVMVoidFunc)(void);
11 typedef void (*MonoLLVMCFGFunc)(MonoCompile *cfg);
12 typedef void (*MonoLLVMEmitCallFunc)(MonoCompile *cfg, MonoCallInst *call);
13 typedef void (*MonoLLVMCreateAotFunc)(const char *got_symbol);
14 typedef void (*MonoLLVMEmitAotFunc)(const char *filename, int got_size);
15
16 static MonoLLVMVoidFunc mono_llvm_init_fptr;
17 static MonoLLVMVoidFunc mono_llvm_cleanup_fptr;
18 static MonoLLVMCFGFunc mono_llvm_emit_method_fptr;
19 static MonoLLVMEmitCallFunc mono_llvm_emit_call_fptr;
20 static MonoLLVMCreateAotFunc mono_llvm_create_aot_module_fptr;
21 static MonoLLVMEmitAotFunc mono_llvm_emit_aot_module_fptr;
22 static MonoLLVMCFGFunc mono_llvm_check_method_supported_fptr;
23
24 void
25 mono_llvm_init (void)
26 {
27         mono_llvm_init_fptr ();
28 }
29
30 void
31 mono_llvm_cleanup (void)
32 {
33         mono_llvm_cleanup_fptr ();
34 }
35
36 void
37 mono_llvm_emit_method (MonoCompile *cfg)
38 {
39         mono_llvm_emit_method_fptr (cfg);
40 }
41
42 void
43 mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
44 {
45         mono_llvm_emit_call_fptr (cfg, call);
46 }
47
48 void
49 mono_llvm_create_aot_module (const char *got_symbol)
50 {
51         g_assert (mono_llvm_create_aot_module_fptr);
52         mono_llvm_create_aot_module_fptr (got_symbol);
53 }
54
55 void
56 mono_llvm_emit_aot_module (const char *filename, int got_size)
57 {
58         g_assert (mono_llvm_emit_aot_module_fptr);
59         mono_llvm_emit_aot_module_fptr (filename, got_size);
60 }
61
62 void
63 mono_llvm_check_method_supported (MonoCompile *cfg)
64 {
65         mono_llvm_check_method_supported_fptr (cfg);
66 }
67
68 static MonoDl*
69 try_llvm_load (char *dir, char **err)
70 {
71         gpointer iter;
72         MonoDl *llvm_lib;
73         char *path;
74         iter = NULL;
75         *err = NULL;
76         while ((path = mono_dl_build_path (dir, "mono-llvm", &iter))) {
77                 g_free (*err);
78                 llvm_lib = mono_dl_open (path, MONO_DL_LAZY, err);
79                 g_free (path);
80                 if (llvm_lib)
81                         return llvm_lib;
82         }
83         return NULL;
84 }
85
86 int
87 mono_llvm_load (const char* bpath)
88 {
89         MonoDl *llvm_lib = NULL;
90         char *err;
91         char buf [4096];
92         int binl;
93         binl = readlink ("/proc/self/exe", buf, sizeof (buf)-1);
94         if (binl != -1) {
95                 char *base;
96                 char *name;
97                 buf [binl] = 0;
98                 base = g_path_get_dirname (buf);
99                 name = g_strdup_printf ("%s/.libs", base);
100                 g_free (base);
101                 err = NULL;
102                 llvm_lib = try_llvm_load (name, &err);
103                 g_free (name);
104         }
105         if (!llvm_lib) {
106                 llvm_lib = try_llvm_load (NULL, &err);
107                 if (!llvm_lib) {
108                         g_warning ("llvm load failed: %s\n", err);
109                         g_free (err);
110                         return FALSE;
111                 }
112         }
113         err = mono_dl_symbol (llvm_lib, "mono_llvm_init", (void**)&mono_llvm_init_fptr);
114         if (err) goto symbol_error;
115         err = mono_dl_symbol (llvm_lib, "mono_llvm_cleanup", (void**)&mono_llvm_cleanup_fptr);
116         if (err) goto symbol_error;
117         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_method", (void**)&mono_llvm_emit_method_fptr);
118         if (err) goto symbol_error;
119         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_call", (void**)&mono_llvm_emit_call_fptr);
120         if (err) goto symbol_error;
121         err = mono_dl_symbol (llvm_lib, "mono_llvm_create_aot_module", (void**)&mono_llvm_create_aot_module_fptr);
122         if (err) goto symbol_error;
123         err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_module", (void**)&mono_llvm_emit_aot_module_fptr);
124         if (err) goto symbol_error;
125         err = mono_dl_symbol (llvm_lib, "mono_llvm_check_method_supported", (void**)&mono_llvm_check_method_supported_fptr);
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 #endif
135
136 #else
137 #define mono_llvm_load(bpath) TRUE
138 #endif /* MONO_LLVM_LOADED */
139