diff --git a/include/xo/jit/Jit.hpp b/include/xo/jit/Jit.hpp index 98fbc614..9888e1ca 100644 --- a/include/xo/jit/Jit.hpp +++ b/include/xo/jit/Jit.hpp @@ -133,8 +133,10 @@ namespace xo { /** intern @p symbol, binding it to address @p dest **/ template llvm::Error intern_symbol(const std::string & symbol, T * dest) { + auto mangled_sym = mangler_(symbol); + llvm::orc::SymbolMap symbol_map; - symbol_map[mangler_(symbol)] + symbol_map[mangled_sym] = llvm::orc::ExecutorSymbolDef(llvm::orc::ExecutorAddr::fromPtr(dest), llvm::JITSymbolFlags()); @@ -144,8 +146,10 @@ namespace xo { } /*intern_symbol*/ /** report mangled symbol name **/ - auto mangle(StringRef name) { - return this->mangler_(name.str()); + std::string_view mangle(StringRef name) { + auto tmp = *(this->mangler_(name.str())); + + return std::string_view(tmp.data(), tmp.size()); } llvm::Expected lookup(StringRef name) { diff --git a/include/xo/jit/MachPipeline.hpp b/include/xo/jit/MachPipeline.hpp index 308397fc..ec7e0b4d 100644 --- a/include/xo/jit/MachPipeline.hpp +++ b/include/xo/jit/MachPipeline.hpp @@ -108,8 +108,8 @@ namespace xo { /** dump text description of module contents to console **/ void dump_current_module(); - /** report mangle symbol **/ - std::string mangle(const std::string & x) const; + /** report mangled symbol for @p x **/ + std::string_view mangle(const std::string & x) const; /** lookup symbol in jit-associated output library **/ llvm::Expected lookup_symbol(const std::string & x); diff --git a/src/jit/MachPipeline.cpp b/src/jit/MachPipeline.cpp index 9a1a50bb..e647c63f 100644 --- a/src/jit/MachPipeline.cpp +++ b/src/jit/MachPipeline.cpp @@ -308,9 +308,11 @@ namespace xo { llvm::Function * MachPipeline::codegen_primitive(ref::brw expr) { - //constexpr bool c_debug_flag = true; + constexpr bool c_debug_flag = true; using xo::scope; + scope log(XO_DEBUG(c_debug_flag)); + /** note: documentation (such as it is) for llvm::Function here: * * https://llvm.org/doxygenL/classllvm_1_1Function.html @@ -359,8 +361,13 @@ namespace xo { if (expr->explicit_symbol_def()) { static llvm::ExitOnError llvm_exit_on_err; - llvm_exit_on_err(this->jit_->intern_symbol(expr->name(), - expr->function_address())); + auto name = expr->name(); + auto fn_addr = expr->function_address(); + + log && log(xtag("sym", name), + xtag("mangled_sym", this->jit_->mangle(name))); + + llvm_exit_on_err(this->jit_->intern_symbol(name, fn_addr)); #ifdef NOT_USING if (!llvm_result) { @@ -373,6 +380,8 @@ namespace xo { return nullptr; } #endif + } else { + log && log("not requiring absolute address", xtag("sym", expr->name())); } #ifdef OBSOLETE @@ -987,17 +996,10 @@ namespace xo { this->recreate_llvm_ir_pipeline(); } /*machgen_current_module*/ - std::string + std::string_view MachPipeline::mangle(const std::string & sym) const { - auto p = this->jit_->mangle(sym); - - if (p) - return (*p).str(); - - throw std::runtime_error(tostr("MachPipeline::mangle" - ": mangle(sym) returned empty pointer", - xtag("sym", sym))); + return this->jit_->mangle(sym); } /*mangle*/ llvm::Expected