runtime: turn divide by zero, nil dereference into panics

tested on linux/amd64, linux/386, linux/arm, darwin/amd64, darwin/386.
freebsd untested; will finish in a separate CL.

for now all the panics are errorStrings.
richer structures can be added as necessary
once the mechanism is shaked out.

R=r
CC=golang-dev
https://golang.org/cl/906041
diff --git a/src/pkg/runtime/darwin/thread.c b/src/pkg/runtime/darwin/thread.c
index 38e3c23..d9acfa8 100644
--- a/src/pkg/runtime/darwin/thread.c
+++ b/src/pkg/runtime/darwin/thread.c
@@ -6,6 +6,8 @@
 #include "defs.h"
 #include "os.h"
 
+extern SigTab sigtab[];
+
 static void
 unimplemented(int8 *name)
 {
@@ -443,3 +445,26 @@
 	}
 }
 
+void
+sigpanic(void)
+{
+	switch(g->sig) {
+	case SIGBUS:
+		if(g->sigcode0 == BUS_ADRERR && g->sigcode1 < 0x1000)
+			panicstring("invalid memory address or nil pointer dereference");
+		break;
+	case SIGSEGV:
+		if((g->sigcode0 == 0 || g->sigcode0 == SEGV_MAPERR) && g->sigcode1 < 0x1000)
+			panicstring("invalid memory address or nil pointer dereference");
+		break;
+	case SIGFPE:
+		switch(g->sigcode0) {
+		case FPE_INTDIV:
+			panicstring("integer divide by zero");
+		case FPE_INTOVF:
+			panicstring("integer overflow");
+		}
+		panicstring("floating point error");
+	}
+	panicstring(sigtab[g->sig].name);
+}