Author: Manuel Jacob
Branch: llvm-translation-backend
Changeset: r66480:4b17557ee5e5
Date: 2012-04-26 20:12 +0200
http://bitbucket.org/pypy/pypy/changeset/4b17557ee5e5/
Log: Add standalone support.
diff --git a/pypy/translator/driver.py b/pypy/translator/driver.py
--- a/pypy/translator/driver.py
+++ b/pypy/translator/driver.py
@@ -553,7 +553,8 @@
exename = self.c_entryp
newexename = mkexename(self.compute_exe_name())
shutil.copy(str(exename), str(newexename))
- if self.cbuilder.shared_library_name is not None:
+ if (hasattr(self, 'cbuilder') and
+ self.cbuilder.shared_library_name is not None):
soname = self.cbuilder.shared_library_name
newsoname = newexename.new(basename=soname.basename)
shutil.copy(str(soname), str(newsoname))
diff --git a/pypy/translator/llvm/genllvm.py b/pypy/translator/llvm/genllvm.py
--- a/pypy/translator/llvm/genllvm.py
+++ b/pypy/translator/llvm/genllvm.py
@@ -3,10 +3,12 @@
from itertools import count
from py.process import cmdexec
+from pypy.annotation import model as annmodel
from pypy.objspace.flow.model import mkentrymap, Constant, Variable
from pypy.rlib.jit import _we_are_jitted
from pypy.rlib.objectmodel import (Symbolic, ComputedIntSymbolic,
CDefinedIntSymbolic, malloc_zero_filled, running_on_llinterp)
+from pypy.rpython.annlowlevel import MixLevelHelperAnnotator
from pypy.rpython.lltypesystem import llarena, llgroup, llmemory, lltype, rffi
from pypy.rpython.memory.gctransform.framework import FrameworkGCTransformer
from pypy.rpython.memory.gctransform.transform import GCTransformer
@@ -595,10 +597,13 @@
', '.join(arg.repr_type() for arg in self.args)))
database.genllvm.ecis.append(obj.compilation_info)
else:
- name = database.unique_name('@rpy_' + obj._name
- .replace(',', '_').replace(' ', '_')
- .replace('(', '_').replace(')', '_')
- .replace('<', '_').replace('>', '_'))
+ if obj._name == '__main':
+ name = '@main'
+ else:
+ name = database.unique_name('@rpy_' + obj._name
+ .replace(',', '_').replace(' ', '_')
+ .replace('(', '_').replace(')', '_')
+ .replace('<', '_').replace('>', '_'))
ptr_type.refs[obj] = name
database.genllvm.transform_graph(obj.graph)
writer = FunctionWriter()
@@ -1255,6 +1260,28 @@
return getattr(obj, '_hash_cache_', None)
+def make_main(translator, entrypoint):
+ import os
+
+ def __main(argc, argv):
+ args = [rffi.charp2str(argv[i]) for i in range(argc)]
+ try:
+ return entrypoint(args)
+ except Exception, exc:
+ os.write(2, 'DEBUG: An uncaught exception was raised in '
+ 'entrypoint: ' + str(exc) + '\n')
+ return 1
+
+ mixlevelannotator = MixLevelHelperAnnotator(translator.rtyper)
+ arg1 = annmodel.lltype_to_annotation(rffi.INT)
+ arg2 = annmodel.lltype_to_annotation(rffi.CCHARPP)
+ res = annmodel.lltype_to_annotation(lltype.Signed)
+ graph = mixlevelannotator.getgraph(__main, [arg1, arg2], res)
+ mixlevelannotator.finish()
+ mixlevelannotator.backend_optimize()
+ return graph
+
+
class CTypesFuncWrapper(object):
def __init__(self, genllvm, database, ep_ptr):
self.translator = genllvm.translator
@@ -1389,9 +1416,6 @@
self.entry_point = entry_point
self.base_path = udir.join(uniquemodulename('main'))
- bk = self.translator.annotator.bookkeeper
- ep_ptr = getfunctionptr(bk.getdesc(entry_point).getuniquegraph())
-
with self.base_path.new(ext='.ll').open('w') as f:
f.write(cmdexec('clang -emit-llvm -S -x c /dev/null -o -'))
# XXX
@@ -1404,6 +1428,8 @@
f.write('declare i8* @llvm.frameaddress(i32)\n')
database = Database(self, f)
+ if self.standalone:
+ main = make_main(self.translator, entry_point)
for graph in self.translator.graphs:
self.transform_graph(graph)
@@ -1413,20 +1439,28 @@
'[%ctor {{ i32 65535, void ()* @{} }}]\n'.format(sr.V[1:]))
if self.standalone:
- raise NotImplementedError
+ get_repr(getfunctionptr(main)).V
else:
- self.wrapper = CTypesFuncWrapper(self, database, ep_ptr)
+ bk = self.translator.annotator.bookkeeper
+ ptr = getfunctionptr(bk.getdesc(entry_point).getuniquegraph())
+ self.wrapper = CTypesFuncWrapper(self, database, ptr)
self.gcpolicy.finish()
+ def _compile(self, add_opts, outfile):
+ eci = ExternalCompilationInfo().merge(*self.ecis)
+ eci = eci.convert_sources_to_files(being_main=True)
+ cmdexec('clang -O2 {}{}{}{}.ll -o {}'.format(
+ add_opts,
+ ''.join('-I{} '.format(ic) for ic in eci.include_dirs),
+ ''.join(smf + ' ' for smf in eci.separate_module_files),
+ self.base_path, outfile))
+
def compile_standalone(self, exe_name):
- raise NotImplementedError
+ self._compile('', self.base_path)
+ return self.base_path
def compile_module(self):
- eci = ExternalCompilationInfo().merge(*self.ecis)
- eci = eci.convert_sources_to_files(being_main=True)
- cmdexec('clang -O2 -shared -fPIC {0}{1}{2}.ll -o {2}.so'.format(
- ''.join('-I{} '.format(ic) for ic in eci.include_dirs),
- ''.join(smf + ' ' for smf in eci.separate_module_files),
- self.base_path))
- self.wrapper.load_cdll('{0}.so'.format(self.base_path))
+ so_file = self.base_path.new(ext='.so')
+ self._compile('-shared -fPIC ', so_file)
+ self.wrapper.load_cdll(str(so_file))
return self.wrapper
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit