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 <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 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 <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 e3d5d1336af113364410274bef8bfdd187d745da 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 91c2561b28b56d4d8e0c5c39706bfbc863f72378 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 4092919f3f92ac294bff9196ed2822937a175747 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 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 <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 99c844dfc2f8d45e2206302494cfda27075e35d4 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 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 <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