From 0caff13d6748f8c2d14608412db80eb5bba5fe71 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Mon, 21 Oct 2024 12:18:56 +0300 Subject: [PATCH 1/7] [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/Darwin.cpp | 37 +++++++++++ clang/lib/Driver/ToolChains/Linux.cpp | 53 +++------------ clang/test/Driver/aarch64-ptrauth.c | 91 +++++++++++++------------- 4 files changed, 93 insertions(+), 116 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index ad0a225d2bc60..914a96eaa5f85 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1808,34 +1808,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/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 4105d38d15d7d..71f98704e334c 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -3067,6 +3067,40 @@ bool Darwin::isSizedDeallocationUnavailable() const { return TargetVersion < sizedDeallocMinVersion(OS); } +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 Darwin::addClangTargetOptions( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, Action::OffloadKind DeviceOffloadKind) const { @@ -3143,6 +3177,9 @@ void Darwin::addClangTargetOptions( if (!RequiresSubdirectorySearch) CC1Args.push_back("-fno-modulemap-allow-subdirectory-search"); } + + if (getTriple().isAArch64()) + addPointerAuthFlags(DriverArgs, CC1Args); } void Darwin::addClangCC1ASTargetOptions( diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 13fc4640e73bd..4f14b3cf17654 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -494,49 +494,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 88841ee0b0b7b..c526656c9c9bf 100644 --- a/clang/test/Driver/aarch64-ptrauth.c +++ b/clang/test/Driver/aarch64-ptrauth.c @@ -4,7 +4,12 @@ // NONE: "-cc1" // NONE-NOT: "-fptrauth- -// RUN: %clang -### -c --target=aarch64 \ +// 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" + +// RUN: %clang -### -c --target=arm64-darwin \ // RUN: -fno-ptrauth-intrinsics -fptrauth-intrinsics \ // RUN: -fno-ptrauth-calls -fptrauth-calls \ // RUN: -fno-ptrauth-returns -fptrauth-returns \ @@ -13,11 +18,9 @@ // 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-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-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 @@ -26,36 +29,34 @@ // PAUTHABI1-SAME: "-target-abi" "pauthtest" // PAUTHABI1-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: %clang -### -c --target=aarch64-linux -mabi=pauthtest \ // 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 \ +// RUN: %clang -### -c --target=aarch64-linux-pauthtest \ // 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 ERR2 below) -// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2 +//// 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-prefixes=PAUTHABI2,PAUTHABI3 // PAUTHABI2: "-cc1" // PAUTHABI2-SAME: "-target-abi" "pauthtest" -// PAUTHABI2-NOT: "-fptrauth- +// PAUTHABI3-NOT: "-fptrauth- // PAUTHABI2-NOT: "-faarch64-jump-table-hardening" //// Non-linux OS: pauthtest environment does not correspond to pauthtest ABI; aapcs is the default. -// 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" - -// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \ +// RUN: %clang -### -c --target=aarch64-pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI4 +// PAUTHABI4: "-cc1" +// PAUTHABI4-SAME: "-target-abi" "aapcs" +// PAUTHABI4-NOT: "-fptrauth- +// PAUTHABI4-NOT: "-faarch64-jump-table-hardening" + +//// Non-AArch64. +// RUN: not %clang -### -c --target=x86_64-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-prefixes=ERR1,ERR2 +//// Non-linux and non-Darwin OS. +// RUN: not %clang -### -c --target=aarch64 -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 @@ -69,50 +70,50 @@ // 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 '{{.*}}' +// ERR2-NEXT: error: unsupported option '-faarch64-jump-table-hardening' for target '{{.*}}' -// RUN: not %clang -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR2 +// RUN: not %clang -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR3 //// 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' +// ERR3: error: unknown target ABI 'pauthtest' //// 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 +// RUN: FileCheck %s --check-prefix=ERR5 // RUN: not %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=pac-ret %s 2>&1 | \ -// RUN: FileCheck %s --check-prefix=ERR4 -// ERR4: error: unsupported option '-mbranch-protection=pac-ret' for target 'aarch64-unknown-linux-pauthtest' +// RUN: FileCheck %s --check-prefix=ERR5 +// ERR5: error: unsupported option '-mbranch-protection=pac-ret' for target 'aarch64-unknown-linux-pauthtest' // RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -mbranch-protection=gcs %s 2>&1 | \ -// RUN: FileCheck %s --check-prefix=ERR5 +// RUN: FileCheck %s --check-prefix=ERR6 // RUN: not %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=gcs %s 2>&1 | \ -// RUN: FileCheck %s --check-prefix=ERR5 -// ERR5: error: unsupported option '-mbranch-protection=gcs' for target 'aarch64-unknown-linux-pauthtest' +// RUN: FileCheck %s --check-prefix=ERR6 +// ERR6: error: unsupported option '-mbranch-protection=gcs' for target 'aarch64-unknown-linux-pauthtest' // RUN: not %clang -### -c --target=aarch64-linux -mabi=pauthtest -mbranch-protection=standard %s 2>&1 | \ -// RUN: FileCheck %s --check-prefix=ERR6 +// RUN: FileCheck %s --check-prefix=ERR7 // RUN: not %clang -### -c --target=aarch64-linux-pauthtest -mbranch-protection=standard %s 2>&1 | \ -// RUN: FileCheck %s --check-prefix=ERR6 -// ERR6: error: unsupported option '-mbranch-protection=standard' for target 'aarch64-unknown-linux-pauthtest' +// RUN: FileCheck %s --check-prefix=ERR7 +// ERR7: error: unsupported option '-mbranch-protection=standard' for target 'aarch64-unknown-linux-pauthtest' // 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: %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 6d46375428a4589deef5533e929b24330b8339b9 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Mon, 25 Nov 2024 00:50:49 +0300 Subject: [PATCH 2/7] For pauthtest ABI, allow ptrauth driver flags --- clang/lib/Driver/ToolChains/Linux.cpp | 102 +++++++++++++++++++++++--- clang/test/Driver/aarch64-ptrauth.c | 99 +++++++++++++++++-------- 2 files changed, 159 insertions(+), 42 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 4f14b3cf17654..19370574df956 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -494,28 +494,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); } diff --git a/clang/test/Driver/aarch64-ptrauth.c b/clang/test/Driver/aarch64-ptrauth.c index c526656c9c9bf..8172dac7583f7 100644 --- a/clang/test/Driver/aarch64-ptrauth.c +++ b/clang/test/Driver/aarch64-ptrauth.c @@ -4,6 +4,37 @@ // NONE: "-cc1" // NONE-NOT: "-fptrauth- +//// -fptauth-* driver flags are only supported for 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 \ +// 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-PAUTHTEST +// 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-PAUTHTEST +// ALL-LINUX-PAUTHTEST: "-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 @@ -22,44 +53,47 @@ // 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 -// 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: "-target-abi" "pauthtest" -// PAUTHABI1-NOT: "-fptrauth-function-pointer-type-discrimination" - -// RUN: %clang -### -c --target=aarch64-linux -mabi=pauthtest \ -// RUN: -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2 -// RUN: %clang -### -c --target=aarch64-linux-pauthtest \ -// RUN: -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2 +// 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 -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=PAUTHTEST2 +// 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=PAUTHTEST2 //// 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) -// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefixes=PAUTHABI2,PAUTHABI3 +// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefixes=PAUTHTEST2 -// PAUTHABI2: "-cc1" -// PAUTHABI2-SAME: "-target-abi" "pauthtest" -// PAUTHABI3-NOT: "-fptrauth- -// PAUTHABI2-NOT: "-faarch64-jump-table-hardening" +// PAUTHTEST2: "-cc1" +// PAUTHTEST2-SAME: "-target-abi" "pauthtest" +// PAUTHTEST2-NOT: "-fptrauth- +// PAUTHTEST2-NOT: "-faarch64-jump-table-hardening" //// Non-linux OS: pauthtest environment does not correspond to pauthtest ABI; aapcs is the default. -// RUN: %clang -### -c --target=aarch64-pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI4 -// PAUTHABI4: "-cc1" -// PAUTHABI4-SAME: "-target-abi" "aapcs" -// PAUTHABI4-NOT: "-fptrauth- -// PAUTHABI4-NOT: "-faarch64-jump-table-hardening" - -//// Non-AArch64. -// RUN: not %clang -### -c --target=x86_64-linux -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \ +// 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" + +//// 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-prefixes=ERR1,ERR2 -//// Non-linux and non-Darwin OS. -// RUN: not %clang -### -c --target=aarch64 -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 %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 '{{.*}}' @@ -70,8 +104,11 @@ // 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 '{{.*}}' -// ERR2-NEXT: error: unsupported option '-faarch64-jump-table-hardening' for target '{{.*}}' +// ERR1-NEXT: error: unsupported option '-fptrauth-elf-got' for target '{{.*}}' +//// Non-AArch64. +// RUN: not %clang -### -c --target=x86_64-linux -faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefixes=ERR2 +// ERR2: error: unsupported option '-faarch64-jump-table-hardening' for target '{{.*}}' // RUN: not %clang -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=ERR3 //// The ABI is not specified explicitly, and for non-Linux pauthtest environment does not correspond From 928c63818ade7b7f9994bb2c9393944e47533d03 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Mon, 25 Nov 2024 10:33:48 +0300 Subject: [PATCH 3/7] Minor test enhancement --- clang/test/Driver/aarch64-ptrauth.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/clang/test/Driver/aarch64-ptrauth.c b/clang/test/Driver/aarch64-ptrauth.c index 8172dac7583f7..9001e342c28b7 100644 --- a/clang/test/Driver/aarch64-ptrauth.c +++ b/clang/test/Driver/aarch64-ptrauth.c @@ -4,7 +4,7 @@ // NONE: "-cc1" // NONE-NOT: "-fptrauth- -//// -fptauth-* driver flags are only supported for pauthtest ABI +//// -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 \ @@ -40,6 +40,7 @@ // 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 \ @@ -58,7 +59,7 @@ // 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" +// PAUTHTEST1-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 \ @@ -75,19 +76,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) -// 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 // PAUTHTEST2: "-cc1" // PAUTHTEST2-SAME: "-target-abi" "pauthtest" // PAUTHTEST2-NOT: "-fptrauth- -// PAUTHTEST2-NOT: "-faarch64-jump-table-hardening" +// PAUTHTEST2-NOT: "-faarch64-jump-table-hardening" //// Non-linux OS: pauthtest environment does not correspond to pauthtest ABI; aapcs is the default. // 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" +// PAUTHTEST3-NOT: "-faarch64-jump-table-hardening" //// Non-pauthtest ABI. // RUN: not %clang -### -c --target=aarch64-linux -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \ @@ -107,14 +108,16 @@ // ERR1-NEXT: error: unsupported option '-fptrauth-elf-got' for target '{{.*}}' //// Non-AArch64. -// RUN: not %clang -### -c --target=x86_64-linux -faarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefixes=ERR2 +// 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' + //// 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 -// ERR3: 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=ERR4 From b6a13663b329b7fb5e31e0b6724364bb00109c26 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Sun, 8 Dec 2024 00:11:49 +0300 Subject: [PATCH 4/7] Address review comments --- clang/include/clang/Driver/ToolChain.h | 3 +++ clang/lib/Driver/ToolChain.cpp | 26 +++++++++++++++++++ clang/lib/Driver/ToolChains/Darwin.cpp | 34 ------------------------- clang/lib/Driver/ToolChains/Linux.cpp | 35 +++----------------------- clang/lib/Driver/ToolChains/Linux.h | 2 ++ 5 files changed, 34 insertions(+), 66 deletions(-) diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index 5347e29be9143..d2df647dc0f35 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -219,6 +219,9 @@ class ToolChain { FileType Type, bool AddArch) 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 94523550db76b..52065990ba004 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -751,6 +751,32 @@ std::string ToolChain::buildCompilerRTBasename(const llvm::opt::ArgList &Args, return (Prefix + Twine("clang_rt.") + 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) const { // Check for runtime files in the new layout without the architecture first. diff --git a/clang/lib/Driver/ToolChains/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index 71f98704e334c..d9f1ce8f8ced7 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -3067,40 +3067,6 @@ bool Darwin::isSizedDeallocationUnavailable() const { return TargetVersion < sizedDeallocMinVersion(OS); } -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 Darwin::addClangTargetOptions( const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, Action::OffloadKind DeviceOffloadKind) const { diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 19370574df956..004c777a6245d 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -543,38 +543,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 9a0298a088515..610c41f8752ce 100644 --- a/clang/lib/Driver/ToolChains/Linux.h +++ b/clang/lib/Driver/ToolChains/Linux.h @@ -72,6 +72,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 c99acf23611dfd1c4e7dcd00169c3c9dcae39d30 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Mon, 16 Dec 2024 11:29:05 +0300 Subject: [PATCH 5/7] 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/Darwin.cpp | 3 --- clang/lib/Driver/ToolChains/Linux.cpp | 20 +------------- clang/lib/Driver/ToolChains/Linux.h | 2 -- 6 files changed, 37 insertions(+), 53 deletions(-) diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h index d2df647dc0f35..5347e29be9143 100644 --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -219,9 +219,6 @@ class ToolChain { FileType Type, bool AddArch) 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 52065990ba004..94523550db76b 100644 --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -751,32 +751,6 @@ std::string ToolChain::buildCompilerRTBasename(const llvm::opt::ArgList &Args, return (Prefix + Twine("clang_rt.") + 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) 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 914a96eaa5f85..1f41d185ce04a 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1808,6 +1808,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/Darwin.cpp b/clang/lib/Driver/ToolChains/Darwin.cpp index d9f1ce8f8ced7..4105d38d15d7d 100644 --- a/clang/lib/Driver/ToolChains/Darwin.cpp +++ b/clang/lib/Driver/ToolChains/Darwin.cpp @@ -3143,9 +3143,6 @@ void Darwin::addClangTargetOptions( if (!RequiresSubdirectorySearch) CC1Args.push_back("-fno-modulemap-allow-subdirectory-search"); } - - if (getTriple().isAArch64()) - addPointerAuthFlags(DriverArgs, CC1Args); } void Darwin::addClangCC1ASTargetOptions( diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 004c777a6245d..13fc4640e73bd 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -543,30 +543,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 610c41f8752ce..9a0298a088515 100644 --- a/clang/lib/Driver/ToolChains/Linux.h +++ b/clang/lib/Driver/ToolChains/Linux.h @@ -72,8 +72,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 1e731d3d15d6ef9f98803488586401f137bfdaa8 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Tue, 17 Dec 2024 23:28:42 +0300 Subject: [PATCH 6/7] Address review comments --- clang/test/Driver/aarch64-ptrauth.c | 42 ++++++++++++++--------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/clang/test/Driver/aarch64-ptrauth.c b/clang/test/Driver/aarch64-ptrauth.c index 9001e342c28b7..5362c655fead7 100644 --- a/clang/test/Driver/aarch64-ptrauth.c +++ b/clang/test/Driver/aarch64-ptrauth.c @@ -18,7 +18,7 @@ // 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-PAUTHTEST +// 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 \ @@ -32,8 +32,8 @@ // 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-PAUTHTEST -// ALL-LINUX-PAUTHTEST: "-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: %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 \ @@ -54,41 +54,41 @@ // 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=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=PAUTHABI1 +// RUN: %clang -### -c --target=aarch64-linux-pauthtest %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: "-target-abi" "pauthtest" +// PAUTHABI1-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=PAUTHTEST2 +// 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 \ -// RUN: -fno-aarch64-jump-table-hardening %s 2>&1 | FileCheck %s --check-prefix=PAUTHTEST2 +// 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) -// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHTEST2 +// RUN: %clang -### -c --target=aarch64 -mabi=pauthtest %s 2>&1 | FileCheck %s --check-prefix=PAUTHABI2 -// PAUTHTEST2: "-cc1" -// PAUTHTEST2-SAME: "-target-abi" "pauthtest" -// PAUTHTEST2-NOT: "-fptrauth- -// PAUTHTEST2-NOT: "-faarch64-jump-table-hardening" +// PAUTHABI2: "-cc1" +// PAUTHABI2-SAME: "-target-abi" "pauthtest" +// PAUTHABI2-NOT: "-fptrauth- +// PAUTHABI2-NOT: "-faarch64-jump-table-hardening" //// Non-linux OS: pauthtest environment does not correspond to pauthtest ABI; aapcs is the default. -// 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=PAUTHABI3 +// PAUTHABI3: "-cc1" +// PAUTHABI3-SAME: "-target-abi" "aapcs" +// PAUTHABI3-NOT: "-fptrauth- +// PAUTHABI3-NOT: "-faarch64-jump-table-hardening" //// Non-pauthtest ABI. // RUN: not %clang -### -c --target=aarch64-linux -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \ From 6deb38da1ec1f1d791fe7b4fb4a5b778af98bb8b Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Tue, 17 Dec 2024 23:32:16 +0300 Subject: [PATCH 7/7] Delete unneeded spaces --- clang/test/Driver/aarch64-ptrauth.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clang/test/Driver/aarch64-ptrauth.c b/clang/test/Driver/aarch64-ptrauth.c index 5362c655fead7..c03275d19e74f 100644 --- a/clang/test/Driver/aarch64-ptrauth.c +++ b/clang/test/Driver/aarch64-ptrauth.c @@ -59,7 +59,7 @@ // 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: "-target-abi" "pauthtest" -// PAUTHABI1-NOT: "-fptrauth-function-pointer-type-discrimination" +// PAUTHABI1-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 \ @@ -81,14 +81,14 @@ // PAUTHABI2: "-cc1" // PAUTHABI2-SAME: "-target-abi" "pauthtest" // PAUTHABI2-NOT: "-fptrauth- -// PAUTHABI2-NOT: "-faarch64-jump-table-hardening" +// PAUTHABI2-NOT: "-faarch64-jump-table-hardening" //// Non-linux OS: pauthtest environment does not correspond to pauthtest ABI; aapcs is the default. // 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" +// PAUTHABI3-NOT: "-faarch64-jump-table-hardening" //// Non-pauthtest ABI. // RUN: not %clang -### -c --target=aarch64-linux -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \