1 ;;;; Generate stubs for C-linkage library functions which we need to refer to
4 ;;;; (But note this is only the Linux version, as per the FIXME
5 ;;;; note in the BSD version in undefineds.h.)
7 ;;;; These stubs exist for the benefit of Lisp code that needs to refer
8 ;;;; to foreign symbols when dlsym() is not available (i.e. when dumping
9 ;;;; cold-sbcl.core, when we may be running in a host that's not SBCL,
10 ;;;; or on platforms that don't have it at all). If the runtime is
11 ;;;; dynamically linked, library functions won't be linked into it, so
12 ;;;; the map file won't show them. So, we need a bunch of stubs that
15 ;;;; This software is part of the SBCL system. See the README file for
16 ;;;; more information.
18 ;;;; This software is derived from the CMU CL system, which was
19 ;;;; written at Carnegie Mellon University and released into the
20 ;;;; public domain. The software is in the public domain and is
21 ;;;; provided with absolutely no warranty. See the COPYING and CREDITS
22 ;;;; files for more information.
25 (defun ldso-stubify (fct str)
26 (format str "LDSO_STUBIFY(~A)~%" fct))
28 ;;; This is an attempt to follow DB's hint of sbcl-devel
29 ;;; 2001-09-18. -- CSR
31 ;;; And an attempt to work around the Sun toolchain... --ns
33 (defun ldso-stubify (fct str)
35 .globl ldso_stub__~A ; \\
36 FUNCDEF(ldso_stub__~A) ; \\
38 sethi %hi(~A),%g1 ; \\
39 jmpl %g1+%lo(~A),%g0 ; \\
40 nop /* delay slot*/ ; \\
42 .size ldso_stub__~A,.L~Ae1-ldso_stub__~A ;~%"
43 (make-list 9 :initial-element fct)))
45 (defvar *preludes* '("
46 /* This is an automatically generated file, please do not hand-edit it.
47 * See the program tools-for-build/ldso-stubs.lisp. */
49 #ifndef LANGUAGE_ASSEMBLY
50 #define LANGUAGE_ASSEMBLY
55 #ifdef LISP_FEATURE_SPARC
56 #include \"sparc-funcdef.h\"
61 #define LDSO_STUBIFY(fct) \\
63 .globl ldso_stub__ ## fct ; \\
64 .type ldso_stub__ ## fct,@function ; \\
65 ldso_stub__ ## fct: ; \\
68 .size ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;"
70 ;;; osf1 has ancient cpp that doesn't do ##
72 #define LDSO_STUBIFY(fct) \\
73 .globl ldso_stub__/**/fct ; \\
74 ldso_stub__/**/fct: ; \\
78 ;;; but there's no reason we need to put up with that on modern (Linux) OSes
79 #!+(and linux alpha) "
80 #define LDSO_STUBIFY(fct) \\
81 .globl ldso_stub__ ## fct ; \\
82 .type ldso_stub__ ## fct,@function ; \\
83 ldso_stub__ ## fct: ; \\
86 .size ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;"
89 #define LDSO_STUBIFY(fct) \\
90 .globl ldso_stub__ ## fct ; \\
91 .type ldso_stub__ ## fct,@function ; \\
92 ldso_stub__ ## fct: ; \\
95 .size ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;"
98 #define LDSO_STUBIFY(fct) @\\
100 .globl ldso_stub___ ## fct @\\
101 ldso_stub___ ## fct: @\\
102 b ldso_stub__ ## fct ## stub @\\
103 .symbol_stub ldso_stub__ ## fct ## stub: @\\
104 .indirect_symbol _ ## fct @\\
105 lis r11,ha16(ldso_stub__ ## fct ## $lazy_ptr) @\\
106 lwz r12,lo16(ldso_stub__ ## fct ## $lazy_ptr)(r11) @\\
108 addi r11,r11,lo16(ldso_stub__ ## fct ## $lazy_ptr) @\\
110 .lazy_symbol_pointer @\\
111 ldso_stub__ ## fct ## $lazy_ptr: @\\
112 .indirect_symbol _ ## fct @\\
113 .long dyld_stub_binding_helper"
115 ;;; KLUDGE: set up the vital fifth argument, passed on the
116 ;;; stack. Do this unconditionally, even if the stub is for a
117 ;;; function with few arguments: it can't hurt. We only do this for
118 ;;; the fifth argument, as the first four are passed in registers
119 ;;; and we apparently don't ever need to pass six arguments to a
120 ;;; libc function. -- CSR, 2003-10-29
121 ;;; Expanded to 8 arguments regardless. -- ths, 2005-03-24
123 #define LDSO_STUBIFY(fct) \\
124 .globl ldso_stub__ ## fct ; \\
125 .type ldso_stub__ ## fct,@function ; \\
126 .ent ldso_stub__ ## fct ; \\
127 ldso_stub__ ## fct: ; \\
147 .end ldso_stub__ ## fct ; \\
148 .size ldso_stub__ ## fct,.-ldso_stub__ ## fct ;"))
150 (defvar *stubs* (append
251 ;; These aren't needed on the X86 because they're microcoded into the
252 ;; FPU, so the Lisp VOPs can implement them directly without having to
255 ;; Note: There might be some other functions in this category as well.
256 ;; E.g. I notice tanh() and acos() in the list above.. -- WHN 2001-06-07
268 '("ieee_get_fp_control"
269 "ieee_set_fp_control")
275 #!+os-provides-dladdr
277 #!-(and sparc sunos) ;; !defined(SVR4)
280 (with-open-file (f "src/runtime/ldso-stubs.S" :direction :output :if-exists :supersede)
281 (assert (= (length *preludes*) 2))
282 (dolist (pre *preludes*)
284 (dolist (stub *stubs*)
285 (check-type stub string)
286 (ldso-stubify stub f)))