e7d4476752087da05ef423cae0bb908d81d98d35
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGOSRExit.h
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 "DFGCommon.h"
34 #include "DFGGPRInfo.h"
35 #include "MacroAssembler.h"
36 #include "ValueProfile.h"
37 #include <wtf/Vector.h>
38
39 namespace JSC { namespace DFG {
40
41 class SpeculativeJIT;
42
43 // This enum describes the types of additional recovery that
44 // may need be performed should a speculation check fail.
45 enum SpeculationRecoveryType {
46     SpeculativeAdd,
47     BooleanSpeculationCheck
48 };
49
50 // === SpeculationRecovery ===
51 //
52 // This class provides additional information that may be associated with a
53 // speculation check - for example 
54 class SpeculationRecovery {
55 public:
56     SpeculationRecovery(SpeculationRecoveryType type, GPRReg dest, GPRReg src)
57         : m_type(type)
58         , m_dest(dest)
59         , m_src(src)
60     {
61     }
62
63     SpeculationRecoveryType type() { return m_type; }
64     GPRReg dest() { return m_dest; }
65     GPRReg src() { return m_src; }
66
67 private:
68     // Indicates the type of additional recovery to be performed.
69     SpeculationRecoveryType m_type;
70     // different recovery types may required different additional information here.
71     GPRReg m_dest;
72     GPRReg m_src;
73 };
74
75 // === OSRExit ===
76 //
77 // This structure describes how to exit the speculative path by
78 // going into baseline code.
79 struct OSRExit {
80     OSRExit(JSValueSource, ValueProfile*, MacroAssembler::Jump, SpeculativeJIT*, unsigned recoveryIndex = 0);
81     
82     JSValueSource m_jsValueSource;
83     ValueProfile* m_valueProfile;
84     
85     MacroAssembler::Jump m_check;
86     NodeIndex m_nodeIndex;
87     CodeOrigin m_codeOrigin;
88     
89     unsigned m_recoveryIndex;
90     
91     // Convenient way of iterating over ValueRecoveries while being
92     // generic over argument versus variable.
93     int numberOfRecoveries() const { return m_arguments.size() + m_variables.size(); }
94     const ValueRecovery& valueRecovery(int index) const
95     {
96         if (index < (int)m_arguments.size())
97             return m_arguments[index];
98         return m_variables[index - m_arguments.size()];
99     }
100     bool isArgument(int index) const { return index < (int)m_arguments.size(); }
101     bool isVariable(int index) const { return !isArgument(index); }
102     int argumentForIndex(int index) const
103     {
104         return index;
105     }
106     int variableForIndex(int index) const
107     {
108         return index - m_arguments.size();
109     }
110     int operandForArgument(int argument) const
111     {
112         return argument - m_arguments.size() - RegisterFile::CallFrameHeaderSize;
113     }
114     int operandForIndex(int index) const
115     {
116         if (index < (int)m_arguments.size())
117             return operandForArgument(index);
118         return index - m_arguments.size();
119     }
120     
121 #ifndef NDEBUG
122     void dump(FILE* out) const;
123 #endif
124     
125     Vector<ValueRecovery, 0> m_arguments;
126     Vector<ValueRecovery, 0> m_variables;
127     int m_lastSetOperand;
128 };
129 typedef SegmentedVector<OSRExit, 16> OSRExitVector;
130
131 } } // namespace JSC::DFG
132
133 #endif // ENABLE(DFG_JIT)
134
135 #endif // DFGOSRExit_h
136