BailOutKind.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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 | IR::LazyBailOut)
  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 | IR::LazyBailOut)
  14. BAIL_OUT_KIND(BailOutOnImplicitCallsPreOp, (IR::BailOutOnResultConditions | IR::BailOutForArrayBits | IR::BailOutMarkTempObject | IR::LazyBailOut) & ~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 | IR::LazyBailOut)
  23. BAIL_OUT_KIND(BailOutOnNotNativeArray, IR::BailOutOnMissingValue | IR::LazyBailOut)
  24. BAIL_OUT_KIND(BailOutConventionalTypedArrayAccessOnly, IR::BailOutMarkTempObject | IR::LazyBailOut)
  25. BAIL_OUT_KIND(BailOutOnIrregularLength, IR::BailOutMarkTempObject | IR::LazyBailOut)
  26. BAIL_OUT_KIND(BailOutCheckThis, 0)
  27. BAIL_OUT_KIND(BailOutOnTaggedValue, 0)
  28. BAIL_OUT_KIND(BailOutFailedTypeCheck, IR::BailOutMarkTempObject | IR::LazyBailOut)
  29. BAIL_OUT_KIND(BailOutFailedEquivalentTypeCheck, IR::BailOutMarkTempObject | IR::LazyBailOut)
  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 | IR::LazyBailOut)
  35. BAIL_OUT_KIND(BailOutFailedFixedFieldCheck, IR::LazyBailOut)
  36. BAIL_OUT_KIND(BailOutFailedEquivalentFixedFieldTypeCheck, IR::BailOutMarkTempObject | IR::LazyBailOut)
  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(BailOutOnFailedHoistedLoopCountBasedBoundCheck, 0)
  45. BAIL_OUT_KIND(BailOutForGeneratorYield, 0)
  46. BAIL_OUT_KIND(BailOutOnException, 0)
  47. BAIL_OUT_KIND(BailOutOnEarlyExit, 0)
  48. BAIL_OUT_KIND(BailOutKindEnd, 0)
  49. // One bailout instruction can have multiple of the following reasons for bailout combined with any of the above. These tell
  50. // what additional checks must be done to determine whether to bail out.
  51. BAIL_OUT_KIND(BailOutKindBitsStart, 0) // fake bail out kind to indicate start index for kinds below
  52. #define BAIL_OUT_KIND_BIT_START 10 // We can have 2^10 or 1024 bailout condition above
  53. // ======================
  54. // Result condition bits
  55. // ======================
  56. #define BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START BAIL_OUT_KIND_BIT_START
  57. BAIL_OUT_KIND_VALUE(BailOutOnOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 0))
  58. BAIL_OUT_KIND_VALUE(BailOutOnMulOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 1))
  59. BAIL_OUT_KIND_VALUE(BailOutOnNegativeZero, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 2))
  60. BAIL_OUT_KIND_VALUE(BailOutOnPowIntIntOverflow, 1 << (BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 3))
  61. BAIL_OUT_KIND_VALUE(BailOutOnResultConditions, BailOutOnOverflow | BailOutOnMulOverflow | BailOutOnNegativeZero | BailOutOnPowIntIntOverflow)
  62. // ================
  63. // Array bits
  64. // ================
  65. #define BAIL_OUT_KIND_ARRAY_BIT_START BAIL_OUT_KIND_RESULT_CONDITIONS_BIT_START + 4
  66. BAIL_OUT_KIND_VALUE(BailOutOnMissingValue, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 0))
  67. BAIL_OUT_KIND_VALUE(BailOutConventionalNativeArrayAccessOnly, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 1))
  68. BAIL_OUT_KIND_VALUE(BailOutConvertedNativeArray, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 2))
  69. BAIL_OUT_KIND_VALUE(BailOutOnArrayAccessHelperCall, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 3))
  70. BAIL_OUT_KIND_VALUE(BailOutOnInvalidatedArrayHeadSegment, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 4))
  71. BAIL_OUT_KIND_VALUE(BailOutOnInvalidatedArrayLength, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 5))
  72. BAIL_OUT_KIND_VALUE(BailOnStackArgsOutOfActualsRange, 1 << (BAIL_OUT_KIND_ARRAY_BIT_START + 6))
  73. BAIL_OUT_KIND_VALUE( BailOutForArrayBits, ( BailOutOnMissingValue | BailOutConventionalNativeArrayAccessOnly | BailOutConvertedNativeArray | BailOutOnArrayAccessHelperCall | BailOutOnInvalidatedArrayHeadSegment | BailOutOnInvalidatedArrayLength | BailOnStackArgsOutOfActualsRange ))
  74. // ================
  75. // Debug bits
  76. // ================
  77. #define BAIL_OUT_KIND_DEBUG_BIT_START BAIL_OUT_KIND_ARRAY_BIT_START + 7
  78. // Forced bailout by ThreadContext::m_forceInterpreter, e.g. for async break when we enter a function.
  79. BAIL_OUT_KIND_VALUE(BailOutForceByFlag, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 0))
  80. // When a function has a breakpoint, we need to bail out when we enter/return back to it.
  81. BAIL_OUT_KIND_VALUE(BailOutBreakPointInFunction, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 1))
  82. // Used for stepping/on return from func. Bails out when current frame addr is greater than DebuggingFlags.m_stepEffectiveFrameBase.
  83. BAIL_OUT_KIND_VALUE(BailOutStackFrameBase, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 2))
  84. // When we return to a frame in which a value of a local was changed.
  85. BAIL_OUT_KIND_VALUE(BailOutLocalValueChanged, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 3))
  86. // Unconditional bailout, e.g. for the 'debugger' statement.
  87. BAIL_OUT_KIND_VALUE(BailOutExplicit, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 4))
  88. BAIL_OUT_KIND_VALUE(BailOutStep, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 5))
  89. BAIL_OUT_KIND_VALUE(BailOutIgnoreException, 1 << (BAIL_OUT_KIND_DEBUG_BIT_START + 6))
  90. BAIL_OUT_KIND_VALUE(BailOutForDebuggerBits, BailOutForceByFlag | BailOutBreakPointInFunction | BailOutStackFrameBase | BailOutLocalValueChanged | BailOutExplicit | BailOutStep | BailOutIgnoreException)
  91. // ======================
  92. // Div Src Condition Bits
  93. // ======================
  94. #define BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START BAIL_OUT_KIND_DEBUG_BIT_START + 7
  95. BAIL_OUT_KIND_VALUE(BailOutOnDivByZero, 1 << (BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START + 0))
  96. BAIL_OUT_KIND_VALUE(BailOutOnDivOfMinInt, 1 << (BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START + 1))
  97. BAIL_OUT_KIND_VALUE(BailOutOnDivSrcConditions, BailOutOnDivByZero | BailOutOnDivOfMinInt)
  98. #define BAIL_OUT_KIND_MISC_BIT_START BAIL_OUT_KIND_DIV_SRC_CONDITIONS_BIT_START + 2
  99. BAIL_OUT_KIND_VALUE(BailOutMarkTempObject, 1 << (BAIL_OUT_KIND_MISC_BIT_START + 0))
  100. // this is the most significant bit, must cast it to unsigned int so that the compiler knows we are not using a negative number
  101. BAIL_OUT_KIND_VALUE(LazyBailOut, (uint) 1 << (BAIL_OUT_KIND_MISC_BIT_START + 1))
  102. BAIL_OUT_KIND_VALUE(BailOutMisc, BailOutMarkTempObject | LazyBailOut)
  103. BAIL_OUT_KIND_VALUE_LAST(BailOutKindBits, BailOutMisc | BailOutOnDivSrcConditions | BailOutOnResultConditions | BailOutForArrayBits | BailOutForDebuggerBits)
  104. // Help caller undefine the macros
  105. #undef BAIL_OUT_KIND
  106. #undef BAIL_OUT_KIND_VALUE_LAST
  107. #undef BAIL_OUT_KIND_VALUE