xref: /llvm-project/lldb/test/Shell/helper/toolchain.py (revision 88591aa0ca7e4d99da353d49f91ea63e43fb55e0)
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