summaryrefslogtreecommitdiff
path: root/src/trans/enumerate.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-12-16 19:10:13 +0800
committerJohn Hodge <tpg@mutabah.net>2016-12-16 19:10:13 +0800
commite5d9f5037803892a0f3dfd24dbca982ed8d22839 (patch)
treee3ae4ba45df0ea5d9990c96c44e245925e332134 /src/trans/enumerate.cpp
parent07ad0a60696f1c453d5e21e8637077c6f77f483b (diff)
downloadmrust-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.cpp60
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);
}