Commit 47370f05 by Ian Lance Taylor

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
parent 36cefd37
ddfb845fad1f2e8b84383f262ed5ea5be7b3e35a f174fdad69cad42309984dfa108d80f2ae8a9f78
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -253,3 +253,16 @@ go_mangle_struct_tag(const std::string& tag) ...@@ -253,3 +253,16 @@ go_mangle_struct_tag(const std::string& tag)
} }
return ret; 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;
}
...@@ -34,4 +34,12 @@ go_selectively_encode_id(const std::string &id); ...@@ -34,4 +34,12 @@ go_selectively_encode_id(const std::string &id);
extern std::string extern std::string
go_mangle_struct_tag(const std::string& tag); 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) #endif // !defined(GO_ENCODE_ID_H)
...@@ -298,7 +298,7 @@ void ...@@ -298,7 +298,7 @@ void
Gogo::set_pkgpath(const std::string& arg) Gogo::set_pkgpath(const std::string& arg)
{ {
go_assert(!this->pkgpath_set_); go_assert(!this->pkgpath_set_);
this->pkgpath_ = arg; this->pkgpath_ = go_mangle_pkgpath(arg);
this->pkgpath_set_ = true; this->pkgpath_set_ = true;
this->pkgpath_from_option_ = true; this->pkgpath_from_option_ = true;
} }
...@@ -396,7 +396,8 @@ Gogo::set_package_name(const std::string& package_name, ...@@ -396,7 +396,8 @@ Gogo::set_package_name(const std::string& package_name,
{ {
if (!this->prefix_from_option_) if (!this->prefix_from_option_)
this->prefix_ = "go"; 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_) + '.' this->pkgpath_symbol_ = (Gogo::pkgpath_for_symbol(this->prefix_) + '.'
+ Gogo::pkgpath_for_symbol(package_name)); + Gogo::pkgpath_for_symbol(package_name));
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment