[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
9.4.4 GLIL
Guile Lowlevel Intermediate Language (GLIL) is a structured intermediate
language whose expressions more closely approximate Guile’s VM
instruction set. Its expression types are defined in (language
glil)
.
- Scheme Variable: <glil-program> meta . body
A unit of code that at run-time will correspond to a compiled procedure. meta should be an alist of properties, as in Tree-IL’s
<lambda>
. body is an ordered list of GLIL expressions.
- Scheme Variable: <glil-std-prelude> nreq nlocs else-label
A prologue for a function with no optional, keyword, or rest arguments. nreq is the number of required arguments. nlocs the total number of local variables, including the arguments. If the procedure was not given exactly nreq arguments, control will jump to else-label, if given, or otherwise signal an error.
- Scheme Variable: <glil-opt-prelude> nreq nopt rest nlocs else-label
A prologue for a function with optional or rest arguments. Like
<glil-std-prelude>
, with the addition that nopt is the number of optional arguments (possibly zero) and rest is an index of a local variable at which to bind a rest argument, or#f
if there is no rest argument.
- Scheme Variable: <glil-kw-prelude> nreq nopt rest kw allow-other-keys? nlocs else-label
A prologue for a function with keyword arguments. Like
<glil-opt-prelude>
, with the addition that kw is a list of keyword arguments, and allow-other-keys? is a flag indicating whether to allow unknown keys. See sectionbind-kwargs
, for details on the format of kw.
- Scheme Variable: <glil-bind> . vars
An advisory expression that notes a liveness extent for a set of variables. vars is a list of
(name type index)
, where type should be eitherargument
,local
, orexternal
.<glil-bind>
expressions end up being serialized as part of a program’s metadata and do not form part of a program’s code path.
- Scheme Variable: <glil-mv-bind> vars rest
A multiple-value binding of the values on the stack to vars. If rest is true, the last element of vars will be treated as a rest argument.
In addition to pushing a binding annotation on the stack, like
<glil-bind>
, an expression is emitted at compilation time to make sure that there are enough values available to bind. See the notes ontruncate-values
in Procedure Call and Return Instructions, for more information.
- Scheme Variable: <glil-unbind>
Closes the liveness extent of the most recently encountered
<glil-bind>
or<glil-mv-bind>
expression. As GLIL expressions are compiled, a parallel stack of live bindings is maintained; this expression pops off the top element from that stack.Bindings are written into the program’s metadata so that debuggers and other tools can determine the set of live local variables at a given offset within a VM program.
- Scheme Variable: <glil-source> loc
Records source information for the preceding expression. loc should be an association list of containing
line
column
, andfilename
keys, e.g. as returned bysource-properties
.
- Scheme Variable: <glil-const> obj
Pushes a constant value onto the stack. obj must be a number, string, symbol, keyword, boolean, character, uniform array, the empty list, or a pair or vector of constants.
- Scheme Variable: <glil-lexical> local? boxed? op index
Accesses a lexically bound variable. If the variable is not local? it is free. All variables may have
ref
,set
, andbound?
as their op. Boxed variables may also have the opsbox
,empty-box
, andfix
, which correspond in semantics to the VM instructionsbox
,empty-box
, andfix-closure
. See section Stack Layout, for more information.
- Scheme Variable: <glil-toplevel> op name
Accesses a toplevel variable. op may be
ref
,set
, ordefine
.
- Scheme Variable: <glil-module> op mod name public?
Accesses a variable within a specific module. See Tree-IL’s
<module-ref>
, for more information.
- Scheme Variable: <glil-label> label
Creates a new label. label can be any Scheme value, and should be unique.
- Scheme Variable: <glil-branch> inst label
Branch to a label. label should be a
<ghil-label>
.inst
is a branching instruction:br-if
,br
, etc.
- Scheme Variable: <glil-call> inst nargs
This expression is probably misnamed, as it does not correspond to function calls.
<glil-call>
invokes the VM instruction named inst, noting that it is called with nargs stack arguments. The arguments should be pushed on the stack already. What happens to the stack afterwards depends on the instruction.
- Scheme Variable: <glil-mv-call> nargs ra
Performs a multiple-value call. ra is a
<glil-label>
corresponding to the multiple-value return address for the call. See the notes onmv-call
in Procedure Call and Return Instructions, for more information.
- Scheme Variable: <glil-prompt> label escape-only?
Push a dynamic prompt into the stack, with a handler at label. escape-only? is a flag that is propagated to the prompt, allowing an abort to avoid capturing a continuation in some cases. See section Prompts, for more information.
Users may enter in GLIL at the REPL as well, though there is a bit more bookkeeping to do:
scheme@(guile-user)> ,language glil Happy hacking with Guile Lowlevel Intermediate Language (GLIL)! To switch back, type `,L scheme'. glil@(guile-user)> (program () (std-prelude 0 0 #f) (const 3) (call return 1)) ⇒ 3
Just as in all of Guile’s compilers, an environment is passed to the GLIL-to-object code compiler, and one is returned as well, along with the object code.
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on April 20, 2013 using texi2html 5.0.