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());
434 TrapLoop = Args.hasFlag(options::OPT_fsanitize_trap_loop,
435 options::OPT_fno_sanitize_trap_loop,
false);
438 Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
439 bool RemoveObjectSizeAtO0 =
440 !OptLevel || OptLevel->getOption().matches(options::OPT_O0);
442 for (
const llvm::opt::Arg *Arg : llvm::reverse(Args)) {
443 if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) {
447 if (RemoveObjectSizeAtO0) {
448 AllRemove |= SanitizerKind::ObjectSize;
452 if ((Add & SanitizerKind::ObjectSize) && DiagnoseErrors)
453 D.
Diag(diag::warn_drv_object_size_disabled_O0)
454 << Arg->getAsString(Args);
465 Add & InvalidTrappingKinds & ~DiagnosedKinds) {
466 if (DiagnoseErrors) {
468 D.
Diag(diag::err_drv_argument_not_allowed_with)
469 << Desc <<
"-fsanitize-trap=undefined";
471 DiagnosedKinds |= KindsToDiagnose;
473 Add &= ~InvalidTrappingKinds;
475 if (MinimalRuntime) {
478 if (DiagnoseErrors) {
480 D.
Diag(diag::err_drv_argument_not_allowed_with)
481 << Desc <<
"-fsanitize-minimal-runtime";
483 DiagnosedKinds |= KindsToDiagnose;
488 if (llvm::opt::Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
489 StringRef CM = A->getValue();
491 (Add & SanitizerKind::Function & ~DiagnosedKinds)) {
493 D.
Diag(diag::err_drv_argument_only_allowed_with)
494 <<
"-fsanitize=function"
497 DiagnosedKinds |= SanitizerKind::Function;
506 if (DiagnoseErrors) {
508 llvm::opt::Arg *A = Args.getLastArgNoClaim(
509 options::OPT_mexecute_only, options::OPT_mno_execute_only);
510 if (A && A->getOption().matches(options::OPT_mexecute_only))
511 D.
Diag(diag::err_drv_argument_not_allowed_with)
512 << Desc << A->getAsString(Args);
514 D.
Diag(diag::err_drv_unsupported_opt_for_target)
515 << Desc << Triple.str();
517 DiagnosedKinds |= KindsToDiagnose;
532 if (CfiCrossDso && (Add & SanitizerKind::CFIMFCall & ~DiagnosedKinds)) {
534 D.
Diag(diag::err_drv_argument_not_allowed_with)
535 <<
"-fsanitize=cfi-mfcall"
536 <<
"-fsanitize-cfi-cross-dso";
538 DiagnosedKinds |= SanitizerKind::CFIMFCall;
541 if (
SanitizerMask KindsToDiagnose = Add & ~Supported & ~DiagnosedKinds) {
542 if (DiagnoseErrors) {
544 D.
Diag(diag::err_drv_unsupported_opt_for_target)
547 DiagnosedKinds |= KindsToDiagnose;
555 if (
const llvm::opt::Arg *NoRTTIArg = TC.
getRTTIArg()) {
556 assert(NoRTTIArg->getOption().matches(options::OPT_fno_rtti) &&
557 "RTTI disabled without -fno-rtti option?");
561 D.
Diag(diag::err_drv_argument_not_allowed_with)
562 <<
"-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
567 D.
Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
571 AllRemove |= SanitizerKind::Vptr;
579 Add &= ~InvalidTrappingKinds;
580 if (MinimalRuntime) {
591 if (Add & SanitizerKind::UndefinedGroup) {
592 bool S = Args.hasFlagNoClaim(options::OPT_fno_strict_overflow,
593 options::OPT_fstrict_overflow,
false);
594 if (Args.hasFlagNoClaim(options::OPT_fwrapv, options::OPT_fno_wrapv, S))
596 if (Args.hasFlagNoClaim(options::OPT_fwrapv_pointer,
597 options::OPT_fno_wrapv_pointer, S))
602 if (Add & SanitizerKind::Fuzzer)
603 Add |= SanitizerKind::FuzzerNoLink;
606 if (Add & SanitizerKind::FuzzerNoLink) {
615 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_EQ)) {
619 }
else if (Arg->getOption().matches(
620 options::OPT_fsanitize_ignore_for_ubsan_feature_EQ)) {
622 IgnoreForUbsanFeature |=
627 std::pair<SanitizerMask, SanitizerMask> IncompatibleGroups[] = {
628 std::make_pair(SanitizerKind::Address,
629 SanitizerKind::Thread | SanitizerKind::Memory),
630 std::make_pair(SanitizerKind::Type,
631 SanitizerKind::Address | SanitizerKind::KernelAddress |
632 SanitizerKind::Memory | SanitizerKind::Leak |
633 SanitizerKind::Thread | SanitizerKind::KernelAddress),
634 std::make_pair(SanitizerKind::Thread, SanitizerKind::Memory),
635 std::make_pair(SanitizerKind::Leak,
636 SanitizerKind::Thread | SanitizerKind::Memory),
637 std::make_pair(SanitizerKind::KernelAddress,
638 SanitizerKind::Address | SanitizerKind::Leak |
639 SanitizerKind::Thread | SanitizerKind::Memory),
640 std::make_pair(SanitizerKind::HWAddress,
641 SanitizerKind::Address | SanitizerKind::Thread |
642 SanitizerKind::Memory | SanitizerKind::KernelAddress),
643 std::make_pair(SanitizerKind::Scudo,
644 SanitizerKind::Address | SanitizerKind::HWAddress |
645 SanitizerKind::Leak | SanitizerKind::Thread |
646 SanitizerKind::Memory | SanitizerKind::KernelAddress),
647 std::make_pair(SanitizerKind::SafeStack,
649 : SanitizerKind::Leak) |
650 SanitizerKind::Address | SanitizerKind::HWAddress |
651 SanitizerKind::Thread | SanitizerKind::Memory |
652 SanitizerKind::KernelAddress),
653 std::make_pair(SanitizerKind::KernelHWAddress,
654 SanitizerKind::Address | SanitizerKind::HWAddress |
655 SanitizerKind::Leak | SanitizerKind::Thread |
656 SanitizerKind::Memory | SanitizerKind::KernelAddress |
657 SanitizerKind::SafeStack),
658 std::make_pair(SanitizerKind::KernelMemory,
659 SanitizerKind::Address | SanitizerKind::HWAddress |
660 SanitizerKind::Leak | SanitizerKind::Thread |
661 SanitizerKind::Memory | SanitizerKind::KernelAddress |
662 SanitizerKind::Scudo | SanitizerKind::SafeStack),
663 std::make_pair(SanitizerKind::MemTag, SanitizerKind::Address |
664 SanitizerKind::KernelAddress |
665 SanitizerKind::HWAddress |
666 SanitizerKind::KernelHWAddress),
667 std::make_pair(SanitizerKind::KCFI, SanitizerKind::Function),
668 std::make_pair(SanitizerKind::Realtime,
669 SanitizerKind::Address | SanitizerKind::Thread |
670 SanitizerKind::Undefined | SanitizerKind::Memory),
671 std::make_pair(SanitizerKind::AllocToken,
672 SanitizerKind::Address | SanitizerKind::HWAddress |
673 SanitizerKind::KernelAddress |
674 SanitizerKind::KernelHWAddress |
675 SanitizerKind::Memory)};
682 for (
auto G : IncompatibleGroups) {
684 if ((
Default & Group) && (Kinds & G.second))
698 D.
Diag(diag::err_drv_argument_only_allowed_with)
702 if ((Kinds & SanitizerKind::ShadowCallStack) && TC.
getTriple().isAArch64() &&
703 !llvm::AArch64::isX18ReservedByDefault(TC.
getTriple()) &&
704 !Args.hasArg(options::OPT_ffixed_x18) && DiagnoseErrors) {
705 D.
Diag(diag::err_drv_argument_only_allowed_with)
714 if (~Supported & SanitizerKind::Vptr) {
720 if (KindsToDiagnose) {
722 S.
Mask = KindsToDiagnose;
724 D.
Diag(diag::err_drv_unsupported_opt_for_target)
726 Kinds &= ~KindsToDiagnose;
731 for (
auto G : IncompatibleGroups) {
736 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
752 options::OPT_fno_sanitize_recover_EQ);
753 RecoverableKinds &= Kinds;
755 TrappingKinds &= Kinds;
756 RecoverableKinds &= ~TrappingKinds;
761 options::OPT_fsanitize_merge_handlers_EQ,
762 options::OPT_fno_sanitize_merge_handlers_EQ);
771 {}, options::OPT_fsanitize_annotate_debug_info_EQ,
772 options::OPT_fno_sanitize_annotate_debug_info_EQ);
773 AnnotateDebugInfoKinds &= Kinds;
778 if (!Args.hasArgNoClaim(options::OPT_fno_sanitize_ignorelist))
784 D, Args, UserIgnorelistFiles, options::OPT_fsanitize_ignorelist_EQ,
785 options::OPT_fno_sanitize_ignorelist,
786 clang::diag::err_drv_malformed_sanitizer_ignorelist, DiagnoseErrors);
789 if (Arg *A = Args.getLastArg(
790 options::OPT_fsanitize_coverage_stack_depth_callback_min_EQ)) {
791 StringRef S = A->getValue();
792 if (S.getAsInteger(0, CoverageStackDepthCallbackMin) ||
793 CoverageStackDepthCallbackMin < 0) {
795 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
800 if (AllAddedKinds & SanitizerKind::Memory) {
802 Args.getLastArg(options::OPT_fsanitize_memory_track_origins_EQ,
803 options::OPT_fno_sanitize_memory_track_origins)) {
804 if (!A->getOption().matches(
805 options::OPT_fno_sanitize_memory_track_origins)) {
806 StringRef S = A->getValue();
807 if (S.getAsInteger(0, MsanTrackOrigins) || MsanTrackOrigins < 0 ||
808 MsanTrackOrigins > 2) {
810 D.
Diag(clang::diag::err_drv_invalid_value)
811 << A->getAsString(Args) << S;
815 MsanUseAfterDtor = Args.hasFlag(
816 options::OPT_fsanitize_memory_use_after_dtor,
817 options::OPT_fno_sanitize_memory_use_after_dtor, MsanUseAfterDtor);
818 MsanParamRetval = Args.hasFlag(
819 options::OPT_fsanitize_memory_param_retval,
820 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
821 }
else if (AllAddedKinds & SanitizerKind::KernelMemory) {
822 MsanUseAfterDtor =
false;
823 MsanParamRetval = Args.hasFlag(
824 options::OPT_fsanitize_memory_param_retval,
825 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
827 MsanUseAfterDtor =
false;
828 MsanParamRetval =
false;
831 if (AllAddedKinds & SanitizerKind::MemTag) {
833 Args.getLastArgValue(options::OPT_fsanitize_memtag_mode_EQ,
"sync");
834 if (S ==
"async" || S ==
"sync") {
835 MemtagMode = S.str();
837 D.
Diag(clang::diag::err_drv_invalid_value_with_suggestion)
838 <<
"-fsanitize-memtag-mode=" << S <<
"{async, sync}";
843 if (AllAddedKinds & SanitizerKind::Thread) {
844 TsanMemoryAccess = Args.hasFlag(
845 options::OPT_fsanitize_thread_memory_access,
846 options::OPT_fno_sanitize_thread_memory_access, TsanMemoryAccess);
847 TsanFuncEntryExit = Args.hasFlag(
848 options::OPT_fsanitize_thread_func_entry_exit,
849 options::OPT_fno_sanitize_thread_func_entry_exit, TsanFuncEntryExit);
851 Args.hasFlag(options::OPT_fsanitize_thread_atomics,
852 options::OPT_fno_sanitize_thread_atomics, TsanAtomics);
855 if (AllAddedKinds & SanitizerKind::CFI) {
858 NeedPIE |= CfiCrossDso;
859 CfiICallGeneralizePointers =
860 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
862 CfiICallNormalizeIntegers =
863 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
865 if (CfiCrossDso && CfiICallGeneralizePointers && DiagnoseErrors)
866 D.
Diag(diag::err_drv_argument_not_allowed_with)
867 <<
"-fsanitize-cfi-cross-dso"
868 <<
"-fsanitize-cfi-icall-generalize-pointers";
870 CfiCanonicalJumpTables =
871 Args.hasFlag(options::OPT_fsanitize_cfi_canonical_jump_tables,
872 options::OPT_fno_sanitize_cfi_canonical_jump_tables,
true);
875 if (AllAddedKinds & SanitizerKind::KCFI) {
876 CfiICallGeneralizePointers =
877 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
878 CfiICallNormalizeIntegers =
879 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
881 KcfiArity = Args.hasArg(options::OPT_fsanitize_kcfi_arity);
883 if (AllAddedKinds & SanitizerKind::CFI && DiagnoseErrors)
884 D.
Diag(diag::err_drv_argument_not_allowed_with)
889 Stats = Args.hasFlag(options::OPT_fsanitize_stats,
890 options::OPT_fno_sanitize_stats,
false);
892 if (MinimalRuntime) {
895 if (IncompatibleMask && DiagnoseErrors)
896 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
897 <<
"-fsanitize-minimal-runtime"
901 for (
const auto *Arg : Args.filtered(
902 options::OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
904 OverflowPatternExclusions |=
910 for (
const auto *Arg : Args) {
911 if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) {
912 int LegacySanitizeCoverage;
913 if (Arg->getNumValues() == 1 &&
914 !StringRef(Arg->getValue(0))
915 .getAsInteger(0, LegacySanitizeCoverage)) {
916 CoverageFeatures = 0;
918 if (LegacySanitizeCoverage != 0 && DiagnoseErrors) {
919 D.
Diag(diag::warn_drv_deprecated_arg)
920 << Arg->getAsString(Args) <<
true
921 <<
"-fsanitize-coverage=trace-pc-guard";
932 CoverageFeatures = 0;
934 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_coverage)) {
940 if (DiagnoseErrors) {
942 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
943 <<
"-fsanitize-coverage=func"
944 <<
"-fsanitize-coverage=bb";
946 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
947 <<
"-fsanitize-coverage=func"
948 <<
"-fsanitize-coverage=edge";
950 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
951 <<
"-fsanitize-coverage=bb"
952 <<
"-fsanitize-coverage=edge";
956 D.
Diag(clang::diag::warn_drv_deprecated_arg)
957 <<
"-fsanitize-coverage=trace-bb" <<
true
958 <<
"-fsanitize-coverage=trace-pc-guard";
960 D.
Diag(clang::diag::warn_drv_deprecated_arg)
961 <<
"-fsanitize-coverage=8bit-counters" <<
true
962 <<
"-fsanitize-coverage=trace-pc-guard";
970 if ((CoverageFeatures & InsertionPointTypes) &&
971 !(CoverageFeatures & InstrumentationTypes) && DiagnoseErrors) {
972 D.
Diag(clang::diag::warn_drv_deprecated_arg)
973 <<
"-fsanitize-coverage=[func|bb|edge]" <<
true
974 <<
"-fsanitize-coverage=[func|bb|edge],[trace-pc-guard|trace-pc],["
979 if (!(CoverageFeatures & InsertionPointTypes)) {
980 if (CoverageFeatures &
993 if (CoverageFeatures) {
995 D, Args, CoverageAllowlistFiles,
996 options::OPT_fsanitize_coverage_allowlist, OptSpecifier(),
997 clang::diag::err_drv_malformed_sanitizer_coverage_allowlist,
1000 D, Args, CoverageIgnorelistFiles,
1001 options::OPT_fsanitize_coverage_ignorelist, OptSpecifier(),
1002 clang::diag::err_drv_malformed_sanitizer_coverage_ignorelist,
1007 for (
const auto *Arg :
1008 Args.filtered(options::OPT_fexperimental_sanitize_metadata_EQ,
1009 options::OPT_fno_experimental_sanitize_metadata_EQ)) {
1010 if (Arg->getOption().matches(
1011 options::OPT_fexperimental_sanitize_metadata_EQ)) {
1013 BinaryMetadataFeatures |=
1017 BinaryMetadataFeatures &=
1023 if (BinaryMetadataFeatures) {
1025 D, Args, BinaryMetadataIgnorelistFiles,
1026 options::OPT_fexperimental_sanitize_metadata_ignorelist_EQ,
1028 clang::diag::err_drv_malformed_sanitizer_metadata_ignorelist,
1032 SharedRuntime = Args.hasFlag(
1033 options::OPT_shared_libsan, options::OPT_static_libsan,
1036 if (!SharedRuntime && TC.
getTriple().isOSWindows()) {
1038 Args.getLastArg(options::OPT_shared_libsan, options::OPT_static_libsan);
1039 D.
Diag(clang::diag::err_drv_unsupported_opt_for_target)
1040 << A->getSpelling() << TC.
getTriple().str();
1043 ImplicitCfiRuntime = TC.
getTriple().isAndroid();
1045 if (AllAddedKinds & SanitizerKind::Address) {
1046 NeedPIE |= TC.
getTriple().isOSFuchsia();
1048 Args.getLastArg(options::OPT_fsanitize_address_field_padding)) {
1049 StringRef S = A->getValue();
1051 if ((S.getAsInteger(0, AsanFieldPadding) || AsanFieldPadding < 0 ||
1052 AsanFieldPadding > 2) &&
1054 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1058 if (Arg *WindowsDebugRTArg =
1059 Args.getLastArg(options::OPT__SLASH_MTd, options::OPT__SLASH_MT,
1060 options::OPT__SLASH_MDd, options::OPT__SLASH_MD,
1061 options::OPT__SLASH_LDd, options::OPT__SLASH_LD)) {
1062 switch (WindowsDebugRTArg->getOption().getID()) {
1063 case options::OPT__SLASH_MTd:
1064 case options::OPT__SLASH_MDd:
1065 case options::OPT__SLASH_LDd:
1066 if (DiagnoseErrors) {
1067 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1068 << WindowsDebugRTArg->getAsString(Args)
1070 D.
Diag(clang::diag::note_drv_address_sanitizer_debug_runtime);
1075 StableABI = Args.hasFlag(options::OPT_fsanitize_stable_abi,
1076 options::OPT_fno_sanitize_stable_abi,
false);
1078 AsanPoisonCustomArrayCookie = Args.hasFlag(
1079 options::OPT_fsanitize_address_poison_custom_array_cookie,
1080 options::OPT_fno_sanitize_address_poison_custom_array_cookie,
1081 AsanPoisonCustomArrayCookie);
1083 AsanOutlineInstrumentation =
1084 Args.hasFlag(options::OPT_fsanitize_address_outline_instrumentation,
1085 options::OPT_fno_sanitize_address_outline_instrumentation,
1086 AsanOutlineInstrumentation);
1088 AsanGlobalsDeadStripping = Args.hasFlag(
1089 options::OPT_fsanitize_address_globals_dead_stripping,
1090 options::OPT_fno_sanitize_address_globals_dead_stripping,
true);
1096 AsanUseOdrIndicator =
1097 Args.hasFlag(options::OPT_fsanitize_address_use_odr_indicator,
1098 options::OPT_fno_sanitize_address_use_odr_indicator,
1101 if (AllAddedKinds & SanitizerKind::PointerCompare & ~AllRemove) {
1102 AsanInvalidPointerCmp =
true;
1105 if (AllAddedKinds & SanitizerKind::PointerSubtract & ~AllRemove) {
1106 AsanInvalidPointerSub =
true;
1110 (Args.hasArg(options::OPT_mkernel) ||
1111 Args.hasArg(options::OPT_fapple_kext))) {
1112 AsanDtorKind = llvm::AsanDtorKind::None;
1115 if (
const auto *Arg =
1116 Args.getLastArg(options::OPT_sanitize_address_destructor_EQ)) {
1118 if (parsedAsanDtorKind == llvm::AsanDtorKind::Invalid && DiagnoseErrors) {
1119 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1120 << Arg->getSpelling() << Arg->getValue();
1122 AsanDtorKind = parsedAsanDtorKind;
1125 if (
const auto *Arg = Args.getLastArg(
1126 options::OPT_sanitize_address_use_after_return_EQ)) {
1127 auto parsedAsanUseAfterReturn =
1129 if (parsedAsanUseAfterReturn ==
1130 llvm::AsanDetectStackUseAfterReturnMode::Invalid &&
1132 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1133 << Arg->getSpelling() << Arg->getValue();
1135 AsanUseAfterReturn = parsedAsanUseAfterReturn;
1141 SanitizerKind::PointerCompare | SanitizerKind::PointerSubtract;
1142 if ((AllAddedKinds & DetectInvalidPointerPairs & ~AllRemove) &&
1144 TC.
getDriver().
Diag(clang::diag::err_drv_argument_only_allowed_with)
1146 SanitizerKind::PointerCompare |
1147 SanitizerKind::PointerSubtract)
1148 <<
"-fsanitize=address";
1152 if (AllAddedKinds & (SanitizerKind::Address | SanitizerKind::KernelAddress)) {
1153 AsanUseAfterScope = Args.hasFlag(
1154 options::OPT_fsanitize_address_use_after_scope,
1155 options::OPT_fno_sanitize_address_use_after_scope, AsanUseAfterScope);
1157 AsanUseAfterScope =
false;
1160 if (AllAddedKinds & SanitizerKind::HWAddress) {
1161 if (Arg *HwasanAbiArg =
1162 Args.getLastArg(options::OPT_fsanitize_hwaddress_abi_EQ)) {
1163 HwasanAbi = HwasanAbiArg->getValue();
1164 if (HwasanAbi !=
"platform" && HwasanAbi !=
"interceptor" &&
1166 D.
Diag(clang::diag::err_drv_invalid_value)
1167 << HwasanAbiArg->getAsString(Args) << HwasanAbi;
1169 HwasanAbi =
"interceptor";
1171 if (TC.
getTriple().getArch() == llvm::Triple::x86_64)
1172 HwasanUseAliases = Args.hasFlag(
1173 options::OPT_fsanitize_hwaddress_experimental_aliasing,
1174 options::OPT_fno_sanitize_hwaddress_experimental_aliasing,
1178 if (AllAddedKinds & SanitizerKind::SafeStack) {
1184 if (AllAddedKinds & SanitizerKind::AllocToken) {
1185 AllocTokenFastABI = Args.hasFlag(
1186 options::OPT_fsanitize_alloc_token_fast_abi,
1187 options::OPT_fno_sanitize_alloc_token_fast_abi, AllocTokenFastABI);
1188 AllocTokenExtended = Args.hasFlag(
1189 options::OPT_fsanitize_alloc_token_extended,
1190 options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended);
1193 if (AllAddedKinds & SanitizerKind::Type) {
1194 TysanOutlineInstrumentation =
1195 Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation,
1196 options::OPT_fno_sanitize_type_outline_instrumentation,
1197 TysanOutlineInstrumentation);
1200 LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime,
1201 options::OPT_fno_sanitize_link_runtime,
1202 !Args.hasArg(options::OPT_r));
1207 Args.hasFlag(options::OPT_fsanitize_link_cxx_runtime,
1208 options::OPT_fno_sanitize_link_cxx_runtime, LinkCXXRuntimes);
1210 NeedsMemProfRt = Args.hasFlag(options::OPT_fmemory_profile,
1211 options::OPT_fmemory_profile_EQ,
1212 options::OPT_fno_memory_profile,
false);
1215 Sanitizers.Mask |= Kinds;
1216 RecoverableSanitizers.Mask |= RecoverableKinds;
1217 TrapSanitizers.Mask |= TrappingKinds;
1218 assert(!(RecoverableKinds & TrappingKinds) &&
1219 "Overlap between recoverable and trapping sanitizers");
1221 MergeHandlers.Mask |= MergeKinds;
1223 AnnotateDebugInfo.Mask |= AnnotateDebugInfoKinds;
1224 SuppressUBSanFeature.Mask |= IgnoreForUbsanFeature;
1227 SkipHotCutoffs.clear(~Sanitizers.Mask);