[Cmucl-cvs] [git] CMU Common Lisp branch rtoy-extern-alien-name created. 20f-32-g571dd49

Raymond Toy rtoy at common-lisp.net
Fri Oct 10 05:55:08 UTC 2014


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMU Common Lisp".

The branch, rtoy-extern-alien-name has been created
        at  571dd4904fc88cad51c9c2dee0b3e6ed6ef9ce12 (commit)

- Log -----------------------------------------------------------------
commit 571dd4904fc88cad51c9c2dee0b3e6ed6ef9ce12
Author: Raymond Toy <toy.raymond at gmail.com>
Date:   Thu Oct 9 22:54:49 2014 -0700

    Unify extern-alien-name for darwin x86 and ppc.
    
    Initial attempt to unify extern-alien-name, primarily for darwin (x86
    and ppc). Thus, systems using elf do not prepend an underscore, but
    other systems are assumed to prepend an underscore.
    
    This is currently only for darwin/x86.  A cross-compile on darwin x86
    is needed.
    
     * code/x86-vm.lisp:
       * For elf systems, don't prepend an underscore.  For other systems,
         do prepend.
     * compiler/generic/new-genesis.lisp:
       * Fix long-standing bug where we should call EXTERN-ALIEN-NAME to
         get the right name for "resolve_linkage_tramp".
     * lisp/Darwin-os.c:
       * Update os_dlsym to assume the external name is always preceded by
         an underscore.  The lookup for dlysm is done by stripping off the
         leading underscore.
     * lisp/os-common.c:
       * Add EXTERN_ALIEN_NAME macro to create the correct alien name for
         elf and non-elf systems.
       * Use it to generate the correct name to be used for comparison in
         the sanity checks of the linkage table entries.

diff --git a/src/code/x86-vm.lisp b/src/code/x86-vm.lisp
index 2171d60..a7e307d 100644
--- a/src/code/x86-vm.lisp
+++ b/src/code/x86-vm.lisp
@@ -336,6 +336,9 @@
 ;;;
 (defun extern-alien-name (name)
   (declare (type simple-string name))
+  #-elf
+  (concatenate 'string "_"  name)
+  #+elf
   name)
 
 #+(and (or linux (and freebsd elf)) (not linkage-table))
diff --git a/src/compiler/generic/new-genesis.lisp b/src/compiler/generic/new-genesis.lisp
index 953d9ba..bae4df7 100644
--- a/src/compiler/generic/new-genesis.lisp
+++ b/src/compiler/generic/new-genesis.lisp
@@ -2183,7 +2183,7 @@
   ;; This has gotta be the first entry.  This has to match what
   ;; os_foreign_linkage_init does!
   #+(or x86 amd64)
-  (cold-register-foreign-linkage "resolve_linkage_tramp" :code)
+  (cold-register-foreign-linkage (vm::extern-alien-name "resolve_linkage_tramp") :code)
   #+(or sparc ppc)
   (progn
     (cold-register-foreign-linkage (vm::extern-alien-name "call_into_c") :code)
diff --git a/src/lisp/Darwin-os.c b/src/lisp/Darwin-os.c
index 0efb72f..49e660c 100644
--- a/src/lisp/Darwin-os.c
+++ b/src/lisp/Darwin-os.c
@@ -532,7 +532,13 @@ os_dlsym(const char *sym_name, lispobj lib_list)
 {
     static void *program_handle;
     void *sym_addr = 0;
+    int offset = sym_name[0] == '_' ? 1 : 0;
 
+#if 1
+    if (offset == 0) {
+        fprintf(stderr, "sym-name = %s\n", sym_name);
+    }
+#endif    
     if (!program_handle)
 	program_handle = dlopen((void *) 0, RTLD_LAZY | RTLD_GLOBAL);
     if (lib_list != NIL) {
@@ -543,21 +549,17 @@ os_dlsym(const char *sym_name, lispobj lib_list)
 	    struct cons *lib_cons = CONS(CONS(lib_list_head)->car);
 	    struct sap *dlhandle = (struct sap *) PTR(lib_cons->car);
 
-#if 0 && defined(__ppc__)
-            sym_addr = dlsym((void *) dlhandle->pointer, (sym_name[0] == '_' ? sym_name + 1 : sym_name));
-#else
-	    sym_addr = dlsym((void *) dlhandle->pointer, sym_name);
-#endif
+            /*
+             * On Darwin, dlsym assumes the C name, so skip the underscore that
+             * is prepended by EXTERN-ALIEN-NAME.
+             */
+            sym_addr = dlsym((void *) dlhandle->pointer, sym_name + offset);
 	    if (sym_addr)
-		return sym_addr;
+                return sym_addr;
 	}
     }
 
-#if 0 && defined(__ppc__)
-    sym_addr = dlsym(program_handle, (sym_name[0] == '_' ? sym_name + 1 : sym_name));
-#else
-    sym_addr = dlsym(program_handle, sym_name);
-#endif
+    sym_addr = dlsym(program_handle, sym_name + offset);
 
     return sym_addr;
 }
diff --git a/src/lisp/os-common.c b/src/lisp/os-common.c
index b183d06..ff9cffb 100755
--- a/src/lisp/os-common.c
+++ b/src/lisp/os-common.c
@@ -167,6 +167,16 @@ convert_lisp_string(char* c_string, void* lisp_string, int len)
     return c_string;
 }
 
