runtime: don't call funcPC from a function

The escape analysis support is not yet good enough to avoid escaping
the argument to funcPC.  This causes unnecessary and often harmful
memory allocation.  E.g., (*cpuProfile).addExtra can be called from a
signal handler, and it must not allocate memory.

Move the calls to funcPC to use variables instead.  This was done in
the original migration to using funcPC, but was not done for newer code.

In one case, in signal handling code, use getSigtramp.

Change-Id: I5ad5db0a6750250b2c453d3a5a0a9dafdf53c82c
Reviewed-on: https://go-review.googlesource.com/92735
Reviewed-by: Cherry Zhang <cherryyz@google.com>
diff --git a/libgo/go/runtime/cpuprof.go b/libgo/go/runtime/cpuprof.go
index 91cdf2b..b1a7c3b 100644
--- a/libgo/go/runtime/cpuprof.go
+++ b/libgo/go/runtime/cpuprof.go
@@ -156,8 +156,8 @@
 	if p.lostExtra > 0 {
 		hdr := [1]uint64{p.lostExtra}
 		lostStk := [2]uintptr{
-			funcPC(_LostExternalCode) + sys.PCQuantum,
-			funcPC(_ExternalCode) + sys.PCQuantum,
+			_LostExternalCodePC + sys.PCQuantum,
+			_ExternalCodePC + sys.PCQuantum,
 		}
 		cpuprof.log.write(nil, 0, hdr[:], lostStk[:])
 		p.lostExtra = 0
@@ -167,8 +167,8 @@
 func (p *cpuProfile) addLostAtomic64(count uint64) {
 	hdr := [1]uint64{count}
 	lostStk := [2]uintptr{
-		funcPC(_LostSIGPROFDuringAtomic64) + sys.PCQuantum,
-		funcPC(_System) + sys.PCQuantum,
+		_LostSIGPROFDuringAtomic64PC + sys.PCQuantum,
+		_SystemPC + sys.PCQuantum,
 	}
 	cpuprof.log.write(nil, 0, hdr[:], lostStk[:])
 }
diff --git a/libgo/go/runtime/proc.go b/libgo/go/runtime/proc.go
index 2972daa..edf4140 100644
--- a/libgo/go/runtime/proc.go
+++ b/libgo/go/runtime/proc.go
@@ -3369,7 +3369,9 @@
 
 var _SystemPC = funcPC(_System)
 var _ExternalCodePC = funcPC(_ExternalCode)
+var _LostExternalCodePC = funcPC(_LostExternalCode)
 var _GCPC = funcPC(_GC)
+var _LostSIGPROFDuringAtomic64PC = funcPC(_LostSIGPROFDuringAtomic64)
 
 // Called if we receive a SIGPROF signal.
 // Called by the signal handler, may run during STW.
@@ -3469,7 +3471,7 @@
 	if prof.hz != 0 {
 		stk := []uintptr{
 			pc,
-			funcPC(_ExternalCode) + sys.PCQuantum,
+			_ExternalCodePC + sys.PCQuantum,
 		}
 		cpuprof.addNonGo(stk)
 	}
diff --git a/libgo/go/runtime/signal_unix.go b/libgo/go/runtime/signal_unix.go
index 02d5348..a8f77fa 100644
--- a/libgo/go/runtime/signal_unix.go
+++ b/libgo/go/runtime/signal_unix.go
@@ -245,7 +245,7 @@
 		// Enable the Go signal handler if not enabled.
 		if atomic.Cas(&handlingSig[_SIGPROF], 0, 1) {
 			atomic.Storeuintptr(&fwdSig[_SIGPROF], getsig(_SIGPROF))
-			setsig(_SIGPROF, funcPC(sighandler))
+			setsig(_SIGPROF, getSigtramp())
 		}
 	} else {
 		// If the Go signal handler should be disabled by default,