@@ -484,28 +484,108 @@ std::string Linux::ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
484484// options represent the default signing schema.
485485static void handlePAuthABI (const Driver &D, const ArgList &DriverArgs,
486486 ArgStringList &CC1Args) {
487- CC1Args.push_back (" -fptrauth-intrinsics" );
488- CC1Args.push_back (" -fptrauth-calls" );
489- CC1Args.push_back (" -fptrauth-returns" );
490- CC1Args.push_back (" -fptrauth-auth-traps" );
491- CC1Args.push_back (" -fptrauth-vtable-pointer-address-discrimination" );
492- CC1Args.push_back (" -fptrauth-vtable-pointer-type-discrimination" );
493- CC1Args.push_back (" -fptrauth-type-info-vtable-pointer-discrimination" );
494- CC1Args.push_back (" -fptrauth-indirect-gotos" );
495- CC1Args.push_back (" -fptrauth-init-fini" );
496- CC1Args.push_back (" -fptrauth-init-fini-address-discrimination" );
487+ if (!DriverArgs.hasArg (options::OPT_fptrauth_intrinsics,
488+ options::OPT_fno_ptrauth_intrinsics))
489+ CC1Args.push_back (" -fptrauth-intrinsics" );
490+
491+ if (!DriverArgs.hasArg (options::OPT_fptrauth_calls,
492+ options::OPT_fno_ptrauth_calls))
493+ CC1Args.push_back (" -fptrauth-calls" );
494+
495+ if (!DriverArgs.hasArg (options::OPT_fptrauth_returns,
496+ options::OPT_fno_ptrauth_returns))
497+ CC1Args.push_back (" -fptrauth-returns" );
498+
499+ if (!DriverArgs.hasArg (options::OPT_fptrauth_auth_traps,
500+ options::OPT_fno_ptrauth_auth_traps))
501+ CC1Args.push_back (" -fptrauth-auth-traps" );
502+
503+ if (!DriverArgs.hasArg (
504+ options::OPT_fptrauth_vtable_pointer_address_discrimination,
505+ options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
506+ CC1Args.push_back (" -fptrauth-vtable-pointer-address-discrimination" );
507+
508+ if (!DriverArgs.hasArg (
509+ options::OPT_fptrauth_vtable_pointer_type_discrimination,
510+ options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
511+ CC1Args.push_back (" -fptrauth-vtable-pointer-type-discrimination" );
512+
513+ if (!DriverArgs.hasArg (
514+ options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
515+ options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination))
516+ CC1Args.push_back (" -fptrauth-type-info-vtable-pointer-discrimination" );
517+
518+ if (!DriverArgs.hasArg (options::OPT_fptrauth_indirect_gotos,
519+ options::OPT_fno_ptrauth_indirect_gotos))
520+ CC1Args.push_back (" -fptrauth-indirect-gotos" );
521+
522+ if (!DriverArgs.hasArg (options::OPT_fptrauth_init_fini,
523+ options::OPT_fno_ptrauth_init_fini))
524+ CC1Args.push_back (" -fptrauth-init-fini" );
525+
526+ if (!DriverArgs.hasArg (
527+ options::OPT_fptrauth_init_fini_address_discrimination,
528+ options::OPT_fno_ptrauth_init_fini_address_discrimination))
529+ CC1Args.push_back (" -fptrauth-init-fini-address-discrimination" );
497530
498531 if (!DriverArgs.hasArg (options::OPT_faarch64_jump_table_hardening,
499532 options::OPT_fno_aarch64_jump_table_hardening))
500533 CC1Args.push_back (" -faarch64-jump-table-hardening" );
501534}
502535
536+ static void addPointerAuthFlags (const llvm::opt::ArgList &DriverArgs,
537+ llvm::opt::ArgStringList &CC1Args) {
538+ DriverArgs.addOptInFlag (CC1Args, options::OPT_fptrauth_intrinsics,
539+ options::OPT_fno_ptrauth_intrinsics);
540+
541+ DriverArgs.addOptInFlag (CC1Args, options::OPT_fptrauth_calls,
542+ options::OPT_fno_ptrauth_calls);
543+
544+ DriverArgs.addOptInFlag (CC1Args, options::OPT_fptrauth_returns,
545+ options::OPT_fno_ptrauth_returns);
546+
547+ DriverArgs.addOptInFlag (CC1Args, options::OPT_fptrauth_auth_traps,
548+ options::OPT_fno_ptrauth_auth_traps);
549+
550+ DriverArgs.addOptInFlag (
551+ CC1Args, options::OPT_fptrauth_vtable_pointer_address_discrimination,
552+ options::OPT_fno_ptrauth_vtable_pointer_address_discrimination);
553+
554+ DriverArgs.addOptInFlag (
555+ CC1Args, options::OPT_fptrauth_vtable_pointer_type_discrimination,
556+ options::OPT_fno_ptrauth_vtable_pointer_type_discrimination);
557+
558+ DriverArgs.addOptInFlag (
559+ CC1Args, options::OPT_fptrauth_type_info_vtable_pointer_discrimination,
560+ options::OPT_fno_ptrauth_type_info_vtable_pointer_discrimination);
561+
562+ DriverArgs.addOptInFlag (
563+ CC1Args, options::OPT_fptrauth_function_pointer_type_discrimination,
564+ options::OPT_fno_ptrauth_function_pointer_type_discrimination);
565+
566+ DriverArgs.addOptInFlag (CC1Args, options::OPT_fptrauth_indirect_gotos,
567+ options::OPT_fno_ptrauth_indirect_gotos);
568+
569+ DriverArgs.addOptInFlag (CC1Args, options::OPT_fptrauth_init_fini,
570+ options::OPT_fno_ptrauth_init_fini);
571+
572+ DriverArgs.addOptInFlag (
573+ CC1Args, options::OPT_fptrauth_init_fini_address_discrimination,
574+ options::OPT_fno_ptrauth_init_fini_address_discrimination);
575+
576+ DriverArgs.addOptInFlag (CC1Args, options::OPT_fptrauth_elf_got,
577+ options::OPT_fno_ptrauth_elf_got);
578+ }
579+
503580void Linux::addClangTargetOptions (const llvm::opt::ArgList &DriverArgs,
504581 llvm::opt::ArgStringList &CC1Args,
505582 Action::OffloadKind DeviceOffloadKind) const {
506583 llvm::Triple Triple (ComputeEffectiveClangTriple (DriverArgs));
507- if (Triple.isAArch64 () && Triple.getEnvironment () == llvm::Triple::PAuthTest)
584+ if (Triple.isAArch64 () &&
585+ Triple.getEnvironment () == llvm::Triple::PAuthTest) {
586+ addPointerAuthFlags (DriverArgs, CC1Args);
508587 handlePAuthABI (getDriver (), DriverArgs, CC1Args);
588+ }
509589 Generic_ELF::addClangTargetOptions (DriverArgs, CC1Args, DeviceOffloadKind);
510590}
511591
0 commit comments