[llvm] [RelocationResolver][Xtensa] Implement R_XTENSA_32 (PR #96311)
YAMAMOTO Takashi via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 21 07:23:37 PDT 2024
https://github.com/yamt created https://github.com/llvm/llvm-project/pull/96311
This makes llvm-dwarfdump work on Xtensa ELF objects.
Reference: https://github.com/jcmvbkbc/xtensa-abi/blob/master/relocations
>From 724fb17ccc40aab19aefaac6158b0ab2e244ecb1 Mon Sep 17 00:00:00 2001
From: YAMAMOTO Takashi <yamamoto at midokura.com>
Date: Fri, 21 Jun 2024 23:15:39 +0900
Subject: [PATCH] [RelocationResolver][Xtensa] Implement R_XTENSA_32
This makes llvm-dwarfdump work on Xtensa ELF objects.
Reference: https://github.com/jcmvbkbc/xtensa-abi/blob/master/relocations
---
llvm/lib/Object/RelocationResolver.cpp | 29 ++++++++++++++++++++++++--
1 file changed, 27 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Object/RelocationResolver.cpp b/llvm/lib/Object/RelocationResolver.cpp
index 564d9da78e97d..b404a79966b9d 100644
--- a/llvm/lib/Object/RelocationResolver.cpp
+++ b/llvm/lib/Object/RelocationResolver.cpp
@@ -310,6 +310,28 @@ static uint64_t resolveX86(uint64_t Type, uint64_t Offset, uint64_t S,
}
}
+static bool supportsXtensa(uint64_t Type) {
+ switch (Type) {
+ case ELF::R_XTENSA_NONE:
+ case ELF::R_XTENSA_32:
+ return true;
+ default:
+ return false;
+ }
+}
+
+static uint64_t resolveXtensa(uint64_t Type, uint64_t Offset, uint64_t S,
+ uint64_t LocData, int64_t Addend) {
+ switch (Type) {
+ case ELF::R_XTENSA_NONE:
+ return LocData;
+ case ELF::R_XTENSA_32:
+ return (S + Addend + LocData) & 0xFFFFFFFF;
+ default:
+ llvm_unreachable("Invalid relocation type");
+ }
+}
+
static bool supportsPPC32(uint64_t Type) {
switch (Type) {
case ELF::R_PPC_ADDR32:
@@ -820,6 +842,8 @@ getRelocationResolver(const ObjectFile &Obj) {
switch (Obj.getArch()) {
case Triple::x86:
return {supportsX86, resolveX86};
+ case Triple::xtensa:
+ return {supportsXtensa, resolveXtensa};
case Triple::ppcle:
case Triple::ppc:
return {supportsPPC32, resolvePPC32};
@@ -885,11 +909,12 @@ uint64_t resolveRelocation(RelocationResolver Resolver, const RelocationRef &R,
if (GetRelSectionType() == ELF::SHT_RELA) {
Addend = getELFAddend(R);
- // LoongArch and RISCV relocations use both LocData and Addend.
+ // LoongArch, RISCV, and Xtensa relocations use both LocData and Addend.
if (Obj->getArch() != Triple::loongarch32 &&
Obj->getArch() != Triple::loongarch64 &&
Obj->getArch() != Triple::riscv32 &&
- Obj->getArch() != Triple::riscv64)
+ Obj->getArch() != Triple::riscv64 &&
+ Obj->getArch() != Triple::xtensa)
LocData = 0;
}
}
More information about the llvm-commits
mailing list