diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp b/contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp index e14301663df3..13a7a9851137 100644 --- a/contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp +++ b/contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp @@ -433,11 +433,14 @@ static bool supportsRISCV(uint64_t Type) { case ELF::R_RISCV_32_PCREL: case ELF::R_RISCV_64: case ELF::R_RISCV_SET6: + case ELF::R_RISCV_SET8: case ELF::R_RISCV_SUB6: case ELF::R_RISCV_ADD8: case ELF::R_RISCV_SUB8: + case ELF::R_RISCV_SET16: case ELF::R_RISCV_ADD16: case ELF::R_RISCV_SUB16: + case ELF::R_RISCV_SET32: case ELF::R_RISCV_ADD32: case ELF::R_RISCV_SUB32: case ELF::R_RISCV_ADD64: @@ -465,14 +468,20 @@ static uint64_t resolveRISCV(uint64_t Type, uint64_t Offset, uint64_t S, return (A & 0xC0) | ((S + RA) & 0x3F); case ELF::R_RISCV_SUB6: return (A & 0xC0) | (((A & 0x3F) - (S + RA)) & 0x3F); + case ELF::R_RISCV_SET8: + return (S + RA) & 0xFF; case ELF::R_RISCV_ADD8: return (A + (S + RA)) & 0xFF; case ELF::R_RISCV_SUB8: return (A - (S + RA)) & 0xFF; + case ELF::R_RISCV_SET16: + return (S + RA) & 0xFFFF; case ELF::R_RISCV_ADD16: return (A + (S + RA)) & 0xFFFF; case ELF::R_RISCV_SUB16: return (A - (S + RA)) & 0xFFFF; + case ELF::R_RISCV_SET32: + return (S + RA) & 0xFFFFFFFF; case ELF::R_RISCV_ADD32: return (A + (S + RA)) & 0xFFFFFFFF; case ELF::R_RISCV_SUB32: @@ -511,6 +520,58 @@ static uint64_t resolveCSKY(uint64_t Type, uint64_t Offset, uint64_t S, } } +static bool supportsLoongArch(uint64_t Type) { + switch (Type) { + case ELF::R_LARCH_NONE: + case ELF::R_LARCH_32: + case ELF::R_LARCH_32_PCREL: + case ELF::R_LARCH_64: + case ELF::R_LARCH_ADD8: + case ELF::R_LARCH_SUB8: + case ELF::R_LARCH_ADD16: + case ELF::R_LARCH_SUB16: + case ELF::R_LARCH_ADD32: + case ELF::R_LARCH_SUB32: + case ELF::R_LARCH_ADD64: + case ELF::R_LARCH_SUB64: + return true; + default: + return false; + } +} + +static uint64_t resolveLoongArch(uint64_t Type, uint64_t Offset, uint64_t S, + uint64_t LocData, int64_t Addend) { + switch (Type) { + case ELF::R_LARCH_NONE: + return LocData; + case ELF::R_LARCH_32: + return (S + Addend) & 0xFFFFFFFF; + case ELF::R_LARCH_32_PCREL: + return (S + Addend - Offset) & 0xFFFFFFFF; + case ELF::R_LARCH_64: + return S + Addend; + case ELF::R_LARCH_ADD8: + return (LocData + (S + Addend)) & 0xFF; + case ELF::R_LARCH_SUB8: + return (LocData - (S + Addend)) & 0xFF; + case ELF::R_LARCH_ADD16: + return (LocData + (S + Addend)) & 0xFFFF; + case ELF::R_LARCH_SUB16: + return (LocData - (S + Addend)) & 0xFFFF; + case ELF::R_LARCH_ADD32: + return (LocData + (S + Addend)) & 0xFFFFFFFF; + case ELF::R_LARCH_SUB32: + return (LocData - (S + Addend)) & 0xFFFFFFFF; + case ELF::R_LARCH_ADD64: + return (LocData + (S + Addend)); + case ELF::R_LARCH_SUB64: + return (LocData - (S + Addend)); + default: + llvm_unreachable("Invalid relocation type"); + } +} + static bool supportsCOFFX86(uint64_t Type) { switch (Type) { case COFF::IMAGE_REL_I386_SECREL: @@ -711,6 +772,8 @@ getRelocationResolver(const ObjectFile &Obj) { case Triple::bpfel: case Triple::bpfeb: return {supportsBPF, resolveBPF}; + case Triple::loongarch64: + return {supportsLoongArch, resolveLoongArch}; case Triple::mips64el: case Triple::mips64: return {supportsMips64, resolveMips64}; @@ -747,6 +810,8 @@ getRelocationResolver(const ObjectFile &Obj) { return {supportsAVR, resolveAVR}; case Triple::lanai: return {supportsLanai, resolveLanai}; + case Triple::loongarch32: + return {supportsLoongArch, resolveLoongArch}; case Triple::mipsel: case Triple::mips: return {supportsMips32, resolveMips32}; |