From 919af72c09216838bfe586c3da503f5d74104a7d Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Tue, 19 Mar 2024 23:57:06 +0300 Subject: [PATCH 01/10] [PAC][clang] Define ptrauth driver flags and preprocessor features Define the following clang driver flags: - `-fptrauth-intrinsics`: `PointerAuth.intrinsics()` in `LangOptions`, `ptrauth_intrinsics` preprocessor feature; - `-fptrauth-calls`: `PointerAuth.calls()` in `LangOptions`, `ptrauth_calls` and and `ptrauth_member_function_pointer_type_discrimination` preprocessor features; - `-fptrauth-returns`: `PointerAuth.returns()` in `LangOptions`, `ptrauth_returns` preprocessor feature; - `-fptrauth-auth-traps`: `PointerAuth.authTraps()` in `LangOptions`; - `-fptrauth-vtable-pointer-address-discrimination`: `PointerAuth.vtptrAddressDiscrimination()` in `LangOptions`, `ptrauth_vtable_pointer_address_discrimination` preprocessor feature; - `-fptrauth-vtable-pointer-type-discrimination`: `PointerAuth.vtptrTypeDiscrimination()` in `LangOptions`, `ptrauth_vtable_pointer_type_discrimination` preprocessor feature; - `-fptrauth-init-fini`: `PointerAuth.initFini()` in `LangOptions`, `ptrauth_init_fini` preprocessor feature. The patch only defines the flags and having corresponding `LangOptions` set does not affect codegen yet. Co-authored-by: Ahmed Bougacha --- clang/include/clang/Basic/Features.def | 6 ++ clang/include/clang/Basic/LangOptions.def | 6 ++ clang/include/clang/Driver/Options.td | 18 ++++ clang/lib/Driver/ToolChains/Clang.cpp | 27 ++++++ clang/lib/Frontend/CompilerInvocation.cpp | 20 ++++ clang/test/Driver/ptrauth.c | 32 +++++++ clang/test/Preprocessor/ptrauth_feature.c | 107 +++++++++++++++++++++- 7 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 clang/test/Driver/ptrauth.c diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def index eeed5f4751f2f..1c6236aa4f974 100644 --- a/clang/include/clang/Basic/Features.def +++ b/clang/include/clang/Basic/Features.def @@ -102,6 +102,12 @@ FEATURE(thread_sanitizer, LangOpts.Sanitize.has(SanitizerKind::Thread)) FEATURE(dataflow_sanitizer, LangOpts.Sanitize.has(SanitizerKind::DataFlow)) FEATURE(scudo, LangOpts.Sanitize.hasOneOf(SanitizerKind::Scudo)) FEATURE(ptrauth_intrinsics, LangOpts.PointerAuthIntrinsics) +FEATURE(ptrauth_calls, LangOpts.PointerAuthCalls) +FEATURE(ptrauth_returns, LangOpts.PointerAuthReturns) +FEATURE(ptrauth_vtable_pointer_address_discrimination, LangOpts.PointerAuthVTPtrAddressDiscrimination) +FEATURE(ptrauth_vtable_pointer_type_discrimination, LangOpts.PointerAuthVTPtrTypeDiscrimination) +FEATURE(ptrauth_member_function_pointer_type_discrimination, LangOpts.PointerAuthCalls) +FEATURE(ptrauth_init_fini, LangOpts.PointerAuthInitFini) FEATURE(swiftasynccc, PP.getTargetInfo().checkCallingConvention(CC_SwiftAsync) == clang::TargetInfo::CCCR_OK) diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 8ef6700ecdc78..4b99e70298462 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -162,6 +162,12 @@ LANGOPT(RelaxedTemplateTemplateArgs, 1, 0, "C++17 relaxed matching of template t LANGOPT(ExperimentalLibrary, 1, 0, "enable unstable and experimental library features") LANGOPT(PointerAuthIntrinsics, 1, 0, "pointer authentication intrinsics") +LANGOPT(PointerAuthCalls , 1, 0, "function pointer authentication") +LANGOPT(PointerAuthReturns, 1, 0, "return pointer authentication") +LANGOPT(PointerAuthAuthTraps, 1, 0, "pointer authentication failure traps") +LANGOPT(PointerAuthVTPtrAddressDiscrimination, 1, 0, "incorporate address discrimination in authenticated vtable pointers") +LANGOPT(PointerAuthVTPtrTypeDiscrimination, 1, 0, "incorporate type discrimination in authenticated vtable pointers") +LANGOPT(PointerAuthInitFini, 1, 0, "sign function pointers in init/fini arrays") LANGOPT(DoubleSquareBracketAttributes, 1, 0, "'[[]]' attributes extension for all language standard modes") diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 29c226f4bd8da..e624eed2a1531 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4110,8 +4110,26 @@ let Group = f_Group in { let Visibility = [ClangOption,CC1Option] in { def fptrauth_intrinsics : Flag<["-"], "fptrauth-intrinsics">, HelpText<"Enable pointer authentication intrinsics">; + def fptrauth_calls : Flag<["-"], "fptrauth-calls">, + HelpText<"Enable signing and authentication of all indirect calls">; + def fptrauth_returns : Flag<["-"], "fptrauth-returns">, + HelpText<"Enable signing and authentication of return addresses">; + def fptrauth_auth_traps : Flag<["-"], "fptrauth-auth-traps">, + HelpText<"Enable traps on authentication failures">; + def fptrauth_vtable_pointer_address_discrimination : Flag<["-"], "fptrauth-vtable-pointer-address-discrimination">, + HelpText<"Enable address discrimination of vtable pointers">; + def fptrauth_vtable_pointer_type_discrimination : Flag<["-"], "fptrauth-vtable-pointer-type-discrimination">, + HelpText<"Enable type discrimination of vtable pointers">; + def fptrauth_init_fini : Flag<["-"], "fptrauth-init-fini">, + HelpText<"Enable signing of function pointers in init/fini arrays">; } def fno_ptrauth_intrinsics : Flag<["-"], "fno-ptrauth-intrinsics">; + def fno_ptrauth_calls : Flag<["-"], "fno-ptrauth-calls">; + def fno_ptrauth_returns : Flag<["-"], "fno-ptrauth-returns">; + def fno_ptrauth_auth_traps : Flag<["-"], "fno-ptrauth-auth-traps">; + def fno_ptrauth_vtable_pointer_address_discrimination : Flag<["-"], "fno-ptrauth-vtable-pointer-address-discrimination">; + def fno_ptrauth_vtable_pointer_type_discrimination : Flag<["-"], "fno-ptrauth-vtable-pointer-type-discrimination">; + def fno_ptrauth_init_fini : Flag<["-"], "fno-ptrauth-init-fini">; } def fenable_matrix : Flag<["-"], "fenable-matrix">, Group, diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 055884d275ce1..04ca9e08591f9 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7203,6 +7203,33 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, options::OPT_fno_ptrauth_intrinsics, false)) CmdArgs.push_back("-fptrauth-intrinsics"); + if (Args.hasFlag(options::OPT_fptrauth_calls, options::OPT_fno_ptrauth_calls, + false)) + CmdArgs.push_back("-fptrauth-calls"); + + if (Args.hasFlag(options::OPT_fptrauth_returns, + options::OPT_fno_ptrauth_returns, false)) + CmdArgs.push_back("-fptrauth-returns"); + + if (Args.hasFlag(options::OPT_fptrauth_auth_traps, + options::OPT_fno_ptrauth_auth_traps, false)) + CmdArgs.push_back("-fptrauth-auth-traps"); + + if (Args.hasFlag( + options::OPT_fptrauth_vtable_pointer_address_discrimination, + options::OPT_fno_ptrauth_vtable_pointer_address_discrimination, + false)) + CmdArgs.push_back("-fptrauth-vtable-pointer-address-discrimination"); + + if (Args.hasFlag(options::OPT_fptrauth_vtable_pointer_type_discrimination, + options::OPT_fno_ptrauth_vtable_pointer_type_discrimination, + false)) + CmdArgs.push_back("-fptrauth-vtable-pointer-type-discrimination"); + + if (Args.hasFlag(options::OPT_fptrauth_init_fini, + options::OPT_fno_ptrauth_init_fini, false)) + CmdArgs.push_back("-fptrauth-init-fini"); + // -fsigned-bitfields is default, and clang doesn't yet support // -funsigned-bitfields. if (!Args.hasFlag(options::OPT_fsigned_bitfields, diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index 2a21a9d619dc0..8f921c65a5637 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3297,11 +3297,31 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts, ArgumentConsumer Consumer) { if (Opts.PointerAuthIntrinsics) GenerateArg(Consumer, OPT_fptrauth_intrinsics); + if (Opts.PointerAuthCalls) + GenerateArg(Consumer, OPT_fptrauth_calls); + if (Opts.PointerAuthReturns) + GenerateArg(Consumer, OPT_fptrauth_returns); + if (Opts.PointerAuthAuthTraps) + GenerateArg(Consumer, OPT_fptrauth_auth_traps); + if (Opts.PointerAuthVTPtrAddressDiscrimination) + GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_address_discrimination); + if (Opts.PointerAuthVTPtrTypeDiscrimination) + GenerateArg(Consumer, OPT_fptrauth_vtable_pointer_type_discrimination); + if (Opts.PointerAuthInitFini) + GenerateArg(Consumer, OPT_fptrauth_init_fini); } static void ParsePointerAuthArgs(LangOptions &Opts, ArgList &Args, DiagnosticsEngine &Diags) { Opts.PointerAuthIntrinsics = Args.hasArg(OPT_fptrauth_intrinsics); + Opts.PointerAuthCalls = Args.hasArg(OPT_fptrauth_calls); + Opts.PointerAuthReturns = Args.hasArg(OPT_fptrauth_returns); + Opts.PointerAuthAuthTraps = Args.hasArg(OPT_fptrauth_auth_traps); + Opts.PointerAuthVTPtrAddressDiscrimination = + Args.hasArg(OPT_fptrauth_vtable_pointer_address_discrimination); + Opts.PointerAuthVTPtrTypeDiscrimination = + Args.hasArg(OPT_fptrauth_vtable_pointer_type_discrimination); + Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini); } /// Check if input file kind and language standard are compatible. diff --git a/clang/test/Driver/ptrauth.c b/clang/test/Driver/ptrauth.c new file mode 100644 index 0000000000000..2336a5d551b01 --- /dev/null +++ b/clang/test/Driver/ptrauth.c @@ -0,0 +1,32 @@ +// Check that we can manually enable specific ptrauth features. + +// RUN: %clang -target aarch64 -c %s -### 2>&1 | FileCheck %s --check-prefix NONE +// NONE: "-cc1" +// NONE-NOT: "-fptrauth-intrinsics" +// NONE-NOT: "-fptrauth-calls" +// NONE-NOT: "-fptrauth-returns" +// NONE-NOT: "-fptrauth-auth-traps" +// NONE-NOT: "-fptrauth-vtable-pointer-address-discrimination" +// NONE-NOT: "-fptrauth-vtable-pointer-type-discrimination" +// NONE-NOT: "-fptrauth-init-fini" + +// RUN: %clang -target aarch64 -fptrauth-intrinsics -c %s -### 2>&1 | FileCheck %s --check-prefix INTRIN +// INTRIN: "-cc1"{{.*}} {{.*}} "-fptrauth-intrinsics" + +// RUN: %clang -target aarch64 -fptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix CALL +// CALL: "-cc1"{{.*}} {{.*}} "-fptrauth-calls" + +// RUN: %clang -target aarch64 -fptrauth-returns -c %s -### 2>&1 | FileCheck %s --check-prefix RETURN +// RETURN: "-cc1"{{.*}} {{.*}} "-fptrauth-returns" + +// RUN: %clang -target aarch64 -fptrauth-auth-traps -c %s -### 2>&1 | FileCheck %s --check-prefix TRAPS +// TRAPS: "-cc1"{{.*}} {{.*}} "-fptrauth-auth-traps" + +// RUN: %clang -target aarch64 -fptrauth-vtable-pointer-address-discrimination -c %s -### 2>&1 | FileCheck %s --check-prefix VPTR_ADDR_DISCR +// VPTR_ADDR_DISCR: "-cc1"{{.*}} {{.*}} "-fptrauth-vtable-pointer-address-discrimination" + +// RUN: %clang -target aarch64 -fptrauth-vtable-pointer-type-discrimination -c %s -### 2>&1 | FileCheck %s --check-prefix VPTR_TYPE_DISCR +// VPTR_TYPE_DISCR: "-cc1"{{.*}} {{.*}} "-fptrauth-vtable-pointer-type-discrimination" + +// RUN: %clang -target aarch64 -fptrauth-init-fini -c %s -### 2>&1 | FileCheck %s --check-prefix INITFINI +// INITFINI: "-cc1"{{.*}} {{.*}} "-fptrauth-init-fini" diff --git a/clang/test/Preprocessor/ptrauth_feature.c b/clang/test/Preprocessor/ptrauth_feature.c index e45c6ea90fd11..80e239110ffc7 100644 --- a/clang/test/Preprocessor/ptrauth_feature.c +++ b/clang/test/Preprocessor/ptrauth_feature.c @@ -1,5 +1,59 @@ -// RUN: %clang_cc1 %s -E -triple=arm64-- | FileCheck %s --check-prefixes=NOINTRIN -// RUN: %clang_cc1 %s -E -triple=arm64-- -fptrauth-intrinsics | FileCheck %s --check-prefixes=INTRIN +// RUN: %clang_cc1 -E %s -triple=aarch64 \ +// RUN: -fptrauth-intrinsics \ +// RUN: -fptrauth-calls \ +// RUN: -fptrauth-returns \ +// RUN: -fptrauth-vtable-pointer-address-discrimination \ +// RUN: -fptrauth-vtable-pointer-type-discrimination \ +// RUN: -fptrauth-init-fini | \ +// RUN: FileCheck %s --check-prefixes=INTRIN,CALLS,RETS,VPTR_ADDR_DISCR,VPTR_TYPE_DISCR,INITFINI + +// RUN: %clang_cc1 -E %s -triple=aarch64 \ +// RUN: -fptrauth-calls \ +// RUN: -fptrauth-returns \ +// RUN: -fptrauth-vtable-pointer-address-discrimination \ +// RUN: -fptrauth-vtable-pointer-type-discrimination \ +// RUN: -fptrauth-init-fini | \ +// RUN: FileCheck %s --check-prefixes=NOINTRIN,CALLS,RETS,VPTR_ADDR_DISCR,VPTR_TYPE_DISCR,INITFINI + +// RUN: %clang_cc1 -E %s -triple=aarch64 \ +// RUN: -fptrauth-intrinsics \ +// RUN: -fptrauth-returns \ +// RUN: -fptrauth-vtable-pointer-address-discrimination \ +// RUN: -fptrauth-vtable-pointer-type-discrimination \ +// RUN: -fptrauth-init-fini | \ +// RUN: FileCheck %s --check-prefixes=INTRIN,NOCALLS,RETS,VPTR_ADDR_DISCR,VPTR_TYPE_DISCR,INITFINI + +// RUN: %clang_cc1 -E %s -triple=aarch64 \ +// RUN: -fptrauth-intrinsics \ +// RUN: -fptrauth-calls \ +// RUN: -fptrauth-vtable-pointer-address-discrimination \ +// RUN: -fptrauth-vtable-pointer-type-discrimination \ +// RUN: -fptrauth-init-fini | \ +// RUN: FileCheck %s --check-prefixes=INTRIN,CALLS,NORETS,VPTR_ADDR_DISCR,VPTR_TYPE_DISCR,INITFINI + +// RUN: %clang_cc1 -E %s -triple=aarch64 \ +// RUN: -fptrauth-intrinsics \ +// RUN: -fptrauth-calls \ +// RUN: -fptrauth-returns \ +// RUN: -fptrauth-vtable-pointer-type-discrimination \ +// RUN: -fptrauth-init-fini | \ +// RUN: FileCheck %s --check-prefixes=INTRIN,CALLS,RETS,NOVPTR_ADDR_DISCR,VPTR_TYPE_DISCR,INITFINI + +// RUN: %clang_cc1 -E %s -triple=aarch64 \ +// RUN: -fptrauth-intrinsics \ +// RUN: -fptrauth-calls \ +// RUN: -fptrauth-returns \ +// RUN: -fptrauth-vtable-pointer-address-discrimination \ +// RUN: -fptrauth-init-fini | \ +// RUN: FileCheck %s --check-prefixes=INTRIN,CALLS,RETS,VPTR_ADDR_DISCR,NOVPTR_TYPE_DISCR,INITFINI + +// RUN: %clang_cc1 -E %s -triple=aarch64 \ +// RUN: -fptrauth-intrinsics \ +// RUN: -fptrauth-calls \ +// RUN: -fptrauth-returns \ +// RUN: -fptrauth-vtable-pointer-address-discrimination \ +// RUN: -fptrauth-vtable-pointer-type-discrimination | \ +// RUN: FileCheck %s --check-prefixes=INTRIN,CALLS,RETS,VPTR_ADDR_DISCR,VPTR_TYPE_DISCR,NOINITFINI #if __has_feature(ptrauth_intrinsics) // INTRIN: has_ptrauth_intrinsics @@ -8,3 +62,52 @@ void has_ptrauth_intrinsics() {} // NOINTRIN: no_ptrauth_intrinsics void no_ptrauth_intrinsics() {} #endif + +#if __has_feature(ptrauth_calls) +// CALLS: has_ptrauth_calls +void has_ptrauth_calls() {} +#else +// NOCALLS: no_ptrauth_calls +void no_ptrauth_calls() {} +#endif + +// This is always enabled when ptrauth_calls is enabled +#if __has_feature(ptrauth_member_function_pointer_type_discrimination) +// CALLS: has_ptrauth_member_function_pointer_type_discrimination +void has_ptrauth_member_function_pointer_type_discrimination() {} +#else +// NOCALLS: no_ptrauth_member_function_pointer_type_discrimination +void no_ptrauth_member_function_pointer_type_discrimination() {} +#endif + +#if __has_feature(ptrauth_returns) +// RETS: has_ptrauth_returns +void has_ptrauth_returns() {} +#else +// NORETS: no_ptrauth_returns +void no_ptrauth_returns() {} +#endif + +#if __has_feature(ptrauth_vtable_pointer_address_discrimination) +// VPTR_ADDR_DISCR: has_ptrauth_vtable_pointer_address_discrimination +void has_ptrauth_vtable_pointer_address_discrimination() {} +#else +// NOVPTR_ADDR_DISCR: no_ptrauth_vtable_pointer_address_discrimination +void no_ptrauth_vtable_pointer_address_discrimination() {} +#endif + +#if __has_feature(ptrauth_vtable_pointer_type_discrimination) +// VPTR_TYPE_DISCR: has_ptrauth_vtable_pointer_type_discrimination +void has_ptrauth_vtable_pointer_type_discrimination() {} +#else +// NOVPTR_TYPE_DISCR: no_ptrauth_vtable_pointer_type_discrimination +void no_ptrauth_vtable_pointer_type_discrimination() {} +#endif + +#if __has_feature(ptrauth_init_fini) +// INITFINI: has_ptrauth_init_fini +void has_ptrauth_init_fini() {} +#else +// NOINITFINI: no_ptrauth_init_fini +void no_ptrauth_init_fini() {} +#endif From 9924f57869cfe13fcf1e94a54e4835d51a92e693 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Wed, 13 Mar 2024 23:02:04 +0300 Subject: [PATCH 02/10] [PAC][AArch64][clang][ELF] Support PAuth ABI compatibility tag Emit PAuth ABI compatibility tag values as llvm module flags: - `aarch64-elf-pauthabi-platform` - `aarch64-elf-pauthabi-version` --- clang/lib/CodeGen/CodeGenModule.cpp | 31 ++++++++++++ clang/test/CodeGen/aarch64-elf-pauthabi.c | 61 +++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 clang/test/CodeGen/aarch64-elf-pauthabi.c diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 8ceecff28cbc6..a35fdf6fa7072 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -53,6 +53,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/BinaryFormat/ELF.h" #include "llvm/Frontend/OpenMP/OMPIRBuilder.h" #include "llvm/IR/AttributeMask.h" #include "llvm/IR/CallingConv.h" @@ -1187,6 +1188,36 @@ void CodeGenModule::Release() { if (!LangOpts.isSignReturnAddressWithAKey()) getModule().addModuleFlag(llvm::Module::Min, "sign-return-address-with-bkey", 1); + + if (getTriple().isOSLinux() && getTriple().isOSBinFormatELF()) { + using namespace llvm::ELF; + uint64_t PAuthABIVersion = + (LangOpts.PointerAuthIntrinsics + << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS) | + (LangOpts.PointerAuthCalls + << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS) | + (LangOpts.PointerAuthReturns + << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS) | + (LangOpts.PointerAuthAuthTraps + << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS) | + (LangOpts.PointerAuthVTPtrAddressDiscrimination + << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR) | + (LangOpts.PointerAuthVTPtrTypeDiscrimination + << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR) | + (LangOpts.PointerAuthInitFini + << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI); + static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI == + AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST, + "Update when new enum items are defined"); + if (PAuthABIVersion != 0) { + getModule().addModuleFlag(llvm::Module::Error, + "aarch64-elf-pauthabi-platform", + AARCH64_PAUTH_PLATFORM_LLVM_LINUX); + getModule().addModuleFlag(llvm::Module::Error, + "aarch64-elf-pauthabi-version", + PAuthABIVersion); + } + } } if (CodeGenOpts.StackClashProtector) diff --git a/clang/test/CodeGen/aarch64-elf-pauthabi.c b/clang/test/CodeGen/aarch64-elf-pauthabi.c new file mode 100644 index 0000000000000..8f3e2d9b274b5 --- /dev/null +++ b/clang/test/CodeGen/aarch64-elf-pauthabi.c @@ -0,0 +1,61 @@ +// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: -fptrauth-intrinsics \ +// RUN: -fptrauth-calls \ +// RUN: -fptrauth-returns \ +// RUN: -fptrauth-auth-traps \ +// RUN: -fptrauth-vtable-pointer-address-discrimination \ +// RUN: -fptrauth-vtable-pointer-type-discrimination \ +// RUN: -fptrauth-init-fini %s | \ +// RUN: FileCheck %s --check-prefix=ALL + +// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: -fptrauth-intrinsics %s | FileCheck %s --check-prefix=INTRIN + +// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: -fptrauth-calls %s | FileCheck %s --check-prefix=CALL + +// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: -fptrauth-returns %s | FileCheck %s --check-prefix=RET + +// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: -fptrauth-auth-traps %s | FileCheck %s --check-prefix=TRAP + +// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: -fptrauth-calls -fptrauth-vtable-pointer-address-discrimination %s | \ +// RUN: FileCheck %s --check-prefix=VPTRADDR + +// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: -fptrauth-calls -fptrauth-vtable-pointer-type-discrimination %s | \ +// RUN: FileCheck %s --check-prefix=VPTRTYPE + +// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: -fptrauth-calls -fptrauth-init-fini %s | \ +// RUN: FileCheck %s --check-prefix=INITFINI + +// REQUIRES: aarch64-registered-target + +// ALL: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458} +// ALL: !{i32 1, !"aarch64-elf-pauthabi-version", i32 127} + +// INTRIN: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458} +// INTRIN: !{i32 1, !"aarch64-elf-pauthabi-version", i32 1} + +// CALL: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458} +// CALL: !{i32 1, !"aarch64-elf-pauthabi-version", i32 2} + +// RET: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458} +// RET: !{i32 1, !"aarch64-elf-pauthabi-version", i32 4} + +// TRAP: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458} +// TRAP: !{i32 1, !"aarch64-elf-pauthabi-version", i32 8} + +// VPTRADDR: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458} +// VPTRADDR: !{i32 1, !"aarch64-elf-pauthabi-version", i32 18} + +// VPTRTYPE: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458} +// VPTRTYPE: !{i32 1, !"aarch64-elf-pauthabi-version", i32 34} + +// INITFINI: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458} +// INITFINI: !{i32 1, !"aarch64-elf-pauthabi-version", i32 66} + +void foo() {} From f80f4bd89a316611a507e79c029e64065681caf6 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Wed, 20 Mar 2024 09:42:33 +0300 Subject: [PATCH 03/10] Enhance tests --- clang/test/CodeGen/aarch64-elf-pauthabi.c | 20 +++++++-------- clang/test/Driver/ptrauth.c | 30 +++++++++++------------ 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/clang/test/CodeGen/aarch64-elf-pauthabi.c b/clang/test/CodeGen/aarch64-elf-pauthabi.c index 8f3e2d9b274b5..b8d41732718ec 100644 --- a/clang/test/CodeGen/aarch64-elf-pauthabi.c +++ b/clang/test/CodeGen/aarch64-elf-pauthabi.c @@ -1,4 +1,6 @@ -// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// REQUIRES: aarch64-registered-target + +// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-intrinsics \ // RUN: -fptrauth-calls \ // RUN: -fptrauth-returns \ @@ -8,32 +10,30 @@ // RUN: -fptrauth-init-fini %s | \ // RUN: FileCheck %s --check-prefix=ALL -// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-intrinsics %s | FileCheck %s --check-prefix=INTRIN -// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-calls %s | FileCheck %s --check-prefix=CALL -// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-returns %s | FileCheck %s --check-prefix=RET -// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-auth-traps %s | FileCheck %s --check-prefix=TRAP -// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-calls -fptrauth-vtable-pointer-address-discrimination %s | \ // RUN: FileCheck %s --check-prefix=VPTRADDR -// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-calls -fptrauth-vtable-pointer-type-discrimination %s | \ // RUN: FileCheck %s --check-prefix=VPTRTYPE -// RUN: %clang -target aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-calls -fptrauth-init-fini %s | \ // RUN: FileCheck %s --check-prefix=INITFINI -// REQUIRES: aarch64-registered-target - // ALL: !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458} // ALL: !{i32 1, !"aarch64-elf-pauthabi-version", i32 127} diff --git a/clang/test/Driver/ptrauth.c b/clang/test/Driver/ptrauth.c index 2336a5d551b01..cf13b229c111b 100644 --- a/clang/test/Driver/ptrauth.c +++ b/clang/test/Driver/ptrauth.c @@ -1,6 +1,6 @@ // Check that we can manually enable specific ptrauth features. -// RUN: %clang -target aarch64 -c %s -### 2>&1 | FileCheck %s --check-prefix NONE +// RUN: %clang --target=aarch64 -c %s -### 2>&1 | FileCheck %s --check-prefix NONE // NONE: "-cc1" // NONE-NOT: "-fptrauth-intrinsics" // NONE-NOT: "-fptrauth-calls" @@ -10,23 +10,23 @@ // NONE-NOT: "-fptrauth-vtable-pointer-type-discrimination" // NONE-NOT: "-fptrauth-init-fini" -// RUN: %clang -target aarch64 -fptrauth-intrinsics -c %s -### 2>&1 | FileCheck %s --check-prefix INTRIN -// INTRIN: "-cc1"{{.*}} {{.*}} "-fptrauth-intrinsics" +// RUN: %clang --target=aarch64 -fptrauth-intrinsics -c %s -### 2>&1 | FileCheck %s --check-prefix INTRIN +// INTRIN: "-cc1"{{.*}} "-fptrauth-intrinsics" -// RUN: %clang -target aarch64 -fptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix CALL -// CALL: "-cc1"{{.*}} {{.*}} "-fptrauth-calls" +// RUN: %clang --target=aarch64 -fptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix CALL +// CALL: "-cc1"{{.*}} "-fptrauth-calls" -// RUN: %clang -target aarch64 -fptrauth-returns -c %s -### 2>&1 | FileCheck %s --check-prefix RETURN -// RETURN: "-cc1"{{.*}} {{.*}} "-fptrauth-returns" +// RUN: %clang --target=aarch64 -fptrauth-returns -c %s -### 2>&1 | FileCheck %s --check-prefix RETURN +// RETURN: "-cc1"{{.*}} "-fptrauth-returns" -// RUN: %clang -target aarch64 -fptrauth-auth-traps -c %s -### 2>&1 | FileCheck %s --check-prefix TRAPS -// TRAPS: "-cc1"{{.*}} {{.*}} "-fptrauth-auth-traps" +// RUN: %clang --target=aarch64 -fptrauth-auth-traps -c %s -### 2>&1 | FileCheck %s --check-prefix TRAPS +// TRAPS: "-cc1"{{.*}} "-fptrauth-auth-traps" -// RUN: %clang -target aarch64 -fptrauth-vtable-pointer-address-discrimination -c %s -### 2>&1 | FileCheck %s --check-prefix VPTR_ADDR_DISCR -// VPTR_ADDR_DISCR: "-cc1"{{.*}} {{.*}} "-fptrauth-vtable-pointer-address-discrimination" +// RUN: %clang --target=aarch64 -fptrauth-vtable-pointer-address-discrimination -c %s -### 2>&1 | FileCheck %s --check-prefix VPTR_ADDR_DISCR +// VPTR_ADDR_DISCR: "-cc1"{{.*}} "-fptrauth-vtable-pointer-address-discrimination" -// RUN: %clang -target aarch64 -fptrauth-vtable-pointer-type-discrimination -c %s -### 2>&1 | FileCheck %s --check-prefix VPTR_TYPE_DISCR -// VPTR_TYPE_DISCR: "-cc1"{{.*}} {{.*}} "-fptrauth-vtable-pointer-type-discrimination" +// RUN: %clang --target=aarch64 -fptrauth-vtable-pointer-type-discrimination -c %s -### 2>&1 | FileCheck %s --check-prefix VPTR_TYPE_DISCR +// VPTR_TYPE_DISCR: "-cc1"{{.*}} "-fptrauth-vtable-pointer-type-discrimination" -// RUN: %clang -target aarch64 -fptrauth-init-fini -c %s -### 2>&1 | FileCheck %s --check-prefix INITFINI -// INITFINI: "-cc1"{{.*}} {{.*}} "-fptrauth-init-fini" +// RUN: %clang --target=aarch64 -fptrauth-init-fini -c %s -### 2>&1 | FileCheck %s --check-prefix INITFINI +// INITFINI: "-cc1"{{.*}} "-fptrauth-init-fini" From f3abb4897fb9cd56b00eb6344489bbc972c40c5b Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Tue, 26 Mar 2024 18:41:25 +0300 Subject: [PATCH 04/10] Update clang/test/Driver/aarch64-ptrauth.c --- clang/test/Driver/aarch64-ptrauth.c | 32 +++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/clang/test/Driver/aarch64-ptrauth.c b/clang/test/Driver/aarch64-ptrauth.c index 1a69b2c6edfb1..abc49fe090167 100644 --- a/clang/test/Driver/aarch64-ptrauth.c +++ b/clang/test/Driver/aarch64-ptrauth.c @@ -1,5 +1,33 @@ // RUN: %clang -### -c --target=aarch64 -fno-ptrauth-intrinsics -fptrauth-intrinsics %s 2>&1 | FileCheck %s --check-prefix=INTRIN // INTRIN: "-cc1"{{.*}} "-fptrauth-intrinsics" -// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics %s 2>&1 | FileCheck %s --check-prefix=ERR -// ERR: error: unsupported option '-fptrauth-intrinsics' for target '{{.*}}' +// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-calls -fptrauth-calls %s 2>&1 | FileCheck %s --check-prefix=CALL +// CALL: "-cc1"{{.*}} "-fptrauth-calls" + +// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-returns -fptrauth-returns %s 2>&1 | FileCheck %s --check-prefix=RETURN +// RETURN: "-cc1"{{.*}} "-fptrauth-returns" + +// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-auth-traps -fptrauth-auth-traps %s 2>&1 | FileCheck %s --check-prefix=TRAP +// TRAP: "-cc1"{{.*}} "-fptrauth-auth-traps" + +// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-vtable-pointer-address-discrimination \ +// RUN: -fptrauth-vtable-pointer-address-discrimination %s 2>&1 | FileCheck %s --check-prefix=VPTRADDR +// VPTRADDR: "-cc1"{{.*}} "-fptrauth-vtable-pointer-address-discrimination" + +// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-vtable-pointer-type-discrimination \ +// RUN: -fptrauth-vtable-pointer-type-discrimination %s 2>&1 | FileCheck %s --check-prefix=VPTRTYPE +// VPTRTYPE: "-cc1"{{.*}} "-fptrauth-vtable-pointer-type-discrimination" + +// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-init-fini -fptrauth-init-fini %s 2>&1 | FileCheck %s --check-prefix=INITFINI +// INITFINI: "-cc1"{{.*}} "-fptrauth-init-fini" + +// RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \ +// RUN: -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination \ +// RUN: -fptrauth-init-fini %s 2>&1 | FileCheck %s --check-prefix=ERR +// ERR: error: unsupported option '-fptrauth-intrinsics' for target '{{.*}}' +// ERR-NEXT: error: unsupported option '-fptrauth-calls' for target '{{.*}}' +// ERR-NEXT: error: unsupported option '-fptrauth-returns' for target '{{.*}}' +// ERR-NEXT: error: unsupported option '-fptrauth-auth-traps' for target '{{.*}}' +// ERR-NEXT: error: unsupported option '-fptrauth-vtable-pointer-address-discrimination' for target '{{.*}}' +// ERR-NEXT: error: unsupported option '-fptrauth-vtable-pointer-type-discrimination' for target '{{.*}}' +// ERR-NEXT: error: unsupported option '-fptrauth-init-fini' for target '{{.*}}' From 6dcf86e0d8a19fad4cdeeb64ee34391f8fbcb7b5 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Tue, 26 Mar 2024 18:41:40 +0300 Subject: [PATCH 05/10] Fix code formatting --- clang/include/clang/Driver/Options.td | 6 ++++-- clang/lib/Driver/ToolChains/Clang.cpp | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 65d266761530b..87d09274399fd 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -4110,8 +4110,10 @@ defm ptrauth_intrinsics : OptInCC1FFlag<"ptrauth-intrinsics", "Enable pointer au defm ptrauth_calls : OptInCC1FFlag<"ptrauth-calls", "Enable signing and authentication of all indirect calls">; defm ptrauth_returns : OptInCC1FFlag<"ptrauth-returns", "Enable signing and authentication of return addresses">; defm ptrauth_auth_traps : OptInCC1FFlag<"ptrauth-auth-traps", "Enable traps on authentication failures">; -defm ptrauth_vtable_pointer_address_discrimination : OptInCC1FFlag<"ptrauth-vtable-pointer-address-discrimination", "Enable address discrimination of vtable pointers">; -defm ptrauth_vtable_pointer_type_discrimination : OptInCC1FFlag<"ptrauth-vtable-pointer-type-discrimination", "Enable type discrimination of vtable pointers">; +defm ptrauth_vtable_pointer_address_discrimination : + OptInCC1FFlag<"ptrauth-vtable-pointer-address-discrimination", "Enable address discrimination of vtable pointers">; +defm ptrauth_vtable_pointer_type_discrimination : + OptInCC1FFlag<"ptrauth-vtable-pointer-type-discrimination", "Enable type discrimination of vtable pointers">; defm ptrauth_init_fini : OptInCC1FFlag<"ptrauth-init-fini", "Enable signing of function pointers in init/fini arrays">; } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 055d7de36a6ba..e6499e4563c2a 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1789,11 +1789,13 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args, 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_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_vtable_pointer_type_discrimination, + options::OPT_fno_ptrauth_vtable_pointer_type_discrimination); Args.addOptInFlag(CmdArgs, options::OPT_fptrauth_init_fini, options::OPT_fno_ptrauth_init_fini); From 4fd37cf125c13982ae0b6eb7254404fa3def6df5 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Tue, 26 Mar 2024 18:46:00 +0300 Subject: [PATCH 06/10] Delete clang/test/Driver/ptrauth.c in favor of aarch64-ptrauth.c --- clang/test/Driver/aarch64-ptrauth.c | 4 ++++ clang/test/Driver/ptrauth.c | 32 ----------------------------- 2 files changed, 4 insertions(+), 32 deletions(-) delete mode 100644 clang/test/Driver/ptrauth.c diff --git a/clang/test/Driver/aarch64-ptrauth.c b/clang/test/Driver/aarch64-ptrauth.c index abc49fe090167..9ae0347a8ccb1 100644 --- a/clang/test/Driver/aarch64-ptrauth.c +++ b/clang/test/Driver/aarch64-ptrauth.c @@ -1,3 +1,7 @@ +// RUN: %clang -### -c --target=aarch64 %s 2>&1 | FileCheck %s --check-prefix NONE +// NONE: "-cc1" +// NONE-NOT: "-fptrauth- + // RUN: %clang -### -c --target=aarch64 -fno-ptrauth-intrinsics -fptrauth-intrinsics %s 2>&1 | FileCheck %s --check-prefix=INTRIN // INTRIN: "-cc1"{{.*}} "-fptrauth-intrinsics" diff --git a/clang/test/Driver/ptrauth.c b/clang/test/Driver/ptrauth.c deleted file mode 100644 index cf13b229c111b..0000000000000 --- a/clang/test/Driver/ptrauth.c +++ /dev/null @@ -1,32 +0,0 @@ -// Check that we can manually enable specific ptrauth features. - -// RUN: %clang --target=aarch64 -c %s -### 2>&1 | FileCheck %s --check-prefix NONE -// NONE: "-cc1" -// NONE-NOT: "-fptrauth-intrinsics" -// NONE-NOT: "-fptrauth-calls" -// NONE-NOT: "-fptrauth-returns" -// NONE-NOT: "-fptrauth-auth-traps" -// NONE-NOT: "-fptrauth-vtable-pointer-address-discrimination" -// NONE-NOT: "-fptrauth-vtable-pointer-type-discrimination" -// NONE-NOT: "-fptrauth-init-fini" - -// RUN: %clang --target=aarch64 -fptrauth-intrinsics -c %s -### 2>&1 | FileCheck %s --check-prefix INTRIN -// INTRIN: "-cc1"{{.*}} "-fptrauth-intrinsics" - -// RUN: %clang --target=aarch64 -fptrauth-calls -c %s -### 2>&1 | FileCheck %s --check-prefix CALL -// CALL: "-cc1"{{.*}} "-fptrauth-calls" - -// RUN: %clang --target=aarch64 -fptrauth-returns -c %s -### 2>&1 | FileCheck %s --check-prefix RETURN -// RETURN: "-cc1"{{.*}} "-fptrauth-returns" - -// RUN: %clang --target=aarch64 -fptrauth-auth-traps -c %s -### 2>&1 | FileCheck %s --check-prefix TRAPS -// TRAPS: "-cc1"{{.*}} "-fptrauth-auth-traps" - -// RUN: %clang --target=aarch64 -fptrauth-vtable-pointer-address-discrimination -c %s -### 2>&1 | FileCheck %s --check-prefix VPTR_ADDR_DISCR -// VPTR_ADDR_DISCR: "-cc1"{{.*}} "-fptrauth-vtable-pointer-address-discrimination" - -// RUN: %clang --target=aarch64 -fptrauth-vtable-pointer-type-discrimination -c %s -### 2>&1 | FileCheck %s --check-prefix VPTR_TYPE_DISCR -// VPTR_TYPE_DISCR: "-cc1"{{.*}} "-fptrauth-vtable-pointer-type-discrimination" - -// RUN: %clang --target=aarch64 -fptrauth-init-fini -c %s -### 2>&1 | FileCheck %s --check-prefix INITFINI -// INITFINI: "-cc1"{{.*}} "-fptrauth-init-fini" From 2fd8f6606c6d287085582b82145b05a635fbf776 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Tue, 26 Mar 2024 18:47:42 +0300 Subject: [PATCH 07/10] Delete unneeded REQUIRES for aarch64 target --- clang/test/CodeGen/aarch64-elf-pauthabi.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/clang/test/CodeGen/aarch64-elf-pauthabi.c b/clang/test/CodeGen/aarch64-elf-pauthabi.c index b8d41732718ec..35f0579c4c84c 100644 --- a/clang/test/CodeGen/aarch64-elf-pauthabi.c +++ b/clang/test/CodeGen/aarch64-elf-pauthabi.c @@ -1,5 +1,3 @@ -// REQUIRES: aarch64-registered-target - // RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-intrinsics \ // RUN: -fptrauth-calls \ From fdb26a14024f5f8297480a74982a37ee988cd30f Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Wed, 24 Apr 2024 08:39:44 +0300 Subject: [PATCH 08/10] Use `%clang_cc1` instead of `%clang` --- clang/test/CodeGen/aarch64-elf-pauthabi.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/clang/test/CodeGen/aarch64-elf-pauthabi.c b/clang/test/CodeGen/aarch64-elf-pauthabi.c index 35f0579c4c84c..c579bfed893c8 100644 --- a/clang/test/CodeGen/aarch64-elf-pauthabi.c +++ b/clang/test/CodeGen/aarch64-elf-pauthabi.c @@ -1,4 +1,4 @@ -// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-intrinsics \ // RUN: -fptrauth-calls \ // RUN: -fptrauth-returns \ @@ -8,27 +8,27 @@ // RUN: -fptrauth-init-fini %s | \ // RUN: FileCheck %s --check-prefix=ALL -// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-intrinsics %s | FileCheck %s --check-prefix=INTRIN -// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-calls %s | FileCheck %s --check-prefix=CALL -// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-returns %s | FileCheck %s --check-prefix=RET -// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-auth-traps %s | FileCheck %s --check-prefix=TRAP -// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-calls -fptrauth-vtable-pointer-address-discrimination %s | \ // RUN: FileCheck %s --check-prefix=VPTRADDR -// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-calls -fptrauth-vtable-pointer-type-discrimination %s | \ // RUN: FileCheck %s --check-prefix=VPTRTYPE -// RUN: %clang --target=aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ // RUN: -fptrauth-calls -fptrauth-init-fini %s | \ // RUN: FileCheck %s --check-prefix=INITFINI From b0f9a1985846448d01af9bacdb6e3ddb23d4588f Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Mon, 6 May 2024 22:41:19 +0300 Subject: [PATCH 09/10] Address review comments --- clang/lib/Driver/ToolChains/Clang.cpp | 6 ----- clang/test/Driver/aarch64-ptrauth.c | 32 +++++++++------------------ 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index f86ed53b4ad6c..775dc249999e1 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1756,24 +1756,18 @@ void Clang::AddAArch64TargetArgs(const ArgList &Args, 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_init_fini, options::OPT_fno_ptrauth_init_fini); } diff --git a/clang/test/Driver/aarch64-ptrauth.c b/clang/test/Driver/aarch64-ptrauth.c index 9ae0347a8ccb1..fa0125f4b22a9 100644 --- a/clang/test/Driver/aarch64-ptrauth.c +++ b/clang/test/Driver/aarch64-ptrauth.c @@ -2,28 +2,16 @@ // NONE: "-cc1" // NONE-NOT: "-fptrauth- -// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-intrinsics -fptrauth-intrinsics %s 2>&1 | FileCheck %s --check-prefix=INTRIN -// INTRIN: "-cc1"{{.*}} "-fptrauth-intrinsics" - -// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-calls -fptrauth-calls %s 2>&1 | FileCheck %s --check-prefix=CALL -// CALL: "-cc1"{{.*}} "-fptrauth-calls" - -// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-returns -fptrauth-returns %s 2>&1 | FileCheck %s --check-prefix=RETURN -// RETURN: "-cc1"{{.*}} "-fptrauth-returns" - -// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-auth-traps -fptrauth-auth-traps %s 2>&1 | FileCheck %s --check-prefix=TRAP -// TRAP: "-cc1"{{.*}} "-fptrauth-auth-traps" - -// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-vtable-pointer-address-discrimination \ -// RUN: -fptrauth-vtable-pointer-address-discrimination %s 2>&1 | FileCheck %s --check-prefix=VPTRADDR -// VPTRADDR: "-cc1"{{.*}} "-fptrauth-vtable-pointer-address-discrimination" - -// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-vtable-pointer-type-discrimination \ -// RUN: -fptrauth-vtable-pointer-type-discrimination %s 2>&1 | FileCheck %s --check-prefix=VPTRTYPE -// VPTRTYPE: "-cc1"{{.*}} "-fptrauth-vtable-pointer-type-discrimination" - -// RUN: %clang -### -c --target=aarch64 -fno-ptrauth-init-fini -fptrauth-init-fini %s 2>&1 | FileCheck %s --check-prefix=INITFINI -// INITFINI: "-cc1"{{.*}} "-fptrauth-init-fini" +// RUN: %clang -### -c --target=aarch64 \ +// 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-init-fini -fptrauth-init-fini \ +// 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-init-fini" // RUN: not %clang -### -c --target=x86_64 -fptrauth-intrinsics -fptrauth-calls -fptrauth-returns -fptrauth-auth-traps \ // RUN: -fptrauth-vtable-pointer-address-discrimination -fptrauth-vtable-pointer-type-discrimination \ From 37a4d9d08fefd8c42c21b92ad2e3c1fa07fac126 Mon Sep 17 00:00:00 2001 From: Daniil Kovalev Date: Thu, 9 May 2024 11:26:01 +0300 Subject: [PATCH 10/10] Address review comments --- clang/lib/CodeGen/CodeGenModule.cpp | 3 ++- clang/test/CodeGen/aarch64-elf-pauthabi.c | 16 ++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index d57415352d0c5..489c08a4d4819 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1192,7 +1192,8 @@ void CodeGenModule::Release() { getModule().addModuleFlag(llvm::Module::Min, "sign-return-address-with-bkey", 1); - if (getTriple().isOSLinux() && getTriple().isOSBinFormatELF()) { + if (getTriple().isOSLinux()) { + assert(getTriple().isOSBinFormatELF()); using namespace llvm::ELF; uint64_t PAuthABIVersion = (LangOpts.PointerAuthIntrinsics diff --git a/clang/test/CodeGen/aarch64-elf-pauthabi.c b/clang/test/CodeGen/aarch64-elf-pauthabi.c index c579bfed893c8..aa83ee3e0d7b0 100644 --- a/clang/test/CodeGen/aarch64-elf-pauthabi.c +++ b/clang/test/CodeGen/aarch64-elf-pauthabi.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \ // RUN: -fptrauth-intrinsics \ // RUN: -fptrauth-calls \ // RUN: -fptrauth-returns \ @@ -8,27 +8,27 @@ // RUN: -fptrauth-init-fini %s | \ // RUN: FileCheck %s --check-prefix=ALL -// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \ // RUN: -fptrauth-intrinsics %s | FileCheck %s --check-prefix=INTRIN -// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \ // RUN: -fptrauth-calls %s | FileCheck %s --check-prefix=CALL -// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \ // RUN: -fptrauth-returns %s | FileCheck %s --check-prefix=RET -// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \ // RUN: -fptrauth-auth-traps %s | FileCheck %s --check-prefix=TRAP -// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \ // RUN: -fptrauth-calls -fptrauth-vtable-pointer-address-discrimination %s | \ // RUN: FileCheck %s --check-prefix=VPTRADDR -// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \ // RUN: -fptrauth-calls -fptrauth-vtable-pointer-type-discrimination %s | \ // RUN: FileCheck %s --check-prefix=VPTRTYPE -// RUN: %clang_cc1 -triple aarch64-linux -S -emit-llvm -o - \ +// RUN: %clang_cc1 -triple aarch64-linux -emit-llvm -o - \ // RUN: -fptrauth-calls -fptrauth-init-fini %s | \ // RUN: FileCheck %s --check-prefix=INITFINI