X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fvm%2Fjit%2Fstack.h;h=eceb2db2204fd84ca3b6256b58a5a471c9d559a9;hb=777a728b1d476cd762c1e8943f9c6412b027b43d;hp=0f9194632da504a2dabfb0ed227d66ca0d76d568;hpb=054eb2a674e7810dedd4fedec88ce351b7b3b224;p=cacao.git diff --git a/src/vm/jit/stack.h b/src/vm/jit/stack.h index 0f9194632..eceb2db22 100644 --- a/src/vm/jit/stack.h +++ b/src/vm/jit/stack.h @@ -1,9 +1,7 @@ -/* vm/jit/stack.h - stack analysis header +/* src/vm/jit/stack.h - stack analysis header - Copyright (C) 1996-2005, 2006 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 + Copyright (C) 1996-2005, 2006, 2008 + CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO This file is part of CACAO. @@ -22,52 +20,67 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - Contact: cacao@cacaojvm.org - - Authors: Christian Thalinger - - Changes: Christian Ullrich - Edwin Steiner - - $Id: stack.h 5442 2006-09-09 14:45:55Z edwin $ - */ #ifndef _STACK_H #define _STACK_H +/* forward typedefs ***********************************************************/ + +typedef struct stackelement_t stackelement_t; + + #include "config.h" +#include + #include "vm/types.h" #include "vm/exceptions.h" #include "vm/global.h" + #include "vm/jit/jit.h" #include "vm/jit/reg.h" -/* macros used internally by analyse_stack ************************************/ +/* stack element structure ****************************************************/ -/* convenient abbreviations */ -#define CURKIND curstack->varkind -#define CURTYPE curstack->type +/* flags */ +#define SAVEDVAR 1 /* variable has to survive method invocations */ +#define INMEMORY 2 /* variable stored in memory */ +#define SAVREG 4 /* allocated to a saved register */ +#define ARGREG 8 /* allocated to an arg register */ +#define PASSTHROUGH 32 /* stackslot was passed-through by an ICMD */ +#define PREALLOC 64 /* preallocated var like for ARGVARS. Used */ + /* with the new var system */ +#define INOUT 128 /* variable is an invar or/and an outvar */ -/*--------------------------------------------------*/ -/* STACK DEPTH CHECKING */ -/*--------------------------------------------------*/ +#define IS_SAVEDVAR(x) ((x) & SAVEDVAR) +#define IS_INMEMORY(x) ((x) & INMEMORY) -#if defined(ENABLE_VERIFIER) -#define CHECK_STACK_DEPTH(depthA,depthB) \ - do { \ - if ((depthA) != (depthB)) \ - goto throw_stack_depth_error; \ - } while (0) -#else /* !ENABLE_VERIFIER */ -#define CHECK_STACK_DEPTH(depthA,depthB) -#endif /* ENABLE_VERIFIER */ +/* variable kinds */ + +#define UNDEFVAR 0 /* stack slot will become temp during regalloc*/ +#define TEMPVAR 1 /* stack slot is temp register */ +#define STACKVAR 2 /* stack slot is numbered stack slot */ +#define LOCALVAR 3 /* stack slot is local variable */ +#define ARGVAR 4 /* stack slot is argument variable */ + + +struct stackelement_t { + stackelement_t *prev; /* pointer to next element towards bottom */ + instruction *creator; /* instruction that created this element */ + s4 type; /* slot type of stack element */ + s4 flags; /* flags (SAVED, INMEMORY) */ + s4 varkind; /* kind of variable or register */ + s4 varnum; /* number of variable */ +}; + + +/* macros used internally by analyse_stack ************************************/ /*--------------------------------------------------*/ /* BASIC TYPE CHECKING */ @@ -147,54 +160,13 @@ #define NEWSTACK0(s) NEWSTACK(s,UNDEFVAR,0) -/*--------------------------------------------------*/ -/* MACROS FOR HANDLING BASIC BLOCKS */ -/*--------------------------------------------------*/ - -/* COPYCURSTACK makes a copy of the current operand stack (curstack) - * and returns it in the variable copy. - * - * This macro is used to propagate the operand stack from one basic - * block to another. The destination block receives the copy as its - * input stack. - */ -#define COPYCURSTACK(sd, copy) { \ - stackptr s; \ - if (curstack) { \ - s = curstack; \ - (sd).new += stackdepth; \ - copy = (sd).new; \ - while (s) { \ - GET_NEW_VAR(sd, new_index, s->type); \ - copy--; \ - copy->prev = copy-1; \ - copy->creator = NULL; \ - copy->type = s->type; \ - copy->flags = 0; \ - copy->varkind = STACKVAR; \ - copy->varnum = new_index; \ - (sd).var[new_index].flags = OUTVAR; \ - s = s->prev; \ - } \ - copy->prev = NULL; \ - copy = (sd).new-1; \ - } \ - else \ - copy = NULL; \ -} - - -/* external macros ************************************************************/ - -#define BLOCK_OF(index) \ - (jd->new_basicblocks + jd->new_basicblockindex[index]) - - /* function prototypes ********************************************************/ bool stack_init(void); -bool new_stack_analyse(jitdata *jd); +bool stack_analyse(jitdata *jd); + +void stack_javalocals_store(instruction *iptr, s4 *javalocals); #endif /* _STACK_H */