6 config
.name
= 'HWAddressSanitizer' + getattr(config
, 'name_suffix', 'default')
9 config
.test_source_root
= os
.path
.dirname(__file__
)
11 # Setup default compiler flags used with -fsanitize=memory option.
12 clang_cflags
= [config
.target_cflags
] + config
.debug_info_flags
13 clang_cxxflags
= config
.cxx_mode_flags
+ clang_cflags
14 clang_hwasan_common_cflags
= clang_cflags
+ ["-fsanitize=hwaddress", "-fuse-ld=lld"]
16 if config
.target_arch
== 'x86_64' and config
.enable_aliases
== '1':
17 clang_hwasan_common_cflags
+= ["-fsanitize-hwaddress-experimental-aliasing"]
19 config
.available_features
.add('pointer-tagging')
20 if config
.target_arch
== 'x86_64':
21 # The callback instrumentation used on x86_64 has a 1/64 chance of choosing a
22 # stack tag of 0. This causes stack tests to become flaky, so we force tags
23 # to be generated via calls to __hwasan_generate_tag, which never returns 0.
24 # TODO: See if we can remove this once we use the outlined instrumentation.
25 clang_hwasan_common_cflags
+= ["-mllvm", "-hwasan-generate-tags-with-calls=1"]
26 clang_hwasan_cflags
= clang_hwasan_common_cflags
+ ["-mllvm", "-hwasan-globals",
27 "-mllvm", "-hwasan-use-short-granules",
28 "-mllvm", "-hwasan-instrument-landing-pads=0",
29 "-mllvm", "-hwasan-instrument-personality-functions"]
30 clang_hwasan_oldrt_cflags
= clang_hwasan_common_cflags
+ ["-mllvm", "-hwasan-use-short-granules=0",
31 "-mllvm", "-hwasan-instrument-landing-pads=1",
32 "-mllvm", "-hwasan-instrument-personality-functions=0"]
34 clang_hwasan_cxxflags
= config
.cxx_mode_flags
+ clang_hwasan_cflags
35 clang_hwasan_oldrt_cxxflags
= config
.cxx_mode_flags
+ clang_hwasan_oldrt_cflags
37 def build_invocation(compile_flags
):
38 return " " + " ".join([config
.clang
] + compile_flags
) + " "
40 config
.substitutions
.append( ("%clangxx ", build_invocation(clang_cxxflags
)) )
41 config
.substitutions
.append( ("%clang_hwasan ", build_invocation(clang_hwasan_cflags
)) )
42 config
.substitutions
.append( ("%clang_hwasan_oldrt ", build_invocation(clang_hwasan_oldrt_cflags
)) )
43 config
.substitutions
.append( ("%clangxx_hwasan ", build_invocation(clang_hwasan_cxxflags
)) )
44 config
.substitutions
.append( ("%clangxx_hwasan_oldrt ", build_invocation(clang_hwasan_oldrt_cxxflags
)) )
45 config
.substitutions
.append( ("%compiler_rt_libdir", config
.compiler_rt_libdir
) )
47 default_hwasan_opts_str
= ':'.join(['disable_allocator_tagging=1', 'random_tags=0', 'fail_without_syscall_abi=0'] + config
.default_sanitizer_opts
)
48 if default_hwasan_opts_str
:
49 config
.environment
['HWASAN_OPTIONS'] = default_hwasan_opts_str
50 default_hwasan_opts_str
+= ':'
51 config
.substitutions
.append(('%env_hwasan_opts=',
52 'env HWASAN_OPTIONS=' + default_hwasan_opts_str
))
54 # Default test suffixes.
55 config
.suffixes
= ['.c', '.cpp']
57 if config
.host_os
not in ['Linux', 'Android'] or not config
.has_lld
:
58 config
.unsupported
= True