[llvm-branch-commits] [llvm] release/22.x: [PAC][ELF] Place AUTH constants in .data.rel.ro for position dependent code (#150418) (PR #176052)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Jan 14 14:40:19 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-aarch64

Author: None (llvmbot)

<details>
<summary>Changes</summary>

Backport 2bf35f32330d6a0cada403559cd84e659224515a

Requested by: @<!-- -->kovdan01

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


3 Files Affected:

- (modified) llvm/lib/Target/TargetLoweringObjectFile.cpp (+19) 
- (added) llvm/test/CodeGen/AArch64/ptrauth-global-no-pic.ll (+53) 
- (modified) llvm/test/CodeGen/AArch64/ptrauth-irelative.ll (+8-8) 


``````````diff
diff --git a/llvm/lib/Target/TargetLoweringObjectFile.cpp b/llvm/lib/Target/TargetLoweringObjectFile.cpp
index 343bcce80e3a1..ae31cd90b37ab 100644
--- a/llvm/lib/Target/TargetLoweringObjectFile.cpp
+++ b/llvm/lib/Target/TargetLoweringObjectFile.cpp
@@ -17,6 +17,7 @@
 #include "llvm/IR/DataLayout.h"
 #include "llvm/IR/DerivedTypes.h"
 #include "llvm/IR/Function.h"
+#include "llvm/IR/GlobalValue.h"
 #include "llvm/IR/GlobalVariable.h"
 #include "llvm/IR/Mangler.h"
 #include "llvm/IR/Module.h"
@@ -226,6 +227,20 @@ void TargetLoweringObjectFile::emitPseudoProbeDescMetadata(
   }
 }
 
+static bool containsConstantPtrAuth(const Constant *C) {
+  if (isa<ConstantPtrAuth>(C))
+    return true;
+
+  if (isa<BlockAddress>(C) || isa<GlobalValue>(C))
+    return false;
+
+  for (const Value *Op : C->operands())
+    if (containsConstantPtrAuth(cast<Constant>(Op)))
+      return true;
+
+  return false;
+}
+
 /// getKindForGlobal - This is a top-level target-independent classifier for
 /// a global object.  Given a global variable and information from the TM, this
 /// function classifies the global in a target independent manner. This function
