-/* 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.
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;
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,¤tline,&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)