From d32da0570d3f6aa1857331c821ca071b0eca96f2 Mon Sep 17 00:00:00 2001 From: Amirouche Date: Sat, 9 Feb 2019 18:08:45 +0100 Subject: [PATCH] add function coverage diff --git a/module/system/vm/coverage.scm b/module/system/vm/coverage.scm index 0d51e261a..f151912f7 100644 --- a/module/system/vm/coverage.scm +++ b/module/system/vm/coverage.scm @@ -21,6 +21,7 @@ #:use-module (system vm frame) #:use-module (system vm program) #:use-module (system vm debug) + #:use-module (system xref) #:use-module (ice-9 format) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) @@ -309,11 +310,11 @@ gathered, even if their code was not executed." ;; FIXME: Re-enable this code, but using for-each-elf-symbol on each source ;; chunk. Use that to build a map of file -> proc-addr + line + name. Then ;; use something like procedure-execution-count to get the execution count. - #; + (define (dump-function proc) ;; Dump source location and basic coverage data for PROC. (and (or (program? proc)) - (let ((sources (program-sources* data proc))) + (let ((sources (program-sources proc))) (and (pair? sources) (let* ((line (source:line-for-user (car sources))) (name (or (procedure-name proc) @@ -330,8 +331,9 @@ gathered, even if their code was not executed." (if (string? path) (begin (format port "SF:~A~%" path) - #; - (for-each dump-function procs) + (let ((procs (file-procedures file))) + (when procs + (for-each dump-function procs))) (for-each (lambda (line+count) (let ((line (car line+count)) (count (cdr line+count))) diff --git a/module/system/xref.scm b/module/system/xref.scm index e335f9481..d0ac49615 100644 --- a/module/system/xref.scm +++ b/module/system/xref.scm @@ -26,7 +26,8 @@ procedure-callees procedure-callers source-closures - source-procedures)) + source-procedures + file-procedures)) ;;; ;;; The cross-reference database: who calls whom. @@ -371,3 +372,11 @@ pair of the form (module-name . variable-name), " (false-if-exception (open-input-file file)))) (file (if port (port-filename port) file))) (lookup-source-procedures file line *sources-db*))) + +(define (lookup-procedures file-table) + (apply append (hash-fold (lambda (key value acc) (cons value acc)) '() file-table))) + +(define (file-procedures file) + "Retrieve all procedures defined in FILE. Can return multiple times the same procedure" + (ensure-sources-db #f) + (and=> (hash-ref *sources-db* file) lookup-procedures)) -- 2.19.1