]> Cypherpunks repositories - gostls13.git/commit
cmd/compile: change the way we handle large map values
authorKeith Randall <khr@golang.org>
Tue, 19 Apr 2016 15:31:04 +0000 (08:31 -0700)
committerKeith Randall <khr@golang.org>
Wed, 20 Apr 2016 21:15:31 +0000 (21:15 +0000)
commit60fd32a47fdffb95d3646c9fc75acc9beff67183
tree023c05b1c3d7aa5a62a9c7c0e527b280435ad2f7
parentbc33dd7432369b3abd2a6fd75cb57d6c5c3defa7
cmd/compile: change the way we handle large map values

mapaccess{1,2} returns a pointer to the value.  When the key
is not in the map, it returns a pointer to zeroed memory.
Currently, for large map values we have a complicated scheme which
dynamically allocates zeroed memory for this purpose.  It is ugly
code and requires an atomic.Load in a bunch of places we'd rather
not have it.

Switch to a scheme where callsites of mapaccess{1,2} which expect
large return values pass in a pointer to zeroed memory that
mapaccess can return if the key is not found.  This avoids the
atomic.Load on all map accesses with a few extra instructions only
for the large value acccesses, plus a bit of bss space.

There was a time (1.4 & 1.5?) where we did something like this but
all the tricks to make the right size zero value were done by the
linker.  That scheme broke in the presence of dyamic linking.
The scheme in this CL works even when dynamic linking.

Fixes #12337

Change-Id: Ic2d0319944af33bbb59785938d9ab80958d1b4b1
Reviewed-on: https://go-review.googlesource.com/22221
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Hudson-Doyle <michael.hudson@canonical.com>
src/cmd/compile/internal/gc/builtin.go
src/cmd/compile/internal/gc/builtin/runtime.go
src/cmd/compile/internal/gc/go.go
src/cmd/compile/internal/gc/main.go
src/cmd/compile/internal/gc/obj.go
src/cmd/compile/internal/gc/reflect.go
src/cmd/compile/internal/gc/walk.go
src/runtime/hashmap.go
src/runtime/hashmap_fast.go
src/runtime/map_test.go