Home | History | Annotate | Download | only in patch
      1 test: add runtarget action.
      2 
      3 --- test/fixedbugs/bug248.go
      4 +++ test/fixedbugs/bug248.go
      5 @@ -1,5 +1,5 @@
      6  // +build !nacl,!plan9,!windows
      7 -// run
      8 +// runtarget
      9  
     10  // Copyright 2009 The Go Authors. All rights reserved.
     11  // Use of this source code is governed by a BSD-style
     12 @@ -8,13 +8,32 @@
     13  package main
     14  
     15  import (
     16 +	"flag"
     17  	"fmt"
     18  	"os"
     19  	"os/exec"
     20  	"path/filepath"
     21  )
     22  
     23 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
     24 +
     25 +func goCmd() string {
     26 +	if *target != "" {
     27 +		return "go_" + *target
     28 +	}
     29 +	return "go"
     30 +}
     31 +
     32 +func goRun(cmd ...string) {
     33 +	if *target == "" {
     34 +		run(cmd[0], cmd[1:]...)
     35 +	} else {
     36 +		run("go_"+*target+"_exec", cmd...)
     37 +	}
     38 +}
     39 +
     40  func main() {
     41 +	flag.Parse()
     42  	// TODO: If we get rid of errchk, re-enable this test on Windows.
     43  	errchk, err := filepath.Abs("errchk")
     44  	check(err)
     45 @@ -22,12 +41,12 @@ func main() {
     46  	err = os.Chdir(filepath.Join("fixedbugs", "bug248.dir"))
     47  	check(err)
     48  
     49 -	run("go", "tool", "compile", "bug0.go")
     50 -	run("go", "tool", "compile", "bug1.go")
     51 -	run("go", "tool", "compile", "bug2.go")
     52 -	run(errchk, "go", "tool", "compile", "-e", "bug3.go")
     53 -	run("go", "tool", "link", "bug2.o")
     54 -	run(fmt.Sprintf(".%ca.out", filepath.Separator))
     55 +	run(goCmd(), "tool", "compile", "bug0.go")
     56 +	run(goCmd(), "tool", "compile", "bug1.go")
     57 +	run(goCmd(), "tool", "compile", "bug2.go")
     58 +	run(errchk, goCmd(), "tool", "compile", "-e", "bug3.go")
     59 +	run(goCmd(), "tool", "link", "bug2.o")
     60 +	goRun(fmt.Sprintf(".%ca.out", filepath.Separator))
     61  
     62  	os.Remove("bug0.o")
     63  	os.Remove("bug1.o")
     64 --- test/fixedbugs/bug302.go
     65 +++ test/fixedbugs/bug302.go
     66 @@ -1,5 +1,5 @@
     67  // +build !nacl
     68 -// run
     69 +// runtarget
     70  
     71  // Copyright 2010 The Go Authors.  All rights reserved.
     72  // Use of this source code is governed by a BSD-style
     73 @@ -8,16 +8,27 @@
     74  package main
     75  
     76  import (
     77 +	"flag"
     78  	"fmt"
     79  	"os"
     80  	"os/exec"
     81  	"path/filepath"
     82  )
     83  
     84 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
     85 +
     86 +func goCmd() string {
     87 +	if *target != "" {
     88 +		return "go_" + *target
     89 +	}
     90 +	return "go"
     91 +}
     92 +
     93  func main() {
     94 -	run("go", "tool", "compile", filepath.Join("fixedbugs", "bug302.dir", "p.go"))
     95 -	run("go", "tool", "pack", "grc", "pp.a", "p.o")
     96 -	run("go", "tool", "compile", "-I", ".", filepath.Join("fixedbugs", "bug302.dir", "main.go"))
     97 +	flag.Parse()
     98 +	run(goCmd(), "tool", "compile", filepath.Join("fixedbugs", "bug302.dir", "p.go"))
     99 +	run(goCmd(), "tool", "pack", "grc", "pp.a", "p.o")
    100 +	run(goCmd(), "tool", "compile", "-I", ".", filepath.Join("fixedbugs", "bug302.dir", "main.go"))
    101  	os.Remove("p.o")
    102  	os.Remove("pp.a")
    103  	os.Remove("main.o")
    104 --- test/fixedbugs/bug345.go
    105 +++ test/fixedbugs/bug345.go
    106 @@ -1,5 +1,5 @@
    107  // +build !nacl,!plan9,!windows
    108 -// run
    109 +// runtarget
    110  
    111  // Copyright 2011 The Go Authors.  All rights reserved.
    112  // Use of this source code is governed by a BSD-style
    113 @@ -8,13 +8,24 @@
    114  package main
    115  
    116  import (
    117 +	"flag"
    118  	"fmt"
    119  	"os"
    120  	"os/exec"
    121  	"path/filepath"
    122  )
    123  
    124 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    125 +
    126 +func goCmd() string {
    127 +	if *target != "" {
    128 +		return "go_" + *target
    129 +	}
    130 +	return "go"
    131 +}
    132 +
    133  func main() {
    134 +	flag.Parse()
    135  	// TODO: If we get rid of errchk, re-enable this test on Plan 9 and Windows.
    136  	errchk, err := filepath.Abs("errchk")
    137  	check(err)
    138 @@ -22,8 +33,8 @@ func main() {
    139  	err = os.Chdir(filepath.Join(".", "fixedbugs", "bug345.dir"))
    140  	check(err)
    141  
    142 -	run("go", "tool", "compile", "io.go")
    143 -	run(errchk, "go", "tool", "compile", "-e", "main.go")
    144 +	run(goCmd(), "tool", "compile", "io.go")
    145 +	run(errchk, goCmd(), "tool", "compile", "-e", "main.go")
    146  	os.Remove("io.o")
    147  }
    148  
    149 --- test/fixedbugs/bug369.go
    150 +++ test/fixedbugs/bug369.go
    151 @@ -1,5 +1,5 @@
    152  // +build !nacl,!windows
    153 -// run
    154 +// runtarget
    155  
    156  // Copyright 2011 The Go Authors.  All rights reserved.
    157  // Use of this source code is governed by a BSD-style
    158 @@ -10,21 +10,40 @@
    159  package main
    160  
    161  import (
    162 +	"flag"
    163  	"fmt"
    164  	"os"
    165  	"os/exec"
    166  	"path/filepath"
    167  )
    168  
    169 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    170 +
    171 +func goCmd() string {
    172 +	if *target != "" {
    173 +		return "go_" + *target
    174 +	}
    175 +	return "go"
    176 +}
    177 +
    178 +func goRun(cmd ...string) {
    179 +	if *target == "" {
    180 +		run(cmd[0], cmd[1:]...)
    181 +	} else {
    182 +		run("go_"+*target+"_exec", cmd...)
    183 +	}
    184 +}
    185 +
    186  func main() {
    187 +	flag.Parse()
    188  	err := os.Chdir(filepath.Join(".", "fixedbugs", "bug369.dir"))
    189  	check(err)
    190  
    191 -	run("go", "tool", "compile", "-N", "-o", "slow.o", "pkg.go")
    192 -	run("go", "tool", "compile", "-o", "fast.o", "pkg.go")
    193 -	run("go", "tool", "compile", "-o", "main.o", "main.go")
    194 -	run("go", "tool", "link", "-o", "a.exe", "main.o")
    195 -	run("." + string(filepath.Separator) + "a.exe")
    196 +	run(goCmd(), "tool", "compile", "-N", "-o", "slow.o", "pkg.go")
    197 +	run(goCmd(), "tool", "compile", "-o", "fast.o", "pkg.go")
    198 +	run(goCmd(), "tool", "compile", "-o", "main.o", "main.go")
    199 +	run(goCmd(), "tool", "link", "-o", "a.exe", "main.o")
    200 +	goRun("." + string(filepath.Separator) + "a.exe")
    201  
    202  	os.Remove("slow.o")
    203  	os.Remove("fast.o")
    204 --- test/fixedbugs/bug429_run.go
    205 +++ test/fixedbugs/bug429_run.go
    206 @@ -1,5 +1,5 @@
    207  // +build !nacl
    208 -// run
    209 +// runtarget
    210  
    211  // Copyright 2014 The Go Authors. All rights reserved.
    212  // Use of this source code is governed by a BSD-style
    213 @@ -10,6 +10,7 @@
    214  package main
    215  
    216  import (
    217 +	"flag"
    218  	"fmt"
    219  	"os"
    220  	"os/exec"
    221 @@ -17,8 +18,27 @@ import (
    222  	"strings"
    223  )
    224  
    225 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    226 +
    227 +func goCmd() string {
    228 +	if *target != "" {
    229 +		return "go_" + *target
    230 +	}
    231 +	return "go"
    232 +}
    233 +
    234 +func goRun(args ...string) *exec.Cmd {
    235 +	cmd := []string{"run"}
    236 +	if *target != "" {
    237 +		cmd = append(cmd, "-exec", "go_"+*target+"_exec")
    238 +	}
    239 +	cmd = append(cmd, args...)
    240 +	return exec.Command(goCmd(), cmd...)
    241 +}
    242 +
    243  func main() {
    244 -	cmd := exec.Command("go", "run", filepath.Join("fixedbugs", "bug429.go"))
    245 +	flag.Parse()
    246 +	cmd := goRun(filepath.Join("fixedbugs", "bug429.go"))
    247  	out, err := cmd.CombinedOutput()
    248  	if err == nil {
    249  		fmt.Println("expected deadlock")
    250 --- test/fixedbugs/issue10607.go
    251 +++ test/fixedbugs/issue10607.go
    252 @@ -1,5 +1,5 @@
    253  // +build linux,!ppc64,!ppc64le,!mips64,!mips64le android
    254 -// run
    255 +// runtarget
    256  
    257  // Copyright 2015 The Go Authors. All rights reserved.
    258  // Use of this source code is governed by a BSD-style
    259 @@ -11,19 +11,39 @@
    260  package main
    261  
    262  import (
    263 +	"flag"
    264  	"fmt"
    265  	"os"
    266  	"os/exec"
    267  	"path/filepath"
    268  )
    269  
    270 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    271 +
    272 +func goCmd() string {
    273 +	if *target != "" {
    274 +		return "go_" + *target
    275 +	}
    276 +	return "go"
    277 +}
    278 +
    279 +func goRun(args ...string) *exec.Cmd {
    280 +	cmd := []string{"run"}
    281 +	if *target != "" {
    282 +		cmd = append(cmd, "-exec", "go_"+*target+"_exec")
    283 +	}
    284 +	cmd = append(cmd, args...)
    285 +	return exec.Command(goCmd(), cmd...)
    286 +}
    287 +
    288  func main() {
    289 +	flag.Parse()
    290  	test("internal")
    291  	test("external")
    292  }
    293  
    294  func test(linkmode string) {
    295 -	out, err := exec.Command("go", "run", "-ldflags", "-B=0x12345678 -linkmode="+linkmode, filepath.Join("fixedbugs", "issue10607a.go")).CombinedOutput()
    296 +	out, err := goRun("-ldflags", "-B=0x12345678 -linkmode="+linkmode, filepath.Join("fixedbugs", "issue10607a.go")).CombinedOutput()
    297  	if err != nil {
    298  		fmt.Printf("BUG: linkmode=%s %v\n%s\n", linkmode, err, out)
    299  		os.Exit(1)
    300 --- test/fixedbugs/issue11771.go
    301 +++ test/fixedbugs/issue11771.go
    302 @@ -1,5 +1,5 @@
    303  // +build !nacl
    304 -// run
    305 +// runtarget
    306  
    307  // Copyright 2015 The Go Authors.  All rights reserved.
    308  // Use of this source code is governed by a BSD-style
    309 @@ -11,6 +11,7 @@ package main
    310  
    311  import (
    312  	"bytes"
    313 +	"flag"
    314  	"fmt"
    315  	"io/ioutil"
    316  	"log"
    317 @@ -20,7 +21,17 @@ import (
    318  	"runtime"
    319  )
    320  
    321 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    322 +
    323 +func goCmd() string {
    324 +	if *target != "" {
    325 +		return "go_" + *target
    326 +	}
    327 +	return "go"
    328 +}
    329 +
    330  func main() {
    331 +	flag.Parse()
    332  	if runtime.Compiler != "gc" {
    333  		return
    334  	}
    335 @@ -52,7 +63,7 @@ func x() {
    336  		log.Fatal(err)
    337  	}
    338  
    339 -	cmd := exec.Command("go", "tool", "compile", "x.go")
    340 +	cmd := exec.Command(goCmd(), "tool", "compile", "x.go")
    341  	cmd.Dir = dir
    342  	output, err := cmd.CombinedOutput()
    343  	if err == nil {
    344 --- test/fixedbugs/issue9355.go
    345 +++ test/fixedbugs/issue9355.go
    346 @@ -1,4 +1,4 @@
    347 -// run
    348 +// runtarget
    349  
    350  // Copyright 2014 The Go Authors.  All rights reserved.
    351  // Use of this source code is governed by a BSD-style
    352 @@ -7,6 +7,7 @@
    353  package main
    354  
    355  import (
    356 +	"flag"
    357  	"fmt"
    358  	"os"
    359  	"os/exec"
    360 @@ -15,7 +16,17 @@ import (
    361  	"runtime"
    362  )
    363  
    364 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    365 +
    366 +func goCmd() string {
    367 +	if *target != "" {
    368 +		return "go_" + *target
    369 +	}
    370 +	return "go"
    371 +}
    372 +
    373  func main() {
    374 +	flag.Parse()
    375  	if runtime.Compiler != "gc" || runtime.GOOS == "nacl" {
    376  		return
    377  	}
    378 @@ -23,7 +34,7 @@ func main() {
    379  	err := os.Chdir(filepath.Join("fixedbugs", "issue9355.dir"))
    380  	check(err)
    381  
    382 -	out := run("go", "tool", "compile", "-S", "a.go")
    383 +	out := run(goCmd(), "tool", "compile", "-S", "a.go")
    384  	os.Remove("a.o")
    385  
    386  	// 6g/8g print the offset as dec, but 5g/9g print the offset as hex.
    387 --- test/fixedbugs/issue9862_run.go
    388 +++ test/fixedbugs/issue9862_run.go
    389 @@ -1,5 +1,5 @@
    390  // +build !nacl
    391 -// run
    392 +// runtarget
    393  
    394  // Copyright 2015 The Go Authors. All rights reserved.
    395  // Use of this source code is governed by a BSD-style
    396 @@ -10,12 +10,32 @@
    397  package main
    398  
    399  import (
    400 +	"flag"
    401  	"os/exec"
    402  	"strings"
    403  )
    404  
    405 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    406 +
    407 +func goCmd() string {
    408 +	if *target != "" {
    409 +		return "go_" + *target
    410 +	}
    411 +	return "go"
    412 +}
    413 +
    414 +func goRun(args ...string) *exec.Cmd {
    415 +	cmd := []string{"run"}
    416 +	if *target != "" {
    417 +		cmd = append(cmd, "-exec", "go_"+*target+"_exec")
    418 +	}
    419 +	cmd = append(cmd, args...)
    420 +	return exec.Command(goCmd(), cmd...)
    421 +}
    422 +
    423  func main() {
    424 -	out, err := exec.Command("go", "run", "fixedbugs/issue9862.go").CombinedOutput()
    425 +	flag.Parse()
    426 +	out, err := goRun("fixedbugs/issue9862.go").CombinedOutput()
    427  	outstr := string(out)
    428  	if err == nil {
    429  		println("go run issue9862.go succeeded, should have failed\n", outstr)
    430 --- test/linkmain_run.go
    431 +++ test/linkmain_run.go
    432 @@ -1,5 +1,5 @@
    433  // +build !nacl
    434 -// run
    435 +// runtarget
    436  
    437  // Copyright 2014 The Go Authors. All rights reserved.
    438  // Use of this source code is governed by a BSD-style
    439 @@ -10,12 +10,22 @@
    440  package main
    441  
    442  import (
    443 +	"flag"
    444  	"fmt"
    445  	"os"
    446  	"os/exec"
    447  	"strings"
    448  )
    449  
    450 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    451 +
    452 +func goCmd() string {
    453 +	if *target != "" {
    454 +		return "go_" + *target
    455 +	}
    456 +	return "go"
    457 +}
    458 +
    459  func cleanup() {
    460  	os.Remove("linkmain.o")
    461  	os.Remove("linkmain.a")
    462 @@ -51,16 +61,18 @@ func runFail(cmdline string) {
    463  }
    464  
    465  func main() {
    466 +	flag.Parse()
    467 +
    468  	// helloworld.go is package main
    469 -	run("go tool compile -o linkmain.o helloworld.go")
    470 -	run("go tool compile -pack -o linkmain.a helloworld.go")
    471 -	run("go tool link -o linkmain.exe linkmain.o")
    472 -	run("go tool link -o linkmain.exe linkmain.a")
    473 +	run(goCmd() + " tool compile -o linkmain.o helloworld.go")
    474 +	run(goCmd() + " tool compile -pack -o linkmain.a helloworld.go")
    475 +	run(goCmd() + " tool link -o linkmain.exe linkmain.o")
    476 +	run(goCmd() + " tool link -o linkmain.exe linkmain.a")
    477  
    478  	// linkmain.go is not
    479 -	run("go tool compile -o linkmain1.o linkmain.go")
    480 -	run("go tool compile -pack -o linkmain1.a linkmain.go")
    481 -	runFail("go tool link -o linkmain.exe linkmain1.o")
    482 -	runFail("go tool link -o linkmain.exe linkmain1.a")
    483 +	run(goCmd() + " tool compile -o linkmain1.o linkmain.go")
    484 +	run(goCmd() + " tool compile -pack -o linkmain1.a linkmain.go")
    485 +	runFail(goCmd() + " tool link -o linkmain.exe linkmain1.o")
    486 +	runFail(goCmd() + " tool link -o linkmain.exe linkmain1.a")
    487  	cleanup()
    488  }
    489 --- test/linkx_run.go
    490 +++ test/linkx_run.go
    491 @@ -1,5 +1,5 @@
    492  // +build !nacl
    493 -// run
    494 +// runtarget
    495  
    496  // Copyright 2014 The Go Authors. All rights reserved.
    497  // Use of this source code is governed by a BSD-style
    498 @@ -11,20 +11,40 @@ package main
    499  
    500  import (
    501  	"bytes"
    502 +	"flag"
    503  	"fmt"
    504  	"os"
    505  	"os/exec"
    506  	"strings"
    507  )
    508  
    509 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    510 +
    511 +func goCmd() string {
    512 +	if *target != "" {
    513 +		return "go_" + *target
    514 +	}
    515 +	return "go"
    516 +}
    517 +
    518 +func goRun(args ...string) *exec.Cmd {
    519 +	cmd := []string{"run"}
    520 +	if *target != "" {
    521 +		cmd = append(cmd, "-exec", "go_"+*target+"_exec")
    522 +	}
    523 +	cmd = append(cmd, args...)
    524 +	return exec.Command(goCmd(), cmd...)
    525 +}
    526 +
    527  func main() {
    528 +	flag.Parse()
    529  	test(" ") // old deprecated syntax
    530  	test("=") // new syntax
    531  }
    532  
    533  func test(sep string) {
    534  	// Successful run
    535 -	cmd := exec.Command("go", "run", "-ldflags=-X main.tbd"+sep+"hello -X main.overwrite"+sep+"trumped -X main.nosuchsymbol"+sep+"neverseen", "linkx.go")
    536 +	cmd := goRun("-ldflags=-X main.tbd"+sep+"hello -X main.overwrite"+sep+"trumped -X main.nosuchsymbol"+sep+"neverseen", "linkx.go")
    537  	var out, errbuf bytes.Buffer
    538  	cmd.Stdout = &out
    539  	cmd.Stderr = &errbuf
    540 @@ -44,7 +64,7 @@ func test(sep string) {
    541  	}
    542  
    543  	// Issue 8810
    544 -	cmd = exec.Command("go", "run", "-ldflags=-X main.tbd", "linkx.go")
    545 +	cmd = goRun("-ldflags=-X main.tbd", "linkx.go")
    546  	_, err = cmd.CombinedOutput()
    547  	if err == nil {
    548  		fmt.Println("-X linker flag should not accept keys without values")
    549 @@ -52,7 +72,7 @@ func test(sep string) {
    550  	}
    551  
    552  	// Issue 9621
    553 -	cmd = exec.Command("go", "run", "-ldflags=-X main.b=false -X main.x=42", "linkx.go")
    554 +	cmd = goRun("-ldflags=-X main.b=false -X main.x=42", "linkx.go")
    555  	outx, err := cmd.CombinedOutput()
    556  	if err == nil {
    557  		fmt.Println("-X linker flag should not overwrite non-strings")
    558 --- test/nosplit.go
    559 +++ test/nosplit.go
    560 @@ -1,5 +1,5 @@
    561  // +build !nacl
    562 -// run
    563 +// runtarget
    564  
    565  // Copyright 2014 The Go Authors.  All rights reserved.
    566  // Use of this source code is governed by a BSD-style
    567 @@ -9,6 +9,7 @@ package main
    568  
    569  import (
    570  	"bytes"
    571 +	"flag"
    572  	"fmt"
    573  	"io/ioutil"
    574  	"log"
    575 @@ -16,11 +17,28 @@ import (
    576  	"os/exec"
    577  	"path/filepath"
    578  	"regexp"
    579 -	"runtime"
    580  	"strconv"
    581  	"strings"
    582  )
    583  
    584 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    585 +
    586 +func goCmd() string {
    587 +	if *target != "" {
    588 +		return "go_" + *target
    589 +	}
    590 +	return "go"
    591 +}
    592 +
    593 +func goArch() string {
    594 +	goarch, err := exec.Command(goCmd(), "env", "GOARCH").Output()
    595 +	if err != nil {
    596 +		bug()
    597 +		fmt.Printf("running go env GOARCH: %v\n", err)
    598 +	}
    599 +	return strings.TrimSpace(string(goarch))
    600 +}
    601 +
    602  var tests = `
    603  # These are test cases for the linker analysis that detects chains of
    604  # nosplit functions that would cause a stack overflow.
    605 @@ -193,12 +211,13 @@ var (
    606  )
    607  
    608  func main() {
    609 -	goarch := os.Getenv("GOARCH")
    610 +	flag.Parse()
    611 +	goarch := goArch()
    612  	if goarch == "" {
    613 -		goarch = runtime.GOARCH
    614 +		return
    615  	}
    616  
    617 -	version, err := exec.Command("go", "tool", "compile", "-V").Output()
    618 +	version, err := exec.Command(goCmd(), "tool", "compile", "-V").Output()
    619  	if err != nil {
    620  		bug()
    621  		fmt.Printf("running go tool compile -V: %v\n", err)
    622 @@ -338,7 +357,7 @@ TestCases:
    623  			log.Fatal(err)
    624  		}
    625  
    626 -		cmd := exec.Command("go", "build")
    627 +		cmd := exec.Command(goCmd(), "build")
    628  		cmd.Dir = dir
    629  		output, err := cmd.CombinedOutput()
    630  		if err == nil {
    631 --- test/run.go
    632 +++ test/run.go
    633 @@ -220,6 +220,16 @@ func goRun(runcmd runCmd, goname string, args ...string) (out []byte, err error)
    634  	return runcmd(cmd...)
    635  }
    636  
    637 +func goRunTarget(runcmd runCmd, goname string, args ...string) (out []byte, err error) {
    638 +	cmd := []string{"go_local", "run"}
    639 +	cmd = append(cmd, goname)
    640 +	if *target != "" {
    641 +		cmd = append(cmd, "-target", *target)
    642 +	}
    643 +	cmd = append(cmd, args...)
    644 +	return runcmd(cmd...)
    645 +}
    646 +
    647  // skipError describes why a test was skipped.
    648  type skipError string
    649  
    650 @@ -469,7 +479,7 @@ func (t *test) run() {
    651  	case "cmpout":
    652  		action = "run" // the run case already looks for <dir>/<test>.out files
    653  		fallthrough
    654 -	case "compile", "compiledir", "build", "run", "runoutput", "rundir":
    655 +	case "compile", "compiledir", "build", "run", "runtarget", "runoutput", "rundir":
    656  		t.action = action
    657  	case "errorcheck", "errorcheckdir", "errorcheckoutput":
    658  		t.action = action
    659 @@ -653,6 +663,17 @@ func (t *test) run() {
    660  			t.err = fmt.Errorf("incorrect output\n%s", out)
    661  		}
    662  
    663 +	case "runtarget":
    664 +		useTmp = false
    665 +		out, err := goRunTarget(runcmd, t.goFileName(), args...)
    666 +		if err != nil {
    667 +			t.err = err
    668 +			return
    669 +		}
    670 +		if strings.Replace(string(out), "\r\n", "\n", -1) != t.expectedOutput() {
    671 +			t.err = fmt.Errorf("incorrect output\n%s", out)
    672 +		}
    673 +
    674  	case "runoutput":
    675  		rungatec <- true
    676  		defer func() {
    677 --- test/sinit_run.go
    678 +++ test/sinit_run.go
    679 @@ -1,5 +1,5 @@
    680  // +build !nacl
    681 -// run
    682 +// runtarget
    683  
    684  // Copyright 2014 The Go Authors. All rights reserved.
    685  // Use of this source code is governed by a BSD-style
    686 @@ -11,13 +11,24 @@ package main
    687  
    688  import (
    689  	"bytes"
    690 +	"flag"
    691  	"fmt"
    692  	"os"
    693  	"os/exec"
    694  )
    695  
    696 +var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
    697 +
    698 +func goCmd() string {
    699 +	if *target != "" {
    700 +		return "go_" + *target
    701 +	}
    702 +	return "go"
    703 +}
    704 +
    705  func main() {
    706 -	cmd := exec.Command("go", "tool", "compile", "-S", "sinit.go")
    707 +	flag.Parse()
    708 +	cmd := exec.Command(goCmd(), "tool", "compile", "-S", "sinit.go")
    709  	out, err := cmd.CombinedOutput()
    710  	if err != nil {
    711  		fmt.Println(string(out))
    712