mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-10 05:50:26 +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:
parent
da60ba8062
commit
3659ef543e
1 changed files with 10 additions and 15 deletions
|
@ -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,11 +1152,11 @@ 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)
|
||||||
"Patch up the text buffer @var{buf}, swapping the endianness of each
|
"Patch up the text buffer @var{buf}, swapping the endianness of each
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue