75 lines
3 KiB
Python
75 lines
3 KiB
Python
|
# -*- Python -*-
|
||
|
|
||
|
import os
|
||
|
import platform
|
||
|
import re
|
||
|
|
||
|
import lit.formats
|
||
|
|
||
|
def get_required_attr(config, attr_name):
|
||
|
attr_value = getattr(config, attr_name, None)
|
||
|
if attr_value is None:
|
||
|
lit_config.fatal(
|
||
|
'No attribute %r in test configuration! You may need to run '
|
||
|
'tests from your build directory or add this attribute '
|
||
|
'to lit.site.cfg.py ' % attr_name)
|
||
|
return attr_value
|
||
|
|
||
|
# Setup config name.
|
||
|
config.name = 'AddressSanitizerABI' + config.name_suffix
|
||
|
|
||
|
# Platform-specific default ASAN_ABI_OPTIONS for lit tests.
|
||
|
default_asan_abi_opts = list(config.default_sanitizer_opts)
|
||
|
|
||
|
default_asan_abi_opts_str = ':'.join(default_asan_abi_opts)
|
||
|
if default_asan_abi_opts_str:
|
||
|
config.environment['ASAN_ABI_OPTIONS'] = default_asan_abi_opts_str
|
||
|
default_asan_abi_opts_str += ':'
|
||
|
config.substitutions.append(('%env_asan_abi_opts=',
|
||
|
'env ASAN_ABI_OPTIONS=' + default_asan_abi_opts_str))
|
||
|
|
||
|
# Setup source root.
|
||
|
config.test_source_root = os.path.dirname(__file__)
|
||
|
|
||
|
# GCC-ASan doesn't link in all the necessary libraries automatically, so
|
||
|
# we have to do it ourselves.
|
||
|
extra_link_flags = []
|
||
|
|
||
|
# Setup default compiler flags used with -fsanitize=address option.
|
||
|
# FIXME: Review the set of required flags and check if it can be reduced.
|
||
|
target_cflags = [get_required_attr(config, 'target_cflags')] + extra_link_flags
|
||
|
target_cxxflags = config.cxx_mode_flags + target_cflags
|
||
|
clang_asan_abi_static_cflags = (['-fsanitize=address',
|
||
|
'-fsanitize-stable-abi',
|
||
|
'-mno-omit-leaf-frame-pointer',
|
||
|
'-fno-omit-frame-pointer',
|
||
|
'-fno-optimize-sibling-calls'] +
|
||
|
config.debug_info_flags + target_cflags)
|
||
|
clang_asan_abi_static_cxxflags = config.cxx_mode_flags + clang_asan_abi_static_cflags
|
||
|
|
||
|
config.available_features.add('asan_abi-static-runtime')
|
||
|
clang_asan_abi_cflags = clang_asan_abi_static_cflags
|
||
|
clang_asan_abi_cxxflags = clang_asan_abi_static_cxxflags
|
||
|
|
||
|
def build_invocation(compile_flags):
|
||
|
return ' ' + ' '.join([config.clang] + compile_flags) + ' '
|
||
|
|
||
|
config.substitutions.append( ('%clang ', build_invocation(target_cflags)) )
|
||
|
config.substitutions.append( ('%clangxx ', build_invocation(target_cxxflags)) )
|
||
|
config.substitutions.append( ('%clang_asan_abi ', build_invocation(clang_asan_abi_cflags)) )
|
||
|
config.substitutions.append( ('%clangxx_asan_abi ', build_invocation(clang_asan_abi_cxxflags)) )
|
||
|
|
||
|
libasan_abi_path = os.path.join(config.compiler_rt_libdir, 'libclang_rt.asan_abi_osx.a'.format(config.apple_platform))
|
||
|
|
||
|
if libasan_abi_path is not None:
|
||
|
config.substitutions.append( ('%libasan_abi', libasan_abi_path) )
|
||
|
config.substitutions.append( ('%clang_asan_abi_static ', build_invocation(clang_asan_abi_static_cflags)) )
|
||
|
config.substitutions.append( ('%clangxx_asan_abi_static ', build_invocation(clang_asan_abi_static_cxxflags)) )
|
||
|
|
||
|
config.suffixes = ['.c', '.cpp']
|
||
|
|
||
|
if config.host_os == 'Darwin':
|
||
|
config.suffixes.append('.mm')
|
||
|
else:
|
||
|
config.unsupported = True
|