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