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 <iant@golang.org>
diff --git a/misc/cgo/testshared/src/dep/asm.s b/misc/cgo/testshared/src/dep/asm.s
new file mode 100644
index 0000000..8069ebb
--- /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 0000000..552ec30
--- /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 0000000..036296a
--- /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 34fd144..f644776 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 24af94c..65f77d9 100644
--- a/src/cmd/compile/internal/gc/closure.go
+++ b/src/cmd/compile/internal/gc/closure.go
@@ -199,6 +199,7 @@
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 cba8e21..c8864f3 100644
--- a/src/cmd/compile/internal/gc/dcl.go
+++ b/src/cmd/compile/internal/gc/dcl.go
@@ -585,6 +585,10 @@
Fatal("funchdr: dclcontext")
}
+ if importpkg == nil && n.Func.Nname != nil {
+ makefuncsym(n.Func.Nname.Sym)
+ }
+
dclcontext = PAUTO
markdcl()
Funcdepth++
@@ -1489,12 +1493,21 @@
}
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 8fba6cf..95b33e4 100644
--- a/src/runtime/debug/stubs.go
+++ b/src/runtime/debug/stubs.go
@@ -16,5 +16,4 @@
// 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 cd9a223..5ac1c57 100644
--- a/src/runtime/stubs.go
+++ b/src/runtime/stubs.go
@@ -249,7 +249,6 @@
// 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 0000000..cd442e9
--- /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)