• Paolo Severini's avatar
    Reland "V8 x64 backend doesn't emit ABI compliant stack frames" · 969cb0c7
    Paolo Severini authored
    This is a reland of 3cda21de
    
    Original change's description:
    > V8 x64 backend doesn't emit ABI compliant stack frames
    > 
    > On 64 bit Windows, the OS stack walking does not work because the V8 x64
    > backend doesn't emit unwinding info and also because it doesn't emit ABI
    > compliant stack frames. See
    > https://docs.google.com/document/d/1-wf50jFlii0c_Pr52lm2ZU-49m220nhYMrHDi3vXnh0/edit
    > for more details.
    > 
    > This problem can be fixed by observing that V8 frames usually all have the same
    > prolog and epilog:
    > 
    > push rbp,
    > mov rbp, rsp
    > ...
    > pop rbp
    > ret N
    > 
    > and that it is possible to define XDATA (UNWIND_CODEs) that specify how Windows
    > should walk through V8 frames. Furthermore, since V8 Code objects are all
    > allocated in the same code-range for an Isolate, it is possible to register a
    > single PDATA/XDATA entry to cover stack walking for all the code generated
    > inside that code-range.
    > 
    > This PR contains changes required to enable stack walking on Win64:
    > 
    > EmbeddedFileWriter now adds assembler directives to the builtins
    > snapshot source file (embedded.cc) to emit additional entries in the .pdata and
    > in the .xdata section of the V8 executable. This takes care of stack walking
    > for embedded builtins. (The case of non-embedded builtins is not supported).
    > The x64 Assembler has been modified to collect the information required to emit
    > this unwind info for builtins.
    > 
    > Stack walking for jitted code is handled is Isolate.cpp, by registering
    > dynamically PDATA/XDATA for the whole code-range address space every time a new
    > Isolate is initialized, and by unregistering them when the Isolate is
    > destroyed.
    > 
    > Stack walking for WASM jitted code is handled is the same way in
    > wasm::NativeModule (wasm/wasm-code-manager.cpp).
    > 
    > It is important to note that Crashpad and Breakpad are already registering
    > PDATA/XDATA to manage and report unhandled exceptions (but not for embedded
    > builtins). Since it is not possible to register multiple PDATA entries for the
    > same address range, a new function is added to the V8 API:
    > SetUnhandledExceptionCallback() can be used by an embedder to register its own
    > unhandled exception handler for exceptions that arise in v8-generated code.
    > V8 embedders should be modified accordingly (code for this is in a separate PR
    > in the Chromium repository:
    > https://chromium-review.googlesource.com/c/chromium/src/+/1474703).
    > 
    > All these changes are experimental, behind:
    > 
    > the 'v8_win64_unwinding_info' build flag, and
    > the '--win64-unwinding-info' runtime flag.
    > 
    > Bug: v8:3598
    > Change-Id: Iea455ab6d0e2bf1c556aa1cf870841d44ab6e4b1
    > Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1469329
    > Reviewed-by: Michael Starzinger <mstarzinger@chromium.org>
    > Reviewed-by: Jakob Gruber <jgruber@chromium.org>
    > Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
    > Commit-Queue: Paolo Severini <paolosev@microsoft.com>
    > Cr-Commit-Position: refs/heads/master@{#60330}
    
    Bug: v8:3598
    Change-Id: If988baf7d3e4af165b919d6e54c1ad985f8e25e3
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1534618Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
    Reviewed-by: 's avatarUlan Degenbaev <ulan@chromium.org>
    Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
    Commit-Queue: Paolo Severini <paolosev@microsoft.com>
    Cr-Commit-Position: refs/heads/master@{#60581}
    969cb0c7
Name
Last commit
Last update
..
backend Loading commit data...
DEPS Loading commit data...
OWNERS Loading commit data...
STYLE Loading commit data...
access-builder.cc Loading commit data...
access-builder.h Loading commit data...
access-info.cc Loading commit data...
access-info.h Loading commit data...
all-nodes.cc Loading commit data...
all-nodes.h Loading commit data...
allocation-builder-inl.h Loading commit data...
allocation-builder.h Loading commit data...
basic-block-instrumentor.cc Loading commit data...
basic-block-instrumentor.h Loading commit data...
branch-elimination.cc Loading commit data...
branch-elimination.h Loading commit data...
bytecode-analysis.cc Loading commit data...
bytecode-analysis.h Loading commit data...
bytecode-graph-builder.cc Loading commit data...
bytecode-graph-builder.h Loading commit data...
bytecode-liveness-map.cc Loading commit data...
bytecode-liveness-map.h Loading commit data...
c-linkage.cc Loading commit data...
checkpoint-elimination.cc Loading commit data...
checkpoint-elimination.h Loading commit data...
code-assembler.cc Loading commit data...
code-assembler.h Loading commit data...
common-node-cache.cc Loading commit data...
common-node-cache.h Loading commit data...
common-operator-reducer.cc Loading commit data...
common-operator-reducer.h Loading commit data...
common-operator.cc Loading commit data...
common-operator.h Loading commit data...
compilation-dependencies.cc Loading commit data...
compilation-dependencies.h Loading commit data...
compiler-source-position-table.cc Loading commit data...
compiler-source-position-table.h Loading commit data...
constant-folding-reducer.cc Loading commit data...
constant-folding-reducer.h Loading commit data...
control-equivalence.cc Loading commit data...
control-equivalence.h Loading commit data...
control-flow-optimizer.cc Loading commit data...
control-flow-optimizer.h Loading commit data...
dead-code-elimination.cc Loading commit data...
dead-code-elimination.h Loading commit data...
diamond.h Loading commit data...
effect-control-linearizer.cc Loading commit data...
effect-control-linearizer.h Loading commit data...
escape-analysis-reducer.cc Loading commit data...
escape-analysis-reducer.h Loading commit data...
escape-analysis.cc Loading commit data...
escape-analysis.h Loading commit data...
frame-states.cc Loading commit data...
frame-states.h Loading commit data...
frame.cc Loading commit data...
frame.h Loading commit data...
functional-list.h Loading commit data...
graph-assembler.cc Loading commit data...
graph-assembler.h Loading commit data...
graph-reducer.cc Loading commit data...
graph-reducer.h Loading commit data...
graph-trimmer.cc Loading commit data...
graph-trimmer.h Loading commit data...
graph-visualizer.cc Loading commit data...
graph-visualizer.h Loading commit data...
graph.cc Loading commit data...
graph.h Loading commit data...
int64-lowering.cc Loading commit data...
int64-lowering.h Loading commit data...
js-call-reducer.cc Loading commit data...
js-call-reducer.h Loading commit data...
js-context-specialization.cc Loading commit data...
js-context-specialization.h Loading commit data...
js-create-lowering.cc Loading commit data...
js-create-lowering.h Loading commit data...
js-generic-lowering.cc Loading commit data...
js-generic-lowering.h Loading commit data...
js-graph.cc Loading commit data...
js-graph.h Loading commit data...
js-heap-broker.cc Loading commit data...
js-heap-broker.h Loading commit data...
js-heap-copy-reducer.cc Loading commit data...
js-heap-copy-reducer.h Loading commit data...
js-inlining-heuristic.cc Loading commit data...
js-inlining-heuristic.h Loading commit data...
js-inlining.cc Loading commit data...
js-inlining.h Loading commit data...
js-intrinsic-lowering.cc Loading commit data...
js-intrinsic-lowering.h Loading commit data...
js-native-context-specialization.cc Loading commit data...
js-native-context-specialization.h Loading commit data...
js-operator.cc Loading commit data...
js-operator.h Loading commit data...
js-type-hint-lowering.cc Loading commit data...
js-type-hint-lowering.h Loading commit data...
js-typed-lowering.cc Loading commit data...
js-typed-lowering.h Loading commit data...
linkage.cc Loading commit data...
linkage.h Loading commit data...
load-elimination.cc Loading commit data...
load-elimination.h Loading commit data...
loop-analysis.cc Loading commit data...
loop-analysis.h Loading commit data...
loop-peeling.cc Loading commit data...
loop-peeling.h Loading commit data...
loop-variable-optimizer.cc Loading commit data...
loop-variable-optimizer.h Loading commit data...
machine-graph-verifier.cc Loading commit data...
machine-graph-verifier.h Loading commit data...
machine-graph.cc Loading commit data...
machine-graph.h Loading commit data...
machine-operator-reducer.cc Loading commit data...
machine-operator-reducer.h Loading commit data...
machine-operator.cc Loading commit data...
machine-operator.h Loading commit data...
memory-optimizer.cc Loading commit data...
memory-optimizer.h Loading commit data...
node-aux-data.h Loading commit data...
node-cache.cc Loading commit data...
node-cache.h Loading commit data...
node-marker.cc Loading commit data...
node-marker.h Loading commit data...
node-matchers.cc Loading commit data...
node-matchers.h Loading commit data...
node-origin-table.cc Loading commit data...
node-origin-table.h Loading commit data...
node-properties.cc Loading commit data...
node-properties.h Loading commit data...
node.cc Loading commit data...
node.h Loading commit data...
opcodes.cc Loading commit data...
opcodes.h Loading commit data...
operation-typer.cc Loading commit data...
operation-typer.h Loading commit data...
operator-properties.cc Loading commit data...
operator-properties.h Loading commit data...
operator.cc Loading commit data...
operator.h Loading commit data...
osr.cc Loading commit data...
osr.h Loading commit data...
per-isolate-compiler-cache.h Loading commit data...
persistent-map.h Loading commit data...
pipeline-statistics.cc Loading commit data...
pipeline-statistics.h Loading commit data...
pipeline.cc Loading commit data...
pipeline.h Loading commit data...
property-access-builder.cc Loading commit data...
property-access-builder.h Loading commit data...
raw-machine-assembler.cc Loading commit data...
raw-machine-assembler.h Loading commit data...
redundancy-elimination.cc Loading commit data...
redundancy-elimination.h Loading commit data...
refs-map.cc Loading commit data...
refs-map.h Loading commit data...
representation-change.cc Loading commit data...
representation-change.h Loading commit data...
schedule.cc Loading commit data...
schedule.h Loading commit data...
scheduler.cc Loading commit data...
scheduler.h Loading commit data...
select-lowering.cc Loading commit data...
select-lowering.h Loading commit data...
serializer-for-background-compilation.cc Loading commit data...
serializer-for-background-compilation.h Loading commit data...
simd-scalar-lowering.cc Loading commit data...
simd-scalar-lowering.h Loading commit data...
simplified-lowering.cc Loading commit data...
simplified-lowering.h Loading commit data...
simplified-operator-reducer.cc Loading commit data...
simplified-operator-reducer.h Loading commit data...
simplified-operator.cc Loading commit data...
simplified-operator.h Loading commit data...
state-values-utils.cc Loading commit data...
state-values-utils.h Loading commit data...
store-store-elimination.cc Loading commit data...
store-store-elimination.h Loading commit data...
type-cache.cc Loading commit data...
type-cache.h Loading commit data...
type-narrowing-reducer.cc Loading commit data...
type-narrowing-reducer.h Loading commit data...
typed-optimization.cc Loading commit data...
typed-optimization.h Loading commit data...
typer.cc Loading commit data...
typer.h Loading commit data...
types.cc Loading commit data...
types.h Loading commit data...
value-numbering-reducer.cc Loading commit data...
value-numbering-reducer.h Loading commit data...
verifier.cc Loading commit data...
verifier.h Loading commit data...
wasm-compiler.cc Loading commit data...
wasm-compiler.h Loading commit data...
zone-stats.cc Loading commit data...
zone-stats.h Loading commit data...