/* src/vm/jit/code.c - codeinfo struct for representing compiled code
- Copyright (C) 1996-2005, 2006, 2007 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, 2007, 2008
+ CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- $Id$
-
*/
#include "config.h"
#include <assert.h>
-
-#include "vm/types.h"
+#include <stdint.h>
#include "arch.h"
#include "mm/memory.h"
-#if defined(ENABLE_THREADS)
-# include "threads/native/lock.h"
-#endif
+#include "vm/options.h"
+#include "vm/vm.hpp"
#include "vm/jit/code.h"
#include "vm/jit/codegen-common.h"
-#include "vm/jit/methodheader.h"
#include "vm/jit/patcher-common.h"
-
-#include "vmcore/options.h"
+#include "vm/jit/methodtree.h"
/* code_init *******************************************************************
*******************************************************************************/
-bool code_init(void)
+void code_init(void)
{
- /* check for offset of code->m == 0 (see comment in code.h) */
+ /* Check if offset of codeinfo.m == 0 (see comment in code.h). */
- assert(OFFSET(codeinfo, m) == 0);
-
- /* everything's ok */
-
- return true;
+ if (OFFSET(codeinfo, m) != 0)
+ vm_abort("code_init: offset of codeinfo.m != 0: %d != 0", OFFSET(codeinfo, m));
}
Return the codeinfo for the compilation unit that contains the
given PC.
- IN:
+ ARGUMENTS:
pc...............machine code position
RETURN VALUE:
*******************************************************************************/
-codeinfo *code_find_codeinfo_for_pc(u1 *pc)
+codeinfo *code_find_codeinfo_for_pc(void *pc)
+{
+ void *pv;
+
+ pv = methodtree_find(pc);
+
+ return code_get_codeinfo_for_pv(pv);
+}
+
+
+/* code_find_codeinfo_for_pc ***************************************************
+
+ Return the codeinfo for the compilation unit that contains the
+ given PC. This method does not check the return value and is used
+ by the GC.
+
+ IN:
+ pc...............machine code position
+
+ RETURN VALUE:
+ the codeinfo * for the given PC, or NULL
+
+*******************************************************************************/
+
+codeinfo *code_find_codeinfo_for_pc_nocheck(void *pc)
{
- u1 *pv;
+ void *pv;
+
+ pv = methodtree_find_nocheck(pc);
- pv = codegen_get_pv_from_pc(pc);
- assert(pv);
+ if (pv == NULL)
+ return NULL;
- return *(codeinfo **)(pv + CodeinfoPointer);
+ return code_get_codeinfo_for_pv(pv);
}
*******************************************************************************/
-methodinfo *code_get_methodinfo_for_pv(u1 *pv)
+methodinfo *code_get_methodinfo_for_pv(void *pv)
{
codeinfo *code;
- code = *((codeinfo **) (pv + CodeinfoPointer));
+ code = code_get_codeinfo_for_pv(pv);
+
+ /* This is the case for asm_vm_call_method. */
+
+ if (code == NULL)
+ return NULL;
return code->m;
}
if (!checksync)
return 0;
- if (!(code->m->flags & ACC_SYNCHRONIZED))
+ if (!code_is_synchronized(code))
return 0;
count = 1;