• 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
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testdata Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...