From e5d9f5037803892a0f3dfd24dbca982ed8d22839 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Fri, 16 Dec 2016 19:10:13 +0800 Subject: Trans Enumerate - Hack around trans model and find #[link_name] symbols --- src/trans/enumerate.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'src/trans/enumerate.cpp') diff --git a/src/trans/enumerate.cpp b/src/trans/enumerate.cpp index 259bee47..a94f21e5 100644 --- a/src/trans/enumerate.cpp +++ b/src/trans/enumerate.cpp @@ -13,6 +13,7 @@ #include #include // monomorph #include // StaticTraitResolve +#include void Trans_Enumerate_FillFrom(TransList& out, const ::HIR::Crate& crate, const ::HIR::Function& function, TransList_Function& fcn_out, Trans_Params pp={}); @@ -47,6 +48,8 @@ TransList Trans_Enumerate_Main(const ::HIR::Crate& crate) Trans_Enumerate_FillFrom(rv, crate, fcn, *ptr); } + // TODO: Search the trans list for external functions that refer to a named symbol, search for that defined elsewhere. + return rv; } @@ -523,6 +526,46 @@ void Trans_Enumerate_FillFrom_Literal(TransList& out, const ::HIR::Crate& crate, ) } +namespace { + ::HIR::Function* find_function_by_link_name(const ::HIR::Module& mod, ::HIR::ItemPath mod_path, const char* name, ::HIR::SimplePath& out_path) + { + for(const auto& vi : mod.m_value_items) + { + TU_IFLET( ::HIR::ValueItem, vi.second->ent, Function, i, + if( i.m_code.m_mir && i.m_linkage.name != "" && i.m_linkage.name == name ) + { + out_path = (mod_path + vi.first.c_str()).get_simple_path(); + return &i; + } + ) + } + + for(const auto& ti : mod.m_mod_items) + { + TU_IFLET( ::HIR::TypeItem, ti.second->ent, Module, i, + if( auto rv = find_function_by_link_name(i, mod_path + ti.first.c_str(), name, out_path) ) + return rv; + ) + } + + return nullptr; + } + ::HIR::Function* find_function_by_link_name(const ::HIR::Crate& crate, const char* name, ::HIR::SimplePath& out_path) + { + if(auto rv = find_function_by_link_name(crate.m_root_module, {}, name, out_path)) + return rv; + for(const auto& e_crate : crate.m_ext_crates) + { + if(auto rv = find_function_by_link_name(e_crate.second->m_root_module, {}, name, out_path)) + { + out_path.m_crate_name = e_crate.first; + return rv; + } + } + return nullptr; + } +} + void Trans_Enumerate_FillFrom(TransList& out, const ::HIR::Crate& crate, const ::HIR::Function& function, TransList_Function& out_fcn, Trans_Params pp) { TRACE_FUNCTION_F("Function pp=" << pp.pp_method<<"+"<