diff options
author | John Hodge <tpg@mutabah.net> | 2016-12-16 19:10:13 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-12-16 19:10:13 +0800 |
commit | e5d9f5037803892a0f3dfd24dbca982ed8d22839 (patch) | |
tree | e3ae4ba45df0ea5d9990c96c44e245925e332134 /src/trans/enumerate.cpp | |
parent | 07ad0a60696f1c453d5e21e8637077c6f77f483b (diff) | |
download | mrust-e5d9f5037803892a0f3dfd24dbca982ed8d22839.tar.gz |
Trans Enumerate - Hack around trans model and find #[link_name] symbols
Diffstat (limited to 'src/trans/enumerate.cpp')
-rw-r--r-- | src/trans/enumerate.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
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 <mir/mir.hpp> #include <hir_typeck/common.hpp> // monomorph #include <hir_typeck/static.hpp> // StaticTraitResolve +#include <hir/item_path.hpp> 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<<"+"<<pp.pp_impl); @@ -530,6 +573,23 @@ void Trans_Enumerate_FillFrom(TransList& out, const ::HIR::Crate& crate, const : { Trans_Enumerate_FillFrom_MIR(out, crate, *function.m_code.m_mir, pp); } + else + { + if( function.m_linkage.name != "" ) + { + // Search for a function with the same linkage name anywhere in the loaded crates + ::HIR::SimplePath path; + if(const auto* f = find_function_by_link_name(crate, function.m_linkage.name.c_str(), path)) + { + auto path_mono = ::HIR::Path( mv$(path) ); + if( auto* ptr = out.add_function(mv$(path_mono)) ) + { + Trans_Enumerate_FillFrom(out,crate, *f, *ptr, Trans_Params(pp.sp)); + } + } + } + // External. + } out_fcn.ptr = &function; out_fcn.pp = mv$(pp); } |