fourthTier: Landing the initial FTL logic in a single commit to avoid spurious
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2013-04-16  Filip Pizlo  <fpizlo@apple.com>
2
3         fourthTier: DFG should be able to query Structure without modifying it
4         https://bugs.webkit.org/show_bug.cgi?id=114708
5
6         Reviewed by Oliver Hunt.
7         
8         This is work towards allowing the DFG, and FTL, to run on a separate thread.
9         The idea is that the most evil thing that the DFG does that has thread-safety
10         issues is fiddling with Structures by calling Structure::get(). This can lead
11         to rematerialization of property tables, which is definitely not thread-safe
12         due to how StringImpl works. So, this patch completely side-steps the problem
13         by creating a new version of Structure::get, called
14         Structure::getWithoutMaterializing, which may choose to do an O(n) search if
15         necessary to avoid materialization. I believe this should be fine - the DFG
16         does't call into these code path often enough for this to matter, and most of
17         the time, the Structure that we call this on will already have a property
18         table because some inline cache would have already called ::get() on that
19         Structure.
20         
21         Also cleaned up the materialization logic: we can stop the search as soon as
22         we find any Structure with a property table rather than searching all the way
23         for a pinned one.
24
25         * bytecode/GetByIdStatus.cpp:
26         (JSC::GetByIdStatus::computeFor):
27         * bytecode/PutByIdStatus.cpp:
28         (JSC::PutByIdStatus::computeFromLLInt):
29         (JSC::PutByIdStatus::computeFor):
30         * runtime/Structure.cpp:
31         (JSC::Structure::findStructuresAndMapForMaterialization):
32         (JSC::Structure::materializePropertyMap):
33         (JSC::Structure::getWithoutMaterializing):
34         (JSC):
35         * runtime/Structure.h:
36         (Structure):
37         * runtime/StructureInlines.h:
38         (JSC::Structure::getWithoutMaterializing):
39         (JSC):
40
41 2013-04-13  Filip Pizlo  <fpizlo@apple.com>
42
43         fourthTier: Fix release build.
44
45         * dfg/DFGOSRExitCompilerCommon.cpp:
46         * ftl/FTLExitValue.cpp:
47         * ftl/FTLOSRExitCompiler.cpp:
48
49 2013-04-13  Filip Pizlo  <fpizlo@apple.com>
50
51         fourthTier: FTL should have OSR exit
52         https://bugs.webkit.org/show_bug.cgi?id=113623
53
54         Reviewed by Oliver Hunt.
55         
56         This implements OSR exit, and hilariously, it actually works. The idea is to have
57         LLVM call a no-return function on the off-ramp, passing it everything we know about
58         bytecode state that isn't already flushed to the call frame. Our own JIT takes care
59         of the rest.
60         
61         We can now run all of SunSpider, V8, and Kraken with the FTL enabled.
62         
63         The details are described in FTLOSRExit.h.
64
65         * CMakeLists.txt:
66         * GNUmakefile.list.am:
67         * JavaScriptCore.xcodeproj/project.pbxproj:
68         * Target.pri:
69         * assembler/AbstractMacroAssembler.h:
70         (Address):
71         (JSC::AbstractMacroAssembler::Address::withOffset):
72         * assembler/LinkBuffer.h:
73         (JSC::LinkBuffer::offsetOf):
74         (LinkBuffer):
75         * assembler/MacroAssemblerX86Common.h:
76         * assembler/RepatchBuffer.h:
77         (JSC::RepatchBuffer::RepatchBuffer):
78         (JSC::RepatchBuffer::~RepatchBuffer):
79         (RepatchBuffer):
80         * bytecode/CodeBlock.cpp:
81         (JSC::CodeBlock::tallyFrequentExitSites):
82         * bytecode/Operands.h:
83         (Operands):
84         (JSC):
85         (JSC::::dump):
86         * dfg/DFGAbstractState.cpp:
87         (JSC::DFG::AbstractState::initialize):
88         * dfg/DFGGPRInfo.h:
89         (DFG):
90         (GPRInfo):
91         * dfg/DFGMinifiedNode.h:
92         (JSC::DFG::belongsInMinifiedGraph):
93         * dfg/DFGNodeType.h:
94         (JSC::DFG::needsOSRBackwardRewiring):
95         (DFG):
96         (JSC::DFG::needsOSRForwardRewiring):
97         * dfg/DFGOSRExit.cpp:
98         (JSC::DFG::OSRExit::OSRExit):
99         (DFG):
100         (JSC::DFG::OSRExit::convertToForward):
101         * dfg/DFGOSRExit.h:
102         (OSRExit):
103         * dfg/DFGOSRExitBase.cpp: Added.
104         (DFG):
105         (JSC::DFG::OSRExitBase::considerAddingAsFrequentExitSiteSlow):
106         (JSC::DFG::OSRExitBase::doSearchForForwardConversion):
107         * dfg/DFGOSRExitBase.h: Added.
108         (DFG):
109         (JSC::DFG::OSRExitBase::OSRExitBase):
110         (OSRExitBase):
111         (JSC::DFG::OSRExitBase::considerAddingAsFrequentExitSite):
112         * dfg/DFGOSRExitCompiler.cpp:
113         * dfg/DFGOSRExitCompiler64.cpp:
114         (JSC::DFG::OSRExitCompiler::compileExit):
115         * dfg/DFGOSRExitCompilerCommon.cpp:
116         (JSC::DFG::handleExitCounts):
117         (JSC::DFG::reifyInlinedCallFrames):
118         (JSC::DFG::adjustAndJumpToTarget):
119         * dfg/DFGOSRExitCompilerCommon.h:
120         (DFG):
121         * dfg/DFGOSRExitPreparation.cpp: Added.
122         (DFG):
123         (JSC::DFG::prepareCodeOriginForOSRExit):
124         * dfg/DFGOSRExitPreparation.h: Added.
125         (DFG):
126         * dfg/DFGOperations.cpp:
127         * dfg/DFGSpeculativeJIT.cpp:
128         (JSC::DFG::SpeculativeJIT::checkArgumentTypes):
129         * dfg/DFGValueSource.h:
130         (JSC::DFG::ValueSource::forSpeculation):
131         * dfg/DFGVariableEventStream.cpp:
132         (JSC::DFG::VariableEventStream::reconstruct):
133         * ftl/FTLAbbreviations.h:
134         (JSC::FTL::functionType):
135         (FTL):
136         (JSC::FTL::typeOf):
137         (JSC::FTL::appendBasicBlock):
138         (JSC::FTL::insertBasicBlock):
139         (JSC::FTL::buildCall):
140         (JSC::FTL::setTailCall):
141         * ftl/FTLCArgumentGetter.cpp: Added.
142         (FTL):
143         (JSC::FTL::CArgumentGetter::loadNextAndBox):
144         * ftl/FTLCArgumentGetter.h: Added.
145         (FTL):
146         (JSC::FTL::isArgumentRegister):
147         (CArgumentGetter):
148         (JSC::FTL::CArgumentGetter::CArgumentGetter):
149         (JSC::FTL::CArgumentGetter::loadNext8):
150         (JSC::FTL::CArgumentGetter::loadNext32):
151         (JSC::FTL::CArgumentGetter::loadNext64):
152         (JSC::FTL::CArgumentGetter::loadNextPtr):
153         (JSC::FTL::CArgumentGetter::loadNextDouble):
154         (JSC::FTL::CArgumentGetter::nextAddress):
155         * ftl/FTLCompile.cpp:
156         (JSC::FTL::compile):
157         * ftl/FTLExitArgument.cpp: Added.
158         (FTL):
159         (JSC::FTL::ExitArgument::dump):
160         * ftl/FTLExitArgument.h: Added.
161         (FTL):
162         (ExitArgumentRepresentation):
163         (ExitArgument):
164         (JSC::FTL::ExitArgument::ExitArgument):
165         (JSC::FTL::ExitArgument::operator!):
166         (JSC::FTL::ExitArgument::format):
167         (JSC::FTL::ExitArgument::argument):
168         (JSC::FTL::ExitArgument::withFormat):
169         (JSC::FTL::ExitArgument::representation):
170         * ftl/FTLExitArgumentForOperand.cpp: Added.
171         (FTL):
172         (JSC::FTL::ExitArgumentForOperand::dump):
173         * ftl/FTLExitArgumentForOperand.h: Added.
174         (FTL):
175         (ExitArgumentForOperand):
176         (JSC::FTL::ExitArgumentForOperand::ExitArgumentForOperand):
177         (JSC::FTL::ExitArgumentForOperand::operator!):
178         (JSC::FTL::ExitArgumentForOperand::exitArgument):
179         (JSC::FTL::ExitArgumentForOperand::operand):
180         (JSC::FTL::lesserArgumentIndex):
181         * ftl/FTLExitArgumentList.h: Added.
182         (FTL):
183         * ftl/FTLExitThunkGenerator.cpp: Added.
184         (FTL):
185         (JSC::FTL::ExitThunkGenerator::ExitThunkGenerator):
186         (JSC::FTL::ExitThunkGenerator::~ExitThunkGenerator):
187         (JSC::FTL::ExitThunkGenerator::emitThunk):
188         * ftl/FTLExitThunkGenerator.h: Added.
189         (FTL):
190         (ExitThunkGenerator):
191         (JSC::FTL::ExitThunkGenerator::didThings):
192         * ftl/FTLExitValue.cpp: Added.
193         (FTL):
194         (JSC::FTL::ExitValue::dump):
195         * ftl/FTLExitValue.h: Added.
196         (FTL):
197         (ExitValue):
198         (JSC::FTL::ExitValue::ExitValue):
199         (JSC::FTL::ExitValue::operator!):
200         (JSC::FTL::ExitValue::dead):
201         (JSC::FTL::ExitValue::inJSStack):
202         (JSC::FTL::ExitValue::inJSStackAsInt32):
203         (JSC::FTL::ExitValue::inJSStackAsDouble):
204         (JSC::FTL::ExitValue::constant):
205         (JSC::FTL::ExitValue::exitArgument):
206         (JSC::FTL::ExitValue::kind):
207         (JSC::FTL::ExitValue::isDead):
208         (JSC::FTL::ExitValue::isInJSStackSomehow):
209         (JSC::FTL::ExitValue::isConstant):
210         (JSC::FTL::ExitValue::isArgument):
211         * ftl/FTLFormattedValue.h:
212         (FTL):
213         (JSC::FTL::noValue):
214         (JSC::FTL::int32Value):
215         (JSC::FTL::uInt32Value):
216         (JSC::FTL::booleanValue):
217         (JSC::FTL::jsValueValue):
218         (JSC::FTL::doubleValue):
219         * ftl/FTLJITCode.cpp:
220         (JSC::FTL::JITCode::initializeExitThunks):
221         (FTL):
222         (JSC::FTL::JITCode::exitThunks):
223         * ftl/FTLJITCode.h:
224         (JITCode):
225         * ftl/FTLLowerDFGToLLVM.cpp:
226         (FTL):
227         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
228         (JSC::FTL::LowerDFGToLLVM::lower):
229         (JSC::FTL::LowerDFGToLLVM::transferAndCheckArguments):
230         (JSC::FTL::LowerDFGToLLVM::compileBlock):
231         (JSC::FTL::LowerDFGToLLVM::compileNode):
232         (JSC::FTL::LowerDFGToLLVM::compileGetLocal):
233         (JSC::FTL::LowerDFGToLLVM::compileSetLocal):
234         (LowerDFGToLLVM):
235         (JSC::FTL::LowerDFGToLLVM::compileMovHint):
236         (JSC::FTL::LowerDFGToLLVM::compileZombieHint):
237         (JSC::FTL::LowerDFGToLLVM::compileMovHintAndCheck):
238         (JSC::FTL::LowerDFGToLLVM::compileAdd):
239         (JSC::FTL::LowerDFGToLLVM::compileArithSub):
240         (JSC::FTL::LowerDFGToLLVM::compileArithMul):
241         (JSC::FTL::LowerDFGToLLVM::compileArithNegate):
242         (JSC::FTL::LowerDFGToLLVM::compileUInt32ToNumber):
243         (JSC::FTL::LowerDFGToLLVM::compileCheckStructure):
244         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
245         (JSC::FTL::LowerDFGToLLVM::speculateBackward):
246         (JSC::FTL::LowerDFGToLLVM::speculateForward):
247         (JSC::FTL::LowerDFGToLLVM::speculate):
248         (JSC::FTL::LowerDFGToLLVM::terminate):
249         (JSC::FTL::LowerDFGToLLVM::backwardTypeCheck):
250         (JSC::FTL::LowerDFGToLLVM::forwardTypeCheck):
251         (JSC::FTL::LowerDFGToLLVM::typeCheck):
252         (JSC::FTL::LowerDFGToLLVM::appendTypeCheck):
253         (JSC::FTL::LowerDFGToLLVM::lowInt32):
254         (JSC::FTL::LowerDFGToLLVM::lowCell):
255         (JSC::FTL::LowerDFGToLLVM::lowBoolean):
256         (JSC::FTL::LowerDFGToLLVM::speculateObject):
257         (JSC::FTL::LowerDFGToLLVM::isLive):
258         (JSC::FTL::LowerDFGToLLVM::use):
259         (JSC::FTL::LowerDFGToLLVM::initializeOSRExitStateForBlock):
260         (JSC::FTL::LowerDFGToLLVM::appendOSRExit):
261         (JSC::FTL::LowerDFGToLLVM::addExitArgumentForNode):
262         (JSC::FTL::LowerDFGToLLVM::tryToSetConstantExitArgument):
263         (JSC::FTL::LowerDFGToLLVM::addExitArgument):
264         (JSC::FTL::LowerDFGToLLVM::linkOSRExitsAndCompleteInitializationBlocks):
265         (JSC::FTL::LowerDFGToLLVM::observeMovHint):
266         * ftl/FTLOSRExit.cpp: Added.
267         (FTL):
268         (JSC::FTL::OSRExit::OSRExit):
269         (JSC::FTL::OSRExit::codeLocationForRepatch):
270         (JSC::FTL::OSRExit::convertToForward):
271         * ftl/FTLOSRExit.h: Added.
272         (FTL):
273         (OSRExit):
274         * ftl/FTLOSRExitCompilationInfo.h: Added.
275         (FTL):
276         (JSC::FTL::OSRExitCompilationInfo::OSRExitCompilationInfo):
277         (OSRExitCompilationInfo):
278         * ftl/FTLOSRExitCompiler.cpp: Added.
279         (FTL):
280         (JSC::FTL::compileStub):
281         (JSC::FTL::compileFTLOSRExit):
282         * ftl/FTLOSRExitCompiler.h: Added.
283         (FTL):
284         * ftl/FTLOutput.h:
285         (JSC::FTL::Output::newBlock):
286         (JSC::FTL::Output::intToPtr):
287         (JSC::FTL::Output::load):
288         (JSC::FTL::Output::store):
289         (Output):
290         (JSC::FTL::Output::call):
291         (JSC::FTL::Output::convertToTailCall):
292         (FTL):
293         * ftl/FTLState.h:
294         (State):
295         * ftl/FTLThunks.cpp: Added.
296         (FTL):
297         (JSC::FTL::osrExitGenerationThunkGenerator):
298         * ftl/FTLThunks.h: Added.
299         (JSC):
300         (FTL):
301         * ftl/FTLValueFormat.cpp: Added.
302         (WTF):
303         (WTF::printInternal):
304         * ftl/FTLValueFormat.h: Added.
305         (FTL):
306         (WTF):
307         * ftl/FTLValueSource.cpp: Added.
308         (FTL):
309         (JSC::FTL::ValueSource::dump):
310         * ftl/FTLValueSource.h: Added.
311         (FTL):
312         (ValueSource):
313         (JSC::FTL::ValueSource::ValueSource):
314         (JSC::FTL::ValueSource::kind):
315         (JSC::FTL::ValueSource::operator!):
316         (JSC::FTL::ValueSource::node):
317
318 2013-04-12  Filip Pizlo  <fpizlo@apple.com>
319
320         fourthTier: switch to using MCJIT and disable frame pointer elimination
321         https://bugs.webkit.org/show_bug.cgi?id=114542
322
323         Reviewed by Oliver Hunt and Michael Saboff.
324
325         * ftl/FTLCompile.cpp:
326         (JSC::FTL::compile):
327         * runtime/InitializeThreading.cpp:
328         (JSC::initializeThreadingOnce):
329
330 2013-04-09  Filip Pizlo  <fpizlo@apple.com>
331
332         fourthTier: DFG should provide utilities for common OSR exit tasks
333         https://bugs.webkit.org/show_bug.cgi?id=114306
334
335         Reviewed by Mark Hahnenberg.
336         
337         Just abstract out some things that the FTL will want to use as well.
338
339         * CMakeLists.txt:
340         * GNUmakefile.list.am:
341         * JavaScriptCore.xcodeproj/project.pbxproj:
342         * Target.pri:
343         * dfg/DFGDriver.cpp:
344         (JSC::DFG::compile):
345         * dfg/DFGOSRExitCompiler.cpp:
346         * dfg/DFGOSRExitCompiler.h:
347         (OSRExitCompiler):
348         * dfg/DFGOSRExitCompiler32_64.cpp:
349         (JSC::DFG::OSRExitCompiler::compileExit):
350         * dfg/DFGOSRExitCompiler64.cpp:
351         (JSC::DFG::OSRExitCompiler::compileExit):
352         * dfg/DFGOSRExitCompilerCommon.cpp: Added.
353         (DFG):
354         (JSC::DFG::handleExitCounts):
355         (JSC::DFG::reifyInlinedCallFrames):
356         (JSC::DFG::adjustAndJumpToTarget):
357         * dfg/DFGOSRExitCompilerCommon.h: Added.
358         (DFG):
359
360 2013-04-09  Filip Pizlo  <fpizlo@apple.com>
361
362         fourthTier: DFG should better abstract floating point arguments
363         https://bugs.webkit.org/show_bug.cgi?id=114300
364
365         Reviewed by Mark Hahnenberg.
366
367         * dfg/DFGFPRInfo.h:
368         (FPRInfo):
369         (JSC::DFG::FPRInfo::toArgumentRegister):
370
371 2013-04-05  Filip Pizlo  <fpizlo@apple.com>
372
373         fourthTier: DFG should better abstract arguments
374         https://bugs.webkit.org/show_bug.cgi?id=114073
375
376         Reviewed by Mark Hahnenberg.
377
378         * dfg/DFGGPRInfo.h:
379         (GPRInfo):
380         (JSC::DFG::GPRInfo::toArgumentRegister):
381
382 2013-04-03  Filip Pizlo  <fpizlo@apple.com>
383
384         fourthTier: put DFG data into a DFG::JITCode, and put common DFG and FTL data into something accessible from both DFG::JITCode and FTL::JITCode
385         https://bugs.webkit.org/show_bug.cgi?id=113905
386
387         Reviewed by Geoffrey Garen.
388         
389         This removes one pointer from CodeBlock.
390         
391         It also gives us a framework for having JITType-specific data in CodeBlock, by
392         putting it into the appropriate JITCode class (either DFG::JITCode or
393         FTL::JITCode). And it allows us to have DFG and FTL share some common data,
394         via DFG::CommonData, which is stored in both DFG::JITCode and FTL::JITCode and
395         always accessible via JITCode::dfgCommon().
396
397         * CMakeLists.txt:
398         * GNUmakefile.list.am:
399         * JavaScriptCore.xcodeproj/project.pbxproj:
400         * Target.pri:
401         * bytecode/CodeBlock.cpp:
402         (JSC):
403         (JSC::CodeBlock::dumpBytecode):
404         (JSC::CodeBlock::visitAggregate):
405         (JSC::CodeBlock::performTracingFixpointIteration):
406         (JSC::CodeBlock::finalizeUnconditionally):
407         (JSC::CodeBlock::stronglyVisitWeakReferences):
408         (JSC::CodeBlock::shrinkToFit):
409         (JSC::CodeBlock::tallyFrequentExitSites):
410         * bytecode/CodeBlock.h:
411         (CodeBlock):
412         (JSC::CodeBlock::setJITCode):
413         (JSC::CodeBlock::shouldImmediatelyAssumeLivenessDuringScan):
414         (JSC::DFGCodeBlocks::mark):
415         * dfg/DFGAssemblyHelpers.h:
416         * dfg/DFGCommonData.cpp: Added.
417         (DFG):
418         (JSC::DFG::CommonData::notifyCompilingStructureTransition):
419         (JSC::DFG::CommonData::shrinkToFit):
420         * dfg/DFGCommonData.h: Added.
421         (JSC):
422         (DFG):
423         (JSC::DFG::WeakReferenceTransition::WeakReferenceTransition):
424         (WeakReferenceTransition):
425         (CommonData):
426         (JSC::DFG::CommonData::CommonData):
427         * dfg/DFGDriver.cpp:
428         (JSC::DFG::compile):
429         (JSC::DFG::tryCompile):
430         (JSC::DFG::tryCompileFunction):
431         * dfg/DFGDriver.h:
432         (DFG):
433         (JSC::DFG::tryCompile):
434         (JSC::DFG::tryCompileFunction):
435         * dfg/DFGGraph.h:
436         (Graph):
437         * dfg/DFGJITCode.cpp: Added.
438         (DFG):
439         (JSC::DFG::JITCode::JITCode):
440         (JSC::DFG::JITCode::~JITCode):
441         (JSC::DFG::JITCode::dfgCommon):
442         (JSC::DFG::JITCode::dfg):
443         (JSC::DFG::JITCode::shrinkToFit):
444         * dfg/DFGJITCode.h: Added.
445         (DFG):
446         (JITCode):
447         (JSC::DFG::JITCode::appendOSREntryData):
448         (JSC::DFG::JITCode::osrEntryDataForBytecodeIndex):
449         (JSC::DFG::JITCode::appendOSRExit):
450         (JSC::DFG::JITCode::lastOSRExit):
451         (JSC::DFG::JITCode::appendSpeculationRecovery):
452         (JSC::DFG::JITCode::appendWatchpoint):
453         * dfg/DFGJITCompiler.cpp:
454         (JSC::DFG::JITCompiler::JITCompiler):
455         (JSC::DFG::JITCompiler::linkOSRExits):
456         (JSC::DFG::JITCompiler::link):
457         (JSC::DFG::JITCompiler::compile):
458         (JSC::DFG::JITCompiler::compileFunction):
459         * dfg/DFGJITCompiler.h:
460         (JITCompiler):
461         (JSC::DFG::JITCompiler::addWeakReference):
462         (JSC::DFG::JITCompiler::noticeOSREntry):
463         (JSC::DFG::JITCompiler::jitCode):
464         * dfg/DFGOSREntry.cpp:
465         (JSC::DFG::prepareOSREntry):
466         * dfg/DFGOSRExit.h:
467         (OSRExit):
468         * dfg/DFGOSRExitCompiler.cpp:
469         * dfg/DFGSpeculativeJIT.cpp:
470         (JSC::DFG::SpeculativeJIT::SpeculativeJIT):
471         (JSC::DFG::SpeculativeJIT::backwardSpeculationCheck):
472         (JSC::DFG::SpeculativeJIT::speculationWatchpoint):
473         (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward):
474         * dfg/DFGSpeculativeJIT32_64.cpp:
475         (JSC::DFG::SpeculativeJIT::compile):
476         * dfg/DFGSpeculativeJIT64.cpp:
477         (JSC::DFG::SpeculativeJIT::compile):
478         * dfg/DFGVariableEventStream.cpp:
479         * ftl/FTLCompile.cpp:
480         (JSC::FTL::compile):
481         * ftl/FTLJITCode.cpp:
482         (JSC::FTL::JITCode::JITCode):
483         (JSC::FTL::JITCode::~JITCode):
484         (FTL):
485         (JSC::FTL::JITCode::initializeCode):
486         (JSC::FTL::JITCode::addressForCall):
487         (JSC::FTL::JITCode::executableAddressAtOffset):
488         (JSC::FTL::JITCode::dataAddressAtOffset):
489         (JSC::FTL::JITCode::offsetOf):
490         (JSC::FTL::JITCode::size):
491         (JSC::FTL::JITCode::contains):
492         (JSC::FTL::JITCode::ftl):
493         (JSC::FTL::JITCode::dfgCommon):
494         * ftl/FTLJITCode.h:
495         (JITCode):
496         * ftl/FTLLowerDFGToLLVM.cpp:
497         (JSC::FTL::LowerDFGToLLVM::compileStructureTransitionWatchpoint):
498         (JSC::FTL::LowerDFGToLLVM::compilePutStructure):
499         (JSC::FTL::LowerDFGToLLVM::compilePhantomPutStructure):
500         (JSC::FTL::LowerDFGToLLVM::addWeakReference):
501         (LowerDFGToLLVM):
502         (JSC::FTL::LowerDFGToLLVM::weakPointer):
503         * ftl/FTLState.cpp:
504         (FTL):
505         (JSC::FTL::State::State):
506         (JSC::FTL::State::dumpState):
507         * ftl/FTLState.h:
508         (State):
509         * heap/DFGCodeBlocks.cpp:
510         (JSC::DFGCodeBlocks::~DFGCodeBlocks):
511         (JSC::DFGCodeBlocks::jettison):
512         (JSC::DFGCodeBlocks::clearMarks):
513         (JSC::DFGCodeBlocks::deleteUnmarkedJettisonedCodeBlocks):
514         (JSC::DFGCodeBlocks::traceMarkedCodeBlocks):
515         * jit/JITCode.cpp:
516         (JSC::JITCode::dfgCommon):
517         (JSC):
518         (JSC::JITCode::dfg):
519         (JSC::JITCode::ftl):
520         (JSC::DirectJITCode::DirectJITCode):
521         (JSC::DirectJITCode::initializeCodeRef):
522         (JSC::DirectJITCode::addressForCall):
523         (JSC::DirectJITCode::executableAddressAtOffset):
524         (JSC::DirectJITCode::dataAddressAtOffset):
525         (JSC::DirectJITCode::offsetOf):
526         (JSC::DirectJITCode::size):
527         (JSC::DirectJITCode::contains):
528         * jit/JITCode.h:
529         (DFG):
530         (FTL):
531         (JSC):
532         (JITCode):
533         (DirectJITCode):
534
535 2013-04-03  Filip Pizlo  <fpizlo@apple.com>
536
537         fourthTier: Include LLVM headers with surrounding #pragmas instead of using my #define
538         https://bugs.webkit.org/show_bug.cgi?id=113921
539
540         Reviewed by Oliver Hunt.
541         
542         The LLVM community wants us to continue including all of LLVM's C++ headers. Change
543         to using #pragma's to disable warnings that they cannot handle.
544
545         * ftl/FTLLLVMHeaders.h:
546
547 2013-04-03  Filip Pizlo  <fpizlo@apple.com>
548
549         fourthTier: Everyone should know about the FTL
550         https://bugs.webkit.org/show_bug.cgi?id=113897
551
552         Reviewed by Mark Hahnenberg.
553         
554         In order to get OSR exit to work right, we need the distinction between DFG and
555         FTL to be clear even after compilation finishes, since they will have subtly
556         different OSR stories and likely use different data structures.
557
558         * bytecode/CodeBlock.cpp:
559         (JSC::CodeBlock::resetStubInternal):
560         (JSC::ProgramCodeBlock::compileOptimized):
561         (JSC::EvalCodeBlock::compileOptimized):
562         (JSC::FunctionCodeBlock::compileOptimized):
563         (JSC::CodeBlock::adjustedExitCountThreshold):
564         (JSC::CodeBlock::tallyFrequentExitSites):
565         * bytecode/CodeBlock.h:
566         (JSC::CodeBlock::setJITCode):
567         (JSC::CodeBlock::hasOptimizedReplacement):
568         (JSC::ExecState::isInlineCallFrame):
569         * ftl/FTLCompile.cpp:
570         (JSC::FTL::compile):
571         * ftl/FTLJITCode.cpp:
572         (JSC::FTL::JITCode::JITCode):
573         * ftl/FTLState.cpp:
574         (JSC::FTL::State::dumpState):
575         * heap/DFGCodeBlocks.cpp:
576         (JSC::DFGCodeBlocks::jettison):
577         * interpreter/Interpreter.cpp:
578         (JSC::getLineNumberForCallFrame):
579         (JSC::getCallerInfo):
580         * jit/JITCode.cpp:
581         (WTF::printInternal):
582         * jit/JITCode.h:
583         (JSC::JITCode::topTierJIT):
584         (JSC::JITCode::nextTierJIT):
585         (JITCode):
586         (JSC::JITCode::isJIT):
587         (JSC::JITCode::isLowerTier):
588         (JSC::JITCode::isHigherTier):
589         (JSC::JITCode::isLowerOrSameTier):
590         (JSC::JITCode::isHigherOrSameTier):
591         (JSC::JITCode::isOptimizingJIT):
592         * jit/JITDriver.h:
593         (JSC::jitCompileIfAppropriate):
594         (JSC::jitCompileFunctionIfAppropriate):
595         * jit/JITStubs.cpp:
596         (JSC::DEFINE_STUB_FUNCTION):
597         * runtime/Executable.cpp:
598         (JSC::EvalExecutable::compileOptimized):
599         (JSC::samplingDescription):
600         (JSC::ProgramExecutable::compileOptimized):
601         (JSC::FunctionExecutable::compileOptimizedForCall):
602         (JSC::FunctionExecutable::compileOptimizedForConstruct):
603
604 2013-04-03  Filip Pizlo  <fpizlo@apple.com>
605
606         fourthTier: DFG should abstract out how it does forward exits, and that code should be simplified
607         https://bugs.webkit.org/show_bug.cgi?id=113894
608
609         Reviewed by Mark Hahnenberg.
610         
611         1) We previously had two different ways of convertingToForward, one path for
612            where we had a ValueRecovery for the current node and one where we didn't.
613            But the paths were doing exactly the same thing except that if you have a
614            ValueRecovery, you also find the last applicable mov hint and do some
615            extra things. This patch combines the two paths and bases both of them on
616            the previous no-ValueRecovery path, which was simpler to begin with.
617         
618         2) This moves the logic into DFG::OSRExit, which further simplifies the code
619            and makes the logic available to the FTL.
620
621         * dfg/DFGOSRExit.cpp:
622         (JSC::DFG::OSRExit::convertToForward):
623         (DFG):
624         * dfg/DFGOSRExit.h:
625         (DFG):
626         (OSRExit):
627         * dfg/DFGSpeculativeJIT.cpp:
628         (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward):
629
630 2013-04-02  Filip Pizlo  <fpizlo@apple.com>
631
632         fourthTier: FTL should have the equivalent of a ValueRecovery
633         https://bugs.webkit.org/show_bug.cgi?id=113819
634
635         Reviewed by Mark Hahnenberg.
636         
637         This adds a way of saying that we have a value, we don't want to say what
638         node the value came from, but we know specifics of how the value is
639         formatted. This is the LLVM equivalent of DFG's ValueRecovery.
640
641         * JavaScriptCore.xcodeproj/project.pbxproj:
642         * ftl/FTLFormattedValue.h: Added.
643         (FTL):
644         (FormattedValue):
645         (JSC::FTL::FormattedValue::FormattedValue):
646         (JSC::FTL::FormattedValue::operator!):
647         (JSC::FTL::FormattedValue::format):
648         (JSC::FTL::FormattedValue::value):
649         * ftl/FTLLowerDFGToLLVM.cpp:
650         (JSC::FTL::LowerDFGToLLVM::compileUInt32ToNumber):
651         (JSC::FTL::LowerDFGToLLVM::speculateForward):
652         (JSC::FTL::LowerDFGToLLVM::weakPointer):
653
654 2013-04-02  Filip Pizlo  <fpizlo@apple.com>
655
656         fourthTier: FTL should use the right abstract heap for Int32 array accesses
657         https://bugs.webkit.org/show_bug.cgi?id=113759
658
659         Reviewed by Mark Hahnenberg.
660
661         * ftl/FTLLowerDFGToLLVM.cpp:
662         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
663
664 2013-04-02  Filip Pizlo  <fpizlo@apple.com>
665
666         fourthTier: FTL should support fast property stores
667         https://bugs.webkit.org/show_bug.cgi?id=113757
668
669         Reviewed by Oliver Hunt.
670         
671         Simplified the task of handling property transitions and reduced amount of code
672         duplication between the JITs.
673         
674         Added PutByOffset, PutStructure, PhantomPutStructure, WeakJSConstant, and a
675         stub form of StructureTransitionWatchpoint to the FTL.
676         
677         Also simplified the creation of pointer constants, and fixed a bug in
678         speculateObject().
679
680         * dfg/DFGGraph.h:
681         (JSC::DFG::Graph::notifyCompilingStructureTransition):
682         (Graph):
683         * dfg/DFGJITCompiler.h:
684         (JITCompiler):
685         * dfg/DFGSpeculativeJIT32_64.cpp:
686         (JSC::DFG::SpeculativeJIT::compile):
687         * dfg/DFGSpeculativeJIT64.cpp:
688         (JSC::DFG::SpeculativeJIT::compile):
689         * ftl/FTLCapabilities.cpp:
690         (JSC::FTL::canCompile):
691         * ftl/FTLLowerDFGToLLVM.cpp:
692         (JSC::FTL::LowerDFGToLLVM::lower):
693         (JSC::FTL::LowerDFGToLLVM::compileNode):
694         (JSC::FTL::LowerDFGToLLVM::compileWeakJSConstant):
695         (LowerDFGToLLVM):
696         (JSC::FTL::LowerDFGToLLVM::compileStructureTransitionWatchpoint):
697         (JSC::FTL::LowerDFGToLLVM::compilePutStructure):
698         (JSC::FTL::LowerDFGToLLVM::compilePhantomPutStructure):
699         (JSC::FTL::LowerDFGToLLVM::compilePutByOffset):
700         (JSC::FTL::LowerDFGToLLVM::speculateObject):
701         (JSC::FTL::LowerDFGToLLVM::weakPointer):
702         * ftl/FTLOutput.h:
703         (Output):
704         (JSC::FTL::Output::constIntPtr):
705         (JSC::FTL::Output::absolute):
706
707 2013-04-01  Filip Pizlo  <fpizlo@apple.com>
708
709         fourthTier: FTL should support some more integer arithmetic ops (negate, xor, urshift)
710         https://bugs.webkit.org/show_bug.cgi?id=113740
711
712         Reviewed by Geoffrey Garen.
713
714         * ftl/FTLAbbreviations.h:
715         (JSC::FTL::buildNeg):
716         (JSC::FTL::buildLShr):
717         * ftl/FTLCapabilities.cpp:
718         (JSC::FTL::canCompile):
719         * ftl/FTLLowerDFGToLLVM.cpp:
720         (JSC::FTL::LowerDFGToLLVM::compileNode):
721         (JSC::FTL::LowerDFGToLLVM::compileArithNegate):
722         (LowerDFGToLLVM):
723         (JSC::FTL::LowerDFGToLLVM::compileBitXor):
724         (JSC::FTL::LowerDFGToLLVM::compileBitURShift):
725         (JSC::FTL::LowerDFGToLLVM::compileUInt32ToNumber):
726         * ftl/FTLOutput.h:
727         (JSC::FTL::Output::neg):
728         (JSC::FTL::Output::lShr):
729
730 2013-04-01  Filip Pizlo  <fpizlo@apple.com>
731
732         fourthTier: FTL should support GetGlobalVar/PutGlobalVar
733         https://bugs.webkit.org/show_bug.cgi?id=113728
734
735         Reviewed by Gavin Barraclough.
736         
737         Removed the macro magic for the globals absolute abstract heap, since for anything
738         with absolute addresses we can just share a common absolute abstract heap. It
739         would only be a problem if we for example were emitting an access to a global but
740         not using an absolute address, and then wanted to say that this access was
741         constrained to global variables. I don't believe we do that, and I don't believe we
742         ever will.
743         
744         Then added Output::absolute(), a convenient way of building a typed pointer for an
745         absolute address.
746         
747         Then added GetGlobalVar/PutGlobalVar.
748
749         * ftl/FTLAbstractHeapRepository.cpp:
750         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
751         * ftl/FTLAbstractHeapRepository.h:
752         (FTL):
753         (AbstractHeapRepository):
754         * ftl/FTLCapabilities.cpp:
755         (JSC::FTL::canCompile):
756         * ftl/FTLLowerDFGToLLVM.cpp:
757         (JSC::FTL::LowerDFGToLLVM::compileNode):
758         (JSC::FTL::LowerDFGToLLVM::compileGetGlobalVar):
759         (LowerDFGToLLVM):
760         (JSC::FTL::LowerDFGToLLVM::compilePutGlobalVar):
761         * ftl/FTLOutput.h:
762         (JSC::FTL::Output::absolute):
763         (Output):
764
765 2013-03-31  Filip Pizlo  <fpizlo@apple.com>
766
767         fourthTier: FTL should support ArithSub
768         https://bugs.webkit.org/show_bug.cgi?id=113675
769
770         Reviewed by Oliver Hunt.
771         
772         This does the obvious bit of implementing ArithSub, but it also takes this
773         as an opportunity to clean up how intrinsics and common values (common types
774         and constants) are handled. Previously they were all lumped together in
775         FTL::Output. Now, in an effort to split up the files and make FTL::Output
776         less big, I created a thing called FTL::CommonValues which just tracks the
777         common values, and a thing called FTL::IntrinsicRepository which just tracks
778         intrinsics. These and FTL::Output are all related to each other in a linear
779         hierarchy. Moreover, IntrinsicRepository uses macro-fu to make it easy to
780         declare new intrinsics in the future.
781         
782         I also out-of-lined some things and made .cpp files for each of these classes.
783         Initialize I wasn't going to do this but then I realized that FTL::Output is
784         already included in multiple places. Probably it's better if some of its guts
785         are not inline, and it's also good to now have .cpp "landing pads" if we ever
786         want to add more things to that class.
787         
788         Note that a lot of how these things are designed has to do with the fact
789         that pretty soon here I'll have to switch us from using the LLVM global
790         context to using a context that we create. When that happens, anyone who
791         creates anything will have to know the context; that's why FTL::CommonValues
792         already knows the module but doesn't use it - in the future it will have to
793         do things with it.
794
795         * JavaScriptCore.xcodeproj/project.pbxproj:
796         * ftl/FTLAbbreviations.h:
797         (JSC::FTL::buildSub):
798         * ftl/FTLAbstractHeapRepository.cpp:
799         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
800         * ftl/FTLCapabilities.cpp:
801         (JSC::FTL::canCompile):
802         * ftl/FTLCommonValues.cpp: Added.
803         (FTL):
804         (JSC::FTL::CommonValues::CommonValues):
805         * ftl/FTLCommonValues.h: Added.
806         (FTL):
807         (CommonValues):
808         (JSC::FTL::CommonValues::initialize):
809         * ftl/FTLIntrinsicRepository.cpp: Added.
810         (FTL):
811         (JSC::FTL::IntrinsicRepository::IntrinsicRepository):
812         * ftl/FTLIntrinsicRepository.h: Added.
813         (FTL):
814         (IntrinsicRepository):
815         * ftl/FTLLowerDFGToLLVM.cpp:
816         (JSC::FTL::LowerDFGToLLVM::compileNode):
817         (JSC::FTL::LowerDFGToLLVM::compileArithSub):
818         (LowerDFGToLLVM):
819         * ftl/FTLOutput.cpp: Added.
820         (FTL):
821         (JSC::FTL::Output::Output):
822         (JSC::FTL::Output::~Output):
823         * ftl/FTLOutput.h:
824         (Output):
825         (JSC::FTL::Output::initialize):
826         (JSC::FTL::Output::sub):
827         (JSC::FTL::Output::addWithOverflow32):
828         (JSC::FTL::Output::subWithOverflow32):
829         (JSC::FTL::Output::mulWithOverflow32):
830
831 2013-03-31  Filip Pizlo  <fpizlo@apple.com>
832
833         fourthTier: FTL doesn't need virtual register allocation
834         https://bugs.webkit.org/show_bug.cgi?id=113679
835
836         Reviewed by Mark Hahnenberg.
837
838         * dfg/DFGDriver.cpp:
839         (JSC::DFG::dumpAndVerifyGraph):
840         (DFG):
841         (JSC::DFG::compile):
842
843 2013-03-31  Filip Pizlo  <fpizlo@apple.com>
844
845         https://bugs.webkit.org/show_bug.cgi?id=113656
846         Fix Sam's nits.
847
848         Unreviewed.
849
850         * ftl/FTLAbstractHeap.cpp:
851         (JSC::FTL::IndexedAbstractHeap::initialize):
852         * ftl/FTLAbstractHeap.h:
853         (IndexedAbstractHeap):
854         (AbsoluteAbstractHeap):
855         * ftl/FTLAbstractHeapRepository.h:
856         (AbstractHeapRepository):
857
858 2013-03-31  Filip Pizlo  <fpizlo@apple.com>
859
860         fourthTier: FTL JIT should support GetByVal on Int32 arrays
861         https://bugs.webkit.org/show_bug.cgi?id=113668
862
863         Reviewed by Sam Weinig.
864         
865         It actually already supported this, but needed to be told that it did.
866         
867         Also adds an option to enable LICM (loop-invariant code motion, i.e.
868         http://llvm.org/docs/Passes.html#licm-loop-invariant-code-motion). LICM
869         isn't doing me any good right now, but I guess I'll have to play with
870         it more. And this adds the ability to tweak the LLVM optimization level
871         from the command-line.
872
873         * ftl/FTLCapabilities.cpp:
874         (JSC::FTL::canCompile):
875         * ftl/FTLCompile.cpp:
876         (JSC::FTL::compile):
877         * ftl/FTLLowerDFGToLLVM.cpp:
878         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
879         * runtime/Options.h:
880         (JSC):
881
882 2013-03-31  Filip Pizlo  <fpizlo@apple.com>
883
884         fourthTier: FTL JIT should supply TBAA meta-data to LLVM
885         https://bugs.webkit.org/show_bug.cgi?id=113656
886
887         Reviewed by Oliver Hunt.
888         
889         This adds support for performing strong typing on the LLVM IR that the FTL
890         generates, by using TBAA meta-data. This will permit LLVM to do aggressive
891         GVN, load elimination, and LICM optimization even if it sees pointer store
892         side-effects. The goal is to precisely model all loads and stores we emit,
893         except for the super crazy ones (GetById that can go all-out polymorphic,
894         or for example a Call where we know nothing).
895         
896         This is accomplished by introducing the notion of an AbstractHeap
897         typesystem. An AbstractHeap is a subset of all possible memory locations
898         that we might store to. For example, JSCell::m_structure and
899         JSObject::m_butterfly are two disjoint AbstractHeaps because we know that
900         a store to one cannot clobber the other. AbstractHeaps follow a
901         single-inheritance hierarchy. There is the root heap, which corresponds to
902         any possible memory location accessible to the JS engine, and then there
903         are heaps for all internal object fields, a heap for each global object,
904         and so on.
905         
906         There are three other tidbits here that make this somewhat more interesting.
907         We have a notion of an AbstractHeap-with-offset, called AbstractField.
908         JSCell::m_structure is actually an AbstractField. This allows us to say
909         things like m_out.loadPtr(base, m_heaps.JSCell_structure); this both
910         gives you the offset of JSCell::m_structure and ascribes TBAA meta-data for
911         the JSCell::m_structure heap to the generated load instrction.
912         
913         Another fun tidbit is the notion of Indexed, Numbered, and Absolute abstract
914         heaps. An indexed abstract heap corresponds to a set of locations that you
915         might access by index from some base. Virtual registers are a great example.
916         Though I call them just "variables" in the FTL. When we access a virtual
917         register, we know that we aren't interfering with accesses to
918         Structure-managed named properties, or with JSCell::m_structure, or with
919         other such disjoint heaps. But we also know that if we access a variable at
920         offset X and then another variable at offset Y and we know that X and Y are
921         unequal, then these two accesses are on disjoint subheaps of the variables
922         heap. This works out naturally for interference between, say, scoped variable
923         access and local variable access: if you access scoped variable r5 and then
924         access a local variable r5, these might interfere - and they will get the
925         same abstract subheap of the variables heap. IndexedAbstractHeaps
926         conveniently remember the size of the elements and will give you an
927         AbstractField (i.e. heap-with-offset) if you give it an index. This is great
928         for conveniently writing code that accesses contiguous arrays of well-typed
929         things. This allows you to literally do things like
930         m_out.load64(callFrameRegister, m_heaps.variables[operand]) and the right
931         thing will happen. You can also get the heap variables.atAnyIndex(), if
932         you're doing an access with an unknown index.
933         
934         Numbered and Absolute abstract heaps are related except that they don't
935         assume that the value used to get the abstract subheap corresponds to any
936         meaningful offset from any base. Numbered heaps, like the properties heap
937         (for named properties tracked by Structure), are "numbered" (not indexed)
938         by the propertyNumber. So you can emit a GetByOffset by separately
939         computing the offset and the propertyNumber (both values are stored in the
940         StorageAccessData), and passing the offset directly to Output::address()
941         and passing m_heaps.properties[propertyNumber] as the field. Absolute heaps
942         are similar, but are keyed on absolute address. This is appropriate for
943         global variables, and possibly other things.
944         
945         Finally, FTL::Output understands the notion of a pointer-with-TBAA-data,
946         and calls it a TypedPointer. TypedPointer is a tuple of a LLVMValueRef
947         referencing an intptr value and a pointer to an AbstractHeap. All load()
948         and store() operations now take a TypedPointer, and will perform the access
949         by casting the intptr to a pointer of the right type and then ascribing the
950         TBAA meta-data from the AbstractHeap.
951
952         * JavaScriptCore.xcodeproj/project.pbxproj:
953         * ftl/FTLAbbreviations.h:
954         (JSC::FTL::mdKindID):
955         (JSC::FTL::mdString):
956         (JSC::FTL::mdNode):
957         (FTL):
958         (JSC::FTL::setMetadata):
959         * ftl/FTLAbstractHeap.cpp: Added.
960         (FTL):
961         (JSC::FTL::AbstractHeap::tbaaMetadataSlow):
962         (JSC::FTL::AbstractHeap::decorateInstruction):
963         (JSC::FTL::IndexedAbstractHeap::IndexedAbstractHeap):
964         (JSC::FTL::IndexedAbstractHeap::~IndexedAbstractHeap):
965         (JSC::FTL::IndexedAbstractHeap::baseIndex):
966         (JSC::FTL::IndexedAbstractHeap::atSlow):
967         (JSC::FTL::IndexedAbstractHeap::initialize):
968         (JSC::FTL::NumberedAbstractHeap::NumberedAbstractHeap):
969         (JSC::FTL::NumberedAbstractHeap::~NumberedAbstractHeap):
970         (JSC::FTL::AbsoluteAbstractHeap::AbsoluteAbstractHeap):
971         (JSC::FTL::AbsoluteAbstractHeap::~AbsoluteAbstractHeap):
972         * ftl/FTLAbstractHeap.h: Added.
973         (FTL):
974         (AbstractHeap):
975         (JSC::FTL::AbstractHeap::AbstractHeap):
976         (JSC::FTL::AbstractHeap::isInitialized):
977         (JSC::FTL::AbstractHeap::initialize):
978         (JSC::FTL::AbstractHeap::parent):
979         (JSC::FTL::AbstractHeap::heapName):
980         (JSC::FTL::AbstractHeap::tbaaMetadata):
981         (AbstractField):
982         (JSC::FTL::AbstractField::AbstractField):
983         (JSC::FTL::AbstractField::initialize):
984         (JSC::FTL::AbstractField::offset):
985         (IndexedAbstractHeap):
986         (JSC::FTL::IndexedAbstractHeap::atAnyIndex):
987         (JSC::FTL::IndexedAbstractHeap::at):
988         (JSC::FTL::IndexedAbstractHeap::operator[]):
989         (JSC::FTL::IndexedAbstractHeap::returnInitialized):
990         (JSC::FTL::IndexedAbstractHeap::MyHashTraits::constructDeletedValue):
991         (JSC::FTL::IndexedAbstractHeap::MyHashTraits::isDeletedValue):
992         (NumberedAbstractHeap):
993         (JSC::FTL::NumberedAbstractHeap::atAnyNumber):
994         (JSC::FTL::NumberedAbstractHeap::at):
995         (JSC::FTL::NumberedAbstractHeap::operator[]):
996         (AbsoluteAbstractHeap):
997         (JSC::FTL::AbsoluteAbstractHeap::atAnyAddress):
998         (JSC::FTL::AbsoluteAbstractHeap::at):
999         (JSC::FTL::AbsoluteAbstractHeap::operator[]):
1000         * ftl/FTLAbstractHeapRepository.cpp: Added.
1001         (FTL):
1002         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
1003         (JSC::FTL::AbstractHeapRepository::~AbstractHeapRepository):
1004         * ftl/FTLAbstractHeapRepository.h: Added.
1005         (FTL):
1006         (AbstractHeapRepository):
1007         * ftl/FTLLowerDFGToLLVM.cpp:
1008         (JSC::FTL::LowerDFGToLLVM::lower):
1009         (JSC::FTL::LowerDFGToLLVM::compileCheckStructure):
1010         (JSC::FTL::LowerDFGToLLVM::compileGetButterfly):
1011         (JSC::FTL::LowerDFGToLLVM::compileGetArrayLength):
1012         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
1013         (JSC::FTL::LowerDFGToLLVM::compileGetByOffset):
1014         (JSC::FTL::LowerDFGToLLVM::speculateObject):
1015         (JSC::FTL::LowerDFGToLLVM::addressFor):
1016         (JSC::FTL::LowerDFGToLLVM::payloadFor):
1017         (JSC::FTL::LowerDFGToLLVM::tagFor):
1018         (LowerDFGToLLVM):
1019         * ftl/FTLOutput.h:
1020         (FTL):
1021         (JSC::FTL::Output::Output):
1022         (JSC::FTL::Output::initialize):
1023         (JSC::FTL::Output::set):
1024         (JSC::FTL::Output::load):
1025         (JSC::FTL::Output::store):
1026         (Output):
1027         (JSC::FTL::Output::load32):
1028         (JSC::FTL::Output::load64):
1029         (JSC::FTL::Output::loadPtr):
1030         (JSC::FTL::Output::store32):
1031         (JSC::FTL::Output::store64):
1032         (JSC::FTL::Output::storePtr):
1033         (JSC::FTL::Output::addPtr):
1034         (JSC::FTL::Output::address):
1035         (JSC::FTL::Output::baseIndex):
1036         * ftl/FTLTypedPointer.h: Added.
1037         (FTL):
1038         (TypedPointer):
1039         (JSC::FTL::TypedPointer::TypedPointer):
1040         (JSC::FTL::TypedPointer::operator!):
1041         (JSC::FTL::TypedPointer::heap):
1042         (JSC::FTL::TypedPointer::value):
1043         * runtime/Options.h:
1044         (JSC):
1045
1046 2013-03-30  Filip Pizlo  <fpizlo@apple.com>
1047
1048         fourthTier: FTL JIT should be able to compile the Array.prototype.findGraphNode function in Kraken/ai-astar
1049         https://bugs.webkit.org/show_bug.cgi?id=113646
1050
1051         Reviewed by Oliver Hunt.
1052         
1053         This adds enough FTL support to compile Array.prototype.findGraphNode. This isn't
1054         a speed-up, yet, because findGraphNode tends to be aggressively inlined by the DFG,
1055         and the FTL can't yet compile the things into which it was inlined. In future
1056         patches we will get to a point where we can compile the callers, and then we'll be
1057         able to see what the performance effects are.
1058         
1059         But the interesting thing is that it isn't a slow-down, either. This implies that
1060         even if we FTL compile a CodeBlock that we shouldn't have (the fact that we
1061         compiling things that end up being inlined is dumb, and the fact that the current
1062         FTL tiering strategy launches LLVM for those things is even dumber), we still run
1063         at OK performance.
1064
1065         * ftl/FTLCapabilities.cpp:
1066         (JSC::FTL::canCompile):
1067         * ftl/FTLLowerDFGToLLVM.cpp:
1068         (JSC::FTL::LowerDFGToLLVM::transferAndCheckArguments):
1069         (JSC::FTL::LowerDFGToLLVM::compileNode):
1070         (JSC::FTL::LowerDFGToLLVM::compileCheckStructure):
1071         (LowerDFGToLLVM):
1072         (JSC::FTL::LowerDFGToLLVM::compileGetButterfly):
1073         (JSC::FTL::LowerDFGToLLVM::compileGetArrayLength):
1074         (JSC::FTL::LowerDFGToLLVM::compileGetByVal):
1075         (JSC::FTL::LowerDFGToLLVM::compileGetByOffset):
1076         (JSC::FTL::LowerDFGToLLVM::compileCompareEq):
1077         (JSC::FTL::LowerDFGToLLVM::lowInt32):
1078         (JSC::FTL::LowerDFGToLLVM::lowCell):
1079         (JSC::FTL::LowerDFGToLLVM::lowObject):
1080         (JSC::FTL::LowerDFGToLLVM::lowBoolean):
1081         (JSC::FTL::LowerDFGToLLVM::lowJSValue):
1082         (JSC::FTL::LowerDFGToLLVM::lowStorage):
1083         (JSC::FTL::LowerDFGToLLVM::isNotInt32):
1084         (JSC::FTL::LowerDFGToLLVM::isNotCell):
1085         (JSC::FTL::LowerDFGToLLVM::isNotBoolean):
1086         (JSC::FTL::LowerDFGToLLVM::speculate):
1087         (JSC::FTL::LowerDFGToLLVM::speculateCell):
1088         (JSC::FTL::LowerDFGToLLVM::speculateObject):
1089         (JSC::FTL::LowerDFGToLLVM::accountedPointer):
1090         (JSC::FTL::LowerDFGToLLVM::weakPointer):
1091         * ftl/FTLOutput.h:
1092         (JSC::FTL::Output::Output):
1093         (JSC::FTL::Output::insertNewBlocksBefore):
1094         (JSC::FTL::Output::appendTo):
1095         (Output):
1096         (JSC::FTL::Output::baseIndex):
1097
1098 2013-03-29  Filip Pizlo  <fpizlo@apple.com>
1099
1100         fourthTier: FTL JIT should be able to compile the Marsaglia random number generator
1101         https://bugs.webkit.org/show_bug.cgi?id=113635
1102
1103         Reviewed by Oliver Hunt.
1104         
1105         Just adding missing functionality.
1106         
1107         Also "fixed" OSR exit to use a call to abort() in addition to using Unreachable
1108         since the latter doesn't actually mean trap - quite the opposite, it tells LLVM
1109         that the code can never be reached.
1110         
1111         The Marsaglia function runs ~60% faster with FTL, than DFG. Not a terrible start.
1112
1113         * JavaScriptCore.xcodeproj/project.pbxproj:
1114         * ftl/FTLAbbreviations.h:
1115         (FTL):
1116         (JSC::FTL::voidType):
1117         (JSC::FTL::structType):
1118         (JSC::FTL::functionType):
1119         (JSC::FTL::addFunction):
1120         (JSC::FTL::setLinkage):
1121         (JSC::FTL::setFunctionCallingConv):
1122         (JSC::FTL::addExternFunction):
1123         (JSC::FTL::constIntToPtr):
1124         (JSC::FTL::constBitCast):
1125         (JSC::FTL::buildMul):
1126         (JSC::FTL::buildOr):
1127         (JSC::FTL::buildShl):
1128         (JSC::FTL::buildAShr):
1129         (JSC::FTL::buildCall):
1130         (JSC::FTL::buildExtractValue):
1131         (JSC::FTL::dumpModule):
1132         (JSC::FTL::verifyModule):
1133         * ftl/FTLCapabilities.cpp:
1134         (JSC::FTL::canCompile):
1135         * ftl/FTLCompile.cpp:
1136         (JSC::FTL::compile):
1137         * ftl/FTLLowerDFGToLLVM.cpp:
1138         (JSC::FTL::LowerDFGToLLVM::lower):
1139         (JSC::FTL::LowerDFGToLLVM::compileBlock):
1140         (JSC::FTL::LowerDFGToLLVM::compileNode):
1141         (JSC::FTL::LowerDFGToLLVM::compileAdd):
1142         (LowerDFGToLLVM):
1143         (JSC::FTL::LowerDFGToLLVM::compileArithMul):
1144         (JSC::FTL::LowerDFGToLLVM::compileBitAnd):
1145         (JSC::FTL::LowerDFGToLLVM::compileBitOr):
1146         (JSC::FTL::LowerDFGToLLVM::compileBitRShift):
1147         (JSC::FTL::LowerDFGToLLVM::compileBitLShift):
1148         (JSC::FTL::LowerDFGToLLVM::compileCompareLess):
1149         (JSC::FTL::LowerDFGToLLVM::compileBranch):
1150         (JSC::FTL::LowerDFGToLLVM::speculateBackward):
1151         (JSC::FTL::LowerDFGToLLVM::lowBoolean):
1152         * ftl/FTLOutput.h:
1153         (JSC::FTL::Output::Output):
1154         (JSC::FTL::Output::initialize):
1155         (JSC::FTL::Output::appendTo):
1156         (Output):
1157         (JSC::FTL::Output::mul):
1158         (JSC::FTL::Output::bitOr):
1159         (JSC::FTL::Output::shl):
1160         (JSC::FTL::Output::aShr):
1161         (JSC::FTL::Output::addWithOverflow32):
1162         (JSC::FTL::Output::mulWithOverflow32):
1163         (JSC::FTL::Output::extractValue):
1164         (JSC::FTL::Output::call):
1165         (JSC::FTL::Output::addWithOverflow32Function):
1166         (JSC::FTL::Output::mulWithOverflow32Function):
1167         * ftl/FTLState.cpp: Added.
1168         (FTL):
1169         (JSC::FTL::State::dumpState):
1170         * ftl/FTLState.h:
1171         (State):
1172
1173 2013-03-29  Filip Pizlo  <fpizlo@apple.com>
1174
1175         Unreviewed, release mode build fix.
1176
1177         * ftl/FTLLowerDFGToLLVM.cpp:
1178         (JSC::FTL::LowerDFGToLLVM::lowInt32):
1179         (JSC::FTL::LowerDFGToLLVM::lowCell):
1180         (JSC::FTL::LowerDFGToLLVM::lowBoolean):
1181         (JSC::FTL::LowerDFGToLLVM::lowJSValue):
1182
1183 2013-03-29  Filip Pizlo  <fpizlo@apple.com>
1184
1185         fourthTier: Change DO_NOT_INCLUDE_LLVM_CPP_HEADERS to LLVM_DO_NOT_INCLUDE_CPP_HEADERS
1186         https://bugs.webkit.org/show_bug.cgi?id=113634
1187
1188         Reviewed by Dan Bernstein.
1189
1190         * ftl/FTLLLVMHeaders.h:
1191
1192 2013-03-29  Filip Pizlo  <fpizlo@apple.com>
1193
1194         fourthTier: FTL JIT should be able run some simple function
1195         https://bugs.webkit.org/show_bug.cgi?id=113481
1196
1197         Reviewed by Geoffrey Garen.
1198         
1199         I forgot to make a couple of the requested review changes, so I'm making
1200         them now!
1201
1202         * ftl/FTLCompile.cpp:
1203         (JSC::FTL::compile):
1204         * ftl/FTLJITCode.h:
1205
1206 2013-03-29  Filip Pizlo  <fpizlo@apple.com>
1207
1208         fourthTier: FTL JIT should be able run some simple function
1209         https://bugs.webkit.org/show_bug.cgi?id=113481
1210
1211         Reviewed by Geoffrey Garen.
1212         
1213         This is the initial version of the FTL JIT (Fourth Tier LLVM JIT).
1214         It includes a lowering from the DFG IR to LLVM IR (FTL::lowerDFGToLLVM)
1215         and a "backend" step that invokes the LLVM and wraps the resulting
1216         function in a thunk (FTL::compile).
1217         
1218         All LLVM IR building functions are wrapped up into a nicer FTL API.
1219         First they're wrapped in an abbreviated API (FTLAbbreviations.h) and
1220         then again into an object-oriented IR builder (FTLOutput.h).
1221         
1222         This runs things. I don't know how fast it runs things. And I don't
1223         make any claims of stability. The FTL is runtime-disabled by default;
1224         you will enable it by doing --useExperimentalFTL=true. Probably if you
1225         do this, you will run slower, because of the heavy thunking we do, the
1226         fact that we don't have anything resembling a sensible tiering story,
1227         and because we only compile ridiculously tiny functions.
1228             
1229         Finally, this still requires a custom set of LLVM headers to build.
1230         I am working on getting that up-streamed to LLVM, and separately I'll
1231         make sure that we have a build checked into this branch.
1232
1233         * Configurations/JavaScriptCore.xcconfig:
1234         * JavaScriptCore.xcodeproj/project.pbxproj:
1235         * bytecode/Operands.h:
1236         (Operands):
1237         (JSC::Operands::Operands):
1238         * dfg/DFGAbstractState.h:
1239         (JSC::DFG::AbstractState::needsTypeCheck):
1240         (AbstractState):
1241         (JSC::DFG::AbstractState::filterEdgeByUse):
1242         * dfg/DFGDriver.cpp:
1243         (JSC::DFG::compile):
1244         * dfg/DFGSpeculativeJIT.cpp:
1245         (JSC::DFG::SpeculativeJIT::checkArgumentTypes):
1246         * dfg/DFGSpeculativeJIT.h:
1247         (JSC::DFG::SpeculativeJIT::needsTypeCheck):
1248         (JSC::DFG::SpeculateDoubleOperand::SpeculateDoubleOperand):
1249         (JSC::DFG::SpeculateCellOperand::SpeculateCellOperand):
1250         (DFG):
1251         * dfg/DFGUseKind.h:
1252         (JSC::DFG::shouldNotHaveTypeCheck):
1253         (DFG):
1254         (JSC::DFG::mayHaveTypeCheck):
1255         (JSC::DFG::isDouble):
1256         (JSC::DFG::isCell):
1257         * ftl: Added.
1258         * ftl/FTLAbbreviations.h: Added.
1259         (FTL):
1260         (JSC::FTL::int1Type):
1261         (JSC::FTL::int32Type):
1262         (JSC::FTL::int64Type):
1263         (JSC::FTL::intPtrType):
1264         (JSC::FTL::pointerType):
1265         (JSC::FTL::getParam):
1266         (JSC::FTL::constInt):
1267         (JSC::FTL::appendBasicBlock):
1268         (JSC::FTL::insertBasicBlock):
1269         (JSC::FTL::buildAlloca):
1270         (JSC::FTL::buildAdd):
1271         (JSC::FTL::buildAnd):
1272         (JSC::FTL::buildXor):
1273         (JSC::FTL::buildLoad):
1274         (JSC::FTL::buildStore):
1275         (JSC::FTL::buildZExt):
1276         (JSC::FTL::buildIntCast):
1277         (JSC::FTL::buildIntToPtr):
1278         (JSC::FTL::buildPtrToInt):
1279         (JSC::FTL::buildICmp):
1280         (JSC::FTL::buildSelect):
1281         (JSC::FTL::buildBr):
1282         (JSC::FTL::buildCondBr):
1283         (JSC::FTL::buildRet):
1284         (JSC::FTL::buildUnreachable):
1285         * ftl/FTLCapabilities.cpp: Added.
1286         (FTL):
1287         (JSC::FTL::canCompile):
1288         * ftl/FTLCapabilities.h: Added.
1289         (FTL):
1290         * ftl/FTLCompile.cpp: Added.
1291         (FTL):
1292         (JSC::FTL::compileEntry):
1293         (JSC::FTL::compile):
1294         * ftl/FTLCompile.h: Added.
1295         (FTL):
1296         * ftl/FTLJITCode.cpp: Added.
1297         (FTL):
1298         (JSC::FTL::JITCode::JITCode):
1299         (JSC::FTL::JITCode::~JITCode):
1300         (JSC::FTL::JITCode::addressForCall):
1301         (JSC::FTL::JITCode::executableAddressAtOffset):
1302         (JSC::FTL::JITCode::dataAddressAtOffset):
1303         (JSC::FTL::JITCode::offsetOf):
1304         (JSC::FTL::JITCode::size):
1305         (JSC::FTL::JITCode::contains):
1306         * ftl/FTLJITCode.h: Added.
1307         (FTL):
1308         (JITCode):
1309         * ftl/FTLLLVMHeaders.h: Added.
1310         * ftl/FTLLowerDFGToLLVM.cpp: Added.
1311         (FTL):
1312         (LowerDFGToLLVM):
1313         (JSC::FTL::LowerDFGToLLVM::LowerDFGToLLVM):
1314         (JSC::FTL::LowerDFGToLLVM::lower):
1315         (JSC::FTL::LowerDFGToLLVM::addFlushedLocalOpRoots):
1316         (JSC::FTL::LowerDFGToLLVM::closeOverFlushedLocalOps):
1317         (JSC::FTL::LowerDFGToLLVM::addFlushedLocalOp):
1318         (JSC::FTL::LowerDFGToLLVM::addFlushedLocalEdge):
1319         (JSC::FTL::LowerDFGToLLVM::transferAndCheckArguments):
1320         (JSC::FTL::LowerDFGToLLVM::compileBlock):
1321         (JSC::FTL::LowerDFGToLLVM::compileNode):
1322         (JSC::FTL::LowerDFGToLLVM::compileJSConstant):
1323         (JSC::FTL::LowerDFGToLLVM::compileGetLocal):
1324         (JSC::FTL::LowerDFGToLLVM::compileSetLocal):
1325         (JSC::FTL::LowerDFGToLLVM::compileMovHintAndCheck):
1326         (JSC::FTL::LowerDFGToLLVM::compilePhantom):
1327         (JSC::FTL::LowerDFGToLLVM::compileReturn):
1328         (JSC::FTL::LowerDFGToLLVM::speculateBackward):
1329         (JSC::FTL::LowerDFGToLLVM::speculateForward):
1330         (JSC::FTL::LowerDFGToLLVM::speculate):
1331         (JSC::FTL::LowerDFGToLLVM::terminate):
1332         (JSC::FTL::LowerDFGToLLVM::backwardTypeCheck):
1333         (JSC::FTL::LowerDFGToLLVM::forwardTypeCheck):
1334         (JSC::FTL::LowerDFGToLLVM::typeCheck):
1335         (JSC::FTL::LowerDFGToLLVM::lowInt32):
1336         (JSC::FTL::LowerDFGToLLVM::lowCell):
1337         (JSC::FTL::LowerDFGToLLVM::lowBoolean):
1338         (JSC::FTL::LowerDFGToLLVM::lowJSValue):
1339         (JSC::FTL::LowerDFGToLLVM::checkNotInt32):
1340         (JSC::FTL::LowerDFGToLLVM::unboxInt32):
1341         (JSC::FTL::LowerDFGToLLVM::boxInt32):
1342         (JSC::FTL::LowerDFGToLLVM::checkNotCell):
1343         (JSC::FTL::LowerDFGToLLVM::checkNotBoolean):
1344         (JSC::FTL::LowerDFGToLLVM::unboxBoolean):
1345         (JSC::FTL::LowerDFGToLLVM::boxBoolean):
1346         (JSC::FTL::LowerDFGToLLVM::speculateInt32):
1347         (JSC::FTL::LowerDFGToLLVM::addressFor):
1348         (JSC::FTL::LowerDFGToLLVM::payloadFor):
1349         (JSC::FTL::LowerDFGToLLVM::tagFor):
1350         (JSC::FTL::LowerDFGToLLVM::globalData):
1351         (JSC::FTL::LowerDFGToLLVM::codeBlock):
1352         (JSC::FTL::lowerDFGToLLVM):
1353         * ftl/FTLLowerDFGToLLVM.h: Added.
1354         (FTL):
1355         * ftl/FTLOutput.h: Added.
1356         (FTL):
1357         (Output):
1358         (JSC::FTL::Output::Output):
1359         (JSC::FTL::Output::~Output):
1360         (JSC::FTL::Output::initialize):
1361         (JSC::FTL::Output::appendTo):
1362         (JSC::FTL::Output::newBlock):
1363         (JSC::FTL::Output::param):
1364         (JSC::FTL::Output::constBool):
1365         (JSC::FTL::Output::constInt32):
1366         (JSC::FTL::Output::constIntPtr):
1367         (JSC::FTL::Output::constInt64):
1368         (JSC::FTL::Output::add):
1369         (JSC::FTL::Output::bitAnd):
1370         (JSC::FTL::Output::bitXor):
1371         (JSC::FTL::Output::zeroExt):
1372         (JSC::FTL::Output::intCast):
1373         (JSC::FTL::Output::castToInt32):
1374         (JSC::FTL::Output::get):
1375         (JSC::FTL::Output::set):
1376         (JSC::FTL::Output::load):
1377         (JSC::FTL::Output::store):
1378         (JSC::FTL::Output::load32):
1379         (JSC::FTL::Output::load64):
1380         (JSC::FTL::Output::loadPtr):
1381         (JSC::FTL::Output::store32):
1382         (JSC::FTL::Output::store64):
1383         (JSC::FTL::Output::storePtr):
1384         (JSC::FTL::Output::equal):
1385         (JSC::FTL::Output::notEqual):
1386         (JSC::FTL::Output::above):
1387         (JSC::FTL::Output::aboveOrEqual):
1388         (JSC::FTL::Output::below):
1389         (JSC::FTL::Output::belowOrEqual):
1390         (JSC::FTL::Output::greaterThan):
1391         (JSC::FTL::Output::greaterThanOrEqual):
1392         (JSC::FTL::Output::lessThan):
1393         (JSC::FTL::Output::lessThanOrEqual):
1394         (JSC::FTL::Output::isZero64):
1395         (JSC::FTL::Output::notZero64):
1396         (JSC::FTL::Output::testNonZero64):
1397         (JSC::FTL::Output::select):
1398         (JSC::FTL::Output::jump):
1399         (JSC::FTL::Output::branch):
1400         (JSC::FTL::Output::ret):
1401         (JSC::FTL::Output::unreachable):
1402         * ftl/FTLState.h: Added.
1403         (FTL):
1404         (State):
1405         (JSC::FTL::State::State):
1406         * runtime/InitializeThreading.cpp:
1407         (JSC::initializeThreadingOnce):
1408         * runtime/Options.h:
1409         (JSC):
1410
1411 2013-03-27  Filip Pizlo  <fpizlo@apple.com>
1412
1413         fourthTier: JITCode should abstract exactly how the JIT code is structured and where it was allocated
1414         https://bugs.webkit.org/show_bug.cgi?id=113437
1415
1416         Reviewed by Mark Hahnenberg.
1417         
1418         JITCode is now a virtual base class, which will allow different JITs to have radically
1419         different memory allocation and management conventions in the future. It will also
1420         make it easier to store JIT-specific meta-data in CodeBlock just by putting it into
1421         an appropriate JITCode subclass.
1422         
1423         For now there is one subclass, DirectJITCode, which just behaves like JITCode used to
1424         behave.
1425
1426         * assembler/RepatchBuffer.h:
1427         (JSC::RepatchBuffer::RepatchBuffer):
1428         * bytecode/CodeBlock.cpp:
1429         (JSC::CodeBlock::resetStubInternal):
1430         (JSC::CodeBlock::bytecodeOffset):
1431         (JSC::CodeBlock::codeOriginForReturn):
1432         * bytecode/CodeBlock.h:
1433         (JSC::CodeBlock::setJITCode):
1434         (JSC::CodeBlock::getJITCode):
1435         (JSC::CodeBlock::getJITType):
1436         (CodeBlock):
1437         * dfg/DFGDriver.cpp:
1438         (JSC::DFG::compile):
1439         (JSC::DFG::tryCompile):
1440         (JSC::DFG::tryCompileFunction):
1441         * dfg/DFGDriver.h:
1442         (DFG):
1443         (JSC::DFG::tryCompile):
1444         (JSC::DFG::tryCompileFunction):
1445         * dfg/DFGJITCompiler.cpp:
1446         (JSC::DFG::JITCompiler::compile):
1447         (JSC::DFG::JITCompiler::compileFunction):
1448         * dfg/DFGJITCompiler.h:
1449         (JITCompiler):
1450         * dfg/DFGOSREntry.cpp:
1451         (JSC::DFG::prepareOSREntry):
1452         * dfg/DFGOSRExit.cpp:
1453         (JSC::DFG::OSRExit::codeLocationForRepatch):
1454         * dfg/DFGOSRExitCompiler32_64.cpp:
1455         (JSC::DFG::OSRExitCompiler::compileExit):
1456         * dfg/DFGOSRExitCompiler64.cpp:
1457         (JSC::DFG::OSRExitCompiler::compileExit):
1458         * dfg/DFGOperations.cpp:
1459         * interpreter/Interpreter.cpp:
1460         (JSC::Interpreter::execute):
1461         (JSC::Interpreter::executeCall):
1462         (JSC::Interpreter::executeConstruct):
1463         * jit/JIT.cpp:
1464         (JSC::JIT::privateCompile):
1465         * jit/JIT.h:
1466         (JSC::JIT::compile):
1467         (JIT):
1468         * jit/JITCode.cpp:
1469         (JSC):
1470         (JSC::JITCode::JITCode):
1471         (JSC::JITCode::~JITCode):
1472         (JSC::JITCode::execute):
1473         (JSC::JITCode::hostFunction):
1474         (JSC::DirectJITCode::DirectJITCode):
1475         (JSC::DirectJITCode::~DirectJITCode):
1476         (JSC::DirectJITCode::addressForCall):
1477         (JSC::DirectJITCode::executableAddressAtOffset):
1478         (JSC::DirectJITCode::dataAddressAtOffset):
1479         (JSC::DirectJITCode::offsetOf):
1480         (JSC::DirectJITCode::size):
1481         (JSC::DirectJITCode::contains):
1482         * jit/JITCode.h:
1483         (JSC):
1484         (JITCode):
1485         (JSC::JITCode::bottomTierJIT):
1486         (JSC::JITCode::topTierJIT):
1487         (JSC::JITCode::nextTierJIT):
1488         (JSC::JITCode::isOptimizingJIT):
1489         (JSC::JITCode::isBaselineCode):
1490         (JSC::JITCode::jitType):
1491         (JSC::JITCode::jitTypeFor):
1492         (JSC::JITCode::executableAddress):
1493         (JSC::JITCode::start):
1494         (JSC::JITCode::end):
1495         (DirectJITCode):
1496         * jit/JITDriver.h:
1497         (JSC::jitCompileIfAppropriate):
1498         (JSC::jitCompileFunctionIfAppropriate):
1499         * jit/JITStubs.cpp:
1500         (JSC::lazyLinkFor):
1501         (JSC::DEFINE_STUB_FUNCTION):
1502         * jit/ThunkGenerators.cpp:
1503         (JSC::virtualForGenerator):
1504         * llint/LLIntEntrypoints.cpp:
1505         (JSC::LLInt::getFunctionEntrypoint):
1506         (JSC::LLInt::getEvalEntrypoint):
1507         (JSC::LLInt::getProgramEntrypoint):
1508         * llint/LLIntEntrypoints.h:
1509         (JSC):
1510         (LLInt):
1511         (JSC::LLInt::getEntrypoint):
1512         * llint/LLIntSlowPaths.cpp:
1513         (JSC::LLInt::jitCompileAndSetHeuristics):
1514         (JSC::LLInt::entryOSR):
1515         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1516         * runtime/Executable.cpp:
1517         (JSC::EvalExecutable::compileInternal):
1518         (JSC::ProgramExecutable::compileInternal):
1519         (JSC::FunctionExecutable::compileForCallInternal):
1520         (JSC::FunctionExecutable::compileForConstructInternal):
1521         * runtime/Executable.h:
1522         (JSC::ExecutableBase::generatedJITCodeForCall):
1523         (JSC::ExecutableBase::generatedJITCodeForConstruct):
1524         (JSC::ExecutableBase::generatedJITCodeFor):
1525         (ExecutableBase):
1526         (JSC::ExecutableBase::hostCodeEntryFor):
1527         (JSC::ExecutableBase::jsCodeEntryFor):
1528         (JSC::ExecutableBase::jsCodeWithArityCheckEntryFor):
1529         (JSC::NativeExecutable::create):
1530         (JSC::NativeExecutable::finishCreation):
1531         (JSC::EvalExecutable::generatedJITCode):
1532         (JSC::ProgramExecutable::generatedJITCode):
1533         * runtime/ExecutionHarness.h:
1534         (JSC::prepareForExecution):
1535         (JSC::prepareFunctionForExecution):
1536
1537 2013-07-16  Oliver Hunt  <oliver@apple.com>
1538
1539         Merged dfgFourthTier r148570
1540
1541     2013-04-16  Filip Pizlo  <fpizlo@apple.com>
1542
1543         fourthTier: DFG should be able to query Structure without modifying it
1544         https://bugs.webkit.org/show_bug.cgi?id=114708
1545
1546         Reviewed by Oliver Hunt.
1547         
1548         This is work towards allowing the DFG, and FTL, to run on a separate thread.
1549         The idea is that the most evil thing that the DFG does that has thread-safety
1550         issues is fiddling with Structures by calling Structure::get(). This can lead
1551         to rematerialization of property tables, which is definitely not thread-safe
1552         due to how StringImpl works. So, this patch completely side-steps the problem
1553         by creating a new version of Structure::get, called
1554         Structure::getWithoutMaterializing, which may choose to do an O(n) search if
1555         necessary to avoid materialization. I believe this should be fine - the DFG
1556         does't call into these code path often enough for this to matter, and most of
1557         the time, the Structure that we call this on will already have a property
1558         table because some inline cache would have already called ::get() on that
1559         Structure.
1560         
1561         Also cleaned up the materialization logic: we can stop the search as soon as
1562         we find any Structure with a property table rather than searching all the way
1563         for a pinned one.
1564
1565         * bytecode/GetByIdStatus.cpp:
1566         (JSC::GetByIdStatus::computeFor):
1567         * bytecode/PutByIdStatus.cpp:
1568         (JSC::PutByIdStatus::computeFromLLInt):
1569         (JSC::PutByIdStatus::computeFor):
1570         * runtime/Structure.cpp:
1571         (JSC::Structure::findStructuresAndMapForMaterialization):
1572         (JSC::Structure::materializePropertyMap):
1573         (JSC::Structure::getWithoutMaterializing):
1574         (JSC):
1575         * runtime/Structure.h:
1576         (Structure):
1577         * runtime/StructureInlines.h:
1578         (JSC::Structure::getWithoutMaterializing):
1579         (JSC):
1580
1581 2013-07-15  Oliver Hunt  <oliver@apple.com>
1582
1583         Merged dfgFourthTier r148047
1584
1585     2013-04-09  Filip Pizlo  <fpizlo@apple.com>
1586
1587         fourthTier: DFG should provide utilities for common OSR exit tasks
1588         https://bugs.webkit.org/show_bug.cgi?id=114306
1589
1590         Reviewed by Mark Hahnenberg.
1591         
1592         Just abstract out some things that the FTL will want to use as well.
1593
1594         * CMakeLists.txt:
1595         * GNUmakefile.list.am:
1596         * JavaScriptCore.xcodeproj/project.pbxproj:
1597         * Target.pri:
1598         * dfg/DFGDriver.cpp:
1599         (JSC::DFG::compile):
1600         * dfg/DFGOSRExitCompiler.cpp:
1601         * dfg/DFGOSRExitCompiler.h:
1602         (OSRExitCompiler):
1603         * dfg/DFGOSRExitCompiler32_64.cpp:
1604         (JSC::DFG::OSRExitCompiler::compileExit):
1605         * dfg/DFGOSRExitCompiler64.cpp:
1606         (JSC::DFG::OSRExitCompiler::compileExit):
1607         * dfg/DFGOSRExitCompilerCommon.cpp: Added.
1608         (DFG):
1609         (JSC::DFG::handleExitCounts):
1610         (JSC::DFG::reifyInlinedCallFrames):
1611         (JSC::DFG::adjustAndJumpToTarget):
1612         * dfg/DFGOSRExitCompilerCommon.h: Added.
1613         (DFG):
1614
1615 2013-07-15  Oliver Hunt  <oliver@apple.com>
1616
1617         Merged dfgFourthTier r148037
1618
1619     2013-04-09  Filip Pizlo  <fpizlo@apple.com>
1620
1621         fourthTier: DFG should better abstract floating point arguments
1622         https://bugs.webkit.org/show_bug.cgi?id=114300
1623
1624         Reviewed by Mark Hahnenberg.
1625
1626         * dfg/DFGFPRInfo.h:
1627         (FPRInfo):
1628         (JSC::DFG::FPRInfo::toArgumentRegister):
1629
1630 2013-07-15  Oliver Hunt  <oliver@apple.com>
1631
1632         Merged dfgFourthTier r147821
1633
1634     2013-04-05  Filip Pizlo  <fpizlo@apple.com>
1635
1636         fourthTier: DFG should better abstract arguments
1637         https://bugs.webkit.org/show_bug.cgi?id=114073
1638
1639         Reviewed by Mark Hahnenberg.
1640
1641         * dfg/DFGGPRInfo.h:
1642         (GPRInfo):
1643         (JSC::DFG::GPRInfo::toArgumentRegister):
1644
1645 2013-07-15  Oliver Hunt  <oliver@apple.com>
1646
1647         Merged dfgFourthTier r147609
1648
1649     2013-04-03  Filip Pizlo  <fpizlo@apple.com>
1650
1651         fourthTier: put DFG data into a DFG::JITCode, and put common DFG and FTL data into something accessible from both DFG::JITCode and FTL::JITCode
1652         https://bugs.webkit.org/show_bug.cgi?id=113905
1653
1654         Reviewed by Geoffrey Garen.
1655         
1656         This removes one pointer from CodeBlock.
1657         
1658         It also gives us a framework for having JITType-specific data in CodeBlock, by
1659         putting it into the appropriate JITCode class (either DFG::JITCode or
1660         FTL::JITCode). And it allows us to have DFG and FTL share some common data,
1661         via DFG::CommonData, which is stored in both DFG::JITCode and FTL::JITCode and
1662         always accessible via JITCode::dfgCommon().
1663
1664         * CMakeLists.txt:
1665         * GNUmakefile.list.am:
1666         * JavaScriptCore.xcodeproj/project.pbxproj:
1667         * Target.pri:
1668         * bytecode/CodeBlock.cpp:
1669         (JSC):
1670         (JSC::CodeBlock::dumpBytecode):
1671         (JSC::CodeBlock::visitAggregate):
1672         (JSC::CodeBlock::performTracingFixpointIteration):
1673         (JSC::CodeBlock::finalizeUnconditionally):
1674         (JSC::CodeBlock::stronglyVisitWeakReferences):
1675         (JSC::CodeBlock::shrinkToFit):
1676         (JSC::CodeBlock::tallyFrequentExitSites):
1677         * bytecode/CodeBlock.h:
1678         (CodeBlock):
1679         (JSC::CodeBlock::setJITCode):
1680         (JSC::CodeBlock::shouldImmediatelyAssumeLivenessDuringScan):
1681         (JSC::DFGCodeBlocks::mark):
1682         * dfg/DFGAssemblyHelpers.h:
1683         * dfg/DFGCommonData.cpp: Added.
1684         (DFG):
1685         (JSC::DFG::CommonData::notifyCompilingStructureTransition):
1686         (JSC::DFG::CommonData::shrinkToFit):
1687         * dfg/DFGCommonData.h: Added.
1688         (JSC):
1689         (DFG):
1690         (JSC::DFG::WeakReferenceTransition::WeakReferenceTransition):
1691         (WeakReferenceTransition):
1692         (CommonData):
1693         (JSC::DFG::CommonData::CommonData):
1694         * dfg/DFGDriver.cpp:
1695         (JSC::DFG::compile):
1696         (JSC::DFG::tryCompile):
1697         (JSC::DFG::tryCompileFunction):
1698         * dfg/DFGDriver.h:
1699         (DFG):
1700         (JSC::DFG::tryCompile):
1701         (JSC::DFG::tryCompileFunction):
1702         * dfg/DFGGraph.h:
1703         (Graph):
1704         * dfg/DFGJITCode.cpp: Added.
1705         (DFG):
1706         (JSC::DFG::JITCode::JITCode):
1707         (JSC::DFG::JITCode::~JITCode):
1708         (JSC::DFG::JITCode::dfgCommon):
1709         (JSC::DFG::JITCode::dfg):
1710         (JSC::DFG::JITCode::shrinkToFit):
1711         * dfg/DFGJITCode.h: Added.
1712         (DFG):
1713         (JITCode):
1714         (JSC::DFG::JITCode::appendOSREntryData):
1715         (JSC::DFG::JITCode::osrEntryDataForBytecodeIndex):
1716         (JSC::DFG::JITCode::appendOSRExit):
1717         (JSC::DFG::JITCode::lastOSRExit):
1718         (JSC::DFG::JITCode::appendSpeculationRecovery):
1719         (JSC::DFG::JITCode::appendWatchpoint):
1720         * dfg/DFGJITCompiler.cpp:
1721         (JSC::DFG::JITCompiler::JITCompiler):
1722         (JSC::DFG::JITCompiler::linkOSRExits):
1723         (JSC::DFG::JITCompiler::link):
1724         (JSC::DFG::JITCompiler::compile):
1725         (JSC::DFG::JITCompiler::compileFunction):
1726         * dfg/DFGJITCompiler.h:
1727         (JITCompiler):
1728         (JSC::DFG::JITCompiler::addWeakReference):
1729         (JSC::DFG::JITCompiler::noticeOSREntry):
1730         (JSC::DFG::JITCompiler::jitCode):
1731         * dfg/DFGOSREntry.cpp:
1732         (JSC::DFG::prepareOSREntry):
1733         * dfg/DFGOSRExit.h:
1734         (OSRExit):
1735         * dfg/DFGOSRExitCompiler.cpp:
1736         * dfg/DFGSpeculativeJIT.cpp:
1737         (JSC::DFG::SpeculativeJIT::SpeculativeJIT):
1738         (JSC::DFG::SpeculativeJIT::backwardSpeculationCheck):
1739         (JSC::DFG::SpeculativeJIT::speculationWatchpoint):
1740         (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward):
1741         * dfg/DFGSpeculativeJIT32_64.cpp:
1742         (JSC::DFG::SpeculativeJIT::compile):
1743         * dfg/DFGSpeculativeJIT64.cpp:
1744         (JSC::DFG::SpeculativeJIT::compile):
1745         * dfg/DFGVariableEventStream.cpp:
1746         * heap/DFGCodeBlocks.cpp:
1747         (JSC::DFGCodeBlocks::~DFGCodeBlocks):
1748         (JSC::DFGCodeBlocks::jettison):
1749         (JSC::DFGCodeBlocks::clearMarks):
1750         (JSC::DFGCodeBlocks::deleteUnmarkedJettisonedCodeBlocks):
1751         (JSC::DFGCodeBlocks::traceMarkedCodeBlocks):
1752         * jit/JITCode.cpp:
1753         (JSC::JITCode::dfgCommon):
1754         (JSC):
1755         (JSC::JITCode::dfg):
1756         (JSC::JITCode::ftl):
1757         (JSC::DirectJITCode::DirectJITCode):
1758         (JSC::DirectJITCode::initializeCodeRef):
1759         (JSC::DirectJITCode::addressForCall):
1760         (JSC::DirectJITCode::executableAddressAtOffset):
1761         (JSC::DirectJITCode::dataAddressAtOffset):
1762         (JSC::DirectJITCode::offsetOf):
1763         (JSC::DirectJITCode::size):
1764         (JSC::DirectJITCode::contains):
1765         * jit/JITCode.h:
1766         (DFG):
1767         (FTL):
1768         (JSC):
1769         (JITCode):
1770         (DirectJITCode):
1771
1772 2013-07-15  Oliver Hunt  <oliver@apple.com>
1773
1774         Merge dfgFourthTier r147587
1775
1776     2013-04-03  Filip Pizlo  <fpizlo@apple.com>
1777
1778         fourthTier: Everyone should know about the FTL
1779         https://bugs.webkit.org/show_bug.cgi?id=113897
1780
1781         Reviewed by Mark Hahnenberg.
1782         
1783         In order to get OSR exit to work right, we need the distinction between DFG and
1784         FTL to be clear even after compilation finishes, since they will have subtly
1785         different OSR stories and likely use different data structures.
1786
1787         * bytecode/CodeBlock.cpp:
1788         (JSC::CodeBlock::resetStubInternal):
1789         (JSC::ProgramCodeBlock::compileOptimized):
1790         (JSC::EvalCodeBlock::compileOptimized):
1791         (JSC::FunctionCodeBlock::compileOptimized):
1792         (JSC::CodeBlock::adjustedExitCountThreshold):
1793         (JSC::CodeBlock::tallyFrequentExitSites):
1794         * bytecode/CodeBlock.h:
1795         (JSC::CodeBlock::setJITCode):
1796         (JSC::CodeBlock::hasOptimizedReplacement):
1797         (JSC::ExecState::isInlineCallFrame):
1798         * ftl/FTLCompile.cpp:
1799         (JSC::FTL::compile):
1800         * ftl/FTLJITCode.cpp:
1801         (JSC::FTL::JITCode::JITCode):
1802         * ftl/FTLState.cpp:
1803         (JSC::FTL::State::dumpState):
1804         * heap/DFGCodeBlocks.cpp:
1805         (JSC::DFGCodeBlocks::jettison):
1806         * interpreter/Interpreter.cpp:
1807         (JSC::getLineNumberForCallFrame):
1808         (JSC::getCallerInfo):
1809         * jit/JITCode.cpp:
1810         (WTF::printInternal):
1811         * jit/JITCode.h:
1812         (JSC::JITCode::topTierJIT):
1813         (JSC::JITCode::nextTierJIT):
1814         (JITCode):
1815         (JSC::JITCode::isJIT):
1816         (JSC::JITCode::isLowerTier):
1817         (JSC::JITCode::isHigherTier):
1818         (JSC::JITCode::isLowerOrSameTier):
1819         (JSC::JITCode::isHigherOrSameTier):
1820         (JSC::JITCode::isOptimizingJIT):
1821         * jit/JITDriver.h:
1822         (JSC::jitCompileIfAppropriate):
1823         (JSC::jitCompileFunctionIfAppropriate):
1824         * jit/JITStubs.cpp:
1825         (JSC::DEFINE_STUB_FUNCTION):
1826         * runtime/Executable.cpp:
1827         (JSC::EvalExecutable::compileOptimized):
1828         (JSC::samplingDescription):
1829         (JSC::ProgramExecutable::compileOptimized):
1830         (JSC::FunctionExecutable::compileOptimizedForCall):
1831         (JSC::FunctionExecutable::compileOptimizedForConstruct):
1832
1833 2013-04-03  Filip Pizlo  <fpizlo@apple.com>
1834
1835         fourthTier: DFG should abstract out how it does forward exits, and that code should be simplified
1836         https://bugs.webkit.org/show_bug.cgi?id=113894
1837
1838         Reviewed by Mark Hahnenberg.
1839         
1840         1) We previously had two different ways of convertingToForward, one path for
1841            where we had a ValueRecovery for the current node and one where we didn't.
1842            But the paths were doing exactly the same thing except that if you have a
1843            ValueRecovery, you also find the last applicable mov hint and do some
1844            extra things. This patch combines the two paths and bases both of them on
1845            the previous no-ValueRecovery path, which was simpler to begin with.
1846         
1847         2) This moves the logic into DFG::OSRExit, which further simplifies the code
1848            and makes the logic available to the FTL.
1849
1850         * dfg/DFGOSRExit.cpp:
1851         (JSC::DFG::OSRExit::convertToForward):
1852         (DFG):
1853         * dfg/DFGOSRExit.h:
1854         (DFG):
1855         (OSRExit):
1856         * dfg/DFGSpeculativeJIT.cpp:
1857         (JSC::DFG::SpeculativeJIT::convertLastOSRExitToForward):
1858
1859 2013-07-15  Oliver Hunt  <oliver@apple.com>
1860
1861         Merge dfgFourthTier r147582
1862
1863 2013-07-15  Oliver Hunt  <oliver@apple.com>
1864
1865         Merge dfgFourthTier r147014
1866
1867     2013-03-27  Filip Pizlo  <fpizlo@apple.com>
1868
1869         fourthTier: JITCode should abstract exactly how the JIT code is structured and where it was allocated
1870         https://bugs.webkit.org/show_bug.cgi?id=113437
1871
1872         Reviewed by Mark Hahnenberg.
1873         
1874         JITCode is now a virtual base class, which will allow different JITs to have radically
1875         different memory allocation and management conventions in the future. It will also
1876         make it easier to store JIT-specific meta-data in CodeBlock just by putting it into
1877         an appropriate JITCode subclass.
1878         
1879         For now there is one subclass, DirectJITCode, which just behaves like JITCode used to
1880         behave.
1881
1882         * assembler/RepatchBuffer.h:
1883         (JSC::RepatchBuffer::RepatchBuffer):
1884         * bytecode/CodeBlock.cpp:
1885         (JSC::CodeBlock::resetStubInternal):
1886         (JSC::CodeBlock::bytecodeOffset):
1887         (JSC::CodeBlock::codeOriginForReturn):
1888         * bytecode/CodeBlock.h:
1889         (JSC::CodeBlock::setJITCode):
1890         (JSC::CodeBlock::getJITCode):
1891         (JSC::CodeBlock::getJITType):
1892         (CodeBlock):
1893         * dfg/DFGDriver.cpp:
1894         (JSC::DFG::compile):
1895         (JSC::DFG::tryCompile):
1896         (JSC::DFG::tryCompileFunction):
1897         * dfg/DFGDriver.h:
1898         (DFG):
1899         (JSC::DFG::tryCompile):
1900         (JSC::DFG::tryCompileFunction):
1901         * dfg/DFGJITCompiler.cpp:
1902         (JSC::DFG::JITCompiler::compile):
1903         (JSC::DFG::JITCompiler::compileFunction):
1904         * dfg/DFGJITCompiler.h:
1905         (JITCompiler):
1906         * dfg/DFGOSREntry.cpp:
1907         (JSC::DFG::prepareOSREntry):
1908         * dfg/DFGOSRExit.cpp:
1909         (JSC::DFG::OSRExit::codeLocationForRepatch):
1910         * dfg/DFGOSRExitCompiler32_64.cpp:
1911         (JSC::DFG::OSRExitCompiler::compileExit):
1912         * dfg/DFGOSRExitCompiler64.cpp:
1913         (JSC::DFG::OSRExitCompiler::compileExit):
1914         * dfg/DFGOperations.cpp:
1915         * interpreter/Interpreter.cpp:
1916         (JSC::Interpreter::execute):
1917         (JSC::Interpreter::executeCall):
1918         (JSC::Interpreter::executeConstruct):
1919         * jit/JIT.cpp:
1920         (JSC::JIT::privateCompile):
1921         * jit/JIT.h:
1922         (JSC::JIT::compile):
1923         (JIT):
1924         * jit/JITCode.cpp:
1925         (JSC):
1926         (JSC::JITCode::JITCode):
1927         (JSC::JITCode::~JITCode):
1928         (JSC::JITCode::execute):
1929         (JSC::JITCode::hostFunction):
1930         (JSC::DirectJITCode::DirectJITCode):
1931         (JSC::DirectJITCode::~DirectJITCode):
1932         (JSC::DirectJITCode::addressForCall):
1933         (JSC::DirectJITCode::executableAddressAtOffset):
1934         (JSC::DirectJITCode::dataAddressAtOffset):
1935         (JSC::DirectJITCode::offsetOf):
1936         (JSC::DirectJITCode::size):
1937         (JSC::DirectJITCode::contains):
1938         * jit/JITCode.h:
1939         (JSC):
1940         (JITCode):
1941         (JSC::JITCode::bottomTierJIT):
1942         (JSC::JITCode::topTierJIT):
1943         (JSC::JITCode::nextTierJIT):
1944         (JSC::JITCode::isOptimizingJIT):
1945         (JSC::JITCode::isBaselineCode):
1946         (JSC::JITCode::jitType):
1947         (JSC::JITCode::jitTypeFor):
1948         (JSC::JITCode::executableAddress):
1949         (JSC::JITCode::start):
1950         (JSC::JITCode::end):
1951         (DirectJITCode):
1952         * jit/JITDriver.h:
1953         (JSC::jitCompileIfAppropriate):
1954         (JSC::jitCompileFunctionIfAppropriate):
1955         * jit/JITStubs.cpp:
1956         (JSC::lazyLinkFor):
1957         (JSC::DEFINE_STUB_FUNCTION):
1958         * jit/ThunkGenerators.cpp:
1959         (JSC::virtualForGenerator):
1960         * llint/LLIntEntrypoints.cpp:
1961         (JSC::LLInt::getFunctionEntrypoint):
1962         (JSC::LLInt::getEvalEntrypoint):
1963         (JSC::LLInt::getProgramEntrypoint):
1964         * llint/LLIntEntrypoints.h:
1965         (JSC):
1966         (LLInt):
1967         (JSC::LLInt::getEntrypoint):
1968         * llint/LLIntSlowPaths.cpp:
1969         (JSC::LLInt::jitCompileAndSetHeuristics):
1970         (JSC::LLInt::entryOSR):
1971         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
1972         * runtime/Executable.cpp:
1973         (JSC::EvalExecutable::compileInternal):
1974         (JSC::ProgramExecutable::compileInternal):
1975         (JSC::FunctionExecutable::compileForCallInternal):
1976         (JSC::FunctionExecutable::compileForConstructInternal):
1977         * runtime/Executable.h:
1978         (JSC::ExecutableBase::generatedJITCodeForCall):
1979         (JSC::ExecutableBase::generatedJITCodeForConstruct):
1980         (JSC::ExecutableBase::generatedJITCodeFor):
1981         (ExecutableBase):
1982         (JSC::ExecutableBase::hostCodeEntryFor):
1983         (JSC::ExecutableBase::jsCodeEntryFor):
1984         (JSC::ExecutableBase::jsCodeWithArityCheckEntryFor):
1985         (JSC::NativeExecutable::create):
1986         (JSC::NativeExecutable::finishCreation):
1987         (JSC::EvalExecutable::generatedJITCode):
1988         (JSC::ProgramExecutable::generatedJITCode):
1989         * runtime/ExecutionHarness.h:
1990         (JSC::prepareForExecution):
1991         (JSC::prepareFunctionForExecution):
1992
1993 2013-07-24  Filip Pizlo  <fpizlo@apple.com>
1994
1995         It should be possible to hijack IndexingHeader for things other than lengths
1996         https://bugs.webkit.org/show_bug.cgi?id=119065
1997
1998         Reviewed by Mark Hahnenberg.
1999         
2000         Made the body of IndexingHeader be a union.
2001         
2002         Modified the offlineasm so that you can say IndexingHeader::u.lengths.publicLength.
2003         Previously those dots would cause parse errors. Now an identifier in offlineasm can
2004         have a dot anywhere except the first character.
2005
2006         * llint/LowLevelInterpreter32_64.asm:
2007         * llint/LowLevelInterpreter64.asm:
2008         * offlineasm/parser.rb:
2009         * runtime/IndexingHeader.h:
2010         (JSC::IndexingHeader::offsetOfPublicLength):
2011         (JSC::IndexingHeader::offsetOfVectorLength):
2012         (JSC::IndexingHeader::IndexingHeader):
2013         (JSC::IndexingHeader::vectorLength):
2014         (JSC::IndexingHeader::setVectorLength):
2015         (JSC::IndexingHeader::publicLength):
2016         (JSC::IndexingHeader::setPublicLength):
2017
2018 2013-07-24  Mark Hahnenberg  <mhahnenberg@apple.com>
2019
2020         JIT::updateTopCallFrame doesn't update the CallFrame's bytecodeOffset if bytecodeOffset == 0
2021         https://bugs.webkit.org/show_bug.cgi?id=118923
2022
2023         Reviewed by Filip Pizlo.
2024
2025         This bug causes the CallFrame's bytecodeOffset to not be properly set when we 
2026         enter, e.g., cti_optimize from an op_enter.
2027
2028         * jit/JITInlines.h:
2029         (JSC::JIT::updateTopCallFrame):
2030
2031 2013-07-23  Filip Pizlo  <fpizlo@apple.com>
2032
2033         DFG string concatenation optimizations might emit speculative nodes after emitting nodes that kill the original inputs
2034         https://bugs.webkit.org/show_bug.cgi?id=119032
2035
2036         Reviewed by Oliver Hunt.
2037
2038         It just needs some Phantom action.
2039
2040         * dfg/DFGFixupPhase.cpp:
2041         (JSC::DFG::FixupPhase::attemptToMakeFastStringAdd):
2042
2043 2013-07-10  Mark Lam  <mark.lam@apple.com>
2044
2045         Need ExpressionRangeInfo before ResolveForPuts in strict mode.
2046         https://bugs.webkit.org/show_bug.cgi?id=118997.
2047
2048         Reviewed by Oliver Hunt.
2049
2050         If we add an assertion in UnlinkedCodeBlock::expressionRangeForBytecodeOffset()
2051         to ensure that we are able to find an ExpressionRangeInfo for any given bytecode
2052         offset, the following tests will fails:
2053             fast/js/basic-strict-mode.html
2054             fast/js/mozilla/strict/8.7.2.html
2055         With this fix, those tests will no longer fail.
2056
2057         * bytecompiler/NodesCodegen.cpp:
2058         (JSC::AssignResolveNode::emitBytecode):
2059         (JSC::ForInNode::emitBytecode):
2060         - Emit expression info before calls to emitResolveBaseForPut() when in strict mode.
2061
2062 2013-07-23  Mark Lam  <mark.lam@apple.com>
2063
2064         Added ExpressionRangeInfo for BinaryOpNodes that can throw exceptions
2065         due to type coersion.
2066         https://bugs.webkit.org/show_bug.cgi?id=116853.
2067
2068         Reviewed by Geoffrey Garen.
2069
2070         * bytecompiler/NodesCodegen.cpp:
2071         (JSC::BinaryOpNode::emitBytecode):
2072         - Added expression info for the strcat and the general binary op cases.
2073           I did not add expression info for the "compare with null" case because
2074           that comparison cannot trigger type coersion, and hence it won't throw
2075           any exceptions and doesn't need the expression info.
2076
2077 2013-07-23  Mark Lam  <mark.lam@apple.com>
2078
2079         Removed unused sourceOffset from JSTokenLocation.
2080         https://bugs.webkit.org/show_bug.cgi?id=118996.
2081
2082         Reviewed by Geoffrey Garen.
2083
2084         This also removes the assertion reported in the bug because it is now
2085         moot, thereby resolving the assertion failure issue on Windows.
2086
2087         * bytecompiler/NodesCodegen.cpp:
2088         (JSC::ArrayNode::toArgumentList):
2089         (JSC::ApplyFunctionCallDotNode::emitBytecode):
2090         * parser/Lexer.cpp:
2091         (JSC::::lex):
2092         * parser/Lexer.h:
2093         (JSC::::lexExpectIdentifier):
2094         * parser/Nodes.h:
2095         * parser/Parser.cpp:
2096         (JSC::::Parser):
2097         (JSC::::parseFunctionInfo):
2098         (JSC::::parseExpressionOrLabelStatement):
2099         (JSC::::parseMemberExpression):
2100         * parser/Parser.h:
2101         (JSC::::parse):
2102         * parser/ParserTokens.h:
2103         (JSC::JSTokenLocation::JSTokenLocation):
2104
2105 2013-07-22  Alex Christensen  <achristensen@apple.com>
2106
2107         Added assembly files to Windows 64-bit builds.
2108         https://bugs.webkit.org/show_bug.cgi?id=118931
2109
2110         Reviewed by Brent Fulgham.
2111
2112         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj: Added JITStubsMSVC64.asm for x64 and enabled MASM.
2113         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters: Added JITStubsMSVC64.asm.
2114
2115 2013-07-20  Brent Fulgham  <bfulgham@apple.com>
2116
2117         [Windows] Remove unneeded custom stdint.h now that we build on VS2010.
2118         https://bugs.webkit.org/show_bug.cgi?id=118868.
2119
2120         Reviewed by Anders Carlsson.
2121
2122         * os-win32/stdint.h: Removed.
2123         * GNUmakefile.list.am: Removed reference to os-win32/stdint.h
2124
2125 2013-07-19  Alex Christensen  <achristensen@apple.com>
2126
2127         Added x64 configuration to Visual Studio build.
2128         https://bugs.webkit.org/show_bug.cgi?id=118888
2129
2130         Reviewed by Brent Fulgham.
2131
2132         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
2133         * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.vcxproj:
2134         * JavaScriptCore.vcxproj/LLInt/LLIntAssembly/LLIntAssembly.vcxproj:
2135         * JavaScriptCore.vcxproj/LLInt/LLIntDesiredOffsets/LLIntDesiredOffsets.vcxproj:
2136         * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcxproj:
2137         * JavaScriptCore.vcxproj/jsc/jsc.vcxproj:
2138         * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj:
2139         * JavaScriptCore.vcxproj/testapi/testapi.vcxproj:
2140
2141 2013-07-18  Andreas Kling  <akling@apple.com>
2142
2143         CodeBlock DFG entry list isn't getting shrunk-to-fit after linking.
2144         <http://webkit.org/b/118875>
2145         <rdar://problem/14488577>
2146
2147         Reviewed by Geoffrey Garen.
2148
2149         Move the CodeBlock::shrinkToFit() call out of JITCompiler::link() and to the call sites
2150         so SpeculativeJIT::linkOSREntries() can fill in CodeBlock::m_dfgData->osrEntry first.
2151
2152         886 kB progression on <http://twitter.com/awesomekling>
2153
2154         * dfg/DFGJITCompiler.cpp:
2155         (JSC::DFG::JITCompiler::link):
2156         (JSC::DFG::JITCompiler::compile):
2157         (JSC::DFG::JITCompiler::compileFunction):
2158
2159 2013-07-18  Chris Curtis  <chris_curtis@apple.com>
2160
2161         Fixed ASSERTION FAILED: callFrame == globalData->topCallFrame in JSC::Interpreter::addStackTraceIfNecessary
2162         https://bugs.webkit.org/show_bug.cgi?id=118498
2163
2164         Reviewed by Geoffrey Garen.
2165
2166         * jit/JITStubs.cpp:
2167         (throwExceptionFromOpCall):
2168         Created new throwExceptionFromOpCall that takes in a functor that contains
2169         a function pointer (to create the errorObject) instead of a JSValue. Inside
2170         of throwExceptionFromOpCall the topCallFrame is being rolled back in order
2171         to handle the error throw. By passing the function pointer in, we can defer
2172         the creation of the error object until after topCallFrame has been rolled 
2173         back. This allows the error object to be created with the appropriate top 
2174         frame.
2175
2176         DEFINE_STUB_FUNCTION(void*, stack_check):
2177         DEFINE_STUB_FUNCTION(void*, op_call_arityCheck):
2178         DEFINE_STUB_FUNCTION(void*, op_construct_arityCheck):
2179         DEFINE_STUB_FUNCTION(EncodedJSValue, op_call_NotJSFunction):
2180         DEFINE_STUB_FUNCTION(EncodedJSValue, op_construct_NotJSConstruct):
2181
2182         (JSC::ErrorFunctor::~ErrorFunctor):
2183         (JSC::ErrorWithExecFunctor::ErrorWithExecFunctor):
2184         (JSC::ErrorWithExecFunctor::operator()):
2185         (JSC::ErrorWithExecAndCalleeFunctor::ErrorWithExecAndCalleeFunctor):
2186         (JSC::ErrorWithExecAndCalleeFunctor::operator()):
2187         (JSC::ErrorWithExceptionFunctor::ErrorWithExceptionFunctor):
2188         (JSC::ErrorWithExceptionFunctor::operator()):
2189         (JSC::throwExceptionFromOpCall):
2190
2191         In order to eliminate the need to duplicate code, an error functor was 
2192         created for the 3 different throwExceptionFromOpCall handles. 
2193         1. The exception needs to be created, and the function pointer takes 1 
2194             parameter(callFrame->callerFrame()).
2195         2. The exception needs to be created, and the function pointer takes 2 
2196             parameters (callFrame->callerFrame(), callFrame.calleeAsValue()).
2197         3. The exception is already created. In this case, At the time when 
2198             the error functor is called, globalData.exception is returned. 
2199
2200         * llint/LLIntSlowPaths.cpp:
2201         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
2202         * runtime/ExceptionHelpers.cpp:
2203         (JSC::errorDescriptionForValue):
2204         (JSC::createError):
2205         (JSC::createInvalidParameterError):
2206         (JSC::createNotAConstructorError):
2207         (JSC::createNotAFunctionError):
2208         (JSC::createNotAnObjectError):
2209         * runtime/ExceptionHelpers.h:
2210
2211         The function toString() was being used to stringify an object for an exception
2212         message. If the user wrote a toString() for that object, then the system would 
2213         continue to evaluate that code. A new helper function was created to prevent 
2214         the system to continue execution and exception creation from that execution.
2215
2216 2013-07-18  Filip Pizlo  <fpizlo@apple.com>
2217
2218         LLInt get_argument_by_val for JSVALUE64 stores into the array profile when it meant to store into the value profile
2219         https://bugs.webkit.org/show_bug.cgi?id=118865
2220
2221         Reviewed by Mark Hahnenberg.
2222
2223         * llint/LowLevelInterpreter64.asm:
2224
2225 2013-07-18  Andreas Kling  <akling@apple.com>
2226
2227         CodeBlock::m_argumentValueProfiles wastes a lot of memory.
2228         <http://webkit.org/b/118852>
2229         <rdar://problem/14481659>
2230
2231         Reviewed by Anders Carlsson.
2232
2233         Use Vector::resizeToFit() for CodeBlock::m_argumentValueProfiles. We don't need any padding
2234         for growth, since we won't be appending to it anyway.
2235
2236         921 KB progression on <http://twitter.com/awesomekling>
2237
2238         * bytecode/CodeBlock.cpp:
2239         (JSC::CodeBlock::setNumParameters):
2240
2241 2013-07-17  Filip Pizlo  <fpizlo@apple.com>
2242
2243         Unreviewed, fix 32-bit after http://trac.webkit.org/changeset/152813
2244
2245         * dfg/DFGSpeculativeJIT.cpp:
2246         (JSC::DFG::SpeculativeJIT::compileNewFunctionNoCheck):
2247         * dfg/DFGSpeculativeJIT32_64.cpp:
2248         (JSC::DFG::SpeculativeJIT::compile):
2249
2250 2013-07-17  Geoffrey Garen  <ggaren@apple.com>
2251
2252         API tests should test for JSStringCreateWithCFString with empty string
2253         https://bugs.webkit.org/show_bug.cgi?id=118819
2254
2255         Reviewed by Mark Hahnenberg.
2256
2257         * API/tests/testapi.c:
2258         (main): Test!
2259
2260 2013-07-17  Filip Pizlo  <fpizlo@apple.com>
2261
2262         DFG assumes that NewFunction will never pass its input through
2263         https://bugs.webkit.org/show_bug.cgi?id=118798
2264
2265         Reviewed by Sam Weinig.
2266         
2267         Previously the DFG was assuming that NewFunction always returns a function. That's not
2268         the case. It may return whatever was passed to it, if it wasn't passed SpecEmpty.
2269         
2270         This fact needed to be wired through the compiler.
2271
2272         * dfg/DFGAbstractState.cpp:
2273         (JSC::DFG::AbstractState::executeEffects):
2274         * dfg/DFGAbstractValue.h:
2275         (JSC::DFG::AbstractValue::makeTop):
2276         * dfg/DFGGraph.cpp:
2277         (JSC::DFG::Graph::dump):
2278         * dfg/DFGOperations.cpp:
2279         * dfg/DFGOperations.h:
2280         * dfg/DFGPredictionPropagationPhase.cpp:
2281         (JSC::DFG::PredictionPropagationPhase::propagate):
2282         * dfg/DFGSpeculativeJIT.h:
2283         (JSC::DFG::SpeculativeJIT::callOperation):
2284         * dfg/DFGSpeculativeJIT32_64.cpp:
2285         (JSC::DFG::SpeculativeJIT::compile):
2286         * dfg/DFGSpeculativeJIT64.cpp:
2287         (JSC::DFG::SpeculativeJIT::compile):
2288
2289 2013-07-17  Geoffrey Garen  <ggaren@apple.com>
2290
2291         JSStringCreateWithCFString should not convert the empty string into the NULL string
2292         https://bugs.webkit.org/show_bug.cgi?id=118816
2293
2294         Reviewed by Sam Weinig.
2295
2296         * API/JSStringRef.cpp:
2297         (JSStringCreateWithUTF8CString): Removed an extraneous comment, which
2298         a previous version of the patch made incorrect.
2299
2300         * API/JSStringRefCF.cpp:
2301         (JSStringCreateWithCFString): Don't convert the empty string into the
2302         null string.
2303
2304 2013-07-17  Chris Curtis  <chris_curtis@apple.com>
2305
2306         Naming convention on createInvalidParamError is incorrect.
2307         https://bugs.webkit.org/show_bug.cgi?id=118756
2308
2309         Reviewed by Geoffrey Garen.
2310         
2311         Changed the naming of createInvalidParamError to createInvalidParameterError.
2312         This corrects the naming convention for the function listed in the WebKit code styling.
2313
2314         * interpreter/Interpreter.cpp:
2315         (JSC::loadVarargs):
2316         * jit/JITStubs.cpp:
2317         (JSC::DEFINE_STUB_FUNCTION):
2318         * llint/LLIntSlowPaths.cpp:
2319         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
2320         * runtime/CommonSlowPaths.h:
2321         (JSC::CommonSlowPaths::opIn):
2322         * runtime/ExceptionHelpers.cpp:
2323         (JSC::createInvalidParameterError):
2324         * runtime/ExceptionHelpers.h:
2325         * runtime/JSObject.cpp:
2326         (JSC::JSObject::hasInstance):
2327
2328 2013-07-16  David Farler  <dfarler@apple.com>
2329
2330         Typo in DFGInsertionSet.h header guard: "DFGInsectionSet_h" -> "DFGInsertionSet_h"
2331         https://bugs.webkit.org/show_bug.cgi?id=118753
2332
2333         Reviewed by Geoffrey Garen.
2334
2335         * dfg/DFGInsertionSet.h:
2336         "DFGInsectionSet_h" -> "DFGInsertionSet_h"
2337
2338 2013-07-16  Filip Pizlo  <fpizlo@apple.com>
2339
2340         MakeRope fixup shouldn't lead to an Identity without kids
2341         https://bugs.webkit.org/show_bug.cgi?id=118745
2342
2343         Reviewed by Mark Hahnenberg.
2344         
2345         Make the empty string pruning part of fixupMakeRope() stop if it's on the last child.
2346         
2347         Make Node::convertToIdentity release-assert that it has exactly one kid.
2348
2349         * dfg/DFGFixupPhase.cpp:
2350         (JSC::DFG::FixupPhase::fixupMakeRope):
2351         * dfg/DFGNode.h:
2352         (JSC::DFG::Node::convertToIdentity):
2353
2354 2013-07-16  Mark Hahnenberg  <mhahnenberg@apple.com>
2355
2356         Remove reference to JSValueStructSupport.h from JSExport.h
2357         https://bugs.webkit.org/show_bug.cgi?id=118746
2358
2359         Reviewed by Filip Pizlo.
2360
2361         * API/JSExport.h: No such header exists, so it doesn't make sense to reference it.
2362
2363 2013-07-13  Commit Queue  <commit-queue@webkit.org>
2364
2365         Unreviewed, rolling out r151978.
2366         http://trac.webkit.org/changeset/151978
2367         https://bugs.webkit.org/show_bug.cgi?id=118651
2368
2369         Caused regressions at least 3 websites (Requested by rniwa on
2370         #webkit).
2371
2372         * runtime/JSCJSValue.h:
2373         * runtime/JSString.h:
2374
2375 2013-07-12  Chris Curtis    <chris_curtis@apple.com>
2376
2377         Optimize addStrackTraceIfNecessary to be faster in the case when it's not necessary
2378         https://bugs.webkit.org/show_bug.cgi?id=118328
2379
2380         Reviewed by Geoffrey Garen.
2381
2382         Retrieving the stack is costly. We want to get it only once. By moving the check
2383         for the .stack property above the code to retrieve the stack, we ensure this. 
2384
2385         * interpreter/Interpreter.cpp:
2386         (JSC::Interpreter::addStackTraceIfNecessary):
2387
2388 2013-07-12  Brent Fulgham  <bfulgham@apple.com>
2389
2390         [Windows] Build correction after r152573/r152577.
2391         https://bugs.webkit.org/show_bug.cgi?id=118610
2392
2393         Reviewed by Oliver Hunt.
2394
2395         * jit/JITThunks.cpp:
2396         (JSC::JITThunks::hostFunctionStub): Hand-feed MSVC++ the fact that we want the second
2397         argument of the make_pair to be a function pointer.
2398
2399 2013-07-11  Oliver Hunt  <oliver@apple.com>
2400
2401         Attempt to fix the windows build.
2402
2403         * jit/JITThunks.cpp:
2404         (JSC::JITThunks::hostFunctionStub):
2405         * jit/JITThunks.h:
2406
2407 2013-07-10  Oliver Hunt  <oliver@apple.com>
2408
2409         NativeExecutable cache needs to use both call and construct functions for key
2410         https://bugs.webkit.org/show_bug.cgi?id=118545
2411
2412         Reviewed by Geoffrey Garen.
2413
2414         Make the native executable cache make use a key pair so we don't decide to
2415         treat all subsequent functions as not being constructors.
2416
2417         * jit/JITThunks.cpp:
2418         (JSC::JITThunks::hostFunctionStub):
2419         * jit/JITThunks.h:
2420         * runtime/JSBoundFunction.cpp:
2421         (JSC::JSBoundFunction::create):
2422         * runtime/JSCell.cpp:
2423         (JSC::JSCell::getCallData):
2424         (JSC::JSCell::getConstructData):
2425
2426 2013-07-09  Mark Lam  <mark.lam@apple.com>
2427
2428         Gardening to unbreak builds on the Windows bot.
2429
2430         Not reviewed.
2431
2432         * parser/ParserTokens.h:
2433
2434 2013-07-09  Mark Lam  <mark.lam@apple.com>
2435
2436         Fix 30% JSBench regression (caused by adding column numbers to stack traces).
2437         https://bugs.webkit.org/show_bug.cgi?id=118481.
2438
2439         Reviewed by Mark Hahnenberg and Geoffrey Garen.
2440
2441         Previously, we already capture ExpressionRangeInfo that provides a divot for
2442         each bytecode that can potentially throw an exception (and therefore generate
2443         a stack trace). On first attempt to compute column numbers, we then do a walk
2444         of the source string to record all line start positions in a table associated
2445         with the SourceProvider. The column number can then be computed as
2446             divot - lineStartFor(bytecodeOffset).
2447
2448         The computation of this lineStarts table is the source of the 30% JSBench
2449         performance regression.
2450
2451         The new code now records lineStarts as the lexer and parser scans the source
2452         code. These lineStarts are then used to compute the column number for the
2453         given divot, and stored in the ExpressionRangeInfo. Similarly, we also capture
2454         the line number at the divot point and store that in the ExpressionRangeInfo.
2455         Hence, to look up line and column numbers, we now lookup the ExpressionRangeInfo
2456         for the bytecodeOffset, and then compute the line and column from the values
2457         stored in the expression info.
2458
2459         The strategy:
2460         1. We want to minimize perturbations to the lexer and parser. Specifically,
2461            the changes added should not change how it scans code, and generate bytecode.
2462         2. We regard the divot as the source character position we are interested
2463            in. As such, we'll capture line and lineStart (for column) at the point
2464            when we capture the divot information. This ensures that the 3 values are
2465            consistent.
2466
2467         How the change is done:
2468         1. Change the lexer to track lineStarts.
2469         2. Change the parser to capture line and lineStarts at the point of capturing
2470            divots.
2471         3. Change the parser and associated code to plumb these values all the way to
2472            the point that the correspoinding ExpressionRangeInfo is emitted.
2473         4. Propagate and record SourceCode firstLine and firstLineColumnOffset to the
2474            the necessary places so that we can add them as needed when reifying
2475            UnlinkedCodeBlocks into CodeBlocks.
2476         5. Compress the line and column number values in the ExpressionRangeInfo. In
2477            practice, we seldom have both large line and column numbers. Hence, we can
2478            encode both in an uint32_t most of the time. For the times when we encounter
2479            both large line and column numbers, we have a fallback to store the "fat"
2480            position info.
2481         6. Emit an ExpressionRangeInfo for UnaryOp nodes to get more line and column
2482            number coverage.
2483         7. Change the interpreter to use the new way of computing line and column.
2484         8. Delete old line and column computation code that is now unused.
2485
2486         Misc details:
2487         - the old lexer was tracking both a startOffset and charPosition where
2488           charPosition equals startOffset - SourceCode.startOffset. We now use
2489           startOffset exclusively throughout the system for consistency.
2490           All offset values (including lineStart) are relative to the start of the
2491           SourceProvider string. These values will only be converted to be relative
2492           to the SourceCode.startOffset at the very last minute i.e. when the divot
2493           is stored into the ExpressionRangeInfo.
2494
2495           This change to use the same offset system everywhere reduces confusion
2496           from having to convert back and forth between the 2 systems. It also
2497           enables a lot of assertions to be used.
2498
2499         - Also fixed some bugs in the choice of divot positions to use. For example,
2500           both Eval and Function expressions previously used column numbers from
2501           the start of the expression but used the line number at the end of the
2502           expression. This is now fixed to use either the start or end positions
2503           as appropriate, but not a mix of line and columns from both.
2504
2505         - Why use ints instead of unsigneds for offsets and lineStarts inside the
2506           lexer and parser?
2507           Some tests (e.g. fast/js/call-base-resolution.html and
2508           fast/js/eval-cross-window.html) has shown that lineStart offsets can be
2509           prior to the SourceCode.startOffset. Keeping the lexer offsets as ints
2510           simplifies computations and makes it easier to maintain the assertions
2511           that (startOffset >= lineStartOffset).
2512
2513           However, column and line numbers are always unsigned when we publish
2514           them to the ExpressionRangeInfo. The ints are only used inside the
2515           lexer and parser ... well, and bytecode generator.
2516
2517         - For all cases, lineStart is always captured where the divot is captured.
2518           However, some sputnik conformance tests have shown that we cannot honor
2519           line breaks for assignment statements like the following:
2520
2521               eval("x\u000A*=\u000A-1;");
2522
2523           In this case, the lineStart is expected to be captured at the start of
2524           the assignment expression instead of at the divot point in the middle.
2525           The assignment expression is the only special case for this.
2526
2527         This patch has been tested against the full layout tests both with release
2528         and debug builds with no regression.
2529
2530         * API/JSContextRef.cpp:
2531         (JSContextCreateBacktrace):
2532           - Updated to use the new StackFrame::computeLineAndColumn().
2533         * bytecode/CodeBlock.cpp:
2534         (JSC::CodeBlock::CodeBlock):
2535           - Added m_firstLineColumnOffset initialization.
2536           - Plumbed the firstLineColumnOffset into the SourceCode.
2537           - Initialized column for op_debug using the new way.
2538         (JSC::CodeBlock::lineNumberForBytecodeOffset):
2539           - Changed to compute line number using the ExpressionRangeInfo.
2540         (JSC::CodeBlock::columnNumberForBytecodeOffset): Added
2541           - Changed to compute column number using the ExpressionRangeInfo.
2542         (JSC::CodeBlock::expressionRangeForBytecodeOffset):
2543         * bytecode/CodeBlock.h:
2544         (JSC::CodeBlock::firstLineColumnOffset):
2545         (JSC::GlobalCodeBlock::GlobalCodeBlock):
2546           - Plumbed firstLineColumnOffset through to the super class.
2547         (JSC::ProgramCodeBlock::ProgramCodeBlock):
2548           - Plumbed firstLineColumnOffset through to the super class.
2549         (JSC::EvalCodeBlock::EvalCodeBlock):
2550           - Plumbed firstLineColumnOffset through to the super class.
2551             But for EvalCodeBlocks, the firstLineColumnOffset is always 1
2552             because we're starting with a new source string with no start
2553             offset.
2554         (JSC::FunctionCodeBlock::FunctionCodeBlock):
2555           - Plumbed firstLineColumnOffset through to the super class.
2556
2557         * bytecode/ExpressionRangeInfo.h:
2558           - Added modes for encoding line and column into a single 30-bit
2559             unsigned. The encoding is in 1 of 3 modes:
2560             1. FatLineMode: 22-bit line, 8-bit column
2561             2. FatColumnMode: 8-bit line, 22-bit column
2562             3. FatLineAndColumnMode: 32-bit line, 32-bit column
2563         (JSC::ExpressionRangeInfo::encodeFatLineMode): Added.
2564           - Encodes line and column into the 30-bit position using FatLine mode.
2565         (JSC::ExpressionRangeInfo::encodeFatColumnMode): Added.
2566           - Encodes line and column into the 30-bit position using FatColumn mode.
2567         (JSC::ExpressionRangeInfo::decodeFatLineMode): Added.
2568           - Decodes the FatLine mode 30-bit position into line and column.
2569         (JSC::ExpressionRangeInfo::decodeFatColumnMode): Added.
2570           - Decodes the FatColumn mode 30-bit position into line and column.
2571
2572         * bytecode/UnlinkedCodeBlock.cpp:
2573         (JSC::UnlinkedFunctionExecutable::UnlinkedFunctionExecutable):
2574           - Plumbed startColumn through.
2575         (JSC::UnlinkedFunctionExecutable::link):
2576           - Plumbed startColumn through.
2577         (JSC::UnlinkedCodeBlock::lineNumberForBytecodeOffset):
2578           - Computes a line number using the new way.
2579         (JSC::UnlinkedCodeBlock::expressionRangeForBytecodeOffset):
2580           - Added decoding of line and column.
2581           - Added handling of the case when we do not find a fitting expression
2582             range info for a specified bytecodeOffset. This only happens if the
2583             bytecodeOffset is below the first expression range info. In that
2584             case, we'll use the first expression range info entry.
2585         (JSC::UnlinkedCodeBlock::addExpressionInfo):
2586           - Added encoding of line and column.
2587
2588         * bytecode/UnlinkedCodeBlock.h:
2589           - Added m_expressionInfoFatPositions in RareData.
2590         (JSC::UnlinkedFunctionExecutable::functionStartColumn):
2591         (JSC::UnlinkedCodeBlock::shrinkToFit):
2592           - Removed obsoleted m_lineInfo.
2593         * bytecompiler/BytecodeGenerator.cpp:
2594         (JSC::BytecodeGenerator::emitCall): Plumbed line and lineStart through.
2595         (JSC::BytecodeGenerator::emitCallEval): Plumbed line and lineStart through.
2596         (JSC::BytecodeGenerator::emitCallVarargs): Plumbed line and lineStart through.
2597         (JSC::BytecodeGenerator::emitConstruct): Plumbed line and lineStart through.
2598         (JSC::BytecodeGenerator::emitDebugHook): Plumbed lineStart through.
2599         * bytecompiler/BytecodeGenerator.h:
2600         (JSC::BytecodeGenerator::emitNode):
2601         (JSC::BytecodeGenerator::emitNodeInConditionContext):
2602           - Removed obsoleted m_lineInfo.
2603         (JSC::BytecodeGenerator::emitExpressionInfo):
2604           - Plumbed line and lineStart through.
2605           - Compute the line and column to be added to the expression range info.
2606         * bytecompiler/NodesCodegen.cpp:
2607         (JSC::ThrowableExpressionData::emitThrowReferenceError):
2608         (JSC::ResolveNode::emitBytecode):
2609         (JSC::ArrayNode::toArgumentList):
2610         (JSC::BracketAccessorNode::emitBytecode):
2611         (JSC::DotAccessorNode::emitBytecode):
2612         (JSC::NewExprNode::emitBytecode):
2613         (JSC::EvalFunctionCallNode::emitBytecode):
2614         (JSC::FunctionCallValueNode::emitBytecode):
2615         (JSC::FunctionCallResolveNode::emitBytecode):
2616         (JSC::FunctionCallBracketNode::emitBytecode):
2617         (JSC::FunctionCallDotNode::emitBytecode):
2618         (JSC::CallFunctionCallDotNode::emitBytecode):
2619         (JSC::ApplyFunctionCallDotNode::emitBytecode):
2620         (JSC::PostfixNode::emitResolve):
2621         (JSC::PostfixNode::emitBracket):
2622         (JSC::PostfixNode::emitDot):
2623         (JSC::DeleteResolveNode::emitBytecode):
2624         (JSC::DeleteBracketNode::emitBytecode):
2625         (JSC::DeleteDotNode::emitBytecode):
2626         (JSC::PrefixNode::emitResolve):
2627         (JSC::PrefixNode::emitBracket):
2628         (JSC::PrefixNode::emitDot):
2629           - Plumbed line and lineStart through the above as needed.
2630
2631         (JSC::UnaryOpNode::emitBytecode):
2632           - Added emission of an ExpressionRangeInfo for the UnaryOp node.
2633
2634         (JSC::BinaryOpNode::emitStrcat):
2635         (JSC::ThrowableBinaryOpNode::emitBytecode):
2636         (JSC::InstanceOfNode::emitBytecode):
2637         (JSC::emitReadModifyAssignment):
2638         (JSC::ReadModifyResolveNode::emitBytecode):
2639         (JSC::AssignResolveNode::emitBytecode):
2640         (JSC::AssignDotNode::emitBytecode):
2641         (JSC::ReadModifyDotNode::emitBytecode):
2642         (JSC::AssignBracketNode::emitBytecode):
2643         (JSC::ReadModifyBracketNode::emitBytecode):
2644           - Plumbed line and lineStart through the above as needed.
2645
2646         (JSC::ConstStatementNode::emitBytecode):
2647         (JSC::EmptyStatementNode::emitBytecode):
2648         (JSC::DebuggerStatementNode::emitBytecode):
2649         (JSC::ExprStatementNode::emitBytecode):
2650         (JSC::VarStatementNode::emitBytecode):
2651         (JSC::IfElseNode::emitBytecode):
2652         (JSC::DoWhileNode::emitBytecode):
2653         (JSC::WhileNode::emitBytecode):
2654         (JSC::ForNode::emitBytecode):
2655         (JSC::ForInNode::emitBytecode):
2656         (JSC::ContinueNode::emitBytecode):
2657         (JSC::BreakNode::emitBytecode):
2658         (JSC::ReturnNode::emitBytecode):
2659         (JSC::WithNode::emitBytecode):
2660         (JSC::SwitchNode::emitBytecode):
2661         (JSC::LabelNode::emitBytecode):
2662         (JSC::ThrowNode::emitBytecode):
2663         (JSC::TryNode::emitBytecode):
2664         (JSC::ProgramNode::emitBytecode):
2665         (JSC::EvalNode::emitBytecode):
2666         (JSC::FunctionBodyNode::emitBytecode):
2667           - Plumbed line and lineStart through the above as needed.
2668
2669         * interpreter/Interpreter.cpp:
2670         (JSC::appendSourceToError):
2671           - Added line and column arguments for expressionRangeForBytecodeOffset().
2672         (JSC::StackFrame::computeLineAndColumn):
2673           - Replaces StackFrame::line() and StackFrame::column().
2674         (JSC::StackFrame::expressionInfo):
2675           - Added line and column arguments.
2676         (JSC::StackFrame::toString):
2677           - Changed to use the new StackFrame::computeLineAndColumn().
2678         (JSC::Interpreter::getStackTrace):
2679           - Added the needed firstLineColumnOffset arg for the StackFrame.
2680
2681         * interpreter/Interpreter.h:
2682         * parser/ASTBuilder.h:
2683         (JSC::ASTBuilder::BinaryOpInfo::BinaryOpInfo):
2684         (JSC::ASTBuilder::AssignmentInfo::AssignmentInfo):
2685         (JSC::ASTBuilder::createResolve):
2686         (JSC::ASTBuilder::createBracketAccess):
2687         (JSC::ASTBuilder::createDotAccess):
2688         (JSC::ASTBuilder::createRegExp):
2689         (JSC::ASTBuilder::createNewExpr):
2690         (JSC::ASTBuilder::createAssignResolve):
2691         (JSC::ASTBuilder::createFunctionExpr):
2692         (JSC::ASTBuilder::createFunctionBody):
2693         (JSC::ASTBuilder::createGetterOrSetterProperty):
2694         (JSC::ASTBuilder::createFuncDeclStatement):
2695         (JSC::ASTBuilder::createBlockStatement):
2696         (JSC::ASTBuilder::createExprStatement):
2697         (JSC::ASTBuilder::createIfStatement):
2698         (JSC::ASTBuilder::createForLoop):
2699         (JSC::ASTBuilder::createForInLoop):
2700         (JSC::ASTBuilder::createVarStatement):
2701         (JSC::ASTBuilder::createReturnStatement):
2702         (JSC::ASTBuilder::createBreakStatement):
2703         (JSC::ASTBuilder::createContinueStatement):
2704         (JSC::ASTBuilder::createTryStatement):
2705         (JSC::ASTBuilder::createSwitchStatement):
2706         (JSC::ASTBuilder::createWhileStatement):
2707         (JSC::ASTBuilder::createDoWhileStatement):
2708         (JSC::ASTBuilder::createLabelStatement):
2709         (JSC::ASTBuilder::createWithStatement):
2710         (JSC::ASTBuilder::createThrowStatement):
2711         (JSC::ASTBuilder::createDebugger):
2712         (JSC::ASTBuilder::createConstStatement):
2713         (JSC::ASTBuilder::appendBinaryExpressionInfo):
2714         (JSC::ASTBuilder::appendUnaryToken):
2715         (JSC::ASTBuilder::unaryTokenStackLastStart):
2716         (JSC::ASTBuilder::unaryTokenStackLastLineStartPosition): Added.
2717         (JSC::ASTBuilder::assignmentStackAppend):
2718         (JSC::ASTBuilder::createAssignment):
2719         (JSC::ASTBuilder::setExceptionLocation):
2720         (JSC::ASTBuilder::makeDeleteNode):
2721         (JSC::ASTBuilder::makeFunctionCallNode):
2722         (JSC::ASTBuilder::makeBinaryNode):
2723         (JSC::ASTBuilder::makeAssignNode):
2724         (JSC::ASTBuilder::makePrefixNode):
2725         (JSC::ASTBuilder::makePostfixNode):.
2726           - Plumbed line, lineStart, and startColumn through the above as needed.
2727
2728         * parser/Lexer.cpp:
2729         (JSC::::currentSourcePtr):
2730         (JSC::::setCode):
2731           - Added tracking for sourceoffset and lineStart.
2732         (JSC::::internalShift):
2733         (JSC::::parseIdentifier):
2734           - Added tracking for lineStart.
2735         (JSC::::parseIdentifierSlowCase):
2736         (JSC::::parseString):
2737           - Added tracking for lineStart.
2738         (JSC::::parseStringSlowCase):
2739         (JSC::::lex):
2740           - Added tracking for sourceoffset.
2741         (JSC::::sourceCode):
2742         * parser/Lexer.h:
2743         (JSC::Lexer::currentOffset):
2744         (JSC::Lexer::currentLineStartOffset):
2745         (JSC::Lexer::setOffset):
2746           - Added tracking for lineStart.
2747         (JSC::Lexer::offsetFromSourcePtr): Added. conversion function.
2748         (JSC::Lexer::sourcePtrFromOffset): Added. conversion function.
2749         (JSC::Lexer::setOffsetFromSourcePtr):
2750         (JSC::::lexExpectIdentifier):
2751           - Added tracking for sourceoffset and lineStart.
2752
2753         * parser/NodeConstructors.h:
2754         (JSC::Node::Node):
2755         (JSC::ResolveNode::ResolveNode):
2756         (JSC::EvalFunctionCallNode::EvalFunctionCallNode):
2757         (JSC::FunctionCallValueNode::FunctionCallValueNode):
2758         (JSC::FunctionCallResolveNode::FunctionCallResolveNode):
2759         (JSC::FunctionCallBracketNode::FunctionCallBracketNode):
2760         (JSC::FunctionCallDotNode::FunctionCallDotNode):
2761         (JSC::CallFunctionCallDotNode::CallFunctionCallDotNode):
2762         (JSC::ApplyFunctionCallDotNode::ApplyFunctionCallDotNode):
2763         (JSC::PostfixNode::PostfixNode):
2764         (JSC::DeleteResolveNode::DeleteResolveNode):
2765         (JSC::DeleteBracketNode::DeleteBracketNode):
2766         (JSC::DeleteDotNode::DeleteDotNode):
2767         (JSC::PrefixNode::PrefixNode):
2768         (JSC::ReadModifyResolveNode::ReadModifyResolveNode):
2769         (JSC::ReadModifyBracketNode::ReadModifyBracketNode):
2770         (JSC::AssignBracketNode::AssignBracketNode):
2771         (JSC::AssignDotNode::AssignDotNode):
2772         (JSC::ReadModifyDotNode::ReadModifyDotNode):
2773         (JSC::AssignErrorNode::AssignErrorNode):
2774         (JSC::WithNode::WithNode):
2775         (JSC::ForInNode::ForInNode):
2776           - Plumbed line and lineStart through the above as needed.
2777         * parser/Nodes.cpp:
2778         (JSC::StatementNode::setLoc): Plumbed lineStart.
2779         (JSC::ScopeNode::ScopeNode): Plumbed lineStart.
2780         (JSC::ProgramNode::ProgramNode): Plumbed startColumn.
2781         (JSC::ProgramNode::create): Plumbed startColumn.
2782         (JSC::EvalNode::create):
2783         (JSC::FunctionBodyNode::FunctionBodyNode): Plumbed startColumn.
2784         (JSC::FunctionBodyNode::create): Plumbed startColumn.
2785         * parser/Nodes.h:
2786         (JSC::Node::startOffset):
2787         (JSC::Node::lineStartOffset): Added.
2788         (JSC::StatementNode::firstLine):
2789         (JSC::StatementNode::lastLine):
2790         (JSC::ThrowableExpressionData::ThrowableExpressionData):
2791         (JSC::ThrowableExpressionData::setExceptionSourceCode):
2792         (JSC::ThrowableExpressionData::divotStartOffset):
2793         (JSC::ThrowableExpressionData::divotEndOffset):
2794         (JSC::ThrowableExpressionData::divotLine):
2795         (JSC::ThrowableExpressionData::divotLineStart):
2796         (JSC::ThrowableSubExpressionData::ThrowableSubExpressionData):
2797         (JSC::ThrowableSubExpressionData::setSubexpressionInfo):
2798         (JSC::ThrowableSubExpressionData::subexpressionDivot):
2799         (JSC::ThrowableSubExpressionData::subexpressionStartOffset):
2800         (JSC::ThrowableSubExpressionData::subexpressionEndOffset):
2801         (JSC::ThrowableSubExpressionData::subexpressionLine):
2802         (JSC::ThrowableSubExpressionData::subexpressionLineStart):
2803         (JSC::ThrowablePrefixedSubExpressionData::ThrowablePrefixedSubExpressionData):
2804         (JSC::ThrowablePrefixedSubExpressionData::setSubexpressionInfo):
2805         (JSC::ThrowablePrefixedSubExpressionData::subexpressionDivot):
2806         (JSC::ThrowablePrefixedSubExpressionData::subexpressionStartOffset):
2807         (JSC::ThrowablePrefixedSubExpressionData::subexpressionEndOffset):
2808         (JSC::ThrowablePrefixedSubExpressionData::subexpressionLine):
2809         (JSC::ThrowablePrefixedSubExpressionData::subexpressionLineStart):
2810         (JSC::ScopeNode::startStartOffset):
2811         (JSC::ScopeNode::startLineStartOffset):
2812         (JSC::ProgramNode::startColumn):
2813         (JSC::EvalNode::startColumn):
2814         (JSC::FunctionBodyNode::startColumn):
2815           - Plumbed line and lineStart through the above as needed.
2816         * parser/Parser.cpp:
2817         (JSC::::Parser):
2818         (JSC::::parseSourceElements):
2819         (JSC::::parseVarDeclarationList):
2820         (JSC::::parseConstDeclarationList):
2821         (JSC::::parseForStatement):
2822         (JSC::::parseBreakStatement):
2823         (JSC::::parseContinueStatement):
2824         (JSC::::parseReturnStatement):
2825         (JSC::::parseThrowStatement):
2826         (JSC::::parseWithStatement):
2827           - Plumbed line and lineStart through the above as needed.
2828         (JSC::::parseFunctionBody):
2829           - Plumbed startColumn.
2830         (JSC::::parseFunctionInfo):
2831         (JSC::::parseFunctionDeclaration):
2832         (JSC::LabelInfo::LabelInfo):
2833         (JSC::::parseExpressionOrLabelStatement):
2834         (JSC::::parseAssignmentExpression):
2835         (JSC::::parseBinaryExpression):
2836         (JSC::::parseProperty):
2837         (JSC::::parseObjectLiteral):
2838         (JSC::::parsePrimaryExpression):
2839         (JSC::::parseMemberExpression):
2840         (JSC::::parseUnaryExpression):
2841           - Plumbed line, lineStart, startColumn through the above as needed.
2842         * parser/Parser.h:
2843         (JSC::Parser::next):
2844         (JSC::Parser::nextExpectIdentifier):
2845         (JSC::Parser::tokenStart):
2846         (JSC::Parser::tokenColumn):
2847         (JSC::Parser::tokenEnd):
2848         (JSC::Parser::tokenLineStart):
2849         (JSC::Parser::lastTokenLine):
2850         (JSC::Parser::lastTokenLineStart):
2851         (JSC::::parse):
2852         * parser/ParserTokens.h:
2853         (JSC::JSTokenLocation::JSTokenLocation):
2854           - Plumbed lineStart.
2855         (JSC::JSTokenLocation::lineStartPosition):
2856         (JSC::JSTokenLocation::startPosition):
2857         (JSC::JSTokenLocation::endPosition):
2858         * parser/SourceCode.h:
2859         (JSC::SourceCode::SourceCode):
2860         (JSC::SourceCode::startColumn):
2861         (JSC::makeSource):
2862         (JSC::SourceCode::subExpression):
2863         * parser/SourceProvider.cpp: delete old code.
2864         * parser/SourceProvider.h: delete old code.
2865         * parser/SourceProviderCacheItem.h:
2866         (JSC::SourceProviderCacheItem::closeBraceToken):
2867         (JSC::SourceProviderCacheItem::SourceProviderCacheItem):
2868           - Plumbed lineStart.
2869         * parser/SyntaxChecker.h:
2870         (JSC::SyntaxChecker::makeFunctionCallNode):
2871         (JSC::SyntaxChecker::makeAssignNode):
2872         (JSC::SyntaxChecker::makePrefixNode):
2873         (JSC::SyntaxChecker::makePostfixNode):
2874         (JSC::SyntaxChecker::makeDeleteNode):
2875         (JSC::SyntaxChecker::createResolve):
2876         (JSC::SyntaxChecker::createBracketAccess):
2877         (JSC::SyntaxChecker::createDotAccess):
2878         (JSC::SyntaxChecker::createRegExp):
2879         (JSC::SyntaxChecker::createNewExpr):
2880         (JSC::SyntaxChecker::createAssignResolve):
2881         (JSC::SyntaxChecker::createFunctionExpr):
2882         (JSC::SyntaxChecker::createFunctionBody):
2883         (JSC::SyntaxChecker::createFuncDeclStatement):
2884         (JSC::SyntaxChecker::createForInLoop):
2885         (JSC::SyntaxChecker::createReturnStatement):
2886         (JSC::SyntaxChecker::createBreakStatement):
2887         (JSC::SyntaxChecker::createContinueStatement):
2888         (JSC::SyntaxChecker::createWithStatement):
2889         (JSC::SyntaxChecker::createLabelStatement):
2890         (JSC::SyntaxChecker::createThrowStatement):
2891         (JSC::SyntaxChecker::createGetterOrSetterProperty):
2892         (JSC::SyntaxChecker::appendBinaryExpressionInfo):
2893         (JSC::SyntaxChecker::operatorStackPop):
2894           - Made SyntaxChecker prototype changes to match ASTBuilder due to new
2895             args added for plumbing line, lineStart, and startColumn.
2896         * runtime/CodeCache.cpp:
2897         (JSC::CodeCache::generateBytecode):
2898         (JSC::CodeCache::getCodeBlock):
2899           - Plumbed startColumn.
2900         * runtime/Executable.cpp:
2901         (JSC::FunctionExecutable::FunctionExecutable):
2902         (JSC::ProgramExecutable::compileInternal):
2903         (JSC::FunctionExecutable::produceCodeBlockFor):
2904         (JSC::FunctionExecutable::fromGlobalCode):
2905           - Plumbed startColumn.
2906         * runtime/Executable.h:
2907         (JSC::ScriptExecutable::startColumn):
2908         (JSC::ScriptExecutable::recordParse):
2909         (JSC::FunctionExecutable::create):
2910           - Plumbed startColumn.
2911
2912 2013-07-08  Carlos Garcia Campos  <cgarcia@igalia.com>
2913
2914         Unreviewed. Fix make distcheck.
2915
2916         * GNUmakefile.list.am: Add missing header files.
2917
2918 2013-07-04  Patrick Gansterer  <paroga@webkit.org>
2919
2920         [CMake] Add generation of JITStubs for x86_64 MSVC
2921         https://bugs.webkit.org/show_bug.cgi?id=116666
2922
2923         Reviewed by Laszlo Gombos.
2924
2925         Also move the generation for ARM CPU into the CMakeLists.txt,
2926         since it's compiler specific and not dedicated to Windows CE.
2927
2928         * CMakeLists.txt:
2929         * PlatformWinCE.cmake: Removed.
2930
2931 2013-07-04  Patrick Gansterer  <paroga@webkit.org>
2932
2933         [CMake] Add STATICALLY_LINKED_WITH_WTF to JavaScriptCore project
2934         https://bugs.webkit.org/show_bug.cgi?id=118120
2935
2936         Reviewed by Gyuyoung Kim.
2937
2938         Since WTF is a static library linked to JavaScriptCore on all CMake ports
2939         we need to define STATICALLY_LINKED_WITH_WTF for all of them.
2940         This makes only a difference for Windows, since WTF_EXPORT and WTF_IMPORT
2941         are the same on all other platforms.
2942
2943         * CMakeLists.txt:
2944
2945 2013-07-02  Mark Hahnenberg  <mhahnenberg@apple.com>
2946
2947         Replace RELEASE_ASSERT with ASSERT in CodeBlock:: bytecodeOffsetForCallAtIndex
2948         https://bugs.webkit.org/show_bug.cgi?id=118316
2949
2950         Reviewed by Geoffrey Garen.
2951
2952         This is causing some crashiness in release builds. We should replace it with an ASSERT 
2953         until we track down all the places that need fixing in bug 118315.
2954
2955         * bytecode/CodeBlock.h:
2956         (JSC::CodeBlock::bytecodeOffsetForCallAtIndex):
2957
2958 2013-07-02  Brent Fulgham  <bfulgham@apple.com>
2959
2960         [Windows] Unreviewed build correction for 'DebugSuffix' target.
2961
2962         * JavaScriptCore.vcxproj/LLInt/LLIntAssembly/LLIntAssembly.vcxproj: Must pass the
2963         DEBUGSUFFIX definition to the nmake instance to be available during script processing.
2964
2965 2013-07-01  Sergio Correia  <sergio.correia@openbossa.org>
2966
2967         [JSC]: Fix maybe-uninitialized gcc 4.8 warning in DFGSpeculativeJIT.cpp
2968         https://bugs.webkit.org/show_bug.cgi?id=118278
2969
2970         Reviewed by Filip Pizlo.
2971
2972         * dfg/DFGSpeculativeJIT.cpp:
2973         (JSC::DFG::SpeculativeJIT::compilePutByValForIntTypedArray):
2974         Initialize valueGPR with InvalidGPRReg.
2975
2976 2013-07-01  Csaba Osztrogon√°c  <ossy@webkit.org>
2977
2978         Fix cast-align warnings in JavaScriptCore/heap/HandleBlockInlines.h
2979         https://bugs.webkit.org/show_bug.cgi?id=118242
2980
2981         Reviewed by Mark Hahnenberg.
2982
2983         * heap/HandleBlockInlines.h:
2984         (JSC::HandleBlock::nodes):
2985
2986 2013-06-29  Andreas Kling  <akling@apple.com>
2987
2988         Follow-up to r152206: also update HashFlags8BitBuffer in the LLInt.
2989
2990         * llint/LowLevelInterpreter.asm:
2991
2992 2013-06-28  Andreas Kling  <akling@apple.com>
2993
2994         Un-crashify JSC tests on debug bots after Anders had his way with StringImpl.
2995
2996         * llint/LLIntData.cpp:
2997         (JSC::LLInt::Data::performAssertions):
2998
2999 2013-06-28  Anders Carlsson  <andersca@apple.com>
3000
3001         Remove String::deprecatedCharactersWithNullTermination() and related code
3002         https://bugs.webkit.org/show_bug.cgi?id=118211
3003
3004         Reviewed by Benjamin Poulain.
3005
3006         * API/JSStringRef.cpp:
3007         (JSStringCreateWithCharactersNoCopy):
3008         Update call to StringImpl::createWithoutCopying.
3009
3010 2013-06-27  Timothy Hatcher  <timothy@apple.com>
3011
3012         Notify the debugger about functions created from source code via new Function() or WebCore::JSLazyEventListener.
3013
3014         https://bugs.webkit.org/show_bug.cgi?id=118063
3015
3016         Reviewed by Geoffrey Garen.
3017
3018         * bytecode/UnlinkedCodeBlock.cpp:
3019         (JSC::UnlinkedFunctionExecutable::fromGlobalCode): Call Debugger::sourceParsed.
3020
3021 2013-06-26  Anders Carlsson  <andersca@apple.com>
3022
3023         Add JSStringCreateWithCharactersNoCopy SPI
3024         https://bugs.webkit.org/show_bug.cgi?id=118074
3025         <rdar://problem/14279905>
3026
3027         Reviewed by Geoffrey Garen.
3028
3029         * API/JSStringRef.cpp:
3030         (JSStringCreateWithCharactersNoCopy):
3031         Create a new OpaqueJSString, using the newly added StringImpl::createWithoutCopying function.
3032
3033         * API/JSStringRefPrivate.h: Added.
3034         Add a home for the JSStringCreateWithCharactersNoCopy function.
3035
3036         * API/OpaqueJSString.h:
3037         (OpaqueJSString::OpaqueJSString):
3038         Just call isolatedCopy on the passed in string.
3039
3040         * API/tests/testapi.c:
3041         Add an API test for JSStringCreateWithCharactersNoCopy.
3042
3043         * JavaScriptCore.xcodeproj/project.pbxproj:
3044         Add new files.
3045
3046 2013-06-25  Ryosuke Niwa  <rniwa@webkit.org>
3047
3048         JSString should remember AtomicString
3049         https://bugs.webkit.org/show_bug.cgi?id=117386
3050
3051         Reviewed by Geoffrey Garen.
3052
3053         Added JSValue::toAtomicString and JSString::atomicString. These two functions allow WebCore to update
3054         JSString's m_value to set isAtomic flag and avoid the AtomicStringTable lookups in subsequent attempts
3055         to obtain the AtomicString of the same value.
3056
3057         * runtime/JSCJSValue.h:
3058         * runtime/JSString.h:
3059         (JSC::JSString::atomicString):
3060         (JSC::JSValue::toAtomicString):
3061
3062 2013-06-24  Roger Fong  <roger_fong@apple.com>
3063
3064         Unreviewed. Makefile build fix for AppleWindows.
3065
3066         * JavaScriptCore.vcxproj/JavaScriptCore.make:
3067
3068 2013-06-17  Darin Adler  <darin@apple.com>
3069
3070         Sort all the Xcode project files
3071         https://bugs.webkit.org/show_bug.cgi?id=117696
3072
3073         Reviewed by Anders Carlsson.
3074
3075         * JavaScriptCore.xcodeproj/project.pbxproj: Ran the sort-Xcode-project-file script.
3076
3077 2013-06-21  Mark Lam  <mark.lam@apple.com>
3078
3079         Introducing the VMStackBounds class.
3080         https://bugs.webkit.org/show_bug.cgi?id=117862.
3081
3082         Reviewed by Geoffrey Garen.
3083
3084         - Removed Interpreter::StackPolicy.
3085         - The new VMStackBounds will take over choosing the appropriate stack
3086           size requirements, and invoking the underlying WTF::StackBounds to
3087           to the real bounds check.
3088         - VMStackBounds will now be used universally throughout JSC instead of
3089           WTF::StackBounds.
3090
3091         * JavaScriptCore.xcodeproj/project.pbxproj:
3092         * bytecompiler/BytecodeGenerator.cpp:
3093         (JSC::BytecodeGenerator::BytecodeGenerator):
3094         * bytecompiler/BytecodeGenerator.h:
3095         * interpreter/Interpreter.cpp:
3096         (JSC::Interpreter::execute):
3097         (JSC::Interpreter::executeCall):
3098         (JSC::Interpreter::executeConstruct):
3099         (JSC::Interpreter::prepareForRepeatCall):
3100         * interpreter/Interpreter.h:
3101         (JSC::Interpreter::isInErrorHandlingMode):
3102         * parser/Parser.cpp:
3103         (JSC::::Parser):
3104         * parser/Parser.h:
3105         * runtime/StringRecursionChecker.h:
3106         (JSC::StringRecursionChecker::performCheck):
3107         * runtime/VMStackBounds.h: Added.
3108         (JSC::VMStackBounds::VMStackBounds):
3109         (JSC::VMStackBounds::isSafeToRecurse):
3110         (JSC::VMStackBounds::requiredCapacity):
3111
3112 2013-06-20  Mark Lam  <mark.lam@apple.com>
3113
3114         Change stack capacity requirement to be more reasonable.
3115         https://bugs.webkit.org/show_bug.cgi?id=117801.
3116
3117         Reviewed by Geoffrey Garen.
3118
3119         Previously, the requiredStack in StackPolicy::StackPolicy() was set to
3120         to a high value like 256K to reduce the chances of encountering an
3121         undetected stack overflow in a scenario where we have a combination of
3122         deeply nested divs and a large amount recursive re-entries into the JSGlobalData.
3123
3124         However, this high value of requiredStack still does not completely
3125         ensure that we will never encounter an undetected stack overflow. It
3126         only lessens the probability of encountering it.
3127
3128         Secondly, on some platforms, the total stack size can be less than 256K
3129         to start with. Hence, this high value requiredStack renders the JSGlobalData
3130         unuseable on those platforms.
3131
3132         This patch will fix the requiredStack to be more reasonable based on
3133         real world stack usage by the JSGlobalData. We won't (and cannot) try to prevent
3134         undetected stack overflows outside of JSC as well. External code that
3135         do deep recursion (e.g. Documnet::updateLayout()) should do their own
3136         stack checks.
3137
3138         From a previous experiment, we measured the following:
3139
3140         On a debug build on OSX:
3141         1. Stack usage different between recursive calls to interpreter entry:
3142            7744 bytes
3143         On a release build on OSX:
3144         2. Stack usage difference between recursive calls to interpreter entry:
3145            6352 bytes
3146
3147         Using these as a guide, we'll pick the following values for the
3148         StackPolicy:
3149            requiredStack: 32K
3150            errorModeRequiredStack: 16K
3151
3152         The requiredStack is chosen to be 4x the measured usage above. The
3153         additional 3x is a conservative estimate to account for stack space
3154         that may be needed by other native functions called while in the
3155         interpreter.
3156
3157         The errorModeRequiredStack has to be less than the requiredStack or we
3158         won't be able to reenter the interpreter to do error handling work when
3159         an imminent stack overflow is detected. It is assumed that the error
3160         handling code will only do minimal work to allocate an exception and its
3161         stack trace, and not run any arbitrary JS code. As such, it is safe to
3162         allow re-entry into the interpreter with only 2x the measured usage in
3163         this case.
3164
3165         * interpreter/Interpreter.cpp:
3166         (JSC::Interpreter::StackPolicy::StackPolicy):
3167
3168 2013-06-20  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
3169
3170         HashSet: reverse the order of the template arguments at alternate 'find', 'contains' and 'add' methods
3171         https://bugs.webkit.org/show_bug.cgi?id=117830
3172
3173         Reviewed by Anders Carlsson.
3174
3175         The order of the template arguments at HashSet alternate 'find', 'contains' and
3176         'add' methods is reversed so that callers can just pass the translator
3177         and let the compiler deduce input argument type.
3178
3179         * runtime/Identifier.h:
3180         (JSC::IdentifierTable::add):
3181
3182 2013-06-20  Roger Fong  <roger_fong@apple.com>
3183
3184         Make Windows makefile copy build output to a different folder.
3185         <rdar://problem/14219184>.
3186
3187         * JavaScriptCore.vcxproj/JavaScriptCore.make:
3188
3189 2013-06-20  Mark Hahnenberg  <mhahnenberg@apple.com>
3190
3191         Improper deallocation of JSManagedValue causes crashes during autorelease pool draining
3192         https://bugs.webkit.org/show_bug.cgi?id=117840
3193
3194         Reviewed by Geoffrey Garen.
3195
3196         Improperly managing a JSManagedValue can cause a crash when the JSC::Weak inside the 
3197         JSManagedValue is destroyed upon deallocation. We would rather have improperly maintained 
3198         JSManagedValues cause memory leaks than take down the whole app. 
3199
3200         The fix is to use the callback to the JSC::Weak on the destruction of the JSGlobalData so that we 
3201         can safely null it out. This will prevent ~Weak from crashing.
3202
3203         * API/JSManagedValue.mm:
3204         (-[JSManagedValue JSC::JSC::]):
3205         (JSManagedValueHandleOwner::finalize):
3206         * API/tests/testapi.mm: Added a test that crashed prior to this fix due to a leaked 
3207         managed reference. Also fixed a small style nit I noticed in another test.
3208
3209 2013-06-18  Oliver Hunt  <oliver@apple.com>
3210
3211         Going to google.com/trends causes a crash
3212         https://bugs.webkit.org/show_bug.cgi?id=117602
3213
3214         Reviewed by Geoffrey Garen.
3215
3216         When handling op_throw, etc we need to flush the variables and arguments
3217         for the entire inline stack, not just the top frame.
3218
3219         * dfg/DFGByteCodeParser.cpp:
3220         (JSC::DFG::ByteCodeParser::flushAllArgumentsAndCapturedVariablesInInlineStack):
3221         (JSC::DFG::ByteCodeParser::parseBlock):
3222
3223 2013-06-18  Roger Fong  <roger_fong@apple.com>
3224
3225         Replace tools32 folder with tools and update WebKit Windows solution accordingly.
3226         <rdar://problem/14118143>.
3227
3228         Rubberstamped by Brent Fulgham.
3229
3230         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
3231         * JavaScriptCore.vcxproj/JavaScriptCoreDebug.props:
3232         * JavaScriptCore.vcxproj/JavaScriptCoreDebugCFLite.props:
3233         * JavaScriptCore.vcxproj/JavaScriptCoreGenerated.vcxproj:
3234         * JavaScriptCore.vcxproj/JavaScriptCoreGeneratedDebug.props:
3235         * JavaScriptCore.vcxproj/JavaScriptCoreGeneratedProduction.props:
3236         * JavaScriptCore.vcxproj/JavaScriptCoreGeneratedRelease.props:
3237         * JavaScriptCore.vcxproj/JavaScriptCorePostBuild.cmd:
3238         * JavaScriptCore.vcxproj/JavaScriptCoreProduction.props:
3239         * JavaScriptCore.vcxproj/JavaScriptCoreRelease.props:
3240         * JavaScriptCore.vcxproj/JavaScriptCoreReleaseCFLite.props:
3241         * JavaScriptCore.vcxproj/LLInt/LLIntAssembly/LLIntAssembly.vcxproj:
3242         * JavaScriptCore.vcxproj/LLInt/LLIntDesiredOffsets/LLIntDesiredOffsets.vcxproj:
3243         * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractor.vcxproj:
3244         * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractorDebug.props:
3245         * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractorProduction.props:
3246         * JavaScriptCore.vcxproj/LLInt/LLIntOffsetsExtractor/LLIntOffsetsExtractorRelease.props:
3247         * JavaScriptCore.vcxproj/jsc/jsc.vcxproj:
3248         * JavaScriptCore.vcxproj/jsc/jscDebug.props:
3249         * JavaScriptCore.vcxproj/jsc/jscProduction.props:
3250         * JavaScriptCore.vcxproj/jsc/jscRelease.props:
3251         * JavaScriptCore.vcxproj/testRegExp/testRegExp.vcxproj:
3252         * JavaScriptCore.vcxproj/testRegExp/testRegExpDebug.props:
3253         * JavaScriptCore.vcxproj/testRegExp/testRegExpProduction.props:
3254         * JavaScriptCore.vcxproj/testRegExp/testRegExpRelease.props:
3255         * JavaScriptCore.vcxproj/testapi/testapi.vcxproj:
3256         * JavaScriptCore.vcxproj/testapi/testapiDebug.props:
3257         * JavaScriptCore.vcxproj/testapi/testapiDebugCFLite.props:
3258         * JavaScriptCore.vcxproj/testapi/testapiProduction.props:
3259         * JavaScriptCore.vcxproj/testapi/testapiRelease.props:
3260         * JavaScriptCore.vcxproj/testapi/testapiReleaseCFLite.props:
3261
3262 2013-06-17  Roger Fong  <roger_fong@apple.com>
3263
3264         Modify Windows makefiles to copy some bin output into Program Files.
3265         https://bugs.webkit.org/show_bug.cgi?id=117714.
3266         <rdar://problem/14179054>
3267
3268         Reviewed by Brent Fulgham.
3269
3270         * JavaScriptCore.vcxproj/JavaScriptCore.make:
3271
3272 2013-06-14  Ryosuke Niwa  <rniwa@webkit.org>
3273
3274         Function names on Object.prototype should be common identifiers
3275         https://bugs.webkit.org/show_bug.cgi?id=117614
3276
3277         Reviewed by Darin Adler.
3278
3279         Patch written by Sam Weinig. Make Object's prototype function names common identififers since they're used frequently.
3280
3281         * runtime/CommonIdentifiers.h:
3282         * runtime/FunctionConstructor.cpp:
3283         (JSC::constructFunction):
3284         * runtime/JSGlobalObject.cpp:
3285         (JSC::JSGlobalObject::reset):
3286         * runtime/JSObject.h:
3287         * runtime/ObjectPrototype.cpp:
3288         (JSC::ObjectPrototype::finishCreation):
3289         * runtime/StringPrototype.cpp:
3290         (JSC::StringPrototype::finishCreation):
3291
3292 2013-06-13  Ryosuke Niwa  <rniwa@webkit.org>
3293
3294         Remove LiteralIdentifierTable
3295         https://bugs.webkit.org/show_bug.cgi?id=117613
3296
3297         Reviewed by Geoffrey Garen.
3298
3299         Removed LiteralIdentifierTable since it doesn't seem to have any perf. impact now.
3300
3301         * runtime/Identifier.cpp:
3302         (JSC::Identifier::add):
3303
3304 2013-06-12  Conrad Shultz  <conrad_shultz@apple.com>
3305
3306         JSExport header documentation substitutes "semicolon" for "colon"
3307         https://bugs.webkit.org/show_bug.cgi?id=117552
3308
3309         Reviewed by Mark Hahnenberg.
3310
3311         * API/JSExport.h:
3312         Fix a couple typos.
3313
3314 2013-06-10  Raphael Kubo da Costa  <raphael.kubo.da.costa@intel.com>
3315
3316         [JSC] Remove a vestige of wxWidgets support.
3317         https://bugs.webkit.org/show_bug.cgi?id=117419
3318
3319         Reviewed by Benjamin Poulain.
3320
3321         * runtime/JSExportMacros.h: Remove a check for BUILDING_WX__ that
3322         seems to have gone unnoticed when the wxWidgets port was removed.
3323
3324 2013-06-06  Roger Fong  <roger_fong@apple.com>
3325
3326         Stop copying AAS binaries into build folder.
3327         https://bugs.webkit.org/show_bug.cgi?id=117319.
3328
3329         Rubberstamped by Darin Adler.
3330
3331         * JavaScriptCore.vcxproj/JavaScriptCorePreLink.cmd:
3332         * JavaScriptCore.vcxproj/jsc/jscPostBuild.cmd:
3333         * JavaScriptCore.vcxproj/jsc/jscPreLink.cmd:
3334         * JavaScriptCore.vcxproj/testRegExp/testRegExpPostBuild.cmd:
3335         * JavaScriptCore.vcxproj/testRegExp/testRegExpPreLink.cmd:
3336         * JavaScriptCore.vcxproj/testapi/testapiPreLink.cmd:
3337
3338 2013-06-05  Filip Pizlo  <fpizlo@apple.com>
3339
3340         DFG CFA shouldn't filter ArrayModes with ALL_NON_ARRAY_ARRAY_MODES if the speculated type is not SpecArray
3341         https://bugs.webkit.org/show_bug.cgi?id=117279
3342         <rdar://problem/14078025>        
3343
3344         Reviewed by Mark Hahnenberg.
3345
3346         * dfg/DFGAbstractValue.h:
3347         (JSC::DFG::AbstractValue::filterArrayModesByType):
3348
3349 2013-06-05  Michael Saboff  <msaboff@apple.com>
3350
3351         JSC: Crash beneath cti_op_div @ http://gmailblog.blogspot.com
3352         https://bugs.webkit.org/show_bug.cgi?id=117280
3353
3354         Reviewed by Filip Pizlo.
3355
3356         Updated the merging of VariableAccessData nodes in ArgumentPosition lists
3357         to find the unified VariableAccessData node that is the root of the
3358         current node instead of using the current node directly when merging
3359         attributes.
3360         Added new dump code to dump the ArgumentPosition list.
3361
3362         * dfg/DFGArgumentPosition.h:
3363         (JSC::DFG::rgumentPosition::mergeArgumentPredictionAwareness):
3364         (JSC::DFG::ArgumentPosition::mergeArgumentUnboxingAwareness):
3365         (JSC::DFG::ArgumentPosition::dump):
3366         * dfg/DFGGraph.cpp:
3367         (JSC::DFG::Graph::dump):
3368
3369 2013-06-05  Bear Travis  <betravis@adobe.com>
3370
3371         [CSS Exclusions][CSS Shapes] Split CSS Exclusions & Shapes compile & runtime flags
3372         https://bugs.webkit.org/show_bug.cgi?id=117172
3373
3374         Reviewed by Alexandru Chiculita.
3375
3376         Adding the CSS_SHAPES compile flag.
3377
3378         * Configurations/FeatureDefines.xcconfig:
3379
3380 2013-06-05  Balazs Kilvady  <kilvadyb@homejinni.com>
3381
3382         JSC Assertion tests failures on MIPS.
3383         https://bugs.webkit.org/show_bug.cgi?id=116552
3384
3385         Reviewed by Geoffrey Garen.
3386
3387         Fix condition handlig in branchAdd32 implemetations.
3388
3389         * assembler/MacroAssemblerMIPS.h:
3390         (JSC::MacroAssemblerMIPS::branchAdd32):
3391
3392 2013-06-04  Julien Brianceau  <jbrianceau@nds.com>
3393
3394         [sh4] Add floating point absolute function support in baseline JIT.
3395         https://bugs.webkit.org/show_bug.cgi?id=117147
3396