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