Index: clang/lib/Driver/SanitizerArgs.cpp =================================================================== --- clang/lib/Driver/SanitizerArgs.cpp +++ clang/lib/Driver/SanitizerArgs.cpp @@ -47,7 +47,8 @@ TrappingDefault = CFI, CFIClasses = CFIVCall | CFINVCall | CFIMFCall | CFIDerivedCast | CFIUnrelatedCast, - CompatibleWithMinimalRuntime = TrappingSupported | Scudo, + CompatibleWithMinimalRuntime = + Address | HWAddress | Thread | Memory | TrappingSupported | Scudo, }; enum CoverageFeature { Index: clang/test/Driver/fsanitize.c =================================================================== --- clang/test/Driver/fsanitize.c +++ clang/test/Driver/fsanitize.c @@ -719,10 +719,12 @@ // CHECK-ASAN-PS4: -lSceDbgAddressSanitizer_stub_weak // RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-minimal-runtime %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-MINIMAL -// CHECK-ASAN-MINIMAL: error: invalid argument '-fsanitize-minimal-runtime' not allowed with '-fsanitize=address' +// CHECK-ASAN-MINIMAL: "-fsanitize=address" +// CHECK-ASAN-MINIMAL: "-fsanitize-minimal-runtime" // RUN: %clang -target x86_64-linux-gnu -fsanitize=thread -fsanitize-minimal-runtime %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-TSAN-MINIMAL -// CHECK-TSAN-MINIMAL: error: invalid argument '-fsanitize-minimal-runtime' not allowed with '-fsanitize=thread' +// CHECK-TSAN-MINIMAL: "-fsanitize=thread" +// CHECK-TSAN-MINIMAL: "-fsanitize-minimal-runtime" // RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined -fsanitize-minimal-runtime %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UBSAN-MINIMAL // CHECK-UBSAN-MINIMAL: "-fsanitize={{((signed-integer-overflow|integer-divide-by-zero|float-divide-by-zero|shift-base|shift-exponent|unreachable|return|vla-bound|alignment|null|pointer-overflow|float-cast-overflow|array-bounds|enum|bool|builtin|returns-nonnull-attribute|nonnull-attribute|function),?){19}"}} @@ -731,10 +733,11 @@ // RUN: %clang -target x86_64-linux-gnu -fsanitize=undefined -fsanitize=vptr -fsanitize-minimal-runtime %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-UBSAN-VPTR-MINIMAL // CHECK-UBSAN-VPTR-MINIMAL: error: invalid argument '-fsanitize=vptr' not allowed with '-fsanitize-minimal-runtime' -// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-minimal-runtime -fsanitize=undefined %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-ASAN-UBSAN-MINIMAL -// CHECK-ASAN-UBSAN-MINIMAL: error: invalid argument '-fsanitize-minimal-runtime' not allowed with '-fsanitize=address' -// RUN: %clang -target x86_64-linux-gnu -fsanitize=hwaddress -fsanitize-minimal-runtime %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-HWASAN-MINIMAL -// CHECK-HWASAN-MINIMAL: error: invalid argument '-fsanitize-minimal-runtime' not allowed with '-fsanitize=hwaddress' +// RUN: %clang -target x86_64-linux-gnu -fsanitize=address -fsanitize-minimal-runtime -fsanitize=undefined %s -### 2>&1 +// OK + +// RUN: %clang -target x86_64-linux-gnu -fsanitize=hwaddress -fsanitize-minimal-runtime %s -### 2>&1 +// OK // RUN: %clang -target x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=hidden -fsanitize-minimal-runtime %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-CFI-MINIMAL // CHECK-CFI-MINIMAL: "-fsanitize=cfi-derived-cast,cfi-icall,cfi-mfcall,cfi-unrelated-cast,cfi-nvcall,cfi-vcall" Index: compiler-rt/lib/asan/CMakeLists.txt =================================================================== --- compiler-rt/lib/asan/CMakeLists.txt +++ compiler-rt/lib/asan/CMakeLists.txt @@ -161,6 +161,7 @@ RTSanitizerCommonSymbolizer RTLSanCommon RTUbsan + RTUbsan_minimal CFLAGS ${ASAN_DYNAMIC_CFLAGS} LINK_FLAGS ${WEAK_SYMBOL_LINK_FLAGS} DEFS ${ASAN_DYNAMIC_DEFINITIONS} @@ -175,7 +176,8 @@ RTSanitizerCommonCoverage RTSanitizerCommonSymbolizer RTLSanCommon - RTUbsan) + RTUbsan + RTUbsan_minimal) add_compiler_rt_runtime(clang_rt.asan STATIC Index: compiler-rt/lib/asan/tests/CMakeLists.txt =================================================================== --- compiler-rt/lib/asan/tests/CMakeLists.txt +++ compiler-rt/lib/asan/tests/CMakeLists.txt @@ -254,7 +254,8 @@ $ $ $ - $) + $ + $) else() set(ASAN_TEST_RUNTIME_OBJECTS $ @@ -266,7 +267,8 @@ $ $ $ - $) + $ + $) endif() add_library(${ASAN_TEST_RUNTIME} STATIC ${ASAN_TEST_RUNTIME_OBJECTS}) set_target_properties(${ASAN_TEST_RUNTIME} PROPERTIES @@ -291,6 +293,7 @@ $ $ $ + $ ${COMPILER_RT_GTEST_SOURCE} ${ASAN_NOINST_TEST_SOURCES}) set_target_compile_flags(AsanNoinstTest ${ASAN_UNITTEST_COMMON_CFLAGS}) Index: compiler-rt/lib/cfi/CMakeLists.txt =================================================================== --- compiler-rt/lib/cfi/CMakeLists.txt +++ compiler-rt/lib/cfi/CMakeLists.txt @@ -33,6 +33,7 @@ RTSanitizerCommonCoverage RTSanitizerCommonSymbolizer RTUbsan + RTUbsan_minimal CFLAGS ${CFI_CFLAGS} ${CFI_DIAG_CFLAGS} PARENT_TARGET cfi) endforeach() Index: compiler-rt/lib/hwasan/CMakeLists.txt =================================================================== --- compiler-rt/lib/hwasan/CMakeLists.txt +++ compiler-rt/lib/hwasan/CMakeLists.txt @@ -101,6 +101,7 @@ RTSanitizerCommonCoverage RTSanitizerCommonSymbolizer RTUbsan + RTUbsan_minimal CFLAGS ${HWASAN_RTL_CFLAGS} PARENT_TARGET hwasan) add_compiler_rt_runtime(clang_rt.hwasan_cxx @@ -137,6 +138,7 @@ RTSanitizerCommonCoverage RTSanitizerCommonSymbolizer RTUbsan + RTUbsan_minimal # The only purpose of RTHWAsan_dynamic_version_script_dummy is to # carry a dependency of the shared runtime on the version script. # Replacing it with a straightforward Index: compiler-rt/lib/msan/CMakeLists.txt =================================================================== --- compiler-rt/lib/msan/CMakeLists.txt +++ compiler-rt/lib/msan/CMakeLists.txt @@ -54,6 +54,7 @@ $ $ $ + $ ADDITIONAL_HEADERS ${MSAN_RTL_HEADERS} CFLAGS ${MSAN_RTL_CFLAGS} PARENT_TARGET msan) Index: compiler-rt/lib/tsan/CMakeLists.txt =================================================================== --- compiler-rt/lib/tsan/CMakeLists.txt +++ compiler-rt/lib/tsan/CMakeLists.txt @@ -122,6 +122,7 @@ RTSanitizerCommonCoverage RTSanitizerCommonSymbolizer RTUbsan + RTUbsan_minimal CFLAGS ${TSAN_RTL_CFLAGS} LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} ${WEAK_SYMBOL_LINK_FLAGS} LINK_LIBS ${TSAN_LINK_LIBS} objc @@ -193,6 +194,7 @@ $ $ $ + $ ADDITIONAL_HEADERS ${TSAN_HEADERS} CFLAGS ${TSAN_RTL_CFLAGS} PARENT_TARGET tsan) Index: compiler-rt/lib/ubsan/CMakeLists.txt =================================================================== --- compiler-rt/lib/ubsan/CMakeLists.txt +++ compiler-rt/lib/ubsan/CMakeLists.txt @@ -90,6 +90,7 @@ ARCHS ${UBSAN_SUPPORTED_ARCH} OBJECT_LIBS RTUbsan RTUbsan_standalone + RTUbsan_minimal RTSanitizerCommon RTSanitizerCommonLibc RTSanitizerCommonCoverage @@ -104,6 +105,7 @@ ARCHS ${UBSAN_SUPPORTED_ARCH} OBJECT_LIBS RTUbsan RTUbsan_standalone + RTUbsan_minimal RTSanitizerCommonNoHooks RTSanitizerCommonLibcNoHooks RTSanitizerCommonCoverage @@ -184,6 +186,7 @@ RTSanitizerCommonSymbolizer RTUbsan RTUbsan_standalone + RTUbsan_minimal RTInterception CFLAGS ${UBSAN_CFLAGS} PARENT_TARGET ubsan) @@ -206,6 +209,7 @@ RTUbsan RTUbsan_cxx RTUbsan_standalone + RTUbsan_minimal RTInterception CFLAGS ${UBSAN_CFLAGS} LINK_FLAGS ${SANITIZER_COMMON_LINK_FLAGS} Index: compiler-rt/lib/ubsan/ubsan_interface.inc =================================================================== --- compiler-rt/lib/ubsan/ubsan_interface.inc +++ compiler-rt/lib/ubsan/ubsan_interface.inc @@ -10,49 +10,91 @@ //===----------------------------------------------------------------------===// INTERFACE_FUNCTION(__ubsan_handle_add_overflow) INTERFACE_FUNCTION(__ubsan_handle_add_overflow_abort) +INTERFACE_FUNCTION(__ubsan_handle_add_overflow_minimal) +INTERFACE_FUNCTION(__ubsan_handle_add_overflow_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_builtin_unreachable) +INTERFACE_FUNCTION(__ubsan_handle_builtin_unreachable_minimal) INTERFACE_FUNCTION(__ubsan_handle_cfi_bad_type) INTERFACE_FUNCTION(__ubsan_handle_cfi_check_fail) INTERFACE_FUNCTION(__ubsan_handle_cfi_check_fail_abort) +INTERFACE_FUNCTION(__ubsan_handle_cfi_check_fail_minimal) +INTERFACE_FUNCTION(__ubsan_handle_cfi_check_fail_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_divrem_overflow) INTERFACE_FUNCTION(__ubsan_handle_divrem_overflow_abort) +INTERFACE_FUNCTION(__ubsan_handle_divrem_overflow_minimal) +INTERFACE_FUNCTION(__ubsan_handle_divrem_overflow_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_dynamic_type_cache_miss) INTERFACE_FUNCTION(__ubsan_handle_dynamic_type_cache_miss_abort) INTERFACE_FUNCTION(__ubsan_handle_float_cast_overflow) INTERFACE_FUNCTION(__ubsan_handle_float_cast_overflow_abort) +INTERFACE_FUNCTION(__ubsan_handle_float_cast_overflow_minimal) +INTERFACE_FUNCTION(__ubsan_handle_float_cast_overflow_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_function_type_mismatch) INTERFACE_FUNCTION(__ubsan_handle_function_type_mismatch_abort) +INTERFACE_FUNCTION(__ubsan_handle_function_type_mismatch_minimal) +INTERFACE_FUNCTION(__ubsan_handle_function_type_mismatch_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_implicit_conversion) INTERFACE_FUNCTION(__ubsan_handle_implicit_conversion_abort) +INTERFACE_FUNCTION(__ubsan_handle_implicit_conversion_minimal) +INTERFACE_FUNCTION(__ubsan_handle_implicit_conversion_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_invalid_builtin) INTERFACE_FUNCTION(__ubsan_handle_invalid_builtin_abort) +INTERFACE_FUNCTION(__ubsan_handle_invalid_builtin_minimal) +INTERFACE_FUNCTION(__ubsan_handle_invalid_builtin_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_load_invalid_value) INTERFACE_FUNCTION(__ubsan_handle_load_invalid_value_abort) +INTERFACE_FUNCTION(__ubsan_handle_load_invalid_value_minimal) +INTERFACE_FUNCTION(__ubsan_handle_load_invalid_value_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_missing_return) +INTERFACE_FUNCTION(__ubsan_handle_missing_return_minimal) INTERFACE_FUNCTION(__ubsan_handle_mul_overflow) INTERFACE_FUNCTION(__ubsan_handle_mul_overflow_abort) +INTERFACE_FUNCTION(__ubsan_handle_mul_overflow_minimal) +INTERFACE_FUNCTION(__ubsan_handle_mul_overflow_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_negate_overflow) INTERFACE_FUNCTION(__ubsan_handle_negate_overflow_abort) +INTERFACE_FUNCTION(__ubsan_handle_negate_overflow_minimal) +INTERFACE_FUNCTION(__ubsan_handle_negate_overflow_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_nonnull_arg) INTERFACE_FUNCTION(__ubsan_handle_nonnull_arg_abort) +INTERFACE_FUNCTION(__ubsan_handle_nonnull_arg_minimal) +INTERFACE_FUNCTION(__ubsan_handle_nonnull_arg_minimal_abort) +INTERFACE_FUNCTION(__ubsan_handle_nonnull_return_minimal) +INTERFACE_FUNCTION(__ubsan_handle_nonnull_return_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_nonnull_return_v1) INTERFACE_FUNCTION(__ubsan_handle_nonnull_return_v1_abort) INTERFACE_FUNCTION(__ubsan_handle_nullability_arg) INTERFACE_FUNCTION(__ubsan_handle_nullability_arg_abort) +INTERFACE_FUNCTION(__ubsan_handle_nullability_arg_minimal) +INTERFACE_FUNCTION(__ubsan_handle_nullability_arg_minimal_abort) +INTERFACE_FUNCTION(__ubsan_handle_nullability_return_minimal) +INTERFACE_FUNCTION(__ubsan_handle_nullability_return_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_nullability_return_v1) INTERFACE_FUNCTION(__ubsan_handle_nullability_return_v1_abort) INTERFACE_FUNCTION(__ubsan_handle_out_of_bounds) INTERFACE_FUNCTION(__ubsan_handle_out_of_bounds_abort) +INTERFACE_FUNCTION(__ubsan_handle_out_of_bounds_minimal) +INTERFACE_FUNCTION(__ubsan_handle_out_of_bounds_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_pointer_overflow) INTERFACE_FUNCTION(__ubsan_handle_pointer_overflow_abort) +INTERFACE_FUNCTION(__ubsan_handle_pointer_overflow_minimal) +INTERFACE_FUNCTION(__ubsan_handle_pointer_overflow_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_shift_out_of_bounds) INTERFACE_FUNCTION(__ubsan_handle_shift_out_of_bounds_abort) +INTERFACE_FUNCTION(__ubsan_handle_shift_out_of_bounds_minimal) +INTERFACE_FUNCTION(__ubsan_handle_shift_out_of_bounds_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_sub_overflow) INTERFACE_FUNCTION(__ubsan_handle_sub_overflow_abort) +INTERFACE_FUNCTION(__ubsan_handle_sub_overflow_minimal) +INTERFACE_FUNCTION(__ubsan_handle_sub_overflow_minimal_abort) +INTERFACE_FUNCTION(__ubsan_handle_type_mismatch_minimal) +INTERFACE_FUNCTION(__ubsan_handle_type_mismatch_minimal_abort) INTERFACE_FUNCTION(__ubsan_handle_type_mismatch_v1) INTERFACE_FUNCTION(__ubsan_handle_type_mismatch_v1_abort) INTERFACE_FUNCTION(__ubsan_handle_vla_bound_not_positive) INTERFACE_FUNCTION(__ubsan_handle_vla_bound_not_positive_abort) +INTERFACE_FUNCTION(__ubsan_handle_vla_bound_not_positive_minimal) +INTERFACE_FUNCTION(__ubsan_handle_vla_bound_not_positive_minimal_abort) INTERFACE_WEAK_FUNCTION(__ubsan_default_options) INTERFACE_FUNCTION(__ubsan_on_report) INTERFACE_FUNCTION(__ubsan_get_current_report_data)