symbol_register.cc

Go to the documentation of this file.
00001 /*!
00002         \file
00003         \brief Symbol register.
00004         \author jaz
00005 */
00006 
00007 #include <lestes/md/symbols/symbol_register.g.hh>
00008 #include <lestes/md/symbols/name_mangler.g.hh>
00009 #include <lestes/md/tasm/tm_asm.mdg.hh>
00010 #include <lestes/backend_v2/intercode/pi.g.hh>
00011 #include <lestes/lang/cplus/sem/ss_declaration.g.hh>
00012 #include <lestes/lang/cplus/sem/ss_statement.g.hh>
00013 #include <lestes/lang/cplus/sem/ss_decl2ulint_base.g.hh>
00014 
00015 
00016 package(lestes);
00017 package(md);
00018 package(symbols);
00019 
00020 using namespace ::lestes::lang::cplus::sem;
00021 using ::lestes::md::symbols::name_mangler;
00022 using ::lestes::md::tasm::tm_asm;
00023 
00024 typedef set<srp<ss_declaration> > decl_set_type;
00025 
00026 ptr<symbol_register> symbol_register::instance() {
00027         if ( !singleton_instance_get() ) {
00028                 singleton_instance_set(symbol_register::create());
00029         }
00030         return singleton_instance_get();
00031 }
00032 
00033 /*!
00034         \brief Registers symbol.
00035         
00036         \param symbol The symbol.
00037 */
00038 void symbol_register::register_symbol(ptr<ss_declaration> symbol) {
00039         ptr<ss_linkage> linkage = symbol->linkage_get();
00040         
00041         if ( linkage->linkage_get()==ss_linkage::LINKAGE_INTERNAL ) {
00042                 /*
00043                         symbol has internal linkage
00044                 */
00045                 symbol_register::instance()->register_internal(symbol);
00046         } else if ( linkage->linkage_get()==ss_linkage::LINKAGE_EXTERNAL ) {
00047                 /*
00048                         symbol with external linkage. it can be global or just external.
00049                 */
00050                 ss_decl2id::id_type id = (ss_decl2id::id_type)symbol->accept_ss_decl2ulint_base(ss_decl2id::instance());
00051                 
00052                 if ( id==ss_decl2id::FUNCTION || id==ss_decl2id::METHOD || id==ss_decl2id::BUILTIN_OPERATOR) {
00053                         if ( symbol.dncast<ss_function_declaration>()->body_get() ) {
00054                                 /*
00055                                         function with body defined in this translation unit.
00056                                 */
00057                                 symbol_register::instance()->register_global(symbol);
00058                         } else {
00059                                 /*
00060                                         function without body defined in this TU.
00061                                 */
00062                                 symbol_register::instance()->register_external(symbol);
00063                         }
00064                 } else {
00065                         symbol_register::instance()->register_global(symbol);
00066                 }
00067                 
00068         } // else NO_LINKAGE
00069 }
00070 
00071 /*!
00072         \brief Registers external symbol.
00073         
00074         \param symbol The symbol.
00075 */
00076 void symbol_register::register_external(ptr<ss_declaration> symbol) {
00077         externals->insert(symbol);
00078 }
00079 
00080 /*!
00081         \brief Registers internal symbol.
00082         
00083         \param symbol The symbol.
00084 */
00085 void symbol_register::register_global(ptr<ss_declaration> symbol) {
00086         globals->insert(symbol);
00087 }
00088 
00089 /*!
00090         \brief Registers internal symbol.
00091         
00092         \param symbol The symbol.
00093 */
00094 void symbol_register::register_internal(ptr<ss_declaration> symbol) {
00095         internals->insert(symbol);
00096 }
00097 
00098 
00099 /*!
00100         \brief Emits global delarations for registered symbols.
00101         
00102         \param output Output.
00103 */
00104 void symbol_register::emit_global_declarations(::std::ostream& output) {
00105         decl_set_type::iterator it;
00106         
00107         for(it=externals->begin(); it!=externals->end(); it++) {
00108                 output << string_replace(tm_asm::ent_extern_symbol_decl_get(),"$name",name_mangler::instance()->mangle(*it));
00109         }
00110         
00111         for(it=globals->begin(); it!=globals->end(); it++) {
00112                 output << string_replace(tm_asm::ent_global_symbol_decl_get(),"$name",name_mangler::instance()->mangle(*it));
00113         }
00114         
00115         for(it=internals->begin(); it!=internals->end(); it++) {
00116                 output << string_replace(tm_asm::ent_internal_symbol_decl_get(),"$name",name_mangler::instance()->mangle(*it));
00117         }
00118 }
00119 
00120 end_package(symbols);
00121 end_package(md);
00122 end_package(lestes);
00123 

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