This patch adds support for forced loading of archive members, similar to the behavior of the -all_load and -ObjC options in ld64. To enable this, the StaticLibraryDefinitionGenerator class constructors are extended with a VisitMember callback that is called on each member file in the archive at generator construction time. This callback can be used to unconditionally add the member file to a JITDylib at that point. To test this the llvm-jitlink utility is extended with -all_load (all platforms) and -ObjC (darwin only) options. Since we can't refer to symbols in the test objects directly (these would always cause the member to be linked in, even without the new flags) we instead test side-effects of force loading: execution of constructors and registration of Objective-C metadata. rdar://134446111
97 lines
3.1 KiB
Python
97 lines
3.1 KiB
Python
# -*- Python -*-
|
|
|
|
import os
|
|
import subprocess
|
|
|
|
# Setup config name.
|
|
config.name = "ORC" + config.name_suffix
|
|
|
|
# Setup source root.
|
|
config.test_source_root = os.path.dirname(__file__)
|
|
|
|
# Determine whether the test target is compatible with execution on the host.
|
|
host_arch_compatible = config.target_arch == config.host_arch
|
|
|
|
if config.host_arch == "x86_64h" and config.target_arch == "x86_64":
|
|
host_arch_compatible = True
|
|
if host_arch_compatible:
|
|
config.available_features.add("host-arch-compatible")
|
|
config.test_target_is_host_executable = (
|
|
config.target_os == config.host_os and host_arch_compatible
|
|
)
|
|
|
|
# Assume that llvm-jitlink is in the config.llvm_tools_dir.
|
|
llvm_jitlink = os.path.join(config.llvm_tools_dir, "llvm-jitlink")
|
|
orc_rt_executor_stem = os.path.join(
|
|
config.compiler_rt_obj_root, "lib/orc/tests/tools/orc-rt-executor"
|
|
)
|
|
lli = os.path.join(config.llvm_tools_dir, "lli")
|
|
if config.host_os == "Darwin":
|
|
orc_rt_path = "%s/liborc_rt_osx.a" % config.compiler_rt_libdir
|
|
else:
|
|
orc_rt_path = "%s/liborc_rt%s.a" % (config.compiler_rt_libdir, config.target_suffix)
|
|
|
|
if config.libunwind_shared:
|
|
config.available_features.add("libunwind-available")
|
|
shared_libunwind_path = os.path.join(config.libunwind_install_dir, "libunwind.so")
|
|
config.substitutions.append(("%shared_libunwind", shared_libunwind_path))
|
|
|
|
|
|
def build_invocation(compile_flags):
|
|
return " " + " ".join([config.clang] + compile_flags) + " "
|
|
|
|
|
|
config.substitutions.append(("%clang ", build_invocation([config.target_cflags])))
|
|
config.substitutions.append(
|
|
("%clangxx ", build_invocation(config.cxx_mode_flags + [config.target_cflags]))
|
|
)
|
|
config.substitutions.append(
|
|
("%clang_cl ", build_invocation(["--driver-mode=cl"] + [config.target_cflags]))
|
|
)
|
|
if config.host_os == "Windows":
|
|
config.substitutions.append(
|
|
(
|
|
"%llvm_jitlink",
|
|
(
|
|
llvm_jitlink
|
|
+ " -orc-runtime="
|
|
+ orc_rt_path
|
|
+ " -no-process-syms=true -slab-allocate=64MB"
|
|
),
|
|
)
|
|
)
|
|
else:
|
|
config.substitutions.append(
|
|
("%llvm_jitlink", (llvm_jitlink + " -orc-runtime=" + orc_rt_path))
|
|
)
|
|
config.substitutions.append(
|
|
("%orc_rt_executor", orc_rt_executor_stem + "-" + config.host_arch)
|
|
)
|
|
config.substitutions.append(
|
|
(
|
|
"%lli_orc_jitlink",
|
|
(lli + " -jit-kind=orc -jit-linker=jitlink -orc-runtime=" + orc_rt_path),
|
|
)
|
|
)
|
|
config.substitutions.append(("%ar", "ar"))
|
|
|
|
# Default test suffixes.
|
|
config.suffixes = [".c", ".cpp", ".m", ".S", ".ll", ".test"]
|
|
|
|
# Exclude Inputs directories.
|
|
config.excludes = ["Inputs"]
|
|
|
|
if config.host_os not in ["Darwin", "FreeBSD", "Linux", "Windows"]:
|
|
config.unsupported = True
|
|
|
|
# Ask llvm-config about assertion mode.
|
|
try:
|
|
llvm_config_result = subprocess.check_output(
|
|
[os.path.join(config.llvm_tools_dir, "llvm-config"), "--assertion-mode"],
|
|
env=config.environment,
|
|
)
|
|
if llvm_config_result.startswith(b"ON"):
|
|
config.available_features.add("asserts")
|
|
except OSError as e:
|
|
lit_config.warning(f"Could not determine if LLVM was built with assertions: {e}")
|