X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Flinkage-table.lisp;h=8380d6d33f3626f1868ea9a5622c8ffb4d5a7c26;hb=53dd919e3b97fe7a63b6826d812eef6bac0ca9ad;hp=3ccfb4c1d6fdcd15871416edd4971cb1c1f0bf5b;hpb=079ef9dad558ca07cb8178ef428bf738112174fa;p=sbcl.git diff --git a/src/code/linkage-table.lisp b/src/code/linkage-table.lisp index 3ccfb4c..8380d6d 100644 --- a/src/code/linkage-table.lisp +++ b/src/code/linkage-table.lisp @@ -36,26 +36,26 @@ (defun write-linkage-table-entry (table-address real-address datap) (/show0 "write-linkage-table-entry") (let ((reloc (int-sap table-address)) - (target (int-sap real-address))) + (target (int-sap real-address))) (if datap - (arch-write-linkage-table-ref reloc target) - (arch-write-linkage-table-jmp reloc target)))) + (arch-write-linkage-table-ref reloc target) + (arch-write-linkage-table-jmp reloc target)))) ;;; Add the linkage information about a foreign symbol in the ;;; persistent table, and write the linkage-table entry. (defun link-foreign-symbol (name datap) (/show0 "link-foreign-symbol") (let ((table-address (+ (* (hash-table-count *linkage-info*) - sb!vm:linkage-table-entry-size) - sb!vm:linkage-table-space-start)) - (real-address (get-dynamic-foreign-symbol-address name datap))) + sb!vm:linkage-table-entry-size) + sb!vm:linkage-table-space-start)) + (real-address (ensure-dynamic-foreign-symbol-address name datap))) (aver real-address) (unless (< table-address sb!vm:linkage-table-space-end) (error "Linkage-table full (~D entries): cannot link ~S." (hash-table-count *linkage-info*) name)) (write-linkage-table-entry table-address real-address datap) - (setf (gethash name *linkage-info*) + (setf (gethash (cons name datap) *linkage-info*) (make-linkage-info :address table-address :datap datap)))) ;;; Add a foreign linkage entry if none exists, return the address @@ -63,23 +63,23 @@ (defun ensure-foreign-symbol-linkage (name datap) (/show0 "ensure-foreign-symbol-linkage") (sb!thread:with-mutex (*foreign-lock*) - (let ((info (or (gethash name *linkage-info*) + (let ((info (or (gethash (cons name datap) *linkage-info*) (link-foreign-symbol name datap)))) - (when info - (linkage-info-address info))))) + (linkage-info-address info)))) ;;; Update the linkage-table. Called during initialization after all ;;; shared libraries have been reopened, and after a previously loaded ;;; shared object is reloaded. (defun update-linkage-table () - ;; Doesn't take care of it's own locking -- callers are responsible - (maphash (lambda (name info) - (let* ((datap (linkage-info-datap info)) - (table-address (linkage-info-address info)) - (real-address - (get-dynamic-foreign-symbol-address name datap))) - (aver (and table-address real-address)) - (write-linkage-table-entry table-address - real-address - datap))) + ;; Doesn't take care of its own locking -- callers are responsible + (maphash (lambda (name-and-datap info) + (let* ((name (car name-and-datap)) + (datap (cdr name-and-datap)) + (table-address (linkage-info-address info)) + (real-address + (ensure-dynamic-foreign-symbol-address name datap))) + (aver (and table-address real-address)) + (write-linkage-table-entry table-address + real-address + datap))) *linkage-info*))