zo-lib: documentation and a little support for non-BC linklets
Closes #3073
This commit is contained in:
parent
85e2282b66
commit
744d8d6d25
|
@ -1,7 +1,8 @@
|
||||||
#lang racket/base
|
#lang racket/base
|
||||||
(require racket/linklet
|
(require racket/linklet
|
||||||
compiler/zo-parse
|
compiler/zo-parse
|
||||||
compiler/zo-marshal)
|
compiler/zo-marshal
|
||||||
|
compiler/faslable-correlated)
|
||||||
|
|
||||||
;; Re-implement just enough deserialization to deal with 'decl
|
;; Re-implement just enough deserialization to deal with 'decl
|
||||||
;; linklets, so we can get `required`, etc.
|
;; linklets, so we can get `required`, etc.
|
||||||
|
@ -138,24 +139,6 @@
|
||||||
|
|
||||||
;; ----------------------------------------
|
;; ----------------------------------------
|
||||||
|
|
||||||
(struct faslable-correlated-linklet (expr name)
|
|
||||||
#:prefab)
|
|
||||||
|
|
||||||
(struct faslable-correlated (e source position line column span props)
|
|
||||||
#:prefab)
|
|
||||||
|
|
||||||
(define (strip-correlated v)
|
|
||||||
(let strip ([v v])
|
|
||||||
(cond
|
|
||||||
[(pair? v)
|
|
||||||
(cons (strip (car v))
|
|
||||||
(strip (cdr v)))]
|
|
||||||
[(faslable-correlated? v)
|
|
||||||
(strip (faslable-correlated-e v))]
|
|
||||||
[else v])))
|
|
||||||
|
|
||||||
;; ----------------------------------------
|
|
||||||
|
|
||||||
;; Returns (values mpi-vector requires provides phase-to-link-modules)
|
;; Returns (values mpi-vector requires provides phase-to-link-modules)
|
||||||
(define (deserialize-requires-and-provides l)
|
(define (deserialize-requires-and-provides l)
|
||||||
(define ht (linkl-bundle-table l))
|
(define ht (linkl-bundle-table l))
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
(define deps '(["base" #:version "8.1.0.2"]
|
(define deps '(["base" #:version "8.1.0.2"]
|
||||||
"scheme-lib"
|
"scheme-lib"
|
||||||
"rackunit-lib"
|
"rackunit-lib"
|
||||||
"zo-lib"))
|
["zo-lib" #:version "1.3"]))
|
||||||
|
|
||||||
(define implies '("zo-lib"))
|
(define implies '("zo-lib"))
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,10 @@
|
||||||
|
|
||||||
(provide inside-doc
|
(provide inside-doc
|
||||||
guide-doc
|
guide-doc
|
||||||
reference-doc)
|
reference-doc
|
||||||
|
|
||||||
|
CS
|
||||||
|
BC)
|
||||||
|
|
||||||
(define inside-doc
|
(define inside-doc
|
||||||
'(lib "scribblings/inside/inside.scrbl"))
|
'(lib "scribblings/inside/inside.scrbl"))
|
||||||
|
@ -13,3 +16,6 @@
|
||||||
|
|
||||||
(define reference-doc
|
(define reference-doc
|
||||||
'(lib "scribblings/reference/reference.scrbl"))
|
'(lib "scribblings/reference/reference.scrbl"))
|
||||||
|
|
||||||
|
(define CS (tech #:doc guide-doc "CS"))
|
||||||
|
(define BC (tech #:doc guide-doc "BC"))
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
#lang scribble/doc
|
#lang scribble/doc
|
||||||
@(require scribble/manual
|
@(require scribble/manual
|
||||||
scribble/bnf
|
scribble/bnf
|
||||||
|
scribble/core
|
||||||
"common.rkt"
|
"common.rkt"
|
||||||
(for-label racket/base
|
(for-label racket/base
|
||||||
|
racket/contract/base
|
||||||
compiler/decompile
|
compiler/decompile
|
||||||
(only-in compiler/zo-parse linkl-directory? linkl-bundle? linkl?)
|
(only-in compiler/zo-parse linkl-directory? linkl-bundle? linkl?)
|
||||||
compiler/zo-marshal))
|
compiler/zo-marshal
|
||||||
|
compiler/faslable-correlated
|
||||||
|
racket/linklet))
|
||||||
|
|
||||||
@title[#:tag "decompile"]{@exec{raco decompile}: Decompiling Bytecode}
|
@title[#:tag "decompile"]{@exec{raco decompile}: Decompiling Bytecode}
|
||||||
|
|
||||||
|
@ -26,7 +30,7 @@ The @exec{raco decompile} command accepts the following command-line flags:
|
||||||
given file's path and an associated @filepath{.zo} file (if any)}
|
given file's path and an associated @filepath{.zo} file (if any)}
|
||||||
@item{@Flag{n} @nonterm{n} or @DFlag{columns} @nonterm{n} --- format
|
@item{@Flag{n} @nonterm{n} or @DFlag{columns} @nonterm{n} --- format
|
||||||
output for a display with @nonterm{n} columns}
|
output for a display with @nonterm{n} columns}
|
||||||
@item{@DFlag{linklet} --- decompile only as far as linklets, instead
|
@item{@DFlag{linklet} --- decompile only as far as @tech[#:doc reference-doc]{linklets}, instead
|
||||||
of decoding linklets to approximate Racket @racket[module] forms}
|
of decoding linklets to approximate Racket @racket[module] forms}
|
||||||
@item{@DFlag{no-disassemble} --- show machine code as-is in a byte string,
|
@item{@DFlag{no-disassemble} --- show machine code as-is in a byte string,
|
||||||
instead of attempting to disassemble}
|
instead of attempting to disassemble}
|
||||||
|
@ -58,7 +62,7 @@ module around machine-code implementations of procedures.
|
||||||
|
|
||||||
@section{Racket BC Decompilation}
|
@section{Racket BC Decompilation}
|
||||||
|
|
||||||
Racket BC bytecode has a structure that is close enough to Racket's
|
Racket @BC bytecode has a structure that is close enough to Racket's
|
||||||
core language that it can more often be converted to an approximation
|
core language that it can more often be converted to an approximation
|
||||||
of Racket code. To the degree that it can be converted back,
|
of Racket code. To the degree that it can be converted back,
|
||||||
many forms in the decompiled code have the same meanings as
|
many forms in the decompiled code have the same meanings as
|
||||||
|
@ -166,7 +170,9 @@ Racket BC bytecode has a structure that is close enough to Racket's
|
||||||
|
|
||||||
@defmodule[compiler/decompile]
|
@defmodule[compiler/decompile]
|
||||||
|
|
||||||
@defproc[(decompile [top (or/c linkl-directory? linkl-bundle? linkl?)]) any/c]{
|
@defproc[(decompile [top (or/c linkl-directory? linkl-bundle? linkl?
|
||||||
|
linklet? faslable-correlated-linklet?)])
|
||||||
|
any/c]{
|
||||||
|
|
||||||
Consumes the result of parsing bytecode and returns an S-expression
|
Consumes the result of parsing bytecode and returns an S-expression
|
||||||
(as described above) that represents the compiled code.}
|
(as described above) that represents the compiled code.}
|
||||||
|
@ -193,3 +199,58 @@ the marshaled bytecode.}
|
||||||
@; ------------------------------------------------------------
|
@; ------------------------------------------------------------
|
||||||
|
|
||||||
@include-section["zo-struct.scrbl"]
|
@include-section["zo-struct.scrbl"]
|
||||||
|
|
||||||
|
@; ------------------------------------------------------------
|
||||||
|
|
||||||
|
@section{Machine-Independent Linklets}
|
||||||
|
|
||||||
|
@defmodule[compiler/faslable-correlated]
|
||||||
|
|
||||||
|
@nested[#:style 'inset]{
|
||||||
|
@elem[#:style (style #f (list (background-color-property "yellow")))]{@bold{Warning:}}
|
||||||
|
The @racketmodname[compiler/faslable-correlated] library exposes internals
|
||||||
|
of the Racket bytecode abstraction. Unlike other Racket
|
||||||
|
libraries, @racketmodname[compiler/faslable-correlated] is subject to
|
||||||
|
incompatible changes across Racket versions.}
|
||||||
|
|
||||||
|
@history[#:added "1.3"]
|
||||||
|
|
||||||
|
@defstruct[faslable-correlated-linklet ([expr any/c]
|
||||||
|
[name symbol?])
|
||||||
|
#:prefab]{
|
||||||
|
|
||||||
|
A @racket[faslable-correlated-linklet] structure represents a
|
||||||
|
@tech[#:doc reference-doc]{linklet} that has been ``compiled'' to
|
||||||
|
machine-independent form, which just contains an S-expression
|
||||||
|
representing the @racket[linklet] form. The S-expression is enriched
|
||||||
|
with source-location information by wrapping some nested S-expressions
|
||||||
|
with @racket[faslable-correlated] structures.
|
||||||
|
|
||||||
|
Since @racket[faslable-correlated-linklet] is a @tech[#:doc
|
||||||
|
reference-doc]{prefab} structure type, the contracts documented above
|
||||||
|
for its fields are not enforced.}
|
||||||
|
|
||||||
|
@defstruct[faslable-correlated ([e any/c]
|
||||||
|
[source any/c]
|
||||||
|
[position exact-positive-integer?]
|
||||||
|
[line exact-positive-integer?]
|
||||||
|
[column exact-nonnegative-integer?]
|
||||||
|
[span exact-nonnegative-integer?]
|
||||||
|
[props (hash/c symbol? any/c)])
|
||||||
|
#:prefab]{
|
||||||
|
|
||||||
|
Wraps an S-expression @racket[e] to give it a @tech[#:doc
|
||||||
|
reference-doc]{source location}. The S-expression @racket[e] may
|
||||||
|
contain nested @racket[faslable-correlated] structures, but nesting is
|
||||||
|
expected only within pairs.
|
||||||
|
|
||||||
|
Since @racket[faslable-correlated] is a @tech[#:doc
|
||||||
|
reference-doc]{prefab} structure type, the contracts documented above
|
||||||
|
for its fields are not enforced.}
|
||||||
|
|
||||||
|
@defproc[(strip-correlated [e any/c]) any/c]{
|
||||||
|
|
||||||
|
Recurs through @racket[e] to strip away any
|
||||||
|
@racket[faslable-correlated] structures that are reachable through
|
||||||
|
pairs. The given @racket[e] must not contain any cycles that are
|
||||||
|
reachable through pairs.}
|
||||||
|
|
|
@ -45,7 +45,7 @@ The @exec{raco demod} command accepts these flags:
|
||||||
|
|
||||||
@item{@Flag{r} or @DFlag{recompile} --- (re)compiles the module to
|
@item{@Flag{r} or @DFlag{recompile} --- (re)compiles the module to
|
||||||
machine-dependent form after flattening; this mode is the
|
machine-dependent form after flattening; this mode is the
|
||||||
default except on @tech[#:doc guide-doc]{BC}, where flattening
|
default except on @BC, where flattening
|
||||||
can work in terms of bytecode files.}
|
can work in terms of bytecode files.}
|
||||||
|
|
||||||
@item{@DFlag{work} @nonterm{dir} --- uses @nonterm{dir} to cache
|
@item{@DFlag{work} @nonterm{dir} --- uses @nonterm{dir} to cache
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
compiler/embed
|
compiler/embed
|
||||||
launcher/launcher))
|
launcher/launcher))
|
||||||
|
|
||||||
@(define (gtech s) (tech #:doc '(lib "scribblings/guide/guide.scrbl") s))
|
@(define (gtech s) (tech #:doc guide-doc s))
|
||||||
|
|
||||||
@title[#:tag "exe"]{@exec{raco exe}: Creating Stand-Alone Executables}
|
@title[#:tag "exe"]{@exec{raco exe}: Creating Stand-Alone Executables}
|
||||||
|
|
||||||
|
|
|
@ -2163,7 +2163,7 @@ does not match the running Racket's information, then the
|
||||||
@racketmodname[setup/cross-system] module infers that Racket is being
|
@racketmodname[setup/cross-system] module infers that Racket is being
|
||||||
run in cross-installation mode.
|
run in cross-installation mode.
|
||||||
|
|
||||||
For example, if an in-place Racket @tech[#:doc guide-doc]{BC}
|
For example, if an in-place Racket @BC
|
||||||
installation for a different platform resides at @nonterm{cross-dir},
|
installation for a different platform resides at @nonterm{cross-dir},
|
||||||
then running Racket BC as
|
then running Racket BC as
|
||||||
|
|
||||||
|
@ -2177,7 +2177,7 @@ libraries need to run to perform the requested @exec{raco pkg} action
|
||||||
(e.g., when installing built packages), or as long as the current
|
(e.g., when installing built packages), or as long as the current
|
||||||
platform's installation already includes those libraries.
|
platform's installation already includes those libraries.
|
||||||
|
|
||||||
For Racket @tech[#:doc guide-doc]{CS}, cross compilation is more
|
For Racket @CS, cross compilation is more
|
||||||
complicated, because Racket CS @filepath{.zo} files are
|
complicated, because Racket CS @filepath{.zo} files are
|
||||||
platform-specific:
|
platform-specific:
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
#lang scribble/doc
|
#lang scribble/doc
|
||||||
@(require scribble/manual
|
@(require scribble/manual
|
||||||
|
"common.rkt"
|
||||||
(for-label racket/base
|
(for-label racket/base
|
||||||
racket/contract
|
racket/contract
|
||||||
compiler/zo-parse
|
compiler/zo-parse
|
||||||
|
compiler/decompile
|
||||||
|
compiler/faslable-correlated
|
||||||
racket/set))
|
racket/set))
|
||||||
|
|
||||||
@(define-syntax-rule (defstruct+ id fields . rest)
|
@(define-syntax-rule (defstruct+ id fields . rest)
|
||||||
|
@ -20,12 +23,33 @@ The @racketmodname[compiler/zo-parse] module re-exports
|
||||||
Parses a port (typically the result of opening a @filepath{.zo} file)
|
Parses a port (typically the result of opening a @filepath{.zo} file)
|
||||||
containing bytecode. Beware that the structure types used to
|
containing bytecode. Beware that the structure types used to
|
||||||
represent the bytecode are subject to frequent changes across Racket
|
represent the bytecode are subject to frequent changes across Racket
|
||||||
versons.
|
versions.
|
||||||
|
|
||||||
The parsed bytecode is returned in a @racket[linkl-directory] or
|
The parsed bytecode is returned in a @racket[linkl-directory] or
|
||||||
@racket[linkl-bundle] structure---the latter only for the compilation
|
@racket[linkl-bundle] structure---the latter only for the compilation
|
||||||
of a module that contains no submodules.
|
of a module that contains no submodules.
|
||||||
|
|
||||||
|
Beyond the linklet bundle or directory structure, the result of
|
||||||
|
@racket[zo-parse] contains linklets that depend on the machine for
|
||||||
|
which the bytecode is compiled:
|
||||||
|
|
||||||
|
@itemlist[
|
||||||
|
|
||||||
|
@item{For a machine-independent bytecode file, a linklet is
|
||||||
|
represented as a @racket[faslable-correlated-linklet].}
|
||||||
|
|
||||||
|
@item{For a Racket @CS bytecode file, a linklet is opaque, because
|
||||||
|
it is primarily machine code, but @racket[decompile] can
|
||||||
|
extract some information and potentially disassemble the
|
||||||
|
machine code.}
|
||||||
|
|
||||||
|
@item{For Racket @BC bytecode, the bytecode can be parsed into
|
||||||
|
structures as described below.}
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
The rest of this section is specific to @BC bytecode.
|
||||||
|
|
||||||
Within a linklet, the bytecode representation of an expression is closer to an
|
Within a linklet, the bytecode representation of an expression is closer to an
|
||||||
S-expression than a traditional, flat control string. For example, an
|
S-expression than a traditional, flat control string. For example, an
|
||||||
@racket[if] form is represented by a @racket[branch] structure that
|
@racket[if] form is represented by a @racket[branch] structure that
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
#lang scribble/doc
|
#lang scribble/doc
|
||||||
@(require scribble/manual
|
@(require scribble/manual
|
||||||
scribble/core
|
scribble/core
|
||||||
|
"common.rkt"
|
||||||
(for-label racket/base
|
(for-label racket/base
|
||||||
racket/contract
|
racket/contract
|
||||||
|
racket/linklet
|
||||||
compiler/zo-structs
|
compiler/zo-structs
|
||||||
compiler/zo-parse
|
compiler/zo-parse
|
||||||
compiler/zo-marshal
|
compiler/zo-marshal
|
||||||
compiler/decompile
|
compiler/decompile
|
||||||
|
compiler/faslable-correlated
|
||||||
racket/set))
|
racket/set))
|
||||||
|
|
||||||
@(define-syntax-rule (defstruct+ id fields . rest)
|
@(define-syntax-rule (defstruct+ id fields . rest)
|
||||||
|
@ -61,7 +64,13 @@ structures that are produced by @racket[zo-parse] and consumed by
|
||||||
|
|
||||||
For a module with submodules, the linklet directory maps submodule
|
For a module with submodules, the linklet directory maps submodule
|
||||||
paths (as lists of symbols) to linklet bundles for the corresponding
|
paths (as lists of symbols) to linklet bundles for the corresponding
|
||||||
submodules.}
|
submodules.
|
||||||
|
|
||||||
|
An individual linklet is represented as a @racket[linkl] only if the
|
||||||
|
source bytecode file was for Racket @|BC|. A @CS bytecode linklet will
|
||||||
|
be represented by an opaque linklet (in the sense of @racket[linklet?]
|
||||||
|
from @racketmodname[racket/linklet]). A machine-independent linklet
|
||||||
|
is represented as a @racket[faslable-correlated-linklet] structure.}
|
||||||
|
|
||||||
@defstruct+[(linkl zo)
|
@defstruct+[(linkl zo)
|
||||||
([name symbol?]
|
([name symbol?]
|
||||||
|
|
21
pkgs/zo-lib/compiler/faslable-correlated.rkt
Normal file
21
pkgs/zo-lib/compiler/faslable-correlated.rkt
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#lang racket/base
|
||||||
|
|
||||||
|
(provide (struct-out faslable-correlated-linklet)
|
||||||
|
(struct-out faslable-correlated)
|
||||||
|
strip-correlated)
|
||||||
|
|
||||||
|
(struct faslable-correlated-linklet (expr name)
|
||||||
|
#:prefab)
|
||||||
|
|
||||||
|
(struct faslable-correlated (e source position line column span props)
|
||||||
|
#:prefab)
|
||||||
|
|
||||||
|
(define (strip-correlated v)
|
||||||
|
(let strip ([v v])
|
||||||
|
(cond
|
||||||
|
[(pair? v)
|
||||||
|
(cons (strip (car v))
|
||||||
|
(strip (cdr v)))]
|
||||||
|
[(faslable-correlated? v)
|
||||||
|
(strip (faslable-correlated-e v))]
|
||||||
|
[else v])))
|
|
@ -8,4 +8,4 @@
|
||||||
|
|
||||||
(define pkg-authors '(mflatt))
|
(define pkg-authors '(mflatt))
|
||||||
|
|
||||||
(define version "1.2")
|
(define version "1.3")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user