llvm/llvm/test/tools/llvm-exegesis/lit.local.cfg

import subprocess
import re
import lit.util


def can_execute_generated_snippets(arch):
    is_host_arch = arch in config.root.host_triple
    # 'native' feature is defined as "host arch == default triple arch"
    is_native_codegen = "native" in config.available_features
    return is_host_arch and is_native_codegen


def can_use_perf_counters(mode, extra_options=[]):
    # We need libpfm to be installed and allow reading perf counters. We can
    # only know that at runtime, so we try to measure an empty code snippet
    # and bail out on error.
    llvm_exegesis_exe = lit.util.which("llvm-exegesis", config.llvm_tools_dir)
    if llvm_exegesis_exe is None:
        print("could not find llvm-exegesis")
        return False
    try:
        return_code = subprocess.call(
            [llvm_exegesis_exe, "-mode", mode, "-snippets-file", "/dev/null"]
            + extra_options,
            stdout=subprocess.DEVNULL,
            stderr=subprocess.DEVNULL,
        )
        return return_code == 0
    except OSError:
        print("could not exec llvm-exegesis")
        return False


for arch in ["aarch64", "mips", "powerpc", "x86_64"]:
    if can_execute_generated_snippets(arch):
        config.available_features.add("exegesis-can-execute-%s" % arch)

if can_use_perf_counters("latency"):
    config.available_features.add("exegesis-can-measure-latency")

if can_use_perf_counters("uops"):
    config.available_features.add("exegesis-can-measure-uops")

if can_execute_generated_snippets("x86_64"):
    # Check for support of LBR format with cycles.
    if can_use_perf_counters(
        "latency", ["-x86-lbr-sample-period", "123", "-repetition-mode", "loop"]
    ):
        config.available_features.add("exegesis-can-measure-latency-lbr")