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