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

>From d8bcbde876239223fac3190faf13fe2503a4f4ec Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkova...@accesssoftek.com>
Date: Mon, 21 Oct 2024 12:18:56 +0300
Subject: [PATCH 1/8] [PAC][Driver] Support ptrauth flags only on ARM64 Darwin

Most ptrauth flags are ABI-affecting, so they should not be exposed to
end users. Under certain conditions, some ptrauth driver flags are intended
to be used for ARM64 Darwin, so allow them in this case.

Leave `-faarch64-jump-table-hardening` available for all AArch64 targets
since it's not ABI-affecting.
---
 clang/lib/Driver/ToolChains/Clang.cpp |  28 -----
 clang/lib/Driver/ToolChains/Linux.cpp |  53 ++-------
 clang/test/Driver/aarch64-ptrauth.c   | 164 ++++++++++++++++++++------
 3 files changed, 135 insertions(+), 110 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 42368e7d8ef7e..7cb609b5c000b 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1665,34 +1665,6 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
 
   AddUnalignedAccessWarning(CmdArgs);
 
-  Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_intrinsics,
-                    options::OPT_fno_ptrauth_intrinsics);
-  Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_calls,
-                    options::OPT_fno_ptrauth_calls);
-  Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_returns,
-                    options::OPT_fno_ptrauth_returns);
-  Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_auth_traps,
-                    options::OPT_fno_ptrauth_auth_traps);
-  Args.addOptInFlag(
-      CmdArgs, options::OPT_fptrauth_vtable_pointer_address_discrimination,
-      options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
-  Args.addOptInFlag(
-      CmdArgs, options::OPT_fptrauth_vtable_pointer_type_discrimination,
-      options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
-  Args.addOptInFlag(
-      CmdArgs, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
-      options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
-  Args.addOptInFlag(
-      CmdArgs, options::OPT_fptrauth_function_pointer_type_discrimination,
-      options::OPT_fno_ptrauth_function_pointer_type_discrimination);
-
-  Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_indirect_gotos,
-                    options::OPT_fno_ptrauth_indirect_gotos);
-  Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_init_fini,
-                    options::OPT_fno_ptrauth_init_fini);
-  Args.addOptInFlag(CmdArgs,
-                    options::OPT_fptrauth_init_fini_address_discrimination,
-                    options::OPT_fno_ptrauth_init_fini_address_discrimination);
   Args.addOptInFlag(CmdArgs, options::OPT_faarch64_jump_table_hardening,
                     options::OPT_fno_aarch64_jump_table_hardening);
 
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp 
b/clang/lib/Driver/ToolChains/Linux.cpp
index 04a8ad1d165d4..1e93b3aafbf47 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -484,49 +484,16 @@ std::string Linux::ComputeEffectiveClangTriple(const 
llvm::opt::ArgList &Args,
 // options represent the default signing schema.
 static void handlePAuthABI(const Driver &D, const ArgList &DriverArgs,
                            ArgStringList &CC1Args) {
-  if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
-                         options::OPT_fno_ptrauth_intrinsics))
-    CC1Args.push_back("-fptrauth-intrinsics");
-
-  if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
-                         options::OPT_fno_ptrauth_calls))
-    CC1Args.push_back("-fptrauth-calls");
-
-  if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
-                         options::OPT_fno_ptrauth_returns))
-    CC1Args.push_back("-fptrauth-returns");
-
-  if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
-                         options::OPT_fno_ptrauth_auth_traps))
-    CC1Args.push_back("-fptrauth-auth-traps");
-
-  if (!DriverArgs.hasArg(
-          options::OPT_fptrauth_vtable_pointer_address_discrimination,
-          options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
-    CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
-
-  if (!DriverArgs.hasArg(
-          options::OPT_fptrauth_vtable_pointer_type_discrimination,
-          options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
-    CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
-
-  if (!DriverArgs.hasArg(
-          options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
-          options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination))
-    CC1Args.push_back("-fptrauth-type-info-vtable-pointer-discrimination");
-
-  if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
-                         options::OPT_fno_ptrauth_indirect_gotos))
-    CC1Args.push_back("-fptrauth-indirect-gotos");
-
-  if (!DriverArgs.hasArg(options::OPT_fptrauth_init_fini,
-                         options::OPT_fno_ptrauth_init_fini))
-    CC1Args.push_back("-fptrauth-init-fini");
-
-  if (!DriverArgs.hasArg(
-          options::OPT_fptrauth_init_fini_address_discrimination,
-          options::OPT_fno_ptrauth_init_fini_address_discrimination))
-    CC1Args.push_back("-fptrauth-init-fini-address-discrimination");
+  CC1Args.push_back("-fptrauth-intrinsics");
+  CC1Args.push_back("-fptrauth-calls");
+  CC1Args.push_back("-fptrauth-returns");
+  CC1Args.push_back("-fptrauth-auth-traps");
+  CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
+  CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
+  CC1Args.push_back("-fptrauth-type-info-vtable-pointer-discrimination");
+  CC1Args.push_back("-fptrauth-indirect-gotos");
+  CC1Args.push_back("-fptrauth-init-fini");
+  CC1Args.push_back("-fptrauth-init-fini-address-discrimination");
 
   if (!DriverArgs.hasArg(options::OPT_faarch64_jump_table_hardening,
                          options::OPT_fno_aarch64_jump_table_hardening))
diff --git a/clang/test/Driver/aarch64-ptrauth.c 
b/clang/test/Driver/aarch64-ptrauth.c
index b080a77195c8c..f5a0eaf37958a 100644
--- a/clang/test/Driver/aarch64-ptrauth.c
+++ b/clang/test/Driver/aarch64-ptrauth.c
@@ -4,7 +4,8 @@
 // NONE:     "-cc1"
 // NONE-NOT: "-fptrauth-
 
-// RUN: %clang -### -c --target=aarch64 \
+//// -fptauth-* driver flags on Linux are only supported with pauthtest ABI.
+// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest \
 // RUN:   -fno-ptrauth-intrinsics -fptrauth-intrinsics \
 // RUN:   -fno-ptrauth-calls -fptrauth-calls \
 // RUN:   -fno-ptrauth-returns -fptrauth-returns \
@@ -15,32 +16,77 @@
 // RUN:   -fno-ptrauth-indirect-gotos -fptrauth-indirect-gotos \
 // RUN:   -fno-ptrauth-init-fini -fptrauth-init-fini \
 // RUN:   -fno-ptrauth-init-fini-address-discrimination 
-fptrauth-init-fini-address-discrimination \
+// RUN:   -fno-ptrauth-elf-got -fptrauth-elf-got \
 // RUN:   -fno-aarch64-jump-table-hardening -faarch64-jump-table-hardening \
-// RUN:   %s 2>&1 | FileCheck %s --check-prefix=ALL
-// ALL: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-faarch64-jump-table-hardening"
+// RUN:   %s 2>&1 | FileCheck %s --check-prefix=ALL-LINUX-PAUTHABI
+// RUN: %clang -### -c --target=aarch64-linux-pauthtest \
+// RUN:   -fno-ptrauth-intrinsics -fptrauth-intrinsics \
+// RUN:   -fno-ptrauth-calls -fptrauth-calls \
+// RUN:   -fno-ptrauth-returns -fptrauth-returns \
+// RUN:   -fno-ptrauth-auth-traps -fptrauth-auth-traps \
+// RUN:   -fno-ptrauth-vtable-pointer-address-discrimination 
-fptrauth-vtable-pointer-address-discrimination \
+// RUN:   -fno-ptrauth-vtable-pointer-type-discrimination 
-fptrauth-vtable-pointer-type-discrimination \
+// RUN:   -fno-ptrauth-type-info-vtable-pointer-discrimination 
-fptrauth-type-info-vtable-pointer-discrimination \
+// RUN:   -fno-ptrauth-indirect-gotos -fptrauth-indirect-gotos \
+// RUN:   -fno-ptrauth-init-fini -fptrauth-init-fini \
+// RUN:   -fno-ptrauth-init-fini-address-discrimination 
-fptrauth-init-fini-address-discrimination \
+// RUN:   -fno-ptrauth-elf-got -fptrauth-elf-got \
+// RUN:   -fno-aarch64-jump-table-hardening -faarch64-jump-table-hardening \
+// RUN:   %s 2>&1 | FileCheck %s --check-prefix=ALL-LINUX-PAUTHABI
+// ALL-LINUX-PAUTHABI: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got"{{.*}} "-faarch64-jump-table-hardening"
+
+// RUN: %clang -### -c --target=aarch64-linux \
+// RUN:   -fno-aarch64-jump-table-hardening -faarch64-jump-table-hardening \
+// RUN:   %s 2>&1 | FileCheck %s --check-prefix=ALL-LINUX
+// ALL-LINUX: "-cc1"{{.*}} "-faarch64-jump-table-hardening"
+
+//// Some -fptrauth-* flags are supported for ARM64 Darwin.
+// RUN: %clang -### -c --target=arm64-darwin \
+// RUN:   -fno-ptrauth-intrinsics -fptrauth-intrinsics \
+// RUN:   -fno-ptrauth-calls -fptrauth-calls \
+// RUN:   -fno-ptrauth-returns -fptrauth-returns \
+// RUN:   -fno-ptrauth-auth-traps -fptrauth-auth-traps \
+// RUN:   -fno-ptrauth-vtable-pointer-address-discrimination 
-fptrauth-vtable-pointer-address-discrimination \
+// RUN:   -fno-ptrauth-vtable-pointer-type-discrimination 
-fptrauth-vtable-pointer-type-discrimination \
+// RUN:   -fno-ptrauth-type-info-vtable-pointer-discrimination 
-fptrauth-type-info-vtable-pointer-discrimination \
+// RUN:   -fno-ptrauth-indirect-gotos -fptrauth-indirect-gotos \
+// RUN:   -fno-aarch64-jump-table-hardening -faarch64-jump-table-hardening \
+// RUN:   %s 2>&1 | FileCheck %s --check-prefix=ALL-DARWIN
+// ALL-DARWIN: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" 
"-fptrauth-indirect-gotos"{{.*}} "-faarch64-jump-table-hardening"
 
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHABI1
 // RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI1
+// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=0 %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
+// RUN: %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=0 %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
 // PAUTHABI1:      "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
-// PAUTHABI1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-faarch64-jump-table-hardening"
+// PAUTHABI1-SAME: "-fptrauth-abi-version=0"
+// PAUTHABI1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got" "-faarch64-jump-table-hardening"
 // PAUTHABI1-SAME: "-target-abi" "pauthtest"
 // PAUTHABI1-NOT: "-fptrauth-function-pointer-type-discrimination"
 
+// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=1 %s 2>&1 | FileCheck %s --check-prefix=PAUTHTESTV1
+// RUN: %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=1 %s 2>&1 | FileCheck %s --check-prefix=PAUTHTESTV1
+// PAUTHTESTV1:      "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
+// PAUTHTESTV1-SAME: "-fptrauth-abi-version=1"
+// PAUTHTESTV1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got" "-faarch64-jump-table-hardening"
+// PAUTHTESTV1-SAME: "-target-abi" "pauthtest"
+// PAUTHTESTV1-NOT:  "-fptrauth-function-pointer-type-discrimination"
+
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fno-ptrauth-intrinsics \
 // RUN:   -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
 // RUN:   -fno-ptrauth-vtable-pointer-address-discrimination 
-fno-ptrauth-vtable-pointer-type-discrimination \
 // RUN:   -fno-ptrauth-type-info-vtable-pointer-discrimination 
-fno-ptrauth-indirect-gotos \
-// RUN:   -fno-ptrauth-init-fini -fno-ptrauth-init-fini-address-discrimination 
\
-// RUN:   -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI2
+// RUN:   -fno-ptrauth-init-fini -fno-ptrauth-init-fini-address-discrimination 
-fno-ptrauth-elf-got \
+// RUN:   -fno-ptrauth-abi-version -fno-aarch64-jump-table-hardening %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHABI2
 // RUN: %clang -### -c --target=aarch64-linux-pauthtest 
-fno-ptrauth-intrinsics \
 // RUN:   -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
 // RUN:   -fno-ptrauth-vtable-pointer-address-discrimination 
-fno-ptrauth-vtable-pointer-type-discrimination \
 // RUN:   -fno-ptrauth-type-info-vtable-pointer-discrimination 
-fno-ptrauth-indirect-gotos \
-// RUN:   -fno-ptrauth-init-fini -fno-ptrauth-init-fini-address-discrimination 
\
-// RUN:   -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI2
+// RUN:   -fno-ptrauth-init-fini -fno-ptrauth-init-fini-address-discrimination 
-fno-ptrauth-elf-got \
+// RUN:   -fno-ptrauth-abi-version -fno-aarch64-jump-table-hardening %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHABI2
 
 //// Non-linux OS: pauthtest ABI has no effect in terms of passing ptrauth cc1 
flags.
-//// An error about unsupported ABI will be emitted later in pipeline (see 
ERR2 below)
+//// An error about unsupported ABI will be emitted later in pipeline (see 
ERR3 below)
 // RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI2
 
 // PAUTHABI2:      "-cc1"
