aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Crawshaw <crawshaw@golang.org>2016-08-04 13:09:29 -0400
committerDavid Crawshaw <crawshaw@golang.org>2016-08-04 17:39:05 +0000
commitf135c326402aaa757aa96aad283a91873d4ae124 (patch)
tree791ec57eeaaba484bbd211c000a97eb4b9cc8465
parent50edddb7383a0e4aef990a085777f958c5d8a2b8 (diff)
downloadgo-f135c326402aaa757aa96aad283a91873d4ae124.tar.gz
go-f135c326402aaa757aa96aad283a91873d4ae124.zip
runtime: initialize hash algs before typemap
When compiling with -buildmode=shared, a map[int32]*_type is created for each extra module mapping duplicate types back to a canonical object. This is done in the function typelinksinit, which is called before the init function that sets up the hash functions for the map implementation. The result is typemap becomes unusable after runtime initialization. The fix in this CL is to move algorithm init before typelinksinit in the runtime setup process. (For 1.8, we may want to turn typemap into a sorted slice of types and use binary search.) Manually tested on GOOS=linux with: GOHOSTARCH=386 GOARCH=386 ./make.bash && \ go install -buildmode=shared std && \ cd ../test && \ go run run.go -linkshared Fixes #16590 Change-Id: Idc08c50cc70d20028276fbf564509d2cd5405210 Reviewed-on: https://go-review.googlesource.com/25469 Run-TryBot: David Crawshaw <crawshaw@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
-rw-r--r--src/runtime/alg.go2
-rw-r--r--src/runtime/proc.go3
2 files changed, 3 insertions, 2 deletions
diff --git a/src/runtime/alg.go b/src/runtime/alg.go
index 66943495b5..147332e1fd 100644
--- a/src/runtime/alg.go
+++ b/src/runtime/alg.go
@@ -289,7 +289,7 @@ var aeskeysched [hashRandomBytes]byte
// used in hash{32,64}.go to seed the hash function
var hashkey [4]uintptr
-func init() {
+func alginit() {
// Install aes hash algorithm if we have the instructions we need
if (GOARCH == "386" || GOARCH == "amd64") &&
GOOS != "nacl" &&
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index 1d00930ac5..e693f7e05f 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -439,7 +439,8 @@ func schedinit() {
stackinit()
mallocinit()
mcommoninit(_g_.m)
- typelinksinit()
+ alginit() // maps must not be used before this call
+ typelinksinit() // uses maps
itabsinit()
msigsave(_g_.m)