1/* 2 * Copyright (C) 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef DFGOSRExit_h 27#define DFGOSRExit_h 28 29#include <wtf/Platform.h> 30 31#if ENABLE(DFG_JIT) 32 33#include "CodeOrigin.h" 34#include "DFGCommon.h" 35#include "DFGExitProfile.h" 36#include "DFGGPRInfo.h" 37#include "DFGValueRecoveryOverride.h" 38#include "MacroAssembler.h" 39#include "MethodOfGettingAValueProfile.h" 40#include "Operands.h" 41#include "ValueProfile.h" 42#include "ValueRecovery.h" 43#include <wtf/Vector.h> 44 45namespace JSC { namespace DFG { 46 47class SpeculativeJIT; 48 49// This enum describes the types of additional recovery that 50// may need be performed should a speculation check fail. 51enum SpeculationRecoveryType { 52 SpeculativeAdd, 53 BooleanSpeculationCheck 54}; 55 56// === SpeculationRecovery === 57// 58// This class provides additional information that may be associated with a 59// speculation check - for example 60class SpeculationRecovery { 61public: 62 SpeculationRecovery(SpeculationRecoveryType type, GPRReg dest, GPRReg src) 63 : m_type(type) 64 , m_dest(dest) 65 , m_src(src) 66 { 67 } 68 69 SpeculationRecoveryType type() { return m_type; } 70 GPRReg dest() { return m_dest; } 71 GPRReg src() { return m_src; } 72 73private: 74 // Indicates the type of additional recovery to be performed. 75 SpeculationRecoveryType m_type; 76 // different recovery types may required different additional information here. 77 GPRReg m_dest; 78 GPRReg m_src; 79}; 80 81// === OSRExit === 82// 83// This structure describes how to exit the speculative path by 84// going into baseline code. 85struct OSRExit { 86 OSRExit(ExitKind, JSValueSource, MethodOfGettingAValueProfile, SpeculativeJIT*, unsigned streamIndex, unsigned recoveryIndex = 0); 87 88 MacroAssemblerCodeRef m_code; 89 90 JSValueSource m_jsValueSource; 91 MethodOfGettingAValueProfile m_valueProfile; 92 93 unsigned m_patchableCodeOffset; 94 CodeOrigin m_codeOrigin; 95 CodeOrigin m_codeOriginForExitProfile; 96 97 unsigned m_recoveryIndex; 98 unsigned m_watchpointIndex; 99 100 ExitKind m_kind; 101 uint32_t m_count; 102 103 bool considerAddingAsFrequentExitSite(CodeBlock* profiledCodeBlock) 104 { 105 if (!m_count || !exitKindIsCountable(m_kind)) 106 return false; 107 return considerAddingAsFrequentExitSiteSlow(profiledCodeBlock); 108 } 109 110 void setPatchableCodeOffset(MacroAssembler::PatchableJump); 111 MacroAssembler::Jump getPatchableCodeOffsetAsJump() const; 112 CodeLocationJump codeLocationForRepatch(CodeBlock*) const; 113 void correctJump(LinkBuffer&); 114 115 unsigned m_streamIndex; 116 int m_lastSetOperand; 117 118 RefPtr<ValueRecoveryOverride> m_valueRecoveryOverride; 119 120private: 121 bool considerAddingAsFrequentExitSiteSlow(CodeBlock* profiledCodeBlock); 122}; 123 124struct SpeculationFailureDebugInfo { 125 CodeBlock* codeBlock; 126}; 127 128} } // namespace JSC::DFG 129 130#endif // ENABLE(DFG_JIT) 131 132#endif // DFGOSRExit_h 133 134