Correctly link the seq point for ENDFINALLY with its successors. Fixes #5566.
[mono.git] / mono / mini / mini-llvm.h
index ce973673b167130b3c3568526ac7985e724a7f9e..aa99f26c8d3968c9c109a766a2656089de0c0b63 100644 (file)
@@ -7,6 +7,11 @@
 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);
@@ -91,16 +96,31 @@ mono_llvm_load (const char* bpath)
        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 *name;
                buf [binl] = 0;
                base = g_path_get_dirname (buf);
                name = g_strdup_printf ("%s/.libs", base);
-               g_free (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);
+               }
+               g_free (base);
        }
        if (!llvm_lib) {
                llvm_lib = try_llvm_load (NULL, &err);