]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: don't set line number to 0 when building SSA
authorCherry Zhang <cherryyz@google.com>
Thu, 30 Jun 2016 10:36:31 +0000 (06:36 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 1 Jul 2016 01:12:24 +0000 (01:12 +0000)
The frontend may emit node with line number missing. In this case,
use the parent line number. Instead of changing every call site of
pushLine, do it in pushLine itself.

Fixes #16214.

Change-Id: I80390550b56e4d690fc770b01ff725b892ffd6dc
Reviewed-on: https://go-review.googlesource.com/24641
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/asm_test.go
src/cmd/compile/internal/gc/ssa.go

index b44bf77c5daaff2f9d997fa19adbb2d18b703934..21b5910ecc8ffd95a8add2c58665cc2d3bbde827 100644 (file)
@@ -122,3 +122,38 @@ NextVar:
        }
        return out
 }
+
+// TestLineNumber checks to make sure the generated assembly has line numbers
+// see issue #16214
+func TestLineNumber(t *testing.T) {
+       testenv.MustHaveGoBuild(t)
+       dir, err := ioutil.TempDir("", "TestLineNumber")
+       if err != nil {
+               t.Fatalf("could not create directory: %v", err)
+       }
+       defer os.RemoveAll(dir)
+
+       src := filepath.Join(dir, "x.go")
+       err = ioutil.WriteFile(src, []byte(issue16214src), 0644)
+       if err != nil {
+               t.Fatalf("could not write file: %v", err)
+       }
+
+       cmd := exec.Command("go", "tool", "compile", "-S", "-o", filepath.Join(dir, "out.o"), src)
+       out, err := cmd.CombinedOutput()
+       if err != nil {
+               t.Fatalf("fail to run go tool compile: %v", err)
+       }
+
+       if strings.Contains(string(out), "unknown line number") {
+               t.Errorf("line number missing in assembly:\n%s", out)
+       }
+}
+
+var issue16214src = `
+package main
+
+func Mod32(x uint32) uint32 {
+       return x % 3 // frontend rewrites it as HMUL with 2863311531, the LITERAL node has Lineno 0
+}
+`
index 7f55da621c98137d2f02310bfd4f8fac74a6f8f4..62ea44f77690484e8966ed9f1174fa6b069ec51b 100644 (file)
@@ -384,6 +384,14 @@ func (s *state) endBlock() *ssa.Block {
 
 // pushLine pushes a line number on the line number stack.
 func (s *state) pushLine(line int32) {
+       if line == 0 {
+               // the frontend may emit node with line number missing,
+               // use the parent line number in this case.
+               line = s.peekLine()
+               if Debug['K'] != 0 {
+                       Warn("buildssa: line 0")
+               }
+       }
        s.line = append(s.line, line)
 }