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