@@ -55,10 +101,12 @@
 // PAUTHABI3-NOT:  "-fptrauth-
 // PAUTHABI3-NOT: "-faarch64-jump-table-hardening"
 
-// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics 
-fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
+//// Non-pauthtest ABI.
+// RUN: not %clang -### -c --target=aarch64-linux -fptrauth-intrinsics 
-fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
 // RUN:   -fptrauth-vtable-pointer-address-discrimination 
-fptrauth-vtable-pointer-type-discrimination \
 // RUN:   -fptrauth-type-info-vtable-pointer-discrimination 
-fptrauth-indirect-gotos -fptrauth-init-fini \
-// RUN:   -fptrauth-init-fini-address-discrimination 
-faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=ERR1
+// RUN:   -fptrauth-init-fini-address-discrimination -fptrauth-elf-got 
-fptrauth-abi-version=1 -fno-ptrauth-abi-version \
+// RUN:   %s 2>&1 | FileCheck %s --check-prefix=ERR1
 // ERR1:      error: unsupported option '-fptrauth-intrinsics' for target 
'{{.*}}'
 // ERR1-NEXT: error: unsupported option '-fptrauth-calls' for target '{{.*}}'
 // ERR1-NEXT: error: unsupported option '-fptrauth-returns' for target '{{.*}}'
@@ -69,59 +117,97 @@
 // ERR1-NEXT: error: unsupported option '-fptrauth-indirect-gotos' for target 
'{{.*}}'
 // ERR1-NEXT: error: unsupported option '-fptrauth-init-fini' for target 
'{{.*}}'
 // ERR1-NEXT: error: unsupported option 
'-fptrauth-init-fini-address-discrimination' for target '{{.*}}'
-// ERR1-NEXT: error: unsupported option '-faarch64-jump-table-hardening' for 
target '{{.*}}'
-
+// ERR1-NEXT: error: unsupported option '-fptrauth-elf-got' for target '{{.*}}'
+// ERR1-NEXT: error: unsupported option '-fptrauth-abi-version=' for target 
'{{.*}}'
+// ERR1-NEXT: error: unsupported option '-fno-ptrauth-abi-version' for target 
'{{.*}}'
+
+// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=2 %s 2>&1 | FileCheck %s --check-prefix=PAUTHTESTV2
+// RUN: %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=2 %s 2>&1 | FileCheck %s --check-prefix=PAUTHTESTV2
+// PAUTHTESTV2:      "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
+// PAUTHTESTV2-SAME: "-fptrauth-abi-version=2"
+// PAUTHTESTV2-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got" "-faarch64-jump-table-hardening" 
"-fptrauth-function-pointer-type-discrimination"
+// PAUTHTESTV2-SAME: "-target-abi" "pauthtest"
+
+// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=1 -fno-ptrauth-abi-version %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTESTVNONE
+// RUN: %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=1 -fno-ptrauth-abi-version %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTESTVNONE
+// PAUTHTESTVNONE:      "-cc1"{{.*}} "-triple" 
"aarch64-unknown-linux-pauthtest"
+// PAUTHTESTVNONE-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got" "-faarch64-jump-table-hardening"
+// PAUTHTESTVNONE-SAME: "-target-abi" "pauthtest"
+// PAUTHTESTVNONE-NOT:  "-fptrauth-abi-version
+
+//// A pauth-aware environment (e.g. pauthtest) must be chosen to manipulate 
ptrauth ABI versioning.
+// RUN: not %clang -### -c --target=aarch64-linux -fptrauth-abi-version=1 
-fno-ptrauth-abi-version %s 2>&1 | FileCheck %s --check-prefix=ERR0
+// ERR0:      error: unsupported option '-fptrauth-abi-version=' for target 
'{{.*}}'
+// ERR0-NEXT: error: unsupported option '-fno-ptrauth-abi-version' for target 
'{{.*}}'
+
+//// Non-AArch64.
+// RUN: not %clang -### -c --target=x86_64-linux 
-faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=ERR2
+// ERR2: error: unsupported option '-faarch64-jump-table-hardening' for target 
'{{.*}}'
+
+//// Only support PAuth ABI for Linux as for now.
+// RUN: not %clang -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=ERR3
+// ERR3: error: unknown target ABI 'pauthtest'
 
