HomePhabricator

[mips] Do not include offset into `%got` expression for global symbols

Description

[mips] Do not include offset into %got expression for global symbols

Now pseudo instruction la $6, symbol+8($6) is expanding into the following
chain of commands:

lw    $1, %got(symbol+8)($gp)
addiu $1, $1, 8
addu  $6, $1, $6

This is incorrect. When a linker handles the R_MIPS_GOT16 relocation,
it does not expect to get any addend and breaks on assertion. Otherwise
it has to create new GOT entry for each unique "sym + offset" pair.
Offset for a global symbol should be added to result of loading GOT
entry by a separate add command.

The patch fixes the problem by stripping off an offset from the expression
passed to the %got. That's interesting that even current code inserts
a separate add command.

Differential Revision: https://reviews.llvm.org/D66552

Details