• Cherry Zhang's avatar
    cmd/link: insert trampolines for too-far jumps on ARM · 7c431cb7
    Cherry Zhang authored
    ARM direct CALL/JMP instruction has 24 bit offset, which can only
    encodes jumps within +/-32M. When the target is too far, the top
    bits get truncated and the program jumps wild.
    
    This CL detects too-far jumps and automatically insert trampolines,
    currently only internal linking on ARM.
    
    It is necessary to make the following changes to the linker:
    - Resolve direct jump relocs when assigning addresses to functions.
      this allows trampoline insertion without moving all code that
      already laid down.
    - Lay down packages in dependency order, so that when resolving a
      inter-package direct jump reloc, the target address is already
      known. Intra-package jumps are assumed never too far.
    - a linker flag -debugtramp is added for debugging trampolines:
        "-debugtramp=1 -v" prints trampoline debug message
        "-debugtramp=2"    forces all inter-package jump to use
                           trampolines (currently ARM only)
        "-debugtramp=2 -v" does both
    - Some data structures are changed for bookkeeping.
    
    On ARM, pseudo DIV/DIVU/MOD/MODU instructions now clobber R8
    (unfortunate). In the standard library there is no ARM assembly
    code that uses these instructions, and the compiler no longer emits
    them (CL 29390).
    
    all.bash passes with -debugtramp=2, except a disassembly test (this
    is unavoidable as we changed the instruction).
    
    TBD: debug info of trampolines?
    
    Fixes #17028.
    
    Change-Id: Idcce347ea7e0af77c4079041a160b2f6e114b474
    Reviewed-on: https://go-review.googlesource.com/29397Reviewed-by: 's avatarDavid Crawshaw <crawshaw@golang.org>
    Run-TryBot: Cherry Zhang <cherryyz@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    7c431cb7
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...