-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathJITTimePolymorphicInlineCacheInfo.cpp
102 lines (91 loc) · 3.92 KB
/
JITTimePolymorphicInlineCacheInfo.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//-------------------------------------------------------------------------------------------------------
// 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];
}