2022-09-26 15:12:13 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
2022-10-01 02:04:57 -04:00
|
|
|
#include "MuR/CodeVisitor.h"
|
2022-09-26 15:12:13 -04:00
|
|
|
|
2022-10-02 10:56:02 -04:00
|
|
|
#include "HAL/PlatformCrt.h"
|
2022-10-01 02:04:57 -04:00
|
|
|
#include "MuR/MutableTrace.h"
|
2022-10-02 10:56:02 -04:00
|
|
|
|
2022-09-27 08:28:56 -04:00
|
|
|
namespace mu
|
2022-09-26 15:12:13 -04:00
|
|
|
{
|
|
|
|
|
|
2022-09-27 08:28:56 -04:00
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
|
|
|
|
//-------------------------------------------------------------------------------------------------
|
2024-01-18 03:27:38 -05:00
|
|
|
void SubtreeParametersVisitor::Run(OP::ADDRESS Root, const FProgram& Program)
|
2022-09-27 08:28:56 -04:00
|
|
|
{
|
|
|
|
|
// Cached?
|
2024-01-18 03:27:38 -05:00
|
|
|
TArray<int32>* it = ResultCache.Find(Root);
|
2022-10-11 05:14:05 -04:00
|
|
|
if (it)
|
2022-09-27 08:28:56 -04:00
|
|
|
{
|
2024-01-18 03:27:38 -05:00
|
|
|
RelevantParams = *it;
|
2022-09-27 08:28:56 -04:00
|
|
|
return;
|
|
|
|
|
}
|
2022-09-26 15:12:13 -04:00
|
|
|
|
2022-09-27 08:28:56 -04:00
|
|
|
// Not cached
|
2024-01-18 03:27:38 -05:00
|
|
|
MUTABLE_CPUPROFILER_SCOPE(SubtreeParametersVisitor);
|
|
|
|
|
|
|
|
|
|
Visited.SetNum(Program.m_opAddress.Num());
|
|
|
|
|
if (Program.m_opAddress.Num())
|
2022-09-27 08:28:56 -04:00
|
|
|
{
|
2024-01-18 03:27:38 -05:00
|
|
|
FMemory::Memzero(&Visited[0], Visited.Num());
|
2022-09-27 08:28:56 -04:00
|
|
|
}
|
2024-01-18 03:27:38 -05:00
|
|
|
|
|
|
|
|
CurrentParams.SetNum(Program.m_parameters.Num());
|
|
|
|
|
if (CurrentParams.Num())
|
|
|
|
|
{
|
|
|
|
|
FMemory::Memzero(CurrentParams.GetData(), CurrentParams.GetAllocatedSize());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Pending.Reserve(Program.m_opAddress.Num() / 4);
|
|
|
|
|
Pending.Add(Root);
|
|
|
|
|
|
|
|
|
|
while (Pending.Num())
|
|
|
|
|
{
|
|
|
|
|
OP::ADDRESS at = Pending.Pop();
|
|
|
|
|
|
|
|
|
|
if (!Visited[at])
|
|
|
|
|
{
|
|
|
|
|
Visited[at] = true;
|
|
|
|
|
|
|
|
|
|
switch (Program.GetOpType(at))
|
|
|
|
|
{
|
|
|
|
|
case OP_TYPE::NU_PARAMETER:
|
|
|
|
|
case OP_TYPE::SC_PARAMETER:
|
|
|
|
|
case OP_TYPE::BO_PARAMETER:
|
|
|
|
|
case OP_TYPE::CO_PARAMETER:
|
|
|
|
|
case OP_TYPE::PR_PARAMETER:
|
|
|
|
|
case OP_TYPE::IM_PARAMETER:
|
|
|
|
|
case OP_TYPE::ST_PARAMETER:
|
|
|
|
|
CurrentParams[Program.GetOpArgs<OP::ParameterArgs>(at).variable]++;
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ForEachReference(Program, at, [&](OP::ADDRESS ref)
|
|
|
|
|
{
|
|
|
|
|
if (ref)
|
|
|
|
|
{
|
|
|
|
|
Pending.Add(ref);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Build result
|
|
|
|
|
RelevantParams.Empty();
|
|
|
|
|
for (int32 i = 0; i < CurrentParams.Num(); ++i)
|
|
|
|
|
{
|
|
|
|
|
if (CurrentParams[i])
|
|
|
|
|
{
|
|
|
|
|
RelevantParams.Add(i);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ResultCache.Add(Root, RelevantParams);
|
2022-09-27 08:28:56 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|