summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2018-01-25 23:10:35 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2018-01-25 23:10:35 +0000
commita14e122ae2ecf27a8cace7e0d1dda8606d5e4eca (patch)
treee7d8639d02f527aa3613c5443f0d7df1e358d02e
parent9aba6f77b481d555ea7c3d24911011be013dbc0b (diff)
compiler: deref receiver types in mangled names
This was the original intent, as reflected in the long comment at the start of names.cc, but I forgot to implement it. Also, remove a leading ".0" from the final name. That could occur for a method whose receiver type starts with 'u', as in that case we prepend a space to the mangled name, to avoid confusion with the Unicode mangling, and the space turns into ".0". Also, if the Unicode encoding would cause the final to start with "..u" or "..U", add a leading underscore. Patch gotest to not get fooled by some names. The result of these changes is that all symbols start with a letter or an underscore. Reviewed-on: https://go-review.googlesource.com/90015 From-SVN: r257068
-rw-r--r--gcc/go/gofrontend/MERGE2
-rw-r--r--gcc/go/gofrontend/go-encode-id.cc25
-rw-r--r--gcc/go/gofrontend/names.cc13
-rw-r--r--libgo/go/runtime/pprof/pprof_test.go2
-rwxr-xr-xlibgo/testsuite/gotest2
5 files changed, 24 insertions, 20 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index adee9cce151..038a8e8c2c1 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-553e04735d1be372c596c720bcaea27e050b13a6
+203cbe7d3820fa03c965a01f72461f71588fe952
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 ec5c37fc40e..e130ba1a08e 100644
--- a/gcc/go/gofrontend/go-encode-id.cc
+++ b/gcc/go/gofrontend/go-encode-id.cc
@@ -104,6 +104,14 @@ go_encode_id(const std::string &id)
std::string ret;
const char* p = id.c_str();
const char* pend = p + id.length();
+
+ // A leading ".0" is a space introduced before a mangled type name
+ // that starts with a 'u' or 'U', to avoid confusion with the
+ // mangling used here. We don't need a leading ".0", and we don't
+ // want symbols that start with '.', so remove it.
+ if (p[0] == '.' && p[1] == '0')
+ p += 2;
+
while (p < pend)
{
unsigned int c;
@@ -115,16 +123,19 @@ go_encode_id(const std::string &id)
go_assert(!char_needs_encoding(c));
ret += c;
}
- else if (c < 0x10000)
- {
- char buf[16];
- snprintf(buf, sizeof buf, "..u%04x", c);
- ret += buf;
- }
else
{
char buf[16];
- snprintf(buf, sizeof buf, "..U%08x", c);
+ if (c < 0x10000)
+ snprintf(buf, sizeof buf, "..u%04x", c);
+ else
+ snprintf(buf, sizeof buf, "..U%08x", c);
+
+ // We don't want a symbol to start with '.', so add a prefix
+ // if needed.
+ if (ret.empty())
+ ret += '_';
+
ret += buf;
}
p += len;
diff --git a/gcc/go/gofrontend/names.cc b/gcc/go/gofrontend/names.cc
index eb18f81cc16..2e36a1d3262 100644
--- a/gcc/go/gofrontend/names.cc
+++ b/gcc/go/gofrontend/names.cc
@@ -213,7 +213,7 @@ Gogo::function_asm_name(const std::string& go_name, const Package* package,
{
std::string ret;
if (rtype != NULL)
- ret = rtype->mangled_name(this);
+ ret = rtype->deref()->mangled_name(this);
else if (package == NULL)
ret = this->pkgpath_symbol();
else
@@ -892,14 +892,7 @@ Named_type::append_mangled_type_name(Gogo* gogo, bool use_alias,
const Typed_identifier* rcvr =
this->in_function_->func_value()->type()->receiver();
if (rcvr != NULL)
- {
- std::string m = rcvr->type()->mangled_name(gogo);
- // Turn a leading ".1" back into "*" since we are going
- // to type-mangle this name again.
- if (m.compare(0, 2, ".1") == 0)
- m = "*" + m.substr(2);
- ret->append(m);
- }
+ ret->append(rcvr->type()->deref()->mangled_name(gogo));
else if (this->in_function_->package() == NULL)
ret->append(gogo->pkgpath_symbol());
else
@@ -956,7 +949,7 @@ Gogo::type_descriptor_name(Type* type, Named_type* nt)
const Typed_identifier* rcvr =
in_function->func_value()->type()->receiver();
if (rcvr != NULL)
- ret.append(rcvr->type()->mangled_name(this));
+ ret.append(rcvr->type()->deref()->mangled_name(this));
else if (in_function->package() == NULL)
ret.append(this->pkgpath_symbol());
else
diff --git a/libgo/go/runtime/pprof/pprof_test.go b/libgo/go/runtime/pprof/pprof_test.go
index ae6ec6d0cfc..07a7946f44f 100644
--- a/libgo/go/runtime/pprof/pprof_test.go
+++ b/libgo/go/runtime/pprof/pprof_test.go
@@ -730,7 +730,7 @@ func TestMutexProfile(t *testing.T) {
stks := stacks(p)
for _, want := range [][]string{
// {"sync.(*Mutex).Unlock", "pprof.blockMutex.func1"},
- {".1sync.Mutex.Unlock", "pprof.blockMutex..func1"},
+ {"sync.Mutex.Unlock", "pprof.blockMutex..func1"},
} {
if !containsStack(stks, want) {
t.Errorf("No matching stack entry for %+v", want)
diff --git a/libgo/testsuite/gotest b/libgo/testsuite/gotest
index 8ec12cd1667..1b23b6d0fc7 100755
--- a/libgo/testsuite/gotest
+++ b/libgo/testsuite/gotest
@@ -518,7 +518,7 @@ localname() {
pattern='Test([^a-z].*)?'
# The -p option tells GNU nm not to sort.
# The -v option tells Solaris nm to sort by value.
- tests=$($NM -p -v _gotest_.o $xofile | egrep " $text .*\."$pattern'$' | grep -v '\..*\..*\.' | fgrep -v '$' | fgrep -v ' __go_' | sed 's/.* //' | $symtogo)
+ tests=$($NM -p -v _gotest_.o $xofile | egrep " $text .*\."$pattern'$' | grep -v '\..*\.' | fgrep -v '$' | fgrep -v ' __go_' | sed 's/.* //' | $symtogo)
if [ "x$tests" = x ]; then
echo 'gotest: warning: no tests matching '$pattern in _gotest_.o $xofile 1>&2
exit 2