[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