cmd/go: run cover tool before swig

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>
This commit is contained in:
Than McIntosh 2023-12-21 08:21:59 -05:00 committed by Gopher Robot
parent 8db131082d
commit c0693f648a
2 changed files with 88 additions and 13 deletions

View 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 we're doing coverage, preprocess the .go files and put them in the work directory
if p.Internal.Cover.Mode != "" { if p.Internal.Cover.Mode != "" {
outfiles := []string{} 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. // Run cgo.
if p.UsesCgo() || p.UsesSwig() { if p.UsesCgo() || p.UsesSwig() {
// In a package using cgo, cgo compiles the C, C++ and assembly files with gcc. // In a package using cgo, cgo compiles the C, C++ and assembly files with gcc.

View File

@ -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()
}