-// RUN: not %clang -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=ERR2
 //// The ABI is not specified explicitly, and for non-Linux pauthtest 
environment does not correspond
 //// to pauthtest ABI (each OS target defines this behavior separately). Do 
not emit an error.
-// RUN:     %clang -c --target=aarch64-pauthtest       %s -o /dev/null
-// ERR2: error: unknown target ABI 'pauthtest'
+// RUN: %clang -c --target=aarch64-pauthtest %s -o /dev/null
 
 //// PAuth ABI is encoded as environment part of the triple, so don't allow to 
explicitly set other environments.
-// RUN: not %clang -### -c --target=aarch64-linux-gnu -mabi=pauthtest %s 2>&1 
| FileCheck %s --check-prefix=ERR3
-// ERR3: error: unsupported option '-mabi=pauthtest' for target 
'aarch64-unknown-linux-gnu'
+// RUN: not %clang -### -c --target=aarch64-linux-gnu -mabi=pauthtest %s 2>&1 
| FileCheck %s --check-prefix=ERR4
+// ERR4: error: unsupported option '-mabi=pauthtest' for target 
'aarch64-unknown-linux-gnu'
 // RUN: %clang -### -c --target=aarch64-linux-pauthtest -mabi=pauthtest %s
 
 //// The only branch protection option compatible with PAuthABI is BTI.
 // RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-mbranch-protection=pac-ret %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR4_1
+// RUN:   FileCheck %s --check-prefix=ERR5_1
 // RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-mbranch-protection=pac-ret %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR4_1
+// RUN:   FileCheck %s --check-prefix=ERR5_1
 // RUN: not %clang -### -c --target=aarch64 -fptrauth-returns     
-mbranch-protection=pac-ret %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR4_2
-// ERR4_1: error: unsupported option '-mbranch-protection=pac-ret' for target 
'aarch64-unknown-linux-pauthtest'
-// ERR4_2: error: the combination of '-mbranch-protection=pac-ret' and 
'-fptrauth-returns' is incompatible
+// RUN:   FileCheck %s --check-prefix=ERR5_2
+// ERR5_1: error: unsupported option '-mbranch-protection=pac-ret' for target 
'aarch64-unknown-linux-pauthtest'
+// ERR5_2: error: the combination of '-mbranch-protection=pac-ret' and 
'-fptrauth-returns' is incompatible
 
 // RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-mbranch-protection=gcs %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR5_1
+// RUN:   FileCheck %s --check-prefix=ERR6_1
 // RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-mbranch-protection=gcs %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR5_1
+// RUN:   FileCheck %s --check-prefix=ERR6_1
 // RUN: not %clang -### -c --target=aarch64 -fptrauth-returns     
-mbranch-protection=gcs %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR5_2
-// ERR5_1: error: unsupported option '-mbranch-protection=gcs' for target 
'aarch64-unknown-linux-pauthtest'
-// ERR5_2: error: the combination of '-mbranch-protection=gcs' and 
'-fptrauth-returns' is incompatible
+// RUN:   FileCheck %s --check-prefix=ERR6_2
+// ERR6_1: error: unsupported option '-mbranch-protection=gcs' for target 
'aarch64-unknown-linux-pauthtest'
+// ERR6_2: error: the combination of '-mbranch-protection=gcs' and 
'-fptrauth-returns' is incompatible
 
 // RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-mbranch-protection=standard %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR6_1
+// RUN:   FileCheck %s --check-prefix=ERR7_1
 // RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-mbranch-protection=standard %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR6_1
+// RUN:   FileCheck %s --check-prefix=ERR7_1
 // RUN: not %clang -### -c --target=aarch64 -fptrauth-returns     
-mbranch-protection=standard %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR6_2
-// ERR6_1: error: unsupported option '-mbranch-protection=standard' for target 
'aarch64-unknown-linux-pauthtest'
-// ERR6_2: error: the combination of '-mbranch-protection=standard' and 
'-fptrauth-returns' is incompatible
+// RUN:   FileCheck %s --check-prefix=ERR7_2
+// ERR7_1: error: unsupported option '-mbranch-protection=standard' for target 
'aarch64-unknown-linux-pauthtest'
+// ERR7_2: error: the combination of '-mbranch-protection=standard' and 
'-fptrauth-returns' is incompatible
 
 // RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-msign-return-address=all %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR7
+// RUN:   FileCheck %s --check-prefix=ERR8
 // RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-msign-return-address=all %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR7
-// ERR7: error: unsupported option '-msign-return-address=all' for target 
'aarch64-unknown-linux-pauthtest'
+// RUN:   FileCheck %s --check-prefix=ERR8
+// ERR8: error: unsupported option '-msign-return-address=all' for target 
'aarch64-unknown-linux-pauthtest'
 
 // RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-msign-return-address=non-leaf %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR8
+// RUN:   FileCheck %s --check-prefix=ERR9
 // RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-msign-return-address=non-leaf %s 2>&1 | \
-// RUN:   FileCheck %s --check-prefix=ERR8
-// ERR8: error: unsupported option '-msign-return-address=non-leaf' for target 
'aarch64-unknown-linux-pauthtest'
+// RUN:   FileCheck %s --check-prefix=ERR9
+// ERR9: error: unsupported option '-msign-return-address=non-leaf' for target 
'aarch64-unknown-linux-pauthtest'
+
+// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=3 %s 2>&1 | FileCheck %s --check-prefix=ERR10
+// RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=3 %s 2>&1 | FileCheck %s --check-prefix=ERR10
+// ERR10: error: invalid value '3' in '-fptrauth-abi-version=3'
+
+// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=xxx %s 2>&1 | FileCheck %s --check-prefix=ERR11
+// RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=xxx %s 2>&1 | FileCheck %s --check-prefix=ERR11
+// ERR11: error: invalid value 'xxx' in '-fptrauth-abi-version=xxx'
+
+// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=-1 %s 2>&1 | FileCheck %s --check-prefix=ERR12
+// RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=-1 %s 2>&1 | FileCheck %s --check-prefix=ERR12
+// ERR12: error: invalid value '-1' in '-fptrauth-abi-version=-1'
 
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-msign-return-address=none %s
 // RUN: %clang -### -c --target=aarch64-linux-pauthtest       
-msign-return-address=none %s

>From e441cac4b2885f52ecff755ea96d33e33481c8df Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkova...@accesssoftek.com>
Date: Mon, 25 Nov 2024 00:50:49 +0300
Subject: [PATCH 2/8] For pauthtest ABI, allow ptrauth driver flags

---
 clang/lib/Driver/ToolChains/Linux.cpp | 102 +++++++++++++++++++++++---
 1 file changed, 91 insertions(+), 11 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/Linux.cpp 
