Guest User

Untitled

a guest
Oct 23rd, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.82 KB | None | 0 0
  1. /*
  2. * Varalloc.java -- variable allocation
  3. */
  4.  
  5. package varalloc;
  6.  
  7. import absyn.*;
  8. import table.*;
  9. import sym.*;
  10. import absyn.*;
  11. import sym.Sym;
  12. import table.*;
  13. import types.*;
  14. import parse.*;
  15.  
  16. public class Varalloc {
  17.  
  18. public static final int intByteSize = 4;
  19. public static final int boolByteSize = 4;
  20. public static final int refByteSize = 4;
  21.  
  22. private Table globalTable;
  23. private boolean showVarAlloc;
  24.  
  25. public Varalloc(Table t, boolean s) {
  26. globalTable = t;
  27. showVarAlloc = s;
  28. }
  29.  
  30. public void allocVars(Absyn program) {
  31. /* compute access information for arguments of predefined procs */
  32. predefProcsEintragen();
  33. /* compute access information for arguments, parameters and local vars */
  34. offsetsEintragen(program);
  35. /* compute outgoing area sizes */
  36. outgoingSizesEintragen(program);
  37. /* show variable allocation if requested */
  38. if (showVarAlloc)
  39. showAllocation(program);
  40. }
  41.  
  42. private void predefProcsEintragen() {
  43.  
  44. // Alle Bibliotheks - Prozeduren
  45. ProcEntry readiPE = (ProcEntry) globalTable.lookup(Sym.newSym("readi"));
  46. ProcEntry clearAllPE = (ProcEntry) globalTable.lookup(Sym.newSym("clearAll"));
  47. ProcEntry timePE = (ProcEntry) globalTable.lookup(Sym.newSym("time"));
  48. ProcEntry mainPE = (ProcEntry) globalTable.lookup(Sym.newSym("main"));
  49. ProcEntry readcPE = (ProcEntry) globalTable.lookup(Sym.newSym("readc"));
  50. ProcEntry printcPE = (ProcEntry) globalTable.lookup(Sym
  51. .newSym("printc"));
  52. ProcEntry exitPE = (ProcEntry) globalTable.lookup(Sym.newSym("exit"));
  53. ProcEntry drawCirclePE = (ProcEntry) globalTable.lookup(Sym
  54. .newSym("drawCircle"));
  55. ProcEntry printiPE = (ProcEntry) globalTable.lookup(Sym
  56. .newSym("printi"));
  57. ProcEntry drawLinePE = (ProcEntry) globalTable.lookup(Sym
  58. .newSym("drawLine"));
  59. ProcEntry setPixelPE = (ProcEntry) globalTable.lookup(Sym
  60. .newSym("setPixel"));
  61.  
  62. // Alle Parameter-Listen zu den Bibliotheks - Prozeduren
  63. ParamTypeList readiPTL = readiPE.paramTypes;
  64. ParamTypeList clearAllPTL = clearAllPE.paramTypes;
  65. ParamTypeList timePTL = timePE.paramTypes;
  66. ParamTypeList mainPTL = mainPE.paramTypes;
  67. ParamTypeList readcPTL = readcPE.paramTypes;
  68. ParamTypeList printcPTL = printcPE.paramTypes;
  69. ParamTypeList exitPTL = exitPE.paramTypes;
  70. ParamTypeList drawCirclePTL = drawCirclePE.paramTypes;
  71. ParamTypeList printiPTL = printiPE.paramTypes;
  72. ParamTypeList drawLinePTL = drawLinePE.paramTypes;
  73. ParamTypeList setPixelPTL = setPixelPE.paramTypes;
  74.  
  75. // Eintragen der Offsets in die PTLs der Bibliotheksprozeduren
  76.  
  77. readiPE.paramTypes = ptlOffsetsEintragen(readiPTL, -(readiPE.paramTypes.type.typeSize));
  78. timePE.paramTypes = ptlOffsetsEintragen(timePTL, -(timePE.paramTypes.type.typeSize));
  79. clearAllPE.paramTypes = ptlOffsetsEintragen(clearAllPTL, -(clearAllPE.paramTypes.type.typeSize));
  80. readcPE.paramTypes = ptlOffsetsEintragen(readcPTL, -(readcPE.paramTypes.type.typeSize));
  81. printcPE.paramTypes = ptlOffsetsEintragen(printcPTL, -(printcPE.paramTypes.type.typeSize));
  82. drawCirclePE.paramTypes = ptlOffsetsEintragen(drawCirclePTL, -(drawCirclePE.paramTypes.type.typeSize));
  83. printiPE.paramTypes = ptlOffsetsEintragen(printiPTL, -(printiPE.paramTypes.type.typeSize));
  84. drawLinePE.paramTypes = ptlOffsetsEintragen(drawLinePTL, -(drawLinePE.paramTypes.type.typeSize));
  85. setPixelPE.paramTypes = ptlOffsetsEintragen(setPixelPTL, -(drawCirclePE.paramTypes.type.typeSize));
  86.  
  87.  
  88. //Eintragen der Größe des eingehenden Bereichs für die Bib.-Procs
  89. readiPE.groeßeEingehenderBereich = berechnungEingehenderBereich(readiPE.paramTypes);
  90. timePE.groeßeEingehenderBereich = berechnungEingehenderBereich(timePE.paramTypes);
  91. clearAllPE.groeßeEingehenderBereich = berechnungEingehenderBereich(clearAllPE.paramTypes);
  92. readcPE.groeßeEingehenderBereich = berechnungEingehenderBereich(readcPE.paramTypes);
  93. printcPE.groeßeEingehenderBereich = berechnungEingehenderBereich(printcPE.paramTypes);
  94. drawCirclePE.groeßeEingehenderBereich = berechnungEingehenderBereich(drawCirclePE.paramTypes);
  95. printiPE.groeßeEingehenderBereich = berechnungEingehenderBereich(printiPE.paramTypes);
  96. drawLinePE.groeßeEingehenderBereich =berechnungEingehenderBereich(drawLinePE.paramTypes);
  97. setPixelPE.groeßeEingehenderBereich = berechnungEingehenderBereich(setPixelPE.paramTypes);
  98.  
  99. //System.out.println("\nSetpixel Params: " );
  100. // setPixelPE.paramTypes.show();
  101. }
  102.  
  103. private ParamTypeList ptlOffsetsEintragen(ParamTypeList ptl, int os) {
  104.  
  105. if (ptl.isEmpty == true)
  106. {
  107. return new ParamTypeList();
  108. }
  109. else
  110. {
  111. if (ptl.isRef)
  112. {
  113. os=os+4;
  114. }
  115. else
  116. {
  117. os = os + ptl.type.typeSize;
  118. }
  119. return new ParamTypeList(ptl, ptlOffsetsEintragen(ptl.next, os), os);
  120. }
  121. }
  122.  
  123.  
  124. private void offsetsEintragen(Absyn program) {
  125. DecList dl = (DecList) program;
  126. ProcEntry pe;
  127. ProcDec pDec;
  128. VarDec vDec;
  129. VarEntry vEnt;
  130. int os=0;
  131.  
  132. while (dl.isEmpty == false )
  133. {
  134. if (dl.head instanceof ProcDec)
  135. {
  136. //Offsets der Parameter eintragen
  137. pDec = (ProcDec) dl.head;
  138. pe = (ProcEntry) globalTable.lookup(pDec.name);
  139. if(!pe.paramTypes.isEmpty)
  140. {
  141. pe.paramTypes = ptlOffsetsEintragen(pe.paramTypes, -pe.paramTypes.type.typeSize);
  142. // System.out.println( pDec.name + " \n Parameter #1: " + pe.paramTypes.offsetSize +
  143. // "\n Parameter #2: " + pe.paramTypes.next.offsetSize +
  144. // "\n Parameter #3: " + pe.paramTypes.next.next.offsetSize);
  145. }
  146.  
  147. //Offsets der lokalen Variablen eintragen.
  148. int counter;
  149. while (pDec.decls.isEmpty==false)
  150. {
  151. vDec = (VarDec) pDec.decls.head;
  152. vEnt = (VarEntry) pe.localTable.lookup(vDec.name);
  153. os = os + vEnt.type.typeSize;
  154. vEnt.offsetSize = os;
  155. pDec.decls = pDec.decls.tail;
  156. }
  157. //Groeße des LokVar Bereichs in os
  158. pe.groeßeLokVars=os;
  159.  
  160. //Bestimmung der Groeße des eingehenden Bereichs.
  161. ParamTypeList tmpPTL = new ParamTypeList(pe.paramTypes);
  162. pe.groeßeEingehenderBereich = berechnungEingehenderBereich(tmpPTL);
  163. } //Eintragen der Offsets dieser Proc abgeschlossen
  164.  
  165. os=0;
  166. dl=dl.tail;
  167. }
  168. }
  169.  
  170. private int berechnungEingehenderBereich(ParamTypeList tmpPTL) {
  171. int zaehler=0;
  172. while (!tmpPTL.isEmpty)
  173. {
  174. zaehler++;
  175. tmpPTL = tmpPTL.next;
  176. }
  177. zaehler=zaehler*4;
  178. return zaehler;
  179. }
  180.  
  181. private void outgoingSizesEintragen(Absyn program) {
  182. DecList dl = (DecList) program;
  183. ProcEntry pe;
  184. ProcDec pDec;
  185. VarDec vDec;
  186. VarEntry vEnt;
  187.  
  188. while (dl.isEmpty == false )
  189. {
  190. if (dl.head instanceof ProcDec)
  191. {
  192. pDec = (ProcDec) dl.head;
  193. StmList stmList = pDec.body;
  194. Sym procName = pDec.name;
  195. int outSize=0;
  196. pe = (ProcEntry) globalTable.lookup(procName);
  197.  
  198. while (stmList.isEmpty==false)
  199. {
  200. if (aufrufeZaehlen(stmList.head)>outSize)
  201. {
  202. outSize = aufrufeZaehlen(stmList.head);
  203. }
  204. stmList=stmList.tail;
  205. }
  206. pe.groeßeAusgehenderBereich=outSize;
  207.  
  208. // System.out.println(pDec.name.toString() + " outgoing : " + pe.groeßeAusgehenderBereich);
  209. System.out.println(pDec.name.toString() + " eingehend: "
  210. + pe.groeßeEingehenderBereich + " ausgehend: " + pe.groeßeAusgehenderBereich
  211. + " lokVars: " + pe.groeßeLokVars);
  212. }
  213.  
  214. dl=dl.tail;
  215. }
  216. }
  217.  
  218. private int aufrufeZaehlen(Stm stm) {
  219. if (stm instanceof CallStm)
  220. {
  221. CallStm cStm = (CallStm) stm;
  222. Sym procName = cStm.name;
  223. ProcEntry pEnt = (ProcEntry) globalTable.lookup(procName);
  224. pEnt.ruftAuf=true;
  225. return pEnt.groeßeEingehenderBereich;
  226. }
  227. else
  228. {
  229. return 0;
  230. }
  231. }
  232.  
  233. private void showAllocation(Absyn program) {
  234. // TODO Auto-generated method stub
  235.  
  236. }
  237.  
  238. }
Add Comment
Please, Sign In to add comment