CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
80 lines
3.3 KiB
C++
80 lines
3.3 KiB
C++
//===-- 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
|