cgmodule.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "cgstd.h"
  2. #include "cgmodule.h"
  3. CGModule::CGModule( ostream &o ):out(o){
  4. }
  5. CGModule::~CGModule(){
  6. }
  7. CGFrame *CGModule::createFrame( CGFun *fun ){
  8. CGFrame *f=frame(fun);
  9. frames.push_back(f);
  10. return f;
  11. }
  12. struct CGSymFinder : public CGVisitor{
  13. CGModule *module;
  14. CGSymFinder( CGModule *m ):module(m){}
  15. CGExp *visit( CGExp *exp ){
  16. if( CGSym *t=exp->sym() ){
  17. if( CGDat *d=t->dat() ){
  18. if( !module->dataSyms.count(d->value) ){
  19. module->datas.push_back(d);
  20. module->dataSyms.insert( d->value );
  21. }
  22. }
  23. if( t->linkage==CG_IMPORT ) module->importSyms.insert( t->value );
  24. else if( t->linkage==CG_EXPORT ) module->exportSyms.insert( t->value );
  25. }
  26. return exp;
  27. }
  28. };
  29. void CGModule::emitModule(){
  30. CGSymFinder vis(this);
  31. int k;
  32. for( k=0;k<frames.size();++k ){
  33. CGFrame *f=frames[k];
  34. CGSym *sym=f->fun->sym;
  35. if( sym->linkage==CG_EXPORT ) exportSyms.insert( sym->value );
  36. CGAsm *as;
  37. for( as=f->assem.begin;as!=f->assem.end;as=as->succ ){
  38. CGStm *t=as->stm;
  39. if( !t ) continue;
  40. t->visit( vis );
  41. }
  42. }
  43. set<string>::iterator sym_it;
  44. //header
  45. emitHeader();
  46. //imports
  47. for( sym_it=importSyms.begin();sym_it!=importSyms.end();++sym_it ){
  48. emitImport( *sym_it );
  49. }
  50. //exports
  51. for( sym_it=exportSyms.begin();sym_it!=exportSyms.end();++sym_it ){
  52. emitExport( *sym_it );
  53. }
  54. //frames
  55. for( k=0;k<frames.size();++k ){
  56. emitFrame( frames[k] );
  57. }
  58. //datas
  59. for( k=0;k<datas.size();++k ){
  60. emitData( datas[k] );
  61. }
  62. //footer
  63. emitFooter();
  64. out.flush();
  65. }