blob: 7939df0b75024f5b0aa8d13a4cc77481480b260a [file] [log] [blame]
//-------------------------------------------------------------------------------------------------------
// Copyright (C) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
//-------------------------------------------------------------------------------------------------------
#include "Backend.h"
JITTimePolymorphicInlineCacheInfo::JITTimePolymorphicInlineCacheInfo()
{
CompileAssert(sizeof(JITTimePolymorphicInlineCacheInfo) == sizeof(PolymorphicInlineCacheInfoIDL));
}
/* static */
void
JITTimePolymorphicInlineCacheInfo::InitializeEntryPointPolymorphicInlineCacheInfo(
__in Recycler * recycler,
__in Js::EntryPointPolymorphicInlineCacheInfo * runtimeInfo,
__out CodeGenWorkItemIDL * jitInfo)
{
if (runtimeInfo == nullptr)
{
return;
}
Js::PolymorphicInlineCacheInfo * selfInfo = runtimeInfo->GetSelfInfo();
SListCounted<Js::PolymorphicInlineCacheInfo*, Recycler> * inlineeList = runtimeInfo->GetInlineeInfo();
PolymorphicInlineCacheInfoIDL* selfInfoIDL = RecyclerNewStructZ(recycler, PolymorphicInlineCacheInfoIDL);
PolymorphicInlineCacheInfoIDL* inlineeInfoIDL = nullptr;
JITTimePolymorphicInlineCacheInfo::InitializePolymorphicInlineCacheInfo(recycler, selfInfo, selfInfoIDL);
if (!inlineeList->Empty())
{
const uint inlineeCount = inlineeList->Count();
inlineeInfoIDL = RecyclerNewArray(recycler, PolymorphicInlineCacheInfoIDL, inlineeCount);
SListCounted<Js::PolymorphicInlineCacheInfo*, Recycler>::Iterator iter(inlineeList);
uint i = 0;
while (iter.Next())
{
Js::PolymorphicInlineCacheInfo * inlineeInfo = iter.Data();
__analysis_assume(i < inlineeCount);
JITTimePolymorphicInlineCacheInfo::InitializePolymorphicInlineCacheInfo(recycler, inlineeInfo, &inlineeInfoIDL[i]);
++i;
}
Assert(i == inlineeCount);
}
jitInfo->inlineeInfoCount = inlineeList->Count();
jitInfo->selfInfo = selfInfoIDL;
jitInfo->inlineeInfo = inlineeInfoIDL;
}
/* static */
void
JITTimePolymorphicInlineCacheInfo::InitializePolymorphicInlineCacheInfo(
__in Recycler * recycler,
__in Js::PolymorphicInlineCacheInfo * runtimeInfo,
__out PolymorphicInlineCacheInfoIDL * jitInfo)
{
#pragma warning(suppress: 6001)
jitInfo->polymorphicCacheUtilizationArray = runtimeInfo->GetUtilByteArray();
jitInfo->functionBodyAddr = runtimeInfo->GetFunctionBody();
if (runtimeInfo->GetPolymorphicInlineCaches()->HasInlineCaches())
{
jitInfo->polymorphicInlineCacheCount = runtimeInfo->GetFunctionBody()->GetInlineCacheCount();
jitInfo->polymorphicInlineCaches = RecyclerNewArrayZ(recycler, PolymorphicInlineCacheIDL, jitInfo->polymorphicInlineCacheCount);
for (uint j = 0; j < jitInfo->polymorphicInlineCacheCount; ++j)
{
Js::PolymorphicInlineCache * pic = runtimeInfo->GetPolymorphicInlineCaches()->GetInlineCache(j);
if (pic != nullptr)
{
jitInfo->polymorphicInlineCaches[j].size = pic->GetSize();
jitInfo->polymorphicInlineCaches[j].addr = pic;
jitInfo->polymorphicInlineCaches[j].inlineCachesAddr = (intptr_t)pic->GetInlineCaches();
}
}
}
}
JITTimePolymorphicInlineCache *
JITTimePolymorphicInlineCacheInfo::GetInlineCache(uint index) const
{
Assert(index < m_data.polymorphicInlineCacheCount);
if (!m_data.polymorphicInlineCaches[index].addr)
{
return nullptr;
}
return (JITTimePolymorphicInlineCache *)&m_data.polymorphicInlineCaches[index];
}
bool
JITTimePolymorphicInlineCacheInfo::HasInlineCaches() const
{
return m_data.polymorphicInlineCacheCount != 0;
}
byte
JITTimePolymorphicInlineCacheInfo::GetUtil(uint index) const
{
Assert(index < m_data.polymorphicInlineCacheCount);
return m_data.polymorphicCacheUtilizationArray[index];
}