0.8.5.47:
[sbcl.git] / src / runtime / ldso-stubs.S
1 /*
2  * stubs for C-linkage library functions which we need to refer to 
3  * from Lisp 
4  *
5  * (But note this is only the Linux version, as per the FIXME
6  * note in the BSD version in undefineds.h.)
7  *
8  * These stubs exist for the benefit of Lisp code that needs to refer 
9  * to foreign symbols when dlsym() is not available (i.e. when dumping
10  * cold-sbcl.core, when we may be running in a host that's not SBCL,
11  * or on platforms that don't have it at all). If the runtime is
12  * dynamically linked, library functions won't be linked into it, so
13  * the map file won't show them. So, we need a bunch of stubs that
14  * nm(1) _can_ see.  
15  */
16
17 /*
18  * This software is part of the SBCL system. See the README file for
19  * more information.
20  *
21  * This software is derived from the CMU CL system, which was
22  * written at Carnegie Mellon University and released into the
23  * public domain. The software is in the public domain and is
24  * provided with absolutely no warranty. See the COPYING and CREDITS
25  * files for more information.
26  */
27 #define LANGUAGE_ASSEMBLY
28 #include "sbcl.h"
29
30         .text
31
32 #if defined LISP_FEATURE_X86
33         
34 #define LDSO_STUBIFY(fct)                       \
35         .align 16 ;                             \
36 .globl ldso_stub__ ## fct ;                     \
37         .type    ldso_stub__ ## fct,@function ; \
38 ldso_stub__ ## fct: ;                           \
39         jmp fct ;                               \
40 .L ## fct ## e1: ;                              \
41         .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;
42
43 #elif ((defined LISP_FEATURE_OSF1) && (defined LISP_FEATURE_ALPHA))
44 /* osf1 has ancient cpp that doesn't do ## */
45 #define LDSO_STUBIFY(fct)                       \
46 .globl ldso_stub__/**/fct ;                     \
47 ldso_stub__/**/fct: ;                           \
48         jmp fct ;                               \
49 .L/**/fct/**/e1: ;                              
50
51
52 #elif ((defined LISP_FEATURE_LINUX) && (defined LISP_FEATURE_ALPHA))    
53 /* but there's no reason we need to put up with that on modern (Linux) OSes */
54 #define LDSO_STUBIFY(fct)                       \
55 .globl ldso_stub__ ## fct ;                     \
56         .type    ldso_stub__ ## fct,@function ; \
57 ldso_stub__ ## fct: ;                           \
58         jmp fct ;                               \
59 .L ## fct ## e1: ;                              \
60         .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;
61
62 #elif ((defined LISP_FEATURE_PPC) && (defined LISP_FEATURE_LINUX))
63 #define LDSO_STUBIFY(fct)                       \
64 .globl ldso_stub__ ## fct ;                     \
65         .type    ldso_stub__ ## fct,@function ; \
66 ldso_stub__ ## fct: ;                           \
67         b fct ;                                 \
68 .L ## fct ## e1: ;                              \
69         .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;
70
71 #elif ((defined LISP_FEATURE_PPC) && (defined LISP_FEATURE_DARWIN))
72 #define LDSO_STUBIFY(fct)                       @\
73 .text                                           @\
74 .globl  ldso_stub___ ## fct                     @\
75 ldso_stub___ ## fct:                            @\
76         b ldso_stub__ ## fct ## stub            @\
77 .symbol_stub ldso_stub__ ## fct ## stub:        @\
78 .indirect_symbol _ ## fct                       @\
79         lis     r11,ha16(ldso_stub__ ## fct ## $lazy_ptr)       @\
80         lwz     r12,lo16(ldso_stub__ ## fct ## $lazy_ptr)(r11)  @\
81         mtctr   r12                             @\
82         addi    r11,r11,lo16(ldso_stub__ ## fct ## $lazy_ptr)   @\
83         bctr                                    @\
84 .lazy_symbol_pointer                            @\
85 ldso_stub__ ## fct ## $lazy_ptr:                @\
86         .indirect_symbol _ ## fct               @\
87         .long dyld_stub_binding_helper
88         
89 #elif defined LISP_FEATURE_SPARC
90         
91         /* This is an attempt to follow DB's hint of sbcl-devel
92          * 2001-09-18. -- CSR */
93 #define LDSO_STUBIFY(fct)                       \
94 .globl ldso_stub__ ## fct ;                     \
95         .type    ldso_stub__ ## fct,@function ; \
96 ldso_stub__ ## fct: ;                           \
97         sethi %hi(fct),%g1      ;               \
98         jmpl %g1+%lo(fct),%g0   ;               \
99         nop /* delay slot*/     ;               \
100 .L ## fct ## e1: ;                              \
101         .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;
102
103 #elif defined LISP_FEATURE_MIPS
104
105 /* KLUDGE: set up the vital fifth argument, passed on the 
106    stack.  Do this unconditionally, even if the stub is for a
107    function with few arguments: it can't hurt.  We only do this for
108    the fifth argument, as the first four are passed in registers
109    and we apparently don't ever need to pass six arguments to a
110    libc function.  -- CSR, 2003-10-29 */
111
112 #define LDSO_STUBIFY(fct)                       \
113 .globl ldso_stub__ ## fct ;                     \
114         .type    ldso_stub__ ## fct,@function ; \
115 ldso_stub__ ## fct: ;                           \
116         addiu $29,-48           ; \
117         sw $28,40($29)          ; \
118         sw $31,44($29)          ; \
119         lw $25,64($29)          ; \
120         sw $25,16($29)          ; \
121         la $25, fct     ;               \
122         jalr $25        ;                               \
123         lw $31,44($29)          ; \
124         lw $28,40($29)          ; \
125         addiu $29,48            ; \
126         jr $31                  ; \
127 .L ## fct ## e1: ;                              \
128         .size    ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ;
129         
130 #else
131 #error unsupported CPU architecture
132 #endif
133         
134  LDSO_STUBIFY(accept)
135  LDSO_STUBIFY(access)
136  LDSO_STUBIFY(acos)
137  LDSO_STUBIFY(acosh)
138  LDSO_STUBIFY(asin)
139  LDSO_STUBIFY(asinh)
140  LDSO_STUBIFY(atanh)
141  LDSO_STUBIFY(bind)
142  LDSO_STUBIFY(cfgetispeed)
143  LDSO_STUBIFY(cfgetospeed)
144  LDSO_STUBIFY(cfsetispeed)
145  LDSO_STUBIFY(cfsetospeed)
146  LDSO_STUBIFY(chmod)
147  LDSO_STUBIFY(chown)
148  LDSO_STUBIFY(close)
149  LDSO_STUBIFY(closedir)
150  LDSO_STUBIFY(connect)
151  LDSO_STUBIFY(cosh)
152  LDSO_STUBIFY(creat)
153 #ifndef LISP_FEATURE_DARWIN
154  LDSO_STUBIFY(dlclose)
155  LDSO_STUBIFY(dlerror)
156  LDSO_STUBIFY(dlopen)
157  LDSO_STUBIFY(dlsym)
158 #endif
159  LDSO_STUBIFY(dup)
160  LDSO_STUBIFY(dup2)
161  LDSO_STUBIFY(execve)
162  LDSO_STUBIFY(exit)
163  LDSO_STUBIFY(fchmod)
164  LDSO_STUBIFY(fchown)
165  LDSO_STUBIFY(fcntl)
166  LDSO_STUBIFY(fork)
167  LDSO_STUBIFY(free)
168  LDSO_STUBIFY(fstat)
169  LDSO_STUBIFY(fsync)
170  LDSO_STUBIFY(ftruncate)
171  LDSO_STUBIFY(getcwd)
172  LDSO_STUBIFY(getdtablesize)
173  LDSO_STUBIFY(getegid)
174  LDSO_STUBIFY(getenv)
175  LDSO_STUBIFY(getgid)
176  LDSO_STUBIFY(gethostbyaddr)
177  LDSO_STUBIFY(gethostbyname)
178  LDSO_STUBIFY(gethostname)
179  LDSO_STUBIFY(getitimer)
180  LDSO_STUBIFY(getpagesize)
181  LDSO_STUBIFY(getpeername)
182  LDSO_STUBIFY(getpgrp)
183  LDSO_STUBIFY(getpid)
184  LDSO_STUBIFY(getppid)
185  LDSO_STUBIFY(getrusage)
186  LDSO_STUBIFY(getsockname)
187  LDSO_STUBIFY(gettimeofday)
188  LDSO_STUBIFY(getuid)
189  LDSO_STUBIFY(hypot)
190  LDSO_STUBIFY(ioctl)
191  LDSO_STUBIFY(isatty)
192  LDSO_STUBIFY(kill)
193  LDSO_STUBIFY(killpg)
194  LDSO_STUBIFY(link)
195  LDSO_STUBIFY(listen)
196  LDSO_STUBIFY(log1p)
197  LDSO_STUBIFY(lseek)
198  LDSO_STUBIFY(lstat)
199  LDSO_STUBIFY(malloc)
200  LDSO_STUBIFY(memmove)
201  LDSO_STUBIFY(mkdir)
202  LDSO_STUBIFY(open)
203  LDSO_STUBIFY(opendir)
204  LDSO_STUBIFY(pipe)
205  LDSO_STUBIFY(pow)
206  LDSO_STUBIFY(read)
207  LDSO_STUBIFY(readdir)
208  LDSO_STUBIFY(readlink)
209  LDSO_STUBIFY(recv)
210  LDSO_STUBIFY(rename)
211  LDSO_STUBIFY(rmdir)
212  LDSO_STUBIFY(select)
213  LDSO_STUBIFY(send)
214  LDSO_STUBIFY(setitimer)
215  LDSO_STUBIFY(setpgrp)
216  LDSO_STUBIFY(setsid)
217 #if !defined(SVR4)
218  LDSO_STUBIFY(sigsetmask)
219 #endif
220  LDSO_STUBIFY(sinh)
221  LDSO_STUBIFY(socket)
222  LDSO_STUBIFY(stat)
223  LDSO_STUBIFY(strerror)
224  LDSO_STUBIFY(strlen)
225  LDSO_STUBIFY(symlink)
226  LDSO_STUBIFY(sync)
227  LDSO_STUBIFY(tanh)
228  LDSO_STUBIFY(tcdrain)
229  LDSO_STUBIFY(tcflow)
230  LDSO_STUBIFY(tcflush)
231  LDSO_STUBIFY(tcgetattr)
232  LDSO_STUBIFY(tcsendbreak)
233  LDSO_STUBIFY(tcsetattr)
234  LDSO_STUBIFY(truncate)
235  LDSO_STUBIFY(ttyname)
236  LDSO_STUBIFY(tzname)
237  LDSO_STUBIFY(unlink)
238  LDSO_STUBIFY(utimes)
239  LDSO_STUBIFY(wait3)    
240  LDSO_STUBIFY(write)
241
242 /*
243  * These aren't needed on the X86 because they're microcoded into the
244  * FPU, so the Lisp VOPs can implement them directly without having to
245  * call C code.
246  *
247  * Note: There might be some other functions in this category as well.
248  * E.g. I notice tanh() and acos() in the list above.. -- WHN 2001-06-07
249  */
250 #if !defined LISP_FEATURE_X86
251  LDSO_STUBIFY(sin)
252  LDSO_STUBIFY(cos) 
253  LDSO_STUBIFY(tan)      
254  LDSO_STUBIFY(atan) 
255  LDSO_STUBIFY(atan2) 
256  LDSO_STUBIFY(exp)      
257  LDSO_STUBIFY(log) 
258  LDSO_STUBIFY(log10) 
259  LDSO_STUBIFY(sqrt) 
260 #endif
261 #if defined alpha
262  LDSO_STUBIFY(ieee_get_fp_control)
263  LDSO_STUBIFY(ieee_set_fp_control)
264 #endif