aboutsummaryrefslogtreecommitdiffstats
path: root/build/plugins/llvm_bc.py
blob: bd1e4099f26d3348563245ef2066a5c81a75cda9 (plain) (blame)
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
from _common import rootrel_arc_src, sort_by_keywords, skip_build_root


def onllvm_bc(unit, *args):
    free_args, kwds = sort_by_keywords(
        {'SYMBOLS': -1, 'NAME': 1, 'GENERATE_MACHINE_CODE': 0, 'NO_COMPILE': 0, 'SUFFIX': 1}, args
    )
    name = kwds['NAME'][0]
    symbols = kwds.get('SYMBOLS')
    obj_suf = kwds['SUFFIX'][0] if 'SUFFIX' in kwds else '' + unit.get('OBJ_SUF')
    skip_compile_step = 'NO_COMPILE' in kwds
    merged_bc = name + '_merged' + obj_suf + '.bc'
    out_bc = name + '_optimized' + obj_suf + '.bc'
    bcs = []
    for x in free_args:
        rel_path = rootrel_arc_src(x, unit)
        bc_path = '${ARCADIA_BUILD_ROOT}/' + skip_build_root(rel_path) + obj_suf + '.bc'
        if not skip_compile_step:
            if x.endswith('.c'):
                llvm_compile = unit.onllvm_compile_c
            elif x.endswith('.ll'):
                llvm_compile = unit.onllvm_compile_ll
            else:
                llvm_compile = unit.onllvm_compile_cxx
            llvm_compile([rel_path, bc_path])
        bcs.append(bc_path)
    unit.onllvm_link([merged_bc] + bcs)
    passes = ['default<O2>', 'globalopt', 'globaldce']
    opt_opts = []
    if symbols:
        passes += ['internalize']
        # XXX: '#' used instead of ',' to overcome ymake tendency to split everything by comma
        opt_opts += ['-internalize-public-api-list=' + '#'.join(symbols)]
    # Add additional quotes for cmake build.
    # Generated final option for cmake looks like: -passes="..."
    opt_opts += ['\'-passes="{}"\''.format('${__COMMA__}'.join(passes))]
    unit.onllvm_opt([merged_bc, out_bc] + opt_opts)
    if 'GENERATE_MACHINE_CODE' in kwds:
        unit.onllvm_llc([out_bc, '-O2'])
    else:
        unit.onresource([out_bc, '/llvm_bc/' + name])