[PATCH] [llgo] Use the object's package to mangle method names, rather than the receiver's package

Peter Collingbourne peter at pcc.me.uk
Tue Dec 16 12:05:53 PST 2014


REPOSITORY
  rL LLVM

http://reviews.llvm.org/D6673

Files:
  llgo/trunk/irgen/typemap.go
  llgo/trunk/test/irgen/Inputs/mangling-synthetic-p.go
  llgo/trunk/test/irgen/mangling-dot.go
  llgo/trunk/test/irgen/mangling-synthetic.go
  llgo/trunk/test/irgen/mangling.go

Index: llgo/trunk/test/irgen/mangling.go
===================================================================
--- llgo/trunk/test/irgen/mangling.go
+++ llgo/trunk/test/irgen/mangling.go
@@ -1,7 +0,0 @@
-// RUN: llgo -fgo-pkgpath=llvm.org/llvm -S -emit-llvm -o - %s | FileCheck %s
-
-package llvm
-
-// CHECK: @llvm_org_llvm.F
-func F() {
-}
Index: llgo/trunk/test/irgen/Inputs/mangling-synthetic-p.go
===================================================================
--- llgo/trunk/test/irgen/Inputs/mangling-synthetic-p.go
+++ llgo/trunk/test/irgen/Inputs/mangling-synthetic-p.go
@@ -0,0 +1,4 @@
+package p
+
+type U struct{}
+func (U) f()
Index: llgo/trunk/test/irgen/mangling-dot.go
===================================================================
--- llgo/trunk/test/irgen/mangling-dot.go
+++ llgo/trunk/test/irgen/mangling-dot.go
@@ -0,0 +1,7 @@
+// RUN: llgo -fgo-pkgpath=llvm.org/llvm -S -emit-llvm -o - %s | FileCheck %s
+
+package llvm
+
+// CHECK: @llvm_org_llvm.F
+func F() {
+}
Index: llgo/trunk/test/irgen/mangling-synthetic.go
===================================================================
--- llgo/trunk/test/irgen/mangling-synthetic.go
+++ llgo/trunk/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()
Index: llgo/trunk/irgen/typemap.go
===================================================================
--- llgo/trunk/irgen/typemap.go
+++ llgo/trunk/irgen/typemap.go
@@ -659,21 +659,25 @@
 		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 {

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D6673.17352.patch
Type: text/x-patch
Size: 2699 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141216/ed2e527c/attachment.bin>


More information about the llvm-commits mailing list