xref: /llvm-project/compiler-rt/test/ubsan/lit.common.cfg.py (revision 0af6c304e48e0484672b53be49a15f411d173e59)
18007ff1aSReid Kleckner# -*- Python -*-
28007ff1aSReid Kleckner
38007ff1aSReid Klecknerimport os
48007ff1aSReid Kleckner
5f98ee40fSTobias Hieta
68007ff1aSReid Klecknerdef get_required_attr(config, attr_name):
78007ff1aSReid Kleckner    attr_value = getattr(config, attr_name, None)
8*0af6c304SEisuke Kawashima    if attr_value is None:
98007ff1aSReid Kleckner        lit_config.fatal(
108007ff1aSReid Kleckner            "No attribute %r in test configuration! You may need to run "
118007ff1aSReid Kleckner            "tests from your build directory or add this attribute "
12f98ee40fSTobias Hieta            "to lit.site.cfg.py " % attr_name
13f98ee40fSTobias Hieta        )
148007ff1aSReid Kleckner    return attr_value
158007ff1aSReid Kleckner
16f98ee40fSTobias Hieta
178007ff1aSReid Kleckner# Setup config name.
18f98ee40fSTobias Hietaconfig.name = "UBSan-" + config.name_suffix
198007ff1aSReid Kleckner
208007ff1aSReid Kleckner# Setup source root.
218007ff1aSReid Klecknerconfig.test_source_root = os.path.dirname(__file__)
228007ff1aSReid Kleckner
238007ff1aSReid Klecknerdefault_ubsan_opts = list(config.default_sanitizer_opts)
248007ff1aSReid Kleckner# Choose between standalone and UBSan+ASan modes.
25f98ee40fSTobias Hietaubsan_lit_test_mode = get_required_attr(config, "ubsan_lit_test_mode")
268007ff1aSReid Klecknerif ubsan_lit_test_mode == "Standalone":
278007ff1aSReid Kleckner    config.available_features.add("ubsan-standalone")
288007ff1aSReid Kleckner    clang_ubsan_cflags = []
298007ff1aSReid Klecknerelif ubsan_lit_test_mode == "StandaloneStatic":
308007ff1aSReid Kleckner    config.available_features.add("ubsan-standalone-static")
31f98ee40fSTobias Hieta    clang_ubsan_cflags = ["-static-libsan"]
328007ff1aSReid Klecknerelif ubsan_lit_test_mode == "AddressSanitizer":
338007ff1aSReid Kleckner    config.available_features.add("ubsan-asan")
348007ff1aSReid Kleckner    clang_ubsan_cflags = ["-fsanitize=address"]
35f98ee40fSTobias Hieta    default_ubsan_opts += ["detect_leaks=0"]
368007ff1aSReid Klecknerelif ubsan_lit_test_mode == "MemorySanitizer":
378007ff1aSReid Kleckner    config.available_features.add("ubsan-msan")
388007ff1aSReid Kleckner    clang_ubsan_cflags = ["-fsanitize=memory"]
398007ff1aSReid Klecknerelif ubsan_lit_test_mode == "ThreadSanitizer":
408007ff1aSReid Kleckner    config.available_features.add("ubsan-tsan")
418007ff1aSReid Kleckner    clang_ubsan_cflags = ["-fsanitize=thread"]
428007ff1aSReid Klecknerelse:
438007ff1aSReid Kleckner    lit_config.fatal("Unknown UBSan test mode: %r" % ubsan_lit_test_mode)
448007ff1aSReid Kleckner
458007ff1aSReid Kleckner# Platform-specific default for lit tests.
46f98ee40fSTobias Hietaif config.target_arch == "s390x":
478007ff1aSReid Kleckner    # On SystemZ we need -mbackchain to make the fast unwinder work.
488007ff1aSReid Kleckner    clang_ubsan_cflags.append("-mbackchain")
498007ff1aSReid Kleckner
50f98ee40fSTobias Hietadefault_ubsan_opts_str = ":".join(default_ubsan_opts)
518007ff1aSReid Klecknerif default_ubsan_opts_str:
52f98ee40fSTobias Hieta    config.environment["UBSAN_OPTIONS"] = default_ubsan_opts_str
53f98ee40fSTobias Hieta    default_ubsan_opts_str += ":"
548007ff1aSReid Kleckner# Substitution to setup UBSAN_OPTIONS in portable way.
55f98ee40fSTobias Hietaconfig.substitutions.append(
56f98ee40fSTobias Hieta    ("%env_ubsan_opts=", "env UBSAN_OPTIONS=" + default_ubsan_opts_str)
57f98ee40fSTobias Hieta)
58f98ee40fSTobias Hieta
598007ff1aSReid Kleckner
608007ff1aSReid Klecknerdef build_invocation(compile_flags):
618007ff1aSReid Kleckner    return " " + " ".join([config.clang] + compile_flags) + " "
628007ff1aSReid Kleckner
63f98ee40fSTobias Hieta
648007ff1aSReid Klecknertarget_cflags = [get_required_attr(config, "target_cflags")]
658007ff1aSReid Klecknerclang_ubsan_cflags += target_cflags
668007ff1aSReid Klecknerclang_ubsan_cxxflags = config.cxx_mode_flags + clang_ubsan_cflags
678007ff1aSReid Kleckner
688007ff1aSReid Kleckner# Define %clang and %clangxx substitutions to use in test RUN lines.
698007ff1aSReid Klecknerconfig.substitutions.append(("%clang ", build_invocation(clang_ubsan_cflags)))
708007ff1aSReid Klecknerconfig.substitutions.append(("%clangxx ", build_invocation(clang_ubsan_cxxflags)))
718007ff1aSReid Klecknerconfig.substitutions.append(("%gmlt ", " ".join(config.debug_info_flags) + " "))
728007ff1aSReid Kleckner
738007ff1aSReid Kleckner# Default test suffixes.
74f98ee40fSTobias Hietaconfig.suffixes = [".c", ".cpp", ".m"]
758007ff1aSReid Kleckner
768007ff1aSReid Kleckner# Check that the host supports UndefinedBehaviorSanitizer tests
77f98ee40fSTobias Hietaif config.host_os not in [
78f98ee40fSTobias Hieta    "Linux",
79f98ee40fSTobias Hieta    "Darwin",
80f98ee40fSTobias Hieta    "FreeBSD",
81f98ee40fSTobias Hieta    "Windows",
82f98ee40fSTobias Hieta    "NetBSD",
83f98ee40fSTobias Hieta    "SunOS",
84f98ee40fSTobias Hieta    "OpenBSD",
85f98ee40fSTobias Hieta]:
868007ff1aSReid Kleckner    config.unsupported = True
878007ff1aSReid Kleckner
88f98ee40fSTobias Hietaconfig.excludes = ["Inputs"]
898007ff1aSReid Kleckner
90f98ee40fSTobias Hietaif ubsan_lit_test_mode in ["AddressSanitizer", "MemorySanitizer", "ThreadSanitizer"]:
918007ff1aSReid Kleckner    if not config.parallelism_group:
92f98ee40fSTobias Hieta        config.parallelism_group = "shadow-memory"
93f98ee40fSTobias Hieta    if config.host_os == "NetBSD":
94f98ee40fSTobias Hieta        config.substitutions.insert(0, ("%run", config.netbsd_noaslr_prefix))
95