• 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
map_test.go 12.4 KB