Files
FEX-Emu--FEX/Source/Windows/Common/ImageTracker.h
T
Billy Laws 5ef3134a4d Windows/ImageTracker: Wire up LoadCache and EnableLoadedSection
The lazy code loading refactor replaced LoadData with the new
LoadCache/EnableLoadedSection API but left the Windows path as TODOs.
Implement the wiring: LoadAOTImages now calls LoadCache +
RegisterMappedCodeBuffer for each mapped cache file, and HandleImageMap
calls EnableLoadedSection (with nullptr thread since lazy mapping is not
yet implemented on Windows).
2026-07-06 14:44:59 +02:00

78 lines
2.2 KiB
C++

// SPDX-License-Identifier: MIT
#pragma once
#include <cstdint>
#include <mutex>
#include <map>
#include <shared_mutex>
#include <string_view>
#include <FEXCore/Utils/CompilerDefs.h>
#include <FEXCore/Config/Config.h>
#include <FEXCore/Core/CodeCache.h>
#include "Common/VolatileMetadata.h"
#include "Module.h"
namespace FEXCore::Core {
struct InternalThreadState;
}
namespace FEXCore::Context {
class Context;
}
namespace FEX::Windows {
#ifdef ARCHITECTURE_arm64ec
using ArchImageNtHeaders = IMAGE_NT_HEADERS64;
using ArchImageLoadConfigDirectory = _IMAGE_LOAD_CONFIG_DIRECTORY64;
#else
using ArchImageNtHeaders = IMAGE_NT_HEADERS32;
using ArchImageLoadConfigDirectory = _IMAGE_LOAD_CONFIG_DIRECTORY32;
#endif
FEXCore::CodeMapFileId ComputeCodeMapId(std::string_view FileName, uint32_t TimeDateStamp, uint32_t SizeOfImage);
/**
* @brief Tracks mapped PE code images and handles their volatile metadata
*/
class ImageTracker : public FEXCore::CodeMapOpener {
public:
ImageTracker(FEXCore::Context::Context& CTX, bool IsGeneratingCache);
FEXCore::ExecutableFileSectionInfo HandleImageMap(std::string_view Path, uint64_t Address, bool MainImage);
void HandleImageUnmap(uint64_t Address, uint64_t Size);
std::optional<FEXCore::ExecutableFileSectionInfo> LookupExecutableFileSection(uint64_t Address);
int OpenCodeMapFile() override;
private:
struct MappedImageInfo {
FEXCore::ExecutableFileInfo Info;
FEXCore::ExecutableFileSectionInfo SectionInfo;
MappedImageInfo(std::string_view Path, uint64_t Address, ArchImageNtHeaders* Nt,
fextl::robin_map<uint32_t, FEXCore::GuestRelocationType> Relocations);
};
struct AOTImageInfo {
fextl::unique_ptr<FEXCore::MappedCodeCacheFile> CacheFile;
};
void LoadAOTImages(MappedImageInfo& Info);
FEXCore::Context::Context& CTX;
FEX_CONFIG_OPT(ExtendedVolatileMetadataConfig, EXTENDEDVOLATILEMETADATA);
fextl::unordered_map<fextl::string, FEX::VolatileMetadata::ExtendedVolatileMetadata> ExtendedMetaData;
std::shared_mutex ImagesLock;
std::map<uint64_t, MappedImageInfo> MappedImages;
std::map<fextl::string, AOTImageInfo> AOTImages;
std::string ActiveCodeMapPath;
bool IsGeneratingCache;
};
} // namespace FEX::Windows