]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: make mapzero not crash on arm
authorRuss Cox <rsc@golang.org>
Fri, 15 May 2015 20:05:52 +0000 (16:05 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 15 May 2015 20:14:41 +0000 (20:14 +0000)
Change-Id: I40e8a4a2e62253233b66f6a2e61e222437292c31
Reviewed-on: https://go-review.googlesource.com/10151
Reviewed-by: Minux Ma <minux@golang.org>
src/runtime/hashmap.go

index 2b3af301b3f7a61f122d50f18b505fd9ca797419..b199330a1e6cfd4b308f45d0123d16b9a4032405 100644 (file)
@@ -1008,6 +1008,18 @@ var zerotiny [1024]byte
 // Types allocated by package reflect are in writable memory and
 // start out with zero set to nil; we initialize those on demand.
 func mapzero(t *_type) {
+       // On ARM, atomicloadp is implemented as xadd(p, 0),
+       // so we cannot use atomicloadp on read-only memory.
+       // Check whether the pointer is in the heap; if not, it's not writable
+       // so the zero value must already be set.
+       if GOARCH == "arm" && !inheap(uintptr(unsafe.Pointer(t))) {
+               if t.zero == nil {
+                       print("runtime: map element ", *t._string, " missing zero value\n")
+                       throw("mapzero")
+               }
+               return
+       }
+
        // Already done?
        // Check without lock, so must use atomicload to sync with atomicstore in allocation case below.
        if atomicloadp(unsafe.Pointer(&t.zero)) != nil {