[llvm-branch-commits] [clang] [PAC][Driver] Support ptrauth flags only on ARM64 Darwin or with pauthtest ABI (PR #113152)
Daniil Kovalev via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Sep 15 02:55:42 PDT 2025
https://github.com/kovdan01 updated https://github.com/llvm/llvm-project/pull/113152
>From f895c68afebcb60c2eaa50960ea0e3f1c1446698 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at 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 48a457c9bc46a..762bfff615475 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1662,34 +1662,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 5a35bc119921cd03d5a3f70610c5081ccd2b1a85 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at 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 e3d5d1336af113364410274bef8bfdd187d745da Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at 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 91c2561b28b56d4d8e0c5c39706bfbc863f72378 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at 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 4092919f3f92ac294bff9196ed2822937a175747 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at 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 762bfff615475..f8e191f7e6edd 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1662,6 +1662,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 18cec09183dce5a04916bf3bdeb423d9775a1aa7 Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at 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 99c844dfc2f8d45e2206302494cfda27075e35d4 Mon Sep 17 00:00:00 2001
From: Anatoly Trosinenko <atrosinenko at 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 f8e191f7e6edd..ea887340c5639 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 c3322cf6106ab01bd27e0d02ddf0b76d5b0dedbb Mon Sep 17 00:00:00 2001
From: Daniil Kovalev <dkovalev at 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
More information about the llvm-branch-commits
mailing list