[llvm] Draft: [bolt][aarch64] Add P32_ABS16/32 relocations (PR #143773)

Alexey Moksyakov via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 11 12:42:28 PDT 2025


https://github.com/yavtuk created https://github.com/llvm/llvm-project/pull/143773

Added few relocations for quick checking

>From 91cb75f1c850e5e43937365a6a4324b9da66b1ba Mon Sep 17 00:00:00 2001
From: Alexey Moksyakov <moksyakov.alexey at huawei.com>
Date: Wed, 11 Jun 2025 22:34:39 +0300
Subject: [PATCH] [bolt][aarch64] Add P32_ABS16/32 relocations

---
 bolt/lib/Core/Relocation.cpp                     | 10 ++++++++++
 bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp |  2 ++
 2 files changed, 12 insertions(+)

diff --git a/bolt/lib/Core/Relocation.cpp b/bolt/lib/Core/Relocation.cpp
index f099dfa46f3d4..c189dbe8f49fd 100644
--- a/bolt/lib/Core/Relocation.cpp
+++ b/bolt/lib/Core/Relocation.cpp
@@ -87,7 +87,9 @@ static bool isSupportedAArch64(uint32_t Type) {
   case ELF::R_AARCH64_PREL32:
   case ELF::R_AARCH64_PREL64:
   case ELF::R_AARCH64_ABS16:
+  case ELF::R_AARCH64_P32_ABS16:
   case ELF::R_AARCH64_ABS32:
+  case ELF::R_AARCH64_P32_ABS32:
   case ELF::R_AARCH64_ABS64:
   case ELF::R_AARCH64_MOVW_UABS_G0:
   case ELF::R_AARCH64_MOVW_UABS_G0_NC:
@@ -167,6 +169,7 @@ static size_t getSizeForTypeAArch64(uint32_t Type) {
     errs() << object::getELFRelocationTypeName(ELF::EM_AARCH64, Type) << '\n';
     llvm_unreachable("unsupported relocation type");
   case ELF::R_AARCH64_ABS16:
+  case ELF::R_AARCH64_P32_ABS16:
   case ELF::R_AARCH64_PREL16:
     return 2;
   case ELF::R_AARCH64_CALL26:
@@ -204,6 +207,7 @@ static size_t getSizeForTypeAArch64(uint32_t Type) {
   case ELF::R_AARCH64_MOVW_UABS_G2_NC:
   case ELF::R_AARCH64_MOVW_UABS_G3:
   case ELF::R_AARCH64_ABS32:
+  case ELF::R_AARCH64_P32_ABS32:
   case ELF::R_AARCH64_PLT32:
     return 4;
   case ELF::R_AARCH64_ABS64:
@@ -290,7 +294,9 @@ static uint64_t encodeValueAArch64(uint32_t Type, uint64_t Value, uint64_t PC) {
   default:
     llvm_unreachable("unsupported relocation");
   case ELF::R_AARCH64_ABS16:
+  case ELF::R_AARCH64_P32_ABS16:
   case ELF::R_AARCH64_ABS32:
+  case ELF::R_AARCH64_P32_ABS32:
   case ELF::R_AARCH64_ABS64:
     break;
   case ELF::R_AARCH64_PREL16:
@@ -352,7 +358,9 @@ static uint64_t extractValueAArch64(uint32_t Type, uint64_t Contents,
     errs() << object::getELFRelocationTypeName(ELF::EM_AARCH64, Type) << '\n';
     llvm_unreachable("unsupported relocation type");
   case ELF::R_AARCH64_ABS16:
+  case ELF::R_AARCH64_P32_ABS16:
   case ELF::R_AARCH64_ABS32:
+  case ELF::R_AARCH64_P32_ABS32:
   case ELF::R_AARCH64_ABS64:
     return Contents;
   case ELF::R_AARCH64_PREL16:
@@ -643,7 +651,9 @@ static bool isPCRelativeAArch64(uint32_t Type) {
   default:
     llvm_unreachable("Unknown relocation type");
   case ELF::R_AARCH64_ABS16:
+  case ELF::R_AARCH64_P32_ABS16:
   case ELF::R_AARCH64_ABS32:
+  case ELF::R_AARCH64_P32_ABS32:
   case ELF::R_AARCH64_ABS64:
   case ELF::R_AARCH64_LDST64_ABS_LO12_NC:
   case ELF::R_AARCH64_ADD_ABS_LO12_NC:
diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
index eb1d9d8a19514..f12ff033ca3ff 100644
--- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
+++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
@@ -2244,7 +2244,9 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
     switch (RelType) {
     case ELF::R_AARCH64_ABS64:
     case ELF::R_AARCH64_ABS32:
+    case ELF::R_AARCH64_P32_ABS32:
     case ELF::R_AARCH64_ABS16:
+    case ELF::R_AARCH64_P32_ABS16:
     case ELF::R_AARCH64_ADD_ABS_LO12_NC:
     case ELF::R_AARCH64_ADR_GOT_PAGE:
     case ELF::R_AARCH64_ADR_PREL_LO21:



More information about the llvm-commits mailing list