]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: don't copy cgo files to objdir when overlay is present
authorMichael Matloob <matloob@golang.org>
Tue, 27 Oct 2020 21:51:58 +0000 (17:51 -0400)
committerMichael Matloob <matloob@golang.org>
Tue, 10 Nov 2020 16:09:36 +0000 (16:09 +0000)
The previous cl (golang.org/cl/262618) copied non-overlaid cgo files
to objdir, mostly to get around the issue that otherwise cgo-generated
files were written out with the wrong names (they'd get the base path
of the overlay file containing the replaced contents, instead of the
base path of the path whose contents are being replaced). So that CL
it would copy the files to objdir with the base path of the file
being replaced to circumvent that.

This CL changes cmd/go and cmd/cgo so that instead of copying
files, it passes the actual path of the file on disk either of
the original file (if it is not overlaid) or its replacement
file (if it is) as well as a flag --path_rewrite, newly added to
cmd/cgo, that specifies the actual original file path that corresponds
to the replaced files.

Updates #39958

Change-Id: Ic4aae5ef77fe405011fcdce7f6c162488d13daa2
Reviewed-on: https://go-review.googlesource.com/c/go/+/265758
Trust: Michael Matloob <matloob@golang.org>
Run-TryBot: Michael Matloob <matloob@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/internal/work/exec.go
src/cmd/go/testdata/script/build_overlay.txt

index a1a357e2acc52beb09ec89407de8cf7eff8b9d94..af00ded71e3530d0565fb267e79499915c30e2ee 100644 (file)
@@ -2732,6 +2732,20 @@ OverlayLoop:
                }
        }
 
+       // Rewrite overlaid paths in cgo files.
+       // cgo adds //line and #line pragmas in generated files with these paths.
+       var trimpath []string
+       for i := range cgofiles {
+               path := mkAbs(p.Dir, cgofiles[i])
+               if opath, ok := fsys.OverlayPath(path); ok {
+                       cgofiles[i] = opath
+                       trimpath = append(trimpath, opath+"=>"+path)
+               }
+       }
+       if len(trimpath) > 0 {
+               cgoflags = append(cgoflags, "-trimpath", strings.Join(trimpath, ";"))
+       }
+
        if err := b.run(a, execdir, p.ImportPath, cgoenv, cfg.BuildToolexec, cgoExe, "-objdir", objdir, "-importpath", p.ImportPath, cgoflags, "--", cgoCPPFLAGS, cgoCFLAGS, cgofiles); err != nil {
                return nil, nil, err
        }
index e18a8f5b28873c37d65d7dfc1e86d695b1ea0d45..0289cb6aa4e90d28af40e38c8913b0ba320db7a5 100644 (file)
@@ -43,6 +43,12 @@ go build -overlay overlay.json -o main_cgo_angle$GOEXE ./cgo_hello_angle
 exec ./main_cgo_angle$GOEXE
 stdout '^hello cgo\r?\n'
 
+go list -compiled -overlay -f '{{range .CompiledGoFiles}}{{. | printf "%s\n"}}{{end}}' ./cgo_hello_replace
+cp stdout compiled_cgo_sources.txt
+go run ../print_line_comments.go compiled_cgo_sources.txt
+stdout $GOPATH/src/m/cgo_hello_replace/cgo_hello_replace.go
+!stdout $GOPATH/src/m/overlay/hello.c
+
 # Run same tests but with gccgo.
 env GO111MODULE=off
 [!exec:gccgo] stop
@@ -207,3 +213,33 @@ void say_hello() { puts("hello cgo\n"); fflush(stdout); }
 
 void say_hello() { puts("hello cgo\n"); fflush(stdout); }
 
+-- print_line_comments.go --
+package main
+
+import (
+    "fmt"
+    "io/ioutil"
+    "log"
+    "os"
+    "strings"
+)
+
+func main() {
+    compiledGoFilesArg := os.Args[1]
+    b, err := ioutil.ReadFile(compiledGoFilesArg)
+    if err != nil {
+        log.Fatal(err)
+    }
+    compiledGoFiles := strings.Split(strings.TrimSpace(string(b)), "\n")
+    for _, f := range compiledGoFiles {
+        b, err := ioutil.ReadFile(f)
+        if err != nil {
+            log.Fatal(err)
+        }
+        for _, line := range strings.Split(string(b), "\n") {
+            if strings.HasPrefix(line, "#line") || strings.HasPrefix(line, "//line") {
+                fmt.Println(line)
+            }
+        }
+    }
+}
\ No newline at end of file