cgdebug.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #include "cgstd.h"
  2. #include "cgdebug.h"
  3. #include <typeinfo>
  4. static const char *ccSym( int cc ){
  5. switch( cc ){
  6. case CG_EQ:return "EQ";
  7. case CG_NE:return "NE";
  8. case CG_LT:return "LT";
  9. case CG_GT:return "GT";
  10. case CG_LE:return "LE";
  11. case CG_GE:return "GE";
  12. case CG_LTU:return "LTU";
  13. case CG_GTU:return "GTU";
  14. case CG_LEU:return "LEU";
  15. case CG_GEU:return "GEU";
  16. }
  17. assert(0);
  18. return 0;
  19. }
  20. static const char *uopSym( int op ){
  21. return "UOP";
  22. }
  23. static const char *bopSym( int op ){
  24. switch( op ){
  25. case CG_ADD:return "add";
  26. case CG_SUB:return "sub";
  27. case CG_MUL:return "mul";
  28. case CG_DIV:return "div";
  29. case CG_MOD:return "mod";
  30. case CG_AND:return "and";
  31. case CG_ORL:return "orl";
  32. case CG_XOR:return "xor";
  33. case CG_SHL:return "shl";
  34. case CG_SHR:return "shr";
  35. case CG_SAR:return "sar";
  36. }
  37. assert(0);
  38. return 0;
  39. }
  40. static const char *typeSym( int ty ){
  41. switch( ty ){
  42. case CG_PTR:return "PTR";
  43. case CG_VOID:return "VOID";
  44. case CG_INT8:return "INT8";
  45. case CG_INT16:return "INT16";
  46. case CG_INT32:return "INT32";
  47. case CG_INT64:return "INT64";
  48. case CG_FLOAT32:return "FLOAT32";
  49. case CG_FLOAT64:return "FLOAT64";
  50. case CG_CSTRING:return "CSTRING";
  51. case CG_BSTRING:return "BSTRING";
  52. }
  53. assert(0);
  54. return 0;
  55. }
  56. ostream &operator<<( ostream &o,CGStm *stm ){
  57. if( !stm ) return o;
  58. if( CGNop *t=stm->nop() ){
  59. o<<"nop";
  60. }else if( CGMov *t=stm->mov() ){
  61. o<<"mov "<<t->lhs<<','<<t->rhs;
  62. }else if( CGLab *t=stm->lab() ){
  63. o<<"lab "<<t->sym;
  64. }else if( CGBra *t=stm->bra() ){
  65. o<<"bra "<<t->sym;
  66. }else if( CGBcc *t=stm->bcc() ){
  67. o<<"bcc "<<ccSym(t->cc)<<','<<t->lhs<<','<<t->rhs<<","<<t->sym;
  68. }else if( CGRet *t=stm->ret() ){
  69. o<<"ret ";if( t->exp ) o<<t->exp;
  70. }else if( CGSeq *t=stm->seq() ){
  71. int i;
  72. o<<"seq ";
  73. for( i=0;i<t->stms.size();++i ){
  74. if( i ) o<<',';
  75. o<<t->stms[i];
  76. }
  77. }else if( CGXop *t=stm->xop() ){
  78. o<<"xop "<<t->op<<','<<t->exp;
  79. }else if( CGRem *t=stm->rem() ){
  80. o<<"rem "<<t->comment;
  81. }else if( CGEva *t=stm->eva() ){
  82. o<<"eva "<<t->exp;
  83. }else if( CGAti *t=stm->ati() ){
  84. o<<"ati "<<t->mem;
  85. }else if( CGAtd *t=stm->atd() ){
  86. o<<"atd "<<t->mem<<","<<t->sym;
  87. }else{
  88. o<<"STM: "<<typeid(*stm).name()<<endl;
  89. assert(0);
  90. }
  91. return o;
  92. }
  93. ostream &operator<<( ostream &o,CGExp *exp ){
  94. const char *ty=typeSym(exp->type);
  95. if( CGMem *t=exp->mem() ){
  96. o<<"mem("<<ty<<','<<t->exp<<','<<t->offset<<')';
  97. }else if( CGLea *t=exp->lea() ){
  98. o<<"lea("<<ty<<","<<t->exp<<')';
  99. }else if( CGCvt *t=exp->cvt() ){
  100. o<<"cvt("<<ty<<','<<t->exp<<')';
  101. }else if( CGUop *t=exp->uop() ){
  102. o<<uopSym(t->op)<<'('<<ty<<','<<t->exp<<')';
  103. }else if( CGBop *t=exp->bop() ){
  104. o<<bopSym(t->op)<<'('<<ty<<','<<t->lhs<<','<<t->rhs<<')';
  105. }else if( CGJsr *t=exp->jsr() ){
  106. o<<"jsr("<<ty<<','<<t->exp;
  107. for( int k=0;k<t->args.size();++k ) o<<','<<t->args[k];
  108. o<<')';
  109. }else if( CGVfn *t=exp->vfn() ){
  110. o<<"vfn("<<ty<<','<<t->exp<<','<<t->self<<')';
  111. }else if( CGScc *t=exp->scc() ){
  112. o<<"scc("<<ty<<','<<t->lhs<<','<<t->rhs<<')';
  113. }else if( CGEsq *t=exp->esq() ){
  114. o<<"esq("<<ty<<','<<t->lhs<<','<<t->rhs<<')';
  115. }else if( CGReg *t=exp->reg() ){
  116. o<<"reg("<<ty<<','<<t->id<<')';
  117. }else if( CGTmp *t=exp->tmp() ){
  118. o<<"tmp("<<ty<<','<<t->ident<<')';
  119. }else if( CGLit *t=exp->lit() ){
  120. if( t->isfloat() ) o<<ty<<' '<<t->float_value;
  121. else o<<ty<<' '<<int(t->int_value);
  122. }else if( CGSym *t=exp->sym() ){
  123. o<<"sym("<<t->value<<")";
  124. }else if( CGFrm *t=exp->frm() ){
  125. o<<"frm";
  126. }else{
  127. assert(0);
  128. }
  129. return o;
  130. }
  131. ostream &operator<<( ostream &o,const CGStmSeq &seq ){
  132. for( int k=0;k<seq.size();++k ){
  133. o<<seq[k]<<endl;
  134. }
  135. return o;
  136. }
  137. ostream &operator<<( ostream &o,const CGAsmSeq &seq ){
  138. CGAsm *as;
  139. for( as=seq.begin;as!=seq.end;as=as->succ ){
  140. if( as->stm ) o<<"\t;"<<as->stm<<endl;
  141. if( as->assem ) o<<as->assem;
  142. }
  143. return o;
  144. }
  145. ostream &operator<<( ostream &o,const CGIntSet &t ){
  146. CGIntSet::const_iterator it;
  147. for( it=t.begin();it!=t.end();++it ) o<<' '<<*it;
  148. return o;
  149. }
  150. ostream &operator<<( ostream &o,CGFlow *flow ){
  151. CGBlockSeq &seq=flow->blocks;
  152. CGBlockCIter it;
  153. //enumerate blocks
  154. map<CGBlock*,int> blk_map;
  155. for( it=seq.begin();it!=seq.end();++it ){
  156. blk_map[*it]=blk_map.size();
  157. }
  158. for( it=seq.begin();it!=seq.end();++it ){
  159. CGBlock *blk=*it;
  160. CGBlockCIter t_it;
  161. o<<"\t;---block "<<blk_map[blk]<<"---"<<endl;
  162. o<<"\t;use:"<<blk->use<<endl;
  163. o<<"\t;def:"<<blk->def<<endl;
  164. o<<"\t;live_in:"<<blk->live_in<<endl;
  165. o<<"\t;live_out:"<<blk->live_out<<endl;
  166. o<<"\t;succ:";
  167. for( t_it=blk->succ.begin();t_it!=blk->succ.end();++t_it ) o<<' '<<blk_map[*t_it];
  168. o<<endl;
  169. o<<"\t;pred:";
  170. for( t_it=blk->pred.begin();t_it!=blk->pred.end();++t_it ) o<<' '<<blk_map[*t_it];
  171. o<<endl;
  172. set<CGBlock*>::iterator d_it;
  173. o<<"\t;dom:";
  174. for( d_it=blk->dom.begin();d_it!=blk->dom.end();++d_it ){
  175. o<<' '<<blk_map[*d_it];
  176. }
  177. o<<endl;
  178. /*
  179. o<<"\t;loops:";
  180. for( d_it=blk->loops.begin();d_it!=blk->loops.end();++d_it ){
  181. o<<' '<<blk_map[*d_it];
  182. }
  183. o<<endl;
  184. */
  185. o<<"\t;loop_level:"<<blk->loop_level<<endl;
  186. o<<endl;
  187. CGAsm *as=blk->begin;
  188. while( as!=blk->end ){
  189. if( as->stm ) o<<"\t;"<<as->stm<<endl;
  190. if( as->def.size() ) o<<"\t;def="<<as->def<<endl;
  191. if( as->use.size() ) o<<"\t;use="<<as->use<<endl;
  192. if( as->assem ) o<<as->assem;
  193. as=as->succ;
  194. }
  195. o<<endl;
  196. }
  197. return o;
  198. }
  199. ostream &operator<<( ostream &o,CGFun *fun ){
  200. for( int k=0;k<fun->stms.size();++k ){
  201. o<<fun->stms[k]<<endl;
  202. }
  203. return o;
  204. }
  205. bool cgVerify( ostream &o,CGExp *exp ){
  206. return true;
  207. }
  208. bool cgVerify( ostream &o,CGStm *stm ){
  209. return true;
  210. }
  211. bool cgVerify( ostream &o,CGFun *fun ){
  212. return true;
  213. }