+/*
+ * C version of lisp's EXTERN-ALIEN-NAME.  For systems that use elf,
+ * do nothing.  Otherwise, we prepend an underscore.
+ */
+#if defined(FEATURE_ELF)
+#define EXTERN_ALIEN_NAME(x) x
+#else
+#define EXTERN_ALIEN_NAME(x) "_" x
+#endif
+
 void
 os_foreign_linkage_init(void)
 {
@@ -212,25 +222,27 @@ os_foreign_linkage_init(void)
 #endif        
 	if (i == 0) {
 #if defined(sparc)
-	    if (type != LINKAGE_CODE_TYPE || strcmp(c_symbol_name, "call_into_c")) {
+            if (type != LINKAGE_CODE_TYPE || strcmp(c_symbol_name, EXTERN_ALIEN_NAME("call_into_c"))) {
 		fprintf(stderr, "linkage_data is %s but expected call_into_c\n",
-			(char *) symbol_name->data);
+			c_symbol_name);
 		lose("First element of linkage_data is bogus.\n");
 	    }
 	    arch_make_linkage_entry(i, (void*) call_into_c, 1);
 #elif (defined(DARWIN) && defined(__ppc__))
-	    if (type != 1 || strcmp(c_symbol_name, "call_into_c")) {
-		fprintf(stderr, "linkage_data is %s but expected call_into_c\n",
-			(char *) c_symbol_name);
+	    if (type != 1 || strcmp(c_symbol_name, EXTERN_ALIEN_NAME("call_into_c"))) {
+		fprintf(stderr, "linkage_data is %s but expected %s\n",
+			c_symbol_name,
+                        EXTERN_ALIEN_NAME("call_into_c"));
 		lose("First element of linkage_data is bogus.\n");
 	    }
 	    arch_make_linkage_entry(i, &call_into_c, 1);
 #else
 	    if (type != LINKAGE_CODE_TYPE || strcmp(c_symbol_name,
-                                                    "resolve_linkage_tramp")) {
+                                                    EXTERN_ALIEN_NAME("resolve_linkage_tramp"))) {
 		fprintf(stderr,
-			"linkage_data is %s but expected resolve_linkage_tramp\n",
-			(char *) c_symbol_name);
+			"linkage_data is %s but expected %s\n",
+			c_symbol_name,
+                        EXTERN_ALIEN_NAME("resolve_linkage_tramp"));
 		lose("First element of linkage_data is bogus.\n");
 	    }
 	    arch_make_linkage_entry(i, (void *) &resolve_linkage_tramp, 1);
@@ -241,7 +253,7 @@ os_foreign_linkage_init(void)
 	    void *target_addr = os_dlsym(c_symbol_name, NIL);
 
 	    if (!target_addr) {
-#if 1
+#if 0
                 int k;
                 unsigned short int* wide_string;
                 
@@ -262,7 +274,6 @@ os_foreign_linkage_init(void)
 	} else {
 	    arch_make_lazy_linkage(i / LINKAGE_DATA_ENTRY_SIZE);
 	}
-
     }
 #endif /* LINKAGE_TABLE */
 }
diff --git a/src/tools/cross-scripts/cross-x86-x86.lisp b/src/tools/cross-scripts/cross-x86-x86.lisp
index 3f579f3..eacbbe1 100644
--- a/src/tools/cross-scripts/cross-x86-x86.lisp
+++ b/src/tools/cross-scripts/cross-x86-x86.lisp
@@ -205,6 +205,9 @@
 (in-package :vm)
 (defun extern-alien-name (name)
   (declare (type simple-string name))
+  #-elf
+  (concatenate 'simple-string "_" name)
+  #+elf
   name)
 (export 'extern-alien-name)
 (in-package :cl-user)

-----------------------------------------------------------------------


hooks/post-receive
-- 
CMU Common Lisp




More information about the cmucl-cvs mailing list