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