• Clemens Backes's avatar
    [backend] Fix source position annotations · 5c237388
    Clemens Backes authored
    If two call instructions were generated right after each other, the
    source position table could get populated with two entries for the same
    PC (triggered by the follow-up CL: https://crrev.com/c/2697359).
    This CL fixes that by slightly changing the carry-over of source
    positions from nodes to instructions.
    
    The call node which has a source position attached generates two
    instructions:
          18: gap () ([rax|R|tp] = v16(-); [rbx|R|t] = v17(-);)
              [rax|R|t] = ArchCallWasmFunction [immediate:4] #-1 [rax|R|tp] [rbx|R|t] [immediate:5]
          19: gap () ()
              ArchJmp [immediate:6]
    
    Those are then reversed, and the source position is attached to the first
    one (the ArchJmp). After reversing it again later, the source position
    will be set to the pc *after* the call instruction, which in the example
    happened to be just another call instruction which already had a source
    position, resulting in this code:
    
    [...]
    0x388ee467d426    66  e875feffff     call 0x388ee467d2a0     ;; wasm stub: WasmThrow
    0x388ee467d42b    6b  e850feffff     call 0x388ee467d280     ;; wasm stub: WasmStackGuard
    [...]
    Source positions:
     pc offset  position
            6b         5
            6b         0
    
    By attaching the source position to the *last* instruction (after
    reversing), we ensure that it will be generated for an instruction
    *before* the call, or the call itself if this is the first instruction
    emitted for that node.
    
    R=jgruber@chromium.org
    
    Bug: v8:11490, v8:11496
    Change-Id: Ie95c87d0d9daea56ca14a811abcd02ac07a4cf84
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2697358
    Commit-Queue: Clemens Backes <clemensb@chromium.org>
    Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
    Cr-Commit-Position: refs/heads/master@{#72951}
    5c237388
Name
Last commit
Last update
.github Loading commit data...
build_overrides Loading commit data...
custom_deps Loading commit data...
docs Loading commit data...
gni Loading commit data...
include Loading commit data...
infra Loading commit data...
samples Loading commit data...
src Loading commit data...
test Loading commit data...
testing Loading commit data...
third_party Loading commit data...
tools Loading commit data...
.clang-format Loading commit data...
.clang-tidy Loading commit data...
.editorconfig Loading commit data...
.flake8 Loading commit data...
.git-blame-ignore-revs Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
.gn Loading commit data...
.vpython Loading commit data...
.ycm_extra_conf.py Loading commit data...
AUTHORS Loading commit data...
BUILD.gn Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
COMMON_OWNERS Loading commit data...
DEPS Loading commit data...
DIR_METADATA Loading commit data...
ENG_REVIEW_OWNERS Loading commit data...
INFRA_OWNERS Loading commit data...
INTL_OWNERS Loading commit data...
LICENSE Loading commit data...
LICENSE.fdlibm Loading commit data...
LICENSE.strongtalk Loading commit data...
LICENSE.v8 Loading commit data...
MIPS_OWNERS Loading commit data...
OWNERS Loading commit data...
PPC_OWNERS Loading commit data...
PRESUBMIT.py Loading commit data...
README.md Loading commit data...
RISCV_OWNERS Loading commit data...
S390_OWNERS Loading commit data...
WATCHLISTS Loading commit data...
codereview.settings Loading commit data...