b/clang/lib/Driver/ToolChains/Linux.cpp
index 1e93b3aafbf47..6cb340aa57b61 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -484,28 +484,108 @@ std::string Linux::ComputeEffectiveClangTriple(const 
llvm::opt::ArgList &Args,
 // options represent the default signing schema.
 static void handlePAuthABI(const Driver &D, const ArgList &DriverArgs,
                            ArgStringList &CC1Args) {
-  CC1Args.push_back("-fptrauth-intrinsics");
-  CC1Args.push_back("-fptrauth-calls");
-  CC1Args.push_back("-fptrauth-returns");
-  CC1Args.push_back("-fptrauth-auth-traps");
-  CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
-  CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
-  CC1Args.push_back("-fptrauth-type-info-vtable-pointer-discrimination");
-  CC1Args.push_back("-fptrauth-indirect-gotos");
-  CC1Args.push_back("-fptrauth-init-fini");
-  CC1Args.push_back("-fptrauth-init-fini-address-discrimination");
+  if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
+                         options::OPT_fno_ptrauth_intrinsics))
+    CC1Args.push_back("-fptrauth-intrinsics");
+
+  if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
+                         options::OPT_fno_ptrauth_calls))
+    CC1Args.push_back("-fptrauth-calls");
+
+  if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
+                         options::OPT_fno_ptrauth_returns))
+    CC1Args.push_back("-fptrauth-returns");
+
+  if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
+                         options::OPT_fno_ptrauth_auth_traps))
+    CC1Args.push_back("-fptrauth-auth-traps");
+
+  if (!DriverArgs.hasArg(
+          options::OPT_fptrauth_vtable_pointer_address_discrimination,
+          options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
+    CC1Args.push_back("-fptrauth-vtable-pointer-address-discrimination");
+
+  if (!DriverArgs.hasArg(
+          options::OPT_fptrauth_vtable_pointer_type_discrimination,
+          options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
+    CC1Args.push_back("-fptrauth-vtable-pointer-type-discrimination");
+
+  if (!DriverArgs.hasArg(
+          options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
+          options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination))
+    CC1Args.push_back("-fptrauth-type-info-vtable-pointer-discrimination");
+
+  if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
+                         options::OPT_fno_ptrauth_indirect_gotos))
+    CC1Args.push_back("-fptrauth-indirect-gotos");
+
+  if (!DriverArgs.hasArg(options::OPT_fptrauth_init_fini,
+                         options::OPT_fno_ptrauth_init_fini))
+    CC1Args.push_back("-fptrauth-init-fini");
+
+  if (!DriverArgs.hasArg(
+          options::OPT_fptrauth_init_fini_address_discrimination,
+          options::OPT_fno_ptrauth_init_fini_address_discrimination))
+    CC1Args.push_back("-fptrauth-init-fini-address-discrimination");
 
   if (!DriverArgs.hasArg(options::OPT_faarch64_jump_table_hardening,
                          options::OPT_fno_aarch64_jump_table_hardening))
     CC1Args.push_back("-faarch64-jump-table-hardening");
 }
 
+static void addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
+                                llvm::opt::ArgStringList &CC1Args) {
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_intrinsics,
+                          options::OPT_fno_ptrauth_intrinsics);
+
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_calls,
+                          options::OPT_fno_ptrauth_calls);
+
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_returns,
+                          options::OPT_fno_ptrauth_returns);
+
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_auth_traps,
+                          options::OPT_fno_ptrauth_auth_traps);
+
+  DriverArgs.addOptInFlag(
+      CC1Args, options::OPT_fptrauth_vtable_pointer_address_discrimination,
+      options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
+
+  DriverArgs.addOptInFlag(
+      CC1Args, options::OPT_fptrauth_vtable_pointer_type_discrimination,
+      options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
+
+  DriverArgs.addOptInFlag(
+      CC1Args, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
+      options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
+
+  DriverArgs.addOptInFlag(
+      CC1Args, options::OPT_fptrauth_function_pointer_type_discrimination,
+      options::OPT_fno_ptrauth_function_pointer_type_discrimination);
+
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_indirect_gotos,
+                          options::OPT_fno_ptrauth_indirect_gotos);
+
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_init_fini,
+                          options::OPT_fno_ptrauth_init_fini);
+
+  DriverArgs.addOptInFlag(
+      CC1Args, options::OPT_fptrauth_init_fini_address_discrimination,
+      options::OPT_fno_ptrauth_init_fini_address_discrimination);
+
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_elf_got,
+                          options::OPT_fno_ptrauth_elf_got);
+}
+
 void Linux::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
                                   llvm::opt::ArgStringList &CC1Args,
                                   Action::OffloadKind DeviceOffloadKind) const 
{
   llvm::Triple Triple(ComputeEffectiveClangTriple(DriverArgs));
-  if (Triple.isAArch64() && Triple.getEnvironment() == llvm::Triple::PAuthTest)
+  if (Triple.isAArch64() &&
+      Triple.getEnvironment() == llvm::Triple::PAuthTest) {
+    addPointerAuthFlags(DriverArgs, CC1Args);
     handlePAuthABI(getDriver(), DriverArgs, CC1Args);
+  }
   Generic_ELF::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
 }
 

>From 7765396651a42bb32148e8f5d1ea1be8a26e5f13 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkova...@accesssoftek.com>
Date: Mon, 25 Nov 2024 10:33:48 +0300
Subject: [PATCH 3/8] Minor test enhancement

---
 clang/test/Driver/aarch64-ptrauth.c | 48 +++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/clang/test/Driver/aarch64-ptrauth.c 
b/clang/test/Driver/aarch64-ptrauth.c
index f5a0eaf37958a..3b2603082dddc 100644
--- a/clang/test/Driver/aarch64-ptrauth.c
+++ b/clang/test/Driver/aarch64-ptrauth.c
@@ -54,6 +54,7 @@
 // RUN:   %s 2>&1 | FileCheck %s --check-prefix=ALL-DARWIN
 // ALL-DARWIN: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" 
"-fptrauth-indirect-gotos"{{.*}} "-faarch64-jump-table-hardening"
 
+<<<<<<< HEAD
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHABI1
 // RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI1
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=0 %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
@@ -71,6 +72,21 @@
 // PAUTHTESTV1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got" "-faarch64-jump-table-hardening"
 // PAUTHTESTV1-SAME: "-target-abi" "pauthtest"
 // PAUTHTESTV1-NOT:  "-fptrauth-function-pointer-type-discrimination"
+||||||| parent of 928c63818ade (Minor test enhancement)
+// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHTEST1
+// RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTEST1
+// PAUTHTEST1:      "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
+// PAUTHTEST1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-faarch64-jump-table-hardening"
+// PAUTHTEST1-SAME: "-target-abi" "pauthtest"
+// PAUTHTEST1-NOT: "-fptrauth-function-pointer-type-discrimination"
+=======
+// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHTEST1
+// RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTEST1
+// PAUTHTEST1:      "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
+// PAUTHTEST1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-faarch64-jump-table-hardening"
+// PAUTHTEST1-SAME: "-target-abi" "pauthtest"
+// PAUTHTEST1-NOT:  "-fptrauth-function-pointer-type-discrimination"
+>>>>>>> 928c63818ade (Minor test enhancement)
 
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fno-ptrauth-intrinsics \
 // RUN:   -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
@@ -87,19 +103,51 @@
 
 //// Non-linux OS: pauthtest ABI has no effect in terms of passing ptrauth cc1 
flags.
 //// An error about unsupported ABI will be emitted later in pipeline (see 
ERR3 below)
+<<<<<<< HEAD
 // RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI2
+||||||| parent of 928c63818ade (Minor test enhancement)
+// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s 
--check-prefixes=PAUTHTEST2
+=======
+// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTEST2
+>>>>>>> 928c63818ade (Minor test enhancement)
 
+<<<<<<< HEAD
 // PAUTHABI2:      "-cc1"
 // PAUTHABI2-SAME: "-target-abi" "pauthtest"
 // PAUTHABI2-NOT:  "-fptrauth-
 // PAUTHABI2-NOT: "-faarch64-jump-table-hardening"
