400 const llvm::opt::ArgList &Args,
401 bool DiagnoseErrors,
bool DiagnoseBoundArchErrors,
425 : ToolChainSupported;
427 CfiCrossDso = Args.hasFlag(options::OPT_fsanitize_cfi_cross_dso,
428 options::OPT_fno_sanitize_cfi_cross_dso,
false);
435 const llvm::Triple &Triple = TC.
getTriple();
438 Args.hasFlag(options::OPT_fsanitize_minimal_runtime,
439 options::OPT_fno_sanitize_minimal_runtime, MinimalRuntime);
440 HandlerPreserveAllRegs =
441 Args.hasFlag(options::OPT_fsanitize_handler_preserve_all_regs,
442 options::OPT_fno_sanitize_handler_preserve_all_regs,
443 HandlerPreserveAllRegs) &&
444 MinimalRuntime && (Triple.isAArch64() || Triple.isX86_64());
445 TrapLoop = Args.hasFlag(options::OPT_fsanitize_trap_loop,
446 options::OPT_fno_sanitize_trap_loop,
false);
449 Arg *OptLevel = Args.getLastArg(options::OPT_O_Group);
450 bool RemoveObjectSizeAtO0 =
451 !OptLevel || OptLevel->getOption().matches(options::OPT_O0);
453 for (
const llvm::opt::Arg *Arg : llvm::reverse(Args)) {
454 if (Arg->getOption().matches(options::OPT_fsanitize_EQ)) {
458 if (RemoveObjectSizeAtO0) {
459 AllRemove |= SanitizerKind::ObjectSize;
463 if ((Add & SanitizerKind::ObjectSize) && DiagnoseErrors)
464 D.
Diag(diag::warn_drv_object_size_disabled_O0)
465 << Arg->getAsString(Args);
476 Add & InvalidTrappingKinds & ~DiagnosedKinds) {
477 if (DiagnoseErrors) {
479 D.
Diag(diag::err_drv_argument_not_allowed_with)
480 << Desc <<
"-fsanitize-trap=undefined";
482 DiagnosedKinds |= KindsToDiagnose;
484 Add &= ~InvalidTrappingKinds;
486 if (MinimalRuntime) {
489 if (DiagnoseErrors) {
491 D.
Diag(diag::err_drv_argument_not_allowed_with)
492 << Desc <<
"-fsanitize-minimal-runtime";
494 DiagnosedKinds |= KindsToDiagnose;
499 if (llvm::opt::Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
500 StringRef CM = A->getValue();
502 (Add & SanitizerKind::Function & ~DiagnosedKinds)) {
504 D.
Diag(diag::err_drv_argument_only_allowed_with)
505 <<
"-fsanitize=function"
508 DiagnosedKinds |= SanitizerKind::Function;
517 if (DiagnoseErrors) {
519 llvm::opt::Arg *A = Args.getLastArgNoClaim(
520 options::OPT_mexecute_only, options::OPT_mno_execute_only);
521 if (A && A->getOption().matches(options::OPT_mexecute_only))
522 D.
Diag(diag::err_drv_argument_not_allowed_with)
523 << Desc << A->getAsString(Args);
525 D.
Diag(diag::err_drv_unsupported_opt_for_target)
526 << Desc << Triple.str();
528 DiagnosedKinds |= KindsToDiagnose;
543 if (CfiCrossDso && (Add & SanitizerKind::CFIMFCall & ~DiagnosedKinds)) {
545 D.
Diag(diag::err_drv_argument_not_allowed_with)
546 <<
"-fsanitize=cfi-mfcall"
547 <<
"-fsanitize-cfi-cross-dso";
549 DiagnosedKinds |= SanitizerKind::CFIMFCall;
556 Add & ToolChainSupported & ~BoundArchSupported & ~DiagnosedKinds;
557 ArchSpecificUnsupported && DiagnoseBoundArchErrors) {
563 bool IsExplicitDevice =
564 Arg->getBaseArg().getOption().matches(options::OPT_Xarch_device);
568 StringRef Requirement =
570 if (!Requirement.empty()) {
578 err_drv_unsupported_option_for_offload_arch_req_feature
580 warn_drv_unsupported_option_for_offload_arch_req_feature)
581 << Arg->getAsString(Args) << BA.
ArchName << Requirement;
585 UnsupportedSet.
Mask = ArchSpecificUnsupported;
586 D.
Diag(diag::warn_drv_unsupported_option_part_for_target)
587 <<
toString(UnsupportedSet) << Arg->getAsString(Args)
591 DiagnosedKinds |= ArchSpecificUnsupported;
596 Add & ~ToolChainSupported & ~DiagnosedKinds;
597 DiagnoseErrors && KindsToDiagnose) {
598 bool IsExplicitDevice =
599 Arg->getBaseArg().getOption().matches(options::OPT_Xarch_device);
608 KindSet.
Mask = KindsToDiagnose;
609 D.
Diag(IsExplicitDevice
610 ? diag::err_drv_unsupported_option_part_for_target
611 : diag::warn_drv_unsupported_option_part_for_target)
612 <<
toString(KindSet) << Arg->getAsString(Args)
616 D.
Diag(diag::err_drv_unsupported_opt_for_target)
621 DiagnosedKinds |= KindsToDiagnose;
624 Add &= BoundArchSupported;
630 if (
const llvm::opt::Arg *NoRTTIArg = TC.
getRTTIArg()) {
631 assert(NoRTTIArg->getOption().matches(options::OPT_fno_rtti) &&
632 "RTTI disabled without -fno-rtti option?");
636 D.
Diag(diag::err_drv_argument_not_allowed_with)
637 <<
"-fsanitize=vptr" << NoRTTIArg->getAsString(Args);
642 D.
Diag(diag::warn_drv_disabling_vptr_no_rtti_default);
646 AllRemove |= SanitizerKind::Vptr;
654 Add &= ~InvalidTrappingKinds;
655 if (MinimalRuntime) {
666 if (Add & SanitizerKind::UndefinedGroup) {
667 bool S = Args.hasFlagNoClaim(options::OPT_fno_strict_overflow,
668 options::OPT_fstrict_overflow,
false);
669 if (Args.hasFlagNoClaim(options::OPT_fwrapv, options::OPT_fno_wrapv, S))
671 if (Args.hasFlagNoClaim(options::OPT_fwrapv_pointer,
672 options::OPT_fno_wrapv_pointer, S))
675 Add &= BoundArchSupported;
677 if (Add & SanitizerKind::Fuzzer)
678 Add |= SanitizerKind::FuzzerNoLink;
681 if (Add & SanitizerKind::FuzzerNoLink) {
690 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_EQ)) {
694 }
else if (Arg->getOption().matches(
695 options::OPT_fsanitize_ignore_for_ubsan_feature_EQ)) {
697 IgnoreForUbsanFeature |=
702 std::pair<SanitizerMask, SanitizerMask> IncompatibleGroups[] = {
703 std::make_pair(SanitizerKind::Address,
704 SanitizerKind::Thread | SanitizerKind::Memory),
705 std::make_pair(SanitizerKind::Type,
706 SanitizerKind::Address | SanitizerKind::KernelAddress |
707 SanitizerKind::Memory | SanitizerKind::Leak |
708 SanitizerKind::Thread | SanitizerKind::KernelAddress),
709 std::make_pair(SanitizerKind::Thread, SanitizerKind::Memory),
710 std::make_pair(SanitizerKind::Leak,
711 SanitizerKind::Thread | SanitizerKind::Memory),
712 std::make_pair(SanitizerKind::KernelAddress,
713 SanitizerKind::Address | SanitizerKind::Leak |
714 SanitizerKind::Thread | SanitizerKind::Memory),
715 std::make_pair(SanitizerKind::HWAddress,
716 SanitizerKind::Address | SanitizerKind::Thread |
717 SanitizerKind::Memory | SanitizerKind::KernelAddress),
718 std::make_pair(SanitizerKind::Scudo,
719 SanitizerKind::Address | SanitizerKind::HWAddress |
720 SanitizerKind::Leak | SanitizerKind::Thread |
721 SanitizerKind::Memory | SanitizerKind::KernelAddress),
722 std::make_pair(SanitizerKind::SafeStack,
724 : SanitizerKind::Leak) |
725 SanitizerKind::Address | SanitizerKind::HWAddress |
726 SanitizerKind::Thread | SanitizerKind::Memory |
727 SanitizerKind::KernelAddress),
728 std::make_pair(SanitizerKind::KernelHWAddress,
729 SanitizerKind::Address | SanitizerKind::HWAddress |
730 SanitizerKind::Leak | SanitizerKind::Thread |
731 SanitizerKind::Memory | SanitizerKind::KernelAddress |
732 SanitizerKind::SafeStack),
733 std::make_pair(SanitizerKind::KernelMemory,
734 SanitizerKind::Address | SanitizerKind::HWAddress |
735 SanitizerKind::Leak | SanitizerKind::Thread |
736 SanitizerKind::Memory | SanitizerKind::KernelAddress |
737 SanitizerKind::Scudo | SanitizerKind::SafeStack),
738 std::make_pair(SanitizerKind::MemTag, SanitizerKind::Address |
739 SanitizerKind::KernelAddress |
740 SanitizerKind::HWAddress |
741 SanitizerKind::KernelHWAddress),
742 std::make_pair(SanitizerKind::KCFI, SanitizerKind::Function),
743 std::make_pair(SanitizerKind::Realtime,
744 SanitizerKind::Address | SanitizerKind::Thread |
745 SanitizerKind::Undefined | SanitizerKind::Memory |
746 SanitizerKind::Type),
747 std::make_pair(SanitizerKind::AllocToken,
748 SanitizerKind::Address | SanitizerKind::HWAddress |
749 SanitizerKind::KernelAddress |
750 SanitizerKind::KernelHWAddress |
751 SanitizerKind::Memory)};
758 for (
auto G : IncompatibleGroups) {
760 if ((
Default & Group) && (Kinds & G.second))
774 D.
Diag(diag::err_drv_argument_only_allowed_with)
778 if ((Kinds & SanitizerKind::ShadowCallStack) && TC.
getTriple().isAArch64() &&
779 !llvm::AArch64::isX18ReservedByDefault(TC.
getTriple()) &&
780 !Args.hasArg(options::OPT_ffixed_x18) && DiagnoseErrors) {
781 D.
Diag(diag::err_drv_argument_only_allowed_with)
786 if ((Kinds & SanitizerKind::ShadowCallStack) &&
787 TC.
getTriple().getArch() == llvm::Triple::hexagon &&
788 !Args.hasArg(options::OPT_ffixed_r19) && DiagnoseErrors) {
789 D.
Diag(diag::err_drv_argument_only_allowed_with)
798 if (~BoundArchSupported & SanitizerKind::Vptr) {
804 if (KindsToDiagnose) {
806 S.
Mask = KindsToDiagnose;
808 D.
Diag(diag::err_drv_unsupported_opt_for_target)
810 Kinds &= ~KindsToDiagnose;
815 for (
auto G : IncompatibleGroups) {
820 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
836 options::OPT_fno_sanitize_recover_EQ);
837 RecoverableKinds &= Kinds;
839 TrappingKinds &= Kinds;
840 RecoverableKinds &= ~TrappingKinds;
845 options::OPT_fsanitize_merge_handlers_EQ,
846 options::OPT_fno_sanitize_merge_handlers_EQ);
855 {}, options::OPT_fsanitize_annotate_debug_info_EQ,
856 options::OPT_fno_sanitize_annotate_debug_info_EQ);
857 AnnotateDebugInfoKinds &= Kinds;
862 if (!Args.hasArgNoClaim(options::OPT_fno_sanitize_ignorelist))
868 D, Args, UserIgnorelistFiles, options::OPT_fsanitize_ignorelist_EQ,
869 options::OPT_fno_sanitize_ignorelist,
870 clang::diag::err_drv_malformed_sanitizer_ignorelist, DiagnoseErrors);
873 if (Arg *A = Args.getLastArg(
874 options::OPT_fsanitize_coverage_stack_depth_callback_min_EQ)) {
875 StringRef S = A->getValue();
876 if (S.getAsInteger(0, CoverageStackDepthCallbackMin) ||
877 CoverageStackDepthCallbackMin < 0) {
879 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
884 if (AllAddedKinds & SanitizerKind::Memory) {
886 Args.getLastArg(options::OPT_fsanitize_memory_track_origins_EQ,
887 options::OPT_fno_sanitize_memory_track_origins)) {
888 if (!A->getOption().matches(
889 options::OPT_fno_sanitize_memory_track_origins)) {
890 StringRef S = A->getValue();
891 if (S.getAsInteger(0, MsanTrackOrigins) || MsanTrackOrigins < 0 ||
892 MsanTrackOrigins > 2) {
894 D.
Diag(clang::diag::err_drv_invalid_value)
895 << A->getAsString(Args) << S;
899 MsanUseAfterDtor = Args.hasFlag(
900 options::OPT_fsanitize_memory_use_after_dtor,
901 options::OPT_fno_sanitize_memory_use_after_dtor, MsanUseAfterDtor);
902 MsanParamRetval = Args.hasFlag(
903 options::OPT_fsanitize_memory_param_retval,
904 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
905 }
else if (AllAddedKinds & SanitizerKind::KernelMemory) {
906 MsanUseAfterDtor =
false;
907 MsanParamRetval = Args.hasFlag(
908 options::OPT_fsanitize_memory_param_retval,
909 options::OPT_fno_sanitize_memory_param_retval, MsanParamRetval);
911 MsanUseAfterDtor =
false;
912 MsanParamRetval =
false;
915 if (AllAddedKinds & SanitizerKind::MemTag) {
917 Args.getLastArgValue(options::OPT_fsanitize_memtag_mode_EQ,
"sync");
918 if (S ==
"async" || S ==
"sync") {
919 MemtagMode = S.str();
921 D.
Diag(clang::diag::err_drv_invalid_value_with_suggestion)
922 <<
"-fsanitize-memtag-mode=" << S <<
"{async, sync}";
927 if (AllAddedKinds & SanitizerKind::Thread) {
928 TsanMemoryAccess = Args.hasFlag(
929 options::OPT_fsanitize_thread_memory_access,
930 options::OPT_fno_sanitize_thread_memory_access, TsanMemoryAccess);
931 TsanFuncEntryExit = Args.hasFlag(
932 options::OPT_fsanitize_thread_func_entry_exit,
933 options::OPT_fno_sanitize_thread_func_entry_exit, TsanFuncEntryExit);
935 Args.hasFlag(options::OPT_fsanitize_thread_atomics,
936 options::OPT_fno_sanitize_thread_atomics, TsanAtomics);
939 if (AllAddedKinds & SanitizerKind::CFI) {
942 NeedPIE |= CfiCrossDso;
943 CfiICallGeneralizePointers =
944 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
946 CfiICallNormalizeIntegers =
947 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
949 if (CfiCrossDso && CfiICallGeneralizePointers && DiagnoseErrors)
950 D.
Diag(diag::err_drv_argument_not_allowed_with)
951 <<
"-fsanitize-cfi-cross-dso"
952 <<
"-fsanitize-cfi-icall-generalize-pointers";
954 CfiCanonicalJumpTables =
955 Args.hasFlag(options::OPT_fsanitize_cfi_canonical_jump_tables,
956 options::OPT_fno_sanitize_cfi_canonical_jump_tables,
true);
959 if (AllAddedKinds & SanitizerKind::KCFI) {
960 CfiICallGeneralizePointers =
961 Args.hasArg(options::OPT_fsanitize_cfi_icall_generalize_pointers);
962 CfiICallNormalizeIntegers =
963 Args.hasArg(options::OPT_fsanitize_cfi_icall_normalize_integers);
965 KcfiArity = Args.hasArg(options::OPT_fsanitize_kcfi_arity);
967 if (AllAddedKinds & SanitizerKind::CFI && DiagnoseErrors)
968 D.
Diag(diag::err_drv_argument_not_allowed_with)
973 Stats = Args.hasFlag(options::OPT_fsanitize_stats,
974 options::OPT_fno_sanitize_stats,
false);
976 if (MinimalRuntime) {
979 if (IncompatibleMask && DiagnoseErrors)
980 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
981 <<
"-fsanitize-minimal-runtime"
985 for (
const auto *Arg : Args.filtered(
986 options::OPT_fsanitize_undefined_ignore_overflow_pattern_EQ)) {
988 OverflowPatternExclusions |=
994 for (
const auto *Arg : Args) {
995 if (Arg->getOption().matches(options::OPT_fsanitize_coverage)) {
996 int LegacySanitizeCoverage;
997 if (Arg->getNumValues() == 1 &&
998 !StringRef(Arg->getValue(0))
999 .getAsInteger(0, LegacySanitizeCoverage)) {
1000 CoverageFeatures = 0;
1002 if (LegacySanitizeCoverage != 0 && DiagnoseErrors) {
1003 D.
Diag(diag::warn_drv_deprecated_arg)
1004 << Arg->getAsString(Args) <<
true
1005 <<
"-fsanitize-coverage=trace-pc-guard";
1016 CoverageFeatures = 0;
1018 }
else if (Arg->getOption().matches(options::OPT_fno_sanitize_coverage)) {
1024 if (DiagnoseErrors) {
1026 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1027 <<
"-fsanitize-coverage=func"
1028 <<
"-fsanitize-coverage=bb";
1030 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1031 <<
"-fsanitize-coverage=func"
1032 <<
"-fsanitize-coverage=edge";
1034 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1035 <<
"-fsanitize-coverage=bb"
1036 <<
"-fsanitize-coverage=edge";
1040 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1041 <<
"-fsanitize-coverage=trace-bb" <<
true
1042 <<
"-fsanitize-coverage=trace-pc-guard";
1044 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1045 <<
"-fsanitize-coverage=8bit-counters" <<
true
1046 <<
"-fsanitize-coverage=trace-pc-guard";
1054 if ((CoverageFeatures & InsertionPointTypes) &&
1055 !(CoverageFeatures & InstrumentationTypes) && DiagnoseErrors) {
1056 D.
Diag(clang::diag::warn_drv_deprecated_arg)
1057 <<
"-fsanitize-coverage=[func|bb|edge]" <<
true
1058 <<
"-fsanitize-coverage=[func|bb|edge],[trace-pc-guard|trace-pc],["
1063 if (!(CoverageFeatures & InsertionPointTypes)) {
1077 if (CoverageFeatures) {
1079 D, Args, CoverageAllowlistFiles,
1080 options::OPT_fsanitize_coverage_allowlist, OptSpecifier(),
1081 clang::diag::err_drv_malformed_sanitizer_coverage_allowlist,
1084 D, Args, CoverageIgnorelistFiles,
1085 options::OPT_fsanitize_coverage_ignorelist, OptSpecifier(),
1086 clang::diag::err_drv_malformed_sanitizer_coverage_ignorelist,
1091 for (
const auto *Arg :
1092 Args.filtered(options::OPT_fexperimental_sanitize_metadata_EQ,
1093 options::OPT_fno_experimental_sanitize_metadata_EQ)) {
1094 if (Arg->getOption().matches(
1095 options::OPT_fexperimental_sanitize_metadata_EQ)) {
1097 BinaryMetadataFeatures |=
1101 BinaryMetadataFeatures &=
1107 if (BinaryMetadataFeatures) {
1109 D, Args, BinaryMetadataIgnorelistFiles,
1110 options::OPT_fexperimental_sanitize_metadata_ignorelist_EQ,
1112 clang::diag::err_drv_malformed_sanitizer_metadata_ignorelist,
1116 SharedRuntime = Args.hasFlag(
1117 options::OPT_shared_libsan, options::OPT_static_libsan,
1120 if (!SharedRuntime && TC.
getTriple().isOSWindows()) {
1122 Args.getLastArg(options::OPT_shared_libsan, options::OPT_static_libsan);
1123 D.
Diag(clang::diag::err_drv_unsupported_opt_for_target)
1124 << A->getSpelling() << TC.
getTriple().str();
1127 ImplicitCfiRuntime = TC.
getTriple().isAndroid();
1129 if (AllAddedKinds & SanitizerKind::Address) {
1130 NeedPIE |= TC.
getTriple().isOSFuchsia();
1132 Args.getLastArg(options::OPT_fsanitize_address_field_padding)) {
1133 StringRef S = A->getValue();
1135 if ((S.getAsInteger(0, AsanFieldPadding) || AsanFieldPadding < 0 ||
1136 AsanFieldPadding > 2) &&
1138 D.
Diag(clang::diag::err_drv_invalid_value) << A->getAsString(Args) << S;
1142 if (Arg *WindowsDebugRTArg =
1143 Args.getLastArg(options::OPT__SLASH_MTd, options::OPT__SLASH_MT,
1144 options::OPT__SLASH_MDd, options::OPT__SLASH_MD,
1145 options::OPT__SLASH_LDd, options::OPT__SLASH_LD)) {
1146 switch (WindowsDebugRTArg->getOption().getID()) {
1147 case options::OPT__SLASH_MTd:
1148 case options::OPT__SLASH_MDd:
1149 case options::OPT__SLASH_LDd:
1150 if (DiagnoseErrors) {
1151 D.
Diag(clang::diag::err_drv_argument_not_allowed_with)
1152 << WindowsDebugRTArg->getAsString(Args)
1154 D.
Diag(clang::diag::note_drv_address_sanitizer_debug_runtime);
1159 StableABI = Args.hasFlag(options::OPT_fsanitize_stable_abi,
1160 options::OPT_fno_sanitize_stable_abi,
false);
1162 AsanPoisonCustomArrayCookie = Args.hasFlag(
1163 options::OPT_fsanitize_address_poison_custom_array_cookie,
1164 options::OPT_fno_sanitize_address_poison_custom_array_cookie,
1165 AsanPoisonCustomArrayCookie);
1167 AsanOutlineInstrumentation =
1168 Args.hasFlag(options::OPT_fsanitize_address_outline_instrumentation,
1169 options::OPT_fno_sanitize_address_outline_instrumentation,
1170 AsanOutlineInstrumentation);
1172 AsanGlobalsDeadStripping = Args.hasFlag(
1173 options::OPT_fsanitize_address_globals_dead_stripping,
1174 options::OPT_fno_sanitize_address_globals_dead_stripping,
true);
1180 AsanUseOdrIndicator =
1181 Args.hasFlag(options::OPT_fsanitize_address_use_odr_indicator,
1182 options::OPT_fno_sanitize_address_use_odr_indicator,
1185 if (AllAddedKinds & SanitizerKind::PointerCompare & ~AllRemove) {
1186 AsanInvalidPointerCmp =
true;
1189 if (AllAddedKinds & SanitizerKind::PointerSubtract & ~AllRemove) {
1190 AsanInvalidPointerSub =
true;
1194 (Args.hasArg(options::OPT_mkernel) ||
1195 Args.hasArg(options::OPT_fapple_kext))) {
1196 AsanDtorKind = llvm::AsanDtorKind::None;
1199 if (
const auto *Arg =
1200 Args.getLastArg(options::OPT_sanitize_address_destructor_EQ)) {
1202 if (parsedAsanDtorKind == llvm::AsanDtorKind::Invalid && DiagnoseErrors) {
1203 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1204 << Arg->getSpelling() << Arg->getValue();
1206 AsanDtorKind = parsedAsanDtorKind;
1209 if (
const auto *Arg = Args.getLastArg(
1210 options::OPT_sanitize_address_use_after_return_EQ)) {
1211 auto parsedAsanUseAfterReturn =
1213 if (parsedAsanUseAfterReturn ==
1214 llvm::AsanDetectStackUseAfterReturnMode::Invalid &&
1216 TC.
getDriver().
Diag(clang::diag::err_drv_unsupported_option_argument)
1217 << Arg->getSpelling() << Arg->getValue();
1219 AsanUseAfterReturn = parsedAsanUseAfterReturn;
1225 SanitizerKind::PointerCompare | SanitizerKind::PointerSubtract;
1226 if ((AllAddedKinds & DetectInvalidPointerPairs & ~AllRemove) &&
1228 TC.
getDriver().
Diag(clang::diag::err_drv_argument_only_allowed_with)
1230 SanitizerKind::PointerCompare |
1231 SanitizerKind::PointerSubtract)
1232 <<
"-fsanitize=address";
1236 if (AllAddedKinds & (SanitizerKind::Address | SanitizerKind::KernelAddress)) {
1237 AsanUseAfterScope = Args.hasFlag(
1238 options::OPT_fsanitize_address_use_after_scope,
1239 options::OPT_fno_sanitize_address_use_after_scope, AsanUseAfterScope);
1241 AsanUseAfterScope =
false;
1244 if (AllAddedKinds & SanitizerKind::HWAddress) {
1245 if (Arg *HwasanAbiArg =
1246 Args.getLastArg(options::OPT_fsanitize_hwaddress_abi_EQ)) {
1247 HwasanAbi = HwasanAbiArg->getValue();
1248 if (HwasanAbi !=
"platform" && HwasanAbi !=
"interceptor" &&
1250 D.
Diag(clang::diag::err_drv_invalid_value)
1251 << HwasanAbiArg->getAsString(Args) << HwasanAbi;
1253 HwasanAbi =
"interceptor";
1255 if (TC.
getTriple().getArch() == llvm::Triple::x86_64)
1256 HwasanUseAliases = Args.hasFlag(
1257 options::OPT_fsanitize_hwaddress_experimental_aliasing,
1258 options::OPT_fno_sanitize_hwaddress_experimental_aliasing,
1262 if (AllAddedKinds & SanitizerKind::SafeStack) {
1268 if (AllAddedKinds & SanitizerKind::AllocToken) {
1269 AllocTokenFastABI = Args.hasFlag(
1270 options::OPT_fsanitize_alloc_token_fast_abi,
1271 options::OPT_fno_sanitize_alloc_token_fast_abi, AllocTokenFastABI);
1272 AllocTokenExtended = Args.hasFlag(
1273 options::OPT_fsanitize_alloc_token_extended,
1274 options::OPT_fno_sanitize_alloc_token_extended, AllocTokenExtended);
1277 if (AllAddedKinds & SanitizerKind::Type) {
1278 TysanOutlineInstrumentation =
1279 Args.hasFlag(options::OPT_fsanitize_type_outline_instrumentation,
1280 options::OPT_fno_sanitize_type_outline_instrumentation,
1281 TysanOutlineInstrumentation);
1284 LinkRuntimes = Args.hasFlag(options::OPT_fsanitize_link_runtime,
1285 options::OPT_fno_sanitize_link_runtime,
1286 !Args.hasArg(options::OPT_r));
1291 Args.hasFlag(options::OPT_fsanitize_link_cxx_runtime,
1292 options::OPT_fno_sanitize_link_cxx_runtime, LinkCXXRuntimes);
1294 NeedsMemProfRt = Args.hasFlag(options::OPT_fmemory_profile,
1295 options::OPT_fmemory_profile_EQ,
1296 options::OPT_fno_memory_profile,
false);
1299 Sanitizers.Mask |= Kinds;
1300 RecoverableSanitizers.Mask |= RecoverableKinds;
1301 TrapSanitizers.Mask |= TrappingKinds;
1302 assert(!(RecoverableKinds & TrappingKinds) &&
1303 "Overlap between recoverable and trapping sanitizers");
1305 MergeHandlers.Mask |= MergeKinds;
1307 AnnotateDebugInfo.Mask |= AnnotateDebugInfoKinds;
1308 SuppressUBSanFeature.Mask |= IgnoreForUbsanFeature;
1311 SkipHotCutoffs.clear(~Sanitizers.Mask);