runtime: introduce, use funcPC to convert Go func to PC

This removes the ** unsafe hack.

Real bug fixed at chan.go:101.

LGTM=dave, r, iant
R=golang-codereviews, dave, r, iant
CC=dvyukov, golang-codereviews, khr
https://golang.org/cl/140870044
diff --git a/src/pkg/runtime/select.go b/src/pkg/runtime/select.go
index dbe0543..6d2531e 100644
--- a/src/pkg/runtime/select.go
+++ b/src/pkg/runtime/select.go
@@ -13,17 +13,10 @@
 )
 
 var (
-	chansendpc uintptr
-	chanrecvpc uintptr
+	chansendpc = funcPC(chansend)
+	chanrecvpc = funcPC(chanrecv)
 )
 
-func init() {
-	f := chansend
-	chansendpc = **(**uintptr)(unsafe.Pointer(&f))
-	g := chanrecv
-	chanrecvpc = **(**uintptr)(unsafe.Pointer(&g))
-}
-
 func selectsize(size uintptr) uintptr {
 	selsize := unsafe.Sizeof(_select{}) +
 		(size-1)*unsafe.Sizeof(_select{}.scase[0]) +
@@ -286,7 +279,6 @@
 		k      *scase
 		sglist *sudog
 		sgnext *sudog
-		fn     func(*g, *_select) bool
 	)
 
 loop:
@@ -371,8 +363,7 @@
 
 	// wait for someone to wake us up
 	gp.param = nil
-	fn = selparkcommit
-	gopark(**(**unsafe.Pointer)(unsafe.Pointer(&fn)), unsafe.Pointer(sel), "select")
+	gopark(unsafe.Pointer(funcPC(selparkcommit)), unsafe.Pointer(sel), "select")
 
 	// someone woke us up
 	sellock(sel)