[LoongArch] Allow %pc_lo12 relocs in JIRL's immediate operand position
authorWANG Xuerui <git@xen0n.name>
Sun, 22 Jan 2023 05:24:43 +0000 (13:24 +0800)
committerWeining Lu <luweining@loongson.cn>
Sun, 22 Jan 2023 10:49:29 +0000 (18:49 +0800)
commitaf6c43c8e99b0263d8050d2a85a0fbc5bc8b45ed
treec5de7f598065f0da25e96dc871a693bffcca6bd5
parent53a1314ed1b5021822071d3c7a751a5ec52619b7
[LoongArch] Allow %pc_lo12 relocs in JIRL's immediate operand position

Currently, gcc-13 will generate such assembly when `-mcmodel=medium`,
which is ostensibly a dirty hack to allow bigger offsets for extern
function calls without having to add more reloc types. This is not the
best way to accomplish the original goal, but such usages will appear
soon and we have to support it anyway.

Example:

```c
extern int foo(int);

int bar(int x) {
    return foo(x + 123);
}
```

will produce the following (simplified) assembly when compiled with
`-O2 -mcmodel=medium`:

```
    .globl  bar
    .type   bar, @function
bar:
    .cfi_startproc
    addi.w  $r4,$r4,123
    pcalau12i   $r12,%pc_hi20(foo)
    jirl    $r0,$r12,%pc_lo12(foo)
    .cfi_endproc
```

Reviewed By: SixWeining, wangleiat, MaskRay, xry111

Differential Revision: https://reviews.llvm.org/D142278
llvm/lib/Target/LoongArch/AsmParser/LoongArchAsmParser.cpp
llvm/test/MC/LoongArch/Relocations/relocations.s