TargetGen.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package API;
  7. import common.Block;
  8. import common.Code;
  9. import common.Instruction;
  10. import common.IvannosysTargetArch;
  11. import java.util.Map;
  12. import java.util.logging.Level;
  13. import java.util.logging.Logger;
  14. /**
  15. *
  16. * @author EUGENIO CARVALHO
  17. */
  18. public abstract class TargetGen implements IvannosysTargetArch {
  19. protected Code target;
  20. protected Code IR;
  21. public TargetGen(String id) {
  22. BaseGenInit(id);
  23. }
  24. public void BaseGenInit(String id) {
  25. target = new Code(id);
  26. }
  27. public Code getTarget() {
  28. return target;
  29. }
  30. public void setTarget(Code target) {
  31. this.target = target;
  32. }
  33. public Code getIR() {
  34. return IR;
  35. }
  36. // public void setTac(Code IR) {
  37. // this.IR = IR;
  38. // }
  39. public IvannosysTargetArch SetTAC(Code tac) {
  40. IR = tac;
  41. target.GData().copy(tac.GData());
  42. target.Parent = IR;
  43. return this;
  44. }
  45. protected Instruction Add(Instruction inst) {
  46. target.Block().Add(inst);
  47. return inst;
  48. }
  49. @Override
  50. public IvannosysTargetArch Format() {
  51. try {
  52. String code = target.getCodeStream();
  53. System.out.println("Target[" + target.Name() + "]:\n" + code);
  54. } catch (Exception ex) {
  55. Logger.getLogger(TargetGen.class.getName()).log(Level.SEVERE, null, ex);
  56. }
  57. return this;
  58. }
  59. @Override
  60. public IvannosysTargetArch Compile() {
  61. try {
  62. // Traduz o codigo intermediario para o alvo
  63. Translate();
  64. } catch (Exception ex) {
  65. Logger.getLogger(TargetGen.class.getName()).log(Level.SEVERE, null, ex);
  66. }
  67. return this;
  68. }
  69. protected void Translate() throws Exception {
  70. String targetID = target.Name(), id;
  71. target.Parent = IR;
  72. CodeProcessor.Trigger(target, targetID, "BeforeTranslate");
  73. for (Map.Entry<String, Block> b : IR.getBlocks().entrySet()) {
  74. id = b.getKey();
  75. IR.Use(id);
  76. target.OpenBlock(id);
  77. CodeProcessor.Trigger(target, targetID, "BeforeTranslateBlock");
  78. Prolog(id);
  79. TranslateBlock(b.getValue());
  80. Epilog(id);
  81. target.CloseBlock();
  82. target.UpdatePositions();
  83. CodeProcessor.Trigger(target, targetID, "AfterTranslateBlock");
  84. }
  85. CodeProcessor.Trigger(target, targetID, "AfterTranslate");
  86. }
  87. protected void TranslateBlock(Block b) throws Exception {
  88. // System.out.println("Translate block:" + b.getName() + "::" + b.Instructions().size());
  89. for (Instruction inst : b.Instructions()) {
  90. // System.out.println("Translate: " + inst.G("global.position") + "::read["
  91. // + inst.G("reg.dst.load")
  92. // + "|"
  93. // + inst.G("reg.p1.load")
  94. // + "|"
  95. // + inst.G("reg.p2.load")
  96. // + "] >> write["
  97. // + inst.G("reg.dst.store")
  98. // + "|"
  99. // + inst.G("reg.p1.store")
  100. // + "|"
  101. // + inst.G("reg.p2.store")
  102. // + "]"
  103. // + inst.G("type")
  104. // );
  105. //
  106. switch (inst.G("type")) {
  107. case "label":
  108. if (!inst.G("label").equals(getTarget().Block().getName())) {
  109. TranslateLabel(inst);
  110. }
  111. break;
  112. case "assign":
  113. TranslateAssign(inst);
  114. break;
  115. case "unary":
  116. TranslateUnary(inst);
  117. break;
  118. case "copy":
  119. TranslateCopy(inst);
  120. break;
  121. case "jump":
  122. TranslateJump(inst);
  123. break;
  124. case "call":
  125. TranslateCall(inst);
  126. break;
  127. case "return":
  128. TranslateReturn(inst);
  129. break;
  130. case "push_param":
  131. TranslatePushParam(inst);
  132. break;
  133. case "push_return":
  134. TranslatePushReturn(inst);
  135. break;
  136. case "pop_return":
  137. TranslatePopReturn(inst);
  138. break;
  139. case "pop_param":
  140. TranslatePopParam(inst);
  141. break;
  142. case "branch":
  143. TranslateBranch(inst);
  144. break;
  145. case "indexed_assign":
  146. TranslateIndexedAssignment(inst);
  147. break;
  148. case "pointer_assign":
  149. TranslatePointerAssignment(inst);
  150. break;
  151. case "store":
  152. TranslateStore(inst);
  153. break;
  154. case "load":
  155. TranslateLoad(inst);
  156. break;
  157. default:
  158. throw new Exception(String.format("TAC instruction type '%s' not defined", inst.G("type")));
  159. }
  160. }
  161. }
  162. }