literal_loader.cc

Go to the documentation of this file.
00001 /*!
00002         \file
00003         \brief Literal loader.
00004         \author jaz
00005 */
00006 
00007 #include <lestes/md/types/tm_data_type_base.g.hh>
00008 #include <lestes/md/tasm/tm_asm.mdg.hh>
00009 #include <lestes/md/mem/memory_allocators.g.hh>
00010 #include <lestes/md/literals/literal_info_base.g.hh>
00011 #include <lestes/backend_v2/intercode/pi.g.hh>
00012 #include <lestes/backend_v2/intercode/pi_mem_factory.g.hh>
00013 
00014 #include "literal_loader.g.hh"
00015 
00016 package(lestes);
00017 package(md);
00018 package(literals);
00019 
00020 using namespace ::lestes::backend_v2::intercode;
00021 
00022 using ::lestes::md::tasm::tm_asm;
00023 
00024 typedef map<srp<pi_lit>, ulint> lit2ulint_map_type;
00025 typedef list<srp<pi_pi> > pi_list_type;
00026 
00027 /*!
00028         \brief Returns instance.
00029 */
00030 ptr<literal_loader> literal_loader::instance() {
00031         if ( !singleton_instance ) {
00032                 //An singleton instance has not been created yet. Create it!
00033                 singleton_instance_set(literal_loader::create());
00034         }
00035         //Return instance.
00036         return singleton_instance;
00037 }
00038 
00039 /*!
00040         \brief Tells whether a literal is managed.
00041         
00042         \param lit The literal.
00043         \return True if literal is managed. False otherwise.
00044 */
00045 bool literal_loader::is_managed(ptr<pi_lit> lit) {
00046         if ( managed_literals->find(lit)!=managed_literals->end() ) {
00047                 return true;
00048         }
00049         return false;
00050 }
00051 
00052 /*!
00053         \brief Returns id of managed literal.
00054         
00055         \param lit The literal.
00056         \return ID of the literal if the literal is managed. Empty string otherwise.
00057 */
00058 lstring literal_loader::get_id_for_managed_literal(ptr<pi_lit> lit) {
00059         lassert(lit);
00060 
00061         //Find literal id.      
00062         lit2ulint_map_type::iterator it = managed_literals->find(lit);
00063         
00064         if ( it==managed_literals->end() ) {
00065                 return lstring();
00066         }
00067         
00068         ::std::ostringstream oss;
00069         oss << it->second;
00070         
00071         //Get template for literal name.
00072         lstring code = tm_asm::ent_literal_get();
00073         
00074         //Return literal id.
00075         return string_replace(code,"$id",oss.str());    
00076 }
00077 
00078 
00079 /*!
00080         \brief Emits declarations for managed literals to a stream.
00081         
00082         \param output The stream.
00083 */
00084 void literal_loader::emit_global_declarations(::std::ostream& output) {
00085         //Go through managed literals and emit global declaration for them.
00086         lit2ulint_map_type::iterator it;
00087         for(it=managed_literals->begin(); it!=managed_literals->end(); it++) {
00088                 //Get template for global declaration.
00089                 lstring code = tm_asm::ent_global_simple_decl_get();
00090                 
00091                 //Get literal id.
00092                 lstring id = get_id_for_managed_literal(it->first);
00093                 
00094                 //Get literal type.
00095                 lstring type = it->first->value_get()->get_asm_definition_type();
00096                 
00097                 //Get literal initial value.
00098                 lstring value = it->first->value_get()->get_asm_definition_val();
00099                 
00100                 code = string_replace(code,"$id",id);
00101                 code = string_replace(code,"$type",type);
00102                 code = string_replace(code, "$value", value);
00103                 
00104                 //Emit declaration to output stream.
00105                 output << code;
00106         }
00107 }
00108 
00109 /*!
00110         \brief Generates list of pseudoinstructions that loads literal to a pseudoregister.
00111                 
00112         Note: The function sets psp, nsp and level for generated pseudoinstruction according to given psp and nsp
00113         in order to place them between these sequencepoints.
00114         
00115         \param preg The destination pseudoregister for literal.
00116         \param lit The literal.
00117         \param psp The first boundary sequencepoint.
00118         \param nsp The second boundary sequencepoint.
00119         \return The list of pseudoinstructions.
00120 */
00121 ptr<pi_list_type> literal_loader::generate_load(ptr<pi_preg> preg, ptr<pi_lit> lit, ptr<pi_sp> psp, ptr<pi_sp> nsp) {
00122         ptr<pi_list_type> pi_out_list = pi_list_type::create();
00123         
00124         //Compute level for load instruction.
00125         ulint level = (psp->level_get() > nsp->level_get() ? psp->level_get() : nsp->level_get()) + 1;
00126         
00127         //Get kind of literal info.
00128         literal_info_base::kind_type li_kind = lit->value_get()->kind_get();
00129         
00130         if ( li_kind==literal_info_base::SIMPLE ) {
00131                 //Simple literal. It is loaded as immidiate.
00132                 ptr<pi_ldi> ldi = pi_ldi::create(psp, nsp, level,preg,lit,lit->type_get());
00133                 preg->origin_set(ldi);
00134                 pi_out_list->push_back(ldi);
00135         } else {
00136                 //Compound literal. Global declaration will be created and literal will be loaded as its address,
00137                 ptr<pi_mem> mem = pi_mf_lit::create(NULL, lit->type_get(),lit)->get_mem(NULL);
00138                 ptr<pi_lda> ld = pi_lda::create(psp, nsp, level,preg,mem, lit->type_get(), lit->type_get());
00139                 mem->origin_set(psp);
00140                 preg->origin_set(ld);
00141                 pi_out_list->push_back(ld);
00142                 
00143                 //Register literal as managed literal.
00144                 managed_literals->insert(::std::pair<srp<pi_lit>, ulint>(lit, managed_literals->size()));
00145         }
00146         
00147         return pi_out_list;
00148 }
00149 
00150 end_package(literals);
00151 end_package(md);
00152 end_package(lestes);
00153 

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