]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: define func value symbols at declaration
authorMichael Hudson-Doyle <michael.hudson@canonical.com>
Tue, 14 Jul 2015 23:31:30 +0000 (11:31 +1200)
committerIan Lance Taylor <iant@golang.org>
Mon, 20 Jul 2015 00:50:46 +0000 (00:50 +0000)
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>
misc/cgo/testshared/src/dep/asm.s [new file with mode: 0644]
misc/cgo/testshared/src/dep/gccgo.go [new file with mode: 0644]
misc/cgo/testshared/src/dep/stubs.go [new file with mode: 0644]
misc/cgo/testshared/src/exe/exe.go
src/cmd/compile/internal/gc/closure.go
src/cmd/compile/internal/gc/dcl.go
src/runtime/debug/stubs.go
src/runtime/stubs.go
src/runtime/stubs32.go [new file with mode: 0644]

diff --git a/misc/cgo/testshared/src/dep/asm.s b/misc/cgo/testshared/src/dep/asm.s
new file mode 100644 (file)
index 0000000..8069ebb
--- /dev/null
@@ -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 (file)
index 0000000..552ec30
--- /dev/null
@@ -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 (file)
index 0000000..036296a
--- /dev/null
@@ -0,0 +1,5 @@
+//+build !gccgo
+
+package dep
+
+func ImplementedInAsm()
index 34fd1446325c543bd1db390a436eccce3b09dd3d..f64477613a853c74664e190b05c60fa377a42a0d 100644 (file)
@@ -1,7 +1,12 @@
 package main
 
-import "dep"
+import (
+       "dep"
+       "runtime"
+)
 
 func main() {
+       defer dep.ImplementedInAsm()
+       runtime.GC()
        dep.V = dep.F() + 1
 }
index 24af94c0cda3a65c6161d4c15c2185858c18fa4e..65f77d9079924f17756ab825248f83a68bde8d38 100644 (file)
@@ -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)
index cba8e21705f050c448f825713f86ef00c1591e71..c8864f305e21b0f68045af6a2bea9cc2f37c226b 100644 (file)
@@ -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)
+}
index 8fba6cf34b759adda2dceea4cd13f07ef43088d7..95b33e4da6c97af2e27f1b79413de4faa983dd9d 100644 (file)
@@ -16,5 +16,4 @@ func setMaxThreads(int) int
 
 // Implemented in package runtime.
 func readGCStats(*[]time.Duration)
-func enableGC(bool) bool
 func freeOSMemory()
index cd9a22336f05aa368d92beff9ef1aac773ae9a00..5ac1c57e3f82eb31fbe90092eaf801f18ab49236 100644 (file)
@@ -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 (file)
index 0000000..cd442e9
--- /dev/null
@@ -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)