Add a BeConservative setting to the make system
[ghc-hetmet.git] / rts / Linker.c
index 2d50280..7c6d744 100644 (file)
@@ -83,7 +83,9 @@
 #  include <mach-o/loader.h>
 #  include <mach-o/nlist.h>
 #  include <mach-o/reloc.h>
+#if !defined(HAVE_DLFCN_H)
 #  include <mach-o/dyld.h>
+#endif
 #if defined(powerpc_HOST_ARCH)
 #  include <mach-o/ppc/reloc.h>
 #endif
@@ -532,6 +534,7 @@ typedef struct _RtsSymbolVal {
       SymX(hs_perform_gc)                      \
       SymX(hs_free_stable_ptr)                 \
       SymX(hs_free_fun_ptr)                    \
+      SymX(hs_hpc_rootModule)                  \
       SymX(initLinker)                         \
       SymX(unpackClosurezh_fast)                \
       SymX(getApStackValzh_fast)                \
@@ -598,32 +601,38 @@ typedef struct _RtsSymbolVal {
       SymX(rts_getDouble)                      \
       SymX(rts_getFloat)                       \
       SymX(rts_getInt)                         \
+      SymX(rts_getInt8)                                \
+      SymX(rts_getInt16)                       \
       SymX(rts_getInt32)                       \
+      SymX(rts_getInt64)                       \
       SymX(rts_getPtr)                         \
       SymX(rts_getFunPtr)                      \
       SymX(rts_getStablePtr)                   \
       SymX(rts_getThreadId)                    \
       SymX(rts_getWord)                                \
+      SymX(rts_getWord8)                       \
+      SymX(rts_getWord16)                      \
       SymX(rts_getWord32)                      \
+      SymX(rts_getWord64)                      \
       SymX(rts_lock)                           \
       SymX(rts_mkBool)                         \
       SymX(rts_mkChar)                         \
       SymX(rts_mkDouble)                       \
       SymX(rts_mkFloat)                                \
       SymX(rts_mkInt)                          \
+      SymX(rts_mkInt8)                         \
       SymX(rts_mkInt16)                                \
       SymX(rts_mkInt32)                                \
       SymX(rts_mkInt64)                                \
-      SymX(rts_mkInt8)                         \
       SymX(rts_mkPtr)                          \
       SymX(rts_mkFunPtr)                       \
       SymX(rts_mkStablePtr)                    \
       SymX(rts_mkString)                       \
       SymX(rts_mkWord)                         \
+      SymX(rts_mkWord8)                                \
       SymX(rts_mkWord16)                       \
       SymX(rts_mkWord32)                       \
       SymX(rts_mkWord64)                       \
-      SymX(rts_mkWord8)                                \
       SymX(rts_unlock)                         \
       SymX(rtsSupportsBoundThreads)            \
       SymX(__hscore_get_saved_termios)         \
@@ -1061,12 +1070,25 @@ lookupSymbol( char *lbl )
        return dlsym(dl_prog_handle, lbl);
 #      endif
 #       elif defined(OBJFORMAT_MACHO)
+#       if HAVE_DLFCN_H
+        /* On OS X 10.3 and later, we use dlsym instead of the old legacy
+           interface.
+
+           HACK: On OS X, global symbols are prefixed with an underscore.
+                 However, dlsym wants us to omit the leading underscore from the
+                 symbol name. For now, we simply strip it off here (and ONLY
+                 here).
+        */
+        ASSERT(lbl[0] == '_');
+        return dlsym(dl_prog_handle, lbl+1);
+#       else
        if(NSIsSymbolNameDefined(lbl)) {
            NSSymbol symbol = NSLookupAndBindSymbol(lbl);
            return NSAddressOfSymbol(symbol);
        } else {
            return NULL;
        }
+#       endif /* HAVE_DLFCN_H */
 #       elif defined(OBJFORMAT_PEi386)
         OpenedDLL* o_dll;
         void* sym;