mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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/19930 Reviewed-by: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
8d94b9b820
commit
c747fce242
2 changed files with 56 additions and 3 deletions
|
|
@ -12,6 +12,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"path"
|
"path"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -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) {
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
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.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue