1*5ffd83dbSDimitry Andric //===-- DynamicLoaderWasmDYLD.cpp -----------------------------------------===// 2*5ffd83dbSDimitry Andric // 3*5ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*5ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5ffd83dbSDimitry Andric // 7*5ffd83dbSDimitry Andric //===----------------------------------------------------------------------===// 8*5ffd83dbSDimitry Andric 9*5ffd83dbSDimitry Andric #include "DynamicLoaderWasmDYLD.h" 10*5ffd83dbSDimitry Andric 11*5ffd83dbSDimitry Andric #include "Plugins/ObjectFile/wasm/ObjectFileWasm.h" 12*5ffd83dbSDimitry Andric #include "lldb/Core/Module.h" 13*5ffd83dbSDimitry Andric #include "lldb/Core/PluginManager.h" 14*5ffd83dbSDimitry Andric #include "lldb/Core/Section.h" 15*5ffd83dbSDimitry Andric #include "lldb/Target/Process.h" 16*5ffd83dbSDimitry Andric #include "lldb/Target/Target.h" 17*5ffd83dbSDimitry Andric #include "lldb/Utility/Log.h" 18*5ffd83dbSDimitry Andric 19*5ffd83dbSDimitry Andric using namespace lldb; 20*5ffd83dbSDimitry Andric using namespace lldb_private; 21*5ffd83dbSDimitry Andric using namespace lldb_private::wasm; 22*5ffd83dbSDimitry Andric 23*5ffd83dbSDimitry Andric LLDB_PLUGIN_DEFINE(DynamicLoaderWasmDYLD) 24*5ffd83dbSDimitry Andric 25*5ffd83dbSDimitry Andric DynamicLoaderWasmDYLD::DynamicLoaderWasmDYLD(Process *process) 26*5ffd83dbSDimitry Andric : DynamicLoader(process) {} 27*5ffd83dbSDimitry Andric 28*5ffd83dbSDimitry Andric void DynamicLoaderWasmDYLD::Initialize() { 29*5ffd83dbSDimitry Andric PluginManager::RegisterPlugin(GetPluginNameStatic(), 30*5ffd83dbSDimitry Andric GetPluginDescriptionStatic(), CreateInstance); 31*5ffd83dbSDimitry Andric } 32*5ffd83dbSDimitry Andric 33*5ffd83dbSDimitry Andric ConstString DynamicLoaderWasmDYLD::GetPluginNameStatic() { 34*5ffd83dbSDimitry Andric static ConstString g_plugin_name("wasm-dyld"); 35*5ffd83dbSDimitry Andric return g_plugin_name; 36*5ffd83dbSDimitry Andric } 37*5ffd83dbSDimitry Andric 38*5ffd83dbSDimitry Andric const char *DynamicLoaderWasmDYLD::GetPluginDescriptionStatic() { 39*5ffd83dbSDimitry Andric return "Dynamic loader plug-in that watches for shared library " 40*5ffd83dbSDimitry Andric "loads/unloads in WebAssembly engines."; 41*5ffd83dbSDimitry Andric } 42*5ffd83dbSDimitry Andric 43*5ffd83dbSDimitry Andric DynamicLoader *DynamicLoaderWasmDYLD::CreateInstance(Process *process, 44*5ffd83dbSDimitry Andric bool force) { 45*5ffd83dbSDimitry Andric bool should_create = force; 46*5ffd83dbSDimitry Andric if (!should_create) { 47*5ffd83dbSDimitry Andric should_create = 48*5ffd83dbSDimitry Andric (process->GetTarget().GetArchitecture().GetTriple().getArch() == 49*5ffd83dbSDimitry Andric llvm::Triple::wasm32); 50*5ffd83dbSDimitry Andric } 51*5ffd83dbSDimitry Andric 52*5ffd83dbSDimitry Andric if (should_create) 53*5ffd83dbSDimitry Andric return new DynamicLoaderWasmDYLD(process); 54*5ffd83dbSDimitry Andric 55*5ffd83dbSDimitry Andric return nullptr; 56*5ffd83dbSDimitry Andric } 57*5ffd83dbSDimitry Andric 58*5ffd83dbSDimitry Andric void DynamicLoaderWasmDYLD::DidAttach() { 59*5ffd83dbSDimitry Andric Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER)); 60*5ffd83dbSDimitry Andric LLDB_LOGF(log, "DynamicLoaderWasmDYLD::%s()", __FUNCTION__); 61*5ffd83dbSDimitry Andric 62*5ffd83dbSDimitry Andric // Ask the process for the list of loaded WebAssembly modules. 63*5ffd83dbSDimitry Andric auto error = m_process->LoadModules(); 64*5ffd83dbSDimitry Andric LLDB_LOG_ERROR(log, std::move(error), "Couldn't load modules: {0}"); 65*5ffd83dbSDimitry Andric } 66*5ffd83dbSDimitry Andric 67*5ffd83dbSDimitry Andric ThreadPlanSP DynamicLoaderWasmDYLD::GetStepThroughTrampolinePlan(Thread &thread, 68*5ffd83dbSDimitry Andric bool stop) { 69*5ffd83dbSDimitry Andric return ThreadPlanSP(); 70*5ffd83dbSDimitry Andric } 71