432 const llvm::opt::ArgList &Args,
433 bool DiagnoseErrors,
bool DiagnoseBoundArchErrors,
457 : ToolChainSupported;
459 CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso,
460 options::OPT_fno_sanitize_cfi_cross_dso,
false);
467 const llvm::Triple &Triple = TC.
getTriple();
470 Args.hasFlag(options::OPT_fsanitize_minimal_runtime,
471 options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime);
472 HandlerPreserveAllRegs =
473 Args.hasFlag(options::OPT_fsanitize_handler_preserve_all_regs,
474 options::OPT_fno_sanitize_handler_preserve_all_regs,
475 HandlerPreserveAllRegs) &&
476 MinimalRuntime && (Triple.isAArch64() || Triple.isX86_64());
477 TrapLoop = Args.hasFlag(options::OPT_fsanitize_trap_loop,
478 options::OPT_fno_sanitize_trap_loop,
false);
481 Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
482 bool RemoveObjectSizeAtO0 =
483 !OptLevel || OptLevel->getOption().matches(options::OPT_O0);
485 for (
const llvm::opt::Arg *Arg : llvm::reverse(Args)) {
486 if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) {
490 if (RemoveObjectSizeAtO0) {
491 AllRemove |= SanitizerKind::ObjectSize;
495 if ((Add & SanitizerKind::ObjectSize) && DiagnoseErrors)
496 D.
Diag(diag::warn_drv_object_size_disabled_O0)
497 << Arg->getAsString(Args);
508 Add & InvalidTrappingKinds & ~DiagnosedKinds) {
509 if (DiagnoseErrors) {
511 D.
Diag(diag::err_drv_argument_not_allowed_with)
512 << Desc <<
"-fsanitize-trap=undefined";
514 DiagnosedKinds |= KindsToDiagnose;
516 Add &= ~InvalidTrappingKinds;
518 if (MinimalRuntime) {
521 if (DiagnoseErrors) {
523 D.
Diag(diag::err_drv_argument_not_allowed_with)
524 << Desc <<
"-fsanitize-minimal-runtime";
526 DiagnosedKinds |= KindsToDiagnose;
531 if (llvm::opt::Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
532 StringRef CM = A->getValue();
534 (Add & SanitizerKind::Function & ~DiagnosedKinds)) {
536 D.
Diag(diag::err_drv_argument_only_allowed_with)
537 <<
"-fsanitize=function"
540 DiagnosedKinds |= SanitizerKind::Function;
549 if (DiagnoseErrors) {
551 llvm::opt::Arg *A = Args.getLastArgNoClaim(
552 options::OPT_mexecute_only, options::OPT_mno_execute_only);
553 if (A && A->getOption().matches(options::OPT_mexecute_only))
554 D.
Diag(diag::err_drv_argument_not_allowed_with)
555 << Desc << A->getAsString(Args);
557 D.
Diag(diag::err_drv_unsupported_opt_for_target)
558 << Desc << Triple.str();
560 DiagnosedKinds |= KindsToDiagnose;
575 if (CfiCrossDso && (Add & SanitizerKind::CFIMFCall & ~DiagnosedKinds)) {
577 D.
Diag(diag::err_drv_argument_not_allowed_with)
578 <<
"-fsanitize=cfi-mfcall"
579 <<
"-fsanitize-cfi-cross-dso";
581 DiagnosedKinds |= SanitizerKind::CFIMFCall;
588 Add & ToolChainSupported & ~BoundArchSupported & ~DiagnosedKinds;
589 ArchSpecificUnsupported && DiagnoseBoundArchErrors) {
595 bool IsExplicitDevice =
596 Arg->getBaseArg().getOption().matches(options::OPT_Xarch_device);
600 StringRef Requirement =
602 if (!Requirement.empty()) {
610 err_drv_unsupported_option_for_offload_arch_req_feature
612 warn_drv_unsupported_option_for_offload_arch_req_feature)
613 << Arg->getAsString(Args) << BA.
ArchName << Requirement;
617 UnsupportedSet.
Mask = ArchSpecificUnsupported;
618 D.
Diag(diag::warn_drv_unsupported_option_part_for_target)
619 <<
toString(UnsupportedSet) << Arg->getAsString(Args)
623 DiagnosedKinds |= ArchSpecificUnsupported;
628 Add & ~ToolChainSupported & ~DiagnosedKinds;
629 DiagnoseErrors && KindsToDiagnose) {
630 bool IsExplicitDevice =
631 Arg->getBaseArg().getOption().matches(options::OPT_Xarch_device);
640 KindSet.
Mask = KindsToDiagnose;
641 D.
Diag(IsExplicitDevice
642 ? diag::err_drv_unsupported_option_part_for_target
643 : diag::warn_drv_unsupported_option_part_for_target)
644 <<
toString(KindSet) << Arg->getAsString(Args)
648 D.
Diag(diag::err_drv_unsupported_opt_for_target)
653 DiagnosedKinds |= KindsToDiagnose;
656 Add &= BoundArchSupported;
662 if (
const llvm::opt::Arg *NoRTTIArg = TC.
getRTTIArg()) {
663 assert(NoRTTIArg->getOption().matches(options::OPT_fno_rtti) &&
664 "RTTI disabled without -fno-rtti option?");
668 D.
Diag(diag::err_drv_argument_not_allowed_with)
669 <<
"-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
674 D.
Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
678 AllRemove |= SanitizerKind::Vptr;
686 Add &= ~InvalidTrappingKinds;
687 if (MinimalRuntime) {
698 if (Add & SanitizerKind::UndefinedGroup) {
699 bool S = Args.hasFlagNoClaim(options::OPT_fno_strict_overflow,
700 options::OPT_fstrict_overflow,
false);
701 if (Args.hasFlagNoClaim(options::OPT_fwrapv, options::OPT_fno_wrapv, S))
703 if (Args.hasFlagNoClaim(options::OPT_fwrapv_pointer,
704 options::OPT_fno_wrapv_pointer, S))
707 Add &= BoundArchSupported;
709 if (Add & SanitizerKind::Fuzzer)
710 Add |= SanitizerKind::FuzzerNoLink;
713 if (Add & SanitizerKind::FuzzerNoLink) {
722 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_EQ)) {
726 }
else if (Arg->getOption().matches(
727 options::OPT_fsanitize_ignore_for_ubsan_feature_EQ)) {
729 IgnoreForUbsanFeature |=
734 std::pair<SanitizerMask, SanitizerMask> IncompatibleGroups[] = {
735 std::make_pair(SanitizerKind::Address,
736 SanitizerKind::Thread | SanitizerKind::Memory),
737 std::make_pair(SanitizerKind::Type,
738 SanitizerKind::Address | SanitizerKind::KernelAddress |
739 SanitizerKind::Memory | SanitizerKind::Leak |
740 SanitizerKind::Thread),
741 std::make_pair(SanitizerKind::Thread, SanitizerKind::Memory),
742 std::make_pair(SanitizerKind::Leak,
743 SanitizerKind::Thread | SanitizerKind::Memory),
744 std::make_pair(SanitizerKind::KernelAddress,
745 SanitizerKind::Address | SanitizerKind::Leak |
746 SanitizerKind::Thread | SanitizerKind::Memory),
747 std::make_pair(SanitizerKind::HWAddress,
748 SanitizerKind::Address | SanitizerKind::Thread |
749 SanitizerKind::Memory | SanitizerKind::KernelAddress),
750 std::make_pair(SanitizerKind::Scudo,
751 SanitizerKind::Address | SanitizerKind::HWAddress |
752 SanitizerKind::Leak | SanitizerKind::Thread |
753 SanitizerKind::Memory | SanitizerKind::KernelAddress),
754 std::make_pair(SanitizerKind::SafeStack,
756 : SanitizerKind::Leak) |
757 SanitizerKind::Address | SanitizerKind::HWAddress |
758 SanitizerKind::Thread | SanitizerKind::Memory |
759 SanitizerKind::KernelAddress),
760 std::make_pair(SanitizerKind::KernelHWAddress,
761 SanitizerKind::Address | SanitizerKind::HWAddress |
762 SanitizerKind::Leak | SanitizerKind::Thread |
763 SanitizerKind::Memory | SanitizerKind::KernelAddress |
764 SanitizerKind::SafeStack),
765 std::make_pair(SanitizerKind::KernelMemory,
766 SanitizerKind::Address | SanitizerKind::HWAddress |
767 SanitizerKind::Leak | SanitizerKind::Thread |
768 SanitizerKind::Memory | SanitizerKind::KernelAddress |
769 SanitizerKind::Scudo | SanitizerKind::SafeStack),
770 std::make_pair(SanitizerKind::MemTag, SanitizerKind::Address |
771 SanitizerKind::KernelAddress |
772 SanitizerKind::HWAddress |
773 SanitizerKind::KernelHWAddress),
774 std::make_pair(SanitizerKind::KCFI, SanitizerKind::Function),
775 std::make_pair(SanitizerKind::Realtime,
776 SanitizerKind::Address | SanitizerKind::Thread |
777 SanitizerKind::Undefined | SanitizerKind::Memory |
778 SanitizerKind::Type),
779 std::make_pair(SanitizerKind::AllocToken,
780 SanitizerKind::Address | SanitizerKind::HWAddress |
781 SanitizerKind::KernelAddress |
782 SanitizerKind::KernelHWAddress |
783 SanitizerKind::Memory)};
790 for (
auto G : IncompatibleGroups) {
792 if ((
Default & Group) && (Kinds & G.second))
806 D.
Diag(diag::err_drv_argument_only_allowed_with)
810 if ((Kinds & SanitizerKind::ShadowCallStack) && TC.
getTriple().isAArch64() &&
811 !llvm::AArch64::isX18ReservedByDefault(TC.
getTriple()) &&
812 !Args.hasArg(options::OPT_ffixed_x18) && DiagnoseErrors) {
813 D.
Diag(diag::err_drv_argument_only_allowed_with)
818 if ((Kinds & SanitizerKind::ShadowCallStack) &&
819 TC.
getTriple().getArch() == llvm::Triple::hexagon && DiagnoseErrors) {
825 if (Arg *A = Args.getLastArg(options::OPT_mhexagon_scs_reg)) {
826 StringRef Val(A->getValue());
830 if (Val.consume_front(
"r") && !Val.getAsInteger(10, Parsed) &&
831 Parsed >= 16 && Parsed <= 27)
835 D.
Diag(diag::err_drv_argument_only_allowed_with)
837 Kinds & SanitizerKind::ShadowCallStack)
838 << (
"-ffixed-r" + Twine(RegNo)).str();
845 if (~BoundArchSupported & SanitizerKind::Vptr) {
851 if (KindsToDiagnose) {
853 S.
Mask = KindsToDiagnose;
855 D.
Diag(diag::err_drv_unsupported_opt_for_target)
857 Kinds &= ~KindsToDiagnose;
862 for (
auto G : IncompatibleGroups) {
867 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
883 options::OPT_fno_sanitize_recover_EQ);
884 RecoverableKinds &= Kinds;
886 TrappingKinds &= Kinds;
887 RecoverableKinds &= ~TrappingKinds;
892 options::OPT_fsanitize_merge_handlers_EQ,
893 options::OPT_fno_sanitize_merge_handlers_EQ);
902 {}, options::OPT_fsanitize_annotate_debug_info_EQ,
903 options::OPT_fno_sanitize_annotate_debug_info_EQ);
904 AnnotateDebugInfoKinds &= Kinds;
909 if (!Args.hasArgNoClaim(options::OPT_fno_sanitize_ignorelist))
915 D, Args, UserIgnorelistFiles, options::OPT_fsanitize_ignorelist_EQ,
916 options::OPT_fno_sanitize_ignorelist,
917 clang::diag::err_drv_malformed_sanitizer_ignorelist, DiagnoseErrors);
920 if (Arg *A = Args.getLastArg(
921 options::OPT_fsanitize_coverage_stack_depth_callback_min_EQ)) {
922 StringRef S = A->getValue();
923 if (S.getAsInteger(0, CoverageStackDepthCallbackMin) ||
924 CoverageStackDepthCallbackMin < 0) {
926 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
931 if (AllAddedKinds & SanitizerKind::Memory) {
933 Args.getLastArg(options::OPT_fsanitize_memory_track_origins_EQ,
934 options::OPT_fno_sanitize_memory_track_origins)) {
935 if (!A->getOption().matches(
936 options::OPT_fno_sanitize_memory_track_origins)) {
937 StringRef S = A->getValue();
938 if (S.getAsInteger(0, MsanTrackOrigins) || MsanTrackOrigins < 0 ||
939 MsanTrackOrigins > 2) {
941 D.
Diag(clang::diag::err_drv_invalid_value)
942 << A->getAsString(Args) << S;
946 MsanUseAfterDtor = Args.hasFlag(
947 options::OPT_fsanitize_memory_use_after_dtor,
948 options::OPT_fno_sanitize_memory_use_after_dtor, MsanUseAfterDtor);
949 MsanParamRetval = Args.hasFlag(
950 options::OPT_fsanitize_memory_param_retval,
951 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
952 }
else if (AllAddedKinds & SanitizerKind::KernelMemory) {
953 MsanUseAfterDtor =
false;
954 MsanParamRetval = Args.hasFlag(
955 options::OPT_fsanitize_memory_param_retval,
956 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
958 MsanUseAfterDtor =
false;
959 MsanParamRetval =
false;
962 if (AllAddedKinds & SanitizerKind::MemTag) {
964 Args.getLastArgValue(options::OPT_fsanitize_memtag_mode_EQ,
"sync");
965 if (S ==
"async" || S ==
"sync") {
966 MemtagMode = S.str();
968 D.
Diag(clang::diag::err_drv_invalid_value_with_suggestion)
969 <<
"-fsanitize-memtag-mode=" << S <<
"{async, sync}";
974 if (AllAddedKinds & SanitizerKind::Thread) {
975 TsanMemoryAccess = Args.hasFlag(
976 options::OPT_fsanitize_thread_memory_access,
977 options::OPT_fno_sanitize_thread_memory_access, TsanMemoryAccess);
978 TsanFuncEntryExit = Args.hasFlag(
979 options::OPT_fsanitize_thread_func_entry_exit,
980 options::OPT_fno_sanitize_thread_func_entry_exit, TsanFuncEntryExit);
982 Args.hasFlag(options::OPT_fsanitize_thread_atomics,
983 options::OPT_fno_sanitize_thread_atomics, TsanAtomics);
986 if (AllAddedKinds & SanitizerKind::CFI) {
989 NeedPIE |= CfiCrossDso;
990 CfiICallGeneralizePointers =
991 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
993 CfiICallNormalizeIntegers =
994 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
996 if (CfiCrossDso && CfiICallGeneralizePointers && DiagnoseErrors)
997 D.
Diag(diag::err_drv_argument_not_allowed_with)
998 <<
"-fsanitize-cfi-cross-dso"
999 <<
"-fsanitize-cfi-icall-generalize-pointers";
1001 CfiCanonicalJumpTables =
1002 Args.hasFlag(options::OPT_fsanitize_cfi_canonical_jump_tables,
1003 options::OPT_fno_sanitize_cfi_canonical_jump_tables,
true);
1006 if (AllAddedKinds & SanitizerKind::KCFI) {
1007 CfiICallGeneralizePointers =
1008 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
1009 CfiICallNormalizeIntegers =
1010 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
1012 KcfiArity = Args.hasArg(options::OPT_fsanitize_kcfi_arity);
1014 if (
const Arg *A = Args.getLastArg(options::OPT_fsanitize_kcfi_hash_EQ))
1015 KcfiHash = A->getValue();
1017 if (AllAddedKinds & SanitizerKind::CFI && DiagnoseErrors)
1018 D.
Diag(diag::err_drv_argument_not_allowed_with)
1019 <<
"-fsanitize=kcfi"
1023 Stats = Args.hasFlag(options::OPT_fsanitize_stats,
1024 options::OPT_fno_sanitize_stats,
false);
1026 if (MinimalRuntime) {
1029 if (IncompatibleMask && DiagnoseErrors)
1030 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1031 <<
"-fsanitize-minimal-runtime"
1035 for (
const auto *Arg : Args.filtered(
1036 options::OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
1038 OverflowPatternExclusions |=
1044 for (
const auto *Arg : Args) {
1045 if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) {
1046 int LegacySanitizeCoverage;
1047 if (Arg->getNumValues() == 1 &&
1048 !StringRef(Arg->getValue(0))
1049 .getAsInteger(0, LegacySanitizeCoverage)) {
1050 CoverageFeatures = 0;
1052 if (LegacySanitizeCoverage != 0 && DiagnoseErrors) {
1053 D.
Diag(diag::warn_drv_deprecated_arg)
1054 << Arg->getAsString(Args) <<
true
1055 <<
"-fsanitize-coverage=trace-pc-guard";
1066 CoverageFeatures = 0;
1068 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_coverage)) {
1074 if (DiagnoseErrors) {
1076 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1077 <<
"-fsanitize-coverage=func"
1078 <<
"-fsanitize-coverage=bb";
1080 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1081 <<
"-fsanitize-coverage=func"
1082 <<
"-fsanitize-coverage=edge";
1084 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1085 <<
"-fsanitize-coverage=bb"
1086 <<
"-fsanitize-coverage=edge";
1090 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1091 <<
"-fsanitize-coverage=trace-bb" <<
true
1092 <<
"-fsanitize-coverage=trace-pc-guard";
1094 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1095 <<
"-fsanitize-coverage=8bit-counters" <<
true
1096 <<
"-fsanitize-coverage=trace-pc-guard";
1104 if ((CoverageFeatures & InsertionPointTypes) &&
1105 !(CoverageFeatures & InstrumentationTypes) && DiagnoseErrors) {
1106 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1107 <<
"-fsanitize-coverage=[func|bb|edge]" <<
true
1108 <<
"-fsanitize-coverage=[func|bb|edge],[trace-pc-guard|trace-pc],["
1113 if (!(CoverageFeatures & InsertionPointTypes)) {
1127 if (CoverageFeatures) {
1129 D, Args, CoverageAllowlistFiles,
1130 options::OPT_fsanitize_coverage_allowlist, OptSpecifier(),
1131 clang::diag::err_drv_malformed_sanitizer_coverage_allowlist,
1134 D, Args, CoverageIgnorelistFiles,
1135 options::OPT_fsanitize_coverage_ignorelist, OptSpecifier(),
1136 clang::diag::err_drv_malformed_sanitizer_coverage_ignorelist,
1141 for (
const auto *Arg :
1142 Args.filtered(options::OPT_fexperimental_sanitize_metadata_EQ,
1143 options::OPT_fno_experimental_sanitize_metadata_EQ)) {
1144 if (Arg->getOption().matches(
1145 options::OPT_fexperimental_sanitize_metadata_EQ)) {
1147 BinaryMetadataFeatures |=
1151 BinaryMetadataFeatures &=
1157 if (BinaryMetadataFeatures) {
1159 D, Args, BinaryMetadataIgnorelistFiles,
1160 options::OPT_fexperimental_sanitize_metadata_ignorelist_EQ,
1162 clang::diag::err_drv_malformed_sanitizer_metadata_ignorelist,
1166 SharedRuntime = Args.hasFlag(
1167 options::OPT_shared_libsan, options::OPT_static_libsan,
1170 if (!SharedRuntime && TC.
getTriple().isOSWindows()) {
1172 Args.getLastArg(options::OPT_shared_libsan, options::OPT_static_libsan);
1173 D.
Diag(clang::diag::err_drv_unsupported_opt_for_target)
1174 << A->getSpelling() << TC.
getTriple().str();
1177 ImplicitCfiRuntime = TC.
getTriple().isAndroid();
1179 if (AllAddedKinds & SanitizerKind::Address) {
1180 NeedPIE |= TC.
getTriple().isOSFuchsia();
1182 Args.getLastArg(options::OPT_fsanitize_address_field_padding)) {
1183 StringRef S = A->getValue();
1185 if ((S.getAsInteger(0, AsanFieldPadding) || AsanFieldPadding < 0 ||
1186 AsanFieldPadding > 2) &&
1188 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1192 if (Arg *WindowsDebugRTArg =
1193 Args.getLastArg(options::OPT__SLASH_MTd, options::OPT__SLASH_MT,
1194 options::OPT__SLASH_MDd, options::OPT__SLASH_MD,
1195 options::OPT__SLASH_LDd, options::OPT__SLASH_LD)) {
1196 switch (WindowsDebugRTArg->getOption().getID()) {
1197 case options::OPT__SLASH_MTd:
1198 case options::OPT__SLASH_MDd:
1199 case options::OPT__SLASH_LDd:
1200 if (DiagnoseErrors) {
1201 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1202 << WindowsDebugRTArg->getAsString(Args)
1204 D.
Diag(clang::diag::note_drv_address_sanitizer_debug_runtime);
1209 StableABI = Args.hasFlag(options::OPT_fsanitize_stable_abi,
1210 options::OPT_fno_sanitize_stable_abi,
false);
1212 AsanPoisonCustomArrayCookie = Args.hasFlag(
1213 options::OPT_fsanitize_address_poison_custom_array_cookie,
1214 options::OPT_fno_sanitize_address_poison_custom_array_cookie,
1215 AsanPoisonCustomArrayCookie);
1217 AsanOutlineInstrumentation =
1218 Args.hasFlag(options::OPT_fsanitize_address_outline_instrumentation,
1219 options::OPT_fno_sanitize_address_outline_instrumentation,
1220 AsanOutlineInstrumentation);
1222 AsanGlobalsDeadStripping = Args.hasFlag(
1223 options::OPT_fsanitize_address_globals_dead_stripping,
1224 options::OPT_fno_sanitize_address_globals_dead_stripping,
true);
1230 AsanUseOdrIndicator =
1231 Args.hasFlag(options::OPT_fsanitize_address_use_odr_indicator,
1232 options::OPT_fno_sanitize_address_use_odr_indicator,
1235 if (AllAddedKinds & SanitizerKind::PointerCompare & ~AllRemove) {
1236 AsanInvalidPointerCmp =
true;
1239 if (AllAddedKinds & SanitizerKind::PointerSubtract & ~AllRemove) {
1240 AsanInvalidPointerSub =
true;
1244 (Args.hasArg(options::OPT_mkernel) ||
1245 Args.hasArg(options::OPT_fapple_kext))) {
1246 AsanDtorKind = llvm::AsanDtorKind::None;
1249 if (
const auto *Arg =
1250 Args.getLastArg(options::OPT_sanitize_address_destructor_EQ)) {
1252 if (parsedAsanDtorKind == llvm::AsanDtorKind::Invalid && DiagnoseErrors) {
1253 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1254 << Arg->getSpelling() << Arg->getValue();
1256 AsanDtorKind = parsedAsanDtorKind;
1259 if (
const auto *Arg = Args.getLastArg(
1260 options::OPT_sanitize_address_use_after_return_EQ)) {
1261 auto parsedAsanUseAfterReturn =
1263 if (parsedAsanUseAfterReturn ==
1264 llvm::AsanDetectStackUseAfterReturnMode::Invalid &&
1266 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1267 << Arg->getSpelling() << Arg->getValue();
1269 AsanUseAfterReturn = parsedAsanUseAfterReturn;
1275 SanitizerKind::PointerCompare | SanitizerKind::PointerSubtract;
1276 if ((AllAddedKinds & DetectInvalidPointerPairs & ~AllRemove) &&
1278 TC.
getDriver().
Diag(clang::diag::err_drv_argument_only_allowed_with)
1280 SanitizerKind::PointerCompare |
1281 SanitizerKind::PointerSubtract)
1282 <<
"-fsanitize=address";
1286 if (AllAddedKinds & (SanitizerKind::Address | SanitizerKind::KernelAddress)) {
1287 AsanUseAfterScope = Args.hasFlag(
1288 options::OPT_fsanitize_address_use_after_scope,
1289 options::OPT_fno_sanitize_address_use_after_scope, AsanUseAfterScope);
1291 AsanUseAfterScope =
false;
1294 if (AllAddedKinds & SanitizerKind::HWAddress) {
1295 if (Arg *HwasanAbiArg =
1296 Args.getLastArg(options::OPT_fsanitize_hwaddress_abi_EQ)) {
1297 HwasanAbi = HwasanAbiArg->getValue();
1298 if (HwasanAbi !=
"platform" && HwasanAbi !=
"interceptor" &&
1300 D.
Diag(clang::diag::err_drv_invalid_value)
1301 << HwasanAbiArg->getAsString(Args) << HwasanAbi;
1303 HwasanAbi =
"interceptor";
1305 if (TC.
getTriple().getArch() == llvm::Triple::x86_64)
1306 HwasanUseAliases = Args.hasFlag(
1307 options::OPT_fsanitize_hwaddress_experimental_aliasing,
1308 options::OPT_fno_sanitize_hwaddress_experimental_aliasing,
1312 if (AllAddedKinds & SanitizerKind::SafeStack) {
1318 if (AllAddedKinds & SanitizerKind::AllocToken) {
1319 AllocTokenFastABI = Args.hasFlag(
1320 options::OPT_fsanitize_alloc_token_fast_abi,
1321 options::OPT_fno_sanitize_alloc_token_fast_abi, AllocTokenFastABI);
1322 AllocTokenExtended = Args.hasFlag(
1323 options::OPT_fsanitize_alloc_token_extended,
1324 options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended);
1327 if (AllAddedKinds & SanitizerKind::Type) {
1328 TysanOutlineInstrumentation =
1329 Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation,
1330 options::OPT_fno_sanitize_type_outline_instrumentation,
1331 TysanOutlineInstrumentation);
1334 LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime,
1335 options::OPT_fno_sanitize_link_runtime,
1336 !Args.hasArg(options::OPT_r));
1341 Args.hasFlag(options::OPT_fsanitize_link_cxx_runtime,
1342 options::OPT_fno_sanitize_link_cxx_runtime, LinkCXXRuntimes);
1344 NeedsMemProfRt = Args.hasFlag(options::OPT_fmemory_profile,
1345 options::OPT_fmemory_profile_EQ,
1346 options::OPT_fno_memory_profile,
false);
1349 Sanitizers.Mask |= Kinds;
1350 RecoverableSanitizers.Mask |= RecoverableKinds;
1351 TrapSanitizers.Mask |= TrappingKinds;
1352 assert(!(RecoverableKinds & TrappingKinds) &&
1353 "Overlap between recoverable and trapping sanitizers");
1355 MergeHandlers.Mask |= MergeKinds;
1357 AnnotateDebugInfo.Mask |= AnnotateDebugInfoKinds;
1358 SuppressUBSanFeature.Mask |= IgnoreForUbsanFeature;
1361 SkipHotCutoffs.clear(~Sanitizers.Mask);