0.8.6.28:
[sbcl.git] / src / runtime / ldso-stubs.S
index f786dd0..98f73f1 100644 (file)
@@ -1,8 +1,17 @@
 /*
- * stubs for C-linkage library functions used by the runtime
+ * stubs for C-linkage library functions which we need to refer to 
+ * from Lisp 
  *
- * These are needed because the locations of the libraries are
- * filled in by the dynamic linker ld.so at runtime.
+ * (But note this is only the Linux version, as per the FIXME
+ * note in the BSD version in undefineds.h.)
+ *
+ * These stubs exist for the benefit of Lisp code that needs to refer 
+ * to foreign symbols when dlsym() is not available (i.e. when dumping
+ * cold-sbcl.core, when we may be running in a host that's not SBCL,
+ * or on platforms that don't have it at all). If the runtime is
+ * dynamically linked, library functions won't be linked into it, so
+ * the map file won't show them. So, we need a bunch of stubs that
+ * nm(1) _can_ see.  
  */
 
 /*
  * provided with absolutely no warranty. See the COPYING and CREDITS
  * files for more information.
  */
+#define LANGUAGE_ASSEMBLY
+#include "sbcl.h"
 
-       .file   "ldso-stubs.S"
-       .version        "01.01"
-gcc2_compiled.:
         .text
 
