* src/vm/jit/code.c (code_codeinfo_new): Set codeinfo.isleafmethod.
[cacao.git] / src / vm / jit / code.c
1 /* vm/jit/code.c - codeinfo struct for representing compiled code
2
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
7
8    This file is part of CACAO.
9
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.
14
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.
19
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
23    02110-1301, USA.
24
25    Contact: cacao@cacaojvm.org
26
27    Authors: Edwin Steiner
28
29    Changes:
30
31    $Id$
32
33 */
34
35
36 #include "config.h"
37 #include "vm/types.h"
38
39 #include <assert.h>
40
41 #include "vm/jit/code.h"
42 #include "mm/memory.h"
43 #include "vm/options.h"
44 #include "arch.h"
45
46 /* code_codeinfo_new ***********************************************************
47
48    Create a new codeinfo for the given method.
49    
50    IN:
51        m................method to create a new codeinfo for
52
53    The following fields are set in codeinfo:
54        m
55            isleafmethod
56    all other fields are zeroed
57
58    RETURN VALUE:
59        a new, initialized codeinfo, or
60            NULL if an exception occurred.
61   
62 *******************************************************************************/
63
64 codeinfo *code_codeinfo_new(methodinfo *m)
65 {
66         codeinfo *code;
67
68         code = NEW(codeinfo);
69
70         memset(code,0,sizeof(codeinfo));
71
72         code->m = m;
73         code->isleafmethod = m->isleafmethod; /* XXX will be moved to codeinfo */
74         
75         return code;
76 }
77
78 /* code_get_sync_slot_count ****************************************************
79
80    Return the number of stack slots used for storing the synchronized object
81    (and the return value around monitorExit calls) by the given code.
82    
83    IN:
84        code.............the codeinfo of the code in question
85                             (must be != NULL)
86
87    RETURN VALUE:
88        the number of stack slots used for synchronization
89   
90 *******************************************************************************/
91
92 int code_get_sync_slot_count(codeinfo *code)
93 {
94         assert(code);
95
96 #ifdef USE_THREADS
97         if (!checksync)
98                 return 0;
99
100         if (!(code->m->flags & ACC_SYNCHRONIZED))
101                 return 0;
102
103         /* XXX generalize to all archs */
104 #ifdef HAS_4BYTE_STACKSLOT
105         return (IS_2_WORD_TYPE(code->m->parseddesc->returntype.type)) ? 2 : 1;
106 #else
107         return 1;
108 #endif
109 #else /* !USE_THREADS */
110         return 0;
111 #endif /* USE_THREADS */
112 }
113
114 /* code_get_stack_frame_size ***************************************************
115
116    Return the number of stack slots that the stack frame of the given code
117    comprises.
118
119    IMPORTANT: The return value does *not* include the saved return address 
120               slot, although it is part of non-leaf stack frames on RISC
121                           architectures. The rationale behind this is that the saved
122                           return address is never moved or changed by replacement, and
123                           this way CISC and RISC architectures can be treated the same.
124                           (See also doc/stack_frames.txt.)
125    
126    IN:
127        code.............the codeinfo of the code in question
128                             (must be != NULL)
129
130    RETURN VALUE:
131        the number of stack slots
132   
133 *******************************************************************************/
134
135 int code_get_stack_frame_size(codeinfo *code)
136 {
137         int count;
138         
139         assert(code);
140
141         /* XXX generalize to all archs */
142 #ifdef HAS_4BYTE_STACKSLOT
143         count = code->memuse + code->savedintcount + 2*code->savedfltcount;
144 #else
145         count = code->memuse + code->savedintcount + code->savedfltcount;
146 #endif
147
148         count += code_get_sync_slot_count(code);
149
150 #if defined(__X86_64__)
151         /* keep stack 16-byte aligned */
152         if (!code->isleafmethod || opt_verbosecall)
153                 count |= 1;
154 #endif
155
156         return count;
157 }
158
159 /* code_codeinfo_free **********************************************************
160
161    Free the memory used by a codeinfo.
162    
163    IN:
164        code.............the codeinfo to free
165
166 *******************************************************************************/
167
168 void code_codeinfo_free(codeinfo *code)
169 {
170         if (!code)
171                 return;
172
173         if (code->mcode)
174                 CFREE((void *) (ptrint) code->mcode, code->mcodelength);
175
176         replace_free_replacement_points(code);
177
178         FREE(code,codeinfo);
179 }
180
181 /* code_free_code_of_method ****************************************************
182
183    Free all codeinfos of the given method
184    
185    IN:
186        m................the method of which the codeinfos are to be freed
187
188 *******************************************************************************/
189
190 void code_free_code_of_method(methodinfo *m)
191 {
192         codeinfo *nextcode;
193         codeinfo *code;
194
195         if (!m)
196                 return;
197         
198         nextcode = m->code;
199         while (nextcode) {
200                 code = nextcode;
201                 nextcode = code->prev;
202                 code_codeinfo_free(code);
203         }
204
205         m->code = NULL;
206 }
207
208 /*
209  * These are local overrides for various environment variables in Emacs.
210  * Please do not remove this and leave it at the end of the file, where
211  * Emacs will automagically detect them.
212  * ---------------------------------------------------------------------
213  * Local variables:
214  * mode: c
215  * indent-tabs-mode: t
216  * c-basic-offset: 4
217  * tab-width: 4
218  * End:
219  * vim:noexpandtab:sw=4:ts=4:
220  */