-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
cmd/gc: treat non-local vars inlined into wrapper as escaping
The compiler has a phase ordering problem. Escape analysis runs before wrapper generation. When a generated wrapper calls a method defined in a different package, if that call is inlined, there will be no escape information for the variables defined in the inlined call. Those variables will be placed on the stack, which fails if they actually do escape. There are probably various complex ways to fix this. This is a simple way to avoid it: when a generated wrapper calls a method defined in a different package, treat all local variables as escaping. Fixes golang#9537. Change-Id: I530f39346de16ad173371c6c3f69cc189351a4e9 Reviewed-on: https://go-review.googlesource.com/3092 Reviewed-by: Russ Cox <[email protected]>
- Loading branch information
1 parent
98d9142
commit ec0ebc2
Showing
6 changed files
with
94 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
// Copyright 2015 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package a | ||
|
||
type X struct { | ||
T [32]byte | ||
} | ||
|
||
func (x *X) Get() []byte { | ||
t := x.T | ||
return t[:] | ||
} | ||
|
||
func (x *X) RetPtr(i int) *int { | ||
i++ | ||
return &i | ||
} | ||
|
||
func (x *X) RetRPtr(i int) (r1 int, r2 *int) { | ||
r1 = i + 1 | ||
r2 = &r1 | ||
return | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
// Copyright 2015 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package main | ||
|
||
import ( | ||
"bytes" | ||
|
||
"./a" | ||
) | ||
|
||
type X struct { | ||
*a.X | ||
} | ||
|
||
type Intf interface { | ||
Get() []byte | ||
RetPtr(int) *int | ||
RetRPtr(int) (int, *int) | ||
} | ||
|
||
func main() { | ||
x := &a.X{T: [32]byte{1, 2, 3, 4}} | ||
var ix Intf = X{x} | ||
t1 := ix.Get() | ||
t2 := x.Get() | ||
if !bytes.Equal(t1, t2) { | ||
panic(t1) | ||
} | ||
|
||
p1 := ix.RetPtr(5) | ||
p2 := x.RetPtr(7) | ||
if *p1 != 6 || *p2 != 8 { | ||
panic(*p1) | ||
} | ||
|
||
r1, r2 := ix.RetRPtr(10) | ||
r3, r4 := x.RetRPtr(13) | ||
if r1 != 11 || *r2 != 11 || r3 != 14 || *r4 != 14 { | ||
panic("bad RetRPtr") | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
// rundir | ||
|
||
// Copyright 2015 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
// Issue 9537: Compiler does not run escape analysis on an inlined | ||
// generated method wrapper. | ||
|
||
package ignored |