https://github.com/kovdan01 created https://github.com/llvm/llvm-project/pull/204226
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. >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] [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) ] _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
