Commit a17d0911 authored by Keith Randall's avatar Keith Randall Committed by Andrew Bonventre

[release-branch.go1.12] cmd/compile: use correct package name for stack object symbol

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 #31396

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: default avatarMatthew Dempsky <mdempsky@google.com>
(cherry picked from commit 43001a0d)
Reviewed-on: https://go-review.googlesource.com/c/go/+/173317Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent dc6db5f4
......@@ -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)
}
}
}
......
......@@ -267,7 +267,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")
}
}
}
......
// 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)
}
// 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)
}
// 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
}
// 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()
}
// 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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment