From 5ef3134a4da1b84557ee8cb421352c8dc6e8217e Mon Sep 17 00:00:00 2001 From: Billy Laws Date: Sun, 17 May 2026 22:28:14 +0100 Subject: [PATCH] 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). --- Source/Windows/Common/ImageTracker.cpp | 17 ++++++++++++----- Source/Windows/Common/ImageTracker.h | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Source/Windows/Common/ImageTracker.cpp b/Source/Windows/Common/ImageTracker.cpp index 2c46ac690..02c777416 100644 --- a/Source/Windows/Common/ImageTracker.cpp +++ b/Source/Windows/Common/ImageTracker.cpp @@ -171,8 +171,8 @@ FEXCore::ExecutableFileSectionInfo ImageTracker::HandleImageMap(std::string_view } auto AOTImage = AOTImages.find(ID); - if (AOTImage != AOTImages.end()) { - // TODO: CodeCache::EnableLoadedSection + if (AOTImage != AOTImages.end() && AOTImage->second.CacheFile) { + CTX.GetCodeCache().EnableLoadedSection(nullptr, *AOTImage->second.CacheFile, ImageInfo->SectionInfo); } } @@ -279,9 +279,16 @@ void ImageTracker::LoadAOTImages(MappedImageInfo& ImageInfo) { UniqueId.resize(AnsiLength); RtlUnicodeToMultiByteN(UniqueId.data(), AnsiLength, NULL, Info->FileName, Info->FileNameLength); - AOTImages[UniqueId] = {.Data = static_cast(LoadAddress)}; - // TODO: CodeCache::LoadCache, CodeCache::RegisterMappedCodeBuffer - LogMan::Msg::IFmt("Loaded cache: {}", UniqueId); + auto CacheSpan = std::span {static_cast(LoadAddress), MappedSize}; + auto MappedCache = CTX.GetCodeCache().LoadCache(CacheSpan, ImageInfo.Info, ImageInfo.SectionInfo.FileStartVA); + if (MappedCache) { + CTX.GetCodeCache().RegisterMappedCodeBuffer(*MappedCache); + AOTImages[UniqueId] = {.CacheFile = std::move(MappedCache)}; + LogMan::Msg::IFmt("Loaded cache: {}", UniqueId); + } else { + NtUnmapViewOfSection(NtCurrentProcess(), LoadAddress); + LogMan::Msg::EFmt("Failed to load cache: {}", UniqueId); + } } } } diff --git a/Source/Windows/Common/ImageTracker.h b/Source/Windows/Common/ImageTracker.h index dcbc06d00..438bcbc6f 100644 --- a/Source/Windows/Common/ImageTracker.h +++ b/Source/Windows/Common/ImageTracker.h @@ -56,7 +56,7 @@ private: }; struct AOTImageInfo { - std::byte* Data; + fextl::unique_ptr CacheFile; }; void LoadAOTImages(MappedImageInfo& Info);