1 /****************************** comp/var.c *************************************
3 Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
5 See file COPYRIGHT for information on usage and disclaimer of warranties
7 verwaltet die Pseudoregister (die ich manchmal auch einfach nur
8 'Variablen' nenne, daher der Namen des Programmteiles)
10 Authors: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at
12 Last Change: 1996/11/14
14 *******************************************************************************/
17 s4 varnum; /* Anzahl der bereits vergebenen Variablen
18 (eigentlich nur, um den Variablen forlaufende
19 Nummern zu geben, damit man sie beim Debuggen
20 eindeutig kennzeichnen kann) */
22 list copiedvars; /* Liste aller Variablen die nur eine Kopie einer
23 anderen Variablen sind (w"ahrend der
24 Parse-Phase notwendig) */
25 list activevars; /* Liste aller gerade aktiven Variablen
26 (f"ur die Registerbelegungs-phase notwendig) */
28 list vars; /* Liste aller Variablen, die nicht in einer der
32 /********************** Funktion: var_init ************************************
34 initialisiert die Listen und den Variablen-Index-Z"ahler
36 ******************************************************************************/
38 static void var_init ()
41 list_init (&vars, OFFSET (varinfo, linkage) );
42 list_init (&copiedvars, OFFSET (varinfo, linkage) );
43 list_init (&activevars, OFFSET (varinfo, linkage) );
47 /********************* Funktion: var_type *************************************
49 Liefert den JavaVM-Grundtyp einer Variablen
51 ******************************************************************************/
53 static u2 var_type (varid v)
59 /********************* Funktion: var_create ***********************************
61 Erzeugt eine neue Variable des gew"unschten Typs
63 ******************************************************************************/
65 static varid var_create (u2 type)
67 varinfo *v = DNEW (varinfo);
69 list_addlast (&vars, v);
71 list_init (&(v -> copies), OFFSET (varinfo, copylink) );
75 v -> number = varnum++;
77 v -> globalscope = false;
86 /***************** Funktion: var_createwithspecialnumber **********************
88 Erzeugt eine neue Variable des gew"unschten Typs, dabei wird aber als
89 Kennzeichnungsnummer eine vorgegebene Zahl verwendet (das brauche ich
90 um die lokalen Java-Variablen mit der Nummer des ihres Slots zu
93 ******************************************************************************/
95 static varid var_createwithspecialnumber(u2 type, u4 num)
97 varinfo *v = var_create (type);
104 /*************** Funktion: var_makesaved **************************************
106 Kennzeichnet eine Variable daf"ur, dass sie bei Methodenaufrufen nicht
107 zerst"ort werden darf.
109 ******************************************************************************/
111 static void var_makesaved (varid v)
118 /*************** Funktion: var_proposereg *************************************
120 Macht dem Regiserallokator einen Vorschlag, mit welchem Register
121 eine Variable belegt werden sollte (bei Methodenaufrufen k"onnen so
122 viele Umlade-Befehle in die Argumentregister vermieden werden).
123 Aber: Die Anforderung, dass ein Register gesichert sein soll, hat auf
124 jeden Fall Priorit"at "uber so einen Vorschlag.
126 ******************************************************************************/
128 static void var_proposereg (varid v, reginfo *r)
130 if (v -> saved) return;
136 /******************** Funktion: var_makecopy **********************************
138 kennzeichnet eine Variable daf"ur, dass sie nur eine Kopie einer anderen
141 ******************************************************************************/
143 static void var_makecopy (varid original, varid copy)
145 list_addlast (&(original->copies), copy);
146 copy -> original = original;
148 list_remove (&vars, copy);
149 list_addlast (&copiedvars, copy);
153 /******************** Funktion: var_unlinkcopy ********************************
155 eine Variable, die bis jetzt in der Liste der Kopien eingetragen
156 war, wird wieder auf normalen Zustand gebracht.
158 ******************************************************************************/
160 static void var_unlinkcopy (varid copy)
162 list_remove (&(copy->original->copies), copy);
163 copy -> original = copy;
165 list_remove (&copiedvars, copy);
166 list_addlast (&vars, copy);
170 /******************* Funktion: var_isoriginal *********************************
172 Liefert true, wenn die Variable selber das Original ist, und keine
173 Kopie einer anderen Variablen (das heisst, wenn sie nicht in der Liste
174 der Kopien eingetragen ist)
176 ******************************************************************************/
178 static bool var_isoriginal (varid copy)
180 return (copy -> original == copy) ? true : false;
184 /******************* Funktion: var_findoriginal *******************************
186 Sucht zu einer Variablen das Original (wenn die Variable eine Kopie ist),
187 oder gibt die Variable selbst zur"uck (im anderen Fall).
189 ******************************************************************************/
191 static varid var_findoriginal (varid v)
197 /******************* Funktion: var_nextcopy ***********************************
199 Gibt die erste noch eingetragene Kopie einer Variablen zur"uck.
200 (oder NILL, wenn die Variable keine Kopien hat)
202 ******************************************************************************/
204 static varid var_nextcopy (varid original)
206 return list_first (&original->copies);
210 /******************* Funktion: var_nextcopiedvar ******************************
212 Gibt die erste "uberhaupt noch vorhandene Variable zu"uck, die eine
213 Kopie irgendeiner anderen Variablen ist.
215 ******************************************************************************/
217 static varid var_nextcopiedvar ()
219 return list_first (&copiedvars);
224 /*********************** Funktion: var_isactive *******************************
226 Lieftert true, wenn die Variable gerade aktiviert ist (d.h., wenn
227 irgendwann vorher 'var_activate' aufgerufen wurde)
229 ******************************************************************************/
231 static bool var_isactive (varinfo *v)
237 /******************** Funktion: var_activate **********************************
239 Aktiviert eine Variable, d.h. sie wird in die Liste der aktiven
240 Variablen eingetragen.
242 ******************************************************************************/
244 static void var_activate (varinfo *v)
246 list_remove (&vars, v);
247 list_addlast (&activevars, v);
252 /******************** Funktion: var_deactivate ********************************
254 Deaktiviert eine Variable (Gegenst"uck zu var_activate)
256 ******************************************************************************/
258 static void var_deactivate (varinfo *v)
260 list_remove (&activevars, v);
261 list_addlast (&vars, v);
266 /****************** Funktion: var_nextactive **********************************
268 Liefert die erste noch aktivierte Variable
270 ******************************************************************************/
272 static varinfo *var_nextactive ()
274 return list_first (&activevars);
279 /**************************** Funktion: var_display **************************
281 Gibt eine abdruckbare Darstellung einer Variablen aus.
282 (nur zu Debug-Zwecken)
284 *****************************************************************************/
286 static void var_display (varinfo *v)
294 case TYPE_INT: printf ("I"); break;
295 case TYPE_LONG: printf ("L"); break;
296 case TYPE_FLOAT: printf ("F"); break;
297 case TYPE_DOUBLE: printf ("D"); break;
298 case TYPE_ADDRESS: printf ("A"); break;
299 default: printf ("?");
301 printf ("%d", v->number);
305 reg_display (v->reg);
312 /************************ Funktion: var_displayall **************************
314 Gibt eine abdruckbare Darstellung aller Variablen aus.
315 (nur zu Debug-Zwecken)
317 *****************************************************************************/
319 void var_displayall ()
323 varid *sorted = DMNEW (varid, varnum);
325 printf ("\n Types of all pseudo-variables:\n");
327 for (num=0; num<varnum; num++) sorted[num] = NULL;
328 v = list_first (&vars);
330 if (sorted[v->number]) {
331 printf (" Local variable overlay: ");
332 if (v->saved) printf ("* ");
338 else sorted[v->number] = v;
340 v = list_next (&vars, v);
344 for (num=0; num<varnum; num++) {
347 if (v->saved) printf ("* ");
351 if (!v->reg) printf (" ");
353 if ( (num%5) == 4 ) printf ("\n");