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