• Matthew Dempsky's avatar
    cmd/compile: update escape analysis tests for newescape · a9831633
    Matthew Dempsky authored
    The new escape analysis implementation tries to emit debugging
    diagnostics that are compatible with the existing implementation, but
    there's a handful of cases that are easier to handle by updating the
    test expectations instead.
    
    For regress tests that need updating, the original file is copied to
    oldescapeXXX.go.go with -newescape=false added to the //errorcheck
    line, while the file is updated in place with -newescape=true and new
    test requirements.
    
    Notable test changes:
    
    1) escape_because.go looks for a lot of detailed internal debugging
    messages that are fairly particular to how esc.go works and that I
    haven't attempted to port over to escape.go yet.
    
    2) There are a lot of "leaking param: x to result ~r1 level=-1"
    messages for code like
    
        func(p *int) *T { return &T{p} }
    
    that were simply wrong. Here &T must be heap allocated unconditionally
    (because it's being returned); and since p is stored into it, p
    escapes unconditionally too. esc.go incorrectly reports that p escapes
    conditionally only if the returned pointer escaped.
    
    3) esc.go used to print each "leaking param" analysis result as it
    discovered them, which could lead to redundant messages (e.g., that a
    param leaks at level=0 and level=1). escape.go instead prints
    everything at the end, once it knows the shortest path to each sink.
    
    4) esc.go didn't precisely model direct-interface types, resulting in
    some values unnecessarily escaping to the heap when stored into
    non-escaping interface values.
    
    5) For functions written in assembly, esc.go only printed "does not
    escape" messages, whereas escape.go prints "does not escape" or
    "leaking param" as appropriate, consistent with the behavior for
    functions written in Go.
    
    6) 12 tests included "BAD" annotations identifying cases where esc.go
    was unnecessarily heap allocating something. These are all fixed by
    escape.go.
    
    Updates #23109.
    
    Change-Id: Iabc9eb14c94c9cadde3b183478d1fd54f013502f
    Reviewed-on: https://go-review.googlesource.com/c/go/+/170447
    Run-TryBot: Matthew Dempsky <mdempsky@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarDavid Chase <drchase@google.com>
    a9831633