• 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
..
arm Loading commit data...
arm64 Loading commit data...
ia32 Loading commit data...
mips Loading commit data...
mips64 Loading commit data...
ppc Loading commit data...
s390 Loading commit data...
x64 Loading commit data...
OWNERS Loading commit data...
code-generator-impl.h Loading commit data...
code-generator.cc Loading commit data...
code-generator.h Loading commit data...
frame-elider.cc Loading commit data...
frame-elider.h Loading commit data...
gap-resolver.cc Loading commit data...
gap-resolver.h Loading commit data...
instruction-codes.h Loading commit data...
instruction-scheduler.cc Loading commit data...
instruction-scheduler.h Loading commit data...
instruction-selector-impl.h Loading commit data...
instruction-selector.cc Loading commit data...
instruction-selector.h Loading commit data...
instruction.cc Loading commit data...
instruction.h Loading commit data...
jump-threading.cc Loading commit data...
jump-threading.h Loading commit data...
live-range-separator.cc Loading commit data...
live-range-separator.h Loading commit data...
move-optimizer.cc Loading commit data...
move-optimizer.h Loading commit data...
register-allocator-verifier.cc Loading commit data...
register-allocator-verifier.h Loading commit data...
register-allocator.cc Loading commit data...
register-allocator.h Loading commit data...
unwinding-info-writer.h Loading commit data...