#ifndef _CODE_H
#define _CODE_H
-/* forward typedefs ***********************************************************/
-
#include "config.h"
+
+#include <stdint.h>
+
#include "vm/types.h"
#include "toolbox/list.h"
/* 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 *******************************************************************
methodinfo *m; /* method this is a realization of */
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 */
};
-/* macros *********************************************************************/
+/* inline functions ***********************************************************/
+
+/* code_xxx_invalid ************************************************************
+
+ 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);
+}
-#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)
+inline static void code_flag_synchronized(codeinfo *code)
+{
+ code->flags |= CODE_FLAG_SYNCHRONIZED;
+}
-#define CODE_SETFLAG_INVALID(code) \
- ((code)->codeflags |= CODE_FLAG_INVALID)
-#define CODE_SETFLAG_LEAFMETHOD(code) \
- ((code)->codeflags |= CODE_FLAG_LEAFMETHOD)
+inline static void code_unflag_synchronized(codeinfo *code)
+{
+ code->flags &= ~CODE_FLAG_SYNCHRONIZED;
+}
/* function prototypes ********************************************************/
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)