400 const llvm::opt::ArgList &Args,
401 bool DiagnoseErrors) {
417 CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso,
418 options::OPT_fno_sanitize_cfi_cross_dso,
false);
425 const llvm::Triple &Triple = TC.
getTriple();
428 Args.hasFlag(options::OPT_fsanitize_minimal_runtime,
429 options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime);
430 HandlerPreserveAllRegs =
431 Args.hasFlag(options::OPT_fsanitize_handler_preserve_all_regs,
432 options::OPT_fno_sanitize_handler_preserve_all_regs,
433 HandlerPreserveAllRegs) &&
434 MinimalRuntime && (Triple.isAArch64() || Triple.isX86_64());
435 TrapLoop = Args.hasFlag(options::OPT_fsanitize_trap_loop,
436 options::OPT_fno_sanitize_trap_loop,
false);
439 Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
440 bool RemoveObjectSizeAtO0 =
441 !OptLevel || OptLevel->getOption().matches(options::OPT_O0);
443 for (
const llvm::opt::Arg *Arg : llvm::reverse(Args)) {
444 if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) {
448 if (RemoveObjectSizeAtO0) {
449 AllRemove |= SanitizerKind::ObjectSize;
453 if ((Add & SanitizerKind::ObjectSize) && DiagnoseErrors)
454 D.
Diag(diag::warn_drv_object_size_disabled_O0)
455 << Arg->getAsString(Args);
466 Add & InvalidTrappingKinds & ~DiagnosedKinds) {
467 if (DiagnoseErrors) {
469 D.
Diag(diag::err_drv_argument_not_allowed_with)
470 << Desc <<
"-fsanitize-trap=undefined";
472 DiagnosedKinds |= KindsToDiagnose;
474 Add &= ~InvalidTrappingKinds;
476 if (MinimalRuntime) {
479 if (DiagnoseErrors) {
481 D.
Diag(diag::err_drv_argument_not_allowed_with)
482 << Desc <<
"-fsanitize-minimal-runtime";
484 DiagnosedKinds |= KindsToDiagnose;
489 if (llvm::opt::Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
490 StringRef CM = A->getValue();
492 (Add & SanitizerKind::Function & ~DiagnosedKinds)) {
494 D.
Diag(diag::err_drv_argument_only_allowed_with)
495 <<
"-fsanitize=function"
498 DiagnosedKinds |= SanitizerKind::Function;
507 if (DiagnoseErrors) {
509 llvm::opt::Arg *A = Args.getLastArgNoClaim(
510 options::OPT_mexecute_only, options::OPT_mno_execute_only);
511 if (A && A->getOption().matches(options::OPT_mexecute_only))
512 D.
Diag(diag::err_drv_argument_not_allowed_with)
513 << Desc << A->getAsString(Args);
515 D.
Diag(diag::err_drv_unsupported_opt_for_target)
516 << Desc << Triple.str();
518 DiagnosedKinds |= KindsToDiagnose;
533 if (CfiCrossDso && (Add & SanitizerKind::CFIMFCall & ~DiagnosedKinds)) {
535 D.
Diag(diag::err_drv_argument_not_allowed_with)
536 <<
"-fsanitize=cfi-mfcall"
537 <<
"-fsanitize-cfi-cross-dso";
539 DiagnosedKinds |= SanitizerKind::CFIMFCall;
542 if (
SanitizerMask KindsToDiagnose = Add & ~Supported & ~DiagnosedKinds) {
543 if (DiagnoseErrors) {
545 D.
Diag(diag::err_drv_unsupported_opt_for_target)
548 DiagnosedKinds |= KindsToDiagnose;
556 if (
const llvm::opt::Arg *NoRTTIArg = TC.
getRTTIArg()) {
557 assert(NoRTTIArg->getOption().matches(options::OPT_fno_rtti) &&
558 "RTTI disabled without -fno-rtti option?");
562 D.
Diag(diag::err_drv_argument_not_allowed_with)
563 <<
"-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
568 D.
Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
572 AllRemove |= SanitizerKind::Vptr;
580 Add &= ~InvalidTrappingKinds;
581 if (MinimalRuntime) {
592 if (Add & SanitizerKind::UndefinedGroup) {
593 bool S = Args.hasFlagNoClaim(options::OPT_fno_strict_overflow,
594 options::OPT_fstrict_overflow,
false);
595 if (Args.hasFlagNoClaim(options::OPT_fwrapv, options::OPT_fno_wrapv, S))
597 if (Args.hasFlagNoClaim(options::OPT_fwrapv_pointer,
598 options::OPT_fno_wrapv_pointer, S))
603 if (Add & SanitizerKind::Fuzzer)
604 Add |= SanitizerKind::FuzzerNoLink;
607 if (Add & SanitizerKind::FuzzerNoLink) {
616 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_EQ)) {
620 }
else if (Arg->getOption().matches(
621 options::OPT_fsanitize_ignore_for_ubsan_feature_EQ)) {
623 IgnoreForUbsanFeature |=
628 std::pair<SanitizerMask, SanitizerMask> IncompatibleGroups[] = {
629 std::make_pair(SanitizerKind::Address,
630 SanitizerKind::Thread | SanitizerKind::Memory),
631 std::make_pair(SanitizerKind::Type,
632 SanitizerKind::Address | SanitizerKind::KernelAddress |
633 SanitizerKind::Memory | SanitizerKind::Leak |
634 SanitizerKind::Thread | SanitizerKind::KernelAddress),
635 std::make_pair(SanitizerKind::Thread, SanitizerKind::Memory),
636 std::make_pair(SanitizerKind::Leak,
637 SanitizerKind::Thread | SanitizerKind::Memory),
638 std::make_pair(SanitizerKind::KernelAddress,
639 SanitizerKind::Address | SanitizerKind::Leak |
640 SanitizerKind::Thread | SanitizerKind::Memory),
641 std::make_pair(SanitizerKind::HWAddress,
642 SanitizerKind::Address | SanitizerKind::Thread |
643 SanitizerKind::Memory | SanitizerKind::KernelAddress),
644 std::make_pair(SanitizerKind::Scudo,
645 SanitizerKind::Address | SanitizerKind::HWAddress |
646 SanitizerKind::Leak | SanitizerKind::Thread |
647 SanitizerKind::Memory | SanitizerKind::KernelAddress),
648 std::make_pair(SanitizerKind::SafeStack,
650 : SanitizerKind::Leak) |
651 SanitizerKind::Address | SanitizerKind::HWAddress |
652 SanitizerKind::Thread | SanitizerKind::Memory |
653 SanitizerKind::KernelAddress),
654 std::make_pair(SanitizerKind::KernelHWAddress,
655 SanitizerKind::Address | SanitizerKind::HWAddress |
656 SanitizerKind::Leak | SanitizerKind::Thread |
657 SanitizerKind::Memory | SanitizerKind::KernelAddress |
658 SanitizerKind::SafeStack),
659 std::make_pair(SanitizerKind::KernelMemory,
660 SanitizerKind::Address | SanitizerKind::HWAddress |
661 SanitizerKind::Leak | SanitizerKind::Thread |
662 SanitizerKind::Memory | SanitizerKind::KernelAddress |
663 SanitizerKind::Scudo | SanitizerKind::SafeStack),
664 std::make_pair(SanitizerKind::MemTag, SanitizerKind::Address |
665 SanitizerKind::KernelAddress |
666 SanitizerKind::HWAddress |
667 SanitizerKind::KernelHWAddress),
668 std::make_pair(SanitizerKind::KCFI, SanitizerKind::Function),
669 std::make_pair(SanitizerKind::Realtime,
670 SanitizerKind::Address | SanitizerKind::Thread |
671 SanitizerKind::Undefined | SanitizerKind::Memory),
672 std::make_pair(SanitizerKind::AllocToken,
673 SanitizerKind::Address | SanitizerKind::HWAddress |
674 SanitizerKind::KernelAddress |
675 SanitizerKind::KernelHWAddress |
676 SanitizerKind::Memory)};
683 for (
auto G : IncompatibleGroups) {
685 if ((
Default & Group) && (Kinds & G.second))
699 D.
Diag(diag::err_drv_argument_only_allowed_with)
703 if ((Kinds & SanitizerKind::ShadowCallStack) && TC.
getTriple().isAArch64() &&
704 !llvm::AArch64::isX18ReservedByDefault(TC.
getTriple()) &&
705 !Args.hasArg(options::OPT_ffixed_x18) && DiagnoseErrors) {
706 D.
Diag(diag::err_drv_argument_only_allowed_with)
715 if (~Supported & SanitizerKind::Vptr) {
721 if (KindsToDiagnose) {
723 S.
Mask = KindsToDiagnose;
725 D.
Diag(diag::err_drv_unsupported_opt_for_target)
727 Kinds &= ~KindsToDiagnose;
732 for (
auto G : IncompatibleGroups) {
737 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
753 options::OPT_fno_sanitize_recover_EQ);
754 RecoverableKinds &= Kinds;
756 TrappingKinds &= Kinds;
757 RecoverableKinds &= ~TrappingKinds;
762 options::OPT_fsanitize_merge_handlers_EQ,
763 options::OPT_fno_sanitize_merge_handlers_EQ);
772 {}, options::OPT_fsanitize_annotate_debug_info_EQ,
773 options::OPT_fno_sanitize_annotate_debug_info_EQ);
774 AnnotateDebugInfoKinds &= Kinds;
779 if (!Args.hasArgNoClaim(options::OPT_fno_sanitize_ignorelist))
785 D, Args, UserIgnorelistFiles, options::OPT_fsanitize_ignorelist_EQ,
786 options::OPT_fno_sanitize_ignorelist,
787 clang::diag::err_drv_malformed_sanitizer_ignorelist, DiagnoseErrors);
790 if (Arg *A = Args.getLastArg(
791 options::OPT_fsanitize_coverage_stack_depth_callback_min_EQ)) {
792 StringRef S = A->getValue();
793 if (S.getAsInteger(0, CoverageStackDepthCallbackMin) ||
794 CoverageStackDepthCallbackMin < 0) {
796 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
801 if (AllAddedKinds & SanitizerKind::Memory) {
803 Args.getLastArg(options::OPT_fsanitize_memory_track_origins_EQ,
804 options::OPT_fno_sanitize_memory_track_origins)) {
805 if (!A->getOption().matches(
806 options::OPT_fno_sanitize_memory_track_origins)) {
807 StringRef S = A->getValue();
808 if (S.getAsInteger(0, MsanTrackOrigins) || MsanTrackOrigins < 0 ||
809 MsanTrackOrigins > 2) {
811 D.
Diag(clang::diag::err_drv_invalid_value)
812 << A->getAsString(Args) << S;
816 MsanUseAfterDtor = Args.hasFlag(
817 options::OPT_fsanitize_memory_use_after_dtor,
818 options::OPT_fno_sanitize_memory_use_after_dtor, MsanUseAfterDtor);
819 MsanParamRetval = Args.hasFlag(
820 options::OPT_fsanitize_memory_param_retval,
821 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
822 }
else if (AllAddedKinds & SanitizerKind::KernelMemory) {
823 MsanUseAfterDtor =
false;
824 MsanParamRetval = Args.hasFlag(
825 options::OPT_fsanitize_memory_param_retval,
826 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
828 MsanUseAfterDtor =
false;
829 MsanParamRetval =
false;
832 if (AllAddedKinds & SanitizerKind::MemTag) {
834 Args.getLastArgValue(options::OPT_fsanitize_memtag_mode_EQ,
"sync");
835 if (S ==
"async" || S ==
"sync") {
836 MemtagMode = S.str();
838 D.
Diag(clang::diag::err_drv_invalid_value_with_suggestion)
839 <<
"-fsanitize-memtag-mode=" << S <<
"{async, sync}";
844 if (AllAddedKinds & SanitizerKind::Thread) {
845 TsanMemoryAccess = Args.hasFlag(
846 options::OPT_fsanitize_thread_memory_access,
847 options::OPT_fno_sanitize_thread_memory_access, TsanMemoryAccess);
848 TsanFuncEntryExit = Args.hasFlag(
849 options::OPT_fsanitize_thread_func_entry_exit,
850 options::OPT_fno_sanitize_thread_func_entry_exit, TsanFuncEntryExit);
852 Args.hasFlag(options::OPT_fsanitize_thread_atomics,
853 options::OPT_fno_sanitize_thread_atomics, TsanAtomics);
856 if (AllAddedKinds & SanitizerKind::CFI) {
859 NeedPIE |= CfiCrossDso;
860 CfiICallGeneralizePointers =
861 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
863 CfiICallNormalizeIntegers =
864 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
866 if (CfiCrossDso && CfiICallGeneralizePointers && DiagnoseErrors)
867 D.
Diag(diag::err_drv_argument_not_allowed_with)
868 <<
"-fsanitize-cfi-cross-dso"
869 <<
"-fsanitize-cfi-icall-generalize-pointers";
871 CfiCanonicalJumpTables =
872 Args.hasFlag(options::OPT_fsanitize_cfi_canonical_jump_tables,
873 options::OPT_fno_sanitize_cfi_canonical_jump_tables,
true);
876 if (AllAddedKinds & SanitizerKind::KCFI) {
877 CfiICallGeneralizePointers =
878 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
879 CfiICallNormalizeIntegers =
880 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
882 KcfiArity = Args.hasArg(options::OPT_fsanitize_kcfi_arity);
884 if (AllAddedKinds & SanitizerKind::CFI && DiagnoseErrors)
885 D.
Diag(diag::err_drv_argument_not_allowed_with)
890 Stats = Args.hasFlag(options::OPT_fsanitize_stats,
891 options::OPT_fno_sanitize_stats,
false);
893 if (MinimalRuntime) {
896 if (IncompatibleMask && DiagnoseErrors)
897 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
898 <<
"-fsanitize-minimal-runtime"
902 for (
const auto *Arg : Args.filtered(
903 options::OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
905 OverflowPatternExclusions |=
911 for (
const auto *Arg : Args) {
912 if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) {
913 int LegacySanitizeCoverage;
914 if (Arg->getNumValues() == 1 &&
915 !StringRef(Arg->getValue(0))
916 .getAsInteger(0, LegacySanitizeCoverage)) {
917 CoverageFeatures = 0;
919 if (LegacySanitizeCoverage != 0 && DiagnoseErrors) {
920 D.
Diag(diag::warn_drv_deprecated_arg)
921 << Arg->getAsString(Args) <<
true
922 <<
"-fsanitize-coverage=trace-pc-guard";
933 CoverageFeatures = 0;
935 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_coverage)) {
941 if (DiagnoseErrors) {
943 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
944 <<
"-fsanitize-coverage=func"
945 <<
"-fsanitize-coverage=bb";
947 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
948 <<
"-fsanitize-coverage=func"
949 <<
"-fsanitize-coverage=edge";
951 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
952 <<
"-fsanitize-coverage=bb"
953 <<
"-fsanitize-coverage=edge";
957 D.
Diag(clang::diag::warn_drv_deprecated_arg)
958 <<
"-fsanitize-coverage=trace-bb" <<
true
959 <<
"-fsanitize-coverage=trace-pc-guard";
961 D.
Diag(clang::diag::warn_drv_deprecated_arg)
962 <<
"-fsanitize-coverage=8bit-counters" <<
true
963 <<
"-fsanitize-coverage=trace-pc-guard";
971 if ((CoverageFeatures & InsertionPointTypes) &&
972 !(CoverageFeatures & InstrumentationTypes) && DiagnoseErrors) {
973 D.
Diag(clang::diag::warn_drv_deprecated_arg)
974 <<
"-fsanitize-coverage=[func|bb|edge]" <<
true
975 <<
"-fsanitize-coverage=[func|bb|edge],[trace-pc-guard|trace-pc],["
980 if (!(CoverageFeatures & InsertionPointTypes)) {
994 if (CoverageFeatures) {
996 D, Args, CoverageAllowlistFiles,
997 options::OPT_fsanitize_coverage_allowlist, OptSpecifier(),
998 clang::diag::err_drv_malformed_sanitizer_coverage_allowlist,
1001 D, Args, CoverageIgnorelistFiles,
1002 options::OPT_fsanitize_coverage_ignorelist, OptSpecifier(),
1003 clang::diag::err_drv_malformed_sanitizer_coverage_ignorelist,
1008 for (
const auto *Arg :
1009 Args.filtered(options::OPT_fexperimental_sanitize_metadata_EQ,
1010 options::OPT_fno_experimental_sanitize_metadata_EQ)) {
1011 if (Arg->getOption().matches(
1012 options::OPT_fexperimental_sanitize_metadata_EQ)) {
1014 BinaryMetadataFeatures |=
1018 BinaryMetadataFeatures &=
1024 if (BinaryMetadataFeatures) {
1026 D, Args, BinaryMetadataIgnorelistFiles,
1027 options::OPT_fexperimental_sanitize_metadata_ignorelist_EQ,
1029 clang::diag::err_drv_malformed_sanitizer_metadata_ignorelist,
1033 SharedRuntime = Args.hasFlag(
1034 options::OPT_shared_libsan, options::OPT_static_libsan,
1037 if (!SharedRuntime && TC.
getTriple().isOSWindows()) {
1039 Args.getLastArg(options::OPT_shared_libsan, options::OPT_static_libsan);
1040 D.
Diag(clang::diag::err_drv_unsupported_opt_for_target)
1041 << A->getSpelling() << TC.
getTriple().str();
1044 ImplicitCfiRuntime = TC.
getTriple().isAndroid();
1046 if (AllAddedKinds & SanitizerKind::Address) {
1047 NeedPIE |= TC.
getTriple().isOSFuchsia();
1049 Args.getLastArg(options::OPT_fsanitize_address_field_padding)) {
1050 StringRef S = A->getValue();
1052 if ((S.getAsInteger(0, AsanFieldPadding) || AsanFieldPadding < 0 ||
1053 AsanFieldPadding > 2) &&
1055 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1059 if (Arg *WindowsDebugRTArg =
1060 Args.getLastArg(options::OPT__SLASH_MTd, options::OPT__SLASH_MT,
1061 options::OPT__SLASH_MDd, options::OPT__SLASH_MD,
1062 options::OPT__SLASH_LDd, options::OPT__SLASH_LD)) {
1063 switch (WindowsDebugRTArg->getOption().getID()) {
1064 case options::OPT__SLASH_MTd:
1065 case options::OPT__SLASH_MDd:
1066 case options::OPT__SLASH_LDd:
1067 if (DiagnoseErrors) {
1068 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1069 << WindowsDebugRTArg->getAsString(Args)
1071 D.
Diag(clang::diag::note_drv_address_sanitizer_debug_runtime);
1076 StableABI = Args.hasFlag(options::OPT_fsanitize_stable_abi,
1077 options::OPT_fno_sanitize_stable_abi,
false);
1079 AsanPoisonCustomArrayCookie = Args.hasFlag(
1080 options::OPT_fsanitize_address_poison_custom_array_cookie,
1081 options::OPT_fno_sanitize_address_poison_custom_array_cookie,
1082 AsanPoisonCustomArrayCookie);
1084 AsanOutlineInstrumentation =
1085 Args.hasFlag(options::OPT_fsanitize_address_outline_instrumentation,
1086 options::OPT_fno_sanitize_address_outline_instrumentation,
1087 AsanOutlineInstrumentation);
1089 AsanGlobalsDeadStripping = Args.hasFlag(
1090 options::OPT_fsanitize_address_globals_dead_stripping,
1091 options::OPT_fno_sanitize_address_globals_dead_stripping,
true);
1097 AsanUseOdrIndicator =
1098 Args.hasFlag(options::OPT_fsanitize_address_use_odr_indicator,
1099 options::OPT_fno_sanitize_address_use_odr_indicator,
1102 if (AllAddedKinds & SanitizerKind::PointerCompare & ~AllRemove) {
1103 AsanInvalidPointerCmp =
true;
1106 if (AllAddedKinds & SanitizerKind::PointerSubtract & ~AllRemove) {
1107 AsanInvalidPointerSub =
true;
1111 (Args.hasArg(options::OPT_mkernel) ||
1112 Args.hasArg(options::OPT_fapple_kext))) {
1113 AsanDtorKind = llvm::AsanDtorKind::None;
1116 if (
const auto *Arg =
1117 Args.getLastArg(options::OPT_sanitize_address_destructor_EQ)) {
1119 if (parsedAsanDtorKind == llvm::AsanDtorKind::Invalid && DiagnoseErrors) {
1120 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1121 << Arg->getSpelling() << Arg->getValue();
1123 AsanDtorKind = parsedAsanDtorKind;
1126 if (
const auto *Arg = Args.getLastArg(
1127 options::OPT_sanitize_address_use_after_return_EQ)) {
1128 auto parsedAsanUseAfterReturn =
1130 if (parsedAsanUseAfterReturn ==
1131 llvm::AsanDetectStackUseAfterReturnMode::Invalid &&
1133 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1134 << Arg->getSpelling() << Arg->getValue();
1136 AsanUseAfterReturn = parsedAsanUseAfterReturn;
1142 SanitizerKind::PointerCompare | SanitizerKind::PointerSubtract;
1143 if ((AllAddedKinds & DetectInvalidPointerPairs & ~AllRemove) &&
1145 TC.
getDriver().
Diag(clang::diag::err_drv_argument_only_allowed_with)
1147 SanitizerKind::PointerCompare |
1148 SanitizerKind::PointerSubtract)
1149 <<
"-fsanitize=address";
1153 if (AllAddedKinds & (SanitizerKind::Address | SanitizerKind::KernelAddress)) {
1154 AsanUseAfterScope = Args.hasFlag(
1155 options::OPT_fsanitize_address_use_after_scope,
1156 options::OPT_fno_sanitize_address_use_after_scope, AsanUseAfterScope);
1158 AsanUseAfterScope =
false;
1161 if (AllAddedKinds & SanitizerKind::HWAddress) {
1162 if (Arg *HwasanAbiArg =
1163 Args.getLastArg(options::OPT_fsanitize_hwaddress_abi_EQ)) {
1164 HwasanAbi = HwasanAbiArg->getValue();
1165 if (HwasanAbi !=
"platform" && HwasanAbi !=
"interceptor" &&
1167 D.
Diag(clang::diag::err_drv_invalid_value)
1168 << HwasanAbiArg->getAsString(Args) << HwasanAbi;
1170 HwasanAbi =
"interceptor";
1172 if (TC.
getTriple().getArch() == llvm::Triple::x86_64)
1173 HwasanUseAliases = Args.hasFlag(
1174 options::OPT_fsanitize_hwaddress_experimental_aliasing,
1175 options::OPT_fno_sanitize_hwaddress_experimental_aliasing,
1179 if (AllAddedKinds & SanitizerKind::SafeStack) {
1185 if (AllAddedKinds & SanitizerKind::AllocToken) {
1186 AllocTokenFastABI = Args.hasFlag(
1187 options::OPT_fsanitize_alloc_token_fast_abi,
1188 options::OPT_fno_sanitize_alloc_token_fast_abi, AllocTokenFastABI);
1189 AllocTokenExtended = Args.hasFlag(
1190 options::OPT_fsanitize_alloc_token_extended,
1191 options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended);
1194 if (AllAddedKinds & SanitizerKind::Type) {
1195 TysanOutlineInstrumentation =
1196 Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation,
1197 options::OPT_fno_sanitize_type_outline_instrumentation,
1198 TysanOutlineInstrumentation);
1201 LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime,
1202 options::OPT_fno_sanitize_link_runtime,
1203 !Args.hasArg(options::OPT_r));
1208 Args.hasFlag(options::OPT_fsanitize_link_cxx_runtime,
1209 options::OPT_fno_sanitize_link_cxx_runtime, LinkCXXRuntimes);
1211 NeedsMemProfRt = Args.hasFlag(options::OPT_fmemory_profile,
1212 options::OPT_fmemory_profile_EQ,
1213 options::OPT_fno_memory_profile,
false);
1216 Sanitizers.Mask |= Kinds;
1217 RecoverableSanitizers.Mask |= RecoverableKinds;
1218 TrapSanitizers.Mask |= TrappingKinds;
1219 assert(!(RecoverableKinds & TrappingKinds) &&
1220 "Overlap between recoverable and trapping sanitizers");
1222 MergeHandlers.Mask |= MergeKinds;
1224 AnnotateDebugInfo.Mask |= AnnotateDebugInfoKinds;
1225 SuppressUBSanFeature.Mask |= IgnoreForUbsanFeature;
1228 SkipHotCutoffs.clear(~Sanitizers.Mask);