92faabb8699c36d370aa51159fbf639b777660b8
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGDoesGC.cpp
1 /*
2  * Copyright (C) 2014-2017 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 "DFGDoesGC.h"
28
29 #if ENABLE(DFG_JIT)
30
31 #include "DFGClobberize.h"
32 #include "DFGGraph.h"
33 #include "DFGNode.h"
34 #include "Operations.h"
35
36 namespace JSC { namespace DFG {
37
38 bool doesGC(Graph& graph, Node* node)
39 {
40     if (clobbersHeap(graph, node))
41         return true;
42     
43     // Now consider nodes that don't clobber the world but that still may GC. This includes all
44     // nodes. By convention we put world-clobbering nodes in the block of "false" cases but we can
45     // put them anywhere.
46     switch (node->op()) {
47     case JSConstant:
48     case DoubleConstant:
49     case Int52Constant:
50     case LazyJSConstant:
51     case Identity:
52     case GetCallee:
53     case GetArgumentCountIncludingThis:
54     case GetRestLength:
55     case GetLocal:
56     case SetLocal:
57     case MovHint:
58     case ZombieHint:
59     case ExitOK:
60     case Phantom:
61     case Upsilon:
62     case Phi:
63     case Flush:
64     case PhantomLocal:
65     case GetLocalUnlinked:
66     case SetArgument:
67     case BitAnd:
68     case BitOr:
69     case BitXor:
70     case BitLShift:
71     case BitRShift:
72     case BitURShift:
73     case ValueToInt32:
74     case UInt32ToNumber:
75     case DoubleAsInt32:
76     case ArithAdd:
77     case ArithClz32:
78     case ArithSub:
79     case ArithNegate:
80     case ArithMul:
81     case ArithIMul:
82     case ArithDiv:
83     case ArithMod:
84     case ArithAbs:
85     case ArithMin:
86     case ArithMax:
87     case ArithPow:
88     case ArithSqrt:
89     case ArithRandom:
90     case ArithRound:
91     case ArithFloor:
92     case ArithCeil:
93     case ArithTrunc:
94     case ArithFRound:
95     case ArithSin:
96     case ArithCos:
97     case ArithTan:
98     case ArithLog:
99     case ValueAdd:
100     case TryGetById:
101     case GetById:
102     case GetByIdFlush:
103     case GetByIdWithThis:
104     case PutById:
105     case PutByIdFlush:
106     case PutByIdWithThis:
107     case PutByValWithThis:
108     case PutByIdDirect:
109     case PutGetterById:
110     case PutSetterById:
111     case PutGetterSetterById:
112     case PutGetterByVal:
113     case PutSetterByVal:
114     case DefineDataProperty:
115     case DefineAccessorProperty:
116     case DeleteById:
117     case DeleteByVal:
118     case CheckStructure:
119     case GetExecutable:
120     case GetButterfly:
121     case CheckDOM:
122     case CheckArray:
123     case GetScope:
124     case SkipScope:
125     case GetGlobalObject:
126     case GetClosureVar:
127     case PutClosureVar:
128     case GetRegExpObjectLastIndex:
129     case SetRegExpObjectLastIndex:
130     case RecordRegExpCachedResult:
131     case GetGlobalVar:
132     case GetGlobalLexicalVariable:
133     case PutGlobalVariable:
134     case CheckCell:
135     case CheckNotEmpty:
136     case CheckStringIdent:
137     case RegExpExec:
138     case RegExpTest:
139     case CompareLess:
140     case CompareLessEq:
141     case CompareGreater:
142     case CompareGreaterEq:
143     case CompareEq:
144     case CompareStrictEq:
145     case CompareEqPtr:
146     case Call:
147     case DirectCall:
148     case TailCallInlinedCaller:
149     case DirectTailCallInlinedCaller:
150     case Construct:
151     case DirectConstruct:
152     case CallVarargs:
153     case CallEval:
154     case TailCallVarargsInlinedCaller:
155     case ConstructVarargs:
156     case LoadVarargs:
157     case CallForwardVarargs:
158     case ConstructForwardVarargs:
159     case TailCallForwardVarargs:
160     case TailCallForwardVarargsInlinedCaller:
161     case ProfileType:
162     case ProfileControlFlow:
163     case OverridesHasInstance:
164     case InstanceOf:
165     case InstanceOfCustom:
166     case IsEmpty:
167     case IsUndefined:
168     case IsBoolean:
169     case IsNumber:
170     case IsObject:
171     case IsObjectOrNull:
172     case IsFunction:
173     case IsCellWithType:
174     case IsTypedArrayView:
175     case TypeOf:
176     case LogicalNot:
177     case ToPrimitive:
178     case ToNumber:
179     case ToString:
180     case CallStringConstructor:
181     case NumberToStringWithRadix:
182     case In:
183     case HasOwnProperty:
184     case Jump:
185     case Branch:
186     case Switch:
187     case Return:
188     case TailCall:
189     case DirectTailCall:
190     case TailCallVarargs:
191     case Throw:
192     case CountExecution:
193     case ForceOSRExit:
194     case CheckTraps:
195     case StringFromCharCode:
196     case MapHash:
197     case GetMapBucket:
198     case LoadFromJSMapBucket:
199     case IsNonEmptyMapBucket:
200     case Unreachable:
201     case ExtractOSREntryLocal:
202     case CheckTierUpInLoop:
203     case CheckTierUpAtReturn:
204     case CheckTierUpAndOSREnter:
205     case LoopHint:
206     case StoreBarrier:
207     case FencedStoreBarrier:
208     case InvalidationPoint:
209     case NotifyWrite:
210     case CheckInBounds:
211     case ConstantStoragePointer:
212     case Check:
213     case CheckTypeInfoFlags:
214     case MultiGetByOffset:
215     case ValueRep:
216     case DoubleRep:
217     case Int52Rep:
218     case GetGetter:
219     case GetSetter:
220     case GetByVal:
221     case GetByValWithThis:
222     case GetIndexedPropertyStorage:
223     case GetArrayLength:
224     case ArrayPush:
225     case ArrayPop:
226     case StringCharAt:
227     case StringCharCodeAt:
228     case GetTypedArrayByteOffset:
229     case PutByValDirect:
230     case PutByVal:
231     case PutByValAlias:
232     case PutStructure:
233     case GetByOffset:
234     case GetGetterSetterByOffset:
235     case PutByOffset:
236     case GetEnumerableLength:
237     case HasGenericProperty:
238     case HasStructureProperty:
239     case HasIndexedProperty:
240     case GetDirectPname:
241     case FiatInt52:
242     case BooleanToNumber:
243     case CheckBadCell:
244     case BottomValue:
245     case PhantomNewObject:
246     case PhantomNewFunction:
247     case PhantomNewGeneratorFunction:
248     case PhantomNewAsyncFunction:
249     case PhantomCreateActivation:
250     case PhantomDirectArguments:
251     case PhantomCreateRest:
252     case PhantomNewArrayWithSpread:
253     case PhantomSpread:
254     case PhantomClonedArguments:
255     case GetMyArgumentByVal:
256     case GetMyArgumentByValOutOfBounds:
257     case ForwardVarargs:
258     case PutHint:
259     case CheckStructureImmediate:
260     case PutStack:
261     case KillStack:
262     case GetStack:
263     case GetFromArguments:
264     case PutToArguments:
265     case GetArgument:
266     case LogShadowChickenPrologue:
267     case LogShadowChickenTail:
268     case GetDynamicVar:
269     case PutDynamicVar:
270     case ResolveScopeForHoistingFuncDeclInEval:
271     case ResolveScope:
272     case NukeStructureAndSetButterfly:
273     case AtomicsAdd:
274     case AtomicsAnd:
275     case AtomicsCompareExchange:
276     case AtomicsExchange:
277     case AtomicsLoad:
278     case AtomicsOr:
279     case AtomicsStore:
280     case AtomicsSub:
281     case AtomicsXor:
282     case AtomicsIsLockFree:
283         return false;
284
285     case CreateActivation:
286     case CreateDirectArguments:
287     case CreateScopedArguments:
288     case CreateClonedArguments:
289     case CallObjectConstructor:
290     case ToThis:
291     case CreateThis:
292     case AllocatePropertyStorage:
293     case ReallocatePropertyStorage:
294     case Arrayify:
295     case ArrayifyToStructure:
296     case NewObject:
297     case NewArray:
298     case NewArrayWithSpread:
299     case Spread:
300     case NewArrayWithSize:
301     case NewArrayBuffer:
302     case NewRegexp:
303     case NewStringObject:
304     case MakeRope:
305     case NewFunction:
306     case NewGeneratorFunction:
307     case NewAsyncFunction:
308     case NewTypedArray:
309     case ThrowStaticError:
310     case GetPropertyEnumerator:
311     case GetEnumeratorStructurePname:
312     case GetEnumeratorGenericPname:
313     case ToIndexString:
314     case MaterializeNewObject:
315     case MaterializeCreateActivation:
316     case SetFunctionName:
317     case StrCat:
318     case StringReplace:
319     case StringReplaceRegExp:
320     case CreateRest:
321     case ToLowerCase:
322     case CallDOMGetter:
323     case CallDOM:
324     case ArraySlice:
325     case ParseInt: // We might resolve a rope even though we don't clobber anything.
326         return true;
327         
328     case MultiPutByOffset:
329         return node->multiPutByOffsetData().reallocatesStorage();
330
331     case LastNodeType:
332         RELEASE_ASSERT_NOT_REACHED();
333         return true;
334     }
335     
336     RELEASE_ASSERT_NOT_REACHED();
337     return true;
338 }
339
340 } } // namespace JSC::DFG
341
342 #endif // ENABLE(DFG_JIT)