]> Cypherpunks repositories - gostls13.git/commit
cmd/compile: write some static data directly
authorJosh Bleecher Snyder <josharian@gmail.com>
Sun, 13 Mar 2016 19:16:43 +0000 (12:16 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Mon, 14 Mar 2016 02:21:43 +0000 (02:21 +0000)
commit7c18f8cdc37600637f05f1e87799cb013ee85772
tree1ae86c741ddbe4c8ced3a6ee690aeb94c8155cf7
parent368507bb6fde52fc60797ced83a25e13b1c6b19d
cmd/compile: write some static data directly

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/20645
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/compile/internal/gc/obj.go
src/cmd/internal/obj/data.go