llvm_bc.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. from _common import rootrel_arc_src, sort_by_keywords, skip_build_root
  2. def onllvm_bc(unit, *args):
  3. free_args, kwds = sort_by_keywords({'SYMBOLS': -1, 'NAME': 1, 'GENERATE_MACHINE_CODE': 0, 'NO_COMPILE': 0}, args)
  4. name = kwds['NAME'][0]
  5. symbols = kwds.get('SYMBOLS')
  6. obj_suf = unit.get('OBJ_SUF')
  7. skip_compile_step = 'NO_COMPILE' in kwds
  8. merged_bc = name + '_merged' + obj_suf + '.bc'
  9. out_bc = name + '_optimized' + obj_suf + '.bc'
  10. bcs = []
  11. for x in free_args:
  12. rel_path = rootrel_arc_src(x, unit)
  13. bc_path = '${ARCADIA_BUILD_ROOT}/' + skip_build_root(rel_path) + obj_suf + '.bc'
  14. if not skip_compile_step:
  15. if x.endswith('.c'):
  16. llvm_compile = unit.onllvm_compile_c
  17. elif x.endswith('.ll'):
  18. llvm_compile = unit.onllvm_compile_ll
  19. else:
  20. llvm_compile = unit.onllvm_compile_cxx
  21. llvm_compile([rel_path, bc_path])
  22. bcs.append(bc_path)
  23. unit.onllvm_link([merged_bc] + bcs)
  24. passes = ['default<O2>', 'globalopt', 'globaldce']
  25. opt_opts = []
  26. if symbols:
  27. passes += ['internalize']
  28. # XXX: '#' used instead of ',' to overcome ymake tendency to split everything by comma
  29. opt_opts += ['-internalize-public-api-list=' + '#'.join(symbols)]
  30. # Add additional quotes for cmake build.
  31. # Generated final option for cmake looks like: -passes="..."
  32. opt_opts += ['\'-passes="{}"\''.format('${__COMMA__}'.join(passes))]
  33. unit.onllvm_opt([merged_bc, out_bc] + opt_opts)
  34. if 'GENERATE_MACHINE_CODE' in kwds:
  35. unit.onllvm_llc([out_bc, '-O2'])
  36. else:
  37. unit.onresource([out_bc, '/llvm_bc/' + name])