[pypy-svn] r48911 - in pypy/dist/pypy/translator/llvm: . module
rxe at codespeak.net
rxe at codespeak.net
Wed Nov 21 18:53:02 CET 2007
Author: rxe
Date: Wed Nov 21 18:53:02 2007
New Revision: 48911
Modified:
pypy/dist/pypy/translator/llvm/codewriter.py
pypy/dist/pypy/translator/llvm/genllvm.py
pypy/dist/pypy/translator/llvm/module/genexterns.c
Log:
(fijal, rxe, lots of others) introducing hacks of entry point to add rffi handling to get argv
Modified: pypy/dist/pypy/translator/llvm/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/codewriter.py (original)
+++ pypy/dist/pypy/translator/llvm/codewriter.py Wed Nov 21 18:53:02 2007
@@ -5,7 +5,7 @@
class CodeWriter(object):
tail = '' #/tail
- cconv = 'fastcc' #ccc/fastcc
+ cconv = 'ccc' #ccc/fastcc
linkage = 'internal ' #/internal (disabled for now because of the JIT)
def __init__(self, file, db, tail=None, cconv=None, linkage=None):
Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py (original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py Wed Nov 21 18:53:02 2007
@@ -15,6 +15,36 @@
from pypy.translator.llvm.externs2ll import setup_externs, generate_llfile
from pypy.translator.llvm.gc import GcPolicy
from pypy.translator.llvm.log import log
+from pypy.rlib.nonconst import NonConstant
+from pypy.annotation.listdef import s_list_of_strings
+from pypy.rpython.annlowlevel import MixLevelHelperAnnotator
+from pypy.annotation import model as annmodel
+from pypy.rpython.lltypesystem import rffi
+
+def augment_entrypoint(translator, entrypoint):
+ bk = translator.annotator.bookkeeper
+ graph_entrypoint = bk.getdesc(entrypoint).getuniquegraph()
+ s_result = translator.annotator.binding(graph_entrypoint.getreturnvar())
+ get_argc = rffi.llexternal('_pypy_getargc', [], rffi.INT)
+ get_argv = rffi.llexternal('_pypy_getargv', [], rffi.CCHARPP)
+
+ def return_list_of_strings():
+ argc = get_argc()
+ argv = get_argv()
+ return [rffi.charp2str(argv[i]) for i in range(argc)]
+
+ def new_entrypoint():
+ return entrypoint(return_list_of_strings())
+
+ mixlevelannotator = MixLevelHelperAnnotator(translator.rtyper)
+ mixlevelannotator.getgraph(return_list_of_strings, [], s_list_of_strings)
+ graph = mixlevelannotator.getgraph(new_entrypoint, [], s_result)
+ mixlevelannotator.finish()
+
+ from pypy.translator.backendopt.all import backend_optimizations
+ backend_optimizations(translator)
+
+ return new_entrypoint
class GenLLVM(object):
debug = False
@@ -82,6 +112,9 @@
create ll file for c file
create codewriter """
+ if self.standalone:
+ func = augment_entrypoint(self.translator, func)
+
# XXX please dont ask!
from pypy.translator.c.genc import CStandaloneBuilder
cbuild = CStandaloneBuilder(self.translator, func, config=self.config)
Modified: pypy/dist/pypy/translator/llvm/module/genexterns.c
==============================================================================
--- pypy/dist/pypy/translator/llvm/module/genexterns.c (original)
+++ pypy/dist/pypy/translator/llvm/module/genexterns.c Wed Nov 21 18:53:02 2007
@@ -30,7 +30,7 @@
#ifdef ENTRY_POINT_DEFINED
int _argc;
-char **argv;
+char **_argv;
int _pypy_getargc() {
return _argc;
@@ -40,14 +40,25 @@
return _argv;
}
+/* we still need to forward declare our entry point */
+int __ENTRY_POINT__(void);
+
+#include <stdio.h>
+
int main(int argc, char *argv[]) {
- char *errmsg = RPython_StartupCode();
+ int res;
+ char *errmsg;
+ errmsg = RPython_StartupCode();
if (errmsg) {
fprintf(stderr, "Fatal error during initialization: %s\n", errmsg);
return 1;
}
- return __ENTRY_POINT__();
+ _argc = argc;
+ _argv = argv;
+
+ res = __ENTRY_POINT__();
+ return res;
}
#else
More information about the Pypy-commit
mailing list