[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