Guest User

Untitled

a guest
Oct 22nd, 2017
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.34 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, -4);
  78. timePE.paramTypes = ptlOffsetsEintragen(timePTL, -4);
  79. clearAllPE.paramTypes = ptlOffsetsEintragen(clearAllPTL, -4);
  80. readcPE.paramTypes = ptlOffsetsEintragen(readcPTL, -4);
  81. printcPE.paramTypes = ptlOffsetsEintragen(printcPTL, -4);
  82. drawCirclePE.paramTypes = ptlOffsetsEintragen(drawCirclePTL, -4);
  83. printiPE.paramTypes = ptlOffsetsEintragen(printiPTL, -4);
  84. drawLinePE.paramTypes = ptlOffsetsEintragen(drawLinePTL, -4);
  85. setPixelPE.paramTypes = ptlOffsetsEintragen(setPixelPTL, -4);
  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, -4);
  142.  
  143. }
  144.  
  145. //Offsets der lokalen Variablen eintragen.
  146. int counter;
  147. int argOffset=0;
  148. while (pDec.decls.isEmpty==false)
  149. {
  150. vDec = (VarDec) pDec.decls.head;
  151. vEnt = (VarEntry) pe.localTable.lookup(vDec.name);
  152. os = os + vEnt.type.typeSize;
  153. vEnt.offsetSize = argOffset+=4;
  154. // TODO wieder ändern?
  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. if (outSize>0)
  205. {
  206. pe.ruftAuf=true;
  207. }
  208. stmList=stmList.tail;
  209. }
  210. pe.groeßeAusgehenderBereich=outSize;
  211.  
  212. // System.out.println(pDec.name.toString() + " outgoing : " + pe.groeßeAusgehenderBereich);
  213. System.out.println(pDec.name.toString() + " eingehend: "
  214. + pe.groeßeEingehenderBereich + " ausgehend: " + pe.groeßeAusgehenderBereich
  215. + " lokVars: " + pe.groeßeLokVars);
  216. }
  217.  
  218. dl=dl.tail;
  219. }
  220. }
  221.  
  222. private int aufrufeZaehlen(Stm stm) {
  223. if (stm instanceof CallStm)
  224. {
  225. CallStm cStm = (CallStm) stm;
  226. Sym procName = cStm.name;
  227. ProcEntry pEnt = (ProcEntry) globalTable.lookup(procName);
  228. return pEnt.groeßeEingehenderBereich;
  229. }
  230. else
  231. {
  232. return 0;
  233. }
  234. }
  235.  
  236. private void showAllocation(Absyn program) {
  237. // TODO Auto-generated method stub
  238.  
  239. }
  240.  
  241. }
Add Comment
Please, Sign In to add comment