From: Andy Wingo <wingo@pobox.com>
To: guile-devel <guile-devel@gnu.org>
Subject: full moon, vm status update
Date: Wed, 15 Oct 2008 23:48:00 +0200 [thread overview]
Message-ID: <m3d4i1h6nj.fsf@pobox.com> (raw)
'Sup,
I was going to divide this update into the good, the bad, and the ugly,
but the bad is the ugly, and the good contains within it the bad as
well.
The good:
* I've hacked the disassembler to weave together the bits of
information that it has into a more coherent text.
So for example where in the past you would have a separate section
after the program text listing the instruction <-> source
associations, now the instruction disassembly is annotated with the
source information directly.
This required me to become format's daddy.
http://git.savannah.gnu.org/gitweb/?p=guile.git;a=blob;f=module/system/vm/disasm.scm;h=5ec1c004b42092a621792c1bc93e1c1b566a11fc;hb=vm#l171
I've appended a bit of disassembly to this mail.
* Fixed another bug in quasiquote compilation. I don't expect any
more, but then again, I didn't expect any more.
* The VM stack is now marked precisely.
* There is a now a debugging mode, currently turned on, in which we
try ensure that the top of the stack is non-NULL and that all
elements past the top are set to NULL. There are a number of checks
in various places that this is the case. The idea is to avoid lost
references when GC runs, and the heap structure's idea of the VM
registers is out of sync with what the VM regs actually are; or
there is some sloppy programming somewhere. When turned off, this
code incurs no overhead.
This mode helped to catch a number of stack GC bugs.
* All of Guile's test suites pass now, with (ice-9 ...) compiled,
including boot-9.
The bad:
(It's like a C switch statement, it all falls through to the ugly.)
The ugly:
* Actually the bit about all of the test suites passing was a lie in
another respect: the elisp test fails, with a C stack overflow,
indicating too much recursion into the interpreter.
I suspect this is because some part of the elisp code depends on
tail calls within interpreted code, but you don't get tail call
semantics when calling between VM code and interpreted code, just as
you do not with calling between e.g. interpreted and C code.
I was hoping that the stack calibration patches would land sooner or
later in master so that I could merge and pick up this code, because
the truth is that it's all too easy to hit the limit, for whatever
reason.
I have not yet tested the calibration patches.
* I had to disable compilation of popen.scm in order to get the tests
to pass, as it was causing really strange, nondeterministic things
to happen. I don't know why.
My current speculation is that when you compile --with-threads, as I
do, that the socketpair between the signal receiving thread and the
main thread is not closed after the fork, therefore signals in the
child might reach the parent or vice versa, causing random code to
run which itself might cause VM problems.
Julian: if you have read this far and have the cycles, can you say
something about the state of the signal socketpair after a fork?
* Still there are a couple other modules not being compiles.
The future:
* Compile more modules -- srfi, third-level modules -- (ice-9 foo
bar)
* Fix GOOPS to be VM-compatible
* Compile *and* interpret the test suites
* Update docs (maybe merging with guile.texi)
and, once things are correct...
* Profile, profile, profile
My goal is: correct execution of all existing code that:
* does not do runtime side-effects in macros
* does not call (the-environment)
* does not unquote in values into macros
Well that's a long enough update! Questions, comments, and help are most
welcome.
Happy hacking,
Andy
ps. Here's the disassembly I promised:
scheme@(guile-user)> ,x with-output-to-file
Disassembly of #<program with-output-to-file (file thunk)>:
nargs = 2 nrest = 0 nlocs = 2 nexts = 0
Bytecode:
0 (late-variable-ref 0) ;; `open-output-file'
2 (local-ref 0) ;; `file' (arg)
4 (call 1) at r4rs.scm:145:16
6 (local-set 2) ;; `nport'
8 (late-variable-ref 1) ;; `with-output-to-port'
10 (local-ref 2) ;; `nport'
12 (local-ref 1) ;; `thunk' (arg)
14 (call 2) at r4rs.scm:146:14
16 (local-set 3) ;; `ans'
18 (late-variable-ref 2) ;; `close-port'
20 (local-ref 2) ;; `nport'
22 (call 1) at r4rs.scm:147:4
24 (drop)
25 (local-ref 3) ;; `ans'
27 (return)
Properties:
#f (documentation . "THUNK must be a procedure of no arguments, and FILE must be a
string naming a file. The effect is unspecified if the file already exists.
The file is opened for output, an output port connected to it is made
the default value returned by `current-output-port',
and the THUNK is called with no arguments.
When the THUNK returns, the port is closed and the previous
default is restored. Returns the value yielded by THUNK. If an
escape procedure is used to escape from the continuation of these
procedures, their behavior is implementation dependent.")
(If you read this and worry about runtime costs, don't -- the
annotations and properties are not loaded until they are asked for)
--
http://wingolog.org/
next reply other threads:[~2008-10-15 21:48 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-15 21:48 Andy Wingo [this message]
2008-10-16 5:35 ` full moon, vm status update Julian Graham
2008-10-16 12:34 ` Andy Wingo
2008-10-16 19:25 ` Ludovic Courtès
2008-10-16 21:21 ` Andy Wingo
2008-10-18 10:26 ` Neil Jerram
2008-10-27 23:51 ` Neil Jerram
2008-10-31 17:54 ` Andy Wingo
2008-10-31 18:36 ` Andy Wingo
2008-10-31 19:51 ` Ludovic Courtès
2008-11-08 0:24 ` Neil Jerram
2009-01-04 13:08 ` Andy Wingo
-- strict thread matches above, loose matches on Subject: below --
2008-10-16 18:41 dsmich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=m3d4i1h6nj.fsf@pobox.com \
--to=wingo@pobox.com \
--cc=guile-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).