/* vm/jit/stack.h - stack analysis header
- 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
+ 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
This file is part of CACAO.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- 02111-1307, USA.
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ 02110-1301, USA.
- Contact: cacao@complang.tuwien.ac.at
+ Contact: cacao@cacaojvm.org
Authors: Christian Thalinger
- $Id: stack.h 3734 2005-11-22 22:21:20Z christian $
+ Changes: Christian Ullrich
+
+ $Id: stack.h 4524 2006-02-16 19:39:36Z christian $
*/
#ifndef _STACK_H
#define _STACK_H
-#include "vm/global.h"
+#include "config.h"
+
+#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 */
-/**********************************************************************/
+/* macros used internally by analyse_stack ************************************/
-#ifdef STATISTICS
-#define COUNT(cnt) cnt++
+#if defined(ENABLE_LSRA)
+# define INC_LIFETIMES(a) { m->maxlifetimes += (a); }
#else
-#define COUNT(cnt)
-#endif
-
-#ifdef LSRA
-#define INC_LIFETIMES(a) { m->maxlifetimes += (a); }
-#else
-#define INC_LIFETIMES(a)
+# define INC_LIFETIMES(a)
#endif
/* convenient abbreviations */
#define CURKIND curstack->varkind
#define CURTYPE curstack->type
+
/*--------------------------------------------------*/
/* SIGNALING ERRORS */
/*--------------------------------------------------*/
#define TYPE_VERIFYERROR(t) \
do { \
- char *type = NULL; \
- switch ((t)) { \
- case TYPE_INT: \
- type = "integer"; \
- break; \
- case TYPE_LNG: \
- type = "long"; \
- break; \
- case TYPE_FLT: \
- type = "float"; \
- break; \
- case TYPE_DBL: \
- type = "double"; \
- break; \
- case TYPE_ADR: \
- type = "object/array"; \
- break; \
- } \
- *exceptionptr = new_verifyerror(m, \
- "Expecting to find %s on stack", \
- type); \
+ exceptions_throw_verifyerror_for_stack(m,t); \
return NULL; \
} while (0)
curstack = curstack->prev; \
} while (0)
-/*******************************************************
-Quick Fix to prevent dependence problems of local vars
-varnum is not set to the according position within the stack
-like it is done normaly in stack.c
--> if this shows to be a problem this can be solved in all the
-DUP* and SWAP Macros
-TODO: dependences should be prevented as described in the
-CACAO JVM Paper
-*******************************************************/
+/* Do not copy Interface Stackslots over DUPx, Swaps! */
#define COPY(s,d) \
do { \
(d)->flags = 0; \
(d)->type = (s)->type; \
- if ((s)->varkind == LOCALVAR) \
- (s)->varkind = TEMPVAR; \
- (d)->varkind = (s)->varkind; \
- (d)->varnum = (s)->varnum; \
+ if ( (s)->varkind != STACKVAR) { \
+ (d)->varkind = (s)->varkind; \
+ (d)->varnum = (s)->varnum; \
+ } else { \
+ (d)->varkind = TEMPVAR; \
+ (d)->varnum = 0; \
+ } \
} while (0)
SETDST; \
} while (0)
-/* Same dependency quick fix as at COPY */
+/* Do not copy Interface Stackslots over DUP! */
#define DUP {REQUIRE_1; \
- if (CURKIND == LOCALVAR) \
- CURKIND = TEMPVAR; \
- NEWSTACK(CURTYPE,CURKIND,curstack->varnum);SETDST; \
- stackdepth++; INC_LIFETIMES(1);}
+ if (CURKIND != STACKVAR) { \
+ NEWSTACK(CURTYPE,CURKIND,curstack->varnum); \
+ } else { \
+ NEWSTACK(CURTYPE, TEMPVAR, stackdepth); \
+ } \
+ SETDST; stackdepth++; INC_LIFETIMES(1);}
#define SWAP {REQUIRE_2;COPY(curstack,new);POPANY;COPY(curstack,new+1);POPANY;\
new[0].prev=curstack;new[1].prev=new;\
curstack=new+1;new+=2;SETDST;}
#define MARKREACHED(b,c) \
do { \
- if ((b)->flags < 0) { \
+ if ((b)->flags < BBREACHED) { \
COPYCURSTACK((c)); \
- (b)->flags = 0; \
+ (b)->flags = BBREACHED; \
(b)->instack = (c); \
(b)->indepth = stackdepth; \
} else { \
* c-basic-offset: 4
* tab-width: 4
* End:
+ * vim:noexpandtab:sw=4:ts=4:
*/