* src/vm/jit/code.h (codeinfo): Added synchronizedoffset
[cacao.git] / src / vm / jit / code.h
index f6245a0b7c05ec56f35fff74c95c4cf68b0f7b95..05b5d28ad83cb4d7a12ff19c0dec8e2be4f4a0ef 100644 (file)
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id$
-
 */
 
 
 #ifndef _CODE_H
 #define _CODE_H
 
-/* forward typedefs ***********************************************************/
+#include "config.h"
 
-typedef struct codeinfo codeinfo;
+#include <stdint.h>
 
-#include "config.h"
 #include "vm/types.h"
 
+#include "toolbox/list.h"
+
 #include "vm/global.h"
 
 #include "vm/jit/replace.h"
@@ -46,8 +45,9 @@ typedef struct codeinfo codeinfo;
 
 /* constants ******************************************************************/
 
-#define CODE_FLAG_INVALID     0x0001
-#define CODE_FLAG_LEAFMETHOD  0x0002
+#define CODE_FLAG_INVALID         0x0001
+#define CODE_FLAG_LEAFMETHOD      0x0002
+#define CODE_FLAG_SYNCHRONIZED    0x0004
 
 
 /* codeinfo *******************************************************************
@@ -63,24 +63,27 @@ typedef struct codeinfo codeinfo;
 
 struct codeinfo {
        methodinfo   *m;                    /* method this is a realization of    */
-       java_objectheader header;           /* we need this in JIT's monitorenter */
        codeinfo     *prev;                 /* previous codeinfo of this method   */
 
-       u4            codeflags;            /* or of CODE_FLAG_ constants         */
+       uint32_t      flags;                /* OR of CODE_FLAG_ constants         */
 
        u1            optlevel;             /* optimization level of this code    */
        s4            basicblockcount;      /* number of basic blocks             */
 
+       int32_t       synchronizedoffset;   /* stack offset of synchronized obj.  */
+
        /* machine code */
        u1           *mcode;                /* pointer to machine code            */
        u1           *entrypoint;           /* machine code entry point           */
        s4            mcodelength;          /* length of generated machine code   */
 
+       /* patcher list */
+       list_t       *patchers;
+
        /* replacement */                                   
 #if defined(ENABLE_REPLACEMENT)
        rplpoint     *rplpoints;            /* replacement points                 */
        rplalloc     *regalloc;             /* register allocation info           */
-       u1           *replacementstubs;     /* beginning of replacement stubs     */
        s4            rplpointcount;        /* number of replacement points       */
        s4            globalcount;          /* number of global allocations       */
        s4            regalloccount;        /* number of total allocations        */
@@ -88,25 +91,86 @@ struct codeinfo {
        s4            stackframesize;       /* size of the stackframe in slots    */
        u1            savedintcount;        /* number of callee saved int regs    */
        u1            savedfltcount;        /* number of callee saved flt regs    */
+# if defined(HAS_ADDRESS_REGISTER_FILE)
+       u1            savedadrcount;        /* number of callee saved adr regs    */
+# endif
        u1           *savedmcode;           /* saved code under patches           */
-#endif /* defined(ENABLE_REPLACEMENT) */
+#endif
 
+#if defined(ENABLE_PROFILING)
        u4            frequency;            /* number of method invocations       */
        u4           *bbfrequency;                  
        s8            cycles;               /* number of cpu cycles               */
+#endif
 };
 
 
-/* macros *********************************************************************/
+/* inline functions ***********************************************************/
 
-#define CODE_IS_VALID(code)       (!((code)->codeflags & CODE_FLAG_INVALID))
-#define CODE_IS_INVALID(code)     ((code)->codeflags & CODE_FLAG_INVALID)
-#define CODE_IS_LEAFMETHOD(code)  ((code)->codeflags & CODE_FLAG_LEAFMETHOD)
+/* code_xxx_invalid ************************************************************
 
-#define CODE_SETFLAG_INVALID(code)                                   \
-            ((code)->codeflags |= CODE_FLAG_INVALID)
-#define CODE_SETFLAG_LEAFMETHOD(code)                                \
-            ((code)->codeflags |= CODE_FLAG_LEAFMETHOD)
+   Functions for CODE_FLAG_INVALID.
+
+*******************************************************************************/
+
+inline static int code_is_invalid(codeinfo *code)
+{
+       return (code->flags & CODE_FLAG_INVALID);
+}
+
+inline static void code_flag_invalid(codeinfo *code)
+{
+       code->flags |= CODE_FLAG_INVALID;
+}
+
+inline static void code_unflag_invalid(codeinfo *code)
+{
+       code->flags &= ~CODE_FLAG_INVALID;
+}
+
+
+/* code_xxx_leafmethod *********************************************************
+
+   Functions for CODE_FLAG_LEAFMETHOD.
+
+*******************************************************************************/
+
+inline static int code_is_leafmethod(codeinfo *code)
+{
+       return (code->flags & CODE_FLAG_LEAFMETHOD);
+}
+
+inline static void code_flag_leafmethod(codeinfo *code)
+{
+       code->flags |= CODE_FLAG_LEAFMETHOD;
+}
+
+inline static void code_unflag_leafmethod(codeinfo *code)
+{
+       code->flags &= ~CODE_FLAG_LEAFMETHOD;
+}
+
+
+/* code_xxx_synchronized *******************************************************
+
+   Functions for CODE_FLAG_SYNCHRONIZED.
+
+*******************************************************************************/
+
+inline static int code_is_synchronized(codeinfo *code)
+{
+       return (code->flags & CODE_FLAG_SYNCHRONIZED);
+}
+
+inline static void code_flag_synchronized(codeinfo *code)
+{
+       code->flags |= CODE_FLAG_SYNCHRONIZED;
+}
+
+inline static void code_unflag_synchronized(codeinfo *code)
+{
+       code->flags &= ~CODE_FLAG_SYNCHRONIZED;
+}
 
 
 /* function prototypes ********************************************************/
@@ -117,10 +181,13 @@ codeinfo *code_codeinfo_new(methodinfo *m);
 void code_codeinfo_free(codeinfo *code);
 
 codeinfo *code_find_codeinfo_for_pc(u1 *pc);
+codeinfo *code_find_codeinfo_for_pc_nocheck(u1 *pc);
+
+codeinfo   *code_get_codeinfo_for_pv(u1 *pv);
+methodinfo *code_get_methodinfo_for_pv(u1 *pv);
 
 #if defined(ENABLE_REPLACEMENT)
 int code_get_sync_slot_count(codeinfo *code);
-int code_get_stack_frame_size(codeinfo *code);
 #endif /* defined(ENABLE_REPLACEMENT) */
 
 void code_free_code_of_method(methodinfo *m);