* src/vm/jit/stack.h (COPY): Prevent setting varkind to STACKVAR for stackslots copie...
[cacao.git] / src / vm / jit / stack.h
index c8551b4e4d5ea6d39be44d0dd23fb588a085bcce..712b3678a6e5b10ee6b608b3df6523189f9c7891 100644 (file)
@@ -1,9 +1,9 @@
 /* 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)
 
 
@@ -360,12 +335,14 @@ CACAO JVM Paper
         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;}
@@ -479,9 +456,9 @@ CACAO JVM Paper
 
 #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 { \
@@ -530,4 +507,5 @@ void md_return_alloc(methodinfo *m, registerdata *rd, s4 return_type,
  * c-basic-offset: 4
  * tab-width: 4
  * End:
+ * vim:noexpandtab:sw=4:ts=4:
  */