JITTimePolymorphicInlineCacheInfo.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. JITTimePolymorphicInlineCacheInfo::InitializePolymorphicInlineCacheInfo(recycler, inlineeInfo, &inlineeInfoIDL[i]);
  35. ++i;
  36. }
  37. Assert(i == inlineeList->Count());
  38. }
  39. jitInfo->inlineeInfoCount = inlineeList->Count();
  40. jitInfo->selfInfo = selfInfoIDL;
  41. jitInfo->inlineeInfo = inlineeInfoIDL;
  42. }
  43. /* static */
  44. void
  45. JITTimePolymorphicInlineCacheInfo::InitializePolymorphicInlineCacheInfo(
  46. __in Recycler * recycler,
  47. __in Js::PolymorphicInlineCacheInfo * runtimeInfo,
  48. __out PolymorphicInlineCacheInfoIDL * jitInfo)
  49. {
  50. jitInfo->polymorphicCacheUtilizationArray = runtimeInfo->GetUtilByteArray();
  51. jitInfo->functionBodyAddr = (intptr_t)runtimeInfo->GetFunctionBody();
  52. if (runtimeInfo->GetPolymorphicInlineCaches()->HasInlineCaches())
  53. {
  54. jitInfo->polymorphicInlineCacheCount = runtimeInfo->GetFunctionBody()->GetInlineCacheCount();
  55. jitInfo->polymorphicInlineCaches = RecyclerNewArrayZ(recycler, PolymorphicInlineCacheIDL, jitInfo->polymorphicInlineCacheCount);
  56. for (uint j = 0; j < jitInfo->polymorphicInlineCacheCount; ++j)
  57. {
  58. Js::PolymorphicInlineCache * pic = runtimeInfo->GetPolymorphicInlineCaches()->GetInlineCache(j);
  59. if (pic != nullptr)
  60. {
  61. jitInfo->polymorphicInlineCaches[j].size = pic->GetSize();
  62. jitInfo->polymorphicInlineCaches[j].addr = (intptr_t)pic;
  63. jitInfo->polymorphicInlineCaches[j].inlineCachesAddr = (intptr_t)pic->GetInlineCaches();
  64. }
  65. }
  66. }
  67. }
  68. JITTimePolymorphicInlineCache *
  69. JITTimePolymorphicInlineCacheInfo::GetInlineCache(uint index) const
  70. {
  71. Assert(index < m_data.polymorphicInlineCacheCount);
  72. if (!m_data.polymorphicInlineCaches[index].addr)
  73. {
  74. return nullptr;
  75. }
  76. return (JITTimePolymorphicInlineCache *)&m_data.polymorphicInlineCaches[index];
  77. }
  78. bool
  79. JITTimePolymorphicInlineCacheInfo::HasInlineCaches() const
  80. {
  81. return m_data.polymorphicInlineCacheCount != 0;
  82. }
  83. byte
  84. JITTimePolymorphicInlineCacheInfo::GetUtil(uint index) const
  85. {
  86. Assert(index < m_data.polymorphicInlineCacheCount);
  87. return m_data.polymorphicCacheUtilizationArray[index];
  88. }