Robert Griesemer [Tue, 13 Sep 2016 00:30:35 +0000 (17:30 -0700)]
cmd/compile: reduce allocs some more
Also: update fmt_test.go.
Together with the previous commits, we are now at or below c85b77c
levels in terms of allocation for the benchmark described in #16897
(old = c85b77c, new = this commit):
Paul Borman [Tue, 12 Jul 2016 15:54:09 +0000 (08:54 -0700)]
text/template: improve lexer performance in finding left delimiters.
The existing implementation calls l.next for each run up to the next
instance of the left delimiter ({{). For ascii text, this is multiple
function calls per byte. Change to use strings.Index to find the left
delimiter. The performace improvement ranges from 1:1 (no text outside
of {{}}'s) to multiple times faster (9:1 was seen on 8K of text with no
{{ }}'s).
Change-Id: I2f82bea63b78b6714f09a725f7b2bbb00a3448a3
Reviewed-on: https://go-review.googlesource.com/24863 Reviewed-by: Rob Pike <r@golang.org>
Run-TryBot: Rob Pike <r@golang.org>
Robert Griesemer [Mon, 12 Sep 2016 20:44:43 +0000 (13:44 -0700)]
cmd/compile: reduce allocs to c85b77c (pre-fmt.go change) levels
Linker and reflect info generation (reflect.go) relies on formatting
of types (tconv). The fmt.Format based approach introduces extra
allocations, which matter in those cases. Resurrected sconv and tconv
code from commit c85b77c (fmt.go only); and adjusted it slightly.
The formatter-based approach is still used throughout the rest of the
compiler, but reflect.go now uses the tconv method that simply returns
the desired string.
(The timing data below may not be accurate; I've included it only for
comparison with the numbers in issue #16897).
The code for sconv/tconv in fmt.go now closely match the code from c85b77c
again; except that the functions are now methods. Removing the use of
the bytes.Buffer in tconv and special-caseing interface{} has helped a
small amount as well:
Keith Randall [Fri, 9 Sep 2016 20:11:07 +0000 (13:11 -0700)]
cmd/compile: get rid of BlockCall
No need for it, we can treat calls as (mostly) normal values
that take a memory and return a memory.
Lowers the number of basic blocks needed to represent a function.
"go test -c net/http" uses 27% fewer basic blocks.
Probably doesn't affect generated code much, but should help
various passes whose running time and/or space depends on
the number of basic blocks.
Keith Randall [Mon, 12 Sep 2016 22:19:36 +0000 (15:19 -0700)]
runtime: make gdb test resilient to line numbering
Don't break on line number, instead break on the actual call.
This makes the test more robust to line numbering changes in the backend.
A CL (28950) changed the generated code line numbering slightly. A MOVW
$0, R0 instruction at the start of the function changed to line
10 (because several constant zero instructions got CSEd, and one gets
picked arbitrarily). That's too fragile for a test.
And v3 will do the right clobbering of flags. But in the rare
cases where we issue a tuple-with-flag op and the flag portion
is dead, then we never issue a Select1. But v1 still clobbers flags,
so we need to respect that.
Quentin Smith [Wed, 7 Sep 2016 22:07:45 +0000 (18:07 -0400)]
time: improve Truncate and Round documentation
Truncate and Round operate on absolute time, which means that
Truncate(Hour) may return a time with non-zero Minute(). Document that
more clearly, and remove the misleading example which suggests it is
safe.
Updates #16647
Change-Id: I930584ca030dd12849195d45e49ed2fb74e0c9ac
Reviewed-on: https://go-review.googlesource.com/28730 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Matthew Dempsky [Mon, 12 Sep 2016 20:39:54 +0000 (13:39 -0700)]
cmd/compile: remove incannedimport
This used to be used to give special semantics to the builtin
definitions of package runtime and unsafe, but none of those are
relevant anymore:
- The builtin runtime and unsafe packages do not risk triggering false
import cycles since they no longer contain `import "runtime"`.
- bimport.go never creates ODCLTYPE, so no need to special case them.
- "incannedimport != 0" is only true when "importpkg != nil" anyway,
so "incannedimport == 0 && importpkg == nil" is equivalent to just
"importpkg == nil".
Matthew Dempsky [Mon, 12 Sep 2016 20:27:36 +0000 (13:27 -0700)]
cmd/compile: remove Pointer from builtin/unsafe.go
We already explicitly construct the "unsafe.Pointer" type in typeinit
because we need it for Types[TUNSAFEPTR]. No point in also having it
in builtin/unsafe.go if it just means (*importer).importtype needs to
fix it.
Robert Griesemer [Sat, 10 Sep 2016 04:08:46 +0000 (21:08 -0700)]
cmd/compile: rewrite %1v and %2v formats to %S and %L (short and long)
- also consistently use %v instead of %s when we have a (gc) Formatter
- rewrite done automatically using Formats test in -u (update) mode
- manual update of format strings that were not single string constants
- updated fmt.go, fmt_test.go accordingly
- fmt_test: permit "%T" always
Change-Id: I8f0704286aba5704600ad0c4a4484005b79b905d
Reviewed-on: https://go-review.googlesource.com/28954 Reviewed-by: Matthew Dempsky <mdempsky@google.com>
The download page says "OS X 10.8 or later", but other pages said 10.7.
Say 10.8 everywhere.
Turns out Go doesn't even compile on OS X 10.7 (details in bug) and we
only run builders for OS X 10.8+, which is likely why 10.7
regressed. Until recently we only had OS X 10.10 builders, even.
We could run 10.7 builders, but there's basically no reason to do so,
especially with 10.12 coming out imminently.
Fixes #16625
Change-Id: Ida6e20fb6c54aea0a3757235b708ac1c053b8c04
Reviewed-on: https://go-review.googlesource.com/28870 Reviewed-by: Chris Broadfoot <cbro@golang.org>
Michael Munday [Mon, 12 Sep 2016 17:33:00 +0000 (13:33 -0400)]
runtime, math/big: allow R0 on s390x to contain values other than 0
The new SSA backend for s390x can use R0 as a general purpose register.
This change modifies assembly code to either avoid using R0 entirely
or explicitly set R0 to 0.
R0 can still be safely used as 0 in address calculations.
cmd/compile: statically initialize some interface values
When possible, emit static data rather than
init functions for interface values.
This:
* cuts 32k off cmd/go
* removes several error values from runtime init
* cuts the size of the image/color/palette compiled package from 103k to 34k
* reduces the time to build the package in #15520 from 8s to 1.5s
Dave Day [Fri, 9 Sep 2016 07:59:43 +0000 (17:59 +1000)]
net/url: modernise parse and unit tests
Remove the naked returns and goto statements from parse.
Make tests more consistent in the got/want ordering, and clean up some
unnecessary helper functions.
Change-Id: Iaa244cb8c00dd6b42836d95448bf02caa72bfabd
Reviewed-on: https://go-review.googlesource.com/28890 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Since 2a8c81ff handshake messages are not written directly to wire but
buffered. If an error happens at the wrong time the alert will be
written to the buffer but never flushed, causing an EOF on the client
instead of a more descriptive alert.
Thanks to Brendan McMillion for reporting this.
Fixes #17037
Change-Id: Ie093648aa3f754f4bc61c2e98c79962005dd6aa2
Reviewed-on: https://go-review.googlesource.com/28818 Reviewed-by: Adam Langley <agl@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Adam Langley <agl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
David Crawshaw [Tue, 6 Sep 2016 13:14:26 +0000 (09:14 -0400)]
cmd/go: internal PIE does not need runtime/cgo
Part of adding PIE internal linking on linux/amd64.
Change-Id: I57f0596cb254cbe6569e4d4e39fe4f48437733f2
Reviewed-on: https://go-review.googlesource.com/28544 Reviewed-by: Ian Lance Taylor <iant@golang.org>
David Crawshaw [Tue, 6 Sep 2016 12:05:19 +0000 (08:05 -0400)]
cmd/link: mark PIE binaries as ET_DYN
Part of adding PIE internal linking on linux/amd64.
Change-Id: I586e7c2afba349281168df5e20d2fdcb697f6e37
Reviewed-on: https://go-review.googlesource.com/28542 Reviewed-by: Ian Lance Taylor <iant@golang.org>
David Crawshaw [Tue, 6 Sep 2016 11:46:59 +0000 (07:46 -0400)]
cmd/link: optimize TLS IE to LE in build mode PIE
When cmd/compile generates position-independent code on linux
(the -shared flag), it refers to runtime.tlsg as a TLS IE variable.
When cmd/link is linking a PIE executable internally, all TLS IE
relocations are generated by cmd/compile, and the variable they
refer to, runtime.tlsg, is local to the binary. This means we can
optimize this particular IE case to LE, and thus implement IE
support when internally linking.
To do this optimization in the linker, we need to rewrite the
PC-relative MOVD to a constant load. This may seem like an
unconscionable act born of enthusiasm, but it turns out this is
standard operating procedure for linkers. GNU gold does exactly
the same optimization. I spent some time reading it and documented
at least one missing feature from this version.
Part of adding PIE internal linking on linux/amd64.
Change-Id: I1eb068d0ec774724944c6b308aa5084582ecde0b
Reviewed-on: https://go-review.googlesource.com/28540 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
David Crawshaw [Tue, 6 Sep 2016 03:49:53 +0000 (23:49 -0400)]
cmd/link: generate dynamic relocs for internal PIE
This reuses the machinery built for dynamic loading of shared
libraries. The significant difference with PIE is we generate
dynamic relocations for known internal symbols, not just
dynamic external symbols.
Part of adding PIE internal linking on linux/amd64.
Change-Id: I4afa24070bfb61f94f8d3648f2433d5343bac3fe
Reviewed-on: https://go-review.googlesource.com/28539 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
David Crawshaw [Tue, 6 Sep 2016 03:29:16 +0000 (23:29 -0400)]
cmd/link: introduce a rel.ro segment
When internally linking with using rel.ro sections, this segment covers
the sections. To do this, move to other read-only sections, SELFROSECT
and SMACHOPLT, out of the way.
Part of adding PIE internal linking on linux/amd64.
Change-Id: I4fb3d180e92f7e801789ab89864010faf5a2cb6d
Reviewed-on: https://go-review.googlesource.com/28538
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
net: make LookupPort and lookupProtocol work on nacl
Also, flesh out the baked-in /etc/services table for LookupPort a bit.
This services map moves from a unix-specific file to a portable file
where nacl can use it.
Also, remove the duplicated entries in the protocol map in different
cases, and just canonicalize the input before looking in the map. Now
it handles any case, including MiXeD cAse.
In the process, add a test that service names for LookupPort are case
insensitive. They were on Windows, but not cgo. Now there's a test and
they're case insensitive in all 3+ paths. Maybe it breaks plan9. We'll
see.
Alex Brainman [Sat, 10 Sep 2016 04:04:46 +0000 (14:04 +1000)]
syscall: avoid convT2I allocs for ERROR_IO_PENDING instead of WSAEINPROGRESS
CL 28484 mistakenly assumed that WSARecv returns WSAEINPROGRESS
when there is nothing to read. But the error is ERROR_IO_PENDING.
Fix that mistake.
I was about to write a test for it. But I have found
TestTCPReadWriteAllocs in net package that does nearly what I need,
but was conveniently disabled. So enable and extend the test.
There are a considerable number of false positives,
mostly from legitimate but unusual assembly in
the runtime and reflect packages.
There are also a few false positives that need fixes.
They are noted as such in the whitelists;
they're not worth holding this CL for.
The unsafe pointer check is disabled.
The false positive rate is just too high to be worth it.
There is no cmd/dist/test integration yet.
The tentative plan is that we'll check the local platform
during all.bash, and that there'll be a fast builder that
checks all platforms (to cover platforms that can't exec).
Fixes #11041
Change-Id: Iee4ed32b05447888368ed86088e3ed3771f84442
Reviewed-on: https://go-review.googlesource.com/27811 Reviewed-by: Rob Pike <r@golang.org>
Concurrent use of tls.Config is allowed, and may lead to
KeyLogWriter being written to concurrently. Without a mutex
to protect it, corrupted output may occur. A mutex is added
for correctness.
The mutex is made global to save size of the config struct as
KeyLogWriter is rarely enabled.
GoToolPath requires a *testing.T to handle errors.
GoTool provides a variant that returns errors
for clients without a *testing.T,
such as that found in CL 27811.
flag: use strconv instead of fmt in values' String funcs
The existing implementation of flag values with fmt package uses
more memory and works slower than the implementation with strconv
package.
Change-Id: I9e749179f66d5c50cafe98186641bcdbc546d2db
Reviewed-on: https://go-review.googlesource.com/28914 Reviewed-by: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Edward Muller [Wed, 7 Sep 2016 18:39:31 +0000 (11:39 -0700)]
go/build: add help info for unset $GOPATH
We relay this info in a few places, in a few different ways, but not
consistently everywhere. This led one of our users to start googling
and not find https://golang.org/doc/code.html#Workspaces, of which `go
help gopath` is the most equivalent.
Change-Id: I28a94375739f3aa4f200e145293ca2a5f65101e1
Reviewed-on: https://go-review.googlesource.com/28690
Run-TryBot: Rob Pike <r@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rob Pike <r@golang.org>
Robert Griesemer [Fri, 9 Sep 2016 18:29:33 +0000 (11:29 -0700)]
cmd/compile: use regular rather than indexed format string
This enables the format test to process this file (the format
test doesn't handle indexed formats, and this is the only place
in the compiler where they occur).
Change-Id: I99743f20c463f181a589b210365f70162227d4e0
Reviewed-on: https://go-review.googlesource.com/28932
Run-TryBot: Robert Griesemer <gri@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
David Crawshaw [Fri, 9 Sep 2016 12:13:16 +0000 (08:13 -0400)]
cmd: use obj.GOOS, obj.GOARCH, etc
As cmd/internal/obj is coordinating the definition of GOOS, GOARCH,
etc across the compiler and linker, turn its functions into globals
and use them everywhere.
Change-Id: I5db5addda3c6b6435c37fd5581c7c3d9a561f492
Reviewed-on: https://go-review.googlesource.com/28854
Run-TryBot: David Crawshaw <crawshaw@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Jack Lindamood [Tue, 26 Jul 2016 21:20:36 +0000 (14:20 -0700)]
context: reduce memory usage of context tree
Modifies context package to use map[]struct{} rather than map[]bool,
since the map is intended as a set object. Also adds Benchmarks to
the context package switching between different types of root nodes
and a tree with different depths.
Included below are bytes deltas between the old and new code, using
these benchmarks.
Michael Munday [Thu, 8 Sep 2016 23:27:24 +0000 (19:27 -0400)]
runtime: fix SIGILL in checkvectorfacility on s390x
STFLE does not necessarily write to all the double-words that are
requested. It is therefore necessary to clear the target memory
before calling STFLE in order to ensure that the facility list does
not contain false positives.
Dave Day [Thu, 1 Sep 2016 03:13:37 +0000 (13:13 +1000)]
net/url: handle escaped paths in ResolveReference
Currently, path resolution is done using the un-escaped version of
paths. This means that path elements like one%2ftwo%2fthree are
handled incorrectly, and optional encodings (%2d vs. -) are dropped.
This function makes escaped handling consistent with Parse: provided
escapings are honoured, and RawPath is only set if necessary.
A helper method setPath is introduced to handle the correct setting of
Path and RawPath given the encoded path.
Fixes #16947
Change-Id: I40b1215e9066e88ec868b41635066eee220fde37
Reviewed-on: https://go-review.googlesource.com/28343
Run-TryBot: Dave Day <djd@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
encoding/hex: implement examples using all exported functions
Fixes #11254.
Updates #16360.
Implements examples using all exported functions.
This CL also updates Decode documentation to
state that only hexadecimal characters are accepted
in the source slice src, but also that the length
of src must be even.
Sina Siadat [Thu, 8 Sep 2016 07:09:12 +0000 (11:39 +0430)]
net/http/httputil: remove custom hop-by-hop headers from response in ReverseProxy
Hop-by-hop headers (explicitly mentioned in RFC 2616) were already
removed from the response. This removes the custom hop-by-hop
headers listed in the "Connection" header of the response.
Kevin Burke [Sun, 26 Jun 2016 16:47:43 +0000 (09:47 -0700)]
encoding/json: Use a lookup table for safe characters
The previous check for characters inside of a JSON string that needed
to be escaped performed seven different boolean comparisons before
determining that a ASCII character did not need to be escaped. Most
characters do not need to be escaped, so this check can be done in a
more performant way.
Use the same strategy as the unicode package for precomputing a range
of characters that need to be escaped, then do a single lookup into a
character array to determine whether the character needs escaping.
I also took the data set reported in #5683 (browser
telemetry data from Mozilla), added named structs for
the data set, and turned it into a proper benchmark:
https://github.com/kevinburke/jsonbench/blob/master/go/bench_test.go
The results from that test are similarly encouraging. On a 64-bit
Mac: