diff --git a/code/interr.lisp b/code/interr.lisp index bdab49b76467763c3eef08669ea4a8d514d9ddf8..653bc5dfc8d4932ab2fb07d3ad68f1b19a1fcff2 100644 --- a/code/interr.lisp +++ b/code/interr.lisp @@ -5,7 +5,7 @@ ;;; Carnegie Mellon University, and has been placed in the public domain. ;;; (ext:file-comment - "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/interr.lisp,v 1.38 2001/10/27 17:41:49 pmai Exp $") + "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/interr.lisp,v 1.39 2002/08/28 13:29:26 pmai Exp $") ;;; ;;; ********************************************************************** ;;; @@ -469,6 +469,12 @@ :datum object :expected-type 'instance)) +#+linkage-table +(deferr undefined-foreign-symbol-error (symbol) + (error 'simple-program-error + :function-name name + :format-control "Undefined foreign symbol: ~S" + :format-arguments (list symbol))) ;;; INFINITE-ERROR-PROTECT is used by ERROR and friends to keep us out of diff --git a/compiler/generic/interr.lisp b/compiler/generic/interr.lisp index 7b0b4fe3cd0dc08bc8abef83b2d76b64a156179a..fde0c57b245cc7d6a3f600d81d116c1b31c0b1a8 100644 --- a/compiler/generic/interr.lisp +++ b/compiler/generic/interr.lisp @@ -5,7 +5,7 @@ ;;; Carnegie Mellon University, and has been placed in the public domain. ;;; (ext:file-comment - "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/generic/interr.lisp,v 1.11 2002/08/27 22:18:27 moore Exp $") + "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/compiler/generic/interr.lisp,v 1.12 2002/08/28 13:29:27 pmai Exp $") ;;; ;;; ********************************************************************** ;;; @@ -185,5 +185,6 @@ "Function with declared result type NIL returned.") (layout-invalid "Layout is invalid (instance obsolete.)") + #+linkage-table (undefined-foreign-symbol "No value for foreign symbol.")) diff --git a/lisp/Linux-os.c b/lisp/Linux-os.c index 6295ee0b885e9116d3157b711f1dc5bea3735c14..9de09be7927d345a58cf8731f38d4532ee0e23f8 100644 --- a/lisp/Linux-os.c +++ b/lisp/Linux-os.c @@ -15,7 +15,7 @@ * GENCGC support by Douglas Crosher, 1996, 1997. * Alpha support by Julian Dolby, 1999. * - * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.14 2002/08/28 07:16:38 moore Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/Linux-os.c,v 1.15 2002/08/28 13:29:25 pmai Exp $ * */ @@ -294,9 +294,12 @@ static void *dlsym_fallback(void *handle, const char *name) strcpy(newsym, "PVE_stub_"); strcat(newsym, name); - if ((sym_addr = dlsym(handle, newsym)) == 0) { + sym_addr = dlsym(handle, newsym); +#ifdef DEBUG + if (sym_addr == 0) { fputs(dlerror(), stderr); } +#endif return sym_addr; } diff --git a/lisp/os-common.c b/lisp/os-common.c index d3e4fc04bd029531d8d4e131a9f1a17bb9b9c562..26815657d5152a6aa141c82f3c52ce4a9aa1cebb 100644 --- a/lisp/os-common.c +++ b/lisp/os-common.c @@ -1,6 +1,6 @@ /* - $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/os-common.c,v 1.5 2002/08/27 22:18:33 moore Exp $ + $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/os-common.c,v 1.6 2002/08/28 13:29:25 pmai Exp $ This code was written as part of the CMU Common Lisp project at Carnegie Mellon University, and has been placed in the public domain. @@ -103,11 +103,13 @@ os_vm_address_t os_reallocate(os_vm_address_t addr, os_vm_size_t old_len, } } +#ifdef LINKAGE_TABLE extern void resolve_linkage_tramp(void); /* In words */ - #define LINKAGE_DATA_ENTRY_SIZE 3 +#endif + void os_foreign_linkage_init (void) { #ifdef LINKAGE_TABLE @@ -187,8 +189,9 @@ os_resolve_data_linkage(void) /* Make entry for the symbol at entry in LINKAGE_TABLE_DATA. Called from register-foreign-linkage. */ - -extern void undefined_ff_tramp(lispobj arg); +#ifdef LINKAGE_TABLE +extern void undefined_foreign_symbol_trap(lispobj arg); +#endif unsigned long os_link_one_symbol(long entry) { @@ -213,7 +216,7 @@ unsigned long os_link_one_symbol(long entry) target_addr = os_dlsym((char *)symbol_name->data, data_vector->data[table_index + 2]); if (!target_addr) { - undefined_ff_tramp((lispobj)data_vector->data[table_index]); + undefined_foreign_symbol_trap((lispobj)data_vector->data[table_index]); } arch_make_linkage_entry(entry, target_addr, type); return target_addr; diff --git a/lisp/x86-arch.c b/lisp/x86-arch.c index c99252fab5bbea27d33cbb6262b8247bda73efb4..786e2135866e04986ff9d50a1458978a39b42650 100644 --- a/lisp/x86-arch.c +++ b/lisp/x86-arch.c @@ -1,6 +1,6 @@ /* x86-arch.c -*- Mode: C; comment-column: 40 -*- * - * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-arch.c,v 1.17 2002/08/27 22:18:33 moore Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-arch.c,v 1.18 2002/08/28 13:29:25 pmai Exp $ * */ @@ -343,10 +343,11 @@ lispobj funcall3(lispobj function, lispobj arg0, lispobj arg1, lispobj arg2) return call_into_lisp(function, args, 3); } +#ifdef LINKAGE_TABLE + /* Linkage entry size is 8, for no good reason. */ #define LINKAGE_ENTRY_SIZE 8 -#ifdef LINKAGE_TABLE void arch_make_linkage_entry(long linkage_entry, void *target_addr, long type) { char *reloc_addr = (char *)(FOREIGN_LINKAGE_SPACE_START diff --git a/lisp/x86-assem.S b/lisp/x86-assem.S index 44175c60898a19fa46a19379ba826c41df8be4a1..b307bc1426c91a271f6f105be6b1cf69ccac39c5 100644 --- a/lisp/x86-assem.S +++ b/lisp/x86-assem.S @@ -1,6 +1,6 @@ ### x86-assem.S -*- Mode: Asm; -*- /** - * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-assem.S,v 1.22 2002/08/27 22:18:34 moore Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/x86-assem.S,v 1.23 2002/08/28 13:29:25 pmai Exp $ * * Authors: Paul F. Werkowski <pw@snoopy.mv.com> * Douglas T. Crosher @@ -850,6 +850,8 @@ GNAME(alloc_overflow_edi): #endif +#ifdef LINKAGE_TABLE + /* Call into C code to resolve a linkage entry. The initial code in the * linkage entry has done a call to here; pass that return entry along as a * parameter. @@ -890,13 +892,13 @@ GNAME(resolve_linkage_tramp): .size GNAME(resolve_linkage_tramp),.-GNAME(resolve_linkage_tramp) /* - * The undefined-ff-function trampoline. + * The C-callable undefined-foreign-symbol trapping function. */ .text .align align_4byte,0x90 - .global GNAME(undefined_ff_tramp) - .type GNAME(undefined_ff_tramp),@function -GNAME(undefined_ff_tramp): + .global GNAME(undefined_foreign_symbol_trap) + .type GNAME(undefined_foreign_symbol_trap),@function +GNAME(undefined_foreign_symbol_trap): /* C Calling Convention, move one arg to EAX */ pushl %ebp movl %esp,%ebp @@ -904,27 +906,18 @@ GNAME(undefined_ff_tramp): /* Now trap to Lisp */ int3 - /* The trap code: */ .byte trap_Error - /* The number of arguments, including the error code */ + /* Number of argument bytes */ .byte 2 - /* The error code, which varies with long-float availability */ - /* Here we use undefined-foreign-symbol-error. */ -#ifdef type_LongFloat - .byte 67 -#else - .byte 66 -#endif - /* Now the real args. Each arg is provided via a SC-OFFSET. - SC-OFFSETS are defined in code/debug-info.lisp. They - encode the storage class and storage class offset in - one 27bit integer, the storage class taking the 5 LSBs, - with the 22 MSBs indicating the offset. */ - .byte sc_DescriptorReg | 0x00 # EAX in the Descriptor-reg SC. + .byte UNDEFINED_FOREIGN_SYMBOL_ERROR + /* SC_OFFSET(sc_DescriptorReg,reg_EAX) */ + .byte SC_OFFSET(sc_DescriptorReg,0) /* C Calling Convention */ /* Doesn't matter here, but could if we'd use trap_Cerror */ leave ret - .size GNAME(undefined_ff_tramp), .-GNAME(undefined_ff_tramp) + .size GNAME(undefined_foreign_symbol_trap), .-GNAME(undefined_foreign_symbol_trap) .end + +#endif /* LINKAGE_TABLE */