blob: a4f217e88984a13b7e7fdb232d6e0c2c2bafbd74 [file] [log] [blame]
#!/usr/bin/env python2
# Copyright 2012 The Emscripten Authors. All rights reserved.
# Emscripten is available under two separate licenses, the MIT license and the
# University of Illinois/NCSA Open Source License. Both these licenses can be
# found in the LICENSE file.
"""Small utility to build some llvm bitcode into native code. Useful when lli
(called from exec_llvm) fails for some reason.
* Use llc to generate x86 asm
* Use as to generate an object file
* Use g++ to link it to an executable
"""
from __future__ import print_function
import os
import sys
__rootpath__ = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
sys.path.insert(0, __rootpath__)
from tools.shared import LLVM_OPT, LLVM_COMPILER, path_from_root, run_process, PIPE
filename = sys.argv[1]
libs = sys.argv[2:] # e.g.: dl for dlopen/dlclose, util for openpty/forkpty
print('bc => clean bc')
run_process([LLVM_OPT, filename, '-strip-debug', '-o', filename + '.clean.bc'])
print('bc => s')
for params in [['-march=x86'], ['-march=x86-64']]: # try x86, then x86-64 FIXME
print('params', params)
for triple in [['-mtriple=i386-pc-linux-gnu'], []]:
run_process([LLVM_COMPILER] + params + triple + [filename + '.clean.bc', '-o', filename + '.s'], check=False)
print('s => o')
run_process(['as', filename + '.s', '-o', filename + '.o'], check=False)
if os.path.exists(filename + '.o'):
break
if os.path.exists(filename + '.o'):
break
if not os.path.exists(filename + '.o'):
print('tools/nativize_llvm.py: Failed to convert "' + filename + '" to "' + filename + '.o"!', file=sys.stderr)
sys.exit(1)
print('o => runnable')
args = ['g++', path_from_root('system', 'lib', 'debugging.cpp'), filename + '.o', '-o', filename + '.run'] + ['-l' + lib for lib in libs]
supportes_no_pie = 'no-pie' in run_process(['g++', '-dumpspecs'], stdout=PIPE).stdout
if supportes_no_pie:
args.append('-no-pie')
run_process(args)
sys.exit(0)