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