backend.cc

Go to the documentation of this file.
00001 #include <lestes/std/vector.hh>
00002 #include <lestes/backend_v2/backend.g.hh>
00003 #include <lestes/backend_v2/debug/debug.hh>
00004 #include <lestes/backend_v2/interface/backend_data_builder.g.hh>
00005 #include <lestes/backend_v2/structs/func_data.g.hh>
00006 #include <lestes/backend_v2/workers/ge_generator.g.hh>
00007 #include <lestes/backend_v2/workers/order_governor.g.hh>
00008 #include <lestes/backend_v2/workers/scheduler.g.hh>
00009 #include <lestes/backend_v2/workers/bb_finder.g.hh>
00010 #include <lestes/backend_v2/workers/alloc_int_finder.g.hh>
00011 #include <lestes/backend_v2/workers/linscan_regalloc.g.hh>
00012 #include <lestes/backend_v2/workers/spillgen.g.hh>
00013 #include <lestes/backend_v2/workers/simple_spillgen.g.hh>
00014 #include <lestes/backend_v2/workers/body_preprocessor.g.hh>
00015 #include <lestes/backend_v2/workers/literal_inliner.g.hh>
00016 #include <lestes/backend_v2/workers/memory_inliner.g.hh>
00017 #include <lestes/backend_v2/workers/dead_code_eliminator.g.hh>
00018 #include <lestes/backend_v2/workers/useless_code_eliminator.g.hh>
00019 #include <lestes/backend_v2/workers/pi_cond_jmp_rewriter.g.hh>
00020 #include <lestes/md/tasm/asm_generator.g.hh>
00021 #include <lestes/md/mem/memory_allocators.g.hh>
00022 #include <lestes/md/symbols/symbol_register.g.hh>
00023 #include <lestes/md/functions/preasmgen_body_changes.g.hh>
00024 
00025 package(lestes);
00026 package(backend_v2);
00027 
00028 using namespace ::lestes::msg;
00029 using namespace ::lestes::backend_v2::interface;
00030 using namespace ::lestes::backend_v2::structs;
00031 using namespace ::lestes::backend_v2::workers;
00032 using namespace ::lestes::backend_v2::debug;
00033 using namespace ::lestes::md::tasm;
00034 using namespace ::lestes::md::mem;
00035 using namespace ::lestes::md::symbols;
00036 using namespace ::lestes::md::functions;
00037 
00038 initialize_top_logger( backend_v2_logger, "backend_v2" );
00039 
00040 /*!
00041         \brief The backend's main.
00042 */
00043 void backend::main() {
00044 
00045         backend_v2_logger << "main - start\n" << eolog;
00046         
00047         ptr<vector<srp<builder_func_data> > > builder_data = backend_data_builder::instance()->get_result();
00048         ptr<vector<srp<func_data> > > tu_data = vector<srp<func_data> >::create();
00049         
00050         for(ulint i=0; i<builder_data->size(); ++i) {
00051                 
00052                 backend_v2_logger << "function body processing - start\n" << eolog;
00053                 
00054                 ptr<builder_func_data> bfd = (*builder_data)[i]; 
00055                 
00056                 b_dump(bfd,"function_data");
00057                 
00058                 ptr<func_data> fd = func_data::create(bfd->function_decl_get());
00059                 fd->pi_body_set(bfd->pi_body_get()); 
00060 
00061                 backend_v2_logger << "registering function in symbol register\n" << eolog;
00062                 symbol_register::instance()->register_symbol(fd->function_decl_get());
00063                 
00064                 if ( optimization_conditional_jumps ) {
00065                         backend_v2_logger << "optimizing conditional jumps\n" << eolog;
00066                         ptr<pi_cond_jmp_rewriter> jmps = pi_cond_jmp_rewriter::create(fd);
00067                         jmps->process();
00068                         fd = jmps->get_result();
00069                 }
00070                 
00071                 backend_v2_logger << "ordering pi-pseudoinstructions\n" << eolog;
00072                 ptr<order_governor> linearizator = order_governor::create(fd);
00073                 linearizator->process();
00074                 fd = linearizator->get_result();
00075                 
00076                 backend_v2_logger << "generating ge-code\n" << eolog;
00077                 ptr<ge_generator> ge_gen = ge_generator::create(fd);
00078                 ge_gen->process();
00079                 fd = ge_gen->get_result();
00080                 
00081                 if ( optimization_immediate_inlining ) {
00082                         backend_v2_logger << "inlining immediates\n" << eolog;
00083                         ptr<literal_inliner> lit_inliner = literal_inliner::create(fd);
00084                         lit_inliner->process();
00085                         fd = lit_inliner->get_result();
00086                 }
00087                 
00088                 
00089                 if ( optimization_memory_inlining ) {
00090                         backend_v2_logger << "inlining memory operands\n" << eolog;
00091                         ptr<memory_inliner> mem_inliner = memory_inliner::create(fd);
00092                         mem_inliner->process();
00093                         fd = mem_inliner->get_result();
00094                 }
00095                 
00096                 if ( optimization_deadcode_elimination ) {
00097                         backend_v2_logger << "dead code elimination\n" << eolog;
00098                         ptr<dead_code_eliminator> dead = dead_code_eliminator::create(fd);
00099                         dead->process();
00100                         fd = dead->get_result();
00101                 }
00102                 
00103                 backend_v2_logger << "preprocessing body\n" << eolog;
00104                 ptr<body_preprocessor> bp = body_preprocessor::create(fd);
00105                 bp->process();
00106                 fd = bp->get_result();
00107                 
00108                 backend_v2_logger << "analyzing basic blocks\n" << eolog;
00109                 ptr<bb_finder> bb = bb_finder::create(fd);
00110                 bb->process();
00111                 fd = bb->get_result();
00112                 
00113                 backend_v2_logger << "scheduling ge-code - pass 1\n" << eolog;
00114                 ptr<scheduler> sched = scheduler::create(fd);
00115                 if ( !optimization_code_scheduling ) {
00116                         sched->dumb_scheduling_set(true);
00117                 }
00118                 sched->process();
00119                 fd = sched->get_result();
00120                                 
00121                 backend_v2_logger << "analyzing intervals for register allocation and spill code generation\n" << eolog;
00122                 ptr<alloc_int_finder> ints = alloc_int_finder::create(fd);
00123                 ints->process();
00124                 fd = ints->get_result();
00125                 
00126                 if ( optimization_register_allocation ) {
00127                         backend_v2_logger << "register allocation\n" << eolog;
00128                         ptr<linscan_regalloc> regalloc = linscan_regalloc::create(fd);
00129                         regalloc->process();
00130                         fd = regalloc->get_result();
00131                 }
00132                 
00133                 backend_v2_logger << "spillcode generation - pass 1\n" << eolog;
00134                 ptr<spillgen> spill = spillgen::create(fd);
00135                 spill->process();
00136                 fd = spill->get_result();
00137                 
00138                 backend_v2_logger << "scheduling ge-code - pass 2\n" << eolog;
00139                 sched = scheduler::create(fd);
00140                 if ( !optimization_code_scheduling ) {
00141                         sched->dumb_scheduling_set(true);
00142                 }
00143                 sched->process();
00144                 fd = sched->get_result();
00145                 
00146                 backend_v2_logger << "spillcode generation - pass 2\n" << eolog;
00147                 ptr<simple_spillgen> simple_spill = simple_spillgen::create(fd);
00148                 simple_spill->process();
00149                 fd = simple_spill->get_result();
00150                 
00151                 if ( optimization_uselesscode_elimination ) {
00152                         backend_v2_logger << "useless code elimination\n" << eolog;
00153                         ptr<useless_code_eliminator> useless = useless_code_eliminator::create(fd);
00154                         useless->process();
00155                         fd = useless->get_result();
00156                 }
00157                 
00158                 backend_v2_logger << "computing placement of the function's local variables\n" << eolog;
00159                 local_variable_allocator::instance(fd->function_decl_get())->calculate_placement();
00160                 
00161                 ptr<preasmgen_body_changes> preasm = preasmgen_body_changes::create(fd->function_decl_get(),fd->ge_body_get());
00162                 preasm->process_body();
00163                 fd->ge_body_set(preasm->get_result());
00164                 
00165                 tu_data->push_back(fd); 
00166                 
00167                 backend_v2_logger << "function body processing - end\n" << eolog;       
00168         }
00169         
00170         backend_v2_logger << "computing placement of global variables\n" << eolog;
00171         global_variable_allocator::instance()->calculate_placement();
00172         
00173         backend_v2_logger << "generating asm-code for TU\n" << eolog;
00174         ptr<asm_generator> asm_gen = asm_generator::create(output);
00175         asm_gen->generate_tu_prologue();
00176         asm_gen->generate_tu_body(tu_data);
00177         asm_gen->generate_tu_epilogue();
00178         
00179         backend_v2_logger << "main - end\n" << eolog;
00180 }
00181 
00182 end_package(backend_v2);
00183 end_package(lestes);
00184 
00185 
00186 

Generated on Mon Feb 12 18:22:31 2007 for lestes by doxygen 1.5.1-20070107