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