+||||||| parent of 928c63818ade (Minor test enhancement)
+// PAUTHTEST2:      "-cc1"
+// PAUTHTEST2-SAME: "-target-abi" "pauthtest"
+// PAUTHTEST2-NOT:  "-fptrauth-
+// PAUTHTEST2-NOT: "-faarch64-jump-table-hardening"
+=======
+// PAUTHTEST2:      "-cc1"
+// PAUTHTEST2-SAME: "-target-abi" "pauthtest"
+// PAUTHTEST2-NOT:  "-fptrauth-
+// PAUTHTEST2-NOT:  "-faarch64-jump-table-hardening"
+>>>>>>> 928c63818ade (Minor test enhancement)
 
 //// Non-linux OS: pauthtest environment does not correspond to pauthtest ABI; 
aapcs is the default.
+<<<<<<< HEAD
 // RUN: %clang -### -c --target=aarch64-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI3
 // PAUTHABI3:      "-cc1"
 // PAUTHABI3-SAME: "-target-abi" "aapcs"
 // PAUTHABI3-NOT:  "-fptrauth-
 // PAUTHABI3-NOT: "-faarch64-jump-table-hardening"
+||||||| parent of 928c63818ade (Minor test enhancement)
+// RUN: %clang -### -c --target=aarch64-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTEST3
+// PAUTHTEST3:      "-cc1"
+// PAUTHTEST3-SAME: "-target-abi" "aapcs"
+// PAUTHTEST3-NOT:  "-fptrauth-
+// PAUTHTEST3-NOT: "-faarch64-jump-table-hardening"
+=======
+// RUN: %clang -### -c --target=aarch64-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTEST3
+// PAUTHTEST3:      "-cc1"
+// PAUTHTEST3-SAME: "-target-abi" "aapcs"
+// PAUTHTEST3-NOT:  "-fptrauth-
+// PAUTHTEST3-NOT:  "-faarch64-jump-table-hardening"
+>>>>>>> 928c63818ade (Minor test enhancement)
 
 //// Non-pauthtest ABI.
 // RUN: not %clang -### -c --target=aarch64-linux -fptrauth-intrinsics 
-fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \

>From 8c37929912f13a3bcea3f5566546b17eee68c1e9 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkova...@accesssoftek.com>
Date: Sun, 8 Dec 2024 00:11:49 +0300
Subject: [PATCH 4/8] Address review comments

---
 clang/include/clang/Driver/ToolChain.h |  3 +++
 clang/lib/Driver/ToolChain.cpp         | 26 +++++++++++++++++++
 clang/lib/Driver/ToolChains/Linux.cpp  | 35 +++-----------------------
 clang/lib/Driver/ToolChains/Linux.h    |  2 ++
 4 files changed, 34 insertions(+), 32 deletions(-)

diff --git a/clang/include/clang/Driver/ToolChain.h 
b/clang/include/clang/Driver/ToolChain.h
index 1425714d34110..645b2a87c8d13 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -214,6 +214,9 @@ class ToolChain {
                                               FileType Type, bool AddArch,
                                               bool IsFortran = false) const;
 
+  virtual void addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
+                                   llvm::opt::ArgStringList &CC1Args) const;
+
   /// Find the target-specific subdirectory for the current target triple under
   /// \p BaseDir, doing fallback triple searches as necessary.
   /// \return The subdirectory path if it exists.
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index dae4d873519d6..45ba3241fc302 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -781,6 +781,32 @@ std::string ToolChain::buildCompilerRTBasename(const 
llvm::opt::ArgList &Args,
   return (Prefix + Twine(LibName) + Component + ArchAndEnv + Suffix).str();
 }
 
+void ToolChain::addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
+                                    llvm::opt::ArgStringList &CC1Args) const {
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_intrinsics,
+                          options::OPT_fno_ptrauth_intrinsics);
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_calls,
+                          options::OPT_fno_ptrauth_calls);
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_returns,
+                          options::OPT_fno_ptrauth_returns);
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_auth_traps,
+                          options::OPT_fno_ptrauth_auth_traps);
+  DriverArgs.addOptInFlag(
+      CC1Args, options::OPT_fptrauth_vtable_pointer_address_discrimination,
+      options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
+  DriverArgs.addOptInFlag(
+      CC1Args, options::OPT_fptrauth_vtable_pointer_type_discrimination,
+      options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
+  DriverArgs.addOptInFlag(
+      CC1Args, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
+      options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
+  DriverArgs.addOptInFlag(
+      CC1Args, options::OPT_fptrauth_function_pointer_type_discrimination,
+      options::OPT_fno_ptrauth_function_pointer_type_discrimination);
+  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_indirect_gotos,
+                          options::OPT_fno_ptrauth_indirect_gotos);
+}
+
 std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
                                      FileType Type, bool IsFortran) const {
   // Check for runtime files in the new layout without the architecture first.
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp 
b/clang/lib/Driver/ToolChains/Linux.cpp
index 6cb340aa57b61..96a7383ac7aa4 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -533,38 +533,9 @@ static void handlePAuthABI(const Driver &D, const ArgList 
&DriverArgs,
     CC1Args.push_back("-faarch64-jump-table-hardening");
 }
 
-static void addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
-                                llvm::opt::ArgStringList &CC1Args) {
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_intrinsics,
-                          options::OPT_fno_ptrauth_intrinsics);
-
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_calls,
-                          options::OPT_fno_ptrauth_calls);
-
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_returns,
-                          options::OPT_fno_ptrauth_returns);
-
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_auth_traps,
-                          options::OPT_fno_ptrauth_auth_traps);
-
-  DriverArgs.addOptInFlag(
-      CC1Args, options::OPT_fptrauth_vtable_pointer_address_discrimination,
-      options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
-
-  DriverArgs.addOptInFlag(
-      CC1Args, options::OPT_fptrauth_vtable_pointer_type_discrimination,
-      options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
-
-  DriverArgs.addOptInFlag(
-      CC1Args, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
-      options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
-
-  DriverArgs.addOptInFlag(
-      CC1Args, options::OPT_fptrauth_function_pointer_type_discrimination,
-      options::OPT_fno_ptrauth_function_pointer_type_discrimination);
-
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_indirect_gotos,
-                          options::OPT_fno_ptrauth_indirect_gotos);
+void Linux::addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
+                                llvm::opt::ArgStringList &CC1Args) const {
+  ToolChain::addPointerAuthFlags(DriverArgs, CC1Args);
 
   DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_init_fini,
                           options::OPT_fno_ptrauth_init_fini);
diff --git a/clang/lib/Driver/ToolChains/Linux.h 
b/clang/lib/Driver/ToolChains/Linux.h
index 97bad77cb1caa..c7e95dc1d7855 100644
--- a/clang/lib/Driver/ToolChains/Linux.h
+++ b/clang/lib/Driver/ToolChains/Linux.h
@@ -74,6 +74,8 @@ class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
   Tool *buildAssembler() const override;
   Tool *buildLinker() const override;
   Tool *buildStaticLibTool() const override;
+  void addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
+                           llvm::opt::ArgStringList &CC1Args) const override;
 };
 
 } // end namespace toolchains

>From f88b2a9e0af701b64f10158404cec7a3d5976873 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkova...@accesssoftek.com>
Date: Mon, 16 Dec 2024 11:29:05 +0300
Subject: [PATCH 5/8] Address review comments

---
 clang/include/clang/Driver/ToolChain.h |  3 ---
 clang/lib/Driver/ToolChain.cpp         | 26 -------------------
 clang/lib/Driver/ToolChains/Clang.cpp  | 36 ++++++++++++++++++++++++++
 clang/lib/Driver/ToolChains/Linux.cpp  | 20 +-------------
 clang/lib/Driver/ToolChains/Linux.h    |  2 --
 5 files changed, 37 insertions(+), 50 deletions(-)

diff --git a/clang/include/clang/Driver/ToolChain.h 
b/clang/include/clang/Driver/ToolChain.h
index 645b2a87c8d13..1425714d34110 100644
--- a/clang/include/clang/Driver/ToolChain.h
+++ b/clang/include/clang/Driver/ToolChain.h
@@ -214,9 +214,6 @@ class ToolChain {
                                               FileType Type, bool AddArch,
                                               bool IsFortran = false) const;
 
