• Keith Randall's avatar
    cmd/compile: mark the first word of an interface as a uintptr · 2413b548
    Keith Randall authored
    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: 's avatarDavid Chase <drchase@google.com>
    2413b548
decompose.go 10.8 KB