• Keith Randall's avatar
    cmd/compile: change the way we handle large map values · 60fd32a4
    Keith Randall authored
    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: 's avatarMichael Hudson-Doyle <michael.hudson@canonical.com>
    60fd32a4
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang.org/x/net/http2/hpack Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...