399 const llvm::opt::ArgList &Args,
400 bool DiagnoseErrors) {
414 CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso,
415 options::OPT_fno_sanitize_cfi_cross_dso,
false);
422 const llvm::Triple &Triple = TC.
getTriple();
425 Args.hasFlag(options::OPT_fsanitize_minimal_runtime,
426 options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime);
427 HandlerPreserveAllRegs =
428 Args.hasFlag(options::OPT_fsanitize_handler_preserve_all_regs,
429 options::OPT_fno_sanitize_handler_preserve_all_regs,
430 HandlerPreserveAllRegs) &&
431 MinimalRuntime && (Triple.isAArch64() || Triple.isX86_64());
434 Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
435 bool RemoveObjectSizeAtO0 =
436 !OptLevel || OptLevel->getOption().matches(options::OPT_O0);
438 for (
const llvm::opt::Arg *Arg : llvm::reverse(Args)) {
439 if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) {
443 if (RemoveObjectSizeAtO0) {
444 AllRemove |= SanitizerKind::ObjectSize;
448 if ((Add & SanitizerKind::ObjectSize) && DiagnoseErrors)
449 D.
Diag(diag::warn_drv_object_size_disabled_O0)
450 << Arg->getAsString(Args);
461 Add & InvalidTrappingKinds & ~DiagnosedKinds) {
462 if (DiagnoseErrors) {
464 D.
Diag(diag::err_drv_argument_not_allowed_with)
465 << Desc <<
"-fsanitize-trap=undefined";
467 DiagnosedKinds |= KindsToDiagnose;
469 Add &= ~InvalidTrappingKinds;
471 if (MinimalRuntime) {
474 if (DiagnoseErrors) {
476 D.
Diag(diag::err_drv_argument_not_allowed_with)
477 << Desc <<
"-fsanitize-minimal-runtime";
479 DiagnosedKinds |= KindsToDiagnose;
484 if (llvm::opt::Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
485 StringRef CM = A->getValue();
487 (Add & SanitizerKind::Function & ~DiagnosedKinds)) {
489 D.
Diag(diag::err_drv_argument_only_allowed_with)
490 <<
"-fsanitize=function"
493 DiagnosedKinds |= SanitizerKind::Function;
502 if (DiagnoseErrors) {
504 llvm::opt::Arg *A = Args.getLastArgNoClaim(
505 options::OPT_mexecute_only, options::OPT_mno_execute_only);
506 if (A && A->getOption().matches(options::OPT_mexecute_only))
507 D.
Diag(diag::err_drv_argument_not_allowed_with)
508 << Desc << A->getAsString(Args);
510 D.
Diag(diag::err_drv_unsupported_opt_for_target)
511 << Desc << Triple.str();
513 DiagnosedKinds |= KindsToDiagnose;
528 if (CfiCrossDso && (Add & SanitizerKind::CFIMFCall & ~DiagnosedKinds)) {
530 D.
Diag(diag::err_drv_argument_not_allowed_with)
531 <<
"-fsanitize=cfi-mfcall"
532 <<
"-fsanitize-cfi-cross-dso";
534 DiagnosedKinds |= SanitizerKind::CFIMFCall;
537 if (
SanitizerMask KindsToDiagnose = Add & ~Supported & ~DiagnosedKinds) {
538 if (DiagnoseErrors) {
540 D.
Diag(diag::err_drv_unsupported_opt_for_target)
543 DiagnosedKinds |= KindsToDiagnose;
551 if (
const llvm::opt::Arg *NoRTTIArg = TC.
getRTTIArg()) {
552 assert(NoRTTIArg->getOption().matches(options::OPT_fno_rtti) &&
553 "RTTI disabled without -fno-rtti option?");
557 D.
Diag(diag::err_drv_argument_not_allowed_with)
558 <<
"-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
563 D.
Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
567 AllRemove |= SanitizerKind::Vptr;
575 Add &= ~InvalidTrappingKinds;
576 if (MinimalRuntime) {
587 if (Add & SanitizerKind::UndefinedGroup) {
588 bool S = Args.hasFlagNoClaim(options::OPT_fno_strict_overflow,
589 options::OPT_fstrict_overflow,
false);
590 if (Args.hasFlagNoClaim(options::OPT_fwrapv, options::OPT_fno_wrapv, S))
592 if (Args.hasFlagNoClaim(options::OPT_fwrapv_pointer,
593 options::OPT_fno_wrapv_pointer, S))
598 if (Add & SanitizerKind::Fuzzer)
599 Add |= SanitizerKind::FuzzerNoLink;
602 if (Add & SanitizerKind::FuzzerNoLink) {
611 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_EQ)) {
618 std::pair<SanitizerMask, SanitizerMask> IncompatibleGroups[] = {
619 std::make_pair(SanitizerKind::Address,
620 SanitizerKind::Thread | SanitizerKind::Memory),
621 std::make_pair(SanitizerKind::Type,
622 SanitizerKind::Address | SanitizerKind::KernelAddress |
623 SanitizerKind::Memory | SanitizerKind::Leak |
624 SanitizerKind::Thread | SanitizerKind::KernelAddress),
625 std::make_pair(SanitizerKind::Thread, SanitizerKind::Memory),
626 std::make_pair(SanitizerKind::Leak,
627 SanitizerKind::Thread | SanitizerKind::Memory),
628 std::make_pair(SanitizerKind::KernelAddress,
629 SanitizerKind::Address | SanitizerKind::Leak |
630 SanitizerKind::Thread | SanitizerKind::Memory),
631 std::make_pair(SanitizerKind::HWAddress,
632 SanitizerKind::Address | SanitizerKind::Thread |
633 SanitizerKind::Memory | SanitizerKind::KernelAddress),
634 std::make_pair(SanitizerKind::Scudo,
635 SanitizerKind::Address | SanitizerKind::HWAddress |
636 SanitizerKind::Leak | SanitizerKind::Thread |
637 SanitizerKind::Memory | SanitizerKind::KernelAddress),
638 std::make_pair(SanitizerKind::SafeStack,
640 : SanitizerKind::Leak) |
641 SanitizerKind::Address | SanitizerKind::HWAddress |
642 SanitizerKind::Thread | SanitizerKind::Memory |
643 SanitizerKind::KernelAddress),
644 std::make_pair(SanitizerKind::KernelHWAddress,
645 SanitizerKind::Address | SanitizerKind::HWAddress |
646 SanitizerKind::Leak | SanitizerKind::Thread |
647 SanitizerKind::Memory | SanitizerKind::KernelAddress |
648 SanitizerKind::SafeStack),
649 std::make_pair(SanitizerKind::KernelMemory,
650 SanitizerKind::Address | SanitizerKind::HWAddress |
651 SanitizerKind::Leak | SanitizerKind::Thread |
652 SanitizerKind::Memory | SanitizerKind::KernelAddress |
653 SanitizerKind::Scudo | SanitizerKind::SafeStack),
654 std::make_pair(SanitizerKind::MemTag, SanitizerKind::Address |
655 SanitizerKind::KernelAddress |
656 SanitizerKind::HWAddress |
657 SanitizerKind::KernelHWAddress),
658 std::make_pair(SanitizerKind::KCFI, SanitizerKind::Function),
659 std::make_pair(SanitizerKind::Realtime,
660 SanitizerKind::Address | SanitizerKind::Thread |
661 SanitizerKind::Undefined | SanitizerKind::Memory),
662 std::make_pair(SanitizerKind::AllocToken,
663 SanitizerKind::Address | SanitizerKind::HWAddress |
664 SanitizerKind::KernelAddress |
665 SanitizerKind::KernelHWAddress |
666 SanitizerKind::Memory)};
673 for (
auto G : IncompatibleGroups) {
675 if ((
Default & Group) && (Kinds & G.second))
689 D.
Diag(diag::err_drv_argument_only_allowed_with)
693 if ((Kinds & SanitizerKind::ShadowCallStack) && TC.
getTriple().isAArch64() &&
694 !llvm::AArch64::isX18ReservedByDefault(TC.
getTriple()) &&
695 !Args.hasArg(options::OPT_ffixed_x18) && DiagnoseErrors) {
696 D.
Diag(diag::err_drv_argument_only_allowed_with)
705 if (~Supported & SanitizerKind::Vptr) {
711 if (KindsToDiagnose) {
713 S.
Mask = KindsToDiagnose;
715 D.
Diag(diag::err_drv_unsupported_opt_for_target)
717 Kinds &= ~KindsToDiagnose;
722 for (
auto G : IncompatibleGroups) {
727 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
743 options::OPT_fno_sanitize_recover_EQ);
744 RecoverableKinds &= Kinds;
746 TrappingKinds &= Kinds;
747 RecoverableKinds &= ~TrappingKinds;
752 options::OPT_fsanitize_merge_handlers_EQ,
753 options::OPT_fno_sanitize_merge_handlers_EQ);
762 {}, options::OPT_fsanitize_annotate_debug_info_EQ,
763 options::OPT_fno_sanitize_annotate_debug_info_EQ);
764 AnnotateDebugInfoKinds &= Kinds;
769 if (!Args.hasArgNoClaim(options::OPT_fno_sanitize_ignorelist))
775 D, Args, UserIgnorelistFiles, options::OPT_fsanitize_ignorelist_EQ,
776 options::OPT_fno_sanitize_ignorelist,
777 clang::diag::err_drv_malformed_sanitizer_ignorelist, DiagnoseErrors);
780 if (Arg *A = Args.getLastArg(
781 options::OPT_fsanitize_coverage_stack_depth_callback_min_EQ)) {
782 StringRef S = A->getValue();
783 if (S.getAsInteger(0, CoverageStackDepthCallbackMin) ||
784 CoverageStackDepthCallbackMin < 0) {
786 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
791 if (AllAddedKinds & SanitizerKind::Memory) {
793 Args.getLastArg(options::OPT_fsanitize_memory_track_origins_EQ,
794 options::OPT_fno_sanitize_memory_track_origins)) {
795 if (!A->getOption().matches(
796 options::OPT_fno_sanitize_memory_track_origins)) {
797 StringRef S = A->getValue();
798 if (S.getAsInteger(0, MsanTrackOrigins) || MsanTrackOrigins < 0 ||
799 MsanTrackOrigins > 2) {
801 D.
Diag(clang::diag::err_drv_invalid_value)
802 << A->getAsString(Args) << S;
806 MsanUseAfterDtor = Args.hasFlag(
807 options::OPT_fsanitize_memory_use_after_dtor,
808 options::OPT_fno_sanitize_memory_use_after_dtor, MsanUseAfterDtor);
809 MsanParamRetval = Args.hasFlag(
810 options::OPT_fsanitize_memory_param_retval,
811 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
812 }
else if (AllAddedKinds & SanitizerKind::KernelMemory) {
813 MsanUseAfterDtor =
false;
814 MsanParamRetval = Args.hasFlag(
815 options::OPT_fsanitize_memory_param_retval,
816 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
818 MsanUseAfterDtor =
false;
819 MsanParamRetval =
false;
822 if (AllAddedKinds & SanitizerKind::MemTag) {
824 Args.getLastArgValue(options::OPT_fsanitize_memtag_mode_EQ,
"sync");
825 if (S ==
"async" || S ==
"sync") {
826 MemtagMode = S.str();
828 D.
Diag(clang::diag::err_drv_invalid_value_with_suggestion)
829 <<
"-fsanitize-memtag-mode=" << S <<
"{async, sync}";
834 if (AllAddedKinds & SanitizerKind::Thread) {
835 TsanMemoryAccess = Args.hasFlag(
836 options::OPT_fsanitize_thread_memory_access,
837 options::OPT_fno_sanitize_thread_memory_access, TsanMemoryAccess);
838 TsanFuncEntryExit = Args.hasFlag(
839 options::OPT_fsanitize_thread_func_entry_exit,
840 options::OPT_fno_sanitize_thread_func_entry_exit, TsanFuncEntryExit);
842 Args.hasFlag(options::OPT_fsanitize_thread_atomics,
843 options::OPT_fno_sanitize_thread_atomics, TsanAtomics);
846 if (AllAddedKinds & SanitizerKind::CFI) {
849 NeedPIE |= CfiCrossDso;
850 CfiICallGeneralizePointers =
851 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
853 CfiICallNormalizeIntegers =
854 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
856 if (CfiCrossDso && CfiICallGeneralizePointers && DiagnoseErrors)
857 D.
Diag(diag::err_drv_argument_not_allowed_with)
858 <<
"-fsanitize-cfi-cross-dso"
859 <<
"-fsanitize-cfi-icall-generalize-pointers";
861 CfiCanonicalJumpTables =
862 Args.hasFlag(options::OPT_fsanitize_cfi_canonical_jump_tables,
863 options::OPT_fno_sanitize_cfi_canonical_jump_tables,
true);
866 if (AllAddedKinds & SanitizerKind::KCFI) {
867 CfiICallGeneralizePointers =
868 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
869 CfiICallNormalizeIntegers =
870 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
872 KcfiArity = Args.hasArg(options::OPT_fsanitize_kcfi_arity);
874 if (AllAddedKinds & SanitizerKind::CFI && DiagnoseErrors)
875 D.
Diag(diag::err_drv_argument_not_allowed_with)
880 Stats = Args.hasFlag(options::OPT_fsanitize_stats,
881 options::OPT_fno_sanitize_stats,
false);
883 if (MinimalRuntime) {
886 if (IncompatibleMask && DiagnoseErrors)
887 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
888 <<
"-fsanitize-minimal-runtime"
892 for (
const auto *Arg : Args.filtered(
893 options::OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
895 OverflowPatternExclusions |=
901 for (
const auto *Arg : Args) {
902 if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) {
903 int LegacySanitizeCoverage;
904 if (Arg->getNumValues() == 1 &&
905 !StringRef(Arg->getValue(0))
906 .getAsInteger(0, LegacySanitizeCoverage)) {
907 CoverageFeatures = 0;
909 if (LegacySanitizeCoverage != 0 && DiagnoseErrors) {
910 D.
Diag(diag::warn_drv_deprecated_arg)
911 << Arg->getAsString(Args) <<
true
912 <<
"-fsanitize-coverage=trace-pc-guard";
923 CoverageFeatures = 0;
925 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_coverage)) {
931 if (DiagnoseErrors) {
933 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
934 <<
"-fsanitize-coverage=func"
935 <<
"-fsanitize-coverage=bb";
937 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
938 <<
"-fsanitize-coverage=func"
939 <<
"-fsanitize-coverage=edge";
941 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
942 <<
"-fsanitize-coverage=bb"
943 <<
"-fsanitize-coverage=edge";
947 D.
Diag(clang::diag::warn_drv_deprecated_arg)
948 <<
"-fsanitize-coverage=trace-bb" <<
true
949 <<
"-fsanitize-coverage=trace-pc-guard";
951 D.
Diag(clang::diag::warn_drv_deprecated_arg)
952 <<
"-fsanitize-coverage=8bit-counters" <<
true
953 <<
"-fsanitize-coverage=trace-pc-guard";
961 if ((CoverageFeatures & InsertionPointTypes) &&
962 !(CoverageFeatures & InstrumentationTypes) && DiagnoseErrors) {
963 D.
Diag(clang::diag::warn_drv_deprecated_arg)
964 <<
"-fsanitize-coverage=[func|bb|edge]" <<
true
965 <<
"-fsanitize-coverage=[func|bb|edge],[trace-pc-guard|trace-pc],["
970 if (!(CoverageFeatures & InsertionPointTypes)) {
971 if (CoverageFeatures &
984 if (CoverageFeatures) {
986 D, Args, CoverageAllowlistFiles,
987 options::OPT_fsanitize_coverage_allowlist, OptSpecifier(),
988 clang::diag::err_drv_malformed_sanitizer_coverage_allowlist,
991 D, Args, CoverageIgnorelistFiles,
992 options::OPT_fsanitize_coverage_ignorelist, OptSpecifier(),
993 clang::diag::err_drv_malformed_sanitizer_coverage_ignorelist,
998 for (
const auto *Arg :
999 Args.filtered(options::OPT_fexperimental_sanitize_metadata_EQ,
1000 options::OPT_fno_experimental_sanitize_metadata_EQ)) {
1001 if (Arg->getOption().matches(
1002 options::OPT_fexperimental_sanitize_metadata_EQ)) {
1004 BinaryMetadataFeatures |=
1008 BinaryMetadataFeatures &=
1014 if (BinaryMetadataFeatures) {
1016 D, Args, BinaryMetadataIgnorelistFiles,
1017 options::OPT_fexperimental_sanitize_metadata_ignorelist_EQ,
1019 clang::diag::err_drv_malformed_sanitizer_metadata_ignorelist,
1023 SharedRuntime = Args.hasFlag(
1024 options::OPT_shared_libsan, options::OPT_static_libsan,
1027 if (!SharedRuntime && TC.
getTriple().isOSWindows()) {
1029 Args.getLastArg(options::OPT_shared_libsan, options::OPT_static_libsan);
1030 D.
Diag(clang::diag::err_drv_unsupported_opt_for_target)
1031 << A->getSpelling() << TC.
getTriple().str();
1034 ImplicitCfiRuntime = TC.
getTriple().isAndroid();
1036 if (AllAddedKinds & SanitizerKind::Address) {
1037 NeedPIE |= TC.
getTriple().isOSFuchsia();
1039 Args.getLastArg(options::OPT_fsanitize_address_field_padding)) {
1040 StringRef S = A->getValue();
1042 if ((S.getAsInteger(0, AsanFieldPadding) || AsanFieldPadding < 0 ||
1043 AsanFieldPadding > 2) &&
1045 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1049 if (Arg *WindowsDebugRTArg =
1050 Args.getLastArg(options::OPT__SLASH_MTd, options::OPT__SLASH_MT,
1051 options::OPT__SLASH_MDd, options::OPT__SLASH_MD,
1052 options::OPT__SLASH_LDd, options::OPT__SLASH_LD)) {
1053 switch (WindowsDebugRTArg->getOption().getID()) {
1054 case options::OPT__SLASH_MTd:
1055 case options::OPT__SLASH_MDd:
1056 case options::OPT__SLASH_LDd:
1057 if (DiagnoseErrors) {
1058 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1059 << WindowsDebugRTArg->getAsString(Args)
1061 D.
Diag(clang::diag::note_drv_address_sanitizer_debug_runtime);
1066 StableABI = Args.hasFlag(options::OPT_fsanitize_stable_abi,
1067 options::OPT_fno_sanitize_stable_abi,
false);
1069 AsanPoisonCustomArrayCookie = Args.hasFlag(
1070 options::OPT_fsanitize_address_poison_custom_array_cookie,
1071 options::OPT_fno_sanitize_address_poison_custom_array_cookie,
1072 AsanPoisonCustomArrayCookie);
1074 AsanOutlineInstrumentation =
1075 Args.hasFlag(options::OPT_fsanitize_address_outline_instrumentation,
1076 options::OPT_fno_sanitize_address_outline_instrumentation,
1077 AsanOutlineInstrumentation);
1079 AsanGlobalsDeadStripping = Args.hasFlag(
1080 options::OPT_fsanitize_address_globals_dead_stripping,
1081 options::OPT_fno_sanitize_address_globals_dead_stripping,
true);
1087 AsanUseOdrIndicator =
1088 Args.hasFlag(options::OPT_fsanitize_address_use_odr_indicator,
1089 options::OPT_fno_sanitize_address_use_odr_indicator,
1092 if (AllAddedKinds & SanitizerKind::PointerCompare & ~AllRemove) {
1093 AsanInvalidPointerCmp =
true;
1096 if (AllAddedKinds & SanitizerKind::PointerSubtract & ~AllRemove) {
1097 AsanInvalidPointerSub =
true;
1101 (Args.hasArg(options::OPT_mkernel) ||
1102 Args.hasArg(options::OPT_fapple_kext))) {
1103 AsanDtorKind = llvm::AsanDtorKind::None;
1106 if (
const auto *Arg =
1107 Args.getLastArg(options::OPT_sanitize_address_destructor_EQ)) {
1109 if (parsedAsanDtorKind == llvm::AsanDtorKind::Invalid && DiagnoseErrors) {
1110 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1111 << Arg->getSpelling() << Arg->getValue();
1113 AsanDtorKind = parsedAsanDtorKind;
1116 if (
const auto *Arg = Args.getLastArg(
1117 options::OPT_sanitize_address_use_after_return_EQ)) {
1118 auto parsedAsanUseAfterReturn =
1120 if (parsedAsanUseAfterReturn ==
1121 llvm::AsanDetectStackUseAfterReturnMode::Invalid &&
1123 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1124 << Arg->getSpelling() << Arg->getValue();
1126 AsanUseAfterReturn = parsedAsanUseAfterReturn;
1132 SanitizerKind::PointerCompare | SanitizerKind::PointerSubtract;
1133 if ((AllAddedKinds & DetectInvalidPointerPairs & ~AllRemove) &&
1135 TC.
getDriver().
Diag(clang::diag::err_drv_argument_only_allowed_with)
1137 SanitizerKind::PointerCompare |
1138 SanitizerKind::PointerSubtract)
1139 <<
"-fsanitize=address";
1143 if (AllAddedKinds & (SanitizerKind::Address | SanitizerKind::KernelAddress)) {
1144 AsanUseAfterScope = Args.hasFlag(
1145 options::OPT_fsanitize_address_use_after_scope,
1146 options::OPT_fno_sanitize_address_use_after_scope, AsanUseAfterScope);
1148 AsanUseAfterScope =
false;
1151 if (AllAddedKinds & SanitizerKind::HWAddress) {
1152 if (Arg *HwasanAbiArg =
1153 Args.getLastArg(options::OPT_fsanitize_hwaddress_abi_EQ)) {
1154 HwasanAbi = HwasanAbiArg->getValue();
1155 if (HwasanAbi !=
"platform" && HwasanAbi !=
"interceptor" &&
1157 D.
Diag(clang::diag::err_drv_invalid_value)
1158 << HwasanAbiArg->getAsString(Args) << HwasanAbi;
1160 HwasanAbi =
"interceptor";
1162 if (TC.
getTriple().getArch() == llvm::Triple::x86_64)
1163 HwasanUseAliases = Args.hasFlag(
1164 options::OPT_fsanitize_hwaddress_experimental_aliasing,
1165 options::OPT_fno_sanitize_hwaddress_experimental_aliasing,
1169 if (AllAddedKinds & SanitizerKind::SafeStack) {
1175 if (AllAddedKinds & SanitizerKind::AllocToken) {
1176 AllocTokenFastABI = Args.hasFlag(
1177 options::OPT_fsanitize_alloc_token_fast_abi,
1178 options::OPT_fno_sanitize_alloc_token_fast_abi, AllocTokenFastABI);
1179 AllocTokenExtended = Args.hasFlag(
1180 options::OPT_fsanitize_alloc_token_extended,
1181 options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended);
1184 if (AllAddedKinds & SanitizerKind::Type) {
1185 TysanOutlineInstrumentation =
1186 Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation,
1187 options::OPT_fno_sanitize_type_outline_instrumentation,
1188 TysanOutlineInstrumentation);
1191 LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime,
1192 options::OPT_fno_sanitize_link_runtime,
1193 !Args.hasArg(options::OPT_r));
1198 Args.hasFlag(options::OPT_fsanitize_link_cxx_runtime,
1199 options::OPT_fno_sanitize_link_cxx_runtime, LinkCXXRuntimes);
1201 NeedsMemProfRt = Args.hasFlag(options::OPT_fmemory_profile,
1202 options::OPT_fmemory_profile_EQ,
1203 options::OPT_fno_memory_profile,
false);
1206 Sanitizers.Mask |= Kinds;
1207 RecoverableSanitizers.Mask |= RecoverableKinds;
1208 TrapSanitizers.Mask |= TrappingKinds;
1209 assert(!(RecoverableKinds & TrappingKinds) &&
1210 "Overlap between recoverable and trapping sanitizers");
1212 MergeHandlers.Mask |= MergeKinds;
1214 AnnotateDebugInfo.Mask |= AnnotateDebugInfoKinds;
1217 SkipHotCutoffs.clear(~Sanitizers.Mask);