]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile: log progs during ssa codegen
authorJosh Bleecher Snyder <josharian@gmail.com>
Fri, 31 Jul 2015 21:37:15 +0000 (14:37 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Tue, 4 Aug 2015 19:37:19 +0000 (19:37 +0000)
This is helpful when debugging generated code.

Change-Id: I268efa3593a03bb2c4e9f07d9034c004cd40df41
Reviewed-on: https://go-review.googlesource.com/13099
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/compile/internal/gc/ssa.go

index 9422970b98f265811e84eeb205ffe5a8c6c0304f..46bcfab7e4bb66d69dfc26bf4b0dbd7f1c187037 100644 (file)
@@ -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) {