]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: use correct package name for stack object symbol
authorKeith Randall <keithr@alum.mit.edu>
Wed, 10 Apr 2019 23:44:46 +0000 (16:44 -0700)
committerKeith Randall <khr@golang.org>
Mon, 22 Apr 2019 17:40:48 +0000 (17:40 +0000)
Stack object generation code was always using the local package name
for its symbol. Normally that doesn't matter, as we usually only
compile functions in the local package. But for wrappers, the compiler
generates functions which live in other packages. When there are two
other packages with identical functions to wrap, the same name appears
twice, and the compiler goes boom.

Fixes #31252

Change-Id: I7026eebabe562cb159b8b6046cf656afd336ba25
Reviewed-on: https://go-review.googlesource.com/c/go/+/171464
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/obj.go
src/cmd/compile/internal/gc/pgen.go
test/fixedbugs/issue31252.dir/a.go [new file with mode: 0644]
test/fixedbugs/issue31252.dir/b.go [new file with mode: 0644]
test/fixedbugs/issue31252.dir/c.go [new file with mode: 0644]
test/fixedbugs/issue31252.dir/main.go [new file with mode: 0644]
test/fixedbugs/issue31252.go [new file with mode: 0644]

index 5630e12ace7d01fed57a8770db43695aa9e34ecb..86d52f50846e731a28aa841c1226bd983fb3861e 100644 (file)
@@ -287,7 +287,7 @@ func addGCLocals() {
                        }
                }
                if x := s.Func.StackObjects; x != nil {
-                       ggloblsym(x, int32(len(x.P)), obj.RODATA|obj.LOCAL)
+                       ggloblsym(x, int32(len(x.P)), obj.RODATA|obj.DUPOK)
                }
        }
 }
index b0ed01947abadf36b8e837a35678df81530c620c..8e4126d7799f243f549a9dad16d8a35807b4cca7 100644 (file)
@@ -266,7 +266,7 @@ func compile(fn *Node) {
                                // Also make sure we allocate a linker symbol
                                // for the stack object data, for the same reason.
                                if fn.Func.lsym.Func.StackObjects == nil {
-                                       fn.Func.lsym.Func.StackObjects = lookup(fmt.Sprintf("%s.stkobj", fn.funcname())).Linksym()
+                                       fn.Func.lsym.Func.StackObjects = Ctxt.Lookup(fn.Func.lsym.Name + ".stkobj")
                                }
                        }
                }
diff --git a/test/fixedbugs/issue31252.dir/a.go b/test/fixedbugs/issue31252.dir/a.go
new file mode 100644 (file)
index 0000000..fa43150
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package a
+
+import "fmt"
+
+type IndexController struct{}
+
+func (this *IndexController) Index(m *string) {
+       fmt.Println(m)
+}
diff --git a/test/fixedbugs/issue31252.dir/b.go b/test/fixedbugs/issue31252.dir/b.go
new file mode 100644 (file)
index 0000000..9bfc0ff
--- /dev/null
@@ -0,0 +1,13 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package b
+
+import "fmt"
+
+type IndexController struct{}
+
+func (this *IndexController) Index(m *string) {
+       fmt.Println(m)
+}
diff --git a/test/fixedbugs/issue31252.dir/c.go b/test/fixedbugs/issue31252.dir/c.go
new file mode 100644 (file)
index 0000000..928c8ee
--- /dev/null
@@ -0,0 +1,26 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package c
+
+import (
+       "a"
+       "b"
+)
+
+type HandlerFunc func(*string)
+
+func RouterInit() {
+       //home API
+       homeIndex := &a.IndexController{}
+       GET("/home/index/index", homeIndex.Index)
+       //admin API
+       adminIndex := &b.IndexController{}
+       GET("/admin/index/index", adminIndex.Index)
+       return
+}
+
+func GET(path string, handlers ...HandlerFunc) {
+       return
+}
diff --git a/test/fixedbugs/issue31252.dir/main.go b/test/fixedbugs/issue31252.dir/main.go
new file mode 100644 (file)
index 0000000..25a7548
--- /dev/null
@@ -0,0 +1,11 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "c"
+
+func main() {
+       c.RouterInit()
+}
diff --git a/test/fixedbugs/issue31252.go b/test/fixedbugs/issue31252.go
new file mode 100644 (file)
index 0000000..973ae1d
--- /dev/null
@@ -0,0 +1,7 @@
+// compiledir
+
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package ignored