187aa9c9eSJonas Devlieghereimport os 287aa9c9eSJonas Devlieghereimport itertools 387aa9c9eSJonas Devlieghereimport platform 4*32e90bbeSVladislav Dzhidzhoevimport re 587aa9c9eSJonas Devlieghereimport subprocess 687aa9c9eSJonas Devlieghereimport sys 787aa9c9eSJonas Devlieghere 887aa9c9eSJonas Devlieghereimport lit.util 9*32e90bbeSVladislav Dzhidzhoevfrom lit.formats import ShTest 1087aa9c9eSJonas Devliegherefrom lit.llvm import llvm_config 1187aa9c9eSJonas Devliegherefrom lit.llvm.subst import FindTool 1287aa9c9eSJonas Devliegherefrom lit.llvm.subst import ToolSubst 1387aa9c9eSJonas Devlieghere 14*32e90bbeSVladislav Dzhidzhoevimport posixpath 1567420f1bSJonas Devlieghere 1667420f1bSJonas Devliegheredef _get_lldb_init_path(config): 172238dcc3SJonas Devlieghere return os.path.join(config.test_exec_root, "lit-lldb-init-quiet") 1867420f1bSJonas Devlieghere 1967420f1bSJonas Devlieghere 208d508c59SJonas Devliegheredef _disallow(config, execName): 212238dcc3SJonas Devlieghere warning = """ 228d508c59SJonas Devlieghere echo '*** Do not use \'{0}\' in tests; use \'%''{0}\'. ***' && 238d508c59SJonas Devlieghere exit 1 && echo 242238dcc3SJonas Devlieghere """ 252238dcc3SJonas Devlieghere config.substitutions.append((" {0} ".format(execName), warning.format(execName))) 268d508c59SJonas Devlieghere 278d508c59SJonas Devlieghere 28*32e90bbeSVladislav Dzhidzhoevdef get_lldb_args(config, suffix=""): 29*32e90bbeSVladislav Dzhidzhoev lldb_args = [] 30*32e90bbeSVladislav Dzhidzhoev if "remote-linux" in config.available_features: 31*32e90bbeSVladislav Dzhidzhoev lldb_args += [ 32*32e90bbeSVladislav Dzhidzhoev "-O", 33*32e90bbeSVladislav Dzhidzhoev '"platform select remote-linux"', 34*32e90bbeSVladislav Dzhidzhoev "-O", 35*32e90bbeSVladislav Dzhidzhoev f'"platform connect {config.lldb_platform_url}"', 36*32e90bbeSVladislav Dzhidzhoev ] 37*32e90bbeSVladislav Dzhidzhoev if config.lldb_platform_working_dir: 38*32e90bbeSVladislav Dzhidzhoev dir = posixpath.join(f"{config.lldb_platform_working_dir}", "shell") 39*32e90bbeSVladislav Dzhidzhoev if suffix: 40*32e90bbeSVladislav Dzhidzhoev dir += posixpath.join(dir, f"{suffix}") 41*32e90bbeSVladislav Dzhidzhoev lldb_args += [ 42*32e90bbeSVladislav Dzhidzhoev "-O", 43*32e90bbeSVladislav Dzhidzhoev f'"platform shell mkdir -p {dir}"', 44*32e90bbeSVladislav Dzhidzhoev "-O", 45*32e90bbeSVladislav Dzhidzhoev f'"platform settings -w {dir}"', 46*32e90bbeSVladislav Dzhidzhoev ] 47*32e90bbeSVladislav Dzhidzhoev lldb_args += ["--no-lldbinit", "-S", _get_lldb_init_path(config)] 48*32e90bbeSVladislav Dzhidzhoev return lldb_args 49*32e90bbeSVladislav Dzhidzhoev 50*32e90bbeSVladislav Dzhidzhoev 51*32e90bbeSVladislav Dzhidzhoevclass ShTestLldb(ShTest): 52*32e90bbeSVladislav Dzhidzhoev def __init__( 53*32e90bbeSVladislav Dzhidzhoev self, execute_external=False, extra_substitutions=[], preamble_commands=[] 54*32e90bbeSVladislav Dzhidzhoev ): 55*32e90bbeSVladislav Dzhidzhoev super().__init__(execute_external, extra_substitutions, preamble_commands) 56*32e90bbeSVladislav Dzhidzhoev 57*32e90bbeSVladislav Dzhidzhoev def execute(self, test, litConfig): 58*32e90bbeSVladislav Dzhidzhoev # Run each Shell test in a separate directory (on remote). 59*32e90bbeSVladislav Dzhidzhoev 60*32e90bbeSVladislav Dzhidzhoev # Find directory change command in %lldb substitution. 61*32e90bbeSVladislav Dzhidzhoev for i, t in enumerate(test.config.substitutions): 62*32e90bbeSVladislav Dzhidzhoev if re.match(t[0], "%lldb"): 63*32e90bbeSVladislav Dzhidzhoev cmd = t[1] 64*32e90bbeSVladislav Dzhidzhoev if '-O "platform settings -w ' in cmd: 65*32e90bbeSVladislav Dzhidzhoev # If command is present, it is added by get_lldb_args. 66*32e90bbeSVladislav Dzhidzhoev # Replace the path with the tests' path in suite. 67*32e90bbeSVladislav Dzhidzhoev # Example: 68*32e90bbeSVladislav Dzhidzhoev # bin/lldb 69*32e90bbeSVladislav Dzhidzhoev # -O "platform shell mkdir -p /home/user/shell" 70*32e90bbeSVladislav Dzhidzhoev # -O "platform settings -w /home/user/shell" ... 71*32e90bbeSVladislav Dzhidzhoev # => 72*32e90bbeSVladislav Dzhidzhoev # bin/lldb 73*32e90bbeSVladislav Dzhidzhoev # -O "platform shell mkdir -p /home/user/shell/SymbolFile/Breakpad/inline-record.test" 74*32e90bbeSVladislav Dzhidzhoev # -O "platform settings -w /home/user/shell/SymbolFile/Breakpad/inline-record.test" ... 75*32e90bbeSVladislav Dzhidzhoev args_def = " ".join(get_lldb_args(test.config)) 76*32e90bbeSVladislav Dzhidzhoev args_unique = " ".join( 77*32e90bbeSVladislav Dzhidzhoev get_lldb_args( 78*32e90bbeSVladislav Dzhidzhoev test.config, 79*32e90bbeSVladislav Dzhidzhoev posixpath.join(*test.path_in_suite), 80*32e90bbeSVladislav Dzhidzhoev ) 81*32e90bbeSVladislav Dzhidzhoev ) 82*32e90bbeSVladislav Dzhidzhoev test.config.substitutions[i] = ( 83*32e90bbeSVladislav Dzhidzhoev t[0], 84*32e90bbeSVladislav Dzhidzhoev cmd.replace(args_def, args_unique), 85*32e90bbeSVladislav Dzhidzhoev ) 86*32e90bbeSVladislav Dzhidzhoev break 87*32e90bbeSVladislav Dzhidzhoev return super().execute(test, litConfig) 88*32e90bbeSVladislav Dzhidzhoev 89*32e90bbeSVladislav Dzhidzhoev 9087aa9c9eSJonas Devliegheredef use_lldb_substitutions(config): 9187aa9c9eSJonas Devlieghere # Set up substitutions for primary tools. These tools must come from config.lldb_tools_dir 9287aa9c9eSJonas Devlieghere # which is basically the build output directory. We do not want to find these in path or 9387aa9c9eSJonas Devlieghere # anywhere else, since they are specifically the programs which are actually being tested. 9487aa9c9eSJonas Devlieghere 952238dcc3SJonas Devlieghere dsname = "debugserver" if platform.system() in ["Darwin"] else "lldb-server" 962238dcc3SJonas Devlieghere dsargs = [] if platform.system() in ["Darwin"] else ["gdbserver"] 9787aa9c9eSJonas Devlieghere 9887aa9c9eSJonas Devlieghere build_script = os.path.dirname(__file__) 992238dcc3SJonas Devlieghere build_script = os.path.join(build_script, "build.py") 1002238dcc3SJonas Devlieghere build_script_args = [ 1012238dcc3SJonas Devlieghere build_script, 102*32e90bbeSVladislav Dzhidzhoev ( 103*32e90bbeSVladislav Dzhidzhoev "--compiler=clang" if config.enable_remote else "--compiler=any" 104*32e90bbeSVladislav Dzhidzhoev ), # Default to best compiler 1052238dcc3SJonas Devlieghere "--arch=" + str(config.lldb_bitness), 1062238dcc3SJonas Devlieghere ] 10787aa9c9eSJonas Devlieghere if config.lldb_lit_tools_dir: 1082238dcc3SJonas Devlieghere build_script_args.append("--tools-dir={0}".format(config.lldb_lit_tools_dir)) 10987aa9c9eSJonas Devlieghere if config.lldb_tools_dir: 1102238dcc3SJonas Devlieghere build_script_args.append("--tools-dir={0}".format(config.lldb_tools_dir)) 11187aa9c9eSJonas Devlieghere if config.llvm_libs_dir: 1122238dcc3SJonas Devlieghere build_script_args.append("--libs-dir={0}".format(config.llvm_libs_dir)) 1134241ac54SStefan Gränitz if config.objc_gnustep_dir: 1142238dcc3SJonas Devlieghere build_script_args.append( 1152238dcc3SJonas Devlieghere '--objc-gnustep-dir="{0}"'.format(config.objc_gnustep_dir) 1162238dcc3SJonas Devlieghere ) 117b22965dfSDaniel Thornburgh if config.cmake_sysroot: 118b22965dfSDaniel Thornburgh build_script_args.append("--sysroot={0}".format(config.cmake_sysroot)) 11987aa9c9eSJonas Devlieghere 12067420f1bSJonas Devlieghere lldb_init = _get_lldb_init_path(config) 12187aa9c9eSJonas Devlieghere 12287aa9c9eSJonas Devlieghere primary_tools = [ 1232238dcc3SJonas Devlieghere ToolSubst( 1242238dcc3SJonas Devlieghere "%lldb", 1252238dcc3SJonas Devlieghere command=FindTool("lldb"), 126*32e90bbeSVladislav Dzhidzhoev extra_args=get_lldb_args(config), 1272238dcc3SJonas Devlieghere unresolved="fatal", 1282238dcc3SJonas Devlieghere ), 1292238dcc3SJonas Devlieghere ToolSubst( 1302238dcc3SJonas Devlieghere "%lldb-init", 1312238dcc3SJonas Devlieghere command=FindTool("lldb"), 1322238dcc3SJonas Devlieghere extra_args=["-S", lldb_init], 1332238dcc3SJonas Devlieghere unresolved="fatal", 1342238dcc3SJonas Devlieghere ), 1352238dcc3SJonas Devlieghere ToolSubst( 1362238dcc3SJonas Devlieghere "%lldb-noinit", 1372238dcc3SJonas Devlieghere command=FindTool("lldb"), 1382238dcc3SJonas Devlieghere extra_args=["--no-lldbinit"], 1392238dcc3SJonas Devlieghere unresolved="fatal", 1402238dcc3SJonas Devlieghere ), 1412238dcc3SJonas Devlieghere ToolSubst( 1422238dcc3SJonas Devlieghere "%lldb-server", 143c50faf5cSRaphael Isemann command=FindTool("lldb-server"), 144c50faf5cSRaphael Isemann extra_args=[], 1452238dcc3SJonas Devlieghere unresolved="ignore", 1462238dcc3SJonas Devlieghere ), 1472238dcc3SJonas Devlieghere ToolSubst( 1482238dcc3SJonas Devlieghere "%debugserver", 14987aa9c9eSJonas Devlieghere command=FindTool(dsname), 15087aa9c9eSJonas Devlieghere extra_args=dsargs, 1512238dcc3SJonas Devlieghere unresolved="ignore", 1522238dcc3SJonas Devlieghere ), 1532238dcc3SJonas Devlieghere ToolSubst( 1542238dcc3SJonas Devlieghere "%platformserver", 1552238dcc3SJonas Devlieghere command=FindTool("lldb-server"), 1562238dcc3SJonas Devlieghere extra_args=["platform"], 1572238dcc3SJonas Devlieghere unresolved="ignore", 1582238dcc3SJonas Devlieghere ), 1592238dcc3SJonas Devlieghere "lldb-test", 16001263c6cSJonas Devlieghere "lldb-dap", 1612238dcc3SJonas Devlieghere ToolSubst( 1622238dcc3SJonas Devlieghere "%build", command="'" + sys.executable + "'", extra_args=build_script_args 1632238dcc3SJonas Devlieghere ), 16487aa9c9eSJonas Devlieghere ] 16587aa9c9eSJonas Devlieghere 1662238dcc3SJonas Devlieghere _disallow(config, "lldb") 1672238dcc3SJonas Devlieghere _disallow(config, "lldb-server") 1682238dcc3SJonas Devlieghere _disallow(config, "debugserver") 1692238dcc3SJonas Devlieghere _disallow(config, "platformserver") 1708d508c59SJonas Devlieghere 171c0f1dcf3SJonas Devlieghere llvm_config.add_tool_substitutions(primary_tools, [config.lldb_tools_dir]) 17287aa9c9eSJonas Devlieghere 1732238dcc3SJonas Devlieghere 17487aa9c9eSJonas Devliegheredef _use_msvc_substitutions(config): 17587aa9c9eSJonas Devlieghere # If running from a Visual Studio Command prompt (e.g. vcvars), this will 17687aa9c9eSJonas Devlieghere # detect the include and lib paths, and find cl.exe and link.exe and create 17787aa9c9eSJonas Devlieghere # substitutions for each of them that explicitly specify /I and /L paths 1782238dcc3SJonas Devlieghere cl = lit.util.which("cl") 17987aa9c9eSJonas Devlieghere 18099ece01aSNico Weber if not cl: 18187aa9c9eSJonas Devlieghere return 18287aa9c9eSJonas Devlieghere 18399ece01aSNico Weber # Don't use lit.util.which() for link.exe: In `git bash`, it will pick 18499ece01aSNico Weber # up /usr/bin/link (another name for ln). 1852238dcc3SJonas Devlieghere link = os.path.join(os.path.dirname(cl), "link.exe") 18699ece01aSNico Weber 18787aa9c9eSJonas Devlieghere cl = '"' + cl + '"' 18887aa9c9eSJonas Devlieghere link = '"' + link + '"' 1892238dcc3SJonas Devlieghere includes = os.getenv("INCLUDE", "").split(";") 1902238dcc3SJonas Devlieghere libs = os.getenv("LIB", "").split(";") 19187aa9c9eSJonas Devlieghere 1922238dcc3SJonas Devlieghere config.available_features.add("msvc") 19387aa9c9eSJonas Devlieghere compiler_flags = ['"/I{}"'.format(x) for x in includes if os.path.exists(x)] 19487aa9c9eSJonas Devlieghere linker_flags = ['"/LIBPATH:{}"'.format(x) for x in libs if os.path.exists(x)] 19587aa9c9eSJonas Devlieghere 19687aa9c9eSJonas Devlieghere tools = [ 1972238dcc3SJonas Devlieghere ToolSubst("%msvc_cl", command=cl, extra_args=compiler_flags), 1982238dcc3SJonas Devlieghere ToolSubst("%msvc_link", command=link, extra_args=linker_flags), 1992238dcc3SJonas Devlieghere ] 20087aa9c9eSJonas Devlieghere llvm_config.add_tool_substitutions(tools) 20187aa9c9eSJonas Devlieghere return 20287aa9c9eSJonas Devlieghere 2032238dcc3SJonas Devlieghere 20487aa9c9eSJonas Devliegheredef use_support_substitutions(config): 20587aa9c9eSJonas Devlieghere # Set up substitutions for support tools. These tools can be overridden at the CMake 20687aa9c9eSJonas Devlieghere # level (by specifying -DLLDB_LIT_TOOLS_DIR), installed, or as a last resort, we can use 20787aa9c9eSJonas Devlieghere # the just-built version. 208*32e90bbeSVladislav Dzhidzhoev if config.enable_remote: 209*32e90bbeSVladislav Dzhidzhoev host_flags = ["--target=" + config.target_triple] 210*32e90bbeSVladislav Dzhidzhoev else: 2112238dcc3SJonas Devlieghere host_flags = ["--target=" + config.host_triple] 2122238dcc3SJonas Devlieghere if platform.system() in ["Darwin"]: 21387aa9c9eSJonas Devlieghere try: 2142238dcc3SJonas Devlieghere out = subprocess.check_output(["xcrun", "--show-sdk-path"]).strip() 21587aa9c9eSJonas Devlieghere res = 0 21687aa9c9eSJonas Devlieghere except OSError: 21787aa9c9eSJonas Devlieghere res = -1 21887aa9c9eSJonas Devlieghere if res == 0 and out: 21987aa9c9eSJonas Devlieghere sdk_path = lit.util.to_string(out) 2202238dcc3SJonas Devlieghere llvm_config.lit_config.note("using SDKROOT: %r" % sdk_path) 2212238dcc3SJonas Devlieghere host_flags += ["-isysroot", sdk_path] 2222238dcc3SJonas Devlieghere elif sys.platform != "win32": 2232238dcc3SJonas Devlieghere host_flags += ["-pthread"] 22487aa9c9eSJonas Devlieghere 2252238dcc3SJonas Devlieghere if sys.platform.startswith("netbsd"): 22687aa9c9eSJonas Devlieghere # needed e.g. to use freshly built libc++ 2272238dcc3SJonas Devlieghere host_flags += [ 2282238dcc3SJonas Devlieghere "-L" + config.llvm_libs_dir, 2292238dcc3SJonas Devlieghere "-Wl,-rpath," + config.llvm_libs_dir, 2302238dcc3SJonas Devlieghere ] 23187aa9c9eSJonas Devlieghere 23287aa9c9eSJonas Devlieghere # The clang module cache is used for building inferiors. 2332238dcc3SJonas Devlieghere host_flags += ["-fmodules-cache-path={}".format(config.clang_module_cache)] 2349c739252SPavel Labath 235b22965dfSDaniel Thornburgh if config.cmake_sysroot: 236b22965dfSDaniel Thornburgh host_flags += ["--sysroot={}".format(config.cmake_sysroot)] 237b22965dfSDaniel Thornburgh 238*32e90bbeSVladislav Dzhidzhoev if config.enable_remote and config.has_libcxx: 239*32e90bbeSVladislav Dzhidzhoev host_flags += [ 240*32e90bbeSVladislav Dzhidzhoev "-L{}".format(config.libcxx_libs_dir), 241*32e90bbeSVladislav Dzhidzhoev "-lc++", 242*32e90bbeSVladislav Dzhidzhoev ] 243*32e90bbeSVladislav Dzhidzhoev 2442238dcc3SJonas Devlieghere host_flags = " ".join(host_flags) 2452238dcc3SJonas Devlieghere config.substitutions.append(("%clang_host", "%clang " + host_flags)) 2462238dcc3SJonas Devlieghere config.substitutions.append(("%clangxx_host", "%clangxx " + host_flags)) 2472238dcc3SJonas Devlieghere config.substitutions.append( 2482238dcc3SJonas Devlieghere ("%clang_cl_host", "%clang_cl --target=" + config.host_triple) 2492238dcc3SJonas Devlieghere ) 25087aa9c9eSJonas Devlieghere 25187aa9c9eSJonas Devlieghere additional_tool_dirs = [] 25287aa9c9eSJonas Devlieghere if config.lldb_lit_tools_dir: 25387aa9c9eSJonas Devlieghere additional_tool_dirs.append(config.lldb_lit_tools_dir) 25487aa9c9eSJonas Devlieghere 2552238dcc3SJonas Devlieghere llvm_config.use_clang( 2562238dcc3SJonas Devlieghere additional_flags=["--target=specify-a-target-or-use-a-_host-substitution"], 25787aa9c9eSJonas Devlieghere additional_tool_dirs=additional_tool_dirs, 2582238dcc3SJonas Devlieghere required=True, 2592238dcc3SJonas Devlieghere use_installed=True, 2602238dcc3SJonas Devlieghere ) 26187aa9c9eSJonas Devlieghere 2622238dcc3SJonas Devlieghere if sys.platform == "win32": 26387aa9c9eSJonas Devlieghere _use_msvc_substitutions(config) 26487aa9c9eSJonas Devlieghere 2652238dcc3SJonas Devlieghere have_lld = llvm_config.use_lld( 2662238dcc3SJonas Devlieghere additional_tool_dirs=additional_tool_dirs, required=False, use_installed=True 2672238dcc3SJonas Devlieghere ) 26887aa9c9eSJonas Devlieghere if have_lld: 2692238dcc3SJonas Devlieghere config.available_features.add("lld") 27087aa9c9eSJonas Devlieghere 2712238dcc3SJonas Devlieghere support_tools = [ 2722238dcc3SJonas Devlieghere "yaml2obj", 2732238dcc3SJonas Devlieghere "obj2yaml", 2742238dcc3SJonas Devlieghere "llvm-dwp", 2752238dcc3SJonas Devlieghere "llvm-pdbutil", 2762238dcc3SJonas Devlieghere "llvm-mc", 2772238dcc3SJonas Devlieghere "llvm-readobj", 2782238dcc3SJonas Devlieghere "llvm-objdump", 2792238dcc3SJonas Devlieghere "llvm-objcopy", 2802238dcc3SJonas Devlieghere "lli", 2812238dcc3SJonas Devlieghere ] 28287aa9c9eSJonas Devlieghere additional_tool_dirs += [config.lldb_tools_dir, config.llvm_tools_dir] 28387aa9c9eSJonas Devlieghere llvm_config.add_tool_substitutions(support_tools, additional_tool_dirs) 28467420f1bSJonas Devlieghere 2852238dcc3SJonas Devlieghere _disallow(config, "clang") 286