Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 38 additions & 20 deletions clang/lib/Frontend/CompilerInvocation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3602,30 +3602,43 @@ static void GeneratePointerAuthArgs(const LangOptions &Opts,

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.PointerAuthIndirectGotos = Args.hasArg(OPT_fptrauth_indirect_gotos);
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.PointerAuthTypeInfoVTPtrDiscrimination =
Args.hasArg(OPT_fptrauth_type_info_vtable_pointer_discrimination);
Opts.PointerAuthFunctionTypeDiscrimination =
Args.hasArg(OPT_fptrauth_function_pointer_type_discrimination);
Opts.PointerAuthInitFini = Args.hasArg(OPT_fptrauth_init_fini);
const Arg *PedanticErrors = Args.getLastArgNoClaim(OPT_pedantic_errors);
auto GetAndCheckPointerAuthArg = [&](driver::options::ID Option) {
Arg *OptionArg = Args.getLastArg(Option);
if (OptionArg && PedanticErrors) {
Diags.Report(diag::err_drv_incompatible_options)
<< OptionArg->getSpelling() << PedanticErrors->getSpelling();
}
return OptionArg != nullptr;
};
Opts.PointerAuthIntrinsics =
GetAndCheckPointerAuthArg(OPT_fptrauth_intrinsics);
Opts.PointerAuthCalls = GetAndCheckPointerAuthArg(OPT_fptrauth_calls);
Opts.PointerAuthReturns = GetAndCheckPointerAuthArg(OPT_fptrauth_returns);
Opts.PointerAuthIndirectGotos =
GetAndCheckPointerAuthArg(OPT_fptrauth_indirect_gotos);
Opts.PointerAuthAuthTraps =
GetAndCheckPointerAuthArg(OPT_fptrauth_auth_traps);
Opts.PointerAuthVTPtrAddressDiscrimination = GetAndCheckPointerAuthArg(
OPT_fptrauth_vtable_pointer_address_discrimination);
Opts.PointerAuthVTPtrTypeDiscrimination = GetAndCheckPointerAuthArg(
OPT_fptrauth_vtable_pointer_type_discrimination);
Opts.PointerAuthTypeInfoVTPtrDiscrimination = GetAndCheckPointerAuthArg(
OPT_fptrauth_type_info_vtable_pointer_discrimination);
Opts.PointerAuthFunctionTypeDiscrimination = GetAndCheckPointerAuthArg(
OPT_fptrauth_function_pointer_type_discrimination);
Opts.PointerAuthInitFini = GetAndCheckPointerAuthArg(OPT_fptrauth_init_fini);
Opts.PointerAuthInitFiniAddressDiscrimination =
Args.hasArg(OPT_fptrauth_init_fini_address_discrimination);
Opts.PointerAuthELFGOT = Args.hasArg(OPT_fptrauth_elf_got);
GetAndCheckPointerAuthArg(OPT_fptrauth_init_fini_address_discrimination);
Opts.PointerAuthELFGOT = GetAndCheckPointerAuthArg(OPT_fptrauth_elf_got);
Opts.AArch64JumpTableHardening =
Args.hasArg(OPT_faarch64_jump_table_hardening);
GetAndCheckPointerAuthArg(OPT_faarch64_jump_table_hardening);

Opts.PointerAuthObjcIsa = Args.hasArg(OPT_fptrauth_objc_isa);
Opts.PointerAuthObjcClassROPointers = Args.hasArg(OPT_fptrauth_objc_class_ro);
Opts.PointerAuthObjcIsa = GetAndCheckPointerAuthArg(OPT_fptrauth_objc_isa);
Opts.PointerAuthObjcClassROPointers =
GetAndCheckPointerAuthArg(OPT_fptrauth_objc_class_ro);
Opts.PointerAuthObjcInterfaceSel =
Args.hasArg(OPT_fptrauth_objc_interface_sel);
GetAndCheckPointerAuthArg(OPT_fptrauth_objc_interface_sel);

if (Opts.PointerAuthObjcInterfaceSel)
Opts.PointerAuthObjcInterfaceSelKey =
Expand Down Expand Up @@ -5021,6 +5034,11 @@ bool CompilerInvocation::CreateFromArgsImpl(
InputKind DashX = Res.getFrontendOpts().DashX;
ParseTargetArgs(Res.getTargetOpts(), Args, Diags);
llvm::Triple T(Res.getTargetOpts().Triple);
if (const Arg *PedanticErrors = Args.getLastArgNoClaim(OPT_pedantic_errors);
PedanticErrors && T.isArm64e()) {
Diags.Report(diag::err_drv_unsupported_opt_for_target)
<< PedanticErrors->getSpelling() << T.str();
}
ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), Args, Diags,
Res.getFileSystemOpts().WorkingDir);
if (Res.getFrontendOpts().GenReducedBMI ||
Expand Down
33 changes: 33 additions & 0 deletions clang/test/Driver/aarch64-ptrauth-pedantic-errors.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// REQUIRES: aarch64-registered-target

// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-intrinsics %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-calls %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-returns %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-indirect-gotos %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-auth-traps %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-vtable-pointer-address-discrimination %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-vtable-pointer-type-discrimination %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-function-pointer-type-discrimination %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-init-fini %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-init-fini-address-discrimination %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -faarch64-jump-table-hardening %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-objc-isa %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-objc-class-ro %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=aarch64 -fptrauth-objc-interface-sel %s -c 2>&1 | FileCheck %s
// RUN: not %clang -pedantic-errors --target=arm64e %s -c 2>&1 | FileCheck %s --check-prefix ARM64E_TRIPLE
// RUN: not %clang -pedantic-errors --target=arm64e-apple-macosx10.0 %s -c 2>&1 | FileCheck %s --check-prefix ARM64E_MACOS_TRIPLE
// RUN: not %clang -pedantic-errors -arch arm64e %s -c 2>&1 | FileCheck %s --check-prefix ARM64E_ARCH

// FIXME: Cannot work out what the correct invocation to permit -fptrauth-elf-got is
// -- not %clang -pedantic-errors --target=aarch64 -fptrauth-elf-got %s -c 2>&1 | FileCheck %s

int i;

// CHECK: error: the combination of '{{.*}}' and '-pedantic-errors' is incompatible
// ARM64E_TRIPLE: error: unsupported option '-pedantic-errors' for target 'arm64e'
// ARM64E_MACOS_TRIPLE: error: unsupported option '-pedantic-errors' for target 'arm64e-apple-macosx10.0.0'

// We have a trailing 'arm64e with no closing ' as the full triple is inferred from the host
// which we don't care about, and don't want to specify as we're wanting to ensure that *just*
// using '-arch arm64e' is sufficient
// ARM64E_ARCH: error: unsupported option '-pedantic-errors' for target 'arm64e
Loading