[llvm] Use a separate calling convention for gsharedvt methods in llvmonly mode,...
[mono.git] / mono / mini / mini-llvm.h
index 06494f9e14c5ddaa397fa137a3e34f4fbaf6c354..bf7bdb0e4d4e803ae65620e51f692c3285205322 100644 (file)
-/*
- * Handle the differences between the llvm backend beeing embedded
- * or loaded at runtime.
- */
-#ifdef MONO_LLVM_LOADED
+#ifndef __MONO_MINI_LLVM_H__
+#define __MONO_MINI_LLVM_H__
+
+#include "mini.h"
+
+/* LLVM backend */
+/* KEEP THIS IN SYNCH WITH mini-llvm-loaded.c */
+void     mono_llvm_init                     (void) MONO_LLVM_INTERNAL;
+void     mono_llvm_cleanup                  (void) MONO_LLVM_INTERNAL;
+void     mono_llvm_emit_method              (MonoCompile *cfg) MONO_LLVM_INTERNAL;
+void     mono_llvm_emit_call                (MonoCompile *cfg, MonoCallInst *call) MONO_LLVM_INTERNAL;
+void     mono_llvm_create_aot_module        (MonoAssembly *assembly, const char *global_prefix, gboolean emit_dwarf, gboolean static_link, gboolean llvm_only) MONO_LLVM_INTERNAL;
+void     mono_llvm_emit_aot_module          (const char *filename, const char *cu_name) MONO_LLVM_INTERNAL;
+void     mono_llvm_emit_aot_file_info       (MonoAotFileInfo *info, gboolean has_jitted_code) MONO_LLVM_INTERNAL;
+void     mono_llvm_emit_aot_data            (const char *symbol, guint8 *data, int data_len) MONO_LLVM_INTERNAL;
+void     mono_llvm_check_method_supported   (MonoCompile *cfg) MONO_LLVM_INTERNAL;
+void     mono_llvm_free_domain_info         (MonoDomain *domain) MONO_LLVM_INTERNAL;
+MONO_API void mono_personality              (void);
+int      mono_llvm_load                     (const char* bpath);
+void     mono_llvm_rethrow_exception (MonoObject *ex);
+void     mono_llvm_throw_exception (MonoObject *ex);
+void     mono_llvm_throw_corlib_exception (guint32 ex_token_index);
+void     mono_llvm_resume_exception (void);
+gint32   mono_llvm_match_exception (MonoJitInfo *jinfo, guint32 region_start, guint32 region_end);
+void     mono_llvm_clear_exception (void);
+MonoObject *mono_llvm_load_exception (void);
+void     mono_llvm_reset_exception (void);
+void     mono_llvm_raise_exception (MonoException *e);
+void     mono_llvm_create_vars (MonoCompile *cfg);
+
+gboolean mini_llvm_init                     (void);
 
-int mono_llvm_load (const char* bpath) MONO_INTERNAL;
-
-#ifdef MONO_LLVM_IN_MINI
-
-#ifdef __MACH__
-#include <mach-o/dyld.h>
 #endif
