X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fldso-stubs.S;h=37006fb3e34ad39503941c301dafaf79a5857c49;hb=3bb2fb5b9ecdeebecaded4ac6e5af0f653be8867;hp=f786dd0299596ac10cb0965d543bc174af44ea3c;hpb=fdf07da187cb31fd5bdd872c73245fd72877b1a1;p=sbcl.git diff --git a/src/runtime/ldso-stubs.S b/src/runtime/ldso-stubs.S index f786dd0..37006fb 100644 --- a/src/runtime/ldso-stubs.S +++ b/src/runtime/ldso-stubs.S @@ -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. */ /* @@ -15,21 +24,67 @@ * provided with absolutely no warranty. See the COPYING and CREDITS * files for more information. */ - - .file "ldso-stubs.S" - .version "01.01" -gcc2_compiled.: +#define LANGUAGE_ASSEMBLY +#include "sbcl.h" .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: ; \ +ldso_stub__ ## fct: ; \ + jmp fct ; \ +.L ## fct ## e1: ; \ .size ldso_stub__ ## fct,.L ## fct ## e1-ldso_stub__ ## fct ; +#elif defined LISP_FEATURE_PPC +#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_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: ; \ + 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 ; + +#else +#error unsupported CPU architecture +#endif + LDSO_STUBIFY(accept) LDSO_STUBIFY(access) LDSO_STUBIFY(acos) @@ -70,7 +125,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 +165,14 @@ ldso_stub__ ## fct: ; \ LDSO_STUBIFY(send) LDSO_STUBIFY(setitimer) LDSO_STUBIFY(setpgrp) - LDSO_STUBIFY(sigblock) - LDSO_STUBIFY(sigpause) +#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 +189,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 __i386__ + 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