mirror of
https://github.com/golang/go
synced 2024-09-05 07:54:46 +00:00
![Austin Clements](/assets/img/avatar_default.png)
Now that the buffered write barrier is implemented for all architectures, we can remove the old eager write barrier implementation. This CL removes the implementation from the runtime, support in the compiler for calling it, and updates some compiler tests that relied on the old eager barrier support. It also makes sure that all of the useful comments from the old write barrier implementation still have a place to live. Fixes #22460. Updates #21640 since this fixes the layering concerns of the write barrier (but not the other things in that issue). Change-Id: I580f93c152e89607e0a72fe43370237ba97bae74 Reviewed-on: https://go-review.googlesource.com/92705 Run-TryBot: Austin Clements <austin@google.com> Reviewed-by: Rick Hudson <rlh@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
43 lines
1.1 KiB
Go
43 lines
1.1 KiB
Go
// errorcheck -0 -live
|
|
|
|
// Copyright 2016 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 15747: liveness analysis was marking heap-escaped params live too much,
|
|
// and worse was using the wrong bitmap bits to do so.
|
|
|
|
package p
|
|
|
|
var global *[]byte
|
|
|
|
type Q struct{}
|
|
|
|
type T struct{ M string }
|
|
|
|
var b bool
|
|
|
|
func f1(q *Q, xx []byte) interface{} { // ERROR "live at call to newobject: xx$" "live at entry to f1: xx$"
|
|
// xx was copied from the stack to the heap on the previous line:
|
|
// xx was live for the first two prints but then it switched to &xx
|
|
// being live. We should not see plain xx again.
|
|
if b {
|
|
global = &xx
|
|
}
|
|
xx, _, err := f2(xx, 5) // ERROR "live at call to f2: &xx$"
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
//go:noinline
|
|
func f2(d []byte, n int) (odata, res []byte, e interface{}) { // ERROR "live at entry to f2: d$"
|
|
if n > len(d) {
|
|
return d, nil, &T{M: "hello"} // ERROR "live at call to newobject: d"
|
|
}
|
|
res = d[:n]
|
|
odata = d[n:]
|
|
return
|
|
}
|