summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llgo/irgen/typemap.go20
-rw-r--r--llgo/test/irgen/Inputs/mangling-synthetic-p.go4
-rw-r--r--llgo/test/irgen/mangling-dot.go (renamed from llgo/test/irgen/mangling.go)0
-rw-r--r--llgo/test/irgen/mangling-synthetic.go14
4 files changed, 30 insertions, 8 deletions
diff --git a/llgo/irgen/typemap.go b/llgo/irgen/typemap.go
index 29cca053f46..91f4ca4e1c2 100644
--- a/llgo/irgen/typemap.go
+++ b/llgo/irgen/typemap.go
@@ -659,21 +659,25 @@ func (ctx *manglerContext) mangleFunctionName(f *ssa.Function) string {
return b.String()
}
- pkg := f.Pkg
- var pkgobj *types.Package
- if pkg != nil {
- pkgobj = pkg.Object
- } else if f.Signature.Recv() != nil {
- pkgobj = f.Signature.Recv().Pkg()
- } else {
+ // Synthetic bound and thunk functions are special cases; they can only be
+ // distinguished using private data that is only exposed via String().
+ if strings.HasSuffix(f.Name(), "$bound") || strings.HasSuffix(f.Name(), "$thunk") {
b.WriteString(f.String())
return b.String()
}
+ var pkg *types.Package
+ if f.Pkg != nil {
+ pkg = f.Pkg.Object
+ } else if !f.Object().Exported() {
+ pkg = f.Object().Pkg()
+ }
+
if pkg != nil {
- ctx.manglePackagePath(pkgobj.Path(), &b)
+ ctx.manglePackagePath(pkg.Path(), &b)
b.WriteRune('.')
}
+
if f.Signature.Recv() == nil && f.Name() == "init" {
b.WriteString(".import")
} else {
diff --git a/llgo/test/irgen/Inputs/mangling-synthetic-p.go b/llgo/test/irgen/Inputs/mangling-synthetic-p.go
new file mode 100644
index 00000000000..c59588a51ba
--- /dev/null
+++ b/llgo/test/irgen/Inputs/mangling-synthetic-p.go
@@ -0,0 +1,4 @@
+package p
+
+type U struct{}
+func (U) f()
diff --git a/llgo/test/irgen/mangling.go b/llgo/test/irgen/mangling-dot.go
index aff73cb8acb..aff73cb8acb 100644
--- a/llgo/test/irgen/mangling.go
+++ b/llgo/test/irgen/mangling-dot.go
diff --git a/llgo/test/irgen/mangling-synthetic.go b/llgo/test/irgen/mangling-synthetic.go
new file mode 100644
index 00000000000..b88e03742b7
--- /dev/null
+++ b/llgo/test/irgen/mangling-synthetic.go
@@ -0,0 +1,14 @@
+// RUN: llgo -fgo-pkgpath=p -c -o %T/p.o %S/Inputs/mangling-synthetic-p.go
+// RUN: llgo -fgo-pkgpath=q -I %T -S -emit-llvm -o - %s | FileCheck %s
+
+package q
+
+import "p"
+
+// CHECK-DAG: define linkonce_odr void @p.f.N3_q.T(i8*)
+// CHECK-DAG: define linkonce_odr void @p.f.pN3_q.T(i8*)
+type T struct { p.U }
+
+// CHECK-DAG: declare void @q.f.N3_q.T(i8*)
+// CHECK-DAG: define linkonce_odr void @q.f.pN3_q.T(i8*)
+func (T) f()
OpenPOWER on IntegriCloud