• 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
..
arm Loading commit data...
arm64 Loading commit data...
ia32 Loading commit data...
mips Loading commit data...
mips64 Loading commit data...
ppc Loading commit data...
riscv64 Loading commit data...
s390 Loading commit data...
x64 Loading commit data...
DIR_METADATA 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...
mid-tier-register-allocator.cc Loading commit data...
mid-tier-register-allocator.h Loading commit data...
move-optimizer.cc Loading commit data...
move-optimizer.h Loading commit data...
register-allocation.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...
spill-placer.cc Loading commit data...
spill-placer.h Loading commit data...
unwinding-info-writer.h Loading commit data...