• Austin Clements's avatar
    cmd/compile: improve coverage of nowritebarrierrec check · 5a4b6bce
    Austin Clements authored
    The current go:nowritebarrierrec checker has two problems that limit
    its coverage:
    
    1. It doesn't understand that systemstack calls its argument, which
    means there are several cases where we fail to detect prohibited write
    barriers.
    
    2. It only observes calls in the AST, so calls constructed during
    lowering by SSA aren't followed.
    
    This CL completely rewrites this checker to address these issues.
    
    The current checker runs entirely after walk and uses visitBottomUp,
    which introduces several problems for checking across systemstack.
    First, visitBottomUp itself doesn't understand systemstack calls, so
    the callee may be ordered after the caller, causing the checker to
    fail to propagate constraints. Second, many systemstack calls are
    passed a closure, which is quite difficult to resolve back to the
    function definition after transformclosure and walk have run. Third,
    visitBottomUp works exclusively on the AST, so it can't observe calls
    created by SSA.
    
    To address these problems, this commit splits the check into two
    phases and rewrites it to use a call graph generated during SSA
    lowering. The first phase runs before transformclosure/walk and simply
    records systemstack arguments when they're easy to get. Then, it
    modifies genssa to record static call edges at the point where we're
    lowering to Progs (which is the latest point at which position
    information is conveniently available). Finally, the second phase runs
    after all functions have been lowered and uses a direct BFS walk of
    the call graph (combining systemstack calls with static calls) to find
    prohibited write barriers and construct nice error messages.
    
    Fixes #22384.
    For #22460.
    
    Change-Id: I39668f7f2366ab3c1ab1a71eaf25484d25349540
    Reviewed-on: https://go-review.googlesource.com/72773
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarMatthew Dempsky <mdempsky@google.com>
    5a4b6bce
nowritebarrier.go 1.2 KB