BailOutKind.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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_VALUE) || !defined(BAIL_OUT_KIND_VALUE_LAST)
  6. #error BAIL_OUT_KIND, 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. BAIL_OUT_KIND(BailOutOnEarlyExit, 0)
  49. #ifdef ENABLE_SIMDJS
  50. // SIMD_JS
  51. BAIL_OUT_KIND(BailOutSimd128F4Only, 0)
  52. BAIL_OUT_KIND(BailOutSimd128I4Only, 0)
  53. BAIL_OUT_KIND(BailOutSimd128I8Only, 0)
  54. BAIL_OUT_KIND(BailOutSimd128I16Only, 0)
  55. BAIL_OUT_KIND(BailOutSimd128U4Only, 0)
  56. BAIL_OUT_KIND(BailOutSimd128U8Only, 0)
  57. BAIL_OUT_KIND(BailOutSimd128U16Only, 0)
  58. BAIL_OUT_KIND(BailOutSimd128B4Only, 0)
  59. BAIL_OUT_KIND(BailOutSimd128B8Only, 0)
  60. BAIL_OUT_KIND(BailOutSimd128B16Only, 0)
  61. BAIL_OUT_KIND(BailOutSimd128D2Only, 0)
  62. BAIL_OUT_KIND(BailOutNoSimdTypeSpec, 0)
  63. #endif
  64. BAIL_OUT_KIND(BailOutKindEnd, 0)
  65. // One bailout instruction can have multiple of the following reasons for bailout combined with any of the above. These tell
  66. // what additional checks must be done to determine whether to bail out.
  67. BAIL_OUT_KIND(BailOutKindBitsStart, 0) // fake bail out kind to indicate start index for kinds below
  68. #define BAIL_OUT_KIND_BIT_START 10 // We can have 2^10 or 1024 bailout condition above
  69. // ======================
  70. // Result condition bits
  71. // ======================
  72. #define BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START BAIL_OUT_KIND_BIT_START
  73. BAIL_OUT_KIND_VALUE(BailOutOnOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 0))
  74. BAIL_OUT_KIND_VALUE(BailOutOnMulOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 1))
  75. BAIL_OUT_KIND_VALUE(BailOutOnNegativeZero, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 2))
  76. BAIL_OUT_KIND_VALUE(BailOutOnPowIntIntOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 3))
  77. BAIL_OUT_KIND_VALUE(BailOutOnResultConditions, BailOutOnOverflow | BailOutOnMulOverflow | BailOutOnNegativeZero | BailOutOnPowIntIntOverflow)
  78. // ================
  79. // Array bits
  80. // ================
  81. #define BAIL_OUT_KIND_ARRAY_BIT_START BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 4
  82. BAIL_OUT_KIND_VALUE(BailOutOnMissingValue, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 0))
  83. BAIL_OUT_KIND_VALUE(BailOutConventionalNativeArrayAccessOnly, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 1))
  84. BAIL_OUT_KIND_VALUE(BailOutConvertedNativeArray, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 2))
  85. BAIL_OUT_KIND_VALUE(BailOutOnArrayAccessHelperCall, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 3))
  86. BAIL_OUT_KIND_VALUE(BailOutOnInvalidatedArrayHeadSegment, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 4))
  87. BAIL_OUT_KIND_VALUE(BailOutOnInvalidatedArrayLength, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 5))
  88. BAIL_OUT_KIND_VALUE(BailOnStackArgsOutOfActualsRange, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 6))
  89. BAIL_OUT_KIND_VALUE( BailOutForArrayBits, ( BailOutOnMissingValue | BailOutConventionalNativeArrayAccessOnly | BailOutConvertedNativeArray | BailOutOnArrayAccessHelperCall | BailOutOnInvalidatedArrayHeadSegment | BailOutOnInvalidatedArrayLength | BailOnStackArgsOutOfActualsRange ))
  90. // ================
  91. // Debug bits
  92. // ================
  93. #define BAIL_OUT_KIND_DEBUG_BIT_START BAIL_OUT_KIND_ARRAY_BIT_START + 7
  94. // Forced bailout by ThreadContext::m_forceInterpreter, e.g. for async break when we enter a function.
  95. BAIL_OUT_KIND_VALUE(BailOutForceByFlag, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 0))
  96. // When a function has a breakpoint, we need to bail out when we enter/return back to it.
  97. BAIL_OUT_KIND_VALUE(BailOutBreakPointInFunction, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 1))
  98. // Used for stepping/on return from func. Bails out when current frame addr is greater than DebuggingFlags.m_stepEffectiveFrameBase.
  99. BAIL_OUT_KIND_VALUE(BailOutStackFrameBase, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 2))
  100. // When we return to a frame in which a value of a local was changed.
  101. BAIL_OUT_KIND_VALUE(BailOutLocalValueChanged, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 3))
  102. // Unconditional bailout, e.g. for the 'debugger' statement.
  103. BAIL_OUT_KIND_VALUE(BailOutExplicit, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 4))
  104. BAIL_OUT_KIND_VALUE(BailOutStep, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 5))
  105. BAIL_OUT_KIND_VALUE(BailOutIgnoreException, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 6))
  106. BAIL_OUT_KIND_VALUE(BailOutForDebuggerBits, BailOutForceByFlag | BailOutBreakPointInFunction | BailOutStackFrameBase | BailOutLocalValueChanged | BailOutExplicit | BailOutStep | BailOutIgnoreException)
  107. // ======================
  108. // Div Src Condition Bits
  109. // ======================
  110. #define BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START BAIL_OUT_KIND_DEBUG_BIT_START + 7
  111. BAIL_OUT_KIND_VALUE(BailOutOnDivByZero, 1 << (BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START + 0))
  112. BAIL_OUT_KIND_VALUE(BailOutOnDivOfMinInt, 1 << (BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START + 1))
  113. BAIL_OUT_KIND_VALUE(BailOutOnDivSrcConditions, BailOutOnDivByZero | BailOutOnDivOfMinInt)
  114. #define BAIL_OUT_KIND_MISC_BIT_START BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START + 2
  115. BAIL_OUT_KIND_VALUE(BailOutMarkTempObject, 1 << (BAIL_OUT_KIND_MISC_BIT_START + 0))
  116. BAIL_OUT_KIND_VALUE_LAST(BailOutKindBits, BailOutMarkTempObject | BailOutOnDivSrcConditions | BailOutOnResultConditions | BailOutForArrayBits | BailOutForDebuggerBits)
  117. // Help caller undefine the macros
  118. #undef BAIL_OUT_KIND
  119. #undef BAIL_OUT_KIND_VALUE_LAST
  120. #undef BAIL_OUT_KIND_VALUE