Skip to content

[BOLT][AArch64] Adds tls relocations support #117465

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 20, 2024

Conversation

yavtuk
Copy link
Contributor

@yavtuk yavtuk commented Nov 24, 2024

No description provided.

@llvmbot
Copy link
Member

llvmbot commented Nov 24, 2024

@llvm/pr-subscribers-bolt

Author: Alexey Moksyakov (yavtuk)

Changes

Full diff: https://github.com/llvm/llvm-project/pull/117465.diff

3 Files Affected:

  • (modified) bolt/lib/Core/Relocation.cpp (+14)
  • (modified) bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp (+2)
  • (added) bolt/test/AArch64/r_aarch64_tls.s (+60)
diff --git a/bolt/lib/Core/Relocation.cpp b/bolt/lib/Core/Relocation.cpp
index 4e888a5b147aca..d4b3168c8a139f 100644
--- a/bolt/lib/Core/Relocation.cpp
+++ b/bolt/lib/Core/Relocation.cpp
@@ -75,6 +75,8 @@ static bool isSupportedAArch64(uint64_t Type) {
   case ELF::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
   case ELF::R_AARCH64_TLSLE_ADD_TPREL_HI12:
   case ELF::R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+  case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0:
+  case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
   case ELF::R_AARCH64_LD64_GOT_LO12_NC:
   case ELF::R_AARCH64_TLSDESC_LD64_LO12:
   case ELF::R_AARCH64_TLSDESC_ADD_LO12:
@@ -183,6 +185,8 @@ static size_t getSizeForTypeAArch64(uint64_t Type) {
   case ELF::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
   case ELF::R_AARCH64_TLSLE_ADD_TPREL_HI12:
   case ELF::R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+  case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0:
+  case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
   case ELF::R_AARCH64_LD64_GOT_LO12_NC:
   case ELF::R_AARCH64_TLSDESC_LD64_LO12:
   case ELF::R_AARCH64_TLSDESC_ADD_LO12:
@@ -480,6 +484,12 @@ static uint64_t extractValueAArch64(uint64_t Type, uint64_t Contents,
     Contents &= ~0xffffffffffc003ffU;
     return Contents >> (10 - 0);
   }
+  case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0:
+  case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC: {
+    // 16 bits immediate goes in [20:5] bits
+    Contents &= ~0xffffffffffe0001fU;
+    return Contents >> 5;
+  }
   case ELF::R_AARCH64_LDST128_ABS_LO12_NC: {
     // Immediate goes in bits 21:10 of ADD instruction, taken
     // from bits 11:4 of Symbol address
@@ -651,6 +661,8 @@ static bool isTLSAArch64(uint64_t Type) {
   case ELF::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
   case ELF::R_AARCH64_TLSLE_ADD_TPREL_HI12:
   case ELF::R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+  case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0:
+  case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
   case ELF::R_AARCH64_TLSDESC_LD64_LO12:
   case ELF::R_AARCH64_TLSDESC_ADD_LO12:
   case ELF::R_AARCH64_TLSDESC_CALL:
@@ -716,6 +728,8 @@ static bool isPCRelativeAArch64(uint64_t Type) {
   case ELF::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
   case ELF::R_AARCH64_TLSLE_ADD_TPREL_HI12:
   case ELF::R_AARCH64_TLSLE_ADD_TPREL_LO12_NC:
+  case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0:
+  case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
   case ELF::R_AARCH64_LD64_GOT_LO12_NC:
   case ELF::R_AARCH64_TLSDESC_LD64_LO12:
   case ELF::R_AARCH64_TLSDESC_ADD_LO12:
diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
index 7e08e5c81d26ff..679c9774c767f7 100644
--- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
+++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
@@ -1449,6 +1449,8 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
     case ELF::R_AARCH64_TLSDESC_LD64_LO12:
     case ELF::R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21:
     case ELF::R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC:
+    case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0:
+    case ELF::R_AARCH64_TLSLE_MOVW_TPREL_G0_NC:
     case ELF::R_AARCH64_MOVW_UABS_G0:
     case ELF::R_AARCH64_MOVW_UABS_G0_NC:
     case ELF::R_AARCH64_MOVW_UABS_G1:
diff --git a/bolt/test/AArch64/r_aarch64_tls.s b/bolt/test/AArch64/r_aarch64_tls.s
new file mode 100644
index 00000000000000..aa83162ada5959
--- /dev/null
+++ b/bolt/test/AArch64/r_aarch64_tls.s
@@ -0,0 +1,60 @@
+## This test checks processing of tls relocations
+##
+## R_AARCH64_TLSLE_MOVW_TPREL_G0, TPREL(S + A)
+## R_AARCH64_TLSLE_MOVW_TPREL_G0_NC, TPREL(S + A)
+
+# REQUIRES: system-linux
+
+# RUN: %clang %cflags -nostartfiles -nostdlib %s -o %t.exe -mlittle-endian \
+# RUN:     -Wl,-q
+# RUN: llvm-readelf -Wr %t.exe | FileCheck %s -check-prefix=CHECKTLS
+
+# CHECKTLS:       R_AARCH64_TLSLE_MOVW_TPREL_G0      {{.*}} .tprel_tls_var + 0
+# CHECKTLS-NEXT:  R_AARCH64_TLSLE_MOVW_TPREL_G0_NC   {{.*}} .tprel_tls_var + 4
+
+# RUN: llvm-bolt %t.exe -o %t.bolt
+# RUN: llvm-objdump -D %t.bolt | FileCheck %s --check-prefix=CHECKBOLT
+
+# CHECKBOLT: Disassembly of section .tdata
+# CHECKBOLT: [[#%x,DATATABLEADDR:]] <.tdata
+# CHECKBOLT-NEXT: [[#DATATABLEADDR]]: 000000aa
+# CHECKBOLT-NEXT: [[#DATATABLEADDR + 4]]: 000000bb
+
+.section .tdata
+.align 4
+.tprel_tls_var:
+.word 0xaa
+.word 0xbb
+
+.section .text
+.align 4
+.globl _start
+.type _start, %function
+_start:
+  mrs x0, TPIDR_EL0
+  movz x1, #:tprel_g0:.tprel_tls_var
+  add x0, x0, x1
+  ldr w2, [x0]
+  cmp w2, 0xaa
+  bne exit_failure
+
+  mrs x0, TPIDR_EL0
+  movk x1, #:tprel_g0_nc:.tprel_tls_var
+  add x0, x0, x1
+  ldr w2, [x0]
+  cmp w2, 0xbb
+  bne exit_failure
+
+exit_success:
+  mov x0, #0
+  b exit
+
+exit_failure:
+  mov x0, #1
+  b exit
+
+exit:
+  mov x8, #93
+  svc #0
+
+.size _start, .-_start

@yavtuk yavtuk force-pushed the add-tlsle-mov-relocs branch from f452bf4 to c29f07c Compare November 24, 2024 06:45
@yavtuk yavtuk requested a review from yota9 November 25, 2024 08:22
@yota9
Copy link
Member

yota9 commented Nov 26, 2024

Please Adds->Add in patch and rename test so it would have mov rel name in it. Thanks!

@yavtuk
Copy link
Contributor Author

yavtuk commented Dec 3, 2024

We discussed the patch with @yota9 offline, so now the one only removes warning during processing this relocation. the test is redundant and we can remove it. Is this kind of change can be relevant? @aaupov how do you think?

@yavtuk yavtuk force-pushed the add-tlsle-mov-relocs branch from 833a301 to 0bac792 Compare December 20, 2024 08:30
Copy link
Member

@yota9 yota9 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@yavtuk yavtuk force-pushed the add-tlsle-mov-relocs branch from 0bac792 to 1aa2a2e Compare December 20, 2024 08:36
@yavtuk yavtuk merged commit e11d49c into llvm:main Dec 20, 2024
7 checks passed
@yavtuk yavtuk deleted the add-tlsle-mov-relocs branch February 18, 2025 13:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants