• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1test: add runtarget action.
2
3--- test/fixedbugs/bug248.go
4+++ test/fixedbugs/bug248.go
5@@ -1,38 +1,57 @@
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 // license that can be found in the LICENSE file.
13
14 package main
15
16 import (
17+	"flag"
18 	"fmt"
19 	"os"
20 	"os/exec"
21 	"path/filepath"
22 )
23
24+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
25+
26+func goCmd() string {
27+	if *target != "" {
28+		return "go_" + *target
29+	}
30+	return "go"
31+}
32+
33+func goRun(cmd ...string) {
34+	if *target == "" {
35+		run(cmd[0], cmd[1:]...)
36+	} else {
37+		run("go_"+*target+"_exec", cmd...)
38+	}
39+}
40+
41 func main() {
42+	flag.Parse()
43 	// TODO: If we get rid of errchk, re-enable this test on Windows.
44 	errchk, err := filepath.Abs("errchk")
45 	check(err)
46
47 	err = os.Chdir(filepath.Join("fixedbugs", "bug248.dir"))
48 	check(err)
49
50-	run("go", "tool", "compile", "bug0.go")
51-	run("go", "tool", "compile", "bug1.go")
52-	run("go", "tool", "compile", "bug2.go")
53-	run(errchk, "go", "tool", "compile", "-e", "bug3.go")
54-	run("go", "tool", "link", "bug2.o")
55-	run(fmt.Sprintf(".%ca.out", filepath.Separator))
56+	run(goCmd(), "tool", "compile", "bug0.go")
57+	run(goCmd(), "tool", "compile", "bug1.go")
58+	run(goCmd(), "tool", "compile", "bug2.go")
59+	run(errchk, goCmd(), "tool", "compile", "-e", "bug3.go")
60+	run(goCmd(), "tool", "link", "bug2.o")
61+	goRun(fmt.Sprintf(".%ca.out", filepath.Separator))
62
63 	os.Remove("bug0.o")
64 	os.Remove("bug1.o")
65 	os.Remove("bug2.o")
66 	os.Remove("a.out")
67 }
68
69 func run(name string, args ...string) {
70--- test/fixedbugs/bug302.go
71+++ test/fixedbugs/bug302.go
72@@ -1,28 +1,39 @@
73 // +build !nacl
74-// run
75+// runtarget
76
77 // Copyright 2010 The Go Authors. All rights reserved.
78 // Use of this source code is governed by a BSD-style
79 // license that can be found in the LICENSE file.
80
81 package main
82
83 import (
84+	"flag"
85 	"fmt"
86 	"os"
87 	"os/exec"
88 	"path/filepath"
89 )
90
91+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
92+
93+func goCmd() string {
94+	if *target != "" {
95+		return "go_" + *target
96+	}
97+	return "go"
98+}
99+
100 func main() {
101-	run("go", "tool", "compile", filepath.Join("fixedbugs", "bug302.dir", "p.go"))
102-	run("go", "tool", "pack", "grc", "pp.a", "p.o")
103-	run("go", "tool", "compile", "-I", ".", filepath.Join("fixedbugs", "bug302.dir", "main.go"))
104+	flag.Parse()
105+	run(goCmd(), "tool", "compile", filepath.Join("fixedbugs", "bug302.dir", "p.go"))
106+	run(goCmd(), "tool", "pack", "grc", "pp.a", "p.o")
107+	run(goCmd(), "tool", "compile", "-I", ".", filepath.Join("fixedbugs", "bug302.dir", "main.go"))
108 	os.Remove("p.o")
109 	os.Remove("pp.a")
110 	os.Remove("main.o")
111 }
112
113 func run(cmd string, args ...string) {
114 	out, err := exec.Command(cmd, args...).CombinedOutput()
115 	if err != nil {
116--- test/fixedbugs/bug345.go
117+++ test/fixedbugs/bug345.go
118@@ -1,34 +1,45 @@
119 // +build !nacl,!plan9,!windows
120-// run
121+// runtarget
122
123 // Copyright 2011 The Go Authors. All rights reserved.
124 // Use of this source code is governed by a BSD-style
125 // license that can be found in the LICENSE file.
126
127 package main
128
129 import (
130+	"flag"
131 	"fmt"
132 	"os"
133 	"os/exec"
134 	"path/filepath"
135 )
136
137+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
138+
139+func goCmd() string {
140+	if *target != "" {
141+		return "go_" + *target
142+	}
143+	return "go"
144+}
145+
146 func main() {
147+	flag.Parse()
148 	// TODO: If we get rid of errchk, re-enable this test on Plan 9 and Windows.
149 	errchk, err := filepath.Abs("errchk")
150 	check(err)
151
152 	err = os.Chdir(filepath.Join(".", "fixedbugs", "bug345.dir"))
153 	check(err)
154
155-	run("go", "tool", "compile", "io.go")
156-	run(errchk, "go", "tool", "compile", "-e", "main.go")
157+	run(goCmd(), "tool", "compile", "io.go")
158+	run(errchk, goCmd(), "tool", "compile", "-e", "main.go")
159 	os.Remove("io.o")
160 }
161
162 func run(name string, args ...string) {
163 	cmd := exec.Command(name, args...)
164 	out, err := cmd.CombinedOutput()
165 	if err != nil {
166 		fmt.Println(string(out))
167--- test/fixedbugs/bug369.go
168+++ test/fixedbugs/bug369.go
169@@ -1,35 +1,54 @@
170 // +build !nacl,!windows
171-// run
172+// runtarget
173
174 // Copyright 2011 The Go Authors. All rights reserved.
175 // Use of this source code is governed by a BSD-style
176 // license that can be found in the LICENSE file.
177
178 // Test that compiling with optimization turned on produces faster code.
179
180 package main
181
182 import (
183+	"flag"
184 	"fmt"
185 	"os"
186 	"os/exec"
187 	"path/filepath"
188 )
189
190+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
191+
192+func goCmd() string {
193+	if *target != "" {
194+		return "go_" + *target
195+	}
196+	return "go"
197+}
198+
199+func goRun(cmd ...string) {
200+	if *target == "" {
201+		run(cmd[0], cmd[1:]...)
202+	} else {
203+		run("go_"+*target+"_exec", cmd...)
204+	}
205+}
206+
207 func main() {
208+	flag.Parse()
209 	err := os.Chdir(filepath.Join(".", "fixedbugs", "bug369.dir"))
210 	check(err)
211
212-	run("go", "tool", "compile", "-N", "-o", "slow.o", "pkg.go")
213-	run("go", "tool", "compile", "-o", "fast.o", "pkg.go")
214-	run("go", "tool", "compile", "-o", "main.o", "main.go")
215-	run("go", "tool", "link", "-o", "a.exe", "main.o")
216-	run("." + string(filepath.Separator) + "a.exe")
217+	run(goCmd(), "tool", "compile", "-N", "-o", "slow.o", "pkg.go")
218+	run(goCmd(), "tool", "compile", "-o", "fast.o", "pkg.go")
219+	run(goCmd(), "tool", "compile", "-o", "main.o", "main.go")
220+	run(goCmd(), "tool", "link", "-o", "a.exe", "main.o")
221+	goRun("." + string(filepath.Separator) + "a.exe")
222
223 	os.Remove("slow.o")
224 	os.Remove("fast.o")
225 	os.Remove("main.o")
226 	os.Remove("a.exe")
227 }
228
229 func run(name string, args ...string) {
230--- test/fixedbugs/bug429_run.go
231+++ test/fixedbugs/bug429_run.go
232@@ -1,29 +1,49 @@
233 // +build !nacl
234-// run
235+// runtarget
236
237 // Copyright 2014 The Go Authors. All rights reserved.
238 // Use of this source code is governed by a BSD-style
239 // license that can be found in the LICENSE file.
240
241 // Run the bug429.go test.
242
243 package main
244
245 import (
246+	"flag"
247 	"fmt"
248 	"os"
249 	"os/exec"
250 	"path/filepath"
251 	"strings"
252 )
253
254+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
255+
256+func goCmd() string {
257+	if *target != "" {
258+		return "go_" + *target
259+	}
260+	return "go"
261+}
262+
263+func goRun(args ...string) *exec.Cmd {
264+	cmd := []string{"run"}
265+	if *target != "" {
266+		cmd = append(cmd, "-exec", "go_"+*target+"_exec")
267+	}
268+	cmd = append(cmd, args...)
269+	return exec.Command(goCmd(), cmd...)
270+}
271+
272 func main() {
273-	cmd := exec.Command("go", "run", filepath.Join("fixedbugs", "bug429.go"))
274+	flag.Parse()
275+	cmd := goRun(filepath.Join("fixedbugs", "bug429.go"))
276 	out, err := cmd.CombinedOutput()
277 	if err == nil {
278 		fmt.Println("expected deadlock")
279 		os.Exit(1)
280 	}
281
282 	want := "fatal error: all goroutines are asleep - deadlock!"
283 	got := string(out)
284--- test/fixedbugs/issue10607.go
285+++ test/fixedbugs/issue10607.go
286@@ -1,31 +1,51 @@
287 // +build linux,!ppc64 android
288-// run
289+// runtarget
290
291 // Copyright 2015 The Go Authors. All rights reserved.
292 // Use of this source code is governed by a BSD-style
293 // license that can be found in the LICENSE file.
294
295 // Test that a -B option is passed through when using both internal
296 // and external linking mode.
297
298 package main
299
300 import (
301+	"flag"
302 	"fmt"
303 	"os"
304 	"os/exec"
305 	"path/filepath"
306 )
307
308+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
309+
310+func goCmd() string {
311+	if *target != "" {
312+		return "go_" + *target
313+	}
314+	return "go"
315+}
316+
317+func goRun(args ...string) *exec.Cmd {
318+	cmd := []string{"run"}
319+	if *target != "" {
320+		cmd = append(cmd, "-exec", "go_"+*target+"_exec")
321+	}
322+	cmd = append(cmd, args...)
323+	return exec.Command(goCmd(), cmd...)
324+}
325+
326 func main() {
327-	test("internal")
328+	flag.Parse()
329+	// test("internal")
330 	test("external")
331 }
332
333 func test(linkmode string) {
334-	out, err := exec.Command("go", "run", "-ldflags", "-B=0x12345678 -linkmode="+linkmode, filepath.Join("fixedbugs", "issue10607a.go")).CombinedOutput()
335+	out, err := goRun("-ldflags", "-B=0x12345678 -linkmode="+linkmode, filepath.Join("fixedbugs", "issue10607a.go")).CombinedOutput()
336 	if err != nil {
337 		fmt.Printf("BUG: linkmode=%s %v\n%s\n", linkmode, err, out)
338 		os.Exit(1)
339 	}
340 }
341--- test/fixedbugs/issue11771.go
342+++ test/fixedbugs/issue11771.go
343@@ -1,31 +1,42 @@
344 // +build !nacl
345-// run
346+// runtarget
347
348 // Copyright 2015 The Go Authors. All rights reserved.
349 // Use of this source code is governed by a BSD-style
350 // license that can be found in the LICENSE file.
351
352 // Issue 11771: Magic comments should ignore carriage returns.
353
354 package main
355
356 import (
357 	"bytes"
358+	"flag"
359 	"fmt"
360 	"io/ioutil"
361 	"log"
362 	"os"
363 	"os/exec"
364 	"path/filepath"
365 	"runtime"
366 )
367
368+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
369+
370+func goCmd() string {
371+	if *target != "" {
372+		return "go_" + *target
373+	}
374+	return "go"
375+}
376+
377 func main() {
378+	flag.Parse()
379 	if runtime.Compiler != "gc" {
380 		return
381 	}
382
383 	dir, err := ioutil.TempDir("", "go-issue11771")
384 	if err != nil {
385 		log.Fatalf("creating temp dir: %v\n", err)
386 	}
387@@ -47,17 +58,17 @@ func main() {
388 func x() {
389 }
390 `)
391
392 	if err := ioutil.WriteFile(filepath.Join(dir, "x.go"), buf.Bytes(), 0666); err != nil {
393 		log.Fatal(err)
394 	}
395
396-	cmd := exec.Command("go", "tool", "compile", "x.go")
397+	cmd := exec.Command(goCmd(), "tool", "compile", "x.go")
398 	cmd.Dir = dir
399 	output, err := cmd.CombinedOutput()
400 	if err == nil {
401 		log.Fatal("compile succeeded unexpectedly")
402 	}
403 	if !bytes.Contains(output, []byte("only allowed in runtime")) {
404 		log.Fatalf("wrong error message from compiler; got:\n%s\n", output)
405 	}
406--- test/fixedbugs/issue9355.go
407+++ test/fixedbugs/issue9355.go
408@@ -1,34 +1,45 @@
409-// run
410+// runtarget
411
412 // Copyright 2014 The Go Authors. All rights reserved.
413 // Use of this source code is governed by a BSD-style
414 // license that can be found in the LICENSE file.
415
416 package main
417
418 import (
419+	"flag"
420 	"fmt"
421 	"os"
422 	"os/exec"
423 	"path/filepath"
424 	"regexp"
425 	"runtime"
426 )
427
428+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
429+
430+func goCmd() string {
431+	if *target != "" {
432+		return "go_" + *target
433+	}
434+	return "go"
435+}
436+
437 func main() {
438+	flag.Parse()
439 	if runtime.Compiler != "gc" || runtime.GOOS == "nacl" {
440 		return
441 	}
442
443 	err := os.Chdir(filepath.Join("fixedbugs", "issue9355.dir"))
444 	check(err)
445
446-	out := run("go", "tool", "compile", "-S", "a.go")
447+	out := run(goCmd(), "tool", "compile", "-S", "a.go")
448 	os.Remove("a.o")
449
450 	// 6g/8g print the offset as dec, but 5g/9g print the offset as hex.
451 	patterns := []string{
452 		`rel 0\+\d t=1 \"\"\.x\+8\r?\n`,       // y = &x.b
453 		`rel 0\+\d t=1 \"\"\.x\+(28|1c)\r?\n`, // z = &x.d.q
454 		`rel 0\+\d t=1 \"\"\.b\+5\r?\n`,       // c = &b[5]
455 		`rel 0\+\d t=1 \"\"\.x\+(88|58)\r?\n`, // w = &x.f[3].r
456--- test/fixedbugs/issue9862_run.go
457+++ test/fixedbugs/issue9862_run.go
458@@ -1,26 +1,46 @@
459 // +build !nacl
460-// run
461+// runtarget
462
463 // Copyright 2015 The Go Authors. All rights reserved.
464 // Use of this source code is governed by a BSD-style
465 // license that can be found in the LICENSE file.
466
467 // Check for compile or link error.
468
469 package main
470
471 import (
472+	"flag"
473 	"os/exec"
474 	"strings"
475 )
476
477+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
478+
479+func goCmd() string {
480+	if *target != "" {
481+		return "go_" + *target
482+	}
483+	return "go"
484+}
485+
486+func goRun(args ...string) *exec.Cmd {
487+	cmd := []string{"run"}
488+	if *target != "" {
489+		cmd = append(cmd, "-exec", "go_"+*target+"_exec")
490+	}
491+	cmd = append(cmd, args...)
492+	return exec.Command(goCmd(), cmd...)
493+}
494+
495 func main() {
496-	out, err := exec.Command("go", "run", "fixedbugs/issue9862.go").CombinedOutput()
497+	flag.Parse()
498+	out, err := goRun("fixedbugs/issue9862.go").CombinedOutput()
499 	outstr := string(out)
500 	if err == nil {
501 		println("go run issue9862.go succeeded, should have failed\n", outstr)
502 		return
503 	}
504 	if !strings.Contains(outstr, "symbol too large") {
505 		println("go run issue9862.go gave unexpected error; want symbol too large:\n", outstr)
506 	}
507--- test/linkmain_run.go
508+++ test/linkmain_run.go
509@@ -1,26 +1,36 @@
510 // +build !nacl
511-// run
512+// runtarget
513
514 // Copyright 2014 The Go Authors. All rights reserved.
515 // Use of this source code is governed by a BSD-style
516 // license that can be found in the LICENSE file.
517
518 // Run the sinit test.
519
520 package main
521
522 import (
523+	"flag"
524 	"fmt"
525 	"os"
526 	"os/exec"
527 	"strings"
528 )
529
530+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
531+
532+func goCmd() string {
533+	if *target != "" {
534+		return "go_" + *target
535+	}
536+	return "go"
537+}
538+
539 func cleanup() {
540 	os.Remove("linkmain.o")
541 	os.Remove("linkmain.a")
542 	os.Remove("linkmain1.o")
543 	os.Remove("linkmain1.a")
544 	os.Remove("linkmain.exe")
545 }
546
547@@ -46,21 +56,23 @@ func runFail(cmdline string) {
548 		fmt.Println(string(out))
549 		fmt.Println("SHOULD HAVE FAILED!")
550 		cleanup()
551 		os.Exit(1)
552 	}
553 }
554
555 func main() {
556+	flag.Parse()
557+
558 	// helloworld.go is package main
559-	run("go tool compile -o linkmain.o helloworld.go")
560-	run("go tool compile -pack -o linkmain.a helloworld.go")
561-	run("go tool link -o linkmain.exe linkmain.o")
562-	run("go tool link -o linkmain.exe linkmain.a")
563+	run(goCmd() + " tool compile -o linkmain.o helloworld.go")
564+	run(goCmd() + " tool compile -pack -o linkmain.a helloworld.go")
565+	run(goCmd() + " tool link -o linkmain.exe linkmain.o")
566+	run(goCmd() + " tool link -o linkmain.exe linkmain.a")
567
568 	// linkmain.go is not
569-	run("go tool compile -o linkmain1.o linkmain.go")
570-	run("go tool compile -pack -o linkmain1.a linkmain.go")
571-	runFail("go tool link -o linkmain.exe linkmain1.o")
572-	runFail("go tool link -o linkmain.exe linkmain1.a")
573+	run(goCmd() + " tool compile -o linkmain1.o linkmain.go")
574+	run(goCmd() + " tool compile -pack -o linkmain1.a linkmain.go")
575+	runFail(goCmd() + " tool link -o linkmain.exe linkmain1.o")
576+	runFail(goCmd() + " tool link -o linkmain.exe linkmain1.a")
577 	cleanup()
578 }
579--- test/linkobj.go
580+++ test/linkobj.go
581@@ -1,31 +1,50 @@
582 // +build !nacl
583-// run
584+// runtarget
585
586 // Copyright 2016 The Go Authors. All rights reserved.
587 // Use of this source code is governed by a BSD-style
588 // license that can be found in the LICENSE file.
589
590 // Test the compiler -linkobj flag.
591
592 package main
593
594 import (
595+	"flag"
596 	"fmt"
597 	"io/ioutil"
598 	"log"
599 	"os"
600 	"os/exec"
601 	"strings"
602 )
603
604+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
605+
606+func goCmd() string {
607+	if *target != "" {
608+		return "go_" + *target
609+	}
610+	return "go"
611+}
612+
613+func goRun(cmd ...string) string {
614+	if *target == "" {
615+		return run(cmd...)
616+	} else {
617+		return run(append([]string{"go_"+*target+"_exec"}, cmd...)...)
618+	}
619+}
620+
621 var pwd, tmpdir string
622
623 func main() {
624+	flag.Parse()
625 	dir, err := ioutil.TempDir("", "go-test-linkobj-")
626 	if err != nil {
627 		log.Fatal(err)
628 	}
629 	pwd, err = os.Getwd()
630 	if err != nil {
631 		log.Fatal(err)
632 	}
633@@ -71,33 +90,33 @@ func main() {
634
635 		// The compiler expects the files being read to have the right suffix.
636 		o := "o"
637 		if round == 1 {
638 			o = "a"
639 		}
640
641 		// inlining is disabled to make sure that the link objects contain needed code.
642-		run("go", "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p1."+o, "-linkobj", "p1.lo", "p1.go")
643-		run("go", "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p2."+o, "-linkobj", "p2.lo", "p2.go")
644-		run("go", "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p3."+o, "-linkobj", "p3.lo", "p3.go")
645+		run(goCmd(), "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p1."+o, "-linkobj", "p1.lo", "p1.go")
646+		run(goCmd(), "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p2."+o, "-linkobj", "p2.lo", "p2.go")
647+		run(goCmd(), "tool", "compile", pkg, "-D", ".", "-I", ".", "-l", "-o", "p3."+o, "-linkobj", "p3.lo", "p3.go")
648
649 		cp("p1."+o, "p1.oo")
650 		cp("p2."+o, "p2.oo")
651 		cp("p3."+o, "p3.oo")
652 		cp("p1.lo", "p1."+o)
653 		cp("p2.lo", "p2."+o)
654 		cp("p3.lo", "p3."+o)
655-		out := runFail("go", "tool", "link", "p2."+o)
656+		out := runFail(goCmd(), "tool", "link", "p2."+o)
657 		if !strings.Contains(out, "not package main") {
658 			fatalf("link p2.o failed but not for package main:\n%s", out)
659 		}
660
661-		run("go", "tool", "link", "-L", ".", "-o", "a.out.exe", "p3."+o)
662-		out = run("./a.out.exe")
663+		run(goCmd(), "tool", "link", "-L", ".", "-o", "a.out.exe", "p3."+o)
664+		out = goRun("./a.out.exe")
665 		if !strings.Contains(out, "hello from p1\nhello from p2\nhello from main\n") {
666 			fatalf("running main, incorrect output:\n%s", out)
667 		}
668
669 		// ensure that mistaken future round can't use these
670 		os.Remove("p1.o")
671 		os.Remove("a.out.exe")
672 	}
673--- test/linkx_run.go
674+++ test/linkx_run.go
675@@ -1,35 +1,55 @@
676 // +build !nacl
677-// run
678+// runtarget
679
680 // Copyright 2014 The Go Authors. All rights reserved.
681 // Use of this source code is governed by a BSD-style
682 // license that can be found in the LICENSE file.
683
684 // Run the linkx test.
685
686 package main
687
688 import (
689 	"bytes"
690+	"flag"
691 	"fmt"
692 	"os"
693 	"os/exec"
694 	"strings"
695 )
696
697+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
698+
699+func goCmd() string {
700+	if *target != "" {
701+		return "go_" + *target
702+	}
703+	return "go"
704+}
705+
706+func goRun(args ...string) *exec.Cmd {
707+	cmd := []string{"run"}
708+	if *target != "" {
709+		cmd = append(cmd, "-exec", "go_"+*target+"_exec")
710+	}
711+	cmd = append(cmd, args...)
712+	return exec.Command(goCmd(), cmd...)
713+}
714+
715 func main() {
716+	flag.Parse()
717 	// test(" ") // old deprecated & removed syntax
718 	test("=") // new syntax
719 }
720
721 func test(sep string) {
722 	// Successful run
723-	cmd := exec.Command("go", "run", "-ldflags=-X main.tbd"+sep+"hello -X main.overwrite"+sep+"trumped -X main.nosuchsymbol"+sep+"neverseen", "linkx.go")
724+	cmd := goRun("-ldflags=-X main.tbd"+sep+"hello -X main.overwrite"+sep+"trumped -X main.nosuchsymbol"+sep+"neverseen", "linkx.go")
725 	var out, errbuf bytes.Buffer
726 	cmd.Stdout = &out
727 	cmd.Stderr = &errbuf
728 	err := cmd.Run()
729 	if err != nil {
730 		fmt.Println(errbuf.String())
731 		fmt.Println(out.String())
732 		fmt.Println(err)
733@@ -39,25 +59,25 @@ func test(sep string) {
734 	want := "hello\ntrumped\n"
735 	got := out.String()
736 	if got != want {
737 		fmt.Printf("got %q want %q\n", got, want)
738 		os.Exit(1)
739 	}
740
741 	// Issue 8810
742-	cmd = exec.Command("go", "run", "-ldflags=-X main.tbd", "linkx.go")
743+	cmd = goRun("-ldflags=-X main.tbd", "linkx.go")
744 	_, err = cmd.CombinedOutput()
745 	if err == nil {
746 		fmt.Println("-X linker flag should not accept keys without values")
747 		os.Exit(1)
748 	}
749
750 	// Issue 9621
751-	cmd = exec.Command("go", "run", "-ldflags=-X main.b=false -X main.x=42", "linkx.go")
752+	cmd = goRun("-ldflags=-X main.b=false -X main.x=42", "linkx.go")
753 	outx, err := cmd.CombinedOutput()
754 	if err == nil {
755 		fmt.Println("-X linker flag should not overwrite non-strings")
756 		os.Exit(1)
757 	}
758 	outstr := string(outx)
759 	if !strings.Contains(outstr, "main.b") {
760 		fmt.Printf("-X linker flag did not diagnose overwrite of main.b:\n%s\n", outstr)
761--- test/nosplit.go
762+++ test/nosplit.go
763@@ -1,31 +1,49 @@
764 // +build !nacl
765-// run
766+// runtarget
767
768 // Copyright 2014 The Go Authors. All rights reserved.
769 // Use of this source code is governed by a BSD-style
770 // license that can be found in the LICENSE file.
771
772 package main
773
774 import (
775 	"bytes"
776+	"flag"
777 	"fmt"
778 	"io/ioutil"
779 	"log"
780 	"os"
781 	"os/exec"
782 	"path/filepath"
783 	"regexp"
784-	"runtime"
785 	"strconv"
786 	"strings"
787 )
788
789+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
790+
791+func goCmd() string {
792+	if *target != "" {
793+		return "go_" + *target
794+	}
795+	return "go"
796+}
797+
798+func goArch() string {
799+	goarch, err := exec.Command(goCmd(), "env", "GOARCH").Output()
800+	if err != nil {
801+		bug()
802+		fmt.Printf("running go env GOARCH: %v\n", err)
803+	}
804+	return strings.TrimSpace(string(goarch))
805+}
806+
807 var tests = `
808 # These are test cases for the linker analysis that detects chains of
809 # nosplit functions that would cause a stack overflow.
810 #
811 # Lines beginning with # are comments.
812 #
813 # Each test case describes a sequence of functions, one per line.
814 # Each function definition is the function name, then the frame size,
815@@ -189,22 +207,23 @@ var (
816 	commentRE = regexp.MustCompile(`(?m)^#.*`)
817 	rejectRE  = regexp.MustCompile(`(?s)\A(.+?)((\n|; *)REJECT(.*))?\z`)
818 	lineRE    = regexp.MustCompile(`(\w+) (\d+)( nosplit)?(.*)`)
819 	callRE    = regexp.MustCompile(`\bcall (\w+)\b`)
820 	callindRE = regexp.MustCompile(`\bcallind\b`)
821 )
822
823 func main() {
824-	goarch := os.Getenv("GOARCH")
825+	flag.Parse()
826+	goarch := goArch()
827 	if goarch == "" {
828-		goarch = runtime.GOARCH
829+		return
830 	}
831
832-	version, err := exec.Command("go", "tool", "compile", "-V").Output()
833+	version, err := exec.Command(goCmd(), "tool", "compile", "-V").Output()
834 	if err != nil {
835 		bug()
836 		fmt.Printf("running go tool compile -V: %v\n", err)
837 		return
838 	}
839 	if s := string(version); goarch == "amd64" && strings.Contains(s, "X:") && !strings.Contains(s, "framepointer") {
840 		// Skip this test if framepointer is NOT enabled on AMD64
841 		return
842@@ -340,17 +359,17 @@ TestCases:
843
844 		if err := ioutil.WriteFile(filepath.Join(dir, "asm.s"), buf.Bytes(), 0666); err != nil {
845 			log.Fatal(err)
846 		}
847 		if err := ioutil.WriteFile(filepath.Join(dir, "main.go"), gobuf.Bytes(), 0666); err != nil {
848 			log.Fatal(err)
849 		}
850
851-		cmd := exec.Command("go", "build")
852+		cmd := exec.Command(goCmd(), "build")
853 		cmd.Dir = dir
854 		output, err := cmd.CombinedOutput()
855 		if err == nil {
856 			nok++
857 			if reject {
858 				bug()
859 				fmt.Printf("accepted incorrectly:\n\t%s\n", indent(strings.TrimSpace(stanza)))
860 			}
861--- test/run.go
862+++ test/run.go
863@@ -222,16 +222,26 @@ func goRun(runcmd runCmd, flags []string, goname string, args ...string) (out []
864 		cmd = append(cmd, findExecCmd()...)
865 	}
866 	cmd = append(cmd, flags...)
867 	cmd = append(cmd, goname)
868 	cmd = append(cmd, args...)
869 	return runcmd(cmd...)
870 }
871
872+func goRunTarget(runcmd runCmd, goname string, args ...string) (out []byte, err error) {
873+	cmd := []string{"go_local", "run"}
874+	cmd = append(cmd, goname)
875+	if *target != "" {
876+		cmd = append(cmd, "-target", *target)
877+	}
878+	cmd = append(cmd, args...)
879+	return runcmd(cmd...)
880+}
881+
882 // skipError describes why a test was skipped.
883 type skipError string
884
885 func (s skipError) Error() string { return string(s) }
886
887 func check(err error) {
888 	if err != nil {
889 		log.Fatal(err)
890@@ -484,17 +494,17 @@ func (t *test) run() {
891 	}
892
893 	// TODO: Clean up/simplify this switch statement.
894 	switch action {
895 	case "rundircmpout":
896 		action = "rundir"
897 	case "cmpout":
898 		action = "run" // the run case already looks for <dir>/<test>.out files
899-	case "compile", "compiledir", "build", "builddir", "run", "buildrun", "runoutput", "rundir":
900+	case "compile", "compiledir", "build", "builddir", "run", "runtarget", "buildrun", "runoutput", "rundir":
901 		// nothing to do
902 	case "errorcheckandrundir":
903 		wantError = false // should be no error if also will run
904 	case "errorcheckwithauto":
905 		action = "errorcheck"
906 		wantAuto = true
907 		wantError = true
908 	case "errorcheck", "errorcheckdir", "errorcheckoutput":
909@@ -807,16 +817,27 @@ func (t *test) run() {
910 		if err != nil {
911 			t.err = err
912 			return
913 		}
914 		if strings.Replace(string(out), "\r\n", "\n", -1) != t.expectedOutput() {
915 			t.err = fmt.Errorf("incorrect output\n%s", out)
916 		}
917
918+	case "runtarget":
919+		useTmp = false
920+		out, err := goRunTarget(runcmd, t.goFileName(), args...)
921+		if err != nil {
922+			t.err = err
923+			return
924+		}
925+		if strings.Replace(string(out), "\r\n", "\n", -1) != t.expectedOutput() {
926+			t.err = fmt.Errorf("incorrect output\n%s", out)
927+		}
928+
929 	case "runoutput":
930 		rungatec <- true
931 		defer func() {
932 			<-rungatec
933 		}()
934 		useTmp = false
935 		out, err := goRun(runcmd, nil, t.goFileName(), args...)
936 		if err != nil {
937--- test/sinit_run.go
938+++ test/sinit_run.go
939@@ -1,28 +1,39 @@
940 // +build !nacl
941-// run
942+// runtarget
943
944 // Copyright 2014 The Go Authors. All rights reserved.
945 // Use of this source code is governed by a BSD-style
946 // license that can be found in the LICENSE file.
947
948 // Run the sinit test.
949
950 package main
951
952 import (
953 	"bytes"
954+	"flag"
955 	"fmt"
956 	"os"
957 	"os/exec"
958 )
959
960+var target = flag.String("target", "", "if non empty, use 'go_target' to compile test files and 'go_target_exec' to run the binaries")
961+
962+func goCmd() string {
963+	if *target != "" {
964+		return "go_" + *target
965+	}
966+	return "go"
967+}
968+
969 func main() {
970-	cmd := exec.Command("go", "tool", "compile", "-S", "sinit.go")
971+	flag.Parse()
972+	cmd := exec.Command(goCmd(), "tool", "compile", "-S", "sinit.go")
973 	out, err := cmd.CombinedOutput()
974 	if err != nil {
975 		fmt.Println(string(out))
976 		fmt.Println(err)
977 		os.Exit(1)
978 	}
979 	os.Remove("sinit.o")
980
981