-  virtual void addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
-                                   llvm::opt::ArgStringList &CC1Args) const;
-
   /// Find the target-specific subdirectory for the current target triple under
   /// \p BaseDir, doing fallback triple searches as necessary.
   /// \return The subdirectory path if it exists.
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 45ba3241fc302..dae4d873519d6 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -781,32 +781,6 @@ std::string ToolChain::buildCompilerRTBasename(const 
llvm::opt::ArgList &Args,
   return (Prefix + Twine(LibName) + Component + ArchAndEnv + Suffix).str();
 }
 
-void ToolChain::addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
-                                    llvm::opt::ArgStringList &CC1Args) const {
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_intrinsics,
-                          options::OPT_fno_ptrauth_intrinsics);
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_calls,
-                          options::OPT_fno_ptrauth_calls);
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_returns,
-                          options::OPT_fno_ptrauth_returns);
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_auth_traps,
-                          options::OPT_fno_ptrauth_auth_traps);
-  DriverArgs.addOptInFlag(
-      CC1Args, options::OPT_fptrauth_vtable_pointer_address_discrimination,
-      options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
-  DriverArgs.addOptInFlag(
-      CC1Args, options::OPT_fptrauth_vtable_pointer_type_discrimination,
-      options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
-  DriverArgs.addOptInFlag(
-      CC1Args, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
-      options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
-  DriverArgs.addOptInFlag(
-      CC1Args, options::OPT_fptrauth_function_pointer_type_discrimination,
-      options::OPT_fno_ptrauth_function_pointer_type_discrimination);
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_indirect_gotos,
-                          options::OPT_fno_ptrauth_indirect_gotos);
-}
-
 std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
                                      FileType Type, bool IsFortran) const {
   // Check for runtime files in the new layout without the architecture first.
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 7cb609b5c000b..030492a700d38 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1665,6 +1665,42 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args,
 
   AddUnalignedAccessWarning(CmdArgs);
 
+  if (Triple.isOSDarwin() ||
+      (Triple.isOSLinux() &&
+       Triple.getEnvironment() == llvm::Triple::PAuthTest)) {
+    Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_intrinsics,
+                      options::OPT_fno_ptrauth_intrinsics);
+    Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_calls,
+                      options::OPT_fno_ptrauth_calls);
+    Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_returns,
+                      options::OPT_fno_ptrauth_returns);
+    Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_auth_traps,
+                      options::OPT_fno_ptrauth_auth_traps);
+    Args.addOptInFlag(
+        CmdArgs, options::OPT_fptrauth_vtable_pointer_address_discrimination,
+        options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
+    Args.addOptInFlag(
+        CmdArgs, options::OPT_fptrauth_vtable_pointer_type_discrimination,
+        options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
+    Args.addOptInFlag(
+        CmdArgs, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
+        options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
+    Args.addOptInFlag(
+        CmdArgs, options::OPT_fptrauth_function_pointer_type_discrimination,
+        options::OPT_fno_ptrauth_function_pointer_type_discrimination);
+    Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_indirect_gotos,
+                      options::OPT_fno_ptrauth_indirect_gotos);
+  }
+  if (Triple.isOSLinux() &&
+      Triple.getEnvironment() == llvm::Triple::PAuthTest) {
+    Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_init_fini,
+                      options::OPT_fno_ptrauth_init_fini);
+    Args.addOptInFlag(
+        CmdArgs, options::OPT_fptrauth_init_fini_address_discrimination,
+        options::OPT_fno_ptrauth_init_fini_address_discrimination);
+    Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_elf_got,
+                      options::OPT_fno_ptrauth_elf_got);
+  }
   Args.addOptInFlag(CmdArgs, options::OPT_faarch64_jump_table_hardening,
                     options::OPT_fno_aarch64_jump_table_hardening);
 
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp 
b/clang/lib/Driver/ToolChains/Linux.cpp
index 96a7383ac7aa4..04a8ad1d165d4 100644
--- a/clang/lib/Driver/ToolChains/Linux.cpp
+++ b/clang/lib/Driver/ToolChains/Linux.cpp
@@ -533,30 +533,12 @@ static void handlePAuthABI(const Driver &D, const ArgList 
&DriverArgs,
     CC1Args.push_back("-faarch64-jump-table-hardening");
 }
 
-void Linux::addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
-                                llvm::opt::ArgStringList &CC1Args) const {
-  ToolChain::addPointerAuthFlags(DriverArgs, CC1Args);
-
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_init_fini,
-                          options::OPT_fno_ptrauth_init_fini);
-
-  DriverArgs.addOptInFlag(
-      CC1Args, options::OPT_fptrauth_init_fini_address_discrimination,
-      options::OPT_fno_ptrauth_init_fini_address_discrimination);
-
-  DriverArgs.addOptInFlag(CC1Args, options::OPT_fptrauth_elf_got,
-                          options::OPT_fno_ptrauth_elf_got);
-}
-
 void Linux::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
                                   llvm::opt::ArgStringList &CC1Args,
                                   Action::OffloadKind DeviceOffloadKind) const 
{
   llvm::Triple Triple(ComputeEffectiveClangTriple(DriverArgs));
-  if (Triple.isAArch64() &&
-      Triple.getEnvironment() == llvm::Triple::PAuthTest) {
-    addPointerAuthFlags(DriverArgs, CC1Args);
+  if (Triple.isAArch64() && Triple.getEnvironment() == llvm::Triple::PAuthTest)
     handlePAuthABI(getDriver(), DriverArgs, CC1Args);
-  }
   Generic_ELF::addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadKind);
 }
 
diff --git a/clang/lib/Driver/ToolChains/Linux.h 
b/clang/lib/Driver/ToolChains/Linux.h
index c7e95dc1d7855..97bad77cb1caa 100644
--- a/clang/lib/Driver/ToolChains/Linux.h
+++ b/clang/lib/Driver/ToolChains/Linux.h
@@ -74,8 +74,6 @@ class LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
   Tool *buildAssembler() const override;
   Tool *buildLinker() const override;
   Tool *buildStaticLibTool() const override;
-  void addPointerAuthFlags(const llvm::opt::ArgList &DriverArgs,
-                           llvm::opt::ArgStringList &CC1Args) const override;
 };
 
 } // end namespace toolchains

>From d2c61e0d593c4fb293d86487d9ca6ac50db62d72 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkova...@accesssoftek.com>
Date: Tue, 17 Dec 2024 23:28:42 +0300
Subject: [PATCH 6/8] Address review comments

---
 clang/test/Driver/aarch64-ptrauth.c | 48 -----------------------------
 1 file changed, 48 deletions(-)

diff --git a/clang/test/Driver/aarch64-ptrauth.c 
b/clang/test/Driver/aarch64-ptrauth.c
index 3b2603082dddc..f5a0eaf37958a 100644
--- a/clang/test/Driver/aarch64-ptrauth.c
+++ b/clang/test/Driver/aarch64-ptrauth.c
@@ -54,7 +54,6 @@
 // RUN:   %s 2>&1 | FileCheck %s --check-prefix=ALL-DARWIN
 // ALL-DARWIN: "-cc1"{{.*}} "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" 
"-fptrauth-indirect-gotos"{{.*}} "-faarch64-jump-table-hardening"
 
-<<<<<<< HEAD
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHABI1
 // RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI1
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=0 %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
@@ -72,21 +71,6 @@
 // PAUTHTESTV1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got" "-faarch64-jump-table-hardening"
 // PAUTHTESTV1-SAME: "-target-abi" "pauthtest"
 // PAUTHTESTV1-NOT:  "-fptrauth-function-pointer-type-discrimination"
-||||||| parent of 928c63818ade (Minor test enhancement)
-// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHTEST1
-// RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTEST1
-// PAUTHTEST1:      "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
-// PAUTHTEST1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-faarch64-jump-table-hardening"
-// PAUTHTEST1-SAME: "-target-abi" "pauthtest"
-// PAUTHTEST1-NOT: "-fptrauth-function-pointer-type-discrimination"
-=======
-// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHTEST1
-// RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTEST1
-// PAUTHTEST1:      "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
-// PAUTHTEST1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-faarch64-jump-table-hardening"
-// PAUTHTEST1-SAME: "-target-abi" "pauthtest"
-// PAUTHTEST1-NOT:  "-fptrauth-function-pointer-type-discrimination"
->>>>>>> 928c63818ade (Minor test enhancement)
 
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fno-ptrauth-intrinsics \
 // RUN:   -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
