cmd/nm: run tests in parallel, don't use Scanner on []byte

Saves about 35% on total test time on my laptop.

Fixes #26471

Change-Id: I15b28b1bc00f889934d577dc7996864bbab10105
Reviewed-on: https://go-review.googlesource.com/c/153499
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/src/cmd/nm/nm_test.go b/src/cmd/nm/nm_test.go
index 1f2ad53..53c39f2 100644
--- a/src/cmd/nm/nm_test.go
+++ b/src/cmd/nm/nm_test.go
@@ -5,8 +5,6 @@
 package main
 
 import (
-	"bufio"
-	"bytes"
 	"fmt"
 	"internal/testenv"
 	"io/ioutil"
@@ -55,6 +53,7 @@
 }
 
 func TestNonGoExecs(t *testing.T) {
+	t.Parallel()
 	testfiles := []string{
 		"debug/elf/testdata/gcc-386-freebsd-exec",
 		"debug/elf/testdata/gcc-amd64-linux-exec",
@@ -77,6 +76,7 @@
 }
 
 func testGoExec(t *testing.T, iscgo, isexternallinker bool) {
+	t.Parallel()
 	tmpdir, err := ioutil.TempDir("", "TestGoExec")
 	if err != nil {
 		t.Fatal(err)
@@ -154,10 +154,9 @@
 		return false
 	}
 
-	scanner := bufio.NewScanner(bytes.NewBuffer(out))
 	dups := make(map[string]bool)
-	for scanner.Scan() {
-		f := strings.Fields(scanner.Text())
+	for _, line := range strings.Split(string(out), "\n") {
+		f := strings.Fields(line)
 		if len(f) < 3 {
 			continue
 		}
@@ -184,10 +183,6 @@
 			delete(runtimeSyms, name)
 		}
 	}
-	err = scanner.Err()
-	if err != nil {
-		t.Fatalf("error reading nm output: %v", err)
-	}
 	if len(names) > 0 {
 		t.Errorf("executable is missing %v symbols", names)
 	}
@@ -201,6 +196,7 @@
 }
 
 func testGoLib(t *testing.T, iscgo bool) {
+	t.Parallel()
 	tmpdir, err := ioutil.TempDir("", "TestGoLib")
 	if err != nil {
 		t.Fatal(err)
@@ -269,9 +265,9 @@
 			syms = append(syms, symType{"T", "cgofunc", true, false})
 		}
 	}
-	scanner := bufio.NewScanner(bytes.NewBuffer(out))
-	for scanner.Scan() {
-		f := strings.Fields(scanner.Text())
+
+	for _, line := range strings.Split(string(out), "\n") {
+		f := strings.Fields(line)
 		var typ, name string
 		var csym bool
 		if iscgo {
@@ -298,10 +294,6 @@
 			}
 		}
 	}
-	err = scanner.Err()
-	if err != nil {
-		t.Fatalf("error reading nm output: %v", err)
-	}
 	for _, sym := range syms {
 		if !sym.Found {
 			t.Errorf("cannot found symbol %s %s", sym.Type, sym.Name)