• Josh Bleecher Snyder's avatar
    cmd/compile: write some static data directly · 7c18f8cd
    Josh Bleecher Snyder authored
    Instead of generating ADATA instructions for
    static data, write that static data directly
    into the linker sym.
    This is considerably more efficient.
    The assembler still generates
    ADATA instructions, so the ADATA machinery
    cannot be dismantled yet. (Future work.)
    Skipping ADATA has a significant impact
    compiling the unicode package, which has lots
    of static data.
    
    name     old time/op    new time/op    delta
    Unicode     227ms ±10%     192ms ± 4%  -15.61%  (p=0.000 n=29+30)
    
    name     old alloc/op   new alloc/op   delta
    Unicode    51.0MB ± 0%    45.8MB ± 0%  -10.29%  (p=0.000 n=30+30)
    
    name     old allocs/op  new allocs/op  delta
    Unicode      610k ± 0%      578k ± 0%   -5.29%  (p=0.000 n=30+30)
    
    This does not pass toolstash -cmp, because
    this changes the order in which some relocations
    get added, and thus it changes the output from
    the compiler. It is not worth the execution time
    to sort the relocs in the normal case.
    
    However, compiling with -S -v generates identical
    output if (1) you suppress printing of ADATA progs
    in flushplist and (2) you suppress printing of
    cpu timing. It is reasonable to suppress printing
    the ADATA progs, since the data itself is dumped
    later. I am therefore fairly confident that all
    changes are superficial and non-functional.
    
    Fixes #14786, although there's more to do
    in general.
    
    Change-Id: I8dfabe7b423b31a30e516cfdf005b62a2e9ccd82
    Reviewed-on: https://go-review.googlesource.com/20645Reviewed-by: default avatarMatthew Dempsky <mdempsky@google.com>
    Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
    7c18f8cd
obj.go 8.64 KB