diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1547,6 +1547,14 @@ Group, Flags<[CoreOption, NoXarchOption]>, HelpText<"Disable origins tracking in MemorySanitizer">; +def fsanitize_hwaddress_experimental_aliasing + : Flag<["-"], "fsanitize-hwaddress-experimental-aliasing">, + Group, + HelpText<"Enable aliasing mode in HWAddressSanitizer">; +def fno_sanitize_hwaddress_experimental_aliasing + : Flag<["-"], "fno-sanitize-hwaddress-experimental-aliasing">, + Group, Flags<[CoreOption, NoXarchOption]>, + HelpText<"Disable aliasing mode in HWAddressSanitizer">; defm sanitize_memory_use_after_dtor : BoolOption<"f", "sanitize-memory-use-after-dtor", CodeGenOpts<"SanitizeMemoryUseAfterDtor">, DefaultFalse, PosFlag, NegFlag, diff --git a/clang/include/clang/Driver/SanitizerArgs.h b/clang/include/clang/Driver/SanitizerArgs.h --- a/clang/include/clang/Driver/SanitizerArgs.h +++ b/clang/include/clang/Driver/SanitizerArgs.h @@ -57,6 +57,7 @@ // True if cross-dso CFI support if provided by the system (i.e. Android). bool ImplicitCfiRuntime = false; bool NeedsMemProfRt = false; + bool HwasanUseAliases = false; public: /// Parses the sanitizer arguments from an argument list. @@ -69,6 +70,9 @@ bool needsHwasanRt() const { return Sanitizers.has(SanitizerKind::HWAddress); } + bool needsHwasanAliasesRt() const { + return needsHwasanRt() && HwasanUseAliases; + } bool needsTsanRt() const { return Sanitizers.has(SanitizerKind::Thread); } bool needsMsanRt() const { return Sanitizers.has(SanitizerKind::Memory); } bool needsFuzzer() const { return Sanitizers.has(SanitizerKind::Fuzzer); } diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp --- a/clang/lib/Driver/SanitizerArgs.cpp +++ b/clang/lib/Driver/SanitizerArgs.cpp @@ -865,6 +865,11 @@ } else { HwasanAbi = "interceptor"; } + if (TC.getTriple().getArch() == llvm::Triple::x86_64) + HwasanUseAliases = Args.hasFlag( + options::OPT_fsanitize_hwaddress_experimental_aliasing, + options::OPT_fno_sanitize_hwaddress_experimental_aliasing, + HwasanUseAliases); } if (AllAddedKinds & SanitizerKind::SafeStack) { diff --git a/compiler-rt/test/hwasan/CMakeLists.txt b/compiler-rt/test/hwasan/CMakeLists.txt --- a/compiler-rt/test/hwasan/CMakeLists.txt +++ b/compiler-rt/test/hwasan/CMakeLists.txt @@ -33,5 +33,15 @@ add_lit_testsuite(check-hwasan "Running the HWAddressSanitizer tests" ${HWASAN_TESTSUITES} DEPENDS ${HWASAN_TEST_DEPS} + PARAMS "HWASAN_ENABLE_ALIASES=1" ) set_target_properties(check-hwasan PROPERTIES FOLDER "Compiler-RT Misc") + +add_lit_testsuite(check-hwasan-lam + "Running the HWAddressSanitizer tests with Intel LAM" + ${HWASAN_TESTSUITES} + DEPENDS ${HWASAN_TEST_DEPS} + PARAMS "HWASAN_ENABLE_ALIASES=0" + EXCLUDE_FROM_CHECK_ALL + ) +set_target_properties(check-hwasan-lam PROPERTIES FOLDER "Compiler-RT Misc") diff --git a/compiler-rt/test/hwasan/TestCases/Linux/vfork.c b/compiler-rt/test/hwasan/TestCases/Linux/vfork.c --- a/compiler-rt/test/hwasan/TestCases/Linux/vfork.c +++ b/compiler-rt/test/hwasan/TestCases/Linux/vfork.c @@ -2,9 +2,7 @@ // RUN: %clang_hwasan -O0 %s -o %t && %run %t 2>&1 // REQUIRES: aarch64-target-arch || x86_64-target-arch - -// Aliasing mode does not support stack tagging. -// XFAIL: x86_64 +// REQUIRES: pointer-tagging #include #include diff --git a/compiler-rt/test/hwasan/lit.cfg.py b/compiler-rt/test/hwasan/lit.cfg.py --- a/compiler-rt/test/hwasan/lit.cfg.py +++ b/compiler-rt/test/hwasan/lit.cfg.py @@ -12,6 +12,11 @@ clang_cflags = [config.target_cflags] + config.debug_info_flags clang_cxxflags = config.cxx_mode_flags + clang_cflags clang_hwasan_common_cflags = clang_cflags + ["-fsanitize=hwaddress", "-fuse-ld=lld"] + +if config.target_arch == 'x86_64' and config.enable_aliases == '1': + clang_hwasan_common_cflags += ["-fsanitize-hwaddress-experimental-aliasing"] +if config.enable_aliases != '1': + config.available_features.add('pointer-tagging') if config.target_arch == 'x86_64': # This does basically the same thing as tagged-globals on aarch64. Because # the x86_64 implementation is for testing purposes only there is no diff --git a/compiler-rt/test/hwasan/lit.site.cfg.py.in b/compiler-rt/test/hwasan/lit.site.cfg.py.in --- a/compiler-rt/test/hwasan/lit.site.cfg.py.in +++ b/compiler-rt/test/hwasan/lit.site.cfg.py.in @@ -6,6 +6,9 @@ config.target_arch = "@HWASAN_TEST_TARGET_ARCH@" config.android_files_to_push = @HWASAN_ANDROID_FILES_TO_PUSH@ +# Whether to use -mlam or not. +config.enable_aliases = lit_config.params.get("HWASAN_ENABLE_ALIASES", "@HWASAN_ENABLE_ALIASES@") + # Load common config for all compiler-rt lit tests. lit_config.load_config(config, "@COMPILER_RT_BINARY_DIR@/test/lit.common.configured")