summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2023-01-06 11:19:48 +0100
committerLudovic Courtès <ludo@gnu.org>2023-01-17 17:49:05 +0100
commitfc5eae5d01b19cbfb4903e032f4172c888e0e52a (patch)
tree8ff37dda5c33f1681d10de0b806a3507e9b4dcbe
parent15c4c4ceb312f7a49273823478904581c0c86c6b (diff)
downloadguile-fc5eae5d01b19cbfb4903e032f4172c888e0e52a.tar.gz
assembler: Separate effectful part of 'link-symtab'.
* module/system/vm/assembler.scm (link-symtab): Define 'names' and 'write-symbols!'. Use it.
-rw-r--r--module/system/vm/assembler.scm37
1 files changed, 22 insertions, 15 deletions
diff --git a/module/system/vm/assembler.scm b/module/system/vm/assembler.scm
index 188f6f236..af16d268d 100644
--- a/module/system/vm/assembler.scm
+++ b/module/system/vm/assembler.scm
@@ -2369,21 +2369,28 @@ procedure with label @var{rw-init}. @var{rw-init} may be false. If
(bv (make-bytevector (* n size) 0)))
(define (intern-string! name)
(string-table-intern! strtab (if name (symbol->string name) "")))
- (for-each
- (lambda (meta n)
- (let ((name (intern-string! (meta-name meta))))
- (write-elf-symbol bv (* n size) endianness word-size
- (make-elf-symbol
- #:name name
- ;; Symbol value and size are measured in
- ;; bytes, not u32s.
- #:value (meta-low-pc meta)
- #:size (- (meta-high-pc meta)
- (meta-low-pc meta))
- #:type STT_FUNC
- #:visibility STV_HIDDEN
- #:shndx (elf-section-index text-section)))))
- meta (iota n))
+ (define names
+ (map (lambda (meta n)
+ (intern-string! (meta-name meta)))
+ meta (iota n)))
+ (define (write-symbols! bv offset)
+ (for-each (lambda (name meta n)
+ (write-elf-symbol bv (+ offset (* n size))
+ endianness word-size
+ (make-elf-symbol
+ #:name name
+ ;; Symbol value and size are measured in
+ ;; bytes, not u32s.
+ #:value (meta-low-pc meta)
+ #:size (- (meta-high-pc meta)
+ (meta-low-pc meta))
+ #:type STT_FUNC
+ #:visibility STV_HIDDEN
+ #:shndx (elf-section-index
+ text-section))))
+ names meta (iota n)))
+
+ (write-symbols! bv 0)
(let ((strtab (make-object asm '.strtab
(link-string-table! strtab)
'() '()