• Austin Clements's avatar
    cmd/internal/obj/arm: fix/rationalize checkpool distance check · 1b44167d
    Austin Clements authored
    When deciding whether to flush the constant pool, the distance check
    in checkpool can fail to account for padding inserted before the next
    instruction by nacl.
    
    For example, see this failure:
    https://go-review.googlesource.com/c/go/+/109350/2#message-07085b591227824bb1d646a7192cbfa7e0b97066
    Here, the pool should be flushed before a CALL instruction, but
    checkpool only considers the CALL instruction to be 4 bytes and
    doesn't account for the 8 extra bytes of alignment padding added
    before it by asmoutnacl. As a result, it flushes the pool after the
    CALL instruction, which is 4 bytes too late.
    
    Furthermore, there's no explanation for the rather convoluted
    expression used to decide if we need to emit the constant pool.
    
    This CL modifies checkpool to take the PC following the tentative
    instruction as an argument. The caller knows this already and this way
    checkpool doesn't have to guess (and get it wrong in the presence of
    padding). In the process, it rewrites the test to be structured and
    commented.
    
    Change-Id: I32a3d50ffb5a94d42be943e9bcd49036c7e9b95c
    Reviewed-on: https://go-review.googlesource.com/110017
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarCherry Zhang <cherryyz@google.com>
    1b44167d
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...