51 строка
1.5 KiB
Python
Executable File
51 строка
1.5 KiB
Python
Executable File
#!/usr/bin/python2
|
|
|
|
'''
|
|
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, see nativize_llvm.py. That is
|
|
useful when this fails.
|
|
'''
|
|
|
|
import os, sys
|
|
from subprocess import Popen, PIPE, STDOUT
|
|
|
|
__rootpath__ = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
def path_from_root(*pathelems):
|
|
return os.path.join(__rootpath__, *pathelems)
|
|
sys.path += [path_from_root('')]
|
|
from tools.shared import *
|
|
|
|
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]
|
|
|