diff options
author | Keith Randall <khr@google.com> | 2018-02-27 13:46:03 -0800 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2018-02-27 22:58:32 +0000 |
commit | 2413b5488841903ad99463962f50f85221733c30 (patch) | |
tree | 46a242b1f8cf5fc9c158cf3d562d4b9291c556a5 /src/cmd/compile/internal/ssa/decompose.go | |
parent | b80b4a23d135c12d91e71ba51e906cb5783f4d61 (diff) | |
download | go-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.go | 5 |
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) |