-#define LDSO_STUBIFY(fct) \
-       .align 16 ; \
-.globl ldso_stub__ ## fct ; \
+#if defined LISP_FEATURE_X86
+       
+#define LDSO_STUBIFY(fct)                       \
+       .align 16 ;                             \
+.globl ldso_stub__ ## fct ;                     \
+       .type    ldso_stub__ ## fct,@function ; \
+ldso_stub__ ## fct: ;                           \
+       jmp fct ;                               \
+.L ## fct ## e1: ;                              \
+       .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;
+
+#elif ((defined LISP_FEATURE_OSF1) && (defined LISP_FEATURE_ALPHA))
+/* osf1 has ancient cpp that doesn't do ## */
+#define LDSO_STUBIFY(fct)                       \
+.globl ldso_stub__/**/fct ;                     \
+ldso_stub__/**/fct: ;                           \
+       jmp fct ;                               \
+.L/**/fct/**/e1: ;                              
+
+
+#elif ((defined LISP_FEATURE_LINUX) && (defined LISP_FEATURE_ALPHA))   
+/* but there's no reason we need to put up with that on modern (Linux) OSes */
+#define LDSO_STUBIFY(fct)                       \
+.globl ldso_stub__ ## fct ;                     \
+       .type    ldso_stub__ ## fct,@function ; \
+ldso_stub__ ## fct: ;                           \
+       jmp fct ;                               \
+.L ## fct ## e1: ;                              \
+       .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;
+
+#elif ((defined LISP_FEATURE_PPC) && (defined LISP_FEATURE_LINUX))
+#define LDSO_STUBIFY(fct)                       \
+.globl ldso_stub__ ## fct ;                     \
+       .type    ldso_stub__ ## fct,@function ; \
+ldso_stub__ ## fct: ;                           \
+        b fct ;                                 \
+.L ## fct ## e1: ;                              \
+        .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;
+
+#elif ((defined LISP_FEATURE_PPC) && (defined LISP_FEATURE_DARWIN))
+#define LDSO_STUBIFY(fct)                      @\
+.text                                           @\
+.globl  ldso_stub___ ## fct                    @\
+ldso_stub___ ## fct:                           @\
+       b ldso_stub__ ## fct ## stub            @\
+.symbol_stub ldso_stub__ ## fct ## stub:       @\
+.indirect_symbol _ ## fct                      @\
+       lis     r11,ha16(ldso_stub__ ## fct ## $lazy_ptr)       @\
+       lwz     r12,lo16(ldso_stub__ ## fct ## $lazy_ptr)(r11)  @\
+       mtctr   r12                             @\
+       addi    r11,r11,lo16(ldso_stub__ ## fct ## $lazy_ptr)   @\
+       bctr                                    @\
+.lazy_symbol_pointer                           @\
+ldso_stub__ ## fct ## $lazy_ptr:               @\
+       .indirect_symbol _ ## fct               @\
+       .long dyld_stub_binding_helper
+       
+#elif defined LISP_FEATURE_SPARC
+       
+       /* This is an attempt to follow DB's hint of sbcl-devel
+        * 2001-09-18. -- CSR */
+#define LDSO_STUBIFY(fct)                       \
+.globl ldso_stub__ ## fct ;                     \
        .type    ldso_stub__ ## fct,@function ; \
-ldso_stub__ ## fct: ; \
-       jmp fct ; \
-.L ## fct ## e1: ; \
+ldso_stub__ ## fct: ;                           \
+       sethi %hi(fct),%g1      ;               \
+       jmpl %g1+%lo(fct),%g0   ;               \
+       nop /* delay slot*/     ;               \
+.L ## fct ## e1: ;                              \
        .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;
 
+#elif defined LISP_FEATURE_MIPS
+
+/* KLUDGE: set up the vital fifth argument, passed on the 
+   stack.  Do this unconditionally, even if the stub is for a
+   function with few arguments: it can't hurt.  We only do this for
+   the fifth argument, as the first four are passed in registers
+   and we apparently don't ever need to pass six arguments to a
+   libc function.  -- CSR, 2003-10-29 */
+
+#define LDSO_STUBIFY(fct)                       \
+.globl ldso_stub__ ## fct ;                     \
+       .type    ldso_stub__ ## fct,@function ; \
+ldso_stub__ ## fct: ;                           \
+       addiu $29,-48           ; \
+       sw $28,40($29)          ; \
+       sw $31,44($29)          ; \
+       lw $25,64($29)          ; \
+       sw $25,16($29)          ; \
+       la $25, fct     ;               \
+       jalr $25        ;                               \
+       lw $31,44($29)          ; \
+       lw $28,40($29)          ; \
+       addiu $29,48            ; \
+       jr $31                  ; \
+.L ## fct ## e1: ;                              \
+       .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;
+       
+#else
+#error unsupported CPU architecture
+#endif
+       
  LDSO_STUBIFY(accept)
  LDSO_STUBIFY(access)
  LDSO_STUBIFY(acos)
@@ -49,10 +150,12 @@ ldso_stub__ ## fct: ; \
  LDSO_STUBIFY(connect)
  LDSO_STUBIFY(cosh)
  LDSO_STUBIFY(creat)
+#ifndef LISP_FEATURE_DARWIN
  LDSO_STUBIFY(dlclose)
  LDSO_STUBIFY(dlerror)
  LDSO_STUBIFY(dlopen)
  LDSO_STUBIFY(dlsym)
+#endif
  LDSO_STUBIFY(dup)
  LDSO_STUBIFY(dup2)
  LDSO_STUBIFY(execve)
@@ -70,7 +173,6 @@ ldso_stub__ ## fct: ; \
  LDSO_STUBIFY(getegid)
  LDSO_STUBIFY(getenv)
  LDSO_STUBIFY(getgid)
- LDSO_STUBIFY(gethostid)
  LDSO_STUBIFY(gethostbyaddr)
  LDSO_STUBIFY(gethostbyname)
  LDSO_STUBIFY(gethostname)
@@ -111,13 +213,15 @@ ldso_stub__ ## fct: ; \
  LDSO_STUBIFY(send)
  LDSO_STUBIFY(setitimer)
  LDSO_STUBIFY(setpgrp)
- LDSO_STUBIFY(sigblock)
- LDSO_STUBIFY(sigpause)
+ LDSO_STUBIFY(setsid)
+#if !defined(SVR4)
  LDSO_STUBIFY(sigsetmask)
+#endif
  LDSO_STUBIFY(sinh)
  LDSO_STUBIFY(socket)
  LDSO_STUBIFY(stat)
  LDSO_STUBIFY(strerror)
+ LDSO_STUBIFY(strlen)
  LDSO_STUBIFY(symlink)
  LDSO_STUBIFY(sync)
  LDSO_STUBIFY(tanh)
@@ -134,3 +238,27 @@ ldso_stub__ ## fct: ; \
  LDSO_STUBIFY(utimes)
  LDSO_STUBIFY(wait3)   
  LDSO_STUBIFY(write)
+
+/*
+ * These aren't needed on the X86 because they're microcoded into the
+ * FPU, so the Lisp VOPs can implement them directly without having to
+ * call C code.
+ *
+ * Note: There might be some other functions in this category as well.
+ * E.g. I notice tanh() and acos() in the list above.. -- WHN 2001-06-07
+ */
+#if !defined LISP_FEATURE_X86
+ LDSO_STUBIFY(sin)
+ LDSO_STUBIFY(cos) 
+ LDSO_STUBIFY(tan)      
+ LDSO_STUBIFY(atan) 
+ LDSO_STUBIFY(atan2) 
+ LDSO_STUBIFY(exp)      
+ LDSO_STUBIFY(log) 
+ LDSO_STUBIFY(log10) 
+ LDSO_STUBIFY(sqrt) 
+#endif
+#if defined alpha
+ LDSO_STUBIFY(ieee_get_fp_control)
+ LDSO_STUBIFY(ieee_set_fp_control)
+#endif