399 const llvm::opt::ArgList &Args,
400 bool DiagnoseErrors) {
416 CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso,
417 options::OPT_fno_sanitize_cfi_cross_dso,
false);
424 const llvm::Triple &Triple = TC.
getTriple();
427 Args.hasFlag(options::OPT_fsanitize_minimal_runtime,
428 options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime);
429 HandlerPreserveAllRegs =
430 Args.hasFlag(options::OPT_fsanitize_handler_preserve_all_regs,
431 options::OPT_fno_sanitize_handler_preserve_all_regs,
432 HandlerPreserveAllRegs) &&
433 MinimalRuntime && (Triple.isAArch64() || Triple.isX86_64());
436 Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
437 bool RemoveObjectSizeAtO0 =
438 !OptLevel || OptLevel->getOption().matches(options::OPT_O0);
440 for (
const llvm::opt::Arg *Arg : llvm::reverse(Args)) {
441 if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) {
445 if (RemoveObjectSizeAtO0) {
446 AllRemove |= SanitizerKind::ObjectSize;
450 if ((Add & SanitizerKind::ObjectSize) && DiagnoseErrors)
451 D.
Diag(diag::warn_drv_object_size_disabled_O0)
452 << Arg->getAsString(Args);
463 Add & InvalidTrappingKinds & ~DiagnosedKinds) {
464 if (DiagnoseErrors) {
466 D.
Diag(diag::err_drv_argument_not_allowed_with)
467 << Desc <<
"-fsanitize-trap=undefined";
469 DiagnosedKinds |= KindsToDiagnose;
471 Add &= ~InvalidTrappingKinds;
473 if (MinimalRuntime) {
476 if (DiagnoseErrors) {
478 D.
Diag(diag::err_drv_argument_not_allowed_with)
479 << Desc <<
"-fsanitize-minimal-runtime";
481 DiagnosedKinds |= KindsToDiagnose;
486 if (llvm::opt::Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
487 StringRef CM = A->getValue();
489 (Add & SanitizerKind::Function & ~DiagnosedKinds)) {
491 D.
Diag(diag::err_drv_argument_only_allowed_with)
492 <<
"-fsanitize=function"
495 DiagnosedKinds |= SanitizerKind::Function;
504 if (DiagnoseErrors) {
506 llvm::opt::Arg *A = Args.getLastArgNoClaim(
507 options::OPT_mexecute_only, options::OPT_mno_execute_only);
508 if (A && A->getOption().matches(options::OPT_mexecute_only))
509 D.
Diag(diag::err_drv_argument_not_allowed_with)
510 << Desc << A->getAsString(Args);
512 D.
Diag(diag::err_drv_unsupported_opt_for_target)
513 << Desc << Triple.str();
515 DiagnosedKinds |= KindsToDiagnose;
530 if (CfiCrossDso && (Add & SanitizerKind::CFIMFCall & ~DiagnosedKinds)) {
532 D.
Diag(diag::err_drv_argument_not_allowed_with)
533 <<
"-fsanitize=cfi-mfcall"
534 <<
"-fsanitize-cfi-cross-dso";
536 DiagnosedKinds |= SanitizerKind::CFIMFCall;
539 if (
SanitizerMask KindsToDiagnose = Add & ~Supported & ~DiagnosedKinds) {
540 if (DiagnoseErrors) {
542 D.
Diag(diag::err_drv_unsupported_opt_for_target)
545 DiagnosedKinds |= KindsToDiagnose;
553 if (
const llvm::opt::Arg *NoRTTIArg = TC.
getRTTIArg()) {
554 assert(NoRTTIArg->getOption().matches(options::OPT_fno_rtti) &&
555 "RTTI disabled without -fno-rtti option?");
559 D.
Diag(diag::err_drv_argument_not_allowed_with)
560 <<
"-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
565 D.
Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
569 AllRemove |= SanitizerKind::Vptr;
577 Add &= ~InvalidTrappingKinds;
578 if (MinimalRuntime) {
589 if (Add & SanitizerKind::UndefinedGroup) {
590 bool S = Args.hasFlagNoClaim(options::OPT_fno_strict_overflow,
591 options::OPT_fstrict_overflow,
false);
592 if (Args.hasFlagNoClaim(options::OPT_fwrapv, options::OPT_fno_wrapv, S))
594 if (Args.hasFlagNoClaim(options::OPT_fwrapv_pointer,
595 options::OPT_fno_wrapv_pointer, S))
600 if (Add & SanitizerKind::Fuzzer)
601 Add |= SanitizerKind::FuzzerNoLink;
604 if (Add & SanitizerKind::FuzzerNoLink) {
613 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_EQ)) {
617 }
else if (Arg->getOption().matches(
618 options::OPT_fsanitize_ignore_for_ubsan_feature_EQ)) {
620 IgnoreForUbsanFeature |=
625 std::pair<SanitizerMask, SanitizerMask> IncompatibleGroups[] = {
626 std::make_pair(SanitizerKind::Address,
627 SanitizerKind::Thread | SanitizerKind::Memory),
628 std::make_pair(SanitizerKind::Type,
629 SanitizerKind::Address | SanitizerKind::KernelAddress |
630 SanitizerKind::Memory | SanitizerKind::Leak |
631 SanitizerKind::Thread | SanitizerKind::KernelAddress),
632 std::make_pair(SanitizerKind::Thread, SanitizerKind::Memory),
633 std::make_pair(SanitizerKind::Leak,
634 SanitizerKind::Thread | SanitizerKind::Memory),
635 std::make_pair(SanitizerKind::KernelAddress,
636 SanitizerKind::Address | SanitizerKind::Leak |
637 SanitizerKind::Thread | SanitizerKind::Memory),
638 std::make_pair(SanitizerKind::HWAddress,
639 SanitizerKind::Address | SanitizerKind::Thread |
640 SanitizerKind::Memory | SanitizerKind::KernelAddress),
641 std::make_pair(SanitizerKind::Scudo,
642 SanitizerKind::Address | SanitizerKind::HWAddress |
643 SanitizerKind::Leak | SanitizerKind::Thread |
644 SanitizerKind::Memory | SanitizerKind::KernelAddress),
645 std::make_pair(SanitizerKind::SafeStack,
647 : SanitizerKind::Leak) |
648 SanitizerKind::Address | SanitizerKind::HWAddress |
649 SanitizerKind::Thread | SanitizerKind::Memory |
650 SanitizerKind::KernelAddress),
651 std::make_pair(SanitizerKind::KernelHWAddress,
652 SanitizerKind::Address | SanitizerKind::HWAddress |
653 SanitizerKind::Leak | SanitizerKind::Thread |
654 SanitizerKind::Memory | SanitizerKind::KernelAddress |
655 SanitizerKind::SafeStack),
656 std::make_pair(SanitizerKind::KernelMemory,
657 SanitizerKind::Address | SanitizerKind::HWAddress |
658 SanitizerKind::Leak | SanitizerKind::Thread |
659 SanitizerKind::Memory | SanitizerKind::KernelAddress |
660 SanitizerKind::Scudo | SanitizerKind::SafeStack),
661 std::make_pair(SanitizerKind::MemTag, SanitizerKind::Address |
662 SanitizerKind::KernelAddress |
663 SanitizerKind::HWAddress |
664 SanitizerKind::KernelHWAddress),
665 std::make_pair(SanitizerKind::KCFI, SanitizerKind::Function),
666 std::make_pair(SanitizerKind::Realtime,
667 SanitizerKind::Address | SanitizerKind::Thread |
668 SanitizerKind::Undefined | SanitizerKind::Memory),
669 std::make_pair(SanitizerKind::AllocToken,
670 SanitizerKind::Address | SanitizerKind::HWAddress |
671 SanitizerKind::KernelAddress |
672 SanitizerKind::KernelHWAddress |
673 SanitizerKind::Memory)};
680 for (
auto G : IncompatibleGroups) {
682 if ((
Default & Group) && (Kinds & G.second))
696 D.
Diag(diag::err_drv_argument_only_allowed_with)
700 if ((Kinds & SanitizerKind::ShadowCallStack) && TC.
getTriple().isAArch64() &&
701 !llvm::AArch64::isX18ReservedByDefault(TC.
getTriple()) &&
702 !Args.hasArg(options::OPT_ffixed_x18) && DiagnoseErrors) {
703 D.
Diag(diag::err_drv_argument_only_allowed_with)
712 if (~Supported & SanitizerKind::Vptr) {
718 if (KindsToDiagnose) {
720 S.
Mask = KindsToDiagnose;
722 D.
Diag(diag::err_drv_unsupported_opt_for_target)
724 Kinds &= ~KindsToDiagnose;
729 for (
auto G : IncompatibleGroups) {
734 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
750 options::OPT_fno_sanitize_recover_EQ);
751 RecoverableKinds &= Kinds;
753 TrappingKinds &= Kinds;
754 RecoverableKinds &= ~TrappingKinds;
759 options::OPT_fsanitize_merge_handlers_EQ,
760 options::OPT_fno_sanitize_merge_handlers_EQ);
769 {}, options::OPT_fsanitize_annotate_debug_info_EQ,
770 options::OPT_fno_sanitize_annotate_debug_info_EQ);
771 AnnotateDebugInfoKinds &= Kinds;
776 if (!Args.hasArgNoClaim(options::OPT_fno_sanitize_ignorelist))
782 D, Args, UserIgnorelistFiles, options::OPT_fsanitize_ignorelist_EQ,
783 options::OPT_fno_sanitize_ignorelist,
784 clang::diag::err_drv_malformed_sanitizer_ignorelist, DiagnoseErrors);
787 if (Arg *A = Args.getLastArg(
788 options::OPT_fsanitize_coverage_stack_depth_callback_min_EQ)) {
789 StringRef S = A->getValue();
790 if (S.getAsInteger(0, CoverageStackDepthCallbackMin) ||
791 CoverageStackDepthCallbackMin < 0) {
793 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
798 if (AllAddedKinds & SanitizerKind::Memory) {
800 Args.getLastArg(options::OPT_fsanitize_memory_track_origins_EQ,
801 options::OPT_fno_sanitize_memory_track_origins)) {
802 if (!A->getOption().matches(
803 options::OPT_fno_sanitize_memory_track_origins)) {
804 StringRef S = A->getValue();
805 if (S.getAsInteger(0, MsanTrackOrigins) || MsanTrackOrigins < 0 ||
806 MsanTrackOrigins > 2) {
808 D.
Diag(clang::diag::err_drv_invalid_value)
809 << A->getAsString(Args) << S;
813 MsanUseAfterDtor = Args.hasFlag(
814 options::OPT_fsanitize_memory_use_after_dtor,
815 options::OPT_fno_sanitize_memory_use_after_dtor, MsanUseAfterDtor);
816 MsanParamRetval = Args.hasFlag(
817 options::OPT_fsanitize_memory_param_retval,
818 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
819 }
else if (AllAddedKinds & SanitizerKind::KernelMemory) {
820 MsanUseAfterDtor =
false;
821 MsanParamRetval = Args.hasFlag(
822 options::OPT_fsanitize_memory_param_retval,
823 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
825 MsanUseAfterDtor =
false;
826 MsanParamRetval =
false;
829 if (AllAddedKinds & SanitizerKind::MemTag) {
831 Args.getLastArgValue(options::OPT_fsanitize_memtag_mode_EQ,
"sync");
832 if (S ==
"async" || S ==
"sync") {
833 MemtagMode = S.str();
835 D.
Diag(clang::diag::err_drv_invalid_value_with_suggestion)
836 <<
"-fsanitize-memtag-mode=" << S <<
"{async, sync}";
841 if (AllAddedKinds & SanitizerKind::Thread) {
842 TsanMemoryAccess = Args.hasFlag(
843 options::OPT_fsanitize_thread_memory_access,
844 options::OPT_fno_sanitize_thread_memory_access, TsanMemoryAccess);
845 TsanFuncEntryExit = Args.hasFlag(
846 options::OPT_fsanitize_thread_func_entry_exit,
847 options::OPT_fno_sanitize_thread_func_entry_exit, TsanFuncEntryExit);
849 Args.hasFlag(options::OPT_fsanitize_thread_atomics,
850 options::OPT_fno_sanitize_thread_atomics, TsanAtomics);
853 if (AllAddedKinds & SanitizerKind::CFI) {
856 NeedPIE |= CfiCrossDso;
857 CfiICallGeneralizePointers =
858 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
860 CfiICallNormalizeIntegers =
861 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
863 if (CfiCrossDso && CfiICallGeneralizePointers && DiagnoseErrors)
864 D.
Diag(diag::err_drv_argument_not_allowed_with)
865 <<
"-fsanitize-cfi-cross-dso"
866 <<
"-fsanitize-cfi-icall-generalize-pointers";
868 CfiCanonicalJumpTables =
869 Args.hasFlag(options::OPT_fsanitize_cfi_canonical_jump_tables,
870 options::OPT_fno_sanitize_cfi_canonical_jump_tables,
true);
873 if (AllAddedKinds & SanitizerKind::KCFI) {
874 CfiICallGeneralizePointers =
875 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
876 CfiICallNormalizeIntegers =
877 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
879 KcfiArity = Args.hasArg(options::OPT_fsanitize_kcfi_arity);
881 if (AllAddedKinds & SanitizerKind::CFI && DiagnoseErrors)
882 D.
Diag(diag::err_drv_argument_not_allowed_with)
887 Stats = Args.hasFlag(options::OPT_fsanitize_stats,
888 options::OPT_fno_sanitize_stats,
false);
890 if (MinimalRuntime) {
893 if (IncompatibleMask && DiagnoseErrors)
894 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
895 <<
"-fsanitize-minimal-runtime"
899 for (
const auto *Arg : Args.filtered(
900 options::OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
902 OverflowPatternExclusions |=
908 for (
const auto *Arg : Args) {
909 if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) {
910 int LegacySanitizeCoverage;
911 if (Arg->getNumValues() == 1 &&
912 !StringRef(Arg->getValue(0))
913 .getAsInteger(0, LegacySanitizeCoverage)) {
914 CoverageFeatures = 0;
916 if (LegacySanitizeCoverage != 0 && DiagnoseErrors) {
917 D.
Diag(diag::warn_drv_deprecated_arg)
918 << Arg->getAsString(Args) <<
true
919 <<
"-fsanitize-coverage=trace-pc-guard";
930 CoverageFeatures = 0;
932 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_coverage)) {
938 if (DiagnoseErrors) {
940 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
941 <<
"-fsanitize-coverage=func"
942 <<
"-fsanitize-coverage=bb";
944 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
945 <<
"-fsanitize-coverage=func"
946 <<
"-fsanitize-coverage=edge";
948 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
949 <<
"-fsanitize-coverage=bb"
950 <<
"-fsanitize-coverage=edge";
954 D.
Diag(clang::diag::warn_drv_deprecated_arg)
955 <<
"-fsanitize-coverage=trace-bb" <<
true
956 <<
"-fsanitize-coverage=trace-pc-guard";
958 D.
Diag(clang::diag::warn_drv_deprecated_arg)
959 <<
"-fsanitize-coverage=8bit-counters" <<
true
960 <<
"-fsanitize-coverage=trace-pc-guard";
968 if ((CoverageFeatures & InsertionPointTypes) &&
969 !(CoverageFeatures & InstrumentationTypes) && DiagnoseErrors) {
970 D.
Diag(clang::diag::warn_drv_deprecated_arg)
971 <<
"-fsanitize-coverage=[func|bb|edge]" <<
true
972 <<
"-fsanitize-coverage=[func|bb|edge],[trace-pc-guard|trace-pc],["
977 if (!(CoverageFeatures & InsertionPointTypes)) {
978 if (CoverageFeatures &
991 if (CoverageFeatures) {
993 D, Args, CoverageAllowlistFiles,
994 options::OPT_fsanitize_coverage_allowlist, OptSpecifier(),
995 clang::diag::err_drv_malformed_sanitizer_coverage_allowlist,
998 D, Args, CoverageIgnorelistFiles,
999 options::OPT_fsanitize_coverage_ignorelist, OptSpecifier(),
1000 clang::diag::err_drv_malformed_sanitizer_coverage_ignorelist,
1005 for (
const auto *Arg :
1006 Args.filtered(options::OPT_fexperimental_sanitize_metadata_EQ,
1007 options::OPT_fno_experimental_sanitize_metadata_EQ)) {
1008 if (Arg->getOption().matches(
1009 options::OPT_fexperimental_sanitize_metadata_EQ)) {
1011 BinaryMetadataFeatures |=
1015 BinaryMetadataFeatures &=
1021 if (BinaryMetadataFeatures) {
1023 D, Args, BinaryMetadataIgnorelistFiles,
1024 options::OPT_fexperimental_sanitize_metadata_ignorelist_EQ,
1026 clang::diag::err_drv_malformed_sanitizer_metadata_ignorelist,
1030 SharedRuntime = Args.hasFlag(
1031 options::OPT_shared_libsan, options::OPT_static_libsan,
1034 if (!SharedRuntime && TC.
getTriple().isOSWindows()) {
1036 Args.getLastArg(options::OPT_shared_libsan, options::OPT_static_libsan);
1037 D.
Diag(clang::diag::err_drv_unsupported_opt_for_target)
1038 << A->getSpelling() << TC.
getTriple().str();
1041 ImplicitCfiRuntime = TC.
getTriple().isAndroid();
1043 if (AllAddedKinds & SanitizerKind::Address) {
1044 NeedPIE |= TC.
getTriple().isOSFuchsia();
1046 Args.getLastArg(options::OPT_fsanitize_address_field_padding)) {
1047 StringRef S = A->getValue();
1049 if ((S.getAsInteger(0, AsanFieldPadding) || AsanFieldPadding < 0 ||
1050 AsanFieldPadding > 2) &&
1052 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1056 if (Arg *WindowsDebugRTArg =
1057 Args.getLastArg(options::OPT__SLASH_MTd, options::OPT__SLASH_MT,
1058 options::OPT__SLASH_MDd, options::OPT__SLASH_MD,
1059 options::OPT__SLASH_LDd, options::OPT__SLASH_LD)) {
1060 switch (WindowsDebugRTArg->getOption().getID()) {
1061 case options::OPT__SLASH_MTd:
1062 case options::OPT__SLASH_MDd:
1063 case options::OPT__SLASH_LDd:
1064 if (DiagnoseErrors) {
1065 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1066 << WindowsDebugRTArg->getAsString(Args)
1068 D.
Diag(clang::diag::note_drv_address_sanitizer_debug_runtime);
1073 StableABI = Args.hasFlag(options::OPT_fsanitize_stable_abi,
1074 options::OPT_fno_sanitize_stable_abi,
false);
1076 AsanPoisonCustomArrayCookie = Args.hasFlag(
1077 options::OPT_fsanitize_address_poison_custom_array_cookie,
1078 options::OPT_fno_sanitize_address_poison_custom_array_cookie,
1079 AsanPoisonCustomArrayCookie);
1081 AsanOutlineInstrumentation =
1082 Args.hasFlag(options::OPT_fsanitize_address_outline_instrumentation,
1083 options::OPT_fno_sanitize_address_outline_instrumentation,
1084 AsanOutlineInstrumentation);
1086 AsanGlobalsDeadStripping = Args.hasFlag(
1087 options::OPT_fsanitize_address_globals_dead_stripping,
1088 options::OPT_fno_sanitize_address_globals_dead_stripping,
true);
1094 AsanUseOdrIndicator =
1095 Args.hasFlag(options::OPT_fsanitize_address_use_odr_indicator,
1096 options::OPT_fno_sanitize_address_use_odr_indicator,
1099 if (AllAddedKinds & SanitizerKind::PointerCompare & ~AllRemove) {
1100 AsanInvalidPointerCmp =
true;
1103 if (AllAddedKinds & SanitizerKind::PointerSubtract & ~AllRemove) {
1104 AsanInvalidPointerSub =
true;
1108 (Args.hasArg(options::OPT_mkernel) ||
1109 Args.hasArg(options::OPT_fapple_kext))) {
1110 AsanDtorKind = llvm::AsanDtorKind::None;
1113 if (
const auto *Arg =
1114 Args.getLastArg(options::OPT_sanitize_address_destructor_EQ)) {
1116 if (parsedAsanDtorKind == llvm::AsanDtorKind::Invalid && DiagnoseErrors) {
1117 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1118 << Arg->getSpelling() << Arg->getValue();
1120 AsanDtorKind = parsedAsanDtorKind;
1123 if (
const auto *Arg = Args.getLastArg(
1124 options::OPT_sanitize_address_use_after_return_EQ)) {
1125 auto parsedAsanUseAfterReturn =
1127 if (parsedAsanUseAfterReturn ==
1128 llvm::AsanDetectStackUseAfterReturnMode::Invalid &&
1130 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1131 << Arg->getSpelling() << Arg->getValue();
1133 AsanUseAfterReturn = parsedAsanUseAfterReturn;
1139 SanitizerKind::PointerCompare | SanitizerKind::PointerSubtract;
1140 if ((AllAddedKinds & DetectInvalidPointerPairs & ~AllRemove) &&
1142 TC.
getDriver().
Diag(clang::diag::err_drv_argument_only_allowed_with)
1144 SanitizerKind::PointerCompare |
1145 SanitizerKind::PointerSubtract)
1146 <<
"-fsanitize=address";
1150 if (AllAddedKinds & (SanitizerKind::Address | SanitizerKind::KernelAddress)) {
1151 AsanUseAfterScope = Args.hasFlag(
1152 options::OPT_fsanitize_address_use_after_scope,
1153 options::OPT_fno_sanitize_address_use_after_scope, AsanUseAfterScope);
1155 AsanUseAfterScope =
false;
1158 if (AllAddedKinds & SanitizerKind::HWAddress) {
1159 if (Arg *HwasanAbiArg =
1160 Args.getLastArg(options::OPT_fsanitize_hwaddress_abi_EQ)) {
1161 HwasanAbi = HwasanAbiArg->getValue();
1162 if (HwasanAbi !=
"platform" && HwasanAbi !=
"interceptor" &&
1164 D.
Diag(clang::diag::err_drv_invalid_value)
1165 << HwasanAbiArg->getAsString(Args) << HwasanAbi;
1167 HwasanAbi =
"interceptor";
1169 if (TC.
getTriple().getArch() == llvm::Triple::x86_64)
1170 HwasanUseAliases = Args.hasFlag(
1171 options::OPT_fsanitize_hwaddress_experimental_aliasing,
1172 options::OPT_fno_sanitize_hwaddress_experimental_aliasing,
1176 if (AllAddedKinds & SanitizerKind::SafeStack) {
1182 if (AllAddedKinds & SanitizerKind::AllocToken) {
1183 AllocTokenFastABI = Args.hasFlag(
1184 options::OPT_fsanitize_alloc_token_fast_abi,
1185 options::OPT_fno_sanitize_alloc_token_fast_abi, AllocTokenFastABI);
1186 AllocTokenExtended = Args.hasFlag(
1187 options::OPT_fsanitize_alloc_token_extended,
1188 options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended);
1191 if (AllAddedKinds & SanitizerKind::Type) {
1192 TysanOutlineInstrumentation =
1193 Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation,
1194 options::OPT_fno_sanitize_type_outline_instrumentation,
1195 TysanOutlineInstrumentation);
1198 LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime,
1199 options::OPT_fno_sanitize_link_runtime,
1200 !Args.hasArg(options::OPT_r));
1205 Args.hasFlag(options::OPT_fsanitize_link_cxx_runtime,
1206 options::OPT_fno_sanitize_link_cxx_runtime, LinkCXXRuntimes);
1208 NeedsMemProfRt = Args.hasFlag(options::OPT_fmemory_profile,
1209 options::OPT_fmemory_profile_EQ,
1210 options::OPT_fno_memory_profile,
false);
1213 Sanitizers.Mask |= Kinds;
1214 RecoverableSanitizers.Mask |= RecoverableKinds;
1215 TrapSanitizers.Mask |= TrappingKinds;
1216 assert(!(RecoverableKinds & TrappingKinds) &&
1217 "Overlap between recoverable and trapping sanitizers");
1219 MergeHandlers.Mask |= MergeKinds;
1221 AnnotateDebugInfo.Mask |= AnnotateDebugInfoKinds;
1222 SuppressUBSanFeature.Mask |= IgnoreForUbsanFeature;
1225 SkipHotCutoffs.clear(~Sanitizers.Mask);