1 /* vm/jit/code.c - codeinfo struct for representing compiled code
3 Copyright (C) 1996-2005, 2006 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
25 Contact: cacao@cacaojvm.org
27 Authors: Edwin Steiner
41 #include "vm/jit/code.h"
42 #include "mm/memory.h"
43 #include "vm/options.h"
46 /* code_codeinfo_new ***********************************************************
48 Create a new codeinfo for the given method.
51 m................method to create a new codeinfo for
53 Note: codeinfo.m is set to m, all other fields are zeroed.
56 a new, initialized codeinfo, or
57 NULL if an exception occurred.
59 *******************************************************************************/
61 codeinfo *code_codeinfo_new(methodinfo *m)
67 memset(code,0,sizeof(codeinfo));
74 /* code_get_sync_slot_count ****************************************************
76 Return the number of stack slots used for storing the synchronized object
77 (and the return value around monitorExit calls) by the given code.
80 code.............the codeinfo of the code in question
84 the number of stack slots used for synchronization
86 *******************************************************************************/
88 int code_get_sync_slot_count(codeinfo *code)
96 if (!(code->m->flags & ACC_SYNCHRONIZED))
99 /* XXX generalize to all archs */
100 #ifdef HAS_4BYTE_STACKSLOT
101 return (IS_2_WORD_TYPE(code->m->parseddesc->returntype.type)) ? 2 : 1;
105 #else /* !USE_THREADS */
107 #endif /* USE_THREADS */
110 /* code_get_stack_frame_size ***************************************************
112 Return the number of stack slots that the stack frame of the given code
115 IMPORTANT: The return value does *not* include the saved return address
116 slot, although it is part of non-leaf stack frames on RISC
117 architectures. The rationale behind this is that the saved
118 return address is never moved or changed by replacement, and
119 this way CISC and RISC architectures can be treated the same.
120 (See also doc/stack_frames.txt.)
123 code.............the codeinfo of the code in question
127 the number of stack slots
129 *******************************************************************************/
131 int code_get_stack_frame_size(codeinfo *code)
137 /* XXX generalize to all archs */
138 #ifdef HAS_4BYTE_STACKSLOT
139 count = code->memuse + code->savedintcount + 2*code->savedfltcount;
141 count = code->memuse + code->savedintcount + code->savedfltcount;
144 count += code_get_sync_slot_count(code);
146 #if defined(__X86_64__)
147 /* keep stack 16-byte aligned */
148 if (!code->isleafmethod || opt_verbosecall)
155 /* code_codeinfo_free **********************************************************
157 Free the memory used by a codeinfo.
160 code.............the codeinfo to free
162 *******************************************************************************/
164 void code_codeinfo_free(codeinfo *code)
170 CFREE((void *) (ptrint) code->mcode, code->mcodelength);
172 replace_free_replacement_points(code);
177 /* code_free_code_of_method ****************************************************
179 Free all codeinfos of the given method
182 m................the method of which the codeinfos are to be freed
184 *******************************************************************************/
186 void code_free_code_of_method(methodinfo *m)
197 nextcode = code->prev;
198 code_codeinfo_free(code);
205 * These are local overrides for various environment variables in Emacs.
206 * Please do not remove this and leave it at the end of the file, where
207 * Emacs will automagically detect them.
208 * ---------------------------------------------------------------------
211 * indent-tabs-mode: t
215 * vim:noexpandtab:sw=4:ts=4: