1.0.10.36: support for Darwin versions that support __DARWIN_UNIX03
[sbcl.git] / tools-for-build / ldso-stubs.lisp
index 132c44a..5e1abdb 100644 (file)
@@ -1,16 +1,16 @@
-;;;; Generate stubs for C-linkage library functions which we need to refer to 
+;;;; Generate stubs for C-linkage library functions which we need to refer to
 ;;;; from Lisp.
 ;;;;
 ;;;; (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 
+;;;; 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.  
+;;;; nm(1) _can_ see.
 ;;;;
 ;;;; This software is part of the SBCL system. See the README file for
 ;;;; more information.
 ;;; 2001-09-18. -- CSR
 ;;;
 ;;; And an attempt to work around the Sun toolchain... --ns
-#!+sparc 
+#!+sparc
 (defun ldso-stubify (fct str)
   (apply #'format str "
 .globl ldso_stub__~A ;                          \\
-       FUNCDEF(ldso_stub__~A) ;                \\
+        FUNCDEF(ldso_stub__~A) ;                \\
 ldso_stub__~A: ;                                \\
-       sethi %hi(~A),%g1       ;               \\
-       jmpl %g1+%lo(~A),%g0    ;               \\
-       nop /* delay slot*/     ;               \\
+        sethi %hi(~A),%g1       ;               \\
+        jmpl %g1+%lo(~A),%g0    ;               \\
+        nop /* delay slot*/     ;               \\
 .L~Ae1: ;                                       \\
-       .size    ldso_stub__~A,.L~Ae1-ldso_stub__~A ;~%"
+        .size    ldso_stub__~A,.L~Ae1-ldso_stub__~A ;~%"
           (make-list 9 :initial-element fct)))
 
 (defvar *preludes* '("
@@ -57,62 +57,89 @@ ldso_stub__~A: ;                                \\
 #endif
         .text"
 
-#!+(or x86 x86-64) "
+#!+(and (or x86 x86-64) (not darwin)) "
 #define LDSO_STUBIFY(fct)                       \\
-       .align 16 ;                             \\
+        .align 16 ;                             \\
 .globl ldso_stub__ ## fct ;                     \\
-       .type    ldso_stub__ ## fct,@function ; \\
+        .type    ldso_stub__ ## fct,@function ; \\
 ldso_stub__ ## fct: ;                           \\
-       jmp fct ;                               \\
+        jmp fct ;                               \\
 .L ## fct ## e1: ;                              \\
-       .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;"
+        .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;"
 
 ;;; osf1 has ancient cpp that doesn't do ##
 #!+(and osf1 alpha) "
 #define LDSO_STUBIFY(fct)                       \\
 .globl ldso_stub__/**/fct ;                     \\
 ldso_stub__/**/fct: ;                           \\
-       jmp fct ;                               \\
+        jmp fct ;                               \\
 .L/**/fct/**/e1: ;"
 
 ;;; but there's no reason we need to put up with that on modern (Linux) OSes
 #!+(and linux alpha) "
 #define LDSO_STUBIFY(fct)                       \\
 .globl ldso_stub__ ## fct ;                     \\
-       .type    ldso_stub__ ## fct,@function ; \\
+        .type    ldso_stub__ ## fct,@function ; \\
 ldso_stub__ ## fct: ;                           \\
-       jmp fct ;                               \\
+        jmp fct ;                               \\
 .L ## fct ## e1: ;                              \\
-       .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;"
+        .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;"
 
-#!+(and linux ppc) "
+#!+(and (not darwin) ppc) "
 #define LDSO_STUBIFY(fct)                       \\
 .globl ldso_stub__ ## fct ;                     \\
-       .type    ldso_stub__ ## fct,@function ; \\
+        .type    ldso_stub__ ## fct,@function ; \\
 ldso_stub__ ## fct: ;                           \\
         b fct ;                                 \\
 .L ## fct ## e1: ;                              \\
         .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;"
 
 #!+(and darwin ppc) "
-#define LDSO_STUBIFY(fct)                      @\\
+#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"
-       
-;;; KLUDGE: set up the vital fifth argument, passed on the 
+.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"
+
+;;; darwin x86 assembler is weird and follows the ppc assembler syntax
+#!+(and darwin x86) "
+#define LDSO_STUBIFY(fct)                       \\
+.text                           ;               \\
+        .align 4 ;                              \\
+.globl _ldso_stub___ ## fct ;                    \\
+_ldso_stub___ ## fct: ;                          \\
+        jmp L ## fct ## $stub ;                 \\
+        .section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5 ;   \\
+L ## fct ## $stub: ;                    \\
+        .indirect_symbol _ ## fct ;     \\
+        hlt                       ;     \\
+        hlt                       ;     \\
+        hlt                       ;     \\
+        hlt                       ;     \\
+        hlt                       ;     \\
+        .subsections_via_symbols  ;    "
+
+;;; darwin x86-64
+#!+(and darwin x86-64) "
+#define LDSO_STUBIFY(fct)                       \\
+        .align 4 ;                              \\
+.globl _ldso_stub___ ## fct ;                    \\
+_ldso_stub___ ## fct: ;                          \\
+        jmp _ ## fct ;                          \\
+.L ## fct ## e1: ;                            "
+
+;;; 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
@@ -121,31 +148,31 @@ ldso_stub__ ## fct ## $lazy_ptr:          @\\
 ;;; Expanded to 8 arguments regardless.  -- ths, 2005-03-24
 #!+mips "
 #define LDSO_STUBIFY(fct)                      \\
-       .globl  ldso_stub__ ## fct ;           \\
-       .type   ldso_stub__ ## fct,@function ; \\
-       .ent    ldso_stub__ ## fct ;           \\
+        .globl  ldso_stub__ ## fct ;           \\
+        .type   ldso_stub__ ## fct,@function ; \\
+        .ent    ldso_stub__ ## fct ;           \\
 ldso_stub__ ## fct: ;                  \\
-       .set noat ;                    \\
-       addiu $29,-48 ;                \\
-       sw $28,40($29) ;               \\
-       sw $31,44($29) ;               \\
-       lw $25,64($29) ;               \\
-       lw  $1,68($29) ;               \\
-       sw $25,16($29) ;               \\
-       sw  $1,20($29) ;               \\
-       lw $25,72($29) ;               \\
-       lw  $1,76($29) ;               \\
-       sw $25,24($29) ;               \\
-       sw  $1,28($29) ;               \\
-       .set at ;                      \\
-       la $25, fct ;                  \\
-       jalr $25 ;                     \\
-       lw $31,44($29) ;               \\
-       lw $28,40($29) ;               \\
-       addiu $29,48 ;                 \\
-       jr $31 ;                       \\
-       .end    ldso_stub__ ## fct ;   \\
-       .size   ldso_stub__ ## fct,.-ldso_stub__ ## fct ;"))
+        .set noat ;                    \\
+        addiu $29,-48 ;                \\
+        sw $28,40($29) ;               \\
+        sw $31,44($29) ;               \\
+        lw $25,64($29) ;               \\
+        lw  $1,68($29) ;               \\
+        sw $25,16($29) ;               \\
+        sw  $1,20($29) ;               \\
+        lw $25,72($29) ;               \\
+        lw  $1,76($29) ;               \\
+        sw $25,24($29) ;               \\
+        sw  $1,28($29) ;               \\
+        .set at ;                      \\
+        la $25, fct ;                  \\
+        jalr $25 ;                     \\
+        lw $31,44($29) ;               \\
+        lw $28,40($29) ;               \\
+        addiu $29,48 ;                 \\
+        jr $31 ;                       \\
+        .end    ldso_stub__ ## fct ;   \\
+        .size   ldso_stub__ ## fct,.-ldso_stub__ ## fct ;"))
 
 (defvar *stubs* (append
                  '("accept"
@@ -210,7 +237,7 @@ ldso_stub__ ## fct: ;                  \\
                    "malloc"
                    "memmove"
                    "mkdir"
-                  "nanosleep"
+                   "nanosleep"
                    "nl_langinfo"
                    "open"
                    "opendir"
@@ -246,7 +273,7 @@ ldso_stub__ ## fct: ;                  \\
                    "tzname"
                    "unlink"
                    "utimes"
-                   "wait3"     
+                   "wait3"
                    "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
@@ -254,27 +281,35 @@ ldso_stub__ ## fct: ;                  \\
                  ;;
                  ;; 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
-                 #!-x86 
+                 #!-x86
                  '("sin"
-                   "cos" 
-                   "tan"      
-                   "atan" 
-                   "atan2" 
-                   "exp"      
-                   "log" 
-                   "log10" 
+                   "cos"
+                   "tan"
+                   "atan"
+                   "atan2"
+                   "exp"
+                   "log"
+                   "log10"
                    "sqrt")
                  #!+alpha
                  '("ieee_get_fp_control"
                    "ieee_set_fp_control")
+                 ;; FIXME: After 1.0 this should be made
+                 ;; #!-linkage-table, as we only need these stubs if
+                 ;; we don't have linkage-table. Done this way now to
+                 ;; cut down on the number of ports affected.
+                 #!-(or win32 darwin freebsd netbsd)
+                 '("ptsname"
+                   "grantpt"
+                   "unlockpt")
                  #!-darwin
                  '("dlclose"
                    "dlerror"
                    "dlopen"
                    "dlsym")
-                #!+os-provides-dladdr 
-                '("dladdr")
-                 #!-(and sparc sunos) ;; !defined(SVR4)
+                 #!+os-provides-dladdr
+                 '("dladdr")
+                 #!-sunos ;; !defined(SVR4)
                  '("sigsetmask")))
 
 (with-open-file (f "src/runtime/ldso-stubs.S" :direction :output :if-exists :supersede)