[lld] [lld][ELF] Fix a corner case of elf::getLoongArchPageDelta (PR #71907)

via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 19 09:12:01 PST 2023


heiher wrote:

> > ```assembly
> > .L1:
> >   pcalau12i $a1, 0        # R_LARCH_PCALA_HI20
> >   addi.d    $a0, $zero, A # R_LARCH_PCALA_LO12
> >   lu32i.d   $a0, B        # R_LARCH_PCALA64_LO20
> >   lu52i.d   $a0, $a0, C   # R_LARCH_PCALA64_HI12
> >   add.d     $a0, $a0, $a1
> > ```
> 
> Is it possible to use the `r_addend` of `Elf64_Rela` instead of insn imm bits to store the adjusting bits?
> 
> For example:
> ### Before relocation
> 
> The addend should be written by linker but not assembler because assembler doesn't know the page delta of current instruction and `pcalau12i`. (Same as the imm bits approach?)
> 
> ```
> 0000000000000000 <_start>:
>    0:   1a000004        pcalau12i       $a0, 0
>                         0: R_LARCH_PCALA_HI20   foo
>    4:   02c00001        addi.d          $ra, $zero, 0
>                         4: R_LARCH_PCALA_LO12   foo
>    8:   16000001        lu32i.d         $ra, 0
>                         8: R_LARCH_PCALA64_LO20 foo+0x10000000
>    c:   03000021        lu52i.d         $ra, $ra, 0
>                         c: R_LARCH_PCALA64_HI12 foo+0x10000000000000
>   10:   00109021        add.d           $ra, $ra, $a0
>   14:   4c000021        jirl            $ra, $ra, 0
> ```

This seems fine for static linking, but how to deal with object files (.o)? How to calculate the adjusting bits at this time?
(Okay, the above way of recording page offsets doesn't work either.)

> 
> ### After link
> 
> ```
> 0000000080000ffc <_start>:
>     80000ffc:   1b000004        pcalau12i       $a0, -524288(0x80000)
>     80001000:   02c00001        addi.d          $ra, $zero, 0
>     80001004:   16000001        lu32i.d         $ra, 0
>     80001008:   03000021        lu52i.d         $ra, $ra, 0
>     8000100c:   00109021        add.d           $ra, $ra, $a0
> ```

https://github.com/llvm/llvm-project/pull/71907


More information about the llvm-commits mailing list