diff options
author | Ludovic Courtès <ludo@gnu.org> | 2023-01-08 23:32:34 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2023-01-17 17:49:05 +0100 |
commit | 3cd64feb2e069042f453305a0736f8ae277b2015 (patch) | |
tree | 55fec030cf925f507448cdda6fc3ca50ed8be921 /module/language/bytecode | |
parent | 4ab71e1f0d623edc3d11eeba5db8b22229954dff (diff) | |
download | guile-3cd64feb2e069042f453305a0736f8ae277b2015.tar.gz |
linker: Do not store entire ELF in memory when writing to a file.
This reduces the amount of memory that needs to be allocated while
writing the ELF file to disk.
Note: We're abusing #:page-aligned? in 'link-elf' to choose whether to
return a bytevector or a procedure.
* module/system/vm/linker.scm (process-reloc): Subtract SECTION-OFFSET
when writing to BV.
(write-linker-object): Pass BV directly to the linker object writer.
(link-elf): When PAGE-ALIGNED? is false, call 'bytevector-slice' from
here. When it is true, return a procedure that takes a port and writes
to it, without having to allocate a bytevector for the whole ELF
container.
* module/language/bytecode/spec.scm (bytecode->value): Handle X being a
procedure instead of a bytevector.
(bytecode) <#:printer>: Likewise.
* test-suite/tests/linker.test (link-elf-with-one-main-section): Pass
#:page-aligned? #f.
Diffstat (limited to 'module/language/bytecode')
-rw-r--r-- | module/language/bytecode/spec.scm | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/module/language/bytecode/spec.scm b/module/language/bytecode/spec.scm index 89256c5c2..6f77dc359 100644 --- a/module/language/bytecode/spec.scm +++ b/module/language/bytecode/spec.scm @@ -1,6 +1,6 @@ ;;; Bytecode -;; Copyright (C) 2013 Free Software Foundation, Inc. +;; Copyright (C) 2013, 2023 Free Software Foundation, Inc. ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -21,11 +21,19 @@ (define-module (language bytecode spec) #:use-module (system base language) #:use-module (system vm loader) + #:use-module (rnrs bytevectors) #:use-module (ice-9 binary-ports) + #:use-module (srfi srfi-71) #:export (bytecode)) (define (bytecode->value x e opts) - (let ((thunk (load-thunk-from-memory x))) + (let ((thunk (load-thunk-from-memory + (if (bytevector? x) + x + (let ((port get-bv (open-bytevector-output-port))) + (x port) + (close-port port) + (get-bv)))))) (if (eq? e (current-module)) ;; save a cons in this case (values (thunk) e e) @@ -37,6 +45,9 @@ (define-language bytecode #:title "Bytecode" #:compilers `((value . ,bytecode->value)) - #:printer (lambda (bytecode port) (put-bytevector port bytecode)) + #:printer (lambda (bytecode port) + (if (bytevector? bytecode) + (put-bytevector port bytecode) + (bytecode port))) #:reader get-bytevector-all #:for-humans? #f) |