diff options
author | Chris Broadfoot <cbro@golang.org> | 2016-07-21 12:38:13 -0700 |
---|---|---|
committer | Chris Broadfoot <cbro@golang.org> | 2016-07-21 12:38:21 -0700 |
commit | 16a2af03f17e5b2bcf468442e66ef7a99ae55c70 (patch) | |
tree | ff87e6c2cbf39a6da4c905c8455d787bddc4f56c | |
parent | 0ebf6ce087388cdd501a02ff92f2f8cafc3e1378 (diff) | |
parent | 243d51f05e5dc263e185f9b1f7f1fe96a2098644 (diff) | |
download | go-16a2af03f17e5b2bcf468442e66ef7a99ae55c70.tar.gz go-16a2af03f17e5b2bcf468442e66ef7a99ae55c70.zip |
all: merge master into release-branch.go1.7
Change-Id: I2511c3f7583887b641c9b3694aae54789fbc5342
-rw-r--r-- | doc/devel/release.html | 8 | ||||
-rw-r--r-- | doc/effective_go.html | 14 | ||||
-rw-r--r-- | doc/go1.7.html | 43 | ||||
-rw-r--r-- | misc/trace/trace_viewer_lean.html | 2 | ||||
-rw-r--r-- | src/cmd/api/goapi.go | 2 | ||||
-rw-r--r-- | src/cmd/compile/internal/gc/sparselocatephifunctions.go | 5 | ||||
-rw-r--r-- | src/cmd/compile/internal/ssa/compile.go | 1 | ||||
-rw-r--r-- | src/cmd/compile/internal/ssa/sparsetreemap.go | 104 | ||||
-rw-r--r-- | src/cmd/compile/internal/ssa/tighten.go | 23 | ||||
-rw-r--r-- | src/cmd/go/build.go | 10 | ||||
-rw-r--r-- | src/cmd/gofmt/gofmt.go | 1 | ||||
-rw-r--r-- | src/fmt/scan.go | 6 | ||||
-rw-r--r-- | src/fmt/scan_test.go | 101 | ||||
-rw-r--r-- | src/go/build/build_test.go | 8 | ||||
-rw-r--r-- | src/go/build/deps_test.go | 8 | ||||
-rw-r--r-- | src/math/rand/race_test.go | 47 | ||||
-rw-r--r-- | src/math/rand/rand.go | 42 | ||||
-rw-r--r-- | src/net/dial_test.go | 5 | ||||
-rw-r--r-- | src/net/http/h2_bundle.go | 4 | ||||
-rw-r--r-- | src/net/http/http.go | 2 | ||||
-rw-r--r-- | src/net/http/server.go | 7 | ||||
-rw-r--r-- | src/net/http/transfer.go | 2 | ||||
-rw-r--r-- | src/net/http/transport.go | 2 | ||||
-rw-r--r-- | src/net/interface_bsd.go | 2 | ||||
-rw-r--r-- | src/net/interface_bsdvar.go | 2 | ||||
-rw-r--r-- | src/net/interface_darwin.go | 2 | ||||
-rw-r--r-- | src/net/interface_freebsd.go | 2 | ||||
-rw-r--r-- | src/net/smtp/smtp.go | 5 | ||||
-rw-r--r-- | src/reflect/all_test.go | 2 | ||||
-rw-r--r-- | src/reflect/type.go | 3 | ||||
-rw-r--r-- | src/runtime/cgocall.go | 5 | ||||
-rw-r--r-- | src/runtime/internal/atomic/asm_386.s | 6 | ||||
-rw-r--r-- | src/runtime/internal/atomic/asm_amd64.s | 2 | ||||
-rw-r--r-- | src/runtime/internal/atomic/asm_amd64p32.s | 4 | ||||
-rw-r--r-- | src/runtime/internal/atomic/asm_arm.s | 6 | ||||
-rw-r--r-- | src/runtime/internal/atomic/asm_arm64.s | 4 | ||||
-rw-r--r-- | src/runtime/internal/atomic/asm_ppc64x.s | 2 | ||||
-rw-r--r-- | src/runtime/mbarrier.go | 4 | ||||
-rw-r--r-- | src/runtime/mem_linux.go | 22 | ||||
-rw-r--r-- | src/runtime/mfinal.go | 2 | ||||
-rw-r--r-- | src/runtime/mheap.go | 5 | ||||
-rw-r--r-- | src/runtime/os_nacl.go | 2 | ||||
-rw-r--r-- | src/runtime/pprof/pprof.go | 5 | ||||
-rw-r--r-- | src/runtime/pprof/pprof_test.go | 4 | ||||
-rw-r--r-- | src/runtime/proc.go | 28 | ||||
-rw-r--r-- | src/runtime/race/README | 2 | ||||
-rw-r--r-- | src/runtime/race/race_darwin_amd64.syso | bin | 341304 -> 326172 bytes | |||
-rw-r--r-- | src/runtime/race/race_freebsd_amd64.syso | bin | 399904 -> 404216 bytes | |||
-rw-r--r-- | src/runtime/race/race_linux_amd64.syso | bin | 371032 -> 376048 bytes | |||
-rw-r--r-- | src/runtime/race/race_test.go | 18 | ||||
-rw-r--r-- | src/runtime/race/race_windows_amd64.syso | bin | 363595 -> 367717 bytes | |||
-rw-r--r-- | src/runtime/signal1_unix.go | 2 | ||||
-rw-r--r-- | src/runtime/signal_darwin.go | 4 | ||||
-rw-r--r-- | src/runtime/signal_freebsd.go | 4 | ||||
-rw-r--r-- | src/runtime/signal_openbsd.go | 4 | ||||
-rw-r--r-- | src/runtime/signal_sigtramp.go | 4 | ||||
-rw-r--r-- | src/runtime/stubs.go | 4 | ||||
-rw-r--r-- | src/runtime/sys_darwin_amd64.s | 1 | ||||
-rw-r--r-- | src/syscall/exec_linux_test.go | 1 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/http2/hpack/encode.go (renamed from src/vendor/golang.org/x/net/http2/hpack/encode.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/http2/hpack/encode_test.go (renamed from src/vendor/golang.org/x/net/http2/hpack/encode_test.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/http2/hpack/hpack.go (renamed from src/vendor/golang.org/x/net/http2/hpack/hpack.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/http2/hpack/hpack_test.go (renamed from src/vendor/golang.org/x/net/http2/hpack/hpack_test.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/http2/hpack/huffman.go (renamed from src/vendor/golang.org/x/net/http2/hpack/huffman.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/http2/hpack/tables.go (renamed from src/vendor/golang.org/x/net/http2/hpack/tables.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/lex/httplex/httplex.go (renamed from src/vendor/golang.org/x/net/lex/httplex/httplex.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/lex/httplex/httplex_test.go (renamed from src/vendor/golang.org/x/net/lex/httplex/httplex_test.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/address.go (renamed from src/vendor/golang.org/x/net/route/address.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/address_darwin_test.go (renamed from src/vendor/golang.org/x/net/route/address_darwin_test.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/address_test.go (renamed from src/vendor/golang.org/x/net/route/address_test.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/binary.go (renamed from src/vendor/golang.org/x/net/route/binary.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/defs_darwin.go (renamed from src/vendor/golang.org/x/net/route/defs_darwin.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/defs_dragonfly.go (renamed from src/vendor/golang.org/x/net/route/defs_dragonfly.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/defs_freebsd.go (renamed from src/vendor/golang.org/x/net/route/defs_freebsd.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/defs_netbsd.go (renamed from src/vendor/golang.org/x/net/route/defs_netbsd.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/defs_openbsd.go (renamed from src/vendor/golang.org/x/net/route/defs_openbsd.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/interface.go (renamed from src/vendor/golang.org/x/net/route/interface.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/interface_announce.go (renamed from src/vendor/golang.org/x/net/route/interface_announce.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/interface_classic.go (renamed from src/vendor/golang.org/x/net/route/interface_classic.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/interface_freebsd.go (renamed from src/vendor/golang.org/x/net/route/interface_freebsd.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/interface_multicast.go (renamed from src/vendor/golang.org/x/net/route/interface_multicast.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/interface_openbsd.go (renamed from src/vendor/golang.org/x/net/route/interface_openbsd.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/message.go (renamed from src/vendor/golang.org/x/net/route/message.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/message_darwin_test.go (renamed from src/vendor/golang.org/x/net/route/message_darwin_test.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/message_freebsd_test.go (renamed from src/vendor/golang.org/x/net/route/message_freebsd_test.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/message_test.go (renamed from src/vendor/golang.org/x/net/route/message_test.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/route.go (renamed from src/vendor/golang.org/x/net/route/route.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/route_classic.go (renamed from src/vendor/golang.org/x/net/route/route_classic.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/route_openbsd.go (renamed from src/vendor/golang.org/x/net/route/route_openbsd.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/route_test.go (renamed from src/vendor/golang.org/x/net/route/route_test.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/sys.go (renamed from src/vendor/golang.org/x/net/route/sys.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/sys_darwin.go (renamed from src/vendor/golang.org/x/net/route/sys_darwin.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/sys_dragonfly.go (renamed from src/vendor/golang.org/x/net/route/sys_dragonfly.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/sys_freebsd.go (renamed from src/vendor/golang.org/x/net/route/sys_freebsd.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/sys_netbsd.go (renamed from src/vendor/golang.org/x/net/route/sys_netbsd.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/sys_openbsd.go (renamed from src/vendor/golang.org/x/net/route/sys_openbsd.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/syscall.go (renamed from src/vendor/golang.org/x/net/route/syscall.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/syscall.s (renamed from src/vendor/golang.org/x/net/route/syscall.s) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/zsys_darwin.go (renamed from src/vendor/golang.org/x/net/route/zsys_darwin.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/zsys_dragonfly.go (renamed from src/vendor/golang.org/x/net/route/zsys_dragonfly.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/zsys_freebsd_386.go (renamed from src/vendor/golang.org/x/net/route/zsys_freebsd_386.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/zsys_freebsd_amd64.go (renamed from src/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/zsys_freebsd_arm.go (renamed from src/vendor/golang.org/x/net/route/zsys_freebsd_arm.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/zsys_netbsd.go (renamed from src/vendor/golang.org/x/net/route/zsys_netbsd.go) | 0 | ||||
-rw-r--r-- | src/vendor/golang_org/x/net/route/zsys_openbsd.go (renamed from src/vendor/golang.org/x/net/route/zsys_openbsd.go) | 0 |
105 files changed, 419 insertions, 191 deletions
diff --git a/doc/devel/release.html b/doc/devel/release.html index 97c4133f1d..fcb8c19003 100644 --- a/doc/devel/release.html +++ b/doc/devel/release.html @@ -53,6 +53,14 @@ See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.6.2">Go 1.6.2 milestone</a> on our issue tracker for details. </p> +<p> +go1.6.3 (released 2016/07/17) includes security fixes to the +<code>net/http/cgi</code> package and <code>net/http</code> package when used in +a CGI environment. This release also adds support for macOS Sierra. +See the <a href="https://github.com/golang/go/issues?q=milestone%3AGo1.6.3">Go +1.6.3 milestone</a> on our issue tracker for details. +</p> + <h2 id="go1.5">go1.5 (released 2015/08/19)</h2> <p> diff --git a/doc/effective_go.html b/doc/effective_go.html index 1e66c0c614..f6fe48c8d0 100644 --- a/doc/effective_go.html +++ b/doc/effective_go.html @@ -2238,13 +2238,12 @@ if str, ok := value.(string); ok { <h3 id="generality">Generality</h3> <p> -If a type exists only to implement an interface -and has no exported methods beyond that interface, -there is no need to export the type itself. -Exporting just the interface makes it clear that -it's the behavior that matters, not the implementation, -and that other implementations with different properties -can mirror the behavior of the original type. +If a type exists only to implement an interface and will +never have exported methods beyond that interface, there is +no need to export the type itself. +Exporting just the interface makes it clear the value has no +interesting behavior beyond what is described in the +interface. It also avoids the need to repeat the documentation on every instance of a common method. </p> @@ -3665,4 +3664,3 @@ var _ image.Color = Black var _ image.Image = Black </pre> --> - diff --git a/doc/go1.7.html b/doc/go1.7.html index a460754794..cf5d8a48a5 100644 --- a/doc/go1.7.html +++ b/doc/go1.7.html @@ -75,6 +75,13 @@ This change has no effect on the correctness of existing programs. <h2 id="ports">Ports</h2> <p> +Go 1.7 adds support for macOS 10.12 Sierra. +This support was backported to Go 1.6.3. +Binaries built with versions of Go before 1.6.3 will not work +correctly on Sierra. +</p> + +<p> Go 1.7 adds an experimental port to <a href="https://en.wikipedia.org/wiki/Linux_on_z_Systems">Linux on z Systems</a> (<code>linux/s390x</code>) and the beginning of a port to Plan 9 on ARM (<code>plan9/arm</code>). </p> @@ -85,8 +92,10 @@ added in Go 1.6 now have full support for cgo and external linking. </p> <p> -The experimental port to Linux on big-endian 64-bit PowerPC (<code>linux/ppc64</code>) +The experimental port to Linux on little-endian 64-bit PowerPC (<code>linux/ppc64le</code>) now requires the POWER8 architecture or later. +Big-endian 64-bit PowerPC (<code>linux/ppc64</code>) only requires the +POWER5 architecture. </p> <p> @@ -367,6 +376,12 @@ and packages. </p> +<p> +Garbage collection pauses should be significantly shorter than they +were in Go 1.6 for programs with large numbers of idle goroutines, +substantial stack size fluctuation, or large package-level variables. +</p> + <h2 id="library">Core library</h2> <h3 id="context">Context</h3> @@ -463,6 +478,13 @@ common in some environments. </p> <p> +The runtime can now return unused memory to the operating system on +all architectures. +In Go 1.6 and earlier, the runtime could not +release memory on ARM64, 64-bit PowerPC, or MIPS. +</p> + +<p> On Windows, Go programs in Go 1.5 and earlier forced the global Windows timer resolution to 1ms at startup by calling <code>timeBeginPeriod(1)</code>. @@ -793,6 +815,16 @@ The now produce a pseudo-random stream of bytes that is consistent and not dependent on the size of the input buffer. </p> + +<p> +The documentation clarifies that +Rand's <a href="/pkg/math/rand/#Rand.Seed"><code>Seed</code></a> +and <a href="/pkg/math/rand/#Rand.Read"><code>Read</code></a> methods +are not safe to call concurrently, though the global +functions <a href="/pkg/math/rand/#Seed"><code>Seed</code></a> +and <a href="/pkg/math/rand/#Read"><code>Read</code></a> are (and have +always been) safe. +</p> </dd> </dl> @@ -887,6 +919,13 @@ is set explicitly, following <a href="https://tools.ietf.org/html/rfc7230#sectio </p> <p> +The server implementation is now stricter about rejecting requests with invalid HTTP versions. +Invalid requests claiming to be HTTP/0.x are now rejected (HTTP/0.9 was never fully supported), +and plaintext HTTP/2 requests other than the "PRI * HTTP/2.0" upgrade request are now rejected as well. +The server continues to handle encrypted HTTP/2 requests. +</p> + +<p> In the server, a 200 status code is sent back by the timeout handler on an empty response body, instead of sending back 0 as the status code. </p> @@ -1062,7 +1101,7 @@ from URLs with empty query strings (like <code>/search?</code>). <dd> <p> -<a href="/pkg/os/#IsExists"><code>IsExists</code></a> now returns true for <code>syscall.ENOTEMPTY</code>, +<a href="/pkg/os/#IsExist"><code>IsExist</code></a> now returns true for <code>syscall.ENOTEMPTY</code>, on systems where that error exists. </p> diff --git a/misc/trace/trace_viewer_lean.html b/misc/trace/trace_viewer_lean.html index 7939aae8a6..076cb4359a 100644 --- a/misc/trace/trace_viewer_lean.html +++ b/misc/trace/trace_viewer_lean.html @@ -5281,7 +5281,7 @@ if(traces.length&&!this.hasEventDataDecoder_(importers)){throw new Error('Could importers.sort(function(x,y){return x.importPriority-y.importPriority;});},this);lastTask=lastTask.timedAfter('TraceImport',function importClockSyncMarkers(task){importers.forEach(function(importer,index){task.subTask(Timing.wrapNamedFunction('TraceImport',importer.importerName,function runImportClockSyncMarkersOnOneImporter(){progressMeter.update('Importing clock sync markers '+(index+1)+' of '+ importers.length);importer.importClockSyncMarkers();}),this);},this);},this);lastTask=lastTask.timedAfter('TraceImport',function runImport(task){importers.forEach(function(importer,index){task.subTask(Timing.wrapNamedFunction('TraceImport',importer.importerName,function runImportEventsOnOneImporter(){progressMeter.update('Importing '+(index+1)+' of '+importers.length);importer.importEvents();}),this);},this);},this);if(this.importOptions_.customizeModelCallback){lastTask=lastTask.timedAfter('TraceImport',function runCustomizeCallbacks(task){this.importOptions_.customizeModelCallback(this.model_);},this);} lastTask=lastTask.timedAfter('TraceImport',function importSampleData(task){importers.forEach(function(importer,index){progressMeter.update('Importing sample data '+(index+1)+'/'+importers.length);importer.importSampleData();},this);},this);lastTask=lastTask.timedAfter('TraceImport',function runAutoclosers(){progressMeter.update('Autoclosing open slices...');this.model_.autoCloseOpenSlices();this.model_.createSubSlices();},this);lastTask=lastTask.timedAfter('TraceImport',function finalizeImport(task){importers.forEach(function(importer,index){progressMeter.update('Finalizing import '+(index+1)+'/'+importers.length);importer.finalizeImport();},this);},this);lastTask=lastTask.timedAfter('TraceImport',function runPreinits(){progressMeter.update('Initializing objects (step 1/2)...');this.model_.preInitializeObjects();},this);if(this.importOptions_.pruneEmptyContainers){lastTask=lastTask.timedAfter('TraceImport',function runPruneEmptyContainers(){progressMeter.update('Pruning empty containers...');this.model_.pruneEmptyContainers();},this);} -lastTask=lastTask.timedAfter('TraceImport',function runMergeKernelWithuserland(){progressMeter.update('Merging kernel with userland...');this.model_.mergeKernelWithUserland();},this);var auditors=[];lastTask=lastTask.timedAfter('TraceImport',function createAuditorsAndRunAnnotate(){progressMeter.update('Adding arbitrary data to model...');auditors=this.importOptions_.auditorConstructors.map(function(auditorConstructor){return new auditorConstructor(this.model_);},this);auditors.forEach(function(auditor){auditor.runAnnotate();auditor.installUserFriendlyCategoryDriverIfNeeded();});},this);lastTask=lastTask.timedAfter('TraceImport',function computeWorldBounds(){progressMeter.update('Computing final world bounds...');this.model_.computeWorldBounds(this.importOptions_.shiftWorldToZero);},this);lastTask=lastTask.timedAfter('TraceImport',function buildFlowEventIntervalTree(){progressMeter.update('Building flow event map...');this.model_.buildFlowEventIntervalTree();},this);lastTask=lastTask.timedAfter('TraceImport',function joinRefs(){progressMeter.update('Joining object refs...');this.model_.joinRefs();},this);lastTask=lastTask.timedAfter('TraceImport',function cleanupUndeletedObjects(){progressMeter.update('Cleaning up undeleted objects...');this.model_.cleanupUndeletedObjects();},this);lastTask=lastTask.timedAfter('TraceImport',function sortMemoryDumps(){progressMeter.update('Sorting memory dumps...');this.model_.sortMemoryDumps();},this);lastTask=lastTask.timedAfter('TraceImport',function finalizeMemoryGraphs(){progressMeter.update('Finalizing memory dump graphs...');this.model_.finalizeMemoryGraphs();},this);lastTask=lastTask.timedAfter('TraceImport',function initializeObjects(){progressMeter.update('Initializing objects (step 2/2)...');this.model_.initializeObjects();},this);lastTask=lastTask.timedAfter('TraceImport',function buildEventIndices(){progressMeter.update('Building event indices...');this.model_.buildEventIndices();},this);lastTask=lastTask.timedAfter('TraceImport',function buildUserModel(){progressMeter.update('Building UserModel...');var userModelBuilder=new tr.importer.UserModelBuilder(this.model_);userModelBuilder.buildUserModel();},this);lastTask=lastTask.timedAfter('TraceImport',function sortExpectations(){progressMeter.update('Sorting user expectations...');this.model_.userModel.sortExpectations();},this);lastTask=lastTask.timedAfter('TraceImport',function runAudits(){progressMeter.update('Running auditors...');auditors.forEach(function(auditor){auditor.runAudit();});},this);lastTask=lastTask.timedAfter('TraceImport',function sortAlerts(){progressMeter.update('Updating alerts...');this.model_.sortAlerts();},this);lastTask=lastTask.timedAfter('TraceImport',function lastUpdateBounds(){progressMeter.update('Update bounds...');this.model_.updateBounds();},this);lastTask=lastTask.timedAfter('TraceImport',function addModelWarnings(){progressMeter.update('Looking for warnings...');if(!this.model_.isTimeHighResolution){this.model_.importWarning({type:'low_resolution_timer',message:'Trace time is low resolution, trace may be unusable.',showToUser:true});}},this);lastTask.after(function(){this.importing_=false;},this);return importTask;},createImporter_:function(eventData){var importerConstructor=tr.importer.Importer.findImporterFor(eventData);if(!importerConstructor){throw new Error('Couldn\'t create an importer for the provided '+'eventData.');} +lastTask=lastTask.timedAfter('TraceImport',function runMergeKernelWithuserland(){progressMeter.update('Merging kernel with userland...');this.model_.mergeKernelWithUserland();},this);var auditors=[];lastTask=lastTask.timedAfter('TraceImport',function createAuditorsAndRunAnnotate(){progressMeter.update('Adding arbitrary data to model...');auditors=this.importOptions_.auditorConstructors.map(function(auditorConstructor){return new auditorConstructor(this.model_);},this);auditors.forEach(function(auditor){auditor.runAnnotate();auditor.installUserFriendlyCategoryDriverIfNeeded();});},this);lastTask=lastTask.timedAfter('TraceImport',function computeWorldBounds(){progressMeter.update('Computing final world bounds...');this.model_.computeWorldBounds(this.importOptions_.shiftWorldToZero);},this);lastTask=lastTask.timedAfter('TraceImport',function buildFlowEventIntervalTree(){progressMeter.update('Building flow event map...');this.model_.buildFlowEventIntervalTree();},this);lastTask=lastTask.timedAfter('TraceImport',function joinRefs(){progressMeter.update('Joining object refs...');this.model_.joinRefs();},this);lastTask=lastTask.timedAfter('TraceImport',function cleanupUndeletedObjects(){progressMeter.update('Cleaning up undeleted objects...');this.model_.cleanupUndeletedObjects();},this);lastTask=lastTask.timedAfter('TraceImport',function sortMemoryDumps(){progressMeter.update('Sorting memory dumps...');this.model_.sortMemoryDumps();},this);lastTask=lastTask.timedAfter('TraceImport',function finalizeMemoryGraphs(){progressMeter.update('Finalizing memory dump graphs...');this.model_.finalizeMemoryGraphs();},this);lastTask=lastTask.timedAfter('TraceImport',function initializeObjects(){progressMeter.update('Initializing objects (step 2/2)...');this.model_.initializeObjects();},this);lastTask=lastTask.timedAfter('TraceImport',function buildEventIndices(){progressMeter.update('Building event indices...');this.model_.buildEventIndices();},this);lastTask=lastTask.timedAfter('TraceImport',function buildUserModel(){progressMeter.update('Building UserModel...');var userModelBuilder=new tr.importer.UserModelBuilder(this.model_);userModelBuilder.buildUserModel();},this);lastTask=lastTask.timedAfter('TraceImport',function sortExpectations(){progressMeter.update('Sorting user expectations...');this.model_.userModel.sortExpectations();},this);lastTask=lastTask.timedAfter('TraceImport',function runAudits(){progressMeter.update('Running auditors...');auditors.forEach(function(auditor){auditor.runAudit();});},this);lastTask=lastTask.timedAfter('TraceImport',function sortAlerts(){progressMeter.update('Updating alerts...');this.model_.sortAlerts();},this);lastTask=lastTask.timedAfter('TraceImport',function lastUpdateBounds(){progressMeter.update('Update bounds...');this.model_.updateBounds();},this);lastTask=lastTask.timedAfter('TraceImport',function addModelWarnings(){progressMeter.update('Looking for warnings...');if(!this.model_.isTimeHighResolution){this.model_.importWarning({type:'low_resolution_timer',message:'Trace time is low resolution, trace may be unusable.',showToUser:false});}},this);lastTask.after(function(){this.importing_=false;},this);return importTask;},createImporter_:function(eventData){var importerConstructor=tr.importer.Importer.findImporterFor(eventData);if(!importerConstructor){throw new Error('Couldn\'t create an importer for the provided '+'eventData.');} return new importerConstructor(this.model_,eventData);},hasEventDataDecoder_:function(importers){for(var i=0;i<importers.length;++i){if(!importers[i].isTraceDataContainer()) return true;} return false;}};return{ImportOptions:ImportOptions,Import:Import};});'use strict';tr.exportTo('tr.e.cc',function(){function PictureAsImageData(picture,errorOrImageData){this.picture_=picture;if(errorOrImageData instanceof ImageData){this.error_=undefined;this.imageData_=errorOrImageData;}else{this.error_=errorOrImageData;this.imageData_=undefined;}};PictureAsImageData.Pending=function(picture){return new PictureAsImageData(picture,undefined);};PictureAsImageData.prototype={get picture(){return this.picture_;},get error(){return this.error_;},get imageData(){return this.imageData_;},isPending:function(){return this.error_===undefined&&this.imageData_===undefined;},asCanvas:function(){if(!this.imageData_) diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go index e9c91477c6..936f9e5511 100644 --- a/src/cmd/api/goapi.go +++ b/src/cmd/api/goapi.go @@ -425,7 +425,7 @@ func (w *Walker) Import(name string) (*types.Package, error) { w.imported[name] = &importing root := w.root - if strings.HasPrefix(name, "golang.org/x/") { + if strings.HasPrefix(name, "golang_org/x/") { root = filepath.Join(root, "vendor") } diff --git a/src/cmd/compile/internal/gc/sparselocatephifunctions.go b/src/cmd/compile/internal/gc/sparselocatephifunctions.go index e15f22123f..43cc50bd92 100644 --- a/src/cmd/compile/internal/gc/sparselocatephifunctions.go +++ b/src/cmd/compile/internal/gc/sparselocatephifunctions.go @@ -153,10 +153,13 @@ func (s *state) locatePotentialPhiFunctions(fn *Node) *sparseDefState { p := e.Block() dm.Use(t, p) // always count phi pred as "use"; no-op except for loop edges, which matter. x := t.stm.Find(p, ssa.AdjustAfter, helper) // Look for defs reaching or within predecessors. + if x == nil { // nil def from a predecessor means a backedge that will be visited soon. + continue + } if defseen == nil { defseen = x } - if defseen != x || x == nil { // TODO: too conservative at loops, does better if x == nil -> continue + if defseen != x { // Need to insert a phi function here because predecessors's definitions differ. change = true // Phi insertion is at AdjustBefore, visible with find in same block at AdjustWithin or AdjustAfter. diff --git a/src/cmd/compile/internal/ssa/compile.go b/src/cmd/compile/internal/ssa/compile.go index b3c7544ad1..d8b0b0a5c1 100644 --- a/src/cmd/compile/internal/ssa/compile.go +++ b/src/cmd/compile/internal/ssa/compile.go @@ -270,6 +270,7 @@ var passes = [...]pass{ {name: "checkLower", fn: checkLower, required: true}, {name: "late phielim", fn: phielim}, {name: "late copyelim", fn: copyelim}, + {name: "phi tighten", fn: phiTighten}, {name: "late deadcode", fn: deadcode}, {name: "critical", fn: critical, required: true}, // remove critical edges {name: "likelyadjust", fn: likelyadjust}, diff --git a/src/cmd/compile/internal/ssa/sparsetreemap.go b/src/cmd/compile/internal/ssa/sparsetreemap.go index 61276985b1..3e6f296796 100644 --- a/src/cmd/compile/internal/ssa/sparsetreemap.go +++ b/src/cmd/compile/internal/ssa/sparsetreemap.go @@ -14,8 +14,8 @@ import "fmt" // the nearest tree ancestor of a given node such that the // ancestor is also in the set. // -// Given a set of blocks {B1, B2, B3} within the dominator tree, established by -// stm.Insert()ing B1, B2, B3, etc, a query at block B +// Given a set of blocks {B1, B2, B3} within the dominator tree, established +// by stm.Insert()ing B1, B2, B3, etc, a query at block B // (performed with stm.Find(stm, B, adjust, helper)) // will return the member of the set that is the nearest strict // ancestor of B within the dominator tree, or nil if none exists. @@ -49,9 +49,9 @@ type SparseTreeMap RBTint32 // packages, such as gc. type SparseTreeHelper struct { Sdom []SparseTreeNode // indexed by block.ID - Po []*Block // exported data - Dom []*Block // exported data - Ponums []int32 // exported data + Po []*Block // exported data; the blocks, in a post-order + Dom []*Block // exported data; the dominator of this block. + Ponums []int32 // exported data; Po[Ponums[b.ID]] == b; the index of b in Po } // NewSparseTreeHelper returns a SparseTreeHelper for use @@ -79,11 +79,19 @@ func makeSparseTreeHelper(sdom SparseTree, dom, po []*Block, ponums []int32) *Sp // A sparseTreeMapEntry contains the data stored in a binary search // data structure indexed by (dominator tree walk) entry and exit numbers. // Each entry is added twice, once keyed by entry-1/entry/entry+1 and -// once keyed by exit+1/exit/exit-1. (there are three choices of paired indices, not 9, and they properly nest) +// once keyed by exit+1/exit/exit-1. +// +// Within a sparse tree, the two entries added bracket all their descendant +// entries within the tree; the first insertion is keyed by entry number, +// which comes before all the entry and exit numbers of descendants, and +// the second insertion is keyed by exit number, which comes after all the +// entry and exit numbers of the descendants. type sparseTreeMapEntry struct { - index *SparseTreeNode - block *Block // TODO: store this in a separate index. - data interface{} + index *SparseTreeNode // references the entry and exit numbers for a block in the sparse tree + block *Block // TODO: store this in a separate index. + data interface{} + sparseParent *sparseTreeMapEntry // references the nearest ancestor of this block in the sparse tree. + adjust int32 // at what adjustment was this node entered into the sparse tree? The same block may be entered more than once, but at different adjustments. } // Insert creates a definition within b with data x. @@ -98,12 +106,25 @@ func (m *SparseTreeMap) Insert(b *Block, adjust int32, x interface{}, helper *Sp // assert unreachable return } - entry := &sparseTreeMapEntry{index: blockIndex, data: x} + // sp will be the sparse parent in this sparse tree (nearest ancestor in the larger tree that is also in this sparse tree) + sp := m.findEntry(b, adjust, helper) + entry := &sparseTreeMapEntry{index: blockIndex, block: b, data: x, sparseParent: sp, adjust: adjust} + right := blockIndex.exit - adjust _ = rbtree.Insert(right, entry) left := blockIndex.entry + adjust _ = rbtree.Insert(left, entry) + + // This newly inserted block may now be the sparse parent of some existing nodes (the new sparse children of this block) + // Iterate over nodes bracketed by this new node to correct their parent, but not over the proper sparse descendants of those nodes. + _, d := rbtree.Lub(left) // Lub (not EQ) of left is either right or a sparse child + for tme := d.(*sparseTreeMapEntry); tme != entry; tme = d.(*sparseTreeMapEntry) { + tme.sparseParent = entry + // all descendants of tme are unchanged; + // next sparse sibling (or right-bracketing sparse parent == entry) is first node after tme.index.exit - tme.adjust + _, d = rbtree.Lub(tme.index.exit - tme.adjust) + } } // Find returns the definition visible from block b, or nil if none can be found. @@ -118,45 +139,41 @@ func (m *SparseTreeMap) Insert(b *Block, adjust int32, x interface{}, helper *Sp // // Another way to think of this is that Find searches for inputs, Insert defines outputs. func (m *SparseTreeMap) Find(b *Block, adjust int32, helper *SparseTreeHelper) interface{} { + v := m.findEntry(b, adjust, helper) + if v == nil { + return nil + } + return v.data +} + +func (m *SparseTreeMap) findEntry(b *Block, adjust int32, helper *SparseTreeHelper) *sparseTreeMapEntry { rbtree := (*RBTint32)(m) if rbtree == nil { return nil } blockIndex := &helper.Sdom[b.ID] + + // The Glb (not EQ) of this probe is either the entry-indexed end of a sparse parent + // or the exit-indexed end of a sparse sibling _, v := rbtree.Glb(blockIndex.entry + adjust) - for v != nil { - otherEntry := v.(*sparseTreeMapEntry) - otherIndex := otherEntry.index - // Two cases -- either otherIndex brackets blockIndex, - // or it doesn't. - // - // Note that if otherIndex and blockIndex are - // the same block, then the glb test only passed - // because the definition is "before", - // i.e., k == blockIndex.entry-1 - // allowing equality is okay on the blocks check. - if otherIndex.exit >= blockIndex.exit { - // bracketed. - return otherEntry.data + + if v == nil { + return nil + } + + otherEntry := v.(*sparseTreeMapEntry) + if otherEntry.index.exit >= blockIndex.exit { // otherEntry exit after blockIndex exit; therefore, brackets + return otherEntry + } + // otherEntry is a sparse Sibling, and shares the same sparse parent (nearest ancestor within larger tree) + sp := otherEntry.sparseParent + if sp != nil { + if sp.index.exit < blockIndex.exit { // no ancestor found + return nil } - // In the not-bracketed case, we could memoize the results of - // walking up the tree, but for now we won't. - // Memoize plan is to take the gap (inclusive) - // from otherIndex.exit+1 to blockIndex.entry-1 - // and insert it into this or a second tree. - // Said tree would then need adjusting whenever - // an insertion occurred. - - // Expectation is that per-variable tree is sparse, - // therefore probe siblings instead of climbing up. - // Note that each sibling encountered in this walk - // to find a defining ancestor shares that ancestor - // because the walk skips over the interior -- each - // Glb will be an exit, and the iteration is to the - // Glb of the entry. - _, v = rbtree.Glb(otherIndex.entry - 1) + return sp } - return nil // nothing found + return nil } func (m *SparseTreeMap) String() string { @@ -165,5 +182,8 @@ func (m *SparseTreeMap) String() string { } func (e *sparseTreeMapEntry) String() string { - return fmt.Sprintf("index=%v, data=%v", e.index, e.data) + if e == nil { + return "nil" + } + return fmt.Sprintf("(index=%v, block=%v, data=%v)->%v", e.index, e.block, e.data, e.sparseParent) } diff --git a/src/cmd/compile/internal/ssa/tighten.go b/src/cmd/compile/internal/ssa/tighten.go index ecb43c101d..2f7c30929d 100644 --- a/src/cmd/compile/internal/ssa/tighten.go +++ b/src/cmd/compile/internal/ssa/tighten.go @@ -86,3 +86,26 @@ func tighten(f *Func) { } } } + +// phiTighten moves constants closer to phi users. +// This pass avoids having lots of constants live for lots of the program. +// See issue 16407. +func phiTighten(f *Func) { + for _, b := range f.Blocks { + for _, v := range b.Values { + if v.Op != OpPhi { + continue + } + for i, a := range v.Args { + if !a.rematerializeable() { + continue // not a constant we can move around + } + if a.Block == b.Preds[i].b { + continue // already in the right place + } + // Make a copy of a, put in predecessor block. + v.SetArg(i, a.copyInto(b.Preds[i].b)) + } + } + } +} diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go index 11a4eab093..3c0b994ef2 100644 --- a/src/cmd/go/build.go +++ b/src/cmd/go/build.go @@ -673,11 +673,6 @@ func init() { goarch = buildContext.GOARCH goos = buildContext.GOOS - if _, ok := osArchSupportsCgo[goos+"/"+goarch]; !ok { - fmt.Fprintf(os.Stderr, "cmd/go: unsupported GOOS/GOARCH pair %s/%s\n", goos, goarch) - os.Exit(2) - } - if goos == "windows" { exeSuffix = ".exe" } @@ -1226,6 +1221,11 @@ func allArchiveActions(root *action) []*action { // do runs the action graph rooted at root. func (b *builder) do(root *action) { + if _, ok := osArchSupportsCgo[goos+"/"+goarch]; !ok && buildContext.Compiler == "gc" { + fmt.Fprintf(os.Stderr, "cmd/go: unsupported GOOS/GOARCH pair %s/%s\n", goos, goarch) + os.Exit(2) + } + // Build list of all actions, assigning depth-first post-order priority. // The original implementation here was a true queue // (using a channel) but it had the effect of getting diff --git a/src/cmd/gofmt/gofmt.go b/src/cmd/gofmt/gofmt.go index b10b804fd2..f29b6cb83d 100644 --- a/src/cmd/gofmt/gofmt.go +++ b/src/cmd/gofmt/gofmt.go @@ -55,7 +55,6 @@ func report(err error) { func usage() { fmt.Fprintf(os.Stderr, "usage: gofmt [flags] [path ...]\n") flag.PrintDefaults() - os.Exit(2) } func initParserMode() { diff --git a/src/fmt/scan.go b/src/fmt/scan.go index 08b0bf96a6..fdf419795d 100644 --- a/src/fmt/scan.go +++ b/src/fmt/scan.go @@ -325,9 +325,9 @@ func (r *readRune) readByte() (b byte, err error) { r.pending-- return } - _, err = r.reader.Read(r.pendBuf[:1]) - if err != nil { - return + n, err := io.ReadFull(r.reader, r.pendBuf[:1]) + if n != 1 { + return 0, err } return r.pendBuf[0], err } diff --git a/src/fmt/scan_test.go b/src/fmt/scan_test.go index 364d4fb42a..e36b62e78a 100644 --- a/src/fmt/scan_test.go +++ b/src/fmt/scan_test.go @@ -15,6 +15,7 @@ import ( "regexp" "strings" "testing" + "testing/iotest" "unicode/utf8" ) @@ -118,20 +119,6 @@ func (s *IntString) Scan(state ScanState, verb rune) error { var intStringVal IntString -// myStringReader implements Read but not ReadRune, allowing us to test our readRune wrapper -// type that creates something that can read runes given only Read(). -type myStringReader struct { - r *strings.Reader -} - -func (s *myStringReader) Read(p []byte) (n int, err error) { - return s.r.Read(p) -} - -func newReader(s string) *myStringReader { - return &myStringReader{strings.NewReader(s)} -} - var scanTests = []ScanTest{ // Basic types {"T\n", &boolVal, true}, // boolean test vals toggle to be sure they are written @@ -363,25 +350,38 @@ var multiTests = []ScanfMultiTest{ {"%v%v", "FALSE23", args(&truth, &i), args(false, 23), ""}, } -func testScan(name string, t *testing.T, scan func(r io.Reader, a ...interface{}) (int, error)) { +var readers = []struct { + name string + f func(string) io.Reader +}{ + {"StringReader", func(s string) io.Reader { + return strings.NewReader(s) + }}, + {"ReaderOnly", func(s string) io.Reader { + return struct{ io.Reader }{strings.NewReader(s)} + }}, + {"OneByteReader", func(s string) io.Reader { + return iotest.OneByteReader(strings.NewReader(s)) + }}, + {"DataErrReader", func(s string) io.Reader { + return iotest.DataErrReader(strings.NewReader(s)) + }}, +} + +func testScan(t *testing.T, f func(string) io.Reader, scan func(r io.Reader, a ...interface{}) (int, error)) { for _, test := range scanTests { - var r io.Reader - if name == "StringReader" { - r = strings.NewReader(test.text) - } else { - r = newReader(test.text) - } + r := f(test.text) n, err := scan(r, test.in) if err != nil { m := "" if n > 0 { m = Sprintf(" (%d fields ok)", n) } - t.Errorf("%s got error scanning %q: %s%s", name, test.text, err, m) + t.Errorf("got error scanning %q: %s%s", test.text, err, m) continue } if n != 1 { - t.Errorf("%s count error on entry %q: got %d", name, test.text, n) + t.Errorf("count error on entry %q: got %d", test.text, n) continue } // The incoming value may be a pointer @@ -391,25 +391,25 @@ func testScan(name string, t *testing.T, scan func(r io.Reader, a ...interface{} } val := v.Interface() if !reflect.DeepEqual(val, test.out) { - t.Errorf("%s scanning %q: expected %#v got %#v, type %T", name, test.text, test.out, val, val) + t.Errorf("scanning %q: expected %#v got %#v, type %T", test.text, test.out, val, val) } } } func TestScan(t *testing.T) { - testScan("StringReader", t, Fscan) -} - -func TestMyReaderScan(t *testing.T) { - testScan("myStringReader", t, Fscan) + for _, r := range readers { + t.Run(r.name, func(t *testing.T) { + testScan(t, r.f, Fscan) + }) + } } func TestScanln(t *testing.T) { - testScan("StringReader", t, Fscanln) -} - -func TestMyReaderScanln(t *testing.T) { - testScan("myStringReader", t, Fscanln) + for _, r := range readers { + t.Run(r.name, func(t *testing.T) { + testScan(t, r.f, Fscanln) + }) + } } func TestScanf(t *testing.T) { @@ -500,15 +500,10 @@ func TestInf(t *testing.T) { } } -func testScanfMulti(name string, t *testing.T) { +func testScanfMulti(t *testing.T, f func(string) io.Reader) { sliceType := reflect.TypeOf(make([]interface{}, 1)) for _, test := range multiTests { - var r io.Reader - if name == "StringReader" { - r = strings.NewReader(test.text) - } else { - r = newReader(test.text) - } + r := f(test.text) n, err := Fscanf(r, test.format, test.in...) if err != nil { if test.err == "" { @@ -539,11 +534,11 @@ func testScanfMulti(name string, t *testing.T) { } func TestScanfMulti(t *testing.T) { - testScanfMulti("StringReader", t) -} - -func TestMyReaderScanfMulti(t *testing.T) { - testScanfMulti("myStringReader", t) + for _, r := range readers { + t.Run(r.name, func(t *testing.T) { + testScanfMulti(t, r.f) + }) + } } func TestScanMultiple(t *testing.T) { @@ -818,20 +813,10 @@ func TestMultiLine(t *testing.T) { } } -// simpleReader is a strings.Reader that implements only Read, not ReadRune. -// Good for testing readahead. -type simpleReader struct { - sr *strings.Reader -} - -func (s *simpleReader) Read(b []byte) (n int, err error) { - return s.sr.Read(b) -} - // TestLineByLineFscanf tests that Fscanf does not read past newline. Issue // 3481. func TestLineByLineFscanf(t *testing.T) { - r := &simpleReader{strings.NewReader("1\n2\n")} + r := struct{ io.Reader }{strings.NewReader("1\n2\n")} var i, j int n, err := Fscanf(r, "%v\n", &i) if n != 1 || err != nil { @@ -1000,7 +985,7 @@ func BenchmarkScanRecursiveIntReaderWrapper(b *testing.B) { ints := makeInts(intCount) var r RecursiveInt for i := b.N - 1; i >= 0; i-- { - buf := newReader(string(ints)) + buf := struct{ io.Reader }{strings.NewReader(string(ints))} b.StartTimer() Fscan(buf, &r) b.StopTimer() diff --git a/src/go/build/build_test.go b/src/go/build/build_test.go index c9f906a7da..198a649b15 100644 --- a/src/go/build/build_test.go +++ b/src/go/build/build_test.go @@ -303,11 +303,11 @@ func TestImportVendor(t *testing.T) { testenv.MustHaveGoBuild(t) // really must just have source ctxt := Default ctxt.GOPATH = "" - p, err := ctxt.Import("golang.org/x/net/http2/hpack", filepath.Join(ctxt.GOROOT, "src/net/http"), 0) + p, err := ctxt.Import("golang_org/x/net/http2/hpack", filepath.Join(ctxt.GOROOT, "src/net/http"), 0) if err != nil { - t.Fatalf("cannot find vendored golang.org/x/net/http2/hpack from net/http directory: %v", err) + t.Fatalf("cannot find vendored golang_org/x/net/http2/hpack from net/http directory: %v", err) } - want := "vendor/golang.org/x/net/http2/hpack" + want := "vendor/golang_org/x/net/http2/hpack" if p.ImportPath != want { t.Fatalf("Import succeeded but found %q, want %q", p.ImportPath, want) } @@ -333,7 +333,7 @@ func TestImportVendorParentFailure(t *testing.T) { ctxt := Default ctxt.GOPATH = "" // This import should fail because the vendor/golang.org/x/net/http2 directory has no source code. - p, err := ctxt.Import("golang.org/x/net/http2", filepath.Join(ctxt.GOROOT, "src/net/http"), 0) + p, err := ctxt.Import("golang_org/x/net/http2", filepath.Join(ctxt.GOROOT, "src/net/http"), 0) if err == nil { t.Fatalf("found empty parent in %s", p.Dir) } diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index 335e774a7c..5b2529129c 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -297,7 +297,7 @@ var pkgDeps = map[string][]string{ "context", "math/rand", "os", "sort", "syscall", "time", "internal/nettrace", "internal/syscall/windows", "internal/singleflight", "internal/race", - "golang.org/x/net/route", + "golang_org/x/net/route", }, // NET enables use of basic network-related packages. @@ -378,8 +378,8 @@ var pkgDeps = map[string][]string{ "context", "compress/gzip", "container/list", "crypto/tls", "mime/multipart", "runtime/debug", "net/http/internal", - "golang.org/x/net/http2/hpack", - "golang.org/x/net/lex/httplex", + "golang_org/x/net/http2/hpack", + "golang_org/x/net/lex/httplex", "internal/nettrace", "net/http/httptrace", }, @@ -443,7 +443,7 @@ func listStdPkgs(goroot string) ([]string, error) { } name := filepath.ToSlash(path[len(src):]) - if name == "builtin" || name == "cmd" || strings.Contains(name, ".") { + if name == "builtin" || name == "cmd" || strings.Contains(name, "golang_org") { return filepath.SkipDir } diff --git a/src/math/rand/race_test.go b/src/math/rand/race_test.go new file mode 100644 index 0000000000..48f6c290b9 --- /dev/null +++ b/src/math/rand/race_test.go @@ -0,0 +1,47 @@ +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package rand + +import ( + "sync" + "testing" +) + +// TestConcurrent exercises the rand API concurrently, triggering situations +// where the race detector is likely to detect issues. +func TestConcurrent(t *testing.T) { + const ( + numRoutines = 10 + numCycles = 10 + ) + var wg sync.WaitGroup + defer wg.Wait() + wg.Add(numRoutines) + for i := 0; i < numRoutines; i++ { + go func(i int) { + defer wg.Done() + buf := make([]byte, 997) + for j := 0; j < numCycles; j++ { + var seed int64 + seed += int64(ExpFloat64()) + seed += int64(Float32()) + seed += int64(Float64()) + seed += int64(Intn(Int())) + seed += int64(Int31n(Int31())) + seed += int64(Int63n(Int63())) + seed += int64(NormFloat64()) + seed += int64(Uint32()) + for _, p := range Perm(10) { + seed += int64(p) + } + Read(buf) + for _, b := range buf { + seed += int64(b) + } + Seed(int64(i*j) * seed) + } + }(i) + } +} diff --git a/src/math/rand/rand.go b/src/math/rand/rand.go index 8f31b0ea9d..dd8d43cca1 100644 --- a/src/math/rand/rand.go +++ b/src/math/rand/rand.go @@ -49,7 +49,13 @@ type Rand struct { func New(src Source) *Rand { return &Rand{src: src} } // Seed uses the provided seed value to initialize the generator to a deterministic state. +// Seed should not be called concurrently with any other Rand method. func (r *Rand) Seed(seed int64) { + if lk, ok := r.src.(*lockedSource); ok { + lk.seedPos(seed, &r.readPos) + return + } + r.src.Seed(seed) r.readPos = 0 } @@ -172,20 +178,28 @@ func (r *Rand) Perm(n int) []int { // Read generates len(p) random bytes and writes them into p. It // always returns len(p) and a nil error. +// Read should not be called concurrently with any other Rand method. func (r *Rand) Read(p []byte) (n int, err error) { - pos := r.readPos - val := r.readVal + if lk, ok := r.src.(*lockedSource); ok { + return lk.read(p, &r.readVal, &r.readPos) + } + return read(p, r.Int63, &r.readVal, &r.readPos) +} + +func read(p []byte, int63 func() int64, readVal *int64, readPos *int8) (n int, err error) { + pos := *readPos + val := *readVal for n = 0; n < len(p); n++ { if pos == 0 { - val = r.Int63() + val = int63() pos = 7 } p[n] = byte(val) val >>= 8 pos-- } - r.readPos = pos - r.readVal = val + *readPos = pos + *readVal = val return } @@ -199,6 +213,7 @@ var globalRand = New(&lockedSource{src: NewSource(1)}) // deterministic state. If Seed is not called, the generator behaves as // if seeded by Seed(1). Seed values that have the same remainder when // divided by 2^31-1 generate the same pseudo-random sequence. +// Seed, unlike the Rand.Seed method, is safe for concurrent use. func Seed(seed int64) { globalRand.Seed(seed) } // Int63 returns a non-negative pseudo-random 63-bit integer as an int64 @@ -245,6 +260,7 @@ func Perm(n int) []int { return globalRand.Perm(n) } // Read generates len(p) random bytes from the default Source and // writes them into p. It always returns len(p) and a nil error. +// Read, unlike the Rand.Read method, is safe for concurrent use. func Read(p []byte) (n int, err error) { return globalRand.Read(p) } // NormFloat64 returns a normally distributed float64 in the range @@ -285,3 +301,19 @@ func (r *lockedSource) Seed(seed int64) { r.src.Seed(seed) r.lk.Unlock() } + +// seedPos implements Seed for a lockedSource without a race condiiton. +func (r *lockedSource) seedPos(seed int64, readPos *int8) { + r.lk.Lock() + r.src.Seed(seed) + *readPos = 0 + r.lk.Unlock() +} + +// read implements Read for a lockedSource without a race condition. +func (r *lockedSource) read(p []byte, readVal *int64, readPos *int8) (n int, err error) { + r.lk.Lock() + n, err = read(p, r.src.Int63, readVal, readPos) + r.lk.Unlock() + return +} diff --git a/src/net/dial_test.go b/src/net/dial_test.go index 9fe507e901..8b21e6b088 100644 --- a/src/net/dial_test.go +++ b/src/net/dial_test.go @@ -695,6 +695,11 @@ func TestDialerLocalAddr(t *testing.T) { } func TestDialerDualStack(t *testing.T) { + // This test is known to be flaky. Don't frighten regular + // users about it; only fail on the build dashboard. + if testenv.Builder() == "" { + testenv.SkipFlaky(t, 13324) + } if !supportsIPv4 || !supportsIPv6 { t.Skip("both IPv4 and IPv6 are required") } diff --git a/src/net/http/h2_bundle.go b/src/net/http/h2_bundle.go index 352a41d414..47e5f577e6 100644 --- a/src/net/http/h2_bundle.go +++ b/src/net/http/h2_bundle.go @@ -41,8 +41,8 @@ import ( "sync" "time" - "golang.org/x/net/http2/hpack" - "golang.org/x/net/lex/httplex" + "golang_org/x/net/http2/hpack" + "golang_org/x/net/lex/httplex" ) // ClientConnPool manages a pool of HTTP/2 client connections. diff --git a/src/net/http/http.go b/src/net/http/http.go index 4d088a5bb1..b34ae41ec5 100644 --- a/src/net/http/http.go +++ b/src/net/http/http.go @@ -7,7 +7,7 @@ package http import ( "strings" - "golang.org/x/net/lex/httplex" + "golang_org/x/net/lex/httplex" ) // maxInt64 is the effective "infinite" value for the Server and diff --git a/src/net/http/server.go b/src/net/http/server.go index 7c3237c4cd..7b2b4b2f42 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -28,7 +28,7 @@ import ( "sync/atomic" "time" - "golang.org/x/net/lex/httplex" + "golang_org/x/net/lex/httplex" ) // Errors used by the HTTP server. @@ -775,9 +775,6 @@ func (c *conn) readRequest(ctx context.Context) (w *response, err error) { return nil, badRequestError("unsupported protocol version") } - ctx, cancelCtx := context.WithCancel(ctx) - req.ctx = ctx - c.lastMethod = req.Method c.r.setInfiniteReadLimit() @@ -804,6 +801,8 @@ func (c *conn) readRequest(ctx context.Context) (w *response, err error) { } delete(req.Header, "Host") + ctx, cancelCtx := context.WithCancel(ctx) + req.ctx = ctx req.RemoteAddr = c.remoteAddr req.TLS = c.tlsState if body, ok := req.Body.(*body); ok { diff --git a/src/net/http/transfer.go b/src/net/http/transfer.go index b27ace638a..c653467098 100644 --- a/src/net/http/transfer.go +++ b/src/net/http/transfer.go @@ -18,7 +18,7 @@ import ( "strings" "sync" - "golang.org/x/net/lex/httplex" + "golang_org/x/net/lex/httplex" ) // ErrLineTooLong is returned when reading request or response bodies diff --git a/src/net/http/transport.go b/src/net/http/transport.go index eb54703c8f..9164d0d827 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -27,7 +27,7 @@ import ( "sync" "time" - "golang.org/x/net/lex/httplex" + "golang_org/x/net/lex/httplex" ) // DefaultTransport is the default implementation of Transport and is diff --git a/src/net/interface_bsd.go b/src/net/interface_bsd.go index d791cb3016..35b1c26815 100644 --- a/src/net/interface_bsd.go +++ b/src/net/interface_bsd.go @@ -9,7 +9,7 @@ package net import ( "syscall" - "golang.org/x/net/route" + "golang_org/x/net/route" ) // If the ifindex is zero, interfaceTable returns mappings of all diff --git a/src/net/interface_bsdvar.go b/src/net/interface_bsdvar.go index a809b5f5ce..0b84ca37d4 100644 --- a/src/net/interface_bsdvar.go +++ b/src/net/interface_bsdvar.go @@ -9,7 +9,7 @@ package net import ( "syscall" - "golang.org/x/net/route" + "golang_org/x/net/route" ) func interfaceMessages(ifindex int) ([]route.Message, error) { diff --git a/src/net/interface_darwin.go b/src/net/interface_darwin.go index bb4fd73a98..2ec8e1cc6e 100644 --- a/src/net/interface_darwin.go +++ b/src/net/interface_darwin.go @@ -7,7 +7,7 @@ package net import ( "syscall" - "golang.org/x/net/route" + "golang_org/x/net/route" ) func interfaceMessages(ifindex int) ([]route.Message, error) { diff --git a/src/net/interface_freebsd.go b/src/net/interface_freebsd.go index 45badd6495..8a7d6f67c0 100644 --- a/src/net/interface_freebsd.go +++ b/src/net/interface_freebsd.go @@ -7,7 +7,7 @@ package net import ( "syscall" - "golang.org/x/net/route" + "golang_org/x/net/route" ) func interfaceMessages(ifindex int) ([]route.Message, error) { diff --git a/src/net/smtp/smtp.go b/src/net/smtp/smtp.go index b4e4867a9e..9e04dd7c82 100644 --- a/src/net/smtp/smtp.go +++ b/src/net/smtp/smtp.go @@ -8,6 +8,11 @@ // AUTH RFC 2554 // STARTTLS RFC 3207 // Additional extensions may be handled by clients. +// +// The smtp package is frozen and not accepting new features. +// Some external packages provide more functionality. See: +// +// https://godoc.org/?q=smtp package smtp import ( diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index adde5829dc..bbb098f3eb 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -2261,6 +2261,8 @@ func TestImportPath(t *testing.T) { {TypeOf((*int64)(nil)), ""}, {TypeOf(map[string]int{}), ""}, {TypeOf((*error)(nil)).Elem(), ""}, + {TypeOf((*Point)(nil)), ""}, + {TypeOf((*Point)(nil)).Elem(), "reflect_test"}, } for _, test := range tests { if path := test.t.PkgPath(); path != test.path { diff --git a/src/reflect/type.go b/src/reflect/type.go index bedfba45b1..de6e05fb6d 100644 --- a/src/reflect/type.go +++ b/src/reflect/type.go @@ -876,6 +876,9 @@ func (t *rtype) MethodByName(name string) (m Method, ok bool) { } func (t *rtype) PkgPath() string { + if t.tflag&tflagNamed == 0 { + return "" + } ut := t.uncommon() if ut == nil { return "" diff --git a/src/runtime/cgocall.go b/src/runtime/cgocall.go index 0f8386b10f..f8d693060d 100644 --- a/src/runtime/cgocall.go +++ b/src/runtime/cgocall.go @@ -44,7 +44,7 @@ // call arbitrary Go code directly and must be careful not to allocate // memory or use up m->g0's stack. // -// _cgoexp_GoF calls runtime.cgocallback(p.GoF, frame, framesize). +// _cgoexp_GoF calls runtime.cgocallback(p.GoF, frame, framesize, ctxt). // (The reason for having _cgoexp_GoF instead of writing a crosscall3 // to make this call directly is that _cgoexp_GoF, because it is compiled // with 6c instead of gcc, can refer to dotted names like @@ -80,6 +80,7 @@ package runtime import ( + "runtime/internal/atomic" "runtime/internal/sys" "unsafe" ) @@ -176,7 +177,7 @@ func cgocallbackg(ctxt uintptr) { func cgocallbackg1(ctxt uintptr) { gp := getg() - if gp.m.needextram { + if gp.m.needextram || atomic.Load(&extraMWaiters) > 0 { gp.m.needextram = false systemstack(newextram) } diff --git a/src/runtime/internal/atomic/asm_386.s b/src/runtime/internal/atomic/asm_386.s index ebecd0b4cb..357d830289 100644 --- a/src/runtime/internal/atomic/asm_386.s +++ b/src/runtime/internal/atomic/asm_386.s @@ -32,13 +32,13 @@ TEXT runtime∕internal∕atomic·Loaduint(SB), NOSPLIT, $0-8 TEXT runtime∕internal∕atomic·Storeuintptr(SB), NOSPLIT, $0-8 JMP runtime∕internal∕atomic·Store(SB) -TEXT runtime∕internal∕atomic·Xadduintptr(SB), NOSPLIT, $0-8 +TEXT runtime∕internal∕atomic·Xadduintptr(SB), NOSPLIT, $0-12 JMP runtime∕internal∕atomic·Xadd(SB) -TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-16 +TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-12 JMP runtime∕internal∕atomic·Load64(SB) -TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-16 +TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-20 JMP runtime∕internal∕atomic·Xadd64(SB) diff --git a/src/runtime/internal/atomic/asm_amd64.s b/src/runtime/internal/atomic/asm_amd64.s index 94d4ac2698..0001d2301c 100644 --- a/src/runtime/internal/atomic/asm_amd64.s +++ b/src/runtime/internal/atomic/asm_amd64.s @@ -52,7 +52,7 @@ TEXT runtime∕internal∕atomic·Storeuintptr(SB), NOSPLIT, $0-16 TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-16 JMP runtime∕internal∕atomic·Load64(SB) -TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-16 +TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-24 JMP runtime∕internal∕atomic·Xadd64(SB) // bool Casp(void **val, void *old, void *new) diff --git a/src/runtime/internal/atomic/asm_amd64p32.s b/src/runtime/internal/atomic/asm_amd64p32.s index 74c79d08fd..22c707c325 100644 --- a/src/runtime/internal/atomic/asm_amd64p32.s +++ b/src/runtime/internal/atomic/asm_amd64p32.s @@ -29,10 +29,10 @@ TEXT runtime∕internal∕atomic·Loaduintptr(SB), NOSPLIT, $0-12 TEXT runtime∕internal∕atomic·Loaduint(SB), NOSPLIT, $0-12 JMP runtime∕internal∕atomic·Load(SB) -TEXT runtime∕internal∕atomic·Storeuintptr(SB), NOSPLIT, $0-12 +TEXT runtime∕internal∕atomic·Storeuintptr(SB), NOSPLIT, $0-8 JMP runtime∕internal∕atomic·Store(SB) -TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-24 +TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-16 JMP runtime∕internal∕atomic·Load64(SB) TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-24 diff --git a/src/runtime/internal/atomic/asm_arm.s b/src/runtime/internal/atomic/asm_arm.s index 235e8bfd20..12da22390d 100644 --- a/src/runtime/internal/atomic/asm_arm.s +++ b/src/runtime/internal/atomic/asm_arm.s @@ -61,11 +61,11 @@ TEXT runtime∕internal∕atomic·Loaduint(SB),NOSPLIT,$0-8 TEXT runtime∕internal∕atomic·Storeuintptr(SB),NOSPLIT,$0-8 B runtime∕internal∕atomic·Store(SB) -TEXT runtime∕internal∕atomic·Xadduintptr(SB),NOSPLIT,$0-8 +TEXT runtime∕internal∕atomic·Xadduintptr(SB),NOSPLIT,$0-12 B runtime∕internal∕atomic·Xadd(SB) -TEXT runtime∕internal∕atomic·Loadint64(SB),NOSPLIT,$0-16 +TEXT runtime∕internal∕atomic·Loadint64(SB),NOSPLIT,$0-12 B runtime∕internal∕atomic·Load64(SB) -TEXT runtime∕internal∕atomic·Xaddint64(SB),NOSPLIT,$0-16 +TEXT runtime∕internal∕atomic·Xaddint64(SB),NOSPLIT,$0-20 B runtime∕internal∕atomic·Xadd64(SB) diff --git a/src/runtime/internal/atomic/asm_arm64.s b/src/runtime/internal/atomic/asm_arm64.s index c255677f78..929bf7189c 100644 --- a/src/runtime/internal/atomic/asm_arm64.s +++ b/src/runtime/internal/atomic/asm_arm64.s @@ -38,13 +38,13 @@ TEXT runtime∕internal∕atomic·Loaduint(SB), NOSPLIT, $-8-16 TEXT runtime∕internal∕atomic·Storeuintptr(SB), NOSPLIT, $0-16 B runtime∕internal∕atomic·Store64(SB) -TEXT runtime∕internal∕atomic·Xadduintptr(SB), NOSPLIT, $0-16 +TEXT runtime∕internal∕atomic·Xadduintptr(SB), NOSPLIT, $0-24 B runtime∕internal∕atomic·Xadd64(SB) TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-16 B runtime∕internal∕atomic·Load64(SB) -TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-16 +TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-24 B runtime∕internal∕atomic·Xadd64(SB) // bool Casp(void **val, void *old, void *new) diff --git a/src/runtime/internal/atomic/asm_ppc64x.s b/src/runtime/internal/atomic/asm_ppc64x.s index de4f895efd..aa6067e15b 100644 --- a/src/runtime/internal/atomic/asm_ppc64x.s +++ b/src/runtime/internal/atomic/asm_ppc64x.s @@ -77,7 +77,7 @@ TEXT runtime∕internal∕atomic·Xadduintptr(SB), NOSPLIT, $0-24 TEXT runtime∕internal∕atomic·Loadint64(SB), NOSPLIT, $0-16 BR runtime∕internal∕atomic·Load64(SB) -TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-16 +TEXT runtime∕internal∕atomic·Xaddint64(SB), NOSPLIT, $0-24 BR runtime∕internal∕atomic·Xadd64(SB) // bool casp(void **val, void *old, void *new) diff --git a/src/runtime/mbarrier.go b/src/runtime/mbarrier.go index bf75934ed6..4a8f501dfe 100644 --- a/src/runtime/mbarrier.go +++ b/src/runtime/mbarrier.go @@ -145,7 +145,7 @@ func writebarrierptr(dst *uintptr, src uintptr) { if !writeBarrier.needed { return } - if src != 0 && src < sys.PhysPageSize { + if src != 0 && src < minPhysPageSize { systemstack(func() { print("runtime: writebarrierptr *", dst, " = ", hex(src), "\n") throw("bad pointer in write barrier") @@ -164,7 +164,7 @@ func writebarrierptr_nostore(dst *uintptr, src uintptr) { if !writeBarrier.needed { return } - if src != 0 && src < sys.PhysPageSize { + if src != 0 && src < minPhysPageSize { systemstack(func() { throw("bad pointer in write barrier") }) } writebarrierptr_nostore1(dst, src) diff --git a/src/runtime/mem_linux.go b/src/runtime/mem_linux.go index 61fdcee543..cd0bf26328 100644 --- a/src/runtime/mem_linux.go +++ b/src/runtime/mem_linux.go @@ -10,8 +10,8 @@ import ( ) const ( - _PAGE_SIZE = sys.PhysPageSize - _EACCES = 13 + _EACCES = 13 + _EINVAL = 22 ) // NOTE: vec must be just 1 byte long here. @@ -22,13 +22,19 @@ const ( var addrspace_vec [1]byte func addrspace_free(v unsafe.Pointer, n uintptr) bool { - var chunk uintptr - for off := uintptr(0); off < n; off += chunk { - chunk = _PAGE_SIZE * uintptr(len(addrspace_vec)) - if chunk > (n - off) { - chunk = n - off + // Step by the minimum possible physical page size. This is + // safe even if we have the wrong physical page size; mincore + // will just return EINVAL for unaligned addresses. + for off := uintptr(0); off < n; off += minPhysPageSize { + // Use a length of 1 byte, which the kernel will round + // up to one physical page regardless of the true + // physical page size. + errval := mincore(unsafe.Pointer(uintptr(v)+off), 1, &addrspace_vec[0]) + if errval == -_EINVAL { + // Address is not a multiple of the physical + // page size. That's fine. + continue } - errval := mincore(unsafe.Pointer(uintptr(v)+off), chunk, &addrspace_vec[0]) // ENOMEM means unmapped, which is what we want. // Anything else we assume means the pages are mapped. if errval != -_ENOMEM { diff --git a/src/runtime/mfinal.go b/src/runtime/mfinal.go index 1a744e4a51..14ebec81bf 100644 --- a/src/runtime/mfinal.go +++ b/src/runtime/mfinal.go @@ -450,7 +450,7 @@ func findObject(v unsafe.Pointer) (s *mspan, x unsafe.Pointer, n uintptr) { // type File struct { d int } // d, err := syscall.Open("/file/path", syscall.O_RDONLY, 0) // // ... do something if err != nil ... -// p := &FILE{d} +// p := &File{d} // runtime.SetFinalizer(p, func(p *File) { syscall.Close(p.d) }) // var buf [10]byte // n, err := syscall.Read(p.d, buf[:]) diff --git a/src/runtime/mheap.go b/src/runtime/mheap.go index 4093288a7c..db60f7a872 100644 --- a/src/runtime/mheap.go +++ b/src/runtime/mheap.go @@ -14,6 +14,11 @@ import ( "unsafe" ) +// minPhysPageSize is a lower-bound on the physical page size. The +// true physical page size may be larger than this. In contrast, +// sys.PhysPageSize is an upper-bound on the physical page size. +const minPhysPageSize = 4096 + // Main malloc heap. // The heap itself is the "free[]" and "large" arrays, // but all the other global data is here too. diff --git a/src/runtime/os_nacl.go b/src/runtime/os_nacl.go index 6cbd16de15..1dacc1a49c 100644 --- a/src/runtime/os_nacl.go +++ b/src/runtime/os_nacl.go @@ -246,7 +246,7 @@ func memlimit() uintptr { //go:norace //go:nowritebarrierrec func badsignal(sig uintptr) { - cgocallback(unsafe.Pointer(funcPC(badsignalgo)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)) + cgocallback(unsafe.Pointer(funcPC(badsignalgo)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0) } func badsignalgo(sig uintptr) { diff --git a/src/runtime/pprof/pprof.go b/src/runtime/pprof/pprof.go index f2cd81adb1..b7c41f13de 100644 --- a/src/runtime/pprof/pprof.go +++ b/src/runtime/pprof/pprof.go @@ -353,12 +353,9 @@ func printStackRecord(w io.Writer, stk []uintptr, allFrames bool) { if name == "" { show = true fmt.Fprintf(w, "#\t%#x\n", frame.PC) - } else { + } else if name != "runtime.goexit" && (show || !strings.HasPrefix(name, "runtime.")) { // Hide runtime.goexit and any runtime functions at the beginning. // This is useful mainly for allocation traces. - if name == "runtime.goexit" || !show && strings.HasPrefix(name, "runtime.") { - continue - } show = true fmt.Fprintf(w, "#\t%#x\t%s+%#x\t%s:%d\n", frame.PC, name, frame.PC-frame.Entry, frame.File, frame.Line) } diff --git a/src/runtime/pprof/pprof_test.go b/src/runtime/pprof/pprof_test.go index a6f5eda458..a0930155a5 100644 --- a/src/runtime/pprof/pprof_test.go +++ b/src/runtime/pprof/pprof_test.go @@ -497,6 +497,10 @@ func TestBlockProfile(t *testing.T) { t.Fatalf("Bad profile header:\n%v", prof) } + if strings.HasSuffix(prof, "#\t0x0\n\n") { + t.Errorf("Useless 0 suffix:\n%v", prof) + } + for _, test := range tests { if !regexp.MustCompile(strings.Replace(test.re, "\t", "\t+", -1)).MatchString(prof) { t.Fatalf("Bad %v entry, expect:\n%v\ngot:\n%v", test.name, test.re, prof) diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 2c0b3df167..1d00930ac5 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go @@ -1389,10 +1389,27 @@ func needm(x byte) { var earlycgocallback = []byte("fatal error: cgo callback before cgo call\n") -// newextram allocates an m and puts it on the extra list. +// newextram allocates m's and puts them on the extra list. // It is called with a working local m, so that it can do things // like call schedlock and allocate. func newextram() { + c := atomic.Xchg(&extraMWaiters, 0) + if c > 0 { + for i := uint32(0); i < c; i++ { + oneNewExtraM() + } + } else { + // Make sure there is at least one extra M. + mp := lockextra(true) + unlockextra(mp) + if mp == nil { + oneNewExtraM() + } + } +} + +// oneNewExtraM allocates an m and puts it on the extra list. +func oneNewExtraM() { // Create extra goroutine locked to extra m. // The goroutine is the context in which the cgo callback will run. // The sched.pc will never be returned to, but setting it to @@ -1485,6 +1502,7 @@ func getm() uintptr { } var extram uintptr +var extraMWaiters uint32 // lockextra locks the extra list and returns the list head. // The caller must unlock the list by storing a new list head @@ -1495,6 +1513,7 @@ var extram uintptr func lockextra(nilokay bool) *m { const locked = 1 + incr := false for { old := atomic.Loaduintptr(&extram) if old == locked { @@ -1503,6 +1522,13 @@ func lockextra(nilokay bool) *m { continue } if old == 0 && !nilokay { + if !incr { + // Add 1 to the number of threads + // waiting for an M. + // This is cleared by newextram. + atomic.Xadd(&extraMWaiters, 1) + incr = true + } usleep(1) continue } diff --git a/src/runtime/race/README b/src/runtime/race/README index 3a506b0c08..95e241c072 100644 --- a/src/runtime/race/README +++ b/src/runtime/race/README @@ -4,4 +4,4 @@ the LLVM project (http://llvm.org/git/compiler-rt.git). To update the .syso files use golang.org/x/build/cmd/racebuild. -Current runtime is built on rev 9d79ea3416bfbe3acac50e47802ee9621bf53254. +Current runtime is built on rev e35e7c00b5c7e7ee5e24d537b80cb0d34cebb038. diff --git a/src/runtime/race/race_darwin_amd64.syso b/src/runtime/race/race_darwin_amd64.syso Binary files differindex 1822486e08..c19740fb8f 100644 --- a/src/runtime/race/race_darwin_amd64.syso +++ b/src/runtime/race/race_darwin_amd64.syso diff --git a/src/runtime/race/race_freebsd_amd64.syso b/src/runtime/race/race_freebsd_amd64.syso Binary files differindex 75d94952c3..df1bc26861 100644 --- a/src/runtime/race/race_freebsd_amd64.syso +++ b/src/runtime/race/race_freebsd_amd64.syso diff --git a/src/runtime/race/race_linux_amd64.syso b/src/runtime/race/race_linux_amd64.syso Binary files differindex 8f571afa9a..174033041e 100644 --- a/src/runtime/race/race_linux_amd64.syso +++ b/src/runtime/race/race_linux_amd64.syso diff --git a/src/runtime/race/race_test.go b/src/runtime/race/race_test.go index 81e51cc5b2..53ec74c085 100644 --- a/src/runtime/race/race_test.go +++ b/src/runtime/race/race_test.go @@ -221,3 +221,21 @@ func BenchmarkSyncLeak(b *testing.B) { } wg.Wait() } + +func BenchmarkStackLeak(b *testing.B) { + done := make(chan bool, 1) + for i := 0; i < b.N; i++ { + go func() { + growStack(rand.Intn(100)) + done <- true + }() + <-done + } +} + +func growStack(i int) { + if i == 0 { + return + } + growStack(i - 1) +} diff --git a/src/runtime/race/race_windows_amd64.syso b/src/runtime/race/race_windows_amd64.syso Binary files differindex 64c54b6e2f..fd93959af5 100644 --- a/src/runtime/race/race_windows_amd64.syso +++ b/src/runtime/race/race_windows_amd64.syso diff --git a/src/runtime/signal1_unix.go b/src/runtime/signal1_unix.go index 5080202833..101d16dc8e 100644 --- a/src/runtime/signal1_unix.go +++ b/src/runtime/signal1_unix.go @@ -338,7 +338,7 @@ func sigNotOnStack(sig uint32) { //go:norace //go:nowritebarrierrec func badsignal(sig uintptr, c *sigctxt) { - cgocallback(unsafe.Pointer(funcPC(badsignalgo)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)+unsafe.Sizeof(c)) + cgocallback(unsafe.Pointer(funcPC(badsignalgo)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)+unsafe.Sizeof(c), 0) } func badsignalgo(sig uintptr, c *sigctxt) { diff --git a/src/runtime/signal_darwin.go b/src/runtime/signal_darwin.go index c8534ff09b..fb06de5509 100644 --- a/src/runtime/signal_darwin.go +++ b/src/runtime/signal_darwin.go @@ -70,12 +70,12 @@ func sigtrampgo(fn uintptr, infostyle, sig uint32, info *siginfo, ctx unsafe.Poi sigaltstack(nil, &st) if st.ss_flags&_SS_DISABLE != 0 { setg(nil) - cgocallback(unsafe.Pointer(funcPC(noSignalStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)) + cgocallback(unsafe.Pointer(funcPC(noSignalStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0) } stsp := uintptr(unsafe.Pointer(st.ss_sp)) if sp < stsp || sp >= stsp+st.ss_size { setg(nil) - cgocallback(unsafe.Pointer(funcPC(sigNotOnStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)) + cgocallback(unsafe.Pointer(funcPC(sigNotOnStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0) } g.m.gsignal.stack.lo = stsp g.m.gsignal.stack.hi = stsp + st.ss_size diff --git a/src/runtime/signal_freebsd.go b/src/runtime/signal_freebsd.go index c4cb68720e..c6c126983d 100644 --- a/src/runtime/signal_freebsd.go +++ b/src/runtime/signal_freebsd.go @@ -66,12 +66,12 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) { sigaltstack(nil, &st) if st.ss_flags&_SS_DISABLE != 0 { setg(nil) - cgocallback(unsafe.Pointer(funcPC(noSignalStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)) + cgocallback(unsafe.Pointer(funcPC(noSignalStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0) } stsp := uintptr(unsafe.Pointer(st.ss_sp)) if sp < stsp || sp >= stsp+st.ss_size { setg(nil) - cgocallback(unsafe.Pointer(funcPC(sigNotOnStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)) + cgocallback(unsafe.Pointer(funcPC(sigNotOnStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0) } g.m.gsignal.stack.lo = stsp g.m.gsignal.stack.hi = stsp + st.ss_size diff --git a/src/runtime/signal_openbsd.go b/src/runtime/signal_openbsd.go index 9275279860..efe30da5d9 100644 --- a/src/runtime/signal_openbsd.go +++ b/src/runtime/signal_openbsd.go @@ -66,12 +66,12 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) { sigaltstack(nil, &st) if st.ss_flags&_SS_DISABLE != 0 { setg(nil) - cgocallback(unsafe.Pointer(funcPC(noSignalStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)) + cgocallback(unsafe.Pointer(funcPC(noSignalStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0) } stsp := uintptr(unsafe.Pointer(st.ss_sp)) if sp < stsp || sp >= stsp+st.ss_size { setg(nil) - cgocallback(unsafe.Pointer(funcPC(sigNotOnStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)) + cgocallback(unsafe.Pointer(funcPC(sigNotOnStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0) } g.m.gsignal.stack.lo = stsp g.m.gsignal.stack.hi = stsp + st.ss_size diff --git a/src/runtime/signal_sigtramp.go b/src/runtime/signal_sigtramp.go index 3e0b104578..dbbbcd0392 100644 --- a/src/runtime/signal_sigtramp.go +++ b/src/runtime/signal_sigtramp.go @@ -37,12 +37,12 @@ func sigtrampgo(sig uint32, info *siginfo, ctx unsafe.Pointer) { sigaltstack(nil, &st) if st.ss_flags&_SS_DISABLE != 0 { setg(nil) - cgocallback(unsafe.Pointer(funcPC(noSignalStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)) + cgocallback(unsafe.Pointer(funcPC(noSignalStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0) } stsp := uintptr(unsafe.Pointer(st.ss_sp)) if sp < stsp || sp >= stsp+st.ss_size { setg(nil) - cgocallback(unsafe.Pointer(funcPC(sigNotOnStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig)) + cgocallback(unsafe.Pointer(funcPC(sigNotOnStack)), noescape(unsafe.Pointer(&sig)), unsafe.Sizeof(sig), 0) } g.m.gsignal.stack.lo = stsp g.m.gsignal.stack.hi = stsp + st.ss_size diff --git a/src/runtime/stubs.go b/src/runtime/stubs.go index 6c28fd2e78..a594c1b791 100644 --- a/src/runtime/stubs.go +++ b/src/runtime/stubs.go @@ -98,7 +98,7 @@ func noescape(p unsafe.Pointer) unsafe.Pointer { return unsafe.Pointer(x ^ 0) } -func cgocallback(fn, frame unsafe.Pointer, framesize uintptr) +func cgocallback(fn, frame unsafe.Pointer, framesize, ctxt uintptr) func gogo(buf *gobuf) func gosave(buf *gobuf) func mincore(addr unsafe.Pointer, n uintptr, dst *byte) int32 @@ -143,7 +143,7 @@ func goexit(neverCallThisFunction) // cgocallback_gofunc is not called from go, only from cgocallback, // so the arguments will be found via cgocallback's pointer-declared arguments. // See the assembly implementations for more details. -func cgocallback_gofunc(fv uintptr, frame uintptr, framesize uintptr) +func cgocallback_gofunc(fv uintptr, frame uintptr, framesize, ctxt uintptr) // publicationBarrier performs a store/store barrier (a "publication" // or "export" barrier). Some form of synchronization is required diff --git a/src/runtime/sys_darwin_amd64.s b/src/runtime/sys_darwin_amd64.s index e09b906ba5..e4837ce291 100644 --- a/src/runtime/sys_darwin_amd64.s +++ b/src/runtime/sys_darwin_amd64.s @@ -244,6 +244,7 @@ TEXT runtime·sigtramp(SB),NOSPLIT,$32 MOVQ R8, 24(SP) // ctx MOVQ $runtime·sigtrampgo(SB), AX CALL AX + INT $3 // not reached (see issue 16453) TEXT runtime·mmap(SB),NOSPLIT,$0 MOVQ addr+0(FP), DI // arg 1 addr diff --git a/src/syscall/exec_linux_test.go b/src/syscall/exec_linux_test.go index cb24c590f9..aaffa067bc 100644 --- a/src/syscall/exec_linux_test.go +++ b/src/syscall/exec_linux_test.go @@ -238,6 +238,7 @@ func TestGroupCleanupUserNamespace(t *testing.T) { "uid=0(root) gid=0(root) groups=0(root)", "uid=0(root) gid=0(root) groups=0(root),65534(nobody)", "uid=0(root) gid=0(root) groups=0(root),65534(nogroup)", + "uid=0(root) gid=0(root) groups=0(root),65534", } for _, e := range expected { if strOut == e { diff --git a/src/vendor/golang.org/x/net/http2/hpack/encode.go b/src/vendor/golang_org/x/net/http2/hpack/encode.go index f9bb033984..f9bb033984 100644 --- a/src/vendor/golang.org/x/net/http2/hpack/encode.go +++ b/src/vendor/golang_org/x/net/http2/hpack/encode.go diff --git a/src/vendor/golang.org/x/net/http2/hpack/encode_test.go b/src/vendor/golang_org/x/net/http2/hpack/encode_test.go index 92286f3bad..92286f3bad 100644 --- a/src/vendor/golang.org/x/net/http2/hpack/encode_test.go +++ b/src/vendor/golang_org/x/net/http2/hpack/encode_test.go diff --git a/src/vendor/golang.org/x/net/http2/hpack/hpack.go b/src/vendor/golang_org/x/net/http2/hpack/hpack.go index 8aa197ad67..8aa197ad67 100644 --- a/src/vendor/golang.org/x/net/http2/hpack/hpack.go +++ b/src/vendor/golang_org/x/net/http2/hpack/hpack.go diff --git a/src/vendor/golang.org/x/net/http2/hpack/hpack_test.go b/src/vendor/golang_org/x/net/http2/hpack/hpack_test.go index 4c7b17bfb1..4c7b17bfb1 100644 --- a/src/vendor/golang.org/x/net/http2/hpack/hpack_test.go +++ b/src/vendor/golang_org/x/net/http2/hpack/hpack_test.go diff --git a/src/vendor/golang.org/x/net/http2/hpack/huffman.go b/src/vendor/golang_org/x/net/http2/hpack/huffman.go index 8850e39467..8850e39467 100644 --- a/src/vendor/golang.org/x/net/http2/hpack/huffman.go +++ b/src/vendor/golang_org/x/net/http2/hpack/huffman.go diff --git a/src/vendor/golang.org/x/net/http2/hpack/tables.go b/src/vendor/golang_org/x/net/http2/hpack/tables.go index b9283a0233..b9283a0233 100644 --- a/src/vendor/golang.org/x/net/http2/hpack/tables.go +++ b/src/vendor/golang_org/x/net/http2/hpack/tables.go diff --git a/src/vendor/golang.org/x/net/lex/httplex/httplex.go b/src/vendor/golang_org/x/net/lex/httplex/httplex.go index bd0ec24f44..bd0ec24f44 100644 --- a/src/vendor/golang.org/x/net/lex/httplex/httplex.go +++ b/src/vendor/golang_org/x/net/lex/httplex/httplex.go diff --git a/src/vendor/golang.org/x/net/lex/httplex/httplex_test.go b/src/vendor/golang_org/x/net/lex/httplex/httplex_test.go index c4ace1991b..c4ace1991b 100644 --- a/src/vendor/golang.org/x/net/lex/httplex/httplex_test.go +++ b/src/vendor/golang_org/x/net/lex/httplex/httplex_test.go diff --git a/src/vendor/golang.org/x/net/route/address.go b/src/vendor/golang_org/x/net/route/address.go index 206a8371d4..206a8371d4 100644 --- a/src/vendor/golang.org/x/net/route/address.go +++ b/src/vendor/golang_org/x/net/route/address.go diff --git a/src/vendor/golang.org/x/net/route/address_darwin_test.go b/src/vendor/golang_org/x/net/route/address_darwin_test.go index b86bd3df1f..b86bd3df1f 100644 --- a/src/vendor/golang.org/x/net/route/address_darwin_test.go +++ b/src/vendor/golang_org/x/net/route/address_darwin_test.go diff --git a/src/vendor/golang.org/x/net/route/address_test.go b/src/vendor/golang_org/x/net/route/address_test.go index 2005ef7c20..2005ef7c20 100644 --- a/src/vendor/golang.org/x/net/route/address_test.go +++ b/src/vendor/golang_org/x/net/route/address_test.go diff --git a/src/vendor/golang.org/x/net/route/binary.go b/src/vendor/golang_org/x/net/route/binary.go index 4c561631b9..4c561631b9 100644 --- a/src/vendor/golang.org/x/net/route/binary.go +++ b/src/vendor/golang_org/x/net/route/binary.go diff --git a/src/vendor/golang.org/x/net/route/defs_darwin.go b/src/vendor/golang_org/x/net/route/defs_darwin.go index f452ad14ce..f452ad14ce 100644 --- a/src/vendor/golang.org/x/net/route/defs_darwin.go +++ b/src/vendor/golang_org/x/net/route/defs_darwin.go diff --git a/src/vendor/golang.org/x/net/route/defs_dragonfly.go b/src/vendor/golang_org/x/net/route/defs_dragonfly.go index c737751d76..c737751d76 100644 --- a/src/vendor/golang.org/x/net/route/defs_dragonfly.go +++ b/src/vendor/golang_org/x/net/route/defs_dragonfly.go diff --git a/src/vendor/golang.org/x/net/route/defs_freebsd.go b/src/vendor/golang_org/x/net/route/defs_freebsd.go index 8f834e81db..8f834e81db 100644 --- a/src/vendor/golang.org/x/net/route/defs_freebsd.go +++ b/src/vendor/golang_org/x/net/route/defs_freebsd.go diff --git a/src/vendor/golang.org/x/net/route/defs_netbsd.go b/src/vendor/golang_org/x/net/route/defs_netbsd.go index b18d85e016..b18d85e016 100644 --- a/src/vendor/golang.org/x/net/route/defs_netbsd.go +++ b/src/vendor/golang_org/x/net/route/defs_netbsd.go diff --git a/src/vendor/golang.org/x/net/route/defs_openbsd.go b/src/vendor/golang_org/x/net/route/defs_openbsd.go index 5df7a43bc3..5df7a43bc3 100644 --- a/src/vendor/golang.org/x/net/route/defs_openbsd.go +++ b/src/vendor/golang_org/x/net/route/defs_openbsd.go diff --git a/src/vendor/golang.org/x/net/route/interface.go b/src/vendor/golang_org/x/net/route/interface.go index 854906d9c4..854906d9c4 100644 --- a/src/vendor/golang.org/x/net/route/interface.go +++ b/src/vendor/golang_org/x/net/route/interface.go diff --git a/src/vendor/golang.org/x/net/route/interface_announce.go b/src/vendor/golang_org/x/net/route/interface_announce.go index 520d657b57..520d657b57 100644 --- a/src/vendor/golang.org/x/net/route/interface_announce.go +++ b/src/vendor/golang_org/x/net/route/interface_announce.go diff --git a/src/vendor/golang.org/x/net/route/interface_classic.go b/src/vendor/golang_org/x/net/route/interface_classic.go index ac4e7a6805..ac4e7a6805 100644 --- a/src/vendor/golang.org/x/net/route/interface_classic.go +++ b/src/vendor/golang_org/x/net/route/interface_classic.go diff --git a/src/vendor/golang.org/x/net/route/interface_freebsd.go b/src/vendor/golang_org/x/net/route/interface_freebsd.go index c83053915d..c83053915d 100644 --- a/src/vendor/golang.org/x/net/route/interface_freebsd.go +++ b/src/vendor/golang_org/x/net/route/interface_freebsd.go diff --git a/src/vendor/golang.org/x/net/route/interface_multicast.go b/src/vendor/golang_org/x/net/route/interface_multicast.go index 1e99a9cc64..1e99a9cc64 100644 --- a/src/vendor/golang.org/x/net/route/interface_multicast.go +++ b/src/vendor/golang_org/x/net/route/interface_multicast.go diff --git a/src/vendor/golang.org/x/net/route/interface_openbsd.go b/src/vendor/golang_org/x/net/route/interface_openbsd.go index 24451d8ca1..24451d8ca1 100644 --- a/src/vendor/golang.org/x/net/route/interface_openbsd.go +++ b/src/vendor/golang_org/x/net/route/interface_openbsd.go diff --git a/src/vendor/golang.org/x/net/route/message.go b/src/vendor/golang_org/x/net/route/message.go index 27cbf6b77a..27cbf6b77a 100644 --- a/src/vendor/golang.org/x/net/route/message.go +++ b/src/vendor/golang_org/x/net/route/message.go diff --git a/src/vendor/golang.org/x/net/route/message_darwin_test.go b/src/vendor/golang_org/x/net/route/message_darwin_test.go index 3fdd12df55..3fdd12df55 100644 --- a/src/vendor/golang.org/x/net/route/message_darwin_test.go +++ b/src/vendor/golang_org/x/net/route/message_darwin_test.go diff --git a/src/vendor/golang.org/x/net/route/message_freebsd_test.go b/src/vendor/golang_org/x/net/route/message_freebsd_test.go index 785c273f65..785c273f65 100644 --- a/src/vendor/golang.org/x/net/route/message_freebsd_test.go +++ b/src/vendor/golang_org/x/net/route/message_freebsd_test.go diff --git a/src/vendor/golang.org/x/net/route/message_test.go b/src/vendor/golang_org/x/net/route/message_test.go index a1263d8f25..a1263d8f25 100644 --- a/src/vendor/golang.org/x/net/route/message_test.go +++ b/src/vendor/golang_org/x/net/route/message_test.go diff --git a/src/vendor/golang.org/x/net/route/route.go b/src/vendor/golang_org/x/net/route/route.go index c986e29ebc..c986e29ebc 100644 --- a/src/vendor/golang.org/x/net/route/route.go +++ b/src/vendor/golang_org/x/net/route/route.go diff --git a/src/vendor/golang.org/x/net/route/route_classic.go b/src/vendor/golang_org/x/net/route/route_classic.go index d333c6aa52..d333c6aa52 100644 --- a/src/vendor/golang.org/x/net/route/route_classic.go +++ b/src/vendor/golang_org/x/net/route/route_classic.go diff --git a/src/vendor/golang.org/x/net/route/route_openbsd.go b/src/vendor/golang_org/x/net/route/route_openbsd.go index b07862f04d..b07862f04d 100644 --- a/src/vendor/golang.org/x/net/route/route_openbsd.go +++ b/src/vendor/golang_org/x/net/route/route_openbsd.go diff --git a/src/vendor/golang.org/x/net/route/route_test.go b/src/vendor/golang_org/x/net/route/route_test.go index 99f57b712d..99f57b712d 100644 --- a/src/vendor/golang.org/x/net/route/route_test.go +++ b/src/vendor/golang_org/x/net/route/route_test.go diff --git a/src/vendor/golang.org/x/net/route/sys.go b/src/vendor/golang_org/x/net/route/sys.go index 80ca83ae13..80ca83ae13 100644 --- a/src/vendor/golang.org/x/net/route/sys.go +++ b/src/vendor/golang_org/x/net/route/sys.go diff --git a/src/vendor/golang.org/x/net/route/sys_darwin.go b/src/vendor/golang_org/x/net/route/sys_darwin.go index fff3a0fd1d..fff3a0fd1d 100644 --- a/src/vendor/golang.org/x/net/route/sys_darwin.go +++ b/src/vendor/golang_org/x/net/route/sys_darwin.go diff --git a/src/vendor/golang.org/x/net/route/sys_dragonfly.go b/src/vendor/golang_org/x/net/route/sys_dragonfly.go index da848b3d07..da848b3d07 100644 --- a/src/vendor/golang.org/x/net/route/sys_dragonfly.go +++ b/src/vendor/golang_org/x/net/route/sys_dragonfly.go diff --git a/src/vendor/golang.org/x/net/route/sys_freebsd.go b/src/vendor/golang_org/x/net/route/sys_freebsd.go index 7b05c1a5a0..7b05c1a5a0 100644 --- a/src/vendor/golang.org/x/net/route/sys_freebsd.go +++ b/src/vendor/golang_org/x/net/route/sys_freebsd.go diff --git a/src/vendor/golang.org/x/net/route/sys_netbsd.go b/src/vendor/golang_org/x/net/route/sys_netbsd.go index 4d8076b518..4d8076b518 100644 --- a/src/vendor/golang.org/x/net/route/sys_netbsd.go +++ b/src/vendor/golang_org/x/net/route/sys_netbsd.go diff --git a/src/vendor/golang.org/x/net/route/sys_openbsd.go b/src/vendor/golang_org/x/net/route/sys_openbsd.go index 26d0438696..26d0438696 100644 --- a/src/vendor/golang.org/x/net/route/sys_openbsd.go +++ b/src/vendor/golang_org/x/net/route/sys_openbsd.go diff --git a/src/vendor/golang.org/x/net/route/syscall.go b/src/vendor/golang_org/x/net/route/syscall.go index d136325a30..d136325a30 100644 --- a/src/vendor/golang.org/x/net/route/syscall.go +++ b/src/vendor/golang_org/x/net/route/syscall.go diff --git a/src/vendor/golang.org/x/net/route/syscall.s b/src/vendor/golang_org/x/net/route/syscall.s index fa6297f0aa..fa6297f0aa 100644 --- a/src/vendor/golang.org/x/net/route/syscall.s +++ b/src/vendor/golang_org/x/net/route/syscall.s diff --git a/src/vendor/golang.org/x/net/route/zsys_darwin.go b/src/vendor/golang_org/x/net/route/zsys_darwin.go index 265b81cd50..265b81cd50 100644 --- a/src/vendor/golang.org/x/net/route/zsys_darwin.go +++ b/src/vendor/golang_org/x/net/route/zsys_darwin.go diff --git a/src/vendor/golang.org/x/net/route/zsys_dragonfly.go b/src/vendor/golang_org/x/net/route/zsys_dragonfly.go index dd36dece0f..dd36dece0f 100644 --- a/src/vendor/golang.org/x/net/route/zsys_dragonfly.go +++ b/src/vendor/golang_org/x/net/route/zsys_dragonfly.go diff --git a/src/vendor/golang.org/x/net/route/zsys_freebsd_386.go b/src/vendor/golang_org/x/net/route/zsys_freebsd_386.go index 9bac2e3900..9bac2e3900 100644 --- a/src/vendor/golang.org/x/net/route/zsys_freebsd_386.go +++ b/src/vendor/golang_org/x/net/route/zsys_freebsd_386.go diff --git a/src/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go b/src/vendor/golang_org/x/net/route/zsys_freebsd_amd64.go index b1920d7ac1..b1920d7ac1 100644 --- a/src/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go +++ b/src/vendor/golang_org/x/net/route/zsys_freebsd_amd64.go diff --git a/src/vendor/golang.org/x/net/route/zsys_freebsd_arm.go b/src/vendor/golang_org/x/net/route/zsys_freebsd_arm.go index a034d6fcbf..a034d6fcbf 100644 --- a/src/vendor/golang.org/x/net/route/zsys_freebsd_arm.go +++ b/src/vendor/golang_org/x/net/route/zsys_freebsd_arm.go diff --git a/src/vendor/golang.org/x/net/route/zsys_netbsd.go b/src/vendor/golang_org/x/net/route/zsys_netbsd.go index aa4aad1613..aa4aad1613 100644 --- a/src/vendor/golang.org/x/net/route/zsys_netbsd.go +++ b/src/vendor/golang_org/x/net/route/zsys_netbsd.go diff --git a/src/vendor/golang.org/x/net/route/zsys_openbsd.go b/src/vendor/golang_org/x/net/route/zsys_openbsd.go index 4fadc4e8fa..4fadc4e8fa 100644 --- a/src/vendor/golang.org/x/net/route/zsys_openbsd.go +++ b/src/vendor/golang_org/x/net/route/zsys_openbsd.go |