15ffd83dbSDimitry Andric //===-- DynamicLoaderWasmDYLD.cpp -----------------------------------------===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric 
95ffd83dbSDimitry Andric #include "DynamicLoaderWasmDYLD.h"
105ffd83dbSDimitry Andric 
115ffd83dbSDimitry Andric #include "Plugins/ObjectFile/wasm/ObjectFileWasm.h"
125ffd83dbSDimitry Andric #include "lldb/Core/Module.h"
135ffd83dbSDimitry Andric #include "lldb/Core/PluginManager.h"
145ffd83dbSDimitry Andric #include "lldb/Core/Section.h"
155ffd83dbSDimitry Andric #include "lldb/Target/Process.h"
165ffd83dbSDimitry Andric #include "lldb/Target/Target.h"
17*81ad6265SDimitry Andric #include "lldb/Utility/LLDBLog.h"
185ffd83dbSDimitry Andric #include "lldb/Utility/Log.h"
195ffd83dbSDimitry Andric 
205ffd83dbSDimitry Andric using namespace lldb;
215ffd83dbSDimitry Andric using namespace lldb_private;
225ffd83dbSDimitry Andric using namespace lldb_private::wasm;
235ffd83dbSDimitry Andric 
LLDB_PLUGIN_DEFINE(DynamicLoaderWasmDYLD)245ffd83dbSDimitry Andric LLDB_PLUGIN_DEFINE(DynamicLoaderWasmDYLD)
255ffd83dbSDimitry Andric 
265ffd83dbSDimitry Andric DynamicLoaderWasmDYLD::DynamicLoaderWasmDYLD(Process *process)
275ffd83dbSDimitry Andric     : DynamicLoader(process) {}
285ffd83dbSDimitry Andric 
Initialize()295ffd83dbSDimitry Andric void DynamicLoaderWasmDYLD::Initialize() {
305ffd83dbSDimitry Andric   PluginManager::RegisterPlugin(GetPluginNameStatic(),
315ffd83dbSDimitry Andric                                 GetPluginDescriptionStatic(), CreateInstance);
325ffd83dbSDimitry Andric }
335ffd83dbSDimitry Andric 
GetPluginDescriptionStatic()34349cc55cSDimitry Andric llvm::StringRef DynamicLoaderWasmDYLD::GetPluginDescriptionStatic() {
355ffd83dbSDimitry Andric   return "Dynamic loader plug-in that watches for shared library "
365ffd83dbSDimitry Andric          "loads/unloads in WebAssembly engines.";
375ffd83dbSDimitry Andric }
385ffd83dbSDimitry Andric 
CreateInstance(Process * process,bool force)395ffd83dbSDimitry Andric DynamicLoader *DynamicLoaderWasmDYLD::CreateInstance(Process *process,
405ffd83dbSDimitry Andric                                                      bool force) {
415ffd83dbSDimitry Andric   bool should_create = force;
425ffd83dbSDimitry Andric   if (!should_create) {
435ffd83dbSDimitry Andric     should_create =
445ffd83dbSDimitry Andric         (process->GetTarget().GetArchitecture().GetTriple().getArch() ==
455ffd83dbSDimitry Andric          llvm::Triple::wasm32);
465ffd83dbSDimitry Andric   }
475ffd83dbSDimitry Andric 
485ffd83dbSDimitry Andric   if (should_create)
495ffd83dbSDimitry Andric     return new DynamicLoaderWasmDYLD(process);
505ffd83dbSDimitry Andric 
515ffd83dbSDimitry Andric   return nullptr;
525ffd83dbSDimitry Andric }
535ffd83dbSDimitry Andric 
DidAttach()545ffd83dbSDimitry Andric void DynamicLoaderWasmDYLD::DidAttach() {
55*81ad6265SDimitry Andric   Log *log = GetLog(LLDBLog::DynamicLoader);
565ffd83dbSDimitry Andric   LLDB_LOGF(log, "DynamicLoaderWasmDYLD::%s()", __FUNCTION__);
575ffd83dbSDimitry Andric 
585ffd83dbSDimitry Andric   // Ask the process for the list of loaded WebAssembly modules.
595ffd83dbSDimitry Andric   auto error = m_process->LoadModules();
605ffd83dbSDimitry Andric   LLDB_LOG_ERROR(log, std::move(error), "Couldn't load modules: {0}");
615ffd83dbSDimitry Andric }
625ffd83dbSDimitry Andric 
GetStepThroughTrampolinePlan(Thread & thread,bool stop)635ffd83dbSDimitry Andric ThreadPlanSP DynamicLoaderWasmDYLD::GetStepThroughTrampolinePlan(Thread &thread,
645ffd83dbSDimitry Andric                                                                  bool stop) {
655ffd83dbSDimitry Andric   return ThreadPlanSP();
665ffd83dbSDimitry Andric }
67*81ad6265SDimitry Andric 
LoadModuleAtAddress(const lldb_private::FileSpec & file,lldb::addr_t link_map_addr,lldb::addr_t base_addr,bool base_addr_is_offset)68*81ad6265SDimitry Andric lldb::ModuleSP DynamicLoaderWasmDYLD::LoadModuleAtAddress(
69*81ad6265SDimitry Andric     const lldb_private::FileSpec &file, lldb::addr_t link_map_addr,
70*81ad6265SDimitry Andric     lldb::addr_t base_addr, bool base_addr_is_offset) {
71*81ad6265SDimitry Andric   if (ModuleSP module_sp = DynamicLoader::LoadModuleAtAddress(
72*81ad6265SDimitry Andric           file, link_map_addr, base_addr, base_addr_is_offset))
73*81ad6265SDimitry Andric     return module_sp;
74*81ad6265SDimitry Andric 
75*81ad6265SDimitry Andric   if (ModuleSP module_sp = m_process->ReadModuleFromMemory(file, base_addr)) {
76*81ad6265SDimitry Andric     UpdateLoadedSections(module_sp, link_map_addr, base_addr, false);
77*81ad6265SDimitry Andric     m_process->GetTarget().GetImages().AppendIfNeeded(module_sp);
78*81ad6265SDimitry Andric     return module_sp;
79*81ad6265SDimitry Andric   }
80*81ad6265SDimitry Andric 
81*81ad6265SDimitry Andric   return nullptr;
82*81ad6265SDimitry Andric }
83