@@ -327,6 +342,10 @@ SectionKind TargetLoweringObjectFile::getKindForGlobal(const GlobalObject *GO,
       }
 
     } else {
+      // The dynamic linker always needs to fix PtrAuth relocations up.
+      if (containsConstantPtrAuth(C))
+        return SectionKind::getReadOnlyWithRel();
+
       // In static, ROPI and RWPI relocation models, the linker will resolve
       // all addresses, so the relocation entries will actually be constants by
       // the time the app starts up.  However, we can't put this into a
diff --git a/llvm/test/CodeGen/AArch64/ptrauth-global-no-pic.ll b/llvm/test/CodeGen/AArch64/ptrauth-global-no-pic.ll
new file mode 100644
index 0000000000000..77250a25f3f7c
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/ptrauth-global-no-pic.ll
@@ -0,0 +1,53 @@
+; RUN: llc -mtriple aarch64-elf --relocation-model=static         -mattr=+pauth < %s | FileCheck %s
+; RUN: llc -mtriple aarch64-elf --relocation-model=dynamic-no-pic -mattr=+pauth < %s | FileCheck %s
+
+;; A constant value, use .rodata
+; CHECK:         .section        .rodata,"a", at progbits
+; CHECK:         .globl  Const
+; CHECK: Const:
+; CHECK:         .xword  37
+
+;; An AUTH reloc is needed, use .data.rel.ro
+; CHECK:         .section        .data.rel.ro,"aw", at progbits
+; CHECK:         .globl  PtrAuthExtern
+; CHECK: PtrAuthExtern:
+; CHECK:         .xword  ConstExtern at AUTH(da,0)
+
+; CHECK-NOT:     .section
+; CHECK:         .globl  PtrAuth
+; CHECK: PtrAuth:
+; CHECK:         .xword  Const at AUTH(da,0)
+
+; CHECK-NOT:     .section
+; CHECK:         .globl  PtrAuthExternNested1
+; CHECK: PtrAuthExternNested1:
+; CHECK:         .xword  ConstExtern at AUTH(da,0)
+
+;; The address could be filled statically, use .rodata
+; CHECK:         .section        .rodata,"a", at progbits
+; CHECK:         .globl  PtrAuthExternNested2
+; CHECK: PtrAuthExternNested2:
+; CHECK:         .xword  PtrAuthExtern
+
+;; An AUTH reloc is needed, use .data.rel.ro
+; CHECK:         .section        .data.rel.ro,"aw", at progbits
+; CHECK:         .globl  PtrAuthNested1
+; CHECK: PtrAuthNested1:
+; CHECK:         .xword  Const at AUTH(da,0)
+
+;; The address could be filled statically, use .rodata
+; CHECK:         .section        .rodata,"a", at progbits
+; CHECK:         .globl  PtrAuthNested2
+; CHECK: PtrAuthNested2:
+; CHECK:         .xword  PtrAuth
+
+ at ConstExtern = external global i64
+ at Const       = constant i64 37
+
+ at PtrAuthExtern = constant ptr ptrauth (ptr @ConstExtern, i32 2)
+ at PtrAuth       = constant ptr ptrauth (ptr @Const,  i32 2)
+
+ at PtrAuthExternNested1 = constant { ptr } { ptr ptrauth (ptr @ConstExtern, i32 2) }
+ at PtrAuthExternNested2 = constant { ptr } { ptr @PtrAuthExtern }
+ at PtrAuthNested1       = constant { ptr } { ptr ptrauth (ptr @Const, i32 2) }
+ at PtrAuthNested2       = constant { ptr } { ptr @PtrAuth }
diff --git a/llvm/test/CodeGen/AArch64/ptrauth-irelative.ll b/llvm/test/CodeGen/AArch64/ptrauth-irelative.ll
index 1a367bf0d6046..1e0af68dd7ab8 100644
--- a/llvm/test/CodeGen/AArch64/ptrauth-irelative.ll
+++ b/llvm/test/CodeGen/AArch64/ptrauth-irelative.ll
@@ -21,7 +21,7 @@
 ; CHECK-NEXT: add x0, x0, :lo12:dsolocal
 ; CHECK-NEXT: mov x1, #2
 ; CHECK-NEXT: b __emupac_pacda
-; CHECK-NEXT: .section .rodata
+; CHECK-NEXT: .section .data.rel.ro
 ; CHECK-NEXT: .xword [[FUNC]]@FUNCINIT
 @dsolocalref = constant ptr ptrauth (ptr @dsolocal, i32 2, i64 2, ptr null), align 8
 
@@ -38,7 +38,7 @@
 ; CHECK-NEXT: .reloc [[LABEL]], R_AARCH64_PATCHINST, ds
 ; CHECK-NEXT: b __emupac_pacda
 ; CHECK-NEXT: ret
-; CHECK-NEXT: .section .rodata
+; CHECK-NEXT: .section .data.rel.ro
 ; CHECK-NEXT: .xword [[FUNC]]@FUNCINIT
 @dsolocalrefds = constant ptr ptrauth (ptr @dsolocal, i32 2, i64 2, ptr null, ptr @ds), align 8
 
@@ -50,7 +50,7 @@
 ; CHECK-NEXT: add x0, x0, :lo12:dsolocal+8
 ; CHECK-NEXT: mov x1, #3
 ; CHECK-NEXT: b __emupac_pacda
-; CHECK-NEXT: .section .rodata
+; CHECK-NEXT: .section .data.rel.ro
 ; CHECK-NEXT: .xword [[FUNC]]@FUNCINIT
 @dsolocalref8 = constant ptr ptrauth (ptr getelementptr (i8, ptr @dsolocal, i64 8), i32 2, i64 3, ptr null), align 8
 
@@ -63,7 +63,7 @@
 ; CHECK-NEXT: adrp x1, [[PLACE]]
 ; CHECK-NEXT: add x1, x1, :lo12:[[PLACE]]
 ; CHECK-NEXT: b __emupac_pacda
-; CHECK-NEXT: .section .rodata
+; CHECK-NEXT: .section .data.rel.ro
 ; CHECK-NEXT: .xword [[FUNC]]@FUNCINIT
 @disc = constant ptr ptrauth (ptr @dsolocal, i32 2, i64 0, ptr @disc), align 8
 
@@ -76,7 +76,7 @@
 ; CHECK-NEXT: adrp x1, [[PLACE]]+65536
 ; CHECK-NEXT: add x1, x1, :lo12:[[PLACE]]+65536
 ; CHECK-NEXT: b __emupac_pacda
-; CHECK-NEXT: .section .rodata
+; CHECK-NEXT: .section .data.rel.ro
 ; CHECK-NEXT: .xword [[FUNC]]@FUNCINIT
 @disc65536 = constant ptr ptrauth (ptr @dsolocal, i32 2, i64 65536, ptr @disc), align 8
 
@@ -90,7 +90,7 @@
 ; CHECK-NEXT: ldr x0, [x0, :got_lo12:global]
 ; CHECK-NEXT: mov x1, #4
 ; CHECK-NEXT: b __emupac_pacda
-; CHECK-NEXT: .section .rodata
+; CHECK-NEXT: .section .data.rel.ro
 ; CHECK-NEXT: .xword [[FUNC]]@FUNCINIT
 @globalref = constant ptr ptrauth (ptr @global, i32 2, i64 4, ptr null), align 8
 
@@ -103,7 +103,7 @@
 ; CHECK-NEXT: add x0, x0, #8
 ; CHECK-NEXT: mov x1, #5
 ; CHECK-NEXT: b __emupac_pacda
-; CHECK-NEXT: .section .rodata
+; CHECK-NEXT: .section .data.rel.ro
 ; CHECK-NEXT: .xword [[FUNC]]@FUNCINIT
 @globalref8 = constant ptr ptrauth (ptr getelementptr (i8, ptr @global, i64 8), i32 2, i64 5, ptr null), align 8
 
@@ -118,7 +118,7 @@
 ; CHECK-NEXT: add x0, x0, x16
 ; CHECK-NEXT: mov x1, #5
 ; CHECK-NEXT: b __emupac_pacda
-; CHECK-NEXT: .section .rodata
+; CHECK-NEXT: .section .data.rel.ro
 ; CHECK-NEXT: .xword [[FUNC]]@FUNCINIT
 @globalref16777216 = constant ptr ptrauth (ptr getelementptr (i8, ptr @global, i64 16777216), i32 2, i64 5, ptr null), align 8
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/176052


More information about the llvm-branch-commits mailing list