[llvm] r205200 - [mips] Implement missing relocations in the integrated assembler.

CC to the group.

CC to the group.


Note 1: R_MIPS_LO16 can be alone and does not have a paired R_MIPS_HI16
Note 2: Several R_MIPS_HI16s can be attached to the same R_MIPS_LO16

R_MIPS_HI16 (1)
R_MIPS_HI16 (2)
R_MIPS_LO16 (3)
R_MIPS_LO16 (4)

If all relocations above are against the same symbol then:
bfd linker:
  a) process 1 and find 3
  b) process 2 and find 3 again
  c) 4 is alone

gold linker:
  a) save 1
  b) save 2
  c) process 3 and handle 1 and 2
  d) 4 is alone

Just as a curiosity (from the MC perspective), why is the linker
required to match these relocations?

To handle R_MIPS_HI16 and R_MIPS_LO16 relocations we need a "combined"
addend "AHL". This addend is calculated using addends from both
R_MIPS_HI16 ("AHI") and R_MIPS_LO16 ("ALO"). That is why we need to
pair these relocations.

AHL = (AHI << 16) + (short)ALO

R_MIPS_LO16: AHL + symbol
R_MIPS_HI16: ((AHL + symbol) – (short)(AHL + symbol)) >> 16

Ah, having a LO16 map to multiple relocations explains the problem. If
they were 1:1, they could be applied independently, right? The linker
would just need to be careful to not overwrite the other 16 bits.