mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-01 20:30:28 +02:00
add fold-all-debug-contexts, fold-source-locations
* module/system/vm/objcode.scm: * libguile/objcodes.c (scm_all_mapped_elf_images): New proc. * module/system/vm/debug.scm (fold-all-debug-contexts): (fold-source-locations): New public interfaces.
This commit is contained in:
parent
4b8d21c17c
commit
0128bb9c38
3 changed files with 68 additions and 2 deletions
|
@ -741,6 +741,27 @@ scm_find_mapped_elf_image (SCM ip)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SCM
|
||||||
|
scm_all_mapped_elf_images (void)
|
||||||
|
{
|
||||||
|
SCM result = SCM_EOL;
|
||||||
|
|
||||||
|
scm_i_pthread_mutex_lock (&scm_i_misc_mutex);
|
||||||
|
{
|
||||||
|
size_t n;
|
||||||
|
for (n = 0; n < mapped_elf_images_count; n++)
|
||||||
|
{
|
||||||
|
signed char *data = (signed char *) mapped_elf_images[n].start;
|
||||||
|
size_t len = mapped_elf_images[n].end - mapped_elf_images[n].start;
|
||||||
|
result = scm_cons (scm_c_take_gc_bytevector (data, len, SCM_BOOL_F),
|
||||||
|
result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scm_i_pthread_mutex_unlock (&scm_i_misc_mutex);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scheme interface
|
* Scheme interface
|
||||||
|
@ -881,6 +902,8 @@ scm_init_objcodes (void)
|
||||||
|
|
||||||
scm_c_define_gsubr ("find-mapped-elf-image", 1, 0, 0,
|
scm_c_define_gsubr ("find-mapped-elf-image", 1, 0, 0,
|
||||||
(scm_t_subr) scm_find_mapped_elf_image);
|
(scm_t_subr) scm_find_mapped_elf_image);
|
||||||
|
scm_c_define_gsubr ("all-mapped-elf-images", 0, 0, 0,
|
||||||
|
(scm_t_subr) scm_all_mapped_elf_images);
|
||||||
|
|
||||||
scm_c_define ("word-size", scm_from_size_t (sizeof(SCM)));
|
scm_c_define ("word-size", scm_from_size_t (sizeof(SCM)));
|
||||||
scm_c_define ("byte-order", scm_from_uint16 (SCM_BYTE_ORDER));
|
scm_c_define ("byte-order", scm_from_uint16 (SCM_BYTE_ORDER));
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#:use-module (system foreign)
|
#:use-module (system foreign)
|
||||||
#:use-module (rnrs bytevectors)
|
#:use-module (rnrs bytevectors)
|
||||||
#:use-module (ice-9 match)
|
#:use-module (ice-9 match)
|
||||||
|
#:use-module ((srfi srfi-1) #:select (fold))
|
||||||
#:use-module (srfi srfi-9)
|
#:use-module (srfi srfi-9)
|
||||||
#:export (debug-context-image
|
#:export (debug-context-image
|
||||||
debug-context-base
|
debug-context-base
|
||||||
|
@ -55,6 +56,7 @@
|
||||||
arity-is-case-lambda?
|
arity-is-case-lambda?
|
||||||
|
|
||||||
debug-context-from-image
|
debug-context-from-image
|
||||||
|
fold-all-debug-contexts
|
||||||
for-each-elf-symbol
|
for-each-elf-symbol
|
||||||
find-debug-context
|
find-debug-context
|
||||||
find-program-debug-info
|
find-program-debug-info
|
||||||
|
@ -74,7 +76,8 @@
|
||||||
source-line-for-user
|
source-line-for-user
|
||||||
source-column
|
source-column
|
||||||
find-source-for-addr
|
find-source-for-addr
|
||||||
find-program-sources))
|
find-program-sources
|
||||||
|
fold-source-locations))
|
||||||
|
|
||||||
;;; A compiled procedure comes from a specific loaded ELF image. A
|
;;; A compiled procedure comes from a specific loaded ELF image. A
|
||||||
;;; debug context identifies that image.
|
;;; debug context identifies that image.
|
||||||
|
@ -153,6 +156,15 @@ offset from the beginning of the ELF image in 32-bit units."
|
||||||
(error "ELF object has no text section")))))
|
(error "ELF object has no text section")))))
|
||||||
(make-debug-context elf base text-base)))
|
(make-debug-context elf base text-base)))
|
||||||
|
|
||||||
|
(define (fold-all-debug-contexts proc seed)
|
||||||
|
"Fold @var{proc} over debug contexts corresponding to all images that
|
||||||
|
are mapped at the time this procedure is called. Any images mapped
|
||||||
|
during the fold are omitted."
|
||||||
|
(fold (lambda (image seed)
|
||||||
|
(proc (debug-context-from-image image) seed))
|
||||||
|
seed
|
||||||
|
(all-mapped-elf-images)))
|
||||||
|
|
||||||
(define (find-debug-context addr)
|
(define (find-debug-context addr)
|
||||||
"Find and return the debugging context corresponding to the ELF image
|
"Find and return the debugging context corresponding to the ELF image
|
||||||
containing the address @var{addr}. @var{addr} is an integer. If no ELF
|
containing the address @var{addr}. @var{addr} is an integer. If no ELF
|
||||||
|
@ -543,3 +555,34 @@ section of the ELF image. Returns an ELF symbol, or @code{#f}."
|
||||||
(reverse sources))))))
|
(reverse sources))))))
|
||||||
(else '())))))
|
(else '())))))
|
||||||
(else '())))
|
(else '())))
|
||||||
|
|
||||||
|
(define* (fold-source-locations proc seed context)
|
||||||
|
"Fold @var{proc} over all source locations in @var{context}.
|
||||||
|
@var{proc} will be called with two arguments: the source object and the
|
||||||
|
seed."
|
||||||
|
(cond
|
||||||
|
((and context
|
||||||
|
(false-if-exception
|
||||||
|
(elf->dwarf-context (debug-context-elf context))))
|
||||||
|
=>
|
||||||
|
(lambda (dwarf-ctx)
|
||||||
|
(let ((base (debug-context-base context)))
|
||||||
|
(fold
|
||||||
|
(lambda (die seed)
|
||||||
|
(cond
|
||||||
|
((die-line-prog die)
|
||||||
|
=>
|
||||||
|
(lambda (prog)
|
||||||
|
(let lp ((seed seed))
|
||||||
|
(call-with-values
|
||||||
|
(lambda () (line-prog-advance prog))
|
||||||
|
(lambda (pc* file line col)
|
||||||
|
(if pc*
|
||||||
|
(lp
|
||||||
|
(proc (make-source/dwarf (+ pc* base) file line col)
|
||||||
|
seed))
|
||||||
|
seed))))))
|
||||||
|
(else seed)))
|
||||||
|
seed
|
||||||
|
(read-die-roots dwarf-ctx)))))
|
||||||
|
(else seed)))
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
bytecode->objcode objcode->bytecode
|
bytecode->objcode objcode->bytecode
|
||||||
load-thunk-from-file load-thunk-from-memory
|
load-thunk-from-file load-thunk-from-memory
|
||||||
word-size byte-order
|
word-size byte-order
|
||||||
find-mapped-elf-image))
|
find-mapped-elf-image all-mapped-elf-images))
|
||||||
|
|
||||||
(load-extension (string-append "libguile-" (effective-version))
|
(load-extension (string-append "libguile-" (effective-version))
|
||||||
"scm_init_objcodes")
|
"scm_init_objcodes")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue