-/*
- * Handle the differences between the llvm backend beeing embedded
- * or loaded at runtime.
+/**
+ * \file
*/
-#ifdef MONO_LLVM_LOADED
-int mono_llvm_load (const char* bpath) MONO_INTERNAL;
+#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, int initial_got_size, 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_create_vars (MonoCompile *cfg) MONO_LLVM_INTERNAL;
+
+gboolean mini_llvm_init (void);
-#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 */
-