530036f8ec7a0306475db1196542027a6cfd0e5e
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2019-08-14  Yusuke Suzuki  <ysuzuki@apple.com>
2
3         [JSC] Make PAC jump and return more explicit
4         https://bugs.webkit.org/show_bug.cgi?id=200703
5
6         Reviewed by Mark Lam.
7
8         This patch refactors our macro assembler, mainly related to PAC.
9
10         1. Make far-jump explicit by renaming `jump` to `farJump`.
11         2. Remove unused makeTailRecursiveCall and tailRecursiveCall.
12         3. Do not make `ARM64EAssembler::ret` as `retab`. MacroAssemblerARM64E should call `retab` explicitly instead.
13
14         * assembler/ARM64EAssembler.h:
15         (JSC::ARM64EAssembler::ret): Deleted.
16         * assembler/MacroAssembler.h:
17         * assembler/MacroAssemblerARM64.h:
18         (JSC::MacroAssemblerARM64::farJump):
19         (JSC::MacroAssemblerARM64::makeTailRecursiveCall): Deleted.
20         (JSC::MacroAssemblerARM64::tailRecursiveCall): Deleted.
21         * assembler/MacroAssemblerARM64E.h:
22         (JSC::MacroAssemblerARM64E::farJump):
23         (JSC::MacroAssemblerARM64E::ret):
24         * assembler/MacroAssemblerARMv7.h:
25         (JSC::MacroAssemblerARMv7::farJump):
26         (JSC::MacroAssemblerARMv7::relativeTableJump):
27         (JSC::MacroAssemblerARMv7::tailRecursiveCall): Deleted.
28         (JSC::MacroAssemblerARMv7::makeTailRecursiveCall): Deleted.
29         * assembler/MacroAssemblerMIPS.h:
30         (JSC::MacroAssemblerMIPS::farJump):
31         (JSC::MacroAssemblerMIPS::tailRecursiveCall): Deleted.
32         (JSC::MacroAssemblerMIPS::makeTailRecursiveCall): Deleted.
33         * assembler/MacroAssemblerX86.h:
34         (JSC::MacroAssemblerX86::farJump):
35         (JSC::MacroAssemblerX86::jump): Deleted.
36         (JSC::MacroAssemblerX86::tailRecursiveCall): Deleted.
37         (JSC::MacroAssemblerX86::makeTailRecursiveCall): Deleted.
38         * assembler/MacroAssemblerX86Common.h:
39         (JSC::MacroAssemblerX86Common::farJump):
40         * assembler/MacroAssemblerX86_64.h:
41         (JSC::MacroAssemblerX86_64::farJump):
42         (JSC::MacroAssemblerX86_64::jump): Deleted.
43         (JSC::MacroAssemblerX86_64::tailRecursiveCall): Deleted.
44         (JSC::MacroAssemblerX86_64::makeTailRecursiveCall): Deleted.
45         * b3/B3LowerMacros.cpp:
46         * b3/testb3_6.cpp:
47         (testInterpreter):
48         * dfg/DFGOSRExitCompilerCommon.cpp:
49         (JSC::DFG::adjustAndJumpToTarget):
50         * dfg/DFGSpeculativeJIT.cpp:
51         (JSC::DFG::SpeculativeJIT::emitSwitchIntJump):
52         (JSC::DFG::SpeculativeJIT::emitSwitchImm):
53         (JSC::DFG::SpeculativeJIT::emitSwitchStringOnString):
54         * dfg/DFGSpeculativeJIT64.cpp:
55         (JSC::DFG::SpeculativeJIT::compile):
56         * dfg/DFGThunks.cpp:
57         (JSC::DFG::osrExitGenerationThunkGenerator):
58         (JSC::DFG::osrEntryThunkGenerator):
59         * jit/CCallHelpers.h:
60         (JSC::CCallHelpers::jumpToExceptionHandler):
61         * jit/JIT.cpp:
62         (JSC::JIT::emitEnterOptimizationCheck):
63         * jit/JITOpcodes.cpp:
64         (JSC::JIT::emit_op_catch):
65         (JSC::JIT::emit_op_switch_imm):
66         (JSC::JIT::emit_op_switch_char):
67         (JSC::JIT::emit_op_switch_string):
68         (JSC::JIT::emitSlow_op_loop_hint):
69         * jit/JITOpcodes32_64.cpp:
70         (JSC::JIT::emit_op_catch):
71         (JSC::JIT::emit_op_switch_imm):
72         (JSC::JIT::emit_op_switch_char):
73         (JSC::JIT::emit_op_switch_string):
74         * jit/ThunkGenerators.cpp:
75         (JSC::slowPathFor):
76         (JSC::virtualThunkFor):
77         * llint/LLIntThunks.cpp:
78         (JSC::LLInt::generateThunkWithJumpTo):
79         * wasm/WasmBinding.cpp:
80         (JSC::Wasm::wasmToWasm):
81         * wasm/WasmThunks.cpp:
82         (JSC::Wasm::throwExceptionFromWasmThunkGenerator):
83         * wasm/js/WasmToJS.cpp:
84         (JSC::Wasm::emitThrowWasmToJSException):
85         * yarr/YarrJIT.cpp:
86         (JSC::Yarr::YarrGenerator::loadFromFrameAndJump):
87
88 2019-08-14  Joseph Pecoraro  <pecoraro@apple.com>
89
90         Web Inspector: Remove bad semicolon in generation of ObjC methods
91         https://bugs.webkit.org/show_bug.cgi?id=200655
92
93         Reviewed by Devin Rousso.
94
95         * inspector/scripts/codegen/generate_objc_frontend_dispatcher_implementation.py:
96         (ObjCFrontendDispatcherImplementationGenerator._generate_event_dispatcher_implementations):
97         Do not include a semicolon in the method implementation.
98
99         * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
100         * inspector/scripts/tests/generic/expected/enum-values.json-result:
101         * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
102         * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
103         * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
104         Updated results.
105
106 2019-08-13  Saam Barati  <sbarati@apple.com>
107
108         Add a way to opt out of kern TCSM for layout tests
109         https://bugs.webkit.org/show_bug.cgi?id=200649
110         <rdar://problem/51304923>
111
112         Reviewed by Alexey Proskuryakov.
113
114         * assembler/CPU.cpp:
115         (JSC::isKernTCSMAvailable):
116         * runtime/Options.h:
117
118 2019-08-13  Sam Weinig  <weinig@apple.com>
119
120         Rename StringBuilder::append(UChar32) to StringBuilder::appendCharacter(UChar32) to avoid accidental change in behavior when replacing append with flexibleAppend
121         https://bugs.webkit.org/show_bug.cgi?id=200675
122
123         Reviewed by Darin Adler.
124
125         * yarr/YarrParser.h:
126         (JSC::Yarr::Parser::tryConsumeGroupName):
127         (JSC::Yarr::Parser::tryConsumeUnicodePropertyExpression):
128         Update for rename from StringBuilder::append(UChar32) to StringBuilder::appendCharacter(UChar32).
129
130 2019-08-13  Mark Lam  <mark.lam@apple.com>
131
132         Add phase, block, and node numbers to left margin of DFG graph dumps.
133         https://bugs.webkit.org/show_bug.cgi?id=200693
134
135         Reviewed by Saam Barati.
136
137         When scrolling through the DFG graph dumps, it's easy to get lost as to which phase
138         or block one is looking at, especially if the blocks are long.  This patch adds
139         node index, block number, and phase number on the left margin of the dumps.
140         Here's a sample:
141
142                53:     %Bd:Function                   = 0x1079fd960:[Function, {}, NonArray, Proto:0x1079d8000, Leaf]
143                53:     %Bf:Function                   = 0x1079b0700:[Function, {name:100, prototype:101, length:102, stackTraceLimit:103}, NonArray, Proto:0x1079d8000, Leaf]
144                53:     %Bj:Function                   = 0x1079fd5e0:[Function, {name:100, length:101, toString:102, apply:103, call:104, bind:105, Symbol.hasInstance:106, caller:107, arguments:108, constructor:109}, NonArray, Proto:0x1079c0000, Leaf]
145                53:     %CV:JSGlobalLexicalEnvironment = 0x1079fd6c0:[JSGlobalLexicalEnvironment, {}, NonArray, Leaf]
146
147                53: Phase liveness analysis changed the IR.
148
149                54: Beginning DFG phase OSR availability analysis.
150                54: Before OSR availability analysis:
151
152                54: DFG for foo#DXMNag:[0x1079a4850->0x1079a4130->0x1079c7600, DFGFunctionCall, 204 (NeverInline)]:
153                54:   Fixpoint state: FixpointConverged; Form: SSA; Unification state: GloballyUnified; Ref count state: ExactRefCount
154                54:   Argument formats for entrypoint index: 0 : FlushedJSValue, FlushedCell, FlushedJSValue
155
156              0 54: Block #0 (bc#0): (OSR target)
157              0 54:   Execution count: 1.000000
158              0 54:   Predecessors:
159              0 54:   Successors:
160              0 54:   Dominated by: #0
161              0 54:   Dominates: #0
162              0 54:   Dominance Frontier: 
163              0 54:   Iterated Dominance Frontier: 
164              0 54:   Backwards dominates by: #root #0
165              0 54:   Backwards dominates: #0
166              0 54:   Control equivalent to: #0
167              0 54:   States: StructuresAreWatched
168              0 54:   Live:
169              0 54:   Values 
170           0  0 54:   53:< 1:-> JSConstant(JS|UseAsOther, Other, Null, bc#0, ExitValid)
171           1  0 54:   64:< 2:-> JSConstant(JS|UseAsOther, NonBoolInt32, Int32: 10, bc#0, ExitValid)
172           2  0 54:    3:< 5:-> JSConstant(JS|PureInt, Other, Undefined, bc#0, ExitValid)
173           3  0 54:   32:< 1:-> JSConstant(JS|UseAsOther, Bool, False, bc#0, ExitValid)
174           4  0 54:   19:< 2:-> JSConstant(JS|UseAsOther, OtherObj, Weak:Object: 0x1079d4000 with butterfly 0x0 (Structure %CV:JSGlobalLexicalEnvironment), StructureID: 31423, bc#0, ExitValid)
175
176         The numbers in the left margin before the ':' are node index (i.e. the index of the
177         node in the block, not to be confused with node->index() which is the node ID), block
178         number, and phase number respectively.  Now, we can scroll thru the dumps quickly
179         and tell at a glance when we've scrolled passed the end of a phase, or block.
180         These sets of numbers can also serve as a positional marker that we can search for
181         to return to a node in the dump after scrolling away.
182
183         Currently, these numbers are only added to the DFG part.  The FTL (from lowering
184         to B3 onwards) does not have this feature yet.
185
186         * dfg/DFGDesiredWatchpoints.cpp:
187         (JSC::DFG::DesiredWatchpoints::dumpInContext const):
188         * dfg/DFGDesiredWatchpoints.h:
189         * dfg/DFGGraph.cpp:
190         (JSC::DFG::Graph::dumpCodeOrigin):
191         (JSC::DFG::Graph::dump):
192         (JSC::DFG::Graph::dumpBlockHeader):
193         (JSC::DFG::Prefix::dump const):
194         * dfg/DFGGraph.h:
195         (JSC::DFG::Prefix::Prefix):
196         (JSC::DFG::Prefix::clearBlockIndex):
197         (JSC::DFG::Prefix::clearNodeIndex):
198         (JSC::DFG::Prefix::enable):
199         (JSC::DFG::Prefix::disable):
200         (JSC::DFG::Graph::prefix):
201         (JSC::DFG::Graph::nextPhase):
202         * dfg/DFGPhase.cpp:
203         (JSC::DFG::Phase::beginPhase):
204         * dfg/DFGPhase.h:
205         (JSC::DFG::runAndLog):
206         * dfg/DFGPlan.cpp:
207         (JSC::DFG::Plan::compileInThreadImpl):
208         * dfg/DFGValueRepReductionPhase.cpp:
209         (JSC::DFG::ValueRepReductionPhase::convertValueRepsToDouble):
210
211 2019-08-13  Michael Saboff  <msaboff@apple.com>
212
213         REGRESSION (r248533): JSC Command - Need to initializeMainThread() before processing config file
214         https://bugs.webkit.org/show_bug.cgi?id=200677
215
216         Reviewed by Mark Lam.
217
218         We need to initialize the main thread before calling processConfigFile() since it uses RefCounted objects
219         which have "is main thread" ASSERTS.
220
221         * jsc.cpp:
222         (jscmain):
223
224 2019-08-13  Devin Rousso  <drousso@apple.com>
225
226         Web Inspector: Styles: show @supports CSS groupings
227         https://bugs.webkit.org/show_bug.cgi?id=200419
228         <rdar://problem/53971948>
229
230         Reviewed by Joseph Pecoraro.
231
232         * inspector/protocol/CSS.json:
233         Rename `CSSMedia` to `Grouping` and remove the `sourceLine` value, as it was never populated
234         and wasn't used by Web Inspector.
235
236         * inspector/scripts/codegen/objc_generator_templates.py:
237         * inspector/scripts/codegen/generate_objc_header.py:
238         (ObjCHeaderGenerator.generate_output):
239         Add support for including files at the end of <WebInspector/RWIProtocol.h> for compatibility
240         statements so that changes to the Web Inspector protocol don't break other clients.
241
242 2019-08-13  Joseph Pecoraro  <pecoraro@apple.com>
243
244         JSContext Inspector: Basic CommandLineAPI doesn't work
245         https://bugs.webkit.org/show_bug.cgi?id=200659
246         <rdar://problem/54245476>
247
248         Reviewed by Brian Burg.
249
250         * inspector/InjectedScriptSource.js:
251         (BasicCommandLineAPI):
252         Use `method` directly since it already has been setup nicely and doesn't
253         need to be bound. Technically this allows someone to add properties to
254         the CommandLineAPI methods in basic mode (`dir.property = 1`) but that
255         seems harmless.
256
257 2019-08-12  Sam Weinig  <weinig@apple.com>
258
259         Replace multiparameter overloads of append() in StringBuilder as a first step toward standardizinging on the flexibleAppend() implementation
260         https://bugs.webkit.org/show_bug.cgi?id=200614
261
262         Reviewed by Darin Adler.
263
264         Renames StringBuilder::append(const LChar*, unsigned), StringBuilder::append(const UChar*, unsigned) and 
265         StringBuilder::append(const char*, unsigned) to StringBuilder::appendCharacters(...).
266         
267         Renames StringBuilder::append(const String& string, unsigned offset, unsigned length) to 
268         StringBuilder::appendSubstring(...).
269
270         * dfg/DFGStrengthReductionPhase.cpp:
271         (JSC::DFG::StrengthReductionPhase::handleNode):
272         * runtime/ConfigFile.cpp:
273         (JSC::ConfigFile::parse):
274         * runtime/LiteralParser.cpp:
275         (JSC::LiteralParser<CharType>::Lexer::lexStringSlow):
276         * tools/FunctionOverrides.cpp:
277         (JSC::parseClause):
278         Update for renames.
279
280 2019-08-12  Adrian Perez de Castro  <aperez@igalia.com>
281
282         [WPE][GTK] Fix building without unified sources
283         https://bugs.webkit.org/show_bug.cgi?id=200641
284
285         Reviewed by Žan Doberšek.
286
287         * b3/B3PatchpointSpecial.cpp: Add missing inclusion of the B3ProcedureInlines.h header.
288         * heap/SlotVisitor.cpp: Add missing inclusion of the BlockDirectoryInlines.h header.
289
290 2019-08-12  Yusuke Suzuki  <ysuzuki@apple.com>
291
292         [WTF][JSC] Make JSC and WTF aggressively-fast-malloced
293         https://bugs.webkit.org/show_bug.cgi?id=200611
294
295         Reviewed by Saam Barati.
296
297         This patch aggressively puts many classes into FastMalloc. In JSC side, we grep `std::make_unique` etc. to find potentially system-malloc-allocated classes.
298         After this patch, all the JSC related allocations in JetStream2 cli is done from bmalloc. In the future, it would be nice that we add `WTF::makeUnique<T>` helper
299         function and throw a compile error if `T` is not FastMalloc annotated[1].
300
301         Putting WebKit classes in FastMalloc has many benefits.
302
303         1. Simply, it is fast.
304         2. vmmap can tell the amount of memory used for WebKit.
305         3. bmalloc can isolate WebKit memory allocation from the rest of the world. This is useful since we can know more about what component is corrupting the memory
306            from the memory corruption crash.
307
308         [1]: https://bugs.webkit.org/show_bug.cgi?id=200620
309
310         * API/ObjCCallbackFunction.mm:
311         * assembler/AbstractMacroAssembler.h:
312         * b3/B3PhiChildren.h:
313         * b3/air/AirAllocateRegistersAndStackAndGenerateCode.h:
314         * b3/air/AirDisassembler.h:
315         * bytecode/AccessCaseSnippetParams.h:
316         * bytecode/CallVariant.h:
317         * bytecode/DeferredSourceDump.h:
318         * bytecode/ExecutionCounter.h:
319         * bytecode/GetByIdStatus.h:
320         * bytecode/GetByIdVariant.h:
321         * bytecode/InByIdStatus.h:
322         * bytecode/InByIdVariant.h:
323         * bytecode/InstanceOfStatus.h:
324         * bytecode/InstanceOfVariant.h:
325         * bytecode/PutByIdStatus.h:
326         * bytecode/PutByIdVariant.h:
327         * bytecode/ValueProfile.h:
328         * dfg/DFGAbstractInterpreter.h:
329         * dfg/DFGByteCodeParser.cpp:
330         (JSC::DFG::ByteCodeParser::newVariableAccessData):
331         * dfg/DFGFlowIndexing.h:
332         * dfg/DFGFlowMap.h:
333         * dfg/DFGLiveCatchVariablePreservationPhase.cpp:
334         (JSC::DFG::LiveCatchVariablePreservationPhase::newVariableAccessData):
335         * dfg/DFGMaximalFlushInsertionPhase.cpp:
336         (JSC::DFG::MaximalFlushInsertionPhase::newVariableAccessData):
337         * dfg/DFGOSRExit.h:
338         * dfg/DFGSpeculativeJIT.h:
339         * dfg/DFGVariableAccessData.h:
340         * disassembler/ARM64/A64DOpcode.h:
341         * inspector/remote/socket/RemoteInspectorMessageParser.h:
342         * inspector/remote/socket/RemoteInspectorSocket.h:
343         * inspector/remote/socket/RemoteInspectorSocketEndpoint.h:
344         * jit/PCToCodeOriginMap.h:
345         * runtime/BasicBlockLocation.h:
346         * runtime/DoublePredictionFuzzerAgent.h:
347         * runtime/JSRunLoopTimer.h:
348         * runtime/PromiseDeferredTimer.h:
349         (JSC::PromiseDeferredTimer::create): PromiseDeferredTimer should be allocated as `Ref<>` instead of `std::unique_ptr` since it is inheriting ThreadSafeRefCounted<>.
350         Holding such a class with std::unique_ptr could lead to potentially dangerous operations (like, someone holds it with Ref<> while it is deleted by std::unique_ptr<>).
351         * runtime/RandomizingFuzzerAgent.h:
352         * runtime/SymbolTable.h:
353         * runtime/VM.cpp:
354         (JSC::VM::VM):
355         * runtime/VM.h:
356         * tools/JSDollarVM.cpp:
357         * tools/SigillCrashAnalyzer.cpp:
358         * wasm/WasmFormat.h:
359         * wasm/WasmMemory.cpp:
360         * wasm/WasmSignature.h:
361         * yarr/YarrJIT.h:
362
363 2019-08-12  Chris Dumez  <cdumez@apple.com>
364
365         Add threading assertions to RefCounted
366         https://bugs.webkit.org/show_bug.cgi?id=200507
367
368         Reviewed by Ryosuke Niwa.
369
370         * dfg/DFGPlan.cpp:
371         (JSC::DFG::Plan::Plan):
372         Disable threading assertions for DFG::Plan::m_inlineCallFrames while the JSC team
373         investigates.
374
375 2019-08-12  Chris Dumez  <cdumez@apple.com>
376
377         Unreviewed, rolling out r248525.
378
379         Revert new threading assertions while I work on fixing the
380         issues they exposed
381
382         Reverted changeset:
383
384         "Add threading assertions to RefCounted"
385         https://bugs.webkit.org/show_bug.cgi?id=200507
386         https://trac.webkit.org/changeset/248525
387
388 2019-08-11  Chris Dumez  <cdumez@apple.com>
389
390         Add threading assertions to RefCounted
391         https://bugs.webkit.org/show_bug.cgi?id=200507
392
393         Reviewed by Ryosuke Niwa.
394
395         * dfg/DFGPlan.cpp:
396         (JSC::DFG::Plan::Plan):
397         Disable threading assertions for DFG::Plan::m_inlineCallFrames while the JSC team
398         investigates.
399
400 2019-08-09  Yusuke Suzuki  <ysuzuki@apple.com>
401
402         Universal XSS in JSObject::putInlineSlow and JSValue::putToPrimitive
403         https://bugs.webkit.org/show_bug.cgi?id=199864
404
405         Reviewed by Saam Barati.
406
407         Our JSObject::put implementation is not correct in term of the spec. Our [[Put]] implementation is something like this.
408
409             JSObject::put(object):
410                 if (can-do-fast-path(object))
411                     return fast-path(object);
412                 // slow-path
413                 do {
414                     object-put-check-and-setter-calls(object); // (1)
415                     object = object->prototype;
416                 } while (is-object(object));
417                 return do-put(object);
418
419         Since JSObject::put is registered in the methodTable, the derived classes can override it. Some of classes are adding
420         extra checks to this put.
421
422             Derived::put(object):
423                 if (do-extra-check(object))
424                     fail
425                 return JSObject::put(object)
426
427         The problem is that Derived::put is only called when the |this| object is the Derived class. When traversing [[Prototype]] in
428         JSObject::put, at (1), we do not perform the extra checks added in Derived::put even if `object` is Derived one. This means that
429         we skip the check.
430
431         Currently, JSObject::put and WebCore checking mechanism are broken. JSObject::put should call getOwnPropertySlot at (1) to
432         perform the additional checks. This behavior is matching against the spec. However, currently, our JSObject::getOwnPropertySlot
433         does not propagate setter information. This is required to cache cacheable [[Put]] at (1) for CustomValue, CustomAccessor, and
434         Accessors. We also need to reconsider how to integrate static property setters to this mechanism. So, basically, this involves
435         large refactoring to renew our JSObject::put and JSObject::getOwnPropertySlot.
436
437         To work-around for now, we add a new TypeInfo flag, HasPutPropertySecurityCheck . And adding this flag to DOM objects
438         that implements the addition checks. We also add doPutPropertySecurityCheck method hook to perform the check in JSObject.
439         When we found this flag at (1), we perform doPutPropertySecurityCheck to properly perform the checks.
440
441         Since our JSObject::put code is old and it does not match against the spec now, we should refactor it largely. This is tracked separately in [1].
442
443         [1]: https://bugs.webkit.org/show_bug.cgi?id=200562
444
445         * runtime/ClassInfo.h:
446         * runtime/JSCJSValue.cpp:
447         (JSC::JSValue::putToPrimitive):
448         * runtime/JSCell.cpp:
449         (JSC::JSCell::doPutPropertySecurityCheck):
450         * runtime/JSCell.h:
451         * runtime/JSObject.cpp:
452         (JSC::JSObject::putInlineSlow):
453         (JSC::JSObject::getOwnPropertyDescriptor):
454         * runtime/JSObject.h:
455         (JSC::JSObject::doPutPropertySecurityCheck):
456         * runtime/JSTypeInfo.h:
457         (JSC::TypeInfo::hasPutPropertySecurityCheck const):
458
459 2019-08-08  Per Arne Vollan  <pvollan@apple.com>
460
461         [Win] Fix internal build
462         https://bugs.webkit.org/show_bug.cgi?id=200519
463
464         Reviewed by Alex Christensen.
465
466         The script 'generate-js-builtins.py' cannot be found when building WebCore. Copy the JavaScriptCore Scripts
467         folder after building JSC.
468
469         * JavaScriptCore.vcxproj/JavaScriptCore.proj:
470
471 2019-08-08  Devin Rousso  <drousso@apple.com>
472
473         Web Inspector: Page: don't allow the domain to be disabled
474         https://bugs.webkit.org/show_bug.cgi?id=200109
475
476         Reviewed by Brian Burg.
477
478         The `PageAgent` is relied on by many of the other agents, so much so that it doesn't make
479         sense to support the ability to "disable" (as well as "enable") the agent.
480
481         When the first frontend connects, we should treat the `PageAgent` as active and available.
482
483         * inspector/protocol/Page.json:
484         Remove `enable`/`disable`.
485
486 2019-08-08  Michael Saboff  <msaboff@apple.com>
487
488         OpenSource MemoryFootprint API for JSC command line tool
489         https://bugs.webkit.org/show_bug.cgi?id=200541
490
491         Reviewed by Saam Barati.
492
493         Use wtf/spi/darwin/ProcessMemoryFootprint.h instead of WebKitAdditions/MemoryFootprint.h
494         for process memory stats.
495
496         * jsc.cpp:
497         (MemoryFootprint::MemoryFootprint):
498
499 2019-08-08  Devin Rousso  <drousso@apple.com>
500
501         Web Inspector: rename `queryObjects` to `queryInstances` for clarity
502         https://bugs.webkit.org/show_bug.cgi?id=200520
503
504         Reviewed by Brian Burg.
505
506         * inspector/InjectedScriptSource.js:
507         (queryInstances): Added.
508         (queryObjects):
509         * inspector/JSInjectedScriptHost.h:
510         * inspector/JSInjectedScriptHost.cpp:
511         (Inspector::JSInjectedScriptHost::queryInstances): Added.
512         (Inspector::JSInjectedScriptHost::queryObjects): Deleted.
513         * inspector/JSInjectedScriptHostPrototype.cpp:
514         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
515         (Inspector::jsInjectedScriptHostPrototypeFunctionQueryInstances): Added.
516         (Inspector::jsInjectedScriptHostPrototypeFunctionQueryObjects): Deleted.
517
518 2019-08-08  Ross Kirsling  <ross.kirsling@sony.com>
519
520         [JSC] Add "jump if (not) undefined or null" bytecode ops
521         https://bugs.webkit.org/show_bug.cgi?id=200480
522
523         Reviewed by Saam Barati.
524
525         This patch introduces fused jumps for op_is_undefined_or_null, which ignores "masquerade as undefined" behavior.
526
527         This lets us fix a edge-case bug in RequireObjectCoercible (where `({ length } = document.all)` was a TypeError)
528         and moreover provides a very useful optimization for the new ?. and ?? operators, which have semantics centered
529         around op_jundefined_or_null and op_jnundefined_or_null, respectively.
530
531         * bytecode/BytecodeList.rb:
532         * bytecode/BytecodeUseDef.h:
533         (JSC::computeUsesForBytecodeOffset):
534         (JSC::computeDefsForBytecodeOffset):
535         * bytecode/Opcode.h:
536         (JSC::isBranch):
537         * bytecode/PreciseJumpTargetsInlines.h:
538         * bytecompiler/BytecodeGenerator.cpp:
539         (JSC::Label::setLocation):
540         (JSC::BytecodeGenerator::emitJumpIfTrue):
541         (JSC::BytecodeGenerator::emitJumpIfFalse):
542         (JSC::BytecodeGenerator::emitRequireObjectCoercible):
543         * dfg/DFGByteCodeParser.cpp:
544         (JSC::DFG::ByteCodeParser::parseBlock):
545         * dfg/DFGCapabilities.cpp:
546         (JSC::DFG::capabilityLevel):
547         * jit/JIT.cpp:
548         (JSC::JIT::privateCompileMainPass):
549         * jit/JIT.h:
550         * jit/JITOpcodes.cpp:
551         (JSC::JIT::emit_op_jundefined_or_null): Added.
552         (JSC::JIT::emit_op_jnundefined_or_null): Added.
553         * jit/JITOpcodes32_64.cpp:
554         (JSC::JIT::emit_op_jundefined_or_null): Added.
555         (JSC::JIT::emit_op_jnundefined_or_null): Added.
556         * llint/LowLevelInterpreter32_64.asm:
557         * llint/LowLevelInterpreter64.asm:
558
559 2019-08-07  Devin Rousso  <drousso@apple.com>
560
561         Rebase inspector generator tests.
562
563         Rubber-stamped by Brian Burg.
564
565         * inspector/scripts/tests/all/expected/definitions-with-mac-platform.json-result:
566         * inspector/scripts/tests/generic/expected/commands-with-async-attribute.json-result:
567         * inspector/scripts/tests/generic/expected/commands-with-optional-call-return-parameters.json-result:
568         * inspector/scripts/tests/generic/expected/events-with-optional-parameters.json-result:
569         * inspector/scripts/tests/generic/expected/generate-domains-with-feature-guards.json-result:
570         * inspector/scripts/tests/generic/expected/shadowed-optional-type-setters.json-result:
571         * inspector/scripts/tests/generic/expected/type-declaration-object-type.json-result:
572         * inspector/scripts/tests/generic/expected/type-requiring-runtime-casts.json-result:
573         * inspector/scripts/tests/generic/expected/type-with-open-parameters.json-result:
574         * inspector/scripts/tests/mac/expected/definitions-with-mac-platform.json-result:
575
576 2019-08-07  Caio Lima  <ticaiolima@gmail.com>
577
578         High number of cache miss on localTimeOffset
579         https://bugs.webkit.org/show_bug.cgi?id=200444
580
581         Reviewed by Darin Adler.
582
583         This patch is separating the `LocalTimeOffsetCache` for each
584         `WTF::TimeType` to avoid constant cache miss on pathological cases
585         where `gregorianDateTimeToMS` and `msToGregorianDateTime` are
586         intercaleted with `inputTimeType ==  WTF::LocalTime`. Such case
587         happens during execution of Facebook Messenger
588         (https://www.messenger.com).
589
590         * runtime/JSDateMath.cpp:
591         (JSC::localTimeOffset):
592         (JSC::gregorianDateTimeToMS):
593         * runtime/VM.cpp:
594         (JSC::VM::resetDateCache):
595         * runtime/VM.h:
596         (JSC::LocalTimeOffsetCache::LocalTimeOffsetCache):
597         (JSC::LocalTimeOffsetCache::reset):
598
599 2019-08-06  Yusuke Suzuki  <ysuzuki@apple.com>
600
601         [JSC] sampling-profiler can see garbage Wasm::Callee* pointer which is HashTable deleted / empty values
602         https://bugs.webkit.org/show_bug.cgi?id=200494
603
604         Reviewed by Saam Barati.
605
606         The sampling-profiler can see a garbage pointer which is like Wasm::Callee*. This can be filtered by HashSet<Callee*>.
607         But this is safe only when the garbage pointer is not deleted / empty values. We saw occasional crash with JetStream2/tsf-wasm.
608         This patch filters out these values with `HashSet<Callee*>::isValidValue`.
609
610         * wasm/WasmCalleeRegistry.h:
611         (JSC::Wasm::CalleeRegistry::isValidCallee):
612
613 2019-08-06  Commit Queue  <commit-queue@webkit.org>
614
615         Unreviewed, rolling out r248289.
616         https://bugs.webkit.org/show_bug.cgi?id=200488
617
618         Broke internal builds (Requested by drousso on #webkit).
619
620         Reverted changeset:
621
622         "Web Inspector: Styles: show @supports CSS groupings"
623         https://bugs.webkit.org/show_bug.cgi?id=200419
624         https://trac.webkit.org/changeset/248289
625
626 2019-08-06  Devin Rousso  <drousso@apple.com>
627
628         Web Inspector: allow comments in protocol JSON
629         https://bugs.webkit.org/show_bug.cgi?id=200104
630
631         Reviewed by Brian Burg.
632
633         * inspector/scripts/generate-inspector-protocol-bindings.py:
634         (generate_from_specification.load_specification):
635
636         * inspector/scripts/tests/generic/should-strip-comments.json: Added.
637         * inspector/scripts/tests/generic/expected/should-strip-comments.json-result: Added.
638
639 2019-08-06  Per Arne Vollan  <pvollan@apple.com>
640
641         [Win] Fix AppleWin build
642         https://bugs.webkit.org/show_bug.cgi?id=200455
643
644         Reviewed by Alex Christensen.
645
646         * CMakeLists.txt:
647         * shell/CMakeLists.txt:
648
649 2019-08-05  Devin Rousso  <drousso@apple.com>
650
651         Web Inspector: Styles: show @supports CSS groupings
652         https://bugs.webkit.org/show_bug.cgi?id=200419
653
654         Reviewed by Joseph Pecoraro.
655
656         * inspector/protocol/CSS.json:
657         Rename `CSSMedia` to `Grouping` and remove the `sourceLine` value, as it was never populated
658         and wasn't used by Web Inspector.
659
660 2019-08-05  Devin Rousso  <drousso@apple.com>
661
662         Can't use $0, $1 etc when inspecting Google Docs pages because the content uses these for function names
663         https://bugs.webkit.org/show_bug.cgi?id=195834
664
665         Reviewed by Joseph Pecoraro.
666
667         Allow the user to alias saved results by providing a different prefix (e.g. "$") from within
668         Web Inspector. When changing the alias, all existing saved results will update to be
669         reference-able from the new alias.
670
671         * inspector/protocol/Runtime.json:
672         Add `setSavedResultAlias` command.
673
674         * inspector/agents/InspectorRuntimeAgent.h:
675         * inspector/agents/InspectorRuntimeAgent.cpp:
676         (Inspector::InspectorRuntimeAgent::setSavedResultAlias): Added.
677
678         * inspector/InjectedScriptHost.h:
679         (Inspector::InjectedScriptHost::setSavedResultAlias): Added.
680         (Inspector::InjectedScriptHost::savedResultAlias const): Added.
681         * inspector/JSInjectedScriptHost.h:
682         * inspector/JSInjectedScriptHost.cpp:
683         (Inspector::JSInjectedScriptHost::savedResultAlias const): Added.
684         * inspector/JSInjectedScriptHostPrototype.cpp:
685         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
686         (Inspector::jsInjectedScriptHostPrototypeAttributeSavedResultAlias): Added.
687         Store the saved result alias on the `InjectedScriptHost` since it is a shared object among
688         all `InjectedScript`.
689
690         * inspector/InjectedScriptSource.js:
691         (BasicCommandLineAPI):
692
693 2019-08-05  Devin Rousso  <drousso@apple.com>
694
695         Web Inspector: Timelines: disable related agents when the tab is closed
696         https://bugs.webkit.org/show_bug.cgi?id=200118
697
698         Reviewed by Joseph Pecoraro.
699
700         Rework how `enable`/`disable` is used for timeline-related agents so that events are not sent
701         and data isn't kept alive when the Timelines tab isn't enabled.
702
703         * inspector/protocol/Timeline.json:
704         Add `enable`/`disable` commands.
705
706         * inspector/agents/InspectorHeapAgent.cpp:
707         (Inspector::InspectorHeapAgent::willDestroyFrontendAndBackend):
708         (Inspector::InspectorHeapAgent::enable):
709         (Inspector::InspectorHeapAgent::disable):
710
711 2019-08-05  Devin Rousso  <drousso@apple.com>
712
713         Web Inspector: rename "Stylesheet" to "Style Sheet" to match spec text
714         https://bugs.webkit.org/show_bug.cgi?id=200422
715
716         Reviewed by Joseph Pecoraro.
717
718         * inspector/protocol/Page.json:
719
720 2019-08-05  Michael Saboff  <msaboff@apple.com>
721
722         JSC: assertion failure in SpeculativeJIT::compileGetByValOnIntTypedArray
723         https://bugs.webkit.org/show_bug.cgi?id=199997
724
725         Reviewed by Saam Barati.
726
727         No need to ASSERT(node->arrayMode().alreadyChecked(...)) in SpeculativeJIT::compileGetByValOnIntTypedArray()
728         and compileGetByValOnFloatTypedArray() as the abstract interpreter is conservative and can insert a
729         CheckStructureOrEmpty which will fail the ASSERT as it checks for the SpecType of the array
730         and not for SpecEmpty.  If we added a check for the SpecEmpty in the ASSERT, there are cases where
731         it won't be set.
732
733         * dfg/DFGSpeculativeJIT.cpp:
734         (JSC::DFG::SpeculativeJIT::compileGetByValOnIntTypedArray):
735         (JSC::DFG::SpeculativeJIT::compileGetByValOnFloatTypedArray):
736
737 2019-08-03  Devin Rousso  <drousso@apple.com>
738
739         Web Inspector: DOM: add a special breakpoint for "All Events"
740         https://bugs.webkit.org/show_bug.cgi?id=200285
741
742         Reviewed by Joseph Pecoraro.
743
744         Similar to the existing "All Requests" breakpoint, there should be a way to set a breakpoint
745         that would pause for any DOM event, regardless of the event's name. This is useful for
746         situations where the event name isn't known, or where one simply wants to pause on the next
747         entry to the event loop.
748
749         Along these lines, make the "requestAnimationFrame", "setTimeout", and "setInterval"
750         event breakpoints into special breakpoints that can be added/removed via the create
751         breakpoint context menu. This simplifies the process for setting these breakpoints, and also
752         makes them more discoverable (most people wouldn't consider them to be "events").
753
754         * inspector/protocol/Debugger.json:
755          - Rename the `EventListener` pause reason to `Listener`.
756          - Split the `Timer` pause reason into `Interval` and `Timeout`.
757
758         * inspector/protocol/DOMDebugger.json:
759          - Split the `timer` type into `interval` and `timeout`.
760          - Make `eventName` optional for `addEventBreakpoint`/`removeEventBreakpoint`. When omitted,
761            the corresponding breakpoint that is added/removed is treated as a global breakpoint that
762            applies to all events of that type (e.g. a global `listener` breakpoint would pause for
763            any event that is fired).
764
765 2019-08-02  Keith Miller  <keith_miller@apple.com>
766
767         Address comments on r248178
768         https://bugs.webkit.org/show_bug.cgi?id=200411
769
770         Reviewed by Saam Barati.
771
772         * b3/B3Opcode.h:
773         * b3/B3Procedure.h:
774         (JSC::B3::Procedure::tuples const):
775         * b3/B3Validate.cpp:
776         * b3/testb3_1.cpp:
777         (main):
778
779 2019-08-02  Mark Lam  <mark.lam@apple.com>
780
781         [ARM64E] Harden the diversity of the DOMJIT::Signature::unsafeFunction pointer.
782         https://bugs.webkit.org/show_bug.cgi?id=200292
783         <rdar://problem/53706881>
784
785         Reviewed by Geoffrey Garen.
786
787         Previously, DOMJIT::Signature::functionWithoutTypeCheck was signed as a C function
788         pointer.  We can do better by signing it like a vtbl function pointer.
789
790         No new tests needed.  The DOMJIT mechanism is covered by existing tests.
791
792         I also manually confirmed that DOMJIT::Signature::functionWithoutTypeCheck is signed
793         exactly as expected by reading its bits out of memory (not letting Clang have a
794         chance to resign it into a C function pointer) and comparing it against manually
795         signed bits with the expected diversifier.
796
797         * assembler/MacroAssemblerCodeRef.h:
798         (JSC::CFunctionPtr::CFunctionPtr):
799         (JSC::CFunctionPtr::get const):
800         (JSC::CFunctionPtr::address const):
801         (JSC::CFunctionPtr::operator bool const):
802         (JSC::CFunctionPtr::operator! const):
803         (JSC::CFunctionPtr::operator== const):
804         (JSC::CFunctionPtr::operator!= const):
805
806         - Introduce a CFunctionPtr abstraction that is used to hold pointers to C functions.
807           It can instantiated in 4 ways:
808
809           1. The default constructor.
810           2. A constructor that takes a nullptr_t.
811
812              These 2 forms will instantiate a CFunctionPtr with a nullptr.
813
814           3. A constructor that takes the name of a function.
815           4. A constructor that takes a function pointer.
816
817               Form 3 already knows that we're initializing with a real function, and
818               that Clang will give it to use signed as a C function pointer.  So, it
819               doesn't do any assertions.  This form is useful for initializing CFunctionPtrs
820               embedded in const data structures.
821
822               Form 4 is an explicit constructor that takes an arbitrary function
823               pointer, but does not know if that pointer is already signed as a C function
824               pointer.  Hence, this form will do a RELEASE_ASSERT that the given function
825               pointer is actually signed as a C function pointer.
826
827           Once instantiated, we are guaranteed that a C function pointer is either null
828           or contains a signed C function pointer.
829
830         * domjit/DOMJITSignature.h:
831         (JSC::DOMJIT::Signature::Signature):
832         - Sign functionWithoutTypeCheck as WTF_VTBL_FUNCPTR_PTRAUTH(DOMJITFunctionPtrTag).
833
834         * dfg/DFGSpeculativeJIT.cpp:
835         (JSC::DFG::SpeculativeJIT::compileCallDOM):
836         * ftl/FTLLowerDFGToB3.cpp:
837         (JSC::FTL::DFG::LowerDFGToB3::compileCallDOM):
838         - Use the new CFunctionPtr to document that the retrieved signature->functionWithoutTypeCheck
839           is signed as a C function pointer.
840
841         * runtime/ClassInfo.h:
842         - Update MethodTable to sign its function pointers using the new WTF_VTBL_FUNCPTR_PTRAUTH_STR
843           to be consistent.  No longer need to roll its own PTRAUTH macro.
844
845         * runtime/JSCPtrTag.h:
846         - Add DOMJITFunctionPtrTag.
847
848         * tools/JSDollarVM.cpp:
849         - Update to work with the new DOMJIT::Signature constructor.
850
851 2019-08-02  Yusuke Suzuki  <ysuzuki@apple.com>
852
853         [JSC] Support WebAssembly in SamplingProfiler
854         https://bugs.webkit.org/show_bug.cgi?id=200329
855
856         Reviewed by Saam Barati.
857
858         The sampling profiler support is critical to investigate what is actually time-consuming. This patch adds the sampling profiler support for Wasm functions
859         to list up hot Wasm functions with compilation mode (BBQ or OMG). This allows us to investigate the hot functions in JetStream2 wasm tests.
860
861         In order to retrieve wasm function information from the sampling profiler safely, we need to know whether the given Wasm CalleeBits is valid in the call frame.
862         To achieve this, we start collecting valid Wasm::Callee pointers in a global hash set. Previously, each Wasm::Callee registered its code region to a hash set
863         for wasm fault signal handler to know whether the faulted program-counter is in wasm region. We reuse and change this mechanism. Instead of registering code region,
864         we register Wasm::Callee* to a hash set. The sampling profiler reuses this hash set to determine whether the given bits is a valid Wasm::Callee.
865
866         The sampling profiler retrieves the information safely from valid Wasm::Callee* pointer. It is possible that this Wasm::Callee is about to be dead: ref-count is 0,
867         now in the middle of the destructor of Wasm::Callee. Even in that case, fields of Wasm::Callee are still valid and can be accessed since destroying these fields happens
868         after we unregister Wasm::Callee from the global hash set.
869
870         We retrieve Wasm::IndexOrName and Wasm::CompilationMode. Copying them does not involve any allocations, locking etc. So we can safely copy them while some of threads are suspended.
871
872         This patch also fixes the issue that we never called `unregisterCode` while every Wasm::Calllee registers its code region through `registerCode`.
873
874         * CMakeLists.txt:
875         * JavaScriptCore.xcodeproj/project.pbxproj:
876         * Sources.txt:
877         * runtime/InitializeThreading.cpp:
878         (JSC::initializeThreading):
879         * runtime/SamplingProfiler.cpp:
880         (JSC::FrameWalker::FrameWalker):
881         (JSC::FrameWalker::recordJSFrame):
882         (JSC::CFrameWalker::CFrameWalker):
883         (JSC::SamplingProfiler::takeSample):
884         (JSC::SamplingProfiler::processUnverifiedStackTraces):
885         (JSC::SamplingProfiler::StackFrame::displayName):
886         (JSC::SamplingProfiler::StackFrame::displayNameForJSONTests):
887         (JSC::SamplingProfiler::StackFrame::functionStartLine):
888         (JSC::SamplingProfiler::StackFrame::functionStartColumn):
889         (JSC::SamplingProfiler::StackFrame::sourceID):
890         (JSC::SamplingProfiler::StackFrame::url):
891         (JSC::SamplingProfiler::reportTopBytecodes):
892         (WTF::printInternal):
893         * runtime/SamplingProfiler.h:
894         * tools/JSDollarVM.cpp:
895         (JSC::functionIsWasmSupported):
896         (JSC::JSDollarVM::finishCreation):
897         * wasm/WasmB3IRGenerator.h:
898         * wasm/WasmBBQPlan.cpp:
899         (JSC::Wasm::BBQPlan::complete):
900         * wasm/WasmBBQPlanInlines.h:
901         (JSC::Wasm::BBQPlan::initializeCallees):
902         * wasm/WasmCallee.cpp:
903         (JSC::Wasm::Callee::Callee):
904         (JSC::Wasm::Callee::~Callee):
905         * wasm/WasmCallee.h:
906         (JSC::Wasm::Callee::create): Deleted.
907         (JSC::Wasm::Callee::entrypoint const): Deleted.
908         (JSC::Wasm::Callee::calleeSaveRegisters): Deleted.
909         (JSC::Wasm::Callee::indexOrName const): Deleted.
910         * wasm/WasmCalleeRegistry.cpp: Copied from Source/JavaScriptCore/wasm/WasmFaultSignalHandler.h.
911         (JSC::Wasm::CalleeRegistry::initialize):
912         (JSC::Wasm::CalleeRegistry::singleton):
913         * wasm/WasmCalleeRegistry.h: Copied from Source/JavaScriptCore/wasm/WasmCallee.cpp.
914         (JSC::Wasm::CalleeRegistry::getLock):
915         (JSC::Wasm::CalleeRegistry::registerCallee):
916         (JSC::Wasm::CalleeRegistry::unregisterCallee):
917         (JSC::Wasm::CalleeRegistry::isValidCallee):
918         * wasm/WasmCompilationMode.cpp: Copied from Source/JavaScriptCore/wasm/WasmFaultSignalHandler.h.
919         (JSC::Wasm::makeString):
920         * wasm/WasmCompilationMode.h: Copied from Source/JavaScriptCore/wasm/WasmFaultSignalHandler.h.
921         * wasm/WasmFaultSignalHandler.cpp:
922         (JSC::Wasm::trapHandler):
923         (JSC::Wasm::enableFastMemory):
924         (JSC::Wasm::registerCode): Deleted.
925         (JSC::Wasm::unregisterCode): Deleted.
926         * wasm/WasmFaultSignalHandler.h:
927         * wasm/WasmIndexOrName.h:
928         * wasm/WasmOMGPlan.cpp:
929         (JSC::Wasm::OMGPlan::work):
930
931 2019-08-02  Yusuke Suzuki  <ysuzuki@apple.com>
932
933         [JSC] LazyJSValue should be robust for empty JSValue
934         https://bugs.webkit.org/show_bug.cgi?id=200388
935
936         Reviewed by Saam Barati.
937
938         If the Switch DFG node is preceded by ForceOSRExit or something that invalidates the basic block,
939         it can take a FrozenValue as a child which includes empty value instead of string, number etc.
940         If this Switch node is kept and we reached to DFGCFGSimplificationPhase, it will use this FrozenValue.
941         However, LazyJSValue using this FrozenValue strongly assumes that FrozenValue is never holding empty value.
942         But this assumption is wrong. This patch makes LazyJSValue robust for empty value.
943
944         * dfg/DFGLazyJSValue.cpp:
945         (JSC::DFG::LazyJSValue::tryGetStringImpl const):
946         (JSC::DFG::LazyJSValue::tryGetString const):
947         (JSC::DFG::LazyJSValue::strictEqual const):
948         (JSC::DFG::LazyJSValue::switchLookupValue const):
949
950 2019-08-02  Devin Rousso  <drousso@apple.com>
951
952         Web Inspector: Storage: disable related agents when the tab is closed
953         https://bugs.webkit.org/show_bug.cgi?id=200117
954
955         Reviewed by Joseph Pecoraro.
956
957         Rework how `enable`/`disable` is used for storage-related agents so that events are not sent
958         and data isn't kept alive when the Storage tab isn't enabled.
959
960         * inspector/protocol/ApplicationCache.json:
961         Add `disable` command.
962
963 2019-08-01  Keith Miller  <keith_miller@apple.com>
964
965         B3 should support tuple types
966         https://bugs.webkit.org/show_bug.cgi?id=200327
967
968         Reviewed by Filip Pizlo.
969
970         As part of the Wasm multi-value proposal, we need to teach B3 that
971         patchpoints can return more than one value.  This is done by
972         adding a new B3::Type called Tuple. Unlike, other B3 types Tuple
973         is actually an encoded index into a numeric B3::Type vector on the
974         procedure. This lets us distinguish any two tuples from each
975         other, moreover, it's possible to get the vector of types with
976         just the B3::Tuple type and the procedure.
977
978         Since most B3 operations only expect to see a single numeric child
979         there is a new Opcode, Extract, that takes yields the some, fixed,
980         entry from a tuple value. Extract would be the only other change
981         needed to make tuples work in B3 except that some optimizations
982         expect to be able to take any non-Void value and stick it into a
983         Variable of the same type. This means both Get/Set from a variable
984         have to support Tuples as well. For simplicity and consistency,
985         the ability to accept tuples is also applied to Phi and Upsilon.
986
987         In order to lower a Tuple, B3Lowering needs to have a Tmp for each
988         nested type in a Tuple. While we could reuse the existing
989         IndexedTables to hold the extra information we need to lower
990         Tuples, we instead use a two new HashTables for Value->Tmp(s) and
991         Phi->Tmp(s). It's expected that Tuples will be sufficiently
992         uncommon the overhead of tracking everything together would be
993         prohibitive. On the other hand, we don't worry about this for
994         Variables because we don't expect those to make it to lowering.
995
996         * JavaScriptCore.xcodeproj/project.pbxproj:
997         * Sources.txt:
998         * b3/B3Bank.h:
999         (JSC::B3::bankForType):
1000         * b3/B3CheckValue.cpp:
1001         (JSC::B3::CheckValue::CheckValue):
1002         * b3/B3ExtractValue.cpp: Copied from Source/JavaScriptCore/b3/B3ProcedureInlines.h.
1003         (JSC::B3::ExtractValue::~ExtractValue):
1004         (JSC::B3::ExtractValue::dumpMeta const):
1005         * b3/B3ExtractValue.h: Copied from Source/JavaScriptCore/b3/B3FixSSA.h.
1006         * b3/B3FixSSA.h:
1007         * b3/B3LowerMacros.cpp:
1008         * b3/B3LowerMacrosAfterOptimizations.cpp:
1009         * b3/B3LowerToAir.cpp:
1010         * b3/B3NativeTraits.h:
1011         * b3/B3Opcode.cpp:
1012         (JSC::B3::invertedCompare):
1013         (WTF::printInternal):
1014         * b3/B3Opcode.h:
1015         (JSC::B3::opcodeForConstant):
1016         * b3/B3PatchpointSpecial.cpp:
1017         (JSC::B3::PatchpointSpecial::forEachArg):
1018         (JSC::B3::PatchpointSpecial::isValid):
1019         (JSC::B3::PatchpointSpecial::admitsStack):
1020         (JSC::B3::PatchpointSpecial::generate):
1021         * b3/B3PatchpointValue.cpp:
1022         (JSC::B3::PatchpointValue::dumpMeta const):
1023         (JSC::B3::PatchpointValue::PatchpointValue):
1024         * b3/B3PatchpointValue.h:
1025         * b3/B3Procedure.cpp:
1026         (JSC::B3::Procedure::addTuple):
1027         (JSC::B3::Procedure::isValidTuple const):
1028         (JSC::B3::Procedure::tupleForType const):
1029         (JSC::B3::Procedure::addIntConstant):
1030         (JSC::B3::Procedure::addConstant):
1031         * b3/B3Procedure.h:
1032         (JSC::B3::Procedure::returnCount const):
1033         * b3/B3ProcedureInlines.h:
1034         (JSC::B3::Procedure::extractFromTuple const):
1035         * b3/B3ReduceStrength.cpp:
1036         * b3/B3StackmapSpecial.cpp:
1037         (JSC::B3::StackmapSpecial::isValidImpl):
1038         (JSC::B3::StackmapSpecial::isArgValidForType):
1039         (JSC::B3::StackmapSpecial::isArgValidForRep):
1040         (JSC::B3::StackmapSpecial::isArgValidForValue): Deleted.
1041         * b3/B3StackmapSpecial.h:
1042         * b3/B3StackmapValue.h:
1043         * b3/B3Type.cpp:
1044         (WTF::printInternal):
1045         * b3/B3Type.h:
1046         (JSC::B3::Type::Type):
1047         (JSC::B3::Type::tupleFromIndex):
1048         (JSC::B3::Type::kind const):
1049         (JSC::B3::Type::tupleIndex const):
1050         (JSC::B3::Type::hash const):
1051         (JSC::B3::Type::operator== const):
1052         (JSC::B3::Type::operator!= const):
1053         (JSC::B3::Type::isInt const):
1054         (JSC::B3::Type::isFloat const):
1055         (JSC::B3::Type::isNumeric const):
1056         (JSC::B3::Type::isTuple const):
1057         (JSC::B3::sizeofType):
1058         (JSC::B3::isInt): Deleted.
1059         (JSC::B3::isFloat): Deleted.
1060         * b3/B3TypeMap.h:
1061         (JSC::B3::TypeMap::at):
1062         * b3/B3Validate.cpp:
1063         * b3/B3Value.cpp:
1064         (JSC::B3::Value::isRounded const):
1065         (JSC::B3::Value::effects const):
1066         (JSC::B3::Value::typeFor):
1067         * b3/B3Value.h:
1068         * b3/B3ValueInlines.h:
1069         * b3/B3ValueKey.cpp:
1070         (JSC::B3::ValueKey::intConstant):
1071         * b3/B3ValueKey.h:
1072         (JSC::B3::ValueKey::hash const):
1073         * b3/B3ValueRep.h:
1074         * b3/B3Width.h:
1075         (JSC::B3::widthForType):
1076         * b3/air/AirArg.cpp:
1077         (JSC::B3::Air::Arg::canRepresent const):
1078         * b3/air/AirArg.h:
1079         * b3/air/AirCCallingConvention.cpp:
1080         (JSC::B3::Air::cCallResult):
1081         * b3/air/AirLowerMacros.cpp:
1082         (JSC::B3::Air::lowerMacros):
1083         * b3/testb3.h:
1084         (populateWithInterestingValues):
1085         * b3/testb3_1.cpp:
1086         (run):
1087         * b3/testb3_3.cpp:
1088         (testStorePartial8BitRegisterOnX86):
1089         * b3/testb3_5.cpp:
1090         (testPatchpointWithRegisterResult):
1091         (testPatchpointWithStackArgumentResult):
1092         (testPatchpointWithAnyResult):
1093         * b3/testb3_6.cpp:
1094         (testPatchpointDoubleRegs):
1095         (testSomeEarlyRegister):
1096         * b3/testb3_7.cpp:
1097         (testShuffleDoesntTrashCalleeSaves):
1098         (testReportUsedRegistersLateUseFollowedByEarlyDefDoesNotMarkUseAsDead):
1099         (testSimpleTuplePair):
1100         (testSimpleTuplePairUnused):
1101         (testSimpleTuplePairStack):
1102         (tailDupedTuplePair):
1103         (tuplePairVariableLoop):
1104         (tupleNestedLoop):
1105         (addTupleTests):
1106         * b3/testb3_8.cpp:
1107         (testLoad):
1108         (addLoadTests):
1109         * ftl/FTLAbbreviatedTypes.h:
1110         * ftl/FTLLowerDFGToB3.cpp:
1111         (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstruct):
1112         (JSC::FTL::DFG::LowerDFGToB3::compileDirectCallOrConstruct):
1113         (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargsSpread):
1114         (JSC::FTL::DFG::LowerDFGToB3::compileCallOrConstructVarargs):
1115         (JSC::FTL::DFG::LowerDFGToB3::compileCallEval):
1116         (JSC::FTL::DFG::LowerDFGToB3::compileCPUIntrinsic):
1117         (JSC::FTL::DFG::LowerDFGToB3::compileInstanceOf):
1118         (JSC::FTL::DFG::LowerDFGToB3::compileCallDOMGetter):
1119         (JSC::FTL::DFG::LowerDFGToB3::emitBinarySnippet):
1120         (JSC::FTL::DFG::LowerDFGToB3::emitBinaryBitOpSnippet):
1121         (JSC::FTL::DFG::LowerDFGToB3::emitRightShiftSnippet):
1122         (JSC::FTL::DFG::LowerDFGToB3::allocateHeapCell):
1123         * wasm/WasmAirIRGenerator.cpp:
1124         (JSC::Wasm::AirIRGenerator::emitPatchpoint):
1125         * wasm/WasmB3IRGenerator.cpp:
1126         (JSC::Wasm::B3IRGenerator::B3IRGenerator):
1127         * wasm/WasmCallingConvention.h:
1128         (JSC::Wasm::CallingConvention::marshallArgument const):
1129         (JSC::Wasm::CallingConvention::setupFrameInPrologue const):
1130         (JSC::Wasm::CallingConvention::setupCall const):
1131         (JSC::Wasm::CallingConventionAir::setupCall const):
1132
1133 2019-08-02  Yusuke Suzuki  <ysuzuki@apple.com>
1134
1135         [JSC] Use "destroy" function directly for JSWebAssemblyCodeBlock and WebAssemblyFunction
1136         https://bugs.webkit.org/show_bug.cgi?id=200385
1137
1138         Reviewed by Mark Lam.
1139
1140         These CellTypes are not using classInfo stored in the cells, so we can just call JSWebAssemblyCodeBlock::destroy
1141         and WebAssemblyFunction::destroy directly.
1142
1143         * wasm/js/JSWebAssemblyCodeBlockHeapCellType.cpp:
1144         (JSC::JSWebAssemblyCodeBlockDestroyFunc::operator() const):
1145         * wasm/js/WebAssemblyFunctionHeapCellType.cpp:
1146         (JSC::WebAssemblyFunctionDestroyFunc::operator() const):
1147
1148 2019-08-02  Mark Lam  <mark.lam@apple.com>
1149
1150         Gardening: build fix.
1151         https://bugs.webkit.org/show_bug.cgi?id=200149
1152         <rdar://problem/53570112>
1153
1154         Not reviewed.
1155
1156         * assembler/CPU.cpp:
1157         (JSC::hwPhysicalCPUMax):
1158
1159 2019-08-01  Yusuke Suzuki  <ysuzuki@apple.com>
1160
1161         GetterSetter type confusion during DFG compilation
1162         https://bugs.webkit.org/show_bug.cgi?id=199903
1163
1164         Reviewed by Mark Lam.
1165
1166         In AI, we are strongly assuming that GetGetter's child constant value should be GetterSetter if it exists.
1167         However, this can be wrong since nobody ensures that. AI assumed so because the control-flow and preceding
1168         CheckStructure ensures that. But this preceding check can be eliminated if the node becomes (at runtime) unreachable.
1169
1170         Let's consider the following graph.
1171
1172             129:<!0:->     PutByOffset(KnownCell:@115, KnownCell:@115, Check:Untyped:@124, MustGen, id5{length}, 0, W:NamedProperties(5), ClobbersExit, bc#154, ExitValid)
1173             130:<!0:->     PutStructure(KnownCell:@115, MustGen, %C8:Object -> %C3:Object, ID:7726, R:JSObject_butterfly, W:JSCell_indexingType,JSCell_structureID,JSCell_typeInfoFlags,JSCell_typeInfoType, ClobbersExit, bc#154, ExitInvalid)
1174             ...
1175             158:<!0:->     GetLocal(Check:Untyped:@197, JS|MustGen|UseAsOther, Final, loc7(R<Final>/FlushedCell), R:Stack(-8), bc#187, ExitValid)  predicting Final
1176             210:< 1:->     DoubleRep(Check:NotCell:@158, Double|PureInt, BytecodeDouble, Exits, bc#187, ExitValid)
1177             ...
1178             162:<!0:->     CheckStructure(Cell:@158, MustGen, [%Ad:Object], R:JSCell_structureID, Exits, bc#192, ExitValid)
1179             163:< 1:->     GetGetterSetterByOffset(KnownCell:@158, KnownCell:@158, JS|UseAsOther, OtherCell, id5{length}, 0, R:NamedProperties(5), Exits, bc#192, ExitValid)
1180             164:< 1:->     GetGetter(KnownCell:@163, JS|UseAsOther, Function, R:GetterSetter_getter, Exits, bc#192, ExitValid)
1181
1182         At @163 and @164, AI proves that @158's AbstractValue is None because @210's edge filters out Cells @158 is a cell. But we do not invalidate graph status as "Invalid" even if edge filters out all possible value.
1183         This is because the result of edge can be None in a valid program. For example, we can put a dependency edge between a consuming node and a producing node, where the producing node is just like a check and it
1184         does not produce a value actually. So, @163 and @164 are not invalidated. This is totally fine in our compiler pipeline right now.
1185
1186         But after that, global CSE phase found that @115 and @158 are same and @129 dominates @158. As a result, we can replace GetGetter child's @163 with @124. Since CheckStructure is already removed (and now, at runtime,
1187         @163 and @164 are never executed), we do not have any structure guarantee on @158 and the result of @163. This means that @163's CSE result can be non-GetterSetter value.
1188
1189             124:< 2:->     JSConstant(JS|UseAsOther, Final, Weak:Object: 0x1199e82a0 with butterfly 0x0 (Structure %B4:Object), StructureID: 49116, bc#0, ExitValid)
1190             ...
1191             126:< 2:->     GetGetter(KnownCell:Kill:@124, JS|UseAsOther, Function, R:GetterSetter_getter, Exits, bc#192, ExitValid)
1192
1193         AI filters out @124's non-cell values. But @126 can get non-GetterSetter cell at AI phase. But our AI code is like the following.
1194
1195
1196             JSValue base = forNode(node->child1()).m_value;
1197             if (base) {
1198                 GetterSetter* getterSetter = jsCast<GetterSetter*>(base);
1199                 ...
1200
1201         Then, jsCast casts the above object with GetterSetter accidentally.
1202
1203         In general, DFG AI can get a proven constant value, which could not be shown at runtime. This happens if the processing node is unreachable at runtime while the graph is not invalid yet, because preceding edge
1204         filters already filter out all the possible execution. DFG AI already considered about this possibility, and it attempts to fold a node into a constant only when the constant input matches against the expected one.
1205         But several DFG nodes are not handling this correctly: GetGetter, GetSetter, and SkipScope.
1206
1207         In this patch, we use `jsDynamicCast` to ensure that the constant input matches against the expected (foldable) one, and fold it only when the expectation is met.
1208         We also remove DFG::Node::castConstant and its use. We should not rely on the constant folded value based on graph's control-flow.
1209
1210         * dfg/DFGAbstractInterpreterInlines.h:
1211         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
1212         * dfg/DFGNode.h:
1213         (JSC::DFG::Node::castConstant): Deleted.
1214         * ftl/FTLLowerDFGToB3.cpp:
1215         (JSC::FTL::DFG::LowerDFGToB3::compileMaterializeCreateActivation):
1216
1217 2019-08-01  Mark Lam  <mark.lam@apple.com>
1218
1219         Add crash diagnostics for debugging unexpected zapped cells.
1220         https://bugs.webkit.org/show_bug.cgi?id=200149
1221         <rdar://problem/53570112>
1222
1223         Reviewed by Yusuke Suzuki.
1224
1225         Add a check for zapped cells in SlotVisitor::appendToMarkStack() and
1226         SlotVisitor::visitChildren().  If a zapped cell is detected, we will crash with
1227         some diagnostic info.
1228
1229         To facilitate this, we've made the following changes:
1230         1. Changed FreeCell to preserve the 1st 8 bytes.  This is fine to do because all
1231            cells are at least 16 bytes long.
1232         2. Changed HeapCell::zap() to only zap the structureID.  Leave the rest of the
1233            cell header info intact (including the cell JSType).
1234         3. Changed HeapCell::zap() to record the reason for zapping the cell.  We stash
1235            the reason immediately after the first 8 bytes.  This is the same location as
1236            FreeCell::scrambledNext.  However, since a cell is not expected to be zapped
1237            and on the free list at the same time, it is also fine to do this.
1238         4. Added a few utility functions to MarkedBlock for checking if a cell points
1239            into the block.
1240         5. Added VMInspector and JSDollarVM utilities to dump in-use subspace hashes.
1241         6. Added some comments to document the hashes of known subspaces.
1242         7. Added Options::dumpZappedCellCrashData() to make this check conditional.
1243            We use this option to disable this check for slower machines so that their
1244            PLT5 performance is not impacted.
1245
1246         * assembler/CPU.cpp:
1247         (JSC::hwL3CacheSize):
1248         (JSC::hwPhysicalCPUMax):
1249         * assembler/CPU.h:
1250         (JSC::hwL3CacheSize):
1251         (JSC::hwPhysicalCPUMax):
1252         * heap/FreeList.h:
1253         (JSC::FreeCell::offsetOfScrambledNext):
1254         * heap/HeapCell.h:
1255         (JSC::HeapCell::zap):
1256         (JSC::HeapCell::isZapped const):
1257         * heap/MarkedBlock.cpp:
1258         (JSC::MarkedBlock::Handle::stopAllocating):
1259         * heap/MarkedBlock.h:
1260         (JSC::MarkedBlock::Handle::start const):
1261         (JSC::MarkedBlock::Handle::end const):
1262         (JSC::MarkedBlock::Handle::contains const):
1263         * heap/MarkedBlockInlines.h:
1264         (JSC::MarkedBlock::Handle::specializedSweep):
1265         * heap/MarkedSpace.h:
1266         (JSC::MarkedSpace::forEachSubspace):
1267         * heap/SlotVisitor.cpp:
1268         (JSC::SlotVisitor::appendToMarkStack):
1269         (JSC::SlotVisitor::visitChildren):
1270         (JSC::SlotVisitor::reportZappedCellAndCrash):
1271         * heap/SlotVisitor.h:
1272         * jit/AssemblyHelpers.cpp:
1273         (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):
1274         * runtime/Options.cpp:
1275         (JSC::Options::initialize):
1276         * runtime/Options.h:
1277         * runtime/VM.cpp:
1278         (JSC::VM::VM):
1279         * tools/JSDollarVM.cpp:
1280         (JSC::functionDumpSubspaceHashes):
1281         (JSC::JSDollarVM::finishCreation):
1282         * tools/VMInspector.cpp:
1283         (JSC::VMInspector::dumpSubspaceHashes):
1284         * tools/VMInspector.h:
1285
1286 2019-08-01  Keith Miller  <keith_miller@apple.com>
1287
1288         Fix bug in testMulImm32SignExtend
1289         https://bugs.webkit.org/show_bug.cgi?id=200358
1290
1291         Reviewed by Mark Lam.
1292
1293         Also, have it run in more configurations.
1294
1295         * b3/testb3_2.cpp:
1296         (testMulImm32SignExtend):
1297         * b3/testb3_3.cpp:
1298         (addArgTests):
1299
1300 2019-07-31  Mark Lam  <mark.lam@apple.com>
1301
1302         Rename DOMJIT safe/unsafeFunction to functionWithTypeChecks and functionWithoutTypeChecks.
1303         https://bugs.webkit.org/show_bug.cgi?id=200323
1304
1305         Reviewed by Yusuke Suzuki.
1306
1307         The DOMJIT has a notion of a safeFunction and an unsafeFunction.  The safeFunction
1308         is effectively the same as the unsafeFunction with added type check.  The DFG/FTL
1309         will emit code to call the unsafeFunction if it has already emitted the needed
1310         type check or proven that it isn't needed.  Otherwise, the DFG/FTL will emit
1311         code to call the safeFunction (which does its own type check) instead.
1312
1313         This patch renames these functions to better describe their difference.
1314
1315         * dfg/DFGSpeculativeJIT.cpp:
1316         (JSC::DFG::SpeculativeJIT::compileCallDOM):
1317         * domjit/DOMJITSignature.h:
1318         (JSC::DOMJIT::Signature::Signature):
1319         * ftl/FTLLowerDFGToB3.cpp:
1320         (JSC::FTL::DFG::LowerDFGToB3::compileCallDOM):
1321         * tools/JSDollarVM.cpp:
1322         (JSC::DOMJITFunctionObject::functionWithTypeCheck):
1323         (JSC::DOMJITFunctionObject::functionWithoutTypeCheck):
1324         (JSC::DOMJITFunctionObject::finishCreation):
1325         (JSC::DOMJITCheckSubClassObject::functionWithTypeCheck):
1326         (JSC::DOMJITCheckSubClassObject::functionWithoutTypeCheck):
1327         (JSC::DOMJITCheckSubClassObject::finishCreation):
1328         (JSC::DOMJITFunctionObject::safeFunction): Deleted.
1329         (JSC::DOMJITFunctionObject::unsafeFunction): Deleted.
1330         (JSC::DOMJITCheckSubClassObject::safeFunction): Deleted.
1331         (JSC::DOMJITCheckSubClassObject::unsafeFunction): Deleted.
1332
1333 2019-07-31  Alex Christensen  <achristensen@webkit.org>
1334
1335         Begin organizing b3 tests
1336         https://bugs.webkit.org/show_bug.cgi?id=200330
1337
1338         Reviewed by Keith Miller.
1339
1340         * b3/testb3.h:
1341         * b3/testb3_1.cpp:
1342         (run):
1343         (zero): Deleted.
1344         (negativeZero): Deleted.
1345         * b3/testb3_2.cpp:
1346         (testBitXorTreeArgs):
1347         (testBitXorTreeArgsEven):
1348         (testBitXorTreeArgImm):
1349         (testBitAndTreeArg32):
1350         (testBitOrTreeArg32):
1351         (testBitAndArgs):
1352         (testBitAndSameArg):
1353         (testBitAndNotNot):
1354         (testBitAndNotImm):
1355         (testBitAndImms):
1356         (testBitAndArgImm):
1357         (testBitAndImmArg):
1358         (testBitAndBitAndArgImmImm):
1359         (testBitAndImmBitAndArgImm):
1360         (testBitAndArgs32):
1361         (testBitAndSameArg32):
1362         (testBitAndImms32):
1363         (testBitAndArgImm32):
1364         (testBitAndImmArg32):
1365         (testBitAndBitAndArgImmImm32):
1366         (testBitAndImmBitAndArgImm32):
1367         (testBitAndWithMaskReturnsBooleans):
1368         (testBitAndArgDouble):
1369         (testBitAndArgsDouble):
1370         (testBitAndArgImmDouble):
1371         (testBitAndImmsDouble):
1372         (testBitAndArgFloat):
1373         (testBitAndArgsFloat):
1374         (testBitAndArgImmFloat):
1375         (testBitAndImmsFloat):
1376         (testBitAndArgsFloatWithUselessDoubleConversion):
1377         (testBitOrArgs):
1378         (testBitOrSameArg):
1379         (testBitOrAndAndArgs):
1380         (testBitOrAndSameArgs):
1381         (testBitOrNotNot):
1382         (testBitOrNotImm):
1383         (testBitOrImms):
1384         (testBitOrArgImm):
1385         (testBitOrImmArg):
1386         (testBitOrBitOrArgImmImm):
1387         (testBitOrImmBitOrArgImm):
1388         (testBitOrArgs32):
1389         (testBitOrSameArg32):
1390         (testBitOrImms32):
1391         (testBitOrArgImm32):
1392         (testBitOrImmArg32):
1393         (addBitTests):
1394         * b3/testb3_3.cpp:
1395         (testSShrArgs):
1396         (testSShrImms):
1397         (testSShrArgImm):
1398         (testSShrArg32):
1399         (testSShrArgs32):
1400         (testSShrImms32):
1401         (testSShrArgImm32):
1402         (testZShrArgs):
1403         (testZShrImms):
1404         (testZShrArgImm):
1405         (testZShrArg32):
1406         (testZShrArgs32):
1407         (testZShrImms32):
1408         (testZShrArgImm32):
1409         (zero):
1410         (negativeZero):
1411         (addArgTests):
1412         (addCallTests):
1413         (addShrTests):
1414         * b3/testb3_4.cpp:
1415         (addSExtTests):
1416         * b3/testb3_6.cpp:
1417         (testSShrShl32):
1418         (testSShrShl64):
1419         (addSShrShTests):
1420
1421 2019-07-31  Devin Rousso  <drousso@apple.com>
1422
1423         Web Inspector: Debugger: support emulateUserGesture parameter in Debugger.evaluateOnCallFrame
1424         https://bugs.webkit.org/show_bug.cgi?id=200272
1425
1426         Reviewed by Joseph Pecoraro.
1427
1428         When paused, evaluating in the console should still respect the "Emulate User Gesture" checkbox.
1429
1430         * inspector/protocol/Debugger.json:
1431         * inspector/agents/InspectorDebuggerAgent.h:
1432         * inspector/agents/InspectorDebuggerAgent.cpp:
1433         (Inspector::InspectorDebuggerAgent::evaluateOnCallFrame):
1434
1435 2019-07-31  Alex Christensen  <achristensen@webkit.org>
1436
1437         Split testb3 into multiple files
1438         https://bugs.webkit.org/show_bug.cgi?id=200326
1439
1440         Reviewed by Keith Miller.
1441
1442         * JavaScriptCore.xcodeproj/project.pbxproj:
1443         * b3/testb3.cpp: Removed.
1444         * b3/testb3.h: Added.
1445         (hiddenTruthBecauseNoReturnIsStupid):
1446         (usage):
1447         (shouldBeVerbose):
1448         (compileProc):
1449         (invoke):
1450         (compileAndRun):
1451         (lowerToAirForTesting):
1452         (checkDisassembly):
1453         (checkUsesInstruction):
1454         (checkDoesNotUseInstruction):
1455         (populateWithInterestingValues):
1456         (floatingPointOperands):
1457         (int64Operands):
1458         (int32Operands):
1459         (add32):
1460         (modelLoad):
1461         (float>):
1462         (double>):
1463         * b3/testb3_1.cpp: Added.
1464         (zero):
1465         (negativeZero):
1466         (shouldRun):
1467         (testRotR):
1468         (testRotL):
1469         (testRotRWithImmShift):
1470         (testRotLWithImmShift):
1471         (testComputeDivisionMagic):
1472         (run):
1473         (main):
1474         (dllLauncherEntryPoint):
1475         * b3/testb3_2.cpp: Added.
1476         (test42):
1477         (testLoad42):
1478         (testLoadAcq42):
1479         (testLoadWithOffsetImpl):
1480         (testLoadOffsetImm9Max):
1481         (testLoadOffsetImm9MaxPlusOne):
1482         (testLoadOffsetImm9MaxPlusTwo):
1483         (testLoadOffsetImm9Min):
1484         (testLoadOffsetImm9MinMinusOne):
1485         (testLoadOffsetScaledUnsignedImm12Max):
1486         (testLoadOffsetScaledUnsignedOverImm12Max):
1487         (testBitXorTreeArgs):
1488         (testBitXorTreeArgsEven):
1489         (testBitXorTreeArgImm):
1490         (testAddTreeArg32):
1491         (testMulTreeArg32):
1492         (testBitAndTreeArg32):
1493         (testBitOrTreeArg32):
1494         (testArg):
1495         (testReturnConst64):
1496         (testReturnVoid):
1497         (testAddArg):
1498         (testAddArgs):
1499         (testAddArgImm):
1500         (testAddImmArg):
1501         (testAddArgMem):
1502         (testAddMemArg):
1503         (testAddImmMem):
1504         (testAddArg32):
1505         (testAddArgs32):
1506         (testAddArgMem32):
1507         (testAddMemArg32):
1508         (testAddImmMem32):
1509         (testAddNeg1):
1510         (testAddNeg2):
1511         (testAddArgZeroImmZDef):
1512         (testAddLoadTwice):
1513         (testAddArgDouble):
1514         (testAddArgsDouble):
1515         (testAddArgImmDouble):
1516         (testAddImmArgDouble):
1517         (testAddImmsDouble):
1518         (testAddArgFloat):
1519         (testAddArgsFloat):
1520         (testAddFPRArgsFloat):
1521         (testAddArgImmFloat):
1522         (testAddImmArgFloat):
1523         (testAddImmsFloat):
1524         (testAddArgFloatWithUselessDoubleConversion):
1525         (testAddArgsFloatWithUselessDoubleConversion):
1526         (testAddArgsFloatWithEffectfulDoubleConversion):
1527         (testAddMulMulArgs):
1528         (testMulArg):
1529         (testMulArgStore):
1530         (testMulAddArg):
1531         (testMulArgs):
1532         (testMulArgNegArg):
1533         (testMulNegArgArg):
1534         (testMulArgImm):
1535         (testMulImmArg):
1536         (testMulArgs32):
1537         (testMulArgs32SignExtend):
1538         (testMulImm32SignExtend):
1539         (testMulLoadTwice):
1540         (testMulAddArgsLeft):
1541         (testMulAddArgsRight):
1542         (testMulAddArgsLeft32):
1543         (testMulAddArgsRight32):
1544         (testMulSubArgsLeft):
1545         (testMulSubArgsRight):
1546         (testMulSubArgsLeft32):
1547         (testMulSubArgsRight32):
1548         (testMulNegArgs):
1549         (testMulNegArgs32):
1550         (testMulArgDouble):
1551         (testMulArgsDouble):
1552         (testMulArgImmDouble):
1553         (testMulImmArgDouble):
1554         (testMulImmsDouble):
1555         (testMulArgFloat):
1556         (testMulArgsFloat):
1557         (testMulArgImmFloat):
1558         (testMulImmArgFloat):
1559         (testMulImmsFloat):
1560         (testMulArgFloatWithUselessDoubleConversion):
1561         (testMulArgsFloatWithUselessDoubleConversion):
1562         (testMulArgsFloatWithEffectfulDoubleConversion):
1563         (testDivArgDouble):
1564         (testDivArgsDouble):
1565         (testDivArgImmDouble):
1566         (testDivImmArgDouble):
1567         (testDivImmsDouble):
1568         (testDivArgFloat):
1569         (testDivArgsFloat):
1570         (testDivArgImmFloat):
1571         (testDivImmArgFloat):
1572         (testDivImmsFloat):
1573         (testModArgDouble):
1574         (testModArgsDouble):
1575         (testModArgImmDouble):
1576         (testModImmArgDouble):
1577         (testModImmsDouble):
1578         (testModArgFloat):
1579         (testModArgsFloat):
1580         (testModArgImmFloat):
1581         (testModImmArgFloat):
1582         (testModImmsFloat):
1583         (testDivArgFloatWithUselessDoubleConversion):
1584         (testDivArgsFloatWithUselessDoubleConversion):
1585         (testDivArgsFloatWithEffectfulDoubleConversion):
1586         (testUDivArgsInt32):
1587         (testUDivArgsInt64):
1588         (testUModArgsInt32):
1589         (testUModArgsInt64):
1590         (testSubArg):
1591         (testSubArgs):
1592         (testSubArgImm):
1593         (testSubNeg):
1594         (testNegSub):
1595         (testNegValueSubOne):
1596         (testSubSub):
1597         (testSubSub2):
1598         (testSubAdd):
1599         (testSubFirstNeg):
1600         (testSubImmArg):
1601         (testSubArgMem):
1602         (testSubMemArg):
1603         (testSubImmMem):
1604         (testSubMemImm):
1605         (testSubArgs32):
1606         (testSubArgImm32):
1607         (testSubImmArg32):
1608         (testSubMemArg32):
1609         (testSubArgMem32):
1610         (testSubImmMem32):
1611         (testSubMemImm32):
1612         (testNegValueSubOne32):
1613         (testNegMulArgImm):
1614         (testSubMulMulArgs):
1615         (testSubArgDouble):
1616         (testSubArgsDouble):
1617         (testSubArgImmDouble):
1618         (testSubImmArgDouble):
1619         (testSubImmsDouble):
1620         (testSubArgFloat):
1621         (testSubArgsFloat):
1622         (testSubArgImmFloat):
1623         (testSubImmArgFloat):
1624         (testSubImmsFloat):
1625         (testSubArgFloatWithUselessDoubleConversion):
1626         (testSubArgsFloatWithUselessDoubleConversion):
1627         (testSubArgsFloatWithEffectfulDoubleConversion):
1628         (testTernarySubInstructionSelection):
1629         (testNegDouble):
1630         (testNegFloat):
1631         (testNegFloatWithUselessDoubleConversion):
1632         (testBitAndArgs):
1633         (testBitAndSameArg):
1634         (testBitAndNotNot):
1635         (testBitAndNotImm):
1636         (testBitAndImms):
1637         (testBitAndArgImm):
1638         (testBitAndImmArg):
1639         (testBitAndBitAndArgImmImm):
1640         (testBitAndImmBitAndArgImm):
1641         (testBitAndArgs32):
1642         (testBitAndSameArg32):
1643         (testBitAndImms32):
1644         (testBitAndArgImm32):
1645         (testBitAndImmArg32):
1646         (testBitAndBitAndArgImmImm32):
1647         (testBitAndImmBitAndArgImm32):
1648         (testBitAndWithMaskReturnsBooleans):
1649         (bitAndDouble):
1650         (testBitAndArgDouble):
1651         (testBitAndArgsDouble):
1652         (testBitAndArgImmDouble):
1653         (testBitAndImmsDouble):
1654         (bitAndFloat):
1655         (testBitAndArgFloat):
1656         (testBitAndArgsFloat):
1657         (testBitAndArgImmFloat):
1658         (testBitAndImmsFloat):
1659         (testBitAndArgsFloatWithUselessDoubleConversion):
1660         (testBitOrArgs):
1661         (testBitOrSameArg):
1662         (testBitOrAndAndArgs):
1663         (testBitOrAndSameArgs):
1664         (testBitOrNotNot):
1665         (testBitOrNotImm):
1666         (testBitOrImms):
1667         (testBitOrArgImm):
1668         (testBitOrImmArg):
1669         (testBitOrBitOrArgImmImm):
1670         (testBitOrImmBitOrArgImm):
1671         (testBitOrArgs32):
1672         (testBitOrSameArg32):
1673         (testBitOrImms32):
1674         (testBitOrArgImm32):
1675         (testBitOrImmArg32):
1676         * b3/testb3_3.cpp: Added.
1677         (testBitOrBitOrArgImmImm32):
1678         (testBitOrImmBitOrArgImm32):
1679         (bitOrDouble):
1680         (testBitOrArgDouble):
1681         (testBitOrArgsDouble):
1682         (testBitOrArgImmDouble):
1683         (testBitOrImmsDouble):
1684         (bitOrFloat):
1685         (testBitOrArgFloat):
1686         (testBitOrArgsFloat):
1687         (testBitOrArgImmFloat):
1688         (testBitOrImmsFloat):
1689         (testBitOrArgsFloatWithUselessDoubleConversion):
1690         (testBitXorArgs):
1691         (testBitXorSameArg):
1692         (testBitXorAndAndArgs):
1693         (testBitXorAndSameArgs):
1694         (testBitXorImms):
1695         (testBitXorArgImm):
1696         (testBitXorImmArg):
1697         (testBitXorBitXorArgImmImm):
1698         (testBitXorImmBitXorArgImm):
1699         (testBitXorArgs32):
1700         (testBitXorSameArg32):
1701         (testBitXorImms32):
1702         (testBitXorArgImm32):
1703         (testBitXorImmArg32):
1704         (testBitXorBitXorArgImmImm32):
1705         (testBitXorImmBitXorArgImm32):
1706         (testBitNotArg):
1707         (testBitNotImm):
1708         (testBitNotMem):
1709         (testBitNotArg32):
1710         (testBitNotImm32):
1711         (testBitNotMem32):
1712         (testNotOnBooleanAndBranch32):
1713         (testBitNotOnBooleanAndBranch32):
1714         (testShlArgs):
1715         (testShlImms):
1716         (testShlArgImm):
1717         (testShlSShrArgImm):
1718         (testShlArg32):
1719         (testShlArgs32):
1720         (testShlImms32):
1721         (testShlArgImm32):
1722         (testShlZShrArgImm32):
1723         (testSShrArgs):
1724         (testSShrImms):
1725         (testSShrArgImm):
1726         (testSShrArg32):
1727         (testSShrArgs32):
1728         (testSShrImms32):
1729         (testSShrArgImm32):
1730         (testZShrArgs):
1731         (testZShrImms):
1732         (testZShrArgImm):
1733         (testZShrArg32):
1734         (testZShrArgs32):
1735         (testZShrImms32):
1736         (testZShrArgImm32):
1737         (countLeadingZero):
1738         (testClzArg64):
1739         (testClzMem64):
1740         (testClzArg32):
1741         (testClzMem32):
1742         (testAbsArg):
1743         (testAbsImm):
1744         (testAbsMem):
1745         (testAbsAbsArg):
1746         (testAbsNegArg):
1747         (testAbsBitwiseCastArg):
1748         (testBitwiseCastAbsBitwiseCastArg):
1749         (testAbsArgWithUselessDoubleConversion):
1750         (testAbsArgWithEffectfulDoubleConversion):
1751         (testCeilArg):
1752         (testCeilImm):
1753         (testCeilMem):
1754         (testCeilCeilArg):
1755         (testFloorCeilArg):
1756         (testCeilIToD64):
1757         (testCeilIToD32):
1758         (testCeilArgWithUselessDoubleConversion):
1759         (testCeilArgWithEffectfulDoubleConversion):
1760         (testFloorArg):
1761         (testFloorImm):
1762         (testFloorMem):
1763         (testFloorFloorArg):
1764         (testCeilFloorArg):
1765         (testFloorIToD64):
1766         (testFloorIToD32):
1767         (testFloorArgWithUselessDoubleConversion):
1768         (testFloorArgWithEffectfulDoubleConversion):
1769         (correctSqrt):
1770         (testSqrtArg):
1771         (testSqrtImm):
1772         (testSqrtMem):
1773         (testSqrtArgWithUselessDoubleConversion):
1774         (testSqrtArgWithEffectfulDoubleConversion):
1775         (testCompareTwoFloatToDouble):
1776         (testCompareOneFloatToDouble):
1777         (testCompareFloatToDoubleThroughPhi):
1778         (testDoubleToFloatThroughPhi):
1779         (testReduceFloatToDoubleValidates):
1780         (testDoubleProducerPhiToFloatConversion):
1781         (testDoubleProducerPhiToFloatConversionWithDoubleConsumer):
1782         (testDoubleProducerPhiWithNonFloatConst):
1783         (testDoubleArgToInt64BitwiseCast):
1784         (testDoubleImmToInt64BitwiseCast):
1785         (testTwoBitwiseCastOnDouble):
1786         (testBitwiseCastOnDoubleInMemory):
1787         (testBitwiseCastOnDoubleInMemoryIndexed):
1788         (testInt64BArgToDoubleBitwiseCast):
1789         (testInt64BImmToDoubleBitwiseCast):
1790         (testTwoBitwiseCastOnInt64):
1791         (testBitwiseCastOnInt64InMemory):
1792         (testBitwiseCastOnInt64InMemoryIndexed):
1793         (testFloatImmToInt32BitwiseCast):
1794         (testBitwiseCastOnFloatInMemory):
1795         (testInt32BArgToFloatBitwiseCast):
1796         (testInt32BImmToFloatBitwiseCast):
1797         (testTwoBitwiseCastOnInt32):
1798         (testBitwiseCastOnInt32InMemory):
1799         (testConvertDoubleToFloatArg):
1800         (testConvertDoubleToFloatImm):
1801         (testConvertDoubleToFloatMem):
1802         (testConvertFloatToDoubleArg):
1803         (testConvertFloatToDoubleImm):
1804         (testConvertFloatToDoubleMem):
1805         (testConvertDoubleToFloatToDoubleToFloat):
1806         (testLoadFloatConvertDoubleConvertFloatStoreFloat):
1807         (testFroundArg):
1808         (testFroundMem):
1809         (testIToD64Arg):
1810         (testIToF64Arg):
1811         (testIToD32Arg):
1812         (testIToF32Arg):
1813         (testIToD64Mem):
1814         (testIToF64Mem):
1815         (testIToD32Mem):
1816         (testIToF32Mem):
1817         (testIToD64Imm):
1818         (testIToF64Imm):
1819         (testIToD32Imm):
1820         (testIToF32Imm):
1821         (testIToDReducedToIToF64Arg):
1822         (testIToDReducedToIToF32Arg):
1823         (testStore32):
1824         (testStoreConstant):
1825         (testStoreConstantPtr):
1826         (testStore8Arg):
1827         (testStore8Imm):
1828         (testStorePartial8BitRegisterOnX86):
1829         (testStore16Arg):
1830         (testStore16Imm):
1831         (testTrunc):
1832         (testAdd1):
1833         (testAdd1Ptr):
1834         (testNeg32):
1835         (testNegPtr):
1836         (testStoreAddLoad32):
1837         * b3/testb3_4.cpp: Added.
1838         (testStoreRelAddLoadAcq32):
1839         (testStoreAddLoadImm32):
1840         (testStoreAddLoad8):
1841         (testStoreRelAddLoadAcq8):
1842         (testStoreRelAddFenceLoadAcq8):
1843         (testStoreAddLoadImm8):
1844         (testStoreAddLoad16):
1845         (testStoreRelAddLoadAcq16):
1846         (testStoreAddLoadImm16):
1847         (testStoreAddLoad64):
1848         (testStoreRelAddLoadAcq64):
1849         (testStoreAddLoadImm64):
1850         (testStoreAddLoad32Index):
1851         (testStoreAddLoadImm32Index):
1852         (testStoreAddLoad8Index):
1853         (testStoreAddLoadImm8Index):
1854         (testStoreAddLoad16Index):
1855         (testStoreAddLoadImm16Index):
1856         (testStoreAddLoad64Index):
1857         (testStoreAddLoadImm64Index):
1858         (testStoreSubLoad):
1859         (testStoreAddLoadInterference):
1860         (testStoreAddAndLoad):
1861         (testStoreNegLoad32):
1862         (testStoreNegLoadPtr):
1863         (testAdd1Uncommuted):
1864         (testLoadOffset):
1865         (testLoadOffsetNotConstant):
1866         (testLoadOffsetUsingAdd):
1867         (testLoadOffsetUsingAddInterference):
1868         (testLoadOffsetUsingAddNotConstant):
1869         (testLoadAddrShift):
1870         (testFramePointer):
1871         (testOverrideFramePointer):
1872         (testStackSlot):
1873         (testLoadFromFramePointer):
1874         (testStoreLoadStackSlot):
1875         (testStoreFloat):
1876         (testStoreDoubleConstantAsFloat):
1877         (testSpillGP):
1878         (testSpillFP):
1879         (testInt32ToDoublePartialRegisterStall):
1880         (testInt32ToDoublePartialRegisterWithoutStall):
1881         (testBranch):
1882         (testBranchPtr):
1883         (testDiamond):
1884         (testBranchNotEqual):
1885         (testBranchNotEqualCommute):
1886         (testBranchNotEqualNotEqual):
1887         (testBranchEqual):
1888         (testBranchEqualEqual):
1889         (testBranchEqualCommute):
1890         (testBranchEqualEqual1):
1891         (testBranchEqualOrUnorderedArgs):
1892         (testBranchNotEqualAndOrderedArgs):
1893         (testBranchEqualOrUnorderedDoubleArgImm):
1894         (testBranchEqualOrUnorderedFloatArgImm):
1895         (testBranchEqualOrUnorderedDoubleImms):
1896         (testBranchEqualOrUnorderedFloatImms):
1897         (testBranchEqualOrUnorderedFloatWithUselessDoubleConversion):
1898         (testBranchFold):
1899         (testDiamondFold):
1900         (testBranchNotEqualFoldPtr):
1901         (testBranchEqualFoldPtr):
1902         (testBranchLoadPtr):
1903         (testBranchLoad32):
1904         (testBranchLoad8S):
1905         (testBranchLoad8Z):
1906         (testBranchLoad16S):
1907         (testBranchLoad16Z):
1908         (testBranch8WithLoad8ZIndex):
1909         (testComplex):
1910         (testBranchBitTest32TmpImm):
1911         (testBranchBitTest32AddrImm):
1912         (testBranchBitTest32TmpTmp):
1913         (testBranchBitTest64TmpTmp):
1914         (testBranchBitTest64AddrTmp):
1915         (testBranchBitTestNegation):
1916         (testBranchBitTestNegation2):
1917         (testSimplePatchpoint):
1918         (testSimplePatchpointWithoutOuputClobbersGPArgs):
1919         (testSimplePatchpointWithOuputClobbersGPArgs):
1920         (testSimplePatchpointWithoutOuputClobbersFPArgs):
1921         (testSimplePatchpointWithOuputClobbersFPArgs):
1922         (testPatchpointWithEarlyClobber):
1923         (testPatchpointCallArg):
1924         (testPatchpointFixedRegister):
1925         (testPatchpointAny):
1926         (testPatchpointGPScratch):
1927         (testPatchpointFPScratch):
1928         (testPatchpointLotsOfLateAnys):
1929         (testPatchpointAnyImm):
1930         * b3/testb3_5.cpp: Added.
1931         (testPatchpointManyImms):
1932         (testPatchpointWithRegisterResult):
1933         (testPatchpointWithStackArgumentResult):
1934         (testPatchpointWithAnyResult):
1935         (testSimpleCheck):
1936         (testCheckFalse):
1937         (testCheckTrue):
1938         (testCheckLessThan):
1939         (testCheckMegaCombo):
1940         (testCheckTrickyMegaCombo):
1941         (testCheckTwoMegaCombos):
1942         (testCheckTwoNonRedundantMegaCombos):
1943         (testCheckAddImm):
1944         (testCheckAddImmCommute):
1945         (testCheckAddImmSomeRegister):
1946         (testCheckAdd):
1947         (testCheckAdd64):
1948         (testCheckAddFold):
1949         (testCheckAddFoldFail):
1950         (testCheckAddArgumentAliasing64):
1951         (testCheckAddArgumentAliasing32):
1952         (testCheckAddSelfOverflow64):
1953         (testCheckAddSelfOverflow32):
1954         (testCheckSubImm):
1955         (testCheckSubBadImm):
1956         (testCheckSub):
1957         (doubleSub):
1958         (testCheckSub64):
1959         (testCheckSubFold):
1960         (testCheckSubFoldFail):
1961         (testCheckNeg):
1962         (testCheckNeg64):
1963         (testCheckMul):
1964         (testCheckMulMemory):
1965         (testCheckMul2):
1966         (testCheckMul64):
1967         (testCheckMulFold):
1968         (testCheckMulFoldFail):
1969         (testCheckMulArgumentAliasing64):
1970         (testCheckMulArgumentAliasing32):
1971         (testCheckMul64SShr):
1972         (genericTestCompare):
1973         (modelCompare):
1974         (testCompareLoad):
1975         (testCompareImpl):
1976         (testCompare):
1977         (testEqualDouble):
1978         (simpleFunction):
1979         (testCallSimple):
1980         (testCallRare):
1981         (testCallRareLive):
1982         (testCallSimplePure):
1983         (functionWithHellaArguments):
1984         (testCallFunctionWithHellaArguments):
1985         (functionWithHellaArguments2):
1986         (testCallFunctionWithHellaArguments2):
1987         (functionWithHellaArguments3):
1988         (testCallFunctionWithHellaArguments3):
1989         (testReturnDouble):
1990         (testReturnFloat):
1991         (simpleFunctionDouble):
1992         (testCallSimpleDouble):
1993         (simpleFunctionFloat):
1994         (testCallSimpleFloat):
1995         (functionWithHellaDoubleArguments):
1996         (testCallFunctionWithHellaDoubleArguments):
1997         (functionWithHellaFloatArguments):
1998         (testCallFunctionWithHellaFloatArguments):
1999         (testLinearScanWithCalleeOnStack):
2000         (testChillDiv):
2001         (testChillDivTwice):
2002         (testChillDiv64):
2003         (testModArg):
2004         (testModArgs):
2005         (testModImms):
2006         (testModArg32):
2007         (testModArgs32):
2008         (testModImms32):
2009         (testChillModArg):
2010         (testChillModArgs):
2011         (testChillModImms):
2012         (testChillModArg32):
2013         (testChillModArgs32):
2014         (testChillModImms32):
2015         (testLoopWithMultipleHeaderEdges):
2016         (testSwitch):
2017         (testSwitchSameCaseAsDefault):
2018         (testSwitchChillDiv):
2019         (testSwitchTargettingSameBlock):
2020         (testSwitchTargettingSameBlockFoldPathConstant):
2021         (testTruncFold):
2022         (testZExt32):
2023         (testZExt32Fold):
2024         (testSExt32):
2025         (testSExt32Fold):
2026         (testTruncZExt32):
2027         (testTruncSExt32):
2028         (testSExt8):
2029         (testSExt8Fold):
2030         (testSExt8SExt8):
2031         (testSExt8SExt16):
2032         (testSExt8BitAnd):
2033         (testBitAndSExt8):
2034         (testSExt16):
2035         (testSExt16Fold):
2036         (testSExt16SExt16):
2037         (testSExt16SExt8):
2038         (testSExt16BitAnd):
2039         (testBitAndSExt16):
2040         (testSExt32BitAnd):
2041         * b3/testb3_6.cpp: Added.
2042         (testBitAndSExt32):
2043         (testBasicSelect):
2044         (testSelectTest):
2045         (testSelectCompareDouble):
2046         (testSelectCompareFloat):
2047         (testSelectCompareFloatToDouble):
2048         (testSelectDouble):
2049         (testSelectDoubleTest):
2050         (testSelectDoubleCompareDouble):
2051         (testSelectDoubleCompareFloat):
2052         (testSelectFloatCompareFloat):
2053         (testSelectDoubleCompareDoubleWithAliasing):
2054         (testSelectFloatCompareFloatWithAliasing):
2055         (testSelectFold):
2056         (testSelectInvert):
2057         (testCheckSelect):
2058         (testCheckSelectCheckSelect):
2059         (testCheckSelectAndCSE):
2060         (b3Pow):
2061         (testPowDoubleByIntegerLoop):
2062         (testTruncOrHigh):
2063         (testTruncOrLow):
2064         (testBitAndOrHigh):
2065         (testBitAndOrLow):
2066         (testBranch64Equal):
2067         (testBranch64EqualImm):
2068         (testBranch64EqualMem):
2069         (testBranch64EqualMemImm):
2070         (testStore8Load8Z):
2071         (testStore16Load16Z):
2072         (testSShrShl32):
2073         (testSShrShl64):
2074         (testTrivialInfiniteLoop):
2075         (testFoldPathEqual):
2076         (testLShiftSelf32):
2077         (testRShiftSelf32):
2078         (testURShiftSelf32):
2079         (testLShiftSelf64):
2080         (testRShiftSelf64):
2081         (testURShiftSelf64):
2082         (testPatchpointDoubleRegs):
2083         (testSpillDefSmallerThanUse):
2084         (testSpillUseLargerThanDef):
2085         (testLateRegister):
2086         (interpreterPrint):
2087         (testInterpreter):
2088         (testReduceStrengthCheckBottomUseInAnotherBlock):
2089         (testResetReachabilityDanglingReference):
2090         (testEntrySwitchSimple):
2091         (testEntrySwitchNoEntrySwitch):
2092         (testEntrySwitchWithCommonPaths):
2093         (testEntrySwitchWithCommonPathsAndNonTrivialEntrypoint):
2094         (testEntrySwitchLoop):
2095         (testSomeEarlyRegister):
2096         (testBranchBitAndImmFusion):
2097         (testTerminalPatchpointThatNeedsToBeSpilled):
2098         (testTerminalPatchpointThatNeedsToBeSpilled2):
2099         (testPatchpointTerminalReturnValue):
2100         (testMemoryFence):
2101         (testStoreFence):
2102         (testLoadFence):
2103         (testTrappingLoad):
2104         (testTrappingStore):
2105         (testTrappingLoadAddStore):
2106         (testTrappingLoadDCE):
2107         (testTrappingStoreElimination):
2108         (testMoveConstants):
2109         (testPCOriginMapDoesntInsertNops):
2110         * b3/testb3_7.cpp: Added.
2111         (testPinRegisters):
2112         (testX86LeaAddAddShlLeft):
2113         (testX86LeaAddAddShlRight):
2114         (testX86LeaAddAdd):
2115         (testX86LeaAddShlRight):
2116         (testX86LeaAddShlLeftScale1):
2117         (testX86LeaAddShlLeftScale2):
2118         (testX86LeaAddShlLeftScale4):
2119         (testX86LeaAddShlLeftScale8):
2120         (testAddShl32):
2121         (testAddShl64):
2122         (testAddShl65):
2123         (testReduceStrengthReassociation):
2124         (testLoadBaseIndexShift2):
2125         (testLoadBaseIndexShift32):
2126         (testOptimizeMaterialization):
2127         (generateLoop):
2128         (makeArrayForLoops):
2129         (generateLoopNotBackwardsDominant):
2130         (oneFunction):
2131         (noOpFunction):
2132         (testLICMPure):
2133         (testLICMPureSideExits):
2134         (testLICMPureWritesPinned):
2135         (testLICMPureWrites):
2136         (testLICMReadsLocalState):
2137         (testLICMReadsPinned):
2138         (testLICMReads):
2139         (testLICMPureNotBackwardsDominant):
2140         (testLICMPureFoiledByChild):
2141         (testLICMPureNotBackwardsDominantFoiledByChild):
2142         (testLICMExitsSideways):
2143         (testLICMWritesLocalState):
2144         (testLICMWrites):
2145         (testLICMFence):
2146         (testLICMWritesPinned):
2147         (testLICMControlDependent):
2148         (testLICMControlDependentNotBackwardsDominant):
2149         (testLICMControlDependentSideExits):
2150         (testLICMReadsPinnedWritesPinned):
2151         (testLICMReadsWritesDifferentHeaps):
2152         (testLICMReadsWritesOverlappingHeaps):
2153         (testLICMDefaultCall):
2154         (testDepend32):
2155         (testDepend64):
2156         (testWasmBoundsCheck):
2157         (testWasmAddress):
2158         (testFastTLSLoad):
2159         (testFastTLSStore):
2160         (doubleEq):
2161         (doubleNeq):
2162         (doubleGt):
2163         (doubleGte):
2164         (doubleLt):
2165         (doubleLte):
2166         (testDoubleLiteralComparison):
2167         (testFloatEqualOrUnorderedFolding):
2168         (testFloatEqualOrUnorderedFoldingNaN):
2169         (testFloatEqualOrUnorderedDontFold):
2170         (functionNineArgs):
2171         (testShuffleDoesntTrashCalleeSaves):
2172         (testDemotePatchpointTerminal):
2173         (testReportUsedRegistersLateUseFollowedByEarlyDefDoesNotMarkUseAsDead):
2174         (testInfiniteLoopDoesntCauseBadHoisting):
2175         * b3/testb3_8.cpp: Added.
2176         (testAtomicWeakCAS):
2177         (testAtomicStrongCAS):
2178         (testAtomicXchg):
2179         (addAtomicTests):
2180         (testLoad):
2181         (addLoadTests):
2182
2183 2019-07-30  Yusuke Suzuki  <ysuzuki@apple.com>
2184
2185         [JSC] Emit write barrier after storing instead of before storing
2186         https://bugs.webkit.org/show_bug.cgi?id=200193
2187
2188         Reviewed by Saam Barati.
2189
2190         I reviewed tricky GC-related code including visitChildren and manual writeBarrier, and I found that we have several problems with write-barriers.
2191
2192         1. Some write-barriers are emitted before stores happen
2193
2194             Some code like LazyProperty emits write-barrier before we store the value. This is wrong since JSC has concurrent collector. Let's consider the situation like this.
2195
2196                 1. Cell "A" is not marked yet
2197                 2. Write-barrier is emitted onto "A"
2198                 3. Concurrent collector scans "A"
2199                 4. Store to "A"'s field happens
2200                 5. (4)'s field is not rescaned
2201
2202             We should emit write-barrier after stores. This patch places write-barriers after stores happen.
2203
2204         2. Should emit write-barrier after the stored fields are reachable from the owner.
2205
2206             We have code that is logically the same to the following.
2207
2208                 ```
2209                 auto data = std::make_unique<XXX>();
2210                 data->m_field.set(vm, owner, value);
2211
2212                 storeStoreBarrier();
2213                 owner->m_data = WTFMove(data);
2214                 ```
2215
2216             This is not correct. When write-barrier is emitted, the owner cannot reach to the field that is stored.
2217             The actual example is AccessCase. We are emitting write-barriers with owner when creating AccessCase, but this is not
2218             effective until this AccessCase is chained to StructureStubInfo, which is reachable from CodeBlock.
2219
2220             I don't think this is actually an issue because currently AccessCase generation is guarded by CodeBlock->m_lock. And CodeBlock::visitChildren takes this lock.
2221             But emitting a write-barrier at the right place is still better. This patch places write-barriers when StructureStubInfo::addAccessCase is called.
2222
2223         Speculative GC fix, it was hard to reproduce the crash since we need to control concurrent collector and main thread's scheduling in an instruction-level.
2224
2225         * bytecode/BytecodeList.rb:
2226         * bytecode/CodeBlock.cpp:
2227         (JSC::CodeBlock::finishCreation):
2228         * bytecode/StructureStubInfo.cpp:
2229         (JSC::StructureStubInfo::addAccessCase):
2230         * bytecode/StructureStubInfo.h:
2231         (JSC::StructureStubInfo::considerCaching):
2232         * dfg/DFGPlan.cpp:
2233         (JSC::DFG::Plan::finalizeWithoutNotifyingCallback):
2234         * jit/JITOperations.cpp:
2235         * llint/LLIntSlowPaths.cpp:
2236         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
2237         (JSC::LLInt::setupGetByIdPrototypeCache):
2238         * runtime/CommonSlowPaths.cpp:
2239         (JSC::SLOW_PATH_DECL):
2240         * runtime/LazyPropertyInlines.h:
2241         (JSC::ElementType>::setMayBeNull):
2242         * runtime/RegExpCachedResult.h:
2243         (JSC::RegExpCachedResult::record):
2244
2245 2019-07-30  Yusuke Suzuki  <ysuzuki@apple.com>
2246
2247         [JSC] Make StructureChain less-tricky by using Auxiliary Buffer
2248         https://bugs.webkit.org/show_bug.cgi?id=200192
2249
2250         Reviewed by Saam Barati.
2251
2252         StructureChain has a bit tricky write barrier / mutator fence to use UniqueArray for its underlying storage.
2253         But, since the size of StructureChain is fixed at initialization, we should allocate an underlying storage from auxiliary memory and
2254         set it in its constructor instead of finishCreation. We can store values in the finishCreation so that we do not need to have
2255         a hacky write-barrier and mutator fence. Furthermore, we can make StructureChain non-destructible.
2256
2257         This patch leverages auxiliary buffer for the implementation of StructureChain. And it also adds a test that stresses StructureChain creation.
2258
2259         * runtime/StructureChain.cpp:
2260         (JSC::StructureChain::StructureChain):
2261         (JSC::StructureChain::create):
2262         (JSC::StructureChain::finishCreation):
2263         (JSC::StructureChain::visitChildren):
2264         (JSC::StructureChain::destroy): Deleted.
2265         * runtime/StructureChain.h:
2266
2267 2019-07-29  Yusuke Suzuki  <ysuzuki@apple.com>
2268
2269         [JSC] Increment bytecode age only when SlotVisitor is first-visit
2270         https://bugs.webkit.org/show_bug.cgi?id=200196
2271
2272         Reviewed by Robin Morisset.
2273
2274         WriteBarrier can cause multiple visits for the same UnlinkedCodeBlock. But this does not mean that we are having multiple cycles of GC.
2275         We should increment the age of the UnlinkedCodeBlock only when the SlotVisitor is saying that this is the first visit.
2276
2277         In practice,this almost never happens. Multiple visits can happen only when the marked UnlinkedCodeBlock gets a write-barrier. But, mutation
2278         of UnlinkedCodeBlock is rare or none after it is initialized. I ran all the JSTests and I cannot find any tests that get re-visiting of UnlinkedCodeBlock.
2279         This patch extends JSTests/stress/reparsing-unlinked-codeblock.js to ensure that UnlinkedCodeBlockJettisoning feature is working after this change.
2280
2281         * bytecode/UnlinkedCodeBlock.cpp:
2282         (JSC::UnlinkedCodeBlock::visitChildren):
2283         * heap/SlotVisitor.h:
2284         (JSC::SlotVisitor::isFirstVisit const):
2285         * parser/Parser.cpp:
2286         * parser/Parser.h:
2287         (JSC::parse):
2288         (JSC::parseFunctionForFunctionConstructor):
2289         * runtime/Options.h:
2290         * tools/JSDollarVM.cpp:
2291         (JSC::functionParseCount):
2292         (JSC::JSDollarVM::finishCreation):
2293
2294 2019-07-28  Commit Queue  <commit-queue@webkit.org>
2295
2296         Unreviewed, rolling out r247886.
2297         https://bugs.webkit.org/show_bug.cgi?id=200214
2298
2299         "Causes PLT5 regression on some machines" (Requested by mlam|a
2300         on #webkit).
2301
2302         Reverted changeset:
2303
2304         "Add crash diagnostics for debugging unexpected zapped cells."
2305         https://bugs.webkit.org/show_bug.cgi?id=200149
2306         https://trac.webkit.org/changeset/247886
2307
2308 2019-07-27  Justin Michaud  <justin_michaud@apple.com>
2309
2310         [X86] Emit BT instruction for shift + mask in B3
2311         https://bugs.webkit.org/show_bug.cgi?id=199891
2312
2313         Reviewed by Keith Miller.
2314
2315         - Add a new BranchTestBit air opcode, matching the intel bt instruction
2316         - Select this instruction for the following patterns:
2317           if (a & (1<<b))
2318           if ((a>>b)&1)
2319           if ((~a>>b)&1)
2320           if (~a & (1<<b))
2321         - 15% perf progression on the nonconstant microbenchmark, neutral otherwise.
2322         - Note: we cannot fuse loads when we have bitBase=Load, bitOffset=Tmp, since the X86 instruction has 
2323           different behaviour in this mode. It will read past the current dword/qword instead of wrapping around.
2324
2325         * assembler/MacroAssemblerX86Common.h:
2326         (JSC::MacroAssemblerX86Common::branchTestBit32):
2327         * assembler/MacroAssemblerX86_64.h:
2328         (JSC::MacroAssemblerX86_64::branchTestBit64):
2329         * assembler/X86Assembler.h:
2330         (JSC::X86Assembler::bt_ir):
2331         (JSC::X86Assembler::bt_im):
2332         (JSC::X86Assembler::btw_ir):
2333         (JSC::X86Assembler::btw_im):
2334         * assembler/testmasm.cpp:
2335         (JSC::int64Operands):
2336         (JSC::testBranchTestBit32RegReg):
2337         (JSC::testBranchTestBit32RegImm):
2338         (JSC::testBranchTestBit32AddrImm):
2339         (JSC::testBranchTestBit64RegReg):
2340         (JSC::testBranchTestBit64RegImm):
2341         (JSC::testBranchTestBit64AddrImm):
2342         (JSC::run):
2343         * b3/B3LowerToAir.cpp:
2344         * b3/air/AirOpcode.opcodes:
2345         * b3/testb3.cpp:
2346         (JSC::B3::testBranchBitTest32TmpImm):
2347         (JSC::B3::testBranchBitTest32AddrImm):
2348         (JSC::B3::testBranchBitTest32TmpTmp):
2349         (JSC::B3::testBranchBitTest64TmpTmp):
2350         (JSC::B3::testBranchBitTest64AddrTmp):
2351         (JSC::B3::run):
2352
2353 2019-07-26  Yusuke Suzuki  <ysuzuki@apple.com>
2354
2355         [JSC] Potential GC fix for JSPropertyNameEnumerator
2356         https://bugs.webkit.org/show_bug.cgi?id=200151
2357
2358         Reviewed by Mark Lam.
2359
2360         We have been seeing some JSPropertyNameEnumerator::visitChildren crashes for a long time. The crash frequency itself is not high, but it has existed for a long time.
2361         The crash happens when visiting m_propertyNames. It is also possible that this crash is caused by random corruption somewhere, but JSPropertyNameEnumerator
2362         has some tricky (and potentially dangerous) implementations anyway.
2363
2364         1. JSPropertyNameEnumerator have Vector<WriteBarrier<JSString>> and it is extended in finishCreation with a lock.
2365            We should use Auxiliary memory for this use case. And we should set this memory in the constructor so that
2366            we do not extend it in finishCreation, and we do not need a lock.
2367         2. JSPropertyNameEnumerator gets StructureID before allocating JSPropertyNameEnumerator. This is potentially dangerous because the conservative scan
2368            cannot find the Structure* since we could only have StructureID. Since allocation code happens after StructureID is retrieved, it is possible that
2369            the allocation causes GC and Structure* is collected.
2370
2371         In this patch, we align JSPropertyNameEnumerator implementation to the modern one to avoid using Vector<WriteBarrier<JSString>>. And we can make JSPropertyNameEnumerator
2372         a non-destructible cell. Since JSCell's destructor is one of the cause of various issues, we should avoid it if we can.
2373
2374         No behavior change. This patch adds a test stressing JSPropertyNameEnumerator.
2375
2376         * dfg/DFGOperations.cpp:
2377         * runtime/CommonSlowPaths.cpp:
2378         (JSC::SLOW_PATH_DECL):
2379         * runtime/JSPropertyNameEnumerator.cpp:
2380         (JSC::JSPropertyNameEnumerator::create):
2381         (JSC::JSPropertyNameEnumerator::JSPropertyNameEnumerator):
2382         (JSC::JSPropertyNameEnumerator::finishCreation):
2383         (JSC::JSPropertyNameEnumerator::visitChildren):
2384         (JSC::JSPropertyNameEnumerator::destroy): Deleted.
2385         * runtime/JSPropertyNameEnumerator.h:
2386         * runtime/VM.cpp:
2387         (JSC::VM::emptyPropertyNameEnumeratorSlow):
2388         * runtime/VM.h:
2389         (JSC::VM::emptyPropertyNameEnumerator):
2390
2391 2019-07-26  Mark Lam  <mark.lam@apple.com>
2392
2393         Add crash diagnostics for debugging unexpected zapped cells.
2394         https://bugs.webkit.org/show_bug.cgi?id=200149
2395         <rdar://problem/53570112>
2396
2397         Reviewed by Yusuke Suzuki, Saam Barati, and Michael Saboff.
2398
2399         Add a check for zapped cells in SlotVisitor::appendToMarkStack() and
2400         SlotVisitor::visitChildren().  If a zapped cell is detected, we will crash with
2401         some diagnostic info.
2402
2403         To facilitate this, we've made the following changes:
2404         1. Changed FreeCell to preserve the 1st 8 bytes.  This is fine to do because all
2405            cells are at least 16 bytes long.
2406         2. Changed HeapCell::zap() to only zap the structureID.  Leave the rest of the
2407            cell header info intact (including the cell JSType).
2408         3. Changed HeapCell::zap() to record the reason for zapping the cell.  We stash
2409            the reason immediately after the first 8 bytes.  This is the same location as
2410            FreeCell::scrambledNext.  However, since a cell is not expected to be zapped
2411            and on the free list at the same time, it is also fine to do this.
2412         4. Added a few utility functions to MarkedBlock for checking if a cell points
2413            into the block.
2414         5. Added VMInspector and JSDollarVM utilities to dump in-use subspace hashes.
2415         6. Added some comments to document the hashes of known subspaces.
2416
2417         * heap/FreeList.h:
2418         (JSC::FreeCell::offsetOfScrambledNext):
2419         * heap/HeapCell.h:
2420         (JSC::HeapCell::zap):
2421         (JSC::HeapCell::isZapped const):
2422         * heap/MarkedBlock.cpp:
2423         (JSC::MarkedBlock::Handle::stopAllocating):
2424         * heap/MarkedBlock.h:
2425         (JSC::MarkedBlock::Handle::start const):
2426         (JSC::MarkedBlock::Handle::end const):
2427         (JSC::MarkedBlock::Handle::contains const):
2428         * heap/MarkedBlockInlines.h:
2429         (JSC::MarkedBlock::Handle::specializedSweep):
2430         * heap/MarkedSpace.h:
2431         (JSC::MarkedSpace::forEachSubspace):
2432         * heap/SlotVisitor.cpp:
2433         (JSC::SlotVisitor::appendToMarkStack):
2434         (JSC::SlotVisitor::visitChildren):
2435         (JSC::SlotVisitor::reportZappedCellAndCrash):
2436         * heap/SlotVisitor.h:
2437         * jit/AssemblyHelpers.cpp:
2438         (JSC::AssemblyHelpers::emitAllocateWithNonNullAllocator):
2439         * runtime/VM.cpp:
2440         (JSC::VM::VM):
2441         * tools/JSDollarVM.cpp:
2442         (JSC::functionDumpSubspaceHashes):
2443         (JSC::JSDollarVM::finishCreation):
2444         * tools/VMInspector.cpp:
2445         (JSC::VMInspector::dumpSubspaceHashes):
2446         * tools/VMInspector.h:
2447
2448 2019-07-25  Yusuke Suzuki  <ysuzuki@apple.com>
2449
2450         [JSC] Use unalignedLoad for JSRopeString fiber accesses
2451         https://bugs.webkit.org/show_bug.cgi?id=200148
2452
2453         Reviewed by Mark Lam.
2454
2455         JSRopeString always have some subsequent bytes that can be accessible because MarkedBlock has Footer.
2456         We use WTF::unalignedLoad to get fibers. And it will be converted to one load CPU instruction.
2457
2458         * heap/MarkedBlock.h:
2459         * runtime/JSString.h:
2460
2461 2019-07-25  Ross Kirsling  <ross.kirsling@sony.com>
2462
2463         Legacy numeric literals should not permit separators or BigInt
2464         https://bugs.webkit.org/show_bug.cgi?id=199984
2465
2466         Reviewed by Keith Miller.
2467
2468         * parser/Lexer.cpp:
2469         (JSC::Lexer<T>::parseOctal):
2470         (JSC::Lexer<T>::parseDecimal):
2471
2472 2019-07-25  Yusuke Suzuki  <ysuzuki@apple.com>
2473
2474         Unreviewed, build fix due to C++17's std::invoke_result_t
2475         https://bugs.webkit.org/show_bug.cgi?id=200139
2476
2477         Use std::result_of for now until all the supported environments implement it.
2478
2479         * heap/IsoSubspace.h:
2480
2481 2019-07-25  Yusuke Suzuki  <ysuzuki@apple.com>
2482
2483         [JSC] Ensure PackedCellPtr only takes non-large-allocation pointers
2484         https://bugs.webkit.org/show_bug.cgi?id=200139
2485
2486         Reviewed by Mark Lam.
2487
2488         PackedCellPtr will compact a pointer by leveraging the fact that JSCell pointers are 16byte aligned.
2489         But this fact only holds when the JSCell is not large allocation. Currently, we are using PackedCellPtr
2490         only for the cell types which meets the above requirement. But we would like to ensure that statically.
2491
2492         In this patch, we add additional static/runtime assertions to ensure this invariant. We accept a cell
2493         type of either (1) it is "final" annotated and sizeof(T) is <= MarkedSpace::largeCutoff or (2) it
2494         is allocated from IsoSubspace.
2495
2496         This patch does not change any behaviors. It just adds extra static/runtime assertions.
2497
2498         * bytecode/CodeBlock.h:
2499         (JSC::CodeBlock::subspaceFor):
2500         * bytecode/CodeBlockJettisoningWatchpoint.h:
2501         * bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h:
2502         * dfg/DFGAdaptiveStructureWatchpoint.h:
2503         * heap/IsoSubspace.h:
2504         * heap/PackedCellPtr.h:
2505         (JSC::PackedCellPtr::PackedCellPtr):
2506         * runtime/FunctionRareData.h:
2507         (JSC::FunctionRareData::createAllocationProfileClearingWatchpoint):
2508         * runtime/ObjectToStringAdaptiveStructureWatchpoint.h:
2509
2510 2019-07-25  Yusuke Suzuki  <ysuzuki@apple.com>
2511
2512         [JSC] Make visitChildren implementation more idiomatic
2513         https://bugs.webkit.org/show_bug.cgi?id=200121
2514
2515         Reviewed by Mark Lam.
2516
2517         This patch makes visitChildren implementations more idiomatic: cast, assert, and calling Base::visitChildren.
2518         While this does not find interesting issues, it is still nice to have consistent implementations.
2519         StructureChain::visitChildren missed Base::visitChildren, but it does not have much effect since StructureChain
2520         is immortal cell.
2521
2522         * bytecode/ExecutableToCodeBlockEdge.cpp:
2523         (JSC::ExecutableToCodeBlockEdge::visitChildren):
2524         * runtime/AbstractModuleRecord.cpp:
2525         (JSC::AbstractModuleRecord::visitChildren):
2526         * runtime/FunctionRareData.cpp:
2527         (JSC::FunctionRareData::visitChildren):
2528         * runtime/JSArrayBufferView.cpp:
2529         (JSC::JSArrayBufferView::visitChildren):
2530         * runtime/JSGenericTypedArrayViewInlines.h:
2531         (JSC::JSGenericTypedArrayView<Adaptor>::visitChildren):
2532         * runtime/JSImmutableButterfly.cpp:
2533         (JSC::JSImmutableButterfly::visitChildren):
2534         * runtime/JSModuleEnvironment.cpp:
2535         (JSC::JSModuleEnvironment::visitChildren):
2536         * runtime/JSModuleRecord.cpp:
2537         (JSC::JSModuleRecord::visitChildren):
2538         * runtime/JSPropertyNameEnumerator.cpp:
2539         (JSC::JSPropertyNameEnumerator::visitChildren):
2540         * runtime/JSString.cpp:
2541         (JSC::JSString::visitChildren):
2542         * runtime/SparseArrayValueMap.cpp:
2543         (JSC::SparseArrayValueMap::visitChildren):
2544         * runtime/StructureChain.cpp:
2545         (JSC::StructureChain::visitChildren):
2546         * runtime/SymbolTable.cpp:
2547         (JSC::SymbolTable::visitChildren):
2548         * tools/JSDollarVM.cpp:
2549         (JSC::Root::visitChildren):
2550         (JSC::ImpureGetter::visitChildren):
2551         * wasm/js/WebAssemblyModuleRecord.cpp:
2552         (JSC::WebAssemblyModuleRecord::visitChildren):
2553
2554 2019-07-25  Ross Kirsling  <ross.kirsling@sony.com>
2555
2556         [ESNext] Implement nullish coalescing
2557         https://bugs.webkit.org/show_bug.cgi?id=200072
2558
2559         Reviewed by Darin Adler.
2560
2561         Implement the nullish coalescing proposal, which has now reached Stage 3 at TC39.
2562
2563         This introduces a ?? operator which:
2564           - acts like || but checks for nullishness instead of truthiness
2565           - has a precedence lower than || (or any other binary operator)
2566           - must be disambiguated with parentheses when combined with || or &&
2567
2568         * bytecompiler/NodesCodegen.cpp:
2569         (JSC::CoalesceNode::emitBytecode): Added.
2570         Bytecode must use OpIsUndefinedOrNull and not OpNeqNull because of document.all.
2571
2572         * parser/ASTBuilder.h:
2573         (JSC::ASTBuilder::makeBinaryNode):
2574         * parser/Lexer.cpp:
2575         (JSC::Lexer<T>::lexWithoutClearingLineTerminator):
2576         * parser/NodeConstructors.h:
2577         (JSC::CoalesceNode::CoalesceNode): Added.
2578         * parser/Nodes.h:
2579         Introduce new token and AST node.
2580
2581         * parser/Parser.cpp:
2582         (JSC::Parser<LexerType>::parseBinaryExpression):
2583         Implement early error.
2584
2585         * parser/ParserTokens.h:
2586         Since this patch needs to shift the value of every binary operator token anyway,
2587         let's only bother to increment their LSBs when we actually have a precedence conflict.
2588
2589         * parser/ResultType.h:
2590         (JSC::ResultType::definitelyIsNull const): Added.
2591         (JSC::ResultType::mightBeUndefinedOrNull const): Added.
2592         (JSC::ResultType::forCoalesce): Added.
2593         We can do better than forLogicalOp here; let's be as accurate as possible.
2594
2595         * runtime/Options.h:
2596         Add runtime feature flag.
2597
2598 2019-07-24  Alexey Shvayka  <shvaikalesh@gmail.com>
2599
2600         Three checks are missing in Proxy internal methods
2601         https://bugs.webkit.org/show_bug.cgi?id=198630
2602
2603         Reviewed by Darin Adler.
2604
2605         Add three missing checks in Proxy internal methods.
2606         These checks are necessary to maintain the invariants of the essential internal methods.
2607         (https://github.com/tc39/ecma262/pull/666)
2608
2609         1. [[GetOwnProperty]] shouldn't return non-configurable and non-writable descriptor when the target's property is writable.
2610         2. [[Delete]] should return `false` when the target has property and is not extensible.
2611         3. [[DefineOwnProperty]] should return `true` for a non-writable input descriptor when the target's property is non-configurable and writable.
2612
2613         Shipping in SpiderMonkey since https://hg.mozilla.org/integration/autoland/rev/3a06bc818bc4 (version 69)
2614         Shipping in V8 since https://chromium.googlesource.com/v8/v8.git/+/e846ad9fa5109428be50b1989314e0e4e7267919
2615
2616         * runtime/ProxyObject.cpp:
2617         (JSC::ProxyObject::performInternalMethodGetOwnProperty): Add writability check.
2618         (JSC::ProxyObject::performDelete): Add extensibility check.
2619         (JSC::ProxyObject::performDefineOwnProperty): Add writability check.
2620
2621 2019-07-24  Mark Lam  <mark.lam@apple.com>
2622
2623         Remove some unused code.
2624         https://bugs.webkit.org/show_bug.cgi?id=200101
2625
2626         Reviewed by Yusuke Suzuki.
2627
2628         * heap/MarkedBlock.cpp:
2629         (JSC::MarkedBlock::Handle::zap): Deleted.
2630         * heap/MarkedBlock.h:
2631         * heap/SlotVisitor.cpp:
2632         (JSC::SlotVisitor::appendToMutatorMarkStack): Deleted.
2633         * heap/SlotVisitor.h:
2634
2635 2019-07-24  Mark Lam  <mark.lam@apple.com>
2636
2637         performJITMemcpy should be PACed with a non-zero diversifier when passed and called via a pointer.
2638         https://bugs.webkit.org/show_bug.cgi?id=200100
2639         <rdar://problem/53474939>
2640
2641         Reviewed by Yusuke Suzuki.
2642
2643         * assembler/ARM64Assembler.h:
2644         (JSC::ARM64Assembler::CopyFunction::CopyFunction):
2645         (JSC::ARM64Assembler::CopyFunction::operator()):
2646         - I choose to use ptrauth_auth_function() here instead of retagCodePtr() because
2647           retagCodePtr() would auth, assert, and re-pac the pointer.  This is needed in
2648           general because retagCodePtr() doesn't know that you will consume the pointer
2649           immediately (and therefore crash imminently if a failed auth is encountered).
2650           Since we know here that we will call with the auth'ed pointer immediately, we
2651           can skip the assert.
2652
2653           This also has the benefit of letting Clang do a peephole optimization to emit
2654           a blrab instruction with the intended diversifier, instead of emitting multiple
2655           instructions to auth the pointer into a C function, and then using a blraaz to
2656           do a C function call.
2657
2658         (JSC::ARM64Assembler::linkJumpOrCall):
2659         (JSC::ARM64Assembler::linkCompareAndBranch):
2660         (JSC::ARM64Assembler::linkConditionalBranch):
2661         (JSC::ARM64Assembler::linkTestAndBranch):
2662         * assembler/LinkBuffer.cpp:
2663         (JSC::LinkBuffer::copyCompactAndLinkCode):
2664         * runtime/JSCPtrTag.h:
2665
2666 2019-07-24  Devin Rousso  <drousso@apple.com>
2667
2668         Web Inspector: print the target of `console.screenshot` last so the target is the closest item to the image
2669         https://bugs.webkit.org/show_bug.cgi?id=199308
2670
2671         Reviewed by Joseph Pecoraro.
2672
2673         * inspector/ConsoleMessage.h:
2674         (Inspector::ConsoleMessage::arguments const):
2675
2676         * inspector/ScriptArguments.h:
2677         * inspector/ScriptArguments.cpp:
2678         (Inspector::ScriptArguments::getFirstArgumentAsString const): Added.
2679         (Inspector::ScriptArguments::getFirstArgumentAsString): Deleted.
2680
2681 2019-07-23  Justin Michaud  <justin_michaud@apple.com>
2682
2683         Sometimes we miss removable CheckInBounds
2684         https://bugs.webkit.org/show_bug.cgi?id=200018
2685
2686         Reviewed by Saam Barati.
2687
2688         We failed to remove the CheckInBounds bounds because we did not see that the index was nonnegative. This is because we do not see the relationship between the two
2689         separate zero constants that appear in the IR for the given test case. This patch re-adds the hack to de-duplicate m_zero that was removed in 
2690         <https://trac.webkit.org/changeset/241228/webkit>.
2691
2692         * dfg/DFGIntegerRangeOptimizationPhase.cpp:
2693
2694 2019-07-22  Yusuke Suzuki  <ysuzuki@apple.com>
2695
2696         [bmalloc] Each IsoPage gets 1MB VA because VMHeap::tryAllocateLargeChunk rounds up
2697         https://bugs.webkit.org/show_bug.cgi?id=200024
2698
2699         Reviewed by Saam Barati.
2700
2701         Discussed and we decided to use this VM tag for IsoHeap instead of CLoop stack.
2702
2703         * interpreter/CLoopStack.cpp:
2704         (JSC::CLoopStack::CLoopStack):
2705
2706 2019-07-22  Saam Barati  <sbarati@apple.com>
2707
2708         Turn off Wasm fast memory on iOS
2709         https://bugs.webkit.org/show_bug.cgi?id=200016
2710         <rdar://problem/53417726>
2711
2712         Reviewed by Yusuke Suzuki.
2713
2714         We turned them on when we disabled Gigacage on iOS. However, we re-enabled
2715         Gigacage on iOS, but forgot to turn wasm fast memories back off.
2716
2717         * runtime/Options.h:
2718
2719 2019-07-22  Ross Kirsling  <ross.kirsling@sony.com>
2720
2721         Unreviewed non-unified build fix.
2722
2723         * runtime/CachedTypes.h:
2724
2725 2019-07-20  Yusuke Suzuki  <ysuzuki@apple.com>
2726
2727         [JSC] Make DFG Local CSE and AI conservative for huge basic block
2728         https://bugs.webkit.org/show_bug.cgi?id=199929
2729         <rdar://problem/49309924>
2730
2731         Reviewed by Filip Pizlo.
2732
2733         In CNN page, the main thread hangs several seconds. On less-powerful devices (like iPhone7), it hangs for ~11 seconds. This is not an acceptable behavior.
2734         The reason of this is that the DFG compiler takes too long time in the compilation for a particular function. It takes 8765 ms even in powerful x64 machine!
2735         DFG compiler is concurrent one. However, when GC requires all the peripheral threads to be stopped, the main thread needs to wait for the DFG compiler's stop.
2736         DFG compiler stops at GC safepoints, and they are inserted between DFG phases. So, if some of DFG phases take very long time, the main thread is blocked during that.
2737         As a result, the main thread is blocked due to this pathological compilation.
2738
2739         By measuring the time taken in each DFG phase, we found that our AI and CSE phase have a problem having quadratic complexity for # of DFG nodes in a basic block.
2740         In this patch, we add a threshold for # of DFG nodes in a basic block. If a basic block exceeds this threshold, we use conservative but O(1) algorithm for AI and Local CSE phase.
2741         We did not add this threshold for Global CSE since FTL has another bytecode cost threshold which prevents us from compiling the large functions. But on the other hand,
2742         DFG should compile them because DFG is intended to be a fast compiler even for a bit larger CodeBlock.
2743
2744         We first attempted to reduce the threshold for DFG compilation. We are using 100000 bytecode cost for DFG compilation and it is very large. However, we found that bytecode cost
2745         is not the problem in CNN page. The problematic function has 67904 cost, and it takes 8765 ms in x64 machine. However, JetStream2/octane-zlib has 61949 function and it only takes
2746         ~400 ms. This difference comes from the # of DFG nodes in a basic block. The problematic function has 43297 DFG nodes in one basic block and it makes AI and Local CSE super time-consuming.
2747         Rather than relying on the bytecode cost which a bit indirectly related to this pathological compile-time, we should look into # of DFG nodes in a basic block which is more directly
2748         related to this problem. And we also found that 61949's Octane-zlib function is very critical for performance. This fact makes a bit hard to pick a right threshold: 67904 causes the problem,
2749         and 61949 must be compiled. This is why this patch is introducing conservative analysis instead of adjusting the threshold for DFG.
2750
2751         This patch has two changes.
2752
2753         1. DFG AI has structure transition tracking which has quadratic complexity
2754
2755         Structure transition tracking takes very long time since its complexity is O(N^2) where N is # of DFG nodes in a basic block.
2756         CNN has very pathological script and it shows 43297 DFG nodes. We should reduce the complexity of this algorithm.
2757         For now, we just say "structures are clobbered" if # of DFG nodes in a basic block exceeds the threshold (20000).
2758         We could improve the current algorithm from O(N^2) to O(2N) without being conservative, and I'm tracking this in [1].
2759
2760         2. DFG Local CSE has quadratic complexity
2761
2762         Local CSE's clobbering iterates all the impure heap values to remove the clobbered one. Since # of impure heap values tend to be proportional to # of DFG nodes we visited,
2763         each CSE for a basic block gets O(N^2) complexity. To avoid this, we introduce HugeMap. This has the same interface to LargeMap and SmallMap in CSE, but its clobbering
2764         implementation just clears the map completely. We can further make this O(N) without introducing conservative behavior by using epochs. For now, we do not see such a huge basic block in
2765         JetStream2 and Speedometer2 so I'll track it in a separate bug[2].
2766
2767         This patch reduces the compilation time from ~11 seconds to ~200 ms.
2768
2769         [1]: https://bugs.webkit.org/show_bug.cgi?id=199959
2770         [2]: https://bugs.webkit.org/show_bug.cgi?id=200014
2771
2772         * dfg/DFGAbstractInterpreterInlines.h:
2773         (JSC::DFG::AbstractInterpreter<AbstractStateType>::observeTransition):
2774         (JSC::DFG::AbstractInterpreter<AbstractStateType>::observeTransitions):
2775         * dfg/DFGCSEPhase.cpp:
2776         * runtime/Options.h:
2777
2778 2019-07-22  Zhifei Fang  <zhifei_fang@apple.com>
2779
2780         Need to skip test cache directory data vault for non internal build
2781         https://bugs.webkit.org/show_bug.cgi?id=199951
2782
2783         Reviewed by Alexey Proskuryakov.
2784
2785         * API/tests/testapi.mm:
2786         (testBytecodeCacheValidation): "Cache directory `/private/tmp` is not a data vault" this error message will only be created for internal build see JSScript.mm:97
2787
2788 2019-07-17  Antoine Quint  <graouts@apple.com>
2789
2790         Disable Pointer Events prior to watchOS 6
2791         https://bugs.webkit.org/show_bug.cgi?id=199890
2792         <rdar://problem/53206113>
2793
2794         Reviewed by Dean Jackson.
2795
2796         * Configurations/FeatureDefines.xcconfig:
2797
2798 2019-07-17  Keith Miller  <keith_miller@apple.com>
2799
2800         Force useLLInt to true on arm64_32
2801         https://bugs.webkit.org/show_bug.cgi?id=199882
2802         <rdar://problem/53207586>
2803
2804         Reviewed by Yusuke Suzuki.
2805
2806         Some jsc tests set useLLInt=false but on arm64_32 we don't support the JIT.
2807         This causes the option coherency checker to get angry. We should force
2808         useLLInt=true on arm64_32 unless useJIT=true.
2809
2810         * runtime/Options.cpp:
2811         (JSC::recomputeDependentOptions):
2812
2813 2019-07-17  Christopher Reid  <chris.reid@sony.com>
2814
2815         Bytecode cache should use FileSystem
2816         https://bugs.webkit.org/show_bug.cgi?id=199759
2817
2818         Reviewed by Yusuke Suzuki.
2819
2820         Update bytecode cache to use platform generic FileSystem calls.
2821
2822         * API/JSScript.mm:
2823         * CMakeLists.txt:
2824         * jsc.cpp:
2825         * runtime/CachePayload.cpp:
2826         * runtime/CachePayload.h:
2827         * runtime/CachedBytecode.h:
2828         * runtime/CachedTypes.cpp:
2829         * runtime/CachedTypes.h:
2830         * runtime/CodeCache.cpp:
2831         * runtime/CodeCache.h:
2832         * runtime/Completion.cpp:
2833         * runtime/Completion.h:
2834
2835 2019-07-17  Mark Lam  <mark.lam@apple.com>
2836
2837         ArgumentsEliminationPhase should insert KillStack nodes before PutStack nodes that it adds.
2838         https://bugs.webkit.org/show_bug.cgi?id=199821
2839         <rdar://problem/52452328>
2840
2841         Reviewed by Filip Pizlo.
2842
2843         Excluding the ArgumentsEliminationPhase, PutStack nodes are converted from SetLocal
2844         nodes in the SSAConversionPhase.  SetLocal nodes are always preceded by MovHint nodes,
2845         and the SSAConversionPhase always inserts a KillStack node before a MovHint node.
2846         Hence, a PutStack node is always preceded by a KillStack node.
2847
2848         However, the ArgumentsEliminationPhase can convert LoadVarargs nodes into a series
2849         of one or more PutStacks nodes, and it prepends MovHint nodes before the PutStack
2850         nodes.  However, it neglects to prepend KillStack nodes as well.  Since the
2851         ArgumentsEliminationPhase runs after the SSAConversionPhase, the PutStack nodes
2852         added during ArgumentsElimination will not be preceded by KillStack nodes.
2853
2854         This patch fixes this by inserting a KillStack in the ArgumentsEliminationPhase
2855         before it inserts a MovHint and a PutStack node.
2856
2857         Consider this test case which can manifest the above issue as a crash:
2858
2859             function inlinee(value) {
2860                 ...
2861                 let tmp = value + 1;
2862             }
2863
2864             function reflect() {
2865                 return inlinee.apply(undefined, arguments);
2866             }
2867
2868             function test(arr) {
2869                 let object = inlinee.apply(undefined, arr);   // Uses a lot of SetArgumentMaybe nodes.
2870                 reflect();    // Calls with a LoadVararg, which gets converted into a PutStack of a constant.
2871             }
2872
2873         In this test case, we have a scenario where a SetArgumentMaybe's stack
2874         slot is reused as the stack slot for a PutStack later.  Here, the PutStack will
2875         put a constant undefined value.  Coincidentally, the SetArgumentMaybe may also
2876         initialize that stack slot to a constant undefined value.  Note that by the time
2877         the PutStack executes, the SetArgumentMaybe's stack slot is dead.  The liveness of
2878         these 2 values are distinct.
2879
2880         However, because we were missing a KillStack before the PutStack, OSR availability
2881         analysis gets misled into thinking that the PutStack constant value is still in the
2882         stack slot because the value left there by the SetArgumentMaybe hasn't been killed
2883         off yet.  As a result, OSR exit code will attempt to recover the PutStack's undefined
2884         constant by loading from the stack slot instead of materializing it.  Since
2885         SetArgumentMaybe may not actually initialize the stack slot, we get a crash in OSR
2886         exit when we try to recover the PutStack constant value from the stack slot, and
2887         end up using what ever junk value we read from there.
2888
2889         Fixing the ArgumentsEliminationPhase to insert KillStack before the PutStack
2890         removes this conflation of the PutStack's constant value with the SetArgumentMaybe's
2891         constant value in the same stack slot.  And, OSR availability analysis will no
2892         longer be misled to load the PutStack's constant value from the stack, but will
2893         materialize the constant instead.
2894
2895         * dfg/DFGArgumentsEliminationPhase.cpp:
2896
2897 2019-07-17  Commit Queue  <commit-queue@webkit.org>
2898
2899         Unreviewed, rolling out r247505.
2900         https://bugs.webkit.org/show_bug.cgi?id=199871
2901
2902         "Caused failed ASSERT in stress test" (Requested by creid on
2903         #webkit).
2904
2905         Reverted changeset:
2906
2907         "Bytecode cache should use FileSystem"
2908         https://bugs.webkit.org/show_bug.cgi?id=199759
2909         https://trac.webkit.org/changeset/247505
2910
2911 2019-07-16  Christopher Reid  <chris.reid@sony.com>
2912
2913         Bytecode cache should use FileSystem
2914         https://bugs.webkit.org/show_bug.cgi?id=199759
2915
2916         Reviewed by Yusuke Suzuki.
2917
2918         Update bytecode cache to use platform generic FileSystem calls.
2919
2920         * API/JSScript.mm:
2921         * CMakeLists.txt:
2922         * jsc.cpp:
2923         * runtime/CachePayload.cpp:
2924         * runtime/CachePayload.h:
2925         * runtime/CachedBytecode.h:
2926         * runtime/CachedTypes.cpp:
2927         * runtime/CachedTypes.h:
2928         * runtime/CodeCache.cpp:
2929         * runtime/CodeCache.h:
2930         * runtime/Completion.cpp:
2931         * runtime/Completion.h:
2932
2933 2019-07-16  Joonghun Park  <pjh0718@gmail.com>
2934
2935         [GTK] Fix a build warning in JavaScriptCore/API/tests/testapi.c
2936         https://bugs.webkit.org/show_bug.cgi?id=199824
2937
2938         Reviewed by Alex Christensen.
2939
2940         * API/tests/testapi.c:
2941         (main):
2942
2943 2019-07-15  Keith Miller  <keith_miller@apple.com>
2944
2945         JSGlobalObject type macros should support feature flags and WeakRef should have one
2946         https://bugs.webkit.org/show_bug.cgi?id=199601
2947
2948         Reviewed by Mark Lam.
2949
2950         This patch refactors the various builtin type macros to have a
2951         parameter, which is the feature flag enabling it.  Since most
2952         builtin types are enabled by default this patch adds a new global
2953         bool typeExposedByDefault for clarity. Note, because static hash
2954         tables have no concept of feature flags we can't use feature flags
2955         with lazy properties. This is probably not a big deal as features
2956         that are off by default won't be allocated anywhere we care about
2957         memory usage anyway.
2958
2959         * runtime/CommonIdentifiers.h:
2960         * runtime/JSGlobalObject.cpp:
2961         (JSC::JSGlobalObject::init):
2962         (JSC::JSGlobalObject::visitChildren):
2963         * runtime/JSGlobalObject.h:
2964         (JSC::JSGlobalObject::stringObjectStructure const):
2965         (JSC::JSGlobalObject::bigIntObjectStructure const): Deleted.
2966         * runtime/Options.h:
2967         * wasm/js/JSWebAssembly.cpp:
2968
2969 2019-07-15  Keith Miller  <keith_miller@apple.com>
2970
2971         A Possible Issue of Object.create method
2972         https://bugs.webkit.org/show_bug.cgi?id=199744
2973
2974         Reviewed by Yusuke Suzuki.
2975
2976         We should call toObject on the properties argument if it was not undefined.
2977         See: https://tc39.es/ecma262/#sec-object.create
2978
2979         * runtime/ObjectConstructor.cpp:
2980         (JSC::objectConstructorCreate):
2981
2982 2019-07-15  Saagar Jha  <saagarjha@apple.com>
2983
2984         Keyword lookup can use memcmp to get around unaligned load undefined behavior
2985         https://bugs.webkit.org/show_bug.cgi?id=199650
2986
2987         Reviewed by Yusuke Suzuki.
2988
2989         Replace KeywordLookup's hand-rolled "memcmp" with the standard version, which reduces the need to deal with
2990         endianness and unaligned loads.
2991
2992         * KeywordLookupGenerator.py:
2993         (Trie.printSubTreeAsC): Use memcmp instead of macros to test for matches.
2994         (Trie.printAsC): Unspecialize Lexer::parseKeyword as templating over the character type reduces the amount of
2995         code we need to generate and moves this task out of the Python script and into the C++ compiler.
2996
2997 2019-07-15  Yusuke Suzuki  <ysuzuki@apple.com>
2998
2999         [JSC] Improve wasm wpt test results by fixing miscellaneous issues
3000         https://bugs.webkit.org/show_bug.cgi?id=199783
3001
3002         Reviewed by Mark Lam.
3003
3004         This patch fixes miscellaneous issues in our Wasm JS API implementation to improve WPT score.
3005         I picked trivial ones in this patch to make this easily reviewable.
3006
3007         1. Remove WebAssemblyPrototype. It does not exist in the spec. Merging WebAssemblyPrototype into JSWebAssembly.
3008         2. Fix various attributes. It does not match to the usual JSC builtin's convention. But this change
3009            is correct because they are changed to be matched against WebIDL definition, and WebAssembly implementation
3010            follows WebIDL. In the future, we could move WebCore WebIDL things into WTF layer and even use (or leverage
3011            some of utility functions) in our WebAssembly JS API implementation.
3012         3. Fix how we interpret "present" in WebAssembly spec. This does not mean [[HasProperty]] result. It follows to
3013            WebIDL spec, and it means that [[Get]] result is not undefined.
3014         4. Add argument count check to Module.customSections, which is required because the method is defined in WebIDL.
3015         5. Fix toNonWrappingUint32 to match it to WebIDL's conversion rule.
3016
3017         * CMakeLists.txt:
3018         * DerivedSources-input.xcfilelist:
3019         * DerivedSources-output.xcfilelist:
3020         * DerivedSources.make:
3021         * JavaScriptCore.xcodeproj/project.pbxproj:
3022         * Sources.txt:
3023         * builtins/WebAssembly.js: Renamed from Source/JavaScriptCore/builtins/WebAssemblyPrototype.js.
3024         * jit/Repatch.cpp:
3025         * runtime/JSGlobalObject.cpp:
3026         (JSC::JSGlobalObject::init):
3027         * runtime/JSModuleLoader.cpp:
3028         (JSC::moduleLoaderParseModule):
3029         * wasm/js/JSWebAssembly.cpp:
3030         (JSC::JSWebAssembly::create):
3031         (JSC::JSWebAssembly::finishCreation):
3032         (JSC::reject):
3033         (JSC::webAssemblyModuleValidateAsyncInternal):
3034         (JSC::webAssemblyCompileFunc):
3035         (JSC::resolve):
3036         (JSC::JSWebAssembly::webAssemblyModuleValidateAsync):
3037         (JSC::instantiate):
3038         (JSC::compileAndInstantiate):
3039         (JSC::JSWebAssembly::instantiate):
3040         (JSC::webAssemblyModuleInstantinateAsyncInternal):
3041         (JSC::JSWebAssembly::webAssemblyModuleInstantinateAsync):
3042         (JSC::webAssemblyInstantiateFunc):
3043         (JSC::webAssemblyValidateFunc):
3044         (JSC::webAssemblyCompileStreamingInternal):
3045         (JSC::webAssemblyInstantiateStreamingInternal):
3046         * wasm/js/JSWebAssembly.h:
3047         * wasm/js/JSWebAssemblyHelpers.h:
3048         (JSC::toNonWrappingUint32):
3049         * wasm/js/WebAssemblyCompileErrorConstructor.cpp:
3050         (JSC::WebAssemblyCompileErrorConstructor::finishCreation):
3051         * wasm/js/WebAssemblyInstanceConstructor.cpp:
3052         (JSC::WebAssemblyInstanceConstructor::finishCreation):
3053         * wasm/js/WebAssemblyInstancePrototype.cpp:
3054         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
3055         (JSC::WebAssemblyLinkErrorConstructor::finishCreation):
3056         * wasm/js/WebAssemblyMemoryConstructor.cpp:
3057         (JSC::constructJSWebAssemblyMemory):
3058         (JSC::WebAssemblyMemoryConstructor::finishCreation):
3059         * wasm/js/WebAssemblyMemoryPrototype.cpp:
3060         * wasm/js/WebAssemblyModuleConstructor.cpp:
3061         (JSC::webAssemblyModuleCustomSections):
3062         (JSC::WebAssemblyModuleConstructor::finishCreation):
3063         * wasm/js/WebAssemblyPrototype.cpp: Removed.
3064         * wasm/js/WebAssemblyPrototype.h: Removed.
3065         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
3066         (JSC::WebAssemblyRuntimeErrorConstructor::finishCreation):
3067         * wasm/js/WebAssemblyTableConstructor.cpp:
3068         (JSC::constructJSWebAssemblyTable):
3069         (JSC::WebAssemblyTableConstructor::finishCreation):
3070         * wasm/js/WebAssemblyTablePrototype.cpp:
3071
3072 2019-07-15  Michael Catanzaro  <mcatanzaro@igalia.com>
3073
3074         Unreviewed, rolling out r247440.
3075
3076         Broke builds
3077
3078         Reverted changeset:
3079
3080         "[JSC] Improve wasm wpt test results by fixing miscellaneous
3081         issues"
3082         https://bugs.webkit.org/show_bug.cgi?id=199783
3083         https://trac.webkit.org/changeset/247440
3084
3085 2019-07-15  Yusuke Suzuki  <ysuzuki@apple.com>
3086
3087         [JSC] Improve wasm wpt test results by fixing miscellaneous issues
3088         https://bugs.webkit.org/show_bug.cgi?id=199783
3089
3090         Reviewed by Mark Lam.
3091
3092         This patch fixes miscellaneous issues in our Wasm JS API implementation to improve WPT score.
3093         I picked trivial ones in this patch to make this easily reviewable.
3094
3095         1. Remove WebAssemblyPrototype. It does not exist in the spec. Merging WebAssemblyPrototype into JSWebAssembly.
3096         2. Fix various attributes. It does not match to the usual JSC builtin's convention. But this change
3097            is correct because they are changed to be matched against WebIDL definition, and WebAssembly implementation
3098            follows WebIDL. In the future, we could move WebCore WebIDL things into WTF layer and even use (or leverage
3099            some of utility functions) in our WebAssembly JS API implementation.
3100         3. Fix how we interpret "present" in WebAssembly spec. This does not mean [[HasProperty]] result. It follows to
3101            WebIDL spec, and it means that [[Get]] result is not undefined.
3102         4. Add argument count check to Module.customSections, which is required because the method is defined in WebIDL.
3103         5. Fix toNonWrappingUint32 to match it to WebIDL's conversion rule.
3104
3105         * CMakeLists.txt:
3106         * DerivedSources-input.xcfilelist:
3107         * DerivedSources-output.xcfilelist:
3108         * DerivedSources.make:
3109         * JavaScriptCore.xcodeproj/project.pbxproj:
3110         * Sources.txt:
3111         * builtins/WebAssembly.js: Renamed from Source/JavaScriptCore/builtins/WebAssemblyPrototype.js.
3112         * jit/Repatch.cpp:
3113         * runtime/JSGlobalObject.cpp:
3114         (JSC::JSGlobalObject::init):
3115         * runtime/JSModuleLoader.cpp:
3116         (JSC::moduleLoaderParseModule):
3117         * wasm/js/JSWebAssembly.cpp:
3118         (JSC::JSWebAssembly::create):
3119         (JSC::JSWebAssembly::finishCreation):
3120         (JSC::reject):
3121         (JSC::webAssemblyModuleValidateAsyncInternal):
3122         (JSC::webAssemblyCompileFunc):
3123         (JSC::resolve):
3124         (JSC::JSWebAssembly::webAssemblyModuleValidateAsync):
3125         (JSC::instantiate):
3126         (JSC::compileAndInstantiate):
3127         (JSC::JSWebAssembly::instantiate):
3128         (JSC::webAssemblyModuleInstantinateAsyncInternal):
3129         (JSC::JSWebAssembly::webAssemblyModuleInstantinateAsync):
3130         (JSC::webAssemblyInstantiateFunc):
3131         (JSC::webAssemblyValidateFunc):
3132         (JSC::webAssemblyCompileStreamingInternal):
3133         (JSC::webAssemblyInstantiateStreamingInternal):
3134         * wasm/js/JSWebAssembly.h:
3135         * wasm/js/JSWebAssemblyHelpers.h:
3136         (JSC::toNonWrappingUint32):
3137         * wasm/js/WebAssemblyCompileErrorConstructor.cpp:
3138         (JSC::WebAssemblyCompileErrorConstructor::finishCreation):
3139         * wasm/js/WebAssemblyInstanceConstructor.cpp:
3140         (JSC::WebAssemblyInstanceConstructor::finishCreation):
3141         * wasm/js/WebAssemblyInstancePrototype.cpp:
3142         * wasm/js/WebAssemblyLinkErrorConstructor.cpp:
3143         (JSC::WebAssemblyLinkErrorConstructor::finishCreation):
3144         * wasm/js/WebAssemblyMemoryConstructor.cpp:
3145         (JSC::constructJSWebAssemblyMemory):
3146         (JSC::WebAssemblyMemoryConstructor::finishCreation):
3147         * wasm/js/WebAssemblyMemoryPrototype.cpp:
3148         * wasm/js/WebAssemblyModuleConstructor.cpp:
3149         (JSC::webAssemblyModuleCustomSections):
3150         (JSC::WebAssemblyModuleConstructor::finishCreation):
3151         * wasm/js/WebAssemblyPrototype.cpp: Removed.
3152         * wasm/js/WebAssemblyPrototype.h: Removed.
3153         * wasm/js/WebAssemblyRuntimeErrorConstructor.cpp:
3154         (JSC::WebAssemblyRuntimeErrorConstructor::finishCreation):
3155         * wasm/js/WebAssemblyTableConstructor.cpp:
3156         (JSC::constructJSWebAssemblyTable):
3157         (JSC::WebAssemblyTableConstructor::finishCreation):
3158         * wasm/js/WebAssemblyTablePrototype.cpp:
3159
3160 2019-07-15  Youenn Fablet  <youenn@apple.com>
3161
3162         Enable a debug WebRTC mode without any encryption
3163         https://bugs.webkit.org/show_bug.cgi?id=199177
3164         <rdar://problem/52074986>
3165
3166         Reviewed by Eric Carlson.
3167
3168         * inspector/protocol/Page.json:
3169
3170 2019-07-15  Ryan Haddad  <ryanhaddad@apple.com>
3171
3172         Unreviewed, attempt to fix production builds after r247403.
3173
3174         * JavaScriptCore.xcodeproj/project.pbxproj:
3175
3176 2019-07-15  Tadeu Zagallo  <tzagallo@apple.com>
3177
3178         Concurrent GC should not rely on current phase to determine if it's safe to steal conn
3179         https://bugs.webkit.org/show_bug.cgi?id=199786
3180         <rdar://problem/52505197>
3181
3182         Reviewed by Saam Barati.
3183
3184         In r246507, we fixed a race condition in the concurrent GC where the mutator might steal
3185         the conn from the collector thread while it transitions from the End phase to NotRunning.
3186         However, that fix was not sufficient. In the case that the mutator steals the conn, and the
3187         execution interleaves long enough for the mutator to progress to a different collection phase,
3188         the collector will resume in a phase other than NotRunning, and hence the check added to
3189         NotRunning will not suffice. To fix that, we add a new variable to track whether the collector
3190         thread is running (m_collectorThreadIsRunning) and use it to determine whether it's safe to
3191         steal the conn, rather than relying on m_currentPhase.
3192
3193         * heap/Heap.cpp:
3194         (JSC::Heap::runNotRunningPhase):
3195         (JSC::Heap::requestCollection):
3196         * heap/Heap.h:
3197
3198 2019-07-12  Keith Miller  <keith_miller@apple.com>
3199
3200         Add API to get all the dependencies of a given JSScript
3201         https://bugs.webkit.org/show_bug.cgi?id=199746
3202
3203         Reviewed by Saam Barati.
3204
3205         The method only returns the dependencies if the module was
3206         actually evaluated. Technically, we know what the dependencies are
3207         at the satisfy phase but for API simplicity we only provide that
3208         information if the module graph was complete enough to at least
3209         run.
3210
3211         This patch also fixes an issue where we would allow import
3212         specifiers that didn't start "./" or "/". For reference, We have
3213         this restriction to be consistent with the web/node. The
3214         restriction exists in order to preserve namespace for
3215         builtin-modules.
3216
3217         Lastly, this patch makes it so that we copy all scripts in the
3218         API/tests/testapiScripts directory so they don't have to be
3219         individually added to the xcode project.
3220
3221         * API/JSAPIGlobalObject.mm:
3222         (JSC::computeValidImportSpecifier):
3223         (JSC::JSAPIGlobalObject::moduleLoaderResolve):
3224         (JSC::JSAPIGlobalObject::moduleLoaderImportModule):
3225         * API/JSContext.mm:
3226         (-[JSContext dependencyIdentifiersForModuleJSScript:]):
3227         * API/JSContextPrivate.h:
3228         * API/JSScript.h:
3229         * API/tests/testapi.mm:
3230         (testFetchWithTwoCycle):
3231         (testFetchWithThreeCycle):
3232         (testModuleBytecodeCache):
3233         (+[JSContextFileLoaderDelegate newContext]):
3234         (-[JSContextFileLoaderDelegate fetchModuleScript:]):
3235         (-[JSContextFileLoaderDelegate findScriptForKey:]):
3236         (-[JSContextFileLoaderDelegate context:fetchModuleForIdentifier:withResolveHandler:andRejectHandler:]):
3237         (testDependenciesArray):
3238         (testDependenciesEvaluationError):
3239         (testDependenciesSyntaxError):
3240         (testDependenciesBadImportId):
3241         (testDependenciesMissingImport):
3242         (testObjectiveCAPI):
3243         * API/tests/testapiScripts/dependencyListTests/badModuleImportId.js: Added.
3244         * API/tests/testapiScripts/dependencyListTests/bar.js: Added.
3245         * API/tests/testapiScripts/dependencyListTests/dependenciesEntry.js: Added.
3246         * API/tests/testapiScripts/dependencyListTests/foo.js: Added.
3247         * API/tests/testapiScripts/dependencyListTests/missingImport.js: Added.
3248         * API/tests/testapiScripts/dependencyListTests/referenceError.js: Added.
3249         * API/tests/testapiScripts/dependencyListTests/syntaxError.js: Added.
3250         * API/tests/testapiScripts/testapi-function-overrides.js: Renamed from Source/JavaScriptCore/API/tests/testapi-function-overrides.js.
3251         * API/tests/testapiScripts/testapi.js: Renamed from Source/JavaScriptCore/API/tests/testapi.js.
3252         * JavaScriptCore.xcodeproj/project.pbxproj:
3253         * builtins/ModuleLoader.js:
3254         (dependencyKeysIfEvaluated):
3255         * runtime/JSModuleLoader.cpp:
3256         (JSC::JSModuleLoader::dependencyKeysIfEvaluated):
3257         * runtime/JSModuleLoader.h:
3258         * shell/CMakeLists.txt:
3259
3260 2019-07-12  Justin Michaud  <justin_michaud@apple.com>
3261
3262         B3 should reduce (integer) Sub(Neg(x), y) to Neg(Add(x, y))
3263         https://bugs.webkit.org/show_bug.cgi?id=196371
3264
3265         Reviewed by Keith Miller.
3266
3267         Adding these strength reductions gives 2x a (x86) and 3x (arm64) performance improvement
3268         on the microbenchmark.
3269
3270         * b3/B3ReduceStrength.cpp:
3271         * b3/testb3.cpp:
3272         (JSC::B3::testSubSub):
3273         (JSC::B3::testSubSub2):
3274         (JSC::B3::testSubAdd):
3275         (JSC::B3::testSubFirstNeg):
3276         (JSC::B3::run):
3277
3278 2019-07-12  Caio Lima  <ticaiolima@gmail.com>
3279
3280         [BigInt] Add ValueBitLShift into DFG
3281         https://bugs.webkit.org/show_bug.cgi?id=192664
3282
3283         Reviewed by Saam Barati.
3284
3285         This patch is splitting the `BitLShift` into `ArithBitLShift` and
3286         `ValueBitLShift` to handle BigInt speculation more efficiently during
3287         DFG and FTL layers. Following the same approach of other `ValueBitOps`,
3288         `ValueBitLShift` handles Untyped and BigInt speculations, while
3289         `ArithBitLShift` handles number and boolean operands and always results into
3290         Int32. 
3291
3292         * bytecode/BytecodeList.rb:
3293         * bytecode/CodeBlock.cpp:
3294         (JSC::CodeBlock::finishCreation):
3295         * bytecode/Opcode.h:
3296         * dfg/DFGAbstractInterpreter.h:
3297         * dfg/DFGAbstractInterpreterInlines.h:
3298         (JSC::DFG::AbstractInterpreter<AbstractStateType>::handleConstantBinaryBitwiseOp):
3299         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
3300
3301         We moved `BitLShift` constant fold rules to a new method
3302         `handleConstantBinaryBitwiseOp` to be reused by `ArithBitLShift` and
3303         `ValueBitLShift`. This also enables support of constant folding on other
3304         bitwise operations like `ValueBitAnd`, `ValueBitOr` and `ValueBitXor`, when
3305         their binary use kind is UntypedUse. Such cases can happen on those
3306         nodes because fixup phase is conservative.
3307
3308         * dfg/DFGBackwardsPropagationPhase.cpp:
3309         (JSC::DFG::BackwardsPropagationPhase::isWithinPowerOfTwo):
3310         (JSC::DFG::BackwardsPropagationPhase::propagate):
3311         * dfg/DFGByteCodeParser.cpp:
3312         (JSC::DFG::ByteCodeParser::handleIntrinsicGetter):
3313         (JSC::DFG::ByteCodeParser::parseBlock):
3314
3315         We parse `op_lshift` as `ArithBitLShift` when its operands are numbers.
3316         Otherwise, we fallback to `ValueBitLShift` and rely on fixup phase to
3317         convert `ValueBitLShift` into `ArithBitLShift` when possible.
3318
3319         * dfg/DFGClobberize.h:
3320         (JSC::DFG::clobberize):
3321
3322         `ArithBitLShift` has the same clobberize rules as former `BitLShift`.
3323         `ValueBitLShift` only clobberize world when it is UntypedUse.
3324
3325         * dfg/DFGDoesGC.cpp:
3326         (JSC::DFG::doesGC):
3327
3328         `ValueBitLShift` can GC when `BigIntUse` because it allocates new
3329         JSBigInts to perform this operation. It also can GC on UntypedUse
3330         because of observable user code.
3331
3332         * dfg/DFGFixupPhase.cpp:
3333         (JSC::DFG::FixupPhase::fixupNode):
3334
3335         `ValueBitLShift` and `ArithBitLShift` has the same fixup rules of
3336         other binary bitwise operations. In the case of `ValueBitLShift`
3337         We check if we should speculate on BigInt or Untyped and fallback to
3338         `ArithBitLShift` when both cheks fail.
3339
3340         * dfg/DFGNode.h:
3341         (JSC::DFG::Node::hasHeapPrediction):
3342         * dfg/DFGNodeType.h:
3343         * dfg/DFGOperations.cpp:
3344
3345         We updated `operationValueBitLShift` to handle BigInt cases. Also, we
3346         added `operationBitLShiftBigInt` that is used when we compile
3347         `ValueBitLValueBitLShift(BigIntUse)`.
3348
3349         * dfg/DFGOperations.h:
3350         * dfg/DFGPredictionPropagationPhase.cpp:
3351
3352         `ValueBitLShift`'s prediction propagation rules differs from other
3353         bitwise operations, because using only heap prediction for this node causes
3354         significant performance regression on Octane's zlib and mandreel.
3355         The reason is because of cases where a function is compiled but the
3356         instruction `op_lshift` was never executed before. If we use
3357         `getPrediction()` we will emit a `ForceOSRExit`, resulting in more OSR
3358         than desired. To solve such issue, we are then using
3359         `getPredictionWithoutOSR()` and falling back to `getHeapPrediction()`
3360         only on cases where we can't rely on node's input types.
3361
3362         * dfg/DFGSafeToExecute.h:
3363         (JSC::DFG::safeToExecute):
3364         * dfg/DFGSpeculativeJIT.cpp:
3365         (JSC::DFG::SpeculativeJIT::compileValueLShiftOp):
3366         (JSC::DFG::SpeculativeJIT::compileShiftOp):
3367         * dfg/DFGSpeculativeJIT.h:
3368         (JSC::DFG::SpeculativeJIT::shiftOp):
3369         * dfg/DFGSpeculativeJIT32_64.cpp:
3370         (JSC::DFG::SpeculativeJIT::compile):
3371         * dfg/DFGSpeculativeJIT64.cpp:
3372         (JSC::DFG::SpeculativeJIT::compile):
3373         * dfg/DFGStrengthReductionPhase.cpp:
3374         (JSC::DFG::StrengthReductionPhase::handleNode):
3375         * ftl/FTLCapabilities.cpp:
3376         (JSC::FTL::canCompile):
3377         * ftl/FTLLowerDFGToB3.cpp:
3378         (JSC::FTL::DFG::LowerDFGToB3::compileNode):
3379         (JSC::FTL::DFG::LowerDFGToB3::compileArithBitLShift):
3380         (JSC::FTL::DFG::LowerDFGToB3::compileValueBitLShift):
3381         (JSC::FTL::DFG::LowerDFGToB3::compileBitLShift): Deleted.
3382         * llint/LowLevelInterpreter32_64.asm:
3383         * llint/LowLevelInterpreter64.asm:
3384         * runtime/CommonSlowPaths.cpp:
3385         (JSC::SLOW_PATH_DECL):
3386
3387 2019-07-12  Keith Miller  <keith_miller@apple.com>
3388
3389         getIndexQuickly should be const
3390         https://bugs.webkit.org/show_bug.cgi?id=199747
3391
3392         Reviewed by Yusuke Suzuki.
3393
3394         * runtime/Butterfly.h:
3395         (JSC::Butterfly::indexingPayload const):
3396         (JSC::Butterfly::arrayStorage const):
3397         (JSC::Butterfly::contiguousInt32 const):
3398         (JSC::Butterfly::contiguousDouble const):
3399         (JSC::Butterfly::contiguous const):
3400         * runtime/JSObject.h:
3401         (JSC::JSObject::canGetIndexQuickly const):
3402         (JSC::JSObject::getIndexQuickly const):
3403         (JSC::JSObject::tryGetIndexQuickly const):
3404         (JSC::JSObject::canGetIndexQuickly): Deleted.
3405         (JSC::JSObject::getIndexQuickly): Deleted.
3406
3407 2019-07-11  Justin Michaud  <justin_michaud@apple.com>
3408
3409         Add b3 macro lowering for CheckMul on arm64
3410         https://bugs.webkit.org/show_bug.cgi?id=199251
3411
3412         Reviewed by Robin Morisset.
3413
3414         - Lower CheckMul for 32-bit arguments on arm64 into a mul and then an overflow check.
3415         - Add a new opcode to air on arm64 for smull (multiplySignExtend32).
3416         - Fuse sign extend 32 + mul into smull (taking two 32-bit arguments and producing 64 bits). 
3417         - 1.25x speedup on power of two microbenchmark, 1.15x speedup on normal constant microbenchmark, 
3418           and no change on the no-constant benchmark.
3419         Also, skip some of the b3 tests that were failing before this patch so that the new tests can run
3420         to completion.
3421
3422         * assembler/MacroAssemblerARM64.h:
3423         (JSC::MacroAssemblerARM64::multiplySignExtend32):
3424         * assembler/testmasm.cpp:
3425         (JSC::testMul32SignExtend):
3426         (JSC::run):
3427         * b3/B3LowerMacros.cpp:
3428         * b3/B3LowerToAir.cpp:
3429         * b3/air/AirOpcode.opcodes:
3430         * b3/testb3.cpp:
3431         (JSC::B3::testMulArgs32SignExtend):
3432         (JSC::B3::testMulImm32SignExtend):
3433         (JSC::B3::testMemoryFence):
3434         (JSC::B3::testStoreFence):
3435         (JSC::B3::testLoadFence):
3436         (JSC::B3::testPinRegisters):
3437         (JSC::B3::run):
3438
3439 2019-07-11  Yusuke Suzuki  <ysuzuki@apple.com>
3440
3441         Unreviewed, revert r243617.
3442         https://bugs.webkit.org/show_bug.cgi?id=196341
3443
3444         Mark pointed out that JSVirtualMachine can be gone in the other thread while we are executing GC constraint-solving.
3445         This patch does not account that JavaScriptCore.framework is multi-thread safe: JSVirtualMachine wrapper can be destroyed,
3446         and [JSVirtualMachine dealloc] can be executed in any threads while the VM is retained and used in the other thread (e.g.
3447         destroyed from AutoReleasePool in some thread).
3448
3449         * API/JSContext.mm:
3450         (-[JSContext initWithVirtualMachine:]):
3451         (-[JSContext dealloc]):
3452         (-[JSContext initWithGlobalContextRef:]):
3453         (-[JSContext wrapperMap]):
3454         (+[JSContext contextWithJSGlobalContextRef:]):
3455         * API/JSVirtualMachine.mm:
3456         (initWrapperCache):
3457         (wrapperCache):
3458         (+[JSVMWrapperCache addWrapper:forJSContextGroupRef:]):
3459         (+[JSVMWrapperCache wrapperForJSContextGroupRef:]):
3460         (-[JSVirtualMachine initWithContextGroupRef:]):
3461         (-[JSVirtualMachine dealloc]):
3462         (+[JSVirtualMachine virtualMachineWithContextGroupRef:]):
3463         (-[JSVirtualMachine contextForGlobalContextRef:]):
3464         (-[JSVirtualMachine addContext:forGlobalContextRef:]):
3465         (scanExternalObjectGraph):
3466         (scanExternalRememberedSet):
3467         * API/JSVirtualMachineInternal.h:
3468         * runtime/JSGlobalObject.h:
3469         (JSC::JSGlobalObject::setWrapperMap):
3470         (JSC::JSGlobalObject::setAPIWrapper): Deleted.
3471         (JSC::JSGlobalObject::apiWrapper const): Deleted.
3472         * runtime/VM.h:
3473
3474 2019-07-10  Tadeu Zagallo  <tzagallo@apple.com>
3475
3476         Optimize join of large empty arrays
3477         https://bugs.webkit.org/show_bug.cgi?id=199636
3478
3479         Reviewed by Mark Lam.
3480
3481         Replicate the behavior of `str.repeat(count)` when performing `new Array(count + 1).join(str)`.
3482         I added two new microbenchmarks:
3483         - large-empty-array-join, which does not use the result of the join and runs ~44x faster and uses ~18x less memory.
3484         - large-empty-array-join-resolve-rope, which uses the result of the join and runs 2x faster.
3485
3486                                                     baseline                    diff
3487         large-empty-array-join                2713.9698+-72.7621    ^     61.2335+-10.4836       ^ definitely 44.3217x faster
3488         large-empty-array-join-resolve-string   26.5517+-0.3995     ^     12.9309+-0.5516        ^ definitely 2.0533x faster
3489
3490         large-empty-array-join memory usage with baseline (dirty):
3491             733012 kB current_mem
3492             756824 kB lifetime_peak
3493
3494         large-empty-array-join memory usage with diff (dirty):
3495             41904 kB current_mem
3496             41972 kB lifetime_peak
3497
3498         Additionally, I ran JetStream2, sunspider and v8-spider and all were neutral.
3499
3500         * runtime/ArrayPrototype.cpp:
3501         (JSC::fastJoin):
3502
3503 2019-07-08  Keith Miller  <keith_miller@apple.com>
3504
3505         Enable Intl.PluralRules and Intl.NumberFormatToParts by default
3506         https://bugs.webkit.org/show_bug.cgi?id=199288
3507
3508         Reviewed by Yusuke Suzuki.
3509
3510         These features have been around for a while. We should turn them on by default.
3511
3512         * runtime/IntlNumberFormatPrototype.cpp:
3513         (JSC::IntlNumberFormatPrototype::finishCreation):
3514         * runtime/IntlObject.cpp:
3515         (JSC::IntlObject::finishCreation): Deleted.
3516         * runtime/IntlObject.h:
3517         * runtime/Options.h:
3518
3519 2019-07-08  Antoine Quint  <graouts@apple.com>
3520
3521         [Pointer Events] Enable only on the most recent version of the supported iOS family
3522         https://bugs.webkit.org/show_bug.cgi?id=199562
3523         <rdar://problem/52766511>
3524
3525         Reviewed by Dean Jackson.
3526
3527         * Configurations/FeatureDefines.xcconfig:
3528
3529 2019-07-06  Michael Saboff  <msaboff@apple.com>
3530
3531         switch(String) needs to check for exceptions when resolving the string
3532         https://bugs.webkit.org/show_bug.cgi?id=199541
3533
3534         Reviewed by Mark Lam.
3535
3536         Added exception checks for resolved Strings in switch processing for all tiers.
3537
3538         * dfg/DFGOperations.cpp:
3539         * jit/JITOperations.cpp:
3540         * llint/LLIntSlowPaths.cpp:
3541         (JSC::LLInt::LLINT_SLOW_PATH_DECL):
3542
3543 2019-07-05  Mark Lam  <mark.lam@apple.com>
3544
3545         ArgumentsEliminationPhase::eliminateCandidatesThatInterfere() should not decrement nodeIndex pass zero.
3546         https://bugs.webkit.org/show_bug.cgi?id=199533
3547         <rdar://problem/52669111>
3548
3549         Reviewed by Filip Pizlo.
3550
3551         * dfg/DFGArgumentsEliminationPhase.cpp:
3552
3553 2019-07-05  Yusuke Suzuki  <ysuzuki@apple.com>
3554
3555         Unreviewed, fix build failure on ARM64_32
3556         https://bugs.webkit.org/show_bug.cgi?id=182434
3557
3558         Implicit narrowing from uint64_t to uint32_t happens. We should explicitly narrow it because we already checked
3559         the `length` is <= UINT32_MAX.
3560
3561         * runtime/ArrayPrototype.cpp:
3562         (JSC::arrayProtoFuncSpeciesCreate):
3563
3564 2019-07-05  Alexey Shvayka  <shvaikalesh@gmail.com>
3565
3566         [JSC] Clean up ArraySpeciesCreate
3567         https://bugs.webkit.org/show_bug.cgi?id=182434
3568
3569         Reviewed by Yusuke Suzuki.
3570
3571         We have duplicate code in arraySpeciesCreate, filter, map, concatSlowPath of ArrayPrototype.js
3572         and speciesConstructArray of ArrayPrototype.cpp. This patch fixes cross-realm Array constructor
3573         detection in native speciesConstructArray, upgrades `length` type to correctly handle large integers,
3574         and exposes it as @arraySpeciesCreate. Also removes now unused @isArrayConstructor private function.
3575         Native speciesConstructArray is preferred because it has fast path via speciesWatchpointIsValid.
3576
3577         Thoroughly benchmarked: this change progresses ARES-6 by 0-1%.
3578
3579         * builtins/ArrayPrototype.js:
3580         (filter):
3581         (map):
3582         (globalPrivate.concatSlowPath):
3583         (globalPrivate.arraySpeciesCreate): Deleted.
3584         * builtins/BuiltinNames.h:
3585         * runtime/ArrayConstructor.cpp:
3586         (JSC::arrayConstructorPrivateFuncIsArrayConstructor): Deleted.
3587         * runtime/ArrayConstructor.h:
3588         * runtime/ArrayPrototype.cpp:
3589         (JSC::arrayProtoFuncSpeciesCreate):
3590         * runtime/ArrayPrototype.h:
3591         * runtime/JSGlobalObject.cpp:
3592         (JSC::JSGlobalObject::init):
3593
3594 2019-07-05  Tadeu Zagallo  <tzagallo@apple.com>
3595
3596         Unreviewed, change the value used to scribble Heap::m_worldState
3597         https://bugs.webkit.org/show_bug.cgi?id=199498
3598
3599         Follow-up after r247160. The value used to scribble should have the
3600         conn bit set.
3601
3602         * heap/Heap.cpp:
3603         (JSC::Heap::~Heap):
3604
3605 2019-07-05  Ryan Haddad  <ryanhaddad@apple.com>
3606
3607         Unreviewed, rolling out r247115.
3608
3609         Breaks lldbWebKitTester (and by extension, test-webkitpy)
3610
3611         Reverted changeset:
3612
3613         "[WHLSL] Standard library is too big to directly include in
3614         WebCore"
3615         https://bugs.webkit.org/show_bug.cgi?id=198186
3616         https://trac.webkit.org/changeset/247115
3617
3618 2019-07-05  Tadeu Zagallo  <tzagallo@apple.com>
3619
3620         Scribble Heap::m_worldState on destructor
3621         https://bugs.webkit.org/show_bug.cgi?id=199498
3622
3623         Reviewed by Sam Weinig.
3624
3625         The worldState is dumped when we crash due to a failed checkConn, and
3626         this will make it clear if the heap has already been destroyed.
3627
3628         * heap/Heap.cpp:
3629         (JSC::Heap::~Heap):
3630
3631 2019-07-03  Sam Weinig  <weinig@apple.com>
3632
3633         Adopt simple structured bindings in more places
3634         https://bugs.webkit.org/show_bug.cgi?id=199247
3635
3636         Reviewed by Alex Christensen.
3637
3638         Replaces simple uses of std::tie() with structured bindings. Does not touch
3639         uses of std::tie() that are not initial declarations, use std::ignore or in
3640         case where the binding is captured by a lambda, as structured bindings don't
3641         work for those cases yet.
3642
3643         * runtime/PromiseDeferredTimer.cpp:
3644         (JSC::PromiseDeferredTimer::doWork):
3645         * wasm/WasmFaultSignalHandler.cpp:
3646         (JSC::Wasm::trapHandler):
3647         * wasm/js/JSWebAssemblyHelpers.h:
3648         (JSC::createSourceBufferFromValue):
3649         * wasm/js/WebAssemblyPrototype.cpp:
3650         (JSC::webAssemblyValidateFunc):
3651
3652 2019-07-03  Keith Miller  <keith_miller@apple.com>
3653
3654         PACCage should first cage leaving PAC bits intact then authenticate
3655         https://bugs.webkit.org/show_bug.cgi?id=199372
3656
3657         Reviewed by Saam Barati.
3658
3659         This ordering prevents someone from taking a signed pointer from
3660         outside the gigacage and using it in a struct that expects a caged
3661         pointer. Previously, the PACCaging just double checked that the PAC
3662         bits were valid for the original pointer.
3663
3664
3665                +---------------------------+
3666                |       |        |          |
3667                | "PAC" | "base" | "offset" +----+
3668                |       |        |          |    |
3669                +---------------------------+    | Caging
3670                 |                               |
3671                 |                               |
3672                 |                               v
3673                 |                +---------------------------+
3674                 |                |       |        |          |
3675                 | Bit Merge      | 00000 |  base  | "offset" |
3676                 |                |       |        |          |
3677                 |                +---------------------------+
3678                 |                               |
3679                 |                               |
3680                 v                               |  Bit Merge
3681           +---------------------------+         |
3682           |       |        |          |         |
3683           | "PAC" |  base  | "offset" +<--------+
3684           |       |        |          |
3685           +---------------------------+
3686                       |
3687                       |
3688                       | Authenticate
3689                       |
3690                       v
3691           +---------------------------+
3692           |       |        |          |
3693           | Auth  |  base  | "offset" |
3694           |       |        |          |
3695           +---------------------------+
3696
3697         The above ascii art graph shows how the PACCage system works. The
3698         key take away is that even if someone passes in a valid, signed
3699         pointer outside the cage it will still fail to authenticate as the
3700         "base" bits will change before authentication.
3701
3702
3703         * assembler/MacroAssemblerARM64E.h:
3704         * assembler/testmasm.cpp:
3705         (JSC::testCagePreservesPACFailureBit):
3706         * ftl/FTLLowerDFGToB3.cpp:
3707         (JSC::FTL::DFG::LowerDFGToB3::caged):
3708         * jit/AssemblyHelpers.h:
3709         (JSC::AssemblyHelpers::cageConditionally):
3710         * llint/LowLevelInterpreter64.asm:
3711
3712 2019-07-03  Paulo Matos  <pmatos@igalia.com>
3713
3714         Refactoring of architectural Register Information
3715         https://bugs.webkit.org/show_bug.cgi?id=198604
3716
3717         Reviewed by Keith Miller.
3718
3719         The goal of this patch is to centralize the register information per platform
3720         but access it in a platform independent way. The patch as been implemented for all
3721         known platforms: ARM64, ARMv7, MIPS, X86 and X86_64. Register information has
3722         been centralized in an architecture per-file: each file is called assembler/<arch>Registers.h.
3723
3724         RegisterInfo.h is used as a forwarding header to choose which register information to load.
3725         assembler/<arch>Assembler.h and jit/RegisterSet.cpp use this information in a platform
3726         independent way.
3727
3728         * CMakeLists.txt:
3729         * JavaScriptCore.xcodeproj/project.pbxproj:
3730         * assembler/ARM64Assembler.h:
3731         (JSC::ARM64Assembler::gprName): Use register names from register info file.
3732         (JSC::ARM64Assembler::sprName): likewise.
3733         (JSC::ARM64Assembler::fprName): likewise.
3734         * assembler/ARM64Registers.h: Added.
3735         * assembler/ARMv7Assembler.h:
3736         (JSC::ARMv7Assembler::gprName): Use register names from register info file.
3737         (JSC::ARMv7Assembler::sprName): likewise.
3738         (JSC::ARMv7Assembler::fprName): likewise.
3739         * assembler/ARMv7Registers.h: Added.
3740         * assembler/MIPSAssembler.h:
3741         (JSC::MIPSAssembler::gprName): Use register names from register info file.
3742         (JSC::MIPSAssembler::sprName): likewise.
3743         (JSC::MIPSAssembler::fprName): likewise.
3744         * assembler/MIPSRegisters.h: Added.
3745         * assembler/RegisterInfo.h: Added.
3746         * assembler/X86Assembler.h:
3747         (JSC::X86Assembler::gprName): Use register names from register info file.
3748         (JSC::X86Assembler::sprName): likewise.
3749         (JSC::X86Assembler::fprName): likewise.
3750         * assembler/X86Registers.h: Added.
3751         * assembler/X86_64Registers.h: Added.
3752         * jit/GPRInfo.h: Fix typo in comment (s/basline/baseline).
3753         * jit/RegisterSet.cpp:
3754         (JSC::RegisterSet::reservedHardwareRegisters): Use register properties from register info file.
3755         (JSC::RegisterSet::calleeSaveRegisters): likewise.
3756
3757 2019-07-02  Michael Saboff  <msaboff@apple.com>
3758
3759         Exception from For..of loop destructured assignment eliminates TDZ checks in subsequent code
3760         https://bugs.webkit.org/show_bug.cgi?id=199395
3761
3762         Reviewed by Filip Pizlo.
3763
3764         For destructuring assignmests, the assignment might throw a reference error if
3765         the RHS cannot be coerced.  The current bytecode generated for such assignments
3766         optimizes out the TDZ check after the coercible check.
3767
3768         By saving the current state of the TDZ stack before processing the setting of 
3769         target destructured values and then restoring afterwards, we won't optimize out
3770         later TDZ check(s).
3771
3772         A similar change of saving / restoring the TDZ stack where exceptions might
3773         happen was done for for..in loops in change set r232219.
3774
3775         * bytecompiler/NodesCodegen.cpp:
3776         (JSC::ObjectPatternNode::bindValue const):
3777
3778 2019-07-02  Commit Queue  <commit-queue@webkit.org>
3779
3780         Unreviewed, rolling out r247041.
3781         https://bugs.webkit.org/show_bug.cgi?id=199425
3782
3783         broke some iOS arm64e tests (Requested by keith_miller on
3784         #webkit).
3785
3786         Reverted changeset:
3787
3788         "PACCage should first cage leaving PAC bits intact then
3789         authenticate"
3790         https://bugs.webkit.org/show_bug.cgi?id=199372
3791         https://trac.webkit.org/changeset/247041
3792
3793 2019-07-02  Keith Miller  <keith_miller@apple.com>
3794
3795         Frozen Arrays length assignment should throw in strict mode
3796         https://bugs.webkit.org/show_bug.cgi?id=199365
3797
3798         Reviewed by Yusuke Suzuki.
3799
3800         * runtime/JSArray.cpp:
3801         (JSC::JSArray::put):
3802
3803 2019-07-02  Paulo Matos  <pmatos@linki.tools>
3804
3805         Fix typo in if/else block and remove dead assignment
3806         https://bugs.webkit.org/show_bug.cgi?id=199352
3807
3808         Reviewed by Alexey Proskuryakov.
3809
3810         * yarr/YarrPattern.cpp:
3811         (JSC::Yarr::YarrPattern::dumpPattern): Fix typo in if/else block and remove dead assignment
3812
3813 2019-07-02  Keith Miller  <keith_miller@apple.com>
3814
3815         PACCage should first cage leaving PAC bits intact then authenticate
3816         https://bugs.webkit.org/show_bug.cgi?id=199372
3817
3818         Reviewed by Saam Barati.
3819
3820         This ordering prevents someone from taking a signed pointer from
3821         outside the gigacage and using it in a struct that expects a caged
3822         pointer. Previously, the PACCaging just double checked that the PAC
3823         bits were valid for the original pointer.
3824
3825
3826                +---------------------------+
3827                |       |        |          |
3828                | "PAC" | "base" | "offset" +----+
3829                |       |        |          |    |
3830                +---------------------------+    | Caging
3831                 |                               |
3832                 |                               |
3833                 |                               v
3834                 |                +---------------------------+
3835                 |                |       |        |          |
3836                 | Bit Merge      | 00000 |  base  | "offset" |
3837                 |                |       |        |          |
3838                 |                +---------------------------+
3839                 |                               |
3840                 |                               |
3841                 v                               |  Bit Merge
3842           +---------------------------+         |
3843           |       |        |          |         |
3844           | "PAC" |  base  | "offset" +<--------+
3845           |       |        |          |
3846           +---------------------------+
3847                       |
3848                       |
3849                       | Authenticate
3850                       |
3851                       v
3852           +---------------------------+
3853           |       |        |          |
3854           | Auth  |  base  | "offset" |
3855           |       |        |          |
3856           +---------------------------+
3857
3858         The above ascii art graph shows how the PACCage system works. The
3859         key take away is that even if someone passes in a valid, signed
3860         pointer outside the cage it will still fail to authenticate as the
3861         "base" bits will change before authentication.
3862
3863
3864         * assembler/MacroAssemblerARM64E.h:
3865         * assembler/testmasm.cpp:
3866         (JSC::testCagePreservesPACFailureBit):
3867         * ftl/FTLLowerDFGToB3.cpp:
3868         (JSC::FTL::DFG::LowerDFGToB3::caged):
3869         * jit/AssemblyHelpers.h:
3870         (JSC::AssemblyHelpers::cageConditionally):
3871         * llint/LowLevelInterpreter64.asm:
3872
3873 2019-07-01  Justin Michaud  <justin_michaud@apple.com>
3874
3875         [Wasm-References] Disable references by default
3876         https://bugs.webkit.org/show_bug.cgi?id=199390
3877
3878         Reviewed by Saam Barati.
3879
3880         * runtime/Options.h:
3881
3882 2019-07-01  Ryan Haddad  <ryanhaddad@apple.com>
3883
3884         Unreviewed, rolling out r246946.
3885
3886         Caused JSC test crashes on arm64
3887
3888         Reverted changeset:
3889