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