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 4011 2005-12-30 14:16:49Z 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 void dseg_adddata(codegendata *cd, u1 *mcodeptr)
191 dr->datapos = mcodeptr - cd->mcodebase;
192 dr->next = cd->datareferences;
194 cd->datareferences = dr;
198 /* dseg_addlinenumbertablesize *************************************************
202 *******************************************************************************/
204 void dseg_addlinenumbertablesize(codegendata *cd)
206 #if SIZEOF_VOID_P == 8
207 /* 4-byte ALIGNMENT PADDING */
212 cd->linenumbertablesizepos = dseg_addaddress(cd, NULL);
213 cd->linenumbertablestartpos = dseg_addaddress(cd, NULL);
215 #if SIZEOF_VOID_P == 8
216 /* 4-byte ALIGNMENT PADDING */
223 void dseg_addlinenumber(codegendata *cd, u2 linenumber, u1 *mcodeptr)
227 lr = DNEW(linenumberref);
229 lr->linenumber = linenumber;
231 lr->targetmpc = mcodeptr - cd->mcodebase;
232 lr->next = cd->linenumberreferences;
234 cd->linenumberreferences = lr;
238 /* dseg_createlinenumbertable **************************************************
240 Creates a line number table in the data segment from the created
241 entries in linenumberreferences.
243 *******************************************************************************/
245 void dseg_createlinenumbertable(codegendata *cd)
249 for (lr = cd->linenumberreferences; lr != NULL; lr = lr->next) {
250 lr->tablepos = dseg_addaddress(cd, NULL);
252 if (cd->linenumbertab == 0)
253 cd->linenumbertab = lr->tablepos;
255 dseg_addaddress(cd, lr->linenumber);
260 /* dseg_display ****************************************************************
262 Displays the content of the methods' data segment.
264 *******************************************************************************/
267 void dseg_display(methodinfo *m, codegendata *cd)
272 s4ptr = (s4 *) (ptrint) m->mcode;
274 printf(" --- dump of datasegment\n");
276 for (i = cd->dseglen; i > 0 ; i -= 4) {
277 #if SIZEOF_VOID_P == 8
278 printf("0x%016lx: -%6x (%6d): %8x\n",
279 (ptrint) s4ptr, i, i, (s4) *s4ptr);
281 printf("0x%08x: -%6x (%6d): %8x\n",
282 (ptrint) s4ptr, i, i, (s4) *s4ptr);
287 printf(" --- begin of data segment: %p\n", (void *) s4ptr);
289 #endif /* !defined(NDEBUG) */
293 * These are local overrides for various environment variables in Emacs.
294 * Please do not remove this and leave it at the end of the file, where
295 * Emacs will automagically detect them.
296 * ---------------------------------------------------------------------
299 * indent-tabs-mode: t