From b8efee0d8ae06b3d2f0057d26d9927b86792a9a6 Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Fri, 31 Jul 2015 14:37:15 -0700 Subject: [PATCH] [dev.ssa] cmd/compile: log progs during ssa codegen This is helpful when debugging generated code. Change-Id: I268efa3593a03bb2c4e9f07d9034c004cd40df41 Reviewed-on: https://go-review.googlesource.com/13099 Reviewed-by: Keith Randall --- src/cmd/compile/internal/gc/ssa.go | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 9422970b98..46bcfab7e4 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -1704,19 +1704,41 @@ func genssa(f *ssa.Func, ptxt *obj.Prog, gcargs, gclocals *Sym) { // and where they would like to go var branches []branch + var valueProgs map[*obj.Prog]*ssa.Value + var blockProgs map[*obj.Prog]*ssa.Block + const logProgs = true + if logProgs { + valueProgs = make(map[*obj.Prog]*ssa.Value, f.NumValues()) + blockProgs = make(map[*obj.Prog]*ssa.Block, f.NumBlocks()) + f.Logf("genssa %s\n", f.Name) + blockProgs[Pc] = f.Blocks[0] + } + // Emit basic blocks for i, b := range f.Blocks { bstart[b.ID] = Pc // Emit values in block for _, v := range b.Values { + x := Pc genValue(v) + if logProgs { + for ; x != Pc; x = x.Link { + valueProgs[x] = v + } + } } // Emit control flow instructions for block var next *ssa.Block if i < len(f.Blocks)-1 { next = f.Blocks[i+1] } + x := Pc branches = genBlock(b, next, branches) + if logProgs { + for ; x != Pc; x = x.Link { + blockProgs[x] = b + } + } } // Resolve branches @@ -1726,6 +1748,20 @@ func genssa(f *ssa.Func, ptxt *obj.Prog, gcargs, gclocals *Sym) { Pc.As = obj.ARET // overwrite AEND + if logProgs { + for p := ptxt; p != nil; p = p.Link { + var s string + if v, ok := valueProgs[p]; ok { + s = v.String() + } else if b, ok := blockProgs[p]; ok { + s = b.String() + } else { + s = " " // most value and branch strings are 2-3 characters long + } + f.Logf("%s\t%s\n", s, p) + } + } + // Emit static data if f.StaticData != nil { for _, n := range f.StaticData.([]*Node) {