00001
00002
00003
00004
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
00029
00030 ptr<literal_loader> literal_loader::instance() {
00031 if ( !singleton_instance ) {
00032
00033 singleton_instance_set(literal_loader::create());
00034 }
00035
00036 return singleton_instance;
00037 }
00038
00039
00040
00041
00042
00043
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
00054
00055
00056
00057
00058 lstring literal_loader::get_id_for_managed_literal(ptr<pi_lit> lit) {
00059 lassert(lit);
00060
00061
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
00072 lstring code = tm_asm::ent_literal_get();
00073
00074
00075 return string_replace(code,"$id",oss.str());
00076 }
00077
00078
00079
00080
00081
00082
00083
00084 void literal_loader::emit_global_declarations(::std::ostream& output) {
00085
00086 lit2ulint_map_type::iterator it;
00087 for(it=managed_literals->begin(); it!=managed_literals->end(); it++) {
00088
00089 lstring code = tm_asm::ent_global_simple_decl_get();
00090
00091
00092 lstring id = get_id_for_managed_literal(it->first);
00093
00094
00095 lstring type = it->first->value_get()->get_asm_definition_type();
00096
00097
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
00105 output << code;
00106 }
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
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
00125 ulint level = (psp->level_get() > nsp->level_get() ? psp->level_get() : nsp->level_get()) + 1;
00126
00127
00128 literal_info_base::kind_type li_kind = lit->value_get()->kind_get();
00129
00130 if ( li_kind==literal_info_base::SIMPLE ) {
00131
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
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
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