• 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
..
api Loading commit data...
asmjs Loading commit data...
assembler Loading commit data...
base Loading commit data...
codegen Loading commit data...
compiler Loading commit data...
compiler-dispatcher Loading commit data...
date Loading commit data...
diagnostics Loading commit data...
execution Loading commit data...
heap Loading commit data...
interpreter Loading commit data...
libplatform Loading commit data...
logging Loading commit data...
numbers Loading commit data...
objects Loading commit data...
parser Loading commit data...
profiler Loading commit data...
regress Loading commit data...
strings Loading commit data...
tasks Loading commit data...
torque Loading commit data...
utils Loading commit data...
wasm Loading commit data...
zone Loading commit data...
BUILD.gn Loading commit data...
DEPS Loading commit data...
run-all-unittests.cc Loading commit data...
test-helpers.cc Loading commit data...
test-helpers.h Loading commit data...
test-utils.cc Loading commit data...
test-utils.h Loading commit data...
testcfg.py Loading commit data...
unittests.status Loading commit data...