aboutsummaryrefslogtreecommitdiff
path: root/libgo
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2020-02-17 18:16:41 -0800
committerIan Lance Taylor <iant@golang.org>2020-02-18 12:03:13 -0800
commit855b4aaeabdcddce04ff9295c4b0e6c7aa6db96b (patch)
tree71d1ac4b10dc34681bd6a1d0598033ff59fa5615 /libgo
parentce7b39d0fc694e5ec80520b7cc76f91a5476d7db (diff)
downloadgcc-855b4aaeabdcddce04ff9295c4b0e6c7aa6db96b.zip
gcc-855b4aaeabdcddce04ff9295c4b0e6c7aa6db96b.tar.gz
gcc-855b4aaeabdcddce04ff9295c4b0e6c7aa6db96b.tar.bz2
cmd/go: update -DGOPKGPATH to use current pkgpath encoding
This will need to be done in the gc version too, probably more cleverly. This version will ensure that the next GCC release works correctly when using the GCC version of the go tool. Updates golang/go#37272 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/219817
Diffstat (limited to 'libgo')
-rw-r--r--libgo/go/cmd/go/internal/work/gccgo.go26
1 files changed, 20 insertions, 6 deletions
diff --git a/libgo/go/cmd/go/internal/work/gccgo.go b/libgo/go/cmd/go/internal/work/gccgo.go
index f6fa17d..63d5c62 100644
--- a/libgo/go/cmd/go/internal/work/gccgo.go
+++ b/libgo/go/cmd/go/internal/work/gccgo.go
@@ -596,14 +596,28 @@ func gccgoPkgpath(p *load.Package) string {
return p.ImportPath
}
+// gccgoCleanPkgpath returns the form of p's pkgpath that gccgo uses
+// for symbol names. This is like gccgoPkgpathToSymbolNew in cmd/cgo/out.go.
func gccgoCleanPkgpath(p *load.Package) string {
- clean := func(r rune) rune {
+ ppath := gccgoPkgpath(p)
+ bsl := []byte{}
+ changed := false
+ for _, c := range []byte(ppath) {
switch {
- case 'A' <= r && r <= 'Z', 'a' <= r && r <= 'z',
- '0' <= r && r <= '9':
- return r
+ case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z',
+ '0' <= c && c <= '9', c == '_':
+ bsl = append(bsl, c)
+ case c == '.':
+ bsl = append(bsl, ".x2e"...)
+ changed = true
+ default:
+ encbytes := []byte(fmt.Sprintf("..z%02x", c))
+ bsl = append(bsl, encbytes...)
+ changed = true
}
- return '_'
}
- return strings.Map(clean, gccgoPkgpath(p))
+ if !changed {
+ return ppath
+ }
+ return string(bsl)
}