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
38 #include "mm/memory.h"
40 #if defined(ENABLE_THREADS)
41 # include "threads/native/lock.h"
44 #include "vm/jit/code.h"
45 #include "vm/jit/codegen-common.h"
46 #include "vm/jit/methodheader.h"
48 #include "vmcore/options.h"
51 /* code_init *******************************************************************
53 Initialize the code-subsystem.
55 *******************************************************************************/
59 /* check for offset of code->m == 0 (see comment in code.h) */
61 assert(OFFSET(codeinfo, m) == 0);
69 /* code_codeinfo_new ***********************************************************
71 Create a new codeinfo for the given method.
74 m................method to create a new codeinfo for
76 The following fields are set in codeinfo:
79 all other fields are zeroed
82 a new, initialized codeinfo, or
83 NULL if an exception occurred.
85 *******************************************************************************/
87 codeinfo *code_codeinfo_new(methodinfo *m)
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 *(codeinfo **)(pv + CodeinfoPointer);
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)
147 pv = codegen_get_pv_from_pc_nocheck(pc);
152 code = *(codeinfo **)(pv + CodeinfoPointer);
158 /* code_get_methodinfo_for_pv **************************************************
160 Return the methodinfo for the given PV.
168 *******************************************************************************/
170 methodinfo *code_get_methodinfo_for_pv(u1 *pv)
174 code = *((codeinfo **) (pv + CodeinfoPointer));
180 /* code_get_sync_slot_count ****************************************************
182 Return the number of stack slots used for storing the synchronized object
183 (and the return value around lock_monitor_exit calls) by the given code.
186 code.............the codeinfo of the code in question
190 the number of stack slots used for synchronization
192 *******************************************************************************/
194 #if defined(ENABLE_REPLACEMENT)
195 int code_get_sync_slot_count(codeinfo *code)
197 #ifdef ENABLE_THREADS
205 if (!(code->m->flags & ACC_SYNCHRONIZED))
210 #ifdef HAS_4BYTE_STACKSLOT
211 /* long and double need 2 4-byte slots */
212 if (IS_2_WORD_TYPE(code->m->parseddesc->returntype.type))
216 #if defined(__POWERPC__)
217 /* powerpc needs an extra slot */
223 #else /* !ENABLE_THREADS */
227 #endif /* ENABLE_THREADS */
229 #endif /* defined(ENABLE_REPLACEMENT) */
232 /* code_get_stack_frame_size ***************************************************
234 Return the number of stack slots that the stack frame of the given code
237 IMPORTANT: The return value does *not* include the saved return address
238 slot, although it is part of non-leaf stack frames on RISC
239 architectures. The rationale behind this is that the saved
240 return address is never moved or changed by replacement, and
241 this way CISC and RISC architectures can be treated the same.
242 (See also doc/stack_frames.txt.)
245 code.............the codeinfo of the code in question
249 the number of stack slots
251 *******************************************************************************/
253 #if defined(ENABLE_REPLACEMENT)
254 int code_get_stack_frame_size(codeinfo *code)
261 /* slots allocated by register allocator plus saved registers */
263 #ifdef HAS_4BYTE_STACKSLOT
264 count = code->memuse + code->savedintcount + 2*code->savedfltcount;
266 count = code->memuse + code->savedintcount + code->savedfltcount;
269 /* add slots needed in synchronized methods */
271 count += code_get_sync_slot_count(code);
273 /* keep stack aligned */
275 #if defined(__X86_64__)
276 /* the x86_64 codegen only aligns the stack in non-leaf methods */
277 if (!code->isleafmethod || opt_verbosecall)
278 count |= 1; /* even when return address is added */
281 /* XXX align stack on alpha */
282 #if defined(__MIPS__)
283 if (code->isleafmethod)
284 count = (count + 1) & ~1;
286 count |= 1; /* even when return address is added */
289 #if defined(__POWERPC__)
290 /* keep stack 16-byte aligned */
291 count = (count + 3) & ~3;
297 return code->stackframesize;
299 #endif /* defined(ENABLE_REPLACEMENT) */
302 /* code_codeinfo_free **********************************************************
304 Free the memory used by a codeinfo.
307 code.............the codeinfo to free
309 *******************************************************************************/
311 void code_codeinfo_free(codeinfo *code)
316 if (code->mcode != NULL)
317 CFREE((void *) (ptrint) code->mcode, code->mcodelength);
319 #if defined(ENABLE_REPLACEMENT)
320 replace_free_replacement_points(code);
323 FREE(code, codeinfo);
325 #if defined(ENABLE_STATISTICS)
327 size_codeinfo -= sizeof(codeinfo);
332 /* code_free_code_of_method ****************************************************
334 Free all codeinfos of the given method
337 m................the method of which the codeinfos are to be freed
339 *******************************************************************************/
341 void code_free_code_of_method(methodinfo *m)
352 nextcode = code->prev;
353 code_codeinfo_free(code);
360 * These are local overrides for various environment variables in Emacs.
361 * Please do not remove this and leave it at the end of the file, where
362 * Emacs will automagically detect them.
363 * ---------------------------------------------------------------------
366 * indent-tabs-mode: t
370 * vim:noexpandtab:sw=4:ts=4: