Restoring use of StackIterator instead of Interpreter::getStacktrace().
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2013-08-08  Mark Lam  <mark.lam@apple.com>
2
3         Restoring use of StackIterator instead of Interpreter::getStacktrace().
4         https://bugs.webkit.org/show_bug.cgi?id=119575.
5
6         Reviewed by Oliver Hunt.
7
8         * interpreter/Interpreter.h:
9         - Made getStackTrace() private.
10         * interpreter/StackIterator.cpp:
11         (JSC::StackIterator::StackIterator):
12         (JSC::StackIterator::numberOfFrames):
13         - Computes the number of frames by iterating through the whole stack
14           from the starting frame. The iterator will save its current frame
15           position before counting the frames, and then restoring it after
16           the counting.
17         (JSC::StackIterator::gotoFrameAtIndex):
18         (JSC::StackIterator::gotoNextFrame):
19         (JSC::StackIterator::resetIterator):
20         - Points the iterator to the starting frame.
21         * interpreter/StackIteratorPrivate.h:
22
23 2013-08-08  Mark Lam  <mark.lam@apple.com>
24
25         Moved ErrorConstructor and NativeErrorConstructor helper functions into
26         the Interpreter class.
27         https://bugs.webkit.org/show_bug.cgi?id=119576.
28
29         Reviewed by Oliver Hunt.
30
31         This change is needed to prepare for making Interpreter::getStackTrace()
32         private. It does not change the behavior of the code, only the lexical
33         scoping.
34
35         * interpreter/Interpreter.h:
36         - Added helper functions for ErrorConstructor and NativeErrorConstructor.
37         * runtime/ErrorConstructor.cpp:
38         (JSC::Interpreter::constructWithErrorConstructor):
39         (JSC::ErrorConstructor::getConstructData):
40         (JSC::Interpreter::callErrorConstructor):
41         (JSC::ErrorConstructor::getCallData):
42         - Don't want ErrorConstructor to call Interpreter::getStackTrace()
43           directly. So, we moved the helper functions into the Interpreter
44           class.
45         * runtime/NativeErrorConstructor.cpp:
46         (JSC::Interpreter::constructWithNativeErrorConstructor):
47         (JSC::NativeErrorConstructor::getConstructData):
48         (JSC::Interpreter::callNativeErrorConstructor):
49         (JSC::NativeErrorConstructor::getCallData):
50         - Don't want NativeErrorConstructor to call Interpreter::getStackTrace()
51           directly. So, we moved the helper functions into the Interpreter
52           class.
53
54 2013-08-07  Mark Hahnenberg  <mhahnenberg@apple.com>
55
56         32-bit code gen for TypeOf doesn't properly update the AbstractInterpreter state
57         https://bugs.webkit.org/show_bug.cgi?id=119555
58
59         Reviewed by Geoffrey Garen.
60
61         It uses a speculationCheck where it should be using a DFG_TYPE_CHECK like the 64-bit backend does.
62         This was causing crashes on maps.google.com in 32-bit debug builds.
63
64         * dfg/DFGSpeculativeJIT32_64.cpp:
65         (JSC::DFG::SpeculativeJIT::compile):
66
67 2013-08-06  Michael Saboff  <msaboff@apple.com>
68
69         REGRESSION(FTL merge): Assertion fail on 32 bit with enabled DFG JIT
70         https://bugs.webkit.org/show_bug.cgi?id=119405
71
72         Reviewed by Geoffrey Garen.
73
74         * dfg/DFGSpeculativeJIT.cpp:
75         (JSC::DFG::SpeculativeJIT::compileGetByValOnString): For X86 32 bit, construct an indexed address
76         ourselves to save a register and then load from it.
77
78 2013-08-06  Filip Pizlo  <fpizlo@apple.com>
79
80         DFG FixupPhase should insert Int32ToDouble nodes for number uses in NewArray, and SpeculativeJIT 64-bit should not try to coerce integer constants to double constants
81         https://bugs.webkit.org/show_bug.cgi?id=119528
82
83         Reviewed by Geoffrey Garen.
84
85         Either of the two fixes would solve the crash I saw. Basically, for best performance, we want the DFG register allocator to track double uses and non-double
86         uses of a node separately, and we accomplish this by inserting Int32ToDouble nodes in the FixupPhase. But even if FixupPhase fails to do this, we still want
87         the DFG register allocator to do the right thing: if it encounters a double use of an integer, it should perform a conversion and preserve the original
88         format of the value (namely, that it was an integer). For constants, the best format to preserve is None, so that future integer uses rematerialize the int
89         from scratch. This only affects the 64-bit backend; the 32-bit backend was already doing the right thing.
90
91         This also fixes some more debug dumping code, and adds some stronger assertions for integer arrays.
92
93         * bytecode/CodeBlock.cpp:
94         (JSC::CodeBlock::finalizeUnconditionally):
95         * dfg/DFGDriver.cpp:
96         (JSC::DFG::compile):
97         * dfg/DFGFixupPhase.cpp:
98         (JSC::DFG::FixupPhase::fixupNode):
99         * dfg/DFGGraph.cpp:
100         (JSC::DFG::Graph::dump):
101         * dfg/DFGSpeculativeJIT64.cpp:
102         (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
103         * runtime/JSObject.h:
104         (JSC::JSObject::getIndexQuickly):
105         (JSC::JSObject::tryGetIndexQuickly):
106
107 2013-08-08  Stephanie Lewis  <slewis@apple.com>
108
109         <rdar://problem/14680524> REGRESSION(153806): Crash @ yahoo.com when WebKit is built with a .order file
110
111         Unreviewed.
112
113         Ensure llint symbols are in source order.
114
115         * JavaScriptCore.order:
116
117 2013-08-06  Mark Lam  <mark.lam@apple.com>
118
119         Assertion failure in emitExpressionInfo when reloading with Web Inspector open.
120         https://bugs.webkit.org/show_bug.cgi?id=119532.
121
122         Reviewed by Oliver Hunt.
123
124         * parser/Parser.cpp:
125         (JSC::::Parser):
126         - Just need to initialize the Parser's JSTokenLocation's initial line and
127           startOffset as well during Parser construction.
128
129 2013-08-06  Stephanie Lewis  <slewis@apple.com>
130
131         Update Order Files for Safari
132         <rdar://problem/14517392>
133
134         Unreviewed.
135
136         * JavaScriptCore.order:
137
138 2013-08-04  Sam Weinig  <sam@webkit.org>
139
140         Remove support for HTML5 MicroData
141         https://bugs.webkit.org/show_bug.cgi?id=119480
142
143         Reviewed by Anders Carlsson.
144
145         * Configurations/FeatureDefines.xcconfig:
146
147 2013-08-05  Oliver Hunt  <oliver@apple.com>
148
149         Delay Arguments creation in strict mode
150         https://bugs.webkit.org/show_bug.cgi?id=119505
151
152         Reviewed by Geoffrey Garen.
153
154         Make use of the write tracking performed by the parser to
155         allow us to know if we're modifying the parameters to a function.
156         Then use that information to make strict mode function opt out
157         of eager arguments creation.
158
159         * bytecompiler/BytecodeGenerator.cpp:
160         (JSC::BytecodeGenerator::BytecodeGenerator):
161         (JSC::BytecodeGenerator::createArgumentsIfNecessary):
162         (JSC::BytecodeGenerator::emitReturn):
163         * bytecompiler/BytecodeGenerator.h:
164         (JSC::BytecodeGenerator::shouldTearOffArgumentsEagerly):
165         * parser/Nodes.h:
166         (JSC::ScopeNode::modifiesParameter):
167         * parser/Parser.cpp:
168         (JSC::::parseInner):
169         * parser/Parser.h:
170         (JSC::Scope::declareParameter):
171         (JSC::Scope::getCapturedVariables):
172         (JSC::Parser::declareWrite):
173         * parser/ParserModes.h:
174
175 2013-08-06  Patrick Gansterer  <paroga@webkit.org>
176
177         Remove useless code from COMPILER(RVCT) JITStubs
178         https://bugs.webkit.org/show_bug.cgi?id=119521
179
180         Reviewed by Geoffrey Garen.
181
182         * jit/JITStubsARMv7.h:
183         (JSC::ctiVMThrowTrampoline): "ldr r6, [sp, #PRESERVED_R6_OFFSET]" was called twice.
184         (JSC::ctiOpThrowNotCaught): Ditto.
185
186 2013-07-23  David Farler  <dfarler@apple.com>
187
188         Provide optional OTHER_CFLAGS, OTHER_CPPFLAGS, OTHER_LDFLAGS additions for building with ASAN
189         https://bugs.webkit.org/show_bug.cgi?id=117762
190
191         Reviewed by Mark Rowe.
192
193         * Configurations/DebugRelease.xcconfig:
194         Add ASAN_OTHER_CFLAGS, CPLUSPLUSFLAGS, LDFLAGS.
195         * Configurations/JavaScriptCore.xcconfig:
196         Add ASAN_OTHER_LDFLAGS.
197         * Configurations/ToolExecutable.xcconfig:
198         Don't use ASAN for build tools.
199
200 2013-08-06  Patrick Gansterer  <paroga@webkit.org>
201
202         Build fix for ARM MSVC after r153222 and r153648.
203
204         * jit/JITStubsARM.h: Added ctiVMThrowTrampolineSlowpath.
205
206 2013-08-06  Patrick Gansterer  <paroga@webkit.org>
207
208         Build fix for ARM MSVC after r150109.
209
210         Read the stub template from a header files instead of the JITStubs.cpp.
211
212         * CMakeLists.txt:
213         * DerivedSources.pri:
214         * create_jit_stubs:
215
216 2013-08-05  Oliver Hunt  <oliver@apple.com>
217
218         Move TypedArray implementation into JSC
219         https://bugs.webkit.org/show_bug.cgi?id=119489
220
221         Reviewed by Filip Pizlo.
222
223         Move TypedArray implementation into JSC in advance of re-implementation
224
225         * GNUmakefile.list.am:
226         * JSCTypedArrayStubs.h:
227         * JavaScriptCore.xcodeproj/project.pbxproj:
228         * runtime/ArrayBuffer.cpp: Renamed from Source/WTF/wtf/ArrayBuffer.cpp.
229         (JSC::ArrayBuffer::transfer):
230         (JSC::ArrayBuffer::addView):
231         (JSC::ArrayBuffer::removeView):
232         * runtime/ArrayBuffer.h: Renamed from Source/WTF/wtf/ArrayBuffer.h.
233         (JSC::ArrayBufferContents::ArrayBufferContents):
234         (JSC::ArrayBufferContents::data):
235         (JSC::ArrayBufferContents::sizeInBytes):
236         (JSC::ArrayBufferContents::transfer):
237         (JSC::ArrayBufferContents::copyTo):
238         (JSC::ArrayBuffer::isNeutered):
239         (JSC::ArrayBuffer::~ArrayBuffer):
240         (JSC::ArrayBuffer::clampValue):
241         (JSC::ArrayBuffer::create):
242         (JSC::ArrayBuffer::createUninitialized):
243         (JSC::ArrayBuffer::ArrayBuffer):
244         (JSC::ArrayBuffer::data):
245         (JSC::ArrayBuffer::byteLength):
246         (JSC::ArrayBuffer::slice):
247         (JSC::ArrayBuffer::sliceImpl):
248         (JSC::ArrayBuffer::clampIndex):
249         (JSC::ArrayBufferContents::tryAllocate):
250         (JSC::ArrayBufferContents::~ArrayBufferContents):
251         * runtime/ArrayBufferView.cpp: Renamed from Source/WTF/wtf/ArrayBufferView.cpp.
252         (JSC::ArrayBufferView::ArrayBufferView):
253         (JSC::ArrayBufferView::~ArrayBufferView):
254         (JSC::ArrayBufferView::neuter):
255         * runtime/ArrayBufferView.h: Renamed from Source/WTF/wtf/ArrayBufferView.h.
256         (JSC::ArrayBufferView::buffer):
257         (JSC::ArrayBufferView::baseAddress):
258         (JSC::ArrayBufferView::byteOffset):
259         (JSC::ArrayBufferView::setNeuterable):
260         (JSC::ArrayBufferView::isNeuterable):
261         (JSC::ArrayBufferView::verifySubRange):
262         (JSC::ArrayBufferView::clampOffsetAndNumElements):
263         (JSC::ArrayBufferView::setImpl):
264         (JSC::ArrayBufferView::setRangeImpl):
265         (JSC::ArrayBufferView::zeroRangeImpl):
266         (JSC::ArrayBufferView::calculateOffsetAndLength):
267         * runtime/Float32Array.h: Renamed from Source/WTF/wtf/Float32Array.h.
268         (JSC::Float32Array::set):
269         (JSC::Float32Array::getType):
270         (JSC::Float32Array::create):
271         (JSC::Float32Array::createUninitialized):
272         (JSC::Float32Array::Float32Array):
273         (JSC::Float32Array::subarray):
274         * runtime/Float64Array.h: Renamed from Source/WTF/wtf/Float64Array.h.
275         (JSC::Float64Array::set):
276         (JSC::Float64Array::getType):
277         (JSC::Float64Array::create):
278         (JSC::Float64Array::createUninitialized):
279         (JSC::Float64Array::Float64Array):
280         (JSC::Float64Array::subarray):
281         * runtime/Int16Array.h: Renamed from Source/WTF/wtf/Int16Array.h.
282         (JSC::Int16Array::getType):
283         (JSC::Int16Array::create):
284         (JSC::Int16Array::createUninitialized):
285         (JSC::Int16Array::Int16Array):
286         (JSC::Int16Array::subarray):
287         * runtime/Int32Array.h: Renamed from Source/WTF/wtf/Int32Array.h.
288         (JSC::Int32Array::getType):
289         (JSC::Int32Array::create):
290         (JSC::Int32Array::createUninitialized):
291         (JSC::Int32Array::Int32Array):
292         (JSC::Int32Array::subarray):
293         * runtime/Int8Array.h: Renamed from Source/WTF/wtf/Int8Array.h.
294         (JSC::Int8Array::getType):
295         (JSC::Int8Array::create):
296         (JSC::Int8Array::createUninitialized):
297         (JSC::Int8Array::Int8Array):
298         (JSC::Int8Array::subarray):
299         * runtime/IntegralTypedArrayBase.h: Renamed from Source/WTF/wtf/IntegralTypedArrayBase.h.
300         (JSC::IntegralTypedArrayBase::set):
301         (JSC::IntegralTypedArrayBase::IntegralTypedArrayBase):
302         * runtime/TypedArrayBase.h: Renamed from Source/WTF/wtf/TypedArrayBase.h.
303         (JSC::TypedArrayBase::data):
304         (JSC::TypedArrayBase::set):
305         (JSC::TypedArrayBase::setRange):
306         (JSC::TypedArrayBase::zeroRange):
307         (JSC::TypedArrayBase::length):
308         (JSC::TypedArrayBase::byteLength):
309         (JSC::TypedArrayBase::item):
310         (JSC::TypedArrayBase::checkInboundData):
311         (JSC::TypedArrayBase::TypedArrayBase):
312         (JSC::TypedArrayBase::create):
313         (JSC::TypedArrayBase::createUninitialized):
314         (JSC::TypedArrayBase::subarrayImpl):
315         (JSC::TypedArrayBase::neuter):
316         * runtime/Uint16Array.h: Renamed from Source/WTF/wtf/Uint16Array.h.
317         (JSC::Uint16Array::getType):
318         (JSC::Uint16Array::create):
319         (JSC::Uint16Array::createUninitialized):
320         (JSC::Uint16Array::Uint16Array):
321         (JSC::Uint16Array::subarray):
322         * runtime/Uint32Array.h: Renamed from Source/WTF/wtf/Uint32Array.h.
323         (JSC::Uint32Array::getType):
324         (JSC::Uint32Array::create):
325         (JSC::Uint32Array::createUninitialized):
326         (JSC::Uint32Array::Uint32Array):
327         (JSC::Uint32Array::subarray):
328         * runtime/Uint8Array.h: Renamed from Source/WTF/wtf/Uint8Array.h.
329         (JSC::Uint8Array::getType):
330         (JSC::Uint8Array::create):
331         (JSC::Uint8Array::createUninitialized):
332         (JSC::Uint8Array::Uint8Array):
333         (JSC::Uint8Array::subarray):
334         * runtime/Uint8ClampedArray.h: Renamed from Source/WTF/wtf/Uint8ClampedArray.h.
335         (JSC::Uint8ClampedArray::getType):
336         (JSC::Uint8ClampedArray::create):
337         (JSC::Uint8ClampedArray::createUninitialized):
338         (JSC::Uint8ClampedArray::zeroFill):
339         (JSC::Uint8ClampedArray::set):
340         (JSC::Uint8ClampedArray::Uint8ClampedArray):
341         (JSC::Uint8ClampedArray::subarray):
342         * runtime/VM.h:
343
344 2013-08-03  Filip Pizlo  <fpizlo@apple.com>
345
346         Copied space should be able to handle more than one copied backing store per JSCell
347         https://bugs.webkit.org/show_bug.cgi?id=119471
348
349         Reviewed by Mark Hahnenberg.
350         
351         This allows a cell to call copyLater() multiple times for multiple different
352         backing stores, and then have copyBackingStore() called exactly once for each
353         of those. A token tells it which backing store to copy. All backing stores
354         must be named using the CopyToken, an enumeration which currently cannot
355         exceed eight entries.
356         
357         When copyBackingStore() is called, it's up to the callee to (a) use the token
358         to decide what to copy and (b) call its base class's copyBackingStore() in
359         case the base class had something that needed copying. The only exception is
360         that JSCell never asks anything to be copied, and so if your base is JSCell
361         then you don't have to do anything.
362
363         * GNUmakefile.list.am:
364         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
365         * JavaScriptCore.xcodeproj/project.pbxproj:
366         * heap/CopiedBlock.h:
367         * heap/CopiedBlockInlines.h:
368         (JSC::CopiedBlock::reportLiveBytes):
369         * heap/CopyToken.h: Added.
370         * heap/CopyVisitor.cpp:
371         (JSC::CopyVisitor::copyFromShared):
372         * heap/CopyVisitor.h:
373         * heap/CopyVisitorInlines.h:
374         (JSC::CopyVisitor::visitItem):
375         * heap/CopyWorkList.h:
376         (JSC::CopyWorklistItem::CopyWorklistItem):
377         (JSC::CopyWorklistItem::cell):
378         (JSC::CopyWorklistItem::token):
379         (JSC::CopyWorkListSegment::get):
380         (JSC::CopyWorkListSegment::append):
381         (JSC::CopyWorkListSegment::data):
382         (JSC::CopyWorkListIterator::get):
383         (JSC::CopyWorkListIterator::operator*):
384         (JSC::CopyWorkListIterator::operator->):
385         (JSC::CopyWorkList::append):
386         * heap/SlotVisitor.h:
387         * heap/SlotVisitorInlines.h:
388         (JSC::SlotVisitor::copyLater):
389         * runtime/ClassInfo.h:
390         * runtime/JSCell.cpp:
391         (JSC::JSCell::copyBackingStore):
392         * runtime/JSCell.h:
393         * runtime/JSObject.cpp:
394         (JSC::JSObject::visitButterfly):
395         (JSC::JSObject::copyBackingStore):
396         * runtime/JSObject.h:
397
398 2013-08-05  Zan Dobersek  <zdobersek@igalia.com>
399
400         [Automake] Define ENABLE_JIT through the Autoconf header
401         https://bugs.webkit.org/show_bug.cgi?id=119445
402
403         Reviewed by Martin Robinson.
404
405         * GNUmakefile.am: Remove JSC_CPPFLAGS from the cpp flags for the JSC library.
406
407 2013-08-03  Filip Pizlo  <fpizlo@apple.com>
408
409         hasIndexingHeader() ought really to be a property of an object and its structure, not just its structure
410         https://bugs.webkit.org/show_bug.cgi?id=119470
411
412         Reviewed by Oliver Hunt.
413         
414         Structure can still tell you if the object "could" (in the conservative sense)
415         have an indexing header; that's used by the compiler.
416         
417         Most of the time if you want to know if there's an indexing header, you ask the
418         JSObject.
419         
420         In some cases, the JSObject wants to know if it would have an indexing header if
421         it had a different structure; then it uses Structure::hasIndexingHeader(JSCell*).
422
423         * dfg/DFGRepatch.cpp:
424         (JSC::DFG::tryCachePutByID):
425         (JSC::DFG::tryBuildPutByIdList):
426         * dfg/DFGSpeculativeJIT.cpp:
427         (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage):
428         (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage):
429         * runtime/ButterflyInlines.h:
430         (JSC::Butterfly::create):
431         (JSC::Butterfly::growPropertyStorage):
432         (JSC::Butterfly::growArrayRight):
433         (JSC::Butterfly::resizeArray):
434         * runtime/JSObject.cpp:
435         (JSC::JSObject::copyButterfly):
436         (JSC::JSObject::visitButterfly):
437         * runtime/JSObject.h:
438         (JSC::JSObject::hasIndexingHeader):
439         (JSC::JSObject::setButterfly):
440         * runtime/Structure.h:
441         (JSC::Structure::couldHaveIndexingHeader):
442         (JSC::Structure::hasIndexingHeader):
443
444 2013-08-02  Chris Curtis  <chris_curtis@apple.com>
445
446         Give the error object's stack property accessor attributes.
447         https://bugs.webkit.org/show_bug.cgi?id=119404
448
449         Reviewed by Geoffrey Garen.
450         
451         Changed the attributes of error object's stack property to allow developers to write
452         and delete the stack property. This will match the functionality of Chrome. Firefox  
453         allows developers to write the error's stack, but not delete it. 
454
455         * interpreter/Interpreter.cpp:
456         (JSC::Interpreter::addStackTraceIfNecessary):
457         * runtime/ErrorInstance.cpp:
458         (JSC::ErrorInstance::finishCreation):
459
460 2013-08-02  Oliver Hunt  <oliver@apple.com>
461
462         Incorrect type speculation reported by ToPrimitive
463         https://bugs.webkit.org/show_bug.cgi?id=119458
464
465         Reviewed by Mark Hahnenberg.
466
467         Make sure that we report the correct type possibilities for the output
468         from ToPrimitive
469
470         * dfg/DFGAbstractInterpreterInlines.h:
471         (JSC::DFG::::executeEffects):
472
473 2013-08-02  Gavin Barraclough  <barraclough@apple.com>
474
475         Remove no-arguments constructor to PropertySlot
476         https://bugs.webkit.org/show_bug.cgi?id=119460
477
478         Reviewed by Geoff Garen.
479
480         This constructor was unsafe if getValue is subsequently called,
481         and the property is a getter. Simplest to just remove it.
482
483         * runtime/Arguments.cpp:
484         (JSC::Arguments::defineOwnProperty):
485         * runtime/JSActivation.cpp:
486         (JSC::JSActivation::getOwnPropertyDescriptor):
487         * runtime/JSFunction.cpp:
488         (JSC::JSFunction::getOwnPropertyDescriptor):
489         (JSC::JSFunction::getOwnNonIndexPropertyNames):
490         (JSC::JSFunction::put):
491         (JSC::JSFunction::defineOwnProperty):
492         * runtime/JSGlobalObject.cpp:
493         (JSC::JSGlobalObject::defineOwnProperty):
494         * runtime/JSGlobalObject.h:
495         (JSC::JSGlobalObject::hasOwnPropertyForWrite):
496         * runtime/JSNameScope.cpp:
497         (JSC::JSNameScope::put):
498         * runtime/JSONObject.cpp:
499         (JSC::Stringifier::Holder::appendNextProperty):
500         (JSC::Walker::walk):
501         * runtime/JSObject.cpp:
502         (JSC::JSObject::hasProperty):
503         (JSC::JSObject::hasOwnProperty):
504         (JSC::JSObject::reifyStaticFunctionsForDelete):
505         * runtime/Lookup.h:
506         (JSC::getStaticPropertyDescriptor):
507         (JSC::getStaticFunctionDescriptor):
508         (JSC::getStaticValueDescriptor):
509         * runtime/ObjectConstructor.cpp:
510         (JSC::defineProperties):
511         * runtime/PropertySlot.h:
512
513 2013-08-02  Mark Hahnenberg  <mhahnenberg@apple.com>
514
515         DFG validation can cause assertion failures due to dumping
516         https://bugs.webkit.org/show_bug.cgi?id=119456
517
518         Reviewed by Geoffrey Garen.
519
520         * bytecode/CodeBlock.cpp:
521         (JSC::CodeBlock::hasHash):
522         (JSC::CodeBlock::isSafeToComputeHash):
523         (JSC::CodeBlock::hash):
524         (JSC::CodeBlock::dumpAssumingJITType):
525         * bytecode/CodeBlock.h:
526
527 2013-08-02  Chris Curtis  <chris_curtis@apple.com>
528
529         Have vm's exceptionStack match java's vm's exceptionStack.
530         https://bugs.webkit.org/show_bug.cgi?id=119362
531
532         Reviewed by Geoffrey Garen.
533         
534         The error object's stack is only updated if it does not exist yet. This matches 
535         the functionality of other browsers, and Java VMs. 
536
537         * interpreter/Interpreter.cpp:
538         (JSC::Interpreter::addStackTraceIfNecessary):
539         (JSC::Interpreter::throwException):
540         * runtime/VM.cpp:
541         (JSC::VM::clearExceptionStack):
542         * runtime/VM.h:
543         (JSC::VM::lastExceptionStack):
544
545 2013-08-02  Julien Brianceau  <jbrianceau@nds.com>
546
547         REGRESSION(FTL): Fix mips implementation of ctiVMThrowTrampolineSlowpath.
548         https://bugs.webkit.org/show_bug.cgi?id=119447
549
550         Reviewed by Geoffrey Garen.
551
552         Fix .cpload, update call frame and do not restore registers from JIT stack frame in
553         mips implementation of ctiVMThrowTrampolineSlowpath. This change is similar to
554         r153583 (sh4) and r153648 (ARM).
555
556         * jit/JITStubsMIPS.h:
557
558 2013-08-01  Filip Pizlo  <fpizlo@apple.com>
559
560         hasIndexingHeader should be a property of the Structure, not just the IndexingType
561         https://bugs.webkit.org/show_bug.cgi?id=119422
562
563         Reviewed by Oliver Hunt.
564         
565         This simplifies some code and also allows Structure to claim that an object
566         has an indexing header even if it doesn't have indexed properties.
567         
568         I also changed some calls to use hasIndexedProperties() since in some cases,
569         that's what we actually meant. Currently the two are synonyms.
570
571         * dfg/DFGRepatch.cpp:
572         (JSC::DFG::tryCachePutByID):
573         (JSC::DFG::tryBuildPutByIdList):
574         * dfg/DFGSpeculativeJIT.cpp:
575         (JSC::DFG::SpeculativeJIT::compileAllocatePropertyStorage):
576         (JSC::DFG::SpeculativeJIT::compileReallocatePropertyStorage):
577         * runtime/ButterflyInlines.h:
578         (JSC::Butterfly::create):
579         (JSC::Butterfly::growPropertyStorage):
580         (JSC::Butterfly::growArrayRight):
581         (JSC::Butterfly::resizeArray):
582         * runtime/IndexingType.h:
583         * runtime/JSObject.cpp:
584         (JSC::JSObject::copyButterfly):
585         (JSC::JSObject::visitButterfly):
586         (JSC::JSObject::setPrototype):
587         * runtime/JSObject.h:
588         (JSC::JSObject::setButterfly):
589         * runtime/JSPropertyNameIterator.cpp:
590         (JSC::JSPropertyNameIterator::create):
591         * runtime/Structure.h:
592         (JSC::Structure::hasIndexingHeader):
593
594 2013-08-02  Julien Brianceau  <jbrianceau@nds.com>
595
596         REGRESSION: ARM still crashes after change set r153612.
597         https://bugs.webkit.org/show_bug.cgi?id=119433
598
599         Reviewed by Michael Saboff.
600
601         Update call frame and do not restore registers from JIT stack frame in ARM and ARMv7
602         implementations of ctiVMThrowTrampolineSlowpath. This change is similar to r153583
603         for sh4 architecture.
604
605         * jit/JITStubsARM.h:
606         * jit/JITStubsARMv7.h:
607
608 2013-08-02  Michael Saboff  <msaboff@apple.com>
609
610         REGRESSION(r153612): It made jsc and layout tests crash
611         https://bugs.webkit.org/show_bug.cgi?id=119440
612
613         Reviewed by Csaba Osztrogonác.
614
615         Made the changes if changeset r153612 only apply to 32 bit builds.
616
617         * jit/JITExceptions.cpp:
618         * jit/JITExceptions.h:
619         * jit/JITStubs.cpp:
620         (JSC::cti_vm_throw_slowpath):
621         * jit/JITStubs.h:
622
623 2013-08-02  Patrick Gansterer  <paroga@webkit.org>
624
625         Add JSCTestRunnerUtils to the list of forwarding headers to fix build.
626
627         * CMakeLists.txt:
628
629 2013-08-01  Ruth Fong  <ruth_fong@apple.com>
630
631         [Forms: color] <input type='color'> popover color well implementation
632         <rdar://problem/14411008> and https://bugs.webkit.org/show_bug.cgi?id=119356
633
634         Reviewed by Benjamin Poulain.
635
636         * Configurations/FeatureDefines.xcconfig: Added and enabled INPUT_TYPE_COLOR_POPOVER.
637
638 2013-08-01  Oliver Hunt  <oliver@apple.com>
639
640         DFG is not enforcing correct ordering of ToString conversion in MakeRope
641         https://bugs.webkit.org/show_bug.cgi?id=119408
642
643         Reviewed by Filip Pizlo.
644
645         Construct ToString and Phantom nodes in advance of MakeRope
646         nodes to ensure that ordering is ensured, and correct values
647         will be reified on OSR exit.
648
649         * dfg/DFGByteCodeParser.cpp:
650         (JSC::DFG::ByteCodeParser::parseBlock):
651
652 2013-08-01  Michael Saboff  <msaboff@apple.com>
653
654         REGRESSION: Crash beneath cti_vm_throw_slowpath due to invalid CallFrame pointer
655         https://bugs.webkit.org/show_bug.cgi?id=119140
656
657         Reviewed by Filip Pizlo.
658
659         Ensure that ExceptionHandler is returned by functions in two registers by encoding the value as a 64 bit int.
660
661         * jit/JITExceptions.cpp:
662         (JSC::encode):
663         * jit/JITExceptions.h:
664         * jit/JITStubs.cpp:
665         (JSC::cti_vm_throw_slowpath):
666         * jit/JITStubs.h:
667
668 2013-08-01  Julien Brianceau  <jbrianceau@nds.com>
669
670         REGRESSION(FTL): Fix sh4 implementation of ctiVMThrowTrampolineSlowpath.
671         https://bugs.webkit.org/show_bug.cgi?id=119391
672
673         Reviewed by Csaba Osztrogonác.
674
675         * jit/JITStubsSH4.h: Fix ctiVMThrowTrampolineSlowpath implementation:
676             - Call frame is in r14 register.
677             - Do not restore registers from JIT stack frame here.
678
679 2013-07-31  Gavin Barraclough  <barraclough@apple.com>
680
681         More cleanup in PropertySlot
682         https://bugs.webkit.org/show_bug.cgi?id=119359
683
684         Reviewed by Geoff Garen.
685
686         m_slotBase is overloaded to store the (receiver) thisValue and the object that contains the property,
687         This is confusing, and means that slotBase cannot be typed correctly (can only be a JSObject).
688
689         * dfg/DFGRepatch.cpp:
690         (JSC::DFG::tryCacheGetByID):
691         (JSC::DFG::tryBuildGetByIDList):
692             - No need to ASSERT slotBase is an object.
693         * jit/JITStubs.cpp:
694         (JSC::tryCacheGetByID):
695         (JSC::DEFINE_STUB_FUNCTION):
696             - No need to ASSERT slotBase is an object.
697         * runtime/JSObject.cpp:
698         (JSC::JSObject::getOwnPropertySlotByIndex):
699         (JSC::JSObject::fillGetterPropertySlot):
700             - Pass an object through to setGetterSlot.
701         * runtime/JSObject.h:
702         (JSC::PropertySlot::getValue):
703             - Moved from PropertySlot (need to know anout JSObject).
704         * runtime/PropertySlot.cpp:
705         (JSC::PropertySlot::functionGetter):
706             - update per member name changes
707         * runtime/PropertySlot.h:
708         (JSC::PropertySlot::PropertySlot):
709             - Argument to constructor set to 'thisValue'.
710         (JSC::PropertySlot::slotBase):
711             - This returns a JSObject*.
712         (JSC::PropertySlot::setValue):
713         (JSC::PropertySlot::setCustom):
714         (JSC::PropertySlot::setCacheableCustom):
715         (JSC::PropertySlot::setCustomIndex):
716         (JSC::PropertySlot::setGetterSlot):
717         (JSC::PropertySlot::setCacheableGetterSlot):
718             - slotBase is a JSObject*, make setGetterSlot set slotBase for consistency.
719         * runtime/SparseArrayValueMap.cpp:
720         (JSC::SparseArrayEntry::get):
721             - Pass an object through to setGetterSlot.
722         * runtime/SparseArrayValueMap.h:
723             - Pass an object through to setGetterSlot.
724
725 2013-07-31  Yi Shen  <max.hong.shen@gmail.com>
726
727         Reduce JSC API static value setter/getter overhead.
728         https://bugs.webkit.org/show_bug.cgi?id=119277
729
730         Reviewed by Geoffrey Garen.
731
732         Add property name to the static value entry, so that OpaqueJSString::create() doesn't
733         need to get called every time when set or get the static value.
734
735         * API/JSCallbackObjectFunctions.h:
736         (JSC::::put):
737         (JSC::::putByIndex):
738         (JSC::::getStaticValue):
739         * API/JSClassRef.cpp:
740         (OpaqueJSClassContextData::OpaqueJSClassContextData):
741         * API/JSClassRef.h:
742         (StaticValueEntry::StaticValueEntry):
743
744 2013-07-31  Kwang Yul Seo  <skyul@company100.net>
745
746         Use emptyString instead of String("")
747         https://bugs.webkit.org/show_bug.cgi?id=119335
748
749         Reviewed by Darin Adler.
750
751         Use emptyString() instead of String("") because it is better style and
752         faster. This is a followup to r116908, removing all occurrences of
753         String("") from WebKit.
754
755         * runtime/RegExpConstructor.cpp:
756         (JSC::constructRegExp):
757         * runtime/RegExpPrototype.cpp:
758         (JSC::regExpProtoFuncCompile):
759         * runtime/StringPrototype.cpp:
760         (JSC::stringProtoFuncMatch):
761         (JSC::stringProtoFuncSearch):
762
763 2013-07-31  Ruth Fong  <ruth_fong@apple.com>
764
765         <input type=color> Mac UI behaviour
766         <rdar://problem/10269922> and https://bugs.webkit.org/show_bug.cgi?id=61276
767
768         Reviewed by Brady Eidson.
769
770         * Configurations/FeatureDefines.xcconfig: Enabled INPUT_TYPE_COLOR.
771
772 2013-07-31  Mark Hahnenberg  <mhahnenberg@apple.com>
773
774         DFG doesn't account for inlining of functions with switch statements that haven't been executed by the baseline JIT
775         https://bugs.webkit.org/show_bug.cgi?id=119349
776
777         Reviewed by Geoffrey Garen.
778
779         Prior to this patch, the baseline JIT was responsible for resizing the ctiOffsets Vector for 
780         SimpleJumpTables to be equal to the size of the branchOffsets Vector. The DFG implicitly relied
781         on code it compiled with any switch statements to have been run in the baseline JIT first. 
782         However, if the DFG chooses to inline a function that has never been compiled by the baseline 
783         JIT then this resizing never happens and we crash at link time in the DFG.
784
785         We can fix this by also doing the resize in the DFG to catch this case.
786
787         * dfg/DFGJITCompiler.cpp:
788         (JSC::DFG::JITCompiler::link):
789
790 2013-07-31  Gavin Barraclough  <barraclough@apple.com>
791
792         Speculative Windows build fix.
793
794         Reviewed by NOBODY
795
796         * runtime/JSString.cpp:
797         (JSC::JSRopeString::getIndexSlowCase):
798         * runtime/JSString.h:
799
800 2013-07-30  Gavin Barraclough  <barraclough@apple.com>
801
802         Some cleanup in JSValue::get
803         https://bugs.webkit.org/show_bug.cgi?id=119343
804
805         Reviewed by Geoff Garen.
806
807         JSValue::get is implemented to:
808             1) Check if the value is a cell – if not, synthesize a prototype to search,
809             2) call getOwnPropertySlot on the cell,
810             3) if this returns false, cast to JSObject to get the prototype, and walk the prototype chain.
811         By all rights this should crash when passed a string and accessing a property that does not exist, because
812         the string is a cell, getOwnPropertySlot should return false, and the cast to JSObject should be unsafe.
813         To work around this, JSString::getOwnPropertySlot actually implements 'get' functionality - searching the
814         prototype chain, and faking out a return value of undefined if no property is found.
815
816         This is a huge hazard, since fixing JSString::getOwnPropertySlot or calling getOwnPropertySlot on cells
817         from elsewhere would introduce bugs. Fortunately it is only ever called in this one place.
818
819         The fix here is to move getOwnPropertySlot onto JSObjecte and end this madness - cells don't have property
820         slots anyway.
821
822         Interesting changes are in JSCJSValueInlines.h, JSString.cpp - the rest is pretty much all JSCell -> JSObject.
823
824 2013-07-31  Michael Saboff  <msaboff@apple.com>
825
826         [Win] JavaScript crash.
827         https://bugs.webkit.org/show_bug.cgi?id=119339
828
829         Reviewed by Mark Hahnenberg.
830
831         * jit/JITStubsX86.h: Implement ctiVMThrowTrampoline and
832         ctiVMThrowTrampolineSlowpath the same way as the gcc x86 version does.
833
834 2013-07-30  Mark Hahnenberg  <mhahnenberg@apple.com>
835
836         GetByVal on Arguments does the wrong size load when checking the Arguments object length
837         https://bugs.webkit.org/show_bug.cgi?id=119281
838
839         Reviewed by Geoffrey Garen.
840
841         This leads to out of bounds accesses and subsequent crashes.
842
843         * dfg/DFGSpeculativeJIT.cpp:
844         (JSC::DFG::SpeculativeJIT::compileGetByValOnArguments):
845         * dfg/DFGSpeculativeJIT64.cpp:
846         (JSC::DFG::SpeculativeJIT::compile):
847
848 2013-07-30  Oliver Hunt  <oliver@apple.com>
849
850         Add an assertion to SpeculateCellOperand
851         https://bugs.webkit.org/show_bug.cgi?id=119276
852
853         Reviewed by Michael Saboff.
854
855         More assertions are better
856
857         * dfg/DFGSpeculativeJIT64.cpp:
858         (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
859         (JSC::DFG::SpeculativeJIT::compile):
860
861 2013-07-30  Mark Lam  <mark.lam@apple.com>
862
863         Fix problems with divot and lineStart mismatches.
864         https://bugs.webkit.org/show_bug.cgi?id=118662.
865
866         Reviewed by Oliver Hunt.
867
868         r152494 added the recording of lineStart values for divot positions.
869         This is needed for the computation of column numbers. Similarly, it also
870         added the recording of line numbers for the divot positions. One problem
871         with the approach taken was that the line and lineStart values were
872         recorded independently, and hence were not always guaranteed to be
873         sampled at the same place that the divot position is recorded. This
874         resulted in potential mismatches that cause some assertions to fail.
875
876         The solution is to introduce a JSTextPosition abstraction that records
877         the divot position, line, and lineStart as a single quantity. Wherever
878         we record the divot position as an unsigned int previously, we now record
879         its JSTextPosition which captures all 3 values in one go. This ensures
880         that the captured line and lineStart will always match the captured divot
881         position.
882
883         * bytecompiler/BytecodeGenerator.cpp:
884         (JSC::BytecodeGenerator::emitCall):
885         (JSC::BytecodeGenerator::emitCallEval):
886         (JSC::BytecodeGenerator::emitCallVarargs):
887         (JSC::BytecodeGenerator::emitConstruct):
888         (JSC::BytecodeGenerator::emitDebugHook):
889         - Use JSTextPosition instead of passing line and lineStart explicitly.
890         * bytecompiler/BytecodeGenerator.h:
891         (JSC::BytecodeGenerator::emitExpressionInfo):
892         - Use JSTextPosition instead of passing line and lineStart explicitly.
893         * bytecompiler/NodesCodegen.cpp:
894         (JSC::ThrowableExpressionData::emitThrowReferenceError):
895         (JSC::ResolveNode::emitBytecode):
896         (JSC::BracketAccessorNode::emitBytecode):
897         (JSC::DotAccessorNode::emitBytecode):
898         (JSC::NewExprNode::emitBytecode):
899         (JSC::EvalFunctionCallNode::emitBytecode):
900         (JSC::FunctionCallValueNode::emitBytecode):
901         (JSC::FunctionCallResolveNode::emitBytecode):
902         (JSC::FunctionCallBracketNode::emitBytecode):
903         (JSC::FunctionCallDotNode::emitBytecode):
904         (JSC::CallFunctionCallDotNode::emitBytecode):
905         (JSC::ApplyFunctionCallDotNode::emitBytecode):
906         (JSC::PostfixNode::emitResolve):
907         (JSC::PostfixNode::emitBracket):
908         (JSC::PostfixNode::emitDot):
909         (JSC::DeleteResolveNode::emitBytecode):
910         (JSC::DeleteBracketNode::emitBytecode):
911         (JSC::DeleteDotNode::emitBytecode):
912         (JSC::PrefixNode::emitResolve):
913         (JSC::PrefixNode::emitBracket):
914         (JSC::PrefixNode::emitDot):
915         (JSC::UnaryOpNode::emitBytecode):
916         (JSC::BinaryOpNode::emitStrcat):
917         (JSC::BinaryOpNode::emitBytecode):
918         (JSC::ThrowableBinaryOpNode::emitBytecode):
919         (JSC::InstanceOfNode::emitBytecode):
920         (JSC::emitReadModifyAssignment):
921         (JSC::ReadModifyResolveNode::emitBytecode):
922         (JSC::AssignResolveNode::emitBytecode):
923         (JSC::AssignDotNode::emitBytecode):
924         (JSC::ReadModifyDotNode::emitBytecode):
925         (JSC::AssignBracketNode::emitBytecode):
926         (JSC::ReadModifyBracketNode::emitBytecode):
927         (JSC::ForInNode::emitBytecode):
928         (JSC::WithNode::emitBytecode):
929         (JSC::ThrowNode::emitBytecode):
930         - Use JSTextPosition instead of passing line and lineStart explicitly.
931         * parser/ASTBuilder.h:
932         - Replaced ASTBuilder::PositionInfo with JSTextPosition.
933         (JSC::ASTBuilder::BinaryOpInfo::BinaryOpInfo):
934         (JSC::ASTBuilder::AssignmentInfo::AssignmentInfo):
935         (JSC::ASTBuilder::createResolve):
936         (JSC::ASTBuilder::createBracketAccess):
937         (JSC::ASTBuilder::createDotAccess):
938         (JSC::ASTBuilder::createRegExp):
939         (JSC::ASTBuilder::createNewExpr):
940         (JSC::ASTBuilder::createAssignResolve):
941         (JSC::ASTBuilder::createExprStatement):
942         (JSC::ASTBuilder::createForInLoop):
943         (JSC::ASTBuilder::createReturnStatement):
944         (JSC::ASTBuilder::createBreakStatement):
945         (JSC::ASTBuilder::createContinueStatement):
946         (JSC::ASTBuilder::createLabelStatement):
947         (JSC::ASTBuilder::createWithStatement):
948         (JSC::ASTBuilder::createThrowStatement):
949         (JSC::ASTBuilder::appendBinaryExpressionInfo):
950         (JSC::ASTBuilder::appendUnaryToken):
951         (JSC::ASTBuilder::unaryTokenStackLastStart):
952         (JSC::ASTBuilder::assignmentStackAppend):
953         (JSC::ASTBuilder::createAssignment):
954         (JSC::ASTBuilder::setExceptionLocation):
955         (JSC::ASTBuilder::makeDeleteNode):
956         (JSC::ASTBuilder::makeFunctionCallNode):
957         (JSC::ASTBuilder::makeBinaryNode):
958         (JSC::ASTBuilder::makeAssignNode):
959         (JSC::ASTBuilder::makePrefixNode):
960         (JSC::ASTBuilder::makePostfixNode):
961         - Use JSTextPosition instead of passing line and lineStart explicitly.
962         * parser/Lexer.cpp:
963         (JSC::::lex):
964         - Added support for capturing the appropriate JSTextPositions instead
965           of just the character offset.
966         * parser/Lexer.h:
967         (JSC::Lexer::currentPosition):
968         (JSC::::lexExpectIdentifier):
969         - Added support for capturing the appropriate JSTextPositions instead
970           of just the character offset.
971         * parser/NodeConstructors.h:
972         (JSC::Node::Node):
973         (JSC::ResolveNode::ResolveNode):
974         (JSC::EvalFunctionCallNode::EvalFunctionCallNode):
975         (JSC::FunctionCallValueNode::FunctionCallValueNode):
976         (JSC::FunctionCallResolveNode::FunctionCallResolveNode):
977         (JSC::FunctionCallBracketNode::FunctionCallBracketNode):
978         (JSC::FunctionCallDotNode::FunctionCallDotNode):
979         (JSC::CallFunctionCallDotNode::CallFunctionCallDotNode):
980         (JSC::ApplyFunctionCallDotNode::ApplyFunctionCallDotNode):
981         (JSC::PostfixNode::PostfixNode):
982         (JSC::DeleteResolveNode::DeleteResolveNode):
983         (JSC::DeleteBracketNode::DeleteBracketNode):
984         (JSC::DeleteDotNode::DeleteDotNode):
985         (JSC::PrefixNode::PrefixNode):
986         (JSC::ReadModifyResolveNode::ReadModifyResolveNode):
987         (JSC::ReadModifyBracketNode::ReadModifyBracketNode):
988         (JSC::AssignBracketNode::AssignBracketNode):
989         (JSC::AssignDotNode::AssignDotNode):
990         (JSC::ReadModifyDotNode::ReadModifyDotNode):
991         (JSC::AssignErrorNode::AssignErrorNode):
992         (JSC::WithNode::WithNode):
993         (JSC::ForInNode::ForInNode):
994         - Use JSTextPosition instead of passing line and lineStart explicitly.
995         * parser/Nodes.cpp:
996         (JSC::StatementNode::setLoc):
997         - Use JSTextPosition instead of passing line and lineStart explicitly.
998         * parser/Nodes.h:
999         (JSC::Node::lineNo):
1000         (JSC::Node::startOffset):
1001         (JSC::Node::lineStartOffset):
1002         (JSC::Node::position):
1003         (JSC::ThrowableExpressionData::ThrowableExpressionData):
1004         (JSC::ThrowableExpressionData::setExceptionSourceCode):
1005         (JSC::ThrowableExpressionData::divot):
1006         (JSC::ThrowableExpressionData::divotStart):
1007         (JSC::ThrowableExpressionData::divotEnd):
1008         (JSC::ThrowableSubExpressionData::ThrowableSubExpressionData):
1009         (JSC::ThrowableSubExpressionData::setSubexpressionInfo):
1010         (JSC::ThrowableSubExpressionData::subexpressionDivot):
1011         (JSC::ThrowableSubExpressionData::subexpressionStart):
1012         (JSC::ThrowableSubExpressionData::subexpressionEnd):
1013         (JSC::ThrowablePrefixedSubExpressionData::ThrowablePrefixedSubExpressionData):
1014         (JSC::ThrowablePrefixedSubExpressionData::setSubexpressionInfo):
1015         (JSC::ThrowablePrefixedSubExpressionData::subexpressionDivot):
1016         (JSC::ThrowablePrefixedSubExpressionData::subexpressionStart):
1017         (JSC::ThrowablePrefixedSubExpressionData::subexpressionEnd):
1018         - Use JSTextPosition instead of passing line and lineStart explicitly.
1019         * parser/Parser.cpp:
1020         (JSC::::Parser):
1021         (JSC::::parseInner):
1022         - Use JSTextPosition instead of passing line and lineStart explicitly.
1023         (JSC::::didFinishParsing):
1024         - Remove setting of m_lastLine value. We always pass in the value from
1025           m_lastLine anyway. So, this assignment is effectively a nop.
1026         (JSC::::parseVarDeclaration):
1027         (JSC::::parseVarDeclarationList):
1028         (JSC::::parseForStatement):
1029         (JSC::::parseBreakStatement):
1030         (JSC::::parseContinueStatement):
1031         (JSC::::parseReturnStatement):
1032         (JSC::::parseThrowStatement):
1033         (JSC::::parseWithStatement):
1034         (JSC::::parseTryStatement):
1035         (JSC::::parseBlockStatement):
1036         (JSC::::parseFunctionDeclaration):
1037         (JSC::LabelInfo::LabelInfo):
1038         (JSC::::parseExpressionOrLabelStatement):
1039         (JSC::::parseExpressionStatement):
1040         (JSC::::parseAssignmentExpression):
1041         (JSC::::parseBinaryExpression):
1042         (JSC::::parseProperty):
1043         (JSC::::parsePrimaryExpression):
1044         (JSC::::parseMemberExpression):
1045         (JSC::::parseUnaryExpression):
1046         - Use JSTextPosition instead of passing line and lineStart explicitly.
1047         * parser/Parser.h:
1048         (JSC::Parser::next):
1049         (JSC::Parser::nextExpectIdentifier):
1050         (JSC::Parser::getToken):
1051         (JSC::Parser::tokenStartPosition):
1052         (JSC::Parser::tokenEndPosition):
1053         (JSC::Parser::lastTokenEndPosition):
1054         (JSC::::parse):
1055         - Use JSTextPosition instead of passing line and lineStart explicitly.
1056         * parser/ParserTokens.h:
1057         (JSC::JSTextPosition::JSTextPosition):
1058         (JSC::JSTextPosition::operator+):
1059         (JSC::JSTextPosition::operator-):
1060         (JSC::JSTextPosition::operator int):
1061         - Added JSTextPosition.
1062         * parser/SyntaxChecker.h:
1063         (JSC::SyntaxChecker::makeFunctionCallNode):
1064         (JSC::SyntaxChecker::makeAssignNode):
1065         (JSC::SyntaxChecker::makePrefixNode):
1066         (JSC::SyntaxChecker::makePostfixNode):
1067         (JSC::SyntaxChecker::makeDeleteNode):
1068         (JSC::SyntaxChecker::createResolve):
1069         (JSC::SyntaxChecker::createBracketAccess):
1070         (JSC::SyntaxChecker::createDotAccess):
1071         (JSC::SyntaxChecker::createRegExp):
1072         (JSC::SyntaxChecker::createNewExpr):
1073         (JSC::SyntaxChecker::createAssignResolve):
1074         (JSC::SyntaxChecker::createForInLoop):
1075         (JSC::SyntaxChecker::createReturnStatement):
1076         (JSC::SyntaxChecker::createBreakStatement):
1077         (JSC::SyntaxChecker::createContinueStatement):
1078         (JSC::SyntaxChecker::createWithStatement):
1079         (JSC::SyntaxChecker::createLabelStatement):
1080         (JSC::SyntaxChecker::createThrowStatement):
1081         (JSC::SyntaxChecker::appendBinaryExpressionInfo):
1082         (JSC::SyntaxChecker::operatorStackPop):
1083         - Use JSTextPosition instead of passing line and lineStart explicitly.
1084
1085 2013-07-29  Carlos Garcia Campos  <cgarcia@igalia.com>
1086
1087         Unreviewed. Fix make distcheck.
1088
1089         * GNUmakefile.list.am: Add missing files to compilation.
1090         * bytecode/CodeBlock.cpp: Add a ENABLE(FTL_JIT) #if block to
1091         include FTL header files not included in the compilation.
1092         * dfg/DFGDriver.cpp: Ditto.
1093         * dfg/DFGPlan.cpp: Ditto.
1094
1095 2013-07-29  Chris Curtis  <chris_curtis@apple.com>
1096
1097         Eager stack trace for error objects.
1098         https://bugs.webkit.org/show_bug.cgi?id=118918
1099
1100         Reviewed by Geoffrey Garen.
1101         
1102         Chrome and Firefox give error objects the stack property and we wanted to match
1103         that functionality. This allows developers to see the stack without throwing an object.
1104
1105         * runtime/ErrorInstance.cpp:
1106         (JSC::ErrorInstance::finishCreation):
1107          For error objects that are not thrown as an exception, we pass the stackTrace in 
1108          as a parameter. This allows the error object to have the stack property.
1109         
1110         * interpreter/Interpreter.cpp:
1111         (JSC::stackTraceAsString):
1112         Helper function used to eliminate duplicate code.
1113
1114         (JSC::Interpreter::addStackTraceIfNecessary):
1115         When an error object is created by the user the vm->exceptionStack is not set.
1116         If the user throws this error object later the stack that is in the error object 
1117         may not be the correct stack for the throw, so when we set the vm->exception stack,
1118         the stack property on the error object is set as well.
1119         
1120         * runtime/ErrorConstructor.cpp:
1121         (JSC::constructWithErrorConstructor):
1122         (JSC::callErrorConstructor):
1123         * runtime/NativeErrorConstructor.cpp:
1124         (JSC::constructWithNativeErrorConstructor):
1125         (JSC::callNativeErrorConstructor):
1126         These functions indicate that the user created an error object. For all error objects 
1127         that the user explicitly creates, the topCallFrame is at a new frame created to 
1128         handle the user's call. In this case though, the error object needs the caller's 
1129         frame to create the stack trace correctly.
1130         
1131         * interpreter/Interpreter.h:
1132         * runtime/ErrorInstance.h:
1133         (JSC::ErrorInstance::create):
1134
1135 2013-07-29  Gavin Barraclough  <barraclough@apple.com>
1136
1137         Some cleanup in PropertySlot
1138         https://bugs.webkit.org/show_bug.cgi?id=119189
1139
1140         Reviewed by Geoff Garen.
1141
1142         PropertySlot represents a property in one of four states - value, getter, custom, or custom-index.
1143         The state is currently tracked redundantly by two mechanisms - the custom getter function (m_getValue)
1144         is set to a special value to indicate the type (other than custom), and the type is also tracked by
1145         an enum - but only if cacheable. Cacheability can typically be determined by the value of m_offset
1146         (this is invalidOffset if not cacheable).
1147
1148             * Internally, always track the type of the property using an enum value, PropertyType.
1149             * Use m_offset to indicate cacheable.
1150             * Keep the external interface (CachedPropertyType) unchanged.
1151             * Better pack data into the m_data union.
1152
1153         Performance neutral.
1154
1155         * dfg/DFGRepatch.cpp:
1156         (JSC::DFG::tryCacheGetByID):
1157         (JSC::DFG::tryBuildGetByIDList):
1158             - cachedPropertyType() -> isCacheable*()
1159         * jit/JITPropertyAccess.cpp:
1160         (JSC::JIT::privateCompileGetByIdProto):
1161         (JSC::JIT::privateCompileGetByIdSelfList):
1162         (JSC::JIT::privateCompileGetByIdProtoList):
1163         (JSC::JIT::privateCompileGetByIdChainList):
1164         (JSC::JIT::privateCompileGetByIdChain):
1165             - cachedPropertyType() -> isCacheable*()
1166         * jit/JITPropertyAccess32_64.cpp:
1167         (JSC::JIT::privateCompileGetByIdProto):
1168         (JSC::JIT::privateCompileGetByIdSelfList):
1169         (JSC::JIT::privateCompileGetByIdProtoList):
1170         (JSC::JIT::privateCompileGetByIdChainList):
1171         (JSC::JIT::privateCompileGetByIdChain):
1172             - cachedPropertyType() -> isCacheable*()
1173         * jit/JITStubs.cpp:
1174         (JSC::tryCacheGetByID):
1175             - cachedPropertyType() -> isCacheable*()
1176         * llint/LLIntSlowPaths.cpp:
1177         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1178             - cachedPropertyType() -> isCacheable*()
1179         * runtime/PropertySlot.cpp:
1180         (JSC::PropertySlot::functionGetter):
1181             - refactoring described above.
1182         * runtime/PropertySlot.h:
1183         (JSC::PropertySlot::PropertySlot):
1184         (JSC::PropertySlot::getValue):
1185         (JSC::PropertySlot::isCacheable):
1186         (JSC::PropertySlot::isCacheableValue):
1187         (JSC::PropertySlot::isCacheableGetter):
1188         (JSC::PropertySlot::isCacheableCustom):
1189         (JSC::PropertySlot::cachedOffset):
1190         (JSC::PropertySlot::customGetter):
1191         (JSC::PropertySlot::setValue):
1192         (JSC::PropertySlot::setCustom):
1193         (JSC::PropertySlot::setCacheableCustom):
1194         (JSC::PropertySlot::setCustomIndex):
1195         (JSC::PropertySlot::setGetterSlot):
1196         (JSC::PropertySlot::setCacheableGetterSlot):
1197         (JSC::PropertySlot::setUndefined):
1198         (JSC::PropertySlot::slotBase):
1199         (JSC::PropertySlot::setBase):
1200             - refactoring described above.
1201
1202 2013-07-28  Oliver Hunt  <oliver@apple.com>
1203
1204         REGRESSION: Crash when opening Facebook.com
1205         https://bugs.webkit.org/show_bug.cgi?id=119155
1206
1207         Reviewed by Andreas Kling.
1208
1209         Scope nodes are always objects, so we should be using SpecObjectOther
1210         rather than SpecCellOther.  Marking Scopes as CellOther leads to a
1211         contradiction in the CFA, resulting in bogus codegen.
1212
1213         * dfg/DFGAbstractInterpreterInlines.h:
1214         (JSC::DFG::::executeEffects):
1215         * dfg/DFGPredictionPropagationPhase.cpp:
1216         (JSC::DFG::PredictionPropagationPhase::propagate):
1217
1218 2013-07-26  Oliver Hunt  <oliver@apple.com>
1219
1220         REGRESSION(FTL?): Crashes in plugin tests
1221         https://bugs.webkit.org/show_bug.cgi?id=119141
1222
1223         Reviewed by Michael Saboff.
1224
1225         Re-export getStackTrace
1226
1227         * interpreter/Interpreter.h:
1228
1229 2013-07-26  Filip Pizlo  <fpizlo@apple.com>
1230
1231         REGRESSION: Crash when opening a message on Gmail
1232         https://bugs.webkit.org/show_bug.cgi?id=119105
1233
1234         Reviewed by Oliver Hunt and Mark Hahnenberg.
1235         
1236         - GetById patching in the DFG needs to be more disciplined about how it derives the
1237           slow path.
1238         
1239         - Fix some dumping code thread safety issues.
1240
1241         * bytecode/CallLinkStatus.cpp:
1242         (JSC::CallLinkStatus::dump):
1243         * bytecode/CodeBlock.cpp:
1244         (JSC::CodeBlock::dumpBytecode):
1245         * dfg/DFGRepatch.cpp:
1246         (JSC::DFG::getPolymorphicStructureList):
1247         (JSC::DFG::tryBuildGetByIDList):
1248
1249 2013-07-26  Balazs Kilvady  <kilvadyb@homejinni.com>
1250
1251         [mips] Fix LLINT build for mips backend
1252         https://bugs.webkit.org/show_bug.cgi?id=119152
1253
1254         Reviewed by Oliver Hunt.
1255
1256         * offlineasm/mips.rb:
1257
1258 2013-07-19  Mark Hahnenberg  <mhahnenberg@apple.com>
1259
1260         Setting a large numeric property on an object causes it to allocate a huge backing store
1261         https://bugs.webkit.org/show_bug.cgi?id=118914
1262
1263         Reviewed by Geoffrey Garen.
1264
1265         There are two distinct actions that we're trying to optimize for:
1266
1267         new Array(100000);
1268
1269         and:
1270
1271         a = [];
1272         a[100000] = 42;
1273         
1274         In the first case, the programmer has indicated that they expect this Array to be very big, 
1275         so they should get a contiguous array up until some threshold, above which we perform density 
1276         calculations to see if it is indeed dense enough to warrant being contiguous.
1277         
1278         In the second case, the programmer hasn't indicated anything about the size of the Array, so 
1279         we should be more conservative and assume it should be sparse until we've proven otherwise.
1280         
1281         Currently both of those cases are handled by MIN_SPARSE_ARRAY_INDEX. We should distinguish 
1282         between them for the purposes of not over-allocating large backing stores like we see on 
1283         http://www.peekanalytics.com/burgerjoints/
1284         
1285         The way that we'll do this is to keep the MIN_SPARSE_ARRAY_INDEX for the first case, and 
1286         introduce a new heuristic for the second case. If we are putting to an index above a certain 
1287         threshold (say, 1000) and it is beyond the length of the array, then we will use a sparse 
1288         map instead. So for example, in the second case above the empty array has a blank indexing 
1289         type and a length of 0. We put-by-val to an index > 1000 and > a.length, so we'll use a sparse map.
1290
1291         This fix is ~800x speedup on the accompanying regression test :-o
1292
1293         * runtime/ArrayConventions.h:
1294         (JSC::indexIsSufficientlyBeyondLengthForSparseMap):
1295         * runtime/JSObject.cpp:
1296         (JSC::JSObject::putByIndexBeyondVectorLengthWithoutAttributes):
1297         (JSC::JSObject::putByIndexBeyondVectorLengthWithArrayStorage):
1298         (JSC::JSObject::putByIndexBeyondVectorLength):
1299         (JSC::JSObject::putDirectIndexBeyondVectorLengthWithArrayStorage):
1300
1301 2013-07-26  Julien Brianceau  <jbrianceau@nds.com>
1302
1303         REGRESSION(FTL): Fix lots of crashes in sh4 baseline JIT.
1304         https://bugs.webkit.org/show_bug.cgi?id=119148
1305
1306         Reviewed by Csaba Osztrogonác.
1307
1308         * jit/JSInterfaceJIT.h: "secondArgumentRegister" is wrong for sh4.
1309         * llint/LowLevelInterpreter32_64.asm: "move t0, a0" is missing
1310         in nativeCallTrampoline for sh4. Reuse MIPS implementation to avoid
1311         code duplication.
1312
1313 2013-07-26  Julien Brianceau  <jbrianceau@nds.com>
1314
1315         REGRESSION(FTL): Crash in sh4 baseline JIT.
1316         https://bugs.webkit.org/show_bug.cgi?id=119138
1317
1318         Reviewed by Csaba Osztrogonác.
1319
1320         This crash is due to incomplete report of r150146 and r148474.
1321
1322         * jit/JITStubsSH4.h:
1323
1324 2013-07-26  Zan Dobersek  <zdobersek@igalia.com>
1325
1326         Unreviewed.
1327
1328         * Target.pri: Adding missing DFG files to the Qt build.
1329
1330 2013-07-25  Csaba Osztrogonác  <ossy@webkit.org>
1331
1332         GTK and Qt buildfix after the intrusive win buildfix r153360.
1333
1334         * GNUmakefile.list.am:
1335         * Target.pri:
1336
1337 2013-07-25  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
1338
1339         Unreviewed, fix build break after r153360.
1340
1341         * CMakeLists.txt: Add CommonSlowPathsExceptions.cpp.
1342
1343 2013-07-25  Roger Fong  <roger_fong@apple.com>
1344
1345         Unreviewed build fix, AppleWin port.
1346
1347         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
1348         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
1349         * JavaScriptCore.vcxproj/copy-files.cmd:
1350
1351 2013-07-25  Roger Fong  <roger_fong@apple.com>
1352
1353         Unreviewed. Followup to r153360.
1354
1355         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
1356         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
1357
1358 2013-07-25  Michael Saboff  <msaboff@apple.com>
1359
1360         [Windows] Speculative build fix.
1361
1362         Moved interpreterThrowInCaller() out of LLintExceptions.cpp into new CommonSlowPathsExceptions.cpp
1363         that is always compiled.  Made LLInt::returnToThrow() conditional on LLINT being enabled.
1364
1365         * JavaScriptCore.xcodeproj/project.pbxproj:
1366         * llint/LLIntExceptions.cpp:
1367         * llint/LLIntExceptions.h:
1368         * llint/LLIntSlowPaths.cpp:
1369         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1370         * runtime/CommonSlowPaths.cpp:
1371         (JSC::SLOW_PATH_DECL):
1372         * runtime/CommonSlowPathsExceptions.cpp: Added.
1373         (JSC::CommonSlowPaths::interpreterThrowInCaller):
1374         * runtime/CommonSlowPathsExceptions.h: Added.
1375
1376 2013-07-25  Brent Fulgham  <bfulgham@apple.com>
1377
1378         [Windows] Unreviewed build fix.
1379
1380         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Add missing IntendedStructureChange.h,.cpp and
1381         parser/SourceCode.h,.cpp.
1382         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
1383
1384 2013-07-25  Anders Carlsson  <andersca@apple.com>
1385
1386         ASSERT(m_vm->apiLock().currentThreadIsHoldingLock()); fails for Safari on current ToT
1387         https://bugs.webkit.org/show_bug.cgi?id=119108
1388
1389         Reviewed by Mark Hahnenberg.
1390
1391         Add a currentThreadIsHoldingAPILock() function to VM that checks if the current thread is the exclusive API thread.
1392
1393         * heap/CopiedSpace.cpp:
1394         (JSC::CopiedSpace::tryAllocateSlowCase):
1395         * heap/Heap.cpp:
1396         (JSC::Heap::protect):
1397         (JSC::Heap::unprotect):
1398         (JSC::Heap::collect):
1399         * heap/MarkedAllocator.cpp:
1400         (JSC::MarkedAllocator::allocateSlowCase):
1401         * runtime/JSGlobalObject.cpp:
1402         (JSC::JSGlobalObject::init):
1403         * runtime/VM.h:
1404         (JSC::VM::currentThreadIsHoldingAPILock):
1405
1406 2013-07-25  Zan Dobersek  <zdobersek@igalia.com>
1407
1408         REGRESSION(FTL): Most layout tests crashes
1409         https://bugs.webkit.org/show_bug.cgi?id=119089
1410
1411         Reviewed by Oliver Hunt.
1412
1413         * runtime/ExecutionHarness.h:
1414         (JSC::prepareForExecution): Move prepareForExecutionImpl call into its own statement. This prevents the GCC-compiled
1415         code to create the PassOwnPtr<JSC::JITCode> (intended as a parameter to the installOptimizedCode call) from the jitCode
1416         RefPtr<JSC::JITCode> parameter before the latter was actually given a proper value through the prepareForExecutionImpl call.
1417         Currently it's created beforehand and therefor holds a null pointer before it's anchored as the JIT code in
1418         JSC::CodeBlock::setJITCode, which later indirectly causes assertions in JSC::CodeBlock::jitCompile.
1419         (JSC::prepareFunctionForExecution): Ditto for prepareFunctionForExecutionImpl.
1420
1421 2013-07-25  Brent Fulgham  <bfulgham@apple.com>
1422
1423         [Windows] Unreviewed build fix.
1424
1425         * JavaScriptCore.vcxproj/JavaScriptCoreCommon.props: Add missing 'ftl'
1426         include path.
1427
1428 2013-07-25  Brent Fulgham  <bfulgham@apple.com>
1429
1430         [Windows] Unreviewed build fix.
1431
1432         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Add some missing files:
1433         runtime/VM.h,.cpp; Remove deleted JSGlobalData.h,.cpp.
1434         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Ditto.
1435
1436 2013-07-25  Oliver Hunt  <oliver@apple.com>
1437
1438         Make all jit & non-jit combos build cleanly
1439         https://bugs.webkit.org/show_bug.cgi?id=119102
1440
1441         Reviewed by Anders Carlsson.
1442
1443         * bytecode/CodeBlock.cpp:
1444         (JSC::CodeBlock::counterValueForOptimizeSoon):
1445         * bytecode/CodeBlock.h:
1446         (JSC::CodeBlock::optimizeAfterWarmUp):
1447         (JSC::CodeBlock::numberOfDFGCompiles):
1448
1449 2013-07-25  Oliver Hunt  <oliver@apple.com>
1450
1451         32 bit portion of load validation logic
1452         https://bugs.webkit.org/show_bug.cgi?id=118878
1453
1454         Reviewed by NOBODY (Build fix).
1455
1456         * dfg/DFGSpeculativeJIT32_64.cpp:
1457         (JSC::DFG::SpeculativeJIT::compile):
1458
1459 2013-07-25  Oliver Hunt  <oliver@apple.com>
1460
1461         More 32bit build fixes
1462
1463         - Apparnetly some compilers don't track the fastcall directive everywhere we expect
1464
1465         * API/APICallbackFunction.h:
1466         (JSC::APICallbackFunction::call):
1467         * bytecode/CodeBlock.cpp:
1468         * runtime/Structure.cpp:
1469
1470 2013-07-25  Yi Shen  <max.hong.shen@gmail.com>
1471
1472         Optimize the thread locks for API Shims
1473         https://bugs.webkit.org/show_bug.cgi?id=118573
1474
1475         Reviewed by Geoffrey Garen.
1476
1477         Remove the thread lock from API Shims if the VM has an exclusive thread (e.g. the VM 
1478         only used by WebCore's main thread).
1479
1480         * API/APIShims.h:
1481         (JSC::APIEntryShim::APIEntryShim):
1482         (JSC::APICallbackShim::APICallbackShim):
1483         * runtime/JSLock.cpp:
1484         (JSC::JSLockHolder::JSLockHolder):
1485         (JSC::JSLockHolder::init):
1486         (JSC::JSLockHolder::~JSLockHolder):
1487         (JSC::JSLock::DropAllLocks::DropAllLocks):
1488         (JSC::JSLock::DropAllLocks::~DropAllLocks):
1489         * runtime/VM.cpp:
1490         (JSC::VM::VM):
1491         * runtime/VM.h:
1492
1493 2013-07-25  Christophe Dumez  <ch.dumez@sisa.samsung.com>
1494
1495         Unreviewed build fix after r153218.
1496
1497         Broke the EFL port build with gcc 4.7.
1498
1499         * interpreter/StackIterator.cpp:
1500         (JSC::printif):
1501
1502 2013-07-25  Julien Brianceau  <jbrianceau@nds.com>
1503
1504         Build fix: add missing #include.
1505         https://bugs.webkit.org/show_bug.cgi?id=119087
1506
1507         Reviewed by Allan Sandfeld Jensen.
1508
1509         * bytecode/ArrayProfile.cpp:
1510
1511 2013-07-25  Ryuan Choi  <ryuan.choi@samsung.com>
1512
1513         Unreviewed, build fix on the EFL port.
1514
1515         * CMakeLists.txt: Added JSCTestRunnerUtils.cpp.
1516
1517 2013-07-25  Julien Brianceau  <jbrianceau@nds.com>
1518
1519         [sh4] Add missing store8(TrustedImm32, void*) implementation in baseline JIT.
1520         https://bugs.webkit.org/show_bug.cgi?id=119083
1521
1522         Reviewed by Allan Sandfeld Jensen.
1523
1524         * assembler/MacroAssemblerSH4.h:
1525         (JSC::MacroAssemblerSH4::store8):
1526
1527 2013-07-25  Allan Sandfeld Jensen  <allan.jensen@digia.com>
1528
1529         [Qt] Fix test build after FTL upstream
1530
1531         Unreviewed build fix.
1532
1533         * Target.pri:
1534
1535 2013-07-25  Allan Sandfeld Jensen  <allan.jensen@digia.com>
1536
1537         [Qt] Build fix after FTL.
1538
1539         Un Reviewed build fix.
1540
1541         * Target.pri:
1542         * interpreter/StackIterator.cpp:
1543         (JSC::StackIterator::Frame::print):
1544
1545 2013-07-25  Gabor Rapcsanyi  <rgabor@webkit.org>
1546
1547         Unreviewed build fix after FTL upstream.
1548
1549         * dfg/DFGWorklist.cpp:
1550         (JSC::DFG::Worklist::~Worklist):
1551
1552 2013-07-25  Ryuan Choi  <ryuan.choi@samsung.com>
1553
1554         Unreviewed, build fix on the EFL port.
1555
1556         * CMakeLists.txt:
1557         Added SourceCode.cpp and removed BlackBerry file.
1558         * jit/JITCode.h:
1559         (JSC::JITCode::nextTierJIT):
1560         Fixed to build break because of -Werror=return-type
1561         * parser/Lexer.cpp: Includes JSFunctionInlines.h
1562         * runtime/JSScope.h:
1563         (JSC::makeType):
1564         Fixed to build break because of -Werror=return-type
1565
1566 2013-07-25  Ádám Kallai  <kadam@inf.u-szeged.hu>
1567
1568         Unreviewed build fixing after FTL upstream.
1569
1570         * runtime/Executable.cpp:
1571         (JSC::FunctionExecutable::produceCodeBlockFor):
1572
1573 2013-07-25  Julien Brianceau  <jbrianceau@nds.com>
1574
1575         Add missing implementation of bxxxnz in sh4 LLINT.
1576         https://bugs.webkit.org/show_bug.cgi?id=119079
1577
1578         Reviewed by Allan Sandfeld Jensen.
1579
1580         * offlineasm/sh4.rb:
1581
1582 2013-07-25  Gabor Rapcsanyi  <rgabor@webkit.org>
1583
1584         Unreviewed, build fix on the Qt port.
1585
1586         * Target.pri: Add additional build files for the FTL.
1587
1588 2013-07-25  Ádám Kallai  <kadam@inf.u-szeged.hu>
1589
1590         Unreviewed buildfix after FTL upstream..
1591
1592         * interpreter/StackIterator.cpp:
1593         (JSC::StackIterator::Frame::codeType):
1594         (JSC::StackIterator::Frame::functionName):
1595         (JSC::StackIterator::Frame::sourceURL):
1596         (JSC::StackIterator::Frame::logicalFrame):
1597
1598 2013-07-25  Zan Dobersek  <zdobersek@igalia.com>
1599
1600         Unreviewed.
1601
1602         * heap/CopyVisitor.cpp: Include CopiedSpaceInlines header so the CopiedSpace::recycleEvacuatedBlock
1603         method is not left undefined, causing build failures on (at least) the GTK port.
1604
1605 2013-07-25  Zan Dobersek  <zdobersek@igalia.com>
1606
1607         Unreviewed, further build fixing on the GTK port.
1608
1609         * GNUmakefile.list.am: Add CompilationResult source files to the build.
1610
1611 2013-07-25  Zan Dobersek  <zdobersek@igalia.com>
1612
1613         Unreviewed GTK build fixing.
1614
1615         * GNUmakefile.am: Make the shared libjsc library depend on any changes to the build target list.
1616         * GNUmakefile.list.am: Add additional build targets for files that were introduced by the FTL branch merge.
1617
1618 2013-07-25  Csaba Osztrogonác  <ossy@webkit.org>
1619
1620         Buildfix after this error:
1621         error: 'pathName' may be used uninitialized in this function [-Werror=uninitialized]
1622
1623         * dfg/DFGPlan.cpp:
1624         (JSC::DFG::Plan::compileInThread):
1625
1626 2013-07-25  Csaba Osztrogonác  <ossy@webkit.org>
1627
1628         One more buildfix after FTL upstream.
1629
1630         Return a dummy value after RELEASE_ASSERT_NOT_REACHED() to make GCC happy.
1631
1632         * dfg/DFGLazyJSValue.cpp:
1633         (JSC::DFG::LazyJSValue::getValue):
1634         (JSC::DFG::LazyJSValue::strictEqual):
1635
1636 2013-07-25  Julien Brianceau  <jbrianceau@nds.com>
1637
1638         Fix "Unhandled opcode localAnnotation" build error in sh4 and mips LLINT.
1639         https://bugs.webkit.org/show_bug.cgi?id=119076
1640
1641         Reviewed by Allan Sandfeld Jensen.
1642
1643         * offlineasm/mips.rb:
1644         * offlineasm/sh4.rb:
1645
1646 2013-07-25  Zan Dobersek  <zdobersek@igalia.com>
1647
1648         Unreviewed GTK build fix.
1649
1650         * GNUmakefile.list.am: Adding JSCTestRunnerUtils files to the build.
1651
1652 2013-07-25  Zan Dobersek  <zdobersek@igalia.com>
1653
1654         Unreviewed. Further build fixing for the GTK port. Adding the forwarding header
1655         for JSCTestRunnerUtils.h as required by the DumpRenderTree compilation.
1656
1657         * ForwardingHeaders/JavaScriptCore/JSCTestRunnerUtils.h: Added.
1658
1659 2013-07-25  Zan Dobersek  <zdobersek@igalia.com>
1660
1661         Unreviewed. Fixing the GTK build after the FTL merging by updating the build targets list.
1662
1663         * GNUmakefile.am:
1664         * GNUmakefile.list.am:
1665
1666 2013-07-25  Ádám Kallai  <kadam@inf.u-szeged.hu>
1667
1668         Unreviewed buildfix after FTL upstream.
1669
1670         * runtime/JSScope.h:
1671         (JSC::needsVarInjectionChecks):
1672
1673 2013-07-25  Csaba Osztrogonác  <ossy@webkit.org>
1674
1675         One more fix after FTL upstream.
1676
1677         * Target.pri:
1678         * bytecode/CodeBlock.h:
1679         * bytecode/GetByIdStatus.h:
1680         (JSC::GetByIdStatus::GetByIdStatus):
1681
1682 2013-07-24  Csaba Osztrogonác  <ossy@webkit.org>
1683
1684         Unreviewed buildfix after FTL upstream.
1685
1686         Add ftl directory as include path.
1687
1688         * CMakeLists.txt:
1689         * JavaScriptCore.pri:
1690
1691 2013-07-24  Csaba Osztrogonác  <ossy@webkit.org>
1692
1693         Unreviewed buildfix after FTL upstream for non C++11 builds.
1694
1695         * interpreter/CallFrame.h:
1696         * interpreter/StackIteratorPrivate.h:
1697         (JSC::StackIterator::end):
1698
1699 2013-07-24  Oliver Hunt  <oliver@apple.com>
1700
1701         Endeavour to fix CMakelist builds
1702
1703         * CMakeLists.txt:
1704
1705 2013-07-24  Filip Pizlo  <fpizlo@apple.com>
1706
1707         fourthTier: DFG IR dumps should be easier to read
1708         https://bugs.webkit.org/show_bug.cgi?id=119050
1709
1710         Reviewed by Mark Hahnenberg.
1711         
1712         Added a DumpContext that includes support for printing an endnote
1713         that describes all structures in full, while the main flow of the
1714         dump just uses made-up names for the structures. This is helpful
1715         since Structure::dump() may print a lot. The stuff it prints is
1716         useful, but if it's all inline with the surrounding thing you're        
1717         dumping (often, a node in the DFG), then you get a ridiculously
1718         long print-out. All classes that dump structures (including
1719         Structure itself) now have dumpInContext() methods that use
1720         inContext() for dumping anything that might transitively print a
1721         structure. If Structure::dumpInContext() is called with a NULL
1722         context, it just uses dump() like before. Hence you don't have to
1723         know anything about DumpContext unless you want to.
1724         
1725         inContext(*structure, context) dumps something like %B4:Array,
1726         and the endnote will have something like:
1727         
1728             %B4:Array    = 0x10e91a180:[Array, {Edge:100, Normal:101, Line:102, NumPx:103, LastPx:104}, ArrayWithContiguous, Proto:0x10e99ffe0]
1729         
1730         where B4 is the inferred name that StringHashDumpContext came up
1731         with.
1732         
1733         Also shortened a bunch of other dumps, removing information that
1734         isn't so important.
1735         
1736         * JavaScriptCore.xcodeproj/project.pbxproj:
1737         * bytecode/ArrayProfile.cpp:
1738         (JSC::dumpArrayModes):
1739         * bytecode/CodeBlockHash.cpp:
1740         (JSC):
1741         (JSC::CodeBlockHash::CodeBlockHash):
1742         (JSC::CodeBlockHash::dump):
1743         * bytecode/CodeOrigin.cpp:
1744         (JSC::CodeOrigin::dumpInContext):
1745         (JSC):
1746         (JSC::InlineCallFrame::dumpInContext):
1747         (JSC::InlineCallFrame::dump):
1748         * bytecode/CodeOrigin.h:
1749         (CodeOrigin):
1750         (InlineCallFrame):
1751         * bytecode/Operands.h:
1752         (JSC::OperandValueTraits::isEmptyForDump):
1753         (Operands):
1754         (JSC::Operands::dump):
1755         (JSC):
1756         * bytecode/OperandsInlines.h: Added.
1757         (JSC):
1758         (JSC::::dumpInContext):
1759         * bytecode/StructureSet.h:
1760         (JSC::StructureSet::dumpInContext):
1761         (JSC::StructureSet::dump):
1762         (StructureSet):
1763         * dfg/DFGAbstractValue.cpp:
1764         (JSC::DFG::AbstractValue::dump):
1765         (DFG):
1766         (JSC::DFG::AbstractValue::dumpInContext):
1767         * dfg/DFGAbstractValue.h:
1768         (JSC::DFG::AbstractValue::operator!):
1769         (AbstractValue):
1770         * dfg/DFGCFAPhase.cpp:
1771         (JSC::DFG::CFAPhase::performBlockCFA):
1772         * dfg/DFGCommon.cpp:
1773         * dfg/DFGCommon.h:
1774         (JSC::DFG::NodePointerTraits::isEmptyForDump):
1775         * dfg/DFGDisassembler.cpp:
1776         (JSC::DFG::Disassembler::createDumpList):
1777         * dfg/DFGDisassembler.h:
1778         (Disassembler):
1779         * dfg/DFGFlushFormat.h:
1780         (WTF::inContext):
1781         (WTF):
1782         * dfg/DFGFlushLivenessAnalysisPhase.cpp:
1783         * dfg/DFGGraph.cpp:
1784         (JSC::DFG::Graph::dumpCodeOrigin):
1785         (JSC::DFG::Graph::dump):
1786         (JSC::DFG::Graph::dumpBlockHeader):
1787         * dfg/DFGGraph.h:
1788         (Graph):
1789         * dfg/DFGLazyJSValue.cpp:
1790         (JSC::DFG::LazyJSValue::dumpInContext):
1791         (JSC::DFG::LazyJSValue::dump):
1792         (DFG):
1793         * dfg/DFGLazyJSValue.h:
1794         (LazyJSValue):
1795         * dfg/DFGNode.h:
1796         (JSC::DFG::nodeMapDump):
1797         (WTF::inContext):
1798         (WTF):
1799         * dfg/DFGOSRExitCompiler32_64.cpp:
1800         (JSC::DFG::OSRExitCompiler::compileExit):
1801         * dfg/DFGOSRExitCompiler64.cpp:
1802         (JSC::DFG::OSRExitCompiler::compileExit):
1803         * dfg/DFGStructureAbstractValue.h:
1804         (JSC::DFG::StructureAbstractValue::dumpInContext):
1805         (JSC::DFG::StructureAbstractValue::dump):
1806         (StructureAbstractValue):
1807         * ftl/FTLExitValue.cpp:
1808         (JSC::FTL::ExitValue::dumpInContext):
1809         (JSC::FTL::ExitValue::dump):
1810         (FTL):
1811         * ftl/FTLExitValue.h:
1812         (ExitValue):
1813         * ftl/FTLLowerDFGToLLVM.cpp:
1814         * ftl/FTLValueSource.cpp:
1815         (JSC::FTL::ValueSource::dumpInContext):
1816         (FTL):
1817         * ftl/FTLValueSource.h:
1818         (ValueSource):
1819         * runtime/DumpContext.cpp: Added.
1820         (JSC):
1821         (JSC::DumpContext::DumpContext):
1822         (JSC::DumpContext::~DumpContext):
1823         (JSC::DumpContext::isEmpty):
1824         (JSC::DumpContext::dump):
1825         * runtime/DumpContext.h: Added.
1826         (JSC):
1827         (DumpContext):
1828         * runtime/JSCJSValue.cpp:
1829         (JSC::JSValue::dump):
1830         (JSC):
1831         (JSC::JSValue::dumpInContext):
1832         * runtime/JSCJSValue.h:
1833         (JSC):
1834         (JSValue):
1835         * runtime/Structure.cpp:
1836         (JSC::Structure::dumpInContext):
1837         (JSC):
1838         (JSC::Structure::dumpBrief):
1839         (JSC::Structure::dumpContextHeader):
1840         * runtime/Structure.h:
1841         (JSC):
1842         (Structure):
1843
1844 2013-07-22  Filip Pizlo  <fpizlo@apple.com>
1845
1846         fourthTier: DFG should do a high-level LICM before going to FTL
1847         https://bugs.webkit.org/show_bug.cgi?id=118749
1848
1849         Reviewed by Oliver Hunt.
1850         
1851         Implements LICM hoisting for nodes that never write anything and never read
1852         things that are clobbered by the loop. There are some other preconditions for
1853         hoisting, see DFGLICMPhase.cpp.
1854
1855         Also did a few fixes:
1856         
1857         - ClobberSet::add was failing to switch Super entries to Direct entries in
1858           some cases.
1859         
1860         - DFGClobberize.cpp needed to #include "Operations.h".
1861         
1862         - DCEPhase needs to process the graph in reverse DFS order, when we're in SSA.
1863         
1864         - AbstractInterpreter can now execute a Node without knowing its indexInBlock.
1865           Knowing the indexInBlock is an optional optimization that all other clients
1866           of AI still opt into, but LICM doesn't.
1867         
1868         This makes the FTL a 2.19x speed-up on imaging-gaussian-blur.
1869
1870         * JavaScriptCore.xcodeproj/project.pbxproj:
1871         * dfg/DFGAbstractInterpreter.h:
1872         (AbstractInterpreter):
1873         * dfg/DFGAbstractInterpreterInlines.h:
1874         (JSC::DFG::::executeEffects):
1875         (JSC::DFG::::execute):
1876         (DFG):
1877         (JSC::DFG::::clobberWorld):
1878         (JSC::DFG::::clobberStructures):
1879         * dfg/DFGAtTailAbstractState.cpp: Added.
1880         (DFG):
1881         (JSC::DFG::AtTailAbstractState::AtTailAbstractState):
1882         (JSC::DFG::AtTailAbstractState::~AtTailAbstractState):
1883         (JSC::DFG::AtTailAbstractState::createValueForNode):
1884         (JSC::DFG::AtTailAbstractState::forNode):
1885         * dfg/DFGAtTailAbstractState.h: Added.
1886         (DFG):
1887         (AtTailAbstractState):
1888         (JSC::DFG::AtTailAbstractState::initializeTo):
1889         (JSC::DFG::AtTailAbstractState::forNode):
1890         (JSC::DFG::AtTailAbstractState::variables):
1891         (JSC::DFG::AtTailAbstractState::block):
1892         (JSC::DFG::AtTailAbstractState::isValid):
1893         (JSC::DFG::AtTailAbstractState::setDidClobber):
1894         (JSC::DFG::AtTailAbstractState::setIsValid):
1895         (JSC::DFG::AtTailAbstractState::setBranchDirection):
1896         (JSC::DFG::AtTailAbstractState::setFoundConstants):
1897         (JSC::DFG::AtTailAbstractState::haveStructures):
1898         (JSC::DFG::AtTailAbstractState::setHaveStructures):
1899         * dfg/DFGBasicBlock.h:
1900         (JSC::DFG::BasicBlock::insertBeforeLast):
1901         * dfg/DFGBasicBlockInlines.h:
1902         (DFG):
1903         * dfg/DFGClobberSet.cpp:
1904         (JSC::DFG::ClobberSet::add):
1905         (JSC::DFG::ClobberSet::addAll):
1906         * dfg/DFGClobberize.cpp:
1907         (JSC::DFG::doesWrites):
1908         * dfg/DFGClobberize.h:
1909         (DFG):
1910         * dfg/DFGDCEPhase.cpp:
1911         (JSC::DFG::DCEPhase::DCEPhase):
1912         (JSC::DFG::DCEPhase::run):
1913         (JSC::DFG::DCEPhase::fixupBlock):
1914         (DCEPhase):
1915         * dfg/DFGEdgeDominates.h: Added.
1916         (DFG):
1917         (EdgeDominates):
1918         (JSC::DFG::EdgeDominates::EdgeDominates):
1919         (JSC::DFG::EdgeDominates::operator()):
1920         (JSC::DFG::EdgeDominates::result):
1921         (JSC::DFG::edgesDominate):
1922         * dfg/DFGFixupPhase.cpp:
1923         (JSC::DFG::FixupPhase::fixupNode):
1924         (JSC::DFG::FixupPhase::checkArray):
1925         * dfg/DFGLICMPhase.cpp: Added.
1926         (LICMPhase):
1927         (JSC::DFG::LICMPhase::LICMPhase):
1928         (JSC::DFG::LICMPhase::run):
1929         (JSC::DFG::LICMPhase::attemptHoist):
1930         (DFG):
1931         (JSC::DFG::performLICM):
1932         * dfg/DFGLICMPhase.h: Added.
1933         (DFG):
1934         * dfg/DFGPlan.cpp:
1935         (JSC::DFG::Plan::compileInThreadImpl):
1936
1937 2013-07-21  Filip Pizlo  <fpizlo@apple.com>
1938
1939         fourthTier: DFG Nodes should be able to abstractly tell you what they read and what they write
1940         https://bugs.webkit.org/show_bug.cgi?id=118910
1941
1942         Reviewed by Sam Weinig.
1943         
1944         Add the notion of AbstractHeap to the DFG. This is analogous to the AbstractHeap in
1945         the FTL, except that the FTL's AbstractHeaps are used during LLVM lowering and are
1946         engineered to obey LLVM TBAA logic. The FTL's AbstractHeaps are also engineered to
1947         be inexpensive to use (they just give you a TBAA node) but expensive to create (you
1948         create them all up front). FTL AbstractHeaps also don't actually give you the
1949         ability to reason about aliasing; they are *just* a mechanism for lowering to TBAA.
1950         The DFG's AbstractHeaps are engineered to be both cheap to create and cheap to use.
1951         They also give you aliasing machinery. The DFG AbstractHeaps are represented
1952         internally by a int64_t. Many comparisons between them are just integer comaprisons.
1953         AbstractHeaps form a three-level hierarchy (World is the supertype of everything,
1954         Kind with a TOP payload is a direct subtype of World, and Kind with a non-TOP
1955         payload is the direct subtype of its corresponding TOP Kind).
1956         
1957         Add the notion of a ClobberSet. This is the set of AbstractHeaps that you had
1958         clobbered. It represents the set that results from unifying a bunch of
1959         AbstractHeaps, and is intended to quickly answer overlap questions: does the given
1960         AbstractHeap overlap any AbstractHeap in the ClobberSet? To this end, if you add an
1961         AbstractHeap to a set, it "directly" adds the heap itself, and "super" adds all of
1962         its ancestors. An AbstractHeap is said to overlap a set if any direct or super
1963         member is equal to it, or if any of its ancestors are equal to a direct member.
1964         
1965         Example #1:
1966         
1967             - I add Variables(5). I.e. Variables is the Kind and 5 is the payload. This
1968               is a subtype of Variables, which is a subtype of World.
1969             - You query Variables. I.e. Variables with a TOP payload, which is the
1970               supertype of Variables(X) for any X, and a subtype of World.
1971             
1972             The set will have Variables(5) as a direct member, and Variables and World as
1973             super members. The Variables query will immediately return true, because
1974             Variables is indeed a super member.
1975         
1976         Example #2:
1977         
1978             - I add Variables(5)
1979             - You query NamedProperties
1980             
1981             NamedProperties is not a member at all (neither direct or super). We next
1982             query World. World is a member, but it's a super member, so we return false.
1983         
1984         Example #3:
1985         
1986             - I add Variables
1987             - You query Variables(5)
1988             
1989             The set will have Variables as a direct member, and World as a super member.
1990             The Variables(5) query will not find Variables(5) in the set, but then it
1991             will query Variables. Variables is a direct member, so we return true.
1992         
1993         Example #4:
1994         
1995             - I add Variables
1996             - You query NamedProperties(5)
1997             
1998             Neither NamedProperties nor NamedProperties(5) are members. We next query
1999             World. World is a member, but it's a super member, so we return false.
2000         
2001         Overlap queries require that either the heap being queried is in the set (either
2002         direct or super), or that one of its ancestors is a direct member. Another way to
2003         think about how this works is that two heaps A and B are said to overlap if
2004         A.isSubtypeOf(B) or B.isSubtypeOf(A). This is sound since heaps form a
2005         single-inheritance heirarchy. Consider that we wanted to implement a set that holds
2006         heaps and answers the question, "is any member in the set an ancestor (i.e.
2007         supertype) of some other heap". We would have the set contain the heaps themselves,
2008         and we would satisfy the query "A.isSubtypeOfAny(set)" by walking the ancestor
2009         chain of A, and repeatedly querying its membership in the set. This is what the
2010         "direct" members of our set do. Now consider the other part, where we want to ask if
2011         any member of the set is a descendent of a heap, or "A.isSupertypeOfAny(set)". We
2012         would implement this by implementing set.add(B) as adding not just B but also all of
2013         B's ancestors; then we would answer A.isSupertypeOfAny(set) by just checking if A is
2014         in the set. With two such sets - one that answers isSubtypeOfAny() and another that
2015         answers isSupertypeOfAny() - we could answer the "do any of my heaps overlap your
2016         heap" question. ClobberSet does this, but combines the two sets into a single
2017         HashMap. The HashMap's value, "direct", means that the key is a member of both the
2018         supertype set and the subtype set; if it's false then it's only a member of one of
2019         them.
2020         
2021         Finally, this adds a functorized clobberize() method that adds the read and write
2022         clobbers of a DFG::Node to read and write functors. Common functors for adding to
2023         ClobberSets, querying overlap, and doing nothing are provided. Convenient wrappers
2024         are also provided. This allows you to say things like:
2025         
2026             ClobberSet set;
2027             addWrites(graph, node1, set);
2028             if (readsOverlap(graph, node2, set))
2029                 // We know that node1 may write to something that node2 may read from.
2030         
2031         Currently this facility is only used to improve graph dumping, but it will be
2032         instrumental in both LICM and GVN. In the future, I want to completely kill the
2033         NodeClobbersWorld and NodeMightClobber flags, and eradicate CSEPhase's hackish way
2034         of accomplishing almost exactly what AbstractHeap gives you.
2035
2036         * JavaScriptCore.xcodeproj/project.pbxproj:
2037         * dfg/DFGAbstractHeap.cpp: Added.
2038         (DFG):
2039         (JSC::DFG::AbstractHeap::Payload::dump):
2040         (JSC::DFG::AbstractHeap::dump):
2041         (WTF):
2042         (WTF::printInternal):
2043         * dfg/DFGAbstractHeap.h: Added.
2044         (DFG):
2045         (AbstractHeap):
2046         (Payload):
2047         (JSC::DFG::AbstractHeap::Payload::Payload):
2048         (JSC::DFG::AbstractHeap::Payload::top):
2049         (JSC::DFG::AbstractHeap::Payload::isTop):
2050         (JSC::DFG::AbstractHeap::Payload::value):
2051         (JSC::DFG::AbstractHeap::Payload::valueImpl):
2052         (JSC::DFG::AbstractHeap::Payload::operator==):
2053         (JSC::DFG::AbstractHeap::Payload::operator!=):
2054         (JSC::DFG::AbstractHeap::Payload::operator<):
2055         (JSC::DFG::AbstractHeap::Payload::isDisjoint):
2056         (JSC::DFG::AbstractHeap::Payload::overlaps):
2057         (JSC::DFG::AbstractHeap::AbstractHeap):
2058         (JSC::DFG::AbstractHeap::operator!):
2059         (JSC::DFG::AbstractHeap::kind):
2060         (JSC::DFG::AbstractHeap::payload):
2061         (JSC::DFG::AbstractHeap::isDisjoint):
2062         (JSC::DFG::AbstractHeap::overlaps):
2063         (JSC::DFG::AbstractHeap::supertype):
2064         (JSC::DFG::AbstractHeap::hash):
2065         (JSC::DFG::AbstractHeap::operator==):
2066         (JSC::DFG::AbstractHeap::operator!=):
2067         (JSC::DFG::AbstractHeap::operator<):
2068         (JSC::DFG::AbstractHeap::isHashTableDeletedValue):
2069         (JSC::DFG::AbstractHeap::payloadImpl):
2070         (JSC::DFG::AbstractHeap::encode):
2071         (JSC::DFG::AbstractHeapHash::hash):
2072         (JSC::DFG::AbstractHeapHash::equal):
2073         (AbstractHeapHash):
2074         (WTF):
2075         * dfg/DFGClobberSet.cpp: Added.
2076         (DFG):
2077         (JSC::DFG::ClobberSet::ClobberSet):
2078         (JSC::DFG::ClobberSet::~ClobberSet):
2079         (JSC::DFG::ClobberSet::add):
2080         (JSC::DFG::ClobberSet::addAll):
2081         (JSC::DFG::ClobberSet::contains):
2082         (JSC::DFG::ClobberSet::overlaps):
2083         (JSC::DFG::ClobberSet::clear):
2084         (JSC::DFG::ClobberSet::direct):
2085         (JSC::DFG::ClobberSet::super):
2086         (JSC::DFG::ClobberSet::dump):
2087         (JSC::DFG::ClobberSet::setOf):
2088         (JSC::DFG::addReads):
2089         (JSC::DFG::addWrites):
2090         (JSC::DFG::addReadsAndWrites):
2091         (JSC::DFG::readsOverlap):
2092         (JSC::DFG::writesOverlap):
2093         * dfg/DFGClobberSet.h: Added.
2094         (DFG):
2095         (ClobberSet):
2096         (JSC::DFG::ClobberSet::isEmpty):
2097         (ClobberSetAdd):
2098         (JSC::DFG::ClobberSetAdd::ClobberSetAdd):
2099         (JSC::DFG::ClobberSetAdd::operator()):
2100         (ClobberSetOverlaps):
2101         (JSC::DFG::ClobberSetOverlaps::ClobberSetOverlaps):
2102         (JSC::DFG::ClobberSetOverlaps::operator()):
2103         (JSC::DFG::ClobberSetOverlaps::result):
2104         * dfg/DFGClobberize.cpp: Added.
2105         (DFG):
2106         (JSC::DFG::didWrites):
2107         * dfg/DFGClobberize.h: Added.
2108         (DFG):
2109         (JSC::DFG::clobberize):
2110         (NoOpClobberize):
2111         (JSC::DFG::NoOpClobberize::NoOpClobberize):
2112         (JSC::DFG::NoOpClobberize::operator()):
2113         (CheckClobberize):
2114         (JSC::DFG::CheckClobberize::CheckClobberize):
2115         (JSC::DFG::CheckClobberize::operator()):
2116         (JSC::DFG::CheckClobberize::result):
2117         * dfg/DFGGraph.cpp:
2118         (JSC::DFG::Graph::dump):
2119
2120 2013-07-21  Filip Pizlo  <fpizlo@apple.com>
2121
2122         fourthTier: It should be easy to figure out which blocks nodes belong to
2123         https://bugs.webkit.org/show_bug.cgi?id=118957
2124
2125         Reviewed by Sam Weinig.
2126
2127         * dfg/DFGGraph.cpp:
2128         (DFG):
2129         (JSC::DFG::Graph::initializeNodeOwners):
2130         * dfg/DFGGraph.h:
2131         (Graph):
2132         * dfg/DFGNode.h:
2133
2134 2013-07-21  Filip Pizlo  <fpizlo@apple.com>
2135
2136         fourthTier: NodeExitsForward shouldn't be duplicated in NodeType
2137         https://bugs.webkit.org/show_bug.cgi?id=118956
2138
2139         Reviewed by Sam Weinig.
2140         
2141         We had two way of expressing that something exits forward: the NodeExitsForward
2142         flag and the word 'Forward' in the NodeType. That's kind of dumb. This patch
2143         makes it just be a flag.
2144
2145         * dfg/DFGAbstractInterpreterInlines.h:
2146         (JSC::DFG::::executeEffects):
2147         * dfg/DFGArgumentsSimplificationPhase.cpp:
2148         (JSC::DFG::ArgumentsSimplificationPhase::run):
2149         * dfg/DFGCSEPhase.cpp:
2150         (JSC::DFG::CSEPhase::int32ToDoubleCSE):
2151         (JSC::DFG::CSEPhase::checkStructureElimination):
2152         (JSC::DFG::CSEPhase::structureTransitionWatchpointElimination):
2153         (JSC::DFG::CSEPhase::putStructureStoreElimination):
2154         (JSC::DFG::CSEPhase::checkArrayElimination):
2155         (JSC::DFG::CSEPhase::performNodeCSE):
2156         * dfg/DFGConstantFoldingPhase.cpp:
2157         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2158         * dfg/DFGFixupPhase.cpp:
2159         (JSC::DFG::FixupPhase::fixupNode):
2160         (JSC::DFG::FixupPhase::injectInt32ToDoubleNode):
2161         * dfg/DFGMinifiedNode.h:
2162         (JSC::DFG::belongsInMinifiedGraph):
2163         (JSC::DFG::MinifiedNode::hasChild):
2164         * dfg/DFGNode.h:
2165         (JSC::DFG::Node::convertToStructureTransitionWatchpoint):
2166         (JSC::DFG::Node::hasStructureSet):
2167         (JSC::DFG::Node::hasStructure):
2168         (JSC::DFG::Node::hasArrayMode):
2169         (JSC::DFG::Node::willHaveCodeGenOrOSR):
2170         * dfg/DFGNodeType.h:
2171         (DFG):
2172         (JSC::DFG::needsOSRForwardRewiring):
2173         * dfg/DFGPredictionPropagationPhase.cpp:
2174         (JSC::DFG::PredictionPropagationPhase::propagate):
2175         * dfg/DFGSafeToExecute.h:
2176         (JSC::DFG::safeToExecute):
2177         * dfg/DFGSpeculativeJIT.cpp:
2178         (JSC::DFG::SpeculativeJIT::compileInt32ToDouble):
2179         * dfg/DFGSpeculativeJIT32_64.cpp:
2180         (JSC::DFG::SpeculativeJIT::compile):
2181         * dfg/DFGSpeculativeJIT64.cpp:
2182         (JSC::DFG::SpeculativeJIT::compile):
2183         * dfg/DFGTypeCheckHoistingPhase.cpp:
2184         (JSC::DFG::TypeCheckHoistingPhase::run):
2185         (JSC::DFG::TypeCheckHoistingPhase::identifyRedundantStructureChecks):
2186         (JSC::DFG::TypeCheckHoistingPhase::identifyRedundantArrayChecks):
2187         * dfg/DFGVariableEventStream.cpp:
2188         (JSC::DFG::VariableEventStream::reconstruct):
2189         * ftl/FTLCapabilities.cpp:
2190         (JSC::FTL::canCompile):
2191         * ftl/FTLLowerDFGToLLVM.cpp:
2192         (JSC::FTL::LowerDFGToLLVM::compileNode):
2193         (JSC::FTL::LowerDFGToLLVM::addExitArgumentForNode):
2194
2195 2013-07-21  Filip Pizlo  <fpizlo@apple.com>
2196
2197         fourthTier: It should be possible for a DFG::Node to claim to exit to one CodeOrigin, but then claim that it belongs to a different CodeOrigin for all other purposes
2198         https://bugs.webkit.org/show_bug.cgi?id=118946
2199
2200         Reviewed by Geoffrey Garen.
2201         
2202         We want to decouple the exit target code origin of a node from the code origin
2203         for all other purposes. The purposes of code origins are:
2204         
2205         - Where the node will exit, if it exits. The exit target should be consistent with
2206           the surrounding nodes, in that if you just looked at the code origins of nodes in
2207           the graph, they would be consistent with the code origins in bytecode. This is
2208           necessary for live-at-bytecode analyses to work, and to preserve the original
2209           bytecode semantics when exiting.
2210         
2211         - What kind of code the node came from, for semantics thingies. For example, we
2212           might use the code origin to find the node's global object for doing an original
2213           array check. Or we might use it to determine if the code is in strict mode. Or
2214           other similar things. When we use the code origin in this way, we're basically
2215           using it as a way of describing the node's meta-data without putting it into the
2216           node directly, to save space. In the absurd extreme you could imagine nodes not
2217           even having NodeTypes or NodeFlags, and just using the CodeOrigin to determine
2218           what bytecode the node originated from. We won't do that, but you can think of
2219           this use of code origins as just a way of compressing meta-data.
2220         
2221         - What code origin we should supply profiling to, if we exit. This is closely
2222           related to the semantics thingies, in that the exit profiling is a persistent
2223           kind of semantic meta-data that survives between recompiles, and the only way to
2224           do that is to ascribe it to the original bytecode via the code origin.
2225         
2226         If we hoist a node, we need to change the exit target code origin, but we must not
2227         change the code origin for other purposes. The best way to do this is to decouple
2228         the two kinds of code origin.
2229         
2230         OSR exit data structures already do this, because they may edit the exit target
2231         code origin while keeping the code origin for profiling intact. This happens for
2232         forward exits. So, we just need to thread separation all the way back to DFG::Node.
2233         That's what this patch does.
2234
2235         * dfg/DFGNode.h:
2236         (JSC::DFG::Node::Node):
2237         (Node):
2238         * dfg/DFGOSRExit.cpp:
2239         (JSC::DFG::OSRExit::OSRExit):
2240         * dfg/DFGOSRExitBase.h:
2241         (JSC::DFG::OSRExitBase::OSRExitBase):
2242         * dfg/DFGSpeculativeJIT.cpp:
2243         (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
2244         (JSC::DFG::SpeculativeJIT::checkArgumentTypes):
2245         * dfg/DFGSpeculativeJIT.h:
2246         (SpeculativeJIT):
2247         * ftl/FTLLowerDFGToLLVM.cpp:
2248         (JSC::FTL::LowerDFGToLLVM::compileNode):
2249         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
2250         (LowerDFGToLLVM):
2251         * ftl/FTLOSRExit.cpp:
2252         (JSC::FTL::OSRExit::OSRExit):
2253         * ftl/FTLOSRExit.h:
2254         (OSRExit):
2255
2256 2013-07-20  Filip Pizlo  <fpizlo@apple.com>
2257
2258         fourthTier: each DFG node that relies on other nodes to do their type checks should be able to tell you if those type checks happened
2259         https://bugs.webkit.org/show_bug.cgi?id=118866
2260
2261         Reviewed by Sam Weinig.
2262         
2263         Adds a safeToExecute() method that takes a node and an abstract state and tells you
2264         if the node will run without crashing under that state.
2265
2266         * JavaScriptCore.xcodeproj/project.pbxproj:
2267         * bytecode/CodeBlock.cpp:
2268         (JSC::CodeBlock::CodeBlock):
2269         * dfg/DFGCFAPhase.cpp:
2270         (CFAPhase):
2271         (JSC::DFG::CFAPhase::CFAPhase):
2272         (JSC::DFG::CFAPhase::run):
2273         (JSC::DFG::CFAPhase::performBlockCFA):
2274         (JSC::DFG::CFAPhase::performForwardCFA):
2275         * dfg/DFGSafeToExecute.h: Added.
2276         (DFG):
2277         (SafeToExecuteEdge):
2278         (JSC::DFG::SafeToExecuteEdge::SafeToExecuteEdge):
2279         (JSC::DFG::SafeToExecuteEdge::operator()):
2280         (JSC::DFG::SafeToExecuteEdge::result):
2281         (JSC::DFG::safeToExecute):
2282         * dfg/DFGStructureAbstractValue.h:
2283         (JSC::DFG::StructureAbstractValue::isValidOffset):
2284         (StructureAbstractValue):
2285         * runtime/Options.h:
2286         (JSC):
2287
2288 2013-07-20  Filip Pizlo  <fpizlo@apple.com>
2289
2290         fourthTier: FTL should be able to generate LLVM IR that uses an intrinsic for OSR exit
2291         https://bugs.webkit.org/show_bug.cgi?id=118948
2292
2293         Reviewed by Sam Weinig.
2294         
2295         - Add the ability to generate LLVM IR but then not use it, via --llvmAlwaysFails=true.
2296           This allows doing "what if" experiments with IR generation, even if the generated IR
2297           can't yet execute.
2298         
2299         - Add an OSR exit path that just calls an intrinsic that combines the branch and the
2300           off-ramp.
2301
2302         * JavaScriptCore.xcodeproj/project.pbxproj:
2303         * dfg/DFGPlan.cpp:
2304         (JSC::DFG::Plan::compileInThreadImpl):
2305         * ftl/FTLFail.cpp: Added.
2306         (FTL):
2307         (JSC::FTL::fail):
2308         * ftl/FTLFail.h: Added.
2309         (FTL):
2310         * ftl/FTLIntrinsicRepository.h:
2311         (FTL):
2312         * ftl/FTLLowerDFGToLLVM.cpp:
2313         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
2314         (JSC::FTL::LowerDFGToLLVM::emitOSRExitCall):
2315         * runtime/Options.h:
2316         (JSC):
2317
2318 2013-07-19  Filip Pizlo  <fpizlo@apple.com>
2319
2320         fourthTier: StringObjectUse uses structures, and CSE should know that
2321         https://bugs.webkit.org/show_bug.cgi?id=118940
2322
2323         Reviewed by Geoffrey Garen.
2324         
2325         This is asymptomatic right now, but we should fix it.
2326
2327         * JavaScriptCore.xcodeproj/project.pbxproj:
2328         * dfg/DFGCSEPhase.cpp:
2329         (JSC::DFG::CSEPhase::putStructureStoreElimination):
2330         * dfg/DFGEdgeUsesStructure.h: Added.
2331         (DFG):
2332         (EdgeUsesStructure):
2333         (JSC::DFG::EdgeUsesStructure::EdgeUsesStructure):
2334         (JSC::DFG::EdgeUsesStructure::operator()):
2335         (JSC::DFG::EdgeUsesStructure::result):
2336         (JSC::DFG::edgesUseStructure):
2337         * dfg/DFGUseKind.h:
2338         (DFG):
2339         (JSC::DFG::usesStructure):
2340
2341 2013-07-19  Filip Pizlo  <fpizlo@apple.com>
2342
2343         fourthTier: String GetByVal out-of-bounds handling is so wrong
2344         https://bugs.webkit.org/show_bug.cgi?id=118935
2345
2346         Reviewed by Geoffrey Garen.
2347         
2348         Bunch of String GetByVal out-of-bounds fixes:
2349         
2350         - Even if the string proto chain is sane, we need to watch out for negative
2351           indices. They may get values or call getters in the prototypes, since proto
2352           sanity doesn't check for negative indexed properties, as they are not
2353           technically indexed properties.
2354         
2355         - GetByVal String out-of-bounds does in fact clobberWorld(). CSE should be
2356           given this information.
2357         
2358         - GetByVal String out-of-bounds does in fact clobberWorld(). CFA should be
2359           given this information.
2360         
2361         Also fixed some other things:
2362         
2363         - If the DFG is disabled, the testRunner should pretend that we've done a
2364           bunch of DFG compiles. That's necessary to prevent the tests from timing
2365           out.
2366         
2367         - Disassembler shouldn't try to dump source code since it's not safe in the
2368           concurrent JIT.
2369
2370         * API/JSCTestRunnerUtils.cpp:
2371         (JSC::numberOfDFGCompiles):
2372         * JavaScriptCore.xcodeproj/project.pbxproj:
2373         * dfg/DFGAbstractInterpreterInlines.h:
2374         (JSC::DFG::::executeEffects):
2375         * dfg/DFGDisassembler.cpp:
2376         (JSC::DFG::Disassembler::dumpHeader):
2377         * dfg/DFGGraph.h:
2378         (JSC::DFG::Graph::byValIsPure):
2379         * dfg/DFGSaneStringGetByValSlowPathGenerator.h: Added.
2380         (DFG):
2381         (SaneStringGetByValSlowPathGenerator):
2382         (JSC::DFG::SaneStringGetByValSlowPathGenerator::SaneStringGetByValSlowPathGenerator):
2383         (JSC::DFG::SaneStringGetByValSlowPathGenerator::generateInternal):
2384         * dfg/DFGSpeculativeJIT.cpp:
2385         (JSC::DFG::SpeculativeJIT::compileGetByValOnString):
2386
2387 2013-07-19  Filip Pizlo  <fpizlo@apple.com>
2388
2389         fourthTier: Structure::isValidOffset() should be able to tell you if you're loading a valid JSValue, and not just not crashing
2390         https://bugs.webkit.org/show_bug.cgi?id=118911
2391
2392         Reviewed by Geoffrey Garen.
2393         
2394         We could also have a separate method like "willNotCrash(offset)", but that's not
2395         what isValidOffset() is intended to mean.
2396
2397         * runtime/Structure.h:
2398         (JSC::Structure::isValidOffset):
2399
2400 2013-07-19  Filip Pizlo  <fpizlo@apple.com>
2401
2402         fourthTier: Structure should be able to tell you if it's valid to load at a given offset from any object with that structure
2403         https://bugs.webkit.org/show_bug.cgi?id=118878
2404
2405         Reviewed by Oliver Hunt.
2406         
2407         - Change Structure::isValidOffset() to actually answer the question "If I attempted
2408           to load from an object of this structure, at this offset, would I commit suicide
2409           or would I get back some kind of value?"
2410         
2411         - Change StorageAccessData::offset to use a PropertyOffset. It should have been that
2412           way from the start.
2413         
2414         - Fix PutStructure so that it sets haveStructures in all of the cases that it should.
2415         
2416         - Make GetByOffset also reference the base object in addition to the butterfly.
2417         
2418         The future use of this power will be to answer questions like "If I hoisted this
2419         GetByOffset or PutByOffset to this point, would it cause crashes, or would it be
2420         fine?"
2421         
2422         I don't currently plan to use this power to perform validation, since the CSE has
2423         the power to eliminate CheckStructure's that the CFA wouldn't be smart enough to
2424         remove - both in the case of StructureSets where size >= 2 and in the case of
2425         CheckStructures that match across PutStructures. At first I tried to write a
2426         validator that was aware of this, but the validation code got way too complicated
2427         and I started having nightmares of spurious assertion bugs being filed against me.
2428         
2429         This also changes some of the code for how we hash FunctionExecutable's for debug
2430         dumps, since that code still had some thread-safety issues. Basically, the
2431         concurrent JIT needs to use the CodeBlock's precomputed hash and never call anything
2432         that could transitively try to compute the hash from the source code. The source
2433         code is a string that may be lazily computed, and that involves all manner of thread
2434         unsafe things.
2435
2436         * bytecode/CodeOrigin.cpp:
2437         (JSC::InlineCallFrame::hash):
2438         * dfg/DFGAbstractInterpreterInlines.h:
2439         (JSC::DFG::::executeEffects):
2440         * dfg/DFGByteCodeParser.cpp:
2441         (JSC::DFG::ByteCodeParser::handleGetByOffset):
2442         (JSC::DFG::ByteCodeParser::handlePutByOffset):
2443         (JSC::DFG::ByteCodeParser::parseBlock):
2444         * dfg/DFGCFAPhase.cpp:
2445         (JSC::DFG::CFAPhase::performBlockCFA):
2446         * dfg/DFGConstantFoldingPhase.cpp:
2447         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2448         * dfg/DFGFixupPhase.cpp:
2449         (JSC::DFG::FixupPhase::fixupNode):
2450         * dfg/DFGGraph.h:
2451         (StorageAccessData):
2452         * dfg/DFGNode.h:
2453         (JSC::DFG::Node::convertToGetByOffset):
2454         * dfg/DFGSpeculativeJIT64.cpp:
2455         (JSC::DFG::SpeculativeJIT::compile):
2456         * ftl/FTLLowerDFGToLLVM.cpp:
2457         (JSC::FTL::LowerDFGToLLVM::compileGetByOffset):
2458         (JSC::FTL::LowerDFGToLLVM::compilePutByOffset):
2459         * runtime/FunctionExecutableDump.cpp:
2460         (JSC::FunctionExecutableDump::dump):
2461         * runtime/Structure.h:
2462         (Structure):
2463         (JSC::Structure::isValidOffset):
2464
2465 2013-07-18  Filip Pizlo  <fpizlo@apple.com>
2466
2467         fourthTier: AbstractInterpreter should explicitly ask AbstractState to create new AbstractValues for newly born nodes
2468         https://bugs.webkit.org/show_bug.cgi?id=118880
2469
2470         Reviewed by Sam Weinig.
2471         
2472         It should be possible to have an AbstractState that is backed by a HashMap. But to
2473         do this, the AbstractInterpreter should explicitly ask for new nodes to be added to
2474         the map, since otherwise the idiom of getting a reference to the AbstractValue
2475         returned by forNode() would cause really subtle memory corruption bugs.
2476
2477         * dfg/DFGAbstractInterpreterInlines.h:
2478         (JSC::DFG::::executeEffects):
2479         * dfg/DFGInPlaceAbstractState.h:
2480         (JSC::DFG::InPlaceAbstractState::createValueForNode):
2481         (InPlaceAbstractState):
2482
2483 2013-07-18  Filip Pizlo  <fpizlo@apple.com>
2484
2485         fourthTier: Decouple the way that CFA stores its state from the way it does abstract interpretation
2486         https://bugs.webkit.org/show_bug.cgi?id=118835
2487
2488         Reviewed by Oliver Hunt.
2489         
2490         This separates AbstractState into two things:
2491         
2492         - InPlaceAbstractState, which can tell you the abstract state of anything you
2493           might care about, and uses the old AbstractState's algorithms and data
2494           structures for doing so.
2495         
2496         - AbstractInterpreter<AbstractStateType>, which can execute a DFG::Node* with
2497           respect to an AbstractStateType. Currently we always use
2498           AbstractStateType = InPlaceAbstractState. But we could drop in an other
2499           class that supports basic primitives like forNode() and variables().
2500         
2501         This is important because:
2502         
2503         - We want to hoist things out of loops.
2504
2505         - We don't know what things rely on what type checks.
2506
2507         - We only want to hoist type checks out of loops if they aren't clobbered.
2508
2509         - We may want to still hoist things that depended on those type checks, if it's
2510           safe to do those things based on the CFA state at the tail of the loop
2511           pre-header.
2512
2513         - We don't want things to rely on their type checks by way of a token, because
2514           that's just weird.
2515
2516         So, we want to be able to have a special form of the CFA that can
2517         incrementally update a basic block's state-at-tail, and we want to be able to
2518         do this for multiple blocks simultaneously. This requires *not* storing the
2519         per-node state in the nodes themselves, but instead using the at-tail HashMap
2520         directly.
2521
2522         Hence we need to have a way of making the abstract interpreter (i.e.
2523         AbstractState::execute) polymorphic with respect to state representation. Put
2524         another way, we need to separate the way that abstract state is represented
2525         from the way DFG IR is abstractly interpreted.
2526
2527         * JavaScriptCore.xcodeproj/project.pbxproj:
2528         * dfg/DFGAbstractInterpreter.h: Added.
2529         (DFG):
2530         (AbstractInterpreter):
2531         (JSC::DFG::AbstractInterpreter::forNode):
2532         (JSC::DFG::AbstractInterpreter::variables):
2533         (JSC::DFG::AbstractInterpreter::needsTypeCheck):
2534         (JSC::DFG::AbstractInterpreter::filterEdgeByUse):
2535         (JSC::DFG::AbstractInterpreter::filter):
2536         (JSC::DFG::AbstractInterpreter::filterArrayModes):
2537         (JSC::DFG::AbstractInterpreter::filterByValue):
2538         (JSC::DFG::AbstractInterpreter::trySetConstant):
2539         (JSC::DFG::AbstractInterpreter::filterByType):
2540         * dfg/DFGAbstractInterpreterInlines.h: Added.
2541         (DFG):
2542         (JSC::DFG::::AbstractInterpreter):
2543         (JSC::DFG::::~AbstractInterpreter):
2544         (JSC::DFG::::booleanResult):
2545         (JSC::DFG::::startExecuting):
2546         (JSC::DFG::::executeEdges):
2547         (JSC::DFG::::verifyEdge):
2548         (JSC::DFG::::verifyEdges):
2549         (JSC::DFG::::executeEffects):
2550         (JSC::DFG::::execute):
2551         (JSC::DFG::::clobberWorld):
2552         (JSC::DFG::::clobberCapturedVars):
2553         (JSC::DFG::::clobberStructures):
2554         (JSC::DFG::::dump):
2555         (JSC::DFG::::filter):
2556         (JSC::DFG::::filterArrayModes):
2557         (JSC::DFG::::filterByValue):
2558         * dfg/DFGAbstractState.cpp: Removed.
2559         * dfg/DFGAbstractState.h: Removed.
2560         * dfg/DFGArgumentsSimplificationPhase.cpp:
2561         * dfg/DFGCFAPhase.cpp:
2562         (JSC::DFG::CFAPhase::CFAPhase):
2563         (JSC::DFG::CFAPhase::performBlockCFA):
2564         (CFAPhase):
2565         * dfg/DFGCFGSimplificationPhase.cpp:
2566         * dfg/DFGConstantFoldingPhase.cpp:
2567         (JSC::DFG::ConstantFoldingPhase::ConstantFoldingPhase):
2568         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2569         (ConstantFoldingPhase):
2570         * dfg/DFGInPlaceAbstractState.cpp: Added.
2571         (DFG):
2572         (JSC::DFG::InPlaceAbstractState::InPlaceAbstractState):
2573         (JSC::DFG::InPlaceAbstractState::~InPlaceAbstractState):
2574         (JSC::DFG::InPlaceAbstractState::beginBasicBlock):
2575         (JSC::DFG::setLiveValues):
2576         (JSC::DFG::InPlaceAbstractState::initialize):
2577         (JSC::DFG::InPlaceAbstractState::endBasicBlock):
2578         (JSC::DFG::InPlaceAbstractState::reset):
2579         (JSC::DFG::InPlaceAbstractState::mergeStateAtTail):
2580         (JSC::DFG::InPlaceAbstractState::merge):
2581         (JSC::DFG::InPlaceAbstractState::mergeToSuccessors):
2582         (JSC::DFG::InPlaceAbstractState::mergeVariableBetweenBlocks):
2583         * dfg/DFGInPlaceAbstractState.h: Added.
2584         (DFG):
2585         (InPlaceAbstractState):
2586         (JSC::DFG::InPlaceAbstractState::forNode):
2587         (JSC::DFG::InPlaceAbstractState::variables):
2588         (JSC::DFG::InPlaceAbstractState::block):
2589         (JSC::DFG::InPlaceAbstractState::didClobber):
2590         (JSC::DFG::InPlaceAbstractState::isValid):
2591         (JSC::DFG::InPlaceAbstractState::setDidClobber):
2592         (JSC::DFG::InPlaceAbstractState::setIsValid):
2593         (JSC::DFG::InPlaceAbstractState::setBranchDirection):
2594         (JSC::DFG::InPlaceAbstractState::setFoundConstants):
2595         (JSC::DFG::InPlaceAbstractState::haveStructures):
2596         (JSC::DFG::InPlaceAbstractState::setHaveStructures):
2597         * dfg/DFGMergeMode.h: Added.
2598         (DFG):
2599         * dfg/DFGSpeculativeJIT.cpp:
2600         (JSC::DFG::SpeculativeJIT::SpeculativeJIT):
2601         (JSC::DFG::SpeculativeJIT::backwardTypeCheck):
2602         (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
2603         (JSC::DFG::SpeculativeJIT::compileToStringOnCell):
2604         (JSC::DFG::SpeculativeJIT::speculateStringIdentAndLoadStorage):
2605         (JSC::DFG::SpeculativeJIT::speculateStringObject):
2606         (JSC::DFG::SpeculativeJIT::speculateStringOrStringObject):
2607         * dfg/DFGSpeculativeJIT.h:
2608         (JSC::DFG::SpeculativeJIT::needsTypeCheck):
2609         (SpeculativeJIT):
2610         * dfg/DFGSpeculativeJIT32_64.cpp:
2611         (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal):
2612         (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
2613         (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
2614         (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean):
2615         * dfg/DFGSpeculativeJIT64.cpp:
2616         (JSC::DFG::SpeculativeJIT::fillSpeculateIntInternal):
2617         (JSC::DFG::SpeculativeJIT::fillSpeculateDouble):
2618         (JSC::DFG::SpeculativeJIT::fillSpeculateCell):
2619         (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean):
2620         * ftl/FTLLowerDFGToLLVM.cpp:
2621         (FTL):
2622         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
2623         (JSC::FTL::LowerDFGToLLVM::compileNode):
2624         (JSC::FTL::LowerDFGToLLVM::appendTypeCheck):
2625         (JSC::FTL::LowerDFGToLLVM::speculate):
2626         (JSC::FTL::LowerDFGToLLVM::speculateNumber):
2627         (JSC::FTL::LowerDFGToLLVM::speculateRealNumber):
2628         (LowerDFGToLLVM):
2629
2630 2013-07-18  Filip Pizlo  <fpizlo@apple.com>
2631
2632         fourthTier: DFG shouldn't create CheckStructures for array accesses except if the ArrayMode implies an original array access
2633         https://bugs.webkit.org/show_bug.cgi?id=118867
2634
2635         Reviewed by Mark Hahnenberg.
2636         
2637         This allows us to kill off a bunch of code in the parser, in fixup, and to simplify
2638         ArrayProfile.
2639
2640         It also makes it easier to ask any array-using node how to create its type check.
2641         
2642         Doing this required fixing a bug in LowLevelInterpreter64, where it was storing into
2643         an array profile, thinking that it was storing into a value profile. Reshuffling the
2644         fields in ArrayProfile revealed this.
2645
2646         * bytecode/ArrayProfile.cpp:
2647         (JSC::ArrayProfile::computeUpdatedPrediction):
2648         (JSC::ArrayProfile::briefDescriptionWithoutUpdating):
2649         * bytecode/ArrayProfile.h:
2650         (JSC::ArrayProfile::ArrayProfile):
2651         (ArrayProfile):
2652         * bytecode/CodeBlock.cpp:
2653         (JSC::CodeBlock::updateAllArrayPredictions):
2654         (JSC::CodeBlock::updateAllPredictions):
2655         * bytecode/CodeBlock.h:
2656         (CodeBlock):
2657         (JSC::CodeBlock::updateAllArrayPredictions):
2658         * dfg/DFGArrayMode.h:
2659         (ArrayMode):
2660         * dfg/DFGByteCodeParser.cpp:
2661         (JSC::DFG::ByteCodeParser::getArrayModeConsideringSlowPath):
2662         (JSC::DFG::ByteCodeParser::parseBlock):
2663         * dfg/DFGFixupPhase.cpp:
2664         (JSC::DFG::FixupPhase::fixupNode):
2665         (FixupPhase):
2666         (JSC::DFG::FixupPhase::checkArray):
2667         (JSC::DFG::FixupPhase::blessArrayOperation):
2668         * llint/LowLevelInterpreter64.asm:
2669
2670 2013-07-18  Filip Pizlo  <fpizlo@apple.com>
2671
2672         fourthTier: CFA should consider live-at-head for clobbering and dumping
2673         https://bugs.webkit.org/show_bug.cgi?id=118857
2674
2675         Reviewed by Mark Hahnenberg.
2676         
2677         - clobberStructures() was not considering nodes live-at-head when in SSA
2678           form. This means it would fail to clobber some structures.
2679         
2680         - dump() was not considering nodes live-at-head when in SSA form. This
2681           means it wouldn't dump everything that you might be interested in.
2682         
2683         - AbstractState::m_currentNode is a useless variable and we should get
2684           rid of it.
2685
2686         * dfg/DFGAbstractState.cpp:
2687         (JSC::DFG::AbstractState::AbstractState):
2688         (JSC::DFG::AbstractState::beginBasicBlock):
2689         (JSC::DFG::AbstractState::reset):
2690         (JSC::DFG::AbstractState::startExecuting):
2691         (JSC::DFG::AbstractState::clobberStructures):
2692         (JSC::DFG::AbstractState::dump):
2693         * dfg/DFGAbstractState.h:
2694         (AbstractState):
2695
2696 2013-07-16  Filip Pizlo  <fpizlo@apple.com>
2697
2698         fourthTier: Add a phase to create loop pre-headers
2699         https://bugs.webkit.org/show_bug.cgi?id=118778
2700
2701         Reviewed by Oliver Hunt.
2702         
2703         Add a loop pre-header creation phase. Any loop that doesn't already have
2704         just one predecessor that isn't part of the loop has a pre-header
2705         prepended. All non-loop predecessors then jump to that pre-header.
2706         
2707         Also fix a handful of bugs:
2708         
2709         - DFG::Analysis should set m_valid before running the analysis, since that
2710           makes it easier to use ASSERT(m_valid) in the analysis' methods, which
2711           may be called by the analysis before the analysis completes. NaturalLoops
2712           does this with loopsOf().
2713         
2714         - NaturalLoops::headerOf() was missing a check for innerMostLoopOf()
2715           returning 0, since that'll happen if the block isn't in any loop.
2716         
2717         - Change BlockInsertionSet to dethread the graph, since anyone using it
2718           will want to do so.
2719         
2720         - Change dethreading to ignore SSA form graphs.
2721         
2722         This also adds NaturalLoops::belongsTo(), which I always used in the
2723         pre-header creation phase. I didn't end up using it but I'll probably use
2724         it in the near future.
2725         
2726         * JavaScriptCore.xcodeproj/project.pbxproj:
2727         * dfg/DFGAnalysis.h:
2728         (JSC::DFG::Analysis::computeIfNecessary):
2729         * dfg/DFGBlockInsertionSet.cpp:
2730         (JSC::DFG::BlockInsertionSet::execute):
2731         * dfg/DFGCriticalEdgeBreakingPhase.cpp:
2732         (JSC::DFG::CriticalEdgeBreakingPhase::breakCriticalEdge):
2733         * dfg/DFGGraph.cpp:
2734         (JSC::DFG::Graph::dethread):
2735         * dfg/DFGLoopPreHeaderCreationPhase.cpp: Added.
2736         (DFG):
2737         (LoopPreHeaderCreationPhase):
2738         (JSC::DFG::LoopPreHeaderCreationPhase::LoopPreHeaderCreationPhase):
2739         (JSC::DFG::LoopPreHeaderCreationPhase::run):
2740         (JSC::DFG::performLoopPreHeaderCreation):
2741         * dfg/DFGLoopPreHeaderCreationPhase.h: Added.
2742         (DFG):
2743         * dfg/DFGNaturalLoops.h:
2744         (NaturalLoop):
2745         (JSC::DFG::NaturalLoops::headerOf):
2746         (JSC::DFG::NaturalLoops::innerMostLoopOf):
2747         (JSC::DFG::NaturalLoops::innerMostOuterLoop):
2748         (JSC::DFG::NaturalLoops::belongsTo):
2749         (NaturalLoops):
2750         * dfg/DFGPlan.cpp:
2751         (JSC::DFG::Plan::compileInThreadImpl):
2752
2753 2013-07-16  Filip Pizlo  <fpizlo@apple.com>
2754
2755         fourthTier: Rationalize Node::replacement
2756         https://bugs.webkit.org/show_bug.cgi?id=118774
2757
2758         Reviewed by Oliver Hunt.
2759         
2760         - Clearing of replacements is now done in Graph::clearReplacements().
2761         
2762         - New nodes now have replacement set to 0.
2763         
2764         - Node::replacement is now part of a 'misc' union. I'll be putting at least
2765           one other field into that union as part of LICM work (see
2766           https://bugs.webkit.org/show_bug.cgi?id=118749).
2767
2768         * dfg/DFGCPSRethreadingPhase.cpp:
2769         (JSC::DFG::CPSRethreadingPhase::run):
2770         (JSC::DFG::CPSRethreadingPhase::freeUnnecessaryNodes):
2771         (JSC::DFG::CPSRethreadingPhase::canonicalizeGetLocalFor):
2772         * dfg/DFGCSEPhase.cpp:
2773         (JSC::DFG::CSEPhase::run):
2774         (JSC::DFG::CSEPhase::setReplacement):
2775         (JSC::DFG::CSEPhase::performBlockCSE):
2776         * dfg/DFGGraph.cpp:
2777         (DFG):
2778         (JSC::DFG::Graph::clearReplacements):
2779         * dfg/DFGGraph.h:
2780         (JSC::DFG::Graph::performSubstitutionForEdge):
2781         (Graph):
2782         * dfg/DFGNode.h:
2783         (JSC::DFG::Node::Node):
2784         * dfg/DFGSSAConversionPhase.cpp:
2785         (JSC::DFG::SSAConversionPhase::run):
2786
2787 2013-07-16  Filip Pizlo  <fpizlo@apple.com>
2788
2789         fourthTier: NaturalLoops should be able to quickly answer questions like "what loops own this basic block"
2790         https://bugs.webkit.org/show_bug.cgi?id=118750
2791
2792         Reviewed by Mark Hahnenberg.
2793
2794         * dfg/DFGBasicBlock.h:
2795         (BasicBlock):
2796         * dfg/DFGNaturalLoops.cpp:
2797         (JSC::DFG::NaturalLoops::compute):
2798         (JSC::DFG::NaturalLoops::loopsOf):
2799         * dfg/DFGNaturalLoops.h:
2800         (DFG):
2801         (JSC::DFG::NaturalLoop::NaturalLoop):
2802         (NaturalLoop):
2803         (JSC::DFG::NaturalLoop::index):
2804         (JSC::DFG::NaturalLoop::isOuterMostLoop):
2805         (JSC::DFG::NaturalLoop::addBlock):
2806         (JSC::DFG::NaturalLoops::headerOf):
2807         (JSC::DFG::NaturalLoops::innerMostLoopOf):
2808         (NaturalLoops):
2809         (JSC::DFG::NaturalLoops::innerMostOuterLoop):
2810         * dfg/DFGPlan.cpp:
2811         (JSC::DFG::Plan::compileInThreadImpl):
2812
2813 2013-07-16  Filip Pizlo  <fpizlo@apple.com>
2814
2815         fourthTier: don't GC when shutting down the VM
2816         https://bugs.webkit.org/show_bug.cgi?id=118751
2817
2818         Reviewed by Mark Hahnenberg.
2819
2820         * heap/Heap.h:
2821         (Heap):
2822         * runtime/VM.cpp:
2823         (JSC::VM::~VM):
2824
2825 2013-07-12  Filip Pizlo  <fpizlo@apple.com>
2826
2827         fourthTier: DFG should have an SSA form for use by FTL
2828         https://bugs.webkit.org/show_bug.cgi?id=118338
2829
2830         Reviewed by Mark Hahnenberg.
2831         
2832         Adds an SSA form to the DFG. We can convert ThreadedCPS form into SSA form
2833         after breaking critical edges. The conversion algorithm follows Aycock and
2834         Horspool, and the SSA form itself follows something I've done before, where
2835         instead of having Phi functions specify input nodes corresponding to block
2836         predecessors, we instead have Upsilon functions in the predecessors that
2837         specify which value in that block goes into which subsequent Phi. Upsilons
2838         don't have to dominate Phis (usually they don't) and they correspond to a
2839         non-SSA "mov" into the Phi's "variable". This gives all of the good
2840         properties of SSA, while ensuring that a bunch of CFG transformations don't
2841         have to be SSA-aware.
2842         
2843         So far the only DFG phases that are SSA-aware are DCE and CFA. CFG
2844         simplification is probably SSA-aware by default, though I haven't tried it.
2845         Constant folding probably needs a few tweaks, but is likely ready. Ditto
2846         for CSE, though it's not clear that we'd want to use block-local CSE when
2847         we could be doing GVN.
2848         
2849         Currently only the FTL can generate code from the SSA form, and there is no
2850         way to convert from SSA to ThreadedCPS or LoadStore. There probably will
2851         never be such a capability.
2852         
2853         In order to handle OSR exit state in the SSA, we place MovHints at Phi
2854         points. Other than that, you can reconstruct state-at-exit by forward
2855         propagating MovHints. Note that MovHint is the new SetLocal in SSA.
2856         SetLocal and GetLocal only survive into SSA if they are on captured
2857         variables, or in the case of flushes. A "live SetLocal" will be
2858         NodeMustGenerate and will always correspond to a flush. Computing the
2859         state-at-exit requires running SSA liveness analysis, OSR availability
2860         analysis, and flush liveness analysis. The FTL runs all of these prior to
2861         generating code. While OSR exit continues to be tricky, much of the logic
2862         is now factored into separate phases and the backend has to do less work
2863         to reason about what happened outside of the basic block that is being
2864         lowered.
2865         
2866         Conversion from DFG SSA to LLVM SSA is done by ensuring that we generate
2867         code in depth-first order, thus guaranteeing that a node will always be
2868         lowered (and hence have a LValue) before any of the blocks dominated by
2869         that node's block have code generated. For Upsilon/Phi, we just use
2870         alloca's. We could do something more clever there, but it's probably not
2871         worth it, at least not now.
2872         
2873         Finally, while the SSA form is currently only being converted to LLVM IR,
2874         there is nothing that prevents us from considering other backends in the
2875         future - with the caveat that this form is designed to be first lowered to
2876         a lower-level SSA before actual machine code generation commences. So we
2877         ought to either use LLVM (the intended path) or we will have to write our
2878         own SSA low-level backend.
2879         
2880         This runs all of the code that the FTL was known to run previously. No
2881         change in performance for now. But it does open some exciting
2882         possibilities!
2883
2884         * JavaScriptCore.xcodeproj/project.pbxproj:
2885         * bytecode/Operands.h:
2886         (JSC::OperandValueTraits::dump):
2887         (JSC::Operands::fill):
2888         (Operands):
2889         (JSC::Operands::clear):
2890         (JSC::Operands::operator==):
2891         * dfg/DFGAbstractState.cpp:
2892         (JSC::DFG::AbstractState::beginBasicBlock):
2893         (JSC::DFG::setLiveValues):
2894         (DFG):
2895         (JSC::DFG::AbstractState::initialize):
2896         (JSC::DFG::AbstractState::endBasicBlock):
2897         (JSC::DFG::AbstractState::executeEffects):
2898         (JSC::DFG::AbstractState::mergeStateAtTail):
2899         (JSC::DFG::AbstractState::merge):
2900         * dfg/DFGAbstractState.h:
2901         (AbstractState):
2902         * dfg/DFGAdjacencyList.h:
2903         (JSC::DFG::AdjacencyList::justOneChild):
2904         (AdjacencyList):
2905         * dfg/DFGBasicBlock.cpp: Added.
2906         (DFG):
2907         (JSC::DFG::BasicBlock::BasicBlock):
2908         (JSC::DFG::BasicBlock::~BasicBlock):
2909         (JSC::DFG::BasicBlock::ensureLocals):
2910         (JSC::DFG::BasicBlock::isInPhis):
2911         (JSC::DFG::BasicBlock::isInBlock):
2912         (JSC::DFG::BasicBlock::removePredecessor):
2913         (JSC::DFG::BasicBlock::replacePredecessor):
2914         (JSC::DFG::BasicBlock::dump):
2915         (JSC::DFG::BasicBlock::SSAData::SSAData):
2916         (JSC::DFG::BasicBlock::SSAData::~SSAData):
2917         * dfg/DFGBasicBlock.h:
2918         (BasicBlock):
2919         (JSC::DFG::BasicBlock::operator[]):
2920         (JSC::DFG::BasicBlock::successor):
2921         (JSC::DFG::BasicBlock::successorForCondition):
2922         (SSAData):
2923         * dfg/DFGBasicBlockInlines.h:
2924         (DFG):
2925         * dfg/DFGBlockInsertionSet.cpp: Added.
2926         (DFG):
2927         (JSC::DFG::BlockInsertionSet::BlockInsertionSet):
2928         (JSC::DFG::BlockInsertionSet::~BlockInsertionSet):
2929         (JSC::DFG::BlockInsertionSet::insert):
2930         (JSC::DFG::BlockInsertionSet::insertBefore):
2931         (JSC::DFG::BlockInsertionSet::execute):
2932         * dfg/DFGBlockInsertionSet.h: Added.
2933         (DFG):
2934         (BlockInsertionSet):
2935         * dfg/DFGCFAPhase.cpp:
2936         (JSC::DFG::CFAPhase::run):
2937         * dfg/DFGCFGSimplificationPhase.cpp:
2938         * dfg/DFGCPSRethreadingPhase.cpp:
2939         (JSC::DFG::CPSRethreadingPhase::canonicalizeLocalsInBlock):
2940         * dfg/DFGCommon.cpp:
2941         (WTF::printInternal):
2942         * dfg/DFGCommon.h:
2943         (JSC::DFG::doesKill):
2944         (DFG):
2945         (JSC::DFG::killStatusForDoesKill):
2946         * dfg/DFGConstantFoldingPhase.cpp:
2947         (JSC::DFG::ConstantFoldingPhase::foldConstants):
2948         (JSC::DFG::ConstantFoldingPhase::isCapturedAtOrAfter):
2949         * dfg/DFGCriticalEdgeBreakingPhase.cpp: Added.
2950         (DFG):
2951         (CriticalEdgeBreakingPhase):
2952         (JSC::DFG::CriticalEdgeBreakingPhase::CriticalEdgeBreakingPhase):
2953         (JSC::DFG::CriticalEdgeBreakingPhase::run):
2954         (JSC::DFG::CriticalEdgeBreakingPhase::breakCriticalEdge):
2955         (JSC::DFG::performCriticalEdgeBreaking):
2956         * dfg/DFGCriticalEdgeBreakingPhase.h: Added.
2957         (DFG):
2958         * dfg/DFGDCEPhase.cpp:
2959         (JSC::DFG::DCEPhase::run):
2960         (JSC::DFG::DCEPhase::findTypeCheckRoot):
2961         (JSC::DFG::DCEPhase::countNode):
2962         (DCEPhase):
2963         (JSC::DFG::DCEPhase::countEdge):
2964         (JSC::DFG::DCEPhase::eliminateIrrelevantPhantomChildren):
2965         * dfg/DFGDriver.cpp:
2966         (JSC::DFG::compile):
2967         * dfg/DFGEdge.cpp:
2968         (JSC::DFG::Edge::dump):
2969         * dfg/DFGEdge.h:
2970         (JSC::DFG::Edge::Edge):
2971         (JSC::DFG::Edge::setNode):
2972         (JSC::DFG::Edge::useKindUnchecked):
2973         (JSC::DFG::Edge::setUseKind):
2974         (JSC::DFG::Edge::setProofStatus):
2975         (JSC::DFG::Edge::willNotHaveCheck):
2976         (JSC::DFG::Edge::willHaveCheck):
2977         (Edge):
2978         (JSC::DFG::Edge::killStatusUnchecked):
2979         (JSC::DFG::Edge::killStatus):
2980         (JSC::DFG::Edge::setKillStatus):
2981         (JSC::DFG::Edge::doesKill):
2982         (JSC::DFG::Edge::doesNotKill):
2983         (JSC::DFG::Edge::shift):
2984         (JSC::DFG::Edge::makeWord):
2985         * dfg/DFGFixupPhase.cpp:
2986         (JSC::DFG::FixupPhase::fixupNode):
2987         * dfg/DFGFlushFormat.cpp: Added.
2988         (WTF):
2989         (WTF::printInternal):
2990         * dfg/DFGFlushFormat.h: Added.
2991         (DFG):
2992         (JSC::DFG::resultFor):
2993         (JSC::DFG::useKindFor):
2994         (WTF):
2995         * dfg/DFGFlushLivenessAnalysisPhase.cpp: Added.
2996         (DFG):
2997         (FlushLivenessAnalysisPhase):
2998         (JSC::DFG::FlushLivenessAnalysisPhase::FlushLivenessAnalysisPhase):
2999         (JSC::DFG::FlushLivenessAnalysisPhase::run):
3000         (JSC::DFG::FlushLivenessAnalysisPhase::process):
3001         (JSC::DFG::FlushLivenessAnalysisPhase::setForNode):
3002         (JSC::DFG::FlushLivenessAnalysisPhase::flushFormat):
3003         (JSC::DFG::performFlushLivenessAnalysis):
3004         * dfg/DFGFlushLivenessAnalysisPhase.h: Added.
3005         (DFG):
3006         * dfg/DFGGraph.cpp:
3007         (JSC::DFG::Graph::dump):
3008         (JSC::DFG::Graph::dumpBlockHeader):
3009         (DFG):
3010         (JSC::DFG::Graph::addForDepthFirstSort):
3011         (JSC::DFG::Graph::getBlocksInDepthFirstOrder):
3012         * dfg/DFGGraph.h:
3013         (JSC::DFG::Graph::convertToConstant):
3014         (JSC::DFG::Graph::valueProfileFor):
3015         (Graph):
3016         * dfg/DFGInsertionSet.h:
3017         (DFG):
3018         (JSC::DFG::InsertionSet::execute):
3019         * dfg/DFGLivenessAnalysisPhase.cpp: Added.
3020         (DFG):
3021         (LivenessAnalysisPhase):
3022         (JSC::DFG::LivenessAnalysisPhase::LivenessAnalysisPhase):
3023         (JSC::DFG::LivenessAnalysisPhase::run):
3024         (JSC::DFG::LivenessAnalysisPhase::process):
3025         (JSC::DFG::LivenessAnalysisPhase::addChildUse):
3026         (JSC::DFG::performLivenessAnalysis):
3027         * dfg/DFGLivenessAnalysisPhase.h: Added.
3028         (DFG):
3029         * dfg/DFGNode.cpp:
3030         (JSC::DFG::Node::hasVariableAccessData):
3031         (DFG):
3032         * dfg/DFGNode.h:
3033         (DFG):
3034         (Node):
3035         (JSC::DFG::Node::hasLocal):
3036         (JSC::DFG::Node::variableAccessData):
3037         (JSC::DFG::Node::hasPhi):
3038         (JSC::DFG::Node::phi):
3039         (JSC::DFG::Node::takenBlock):
3040         (JSC::DFG::Node::notTakenBlock):
3041         (JSC::DFG::Node::successor):
3042         (JSC::DFG::Node::successorForCondition):
3043         (JSC::DFG::nodeComparator):
3044         (JSC::DFG::nodeListDump):
3045         (JSC::DFG::nodeMapDump):
3046         * dfg/DFGNodeFlags.cpp:
3047         (JSC::DFG::dumpNodeFlags):
3048         * dfg/DFGNodeType.h:
3049         (DFG):
3050         * dfg/DFGOSRAvailabilityAnalysisPhase.cpp: Added.
3051         (DFG):
3052         (OSRAvailabilityAnalysisPhase):
3053         (JSC::DFG::OSRAvailabilityAnalysisPhase::OSRAvailabilityAnalysisPhase):
3054         (JSC::DFG::OSRAvailabilityAnalysisPhase::run):
3055         (JSC::DFG::performOSRAvailabilityAnalysis):
3056         * dfg/DFGOSRAvailabilityAnalysisPhase.h: Added.
3057         (DFG):
3058         * dfg/DFGPlan.cpp:
3059         (JSC::DFG::Plan::compileInThreadImpl):
3060         * dfg/DFGPredictionInjectionPhase.cpp:
3061         (JSC::DFG::PredictionInjectionPhase::run):
3062         * dfg/DFGPredictionPropagationPhase.cpp:
3063         (JSC::DFG::PredictionPropagationPhase::propagate):
3064         * dfg/DFGSSAConversionPhase.cpp: Added.
3065         (DFG):
3066         (SSAConversionPhase):
3067         (JSC::DFG::SSAConversionPhase::SSAConversionPhase):
3068         (JSC::DFG::SSAConversionPhase::run):
3069         (JSC::DFG::SSAConversionPhase::forwardPhiChildren):
3070         (JSC::DFG::SSAConversionPhase::forwardPhi):
3071         (JSC::DFG::SSAConversionPhase::forwardPhiEdge):
3072         (JSC::DFG::SSAConversionPhase::deduplicateChildren):
3073         (JSC::DFG::SSAConversionPhase::addFlushedLocalOp):
3074         (JSC::DFG::SSAConversionPhase::addFlushedLocalEdge):
3075         (JSC::DFG::performSSAConversion):
3076         * dfg/DFGSSAConversionPhase.h: Added.
3077         (DFG):
3078         * dfg/DFGSpeculativeJIT32_64.cpp:
3079         (JSC::DFG::SpeculativeJIT::compile):
3080         * dfg/DFGSpeculativeJIT64.cpp:
3081         (JSC::DFG::SpeculativeJIT::compile):
3082         * dfg/DFGValidate.cpp:
3083         (JSC::DFG::Validate::validate):
3084         (Validate):
3085         (JSC::DFG::Validate::validateCPS):
3086         * dfg/DFGVariableAccessData.h:
3087         (JSC::DFG::VariableAccessData::flushFormat):
3088         (VariableAccessData):
3089         * ftl/FTLCapabilities.cpp:
3090         (JSC::FTL::canCompile):
3091         * ftl/FTLLowerDFGToLLVM.cpp:
3092         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
3093         (JSC::FTL::LowerDFGToLLVM::lower):
3094         (JSC::FTL::LowerDFGToLLVM::createPhiVariables):
3095         (JSC::FTL::LowerDFGToLLVM::compileBlock):
3096         (JSC::FTL::LowerDFGToLLVM::compileNode):
3097         (JSC::FTL::LowerDFGToLLVM::compileUpsilon):
3098         (LowerDFGToLLVM):
3099         (JSC::FTL::LowerDFGToLLVM::compilePhi):
3100         (JSC::FTL::LowerDFGToLLVM::compileJSConstant):
3101         (JSC::FTL::LowerDFGToLLVM::compileWeakJSConstant):
3102         (JSC::FTL::LowerDFGToLLVM::compileGetArgument):
3103         (JSC::FTL::LowerDFGToLLVM::compileGetLocal):
3104         (JSC::FTL::LowerDFGToLLVM::compileSetLocal):
3105         (JSC::FTL::LowerDFGToLLVM::compileAdd):
3106         (JSC::FTL::LowerDFGToLLVM::compileArithSub):
3107         (JSC::FTL::LowerDFGToLLVM::compileArithMul):
3108         (JSC::FTL::LowerDFGToLLVM::compileArithDiv):
3109         (JSC::FTL::LowerDFGToLLVM::compileArithMod):
3110         (JSC::FTL::LowerDFGToLLVM::compileArithMinOrMax):
3111         (JSC::FTL::LowerDFGToLLVM::compileArithAbs):
3112         (JSC::FTL::LowerDFGToLLVM::compileArithNegate):
3113         (JSC::FTL::LowerDFGToLLVM::compileBitAnd):
3114         (JSC::FTL::LowerDFGToLLVM::compileBitOr):
3115         (JSC::FTL::LowerDFGToLLVM::compileBitXor):
3116         (JSC::FTL::LowerDFGToLLVM::compileBitRShift):
3117         (JSC::FTL::LowerDFGToLLVM::compileBitLShift):
3118         (JSC::FTL::LowerDFGToLLVM::compileBitURShift):
3119         (JSC::FTL::LowerDFGToLLVM::compileUInt32ToNumber):
3120         (JSC::FTL::LowerDFGToLLVM::compileInt32ToDouble):
3121         (JSC::FTL::LowerDFGToLLVM::compileGetButterfly):
3122         (JSC::FTL::LowerDFGToLLVM::compileGetArrayLength):
3123         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
3124         (JSC::FTL::LowerDFGToLLVM::compileGetByOffset):
3125         (JSC::FTL::LowerDFGToLLVM::compileGetGlobalVar):
3126         (JSC::FTL::LowerDFGToLLVM::compileCompareEqConstant):
3127         (JSC::FTL::LowerDFGToLLVM::compileCompareStrictEq):
3128         (JSC::FTL::LowerDFGToLLVM::compileCompareStrictEqConstant):
3129         (JSC::FTL::LowerDFGToLLVM::compileCompareLess):
3130         (JSC::FTL::LowerDFGToLLVM::compileCompareLessEq):
3131         (JSC::FTL::LowerDFGToLLVM::compileCompareGreater):
3132         (JSC::FTL::LowerDFGToLLVM::compileCompareGreaterEq):
3133         (JSC::FTL::LowerDFGToLLVM::compileLogicalNot):
3134         (JSC::FTL::LowerDFGToLLVM::speculateBackward):
3135         (JSC::FTL::LowerDFGToLLVM::lowInt32):
3136         (JSC::FTL::LowerDFGToLLVM::lowCell):
3137         (JSC::FTL::LowerDFGToLLVM::lowBoolean):
3138         (JSC::FTL::LowerDFGToLLVM::lowDouble):
3139         (JSC::FTL::LowerDFGToLLVM::lowJSValue):
3140         (JSC::FTL::LowerDFGToLLVM::lowStorage):
3141         (JSC::FTL::LowerDFGToLLVM::speculate):
3142         (JSC::FTL::LowerDFGToLLVM::speculateBoolean):
3143         (JSC::FTL::LowerDFGToLLVM::isLive):
3144         (JSC::FTL::LowerDFGToLLVM::use):
3145         (JSC::FTL::LowerDFGToLLVM::initializeOSRExitStateForBlock):
3146         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
3147         (JSC::FTL::LowerDFGToLLVM::emitOSRExitCall):
3148         (JSC::FTL::LowerDFGToLLVM::addExitArgumentForNode):
3149         (JSC::FTL::LowerDFGToLLVM::linkOSRExitsAndCompleteInitializationBlocks):
3150         (JSC::FTL::LowerDFGToLLVM::setInt32):
3151         (JSC::FTL::LowerDFGToLLVM::setJSValue):
3152         (JSC::FTL::LowerDFGToLLVM::setBoolean):
3153         (JSC::FTL::LowerDFGToLLVM::setStorage):
3154         (JSC::FTL::LowerDFGToLLVM::setDouble):
3155         (JSC::FTL::LowerDFGToLLVM::isValid):
3156         * ftl/FTLLoweredNodeValue.h: Added.
3157         (FTL):
3158         (LoweredNodeValue):
3159         (JSC::FTL::LoweredNodeValue::LoweredNodeValue):
3160         (JSC::FTL::LoweredNodeValue::isSet):
3161         (JSC::FTL::LoweredNodeValue::operator!):
3162         (JSC::FTL::LoweredNodeValue::value):
3163         (JSC::FTL::LoweredNodeValue::block):
3164         * ftl/FTLValueFromBlock.h:
3165         (JSC::FTL::ValueFromBlock::ValueFromBlock):
3166         (ValueFromBlock):
3167         * ftl/FTLValueSource.cpp:
3168         (JSC::FTL::ValueSource::dump):
3169         * ftl/FTLValueSource.h:
3170
3171 2013-07-11  Mark Lam  <mark.lam@apple.com>
3172
3173         Resurrect the CLoop LLINT on the FTL branch.
3174         https://bugs.webkit.org/show_bug.cgi?id=118144.
3175
3176         Reviewed by Mark Hahnenberg.
3177
3178         * bytecode/CodeBlock.h:
3179         (JSC::CodeBlock::jitType):
3180           - Fix the CodeBlock jitType to be InterpreterThunk when !ENABLE_JIT.
3181         * bytecode/JumpTable.h:
3182         (JSC::SimpleJumpTable::clear):
3183         * interpreter/StackIterator.cpp:
3184         (JSC::StackIterator::Frame::bytecodeOffset):
3185         (JSC::StackIterator::Frame::print):
3186         * jit/JITCode.cpp:
3187         (JSC):
3188         * jit/JITExceptions.cpp:
3189         (JSC::getExceptionLocation):
3190         * llint/LowLevelInterpreter.cpp:
3191         * offlineasm/cloop.rb:
3192         * runtime/Structure.cpp:
3193
3194 2013-07-08  Filip Pizlo  <fpizlo@apple.com>
3195
3196         NaturalLoops + Profiler = Crash
3197         https://bugs.webkit.org/show_bug.cgi?id=118486
3198
3199         Reviewed by Geoffrey Garen.
3200         
3201         I borked dominators in:
3202         http://trac.webkit.org/changeset/152431/branches/dfgFourthTier/Source/JavaScriptCore/dfg/DFGDominators.h
3203         
3204         This patch also adds some debug support, and fixes the loop that adds a block to
3205         an already-existing natural loop. Note that we currently don't take that path in
3206         most programs, but it will arise, for example if you use 'continue' - though you'd
3207         have to use it rather cleverly since the bytecode will not jump to the loop header
3208         in most uses of 'continue'.
3209
3210         * dfg/DFGDominators.cpp:
3211         (JSC::DFG::Dominators::dump):
3212         (DFG):
3213         * dfg/DFGDominators.h:
3214         (JSC::DFG::Dominators::dominates):
3215         (Dominators):
3216         * dfg/DFGNaturalLoops.cpp:
3217         (JSC::DFG::NaturalLoops::compute):
3218
3219 2013-07-08  Filip Pizlo  <fpizlo@apple.com>
3220
3221         fourthTier: DFG::AbstractState::beginBasicBlock() should set m_haveStructures if any of the valuesAtHead have either a current known structure or a non-top/non-bottom array modes
3222         https://bugs.webkit.org/show_bug.cgi?id=118489
3223
3224         Reviewed by Mark Hahnenberg.
3225
3226         * bytecode/ArrayProfile.h:
3227         (JSC::arrayModesAreClearOrTop):
3228         (JSC):
3229         * dfg/DFGAbstractState.cpp:
3230         (JSC::DFG::AbstractState::beginBasicBlock):
3231         * dfg/DFGAbstractValue.h:
3232         (JSC::DFG::AbstractValue::hasClobberableState):
3233         (AbstractValue):
3234
3235 2013-07-08  Mark Hahnenberg  <mhahnenberg@apple.com>
3236
3237         CheckArray should call the right version of filterArrayModes
3238         https://bugs.webkit.org/show_bug.cgi?id=118488
3239
3240         Reviewed by Filip Pizlo.
3241
3242         Currently in the CFA CheckArray doesn't call the right filterArrayMode which can cause 
3243         the CFA to ignore when it sees a contradiction.
3244
3245         * dfg/DFGAbstractState.cpp:
3246         (JSC::DFG::AbstractState::executeEffects):
3247
3248 2013-07-07  Filip Pizlo  <fpizlo@apple.com>
3249
3250         fourthTier: Graph::clearAndDerefChild() makes no sense anymore, and neither does Nop
3251         https://bugs.webkit.org/show_bug.cgi?id=118452
3252
3253         Reviewed by Sam Weinig.
3254         
3255         Noticed that ArgumentsSimplificationPhase was converting something to a Nop and then
3256         resetting its children using clearAndDerefChild(). Using Nop instead of Phantom is a
3257         holdover from back when we needed a no-MustGenerate no-op. We don't anymore. Using
3258         clearAndDerefChild() was necessary back when we did eager reference counting. We
3259         don't need to do that anymore, and in fact clearAndDerefChild() appeared to not do
3260         any reference counting, so it was badly named to begin with.
3261
3262         * dfg/DFGAbstractState.cpp:
3263         (JSC::DFG::AbstractState::executeEffects):
3264         * dfg/DFGArgumentsSimplificationPhase.cpp:
3265         (JSC::DFG::ArgumentsSimplificationPhase::run):
3266         * dfg/DFGCPSRethreadingPhase.cpp:
3267         (JSC::DFG::CPSRethreadingPhase::freeUnnecessaryNodes):
3268         * dfg/DFGCSEPhase.cpp:
3269         (JSC::DFG::CSEPhase::performNodeCSE):
3270         * dfg/DFGFixupPhase.cpp:
3271         (JSC::DFG::FixupPhase::fixupNode):
3272         * dfg/DFGGraph.h:
3273         (Graph):
3274         * dfg/DFGNode.h:
3275         (JSC::DFG::Node::willHaveCodeGenOrOSR):
3276         * dfg/DFGNodeType.h:
3277         (DFG):
3278         * dfg/DFGPredictionPropagationPhase.cpp:
3279         (JSC::DFG::PredictionPropagationPhase::propagate):
3280         * dfg/DFGSpeculativeJIT32_64.cpp:
3281         (JSC::DFG::SpeculativeJIT::compile):
3282         * dfg/DFGSpeculativeJIT64.cpp:
3283         (JSC::DFG::SpeculativeJIT::compile):
3284
3285 2013-07-04  Filip Pizlo  <fpizlo@apple.com>
3286
3287         fourthTier: FTL should better report its compile-times and it should be able to run in a mode where it doesn't spend time generating OSR exits
3288         https://bugs.webkit.org/show_bug.cgi?id=118401
3289
3290         Reviewed by Sam Weinig.
3291         
3292         Add two new OSR exit modes, which are useful only for playing with compile times:
3293         
3294         - All OSR exits are llvm.trap().
3295         
3296         - OSR exits don't take arguments and have no exit value marshaling.
3297
3298         * dfg/DFGPlan.cpp:
3299         (JSC::DFG::Plan::compileInThread):
3300         (JSC::DFG::Plan::compileInThreadImpl):
3301         * dfg/DFGPlan.h:
3302         (Plan):
3303         * ftl/FTLIntrinsicRepository.h:
3304         (FTL):
3305         * ftl/FTLLowerDFGToLLVM.cpp:
3306         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
3307         (LowerDFGToLLVM):
3308         (JSC::FTL::LowerDFGToLLVM::emitOSRExitCall):
3309         * ftl/FTLOutput.h:
3310         (JSC::FTL::Output::trap):
3311         * runtime/Options.h:
3312         (JSC):
3313
3314 2013-07-04  Filip Pizlo  <fpizlo@apple.com>
3315
3316         fourthTier: DFG should refer to BasicBlocks by BasicBlock* and not BlockIndex
3317         https://bugs.webkit.org/show_bug.cgi?id=118339
3318
3319         Reviewed by Michael Saboff.
3320         
3321         This accomplishes two goals:
3322
3323         1) Simplifies a bunch of code. You can now much more directly get to a successor
3324            or predecessor, since you just get the pointer directly. The backend(s) always
3325            hold onto a pointer to the block they're on, so you don't have to do work to
3326            get the block from the index.
3327         
3328         2) It allows for the possibility of inserting blocks into the program.
3329            Previously, if you did that, you'd have to edit all references to blocks since
3330            those references would have outdated indexing after an insertion. Now, if you
3331            change the indexing, you just have to invalidate some analyses and make sure
3332            that you change each block's BasicBlock::index accordingly.
3333
3334         * dfg/DFGAbstractState.cpp:
3335         (JSC::DFG::AbstractState::initialize):
3336         (JSC::DFG::AbstractState::endBasicBlock):
3337         (JSC::DFG::AbstractState::mergeToSuccessors):
3338         * dfg/DFGAbstractState.h:
3339         (AbstractState):
3340         * dfg/DFGArgumentsSimplificationPhase.cpp:
3341         (JSC::DFG::ArgumentsSimplificationPhase::run):
3342         * dfg/DFGBackwardsPropagationPhase.cpp:
3343         (JSC::DFG::BackwardsPropagationPhase::run):
3344         * dfg/DFGBasicBlock.h:
3345         (DFG):
3346         (JSC::DFG::BasicBlock::BasicBlock):
3347         (JSC::DFG::BasicBlock::size):
3348         (JSC::DFG::BasicBlock::isEmpty):
3349         (JSC::DFG::BasicBlock::at):
3350         (JSC::DFG::BasicBlock::operator[]):
3351         (JSC::DFG::BasicBlock::last):
3352         (JSC::DFG::BasicBlock::resize):
3353         (JSC::DFG::BasicBlock::grow):
3354         (BasicBlock):
3355         (JSC::DFG::BasicBlock::append):
3356         (JSC::DFG::BasicBlock::numSuccessors):
3357         (JSC::DFG::BasicBlock::successor):
3358         (JSC::DFG::BasicBlock::successorForCondition):
3359         (JSC::DFG::BasicBlock::dump):
3360         (UnlinkedBlock):
3361         (JSC::DFG::UnlinkedBlock::UnlinkedBlock):
3362         (JSC::DFG::getBytecodeBeginForBlock):
3363         (JSC::DFG::blockForBytecodeOffset):
3364         * dfg/DFGByteCodeParser.cpp:
3365         (ByteCodeParser):
3366         (InlineStackEntry):
3367         (JSC::DFG::ByteCodeParser::handleInlining):
3368         (JSC::DFG::ByteCodeParser::parseBlock):
3369         (JSC::DFG::ByteCodeParser::linkBlock):
3370         (JSC::DFG::ByteCodeParser::linkBlocks):
3371         (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):
3372         (JSC::DFG::ByteCodeParser::parseCodeBlock):
3373         (JSC::DFG::ByteCodeParser::parse):
3374         * dfg/DFGCFAPhase.cpp:
3375         (JSC::DFG::CFAPhase::performBlockCFA):
3376         (JSC::DFG::CFAPhase::performForwardCFA):
3377         * dfg/DFGCFGSimplificationPhase.cpp:
3378         (JSC::DFG::CFGSimplificationPhase::run):
3379         (JSC::DFG::CFGSimplificationPhase::convertToJump):
3380         * dfg/DFGCPSRethreadingPhase.cpp:
3381         (JSC::DFG::CPSRethreadingPhase::freeUnnecessaryNodes):
3382         (JSC::DFG::CPSRethreadingPhase::canonicalizeLocalsInBlocks):
3383         (JSC::DFG::CPSRethreadingPhase::propagatePhis):
3384         (CPSRethreadingPhase):
3385         * dfg/DFGCSEPhase.cpp:
3386         (JSC::DFG::CSEPhase::run):
3387         * dfg/DFGConstantFoldingPhase.cpp:
3388         (JSC::DFG::ConstantFoldingPhase::run):
3389         (JSC::DFG::ConstantFoldingPhase::foldConstants):
3390         * dfg/DFGDCEPhase.cpp:
3391         (JSC::DFG::DCEPhase::run):
3392         * dfg/DFGDisassembler.cpp:
3393         (JSC::DFG::Disassembler::Disassembler):
3394         (JSC::DFG::Disassembler::createDumpList):
3395         * dfg/DFGDisassembler.h:
3396         (JSC::DFG::Disassembler::setForBlockIndex):
3397         * dfg/DFGDominators.cpp:
3398         (JSC::DFG::Dominators::compute):
3399         (JSC::DFG::Dominators::iterateForBlock):
3400         * dfg/DFGDominators.h:
3401         (JSC::DFG::Dominators::dominates):
3402         * dfg/DFGFixupPhase.cpp:
3403         (JSC::DFG::FixupPhase::run):
3404         (JSC::DFG::FixupPhase::fixupNode):
3405         * dfg/DFGGraph.cpp:
3406         (JSC::DFG::Graph::dump):
3407         (JSC::DFG::Graph::dumpBlockHeader):
3408         (JSC::DFG::Graph::handleSuccessor):
3409         (JSC::DFG::Graph::determineReachability):
3410         (JSC::DFG::Graph::resetReachability):
3411         * dfg/DFGGraph.h:
3412         (JSC::DFG::Graph::numBlocks):
3413         (JSC::DFG::Graph::block):
3414         (JSC::DFG::Graph::lastBlock):
3415         (Graph):
3416         (JSC::DFG::Graph::appendBlock):
3417         (JSC::DFG::Graph::killBlock):
3418         (DFG):
3419         * dfg/DFGJITCompiler.cpp:
3420         (JSC::DFG::JITCompiler::JITCompiler):
3421         (JSC::DFG::JITCompiler::link):
3422         * dfg/DFGJITCompiler.h:
3423         (JSC::DFG::JITCompiler::setForBlockIndex):
3424         * dfg/DFGNaturalLoops.cpp:
3425         (JSC::DFG::NaturalLoop::dump):
3426         (JSC::DFG::NaturalLoops::compute):
3427         (JSC::DFG::NaturalLoops::loopsOf):
3428         * dfg/DFGNaturalLoops.h:
3429         (JSC::DFG::NaturalLoop::NaturalLoop):
3430         (JSC::DFG::NaturalLoop::addBlock):
3431         (JSC::DFG::NaturalLoop::header):
3432         (JSC::DFG::NaturalLoop::at):
3433         (JSC::DFG::NaturalLoop::operator[]):
3434         (JSC::DFG::NaturalLoop::contains):
3435         (NaturalLoop):
3436         (JSC::DFG::NaturalLoops::headerOf):
3437         (NaturalLoops):
3438         * dfg/DFGNode.h:
3439         (DFG):
3440         (JSC::DFG::SwitchCase::SwitchCase):
3441         (JSC::DFG::SwitchCase::withBytecodeIndex):
3442         (SwitchCase):
3443         (JSC::DFG::SwitchCase::targetBytecodeIndex):
3444         (JSC::DFG::SwitchData::SwitchData):
3445         (JSC::DFG::SwitchData::setFallThroughBytecodeIndex):
3446         (JSC::DFG::SwitchData::fallThroughBytecodeIndex):
3447         (SwitchData):
3448         (JSC::DFG::Node::setTakenBlock):
3449         (JSC::DFG::Node::setNotTakenBlock):
3450         (JSC::DFG::Node::takenBlock):
3451         (JSC::DFG::Node::notTakenBlock):
3452         (JSC::DFG::Node::successor):
3453         (JSC::DFG::Node::successorForCondition):
3454         * dfg/DFGPredictionInjectionPhase.cpp:
3455         (JSC::DFG::PredictionInjectionPhase::run):
3456         * dfg/DFGPredictionPropagationPhase.cpp:
3457         (JSC::DFG::PredictionPropagationPhase::propagateForward):
3458         (JSC::DFG::PredictionPropagationPhase::propagateBackward):
3459         (JSC::DFG::PredictionPropagationPhase::doRoundOfDoubleVoting):
3460         * dfg/DFGSpeculativeJIT.cpp:
3461         (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward):
3462         (JSC::DFG::SpeculativeJIT::nonSpeculativeCompare):
3463         (JSC::DFG::SpeculativeJIT::nonSpeculativeStrictEq):
3464         (JSC::DFG::SpeculativeJIT::compilePeepHoleDoubleBranch):
3465         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectEquality):
3466         (JSC::DFG::SpeculativeJIT::compilePeepHoleIntegerBranch):
3467         (JSC::DFG::SpeculativeJIT::compilePeepHoleBranch):
3468         (JSC::DFG::SpeculativeJIT::compileCurrentBlock):
3469         (JSC::DFG::SpeculativeJIT::compile):
3470         (JSC::DFG::SpeculativeJIT::createOSREntries):
3471         (JSC::DFG::SpeculativeJIT::linkOSREntries):
3472         (JSC::DFG::SpeculativeJIT::compileStrictEqForConstant):
3473         (JSC::DFG::SpeculativeJIT::compileStrictEq):
3474         (JSC::DFG::SpeculativeJIT::compileRegExpExec):
3475         (JSC::DFG::SpeculativeJIT::addBranch):
3476         (JSC::DFG::SpeculativeJIT::linkBranches):
3477         * dfg/DFGSpeculativeJIT.h:
3478         (JSC::DFG::SpeculativeJIT::nextBlock):
3479         (SpeculativeJIT):
3480         (JSC::DFG::SpeculativeJIT::detectPeepHoleBranch):
3481         (JSC::DFG::SpeculativeJIT::branchDouble):
3482         (JSC::DFG::SpeculativeJIT::branchDoubleNonZero):
3483         (JSC::DFG::SpeculativeJIT::branch32):
3484         (JSC::DFG::SpeculativeJIT::branchTest32):
3485         (JSC::DFG::SpeculativeJIT::branch64):
3486         (JSC::DFG::SpeculativeJIT::branch8):
3487         (JSC::DFG::SpeculativeJIT::branchPtr):
3488         (JSC::DFG::SpeculativeJIT::branchTestPtr):
3489         (JSC::DFG::SpeculativeJIT::branchTest8):
3490         (JSC::DFG::SpeculativeJIT::jump):
3491         (JSC::DFG::SpeculativeJIT::addBranch):
3492         (JSC::DFG::SpeculativeJIT::StringSwitchCase::StringSwitchCase):
3493         (StringSwitchCase):
3494         (JSC::DFG::SpeculativeJIT::BranchRecord::BranchRecord):
3495         (BranchRecord):
3496         * dfg/DFGSpeculativeJIT32_64.cpp:
3497         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull):
3498         (JSC::DFG::SpeculativeJIT::nonSpeculativeCompareNull):
3499         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
3500         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
3501         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality):
3502         (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch):
3503         (JSC::DFG::SpeculativeJIT::emitBranch):
3504         (JSC::DFG::SpeculativeJIT::compile):
3505         * dfg/DFGSpeculativeJIT64.cpp:
3506         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranchNull):
3507         (JSC::DFG::SpeculativeJIT::nonSpeculativeCompareNull):
3508         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeBranch):
3509         (JSC::DFG::SpeculativeJIT::nonSpeculativePeepholeStrictEq):
3510         (JSC::DFG::SpeculativeJIT::compilePeepHoleObjectToObjectOrOtherEquality):
3511         (JSC::DFG::SpeculativeJIT::emitObjectOrOtherBranch):
3512         (JSC::DFG::SpeculativeJIT::emitBranch):
3513         (JSC::DFG::SpeculativeJIT::compile):
3514         * dfg/DFGTypeCheckHoistingPhase.cpp:
3515         (JSC::DFG::TypeCheckHoistingPhase::run):
3516         (JSC::DFG::TypeCheckHoistingPhase::identifyRedundantStructureChecks):
3517         (JSC::DFG::TypeCheckHoistingPhase::identifyRedundantArrayChecks):
3518         (JSC::DFG::TypeCheckHoistingPhase::disableHoistingAcrossOSREntries):
3519         * dfg/DFGUnificationPhase.cpp:
3520         (JSC::DFG::UnificationPhase::run):
3521         * dfg/DFGValidate.cpp:
3522         (JSC::DFG::Validate::validate):
3523         (JSC::DFG::Validate::checkOperand):
3524         (JSC::DFG::Validate::reportValidationContext):
3525         * dfg/DFGVirtualRegisterAllocationPhase.cpp:
3526         (JSC::DFG::VirtualRegisterAllocationPhase::run):
3527         * ftl/FTLCapabilities.cpp:
3528         (JSC::FTL::canCompile):
3529         * ftl/FTLLowerDFGToLLVM.cpp:
3530         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
3531         (JSC::FTL::LowerDFGToLLVM::lower):
3532         (JSC::FTL::LowerDFGToLLVM::compileBlock):
3533         (JSC::FTL::LowerDFGToLLVM::compileJump):
3534         (JSC::FTL::LowerDFGToLLVM::compileBranch):
3535         (JSC::FTL::LowerDFGToLLVM::lowBlock):
3536
3537 2013-07-04  Filip Pizlo  <fpizlo@apple.com>
3538
3539         Unreviewed, add a helpful comment for why DCE is needed in the FTL.
3540
3541         I believe I've now twice down the experiment of disabling DCE in the FTL,
3542         only to realize that this can't work, and that DCE is needed. I'd kind of
3543         like to not make that mistake again.
3544
3545         * dfg/DFGPlan.cpp:
3546         (JSC::DFG::Plan::compileInThreadImpl):
3547
3548 2013-07-02  Filip Pizlo  <fpizlo@apple.com>
3549
3550         fourthTier: DFG::Node::m_opInfo2 should also be a uintptr_t
3551         https://bugs.webkit.org/show_bug.cgi?id=118340
3552
3553         Reviewed by Sam Weinig.
3554
3555         * dfg/DFGNode.h:
3556         (JSC::DFG::Node::Node):
3557
3558 2013-07-02  Filip Pizlo  <fpizlo@apple.com>
3559
3560         Unreviewed, fix 32-bit build.
3561
3562         * assembler/MacroAssembler.h:
3563         (JSC::MacroAssembler::comparePtr):
3564         (MacroAssembler):
3565         * dfg/DFGBinarySwitch.cpp:
3566         (JSC::DFG::BinarySwitch::advance):
3567         * dfg/DFGBinarySwitch.h:
3568         (JSC::DFG::BinarySwitch::caseValue):
3569
3570 2013-07-02  Filip Pizlo  <fpizlo@apple.com>
3571
3572         fourthTier: Have fewer Arrayify's
3573         https://bugs.webkit.org/show_bug.cgi?id=118335
3574
3575         Reviewed by Mark Hahnenberg.
3576         
3577         A lot of Arrayify's arise because some program saw Int32 arrays early on in
3578         execution, but then they all got converted to Double arrays and the program
3579         will never see Int32 arrays ever again. Prior to this change you would always
3580         have an Arrayify in this case. But with this change, the first time that an
3581         ArrayProfile is about to go polymorphic in computeUpdatedPrediction(), it
3582         instead forcibly monomorphises itself to the latest-seen structure.
3583         Thereafter it will never again perform this monomorphisation. This is
3584         controlled by ArrayProfile::m_didPerformFirstRunPruning. This is a 5%
3585         speed-up on Kraken/imaging-gaussian-blur with the FTL enabled, and it
3586         unblocks a bunch of stuff we want to do in the future because it makes a
3587         bunch of loops effect-free.
3588         
3589         We will still want to implement Arrayify hoisting in the future, but this is
3590         great anyway because it's better to not have Arrayifications than it is to
3591         have hoisted Arrayifications.
3592
3593         * bytecode/ArrayProfile.cpp:
3594         (JSC::ArrayProfile::computeUpdatedPrediction):
3595         (JSC::ArrayProfile::briefDescription):
3596         (JSC):
3597         (JSC::ArrayProfile::briefDescriptionWithoutUpdating):
3598         * bytecode/ArrayProfile.h:
3599         (JSC::ArrayProfile::ArrayProfile):
3600         (ArrayProfile):
3601
3602 2013-07-02  Filip Pizlo  <fpizlo@apple.com>
3603
3604         fourthTier: add option to disable OSR entry in loops
3605         https://bugs.webkit.org/show_bug.cgi?id=118329
3606
3607         Reviewed by Mark Hahnenberg.
3608         
3609         This adds that option, and also makes the OSR exit reoptimization trigger rely less on
3610         OSR entry failing. Now even if we never attempt OSR entry but our execution counter gets
3611         high after a small number of OSR exits, we will recompile.
3612
3613         * dfg/DFGOSRExitCompilerCommon.cpp:
3614         (JSC::DFG::handleExitCounts):
3615         * dfg/DFGOperations.cpp:
3616         * jit/JITOpcodes.cpp:
3617         (JSC::JIT::emit_op_loop_hint):
3618         (JSC::JIT::emitSlow_op_loop_hint):
3619         * runtime/Options.h:
3620         (JSC):
3621
3622 2013-07-02  Filip Pizlo  <fpizlo@apple.com>
3623
3624         fourthTier: since the FTL disassembly hacks cannot distinguish between code and data, the LLVM disassembler symbol table callback should be able to deal gracefully with arbitrary garbage
3625         https://bugs.webkit.org/show_bug.cgi?id=118313
3626
3627         Reviewed by Mark Hahnenberg.
3628         
3629         Give it a mode where we can still crash on unrecognized reference types, so that we might
3630         implement them in the future, but by default just print some stuff and keep going.
3631
3632         * disassembler/LLVMDisassembler.cpp:
3633         (JSC):
3634         (JSC::symbolLookupCallback):
3635
3636 2013-07-02  Filip Pizlo  <fpizlo@apple.com>
3637
3638         fourthTier: FTL should use the equivalent of llvm opt -O2 by default
3639         https://bugs.webkit.org/show_bug.cgi?id=118311
3640
3641         Reviewed by Mark Hahnenberg.
3642         
3643         Use a PassManagerBuilder instead of rolling our own.
3644         
3645         This boosts our speed-up by another 5% or so.
3646
3647         * ftl/FTLCompile.cpp:
3648         (JSC::FTL::compile):
3649         * runtime/Options.h:
3650         (JSC):
3651
3652 2013-07-01  Filip Pizlo  <fpizlo@apple.com>
3653
3654         fourthTier: FTL should run LICM after AA setup
3655         https://bugs.webkit.org/show_bug.cgi?id=118277
3656
3657         Reviewed by Maciej Stachowiak.
3658         
3659         LICM queries alias analysis. Hence, just like GVN, it should run after
3660         we have set up the alias analysis.
3661
3662         * ftl/FTLCompile.cpp:
3663         (JSC::FTL::compile):
3664
3665 2013-07-01  Filip Pizlo  <fpizlo@apple.com>
3666
3667         fourthTier: FTL should run AA passes before GVN
3668         https://bugs.webkit.org/show_bug.cgi?id=118276
3669
3670         Rubber stamped by Geoffrey Garen.
3671         
3672         These enable load elimination in GVN.
3673         
3674         Immediately gives us a speed-up on a bunch of benchmarks I hacked to run
3675         properly in the FTL. One example is 20% on imaging-gaussian-blur. (Fair
3676         warning: the stock version of that benchmark won't see speed-ups -
3677         probably slow-downs instead - because the FTL can't do OSR entry yet.)
3678         Another example is the findGraphNode function, which now sees a 7%
3679         speed-up, and that's without even doing LICM or other good things.
3680
3681         * ftl/FTLCompile.cpp:
3682         (JSC::FTL::compile):
3683
3684 2013-06-27  Filip Pizlo  <fpizlo@apple.com>
3685
3686         Make Graph::substituteGetLocal() out-of-line
3687
3688         Rubber stamped by Geoffrey Garen.
3689
3690         * dfg/DFGGraph.cpp:
3691         (JSC::DFG::Graph::substituteGetLocal):
3692         (DFG):
3693         * dfg/DFGGraph.h:
3694         (Graph):
3695
3696 2013-06-27  Filip Pizlo  <fpizlo@apple.com>
3697
3698         fourthTier: DFG should know how to find natural loops
3699         https://bugs.webkit.org/show_bug.cgi?id=118152
3700
3701         Reviewed by Mark Hahnenberg.
3702         
3703         There are a bunch of things we can do when we know where the loops are.
3704         Previously we didn't. With this patch, we do.
3705         
3706         This patch adds the classic dominator based natural loop finder.
3707         
3708         The only client of this right now is the DFG::Disassembler. It prints out
3709         a summary of the analysis for each block.
3710         
3711         This will become more important when I do
3712         https://bugs.webkit.org/show_bug.cgi?id=118151, which definitely requires
3713         this kind of analysis, at least if we want to do the optimization over
3714         DFG IR (and I'm pretty sure we do).
3715
3716         * JavaScriptCore.xcodeproj/project.pbxproj:
3717         * dfg/DFGAnalysis.h: Added.
3718         (DFG):
3719         (Analysis):
3720         (JSC::DFG::Analysis::Analysis):
3721         (JSC::DFG::Analysis::invalidate):
3722         (JSC::DFG::Analysis::computeIfNecessary):
3723         (JSC::DFG::Analysis::isValid):
3724         * dfg/DFGCFGSimplificationPhase.cpp:
3725         (JSC::DFG::CFGSimplificationPhase::run):
3726         * dfg/DFGDisassembler.cpp:
3727         (JSC::DFG::Disassembler::createDumpList):
3728         * dfg/DFGDominators.cpp:
3729         (JSC::DFG::Dominators::Dominators):
3730         (JSC::DFG::Dominators::compute):
3731         * dfg/DFGDominators.h:
3732         (Dominators):
3733         * dfg/DFGGraph.cpp:
3734         (JSC::DFG::Graph::dumpBlockHeader):
3735         (JSC::DFG::Graph::invalidateCFG):
3736         (DFG):
3737         * dfg/DFGGraph.h:
3738         (Graph):
3739         * dfg/DFGNaturalLoops.cpp: Added.
3740         (DFG):
3741         (JSC::DFG::NaturalLoop::dump):
3742         (JSC::DFG::NaturalLoops::NaturalLoops):
3743         (JSC::DFG::NaturalLoops::~NaturalLoops):
3744         (JSC::DFG::NaturalLoops::compute):
3745         (JSC::DFG::NaturalLoops::loopsOf):
3746         (JSC::DFG::NaturalLoops::dump):
3747         * dfg/DFGNaturalLoops.h: Added.
3748         (DFG):
3749         (NaturalLoop):
3750         (JSC::DFG::NaturalLoop::NaturalLoop):
3751         (JSC::DFG::NaturalLoop::addBlock):
3752         (JSC::DFG::NaturalLoop::header):
3753         (JSC::DFG::NaturalLoop::size):
3754         (JSC::DFG::NaturalLoop::at):
3755         (JSC::DFG::NaturalLoop::operator[]):
3756         (JSC::DFG::NaturalLoop::contains):
3757         (NaturalLoops):
3758         (JSC::DFG::NaturalLoops::numLoops):
3759         (JSC::DFG::NaturalLoops::loop):
3760         (JSC::DFG::NaturalLoops::headerOf):
3761
3762 2013-06-27  Filip Pizlo  <fpizlo@apple.com>
3763
3764         fourthTier: JSC's disassembly infrastructure should be able to disassemble the code that LLVM generates
3765         https://bugs.webkit.org/show_bug.cgi?id=118148
3766
3767         Reviewed by Anders Carlsson.
3768         
3769         Oh boy. UDis86 cannot disassemble the AVX (or whatever it's called) stuff
3770         that LLVM generates for floating point. So the right decision is to
3771         switch to the LLVM disassembler, right? Wrong!! LLVM's disassembler
3772         cannot disassemble the load-from-absolute-address-into-%rax instructions
3773         that our JIT generates quite a lot of.
3774         
3775         So, this keeps the UDis86 disassembler, but adds the LLVM disassembler,
3776         and requires the caller of disassemble() to hint which one is likely to
3777         be less wrong for the given code.
3778         
3779         Maybe in the future LLVM will catch up to UDis86, but it's definitely not
3780         there right now.
3781         
3782         This now allows us to disassemble all of the code that LLVM generates.
3783
3784         * JavaScriptCore.xcodeproj/project.pbxproj:
3785         * disassembler/Disassembler.cpp:
3786         (JSC::disassemble):
3787         * disassembler/Disassembler.h:
3788         (JSC::tryToDisassemble):
3789         (JSC):
3790         * disassembler/LLVMDisassembler.cpp: Added.
3791         (JSC):
3792         (JSC::symbolLookupCallback):
3793         (JSC::tryToDisassembleWithLLVM):
3794         * disassembler/LLVMDisassembler.h: Added.
3795         (JSC):
3796         (JSC::tryToDisassembleWithLLVM):
3797         * disassembler/UDis86Disassembler.cpp:
3798         (JSC::tryToDisassembleWithUDis86):
3799         * disassembler/UDis86Disassembler.h: Added.
3800         (JSC):
3801         (JSC::tryToDisassembleWithUDis86):
3802         * disassembler/X86Disassembler.cpp: Added.
3803         (JSC):
3804         (JSC::tryToDisassemble):
3805         * ftl/FTLAbbreviatedTypes.h:
3806         * ftl/FTLCompile.cpp:
3807         (JSC::FTL::compile):
3808         * ftl/FTLJITCode.h:
3809         * ftl/FTLJITFinalizer.h:
3810         * ftl/FTLLLVMHeaders.h: Removed.
3811         * ftl/FTLLink.cpp:
3812         * runtime/InitializeThreading.cpp:
3813         (JSC::initializeThreadingOnce):
3814         * runtime/Options.h:
3815         (JSC):
3816
3817 2013-06-27  Filip Pizlo  <fpizlo@apple.com>
3818
3819         fourthTier: FTL should be able to dump disassembly
3820         https://bugs.webkit.org/show_bug.cgi?id=118141
3821
3822         Reviewed by Geoffrey Garen.
3823
3824         * ftl/FTLCompile.cpp:
3825         (JSC::FTL::compile):
3826
3827 2013-06-27  Filip Pizlo  <fpizlo@apple.com>
3828
3829         Unreviewed, fix build for LLVM ToT.
3830
3831         This doesn't affect those using the binary drops, but if you're building from
3832         LLVM ToT you'll get link errors. These arise because we expect there to be a
3833         libLLVMArchive, but that is no longer built by LLVM ToT. This casues the linker
3834         to fall back on the system's libLLVMArchive, which is incompatible with the
3835         other LLVM libs we pull in.
3836         
3837         Also, we didn't need that library anyway and shouldn't have been linking
3838         against it.
3839
3840         * Configurations/JavaScriptCore.xcconfig:
3841
3842 2013-06-26  Filip Pizlo  <fpizlo@apple.com>
3843
3844         fourthTier: FTL should support hole/OOB PutByVal's
3845         https://bugs.webkit.org/show_bug.cgi?id=118112
3846
3847         Reviewed by Geoffrey Garen.
3848         
3849         Added a common code generator for the out-of-bounds case that is reused by
3850         all contiguous-like arrays (Int32, Double, Contiguous).
3851         
3852         This is relatively straight-forward, except that it's the first time that
3853         the FTL has to call DFG operations that take more than two arguments.
3854
3855         * ftl/FTLAbbreviations.h:
3856         (JSC::FTL::functionType):
3857         (JSC::FTL::buildCall):
3858         * ftl/FTLAbstractHeapRepository.h:
3859         (FTL):
3860         * ftl/FTLCapabilities.cpp:
3861         (JSC::FTL::canCompile):
3862         * ftl/FTLIntrinsicRepository.h:
3863         (FTL):
3864         * ftl/FTLLowerDFGToLLVM.cpp:
3865         (JSC::FTL::LowerDFGToLLVM::compilePutByVal):
3866         (LowerDFGToLLVM):
3867         (JSC::FTL::LowerDFGToLLVM::contiguousPutByValOutOfBounds):
3868         (JSC::FTL::LowerDFGToLLVM::vmCall):
3869         * ftl/FTLOutput.h:
3870         (JSC::FTL::Output::call):
3871
3872 2013-06-26  Filip Pizlo  <fpizlo@apple.com>
3873
3874         fourthTier: FTL::canCompile(Graph&) should not consider nodes that won't be compiled
3875         https://bugs.webkit.org/show_bug.cgi?id=118097
3876
3877         Reviewed by Mark Hahnenberg.
3878         
3879         This increases coverage to include programs that have unprofiled paths. Those paths will
3880         often have nodes that appear to do untyped speculations, and the FTL sometimes doesn't
3881         support those; except that it doesn't matter since the reason why they were untyped is
3882         that they were unprofiled and anyway we won't run them because we'll exit before them.
3883
3884         * ftl/FTLCapabilities.cpp:
3885         (JSC::FTL::canCompile):
3886
3887 2013-06-26  Filip Pizlo  <fpizlo@apple.com>
3888
3889         fourthTier: FTL should support ArrayifyToStructure
3890         https://bugs.webkit.org/show_bug.cgi?id=118095
3891
3892         Reviewed by Mark Hahnenberg.
3893
3894         * ftl/FTLCapabilities.cpp:
3895         (JSC::FTL::canCompile):
3896         * ftl/FTLIntrinsicRepository.h:
3897         (FTL):
3898         * ftl/FTLLowerDFGToLLVM.cpp:
3899         (JSC::FTL::LowerDFGToLLVM::compileNode):
3900         (JSC::FTL::LowerDFGToLLVM::compileArrayifyToStructure):
3901         (LowerDFGToLLVM):
3902
3903 2013-06-26  Filip Pizlo  <fpizlo@apple.com>
3904
3905         fourthTier: FTL should support ForwardCheckStructure/ForwardStructureTransitionWatchpoint and doing so shouldn't break V8/crypto
3906         https://bugs.webkit.org/show_bug.cgi?id=118091
3907
3908         Reviewed by Mark Hahnenberg.
3909         
3910         I was going to just add ForwardCheckStructure/ForwardStructureTransitionWatchpoint support,
3911         which is trivial. But doing so increases coverage a lot, and revealed long-standing bugs in
3912         the FTL. I then fixed those bugs, also:
3913         
3914         - The FTL should not attempt to compile a block that is not reachable according to the CFA.
3915           This is analogous to terminating basic block compilation if the CFA becomes !isValid().
3916           Attempting to compile such a block means that you're running on broken CFA state, and the
3917           CFA will become inconsistent with the code you're generating, leading to some
3918           strangeness. For example, the FTL relies on the CFA to tell it that we gave up compiling
3919           a node and hence don't have LValue's for that node (by virtue of us giving up due to
3920           !isValid()). But the CFA's isValid() bit will not be set correctly for blocks that
3921           weren't visited by the CFA at all, and the CFA expects you to know this because it
3922           expects that you already checked BasicBlock::cfaHasVisited.
3923         
3924         - SetLocal needs to change the ValueSource of the operand to indicate that its value has
3925           been stashed in the local (i.e. the "reference" corresponding to the operand in FTL
3926           speak). This is because although OSR exit already knows that the value of the operand is