212 lines · python
1# -*- Python -*-2 3import os4import platform5import shlex6import subprocess7 8import lit.formats9 10# Choose between lit's internal shell pipeline runner and a real shell. If11# LIT_USE_INTERNAL_SHELL is in the environment, we use that as an override.12use_lit_shell = os.environ.get("LIT_USE_INTERNAL_SHELL")13if use_lit_shell:14 # 0 is external, "" is default, and everything else is internal.15 execute_external = use_lit_shell == "0"16else:17 # Otherwise we default to internal on Windows and external elsewhere, as18 # bash on Windows is usually very slow.19 execute_external = not sys.platform in ["win32"]20 21 22def get_required_attr(config, attr_name):23 attr_value = getattr(config, attr_name, None)24 if attr_value is None:25 lit_config.fatal(26 "No attribute %r in test configuration! You may need to run "27 "tests from your build directory or add this attribute "28 "to lit.site.cfg.py " % attr_name29 )30 return attr_value31 32 33def get_library_path(file):34 cmd = subprocess.Popen(35 [config.clang.strip(), "-print-file-name=%s" % file]36 + shlex.split(config.target_cflags),37 stdout=subprocess.PIPE,38 env=config.environment,39 universal_newlines=True,40 )41 if not cmd.stdout:42 lit_config.fatal("Couldn't find the library path for '%s'" % file)43 dir = cmd.stdout.read().strip()44 if sys.platform in ["win32"] and execute_external:45 # Don't pass dosish path separator to msys bash.exe.46 dir = dir.replace("\\", "/")47 return dir48 49 50def get_libgcc_file_name():51 cmd = subprocess.Popen(52 [config.clang.strip(), "-print-libgcc-file-name"]53 + shlex.split(config.target_cflags),54 stdout=subprocess.PIPE,55 env=config.environment,56 universal_newlines=True,57 )58 if not cmd.stdout:59 lit_config.fatal("Couldn't find the library path for '%s'" % file)60 dir = cmd.stdout.read().strip()61 if sys.platform in ["win32"] and execute_external:62 # Don't pass dosish path separator to msys bash.exe.63 dir = dir.replace("\\", "/")64 return dir65 66 67# Setup config name.68config.name = "Builtins" + config.name_suffix69 70# Platform-specific default Builtins_OPTIONS for lit tests.71default_builtins_opts = ""72 73# Setup source root.74config.test_source_root = os.path.dirname(__file__)75 76# Path to the static library77is_msvc = get_required_attr(config, "is_msvc")78if is_msvc:79 base_lib = os.path.join(80 config.compiler_rt_libdir, "clang_rt.builtins%s.lib " % config.target_suffix81 )82 config.substitutions.append(("%librt ", base_lib))83elif config.target_os == "Darwin":84 base_lib = os.path.join(config.compiler_rt_libdir, "libclang_rt.osx.a ")85 config.substitutions.append(("%librt ", base_lib + " -lSystem "))86elif config.target_os == "Windows":87 base_lib = os.path.join(88 config.compiler_rt_libdir, "libclang_rt.builtins%s.a" % config.target_suffix89 )90 if sys.platform in ["win32"] and execute_external:91 # Don't pass dosish path separator to msys bash.exe.92 base_lib = base_lib.replace("\\", "/")93 config.substitutions.append(94 (95 "%librt ",96 base_lib97 + " -lmingw32 -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 ",98 )99 )100else:101 base_lib = os.path.join(102 config.compiler_rt_libdir, "libclang_rt.builtins%s.a" % config.target_suffix103 )104 if sys.platform in ["win32"] and execute_external:105 # Don't pass dosish path separator to msys bash.exe.106 base_lib = base_lib.replace("\\", "/")107 if config.target_os == "Haiku":108 config.substitutions.append(("%librt ", base_lib + " -lroot "))109 else:110 config.substitutions.append(("%librt ", base_lib + " -lc -lm "))111 112builtins_build_crt = get_required_attr(config, "builtins_build_crt")113if builtins_build_crt:114 base_obj = os.path.join(115 config.compiler_rt_libdir, "clang_rt.%%s%s.o" % config.target_suffix116 )117 if sys.platform in ["win32"] and execute_external:118 # Don't pass dosish path separator to msys bash.exe.119 base_obj = base_obj.replace("\\", "/")120 121 config.substitutions.append(("%crtbegin", base_obj % "crtbegin"))122 config.substitutions.append(("%crtend", base_obj % "crtend"))123 124 config.substitutions.append(("%crt1", get_library_path("crt1.o")))125 config.substitutions.append(("%crti", get_library_path("crti.o")))126 config.substitutions.append(("%crtn", get_library_path("crtn.o")))127 128 config.substitutions.append(("%libgcc", get_libgcc_file_name()))129 config.substitutions.append(130 ("%libc", "-lroot" if sys.platform.startswith("haiku") else "-lc")131 )132 133 config.substitutions.append(134 ("%libstdcxx", "-l" + config.sanitizer_cxx_lib.lstrip("lib"))135 )136 137 config.available_features.add("crt")138 139builtins_source_dir = os.path.join(140 get_required_attr(config, "compiler_rt_src_root"), "lib", "builtins"141)142if sys.platform in ["win32"] and execute_external:143 # Don't pass dosish path separator to msys bash.exe.144 builtins_source_dir = builtins_source_dir.replace("\\", "/")145builtins_lit_source_dir = get_required_attr(config, "builtins_lit_source_dir")146 147extra_link_flags = ["-nodefaultlibs"]148 149target_cflags = [get_required_attr(config, "target_cflags")]150target_cflags += ["-fno-builtin", "-I", builtins_source_dir]151target_cflags += extra_link_flags152target_cxxflags = config.cxx_mode_flags + target_cflags153clang_builtins_static_cflags = [""] + config.debug_info_flags + target_cflags154clang_builtins_static_cxxflags = config.cxx_mode_flags + clang_builtins_static_cflags155 156clang_builtins_cflags = clang_builtins_static_cflags157clang_builtins_cxxflags = clang_builtins_static_cxxflags158 159# FIXME: Right now we don't compile the C99 complex builtins when using160# clang-cl. Fix that.161if not is_msvc:162 config.available_features.add("c99-complex")163 164builtins_is_msvc = get_required_attr(config, "builtins_is_msvc")165if not builtins_is_msvc:166 config.available_features.add("int128")167 168clang_wrapper = ""169 170 171def build_invocation(compile_flags):172 return " " + " ".join([clang_wrapper, config.clang] + compile_flags) + " "173 174 175config.substitutions.append(("%clang ", build_invocation(target_cflags)))176config.substitutions.append(("%clangxx ", build_invocation(target_cxxflags)))177config.substitutions.append(178 ("%clang_builtins ", build_invocation(clang_builtins_cflags))179)180config.substitutions.append(181 ("%clangxx_builtins ", build_invocation(clang_builtins_cxxflags))182)183 184# Default test suffixes.185config.suffixes = [".c", ".cpp"]186 187if not config.emulator:188 config.available_features.add("native-run")189 190# Add features for available sources191builtins_source_features = config.builtins_lit_source_features.split(";")192# Sanity checks193if not builtins_source_features:194 lit_config.fatal("builtins_source_features cannot be empty")195builtins_source_features_set = set()196builtins_source_feature_duplicates = []197for builtin_source_feature in builtins_source_features:198 if len(builtin_source_feature) == 0:199 lit_config.fatal("builtins_source_feature cannot contain empty features")200 if builtin_source_feature not in builtins_source_features_set:201 builtins_source_features_set.add(builtin_source_feature)202 else:203 builtins_source_feature_duplicates.append(builtin_source_feature)204 205if len(builtins_source_feature_duplicates) > 0:206 lit_config.fatal(207 "builtins_source_features contains duplicates: {}".format(208 builtins_source_feature_duplicates209 )210 )211config.available_features.update(builtins_source_features)212