cmd/compile: define func value symbols at declaration

These used to be defined at use, but that breaks when shared libraries
are involved.

For #11480.

Change-Id: I416a848754fb615c0d75f9f0ccc00723d07f7f01
Reviewed-on: https://go-review.googlesource.com/12145
Reviewed-by: Rob Pike <r@golang.org>
diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go
index cba8e21..0cb04ee 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,16 @@
 	}
 
 	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
+	}
+	s1 := funcsym(s)
+	s1.Def = newfuncname(s1)
+	s1.Def.Func.Shortname = newname(s)
+	funcsyms = list(funcsyms, s1.Def)
+}