https://github.com/kovdan01 updated 
https://github.com/llvm/llvm-project/pull/204226

>From ed37c72a50cbc61eaf083e30dde806a176549712 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <[email protected]>
Date: Tue, 16 Jun 2026 21:43:12 +0300
Subject: [PATCH 1/2] [PAC][clang] Fix ptrauth module flags behavior

The `Error` merge behavior only has effect when module flags values
mismatch, while it allows the flag being present in one module and
absent in another one.

Always emit `ptrauth-elf-got` module flag for AArch64 targets and
`ptrauth-sign-personality` module flag for AArch64 Linux targets.
The value is either 0 or 1.
---
 clang/lib/CodeGen/CodeGenModule.cpp           | 12 +++++++-----
 clang/test/CodeGen/ptrauth-module-flags.c     | 12 ++++++++++--
 clang/test/CodeGen/ubsan-function-sugared.cpp |  2 +-
 clang/test/CodeGen/ubsan-function.cpp         |  2 +-
 clang/test/CodeGenCXX/pfp-memcpy.cpp          |  4 ++--
 5 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 41049d85121be..4d38fbdf20536 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1481,13 +1481,15 @@ void CodeGenModule::Release() {
       getModule().addModuleFlag(llvm::Module::Min,
                                 "sign-return-address-with-bkey", 2);
 
-    if (LangOpts.PointerAuthELFGOT)
-      getModule().addModuleFlag(llvm::Module::Error, "ptrauth-elf-got", 1);
+    getModule().addModuleFlag(
+        llvm::Module::Error, "ptrauth-elf-got",
+        static_cast<uint32_t>(LangOpts.PointerAuthELFGOT));
 
     if (getTriple().isOSLinux()) {
-      if (LangOpts.PointerAuthCalls)
-        getModule().addModuleFlag(llvm::Module::Error,
-                                  "ptrauth-sign-personality", 1);
+      getModule().addModuleFlag(
+          llvm::Module::Error, "ptrauth-sign-personality",
+          static_cast<uint32_t>(LangOpts.PointerAuthCalls));
+
       assert(getTriple().isOSBinFormatELF());
       using namespace llvm::ELF;
       uint64_t PAuthABIVersion =
diff --git a/clang/test/CodeGen/ptrauth-module-flags.c 
b/clang/test/CodeGen/ptrauth-module-flags.c
index 6c175c0aad781..ffe62ec25f655 100644
--- a/clang/test/CodeGen/ptrauth-module-flags.c
+++ b/clang/test/CodeGen/ptrauth-module-flags.c
@@ -4,10 +4,18 @@
 
 // ELFGOT:      !llvm.module.flags = !{
 // ELFGOT-SAME: !0
+// ELFGOT-SAME: !1
 // ELFGOT:      !0 = !{i32 1, !"ptrauth-elf-got", i32 1}
+// ELFGOT:      !1 = !{i32 1, !"ptrauth-sign-personality", i32 0}
 
 // PERSONALITY:      !llvm.module.flags = !{
 // PERSONALITY-SAME: !0
-// PERSONALITY:      !0 = !{i32 1, !"ptrauth-sign-personality", i32 1}
+// PERSONALITY-SAME: !1
+// PERSONALITY:      !0 = !{i32 1, !"ptrauth-elf-got", i32 0}
+// PERSONALITY:      !1 = !{i32 1, !"ptrauth-sign-personality", i32 1}
 
-// OFF-NOT: "ptrauth-
+// OFF:      !llvm.module.flags = !{
+// OFF-SAME: !0
+// OFF-SAME: !1
+// OFF:      !0 = !{i32 1, !"ptrauth-elf-got", i32 0}
+// OFF:      !1 = !{i32 1, !"ptrauth-sign-personality", i32 0}
diff --git a/clang/test/CodeGen/ubsan-function-sugared.cpp 
b/clang/test/CodeGen/ubsan-function-sugared.cpp
index 308edd8c0cd9b..2a6f8c81d7e0f 100644
--- a/clang/test/CodeGen/ubsan-function-sugared.cpp
+++ b/clang/test/CodeGen/ubsan-function-sugared.cpp
@@ -10,7 +10,7 @@ auto fun() {}
 
 // GNU-LABEL:  define{{.*}} void @_Z6callerv()
 // MSVC-LABEL: define{{.*}} void @"?caller@@YAXXZ"()
-// ARM:   call ptr @llvm.ptrmask.p0.i32(ptr {{.*}}, i32 -2), !nosanitize !5
+// ARM:   call ptr @llvm.ptrmask.p0.i32(ptr {{.*}}, i32 -2), !nosanitize
 // CHECK: getelementptr <{ i32, i32 }>, ptr {{.*}}, i32 -1, i32 0, !nosanitize
 // CHECK: load i32, ptr {{.*}}, align {{.*}}, !nosanitize
 // CHECK: icmp eq i32 {{.*}}, -1056584962, !nosanitize
diff --git a/clang/test/CodeGen/ubsan-function.cpp 
b/clang/test/CodeGen/ubsan-function.cpp
index 817a9cbefe690..cf419fa5b4753 100644
--- a/clang/test/CodeGen/ubsan-function.cpp
+++ b/clang/test/CodeGen/ubsan-function.cpp
@@ -13,7 +13,7 @@ void fun() {}
 
 // GNU-LABEL:  define{{.*}} void @_Z6callerPFvvE(ptr noundef %f)
 // MSVC-LABEL: define{{.*}} void @"?caller@@YAXP6AXXZ@Z"(ptr noundef %f)
-// ARM:   call ptr @llvm.ptrmask.p0.i32(ptr {{.*}}, i32 -2), !nosanitize !6
+// ARM:   call ptr @llvm.ptrmask.p0.i32(ptr {{.*}}, i32 -2), !nosanitize
 // AUTH:  %[[STRIPPED:.*]] = ptrtoint ptr {{.*}} to i64, !nosanitize
 // AUTH:  call i64 @llvm.ptrauth.auth(i64 %[[STRIPPED]], i32 0, i64 0), 
!nosanitize
 // CHECK: getelementptr <{ i32, i32 }>, ptr {{.*}}, i32 -1, i32 0, !nosanitize
diff --git a/clang/test/CodeGenCXX/pfp-memcpy.cpp 
b/clang/test/CodeGenCXX/pfp-memcpy.cpp
index be746fd8673a0..9621901c5c4c7 100644
--- a/clang/test/CodeGenCXX/pfp-memcpy.cpp
+++ b/clang/test/CodeGenCXX/pfp-memcpy.cpp
@@ -42,7 +42,7 @@ void trivial_copy(ClassWithTrivialCopy *s1) {
 // CHECK-NEXT: %a = getelementptr inbounds nuw %struct.ClassWithTrivialCopy, 
ptr %this1, i32 0, i32 0
 // CHECK-NEXT: %1 = ptrtoint ptr %this1 to i64
 // CHECK-NEXT: %2 = call ptr @llvm.protected.field.ptr.p0(ptr %a, i64 %1, i1 
true) [ "deactivation-symbol"(ptr @__pfp_ds__ZTS20ClassWithTrivialCopy.a) ]
-// CHECK-NEXT: %3 = load ptr, ptr %.addr, align 8, !nonnull !1, !align !2
+// CHECK-NEXT: %3 = load ptr, ptr %.addr, align 8, !nonnull ![[#]], !align 
![[#]]
 // CHECK-NEXT: %a2 = getelementptr inbounds nuw %struct.ClassWithTrivialCopy, 
ptr %3, i32 0, i32 0
 // CHECK-NEXT: %4 = ptrtoint ptr %3 to i64
 // CHECK-NEXT: %5 = call ptr @llvm.protected.field.ptr.p0(ptr %a2, i64 %4, i1 
true) [ "deactivation-symbol"(ptr @__pfp_ds__ZTS20ClassWithTrivialCopy.a) ]
@@ -51,7 +51,7 @@ void trivial_copy(ClassWithTrivialCopy *s1) {
 // CHECK-NEXT: %c = getelementptr inbounds nuw %struct.ClassWithTrivialCopy, 
ptr %this1, i32 0, i32 1
 // CHECK-NEXT: %7 = ptrtoint ptr %this1 to i64
 // CHECK-NEXT: %8 = call ptr @llvm.protected.field.ptr.p0(ptr %c, i64 %7, i1 
true) [ "deactivation-symbol"(ptr @__pfp_ds__ZTS20ClassWithTrivialCopy.c) ]
-// CHECK-NEXT: %9 = load ptr, ptr %.addr, align 8, !nonnull !1, !align !2
+// CHECK-NEXT: %9 = load ptr, ptr %.addr, align 8, !nonnull ![[#]], !align 
![[#]]
 // CHECK-NEXT: %c3 = getelementptr inbounds nuw %struct.ClassWithTrivialCopy, 
ptr %9, i32 0, i32 1
 // CHECK-NEXT: %10 = ptrtoint ptr %9 to i64
 // CHECK-NEXT: %11 = call ptr @llvm.protected.field.ptr.p0(ptr %c3, i64 %10, 
i1 true) [ "deactivation-symbol"(ptr @__pfp_ds__ZTS20ClassWithTrivialCopy.c) ]

>From ba1154796fb6e3374f06c4bc2d5c6c16810ce2bb Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <[email protected]>
Date: Thu, 18 Jun 2026 20:07:32 +0300
Subject: [PATCH 2/2] Address review comments

---
 clang/lib/CodeGen/CodeGenModule.cpp | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/clang/lib/CodeGen/CodeGenModule.cpp 
b/clang/lib/CodeGen/CodeGenModule.cpp
index 4d38fbdf20536..2942687bd37a0 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1480,7 +1480,8 @@ void CodeGenModule::Release() {
     if (!LangOpts.isSignReturnAddressWithAKey())
       getModule().addModuleFlag(llvm::Module::Min,
                                 "sign-return-address-with-bkey", 2);
-
+  }
+  if (T.isAArch64()) {
     getModule().addModuleFlag(
         llvm::Module::Error, "ptrauth-elf-got",
         static_cast<uint32_t>(LangOpts.PointerAuthELFGOT));
@@ -1520,14 +1521,12 @@ void CodeGenModule::Release() {
       static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_FPTRTYPEDISCR ==
                         AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
                     "Update when new enum items are defined");
-      if (PAuthABIVersion != 0) {
-        getModule().addModuleFlag(llvm::Module::Error,
-                                  "aarch64-elf-pauthabi-platform",
-                                  AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
-        getModule().addModuleFlag(llvm::Module::Error,
-                                  "aarch64-elf-pauthabi-version",
-                                  PAuthABIVersion);
-      }
+
+      getModule().addModuleFlag(llvm::Module::Error,
+                                "aarch64-elf-pauthabi-platform",
+                                AARCH64_PAUTH_PLATFORM_LLVM_LINUX);
+      getModule().addModuleFlag(
+          llvm::Module::Error, "aarch64-elf-pauthabi-version", 
PAuthABIVersion);
     }
   }
   if ((T.isARM() || T.isThumb()) && getTriple().isTargetAEABI() &&

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to