]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/obj: Fix generation of assembly with -S
authorKeith Randall <khr@golang.org>
Fri, 26 Feb 2016 03:17:55 +0000 (19:17 -0800)
committerKeith Randall <khr@golang.org>
Fri, 26 Feb 2016 19:21:32 +0000 (19:21 +0000)
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>

src/cmd/compile/internal/gc/global_test.go
src/cmd/internal/obj/objfile.go

index 6c388aff7c93d4f9db37a4dcb53951838de23f5f..80781e61a861ee79d9ae8ab42b50bf8f240323b7 100644 (file)
@@ -12,6 +12,7 @@ import (
        "os"
        "os/exec"
        "path"
+       "strings"
        "testing"
 )
 
@@ -62,3 +63,53 @@ func main() {
                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)
+               }
+       }
+}
index 6757067dd6d6de954e9aa4b71174157fbb42c9e7..33330b472ef831ad9d026a42833e3ed8c71862d2 100644 (file)
@@ -116,7 +116,7 @@ func Writeobjdirect(ctxt *Link, b *Biobuf) {
 }
 
 func Flushplist(ctxt *Link) {
-       flushplist(ctxt, true)
+       flushplist(ctxt, ctxt.Debugasm == 0)
 }
 func FlushplistNoFree(ctxt *Link) {
        flushplist(ctxt, false)
@@ -308,8 +308,10 @@ func flushplist(ctxt *Link, freeProgs bool) {
                ctxt.Arch.Assemble(ctxt, s)
                fieldtrack(ctxt, s)
                linkpcln(ctxt, s)
-               s.Text = nil
-               s.Etext = nil
+               if freeProgs {
+                       s.Text = nil
+                       s.Etext = nil
+               }
        }
 
        // Add to running list in ctxt.