diff options
Diffstat (limited to 'clang/lib/Driver/ToolChains/Clang.cpp')
| -rw-r--r-- | clang/lib/Driver/ToolChains/Clang.cpp | 77 | 
1 files changed, 43 insertions, 34 deletions
| diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 79edc56..4e8f63e 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1414,17 +1414,18 @@ static void CollectARMPACBTIOptions(const ToolChain &TC, const ArgList &Args,      GuardedControlStack = PBP.GuardedControlStack;    } -  bool HasPtrauthReturns = llvm::any_of(CmdArgs, [](const char *Arg) { -    return StringRef(Arg) == "-fptrauth-returns"; -  }); +  Arg *PtrauthReturnsArg = Args.getLastArg(options::OPT_fptrauth_returns, +                                           options::OPT_fno_ptrauth_returns); +  bool HasPtrauthReturns = +      PtrauthReturnsArg && +      PtrauthReturnsArg->getOption().matches(options::OPT_fptrauth_returns);    // GCS is currently untested with ptrauth-returns, but enabling this could be    // allowed in future after testing with a suitable system. -  if (HasPtrauthReturns && -      (Scope != "none" || BranchProtectionPAuthLR || GuardedControlStack)) { +  if (Scope != "none" || BranchProtectionPAuthLR || GuardedControlStack) {      if (Triple.getEnvironment() == llvm::Triple::PAuthTest)        D.Diag(diag::err_drv_unsupported_opt_for_target)            << A->getAsString(Args) << Triple.getTriple(); -    else +    else if (HasPtrauthReturns)        D.Diag(diag::err_drv_incompatible_options)            << A->getAsString(Args) << "-fptrauth-returns";    } @@ -1670,34 +1671,42 @@ 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); +  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); | 
