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