#pragma once #include "stdafx.h" #include #include #include "DebugTypes.h" class Debugger; class MemoryManager; struct ProfiledFunction { uint64_t ExclusiveCycles = 0; uint64_t InclusiveCycles = 0; uint64_t CallCount = 0; uint64_t MinCycles = UINT64_MAX; uint64_t MaxCycles = 0; AddressInfo Address; }; class Profiler { private: static constexpr int32_t ResetFunctionIndex = -1; Debugger* _debugger; MemoryManager* _memoryManager; unordered_map _functions; deque _functionStack; deque _stackFlags; std::stack _cycleCountStack; uint64_t _currentCycleCount; uint64_t _prevMasterClock; int32_t _currentFunction; void InternalReset(); void UpdateCycles(); public: Profiler(Debugger* debugger); ~Profiler(); void StackFunction(AddressInfo& addr, StackFrameFlags stackFlag); void UnstackFunction(); void Reset(); void GetProfilerData(ProfiledFunction* profilerData, uint32_t& functionCount); };