1 /* src/vm/jit/dseg.c - data segment handling stuff
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 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., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Reinhard Grafl
30 Changes: Christian Thalinger
33 $Id: dseg.c 4198 2006-01-13 15:28:34Z twisti $
42 #include "mm/memory.h"
43 #include "vm/jit/codegen-common.h"
46 /* desg_increase ***************************************************************
50 *******************************************************************************/
52 void dseg_increase(codegendata *cd)
56 newstorage = DMNEW(u1, cd->dsegsize * 2);
58 MCOPY(newstorage + cd->dsegsize, cd->dsegtop - cd->dsegsize, u1,
61 cd->dsegtop = newstorage;
63 cd->dsegtop += cd->dsegsize;
67 s4 dseg_adds4_increase(codegendata *cd, s4 value)
71 *((s4 *) (cd->dsegtop - cd->dseglen)) = value;
73 return -(cd->dseglen);
77 s4 dseg_adds4(codegendata *cd, s4 value)
82 dataptr = (s4 *) (cd->dsegtop - cd->dseglen);
84 if (cd->dseglen > cd->dsegsize)
85 return dseg_adds4_increase(cd, value);
89 return -(cd->dseglen);
93 s4 dseg_adds8_increase(codegendata *cd, s8 value)
97 *((s8 *) (cd->dsegtop - cd->dseglen)) = value;
99 return -(cd->dseglen);
103 s4 dseg_adds8(codegendata *cd, s8 value)
107 cd->dseglen = ALIGN(cd->dseglen + 8, 8);
108 dataptr = (s8 *) (cd->dsegtop - cd->dseglen);
110 if (cd->dseglen > cd->dsegsize)
111 return dseg_adds8_increase(cd, value);
115 return -(cd->dseglen);
119 s4 dseg_addfloat_increase(codegendata *cd, float value)
123 *((float *) (cd->dsegtop - cd->dseglen)) = value;
125 return -(cd->dseglen);
129 s4 dseg_addfloat(codegendata *cd, float value)
134 dataptr = (float *) (cd->dsegtop - cd->dseglen);
136 if (cd->dseglen > cd->dsegsize)
137 return dseg_addfloat_increase(cd, value);
141 return -(cd->dseglen);
145 s4 dseg_adddouble_increase(codegendata *cd, double value)
149 *((double *) (cd->dsegtop - cd->dseglen)) = value;
151 return -(cd->dseglen);
155 s4 dseg_adddouble(codegendata *cd, double value)
159 cd->dseglen = ALIGN(cd->dseglen + 8, 8);
160 dataptr = (double *) (cd->dsegtop - cd->dseglen);
162 if (cd->dseglen > cd->dsegsize)
163 return dseg_adddouble_increase(cd, value);
167 return -(cd->dseglen);
171 void dseg_addtarget(codegendata *cd, basicblock *target)
177 jr->tablepos = dseg_addaddress(cd, NULL);
179 jr->next = cd->jumpreferences;
181 cd->jumpreferences = jr;
185 /* dseg_addlinenumbertablesize *************************************************
189 *******************************************************************************/
191 void dseg_addlinenumbertablesize(codegendata *cd)
193 #if SIZEOF_VOID_P == 8
194 /* 4-byte ALIGNMENT PADDING */
199 cd->linenumbertablesizepos = dseg_addaddress(cd, NULL);
200 cd->linenumbertablestartpos = dseg_addaddress(cd, NULL);
202 #if SIZEOF_VOID_P == 8
203 /* 4-byte ALIGNMENT PADDING */
210 void dseg_addlinenumber(codegendata *cd, u2 linenumber, u1 *mcodeptr)
214 lr = DNEW(linenumberref);
216 lr->linenumber = linenumber;
218 lr->targetmpc = mcodeptr - cd->mcodebase;
219 lr->next = cd->linenumberreferences;
221 cd->linenumberreferences = lr;
225 /* dseg_createlinenumbertable **************************************************
227 Creates a line number table in the data segment from the created
228 entries in linenumberreferences.
230 *******************************************************************************/
232 void dseg_createlinenumbertable(codegendata *cd)
236 for (lr = cd->linenumberreferences; lr != NULL; lr = lr->next) {
237 lr->tablepos = dseg_addaddress(cd, NULL);
239 if (cd->linenumbertab == 0)
240 cd->linenumbertab = lr->tablepos;
242 dseg_addaddress(cd, lr->linenumber);
247 /* dseg_adddata ****************************************************************
249 Adds a data segment reference to the codegendata.
251 *******************************************************************************/
253 #if defined(__I386__) || defined(__X86_64__) || defined(__XDSPCORE__) || defined(ENABLE_INTRP)
254 void dseg_adddata(codegendata *cd, u1 *mcodeptr)
260 dr->datapos = mcodeptr - cd->mcodebase;
261 dr->next = cd->datareferences;
263 cd->datareferences = dr;
268 /* dseg_resolve_datareferences *************************************************
270 Resolve data segment references.
272 *******************************************************************************/
274 #if defined(__I386__) || defined(__X86_64__) || defined(__XDSPCORE__) || defined(ENABLE_INTRP)
275 void dseg_resolve_datareferences(codegendata *cd, methodinfo *m)
279 /* data segment references resolving */
281 for (dr = cd->datareferences; dr != NULL; dr = dr->next)
282 *((u1 **) (m->entrypoint + dr->datapos - SIZEOF_VOID_P)) = m->entrypoint;
287 /* dseg_display ****************************************************************
289 Displays the content of the methods' data segment.
291 *******************************************************************************/
294 void dseg_display(methodinfo *m, codegendata *cd)
299 s4ptr = (s4 *) (ptrint) m->mcode;
301 printf(" --- dump of datasegment\n");
303 for (i = cd->dseglen; i > 0 ; i -= 4) {
304 #if SIZEOF_VOID_P == 8
305 printf("0x%016lx: -%6x (%6d): %8x\n",
306 (ptrint) s4ptr, i, i, (s4) *s4ptr);
308 printf("0x%08x: -%6x (%6d): %8x\n",
309 (ptrint) s4ptr, i, i, (s4) *s4ptr);
314 printf(" --- begin of data segment: %p\n", (void *) s4ptr);
316 #endif /* !defined(NDEBUG) */
320 * These are local overrides for various environment variables in Emacs.
321 * Please do not remove this and leave it at the end of the file, where
322 * Emacs will automagically detect them.
323 * ---------------------------------------------------------------------
326 * indent-tabs-mode: t