Generate boilerplate for more LIR instructions
Categories
(Core :: JavaScript Engine: JIT, enhancement, P1)
Tracking
()
| Tracking | Status | |
|---|---|---|
| firefox136 | --- | fixed |
People
(Reporter: anba, Assigned: anba)
References
(Blocks 1 open bug)
Details
Attachments
(84 files)
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
Bug 1944011 - Part 24: Prefer shared MacroAssembler methods for LWrapInt64ToInt32 codegen. r=jandem!
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review | |
|
48 bytes,
text/x-phabricator-request
|
Details | Review |
| Assignee | ||
Comment 1•11 months ago
|
||
Changes:
- Replace import for "six" with "io".
- Use format strings.
- Properly handle the case when BoxedValue and Int64 operands are used.
- Support Int64 temps.
- Fix assertion expressions.
| Assignee | ||
Comment 2•11 months ago
|
||
Some of these use Int64 temps which are supported through part 1.
| Assignee | ||
Comment 3•11 months ago
|
||
The number of temp-registers used by these atomics operations is arch-specific.
| Assignee | ||
Comment 4•11 months ago
|
||
Part 3 unconvered code which doesn't use ToTempRegisterOrInvalid. Handle also
the remaining code which can be updated to ToTempRegisterOrInvalid.
| Assignee | ||
Comment 5•11 months ago
|
||
Remove unused default arguments, so it's easier to generate the boilerplate for
these instructions.
| Assignee | ||
Comment 6•11 months ago
|
||
This involved reordering the JSContext temp-register.
| Assignee | ||
Comment 7•11 months ago
|
||
After removing the const Range* range() {...} getters, we can also generate
the boilerplate code for these instructions.
| Assignee | ||
Comment 8•11 months ago
|
||
Add a new "successors" attribute that, if present, will generate control
instruction LIR nodes.
Then update a few simple cases to use the new attribute.
| Assignee | ||
Comment 9•11 months ago
|
||
Moving the assertion from the Assembler::Condition cond() {...} getter allows
to generate the LIR boilerplate for these two instructions, too.
| Assignee | ||
Comment 10•11 months ago
|
||
Comment 11•11 months ago
|
||
Comment 12•11 months ago
|
||
Comment 13•11 months ago
|
||
| Assignee | ||
Comment 14•11 months ago
|
||
Some LIR instructions were almost eligible for automatic boilerplate generation,
except they had an additional extraName method. The extraName() method is
called in LNode::getExtraName(), which requires JS_JITSPEW to be defined.
Adding extra_name to request adding the declaration of extraName() and then
moving the method definition out of line enables to generate the LIR boilerplate
for more cases.
| Assignee | ||
Comment 15•11 months ago
|
||
- If we accept replacing
LMinMaxBasewithLInstructionHelper<1, 2, 0>in
one place, we can generate the boilerplate for the non-array version. - After removing
isMax()fromLMinMaxArray{I,D}, we can generate the LIR
boilerplate for the array version.
| Assignee | ||
Comment 16•11 months ago
|
||
Some additional simple cases where the boilerplate can be generated.
| Assignee | ||
Comment 17•11 months ago
|
||
There are comments which mentions this is used for LTestVAndBranch, but that's
actually not true anymore.
| Assignee | ||
Comment 18•11 months ago
|
||
The generated LInt64Allocation getters are already marked as const. Also
mark the LAllocation getters as const for consistency.
| Assignee | ||
Comment 19•11 months ago
|
||
In preparation for later patches, update LIR nodes from "LIR-shared.h" to use
named getters instead of getInt64Operand.
Drive-by change: Remove unnecessary const for value variables.
| Assignee | ||
Comment 20•11 months ago
|
||
Add named Int64 operand getters to arch-specific LIR nodes.
| Assignee | ||
Comment 21•11 months ago
|
||
Replace const LInt64Allocation by:
- When a parameter, use instead
const LInt64Allocation&. - When a return-by-value, drop the
const.
Returning values as const should be avoid in general, because it interferes
with move semantics.
| Assignee | ||
Comment 22•11 months ago
|
||
In preparation for later patches, alreay update the CopySign nodes to use
named getters.
| Assignee | ||
Comment 23•11 months ago
|
||
Replace getTemp(n) calls with the named temp getter in "CodeGenerator.cpp".
| Assignee | ||
Comment 24•11 months ago
|
||
LDivI was defined separately for each architecture and on x86-shared, it
additionally defined extraName(). Use a single definition for all
architecture, so extraName() is available everywhere.
| Assignee | ||
Comment 25•11 months ago
|
||
Similar to LDivI, LTableSwitch and LTableSwitchV were also defined for each
architecture, even though we can actually use a shared definition.
Also changes the newLTableSwitch and newLTableSwitchV method to only
perform the allocation. The pointer to MTableSwitch is then later assigned
through the add call.
| Assignee | ||
Comment 26•11 months ago
|
||
More updates to used named getters, which avoids referring to the operands using
constants.
- Let
LBitOpIinherit fromLBinaryMathto be able to uselhsandrhsgetters. - Remove unnecessary
output()method definitions and instead let it use the
definition fromLInstructionFixedDefsTempsHelper::output.
| Assignee | ||
Comment 27•11 months ago
|
||
Use the shared MacroAssembler methods to address the comment in the ARM64 code.
| Assignee | ||
Comment 28•11 months ago
|
||
Another case like LDivI where we can use a shared definition.
| Assignee | ||
Comment 29•11 months ago
|
||
| Assignee | ||
Comment 30•11 months ago
|
||
These need a temp register only on x86 and x64.
| Assignee | ||
Comment 31•11 months ago
|
||
| Assignee | ||
Comment 32•11 months ago
|
||
Also updates lowering on 32-bit platforms to directly allocate an LInt64Allocation
instead of two LAllocations. (This matches the JS code for atomics, too.)
| Assignee | ||
Comment 33•11 months ago
|
||
| Assignee | ||
Comment 34•11 months ago
|
||
These are almost the same everywhere, except that the operands are sometimes in
a different order...
| Assignee | ||
Comment 35•11 months ago
|
||
| Assignee | ||
Comment 36•11 months ago
|
||
Comment 37•11 months ago
|
||
| bugherder | ||
https://hg.mozilla.org/mozilla-central/rev/239ccdcdf890
https://hg.mozilla.org/mozilla-central/rev/8fce999b3fb3
https://hg.mozilla.org/mozilla-central/rev/03fa134d25af
https://hg.mozilla.org/mozilla-central/rev/6137bbc143b4
https://hg.mozilla.org/mozilla-central/rev/f91049616a51
https://hg.mozilla.org/mozilla-central/rev/dab74f36ecea
https://hg.mozilla.org/mozilla-central/rev/84d654fa0df1
https://hg.mozilla.org/mozilla-central/rev/00d2f2325196
https://hg.mozilla.org/mozilla-central/rev/110ced30d11e
https://hg.mozilla.org/mozilla-central/rev/c97b3983de6f
Updated•11 months ago
|
Updated•11 months ago
|
| Assignee | ||
Comment 38•11 months ago
|
||
Drive-by change:
- Replace
temp(LDefinition::GENERAL)with justtemp(), because it's not
necessary to explicitly pass the default argument.
| Assignee | ||
Comment 39•11 months ago
|
||
| Assignee | ||
Comment 40•11 months ago
|
||
| Assignee | ||
Comment 41•11 months ago
|
||
| Assignee | ||
Comment 42•11 months ago
|
||
Generate getters for boxed operands which return LBoxAllocation, similar to
how LInt64Allocation is returned for int64 allocations.
Part 39 will then update all current ToValue callers to use newly generated
getters.
| Assignee | ||
Comment 43•11 months ago
|
||
Update all ToValue callers at once to avoid running in name resolution
errors: The various CodeGenerator classes all define ToValue as an method,
which hides the newly added ToValue function in the js::jit namespace.
| Assignee | ||
Comment 44•11 months ago
|
||
| Assignee | ||
Comment 45•11 months ago
|
||
| Assignee | ||
Comment 46•11 months ago
|
||
Both classes can be merged after part 41.
| Assignee | ||
Comment 47•11 months ago
|
||
| Assignee | ||
Comment 48•11 months ago
|
||
Needs a temp register on non-ARM targets, except for that difference the
definition can be shared.
| Assignee | ||
Comment 49•11 months ago
|
||
Remove CodeGeneratorARM64::emitSimpleBinaryI64 by aligning codegen for
AddI64 to match AddI more closely. (Same for subtraction and bit-ops.)
That way we also avoid calling getInt64Operand and can instead use the
named getters.
| Assignee | ||
Comment 50•11 months ago
|
||
| Assignee | ||
Comment 51•11 months ago
|
||
Many ALU and FPU instructions don't initialise their operands in the
constructor. To support this pattern add a new attribute "defer_init", which
allows initialising operands and temps through setter methods.
The next parts will use this new attribute.
| Assignee | ||
Comment 52•11 months ago
|
||
lowerForShiftInt64 needed some larger changes because the LIR instruction
generator currently places all word-sized operands first, whereas LShiftI64
and LRotateI64 have an Int64 operand first, followed by a word-sized operand.
And in addition to that, if we want to use newly generated setters, we also
need separate code paths, because the operands are differently named for
LRotateI64 when compared to LShiftI64.
| Assignee | ||
Comment 53•11 months ago
|
||
LMulI has the same definition for all targets except for x86 and x64. On
those two targets the operands are directly initialised and a third
operand is used.
| Assignee | ||
Comment 54•11 months ago
|
||
Also allows to remove LBinaryCallInstructionHelper.
| Assignee | ||
Comment 56•11 months ago
|
||
| Assignee | ||
Comment 57•11 months ago
|
||
Multiple Wasm instructions refer to word-sized operands using index constants.
Supporting this use case enables generating the boilerplate for Wasm instructions.
| Assignee | ||
Comment 58•11 months ago
|
||
Generate the boilerplate for the three WasmSelect instructions.
| Assignee | ||
Comment 59•11 months ago
|
||
- Changed lowering to allocate temp register first to avoid
setTempcalls. - Reordered code for MIPS lowering to match changes in part 55.
| Assignee | ||
Comment 60•11 months ago
|
||
Drive-by change:
- Clean-up lowering to avoid duplicate lines to allocate registers.
| Assignee | ||
Comment 61•11 months ago
|
||
| Assignee | ||
Comment 62•11 months ago
|
||
| Assignee | ||
Comment 63•11 months ago
|
||
| Assignee | ||
Comment 64•11 months ago
|
||
| Assignee | ||
Comment 65•11 months ago
|
||
| Assignee | ||
Comment 66•11 months ago
|
||
| Assignee | ||
Comment 67•11 months ago
|
||
| Assignee | ||
Comment 68•11 months ago
|
||
| Assignee | ||
Comment 69•11 months ago
|
||
| Assignee | ||
Comment 70•11 months ago
|
||
| Assignee | ||
Comment 71•11 months ago
|
||
| Assignee | ||
Comment 72•11 months ago
|
||
| Assignee | ||
Comment 73•11 months ago
|
||
| Assignee | ||
Comment 74•11 months ago
|
||
| Assignee | ||
Comment 75•11 months ago
|
||
| Assignee | ||
Comment 76•11 months ago
|
||
| Assignee | ||
Comment 77•11 months ago
|
||
| Assignee | ||
Comment 78•11 months ago
|
||
| Assignee | ||
Comment 79•11 months ago
|
||
Slight change in behaviour:
The generated LWasmBinarySimd128WithConstant::rhs() getter returns SimdConstant
per value instead of as const SimdConstant&.
| Assignee | ||
Comment 80•11 months ago
|
||
| Assignee | ||
Comment 81•11 months ago
|
||
| Assignee | ||
Comment 82•11 months ago
|
||
That way we don't have to worry about incorrect memory barriers in LMemoryBarrier
and can remove the assertion in the constructor. That in turn allows to generate
the boilerplate for LMemoryBarrier. (See part 78.)
Using a separate type also seems to lead to better code generation.
For example Synchronization::isDone() was compiled to this on Clang:
mov eax, edi
movzx ecx, ah
movzx eax, al
or ax, cx
sete al
ret
With this patch it's now compiled to:
test di, di
sete al
ret
There is no change for GCC, it's still compiled to:
mov eax, edi
mov edx, edi
or dl, ah
test dl, dl
sete al
ret
| Assignee | ||
Comment 83•11 months ago
|
||
| Assignee | ||
Comment 84•11 months ago
|
||
| Assignee | ||
Comment 85•11 months ago
|
||
| Assignee | ||
Comment 86•11 months ago
|
||
| Assignee | ||
Comment 87•11 months ago
|
||
| Assignee | ||
Comment 88•11 months ago
|
||
| Assignee | ||
Comment 89•11 months ago
|
||
Named getters make this helper obsolete.
Comment 90•11 months ago
|
||
Comment 91•11 months ago
|
||
Comment 92•11 months ago
|
||
Comment 93•11 months ago
|
||
Comment 94•11 months ago
•
|
||
Backed out comment 93 for causing build bustages @CodeGenerator.cpp.
Comment 95•11 months ago
|
||
| bugherder | ||
https://hg.mozilla.org/mozilla-central/rev/fad919afeb2c
https://hg.mozilla.org/mozilla-central/rev/b20c82e5fe2b
https://hg.mozilla.org/mozilla-central/rev/0cf3f2725535
https://hg.mozilla.org/mozilla-central/rev/b5256903d442
https://hg.mozilla.org/mozilla-central/rev/06c418e3cd60
https://hg.mozilla.org/mozilla-central/rev/68439cf27285
https://hg.mozilla.org/mozilla-central/rev/96ed85f15893
https://hg.mozilla.org/mozilla-central/rev/0ba88191ffea
https://hg.mozilla.org/mozilla-central/rev/af5f70a69ea2
https://hg.mozilla.org/mozilla-central/rev/b03202f06983
https://hg.mozilla.org/mozilla-central/rev/5ff7dd0d2cdd
https://hg.mozilla.org/mozilla-central/rev/cc823a17aeb5
https://hg.mozilla.org/mozilla-central/rev/748a4ed1960b
https://hg.mozilla.org/mozilla-central/rev/5c9329a4876c
https://hg.mozilla.org/mozilla-central/rev/b6c9cc580edc
https://hg.mozilla.org/mozilla-central/rev/801fb98445de
https://hg.mozilla.org/mozilla-central/rev/01e9c9b5fc1d
https://hg.mozilla.org/mozilla-central/rev/9506e0d74a2e
https://hg.mozilla.org/mozilla-central/rev/0eb471ea1b97
https://hg.mozilla.org/mozilla-central/rev/28f5cebc6891
https://hg.mozilla.org/mozilla-central/rev/281acb90c6dc
https://hg.mozilla.org/mozilla-central/rev/ba2725f72696
https://hg.mozilla.org/mozilla-central/rev/d16ef8bb4b25
Comment 96•11 months ago
|
||
| Assignee | ||
Comment 97•11 months ago
|
||
(In reply to agoloman from comment #94)
Backed out comment 93 for causing build bustages @CodeGenerator.cpp.
Part 39 was missing some stubs for a class which got removed in part 41. This issue only applied to the "wasm32" and "none" JIT backends.
For context why I have to land the patches in smaller stacks:
- Landing large patch stacks leads to Lando timeouts: bug 1747104, bug 1925039
- Some patches in the patch stack are also affected by this Lando bug: bug 1878430, bug 1925062
Comment 98•11 months ago
|
||
Comment 99•11 months ago
|
||
Comment 100•11 months ago
|
||
Comment 101•11 months ago
•
|
||
Would these patches have any (positive or negative, but mainly negative) impact on the build time?
| Assignee | ||
Comment 102•11 months ago
|
||
The patches shouldn't affect build time much. It's mostly replacing hand-written C++ classes with generated classes.
Comment 103•11 months ago
|
||
Comment 104•11 months ago
|
||
Comment 105•11 months ago
|
||
| bugherder | ||
https://hg.mozilla.org/mozilla-central/rev/508edd0d6930
https://hg.mozilla.org/mozilla-central/rev/dafedbc91be0
https://hg.mozilla.org/mozilla-central/rev/bbdd4444411e
https://hg.mozilla.org/mozilla-central/rev/f0b49aefdeed
https://hg.mozilla.org/mozilla-central/rev/b80311e428f4
https://hg.mozilla.org/mozilla-central/rev/997a9233ebce
https://hg.mozilla.org/mozilla-central/rev/6e8d5e2f69a2
https://hg.mozilla.org/mozilla-central/rev/341ab7cf9661
https://hg.mozilla.org/mozilla-central/rev/ef40425942c5
https://hg.mozilla.org/mozilla-central/rev/47c406a8b015
https://hg.mozilla.org/mozilla-central/rev/dedd8972bd7d
https://hg.mozilla.org/mozilla-central/rev/6f7a055f0105
https://hg.mozilla.org/mozilla-central/rev/f7628d6022e9
https://hg.mozilla.org/mozilla-central/rev/f2c987176c86
Comment 106•11 months ago
|
||
Comment 107•11 months ago
|
||
Comment 108•11 months ago
|
||
Comment 109•11 months ago
|
||
Comment 110•11 months ago
|
||
Comment 111•11 months ago
|
||
Comment 112•11 months ago
|
||
| Assignee | ||
Updated•11 months ago
|
Comment 113•11 months ago
|
||
| bugherder | ||
https://hg.mozilla.org/mozilla-central/rev/96bc865569c7
https://hg.mozilla.org/mozilla-central/rev/0b41ec74df7c
https://hg.mozilla.org/mozilla-central/rev/c2225c6cc9bc
https://hg.mozilla.org/mozilla-central/rev/d174a46baf7c
https://hg.mozilla.org/mozilla-central/rev/245eb6d86319
https://hg.mozilla.org/mozilla-central/rev/8e868f706d75
https://hg.mozilla.org/mozilla-central/rev/fbd6883e975f
https://hg.mozilla.org/mozilla-central/rev/18a3424e603e
https://hg.mozilla.org/mozilla-central/rev/042dd9b04967
https://hg.mozilla.org/mozilla-central/rev/abeb9668ebac
https://hg.mozilla.org/mozilla-central/rev/c36071c75ee3
https://hg.mozilla.org/mozilla-central/rev/1717b088cc38
https://hg.mozilla.org/mozilla-central/rev/b693c987df08
https://hg.mozilla.org/mozilla-central/rev/2fbdd1f54343
https://hg.mozilla.org/mozilla-central/rev/a9a2d234e2fe
https://hg.mozilla.org/mozilla-central/rev/faf015a1d824
https://hg.mozilla.org/mozilla-central/rev/d43f91fe327d
https://hg.mozilla.org/mozilla-central/rev/fbab15217bd5
https://hg.mozilla.org/mozilla-central/rev/67398dad4dcb
https://hg.mozilla.org/mozilla-central/rev/39043d1461f4
Comment 114•11 months ago
|
||
| bugherder | ||
https://hg.mozilla.org/mozilla-central/rev/5838eb5dd844
https://hg.mozilla.org/mozilla-central/rev/12e97e4915db
https://hg.mozilla.org/mozilla-central/rev/191436781efa
https://hg.mozilla.org/mozilla-central/rev/9be821a42253
https://hg.mozilla.org/mozilla-central/rev/a2074d2f74d7
https://hg.mozilla.org/mozilla-central/rev/50a3c4a732f5
https://hg.mozilla.org/mozilla-central/rev/e5f6d26e73a0
https://hg.mozilla.org/mozilla-central/rev/c69c2ac43479
https://hg.mozilla.org/mozilla-central/rev/070157eb340c
https://hg.mozilla.org/mozilla-central/rev/97b9c76902ea
https://hg.mozilla.org/mozilla-central/rev/1d641642640d
https://hg.mozilla.org/mozilla-central/rev/f3e582488926
https://hg.mozilla.org/mozilla-central/rev/dd6602ee8a8f
https://hg.mozilla.org/mozilla-central/rev/990438131ba7
Description
•