aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/ssa/decompose.go
diff options
context:
space:
mode:
authorKeith Randall <khr@google.com>2018-02-27 13:46:03 -0800
committerKeith Randall <khr@golang.org>2018-02-27 22:58:32 +0000
commit2413b5488841903ad99463962f50f85221733c30 (patch)
tree46a242b1f8cf5fc9c158cf3d562d4b9291c556a5 /src/cmd/compile/internal/ssa/decompose.go
parentb80b4a23d135c12d91e71ba51e906cb5783f4d61 (diff)
downloadgo-2413b5488841903ad99463962f50f85221733c30.tar.gz
go-2413b5488841903ad99463962f50f85221733c30.zip
cmd/compile: mark the first word of an interface as a uintptr
The first word of an interface is a pointer, but for the purposes of GC we don't need to treat it as such. 1. If it is a non-empty interface, the pointer points to an itab which is always in persistentalloc space. 2. If it is an empty interface, the pointer points to a _type. a. If it is a compile-time-allocated type, it points into the read-only data section. b. If it is a reflect-allocated type, it points into the Go heap. Reflect is responsible for keeping a reference to the underlying type so it won't be GCd. If we ever have a moving GC, we need to change this for 2b (as well as scan itabs to update their itab._type fields). Write barriers on the first word of interfaces have already been removed. Change-Id: I643e91d7ac4de980ac2717436eff94097c65d959 Reviewed-on: https://go-review.googlesource.com/97518 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd/compile/internal/ssa/decompose.go')
-rw-r--r--src/cmd/compile/internal/ssa/decompose.go5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/cmd/compile/internal/ssa/decompose.go b/src/cmd/compile/internal/ssa/decompose.go
index 0cabfb61e7..af85090248 100644
--- a/src/cmd/compile/internal/ssa/decompose.go
+++ b/src/cmd/compile/internal/ssa/decompose.go
@@ -200,12 +200,13 @@ func decomposeComplexPhi(v *Value) {
}
func decomposeInterfacePhi(v *Value) {
+ uintptrType := v.Block.Func.Config.Types.Uintptr
ptrType := v.Block.Func.Config.Types.BytePtr
- itab := v.Block.NewValue0(v.Pos, OpPhi, ptrType)
+ itab := v.Block.NewValue0(v.Pos, OpPhi, uintptrType)
data := v.Block.NewValue0(v.Pos, OpPhi, ptrType)
for _, a := range v.Args {
- itab.AddArg(a.Block.NewValue1(v.Pos, OpITab, ptrType, a))
+ itab.AddArg(a.Block.NewValue1(v.Pos, OpITab, uintptrType, a))
data.AddArg(a.Block.NewValue1(v.Pos, OpIData, ptrType, a))
}
v.reset(OpIMake)