asm_generator.cc

Go to the documentation of this file.
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 

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