437 const llvm::opt::ArgList &Args,
438 bool DiagnoseErrors,
bool DiagnoseBoundArchErrors,
462 : ToolChainSupported;
464 CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso,
465 options::OPT_fno_sanitize_cfi_cross_dso,
false);
472 const llvm::Triple &Triple = TC.
getTriple();
475 Args.hasFlag(options::OPT_fsanitize_minimal_runtime,
476 options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime);
477 HandlerPreserveAllRegs =
478 Args.hasFlag(options::OPT_fsanitize_handler_preserve_all_regs,
479 options::OPT_fno_sanitize_handler_preserve_all_regs,
480 HandlerPreserveAllRegs) &&
481 MinimalRuntime && (Triple.isAArch64() || Triple.isX86_64());
482 TrapLoop = Args.hasFlag(options::OPT_fsanitize_trap_loop,
483 options::OPT_fno_sanitize_trap_loop,
false);
486 Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
487 bool RemoveObjectSizeAtO0 =
488 !OptLevel || OptLevel->getOption().matches(options::OPT_O0);
490 for (
const llvm::opt::Arg *Arg : llvm::reverse(Args)) {
491 if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) {
495 if (RemoveObjectSizeAtO0) {
496 AllRemove |= SanitizerKind::ObjectSize;
500 if ((Add & SanitizerKind::ObjectSize) && DiagnoseErrors)
501 D.
Diag(diag::warn_drv_object_size_disabled_O0)
502 << Arg->getAsString(Args);
513 Add & InvalidTrappingKinds & ~DiagnosedKinds) {
514 if (DiagnoseErrors) {
516 D.
Diag(diag::err_drv_argument_not_allowed_with)
517 << Desc <<
"-fsanitize-trap=undefined";
519 DiagnosedKinds |= KindsToDiagnose;
521 Add &= ~InvalidTrappingKinds;
523 if (MinimalRuntime) {
526 if (DiagnoseErrors) {
528 D.
Diag(diag::err_drv_argument_not_allowed_with)
529 << Desc <<
"-fsanitize-minimal-runtime";
531 DiagnosedKinds |= KindsToDiagnose;
542 if (DiagnoseErrors) {
544 llvm::opt::Arg *A = Args.getLastArgNoClaim(
545 options::OPT_mexecute_only, options::OPT_mno_execute_only);
546 if (A && A->getOption().matches(options::OPT_mexecute_only))
547 D.
Diag(diag::err_drv_argument_not_allowed_with)
548 << Desc << A->getAsString(Args);
550 D.
Diag(diag::err_drv_unsupported_opt_for_target)
551 << Desc << Triple.str();
553 DiagnosedKinds |= KindsToDiagnose;
568 if (CfiCrossDso && (Add & SanitizerKind::CFIMFCall & ~DiagnosedKinds)) {
570 D.
Diag(diag::err_drv_argument_not_allowed_with)
571 <<
"-fsanitize=cfi-mfcall"
572 <<
"-fsanitize-cfi-cross-dso";
574 DiagnosedKinds |= SanitizerKind::CFIMFCall;
581 Add & ToolChainSupported & ~BoundArchSupported & ~DiagnosedKinds;
582 ArchSpecificUnsupported && DiagnoseBoundArchErrors) {
588 bool IsExplicitDevice =
589 Arg->getBaseArg().getOption().matches(options::OPT_Xarch_device);
593 StringRef Requirement =
595 if (!Requirement.empty()) {
603 err_drv_unsupported_option_for_offload_arch_req_feature
605 warn_drv_unsupported_option_for_offload_arch_req_feature)
606 << Arg->getAsString(Args) << BA.
ArchName << Requirement;
610 UnsupportedSet.
Mask = ArchSpecificUnsupported;
611 D.
Diag(diag::warn_drv_unsupported_option_part_for_target)
612 <<
toString(UnsupportedSet) << Arg->getAsString(Args)
616 DiagnosedKinds |= ArchSpecificUnsupported;
621 Add & ~ToolChainSupported & ~DiagnosedKinds;
622 DiagnoseErrors && KindsToDiagnose) {
623 bool IsExplicitDevice =
624 Arg->getBaseArg().getOption().matches(options::OPT_Xarch_device);
633 KindSet.
Mask = KindsToDiagnose;
634 D.
Diag(IsExplicitDevice
635 ? diag::err_drv_unsupported_option_part_for_target
636 : diag::warn_drv_unsupported_option_part_for_target)
637 <<
toString(KindSet) << Arg->getAsString(Args)
641 D.
Diag(diag::err_drv_unsupported_opt_for_target)
646 DiagnosedKinds |= KindsToDiagnose;
649 Add &= BoundArchSupported;
655 if (
const llvm::opt::Arg *NoRTTIArg = TC.
getRTTIArg()) {
656 assert(NoRTTIArg->getOption().matches(options::OPT_fno_rtti) &&
657 "RTTI disabled without -fno-rtti option?");
661 D.
Diag(diag::err_drv_argument_not_allowed_with)
662 <<
"-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
667 D.
Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
671 AllRemove |= SanitizerKind::Vptr;
679 Add &= ~InvalidTrappingKinds;
680 if (MinimalRuntime) {
691 if (Add & SanitizerKind::UndefinedGroup) {
692 bool S = Args.hasFlagNoClaim(options::OPT_fno_strict_overflow,
693 options::OPT_fstrict_overflow,
false);
694 if (Args.hasFlagNoClaim(options::OPT_fwrapv, options::OPT_fno_wrapv, S))
696 if (Args.hasFlagNoClaim(options::OPT_fwrapv_pointer,
697 options::OPT_fno_wrapv_pointer, S))
700 Add &= BoundArchSupported;
702 if (Add & SanitizerKind::Fuzzer)
703 Add |= SanitizerKind::FuzzerNoLink;
706 if (Add & SanitizerKind::FuzzerNoLink) {
715 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_EQ)) {
719 }
else if (Arg->getOption().matches(
720 options::OPT_fsanitize_ignore_for_ubsan_feature_EQ)) {
722 IgnoreForUbsanFeature |=
727 std::pair<SanitizerMask, SanitizerMask> IncompatibleGroups[] = {
728 std::make_pair(SanitizerKind::Address,
729 SanitizerKind::Thread | SanitizerKind::Memory),
730 std::make_pair(SanitizerKind::Type,
731 SanitizerKind::Address | SanitizerKind::KernelAddress |
732 SanitizerKind::Memory | SanitizerKind::Leak |
733 SanitizerKind::Thread),
734 std::make_pair(SanitizerKind::Thread,
735 SanitizerKind::Memory | SanitizerKind::Concurrency),
737 SanitizerKind::Concurrency,
738 SanitizerKind::Thread | SanitizerKind::Address |
739 SanitizerKind::Memory | SanitizerKind::Leak |
740 SanitizerKind::Undefined | SanitizerKind::Integer |
741 SanitizerKind::ImplicitConversion | SanitizerKind::Nullability |
742 SanitizerKind::LocalBounds | SanitizerKind::FloatDivideByZero),
743 std::make_pair(SanitizerKind::Leak,
744 SanitizerKind::Thread | SanitizerKind::Memory),
745 std::make_pair(SanitizerKind::KernelAddress,
746 SanitizerKind::Address | SanitizerKind::Leak |
747 SanitizerKind::Thread | SanitizerKind::Memory),
748 std::make_pair(SanitizerKind::HWAddress,
749 SanitizerKind::Address | SanitizerKind::Thread |
750 SanitizerKind::Memory | SanitizerKind::KernelAddress),
751 std::make_pair(SanitizerKind::Scudo,
752 SanitizerKind::Address | SanitizerKind::HWAddress |
753 SanitizerKind::Leak | SanitizerKind::Thread |
754 SanitizerKind::Memory | SanitizerKind::KernelAddress),
755 std::make_pair(SanitizerKind::SafeStack,
757 : SanitizerKind::Leak) |
758 SanitizerKind::Address | SanitizerKind::HWAddress |
759 SanitizerKind::Thread | SanitizerKind::Memory |
760 SanitizerKind::KernelAddress),
761 std::make_pair(SanitizerKind::KernelHWAddress,
762 SanitizerKind::Address | SanitizerKind::HWAddress |
763 SanitizerKind::Leak | SanitizerKind::Thread |
764 SanitizerKind::Memory | SanitizerKind::KernelAddress |
765 SanitizerKind::SafeStack),
766 std::make_pair(SanitizerKind::KernelMemory,
767 SanitizerKind::Address | SanitizerKind::HWAddress |
768 SanitizerKind::Leak | SanitizerKind::Thread |
769 SanitizerKind::Memory | SanitizerKind::KernelAddress |
770 SanitizerKind::Scudo | SanitizerKind::SafeStack),
771 std::make_pair(SanitizerKind::MemTag, SanitizerKind::Address |
772 SanitizerKind::KernelAddress |
773 SanitizerKind::HWAddress |
774 SanitizerKind::KernelHWAddress),
775 std::make_pair(SanitizerKind::KCFI, SanitizerKind::Function),
776 std::make_pair(SanitizerKind::Realtime,
777 SanitizerKind::Address | SanitizerKind::Thread |
778 SanitizerKind::Undefined | SanitizerKind::Memory |
779 SanitizerKind::Type),
780 std::make_pair(SanitizerKind::AllocToken,
781 SanitizerKind::Address | SanitizerKind::HWAddress |
782 SanitizerKind::KernelAddress |
783 SanitizerKind::KernelHWAddress |
784 SanitizerKind::Memory)};
791 for (
auto G : IncompatibleGroups) {
793 if ((
Default & Group) && (Kinds & G.second))
807 D.
Diag(diag::err_drv_argument_only_allowed_with)
811 if ((Kinds & SanitizerKind::ShadowCallStack) && TC.
getTriple().isAArch64() &&
812 !llvm::AArch64::isX18ReservedByDefault(TC.
getTriple()) &&
813 !Args.hasArg(options::OPT_ffixed_x18) && DiagnoseErrors) {
814 D.
Diag(diag::err_drv_argument_only_allowed_with)
819 if ((Kinds & SanitizerKind::ShadowCallStack) &&
820 TC.
getTriple().getArch() == llvm::Triple::hexagon && DiagnoseErrors) {
826 if (Arg *A = Args.getLastArg(options::OPT_mhexagon_scs_reg)) {
827 StringRef Val(A->getValue());
831 if (Val.consume_front(
"r") && !Val.getAsInteger(10, Parsed) &&
832 Parsed >= 16 && Parsed <= 27)
836 D.
Diag(diag::err_drv_argument_only_allowed_with)
838 Kinds & SanitizerKind::ShadowCallStack)
839 << (
"-ffixed-r" + Twine(RegNo)).str();
846 if (~BoundArchSupported & SanitizerKind::Vptr) {
852 if (KindsToDiagnose) {
854 S.
Mask = KindsToDiagnose;
856 D.
Diag(diag::err_drv_unsupported_opt_for_target)
858 Kinds &= ~KindsToDiagnose;
863 for (
auto G : IncompatibleGroups) {
868 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
884 options::OPT_fno_sanitize_recover_EQ);
885 RecoverableKinds &= Kinds;
887 TrappingKinds &= Kinds;
888 RecoverableKinds &= ~TrappingKinds;
893 options::OPT_fsanitize_merge_handlers_EQ,
894 options::OPT_fno_sanitize_merge_handlers_EQ);
903 {}, options::OPT_fsanitize_annotate_debug_info_EQ,
904 options::OPT_fno_sanitize_annotate_debug_info_EQ);
905 AnnotateDebugInfoKinds &= Kinds;
910 if (!Args.hasArgNoClaim(options::OPT_fno_sanitize_ignorelist))
916 D, Args, UserIgnorelistFiles, options::OPT_fsanitize_ignorelist_EQ,
917 options::OPT_fno_sanitize_ignorelist,
918 clang::diag::err_drv_malformed_sanitizer_ignorelist, DiagnoseErrors);
921 if (Arg *A = Args.getLastArg(
922 options::OPT_fsanitize_coverage_stack_depth_callback_min_EQ)) {
923 StringRef S = A->getValue();
924 if (S.getAsInteger(0, CoverageStackDepthCallbackMin) ||
925 CoverageStackDepthCallbackMin < 0) {
927 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
932 if (AllAddedKinds & SanitizerKind::Memory) {
934 Args.getLastArg(options::OPT_fsanitize_memory_track_origins_EQ,
935 options::OPT_fno_sanitize_memory_track_origins)) {
936 if (!A->getOption().matches(
937 options::OPT_fno_sanitize_memory_track_origins)) {
938 StringRef S = A->getValue();
939 if (S.getAsInteger(0, MsanTrackOrigins) || MsanTrackOrigins < 0 ||
940 MsanTrackOrigins > 2) {
942 D.
Diag(clang::diag::err_drv_invalid_value)
943 << A->getAsString(Args) << S;
947 MsanUseAfterDtor = Args.hasFlag(
948 options::OPT_fsanitize_memory_use_after_dtor,
949 options::OPT_fno_sanitize_memory_use_after_dtor, MsanUseAfterDtor);
950 MsanParamRetval = Args.hasFlag(
951 options::OPT_fsanitize_memory_param_retval,
952 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
953 }
else if (AllAddedKinds & SanitizerKind::KernelMemory) {
954 MsanUseAfterDtor =
false;
955 MsanParamRetval = Args.hasFlag(
956 options::OPT_fsanitize_memory_param_retval,
957 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
959 MsanUseAfterDtor =
false;
960 MsanParamRetval =
false;
963 if (AllAddedKinds & SanitizerKind::MemTag) {
965 Args.getLastArgValue(options::OPT_fsanitize_memtag_mode_EQ,
"sync");
966 if (S ==
"async" || S ==
"sync") {
967 MemtagMode = S.str();
969 D.
Diag(clang::diag::err_drv_invalid_value_with_suggestion)
970 <<
"-fsanitize-memtag-mode=" << S <<
"{async, sync}";
975 if (AllAddedKinds & SanitizerKind::Thread) {
976 TsanMemoryAccess = Args.hasFlag(
977 options::OPT_fsanitize_thread_memory_access,
978 options::OPT_fno_sanitize_thread_memory_access, TsanMemoryAccess);
979 TsanFuncEntryExit = Args.hasFlag(
980 options::OPT_fsanitize_thread_func_entry_exit,
981 options::OPT_fno_sanitize_thread_func_entry_exit, TsanFuncEntryExit);
983 Args.hasFlag(options::OPT_fsanitize_thread_atomics,
984 options::OPT_fno_sanitize_thread_atomics, TsanAtomics);
987 if (AllAddedKinds & SanitizerKind::CFI) {
990 NeedPIE |= CfiCrossDso;
991 CfiICallGeneralizePointers =
992 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
994 CfiICallNormalizeIntegers =
995 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
997 if (CfiCrossDso && CfiICallGeneralizePointers && DiagnoseErrors)
998 D.
Diag(diag::err_drv_argument_not_allowed_with)
999 <<
"-fsanitize-cfi-cross-dso"
1000 <<
"-fsanitize-cfi-icall-generalize-pointers";
1002 CfiCanonicalJumpTables =
1003 Args.hasFlag(options::OPT_fsanitize_cfi_canonical_jump_tables,
1004 options::OPT_fno_sanitize_cfi_canonical_jump_tables,
true);
1007 if (AllAddedKinds & SanitizerKind::KCFI) {
1008 CfiICallGeneralizePointers =
1009 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
1010 CfiICallNormalizeIntegers =
1011 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
1013 KcfiArity = Args.hasArg(options::OPT_fsanitize_kcfi_arity);
1015 if (
const Arg *A = Args.getLastArg(options::OPT_fsanitize_kcfi_hash_EQ))
1016 KcfiHash = A->getValue();
1018 if (AllAddedKinds & SanitizerKind::CFI && DiagnoseErrors)
1019 D.
Diag(diag::err_drv_argument_not_allowed_with)
1020 <<
"-fsanitize=kcfi"
1024 Stats = Args.hasFlag(options::OPT_fsanitize_stats,
1025 options::OPT_fno_sanitize_stats,
false);
1027 if (MinimalRuntime) {
1030 if (IncompatibleMask && DiagnoseErrors)
1031 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1032 <<
"-fsanitize-minimal-runtime"
1036 for (
const auto *Arg : Args.filtered(
1037 options::OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
1039 OverflowPatternExclusions |=
1045 for (
const auto *Arg : Args) {
1046 if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) {
1047 int LegacySanitizeCoverage;
1048 if (Arg->getNumValues() == 1 &&
1049 !StringRef(Arg->getValue(0))
1050 .getAsInteger(0, LegacySanitizeCoverage)) {
1051 CoverageFeatures = 0;
1053 if (LegacySanitizeCoverage != 0 && DiagnoseErrors) {
1054 D.
Diag(diag::warn_drv_deprecated_arg)
1055 << Arg->getAsString(Args) <<
true
1056 <<
"-fsanitize-coverage=trace-pc-guard";
1067 CoverageFeatures = 0;
1069 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_coverage)) {
1075 if (DiagnoseErrors) {
1077 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1078 <<
"-fsanitize-coverage=func"
1079 <<
"-fsanitize-coverage=bb";
1081 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1082 <<
"-fsanitize-coverage=func"
1083 <<
"-fsanitize-coverage=edge";
1085 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1086 <<
"-fsanitize-coverage=bb"
1087 <<
"-fsanitize-coverage=edge";
1091 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1092 <<
"-fsanitize-coverage=trace-bb" <<
true
1093 <<
"-fsanitize-coverage=trace-pc-guard";
1095 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1096 <<
"-fsanitize-coverage=8bit-counters" <<
true
1097 <<
"-fsanitize-coverage=trace-pc-guard";
1105 if ((CoverageFeatures & InsertionPointTypes) &&
1106 !(CoverageFeatures & InstrumentationTypes) && DiagnoseErrors) {
1107 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1108 <<
"-fsanitize-coverage=[func|bb|edge]" <<
true
1109 <<
"-fsanitize-coverage=[func|bb|edge],[trace-pc-guard|trace-pc],["
1114 if (!(CoverageFeatures & InsertionPointTypes)) {
1128 if (CoverageFeatures) {
1130 D, Args, CoverageAllowlistFiles,
1131 options::OPT_fsanitize_coverage_allowlist, OptSpecifier(),
1132 clang::diag::err_drv_malformed_sanitizer_coverage_allowlist,
1135 D, Args, CoverageIgnorelistFiles,
1136 options::OPT_fsanitize_coverage_ignorelist, OptSpecifier(),
1137 clang::diag::err_drv_malformed_sanitizer_coverage_ignorelist,
1142 for (
const auto *Arg :
1143 Args.filtered(options::OPT_fexperimental_sanitize_metadata_EQ,
1144 options::OPT_fno_experimental_sanitize_metadata_EQ)) {
1145 if (Arg->getOption().matches(
1146 options::OPT_fexperimental_sanitize_metadata_EQ)) {
1148 BinaryMetadataFeatures |=
1152 BinaryMetadataFeatures &=
1158 if (BinaryMetadataFeatures) {
1160 D, Args, BinaryMetadataIgnorelistFiles,
1161 options::OPT_fexperimental_sanitize_metadata_ignorelist_EQ,
1163 clang::diag::err_drv_malformed_sanitizer_metadata_ignorelist,
1167 SharedRuntime = Args.hasFlag(
1168 options::OPT_shared_libsan, options::OPT_static_libsan,
1171 if (!SharedRuntime && TC.
getTriple().isOSWindows()) {
1173 Args.getLastArg(options::OPT_shared_libsan, options::OPT_static_libsan);
1174 D.
Diag(clang::diag::err_drv_unsupported_opt_for_target)
1175 << A->getSpelling() << TC.
getTriple().str();
1178 ImplicitCfiRuntime = TC.
getTriple().isAndroid();
1180 if (AllAddedKinds & SanitizerKind::Address) {
1181 NeedPIE |= TC.
getTriple().isOSFuchsia();
1183 Args.getLastArg(options::OPT_fsanitize_address_field_padding)) {
1184 StringRef S = A->getValue();
1186 if ((S.getAsInteger(0, AsanFieldPadding) || AsanFieldPadding < 0 ||
1187 AsanFieldPadding > 2) &&
1189 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1193 if (Arg *WindowsDebugRTArg =
1194 Args.getLastArg(options::OPT__SLASH_MTd, options::OPT__SLASH_MT,
1195 options::OPT__SLASH_MDd, options::OPT__SLASH_MD,
1196 options::OPT__SLASH_LDd, options::OPT__SLASH_LD)) {
1197 switch (WindowsDebugRTArg->getOption().getID()) {
1198 case options::OPT__SLASH_MTd:
1199 case options::OPT__SLASH_MDd:
1200 case options::OPT__SLASH_LDd:
1201 if (DiagnoseErrors) {
1202 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1203 << WindowsDebugRTArg->getAsString(Args)
1205 D.
Diag(clang::diag::note_drv_address_sanitizer_debug_runtime);
1210 StableABI = Args.hasFlag(options::OPT_fsanitize_stable_abi,
1211 options::OPT_fno_sanitize_stable_abi,
false);
1213 AsanPoisonCustomArrayCookie = Args.hasFlag(
1214 options::OPT_fsanitize_address_poison_custom_array_cookie,
1215 options::OPT_fno_sanitize_address_poison_custom_array_cookie,
1216 AsanPoisonCustomArrayCookie);
1218 AsanOutlineInstrumentation =
1219 Args.hasFlag(options::OPT_fsanitize_address_outline_instrumentation,
1220 options::OPT_fno_sanitize_address_outline_instrumentation,
1221 AsanOutlineInstrumentation);
1223 AsanGlobalsDeadStripping = Args.hasFlag(
1224 options::OPT_fsanitize_address_globals_dead_stripping,
1225 options::OPT_fno_sanitize_address_globals_dead_stripping,
true);
1231 AsanUseOdrIndicator =
1232 Args.hasFlag(options::OPT_fsanitize_address_use_odr_indicator,
1233 options::OPT_fno_sanitize_address_use_odr_indicator,
1236 if (AllAddedKinds & SanitizerKind::PointerCompare & ~AllRemove) {
1237 AsanInvalidPointerCmp =
true;
1240 if (AllAddedKinds & SanitizerKind::PointerSubtract & ~AllRemove) {
1241 AsanInvalidPointerSub =
true;
1245 (Args.hasArg(options::OPT_mkernel) ||
1246 Args.hasArg(options::OPT_fapple_kext))) {
1247 AsanDtorKind = llvm::AsanDtorKind::None;
1250 if (
const auto *Arg =
1251 Args.getLastArg(options::OPT_sanitize_address_destructor_EQ)) {
1253 if (parsedAsanDtorKind == llvm::AsanDtorKind::Invalid && DiagnoseErrors) {
1254 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1255 << Arg->getSpelling() << Arg->getValue();
1257 AsanDtorKind = parsedAsanDtorKind;
1260 if (
const auto *Arg = Args.getLastArg(
1261 options::OPT_sanitize_address_use_after_return_EQ)) {
1262 auto parsedAsanUseAfterReturn =
1264 if (parsedAsanUseAfterReturn ==
1265 llvm::AsanDetectStackUseAfterReturnMode::Invalid &&
1267 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1268 << Arg->getSpelling() << Arg->getValue();
1270 AsanUseAfterReturn = parsedAsanUseAfterReturn;
1276 SanitizerKind::PointerCompare | SanitizerKind::PointerSubtract;
1277 if ((AllAddedKinds & DetectInvalidPointerPairs & ~AllRemove) &&
1279 TC.
getDriver().
Diag(clang::diag::err_drv_argument_only_allowed_with)
1281 SanitizerKind::PointerCompare |
1282 SanitizerKind::PointerSubtract)
1283 <<
"-fsanitize=address";
1287 if (AllAddedKinds & (SanitizerKind::Address | SanitizerKind::KernelAddress)) {
1288 AsanUseAfterScope = Args.hasFlag(
1289 options::OPT_fsanitize_address_use_after_scope,
1290 options::OPT_fno_sanitize_address_use_after_scope, AsanUseAfterScope);
1292 AsanUseAfterScope =
false;
1295 if (AllAddedKinds & SanitizerKind::HWAddress) {
1296 if (Arg *HwasanAbiArg =
1297 Args.getLastArg(options::OPT_fsanitize_hwaddress_abi_EQ)) {
1298 HwasanAbi = HwasanAbiArg->getValue();
1299 if (HwasanAbi !=
"platform" && HwasanAbi !=
"interceptor" &&
1301 D.
Diag(clang::diag::err_drv_invalid_value)
1302 << HwasanAbiArg->getAsString(Args) << HwasanAbi;
1304 HwasanAbi =
"interceptor";
1306 if (TC.
getTriple().getArch() == llvm::Triple::x86_64)
1307 HwasanUseAliases = Args.hasFlag(
1308 options::OPT_fsanitize_hwaddress_experimental_aliasing,
1309 options::OPT_fno_sanitize_hwaddress_experimental_aliasing,
1313 if (Kinds & SanitizerKind::SafeStack) {
1319 if (AllAddedKinds & SanitizerKind::AllocToken) {
1320 AllocTokenFastABI = Args.hasFlag(
1321 options::OPT_fsanitize_alloc_token_fast_abi,
1322 options::OPT_fno_sanitize_alloc_token_fast_abi, AllocTokenFastABI);
1323 AllocTokenExtended = Args.hasFlag(
1324 options::OPT_fsanitize_alloc_token_extended,
1325 options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended);
1328 if (AllAddedKinds & SanitizerKind::Type) {
1329 TysanOutlineInstrumentation =
1330 Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation,
1331 options::OPT_fno_sanitize_type_outline_instrumentation,
1332 TysanOutlineInstrumentation);
1335 LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime,
1336 options::OPT_fno_sanitize_link_runtime,
1337 !Args.hasArg(options::OPT_r));
1342 Args.hasFlag(options::OPT_fsanitize_link_cxx_runtime,
1343 options::OPT_fno_sanitize_link_cxx_runtime, LinkCXXRuntimes);
1345 NeedsMemProfRt = Args.hasFlag(options::OPT_fmemory_profile,
1346 options::OPT_fmemory_profile_EQ,
1347 options::OPT_fno_memory_profile,
false);
1350 Args.hasFlag(options::OPT_fcopyprof, options::OPT_fno_copyprof,
false);
1353 Sanitizers.Mask |= Kinds;
1354 RecoverableSanitizers.Mask |= RecoverableKinds;
1355 TrapSanitizers.Mask |= TrappingKinds;
1356 assert(!(RecoverableKinds & TrappingKinds) &&
1357 "Overlap between recoverable and trapping sanitizers");
1359 MergeHandlers.Mask |= MergeKinds;
1361 AnnotateDebugInfo.Mask |= AnnotateDebugInfoKinds;
1362 SuppressUBSanFeature.Mask |= IgnoreForUbsanFeature;
1365 SkipHotCutoffs.clear(~Sanitizers.Mask);