diff options
author | Jinyang He <hejinyang@loongson.cn> | 2023-11-15 09:57:45 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-15 09:57:45 +0800 |
commit | 72accbfd0a1023b3182202276904120524ff9200 (patch) | |
tree | 47121da4586806987713f1b90301af4bf2f85c6b /lld | |
parent | f2c535531428a2c7625f588e740c4c831b30f67e (diff) | |
download | llvm-72accbfd0a1023b3182202276904120524ff9200.zip llvm-72accbfd0a1023b3182202276904120524ff9200.tar.gz llvm-72accbfd0a1023b3182202276904120524ff9200.tar.bz2 |
[lld][LoongArch] Support the R_LARCH_{ADD,SUB}6 relocation type (#72190)
The R_LARCH_{ADD,SUB}6 relocation type are usually used by DwarfCFA to
calculate a tiny offset. They appear after binutils 2.41, with GAS
enabling relaxation by default.
Diffstat (limited to 'lld')
-rw-r--r-- | lld/ELF/Arch/LoongArch.cpp | 8 | ||||
-rw-r--r-- | lld/test/ELF/loongarch-add-sub.s | 6 |
2 files changed, 13 insertions, 1 deletions
diff --git a/lld/ELF/Arch/LoongArch.cpp b/lld/ELF/Arch/LoongArch.cpp index 04ddb468..d3a5385 100644 --- a/lld/ELF/Arch/LoongArch.cpp +++ b/lld/ELF/Arch/LoongArch.cpp @@ -444,10 +444,12 @@ RelExpr LoongArch::getRelExpr(const RelType type, const Symbol &s, case R_LARCH_TLS_LE64_LO20: case R_LARCH_TLS_LE64_HI12: return R_TPREL; + case R_LARCH_ADD6: case R_LARCH_ADD8: case R_LARCH_ADD16: case R_LARCH_ADD32: case R_LARCH_ADD64: + case R_LARCH_SUB6: case R_LARCH_SUB8: case R_LARCH_SUB16: case R_LARCH_SUB32: @@ -650,6 +652,9 @@ void LoongArch::relocate(uint8_t *loc, const Relocation &rel, write32le(loc, setK12(read32le(loc), extractBits(val, 63, 52))); return; + case R_LARCH_ADD6: + *loc = (*loc & 0xc0) | ((*loc + val) & 0x3f); + return; case R_LARCH_ADD8: *loc += val; return; @@ -662,6 +667,9 @@ void LoongArch::relocate(uint8_t *loc, const Relocation &rel, case R_LARCH_ADD64: write64le(loc, read64le(loc) + val); return; + case R_LARCH_SUB6: + *loc = (*loc & 0xc0) | ((*loc - val) & 0x3f); + return; case R_LARCH_SUB8: *loc -= val; return; diff --git a/lld/test/ELF/loongarch-add-sub.s b/lld/test/ELF/loongarch-add-sub.s index 63a3f7d..35f8a05 100644 --- a/lld/test/ELF/loongarch-add-sub.s +++ b/lld/test/ELF/loongarch-add-sub.s @@ -6,7 +6,7 @@ # RUN: llvm-readelf -x .rodata %t.la64 | FileCheck --check-prefix=CHECK %s # CHECK: section '.rodata': # CHECK-NEXT: 0x9876543210 10325476 98badcfe 804602be 79ffffff -# CHECK-NEXT: 0x9876543220 804602be 804680 +# CHECK-NEXT: 0x9876543220 804602be 80468097 .text .global _start @@ -34,3 +34,7 @@ quux: .byte 0 .reloc quux, R_LARCH_ADD8, 1b .reloc quux, R_LARCH_SUB8, 2b +qux: + .byte 0b10000000 + .reloc qux, R_LARCH_ADD6, qux + .reloc qux, R_LARCH_SUB6, 2b |