-;;;; 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* '("
/* This is an automatically generated file, please do not hand-edit it.
* See the program tools-for-build/ldso-stubs.lisp. */
+#ifndef LANGUAGE_ASSEMBLY
#define LANGUAGE_ASSEMBLY
+#endif
#include \"sbcl.h\""
#!+sparc "
#endif
.text"
-#!+x86 "
+#!+(or (and x86 (not darwin)) x86-64) "
#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) "
#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 ; "
+
+;;; 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
+;;; Expanded to 8 arguments regardless. -- ths, 2005-03-24
#!+mips "
-#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 ;"))
+#define LDSO_STUBIFY(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 ;"))
(defvar *stubs* (append
'("accept"
"malloc"
"memmove"
"mkdir"
+ "nanosleep"
"nl_langinfo"
"open"
"opendir"
"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
;;
;; 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"
"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)