[llvm] 8493467 - [JITLink][AArch64] Ensure that nulls remain null during ptrauth signing.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 27 20:19:47 PST 2025


Author: Lang Hames
Date: 2025-02-28T15:19:41+11:00
New Revision: 84934674907781c50494a125889ed16e23de2b9f

URL: https://github.com/llvm/llvm-project/commit/84934674907781c50494a125889ed16e23de2b9f
DIFF: https://github.com/llvm/llvm-project/commit/84934674907781c50494a125889ed16e23de2b9f.diff

LOG: [JITLink][AArch64] Ensure that nulls remain null during ptrauth signing.

Signing a null pointer value can, and usually will, result in some high bits
being set, causing null checks to fail. E.g. in

extern void __attribute__((weak_import)) f(void);
void (*p) = &f;

if f is undefined then p should be null (left unsigned).

This patch updates lowerPointer64AuthEdgesToSigningFunction to check for
Pointer64Authenticated edges to null targets. Where found, these edges are
turned into plain Pointer64 edges (which we know from context will write a null
value to the fixup location), and signing instructions for these locations are
omitted from the signing function.

Added: 
    llvm/test/ExecutionEngine/JITLink/AArch64/MachO_ptrauth-null-global.s

Modified: 
    llvm/lib/ExecutionEngine/JITLink/aarch64.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp b/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
index 8067e2a173a00..8ce7e74d67cde 100644
--- a/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/aarch64.cpp
@@ -324,11 +324,18 @@ Error lowerPointer64AuthEdgesToSigningFunction(LinkGraph &G) {
 
       uint64_t EncodedInfo = E.getAddend();
       int32_t RealAddend = (uint32_t)(EncodedInfo & 0xffffffff);
+      auto ValueToSign = E.getTarget().getAddress() + RealAddend;
+      if (!ValueToSign) {
+        LLVM_DEBUG(dbgs() << "  " << B->getFixupAddress(E) << " <- null\n");
+        E.setAddend(RealAddend);
+        E.setKind(aarch64::Pointer64);
+        continue;
+      }
+
       uint32_t InitialDiscriminator = (EncodedInfo >> 32) & 0xffff;
       bool AddressDiversify = (EncodedInfo >> 48) & 0x1;
       uint32_t Key = (EncodedInfo >> 49) & 0x3;
       uint32_t HighBits = EncodedInfo >> 51;
-      auto ValueToSign = E.getTarget().getAddress() + RealAddend;
 
       if (HighBits != 0x1000)
         return make_error<JITLinkError>(

diff  --git a/llvm/test/ExecutionEngine/JITLink/AArch64/MachO_ptrauth-null-global.s b/llvm/test/ExecutionEngine/JITLink/AArch64/MachO_ptrauth-null-global.s
new file mode 100644
index 0000000000000..22ccc1630c63d
--- /dev/null
+++ b/llvm/test/ExecutionEngine/JITLink/AArch64/MachO_ptrauth-null-global.s
@@ -0,0 +1,34 @@
+# RUN: llvm-mc -triple=arm64e-apple-macosx -filetype=obj -o %t.o %s
+# RUN: llvm-jitlink %t.o
+#
+# REQUIRES: system-darwin && host=arm64{{.*}}
+#
+# Check that arm64e ptrauth pass preserves nulls.
+#
+# Testcase derived from:
+#   extern void __attribute__((weak_import)) f(void);
+#   void (*p) = &f;
+#
+#   int main(int argc, char *argv[]) {
+#     return p ? 1 : 0;
+#   }
+
+        .section        __TEXT,__text,regular,pure_instructions
+        .globl  _main
+        .p2align        2
+_main:
+        adrp    x8, _p at PAGE
+        ldr     x8, [x8, _p at PAGEOFF]
+        cmp     x8, #0
+        cset    w0, ne
+        ret
+
+        .section        __DATA,__data
+        .globl  _p
+        .p2align        3, 0x0
+_p:
+        .quad   _f at AUTH(ia,0)
+
+        .weak_reference _f
+        .weak_reference l_f.ptrauth
+.subsections_via_symbols


        


More information about the llvm-commits mailing list