ss_decl2lstring_base.cc

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

Generated on Mon Feb 12 18:23:16 2007 for lestes by doxygen 1.5.1-20070107