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