]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/ld: clean up hostlink I/O
authorDavid Crawshaw <crawshaw@golang.org>
Wed, 8 Apr 2015 20:49:43 +0000 (16:49 -0400)
committerDavid Crawshaw <crawshaw@golang.org>
Wed, 8 Apr 2015 21:58:48 +0000 (21:58 +0000)
Change-Id: I6c3a62403941d357ffd9d0025289c2180139b0bd
Reviewed-on: https://go-review.googlesource.com/8664
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Minux Ma <minux@golang.org>
src/cmd/internal/ld/lib.go
src/cmd/internal/ld/util.go

index 339e872d021780b09def0ee61fa788f09e87ce42..2829b5b9f4f76d45df8d2511f95070755f32c4bf 100644 (file)
@@ -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 = range argv {
-                       fmt.Fprintf(&Bso, " %v", plan9quote(argv[i]))
+               for _, v := range argv {
+                       fmt.Fprintf(&Bso, " %q", v)
                }
                fmt.Fprintf(&Bso, "\n")
                Bflush(&Bso)
index 8c37cab088b8ed94066401e634b01c8f8052081e..3461ae862c8ed700aea03f7e331fe9cc7764e4ea 100644 (file)
@@ -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 {