400 const llvm::opt::ArgList &Args,
401 bool DiagnoseErrors,
bool DiagnoseBoundArchErrors,
424 BoundArch.empty() ? ToolChainSupported
426 BoundArch, DeviceOffloadKind));
428 CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso,
429 options::OPT_fno_sanitize_cfi_cross_dso,
false);
436 const llvm::Triple &Triple = TC.
getTriple();
439 Args.hasFlag(options::OPT_fsanitize_minimal_runtime,
440 options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime);
441 HandlerPreserveAllRegs =
442 Args.hasFlag(options::OPT_fsanitize_handler_preserve_all_regs,
443 options::OPT_fno_sanitize_handler_preserve_all_regs,
444 HandlerPreserveAllRegs) &&
445 MinimalRuntime && (Triple.isAArch64() || Triple.isX86_64());
446 TrapLoop = Args.hasFlag(options::OPT_fsanitize_trap_loop,
447 options::OPT_fno_sanitize_trap_loop,
false);
450 Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
451 bool RemoveObjectSizeAtO0 =
452 !OptLevel || OptLevel->getOption().matches(options::OPT_O0);
454 for (
const llvm::opt::Arg *Arg : llvm::reverse(Args)) {
455 if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) {
459 if (RemoveObjectSizeAtO0) {
460 AllRemove |= SanitizerKind::ObjectSize;
464 if ((Add & SanitizerKind::ObjectSize) && DiagnoseErrors)
465 D.
Diag(diag::warn_drv_object_size_disabled_O0)
466 << Arg->getAsString(Args);
477 Add & InvalidTrappingKinds & ~DiagnosedKinds) {
478 if (DiagnoseErrors) {
480 D.
Diag(diag::err_drv_argument_not_allowed_with)
481 << Desc <<
"-fsanitize-trap=undefined";
483 DiagnosedKinds |= KindsToDiagnose;
485 Add &= ~InvalidTrappingKinds;
487 if (MinimalRuntime) {
490 if (DiagnoseErrors) {
492 D.
Diag(diag::err_drv_argument_not_allowed_with)
493 << Desc <<
"-fsanitize-minimal-runtime";
495 DiagnosedKinds |= KindsToDiagnose;
500 if (llvm::opt::Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
501 StringRef CM = A->getValue();
503 (Add & SanitizerKind::Function & ~DiagnosedKinds)) {
505 D.
Diag(diag::err_drv_argument_only_allowed_with)
506 <<
"-fsanitize=function"
509 DiagnosedKinds |= SanitizerKind::Function;
518 if (DiagnoseErrors) {
520 llvm::opt::Arg *A = Args.getLastArgNoClaim(
521 options::OPT_mexecute_only, options::OPT_mno_execute_only);
522 if (A && A->getOption().matches(options::OPT_mexecute_only))
523 D.
Diag(diag::err_drv_argument_not_allowed_with)
524 << Desc << A->getAsString(Args);
526 D.
Diag(diag::err_drv_unsupported_opt_for_target)
527 << Desc << Triple.str();
529 DiagnosedKinds |= KindsToDiagnose;
544 if (CfiCrossDso && (Add & SanitizerKind::CFIMFCall & ~DiagnosedKinds)) {
546 D.
Diag(diag::err_drv_argument_not_allowed_with)
547 <<
"-fsanitize=cfi-mfcall"
548 <<
"-fsanitize-cfi-cross-dso";
550 DiagnosedKinds |= SanitizerKind::CFIMFCall;
557 Add & ToolChainSupported & ~BoundArchSupported & ~DiagnosedKinds;
558 ArchSpecificUnsupported && DiagnoseBoundArchErrors) {
564 bool IsExplicitDevice =
565 Arg->getBaseArg().getOption().matches(options::OPT_Xarch_device);
569 StringRef Requirement =
571 if (!Requirement.empty()) {
579 err_drv_unsupported_option_for_offload_arch_req_feature
581 warn_drv_unsupported_option_for_offload_arch_req_feature)
582 << Arg->getAsString(Args) << BoundArch << Requirement;
586 UnsupportedSet.
Mask = ArchSpecificUnsupported;
587 D.
Diag(diag::warn_drv_unsupported_option_part_for_target)
588 <<
toString(UnsupportedSet) << Arg->getAsString(Args)
592 DiagnosedKinds |= ArchSpecificUnsupported;
597 Add & ~ToolChainSupported & ~DiagnosedKinds;
598 DiagnoseErrors && KindsToDiagnose) {
599 bool IsExplicitDevice =
600 Arg->getBaseArg().getOption().matches(options::OPT_Xarch_device);
609 KindSet.
Mask = KindsToDiagnose;
610 D.
Diag(IsExplicitDevice
611 ? diag::err_drv_unsupported_option_part_for_target
612 : diag::warn_drv_unsupported_option_part_for_target)
613 <<
toString(KindSet) << Arg->getAsString(Args)
617 D.
Diag(diag::err_drv_unsupported_opt_for_target)
622 DiagnosedKinds |= KindsToDiagnose;
625 Add &= BoundArchSupported;
631 if (
const llvm::opt::Arg *NoRTTIArg = TC.
getRTTIArg()) {
632 assert(NoRTTIArg->getOption().matches(options::OPT_fno_rtti) &&
633 "RTTI disabled without -fno-rtti option?");
637 D.
Diag(diag::err_drv_argument_not_allowed_with)
638 <<
"-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
643 D.
Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
647 AllRemove |= SanitizerKind::Vptr;
655 Add &= ~InvalidTrappingKinds;
656 if (MinimalRuntime) {
667 if (Add & SanitizerKind::UndefinedGroup) {
668 bool S = Args.hasFlagNoClaim(options::OPT_fno_strict_overflow,
669 options::OPT_fstrict_overflow,
false);
670 if (Args.hasFlagNoClaim(options::OPT_fwrapv, options::OPT_fno_wrapv, S))
672 if (Args.hasFlagNoClaim(options::OPT_fwrapv_pointer,
673 options::OPT_fno_wrapv_pointer, S))
676 Add &= BoundArchSupported;
678 if (Add & SanitizerKind::Fuzzer)
679 Add |= SanitizerKind::FuzzerNoLink;
682 if (Add & SanitizerKind::FuzzerNoLink) {
691 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_EQ)) {
695 }
else if (Arg->getOption().matches(
696 options::OPT_fsanitize_ignore_for_ubsan_feature_EQ)) {
698 IgnoreForUbsanFeature |=
703 std::pair<SanitizerMask, SanitizerMask> IncompatibleGroups[] = {
704 std::make_pair(SanitizerKind::Address,
705 SanitizerKind::Thread | SanitizerKind::Memory),
706 std::make_pair(SanitizerKind::Type,
707 SanitizerKind::Address | SanitizerKind::KernelAddress |
708 SanitizerKind::Memory | SanitizerKind::Leak |
709 SanitizerKind::Thread | SanitizerKind::KernelAddress),
710 std::make_pair(SanitizerKind::Thread, SanitizerKind::Memory),
711 std::make_pair(SanitizerKind::Leak,
712 SanitizerKind::Thread | SanitizerKind::Memory),
713 std::make_pair(SanitizerKind::KernelAddress,
714 SanitizerKind::Address | SanitizerKind::Leak |
715 SanitizerKind::Thread | SanitizerKind::Memory),
716 std::make_pair(SanitizerKind::HWAddress,
717 SanitizerKind::Address | SanitizerKind::Thread |
718 SanitizerKind::Memory | SanitizerKind::KernelAddress),
719 std::make_pair(SanitizerKind::Scudo,
720 SanitizerKind::Address | SanitizerKind::HWAddress |
721 SanitizerKind::Leak | SanitizerKind::Thread |
722 SanitizerKind::Memory | SanitizerKind::KernelAddress),
723 std::make_pair(SanitizerKind::SafeStack,
725 : SanitizerKind::Leak) |
726 SanitizerKind::Address | SanitizerKind::HWAddress |
727 SanitizerKind::Thread | SanitizerKind::Memory |
728 SanitizerKind::KernelAddress),
729 std::make_pair(SanitizerKind::KernelHWAddress,
730 SanitizerKind::Address | SanitizerKind::HWAddress |
731 SanitizerKind::Leak | SanitizerKind::Thread |
732 SanitizerKind::Memory | SanitizerKind::KernelAddress |
733 SanitizerKind::SafeStack),
734 std::make_pair(SanitizerKind::KernelMemory,
735 SanitizerKind::Address | SanitizerKind::HWAddress |
736 SanitizerKind::Leak | SanitizerKind::Thread |
737 SanitizerKind::Memory | SanitizerKind::KernelAddress |
738 SanitizerKind::Scudo | SanitizerKind::SafeStack),
739 std::make_pair(SanitizerKind::MemTag, SanitizerKind::Address |
740 SanitizerKind::KernelAddress |
741 SanitizerKind::HWAddress |
742 SanitizerKind::KernelHWAddress),
743 std::make_pair(SanitizerKind::KCFI, SanitizerKind::Function),
744 std::make_pair(SanitizerKind::Realtime,
745 SanitizerKind::Address | SanitizerKind::Thread |
746 SanitizerKind::Undefined | SanitizerKind::Memory |
747 SanitizerKind::Type),
748 std::make_pair(SanitizerKind::AllocToken,
749 SanitizerKind::Address | SanitizerKind::HWAddress |
750 SanitizerKind::KernelAddress |
751 SanitizerKind::KernelHWAddress |
752 SanitizerKind::Memory)};
759 for (
auto G : IncompatibleGroups) {
761 if ((
Default & Group) && (Kinds & G.second))
775 D.
Diag(diag::err_drv_argument_only_allowed_with)
779 if ((Kinds & SanitizerKind::ShadowCallStack) && TC.
getTriple().isAArch64() &&
780 !llvm::AArch64::isX18ReservedByDefault(TC.
getTriple()) &&
781 !Args.hasArg(options::OPT_ffixed_x18) && DiagnoseErrors) {
782 D.
Diag(diag::err_drv_argument_only_allowed_with)
791 if (~BoundArchSupported & SanitizerKind::Vptr) {
797 if (KindsToDiagnose) {
799 S.
Mask = KindsToDiagnose;
801 D.
Diag(diag::err_drv_unsupported_opt_for_target)
803 Kinds &= ~KindsToDiagnose;
808 for (
auto G : IncompatibleGroups) {
813 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
829 options::OPT_fno_sanitize_recover_EQ);
830 RecoverableKinds &= Kinds;
832 TrappingKinds &= Kinds;
833 RecoverableKinds &= ~TrappingKinds;
838 options::OPT_fsanitize_merge_handlers_EQ,
839 options::OPT_fno_sanitize_merge_handlers_EQ);
848 {}, options::OPT_fsanitize_annotate_debug_info_EQ,
849 options::OPT_fno_sanitize_annotate_debug_info_EQ);
850 AnnotateDebugInfoKinds &= Kinds;
855 if (!Args.hasArgNoClaim(options::OPT_fno_sanitize_ignorelist))
861 D, Args, UserIgnorelistFiles, options::OPT_fsanitize_ignorelist_EQ,
862 options::OPT_fno_sanitize_ignorelist,
863 clang::diag::err_drv_malformed_sanitizer_ignorelist, DiagnoseErrors);
866 if (Arg *A = Args.getLastArg(
867 options::OPT_fsanitize_coverage_stack_depth_callback_min_EQ)) {
868 StringRef S = A->getValue();
869 if (S.getAsInteger(0, CoverageStackDepthCallbackMin) ||
870 CoverageStackDepthCallbackMin < 0) {
872 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
877 if (AllAddedKinds & SanitizerKind::Memory) {
879 Args.getLastArg(options::OPT_fsanitize_memory_track_origins_EQ,
880 options::OPT_fno_sanitize_memory_track_origins)) {
881 if (!A->getOption().matches(
882 options::OPT_fno_sanitize_memory_track_origins)) {
883 StringRef S = A->getValue();
884 if (S.getAsInteger(0, MsanTrackOrigins) || MsanTrackOrigins < 0 ||
885 MsanTrackOrigins > 2) {
887 D.
Diag(clang::diag::err_drv_invalid_value)
888 << A->getAsString(Args) << S;
892 MsanUseAfterDtor = Args.hasFlag(
893 options::OPT_fsanitize_memory_use_after_dtor,
894 options::OPT_fno_sanitize_memory_use_after_dtor, MsanUseAfterDtor);
895 MsanParamRetval = Args.hasFlag(
896 options::OPT_fsanitize_memory_param_retval,
897 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
898 }
else if (AllAddedKinds & SanitizerKind::KernelMemory) {
899 MsanUseAfterDtor =
false;
900 MsanParamRetval = Args.hasFlag(
901 options::OPT_fsanitize_memory_param_retval,
902 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
904 MsanUseAfterDtor =
false;
905 MsanParamRetval =
false;
908 if (AllAddedKinds & SanitizerKind::MemTag) {
910 Args.getLastArgValue(options::OPT_fsanitize_memtag_mode_EQ,
"sync");
911 if (S ==
"async" || S ==
"sync") {
912 MemtagMode = S.str();
914 D.
Diag(clang::diag::err_drv_invalid_value_with_suggestion)
915 <<
"-fsanitize-memtag-mode=" << S <<
"{async, sync}";
920 if (AllAddedKinds & SanitizerKind::Thread) {
921 TsanMemoryAccess = Args.hasFlag(
922 options::OPT_fsanitize_thread_memory_access,
923 options::OPT_fno_sanitize_thread_memory_access, TsanMemoryAccess);
924 TsanFuncEntryExit = Args.hasFlag(
925 options::OPT_fsanitize_thread_func_entry_exit,
926 options::OPT_fno_sanitize_thread_func_entry_exit, TsanFuncEntryExit);
928 Args.hasFlag(options::OPT_fsanitize_thread_atomics,
929 options::OPT_fno_sanitize_thread_atomics, TsanAtomics);
932 if (AllAddedKinds & SanitizerKind::CFI) {
935 NeedPIE |= CfiCrossDso;
936 CfiICallGeneralizePointers =
937 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
939 CfiICallNormalizeIntegers =
940 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
942 if (CfiCrossDso && CfiICallGeneralizePointers && DiagnoseErrors)
943 D.
Diag(diag::err_drv_argument_not_allowed_with)
944 <<
"-fsanitize-cfi-cross-dso"
945 <<
"-fsanitize-cfi-icall-generalize-pointers";
947 CfiCanonicalJumpTables =
948 Args.hasFlag(options::OPT_fsanitize_cfi_canonical_jump_tables,
949 options::OPT_fno_sanitize_cfi_canonical_jump_tables,
true);
952 if (AllAddedKinds & SanitizerKind::KCFI) {
953 CfiICallGeneralizePointers =
954 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
955 CfiICallNormalizeIntegers =
956 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
958 KcfiArity = Args.hasArg(options::OPT_fsanitize_kcfi_arity);
960 if (AllAddedKinds & SanitizerKind::CFI && DiagnoseErrors)
961 D.
Diag(diag::err_drv_argument_not_allowed_with)
966 Stats = Args.hasFlag(options::OPT_fsanitize_stats,
967 options::OPT_fno_sanitize_stats,
false);
969 if (MinimalRuntime) {
972 if (IncompatibleMask && DiagnoseErrors)
973 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
974 <<
"-fsanitize-minimal-runtime"
978 for (
const auto *Arg : Args.filtered(
979 options::OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
981 OverflowPatternExclusions |=
987 for (
const auto *Arg : Args) {
988 if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) {
989 int LegacySanitizeCoverage;
990 if (Arg->getNumValues() == 1 &&
991 !StringRef(Arg->getValue(0))
992 .getAsInteger(0, LegacySanitizeCoverage)) {
993 CoverageFeatures = 0;
995 if (LegacySanitizeCoverage != 0 && DiagnoseErrors) {
996 D.
Diag(diag::warn_drv_deprecated_arg)
997 << Arg->getAsString(Args) <<
true
998 <<
"-fsanitize-coverage=trace-pc-guard";
1009 CoverageFeatures = 0;
1011 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_coverage)) {
1017 if (DiagnoseErrors) {
1019 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1020 <<
"-fsanitize-coverage=func"
1021 <<
"-fsanitize-coverage=bb";
1023 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1024 <<
"-fsanitize-coverage=func"
1025 <<
"-fsanitize-coverage=edge";
1027 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1028 <<
"-fsanitize-coverage=bb"
1029 <<
"-fsanitize-coverage=edge";
1033 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1034 <<
"-fsanitize-coverage=trace-bb" <<
true
1035 <<
"-fsanitize-coverage=trace-pc-guard";
1037 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1038 <<
"-fsanitize-coverage=8bit-counters" <<
true
1039 <<
"-fsanitize-coverage=trace-pc-guard";
1047 if ((CoverageFeatures & InsertionPointTypes) &&
1048 !(CoverageFeatures & InstrumentationTypes) && DiagnoseErrors) {
1049 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1050 <<
"-fsanitize-coverage=[func|bb|edge]" <<
true
1051 <<
"-fsanitize-coverage=[func|bb|edge],[trace-pc-guard|trace-pc],["
1056 if (!(CoverageFeatures & InsertionPointTypes)) {
1070 if (CoverageFeatures) {
1072 D, Args, CoverageAllowlistFiles,
1073 options::OPT_fsanitize_coverage_allowlist, OptSpecifier(),
1074 clang::diag::err_drv_malformed_sanitizer_coverage_allowlist,
1077 D, Args, CoverageIgnorelistFiles,
1078 options::OPT_fsanitize_coverage_ignorelist, OptSpecifier(),
1079 clang::diag::err_drv_malformed_sanitizer_coverage_ignorelist,
1084 for (
const auto *Arg :
1085 Args.filtered(options::OPT_fexperimental_sanitize_metadata_EQ,
1086 options::OPT_fno_experimental_sanitize_metadata_EQ)) {
1087 if (Arg->getOption().matches(
1088 options::OPT_fexperimental_sanitize_metadata_EQ)) {
1090 BinaryMetadataFeatures |=
1094 BinaryMetadataFeatures &=
1100 if (BinaryMetadataFeatures) {
1102 D, Args, BinaryMetadataIgnorelistFiles,
1103 options::OPT_fexperimental_sanitize_metadata_ignorelist_EQ,
1105 clang::diag::err_drv_malformed_sanitizer_metadata_ignorelist,
1109 SharedRuntime = Args.hasFlag(
1110 options::OPT_shared_libsan, options::OPT_static_libsan,
1113 if (!SharedRuntime && TC.
getTriple().isOSWindows()) {
1115 Args.getLastArg(options::OPT_shared_libsan, options::OPT_static_libsan);
1116 D.
Diag(clang::diag::err_drv_unsupported_opt_for_target)
1117 << A->getSpelling() << TC.
getTriple().str();
1120 ImplicitCfiRuntime = TC.
getTriple().isAndroid();
1122 if (AllAddedKinds & SanitizerKind::Address) {
1123 NeedPIE |= TC.
getTriple().isOSFuchsia();
1125 Args.getLastArg(options::OPT_fsanitize_address_field_padding)) {
1126 StringRef S = A->getValue();
1128 if ((S.getAsInteger(0, AsanFieldPadding) || AsanFieldPadding < 0 ||
1129 AsanFieldPadding > 2) &&
1131 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1135 if (Arg *WindowsDebugRTArg =
1136 Args.getLastArg(options::OPT__SLASH_MTd, options::OPT__SLASH_MT,
1137 options::OPT__SLASH_MDd, options::OPT__SLASH_MD,
1138 options::OPT__SLASH_LDd, options::OPT__SLASH_LD)) {
1139 switch (WindowsDebugRTArg->getOption().getID()) {
1140 case options::OPT__SLASH_MTd:
1141 case options::OPT__SLASH_MDd:
1142 case options::OPT__SLASH_LDd:
1143 if (DiagnoseErrors) {
1144 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1145 << WindowsDebugRTArg->getAsString(Args)
1147 D.
Diag(clang::diag::note_drv_address_sanitizer_debug_runtime);
1152 StableABI = Args.hasFlag(options::OPT_fsanitize_stable_abi,
1153 options::OPT_fno_sanitize_stable_abi,
false);
1155 AsanPoisonCustomArrayCookie = Args.hasFlag(
1156 options::OPT_fsanitize_address_poison_custom_array_cookie,
1157 options::OPT_fno_sanitize_address_poison_custom_array_cookie,
1158 AsanPoisonCustomArrayCookie);
1160 AsanOutlineInstrumentation =
1161 Args.hasFlag(options::OPT_fsanitize_address_outline_instrumentation,
1162 options::OPT_fno_sanitize_address_outline_instrumentation,
1163 AsanOutlineInstrumentation);
1165 AsanGlobalsDeadStripping = Args.hasFlag(
1166 options::OPT_fsanitize_address_globals_dead_stripping,
1167 options::OPT_fno_sanitize_address_globals_dead_stripping,
true);
1173 AsanUseOdrIndicator =
1174 Args.hasFlag(options::OPT_fsanitize_address_use_odr_indicator,
1175 options::OPT_fno_sanitize_address_use_odr_indicator,
1178 if (AllAddedKinds & SanitizerKind::PointerCompare & ~AllRemove) {
1179 AsanInvalidPointerCmp =
true;
1182 if (AllAddedKinds & SanitizerKind::PointerSubtract & ~AllRemove) {
1183 AsanInvalidPointerSub =
true;
1187 (Args.hasArg(options::OPT_mkernel) ||
1188 Args.hasArg(options::OPT_fapple_kext))) {
1189 AsanDtorKind = llvm::AsanDtorKind::None;
1192 if (
const auto *Arg =
1193 Args.getLastArg(options::OPT_sanitize_address_destructor_EQ)) {
1195 if (parsedAsanDtorKind == llvm::AsanDtorKind::Invalid && DiagnoseErrors) {
1196 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1197 << Arg->getSpelling() << Arg->getValue();
1199 AsanDtorKind = parsedAsanDtorKind;
1202 if (
const auto *Arg = Args.getLastArg(
1203 options::OPT_sanitize_address_use_after_return_EQ)) {
1204 auto parsedAsanUseAfterReturn =
1206 if (parsedAsanUseAfterReturn ==
1207 llvm::AsanDetectStackUseAfterReturnMode::Invalid &&
1209 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1210 << Arg->getSpelling() << Arg->getValue();
1212 AsanUseAfterReturn = parsedAsanUseAfterReturn;
1218 SanitizerKind::PointerCompare | SanitizerKind::PointerSubtract;
1219 if ((AllAddedKinds & DetectInvalidPointerPairs & ~AllRemove) &&
1221 TC.
getDriver().
Diag(clang::diag::err_drv_argument_only_allowed_with)
1223 SanitizerKind::PointerCompare |
1224 SanitizerKind::PointerSubtract)
1225 <<
"-fsanitize=address";
1229 if (AllAddedKinds & (SanitizerKind::Address | SanitizerKind::KernelAddress)) {
1230 AsanUseAfterScope = Args.hasFlag(
1231 options::OPT_fsanitize_address_use_after_scope,
1232 options::OPT_fno_sanitize_address_use_after_scope, AsanUseAfterScope);
1234 AsanUseAfterScope =
false;
1237 if (AllAddedKinds & SanitizerKind::HWAddress) {
1238 if (Arg *HwasanAbiArg =
1239 Args.getLastArg(options::OPT_fsanitize_hwaddress_abi_EQ)) {
1240 HwasanAbi = HwasanAbiArg->getValue();
1241 if (HwasanAbi !=
"platform" && HwasanAbi !=
"interceptor" &&
1243 D.
Diag(clang::diag::err_drv_invalid_value)
1244 << HwasanAbiArg->getAsString(Args) << HwasanAbi;
1246 HwasanAbi =
"interceptor";
1248 if (TC.
getTriple().getArch() == llvm::Triple::x86_64)
1249 HwasanUseAliases = Args.hasFlag(
1250 options::OPT_fsanitize_hwaddress_experimental_aliasing,
1251 options::OPT_fno_sanitize_hwaddress_experimental_aliasing,
1255 if (AllAddedKinds & SanitizerKind::SafeStack) {
1261 if (AllAddedKinds & SanitizerKind::AllocToken) {
1262 AllocTokenFastABI = Args.hasFlag(
1263 options::OPT_fsanitize_alloc_token_fast_abi,
1264 options::OPT_fno_sanitize_alloc_token_fast_abi, AllocTokenFastABI);
1265 AllocTokenExtended = Args.hasFlag(
1266 options::OPT_fsanitize_alloc_token_extended,
1267 options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended);
1270 if (AllAddedKinds & SanitizerKind::Type) {
1271 TysanOutlineInstrumentation =
1272 Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation,
1273 options::OPT_fno_sanitize_type_outline_instrumentation,
1274 TysanOutlineInstrumentation);
1277 LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime,
1278 options::OPT_fno_sanitize_link_runtime,
1279 !Args.hasArg(options::OPT_r));
1284 Args.hasFlag(options::OPT_fsanitize_link_cxx_runtime,
1285 options::OPT_fno_sanitize_link_cxx_runtime, LinkCXXRuntimes);
1287 NeedsMemProfRt = Args.hasFlag(options::OPT_fmemory_profile,
1288 options::OPT_fmemory_profile_EQ,
1289 options::OPT_fno_memory_profile,
false);
1292 Sanitizers.Mask |= Kinds;
1293 RecoverableSanitizers.Mask |= RecoverableKinds;
1294 TrapSanitizers.Mask |= TrappingKinds;
1295 assert(!(RecoverableKinds & TrappingKinds) &&
1296 "Overlap between recoverable and trapping sanitizers");
1298 MergeHandlers.Mask |= MergeKinds;
1300 AnnotateDebugInfo.Mask |= AnnotateDebugInfoKinds;
1301 SuppressUBSanFeature.Mask |= IgnoreForUbsanFeature;
1304 SkipHotCutoffs.clear(~Sanitizers.Mask);