GNU header update.
[cacao.git] / src / vm / jit / inline / inline.h
index 2ffc7f2b823be7d1e26955da88ebab0729bdbc4c..034c1a70f302bfedbeef9a15be370ae72cb343cd 100644 (file)
@@ -1,9 +1,9 @@
-/* jit/inline.c - code inliner
+/* jit/inline.h - code inliner
 
-   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
-   R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
-   M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
-   P. Tomsich, J. Wenninger
+   Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
+   R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
+   C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
+   Institut f. Computersprachen - TU Wien
 
    This file is part of CACAO.
 
@@ -26,7 +26,7 @@
 
    Authors: Dieter Thuernbeck
 
-   $Id: inline.h 665 2003-11-21 18:36:43Z jowenn $
+   $Id: inline.h 1735 2004-12-07 14:33:27Z twisti $
 
 */
 
 #ifndef _INLINE_H
 #define _INLINE_H
 
-#include "global.h"
-#include "toolbox/list.h"
+/* resolve typedef cycles *****************************************************/
+
+typedef struct t_inlining_globals t_inlining_globals;
 
-#define INLINING_MAXDEPTH       1
-#define INLINING_MAXCODESIZE    32
-#define INLINING_MAXMETHODS     8
 
+#include "toolbox/list.h"
+#include "vm/global.h"
 
-/*typedef struct {
-        listnode linkage;
-        instruction *iptr;
-        } t_patchlistnode;*/
 
+#define INLINING_MAXDEPTH       3  /*1*/ 
+#define INLINING_MAXCODESIZE    128 /*32*/
+#define INLINING_MAXMETHODS     32 /*8*/
 
 typedef struct {
     listnode linkage;
 
     methodinfo *method;
+    int level;
     int startgp;
     int stopgp;
     int firstlocal;
@@ -66,72 +66,97 @@ typedef struct {
 typedef struct {
     listnode linkage;
         
-    // saved static compiler variables
+    /* saved static compiler variables */
         
     methodinfo *method;
         
-    // restored through method
+    /* restored through method */
 
-    // int jcodelength;
-    // u1 *jcode;
-    // classinfo *class;
+    /* int jcodelength; */
+    /* u1 *jcode; */
+       /* classinfo *class; */
 
-    // descriptor never used
-    // maxstack used outside of main for loop
-    // maxlocals never used
+    /* descriptor never used */
+    /* maxstack used outside of main for loop */
+    /* maxlocals never used */
        
-    // exceptiontablelength
-    // raw_extable used outside of main for loop
-    // mreturntype used outside of main for loop
-    // mparamcount used outside of main for loop
-    // mparamtypes used outside of main for loop
-
-    //local variables used in parse()  
-
-    int  i;                     /* temporary for different uses (counters)    */
-    int  p;                     /* java instruction counter                   */
-    int  nextp;                 /* start of next java instruction             */
-    int  opcode;                /* java opcode                                */
-
+    /* exceptiontablelength */
+    /* raw_extable used outside of main for loop */
+    /* mreturntype used outside of main for loop */
+    /* mparamcount used outside of main for loop */
+    /* mparamtypes used outside of main for loop */
+
+    /* local variables used in parse() */
+
+    int  i;                     /* temporary for different uses (counters)*/
+    int  p;                     /* java instruction counter               */
+    int  nextp;                 /* start of next java instruction         */
+    int  opcode;                /* java opcode                            */
+    u2 lineindex;
+    u2 currentline;
+    u2 linepcchange;
     inlining_methodinfo *inlinfo;
 
-    /* list *patchlist; */
 } t_inlining_stacknode;
 
 
-/* extern variables */
-extern bool isinlinedmethod;
-extern int cumjcodelength;
-extern int cummaxstack;
-extern int cumextablelength;
-extern inlining_methodinfo *inlining_rootinfo;
+struct t_inlining_globals {  /* try in parse.h with struct not include */
+       bool isinlinedmethod;
+       int cumjcodelength;   /* cumulative immediate intruction length */
+       int cummaxstack;
+       int cumextablelength;
+       int cumlocals;        /* was static */
+       int cummethods;       /* was static */
+       list *inlining_stack; /* was static */
+       inlining_methodinfo *inlining_rootinfo;
+       methodinfo *method;
+       classinfo *class;
+       int jcodelength;
+       u1 *jcode;
+       bool isleafmethod;
+};
 
 
 /* function prototypes*/
-void inlining_init(methodinfo *m);
-void inlining_cleanup();
-void inlining_push_compiler_variables(int i, int p, int nextp, int opcode, 
-                                      inlining_methodinfo* inlinfo);
-void inlining_pop_compiler_variables(int *i, int *p, int *nextp, int *opcode, 
-                                     inlining_methodinfo** inlinfo); 
-void inlining_set_compiler_variables_fun(methodinfo *m);
+
+void inlining_setup(methodinfo *m, t_inlining_globals *inline_env);
+void inlining_cleanup(t_inlining_globals *inline_env);
+void inlining_push_compiler_variables(
+                                     int i, int p, int nextp, int opcode, 
+                                     u2 lineindex,u2 currentline,u2 linepcchange,
+                                      inlining_methodinfo* inlinfo,
+                                     t_inlining_globals *inline_env);
+void inlining_pop_compiler_variables(
+                                   int *i, int *p, int *nextp, int *opcode,
+                                   u2 *lineindex,u2 *currentline,u2 *linepcchange,
+                                    inlining_methodinfo **inlinfo,
+                                   t_inlining_globals *inline_env);
+void inlining_set_compiler_variables_fun(methodinfo *m, 
+                                        t_inlining_globals *inline_env);
 classinfo *first_occurence(classinfo* class, utf* name, utf* desc);
-bool is_unique_rec(classinfo *class, methodinfo *m, utf* name, utf* desc);
-bool is_unique_method(classinfo *class, methodinfo *m, utf* name, utf* desc);
-inlining_methodinfo *inlining_analyse_method(methodinfo *m, int level, int gp,
-                                             int firstlocal, int maxstackdepth);
+bool is_unique_recOLD(classinfo *class, methodinfo *m, utf* name, utf* desc);
+bool is_unique_methodOLD(classinfo *class, methodinfo *m, utf* name, utf* desc);
+inlining_methodinfo *inlining_analyse_method(methodinfo *m, 
+                                         int level, int gp,
+                                         int firstlocal, int maxstackdepth,                                          t_inlining_globals *inline_env);
 
+void print_t_inlining_globals (t_inlining_globals *g);
+void print_inlining_stack     ( list                *s);
+void print_inlining_methodinfo( inlining_methodinfo *r);
 
 #define inlining_save_compiler_variables() \
-    inlining_push_compiler_variables(i, p, nextp, opcode, inlinfo)
+    inlining_push_compiler_variables(i,p,nextp,opcode, lineindex,currentline, \
+       linepcchange,inlinfo,inline_env)
 
 #define inlining_restore_compiler_variables() \
-    inlining_pop_compiler_variables(&i, &p, &nextp, &opcode, &inlinfo)
+    inlining_pop_compiler_variables(&i, &p, &nextp, &opcode, \
+       &lineindex,&currentline,&linepcchange,&inlinfo, \
+       inline_env)
 
 #define inlining_set_compiler_variables(i) \
     do { \
         p = nextp = 0; \
-        inlining_set_compiler_variables_fun(i->method); \
+        inlining_set_compiler_variables_fun(i->method, inline_env); \
         inlinfo = i; \
     } while (0)