}
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
+}
+`
// 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)
}