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
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