Page MenuHomePhabricator

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

Authored by atanasyan on Wed, Aug 21, 1:37 PM.

Details

Summary

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.

Diff Detail

Repository
rL LLVM

Event Timeline

atanasyan created this revision.Wed, Aug 21, 1:37 PM
atanasyan edited the summary of this revision. (Show Details)Wed, Aug 21, 1:37 PM
This revision is now accepted and ready to land.Thu, Aug 22, 9:03 AM
This revision was automatically updated to reflect the committed changes.