Commit c747fce2 authored by Keith Randall's avatar Keith Randall

cmd/internal/obj: Fix generation of assembly with -S

We can't drop Prog entries when we want to print disassembly.

Added a test for -S.

Fixes #14515

Change-Id: I44c72f70f7a3919acc01c559d30335d26669e76f
Reviewed-on: https://go-review.googlesource.com/19930Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 8d94b9b8
...@@ -12,6 +12,7 @@ import ( ...@@ -12,6 +12,7 @@ import (
"os" "os"
"os/exec" "os/exec"
"path" "path"
"strings"
"testing" "testing"
) )
...@@ -62,3 +63,53 @@ func main() { ...@@ -62,3 +63,53 @@ func main() {
log.Fatalf("scanf code not removed from helloworld") log.Fatalf("scanf code not removed from helloworld")
} }
} }
// Make sure -S prints assembly code. See issue 14515.
func TestDashS(t *testing.T) {
testenv.MustHaveGoBuild(t)
// Make a directory to work in.
dir, err := ioutil.TempDir("", "issue14515-")
if err != nil {
log.Fatalf("could not create directory: %v", err)
}
defer os.RemoveAll(dir)
// Create source.
src := path.Join(dir, "test.go")
f, err := os.Create(src)
if err != nil {
log.Fatalf("could not create source file: %v", err)
}
f.Write([]byte(`
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
`))
f.Close()
// Compile source.
cmd := exec.Command("go", "build", "-gcflags", "-S", src)
out, err := cmd.CombinedOutput()
if err != nil {
log.Fatalf("could not build target: %v", err)
}
patterns := []string{
// It is hard to look for actual instructions in an
// arch-independent way. So we'll just look for
// pseudo-ops that are arch-independent.
"\tTEXT\t",
"\tFUNCDATA\t",
"\tPCDATA\t",
}
outstr := string(out)
for _, p := range patterns {
if !strings.Contains(outstr, p) {
println(outstr)
panic("can't find pattern " + p)
}
}
}
...@@ -116,7 +116,7 @@ func Writeobjdirect(ctxt *Link, b *Biobuf) { ...@@ -116,7 +116,7 @@ func Writeobjdirect(ctxt *Link, b *Biobuf) {
} }
func Flushplist(ctxt *Link) { func Flushplist(ctxt *Link) {
flushplist(ctxt, true) flushplist(ctxt, ctxt.Debugasm == 0)
} }
func FlushplistNoFree(ctxt *Link) { func FlushplistNoFree(ctxt *Link) {
flushplist(ctxt, false) flushplist(ctxt, false)
...@@ -308,8 +308,10 @@ func flushplist(ctxt *Link, freeProgs bool) { ...@@ -308,8 +308,10 @@ func flushplist(ctxt *Link, freeProgs bool) {
ctxt.Arch.Assemble(ctxt, s) ctxt.Arch.Assemble(ctxt, s)
fieldtrack(ctxt, s) fieldtrack(ctxt, s)
linkpcln(ctxt, s) linkpcln(ctxt, s)
s.Text = nil if freeProgs {
s.Etext = nil s.Text = nil
s.Etext = nil
}
} }
// Add to running list in ctxt. // Add to running list in ctxt.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment