diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2019-10-12 01:06:43 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2019-10-12 01:06:43 +0000 |
commit | 47370f050940a2e140e89fc0d46e808fab206f04 (patch) | |
tree | db8d3f678ba5fd8a4c6bd397af5a5c4e0d55f4bd | |
parent | 36cefd37da8b7819b10664f6c740e6a839b3ea08 (diff) | |
download | gcc-47370f050940a2e140e89fc0d46e808fab206f04.zip gcc-47370f050940a2e140e89fc0d46e808fab206f04.tar.gz gcc-47370f050940a2e140e89fc0d46e808fab206f04.tar.bz2 |
compiler: mangle dots in pkgpath
We need to mangle dots to avoid problems with -fgo-pkgpath=a.0.
That will confuse the name mangling, which assumes that names
entering the mangling cannot contain arbitrary dot characters.
We don't need to mangle other characters; go_encode_id will handle them.
Fixes golang/go#33871
Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/200838
From-SVN: r276913
-rw-r--r-- | gcc/go/gofrontend/MERGE | 2 | ||||
-rw-r--r-- | gcc/go/gofrontend/go-encode-id.cc | 13 | ||||
-rw-r--r-- | gcc/go/gofrontend/go-encode-id.h | 8 | ||||
-rw-r--r-- | gcc/go/gofrontend/gogo.cc | 5 |
4 files changed, 25 insertions, 3 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 1508eb1..1c90e55 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -ddfb845fad1f2e8b84383f262ed5ea5be7b3e35a +f174fdad69cad42309984dfa108d80f2ae8a9f78 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/go-encode-id.cc b/gcc/go/gofrontend/go-encode-id.cc index 7c7aa13..550da97 100644 --- a/gcc/go/gofrontend/go-encode-id.cc +++ b/gcc/go/gofrontend/go-encode-id.cc @@ -253,3 +253,16 @@ go_mangle_struct_tag(const std::string& tag) } return ret; } + +// Encode a package path. + +std::string +go_mangle_pkgpath(const std::string& pkgpath) +{ + std::string s = pkgpath; + for (size_t i = s.find('.'); + i != std::string::npos; + i = s.find('.', i + 1)) + s.replace(i, 1, ".x2e"); // 0x2e is the ASCII encoding for '.' + return s; +} diff --git a/gcc/go/gofrontend/go-encode-id.h b/gcc/go/gofrontend/go-encode-id.h index 70126ba..2d09b0c 100644 --- a/gcc/go/gofrontend/go-encode-id.h +++ b/gcc/go/gofrontend/go-encode-id.h @@ -34,4 +34,12 @@ go_selectively_encode_id(const std::string &id); extern std::string go_mangle_struct_tag(const std::string& tag); +// Encode a package path. A package path can contain any arbitrary +// character, including '.'. go_encode_id expects that any '.' will +// be inserted by name mangling in a controlled manner. So first +// translate any '.' using the same .x encoding as used by +// go_mangle_struct_tag. +extern std::string +go_mangle_pkgpath(const std::string& pkgpath); + #endif // !defined(GO_ENCODE_ID_H) diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc index a79cfc3..1ee49dc 100644 --- a/gcc/go/gofrontend/gogo.cc +++ b/gcc/go/gofrontend/gogo.cc @@ -298,7 +298,7 @@ void Gogo::set_pkgpath(const std::string& arg) { go_assert(!this->pkgpath_set_); - this->pkgpath_ = arg; + this->pkgpath_ = go_mangle_pkgpath(arg); this->pkgpath_set_ = true; this->pkgpath_from_option_ = true; } @@ -396,7 +396,8 @@ Gogo::set_package_name(const std::string& package_name, { if (!this->prefix_from_option_) this->prefix_ = "go"; - this->pkgpath_ = this->prefix_ + '.' + package_name; + this->pkgpath_ = (go_mangle_pkgpath(this->prefix_) + '.' + + package_name); this->pkgpath_symbol_ = (Gogo::pkgpath_for_symbol(this->prefix_) + '.' + Gogo::pkgpath_for_symbol(package_name)); } |