Commit 1125cd49 authored by Michael Hudson-Doyle's avatar Michael Hudson-Doyle Committed by Ian Lance Taylor

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/12340Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
parent 4db07463
// 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
//+build gccgo
package dep
func ImplementedInAsm() {}
//+build !gccgo
package dep
func ImplementedInAsm()
package main
import "dep"
import (
"dep"
"runtime"
)
func main() {
defer dep.ImplementedInAsm()
runtime.GC()
dep.V = dep.F() + 1
}
......@@ -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)
......
......@@ -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)
}
......@@ -16,5 +16,4 @@ func setMaxThreads(int) int
// Implemented in package runtime.
func readGCStats(*[]time.Duration)
func enableGC(bool) bool
func freeOSMemory()
......@@ -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)
......
// 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)
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