mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-11 22:31:12 +02:00
Add dump-dfg pretty-printer
* module/language/cps/dfg.scm (dump-dfg): New pretty-printer. Under construction.
This commit is contained in:
parent
c8d87b4745
commit
fb512cac6e
1 changed files with 53 additions and 0 deletions
|
@ -36,6 +36,7 @@
|
|||
|
||||
(define-module (language cps dfg)
|
||||
#:use-module (ice-9 match)
|
||||
#:use-module (ice-9 format)
|
||||
#:use-module (srfi srfi-1)
|
||||
#:use-module (srfi srfi-9)
|
||||
#:use-module (srfi srfi-26)
|
||||
|
@ -897,6 +898,58 @@ body continuation in the prompt."
|
|||
min-label max-label label-count
|
||||
min-var max-var var-count)))))
|
||||
|
||||
(define* (dump-dfg dfg #:optional (port (current-output-port)))
|
||||
(let ((min-label (dfg-min-label dfg))
|
||||
(min-var (dfg-min-var dfg)))
|
||||
(define (label->idx label) (- label min-label))
|
||||
(define (idx->label idx) (+ idx min-label))
|
||||
(define (var->idx var) (- var min-var))
|
||||
(define (idx->var idx) (+ idx min-var))
|
||||
|
||||
(let lp ((label (dfg-min-label dfg)))
|
||||
(when (< label (dfg-max-label dfg))
|
||||
(let ((cont (vector-ref (dfg-cont-table dfg) (label->idx label))))
|
||||
(when cont
|
||||
(unless (equal? (lookup-predecessors label dfg) (list (1- label)))
|
||||
(newline port))
|
||||
(format port "k~a:~8t" label)
|
||||
(match cont
|
||||
(($ $kif kt kf)
|
||||
(format port "$kif k~a k~a\n" kt kf))
|
||||
(($ $kreceive arity k)
|
||||
(format port "$kreceive ~a k~a\n" arity k))
|
||||
(($ $kfun src meta self tail clause)
|
||||
(format port "$kfun ~a ~a v~a\n" src meta self))
|
||||
(($ $ktail)
|
||||
(format port "$ktail\n"))
|
||||
(($ $kclause arity ($ $cont kbody) alternate)
|
||||
(format port "$kclause ~a k~a" arity kbody)
|
||||
(match alternate
|
||||
(#f #f)
|
||||
(($ $cont kalt) (format port " -> k~a" kalt)))
|
||||
(newline port))
|
||||
(($ $kargs names vars term)
|
||||
(unless (null? vars)
|
||||
(format port "v~a[~a]~:{ v~a[~a]~}: "
|
||||
(car vars) (car names) (map list (cdr vars) (cdr names))))
|
||||
(match (find-call term)
|
||||
(($ $continue k src exp)
|
||||
(match exp
|
||||
(($ $void) (format port "void"))
|
||||
(($ $const val) (format port "const ~@y" val))
|
||||
(($ $prim name) (format port "prim ~a" name))
|
||||
(($ $fun free ($ $cont kbody)) (format port "fun k~a" kbody))
|
||||
(($ $closure label nfree) (format port "closure k~a (~a free)" label nfree))
|
||||
(($ $call proc args) (format port "call~{ v~a~}" (cons proc args)))
|
||||
(($ $callk k proc args) (format port "callk k~a~{ v~a~}" k (cons proc args)))
|
||||
(($ $primcall name args) (format port "~a~{ v~a~}" name args))
|
||||
(($ $values args) (format port "values~{ v~a~}" args))
|
||||
(($ $prompt escape? tag handler) (format port "prompt ~a v~a k~a" escape? tag handler)))
|
||||
(unless (= k (1+ label))
|
||||
(format port " -> k~a" k))
|
||||
(newline port))))))
|
||||
(lp (1+ label)))))))
|
||||
|
||||
(define-syntax-rule (with-fresh-name-state-from-dfg dfg body ...)
|
||||
(parameterize ((label-counter (1+ (dfg-max-label dfg)))
|
||||
(var-counter (1+ (dfg-max-var dfg))))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue