1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-10 22:10:21 +02:00

asm-labels is a hash table

* module/system/vm/assembler.scm (make-assembler, label):
  (link-data, process-relocs, process-labels): Change labels to be a
  hash table.
This commit is contained in:
Andy Wingo 2013-11-05 20:18:23 +01:00
parent da60ba8062
commit 3659ef543e

View file

@ -278,7 +278,7 @@
@var{endianness}, falling back to appropriate values for the configured @var{endianness}, falling back to appropriate values for the configured
target." target."
(make-asm (fresh-block) 0 0 '() 0 (make-asm (fresh-block) 0 0 '() 0
'() '() (make-hash-table) '()
word-size endianness word-size endianness
vlist-null '() vlist-null '()
(make-string-table) 1 (make-string-table) 1
@ -323,11 +323,6 @@ reference that needs to be fixed up by the linker."
"Reset the asm-start after writing the words for one instruction." "Reset the asm-start after writing the words for one instruction."
(set-asm-start! asm (asm-pos asm))) (set-asm-start! asm (asm-pos asm)))
(define (emit-exported-label asm label)
"Define a linker symbol associating @var{label} with the current
asm-start."
(set-asm-labels! asm (acons label (asm-start asm) (asm-labels asm))))
(define (record-label-reference asm label) (define (record-label-reference asm label)
"Record an x8-s24 local label reference. This value will get patched "Record an x8-s24 local label reference. This value will get patched
up later by the assembler." up later by the assembler."
@ -812,7 +807,7 @@ returned instead."
(emit-alloc-frame asm nlocals))) (emit-alloc-frame asm nlocals)))
(define-macro-assembler (label asm sym) (define-macro-assembler (label asm sym)
(set-asm-labels! asm (acons sym (asm-start asm) (asm-labels asm)))) (hashq-set! (asm-labels asm) sym (asm-start asm)))
(define-macro-assembler (source asm source) (define-macro-assembler (source asm source)
(set-asm-sources! asm (acons (asm-start asm) source (asm-sources asm)))) (set-asm-sources! asm (acons (asm-start asm) source (asm-sources asm))))
@ -1074,7 +1069,7 @@ should be .data or .rodata), and return the resulting linker object.
(+ (byte-length k) (align len 8))) (+ (byte-length k) (align len 8)))
0 data)) 0 data))
(buf (make-bytevector byte-len 0))) (buf (make-bytevector byte-len 0)))
(let lp ((i 0) (pos 0) (labels '())) (let lp ((i 0) (pos 0) (symbols '()))
(if (< i (vlist-length data)) (if (< i (vlist-length data))
(let* ((pair (vlist-ref data i)) (let* ((pair (vlist-ref data i))
(obj (car pair)) (obj (car pair))
@ -1082,8 +1077,8 @@ should be .data or .rodata), and return the resulting linker object.
(write buf pos obj) (write buf pos obj)
(lp (1+ i) (lp (1+ i)
(align (+ (byte-length obj) pos) 8) (align (+ (byte-length obj) pos) 8)
(cons (make-linker-symbol obj-label pos) labels))) (cons (make-linker-symbol obj-label pos) symbols)))
(make-object asm name buf '() labels (make-object asm name buf '() symbols
#:flags (match name #:flags (match name
('.data (logior SHF_ALLOC SHF_WRITE)) ('.data (logior SHF_ALLOC SHF_WRITE))
('.rodata SHF_ALLOC)))))))))) ('.rodata SHF_ALLOC))))))))))
@ -1135,7 +1130,7 @@ relocations for references to symbols defined outside the text section."
(lambda (reloc tail) (lambda (reloc tail)
(match reloc (match reloc
((type label base word) ((type label base word)
(let ((abs (assq-ref labels label)) (let ((abs (hashq-ref labels label))
(dst (+ base word))) (dst (+ base word)))
(case type (case type
((s32) ((s32)
@ -1157,10 +1152,10 @@ relocations for references to symbols defined outside the text section."
relocs)) relocs))
(define (process-labels labels) (define (process-labels labels)
"Define linker symbols for the label-offset pairs in @var{labels}. "Define linker symbols for the label-offset map in @var{labels}.
The offsets are expected to be expressed in words." The offsets are expected to be expressed in words."
(map (lambda (pair) (hash-map->list (lambda (label loc)
(make-linker-symbol (car pair) (* (cdr pair) 4))) (make-linker-symbol label (* loc 4)))
labels)) labels))
(define (swap-bytes! buf) (define (swap-bytes! buf)