-
-typedef void (*MonoLLVMVoidFunc)(void);
-typedef void (*MonoLLVMCFGFunc)(MonoCompile *cfg);
-typedef void (*MonoLLVMEmitCallFunc)(MonoCompile *cfg, MonoCallInst *call);
-typedef void (*MonoLLVMCreateAotFunc)(const char *got_symbol);
-typedef void (*MonoLLVMEmitAotFunc)(const char *filename, int got_size);
-
-static MonoLLVMVoidFunc mono_llvm_init_fptr;
-static MonoLLVMVoidFunc mono_llvm_cleanup_fptr;
-static MonoLLVMCFGFunc mono_llvm_emit_method_fptr;
-static MonoLLVMEmitCallFunc mono_llvm_emit_call_fptr;
-static MonoLLVMCreateAotFunc mono_llvm_create_aot_module_fptr;
-static MonoLLVMEmitAotFunc mono_llvm_emit_aot_module_fptr;
-static MonoLLVMCFGFunc mono_llvm_check_method_supported_fptr;
-
-void
-mono_llvm_init (void)
-{
-       mono_llvm_init_fptr ();
-}
-
-void
-mono_llvm_cleanup (void)
-{
-       mono_llvm_cleanup_fptr ();
-}
-
-void
-mono_llvm_emit_method (MonoCompile *cfg)
-{
-       mono_llvm_emit_method_fptr (cfg);
-}
-
-void
-mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
-{
-       mono_llvm_emit_call_fptr (cfg, call);
-}
-
-void
-mono_llvm_create_aot_module (const char *got_symbol)
-{
-       g_assert (mono_llvm_create_aot_module_fptr);
-       mono_llvm_create_aot_module_fptr (got_symbol);
-}
-
-void
-mono_llvm_emit_aot_module (const char *filename, int got_size)
-{
-       g_assert (mono_llvm_emit_aot_module_fptr);
-       mono_llvm_emit_aot_module_fptr (filename, got_size);
-}
-
-void
-mono_llvm_check_method_supported (MonoCompile *cfg)
-{
-       mono_llvm_check_method_supported_fptr (cfg);
-}
-
-static MonoDl*
-try_llvm_load (char *dir, char **err)
-{
-       gpointer iter;
-       MonoDl *llvm_lib;
-       char *path;
-       iter = NULL;
-       *err = NULL;
-       while ((path = mono_dl_build_path (dir, "mono-llvm", &iter))) {
-               g_free (*err);
-               llvm_lib = mono_dl_open (path, MONO_DL_LAZY, err);
-               g_free (path);
-               if (llvm_lib)
-                       return llvm_lib;
-       }
-       return NULL;
-}
-
-int
-mono_llvm_load (const char* bpath)
-{
-       MonoDl *llvm_lib = NULL;
-       char *err;
-       char buf [4096];
-       int binl;
-       binl = readlink ("/proc/self/exe", buf, sizeof (buf)-1);
-#ifdef __MACH__
-       if (binl == -1) {
-               uint32_t bsize = sizeof (buf);
-               if (_NSGetExecutablePath (buf, &bsize) == 0) {
-                       binl = strlen (buf);
-               }
-       }
-#endif
-       if (binl != -1) {
-               char *base;
-               char *resolvedname, *name;
-               buf [binl] = 0;
-               resolvedname = mono_path_resolve_symlinks (buf);
-               base = g_path_get_dirname (resolvedname);
-               name = g_strdup_printf ("%s/.libs", base);
-               err = NULL;
-               llvm_lib = try_llvm_load (name, &err);
-               g_free (name);
-               if (!llvm_lib) {
-                       char *newbase = g_path_get_dirname (base);
-                       name = g_strdup_printf ("%s/lib", newbase);
-                       err = NULL;
-                       llvm_lib = try_llvm_load (name, &err);
-                       g_free (name);
-               }
-#ifdef __MACH__
-               if (!llvm_lib) {
-                       char *newbase = g_path_get_dirname (base);
-                       name = g_strdup_printf ("%s/Libraries", newbase);
-                       err = NULL;
-                       llvm_lib = try_llvm_load (name, &err);
-                       g_free (name);
-               }
-#endif
-               g_free (base);
-               g_free (resolvedname);
-       }
-       if (!llvm_lib) {
-               llvm_lib = try_llvm_load (NULL, &err);
-               if (!llvm_lib) {
-                       g_warning ("llvm load failed: %s\n", err);
-                       g_free (err);
-                       return FALSE;
-               }
-       }
-       err = mono_dl_symbol (llvm_lib, "mono_llvm_init", (void**)&mono_llvm_init_fptr);
-       if (err) goto symbol_error;
-       err = mono_dl_symbol (llvm_lib, "mono_llvm_cleanup", (void**)&mono_llvm_cleanup_fptr);
-       if (err) goto symbol_error;
-       err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_method", (void**)&mono_llvm_emit_method_fptr);
-       if (err) goto symbol_error;
-       err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_call", (void**)&mono_llvm_emit_call_fptr);
-       if (err) goto symbol_error;
-       err = mono_dl_symbol (llvm_lib, "mono_llvm_create_aot_module", (void**)&mono_llvm_create_aot_module_fptr);
-       if (err) goto symbol_error;
-       err = mono_dl_symbol (llvm_lib, "mono_llvm_emit_aot_module", (void**)&mono_llvm_emit_aot_module_fptr);
-       if (err) goto symbol_error;
-       err = mono_dl_symbol (llvm_lib, "mono_llvm_check_method_supported", (void**)&mono_llvm_check_method_supported_fptr);
-       if (err) goto symbol_error;
-       return TRUE;
-symbol_error:
-       g_warning ("llvm symbol load failed: %s\n", err);
-       g_free (err);
-       return FALSE;
-}
-
-#endif
-
-#else
-#define mono_llvm_load(bpath) TRUE
-#endif /* MONO_LLVM_LOADED */
-