1 /* src/vm/jit/code.c - codeinfo struct for representing compiled code
3 Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
36 #include "mm/memory.h"
38 #if defined(ENABLE_THREADS)
39 # include "threads/native/lock.h"
42 #include "vm/jit/code.h"
43 #include "vm/jit/codegen-common.h"
44 #include "vm/jit/methodheader.h"
45 #include "vm/jit/patcher-common.h"
47 #include "vmcore/options.h"
50 /* code_init *******************************************************************
52 Initialize the code-subsystem.
54 *******************************************************************************/
58 /* check for offset of code->m == 0 (see comment in code.h) */
60 assert(OFFSET(codeinfo, m) == 0);
68 /* code_codeinfo_new ***********************************************************
70 Create a new codeinfo for the given method.
73 m................method to create a new codeinfo for
75 The following fields are set in codeinfo:
80 a new, initialized codeinfo, or
81 NULL if an exception occurred.
83 *******************************************************************************/
85 codeinfo *code_codeinfo_new(methodinfo *m)
93 patcher_list_create(code);
95 #if defined(ENABLE_STATISTICS)
97 size_codeinfo += sizeof(codeinfo);
104 /* code_find_codeinfo_for_pc ***************************************************
106 Return the codeinfo for the compilation unit that contains the
110 pc...............machine code position
113 the codeinfo * for the given PC
115 *******************************************************************************/
117 codeinfo *code_find_codeinfo_for_pc(u1 *pc)
121 pv = codegen_get_pv_from_pc(pc);
124 return code_get_codeinfo_for_pv(pv);
128 /* code_find_codeinfo_for_pc ***************************************************
130 Return the codeinfo for the compilation unit that contains the
131 given PC. This method does not check the return value and is used
135 pc...............machine code position
138 the codeinfo * for the given PC, or NULL
140 *******************************************************************************/
142 codeinfo *code_find_codeinfo_for_pc_nocheck(u1 *pc)
146 pv = codegen_get_pv_from_pc_nocheck(pc);
151 return code_get_codeinfo_for_pv(pv);
155 /* code_get_codeinfo_for_pv ****************************************************
157 Return the codeinfo for the given PV.
165 *******************************************************************************/
167 codeinfo *code_get_codeinfo_for_pv(u1 *pv)
173 code = *((codeinfo **) (pv + CodeinfoPointer));
179 /* code_get_methodinfo_for_pv **************************************************
181 Return the methodinfo for the given PV.
189 *******************************************************************************/
191 methodinfo *code_get_methodinfo_for_pv(u1 *pv)
195 code = code_get_codeinfo_for_pv(pv);
197 /* This is the case for asm_vm_call_method. */
206 /* code_get_sync_slot_count ****************************************************
208 Return the number of stack slots used for storing the synchronized object
209 (and the return value around lock_monitor_exit calls) by the given code.
212 code.............the codeinfo of the code in question
216 the number of stack slots used for synchronization
218 *******************************************************************************/
220 #if defined(ENABLE_REPLACEMENT)
221 int code_get_sync_slot_count(codeinfo *code)
223 #ifdef ENABLE_THREADS
231 if (!(code->m->flags & ACC_SYNCHRONIZED))
236 #ifdef HAS_4BYTE_STACKSLOT
237 /* long and double need 2 4-byte slots */
238 if (IS_2_WORD_TYPE(code->m->parseddesc->returntype.type))
242 #if defined(__POWERPC__)
243 /* powerpc needs an extra slot */
249 #else /* !ENABLE_THREADS */
253 #endif /* ENABLE_THREADS */
255 #endif /* defined(ENABLE_REPLACEMENT) */
258 /* code_codeinfo_free **********************************************************
260 Free the memory used by a codeinfo.
263 code.............the codeinfo to free
265 *******************************************************************************/
267 void code_codeinfo_free(codeinfo *code)
272 if (code->mcode != NULL)
273 CFREE((void *) (ptrint) code->mcode, code->mcodelength);
275 patcher_list_free(code);
277 #if defined(ENABLE_REPLACEMENT)
278 replace_free_replacement_points(code);
281 FREE(code, codeinfo);
283 #if defined(ENABLE_STATISTICS)
285 size_codeinfo -= sizeof(codeinfo);
290 /* code_free_code_of_method ****************************************************
292 Free all codeinfos of the given method
295 m................the method of which the codeinfos are to be freed
297 *******************************************************************************/
299 void code_free_code_of_method(methodinfo *m)
310 nextcode = code->prev;
311 code_codeinfo_free(code);
318 * These are local overrides for various environment variables in Emacs.
319 * Please do not remove this and leave it at the end of the file, where
320 * Emacs will automagically detect them.
321 * ---------------------------------------------------------------------
324 * indent-tabs-mode: t
328 * vim:noexpandtab:sw=4:ts=4: