You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

733 lines
20 KiB

diff --git test/fixedbugs/bug302.go test/fixedbugs/bug302.go
index e4de25d5d0..ea566e6e44 100644
--- test/fixedbugs/bug302.go
+++ test/fixedbugs/bug302.go
@@ -1,5 +1,5 @@
// +build !nacl
-// run
+// runtarget
// Copyright 2010 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -8,16 +8,27 @@
package main
import (
+ "flag"
"fmt"
"os"
"os/exec"
"path/filepath"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
func main() {
- run("go", "tool", "compile", filepath.Join("fixedbugs", "bug302.dir", "p.go"))
- run("go", "tool", "pack", "grc", "pp.a", "p.o")
- run("go", "tool", "compile", "-I", ".", filepath.Join("fixedbugs", "bug302.dir", "main.go"))
+ flag.Parse()
+ run(goCmd(), "tool", "compile", filepath.Join("fixedbugs", "bug302.dir", "p.go"))
+ run(goCmd(), "tool", "pack", "grc", "pp.a", "p.o")
+ run(goCmd(), "tool", "compile", "-I", ".", filepath.Join("fixedbugs", "bug302.dir", "main.go"))
os.Remove("p.o")
os.Remove("pp.a")
os.Remove("main.o")
diff --git test/fixedbugs/bug369.go test/fixedbugs/bug369.go
index 60162ab1cb..4470d5a076 100644
--- test/fixedbugs/bug369.go
+++ test/fixedbugs/bug369.go
@@ -1,5 +1,5 @@
// +build !nacl,!windows
-// run
+// runtarget
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -10,21 +10,40 @@
package main
import (
+ "flag"
"fmt"
"os"
"os/exec"
"path/filepath"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
+func goRun(cmd ...string) {
+ if *target == "" {
+ run(cmd[0], cmd[1:]...)
+ } else {
+ run("go_"+*target+"_exec", cmd...)
+ }
+}
+
func main() {
+ flag.Parse()
err := os.Chdir(filepath.Join(".", "fixedbugs", "bug369.dir"))
check(err)
- run("go", "tool", "compile", "-N", "-o", "slow.o", "pkg.go")
- run("go", "tool", "compile", "-o", "fast.o", "pkg.go")
- run("go", "tool", "compile", "-o", "main.o", "main.go")
- run("go", "tool", "link", "-o", "a.exe", "main.o")
- run("." + string(filepath.Separator) + "a.exe")
+ run(goCmd(), "tool", "compile", "-N", "-o", "slow.o", "pkg.go")
+ run(goCmd(), "tool", "compile", "-o", "fast.o", "pkg.go")
+ run(goCmd(), "tool", "compile", "-o", "main.o", "main.go")
+ run(goCmd(), "tool", "link", "-o", "a.exe", "main.o")
+ goRun("." + string(filepath.Separator) + "a.exe")
os.Remove("slow.o")
os.Remove("fast.o")
diff --git test/fixedbugs/bug429_run.go test/fixedbugs/bug429_run.go
index 284033d1f7..e8d18b13e8 100644
--- test/fixedbugs/bug429_run.go
+++ test/fixedbugs/bug429_run.go
@@ -1,5 +1,5 @@
// +build !nacl
-// run
+// runtarget
// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -10,6 +10,7 @@
package main
import (
+ "flag"
"fmt"
"os"
"os/exec"
@@ -17,8 +18,27 @@ import (
"strings"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
+func goRun(args ...string) *exec.Cmd {
+ cmd := []string{"run"}
+ if *target != "" {
+ cmd = append(cmd, "-exec", "go_"+*target+"_exec")
+ }
+ cmd = append(cmd, args...)
+ return exec.Command(goCmd(), cmd...)
+}
+
func main() {
- cmd := exec.Command("go", "run", filepath.Join("fixedbugs", "bug429.go"))
+ flag.Parse()
+ cmd := goRun(filepath.Join("fixedbugs", "bug429.go"))
out, err := cmd.CombinedOutput()
if err == nil {
fmt.Println("expected deadlock")
diff --git test/fixedbugs/issue10607.go test/fixedbugs/issue10607.go
index 9ee6c72bc6..e819a3085a 100644
--- test/fixedbugs/issue10607.go
+++ test/fixedbugs/issue10607.go
@@ -1,5 +1,5 @@
// +build linux,!ppc64 android
-// run
+// runtarget
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -11,19 +11,39 @@
package main
import (
+ "flag"
"fmt"
"os"
"os/exec"
"path/filepath"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
+func goRun(args ...string) *exec.Cmd {
+ cmd := []string{"run"}
+ if *target != "" {
+ cmd = append(cmd, "-exec", "go_"+*target+"_exec")
+ }
+ cmd = append(cmd, args...)
+ return exec.Command(goCmd(), cmd...)
+}
+
func main() {
- test("internal")
+ flag.Parse()
+ //test("internal")
test("external")
}
func test(linkmode string) {
- out, err := exec.Command("go", "run", "-ldflags", "-B=0x12345678 -linkmode="+linkmode, filepath.Join("fixedbugs", "issue10607a.go")).CombinedOutput()
+ out, err := goRun("-ldflags", "-B=0x12345678 -linkmode="+linkmode, filepath.Join("fixedbugs", "issue10607a.go")).CombinedOutput()
if err != nil {
fmt.Printf("BUG: linkmode=%s %v\n%s\n", linkmode, err, out)
os.Exit(1)
diff --git test/fixedbugs/issue11771.go test/fixedbugs/issue11771.go
index d91fc5d966..4f55ce6982 100644
--- test/fixedbugs/issue11771.go
+++ test/fixedbugs/issue11771.go
@@ -1,5 +1,5 @@
// +build !nacl
-// run
+// runtarget
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -11,6 +11,7 @@ package main
import (
"bytes"
+ "flag"
"fmt"
"io/ioutil"
"log"
@@ -20,7 +21,17 @@ import (
"runtime"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
func main() {
+ flag.Parse()
if runtime.Compiler != "gc" {
return
}
@@ -52,7 +63,7 @@ func x() {
log.Fatal(err)
}
- cmd := exec.Command("go", "tool", "compile", "x.go")
+ cmd := exec.Command(goCmd(), "tool", "compile", "x.go")
cmd.Dir = dir
output, err := cmd.CombinedOutput()
if err == nil {
diff --git test/fixedbugs/issue9355.go test/fixedbugs/issue9355.go
index 10f8c73069..87356c7402 100644
--- test/fixedbugs/issue9355.go
+++ test/fixedbugs/issue9355.go
@@ -1,4 +1,4 @@
-// run
+// runtarget
// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -7,6 +7,7 @@
package main
import (
+ "flag"
"fmt"
"os"
"os/exec"
@@ -15,7 +16,17 @@ import (
"runtime"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
func main() {
+ flag.Parse()
if runtime.Compiler != "gc" || runtime.GOOS == "nacl" {
return
}
@@ -23,7 +34,7 @@ func main() {
err := os.Chdir(filepath.Join("fixedbugs", "issue9355.dir"))
check(err)
- out := run("go", "tool", "compile", "-S", "a.go")
+ out := run(goCmd(), "tool", "compile", "-S", "a.go")
os.Remove("a.o")
// 6g/8g print the offset as dec, but 5g/9g print the offset as hex.
diff --git test/fixedbugs/issue9862_run.go test/fixedbugs/issue9862_run.go
index be22f40580..a72a59fda2 100644
--- test/fixedbugs/issue9862_run.go
+++ test/fixedbugs/issue9862_run.go
@@ -1,5 +1,5 @@
// +build !nacl
-// run
+// runtarget
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -10,12 +10,32 @@
package main
import (
+ "flag"
"os/exec"
"strings"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
+func goRun(args ...string) *exec.Cmd {
+ cmd := []string{"run"}
+ if *target != "" {
+ cmd = append(cmd, "-exec", "go_"+*target+"_exec")
+ }
+ cmd = append(cmd, args...)
+ return exec.Command(goCmd(), cmd...)
+}
+
func main() {
- out, err := exec.Command("go", "run", "fixedbugs/issue9862.go").CombinedOutput()
+ flag.Parse()
+ out, err := goRun("fixedbugs/issue9862.go").CombinedOutput()
outstr := string(out)
if err == nil {
println("go run issue9862.go succeeded, should have failed\n", outstr)
diff --git test/linkmain_run.go test/linkmain_run.go
index 55de481a81..03666e6b29 100644
--- test/linkmain_run.go
+++ test/linkmain_run.go
@@ -1,5 +1,5 @@
// +build !nacl
-// run
+// runtarget
// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -10,12 +10,22 @@
package main
import (
+ "flag"
"fmt"
"os"
"os/exec"
"strings"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
func cleanup() {
os.Remove("linkmain.o")
os.Remove("linkmain.a")
@@ -51,16 +61,17 @@ func runFail(cmdline string) {
}
func main() {
+ flag.Parse()
// helloworld.go is package main
- run("go tool compile -o linkmain.o helloworld.go")
- run("go tool compile -pack -o linkmain.a helloworld.go")
- run("go tool link -o linkmain.exe linkmain.o")
- run("go tool link -o linkmain.exe linkmain.a")
+ run(goCmd() + " tool compile -o linkmain.o helloworld.go")
+ run(goCmd() + " tool compile -pack -o linkmain.a helloworld.go")
+ run(goCmd() + " tool link -o linkmain.exe linkmain.o")
+ run(goCmd() + " tool link -o linkmain.exe linkmain.a")
// linkmain.go is not
- run("go tool compile -o linkmain1.o linkmain.go")
- run("go tool compile -pack -o linkmain1.a linkmain.go")
- runFail("go tool link -o linkmain.exe linkmain1.o")
- runFail("go tool link -o linkmain.exe linkmain1.a")
+ run(goCmd() + " tool compile -o linkmain1.o linkmain.go")
+ run(goCmd() + " tool compile -pack -o linkmain1.a linkmain.go")
+ runFail(goCmd() + " tool link -o linkmain.exe linkmain1.o")
+ runFail(goCmd() + " tool link -o linkmain.exe linkmain1.a")
cleanup()
}
diff --git test/linkobj.go test/linkobj.go
index 8a86aa872f..0d1964e7fb 100644
--- test/linkobj.go
+++ test/linkobj.go
@@ -1,5 +1,5 @@
// +build !nacl
-// run
+// runtarget
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -10,6 +10,7 @@
package main
import (
+ "flag"
"fmt"
"io/ioutil"
"log"
@@ -18,9 +19,27 @@ import (
"strings"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
+func goRun(cmd ...string) string {
+ if *target == "" {
+ return run(cmd...)
+ } else {
+ return run(append([]string{"go_"+*target+"_exec"}, cmd...)...)
+ }
+}
+
var pwd, tmpdir string
func main() {
+ flag.Parse()
dir, err := ioutil.TempDir("", "go-test-linkobj-")
if err != nil {
log.Fatal(err)
@@ -37,28 +56,28 @@ func main() {
writeFile("p1.go", `
package p1
-
+
func F() {
println("hello from p1")
}
`)
writeFile("p2.go", `
package p2
-
+
import "./p1"
func F() {
p1.F()
println("hello from p2")
}
-
+
func main() {}
`)
writeFile("p3.go", `
package main
import "./p2"
-
+
func main() {
p2.F()
println("hello from main")
@@ -76,9 +95,9 @@ func main() {
}
// inlining is disabled to make sure that the link objects contain needed code.
- run("go", "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p1."+o, "-linkobj", "p1.lo", "p1.go")
- run("go", "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p2."+o, "-linkobj", "p2.lo", "p2.go")
- run("go", "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p3."+o, "-linkobj", "p3.lo", "p3.go")
+ run(goCmd(), "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p1."+o, "-linkobj", "p1.lo", "p1.go")
+ run(goCmd(), "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p2."+o, "-linkobj", "p2.lo", "p2.go")
+ run(goCmd(), "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p3."+o, "-linkobj", "p3.lo", "p3.go")
cp("p1."+o, "p1.oo")
cp("p2."+o, "p2.oo")
@@ -86,13 +105,13 @@ func main() {
cp("p1.lo", "p1."+o)
cp("p2.lo", "p2."+o)
cp("p3.lo", "p3."+o)
- out := runFail("go", "tool", "link", "p2."+o)
+ out := runFail(goCmd(), "tool", "link", "p2."+o)
if !strings.Contains(out, "not package main") {
fatalf("link p2.o failed but not for package main:\n%s", out)
}
- run("go", "tool", "link", "-L", ".", "-o", "a.out.exe", "p3."+o)
- out = run("./a.out.exe")
+ run(goCmd(), "tool", "link", "-L", ".", "-o", "a.out.exe", "p3."+o)
+ out = goRun("./a.out.exe")
if !strings.Contains(out, "hello from p1\nhello from p2\nhello from main\n") {
fatalf("running main, incorrect output:\n%s", out)
}
diff --git test/linkx_run.go test/linkx_run.go
index cc249c9cfc..530159ab9d 100644
--- test/linkx_run.go
+++ test/linkx_run.go
@@ -1,5 +1,5 @@
// +build !nacl
-// run
+// runtarget
// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -11,20 +11,40 @@ package main
import (
"bytes"
+ "flag"
"fmt"
"os"
"os/exec"
"strings"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
+func goRun(args ...string) *exec.Cmd {
+ cmd := []string{"run"}
+ if *target != "" {
+ cmd = append(cmd, "-exec", "go_"+*target+"_exec")
+ }
+ cmd = append(cmd, args...)
+ return exec.Command(goCmd(), cmd...)
+}
+
func main() {
+ flag.Parse()
// test(" ") // old deprecated & removed syntax
test("=") // new syntax
}
func test(sep string) {
// Successful run
- cmd := exec.Command("go", "run", "-ldflags=-X main.tbd"+sep+"hello -X main.overwrite"+sep+"trumped -X main.nosuchsymbol"+sep+"neverseen", "linkx.go")
+ cmd := goRun("-ldflags=-X main.tbd"+sep+"hello -X main.overwrite"+sep+"trumped -X main.nosuchsymbol"+sep+"neverseen", "linkx.go")
var out, errbuf bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &errbuf
@@ -44,7 +64,7 @@ func test(sep string) {
}
// Issue 8810
- cmd = exec.Command("go", "run", "-ldflags=-X main.tbd", "linkx.go")
+ cmd = goRun("-ldflags=-X main.tbd", "linkx.go")
_, err = cmd.CombinedOutput()
if err == nil {
fmt.Println("-X linker flag should not accept keys without values")
@@ -52,7 +72,7 @@ func test(sep string) {
}
// Issue 9621
- cmd = exec.Command("go", "run", "-ldflags=-X main.b=false -X main.x=42", "linkx.go")
+ cmd = goRun("-ldflags=-X main.b=false -X main.x=42", "linkx.go")
outx, err := cmd.CombinedOutput()
if err == nil {
fmt.Println("-X linker flag should not overwrite non-strings")
diff --git test/nosplit.go test/nosplit.go
index e6cecebde3..fed1c0e510 100644
--- test/nosplit.go
+++ test/nosplit.go
@@ -1,5 +1,5 @@
// +build !nacl
-// run
+// runtarget
// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -9,6 +9,7 @@ package main
import (
"bytes"
+ "flag"
"fmt"
"io/ioutil"
"log"
@@ -21,6 +22,24 @@ import (
"strings"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
+func goArch() string {
+ goarch, err := exec.Command(goCmd(), "env", "GOARCH").Output()
+ if err != nil {
+ bug()
+ fmt.Printf("running go env GOARCH: %v\n", err)
+ }
+ return strings.TrimSpace(string(goarch))
+}
+
var tests = `
# These are test cases for the linker analysis that detects chains of
# nosplit functions that would cause a stack overflow.
@@ -194,12 +213,13 @@ var (
)
func main() {
- goarch := os.Getenv("GOARCH")
+ flag.Parse()
+ goarch := goArch()
if goarch == "" {
- goarch = runtime.GOARCH
+ return
}
- version, err := exec.Command("go", "tool", "compile", "-V").Output()
+ version, err := exec.Command(goCmd(), "tool", "compile", "-V").Output()
if err != nil {
bug()
fmt.Printf("running go tool compile -V: %v\n", err)
@@ -345,7 +365,7 @@ TestCases:
log.Fatal(err)
}
- cmd := exec.Command("go", "build")
+ cmd := exec.Command(goCmd(), "build")
cmd.Dir = dir
output, err := cmd.CombinedOutput()
if err == nil {
diff --git test/run.go test/run.go
index ac5d3c3e8d..62041226b0 100644
--- test/run.go
+++ test/run.go
@@ -229,6 +229,16 @@ func goRun(runcmd runCmd, flags []string, goname string, args ...string) (out []
return runcmd(cmd...)
}
+func goRunTarget(runcmd runCmd, goname string, args ...string) (out []byte, err error) {
+ cmd := []string{"go_local", "run"}
+ cmd = append(cmd, goname)
+ if *target != "" {
+ cmd = append(cmd, "-target", *target)
+ }
+ cmd = append(cmd, args...)
+ return runcmd(cmd...)
+}
+
// skipError describes why a test was skipped.
type skipError string
@@ -491,7 +501,7 @@ func (t *test) run() {
action = "rundir"
case "cmpout":
action = "run" // the run case already looks for <dir>/<test>.out files
- case "compile", "compiledir", "build", "builddir", "run", "buildrun", "runoutput", "rundir":
+ case "compile", "compiledir", "build", "builddir", "run", "runtarget", "buildrun", "runoutput", "rundir":
// nothing to do
case "errorcheckandrundir":
wantError = false // should be no error if also will run
@@ -816,6 +826,17 @@ func (t *test) run() {
t.err = fmt.Errorf("incorrect output\n%s", out)
}
+ case "runtarget":
+ useTmp = false
+ out, err := goRunTarget(runcmd, t.goFileName(), args...)
+ if err != nil {
+ t.err = err
+ return
+ }
+ if strings.Replace(string(out), "\r\n", "\n", -1) != t.expectedOutput() {
+ t.err = fmt.Errorf("incorrect output\n%s", out)
+ }
+
case "runoutput":
rungatec <- true
defer func() {
diff --git test/sinit_run.go test/sinit_run.go
index c9afd3b777..dc885ecffd 100644
--- test/sinit_run.go
+++ test/sinit_run.go
@@ -1,5 +1,5 @@
// +build !nacl
-// run
+// runtarget
// Copyright 2014 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
@@ -11,13 +11,24 @@ package main
import (
"bytes"
+ "flag"
"fmt"
"os"
"os/exec"
)
+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
+
+func goCmd() string {
+ if *target != "" {
+ return "go_" + *target
+ }
+ return "go"
+}
+
func main() {
- cmd := exec.Command("go", "tool", "compile", "-S", "sinit.go")
+ flag.Parse()
+ cmd := exec.Command(goCmd(), "tool", "compile", "-S", "sinit.go")
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Println(string(out))