]> Cypherpunks.ru repositories - gostls13.git/commitdiff
cmd/go: run cover tool before swig
authorThan McIntosh <thanm@google.com>
Thu, 21 Dec 2023 13:21:59 +0000 (08:21 -0500)
committerGopher Robot <gobot@golang.org>
Fri, 5 Jan 2024 21:29:51 +0000 (21:29 +0000)
When building a package, run the cover tool on the collected go/cgo
source files before invoking swig (if swig files are present), as
opposed to running swig and then cover. Running swig adds new Go files
to the "cgo" list, and we want to avoid running those newly generated
files through the cover tool.

Fixes #64661.

Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest
Change-Id: I32b6dad5c39fcf5e656c40fb3b44220c69320889
Reviewed-on: https://go-review.googlesource.com/c/go/+/552095
Auto-Submit: Than McIntosh <thanm@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/cmd/go/internal/work/exec.go
src/cmd/go/testdata/script/cover_swig.txt [new file with mode: 0644]

index ecad324886684bad26591809db9e4f5e75ec8d53..e05471b06cd1cb44545673ad321db2e594db9f02 100644 (file)
@@ -629,19 +629,6 @@ OverlayLoop:
                }
        }
 
-       // Run SWIG on each .swig and .swigcxx file.
-       // Each run will generate two files, a .go file and a .c or .cxx file.
-       // The .go file will use import "C" and is to be processed by cgo.
-       if p.UsesSwig() {
-               outGo, outC, outCXX, err := b.swig(a, objdir, pcCFLAGS)
-               if err != nil {
-                       return err
-               }
-               cgofiles = append(cgofiles, outGo...)
-               cfiles = append(cfiles, outC...)
-               cxxfiles = append(cxxfiles, outCXX...)
-       }
-
        // If we're doing coverage, preprocess the .go files and put them in the work directory
        if p.Internal.Cover.Mode != "" {
                outfiles := []string{}
@@ -722,6 +709,22 @@ OverlayLoop:
                }
        }
 
+       // Run SWIG on each .swig and .swigcxx file.
+       // Each run will generate two files, a .go file and a .c or .cxx file.
+       // The .go file will use import "C" and is to be processed by cgo.
+       // For -cover test or build runs, this needs to happen after the cover
+       // tool is run; we don't want to instrument swig-generated Go files,
+       // see issue #64661.
+       if p.UsesSwig() {
+               outGo, outC, outCXX, err := b.swig(a, objdir, pcCFLAGS)
+               if err != nil {
+                       return err
+               }
+               cgofiles = append(cgofiles, outGo...)
+               cfiles = append(cfiles, outC...)
+               cxxfiles = append(cxxfiles, outCXX...)
+       }
+
        // Run cgo.
        if p.UsesCgo() || p.UsesSwig() {
                // In a package using cgo, cgo compiles the C, C++ and assembly files with gcc.
diff --git a/src/cmd/go/testdata/script/cover_swig.txt b/src/cmd/go/testdata/script/cover_swig.txt
new file mode 100644 (file)
index 0000000..decb29a
--- /dev/null
@@ -0,0 +1,72 @@
+
+# Testcase for issue 64661.  This testcase is intended to verify that
+# we don't try to send swig-generated Go files through the cover tool
+# for "go test -cover" runs on packages that have *.swig source files.
+
+[!exec:swig] skip
+[!cgo] skip
+
+go test -v -count=1 -coverprofile=foo.p
+stdout 'coverage: 100.0% of statements'
+
+-- go.mod --
+module simple
+
+go 1.21
+-- main.c --
+/* A global variable */
+double Foo = 3.0;
+
+/* Compute the greatest common divisor of positive integers */
+int gcd(int x, int y) {
+  int g;
+  g = y;
+  while (x > 0) {
+    g = x;
+    x = y % x;
+    y = g;
+  }
+  return g;
+}
+
+
+-- main.go --
+package main
+
+import (
+       "fmt"
+)
+
+func main() {
+       // Call our gcd() function
+       x := 42
+       y := 105
+       g := Gcd(x, y)
+       fmt.Println("The gcd of", x, "and", y, "is", g)
+
+       // Manipulate the Foo global variable
+
+       // Output its current value
+       fmt.Println("Foo =", GetFoo())
+
+       // Change its value
+       SetFoo(3.1415926)
+
+       // See if the change took effect
+       fmt.Println("Foo =", GetFoo())
+}
+-- main.swig --
+%module main
+
+%inline %{
+extern int    gcd(int x, int y);
+extern double Foo;
+%}
+-- main_test.go --
+package main
+
+import "testing"
+
+func TestSwigFuncs(t *testing.T) {
+       main()
+}