00001 #include <lestes/backend_v2/structs/func_data.g.hh> 00002 #include <lestes/backend_v2/debug/debug.hh> 00003 #include <lestes/backend_v2/intercode/visitor_ge_pi2asm.g.hh> 00004 #include <lestes/md/tasm/asm_generator.g.hh> 00005 #include <lestes/md/tasm/tm_asm.mdg.hh> 00006 #include <lestes/md/mem/memory_allocators.g.hh> 00007 #include <lestes/md/literals/literal_loader.g.hh> 00008 #include <lestes/md/symbols/name_mangler.g.hh> 00009 #include <lestes/md/symbols/symbol_register.g.hh> 00010 #include <lestes/lang/cplus/sem/ss_declaration.g.hh> 00011 00012 package(lestes); 00013 package(md); 00014 package(tasm); 00015 00016 using namespace ::lestes::msg; 00017 using namespace ::lestes::backend_v2::structs; 00018 using namespace ::lestes::backend_v2::intercode; 00019 using namespace ::lestes::backend_v2::debug; 00020 using namespace ::lestes::md::instructions; 00021 using namespace ::lestes::md::mem; 00022 using namespace ::lestes::md::literals; 00023 using namespace ::lestes::md::symbols; 00024 using namespace ::lestes::lang::cplus::sem; 00025 00026 typedef list< srp<ge_pi> > ge_pi_list__type; 00027 typedef vector<srp< ::lestes::backend_v2::structs::func_data> > func_data_vector__type; 00028 00029 void asm_generator::generate_tu_prologue() { 00030 /* Generate asm file header */ 00031 output_get() << ";This file is an output of Lestes C++ compiler.\n"; 00032 00033 //Get singleton instance of the allocator for global variables 00034 ptr<global_variable_allocator> glob_var_allocator = global_variable_allocator::instance(); 00035 00036 /* Generate uninitialized data section header */ 00037 output_get() << tm_asm::ent_section_uninitialized_data_get(); 00038 00039 //Generate asm declarations for global variables 00040 glob_var_allocator->emit_asm_declarations_for_uninitialized(output_get()); 00041 00042 output_get() << ::std::endl; 00043 00044 /* Generate data section header */ 00045 output_get() << tm_asm::ent_section_data_get(); 00046 00047 //Generate asm declarations for global variables 00048 glob_var_allocator->emit_asm_declarations_for_initialized(output_get()); 00049 00050 //Generate asm declarations for managed literals 00051 literal_loader::instance()->emit_global_declarations(output_get()); 00052 00053 output_get() << ::std::endl; 00054 } 00055 00056 void asm_generator::generate_tu_body(ptr<func_data_vector__type> tu_data) { 00057 /* Generate code section */ 00058 output_get() << tm_asm::ent_section_text_get(); 00059 00060 /* Generate declarations for functions */ 00061 symbol_register::instance()->emit_global_declarations(output_get()); 00062 00063 output_get() << ::std::endl; 00064 00065 /* Generate function bodies */ 00066 for(ulint i=0; i<tu_data->size();++i) { 00067 process_function((*tu_data)[i]); 00068 } 00069 00070 output_get() << ::std::endl; 00071 } 00072 00073 void asm_generator::generate_tu_epilogue() { 00074 output_get() << ::std::endl; 00075 } 00076 00077 /*! 00078 \brief Generates asm code for single function body. 00079 00080 \param data A function data. 00081 */ 00082 void asm_generator::process_function(ptr<func_data> data) { 00083 /* Generate function header */ 00084 lstring mangled_name = name_mangler::instance()->mangle(data->function_decl_get()); 00085 lstring header = tm_asm::ent_function_label_get(); 00086 output_get() << string_replace(header, "$name", mangled_name); 00087 00088 /* Generate function body */ 00089 ptr<visitor_ge_pi2asm> ge2asm = visitor_ge_pi2asm::create(); 00090 00091 ptr<ge_pi_list__type> ge_pi_list = data->ge_body_get(); 00092 00093 for(ge_pi_list__type::iterator it_ge_list = ge_pi_list->begin(); it_ge_list!=ge_pi_list->end(); ++it_ge_list) { 00094 lstring asm_code = (*it_ge_list)->accept_visitor_ge_pi2lstring_gen_base(ge2asm); 00095 00096 if ( !asm_code.empty() ) { 00097 //Code has been emited. Flush it to the output. 00098 output_get() << tm_asm::ent_instruction_delimiter_get() << asm_code; 00099 } 00100 } 00101 00102 output_get() << ::std::endl; 00103 } 00104 00105 00106 00107 end_package(tasm); 00108 end_package(md); 00109 end_package(lestes); 00110
1.5.1-20070107