00001 /* 00002 The lestes compiler suite 00003 Copyright (C) 2002, 2003, 2004, 2005 Miroslav Tichy 00004 Copyright (C) 2002, 2003, 2004, 2005 Petr Zika 00005 Copyright (C) 2002, 2003, 2004, 2005 Vojtech Hala 00006 Copyright (C) 2002, 2003, 2004, 2005 Jiri Kosina 00007 Copyright (C) 2002, 2003, 2004, 2005 Pavel Sanda 00008 Copyright (C) 2002, 2003, 2004, 2005 Jan Zouhar 00009 Copyright (C) 2002, 2003, 2004, 2005 Rudolf Thomas 00010 00011 This program is free software; you can redistribute it and/or modify 00012 it under the terms of the GNU General Public License as published by 00013 the Free Software Foundation; version 2 of the License. 00014 00015 This program is distributed in the hope that it will be useful, 00016 but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 GNU General Public License for more details. 00019 00020 See the full text of the GNU General Public License version 2, and 00021 the limitations in the file doc/LICENSE. 00022 00023 By accepting the license the licensee waives any and all claims 00024 against the copyright holder(s) related in whole or in part to the 00025 work, its use, and/or the inability to use it. 00026 00027 */ 00028 /*! 00029 \file 00030 \brief Visistors returning lstring value for ss_declaration. 00031 \author jaz 00032 */ 00033 00034 #include <lestes/lang/cplus/sem/ss_declaration.g.hh> 00035 #include <lestes/lang/cplus/sem/ss_decl_name.g.hh> 00036 #include <lestes/lang/cplus/sem/ss_misc.g.hh> 00037 #include <lestes/lang/cplus/sem/ss_type.g.hh> 00038 #include <lestes/lang/cplus/sem/ss_decl2lstring_base.g.hh> 00039 #include <lestes/lang/cplus/sem/ss_decl_name2lstring_base.g.hh> 00040 #include <lestes/lang/cplus/sem/ss_type2lstring_base.g.hh> 00041 #include <lestes/md/tasm/tm_asm.mdg.hh> 00042 #include <sstream> 00043 00044 package(lestes); 00045 package(lang); 00046 package(cplus); 00047 package(sem); 00048 00049 using ::lestes::md::tasm::tm_asm; 00050 using ::lestes::lang::cplus::sem::ss_declaration; 00051 00052 typedef list<srp<ss_declaration> > decl_list_type; 00053 00054 ptr< ss_decl2mangled_name > ss_decl2mangled_name::instance(){ 00055 if ( !singleton_instance ) { 00056 singleton_instance = ss_decl2mangled_name::create(); 00057 } 00058 00059 singleton_instance->init(); 00060 00061 return singleton_instance; 00062 } 00063 00064 void ss_decl2mangled_name::init() { 00065 level_set(0); 00066 substitutions->clear(); 00067 } 00068 00069 /*! 00070 \brief Gets substitution for a mangled string. 00071 00072 If a substitution for mangled name exists then function returns it. 00073 Else function creates new substitution, adds it to substitutions map and returns 00074 original mangled name. 00075 00076 \param mangled_name The mangled name. 00077 \return The substitution. 00078 */ 00079 lstring ss_decl2mangled_name::get_substitution(lstring mangled_name) { 00080 map<lstring,lstring>::iterator existing_subst = substitutions->find(mangled_name); 00081 00082 if ( existing_subst==substitutions->end()) { 00083 //Add new substitution. 00084 ::std::ostringstream oss_subst; 00085 oss_subst << "S"; 00086 00087 if ( substitutions->size() >0 ) { 00088 oss_subst << substitutions->size()-1; 00089 } 00090 00091 oss_subst << "_"; 00092 00093 (*substitutions)[mangled_name] = oss_subst.str(); 00094 00095 return mangled_name; 00096 } else { 00097 return existing_subst->second; 00098 } 00099 00100 lassert(false); 00101 return lstring(); 00102 } 00103 00104 void ss_decl2mangled_name::visit_ss_namespace_definition(ptr< ::lestes::lang::cplus::sem::ss_namespace_definition > decl) { 00105 lassert(decl); 00106 00107 level++; 00108 00109 ::std::ostringstream oss; 00110 00111 if ( decl->contained_in_get() != ss_decl_seq::root_instance() ){ 00112 //Is nested -> prepend encoded namespaces 00113 oss << process(decl->contained_in_get()->parent_get()->declared_by_get()); 00114 } 00115 00116 //Get mangled namespace's name. 00117 lstring name = decl->name_get()->accept_ss_decl_name2lstring_base(ss_decl_name2mangled_name::instance()); 00118 00119 //Create mangled symbol. 00120 oss << name.length() << name; 00121 00122 return result_set(oss.str()); 00123 } 00124 00125 void ss_decl2mangled_name::visit_ss_object_declaration(ptr< ::lestes::lang::cplus::sem::ss_object_declaration > decl) { 00126 lassert(decl); 00127 00128 level++; 00129 00130 int my_level = level; 00131 00132 ::std::ostringstream oss; 00133 00134 //Get mangled name. 00135 lstring name = decl->name_get()->accept_ss_decl_name2lstring_base(ss_decl_name2mangled_name::instance()); 00136 00137 //mangle namespace 00138 lstring enclosing = lstring(); 00139 if ( decl->contained_in_get() != ss_decl_seq::root_instance()) { 00140 ::std::ostringstream oss1; 00141 //Is nested? -> encode namespaces 00142 oss1 << process(decl->contained_in_get()->declared_by_get()); 00143 oss1 << name.length(); 00144 00145 enclosing = oss1.str(); 00146 } 00147 00148 if ( my_level==1 ) { 00149 //This is top level object. 00150 if ( !enclosing.empty() ) { 00151 oss << "_ZN" << enclosing << name.length() << name << "E"; 00152 } else { 00153 oss << name; 00154 } 00155 } else { 00156 //This is enclosing object declaration for another one. 00157 if ( !enclosing.empty() ) { 00158 oss << enclosing << name.length() << name; 00159 } else { 00160 oss << name.length() << name; 00161 } 00162 } 00163 00164 return result_set(oss.str()); 00165 } 00166 00167 void ss_decl2mangled_name::visit_ss_bitfield_declaration(ptr< ::lestes::lang::cplus::sem::ss_bitfield_declaration > decl) { 00168 lassert(decl); 00169 00170 level++; 00171 00172 //A bitfield can be declared in class/struct only. It can't be static. -> No mangling needed. 00173 lassert(false); 00174 return result_set(lstring()); 00175 } 00176 00177 void ss_decl2mangled_name::visit_ss_parameter_declaration(ptr< ::lestes::lang::cplus::sem::ss_parameter_declaration > decl) { 00178 lassert(decl); 00179 00180 level++; 00181 00182 return result_set(ss_type2mangled_id::instance()->process(decl->type_get())); 00183 } 00184 00185 void ss_decl2mangled_name::visit_ss_structure_declaration(ptr< ::lestes::lang::cplus::sem::ss_structure_declaration > decl) { 00186 lassert(decl); 00187 00188 level++; 00189 00190 //TODO 00191 lassert(false); 00192 return result_set(lstring()); 00193 } 00194 00195 void ss_decl2mangled_name::visit_ss_enum_definition(ptr< ::lestes::lang::cplus::sem::ss_enum_definition > decl) { 00196 lassert(decl); 00197 00198 level++; 00199 00200 //TODO 00201 lassert(false); 00202 return result_set(lstring()); 00203 } 00204 00205 void ss_decl2mangled_name::visit_ss_typedef_definition(ptr< ::lestes::lang::cplus::sem::ss_typedef_definition > decl) { 00206 lassert(decl); 00207 00208 level++; 00209 00210 //TODO 00211 lassert(false); 00212 return result_set(lstring()); 00213 } 00214 00215 void ss_decl2mangled_name::visit_ss_function_declaration(ptr< ::lestes::lang::cplus::sem::ss_function_declaration > decl) { 00216 lassert(decl); 00217 00218 level++; 00219 00220 int my_level = level; 00221 00222 ::std::ostringstream oss; 00223 00224 if ( decl->is_entry_point() ) { 00225 return result_set(tm_asm::ent_main_name_get()); 00226 } else { 00227 00228 00229 lstring enclosing = lstring(); 00230 00231 //mangle namespace 00232 if ( decl->contained_in_get() != ss_decl_seq::root_instance()) { 00233 ::std::ostringstream oss1; 00234 //Is nested? -> encode namespaces 00235 oss1 << process(decl->contained_in_get()->declared_by_get()); 00236 00237 enclosing = oss1.str(); 00238 } 00239 00240 lstring name = decl->name_get()->accept_ss_decl_name2lstring_base(ss_decl_name2mangled_name::instance()); 00241 00242 ::std::ostringstream oss2; 00243 //mangle parameters 00244 if ( !decl->parameters_get() ) { 00245 //No parameters. 00246 oss2 << "v"; 00247 } else { 00248 //Encode parameters 00249 ptr<decl_list_type> params = decl->parameters_get()->contents_get(); 00250 lassert(params); 00251 00252 decl_list_type::iterator it; 00253 for(it=params->begin(); it!=params->end(); ++it) { 00254 lstring mangled_parameter = process(*it); 00255 00256 if ( mangled_parameter.length()>1 ) { 00257 //Substitute builtin datatypes only. 00258 oss2 << get_substitution(mangled_parameter); 00259 } else { 00260 oss2 << mangled_parameter; 00261 } 00262 } 00263 } 00264 00265 lstring parameters = oss2.str(); 00266 00267 if ( my_level==1 ) { 00268 //This is top level declaration. 00269 if ( !enclosing.empty() ) { 00270 oss << "_ZN" << enclosing << name.length() << name << "E" << parameters; 00271 } else { 00272 oss << "_Z" << name.length() << name << parameters; 00273 } 00274 } else { 00275 //This is enclosing function declaration for another declaration. 00276 if ( !enclosing.empty() ) { 00277 oss << enclosing << name.length() << name << parameters; 00278 } else { 00279 oss << name.length() << name << parameters; 00280 } 00281 } 00282 00283 return result_set(oss.str()); 00284 } 00285 lassert(false); 00286 return result_set(NULL); 00287 } 00288 00289 void ss_decl2mangled_name::visit_ss_enumerator_declaration(ptr< ::lestes::lang::cplus::sem::ss_enumerator_declaration > decl) { 00290 lassert(decl); 00291 00292 level++; 00293 00294 //TODO 00295 lassert(false); 00296 return result_set(lstring()); 00297 } 00298 00299 void ss_decl2mangled_name::visit_ss_using_declaration(ptr< ::lestes::lang::cplus::sem::ss_using_declaration > decl) { 00300 lassert(decl); 00301 00302 level++; 00303 00304 //TODO 00305 lassert(false); 00306 return result_set(lstring()); 00307 } 00308 00309 void ss_decl2mangled_name::visit_ss_builtin_operator_declaration(ptr< ::lestes::lang::cplus::sem::ss_builtin_operator_declaration > decl) { 00310 lassert(decl); 00311 00312 level++; 00313 00314 //TODO 00315 lassert(false); 00316 return result_set(lstring()); 00317 } 00318 00319 00320 void ss_decl2mangled_name::visit_ss_compound_stmt_declaration(ptr< ::lestes::lang::cplus::sem::ss_compound_stmt_declaration > decl) { 00321 lassert(decl); 00322 00323 level++; 00324 00325 lassert(false); 00326 //TODO 00327 return result_set(lstring()); 00328 } 00329 00330 void ss_decl2mangled_name::visit_ss_method_declaration(ptr< ::lestes::lang::cplus::sem::ss_method_declaration > decl) { 00331 lassert(decl); 00332 00333 level++; 00334 00335 lassert(false); 00336 //TODO 00337 return result_set(lstring()); 00338 } 00339 00340 void ss_decl2mangled_name::visit_ss_fake_declaration(ptr< ::lestes::lang::cplus::sem::ss_fake_declaration > decl){ 00341 lassert(decl); 00342 00343 level++; 00344 00345 lassert(false); 00346 //TODO 00347 return result_set(lstring()); 00348 } 00349 00350 void ss_decl2mangled_name::visit_ss_injected_class_declaration(ptr< ::lestes::lang::cplus::sem::ss_injected_class_declaration > decl){ 00351 lassert(decl); 00352 00353 level++; 00354 00355 lassert(false); 00356 //TODO 00357 return result_set(lstring()); 00358 } 00359 00360 end_package(sem); 00361 end_package(cplus); 00362 end_package(lang); 00363 end_package(lestes); 00364
1.5.1-20070107