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