pi_cond_jmp_rewriter.cc

Go to the documentation of this file.
00001 #include <lestes/backend_v2/structs/func_data.g.hh>
00002 #include <lestes/backend_v2/workers/pi_cond_jmp_rewriter.g.hh>
00003 #include <lestes/backend_v2/intercode/pi.g.hh>
00004 #include <lestes/backend_v2/intercode/visitor_pi_pi2id.g.hh>
00005 #include <lestes/md/types/ss_type2tm_type_convertor.g.hh>
00006 
00007 package(lestes);
00008 package(backend_v2);
00009 package(workers);
00010 
00011 using namespace ::lestes::backend_v2::intercode;
00012 using namespace ::lestes::backend_v2::structs;
00013 using namespace ::lestes::md::types;
00014 
00015 typedef list<srp<pi_pi> > pi_list__type;
00016 
00017 /*!
00018         \brief Rewrites conditional jumps.
00019 */
00020 void pi_cond_jmp_rewriter::process() {
00021 
00022         ptr<visitor_pi_pi2id> pi_id_getter = visitor_pi_pi2id::create();
00023         
00024         ptr<pi_list__type> body = data_get()->pi_body_get();
00025         
00026         for(pi_list__type::iterator it = body->begin(); it!=body->end(); ++it) {
00027                 
00028                 if ( visitor_pi_pi2id::PI_BF!= (visitor_pi_pi2id::kind_type)(*it)->accept_visitor_pi_pi2ulint_gen_base(pi_id_getter) ) {
00029                         continue;
00030                 }
00031                 
00032                 ptr<pi_bf> bf = (*it).dncast<pi_bf>();
00033                 ptr<pi_pi> setter_generic = bf->condition_get()->origin_get();
00034                 
00035                 ptr<pi_preg> out_cmp_res = pi_preg::create(NULL,ss_type2tm_type_convertor::instance()->conditional_preg_type_get());
00036                                                                         
00037                 ptr<pi_cb_single_label_target> out_jmp = NULL;
00038                 ptr<pi_tdtpi> setter = NULL;
00039                 
00040                 switch (setter_generic->accept_visitor_pi_pi2ulint_gen_base(pi_id_getter) ) {
00041                         case visitor_pi_pi2id::PI_SBG: {                
00042                                 setter = setter_generic.dncast<pi_tdtpi>();
00043                                 
00044                                 out_jmp = pi_bng::create(
00045                                         bf->psp_get(),
00046                                         bf->nsp_get(),
00047                                         bf->level_get(),
00048                                         out_cmp_res,
00049                                         bf->destination_get()); 
00050                         } break;
00051                         
00052                         case visitor_pi_pi2id::PI_SBL: {                
00053                                 setter = setter_generic.dncast<pi_tdtpi>();
00054                                 
00055                                 out_jmp = pi_bnl::create(
00056                                         bf->psp_get(),
00057                                         bf->nsp_get(),
00058                                         bf->level_get(),
00059                                         out_cmp_res,
00060                                         bf->destination_get()); 
00061                         } break;
00062                         
00063                         case visitor_pi_pi2id::PI_SBE: {                
00064                                 setter = setter_generic.dncast<pi_tdtpi>();
00065                                 
00066                                 out_jmp = pi_bne::create(
00067                                         bf->psp_get(),
00068                                         bf->nsp_get(),
00069                                         bf->level_get(),
00070                                         out_cmp_res,
00071                                         bf->destination_get()); 
00072                         } break;
00073                         
00074                         case visitor_pi_pi2id::PI_SBNG: {               
00075                                 setter = setter_generic.dncast<pi_tdtpi>();
00076                                 
00077                                 out_jmp = pi_bg::create(
00078                                         bf->psp_get(),
00079                                         bf->nsp_get(),
00080                                         bf->level_get(),
00081                                         out_cmp_res,
00082                                         bf->destination_get()); 
00083                         } break;
00084                         
00085                         case visitor_pi_pi2id::PI_SBNL: {               
00086                                 setter = setter_generic.dncast<pi_tdtpi>();
00087                                 
00088                                 out_jmp = pi_bl::create(
00089                                         bf->psp_get(),
00090                                         bf->nsp_get(),
00091                                         bf->level_get(),
00092                                         out_cmp_res,
00093                                         bf->destination_get()); 
00094                         } break;
00095                         
00096                         case visitor_pi_pi2id::PI_SBNE: {               
00097                                 setter = setter_generic.dncast<pi_tdtpi>();
00098                                 
00099                                 out_jmp = pi_be::create(
00100                                         bf->psp_get(),
00101                                         bf->nsp_get(),
00102                                         bf->level_get(),
00103                                         out_cmp_res,
00104                                         bf->destination_get()); 
00105                         } break;
00106                         
00107                 }
00108                 
00109                 if ( !out_jmp ) {
00110                         continue;
00111                 }
00112                 
00113                 ptr<pi_cmp> out_cmp = pi_cmp::create(
00114                                                                 setter->psp_get(),
00115                                                                 setter->nsp_get(),
00116                                                                 setter->level_get(),
00117                                                                 setter->left_get(),
00118                                                                 setter->right_get(),
00119                                                                 out_cmp_res,
00120                                                                 out_cmp_res->type_get(),
00121                                                                 setter->type2_get());
00122                                                                 
00123                 out_cmp_res->origin_set(out_cmp);
00124                 
00125                 pi_list__type::iterator it_replace = ::std::find(body->begin(),body->end(),setter);
00126                 
00127                 *it_replace = out_cmp;
00128                 *it = out_jmp;
00129         }
00130 }
00131 
00132 /*!
00133         \brief Returns data of the currently processed function with rewritten jumps.
00134 */
00135 ptr<func_data> pi_cond_jmp_rewriter::get_result() {
00136         return data_get();
00137 }
00138 
00139 end_package(workers);
00140 end_package(backend_v2);
00141 end_package(lestes);
00142 

Generated on Mon Feb 12 18:23:07 2007 for lestes by doxygen 1.5.1-20070107