runtime: check for findmoduledatap returning nil

The findmoduledatap function will not return nil in ordinary use, but
check for nil to try to avoid crashing when we are already crashing.

Update #11783.

Change-Id: If7b1adb51efab13b4c1a37b6f3c9ad22641a0b56
Reviewed-on: https://go-review.googlesource.com/12391
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go
index 44d08e0..82e6f9f 100644
--- a/src/runtime/symtab.go
+++ b/src/runtime/symtab.go
@@ -223,6 +223,13 @@
 		return -1
 	}
 	datap := findmoduledatap(f.entry) // inefficient
+	if datap == nil {
+		if strict && panicking == 0 {
+			print("runtime: no module data for ", hex(f.entry), "\n")
+			throw("no module data")
+		}
+		return -1
+	}
 	p := datap.pclntable[off:]
 	pc := f.entry
 	val := int32(-1)
@@ -266,6 +273,9 @@
 		return nil
 	}
 	datap := findmoduledatap(f.entry) // inefficient
+	if datap == nil {
+		return nil
+	}
 	return (*byte)(unsafe.Pointer(&datap.pclntable[f.nameoff]))
 }
 
@@ -275,6 +285,9 @@
 
 func funcline1(f *_func, targetpc uintptr, strict bool) (file string, line int32) {
 	datap := findmoduledatap(f.entry) // inefficient
+	if datap == nil {
+		return "?", 0
+	}
 	fileno := int(pcvalue(f, f.pcfile, targetpc, strict))
 	line = pcvalue(f, f.pcln, targetpc, strict)
 	if fileno == -1 || line == -1 || fileno >= len(datap.filetab) {