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