* src/vm/jit/code.c (code_get_sync_slot_count): No synchronization slots
[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    Note: codeinfo.m is set to m, all other fields are zeroed.
54
55    RETURN VALUE:
56        a new, initialized codeinfo, or
57            NULL if an exception occurred.
58   
59 *******************************************************************************/
60
61 codeinfo *code_codeinfo_new(methodinfo *m)
62 {
63         codeinfo *code;
64
65         code = NEW(codeinfo);
66
67         memset(code,0,sizeof(codeinfo));
68
69         code->m = m;
70         
71         return code;
72 }
73
74 /* code_get_sync_slot_count ****************************************************
75
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.
78    
79    IN:
80        code.............the codeinfo of the code in question
81                             (must be != NULL)
82
83    RETURN VALUE:
84        the number of stack slots used for synchronization
85   
86 *******************************************************************************/
87
88 int code_get_sync_slot_count(codeinfo *code)
89 {
90         assert(code);
91
92 #ifdef USE_THREADS
93         if (!checksync)
94                 return 0;
95
96         if (!(code->m->flags & ACC_SYNCHRONIZED))
97                 return 0;
98
99         /* XXX generalize to all archs */
100 #ifdef HAS_4BYTE_STACKSLOT
101         return (IS_2_WORD_TYPE(code->m->parseddesc->returntype.type)) ? 2 : 1;
102 #else
103         return 1;
104 #endif
105 #else /* !USE_THREADS */
106         return 0;
107 #endif /* USE_THREADS */
108 }
109
110 /* code_get_stack_frame_size ***************************************************
111
112    Return the number of stack slots that the stack frame of the given code
113    comprises.
114
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.)
121    
122    IN:
123        code.............the codeinfo of the code in question
124                             (must be != NULL)
125
126    RETURN VALUE:
127        the number of stack slots
128   
129 *******************************************************************************/
130
131 int code_get_stack_frame_size(codeinfo *code)
132 {
133         int count;
134         
135         assert(code);
136
137         /* XXX generalize to all archs */
138 #ifdef HAS_4BYTE_STACKSLOT
139         count = code->memuse + code->savedintcount + 2*code->savedfltcount;
140 #else
141         count = code->memuse + code->savedintcount + code->savedfltcount;
142 #endif
143
144         count += code_get_sync_slot_count(code);
145
146 #if defined(__X86_64__)
147         /* keep stack 16-byte aligned */
148         if (!code->isleafmethod || opt_verbosecall)
149                 count |= 1;
150 #endif
151
152         return count;
153 }
154
155 /* code_codeinfo_free **********************************************************
156
157    Free the memory used by a codeinfo.
158    
159    IN:
160        code.............the codeinfo to free
161
162 *******************************************************************************/
163
164 void code_codeinfo_free(codeinfo *code)
165 {
166         if (!code)
167                 return;
168
169         if (code->mcode)
170                 CFREE((void *) (ptrint) code->mcode, code->mcodelength);
171
172         replace_free_replacement_points(code);
173
174         FREE(code,codeinfo);
175 }
176
177 /* code_free_code_of_method ****************************************************
178
179    Free all codeinfos of the given method
180    
181    IN:
182        m................the method of which the codeinfos are to be freed
183
184 *******************************************************************************/
185
186 void code_free_code_of_method(methodinfo *m)
187 {
188         codeinfo *nextcode;
189         codeinfo *code;
190
191         if (!m)
192                 return;
193         
194         nextcode = m->code;
195         while (nextcode) {
196                 code = nextcode;
197                 nextcode = code->prev;
198                 code_codeinfo_free(code);
199         }
200
201         m->code = NULL;
202 }
203
204 /*
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  * ---------------------------------------------------------------------
209  * Local variables:
210  * mode: c
211  * indent-tabs-mode: t
212  * c-basic-offset: 4
213  * tab-width: 4
214  * End:
215  * vim:noexpandtab:sw=4:ts=4:
216  */