summaryrefslogtreecommitdiff
path: root/module/system/repl/debug.scm
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2013-11-07 23:03:45 +0100
committerAndy Wingo <wingo@pobox.com>2013-11-07 23:03:45 +0100
commit581a4eb82b1534970060e3cbd79b9a96d351edf9 (patch)
treeffd7c1b175ca1746f63f697b4259e52c6c66597a /module/system/repl/debug.scm
parent72b82b0f210ef47798133dabf2a81eef3e036ba6 (diff)
downloadguile-581a4eb82b1534970060e3cbd79b9a96d351edf9.tar.gz
frame-instruction-pointer is absolute; rewrite (system vm coverage)
* libguile/frames.c (scm_frame_source): Instead of assuming that scm_frame_procedure is correct, use the IP to get the source. (scm_frame_instruction_pointer): Return an absolute value instead of assuming that slot 0 is correct. (It isn't, when preparing for a tail call.) * libguile/programs.h: * libguile/programs.c (scm_find_source_for_addr): New internal helper. * module/system/repl/debug.scm (print-registers): Readably print absolute instruction pointers. * module/system/vm/coverage.scm: Complete rewrite to use absolute IP's. We can't assume that frame-procedure is cheap if it is correct, or correct if it is cheap. Anyway using the address is better anyway. (coverage-data->lcov): Disable per-function info temporarily. (loaded-modules, module-procedures, closest-source-line) (closed-over-procedures): Remove these. Instead of going from procedures to source info, now we go from ELF image to source info. * module/system/vm/debug.scm (debug-context-length): New interface. * module/system/vm/program.scm (source-for-addr): New internal helper.
Diffstat (limited to 'module/system/repl/debug.scm')
-rw-r--r--module/system/repl/debug.scm7
1 files changed, 6 insertions, 1 deletions
diff --git a/module/system/repl/debug.scm b/module/system/repl/debug.scm
index 0b4a90485..251cd8966 100644
--- a/module/system/repl/debug.scm
+++ b/module/system/repl/debug.scm
@@ -94,7 +94,12 @@
(format port fmt val))
(format port "~aRegisters:~%" per-line-prefix)
- (print "ip = ~d\n" (frame-instruction-pointer frame))
+ (print "ip = #x~x" (frame-instruction-pointer frame))
+ (when (rtl-program? (frame-procedure frame))
+ (let ((code (rtl-program-code (frame-procedure frame))))
+ (format port " (#x~x~@d)" code
+ (- (frame-instruction-pointer frame) code))))
+ (newline port)
(print "sp = #x~x\n" (frame-stack-pointer frame))
(print "fp = #x~x\n" (frame-address frame)))