Skip to content

Commit eae44f7

Browse files
committed
For pauthtest ABI, allow ptrauth driver flags
1 parent 64489c9 commit eae44f7

File tree

1 file changed

+91
-11
lines changed

1 file changed

+91
-11
lines changed

clang/lib/Driver/ToolChains/Linux.cpp

Lines changed: 91 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -484,28 +484,108 @@ std::string Linux::ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
484484
// options represent the default signing schema.
485485
static 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+
503580
void 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

Comments
 (0)