1 /* src/vm/jit/code.hpp - codeinfo struct for representing compiled code
3 Copyright (C) 1996-2005, 2006, 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
36 #include "toolbox/list.hpp"
38 #include "vm/global.h"
39 #include "vm/method.h"
41 #include "vm/jit/exceptiontable.h"
42 #if defined (ENABLE_JITCACHE)
43 #include "vm/jit/jitcache.hpp"
45 #include "vm/jit/linenumbertable.hpp"
46 #include "vm/jit/methodheader.h"
47 #include "vm/jit/patcher-common.hpp"
48 #include "vm/jit/replace.hpp"
51 /* constants ******************************************************************/
53 #define CODE_FLAG_INVALID 0x0001
54 #define CODE_FLAG_LEAFMETHOD 0x0002
55 #define CODE_FLAG_SYNCHRONIZED 0x0004
56 #define CODE_FLAG_TLH 0x0008
59 /* codeinfo *******************************************************************
61 A codeinfo represents a particular realization of a method in
64 ATTENTION: The methodinfo entry in the code-structure MUST have the
65 offset 0, otherwise we have a problem in our compiler stub. This is
66 checked with an assert in code_init().
68 *******************************************************************************/
71 methodinfo *m; /* method this is a realization of */
72 codeinfo *prev; /* previous codeinfo of this method */
74 uint32_t flags; /* OR of CODE_FLAG_ constants */
76 u1 optlevel; /* optimization level of this code */
77 s4 basicblockcount; /* number of basic blocks */
79 int32_t synchronizedoffset; /* stack offset of synchronized obj. */
82 u1 *mcode; /* pointer to machine code */
83 u1 *entrypoint; /* machine code entry point */
84 s4 mcodelength; /* length of generated machine code */
86 exceptiontable_t *exceptiontable;
87 LinenumberTable* linenumbertable;
91 List<patchref_t>* patchers;
96 #if defined (ENABLE_JITCACHE)
98 List<cachedref_t>* cachedrefs;
105 s4 stackframesize; /* size of the stackframe in slots */
107 #if defined(ENABLE_REPLACEMENT)
108 rplpoint *rplpoints; /* replacement points */
109 rplalloc *regalloc; /* register allocation info */
110 s4 rplpointcount; /* number of replacement points */
111 s4 globalcount; /* number of global allocations */
112 s4 regalloccount; /* number of total allocations */
113 s4 memuse; /* number of arg + local slots */
114 u1 savedintcount; /* number of callee saved int regs */
115 u1 savedfltcount; /* number of callee saved flt regs */
116 # if defined(HAS_ADDRESS_REGISTER_FILE)
117 u1 savedadrcount; /* number of callee saved adr regs */
119 u1 *savedmcode; /* saved code under patches */
122 #if defined(ENABLE_PROFILING)
123 u4 frequency; /* number of method invocations */
125 s8 cycles; /* number of cpu cycles */
134 /* inline functions ***********************************************************/
136 /* code_xxx_invalid ************************************************************
138 Functions for CODE_FLAG_INVALID.
140 *******************************************************************************/
142 inline static int code_is_invalid(codeinfo *code)
144 return (code->flags & CODE_FLAG_INVALID);
147 inline static void code_flag_invalid(codeinfo *code)
149 code->flags |= CODE_FLAG_INVALID;
152 inline static void code_unflag_invalid(codeinfo *code)
154 code->flags &= ~CODE_FLAG_INVALID;
158 /* code_xxx_leafmethod *********************************************************
160 Functions for CODE_FLAG_LEAFMETHOD.
162 *******************************************************************************/
164 inline static int code_is_leafmethod(codeinfo *code)
166 return (code->flags & CODE_FLAG_LEAFMETHOD);
169 inline static void code_flag_leafmethod(codeinfo *code)
171 code->flags |= CODE_FLAG_LEAFMETHOD;
174 inline static void code_unflag_leafmethod(codeinfo *code)
176 code->flags &= ~CODE_FLAG_LEAFMETHOD;
180 /* code_xxx_synchronized *******************************************************
182 Functions for CODE_FLAG_SYNCHRONIZED.
184 *******************************************************************************/
186 inline static int code_is_synchronized(codeinfo *code)
188 return (code->flags & CODE_FLAG_SYNCHRONIZED);
191 inline static void code_flag_synchronized(codeinfo *code)
193 code->flags |= CODE_FLAG_SYNCHRONIZED;
196 inline static void code_unflag_synchronized(codeinfo *code)
198 code->flags &= ~CODE_FLAG_SYNCHRONIZED;
202 /* code_get_codeinfo_for_pv ****************************************************
204 Return the codeinfo for the given PV.
212 *******************************************************************************/
214 inline static codeinfo *code_get_codeinfo_for_pv(void *pv)
220 code = *((codeinfo **) (((uintptr_t) pv) + CodeinfoPointer));
226 /* function prototypes ********************************************************/
228 void code_init(void);
230 codeinfo *code_codeinfo_new(methodinfo *m);
231 void code_codeinfo_free(codeinfo *code);
233 codeinfo *code_find_codeinfo_for_pc(void *pc);
234 codeinfo *code_find_codeinfo_for_pc_nocheck(void *pc);
236 methodinfo *code_get_methodinfo_for_pv(void *pv);
238 #if defined(ENABLE_REPLACEMENT)
239 int code_get_sync_slot_count(codeinfo *code);
240 #endif /* defined(ENABLE_REPLACEMENT) */
242 void code_free_code_of_method(methodinfo *m);
252 * These are local overrides for various environment variables in Emacs.
253 * Please do not remove this and leave it at the end of the file, where
254 * Emacs will automagically detect them.
255 * ---------------------------------------------------------------------
258 * indent-tabs-mode: t
262 * vim:noexpandtab:sw=4:ts=4: