@@ -11,11 +11,13 @@ import (
11
11
"os/exec"
12
12
"path/filepath"
13
13
"strings"
14
+ "sync"
14
15
15
16
"cmd/go/internal/base"
16
17
"cmd/go/internal/cfg"
17
18
"cmd/go/internal/load"
18
19
"cmd/go/internal/str"
20
+ "cmd/internal/pkgpath"
19
21
)
20
22
21
23
// The Gccgo toolchain.
@@ -174,7 +176,7 @@ func (tools gccgoToolchain) asm(b *Builder, a *Action, sfiles []string) ([]strin
174
176
ofiles = append (ofiles , ofile )
175
177
sfile = mkAbs (p .Dir , sfile )
176
178
defs := []string {"-D" , "GOOS_" + cfg .Goos , "-D" , "GOARCH_" + cfg .Goarch }
177
- if pkgpath := gccgoCleanPkgpath (p ); pkgpath != "" {
179
+ if pkgpath := tools . gccgoCleanPkgpath (b , p ); pkgpath != "" {
178
180
defs = append (defs , `-D` , `GOPKGPATH=` + pkgpath )
179
181
}
180
182
defs = tools .maybePIC (defs )
@@ -531,7 +533,7 @@ func (tools gccgoToolchain) cc(b *Builder, a *Action, ofile, cfile string) error
531
533
cfile = mkAbs (p .Dir , cfile )
532
534
defs := []string {"-D" , "GOOS_" + cfg .Goos , "-D" , "GOARCH_" + cfg .Goarch }
533
535
defs = append (defs , b .gccArchArgs ()... )
534
- if pkgpath := gccgoCleanPkgpath (p ); pkgpath != "" {
536
+ if pkgpath := tools . gccgoCleanPkgpath (b , p ); pkgpath != "" {
535
537
defs = append (defs , `-D` , `GOPKGPATH="` + pkgpath + `"` )
536
538
}
537
539
compiler := envList ("CC" , cfg .DefaultCC (cfg .Goos , cfg .Goarch ))
@@ -568,14 +570,19 @@ func gccgoPkgpath(p *load.Package) string {
568
570
return p .ImportPath
569
571
}
570
572
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 ()
577
583
}
578
- return '_'
579
- }
580
- return strings .Map (clean , gccgoPkgpath (p ))
584
+ gccgoToSymbolFunc = fn
585
+ })
586
+
587
+ return gccgoToSymbolFunc (gccgoPkgpath (p ))
581
588
}
0 commit comments