diff --git a/racket/src/expander/Makefile b/racket/src/expander/Makefile index 9049caffc0..774d4ecf8c 100644 --- a/racket/src/expander/Makefile +++ b/racket/src/expander/Makefile @@ -75,6 +75,11 @@ run-no-cache: # Writes the extracted, compiled, decompiled expander to compiled/exp.rkt decompile: $(RACO) make bootstrap-run.rkt - $(RACKET) $(RKT_ARGS) bootstrap-run.rkt -c compiled/cache-src $(KNOT) -s -x -D -o compiled/exp.rkt + $(RACKET) $(RKT_ARGS) bootstrap-run.rkt -c compiled/cache-src $(KNOT) $(PURE) -s -x -D -o compiled/exp.rkt + +# Writes the extracted, compiled expander to compiled/exp.zo +bytecode: + $(RACO) make bootstrap-run.rkt + $(RACKET) $(RKT_ARGS) bootstrap-run.rkt -c compiled/cache-src $(KNOT) $(PURE) -s -x -B -o compiled/exp.zo .PHONY: expander expander-src expander-src-generate demo run run-no-cache diff --git a/racket/src/expander/README.txt b/racket/src/expander/README.txt index 3564eacd42..be5ba82fdd 100644 --- a/racket/src/expander/README.txt +++ b/racket/src/expander/README.txt @@ -75,6 +75,16 @@ Running: Expands and extracts as a single linklet to . + % racket bootstrap-run.rkt -c -sx -D -t -o + + Expands and extracts as a single linklet, compiles and + decompiles it, then writes the s-expression into . + + % racket bootstrap-run.rkt -c -sx -B -t -o + + Expands and extracts as a single linklet, compiles it + and then writes the bytecode into . + % racket bootstrap-run.rkt -c -O /racket Compiles the expander to source files in --- note that diff --git a/racket/src/expander/extract/decompile.rkt b/racket/src/expander/extract/decompile.rkt index 8b81953ee0..4430826663 100644 --- a/racket/src/expander/extract/decompile.rkt +++ b/racket/src/expander/extract/decompile.rkt @@ -5,29 +5,29 @@ (provide compile-and-decompile) -(define (compile-and-decompile linklet-expr print-extracted-to) +(define (compile-and-decompile linklet-expr print-extracted-to #:as-bytecode? as-bytecode?) (unless compile-linklet (error "Host Racket does not support linklet compilation")) (log-status "Compiling and decompiling linklet to ~a" print-extracted-to) - + (define linklet (compile-linklet linklet-expr)) - (define o (open-output-bytes)) - (write (hash->linklet-bundle (hasheq 0 linklet)) o) - - (define i (open-input-bytes (get-output-bytes o))) - - ;; Dynamically load decompiler, so that it's not otherwise a - ;; dependency for running the expander-flattener - (define zo ((dynamic-require 'compiler/zo-parse 'zo-parse) i)) - (define decompiled-expr ((dynamic-require 'compiler/decompile 'decompile) zo)) + (define out (open-output-bytes)) + (write (hash->linklet-bundle (hasheq 0 linklet)) out) (call-with-output-file* print-extracted-to #:exists 'truncate/replace (lambda (o) - (pretty-write decompiled-expr o)))) + (if as-bytecode? + (write-bytes (get-output-bytes out) o) + (let* ([i (open-input-bytes (get-output-bytes out))] + ;; Dynamically load decompiler, so that it's not otherwise a + ;; dependency for running the expander-flattener + [zo ((dynamic-require 'compiler/zo-parse 'zo-parse) i)] + [decompiled-expr ((dynamic-require 'compiler/decompile 'decompile) zo)]) + (pretty-write decompiled-expr o)))))) (define compile-linklet (hash-ref (primitive-table '#%linklet) 'compile-linklet #f)) diff --git a/racket/src/expander/extract/main.rkt b/racket/src/expander/extract/main.rkt index fcef8f2d49..11d4ea54d5 100644 --- a/racket/src/expander/extract/main.rkt +++ b/racket/src/expander/extract/main.rkt @@ -25,6 +25,7 @@ #:print-extracted-to print-extracted-to #:as-c? as-c? #:as-decompiled? as-decompiled? + #:as-bytecode? as-bytecode? ;; Table of symbol -> (listof knot-spec), ;; to redirect a remaining import back to ;; an implementation that is defined in the @@ -111,7 +112,7 @@ (get-module-export-variables start-link #:compiled-modules compiled-modules #:cache cache)) - + ;; Generate the flattened linklet (define flattened-linklet-expr (flatten! start-link @@ -124,7 +125,7 @@ (define simplified-expr (simplify-definitions flattened-linklet-expr)) - + ;; Remove unreferenced definitions (define gced-linklet-expr (garbage-collect-definitions simplified-expr)) @@ -140,8 +141,8 @@ (prune-names re-renamed-linklet-expr)) (cond - [as-decompiled? - (compile-and-decompile pruned-linklet-expr print-extracted-to)] + [(or as-decompiled? as-bytecode?) + (compile-and-decompile pruned-linklet-expr print-extracted-to #:as-bytecode? as-bytecode?)] [else (save-and-report-flattened! pruned-linklet-expr print-extracted-to #:as-c? as-c?)]))) diff --git a/racket/src/expander/run.rkt b/racket/src/expander/run.rkt index 9a50faac1d..13f6bc837d 100644 --- a/racket/src/expander/run.rkt +++ b/racket/src/expander/run.rkt @@ -45,6 +45,7 @@ (define makefile-dependencies-file #f) (define extract-to-c? #f) (define extract-to-decompiled? #f) +(define extract-to-bytecode? #f) (define instance-knot-ties (make-hasheq)) (define primitive-table-directs (make-hasheq)) (define side-effect-free-modules (make-hash)) @@ -104,6 +105,8 @@ (set! extract-to-c? #t)] [("-D") "Print extracted bootstrap as a decompiled" (set! extract-to-decompiled? #t)] + [("-B") "Print extracted bootstrap as bytecode" + (set! extract-to-bytecode? #t)] #:multi [("++knot") sym path "Redirect imports from to flattened from " (hash-update! instance-knot-ties @@ -308,6 +311,7 @@ #:print-extracted-to print-extracted-to #:as-c? extract-to-c? #:as-decompiled? extract-to-decompiled? + #:as-bytecode? extract-to-bytecode? #:instance-knot-ties instance-knot-ties #:primitive-table-directs primitive-table-directs #:side-effect-free-modules side-effect-free-modules))