aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Object/RelocationResolver.cpp65
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};