* gen_inst: Use lastmcodeptr instead of last_compiled.
[cacao.git] / src / vm / jit / codegen.inc.h
index 0728522e5a8308df68bcb1ea80c121e7ee24ebcd..4cdeb48005d0379aa11b4be27a026ac53ef577a2 100644 (file)
@@ -1,9 +1,9 @@
-/* jit/codegen.inc.h - code generation header
+/* src/vm/jit/codegen.inc.h - code generation header
 
-   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,9 @@
 
    Authors: Christian Thalinger
 
-   $Id: codegen.inc.h 1621 2004-11-30 13:06:55Z twisti $
+   Changes: Christian Ullrich
+
+   $Id: codegen.inc.h 3778 2005-11-23 22:36:14Z twisti $
 
 */
 
@@ -41,13 +43,18 @@ typedef struct codegendata codegendata;
 typedef struct branchref branchref;
 typedef struct jumpref jumpref;
 typedef struct dataref dataref;
-typedef struct clinitref clinitref;
+typedef struct patchref patchref;
 typedef struct linenumberref linenumberref;
 typedef struct threadcritnodetemp threadcritnodetemp;
 
 
-#include "types.h"
+#include "config.h"
+#include "vm/types.h"
+
 #include "vm/global.h"
+#include "vm/references.h"
+#include "vm/method.h"
+#include "vm/jit/jit.h"
 #include "vm/jit/reg.h"
 #include "vm/jit/inline/inline.h"
 
@@ -55,7 +62,17 @@ typedef struct threadcritnodetemp threadcritnodetemp;
 #define MCODEINITSIZE (1<<15)       /* 32 Kbyte code area initialization size */
 #define DSEGINITSIZE  (1<<12)       /*  4 Kbyte data area initialization size */
 
-#if POINTERSIZE == 8
+
+/* Register Pack/Unpack Macros ************************************************/
+
+#define GET_LOW_REG(a)  (((a) & 0xffff0000) >> 16)
+#define GET_HIGH_REG(a) ((a) &  0x0000ffff)
+
+#define PACK_REGS(low,high) \
+       ( ((high) & 0x0000ffff) | (((low) & 0x0000ffff) << 16) )
+
+
+#if SIZEOF_VOID_P == 8
 #define dseg_addaddress(cd,value)    dseg_adds8((cd), (s8) (value))
 #else
 #define dseg_addaddress(cd,value)    dseg_adds4((cd), (s4) (value))
@@ -77,10 +94,14 @@ struct codegendata {
        s4             *mcodeend;       /* pointer to end of code area            */
        s4              mcodesize;      /* complete size of code area (bytes)     */
 
-#if defined(__I386__) || defined(__X86_64__)
+#if defined(__I386__) || defined(__X86_64__) || defined(ENABLE_INTRP)
        u1             *mcodeptr;       /* code generation pointer                */
 #endif
 
+#if defined(__I386__) || defined(__MIPS__) || defined(__X86_64__) || defined(ENABLE_INTRP)
+       u1             *lastmcodeptr;   /* last patcher position of basic block   */
+#endif
+
        u1             *dsegtop;        /* pointer to top (end) of data area      */
        s4              dsegsize;       /* complete size of data area (bytes)     */
        s4              dseglen;        /* used size of data area (bytes)         */
@@ -89,12 +110,12 @@ struct codegendata {
        jumpref        *jumpreferences; /* list of jumptable target addresses     */
        dataref        *datareferences; /* list of data segment references        */
        branchref      *xboundrefs;     /* list of bound check branches           */
-       branchref      *xcheckarefs;    /* list of array size check branches      */
        branchref      *xnullrefs;      /* list of null check branches            */
        branchref      *xcastrefs;      /* list of cast check branches            */
+       branchref      *xstorerefs;     /* list of array store check branches     */
        branchref      *xdivrefs;       /* list of divide by zero branches        */
        branchref      *xexceptionrefs; /* list of exception branches             */
-       clinitref      *clinitrefs;
+       patchref       *patchrefs;
 
        linenumberref  *linenumberreferences; /* list of line numbers and the     */
                                        /* program counters of their first        */
@@ -140,10 +161,12 @@ struct dataref {
 };
 
 
-struct clinitref {
-       s4         branchpos;
-       classinfo *class;
-       clinitref *next;
+struct patchref {
+       s4           branchpos;
+       functionptr  patcher;
+       voidptr      ref;
+       patchref    *next;
+       s4           disp;
 };
 
 
@@ -157,24 +180,26 @@ struct linenumberref {
 };
 
 
-#if defined(__I386__) || defined(__X86_64__)
+#if defined(__I386__) || defined(__X86_64__) || defined(ENABLE_INTRP) || defined(DISABLE_GC)
 typedef struct _methodtree_element methodtree_element;
 
 struct _methodtree_element {
-       functionptr startpc;
-       functionptr endpc;
+       u1 *startpc;
+       u1 *endpc;
 };
 #endif
 
 
 /* function prototypes ********************************************************/
 
-void codegen_init();
+void codegen_init(void);
 void codegen_setup(methodinfo *m, codegendata *cd, t_inlining_globals *e);
-void codegen(methodinfo *m, codegendata *cd, registerdata *rd);
+bool codegen(methodinfo *m, codegendata *cd, registerdata *rd);
 void codegen_free(methodinfo *m, codegendata *cd);
-void codegen_close();
-void codegen_insertmethod(functionptr startpc, functionptr endpc);
+void codegen_close(void);
+void codegen_insertmethod(u1 *startpc, u1 *endpc);
+
+u1 *codegen_findmethod(u1 *pc);
 
 #if defined(__I386__) || defined(__X86_64__)
 void codegen_addreference(codegendata *cd, struct basicblock *target, void *branchptr);
@@ -182,7 +207,21 @@ void codegen_addreference(codegendata *cd, struct basicblock *target, void *bran
 
 void dseg_display(methodinfo *m, codegendata *cd);
 
-void init_exceptions();
+u1 *codegen_createnativestub(functionptr f, methodinfo *m);
+void codegen_disassemble_nativestub(methodinfo *m, u1 *start, u1 *end);
+
+void codegen_start_native_call(u1 *datasp, u1 *pv, u1 *sp, u1 *ra);
+void codegen_finish_native_call(u1 *datasp);
+
+u1 *createcompilerstub(methodinfo *m);
+u1 *createnativestub(functionptr f, methodinfo *m, codegendata *cd,
+                                        registerdata *rd, methoddesc *md);
+
+void removecompilerstub(u1 *stub);
+void removenativestub(u1 *stub);
+
+/* machine dependent find method function */
+u1 *md_codegen_findmethod(u1 *ra);
 
 #endif /* _CODEGEN_INC_H */