• Josh Bleecher Snyder's avatar
    cmd/compile: don't update outer variables after capturevars is complete · 61336b78
    Josh Bleecher Snyder authored
    When compiling concurrently, we walk all functions before compiling
    any of them. Walking functions can cause variables to switch from
    being non-addrtaken to addrtaken, e.g. to prepare for a runtime call.
    Typechecking propagates addrtaken-ness of closure variables to
    their outer variables, so that capturevars can decide whether to
    pass the variable's value or a pointer to it.
    
    When all functions are compiled immediately, as long as the containing
    function is compiled prior to the closure, this propagation has no effect.
    When compilation is deferred, though, in rare cases, this results in 
    a change in the addrtaken-ness of a variable in the outer function,
    which in turn changes the compiler's output.
    (This is rare because in a great many cases, a temporary has been
    introduced, insulating the outer variable from modification.)
    But concurrent compilation must generate identical results.
    
    To fix this, track whether capturevars has run.
    If it has, there is no need to update outer variables
    when closure variables change.
    Capturevars always runs before any functions are walked or compiled.
    
    The remainder of the changes in this CL are to support the test.
    In particular, -d=compilelater forces the compiler to walk all
    functions before compiling any of them, despite being non-concurrent.
    This is useful because -live is fundamentally incompatible with
    concurrent compilation, but we want -c=1 to have no behavior changes.
    
    Fixes #20250
    
    Change-Id: I89bcb54268a41e8588af1ac8cc37fbef856a90c2
    Reviewed-on: https://go-review.googlesource.com/42853
    Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
    61336b78
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...
plugin 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 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...
cmp.bash 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...