Dumping OSR ExitValue should expand materializations only once
[WebKit-https.git] / Source / JavaScriptCore / ftl / FTLExitValue.cpp
1 /*
2  * Copyright (C) 2013-2015 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 #include "config.h"
27 #include "FTLExitValue.h"
28
29 #if ENABLE(FTL_JIT)
30
31 #include "FTLExitTimeObjectMaterialization.h"
32 #include "JSCInlines.h"
33
34 namespace JSC { namespace FTL {
35
36 ExitValue ExitValue::materializeNewObject(ExitTimeObjectMaterialization* data)
37 {
38     ExitValue result;
39     result.m_kind = ExitValueMaterializeNewObject;
40     result.u.newObjectMaterializationData = data;
41     return result;
42 }
43
44 ExitValue ExitValue::withLocalsOffset(int offset) const
45 {
46     if (!isInJSStackSomehow())
47         return *this;
48     if (!virtualRegister().isLocal())
49         return *this;
50     return withVirtualRegister(virtualRegister() + offset);
51 }
52
53 ValueFormat ExitValue::valueFormat() const
54 {
55     switch (kind()) {
56     case InvalidExitValue:
57         RELEASE_ASSERT_NOT_REACHED();
58         return InvalidValueFormat;
59             
60     case ExitValueDead:
61     case ExitValueConstant:
62     case ExitValueInJSStack:
63     case ExitValueMaterializeNewObject:
64         return ValueFormatJSValue;
65             
66     case ExitValueArgument:
67         return exitArgument().format();
68             
69     case ExitValueInJSStackAsInt32:
70         return ValueFormatInt32;
71             
72     case ExitValueInJSStackAsInt52:
73         return ValueFormatInt52;
74             
75     case ExitValueInJSStackAsDouble:
76         return ValueFormatDouble;
77             
78     case ExitValueRecovery:
79         return recoveryFormat();
80     }
81         
82     RELEASE_ASSERT_NOT_REACHED();
83     return InvalidValueFormat;
84 }
85
86 void ExitValue::dumpInContext(PrintStream& out, DumpContext* context) const
87 {
88     switch (kind()) {
89     case InvalidExitValue:
90         out.print("Invalid");
91         return;
92     case ExitValueDead:
93         out.print("Dead");
94         return;
95     case ExitValueArgument:
96         out.print("Argument(", exitArgument(), ")");
97         return;
98     case ExitValueConstant:
99         out.print("Constant(", inContext(constant(), context), ")");
100         return;
101     case ExitValueInJSStack:
102         out.print("InJSStack:", virtualRegister());
103         return;
104     case ExitValueInJSStackAsInt32:
105         out.print("InJSStackAsInt32:", virtualRegister());
106         return;
107     case ExitValueInJSStackAsInt52:
108         out.print("InJSStackAsInt52:", virtualRegister());
109         return;
110     case ExitValueInJSStackAsDouble:
111         out.print("InJSStackAsDouble:", virtualRegister());
112         return;
113     case ExitValueRecovery:
114         out.print("Recovery(", recoveryOpcode(), ", arg", leftRecoveryArgument(), ", arg", rightRecoveryArgument(), ", ", recoveryFormat(), ")");
115         return;
116     case ExitValueMaterializeNewObject:
117         out.print("Materialize(", WTF::RawPointer(objectMaterialization()), ":..)");
118         return;
119     }
120     
121     RELEASE_ASSERT_NOT_REACHED();
122 }
123
124 void ExitValue::dump(PrintStream& out) const
125 {
126     dumpInContext(out, 0);
127 }
128
129 } } // namespace JSC::FTL
130
131 #endif // ENABLE(FTL_JIT)
132