aboutsummaryrefslogtreecommitdiff
path: root/tools/nativize_llvm.py
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-01-25 10:27:21 -0800
committerAlon Zakai <alonzakai@gmail.com>2012-01-25 10:27:21 -0800
commit19a0d39383dd491f174f7d98623b7aec2547e889 (patch)
treeb8ebcca5a8d3a5a965d1d5e748cc16ebf41bd2de /tools/nativize_llvm.py
parent72133a594261ec3a4c4231ded730a75029d9fddf (diff)
add nativize_llvm tool
Diffstat (limited to 'tools/nativize_llvm.py')
-rw-r--r--tools/nativize_llvm.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/tools/nativize_llvm.py b/tools/nativize_llvm.py
new file mode 100644
index 00000000..a053b56c
--- /dev/null
+++ b/tools/nativize_llvm.py
@@ -0,0 +1,31 @@
+#!/usr/bin/python
+
+'''
+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
+'''
+
+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())
+
+filename = sys.argv[1]
+libs = sys.argv[2:] # e.g.: dl for dlopen/dlclose, util for openpty/forkpty
+
+print 'bc => clean bc'
+Popen([LLVM_OPT, filename, '-strip-debug', '-o=' + filename + '.clean.bc']).communicate()[0]
+print 'bc => s'
+Popen([LLVM_COMPILER, filename + '.clean.bc', '-o=' + filename + '.s']).communicate()[0]
+print 's => o'
+Popen(['as', filename + '.s', '-o', filename + '.o']).communicate()[0]
+print 'o => runnable'
+Popen(['g++', filename + '.o', '-o', filename + '.run'] + ['-l' + lib for lib in libs]).communicate()[0]
+