From 5e763d35e46ec5ce3b9d506ecf8690d44a98a3d7 Mon Sep 17 00:00:00 2001 From: Leonard Grey Date: Fri, 23 Jun 2023 13:26:32 -0400 Subject: [PATCH] [gn] Add check-lsan target for Mac Only supports ASAN mode right now. Standalone requires a some more plumbing so it will be a follow-up. Mac-only but I suspect this will be fine on Linux also since it's based on the check-asan file, will follow up after testing. Differential Revision: https://reviews.llvm.org/D153651 --- .../utils/gn/build/toolchain/target_flags.gni | 12 ++- llvm/utils/gn/secondary/BUILD.gn | 5 ++ .../secondary/compiler-rt/test/lsan/BUILD.gn | 79 +++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 llvm/utils/gn/secondary/compiler-rt/test/lsan/BUILD.gn diff --git a/llvm/utils/gn/build/toolchain/target_flags.gni b/llvm/utils/gn/build/toolchain/target_flags.gni index a8521feeee371..09b8cfabbd671 100644 --- a/llvm/utils/gn/build/toolchain/target_flags.gni +++ b/llvm/utils/gn/build/toolchain/target_flags.gni @@ -1,4 +1,5 @@ import("//llvm/triples.gni") +import("//llvm/utils/gn/build/mac_sdk.gni") import("//llvm/utils/gn/build/toolchain/compiler.gni") # Flags in this file are passed both to the compiler that's building @@ -23,7 +24,7 @@ if (current_os == "android") { if (current_cpu == "arm") { target_flags += [ "-march=armv7-a" ] } -} else if (current_os == "ios") { +} else if (current_os == "ios" || current_os == "mac") { if (current_cpu == "arm64") { target_flags += [ "-arch", @@ -43,6 +44,15 @@ if (current_os == "android") { "x86_64", ] } + if (current_os == "mac") { + target_flags += [ + "-isysroot", + mac_sdk_path, + # TODO(lgrey): We should be getting this from `compiler_defaults`. Why + # aren't we? + "-mmacos-version-min=10.10", + ] + } } else if (current_os == "baremetal") { target_flags += [ "--target=$llvm_current_triple" ] } diff --git a/llvm/utils/gn/secondary/BUILD.gn b/llvm/utils/gn/secondary/BUILD.gn index 261780c3cf79a..2e8ee4332ef7c 100644 --- a/llvm/utils/gn/secondary/BUILD.gn +++ b/llvm/utils/gn/secondary/BUILD.gn @@ -25,6 +25,11 @@ group("default") { if (current_os == "linux" || current_os == "win" || current_os=="mac") { deps += [ "//compiler-rt/test/asan" ] } + + if (current_os == "mac") { + deps += [ "//compiler-rt/test/lsan"] + } + if (current_os == "linux" || current_os == "android") { deps += [ "//compiler-rt/test/hwasan" ] } diff --git a/llvm/utils/gn/secondary/compiler-rt/test/lsan/BUILD.gn b/llvm/utils/gn/secondary/compiler-rt/test/lsan/BUILD.gn new file mode 100644 index 0000000000000..8b6ea06c7df6b --- /dev/null +++ b/llvm/utils/gn/secondary/compiler-rt/test/lsan/BUILD.gn @@ -0,0 +1,79 @@ +import("//compiler-rt/target.gni") +import("//compiler-rt/test/test.gni") +import("//llvm/lib/Target/targets.gni") +import("//llvm/utils/gn/build/toolchain/compiler.gni") +import("//llvm/utils/gn/build/write_cmake_config.gni") +import("//llvm/version.gni") + +write_cmake_config("asan_mode_cfg") { + input = "lit.site.cfg.py.in" + output = "$target_gen_dir/${crt_current_target_arch}AsanConfig/lit.site.cfg.py" + values = [ + "LSAN_LIT_SOURCE_DIR=" + rebase_path("."), + "LSAN_TEST_CONFIG_SUFFIX=$crt_current_target_suffix", + "LSAN_TEST_TARGET_CFLAGS=$target_flags_string", + # TODO(lgrey): Support standalone mode + "LSAN_LIT_TEST_MODE=AddressSanitizer", + "LSAN_TEST_TARGET_ARCH=$crt_current_target_arch", + "COMPILER_RT_BINARY_DIR=" + rebase_path("$root_gen_dir/compiler-rt"), + "LIT_SITE_CFG_IN_HEADER=## Autogenerated from $input, do not edit", + ] +} + +if (current_toolchain != host_toolchain) { + group("lsan_toolchain") { + deps = [ + ":asan_mode_cfg", + "//compiler-rt/include($host_toolchain)", + "//compiler-rt/lib/asan", + "//compiler-rt/lib/lsan:common_sources", + "//compiler-rt/lib/profile", + "//compiler-rt/test:lit_common_configured", + "//llvm/tools/llvm-readobj($host_toolchain)", + "//llvm/tools/llvm-symbolizer($host_toolchain)", + "//llvm/utils/FileCheck($host_toolchain)", + "//llvm/utils/count($host_toolchain)", + "//llvm/utils/llvm-lit($host_toolchain)", + "//llvm/utils/not($host_toolchain)", + ] + } +} + +supported_toolchains = [] +# TODO(lgrey): Test Linux +if (host_os == "mac") { + supported_toolchains += [ "//llvm/utils/gn/build/toolchain:stage2_unix" ] +} + +group("lsan") { + deps = [] + foreach(toolchain, supported_toolchains) { + deps += [ ":lsan_toolchain($toolchain)" ] + } +} + +if (supported_toolchains != []) { + action("check-lsan") { + script = "$root_build_dir/bin/llvm-lit" + args = [ "-sv" ] + foreach(toolchain, supported_toolchains) { + test_dir = rebase_path( + get_label_info(":lit_site_cfg($toolchain)", "target_gen_dir"), + root_build_dir) + args += [ + test_dir + "/${crt_current_target_arch}AsanConfig", + ] + } + outputs = [ "$target_gen_dir/run-lit" ] # Non-existing, so that ninja runs + # it each time. + + # Since check-lsan is always dirty, //:default doesn't depend on it so + # that it's not part of the default ninja target. Hence, check-lsan + # shouldn't have any deps except :lsan. so that the default target is + # sure to build all the deps. + deps = [ ":lsan" ] + testonly = true + + pool = "//:console" + } +}