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
1.5.1-20070107