// SPDX-License-Identifier: MIT #pragma once #include #include #include #include #include namespace FEX::VolatileMetadata { struct ExtendedVolatileMetadata { FEXCore::IntervalList VolatileValidRanges; fextl::set VolatileInstructions; bool ModuleTSODisabled; }; fextl::unordered_map ParseExtendedVolatileMetadata(std::string_view ListOfDescriptors); inline void ApplyFEXExtendedVolatileMetadata(FEX::VolatileMetadata::ExtendedVolatileMetadata& ExtendedMetaData, fextl::set& VolatileInstructions, FEXCore::IntervalList& VolatileValidRanges, uint64_t Address, uint64_t EndAddress, uint64_t FileOffset = 0, uint64_t FileOffsetEnd = ~0ULL) { // Load FEX extended volatile metadata. // Walk the volatile instructions first if they exist. for (const auto it_inst : ExtendedMetaData.VolatileInstructions) { const auto inst_address = it_inst + Address; if (inst_address < EndAddress) { VolatileInstructions.emplace(Address + it_inst); } else { LogMan::Msg::DFmt("Volatile instruction 0x{:x} couldn't fit in to module range [0x{:x}, 0x{:x}). Not adding anymore volatile " "instructions. Inspect your config!", inst_address, Address, EndAddress); return; } } // Walk the volatile list for (const auto it_ranges : ExtendedMetaData.VolatileValidRanges) { if (it_ranges.Offset >= FileOffset && it_ranges.End < FileOffsetEnd) { VolatileValidRanges.Insert({Address + it_ranges.Offset - FileOffset, Address + it_ranges.End - FileOffset}); } } // If it is fully disabled, then set the entire module range if (ExtendedMetaData.ModuleTSODisabled) { VolatileValidRanges.Clear(); VolatileValidRanges.Insert({Address, EndAddress}); } } } // namespace FEX::VolatileMetadata