import("//compiler-rt/target.gni")
if (current_toolchain == host_toolchain) {
copy("ignorelist") {
sources = [ "asan_ignorelist.txt" ]
outputs = [ "$clang_resource_dir/share/{{source_target_relative}}" ]
}
} else {
asan_sources = [
"asan_activation.cpp",
"asan_activation.h",
"asan_activation_flags.inc",
"asan_allocator.cpp",
"asan_allocator.h",
"asan_debugging.cpp",
"asan_descriptions.cpp",
"asan_descriptions.h",
"asan_errors.cpp",
"asan_errors.h",
"asan_fake_stack.cpp",
"asan_fake_stack.h",
"asan_flags.cpp",
"asan_flags.h",
"asan_flags.inc",
"asan_fuchsia.cpp",
"asan_globals.cpp",
"asan_globals_win.cpp",
"asan_init_version.h",
"asan_interceptors.cpp",
"asan_interceptors.h",
"asan_interceptors_memintrinsics.cpp",
"asan_interceptors_memintrinsics.h",
"asan_interface.inc",
"asan_interface_internal.h",
"asan_internal.h",
"asan_linux.cpp",
"asan_mac.cpp",
"asan_malloc_linux.cpp",
"asan_malloc_mac.cpp",
"asan_malloc_win.cpp",
"asan_mapping.h",
"asan_memory_profile.cpp",
"asan_poisoning.cpp",
"asan_poisoning.h",
"asan_posix.cpp",
"asan_premap_shadow.cpp",
"asan_premap_shadow.h",
"asan_report.cpp",
"asan_report.h",
"asan_rtl.cpp",
"asan_scariness_score.h",
"asan_shadow_setup.cpp",
"asan_stack.cpp",
"asan_stack.h",
"asan_stats.cpp",
"asan_stats.h",
"asan_suppressions.cpp",
"asan_suppressions.h",
"asan_thread.cpp",
"asan_thread.h",
"asan_win.cpp",
]
if (current_os != "mac" && current_os != "win") {
asan_sources += [ "asan_interceptors_vfork.S" ]
}
config("asan_config") {
cflags = []
if (current_os != "win") {
cflags += [ "-ftls-model=initial-exec" ]
} else {
ldflags = [ "/OPT:NOICF" ]
}
# FIXME: link rt dl m pthread log
# FIXME: dep on libcxx-headers?
# FIXME: add_sanitizer_rt_version_list (cf hwasan)
# FIXME: need libclang_rt.asan*.a.syms?
if (current_os == "android") {
ldflags = [ "-Wl,-z,global" ]
}
if (current_os == "mac") {
# The -U flags below correspond to the add_weak_symbols() calls in CMake.
ldflags = [
"-lc++",
"-lc++abi",
# asan
"-Wl,-U,___asan_default_options",
"-Wl,-U,___asan_default_suppressions",
"-Wl,-U,___asan_on_error",
"-Wl,-U,___asan_set_shadow_00",
"-Wl,-U,___asan_set_shadow_f1",
"-Wl,-U,___asan_set_shadow_f2",
"-Wl,-U,___asan_set_shadow_f3",
"-Wl,-U,___asan_set_shadow_f4",
"-Wl,-U,___asan_set_shadow_f5",
"-Wl,-U,___asan_set_shadow_f6",
"-Wl,-U,___asan_set_shadow_f7",
"-Wl,-U,___asan_set_shadow_f8",
# lsan
"-Wl,-U,___lsan_default_options",
"-Wl,-U,___lsan_default_suppressions",
"-Wl,-U,___lsan_is_turned_off",
# ubsan
"-Wl,-U,___ubsan_default_options",
# sanitizer_common
"-Wl,-U,___sanitizer_free_hook",
"-Wl,-U,___sanitizer_malloc_hook",
"-Wl,-U,___sanitizer_report_error_summary",
"-Wl,-U,___sanitizer_sandbox_on_notify",
"-Wl,-U,___sanitizer_symbolize_code",
"-Wl,-U,___sanitizer_symbolize_data",
"-Wl,-U,___sanitizer_symbolize_frame",
"-Wl,-U,___sanitizer_symbolize_demangle",
"-Wl,-U,___sanitizer_symbolize_flush",
"-Wl,-U,___sanitizer_symbolize_set_demangle",
"-Wl,-U,___sanitizer_symbolize_set_inline_frames",
# xray
"-Wl,-U,___start_xray_fn_idx",
"-Wl,-U,___start_xray_instr_map",
"-Wl,-U,___stop_xray_fn_idx",
"-Wl,-U,___stop_xray_instr_map",
# FIXME: better
"-Wl,-install_name,@rpath/libclang_rt.asan_osx_dynamic.dylib",
]
# FIXME: -Wl,-rpath
# FIXME: codesign (??)
}
}
source_set("cxx_sources") {
configs -= [ "//llvm/utils/gn/build:llvm_code" ]
configs += [ "//llvm/utils/gn/build:crt_code" ]
sources = [ "asan_new_delete.cpp" ]
}
source_set("static_sources") {
configs -= [ "//llvm/utils/gn/build:llvm_code" ]
configs += [ "//llvm/utils/gn/build:crt_code" ]
sources = [ "asan_rtl_static.cpp" ]
if (current_os != "mac" && current_os != "win") {
sources += [ "asan_rtl_x86_64.S" ]
}
}
source_set("preinit_sources") {
configs -= [ "//llvm/utils/gn/build:llvm_code" ]
configs += [ "//llvm/utils/gn/build:crt_code" ]
sources = [ "asan_preinit.cpp" ]
}
shared_library("asan_shared_library") {
output_dir = crt_current_out_dir
if (current_os == "mac") {
output_name = "clang_rt.asan_osx_dynamic"
} else if (current_os == "win") {
output_name = "clang_rt.asan_dynamic$crt_current_target_suffix"
} else {
output_name = "clang_rt.asan$crt_current_target_suffix"
}
configs -= [ "//llvm/utils/gn/build:llvm_code" ]
configs += [ "//llvm/utils/gn/build:crt_code" ]
configs += [ ":asan_config" ]
sources = asan_sources
deps = [
":cxx_sources",
"//compiler-rt/lib/interception:sources",
"//compiler-rt/lib/lsan:common_sources",
"//compiler-rt/lib/sanitizer_common:sources",
"//compiler-rt/lib/ubsan:cxx_sources",
"//compiler-rt/lib/ubsan:sources",
]
defines = [ "ASAN_DYNAMIC" ]
if (current_os == "win") {
defines += [ "INTERCEPTION_DYNAMIC_CRT" ]
}
}
if (current_os != "mac" && current_os != "win") {
static_library("asan_static_library") {
output_dir = crt_current_out_dir
output_name = "clang_rt.asan$crt_current_target_suffix"
complete_static_lib = true
configs -= [ "//llvm/utils/gn/build:llvm_code" ]
configs += [ "//llvm/utils/gn/build:crt_code" ]
configs += [ ":asan_config" ]
configs -= [ "//llvm/utils/gn/build:thin_archive" ]
sources = asan_sources
deps = [
":preinit_sources",
"//compiler-rt/lib/interception:sources",
"//compiler-rt/lib/lsan:common_sources",
"//compiler-rt/lib/sanitizer_common:sources",
"//compiler-rt/lib/ubsan:sources",
]
}
static_library("asan_cxx") {
output_dir = crt_current_out_dir
output_name = "clang_rt.asan_cxx$crt_current_target_suffix"
complete_static_lib = true
configs -= [ "//llvm/utils/gn/build:thin_archive" ]
deps = [
":cxx_sources",
"//compiler-rt/lib/ubsan:cxx_sources",
]
}
static_library("asan_static") {
output_dir = crt_current_out_dir
output_name = "clang_rt.asan_static$crt_current_target_suffix"
complete_static_lib = true
configs -= [ "//llvm/utils/gn/build:thin_archive" ]
deps = [ ":static_sources" ]
}
static_library("asan_preinit") {
output_dir = crt_current_out_dir
output_name = "clang_rt.asan-preinit$crt_current_target_suffix"
complete_static_lib = true
configs -= [ "//llvm/utils/gn/build:thin_archive" ]
deps = [ ":preinit_sources" ]
}
}
if (current_os == "win") {
static_library("asan_static_runtime_thunk") {
output_dir = crt_current_out_dir
output_name =
"clang_rt.asan_static_runtime_thunk$crt_current_target_suffix"
configs -= [ "//llvm/utils/gn/build:llvm_code" ]
configs += [ "//llvm/utils/gn/build:crt_code" ]
complete_static_lib = true
configs -= [ "//llvm/utils/gn/build:thin_archive" ]
sources = [
"asan_globals_win.cpp",
"asan_malloc_win_thunk.cpp",
"asan_win_common_runtime_thunk.cpp",
"asan_win_static_runtime_thunk.cpp",
]
defines = [ "SANITIZER_STATIC_RUNTIME_THUNK" ]
deps = [
"//compiler-rt/lib/interception:sources",
"//compiler-rt/lib/sanitizer_common:runtime_thunk",
"//compiler-rt/lib/sanitizer_common:sancov_runtime_thunk",
"//compiler-rt/lib/ubsan:runtime_thunk",
]
}
static_library("asan_dynamic_runtime_thunk") {
output_dir = crt_current_out_dir
output_name =
"clang_rt.asan_dynamic_runtime_thunk$crt_current_target_suffix"
configs -= [ "//llvm/utils/gn/build:llvm_code" ]
configs += [ "//llvm/utils/gn/build:crt_code" ]
complete_static_lib = true
configs -= [ "//llvm/utils/gn/build:thin_archive" ]
sources = [
"asan_globals_win.cpp",
"asan_win_common_runtime_thunk.cpp",
"asan_win_dynamic_runtime_thunk.cpp",
]
defines = [ "SANITIZER_DYNAMIC_RUNTIME_THUNK" ]
deps = [
"//compiler-rt/lib/sanitizer_common:runtime_thunk",
"//compiler-rt/lib/sanitizer_common:sancov_runtime_thunk",
"//compiler-rt/lib/ubsan:runtime_thunk",
]
cflags = [ "-Zl" ]
}
}
group("asan") {
deps = [ ":asan_shared_library" ]
if (current_os == "win") {
deps += [
":asan_dynamic_runtime_thunk",
":asan_static_runtime_thunk",
]
}
if (current_os != "mac" && current_os != "win") {
deps += [
":asan_cxx",
":asan_preinit",
":asan_static",
":asan_static_library",
]
}
}
}