JITTimePolymorphicInlineCacheInfo.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #include "Backend.h"
  6. JITTimePolymorphicInlineCacheInfo::JITTimePolymorphicInlineCacheInfo()
  7. {
  8. CompileAssert(sizeof(JITTimePolymorphicInlineCacheInfo) == sizeof(PolymorphicInlineCacheInfoIDL));
  9. }
  10. /* static */
  11. void
  12. JITTimePolymorphicInlineCacheInfo::InitializeEntryPointPolymorphicInlineCacheInfo(
  13. __in Recycler * recycler,
  14. __in Js::EntryPointPolymorphicInlineCacheInfo * runtimeInfo,
  15. __out CodeGenWorkItemIDL * jitInfo)
  16. {
  17. if (runtimeInfo == nullptr)
  18. {
  19. return;
  20. }
  21. Js::PolymorphicInlineCacheInfo * selfInfo = runtimeInfo->GetSelfInfo();
  22. SListCounted<Js::PolymorphicInlineCacheInfo*, Recycler> * inlineeList = runtimeInfo->GetInlineeInfo();
  23. PolymorphicInlineCacheInfoIDL* selfInfoIDL = RecyclerNewStructZ(recycler, PolymorphicInlineCacheInfoIDL);
  24. PolymorphicInlineCacheInfoIDL* inlineeInfoIDL = nullptr;
  25. JITTimePolymorphicInlineCacheInfo::InitializePolymorphicInlineCacheInfo(recycler, selfInfo, selfInfoIDL);
  26. if (!inlineeList->Empty())
  27. {
  28. inlineeInfoIDL = RecyclerNewArray(recycler, PolymorphicInlineCacheInfoIDL, inlineeList->Count());
  29. SListCounted<Js::PolymorphicInlineCacheInfo*, Recycler>::Iterator iter(inlineeList);
  30. uint i = 0;
  31. while (iter.Next())
  32. {
  33. Js::PolymorphicInlineCacheInfo * inlineeInfo = iter.Data();
  34. __analysis_assume(i < inlineeList->Count());
  35. JITTimePolymorphicInlineCacheInfo::InitializePolymorphicInlineCacheInfo(recycler, inlineeInfo, &inlineeInfoIDL[i]);
  36. ++i;
  37. }
  38. Assert(i == inlineeList->Count());
  39. }
  40. jitInfo->inlineeInfoCount = inlineeList->Count();
  41. jitInfo->selfInfo = selfInfoIDL;
  42. jitInfo->inlineeInfo = inlineeInfoIDL;
  43. }
  44. /* static */
  45. void
  46. JITTimePolymorphicInlineCacheInfo::InitializePolymorphicInlineCacheInfo(
  47. __in Recycler * recycler,
  48. __in Js::PolymorphicInlineCacheInfo * runtimeInfo,
  49. __out PolymorphicInlineCacheInfoIDL * jitInfo)
  50. {
  51. #pragma warning(suppress: 6001)
  52. jitInfo->polymorphicCacheUtilizationArray = runtimeInfo->GetUtilByteArray();
  53. jitInfo->functionBodyAddr = runtimeInfo->GetFunctionBody();
  54. if (runtimeInfo->GetPolymorphicInlineCaches()->HasInlineCaches())
  55. {
  56. jitInfo->polymorphicInlineCacheCount = runtimeInfo->GetFunctionBody()->GetInlineCacheCount();
  57. jitInfo->polymorphicInlineCaches = RecyclerNewArrayZ(recycler, PolymorphicInlineCacheIDL, jitInfo->polymorphicInlineCacheCount);
  58. for (uint j = 0; j < jitInfo->polymorphicInlineCacheCount; ++j)
  59. {
  60. Js::PolymorphicInlineCache * pic = runtimeInfo->GetPolymorphicInlineCaches()->GetInlineCache(j);
  61. if (pic != nullptr)
  62. {
  63. jitInfo->polymorphicInlineCaches[j].size = pic->GetSize();
  64. jitInfo->polymorphicInlineCaches[j].addr = pic;
  65. jitInfo->polymorphicInlineCaches[j].inlineCachesAddr = (intptr_t)pic->GetInlineCaches();
  66. }
  67. }
  68. }
  69. }
  70. JITTimePolymorphicInlineCache *
  71. JITTimePolymorphicInlineCacheInfo::GetInlineCache(uint index) const
  72. {
  73. Assert(index < m_data.polymorphicInlineCacheCount);
  74. if (!m_data.polymorphicInlineCaches[index].addr)
  75. {
  76. return nullptr;
  77. }
  78. return (JITTimePolymorphicInlineCache *)&m_data.polymorphicInlineCaches[index];
  79. }
  80. bool
  81. JITTimePolymorphicInlineCacheInfo::HasInlineCaches() const
  82. {
  83. return m_data.polymorphicInlineCacheCount != 0;
  84. }
  85. byte
  86. JITTimePolymorphicInlineCacheInfo::GetUtil(uint index) const
  87. {
  88. Assert(index < m_data.polymorphicInlineCacheCount);
  89. return m_data.polymorphicCacheUtilizationArray[index];
  90. }