go/ssa: make Builtin capable of representing non-spec-defined intrinsics.

Also, define ssa:wrapnilchk intrinsic to check and gracefully
fail when a T method is dynamically invoked via a nil *T receiver.
+ Test.

A follow-up CL will add another intrinsic, ssa:memclr.

+ minor cleanups.

LGTM=gri
R=gri
CC=golang-codereviews
https://golang.org/cl/101170044
diff --git a/go/pointer/gen.go b/go/pointer/gen.go
index 850591f..bcb7448 100644
--- a/go/pointer/gen.go
+++ b/go/pointer/gen.go
@@ -531,7 +531,7 @@
 // genBuiltinCall generates contraints for a call to a built-in.
 func (a *analysis) genBuiltinCall(instr ssa.CallInstruction, cgn *cgnode) {
 	call := instr.Common()
-	switch call.Value.(*ssa.Builtin).Object().Name() {
+	switch call.Value.(*ssa.Builtin).Name() {
 	case "append":
 		// Safe cast: append cannot appear in a go or defer statement.
 		a.genAppend(instr.(*ssa.Call), cgn)
@@ -553,6 +553,9 @@
 		// to its arg, so make sure we create nodes for it.
 		a.valueNode(call.Args[0])
 
+	case "ssa:wrapnilchk":
+		a.copy(a.valueNode(instr.Value()), a.valueNode(call.Args[0]), 1)
+
 	default:
 		// No-ops: close len cap real imag complex print println delete.
 	}