summaryrefslogtreecommitdiff
path: root/llvm/test/tools/llvm-exegesis/lit.local.cfg
blob: 22b01609cf2a0aa86e29eaf2a2db2d5d3c2d1ddc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import subprocess
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')