diff options
-rw-r--r-- | llgo/irgen/typemap.go | 20 | ||||
-rw-r--r-- | llgo/test/irgen/Inputs/mangling-synthetic-p.go | 4 | ||||
-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.go | 14 |
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() |