* src/vm/jit/x86_64/codegen.c (codegen_emit PUTFIELDCONST, PUTSTATICCONST):
[cacao.git] / src / vm / jit / replace.h
index dd3e32bc387e428857b220cd9abb492abdb046f1..752cd385f4c8f8a633638c33688272101c781511 100644 (file)
@@ -22,8 +22,6 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id$
-
 */
 
 
@@ -45,7 +43,8 @@
 #define REPLACEMENT_POINT_RETURN(cd, iptr)
 #define REPLACEMENT_POINT_INVOKE(cd, iptr)
 #define REPLACEMENT_POINT_INVOKE_RETURN(cd, iptr)
-#define REPLACEMENT_EMIT_STUBS(jd)
+#define REPLACEMENT_POINT_FORGC_BUILTIN(cd, iptr)
+#define REPLACEMENT_POINT_FORGC_BUILTIN_RETURN(cd, iptr)
 
 #else /* defined(ENABLE_REPLACEMENT) */
 
 
 typedef struct rplalloc rplalloc;
 typedef struct rplpoint rplpoint;
-typedef struct executionstate_t executionstate_t;
 typedef struct sourcestate_t sourcestate_t;
 typedef struct sourceframe_t sourceframe_t;
-typedef struct replace_safestack_t replace_safestack_t;
 typedef union  replace_val_t replace_val_t;
 
 #include "arch.h"
@@ -68,16 +65,6 @@ typedef union  replace_val_t replace_val_t;
 #include "vmcore/method.h"
 
 
-/* alignment for the safe stack used during replacement */
-
-#define REPLACE_STACK_ALIGNMENT  16
-
-/* the size of the safe stack we use during replacement */
-/* Must be a multiple of REPLACE_STACK_ALIGNMENT.       */
-
-#define REPLACE_SAFESTACK_SIZE  16384  /* bytes */
-
-
 /*** structs *********************************************************/
 
 #define RPLALLOC_STACK  -1
@@ -140,38 +127,20 @@ struct rplpoint {
 
 
 union replace_val_t {
-       s4                 i;
-       s8                 l;
-       ptrint             p;
+       s4             i;
+       s8             l;
+       ptrint         p;
        struct {
                u4 lo;
                u4 hi;
-       }                  words;
-       float              f;
-       double             d;
-       java_objectheader *a;
-};
-
-
-/* An `executionsstate` represents the state of a thread as it reached */
-/* an replacement point or is about to enter one.                      */
-
-struct executionstate_t {
-       u1           *pc;                               /* program counter */
-       u1           *sp;                   /* stack pointer within method */
-       u1           *pv;                   /* procedure value. NULL means */
-                                           /* search the AVL tree         */
-
-       ptrint        intregs[INT_REG_CNT];             /* register values */
-       double        fltregs[FLT_REG_CNT];             /* register values */
-#if defined(HAS_ADDRESS_REGISTER_FILE)
-       ptrint        adrregs[ADR_REG_CNT];             /* register values */
-#endif
-
-       codeinfo     *code;            /* codeinfo corresponding to the pv */
+       }              words;
+       float          f;
+       double         d;
+       java_object_t *a;
 };
 
 
+       u1           *ra;                /* return address / link register */
 struct sourceframe_t {
        sourceframe_t *down;           /* source frame down the call chain */
 
@@ -200,7 +169,7 @@ struct sourceframe_t {
        codeinfo      *tocode;            /* code this frame was mapped to */
 
        /* info for native frames */
-       stackframeinfo *sfi;      /* sfi for native frames, otherwise NULL */
+       stackframeinfo_t *sfi;      /* sfi for native frames, otherwise NULL */
        s4             nativeframesize;    /* size (bytes) of native frame */
        u1            *nativepc;
        ptrint         nativesavint[INT_SAV_CNT]; /* XXX temporary */
@@ -219,28 +188,6 @@ struct sourcestate_t {
 };
 
 
-/* replace_safestack_t *********************************************************
-
-   This struct is used to allocate a safe stack area to be used during the
-   last phase of replacement. It also contains copies of all data needed
-   during this phase. (The data cannot be kept in normal variables, as
-   the C stack may be destroyed during replacement.)
-
-   CAUTION: Do not change the layout of this struct! The assembler code
-            depends on the order of fields. (`stack` must be first,
-                       directly followed by `es`.)
-
-*******************************************************************************/
-
-struct replace_safestack_t {
-       u1                stack[REPLACE_SAFESTACK_SIZE];
-       executionstate_t  es;
-       sourcestate_t    *ss;
-       u1               *mem;             /* start of the allocated memory chunk */
-       s4                dumpsize;
-};
-
-
 /*** macros for the codegens *******************************************/
 
 #define REPLACEMENT_POINTS_INIT(cd, jd)                              \
@@ -272,8 +219,26 @@ struct replace_safestack_t {
         cd->replacementpoint[-1].callsize = (cd->mcodeptr - cd->mcodebase)\
                     - (ptrint) cd->replacementpoint[-1].pc;
 
-#define REPLACEMENT_EMIT_STUBS(jd)                                   \
-    emit_replacement_stubs(jd);
+
+/*** macros for the codegens (for GC) **********************************/
+
+#if defined(ENABLE_GC_CACAO)
+
+#define REPLACEMENT_POINT_FORGC_BUILTIN(cd, iptr)                    \
+       codegen_set_replacement_point(cd RPLPOINT_CHECK(CALL));
+
+#define REPLACEMENT_POINT_FORGC_BUILTIN_RETURN(cd, iptr)             \
+       if (iptr->opc == ICMD_BUILTIN)                                   \
+               cd->replacementpoint[-1].callsize = (cd->mcodeptr - cd->mcodebase)\
+                                       - (ptrint) cd->replacementpoint[-1].pc;
+
+#else /* defined(ENABLE_GC_CACAO) */
+
+#define REPLACEMENT_POINT_FORGC_BUILTIN(cd, iptr)
+#define REPLACEMENT_POINT_FORGC_BUILTIN_RETURN(cd, iptr)
+
+#endif /* defined(ENABLE_GC_CACAO) */
+
 
 /*** prototypes ********************************************************/
 
@@ -283,12 +248,11 @@ void replace_free_replacement_points(codeinfo *code);
 void replace_activate_replacement_points(codeinfo *code, bool mappable);
 void replace_deactivate_replacement_points(codeinfo *code);
 
-void replace_me(rplpoint *rp,executionstate_t *es);
+bool replace_me_wrapper(u1 *pc, void *context);
 
 #if !defined(NDEBUG)
 void replace_show_replacement_points(codeinfo *code);
 void replace_replacement_point_println(rplpoint *rp, int depth);
-void replace_executionstate_println(executionstate_t *es);
 void replace_sourcestate_println(sourcestate_t *ss);
 void replace_sourcestate_println_short(sourcestate_t *ss);
 void replace_source_frame_println(sourceframe_t *frame);
@@ -297,8 +261,7 @@ void replace_source_frame_println(sourceframe_t *frame);
 /* machine dependent functions (code in ARCH_DIR/md.c) */
 
 #if defined(ENABLE_JIT)
-void md_patch_replacement_point(codeinfo *code, s4 index, rplpoint *rp,
-                                                               u1 *savedmcode);
+void md_patch_replacement_point(u1 *pc, u1 *savedmcode, bool revert);
 #endif
 
 #endif /* defined(ENABLE_REPLACEMENT) */