From 1125cd4997597e4ca3acf3fa71ce1e3c3cd0605f Mon Sep 17 00:00:00 2001 From: Michael Hudson-Doyle Date: Wed, 15 Jul 2015 11:31:30 +1200 Subject: [PATCH] cmd/compile: define func value symbols at declaration This is mostly Russ's https://golang.org/cl/12145 but with some extra fixes to account for the fact that function declarations without implementations now break shared libraries, and including my test case. Fixes #11480. Change-Id: Iabdc2934a0378e5025e4e7affadb535eaef2c8f1 Reviewed-on: https://go-review.googlesource.com/12340 Reviewed-by: Ian Lance Taylor --- misc/cgo/testshared/src/dep/asm.s | 10 ++++++++++ misc/cgo/testshared/src/dep/gccgo.go | 5 +++++ misc/cgo/testshared/src/dep/stubs.go | 5 +++++ misc/cgo/testshared/src/exe/exe.go | 7 ++++++- src/cmd/compile/internal/gc/closure.go | 1 + src/cmd/compile/internal/gc/dcl.go | 25 +++++++++++++++++++------ src/runtime/debug/stubs.go | 1 - src/runtime/stubs.go | 1 - src/runtime/stubs32.go | 14 ++++++++++++++ 9 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 misc/cgo/testshared/src/dep/asm.s create mode 100644 misc/cgo/testshared/src/dep/gccgo.go create mode 100644 misc/cgo/testshared/src/dep/stubs.go create mode 100644 src/runtime/stubs32.go diff --git a/misc/cgo/testshared/src/dep/asm.s b/misc/cgo/testshared/src/dep/asm.s new file mode 100644 index 0000000000..8069ebb749 --- /dev/null +++ b/misc/cgo/testshared/src/dep/asm.s @@ -0,0 +1,10 @@ +// Copyright 2014 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. + +//+build !gccgo + +#include "textflag.h" + +TEXT ·ImplementedInAsm(SB),NOSPLIT,$0-0 + RET diff --git a/misc/cgo/testshared/src/dep/gccgo.go b/misc/cgo/testshared/src/dep/gccgo.go new file mode 100644 index 0000000000..552ec303fa --- /dev/null +++ b/misc/cgo/testshared/src/dep/gccgo.go @@ -0,0 +1,5 @@ +//+build gccgo + +package dep + +func ImplementedInAsm() {} diff --git a/misc/cgo/testshared/src/dep/stubs.go b/misc/cgo/testshared/src/dep/stubs.go new file mode 100644 index 0000000000..036296a2fc --- /dev/null +++ b/misc/cgo/testshared/src/dep/stubs.go @@ -0,0 +1,5 @@ +//+build !gccgo + +package dep + +func ImplementedInAsm() diff --git a/misc/cgo/testshared/src/exe/exe.go b/misc/cgo/testshared/src/exe/exe.go index 34fd144632..f64477613a 100644 --- a/misc/cgo/testshared/src/exe/exe.go +++ b/misc/cgo/testshared/src/exe/exe.go @@ -1,7 +1,12 @@ package main -import "dep" +import ( + "dep" + "runtime" +) func main() { + defer dep.ImplementedInAsm() + runtime.GC() dep.V = dep.F() + 1 } diff --git a/src/cmd/compile/internal/gc/closure.go b/src/cmd/compile/internal/gc/closure.go index 24af94c0cd..65f77d9079 100644 --- a/src/cmd/compile/internal/gc/closure.go +++ b/src/cmd/compile/internal/gc/closure.go @@ -199,6 +199,7 @@ func makeclosure(func_ *Node) *Node { xfunc.Func.Nname.Name.Funcdepth = func_.Func.Depth xfunc.Func.Depth = func_.Func.Depth xfunc.Func.Endlineno = func_.Func.Endlineno + makefuncsym(xfunc.Func.Nname.Sym) xfunc.Nbody = func_.Nbody xfunc.Func.Dcl = concat(func_.Func.Dcl, xfunc.Func.Dcl) diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go index cba8e21705..c8864f305e 100644 --- a/src/cmd/compile/internal/gc/dcl.go +++ b/src/cmd/compile/internal/gc/dcl.go @@ -585,6 +585,10 @@ func funchdr(n *Node) { Fatal("funchdr: dclcontext") } + if importpkg == nil && n.Func.Nname != nil { + makefuncsym(n.Func.Nname.Sym) + } + dclcontext = PAUTO markdcl() Funcdepth++ @@ -1489,12 +1493,21 @@ func funcsym(s *Sym) *Sym { } s1 := Pkglookup(s.Name+"·f", s.Pkg) - if s1.Def == nil { - s1.Def = newfuncname(s1) - s1.Def.Func.Shortname = newname(s) - funcsyms = list(funcsyms, s1.Def) - } s.Fsym = s1 - return s1 } + +func makefuncsym(s *Sym) { + if isblanksym(s) { + return + } + if compiling_runtime != 0 && s.Name == "getg" { + // runtime.getg() is not a real function and so does + // not get a funcsym. + return + } + s1 := funcsym(s) + s1.Def = newfuncname(s1) + s1.Def.Func.Shortname = newname(s) + funcsyms = list(funcsyms, s1.Def) +} diff --git a/src/runtime/debug/stubs.go b/src/runtime/debug/stubs.go index 8fba6cf34b..95b33e4da6 100644 --- a/src/runtime/debug/stubs.go +++ b/src/runtime/debug/stubs.go @@ -16,5 +16,4 @@ func setMaxThreads(int) int // Implemented in package runtime. func readGCStats(*[]time.Duration) -func enableGC(bool) bool func freeOSMemory() diff --git a/src/runtime/stubs.go b/src/runtime/stubs.go index cd9a22336f..5ac1c57e3f 100644 --- a/src/runtime/stubs.go +++ b/src/runtime/stubs.go @@ -249,7 +249,6 @@ func time_now() (sec int64, nsec int32) // in asm_*.s // not called directly; definitions here supply type information for traceback. -func call16(fn, arg unsafe.Pointer, n, retoffset uint32) func call32(fn, arg unsafe.Pointer, n, retoffset uint32) func call64(fn, arg unsafe.Pointer, n, retoffset uint32) func call128(fn, arg unsafe.Pointer, n, retoffset uint32) diff --git a/src/runtime/stubs32.go b/src/runtime/stubs32.go new file mode 100644 index 0000000000..cd442e92dc --- /dev/null +++ b/src/runtime/stubs32.go @@ -0,0 +1,14 @@ +// Copyright 2015 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. + +// +build 386 arm amd64p32 + +package runtime + +import "unsafe" + +// Declarations for runtime services implemented in C or assembly that +// are only present on 32 bit systems. + +func call16(fn, arg unsafe.Pointer, n, retoffset uint32) -- 2.50.0