• Austin Clements's avatar
    cmd/compile: separate data and function LSyms · a2e79571
    Austin Clements authored
    Currently, obj.Ctxt's symbol table does not distinguish between ABI0
    and ABIInternal symbols. This is *almost* okay, since a given symbol
    name in the final object file is only going to belong to one ABI or
    the other, but it requires that the compiler mark a Sym as being a
    function symbol before it retrieves its LSym. If it retrieves the LSym
    first, that LSym will be created as ABI0, and later marking the Sym as
    a function symbol won't change the LSym's ABI.
    
    Marking a Sym as a function symbol before looking up its LSym sounds
    easy, except Syms have a dual purpose: they are used just as interned
    strings (every function, variable, parameter, etc with the same
    textual name shares a Sym), and *also* to store state for whatever
    package global has that name. As a result, it's easy to slip up and
    look up an LSym when a Sym is serving as the name of a local variable,
    and then later mark it as a function when it's serving as the global
    with the name.
    
    In general, we were careful to avoid this, but #29610 demonstrates one
    case where we messed up. Because of on-demand importing from indexed
    export data, it's possible to compile a method wrapper for a type
    imported from another package before importing an init function from
    that package. If the argument of the method is named "init", the
    "init" LSym will be created as a data symbol when compiling the
    wrapper, before it gets marked as a function symbol.
    
    To fix this, we separate obj.Ctxt's symbol tables for ABI0 and
    ABIInternal symbols. This way, the compiler will simply get a
    different LSym once the Sym takes on its package-global meaning as a
    function.
    
    This fixes the above ordering issue, and means we no longer need to go
    out of our way to create the "init" function early and mark it as a
    function symbol.
    
    Fixes #29610.
    Updates #27539.
    
    Change-Id: Id9458b40017893d46ef9e4a3f9b47fc49e1ce8df
    Reviewed-on: https://go-review.googlesource.com/c/157017
    Run-TryBot: Austin Clements <austin@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
    a2e79571
Name
Last commit
Last update
.github Loading commit data...
api Loading commit data...
doc Loading commit data...
lib/time Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README.md Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...