53 строки
1.6 KiB
Python
Executable File
53 строки
1.6 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
'''
|
|
Small utility to execute some llvm bitcode.
|
|
|
|
The use case is a Makefile that builds some executable
|
|
and runs it as part of the build process. With emmaken,
|
|
the Makefile will generate llvm bitcode, so we can't
|
|
just execute it directly. This script will get that
|
|
code into a runnable form, and run it.
|
|
|
|
We cannot just use lli, since code built with debug
|
|
symbols will crash it due to
|
|
|
|
http://llvm.org/bugs/show_bug.cgi?id=6981
|
|
|
|
So we must get around that.
|
|
|
|
To use this, change the Makefile so that instead of
|
|
running
|
|
|
|
/bin/sh THE_FILE PARAMS
|
|
|
|
it runs
|
|
|
|
python $(EMSCRIPTEN_TOOLS)/exec_llvm.py THE_FILE PARAMS
|
|
|
|
An alternative solution to this problem is to compile
|
|
the .ll into native code. This can be done as follows:
|
|
|
|
* Use llc to generate x86 asm
|
|
* Use as to generate an object file
|
|
* Use g++ to link it to an executable
|
|
'''
|
|
|
|
import os, sys
|
|
from subprocess import Popen, PIPE, STDOUT
|
|
|
|
__rootpath__ = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
|
|
def path_from_root(*pathelems):
|
|
return os.path.join(__rootpath__, *pathelems)
|
|
exec(open(path_from_root('tools', 'shared.py'), 'r').read())
|
|
|
|
Popen([LLVM_OPT, sys.argv[1], '-strip-debug', '-o=' + sys.argv[1]+'.clean.bc']).communicate()[0]
|
|
|
|
# Execute with empty environment - just like the JS script will have
|
|
Popen([LLVM_INTERPRETER, sys.argv[1]+'.clean.bc'] + sys.argv[2:], env={'HOME': '.'}).communicate()[0]
|
|
|
|
#Popen([LLVM_COMPILER, '-march=c', sys.argv[1], '-o=' + sys.argv[1]+'.cbe.c']).communicate()[0]
|
|
#Popen(['gcc', sys.argv[1]+'.cbe.c', '-lstdc++']).communicate()[0]
|
|
#Popen(['./a.out'] + sys.argv[2:]).communicate()[0]
|
|
|