@@ -103,51 +87,19 @@
 
 //// Non-linux OS: pauthtest ABI has no effect in terms of passing ptrauth cc1 
flags.
 //// An error about unsupported ABI will be emitted later in pipeline (see 
ERR3 below)
-<<<<<<< HEAD
 // RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI2
-||||||| parent of 928c63818ade (Minor test enhancement)
-// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s 
--check-prefixes=PAUTHTEST2
-=======
-// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTEST2
->>>>>>> 928c63818ade (Minor test enhancement)
 
-<<<<<<< HEAD
 // PAUTHABI2:      "-cc1"
 // PAUTHABI2-SAME: "-target-abi" "pauthtest"
 // PAUTHABI2-NOT:  "-fptrauth-
 // PAUTHABI2-NOT: "-faarch64-jump-table-hardening"
-||||||| parent of 928c63818ade (Minor test enhancement)
-// PAUTHTEST2:      "-cc1"
-// PAUTHTEST2-SAME: "-target-abi" "pauthtest"
-// PAUTHTEST2-NOT:  "-fptrauth-
-// PAUTHTEST2-NOT: "-faarch64-jump-table-hardening"
-=======
-// PAUTHTEST2:      "-cc1"
-// PAUTHTEST2-SAME: "-target-abi" "pauthtest"
-// PAUTHTEST2-NOT:  "-fptrauth-
-// PAUTHTEST2-NOT:  "-faarch64-jump-table-hardening"
->>>>>>> 928c63818ade (Minor test enhancement)
 
 //// Non-linux OS: pauthtest environment does not correspond to pauthtest ABI; 
aapcs is the default.
-<<<<<<< HEAD
 // RUN: %clang -### -c --target=aarch64-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI3
 // PAUTHABI3:      "-cc1"
 // PAUTHABI3-SAME: "-target-abi" "aapcs"
 // PAUTHABI3-NOT:  "-fptrauth-
 // PAUTHABI3-NOT: "-faarch64-jump-table-hardening"
-||||||| parent of 928c63818ade (Minor test enhancement)
-// RUN: %clang -### -c --target=aarch64-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTEST3
-// PAUTHTEST3:      "-cc1"
-// PAUTHTEST3-SAME: "-target-abi" "aapcs"
-// PAUTHTEST3-NOT:  "-fptrauth-
-// PAUTHTEST3-NOT: "-faarch64-jump-table-hardening"
-=======
-// RUN: %clang -### -c --target=aarch64-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTEST3
-// PAUTHTEST3:      "-cc1"
-// PAUTHTEST3-SAME: "-target-abi" "aapcs"
-// PAUTHTEST3-NOT:  "-fptrauth-
-// PAUTHTEST3-NOT:  "-faarch64-jump-table-hardening"
->>>>>>> 928c63818ade (Minor test enhancement)
 
 //// Non-pauthtest ABI.
 // RUN: not %clang -### -c --target=aarch64-linux -fptrauth-intrinsics 
-fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \

>From 6c11ad86d55f5619d6ae81f0c2feb67145cb5365 Mon Sep 17 00:00:00 2001
From: Anatoly Trosinenko <atrosine...@accesssoftek.com>
Date: Wed, 3 Sep 2025 12:58:57 +0300
Subject: [PATCH 7/8] Proposed fix for PR113152

---
 clang/lib/Driver/ToolChains/Clang.cpp               | 13 +++++++------
 .../aarch64-ignore-branch-protection-attribute.c    |  8 ++++++--
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 030492a700d38..97f0b2a6d1c83 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1406,17 +1406,18 @@ static void CollectARMPACBTIOptions(const ToolChain 
&TC, const ArgList &Args,
     GuardedControlStack = PBP.GuardedControlStack;
   }
 
-  bool HasPtrauthReturns = llvm::any_of(CmdArgs, [](const char *Arg) {
-    return StringRef(Arg) == "-fptrauth-returns";
-  });
+  Arg *PtrauthReturnsArg = Args.getLastArg(options::OPT_fptrauth_returns,
+                                           options::OPT_fno_ptrauth_returns);
+  bool HasPtrauthReturns =
+      PtrauthReturnsArg &&
+      PtrauthReturnsArg->getOption().matches(options::OPT_fptrauth_returns);
   // GCS is currently untested with ptrauth-returns, but enabling this could be
   // allowed in future after testing with a suitable system.
-  if (HasPtrauthReturns &&
-      (Scope != "none" || BranchProtectionPAuthLR || GuardedControlStack)) {
+  if (Scope != "none" || BranchProtectionPAuthLR || GuardedControlStack) {
     if (Triple.getEnvironment() == llvm::Triple::PAuthTest)
       D.Diag(diag::err_drv_unsupported_opt_for_target)
           << A->getAsString(Args) << Triple.getTriple();
-    else
+    else if (HasPtrauthReturns)
       D.Diag(diag::err_drv_incompatible_options)
           << A->getAsString(Args) << "-fptrauth-returns";
   }
diff --git a/clang/test/Frontend/aarch64-ignore-branch-protection-attribute.c 
b/clang/test/Frontend/aarch64-ignore-branch-protection-attribute.c
index 32cc98dd4e037..e6605ce5c630f 100644
--- a/clang/test/Frontend/aarch64-ignore-branch-protection-attribute.c
+++ b/clang/test/Frontend/aarch64-ignore-branch-protection-attribute.c
@@ -1,7 +1,11 @@
 // REQUIRES: aarch64-registered-target
 
-// RUN: %clang -target aarch64-linux-pauthtest   %s -S -emit-llvm -o - 2>&1 | 
FileCheck --implicit-check-not=warning: %s
-// RUN: %clang -target aarch64 -fptrauth-returns %s -S -emit-llvm -o - 2>&1 | 
FileCheck --implicit-check-not=warning: %s
+// RUN:     %clang -target aarch64-linux-pauthtest   %s -S -emit-llvm -o - 
2>&1 | FileCheck --implicit-check-not=warning: %s
+// RUN: not %clang -target aarch64 -fptrauth-returns %s -S -emit-llvm -o - 
2>&1 | FileCheck --implicit-check-not=warning: --check-prefix=PTRAUTH-RETURNS %s
+
+// Clang fails early, no LLVM IR output produced.
+// PTRAUTH-RETURNS: clang: error: unsupported option '-fptrauth-returns' for 
target 'aarch64'
+// PTRAUTH-RETURNS-NOT: attributes
 
 /// Unsupported with pauthtest, warning emitted
 __attribute__((target("branch-protection=pac-ret"))) void f1() {}

>From 115e915803889a397a3bd7b69ae1fb40f5be7cf3 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkova...@accesssoftek.com>
Date: Mon, 8 Sep 2025 18:15:38 +0300
Subject: [PATCH 8/8] Delete tests for flags not yet available in mainline
 clang

---
 clang/test/Driver/aarch64-ptrauth.c | 57 +++--------------------------
 1 file changed, 6 insertions(+), 51 deletions(-)

diff --git a/clang/test/Driver/aarch64-ptrauth.c 
b/clang/test/Driver/aarch64-ptrauth.c
index f5a0eaf37958a..a67e98fdda714 100644
--- a/clang/test/Driver/aarch64-ptrauth.c
+++ b/clang/test/Driver/aarch64-ptrauth.c
@@ -56,34 +56,23 @@
 
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHABI1
 // RUN: %clang -### -c --target=aarch64-linux-pauthtest %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI1
-// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=0 %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
-// RUN: %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=0 %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI1
 // PAUTHABI1:      "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
-// PAUTHABI1-SAME: "-fptrauth-abi-version=0"
-// PAUTHABI1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got" "-faarch64-jump-table-hardening"
+// PAUTHABI1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-faarch64-jump-table-hardening"
 // PAUTHABI1-SAME: "-target-abi" "pauthtest"
 // PAUTHABI1-NOT: "-fptrauth-function-pointer-type-discrimination"
 
-// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=1 %s 2>&1 | FileCheck %s --check-prefix=PAUTHTESTV1
-// RUN: %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=1 %s 2>&1 | FileCheck %s --check-prefix=PAUTHTESTV1
-// PAUTHTESTV1:      "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
-// PAUTHTESTV1-SAME: "-fptrauth-abi-version=1"
-// PAUTHTESTV1-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got" "-faarch64-jump-table-hardening"
-// PAUTHTESTV1-SAME: "-target-abi" "pauthtest"
-// PAUTHTESTV1-NOT:  "-fptrauth-function-pointer-type-discrimination"
-
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fno-ptrauth-intrinsics \
 // RUN:   -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
 // RUN:   -fno-ptrauth-vtable-pointer-address-discrimination 
-fno-ptrauth-vtable-pointer-type-discrimination \
 // RUN:   -fno-ptrauth-type-info-vtable-pointer-discrimination 
-fno-ptrauth-indirect-gotos \
-// RUN:   -fno-ptrauth-init-fini -fno-ptrauth-init-fini-address-discrimination 
-fno-ptrauth-elf-got \
-// RUN:   -fno-ptrauth-abi-version -fno-aarch64-jump-table-hardening %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHABI2
+// RUN:   -fno-ptrauth-init-fini -fno-ptrauth-init-fini-address-discrimination 
\
+// RUN:   -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI2
 // RUN: %clang -### -c --target=aarch64-linux-pauthtest 
-fno-ptrauth-intrinsics \
 // RUN:   -fno-ptrauth-calls -fno-ptrauth-returns -fno-ptrauth-auth-traps \
 // RUN:   -fno-ptrauth-vtable-pointer-address-discrimination 
-fno-ptrauth-vtable-pointer-type-discrimination \
 // RUN:   -fno-ptrauth-type-info-vtable-pointer-discrimination 
-fno-ptrauth-indirect-gotos \
-// RUN:   -fno-ptrauth-init-fini -fno-ptrauth-init-fini-address-discrimination 
-fno-ptrauth-elf-got \
-// RUN:   -fno-ptrauth-abi-version -fno-aarch64-jump-table-hardening %s 2>&1 | 
FileCheck %s --check-prefix=PAUTHABI2
+// RUN:   -fno-ptrauth-init-fini -fno-ptrauth-init-fini-address-discrimination 
\
+// RUN:   -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHABI2
 
 //// Non-linux OS: pauthtest ABI has no effect in terms of passing ptrauth cc1 
flags.
 //// An error about unsupported ABI will be emitted later in pipeline (see 
ERR3 below)
@@ -105,8 +94,7 @@
 // RUN: not %clang -### -c --target=aarch64-linux -fptrauth-intrinsics 
-fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \
 // RUN:   -fptrauth-vtable-pointer-address-discrimination 
-fptrauth-vtable-pointer-type-discrimination \
 // RUN:   -fptrauth-type-info-vtable-pointer-discrimination 
-fptrauth-indirect-gotos -fptrauth-init-fini \
-// RUN:   -fptrauth-init-fini-address-discrimination -fptrauth-elf-got 
-fptrauth-abi-version=1 -fno-ptrauth-abi-version \
-// RUN:   %s 2>&1 | FileCheck %s --check-prefix=ERR1
+// RUN:   -fptrauth-init-fini-address-discrimination -fptrauth-elf-got %s 2>&1 
| FileCheck %s --check-prefix=ERR1
 // ERR1:      error: unsupported option '-fptrauth-intrinsics' for target 
'{{.*}}'
 // ERR1-NEXT: error: unsupported option '-fptrauth-calls' for target '{{.*}}'
 // ERR1-NEXT: error: unsupported option '-fptrauth-returns' for target '{{.*}}'
@@ -118,27 +106,6 @@
 // ERR1-NEXT: error: unsupported option '-fptrauth-init-fini' for target 
'{{.*}}'
 // ERR1-NEXT: error: unsupported option 
'-fptrauth-init-fini-address-discrimination' for target '{{.*}}'
 // ERR1-NEXT: error: unsupported option '-fptrauth-elf-got' for target '{{.*}}'
-// ERR1-NEXT: error: unsupported option '-fptrauth-abi-version=' for target 
'{{.*}}'
-// ERR1-NEXT: error: unsupported option '-fno-ptrauth-abi-version' for target 
'{{.*}}'
-
-// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=2 %s 2>&1 | FileCheck %s --check-prefix=PAUTHTESTV2
-// RUN: %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=2 %s 2>&1 | FileCheck %s --check-prefix=PAUTHTESTV2
-// PAUTHTESTV2:      "-cc1"{{.*}} "-triple" "aarch64-unknown-linux-pauthtest"
-// PAUTHTESTV2-SAME: "-fptrauth-abi-version=2"
-// PAUTHTESTV2-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got" "-faarch64-jump-table-hardening" 
"-fptrauth-function-pointer-type-discrimination"
-// PAUTHTESTV2-SAME: "-target-abi" "pauthtest"
-
-// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=1 -fno-ptrauth-abi-version %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTESTVNONE
-// RUN: %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=1 -fno-ptrauth-abi-version %s 2>&1 | FileCheck %s 
--check-prefix=PAUTHTESTVNONE
-// PAUTHTESTVNONE:      "-cc1"{{.*}} "-triple" 
"aarch64-unknown-linux-pauthtest"
-// PAUTHTESTVNONE-SAME: "-fptrauth-intrinsics" "-fptrauth-calls" 
"-fptrauth-returns" "-fptrauth-auth-traps" 
"-fptrauth-vtable-pointer-address-discrimination" 
"-fptrauth-vtable-pointer-type-discrimination" 
"-fptrauth-type-info-vtable-pointer-discrimination" "-fptrauth-indirect-gotos" 
"-fptrauth-init-fini" "-fptrauth-init-fini-address-discrimination" 
"-fptrauth-elf-got" "-faarch64-jump-table-hardening"
-// PAUTHTESTVNONE-SAME: "-target-abi" "pauthtest"
-// PAUTHTESTVNONE-NOT:  "-fptrauth-abi-version
-
-//// A pauth-aware environment (e.g. pauthtest) must be chosen to manipulate 
ptrauth ABI versioning.
-// RUN: not %clang -### -c --target=aarch64-linux -fptrauth-abi-version=1 
-fno-ptrauth-abi-version %s 2>&1 | FileCheck %s --check-prefix=ERR0
-// ERR0:      error: unsupported option '-fptrauth-abi-version=' for target 
'{{.*}}'
-// ERR0-NEXT: error: unsupported option '-fno-ptrauth-abi-version' for target 
'{{.*}}'
 
 //// Non-AArch64.
 // RUN: not %clang -### -c --target=x86_64-linux 
-faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=ERR2
@@ -197,18 +164,6 @@
 // RUN:   FileCheck %s --check-prefix=ERR9
 // ERR9: error: unsupported option '-msign-return-address=non-leaf' for target 
'aarch64-unknown-linux-pauthtest'
 
-// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=3 %s 2>&1 | FileCheck %s --check-prefix=ERR10
-// RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=3 %s 2>&1 | FileCheck %s --check-prefix=ERR10
-// ERR10: error: invalid value '3' in '-fptrauth-abi-version=3'
-
-// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=xxx %s 2>&1 | FileCheck %s --check-prefix=ERR11
-// RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=xxx %s 2>&1 | FileCheck %s --check-prefix=ERR11
-// ERR11: error: invalid value 'xxx' in '-fptrauth-abi-version=xxx'
-
-// RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-fptrauth-abi-version=-1 %s 2>&1 | FileCheck %s --check-prefix=ERR12
-// RUN: not %clang -### -c --target=aarch64-linux-pauthtest       
-fptrauth-abi-version=-1 %s 2>&1 | FileCheck %s --check-prefix=ERR12
-// ERR12: error: invalid value '-1' in '-fptrauth-abi-version=-1'
-
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-msign-return-address=none %s
 // RUN: %clang -### -c --target=aarch64-linux-pauthtest       
-msign-return-address=none %s
 // RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest 
-mbranch-protection=bti %s

_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to