80 lines
3.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//===-- DynamicLoaderWindowsDYLD.h ------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLDB_SOURCE_PLUGINS_DYNAMICLOADER_WINDOWS_DYLD_DYNAMICLOADERWINDOWSDYLD_H
#define LLDB_SOURCE_PLUGINS_DYNAMICLOADER_WINDOWS_DYLD_DYNAMICLOADERWINDOWSDYLD_H
#include "lldb/Target/DynamicLoader.h"
#include "lldb/lldb-forward.h"
namespace lldb_private {
class DynamicLoaderWindowsDYLD : public DynamicLoader {
public:
DynamicLoaderWindowsDYLD(Process *process);
~DynamicLoaderWindowsDYLD() override;
static void Initialize();
static void Terminate();
static llvm::StringRef GetPluginNameStatic() { return "windows-dyld"; }
static llvm::StringRef GetPluginDescriptionStatic();
static DynamicLoader *CreateInstance(Process *process, bool force);
void OnLoadModule(lldb::ModuleSP module_sp, const ModuleSpec module_spec,
lldb::addr_t module_addr);
void OnUnloadModule(lldb::addr_t module_addr);
void DidAttach() override;
void DidLaunch() override;
Status CanLoadImage() override;
lldb::ThreadPlanSP GetStepThroughTrampolinePlan(Thread &thread,
bool stop) override;
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
protected:
/// Returns the load address for the given executable module.
///
/// The lookup proceeds in two stages:
///
/// 1. **Cache lookup** \c m_loaded_modules is scanned for an existing
/// entry whose \c ModuleSP matches \p executable. Because the same
/// \c ModuleSP can be inserted more than once under different base
/// addresses (e.g. a DLL loaded into several processes, or a module
/// that was unloaded and reloaded at a different address), the scan
/// returns the *first* valid (non-LLDB_INVALID_ADDRESS) entry it
/// finds.
///
/// 2. **Process / platform query** If no cached entry is found,
/// \c Process::GetFileLoadAddress is called. On a remote target the
/// remote platform is responsible for resolving the address. A
/// successful result is inserted into \c m_loaded_modules so that
/// subsequent calls hit the cache.
///
/// \param executable The module whose load address is requested.
/// \return The load address, or \c LLDB_INVALID_ADDRESS if it
/// could not be determined.
lldb::addr_t GetLoadAddress(lldb::ModuleSP executable);
/// Maps load addresses to their corresponding modules.
///
/// Weak pointers are used intentionally: on Windows, a Module holds a
/// memory-mapped view of the DLL file, and an open memory mapping locks
/// the file on disk. Holding a strong reference (ModuleSP) here would
/// prevent the mapping from being released even after the Target drops
/// its own reference, keeping the file locked and blocking recompilation
/// during an active debug session.
llvm::DenseMap<lldb::addr_t, lldb::ModuleWP> m_loaded_modules;
};
} // namespace lldb_private
#endif // LLDB_SOURCE_PLUGINS_DYNAMICLOADER_WINDOWS_DYLD_DYNAMICLOADERWINDOWSDYLD_H