• Gustavo Niemeyer's avatar
    6l: Relocate CMOV* instructions · 1a472026
    Gustavo Niemeyer authored
    The linker avoids a GOT indirection by turning a MOV into
    a LEA, but with x86-64 GCC has started emitting CMOV*
    instructions which break the existing logic.
    
    This will generate errors such as:
    
      unexpected GOT reloc for non-dynamic symbol luaO_nilobject_
    
    The CMOV* instructions may be emitted with normal code like:
    
      if (o >= L->top) return cast(TValue *, luaO_nilobject);
      else return o;
    
    Which gets compiled into (relocation offset at 1b):
    
      13: 48 3b 47 10             cmp    0x10(%rdi),%rax
      17: 48 0f 43 05 00 00 00    cmovae 0x0(%rip),%rax
      1e: 00
    
    This change will allow the indirection through the GOT to
    avoid the problem in those cases.
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/4071044
    1a472026
asm.c 26.9 KB