From: David Crawshaw Date: Wed, 8 Apr 2015 20:49:43 +0000 (-0400) Subject: cmd/internal/ld: clean up hostlink I/O X-Git-Tag: go1.5beta1~1232 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=b1d1564f1a9786f3ec30f59d8496fffdcaed6709;p=gostls13.git cmd/internal/ld: clean up hostlink I/O Change-Id: I6c3a62403941d357ffd9d0025289c2180139b0bd Reviewed-on: https://go-review.googlesource.com/8664 Reviewed-by: Ian Lance Taylor Reviewed-by: Minux Ma --- diff --git a/src/cmd/internal/ld/lib.go b/src/cmd/internal/ld/lib.go index 339e872d02..2829b5b9f4 100644 --- a/src/cmd/internal/ld/lib.go +++ b/src/cmd/internal/ld/lib.go @@ -35,6 +35,7 @@ import ( "cmd/internal/obj" "errors" "fmt" + "io" "io/ioutil" "log" "os" @@ -738,8 +739,6 @@ func hostlinksetup() { coutbuf = *Binitw(cout) } -var hostlink_buf = make([]byte, 64*1024) - func hostlink() { if Linkmode != LinkExternal || nerrors > 0 { return @@ -811,23 +810,20 @@ func hostlink() { // already wrote main object file // copy host objects to temporary directory - var f *Biobuf - var h *Hostobj - var length int - var n int - var p string - for i := 0; i < len(hostobj); i++ { - h = &hostobj[i] - var err error - f, err = Bopenr(h.file) - if f == nil { + for i, h := range hostobj { + f, err := os.Open(h.file) + if err != nil { Ctxt.Cursym = nil Diag("cannot reopen %s: %v", h.pn, err) Errorexit() } + if _, err := f.Seek(h.off, 0); err != nil { + Ctxt.Cursym = nil + Diag("cannot seek %s: %v", h.pn, err) + Errorexit() + } - Bseek(f, h.off, 0) - p = fmt.Sprintf("%s/%06d.o", tmpdir, i) + p := fmt.Sprintf("%s/%06d.o", tmpdir, i) argv = append(argv, p) w, err := os.Create(p) if err != nil { @@ -835,38 +831,22 @@ func hostlink() { Diag("cannot create %s: %v", p, err) Errorexit() } - - length = int(h.length) - for length > 0 { - n = Bread(f, hostlink_buf) - if n <= 0 { - break - } - if n > length { - n = length - } - if _, err = w.Write(hostlink_buf[:n]); err != nil { - log.Fatal(err) - } - length -= n + if _, err := io.CopyN(w, f, h.length); err != nil { + Ctxt.Cursym = nil + Diag("cannot write %s: %v", p, err) + Errorexit() } - if err := w.Close(); err != nil { Ctxt.Cursym = nil - Diag("cannot write %s: %v", p, err) + Diag("cannot close %s: %v", p, err) Errorexit() } - - Bterm(f) } argv = append(argv, fmt.Sprintf("%s/go.o", tmpdir)) - var i int - for i = 0; i < len(ldflag); i++ { - argv = append(argv, ldflag[i]) - } + argv = append(argv, ldflag...) - for _, p = range strings.Fields(extldflags) { + for _, p := range strings.Fields(extldflags) { argv = append(argv, p) // clang, unlike GCC, passes -rdynamic to the linker @@ -876,7 +856,7 @@ func hostlink() { // only adding -rdynamic later, so that -extldflags // can override -rdynamic without using -static. if Iself && p == "-static" { - for i = range argv { + for i := range argv { if argv[i] == "-rdynamic" { argv[i] = "-static" } @@ -889,8 +869,8 @@ func hostlink() { if Debug['v'] != 0 { fmt.Fprintf(&Bso, "host link:") - for i = range argv { - fmt.Fprintf(&Bso, " %v", plan9quote(argv[i])) + for _, v := range argv { + fmt.Fprintf(&Bso, " %q", v) } fmt.Fprintf(&Bso, "\n") Bflush(&Bso) diff --git a/src/cmd/internal/ld/util.go b/src/cmd/internal/ld/util.go index 8c37cab088..3461ae862c 100644 --- a/src/cmd/internal/ld/util.go +++ b/src/cmd/internal/ld/util.go @@ -24,18 +24,6 @@ func cstring(x []byte) string { return string(x) } -func plan9quote(s string) string { - if s == "" { - return "'" + strings.Replace(s, "'", "''", -1) + "'" - } - for i := 0; i < len(s); i++ { - if s[i] <= ' ' || s[i] == '\'' { - return "'" + strings.Replace(s, "'", "''", -1) + "'" - } - } - return s -} - func tokenize(s string) []string { var f []string for {