BailOutKind.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft Corporation and contributors. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. #if !defined(BAIL_OUT_KIND) || !defined(BAIL_OUT_KIND_LAST) || !defined(BAIL_OUT_KIND_VALUE) || !defined(BAIL_OUT_KIND_VALUE_LAST)
  6. #error BAIL_OUT_KIND, BAIL_OUT_KIND_LAST, BAIL_OUT_KIND_VALUE, and BAIL_OUT_KIND_VALUE_LAST must be defined before including this file.
  7. #endif
  8. /* kind */ /* allowed bits */
  9. BAIL_OUT_KIND(BailOutInvalid, IR::BailOutOnResultConditions | IR::BailOutForArrayBits | IR::BailOutForDebuggerBits | IR::BailOutMarkTempObject)
  10. BAIL_OUT_KIND(BailOutIntOnly, IR::BailOutMarkTempObject)
  11. BAIL_OUT_KIND(BailOutNumberOnly, IR::BailOutMarkTempObject)
  12. BAIL_OUT_KIND(BailOutPrimitiveButString, IR::BailOutMarkTempObject)
  13. BAIL_OUT_KIND(BailOutOnImplicitCalls, IR::BailOutForArrayBits)
  14. BAIL_OUT_KIND(BailOutOnImplicitCallsPreOp, (IR::BailOutOnResultConditions | IR::BailOutForArrayBits | IR::BailOutMarkTempObject) & ~IR::BailOutOnArrayAccessHelperCall )
  15. BAIL_OUT_KIND(BailOutOnNotPrimitive, IR::BailOutMarkTempObject)
  16. BAIL_OUT_KIND(BailOutOnMemOpError, IR::BailOutForArrayBits)
  17. BAIL_OUT_KIND(BailOutOnInlineFunction, 0)
  18. BAIL_OUT_KIND(BailOutOnNoProfile, 0)
  19. BAIL_OUT_KIND(BailOutOnPolymorphicInlineFunction, 0)
  20. BAIL_OUT_KIND(BailOutOnFailedPolymorphicInlineTypeCheck, 0)
  21. BAIL_OUT_KIND(BailOutShared, 0)
  22. BAIL_OUT_KIND(BailOutOnNotArray, IR::BailOutOnMissingValue)
  23. BAIL_OUT_KIND(BailOutOnNotNativeArray, IR::BailOutOnMissingValue)
  24. BAIL_OUT_KIND(BailOutConventionalTypedArrayAccessOnly, IR::BailOutMarkTempObject)
  25. BAIL_OUT_KIND(BailOutOnIrregularLength, IR::BailOutMarkTempObject)
  26. BAIL_OUT_KIND(BailOutCheckThis, 0)
  27. BAIL_OUT_KIND(BailOutOnTaggedValue, 0)
  28. BAIL_OUT_KIND(BailOutFailedTypeCheck, IR::BailOutMarkTempObject)
  29. BAIL_OUT_KIND(BailOutFailedEquivalentTypeCheck, IR::BailOutMarkTempObject)
  30. BAIL_OUT_KIND(BailOutInjected, 0)
  31. BAIL_OUT_KIND(BailOutExpectingInteger, 0)
  32. BAIL_OUT_KIND(BailOutExpectingString, 0)
  33. BAIL_OUT_KIND(BailOutFailedInlineTypeCheck, IR::BailOutMarkTempObject)
  34. BAIL_OUT_KIND(BailOutFailedFixedFieldTypeCheck, IR::BailOutMarkTempObject)
  35. BAIL_OUT_KIND(BailOutFailedFixedFieldCheck, 0)
  36. BAIL_OUT_KIND(BailOutFailedEquivalentFixedFieldTypeCheck, IR::BailOutMarkTempObject)
  37. BAIL_OUT_KIND(BailOutOnFloor, 0)
  38. BAIL_OUT_KIND(BailOnModByPowerOf2, 0)
  39. BAIL_OUT_KIND(BailOnIntMin, 0)
  40. BAIL_OUT_KIND(BailOnDivResultNotInt, IR::BailOutOnDivByZero | IR::BailOutOnDivOfMinInt | IR::BailOutOnNegativeZero)
  41. BAIL_OUT_KIND(BailOnSimpleJitToFullJitLoopBody, 0)
  42. BAIL_OUT_KIND(BailOutFailedCtorGuardCheck, 0)
  43. BAIL_OUT_KIND(BailOutOnFailedHoistedBoundCheck, 0)
  44. BAIL_OUT_KIND(LazyBailOut, 0)
  45. BAIL_OUT_KIND(BailOutOnFailedHoistedLoopCountBasedBoundCheck, 0)
  46. BAIL_OUT_KIND(BailOutForGeneratorYield, 0)
  47. BAIL_OUT_KIND(BailOutOnException, 0)
  48. // SIMD_JS
  49. BAIL_OUT_KIND(BailOutSimd128F4Only, 0)
  50. BAIL_OUT_KIND(BailOutSimd128I4Only, 0)
  51. BAIL_OUT_KIND(BailOutSimd128I8Only, 0)
  52. BAIL_OUT_KIND(BailOutSimd128I16Only, 0)
  53. BAIL_OUT_KIND(BailOutSimd128U4Only, 0)
  54. BAIL_OUT_KIND(BailOutSimd128U8Only, 0)
  55. BAIL_OUT_KIND(BailOutSimd128U16Only, 0)
  56. BAIL_OUT_KIND(BailOutSimd128B4Only, 0)
  57. BAIL_OUT_KIND(BailOutSimd128B8Only, 0)
  58. BAIL_OUT_KIND(BailOutSimd128B16Only, 0)
  59. BAIL_OUT_KIND(BailOutSimd128D2Only, 0)
  60. BAIL_OUT_KIND(BailOutNoSimdTypeSpec, 0)
  61. BAIL_OUT_KIND(BailOutKindEnd, 0)
  62. // One bailout instruction can have multiple of the following reasons for bailout combined with any of the above. These tell
  63. // what additional checks must be done to determine whether to bail out.
  64. BAIL_OUT_KIND(BailOutKindBitsStart, 0) // fake bail out kind to indicate start index for kinds below
  65. #define BAIL_OUT_KIND_BIT_START 10 // We can have 2^10 or 1024 bailout condition above
  66. // ======================
  67. // Result condition bits
  68. // ======================
  69. #define BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START BAIL_OUT_KIND_BIT_START
  70. BAIL_OUT_KIND_VALUE(BailOutOnOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 0))
  71. BAIL_OUT_KIND_VALUE(BailOutOnMulOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 1))
  72. BAIL_OUT_KIND_VALUE(BailOutOnNegativeZero, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 2))
  73. BAIL_OUT_KIND_VALUE(BailOutOnPowIntIntOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 3))
  74. BAIL_OUT_KIND_VALUE(BailOutOnResultConditions, BailOutOnOverflow | BailOutOnMulOverflow | BailOutOnNegativeZero | BailOutOnPowIntIntOverflow)
  75. // ================
  76. // Array bits
  77. // ================
  78. #define BAIL_OUT_KIND_ARRAY_BIT_START BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 4
  79. BAIL_OUT_KIND_VALUE(BailOutOnMissingValue, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 0))
  80. BAIL_OUT_KIND_VALUE(BailOutConventionalNativeArrayAccessOnly, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 1))
  81. BAIL_OUT_KIND_VALUE(BailOutConvertedNativeArray, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 2))
  82. BAIL_OUT_KIND_VALUE(BailOutOnArrayAccessHelperCall, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 3))
  83. BAIL_OUT_KIND_VALUE(BailOutOnInvalidatedArrayHeadSegment, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 4))
  84. BAIL_OUT_KIND_VALUE(BailOutOnInvalidatedArrayLength, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 5))
  85. BAIL_OUT_KIND_VALUE(BailOnStackArgsOutOfActualsRange, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 6))
  86. BAIL_OUT_KIND_VALUE(
  87. BailOutForArrayBits,
  88. (
  89. BailOutOnMissingValue |
  90. BailOutConventionalNativeArrayAccessOnly |
  91. BailOutConvertedNativeArray |
  92. BailOutOnArrayAccessHelperCall |
  93. BailOutOnInvalidatedArrayHeadSegment |
  94. BailOutOnInvalidatedArrayLength |
  95. BailOnStackArgsOutOfActualsRange
  96. ))
  97. // ================
  98. // Debug bits
  99. // ================
  100. #define BAIL_OUT_KIND_DEBUG_BIT_START BAIL_OUT_KIND_ARRAY_BIT_START + 7
  101. // Forced bailout by ThreadContext::m_forceInterpreter, e.g. for async break when we enter a function.
  102. BAIL_OUT_KIND_VALUE(BailOutForceByFlag, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 0))
  103. // When a function has a breakpoint, we need to bail out when we enter/return back to it.
  104. BAIL_OUT_KIND_VALUE(BailOutBreakPointInFunction, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 1))
  105. // Used for stepping/on return from func. Bails out when current frame addr is greater than DebuggingFlags.m_stepEffectiveFrameBase.
  106. BAIL_OUT_KIND_VALUE(BailOutStackFrameBase, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 2))
  107. // When we return to a frame in which a value of a local was changed.
  108. BAIL_OUT_KIND_VALUE(BailOutLocalValueChanged, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 3))
  109. // Unconditional bailout, e.g. for the 'debugger' statement.
  110. BAIL_OUT_KIND_VALUE(BailOutExplicit, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 4))
  111. BAIL_OUT_KIND_VALUE(BailOutStep, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 5))
  112. BAIL_OUT_KIND_VALUE(BailOutIgnoreException, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 6))
  113. BAIL_OUT_KIND_VALUE(BailOutForDebuggerBits, BailOutForceByFlag | BailOutBreakPointInFunction | BailOutStackFrameBase |
  114. BailOutLocalValueChanged | BailOutExplicit | BailOutStep | BailOutIgnoreException)
  115. // ======================
  116. // Div Src Condition Bits
  117. // ======================
  118. #define BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START BAIL_OUT_KIND_DEBUG_BIT_START + 7
  119. BAIL_OUT_KIND_VALUE(BailOutOnDivByZero, 1 << (BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START + 0))
  120. BAIL_OUT_KIND_VALUE(BailOutOnDivOfMinInt, 1 << (BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START + 1))
  121. BAIL_OUT_KIND_VALUE(BailOutOnDivSrcConditions, BailOutOnDivByZero | BailOutOnDivOfMinInt)
  122. #define BAIL_OUT_KIND_MISC_BIT_START BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START + 2
  123. BAIL_OUT_KIND_VALUE(BailOutMarkTempObject, 1 << (BAIL_OUT_KIND_MISC_BIT_START + 0))
  124. BAIL_OUT_KIND_VALUE_LAST(BailOutKindBits, BailOutMarkTempObject | BailOutOnDivSrcConditions | BailOutOnResultConditions | BailOutForArrayBits | BailOutForDebuggerBits)
  125. // Help caller undefine the macros
  126. #undef BAIL_OUT_KIND_LAST
  127. #undef BAIL_OUT_KIND
  128. #undef BAIL_OUT_KIND_VALUE_LAST
  129. #undef BAIL_OUT_KIND_VALUE