Skip to content

Commit a65bc04

Browse files
cmd/go: use cmd/internal/pkgpath for gccgo pkgpath symbol
Fixes #37272 Change-Id: I6554fd5e5400acb20c5a7e96b1d6cb1a1afb9871 Reviewed-on: https://go-review.googlesource.com/c/go/+/259299 Trust: Ian Lance Taylor <[email protected]> Run-TryBot: Ian Lance Taylor <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: Than McIntosh <[email protected]>
1 parent 72ee5ba commit a65bc04

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

src/cmd/go/internal/work/gccgo.go

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import (
1111
"os/exec"
1212
"path/filepath"
1313
"strings"
14+
"sync"
1415

1516
"cmd/go/internal/base"
1617
"cmd/go/internal/cfg"
1718
"cmd/go/internal/load"
1819
"cmd/go/internal/str"
20+
"cmd/internal/pkgpath"
1921
)
2022

2123
// The Gccgo toolchain.
@@ -174,7 +176,7 @@ func (tools gccgoToolchain) asm(b *Builder, a *Action, sfiles []string) ([]strin
174176
ofiles = append(ofiles, ofile)
175177
sfile = mkAbs(p.Dir, sfile)
176178
defs := []string{"-D", "GOOS_" + cfg.Goos, "-D", "GOARCH_" + cfg.Goarch}
177-
if pkgpath := gccgoCleanPkgpath(p); pkgpath != "" {
179+
if pkgpath := tools.gccgoCleanPkgpath(b, p); pkgpath != "" {
178180
defs = append(defs, `-D`, `GOPKGPATH=`+pkgpath)
179181
}
180182
defs = tools.maybePIC(defs)
@@ -531,7 +533,7 @@ func (tools gccgoToolchain) cc(b *Builder, a *Action, ofile, cfile string) error
531533
cfile = mkAbs(p.Dir, cfile)
532534
defs := []string{"-D", "GOOS_" + cfg.Goos, "-D", "GOARCH_" + cfg.Goarch}
533535
defs = append(defs, b.gccArchArgs()...)
534-
if pkgpath := gccgoCleanPkgpath(p); pkgpath != "" {
536+
if pkgpath := tools.gccgoCleanPkgpath(b, p); pkgpath != "" {
535537
defs = append(defs, `-D`, `GOPKGPATH="`+pkgpath+`"`)
536538
}
537539
compiler := envList("CC", cfg.DefaultCC(cfg.Goos, cfg.Goarch))
@@ -568,14 +570,19 @@ func gccgoPkgpath(p *load.Package) string {
568570
return p.ImportPath
569571
}
570572

571-
func gccgoCleanPkgpath(p *load.Package) string {
572-
clean := func(r rune) rune {
573-
switch {
574-
case 'A' <= r && r <= 'Z', 'a' <= r && r <= 'z',
575-
'0' <= r && r <= '9':
576-
return r
573+
var gccgoToSymbolFuncOnce sync.Once
574+
var gccgoToSymbolFunc func(string) string
575+
576+
func (tools gccgoToolchain) gccgoCleanPkgpath(b *Builder, p *load.Package) string {
577+
gccgoToSymbolFuncOnce.Do(func() {
578+
fn, err := pkgpath.ToSymbolFunc(tools.compiler(), b.WorkDir)
579+
if err != nil {
580+
fmt.Fprintf(os.Stderr, "cmd/go: %v\n", err)
581+
base.SetExitStatus(2)
582+
base.Exit()
577583
}
578-
return '_'
579-
}
580-
return strings.Map(clean, gccgoPkgpath(p))
584+
gccgoToSymbolFunc = fn
585+
})
586+
587+
return gccgoToSymbolFunc(gccgoPkgpath(p))
581588
}

0 commit comments

Comments
 (0)