Skip to content

Commit

Permalink
cmd/go/internal/load: clone pgo variant's PackagePublic.Imports in split
Browse files Browse the repository at this point in the history
Before this change the pgo and non-pgo variants Imports slices pointed
to the same array, so modifying the pgo variant's Imports slice to add
the .ForMain suffix modified the non-pgo vairant's Imports slice too.
This change clones the imports slice to avoid that.

Fixes #66218

Change-Id: Ic936086f2c31f2056988d6546216142e4fce4d8d
Reviewed-on: https://go-review.googlesource.com/c/go/+/588275
Reviewed-by: Sam Thanawalla <samthanawalla@google.com>
Auto-Submit: Michael Matloob <matloob@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
  • Loading branch information
matloob committed May 28, 2024
1 parent 3776465 commit 94aeedc
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 2 deletions.
6 changes: 4 additions & 2 deletions src/cmd/go/internal/load/pkg.go
Original file line number Diff line number Diff line change
Expand Up @@ -2943,8 +2943,10 @@ func setPGOProfilePath(pkgs []*Package) {
}
p1 := new(Package)
*p1 = *p
// Unalias the Internal.Imports slice, which is we're going to
// modify. We don't copy other slices as we don't change them.
// Unalias the Imports and Internal.Imports slices,
// which we're going to modify. We don't copy other slices as
// we don't change them.
p1.Imports = slices.Clone(p.Imports)
p1.Internal.Imports = slices.Clone(p.Internal.Imports)
p1.Internal.ForMain = pmain.ImportPath
visited[p] = p1
Expand Down
28 changes: 28 additions & 0 deletions src/cmd/go/testdata/script/list_pgo_issue66218.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Test that pgo properly splits off the Imports field so that list doesn't alias
# the non-pgo variant's slice when it modifies the pgo variant's Imports field to
# add the [.ForMain] suffix.

go list -f 'ImportPath: "{{.ImportPath}}", Imports: "{{.Imports}}", ImportMap: "{{.ImportMap}}"' m/a m/b
cmp stdout want

-- want --
ImportPath: "m/a", Imports: "[m/b [m/a]]", ImportMap: "map[m/b:m/b [m/a]]"
ImportPath: "m/b", Imports: "[m/c]", ImportMap: "map[]"
-- go.mod --
module m

go 1.23

-- a/a.go --
package main

import _ "m/b"
-- a/default.pgo --
-- b/b.go --
package a

import _ "m/c"

-- c/c.go --
package c

0 comments on commit 94aeedc

Please sign in to comment.