doc/devel/release.html | 8 ++++++++
doc/effective_go.html | 14 ++++++--------
doc/go1.7.html | 43 +++++++++++++++++++++++++++++++++++++++++--
misc/trace/trace_viewer_lean.html | 2 +-
src/cmd/api/goapi.go | 2 +-
src/cmd/compile/internal/gc/sparselocatephifunctions.go | 5 ++++-
src/cmd/compile/internal/ssa/compile.go | 1 +
src/cmd/compile/internal/ssa/sparsetreemap.go | 104 ++++++++++++++++++++++++++++++++----------------------
src/cmd/compile/internal/ssa/tighten.go | 23 +++++++++++++++++++++++
src/cmd/go/build.go | 10 +++++-----
src/cmd/gofmt/gofmt.go | 1 -
src/fmt/scan.go | 6 +++---
src/fmt/scan_test.go | 101 +++++++++++++++++++++++------------------------------
src/go/build/build_test.go | 8 ++++----
src/go/build/deps_test.go | 8 ++++----
src/math/rand/race_test.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++
src/math/rand/rand.go | 42 +++++++++++++++++++++++++++++++++++++-----
src/net/dial_test.go | 5 +++++
src/net/http/h2_bundle.go | 4 ++--
src/net/http/http.go | 2 +-
src/net/http/server.go | 7 +++----
src/net/http/transfer.go | 2 +-
src/net/http/transport.go | 2 +-
src/net/interface_bsd.go | 2 +-
src/net/interface_bsdvar.go | 2 +-
src/net/interface_darwin.go | 2 +-
src/net/interface_freebsd.go | 2 +-
src/net/smtp/smtp.go | 5 +++++
src/reflect/all_test.go | 2 ++
src/reflect/type.go | 3 +++
src/runtime/cgocall.go | 5 +++--
src/runtime/internal/atomic/asm_386.s | 6 +++---
src/runtime/internal/atomic/asm_amd64.s | 2 +-
src/runtime/internal/atomic/asm_amd64p32.s | 4 ++--
src/runtime/internal/atomic/asm_arm.s | 6 +++---
src/runtime/internal/atomic/asm_arm64.s | 4 ++--
src/runtime/internal/atomic/asm_ppc64x.s | 2 +-
src/runtime/mbarrier.go | 4 ++--
src/runtime/mem_linux.go | 22 ++++++++++++++--------
src/runtime/mfinal.go | 2 +-
src/runtime/mheap.go | 5 +++++
src/runtime/os_nacl.go | 2 +-
src/runtime/pprof/pprof.go | 5 +----
src/runtime/pprof/pprof_test.go | 4 ++++
src/runtime/proc.go | 28 +++++++++++++++++++++++++++-
src/runtime/race/README | 2 +-
src/runtime/race/race_test.go | 18 ++++++++++++++++++
src/runtime/signal1_unix.go | 2 +-
src/runtime/signal_darwin.go | 4 ++--
src/runtime/signal_freebsd.go | 4 ++--
src/runtime/signal_openbsd.go | 4 ++--
src/runtime/signal_sigtramp.go | 4 ++--
src/runtime/stubs.go | 4 ++--
src/runtime/sys_darwin_amd64.s | 1 +
src/syscall/exec_linux_test.go | 1 +
src/vendor/golang.org/x/net/http2/hpack/encode.go => src/vendor/golang_org/x/net/http2/hpack/encode.go | 0
src/vendor/golang.org/x/net/http2/hpack/encode_test.go => src/vendor/golang_org/x/net/http2/hpack/encode_test.go | 0
src/vendor/golang.org/x/net/http2/hpack/hpack.go => src/vendor/golang_org/x/net/http2/hpack/hpack.go | 0
src/vendor/golang.org/x/net/http2/hpack/hpack_test.go => src/vendor/golang_org/x/net/http2/hpack/hpack_test.go | 0
src/vendor/golang.org/x/net/http2/hpack/huffman.go => src/vendor/golang_org/x/net/http2/hpack/huffman.go | 0
src/vendor/golang.org/x/net/http2/hpack/tables.go => src/vendor/golang_org/x/net/http2/hpack/tables.go | 0
src/vendor/golang.org/x/net/lex/httplex/httplex.go => src/vendor/golang_org/x/net/lex/httplex/httplex.go | 0
src/vendor/golang.org/x/net/lex/httplex/httplex_test.go => src/vendor/golang_org/x/net/lex/httplex/httplex_test.go | 0
src/vendor/golang.org/x/net/route/address.go => src/vendor/golang_org/x/net/route/address.go | 0
src/vendor/golang.org/x/net/route/address_darwin_test.go => src/vendor/golang_org/x/net/route/address_darwin_test.go | 0
src/vendor/golang.org/x/net/route/address_test.go => src/vendor/golang_org/x/net/route/address_test.go | 0
src/vendor/golang.org/x/net/route/binary.go => src/vendor/golang_org/x/net/route/binary.go | 0
src/vendor/golang.org/x/net/route/defs_darwin.go => src/vendor/golang_org/x/net/route/defs_darwin.go | 0
src/vendor/golang.org/x/net/route/defs_dragonfly.go => src/vendor/golang_org/x/net/route/defs_dragonfly.go | 0
src/vendor/golang.org/x/net/route/defs_freebsd.go => src/vendor/golang_org/x/net/route/defs_freebsd.go | 0
src/vendor/golang.org/x/net/route/defs_netbsd.go => src/vendor/golang_org/x/net/route/defs_netbsd.go | 0
src/vendor/golang.org/x/net/route/defs_openbsd.go => src/vendor/golang_org/x/net/route/defs_openbsd.go | 0
src/vendor/golang.org/x/net/route/interface.go => src/vendor/golang_org/x/net/route/interface.go | 0
src/vendor/golang.org/x/net/route/interface_announce.go => src/vendor/golang_org/x/net/route/interface_announce.go | 0
src/vendor/golang.org/x/net/route/interface_classic.go => src/vendor/golang_org/x/net/route/interface_classic.go | 0
src/vendor/golang.org/x/net/route/interface_freebsd.go => src/vendor/golang_org/x/net/route/interface_freebsd.go | 0
src/vendor/golang.org/x/net/route/interface_multicast.go => src/vendor/golang_org/x/net/route/interface_multicast.go | 0
src/vendor/golang.org/x/net/route/interface_openbsd.go => src/vendor/golang_org/x/net/route/interface_openbsd.go | 0
src/vendor/golang.org/x/net/route/message.go => src/vendor/golang_org/x/net/route/message.go | 0
src/vendor/golang.org/x/net/route/message_darwin_test.go => src/vendor/golang_org/x/net/route/message_darwin_test.go | 0
src/vendor/golang.org/x/net/route/message_freebsd_test.go => src/vendor/golang_org/x/net/route/message_freebsd_test.go | 0
src/vendor/golang.org/x/net/route/message_test.go => src/vendor/golang_org/x/net/route/message_test.go | 0
src/vendor/golang.org/x/net/route/route.go => src/vendor/golang_org/x/net/route/route.go | 0
src/vendor/golang.org/x/net/route/route_classic.go => src/vendor/golang_org/x/net/route/route_classic.go | 0
src/vendor/golang.org/x/net/route/route_openbsd.go => src/vendor/golang_org/x/net/route/route_openbsd.go | 0
src/vendor/golang.org/x/net/route/route_test.go => src/vendor/golang_org/x/net/route/route_test.go | 0
src/vendor/golang.org/x/net/route/sys.go => src/vendor/golang_org/x/net/route/sys.go | 0
src/vendor/golang.org/x/net/route/sys_darwin.go => src/vendor/golang_org/x/net/route/sys_darwin.go | 0
src/vendor/golang.org/x/net/route/sys_dragonfly.go => src/vendor/golang_org/x/net/route/sys_dragonfly.go | 0
src/vendor/golang.org/x/net/route/sys_freebsd.go => src/vendor/golang_org/x/net/route/sys_freebsd.go | 0
src/vendor/golang.org/x/net/route/sys_netbsd.go => src/vendor/golang_org/x/net/route/sys_netbsd.go | 0
src/vendor/golang.org/x/net/route/sys_openbsd.go => src/vendor/golang_org/x/net/route/sys_openbsd.go | 0
src/vendor/golang.org/x/net/route/syscall.go => src/vendor/golang_org/x/net/route/syscall.go | 0
src/vendor/golang.org/x/net/route/syscall.s => src/vendor/golang_org/x/net/route/syscall.s | 0
src/vendor/golang.org/x/net/route/zsys_darwin.go => src/vendor/golang_org/x/net/route/zsys_darwin.go | 0
src/vendor/golang.org/x/net/route/zsys_dragonfly.go => src/vendor/golang_org/x/net/route/zsys_dragonfly.go | 0
src/vendor/golang.org/x/net/route/zsys_freebsd_386.go => src/vendor/golang_org/x/net/route/zsys_freebsd_386.go | 0
src/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go => src/vendor/golang_org/x/net/route/zsys_freebsd_amd64.go | 0
src/vendor/golang.org/x/net/route/zsys_freebsd_arm.go => src/vendor/golang_org/x/net/route/zsys_freebsd_arm.go | 0
src/vendor/golang.org/x/net/route/zsys_netbsd.go => src/vendor/golang_org/x/net/route/zsys_netbsd.go | 0
src/vendor/golang.org/x/net/route/zsys_openbsd.go => src/vendor/golang_org/x/net/route/zsys_openbsd.go | 0
diff --git a/doc/devel/release.html b/doc/devel/release.html
index 97c4133f1dfe0c8fa8d6f7a6bd9700dba79ff810..fcb8c1900311a76bce945c2dd7f828a45b920d83 100644
--- a/doc/devel/release.html
+++ b/doc/devel/release.html
@@ -53,6 +53,14 @@ See the Go
1.6.2 milestone on our issue tracker for details.
+
+go1.6.3 (released 2016/07/17) includes security fixes to the
+net/http/cgi package and net/http package when used in
+a CGI environment. This release also adds support for macOS Sierra.
+See the Go
+1.6.3 milestone on our issue tracker for details.
+
+
go1.5 (released 2015/08/19)
diff --git a/doc/effective_go.html b/doc/effective_go.html
index 1e66c0c6145faee0cf5a0dfd86c0e21b9a556b03..f6fe48c8d0465b4892b6c38863825e4976177270 100644
--- a/doc/effective_go.html
+++ b/doc/effective_go.html
@@ -2238,13 +2238,12 @@
Generality
-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.
@@ -3665,4 +3664,3 @@ var _ image.Color = Black
var _ image.Image = Black
-->
-
diff --git a/doc/go1.7.html b/doc/go1.7.html
index a460754794d7c871ed819bc2b9bbfc512984b542..cf5d8a48a5129288600ee0db6cd9ff7d1ed66387 100644
--- a/doc/go1.7.html
+++ b/doc/go1.7.html
@@ -75,6 +75,13 @@
Ports
+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.
+
+
+
Go 1.7 adds an experimental port to Linux on z Systems (linux/s390x)
and the beginning of a port to Plan 9 on ARM (plan9/arm).
@@ -85,8 +92,10 @@ added in Go 1.6 now have full support for cgo and external linking.
-The experimental port to Linux on big-endian 64-bit PowerPC (linux/ppc64)
+The experimental port to Linux on little-endian 64-bit PowerPC (linux/ppc64le)
now requires the POWER8 architecture or later.
+Big-endian 64-bit PowerPC (linux/ppc64) only requires the
+POWER5 architecture.
@@ -367,6 +376,12 @@ unicode/utf16
packages.
+
+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.
+
+
Core library
Context
@@ -463,6 +478,13 @@ common in some environments.
+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.
+
+
+
On Windows, Go programs in Go 1.5 and earlier forced
the global Windows timer resolution to 1ms at startup
by calling timeBeginPeriod(1).
@@ -793,6 +815,16 @@ Read method
now produce a pseudo-random stream of bytes that is consistent and not
dependent on the size of the input buffer.
+
+
+The documentation clarifies that
+Rand's Seed
+and Read methods
+are not safe to call concurrently, though the global
+functions Seed
+and Read are (and have
+always been) safe.
+
@@ -884,6 +916,13 @@
The server implementation now correctly sends only one "Transfer-Encoding" header when "chunked"
is set explicitly, following RFC 7230.
+
+
+
+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.
@@ -1062,7 +1101,7 @@
- os
-
-IsExists now returns true for syscall.ENOTEMPTY,
+IsExist now returns true for syscall.ENOTEMPTY,
on systems where that error exists.
diff --git a/misc/trace/trace_viewer_lean.html b/misc/trace/trace_viewer_lean.html
index 7939aae8a65929576ea6b77fc07ac5af6fb602c4..076cb4359a43d7d9c7bbcf0527c0286dfad532ae 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 not find an importer for the provided eventData.');}
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 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 b3c7544ad129ab22aa1aa44f798adb0805c43385..d8b0b0a5c1d84a77b52292830bd9b23c9eb73c0f 100644
--- a/src/cmd/compile/internal/ssa/compile.go
+++ b/src/cmd/compile/internal/ssa/compile.go
@@ -270,6 +270,7 @@ {name: "lowered deadcode", fn: deadcode, required: true},
{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 61276985b114bbafd352e1f3b13f22662be6ebd0..3e6f296796c45405d46bb196acc0c040223cfe28 100644
--- a/src/cmd/compile/internal/ssa/sparsetreemap.go
+++ b/src/cmd/compile/internal/ssa/sparsetreemap.go
@@ -14,8 +14,8 @@ // to add a tree node to the set and a Find operation to locate
// 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 @@ // as exposing some useful control-flow-related data to other
// 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 @@
// 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 @@ if blockIndex.entry == 0 {
// 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 @@ // but m.Insert(b, AdjustBefore) followed by m.Find(b, AdjustWithin) will.
//
// 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
- }
- // 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)
+ if v == nil {
+ return nil
+ }
+
+ otherEntry := v.(*sparseTreeMapEntry)
+ if otherEntry.index.exit >= blockIndex.exit { // otherEntry exit after blockIndex exit; therefore, brackets
+ return otherEntry
}
- return nil // nothing found
+ // 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
+ }
+ return sp
+ }
+ return nil
}
func (m *SparseTreeMap) String() string {
@@ -165,5 +182,8 @@ return tree.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 ecb43c101d201f283982a1383d5dd707e75f473f..2f7c30929d71aa227dded4f70b46d33fcf95287d 100644
--- a/src/cmd/compile/internal/ssa/tighten.go
+++ b/src/cmd/compile/internal/ssa/tighten.go
@@ -86,3 +86,26 @@ }
}
}
}
+
+// 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 11a4eab0933c5d0823e985e795a865f690e06033..3c0b994ef24041935e97485b3a9169f553ed7dee 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 @@ }
// 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 b10b804fd2cb23a3675d41f5c3c31138cdfb76cf..f29b6cb83d995695b9c606c64716553e51bc8e4a 100644
--- a/src/cmd/gofmt/gofmt.go
+++ b/src/cmd/gofmt/gofmt.go
@@ -55,7 +55,6 @@
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 08b0bf96a6e522dbd08cb5089ee76a463963dd6b..fdf419795d9ffcb1041ba8df94e0b7cb1e529ecf 100644
--- a/src/fmt/scan.go
+++ b/src/fmt/scan.go
@@ -325,9 +325,9 @@ copy(r.pendBuf[0:], r.pendBuf[1:])
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 364d4fb42afb72dfda4bb8b7cd78202b84f14c08..e36b62e78a8789c9e0a97de66677392a714ba63e 100644
--- a/src/fmt/scan_test.go
+++ b/src/fmt/scan_test.go
@@ -15,6 +15,7 @@ "reflect"
"regexp"
"strings"
"testing"
+ "testing/iotest"
"unicode/utf8"
)
@@ -117,20 +118,6 @@ return nil
}
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
@@ -363,25 +350,38 @@ // Fixed bugs
{"%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 @@ v = p.Elem()
}
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 @@ verifyInf(s, 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(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 @@ t.Errorf("Sscanln: expected io.ErrUnexpectedEOF (ha!); got %s", err)
}
}
-// 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 @@ b.ResetTimer()
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 c9f906a7da6d0a5b498ac771c03cdd4ea07d51d1..198a649b15041771c67a4b6ca945f18f91e8e227 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 @@ testenv.MustHaveGoBuild(t) // really must just have source
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 335e774a7cf6b0820be6a1309a17df0ffd0406f7..5b2529129cc5ae4bb794d200f670c0cd85ef4402 100644
--- a/src/go/build/deps_test.go
+++ b/src/go/build/deps_test.go
@@ -297,7 +297,7 @@ "L0", "CGO",
"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 @@ "L4", "NET", "OS",
"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 @@ return filepath.SkipDir
}
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 0000000000000000000000000000000000000000..48f6c290b9819845c6364939c5ed841118149c8e
--- /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 8f31b0ea9d3f5867329a4db3a5f4f1022e49f7d8..dd8d43cca1c18d81fd57419d802aa7e29c96d790 100644
--- a/src/math/rand/rand.go
+++ b/src/math/rand/rand.go
@@ -49,7 +49,13 @@ // to generate other random values.
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 @@ }
// 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 @@ // Seed uses the provided seed value to initialize the default Source to a
// 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 @@ r.lk.Lock()
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 9fe507e901f43e43855806dceb80d851cb783f6b..8b21e6b0886e0010201811b37f0820fc9137d81e 100644
--- a/src/net/dial_test.go
+++ b/src/net/dial_test.go
@@ -695,6 +695,11 @@ }
}
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 352a41d41405b1469ed2f76cf276b286aca7dd48..47e5f577e691e4ccd19e479b23c177b14ac2da6d 100644
--- a/src/net/http/h2_bundle.go
+++ b/src/net/http/h2_bundle.go
@@ -41,8 +41,8 @@ "strings"
"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 4d088a5bb1c8121787dbaa899e107bc8c2bc6365..b34ae41ec517b8e9ff34b8f5872f1e70cb37f2af 100644
--- a/src/net/http/http.go
+++ b/src/net/http/http.go
@@ -7,7 +7,7 @@
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 7c3237c4cd4e6404403de76c938797ca5d53bc82..7b2b4b2f42307245e887f9e3a82f390c6b3e69d7 100644
--- a/src/net/http/server.go
+++ b/src/net/http/server.go
@@ -28,7 +28,7 @@ "sync"
"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 @@ if !http1ServerSupportsRequest(req) {
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 @@ }
}
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 b27ace638a191f39587c07cb3d4975acd61342c5..c653467098c8230f832f0fe3a616ffec2efc9594 100644
--- a/src/net/http/transfer.go
+++ b/src/net/http/transfer.go
@@ -18,7 +18,7 @@ "strconv"
"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 eb54703c8fb9434c00b745d0888ff9f369524904..9164d0d827c0017af81673c450f009622681e3e3 100644
--- a/src/net/http/transport.go
+++ b/src/net/http/transport.go
@@ -27,7 +27,7 @@ "strings"
"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 d791cb30167943cc9355cb08635ad9a99efd58fe..35b1c2681592ae88a18f09a67e3a4ed3afb54f91 100644
--- a/src/net/interface_bsd.go
+++ b/src/net/interface_bsd.go
@@ -9,7 +9,7 @@
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 a809b5f5ce49e6cf31e07cea02ab3fe34e6b7736..0b84ca37d4a44787c94f1067e8fb9dd05a994f0c 100644
--- a/src/net/interface_bsdvar.go
+++ b/src/net/interface_bsdvar.go
@@ -9,7 +9,7 @@
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 bb4fd73a987670bca842c0783d84c03324c3e41d..2ec8e1cc6ef70f10d3ff92d6218c3f4e0731ca09 100644
--- a/src/net/interface_darwin.go
+++ b/src/net/interface_darwin.go
@@ -7,7 +7,7 @@
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 45badd64954a17d087eab9a9540b94acd2d938e4..8a7d6f67c039d4480fdbbefb4e17c9cb13912464 100644
--- a/src/net/interface_freebsd.go
+++ b/src/net/interface_freebsd.go
@@ -7,7 +7,7 @@
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 b4e4867a9ee9313c76f1a71063420e19fcda2c04..9e04dd7c82bafafab492a727ee0313f680a841b6 100644
--- a/src/net/smtp/smtp.go
+++ b/src/net/smtp/smtp.go
@@ -8,6 +8,11 @@ // 8BITMIME RFC 1652
// 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 adde5829dc60aec7b81625993e0dc35f90ae8b9b..bbb098f3eb6134884a3218734ce89dad4124749d 100644
--- a/src/reflect/all_test.go
+++ b/src/reflect/all_test.go
@@ -2261,6 +2261,8 @@ {TypeOf((*rune)(nil)), ""},
{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 bedfba45b11578fbbc0c9d4e7dfc3735523b451c..de6e05fb6dc47e36b26029222f13e56d3b73342e 100644
--- a/src/reflect/type.go
+++ b/src/reflect/type.go
@@ -876,6 +876,9 @@ return Method{}, false
}
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 0f8386b10f54d50e26a569c5acd69f0a8f41e9ff..f8d693060dea537e56752a3ebd5977c3e644f6fd 100644
--- a/src/runtime/cgocall.go
+++ b/src/runtime/cgocall.go
@@ -44,7 +44,7 @@ // and outside the $GOMAXPROCS limit. Thus, this code cannot yet
// 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 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 ebecd0b4cb0e418b5ab57251d5d6a023ae262372..357d830289a6d3602957eeb4312a773470301083 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·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 94d4ac26988c7943f444c9774888f48d5bd9d36b..0001d2301c30d0cb53cb3724dfd8ff37519d2446 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·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 74c79d08fd66be9b8fc7b054ebeb650346806982..22c707c325e68a8e6e1f4a9be7ef75f414312703 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·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 235e8bfd20ac35c2abaee407102771a09516b551..12da22390d562663d3d6d1f7b74d2b5ea10f460c 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·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 c255677f783923e22b5d9c82c8a2500680d7a10e..929bf7189c2121ad34d5e8eb6e75b0996bbec8e0 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·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 de4f895efded2a9287192c73a127a046fc58e0fe..aa6067e15bb2c59c61fa73515650dca5610c2fda 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·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 bf75934ed6e160527bd2a0afd9836ecf68ed7549..4a8f501dfec02ba7cdddcbc665c875fafdbf8254 100644
--- a/src/runtime/mbarrier.go
+++ b/src/runtime/mbarrier.go
@@ -145,7 +145,7 @@ }
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 @@ }
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 61fdcee5430247c45ecf4b4ebcd2b74eca7c9873..cd0bf263285532cdcff62227d4bdd8d5035d5729 100644
--- a/src/runtime/mem_linux.go
+++ b/src/runtime/mem_linux.go
@@ -10,8 +10,8 @@ "unsafe"
)
const (
- _PAGE_SIZE = sys.PhysPageSize
- _EACCES = 13
+ _EACCES = 13
+ _EINVAL = 22
)
// NOTE: vec must be just 1 byte long here.
@@ -22,13 +22,19 @@ // at a time. See golang.org/issue/7476.
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 1a744e4a51e697d32a29289fb4b0e9ec63d54ffa..14ebec81bf37f739ebd5b8b28e31df261985ff5f 100644
--- a/src/runtime/mfinal.go
+++ b/src/runtime/mfinal.go
@@ -450,7 +450,7 @@ // A very simplified example showing where KeepAlive is required:
// 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 4093288a7cb382238bc806c03898f9337ebd324e..db60f7a872708f957259c0a008806a50dd27d973 100644
--- a/src/runtime/mheap.go
+++ b/src/runtime/mheap.go
@@ -14,6 +14,11 @@ "runtime/internal/sys"
"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 6cbd16de159c8c24a709efcbcc082a0b046c53e5..1dacc1a49c014ed7edcf08b331a75c3424df29d6 100644
--- a/src/runtime/os_nacl.go
+++ b/src/runtime/os_nacl.go
@@ -246,7 +246,7 @@ //go:nosplit
//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 f2cd81adb1e4b39fb200b6fc6f3b406750b12e51..b7c41f13de2bc2ffa198125a2b2e8387c21d1a1b 100644
--- a/src/runtime/pprof/pprof.go
+++ b/src/runtime/pprof/pprof.go
@@ -353,12 +353,9 @@ name := frame.Function
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 a6f5eda458789a84266a5d0fe0808ac1531c61ec..a0930155a51181f3bf45efbe2bdb358853d49c37 100644
--- a/src/runtime/pprof/pprof_test.go
+++ b/src/runtime/pprof/pprof_test.go
@@ -497,6 +497,10 @@ if !strings.HasPrefix(prof, "--- contention:\ncycles/second=") {
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 2c0b3df167fbc9c94235c17d8b9e05dfd34cf014..1d00930ac5d312c05d43a3148786747fa951dbfe 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -1389,10 +1389,27 @@ }
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 @@ return uintptr(unsafe.Pointer(getg().m))
}
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 @@ //go:nosplit
func lockextra(nilokay bool) *m {
const locked = 1
+ incr := false
for {
old := atomic.Loaduintptr(&extram)
if old == locked {
@@ -1503,6 +1522,13 @@ yield()
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 3a506b0c08896f3312622deba4280def26e7fffc..95e241c072c2b47cbd6e4b37a4b2b38cfda9107f 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
index 1822486e08df18db87efbcfb4c110a414eef4941..c19740fb8f2cad61854cfc0a9049400fd010d819 100644
Binary files a/src/runtime/race/race_darwin_amd64.syso and b/src/runtime/race/race_darwin_amd64.syso differ
diff --git a/src/runtime/race/race_freebsd_amd64.syso b/src/runtime/race/race_freebsd_amd64.syso
index 75d94952c341f435ee668055b47a6496e0854b4f..df1bc26861af9090a26b35d4bf1422ae19c2d6d9 100644
Binary files a/src/runtime/race/race_freebsd_amd64.syso and b/src/runtime/race/race_freebsd_amd64.syso differ
diff --git a/src/runtime/race/race_linux_amd64.syso b/src/runtime/race/race_linux_amd64.syso
index 8f571afa9a7db032ccfb06e76cea99445801148b..174033041ed4a6f584e7b74f13194244dea7e9cc 100644
Binary files a/src/runtime/race/race_linux_amd64.syso and b/src/runtime/race/race_linux_amd64.syso differ
diff --git a/src/runtime/race/race_test.go b/src/runtime/race/race_test.go
index 81e51cc5b299a66453e591e17005de1050b8fe61..53ec74c085678eb6de236e1c13541e8fce5d29ce 100644
--- a/src/runtime/race/race_test.go
+++ b/src/runtime/race/race_test.go
@@ -221,3 +221,21 @@ }()
}
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
index 64c54b6e2fa7ee3e90d95cf0b80c887f1fbd9453..fd93959af5eb78d1903adaa712ab21224cf8580e 100644
Binary files a/src/runtime/race/race_windows_amd64.syso and b/src/runtime/race/race_windows_amd64.syso differ
diff --git a/src/runtime/signal1_unix.go b/src/runtime/signal1_unix.go
index 5080202833e3d8fd16fcd381a8aae262303f06a1..101d16dc8e3185a3b2defa0202e3735181ed0a44 100644
--- a/src/runtime/signal1_unix.go
+++ b/src/runtime/signal1_unix.go
@@ -338,7 +338,7 @@ //go:nosplit
//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 c8534ff09bad785c3b768040e5969423b0120b08..fb06de5509bfe4d0effbce24f1151826dd71032f 100644
--- a/src/runtime/signal_darwin.go
+++ b/src/runtime/signal_darwin.go
@@ -70,12 +70,12 @@ var st stackt
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 c4cb68720eb6ae3a4e84c2ca3693c9343fd8c007..c6c126983ddedd432df3a14fcab05c6d65d21ee6 100644
--- a/src/runtime/signal_freebsd.go
+++ b/src/runtime/signal_freebsd.go
@@ -66,12 +66,12 @@ var st stackt
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 9275279860f4b6ed31d997e33d53c13f241c0d5d..efe30da5d962678477bdf1848350037e6fde503d 100644
--- a/src/runtime/signal_openbsd.go
+++ b/src/runtime/signal_openbsd.go
@@ -66,12 +66,12 @@ var st stackt
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 3e0b10457863c4826b239223c05c0cf985ef98a3..dbbbcd0392b1fe252b76a06ce166f2b08926580f 100644
--- a/src/runtime/signal_sigtramp.go
+++ b/src/runtime/signal_sigtramp.go
@@ -37,12 +37,12 @@ var st sigaltstackt
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 6c28fd2e782e7d2302859ce130b8fdaebdec2748..a594c1b7910f6ce5d80a3f2ef0f1c205ac8b78d3 100644
--- a/src/runtime/stubs.go
+++ b/src/runtime/stubs.go
@@ -98,7 +98,7 @@ x := uintptr(p)
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 @@ // does not misinterpret memory when the arguments are not present.
// 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 e09b906ba571f227308773ac40c87e6e0ec603f7..e4837ce2915ba126c19f2ef9234bb339f70a49c3 100644
--- a/src/runtime/sys_darwin_amd64.s
+++ b/src/runtime/sys_darwin_amd64.s
@@ -244,6 +244,7 @@ MOVQ CX, 16(SP) // info
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 cb24c590f9115262eb2d18d525363b30c2e4e8fd..aaffa067bcf656ecf497b90bc37d325771c37168 100644
--- a/src/syscall/exec_linux_test.go
+++ b/src/syscall/exec_linux_test.go
@@ -238,6 +238,7 @@ expected := []string{
"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
rename from src/vendor/golang.org/x/net/http2/hpack/encode.go
rename to 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
rename from src/vendor/golang.org/x/net/http2/hpack/encode_test.go
rename to 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
rename from src/vendor/golang.org/x/net/http2/hpack/hpack.go
rename to 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
rename from src/vendor/golang.org/x/net/http2/hpack/hpack_test.go
rename to 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
rename from src/vendor/golang.org/x/net/http2/hpack/huffman.go
rename to 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
rename from src/vendor/golang.org/x/net/http2/hpack/tables.go
rename to 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
rename from src/vendor/golang.org/x/net/lex/httplex/httplex.go
rename to 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
rename from src/vendor/golang.org/x/net/lex/httplex/httplex_test.go
rename to 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
rename from src/vendor/golang.org/x/net/route/address.go
rename to 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
rename from src/vendor/golang.org/x/net/route/address_darwin_test.go
rename to 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
rename from src/vendor/golang.org/x/net/route/address_test.go
rename to 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
rename from src/vendor/golang.org/x/net/route/binary.go
rename to 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
rename from src/vendor/golang.org/x/net/route/defs_darwin.go
rename to 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
rename from src/vendor/golang.org/x/net/route/defs_dragonfly.go
rename to 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
rename from src/vendor/golang.org/x/net/route/defs_freebsd.go
rename to 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
rename from src/vendor/golang.org/x/net/route/defs_netbsd.go
rename to 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
rename from src/vendor/golang.org/x/net/route/defs_openbsd.go
rename to 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
rename from src/vendor/golang.org/x/net/route/interface.go
rename to 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
rename from src/vendor/golang.org/x/net/route/interface_announce.go
rename to 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
rename from src/vendor/golang.org/x/net/route/interface_classic.go
rename to 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
rename from src/vendor/golang.org/x/net/route/interface_freebsd.go
rename to 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
rename from src/vendor/golang.org/x/net/route/interface_multicast.go
rename to 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
rename from src/vendor/golang.org/x/net/route/interface_openbsd.go
rename to 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
rename from src/vendor/golang.org/x/net/route/message.go
rename to 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
rename from src/vendor/golang.org/x/net/route/message_darwin_test.go
rename to 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
rename from src/vendor/golang.org/x/net/route/message_freebsd_test.go
rename to 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
rename from src/vendor/golang.org/x/net/route/message_test.go
rename to 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
rename from src/vendor/golang.org/x/net/route/route.go
rename to 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
rename from src/vendor/golang.org/x/net/route/route_classic.go
rename to 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
rename from src/vendor/golang.org/x/net/route/route_openbsd.go
rename to 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
rename from src/vendor/golang.org/x/net/route/route_test.go
rename to 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
rename from src/vendor/golang.org/x/net/route/sys.go
rename to 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
rename from src/vendor/golang.org/x/net/route/sys_darwin.go
rename to 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
rename from src/vendor/golang.org/x/net/route/sys_dragonfly.go
rename to 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
rename from src/vendor/golang.org/x/net/route/sys_freebsd.go
rename to 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
rename from src/vendor/golang.org/x/net/route/sys_netbsd.go
rename to 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
rename from src/vendor/golang.org/x/net/route/sys_openbsd.go
rename to 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
rename from src/vendor/golang.org/x/net/route/syscall.go
rename to 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
rename from src/vendor/golang.org/x/net/route/syscall.s
rename to 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
rename from src/vendor/golang.org/x/net/route/zsys_darwin.go
rename to 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
rename from src/vendor/golang.org/x/net/route/zsys_dragonfly.go
rename to 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
rename from src/vendor/golang.org/x/net/route/zsys_freebsd_386.go
rename to 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
rename from src/vendor/golang.org/x/net/route/zsys_freebsd_amd64.go
rename to 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
rename from src/vendor/golang.org/x/net/route/zsys_freebsd_arm.go
rename to 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
rename from src/vendor/golang.org/x/net/route/zsys_netbsd.go
rename to 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
rename from src/vendor/golang.org/x/net/route/zsys_openbsd.go
rename to src/vendor/golang_org/x/net/route/zsys_openbsd.go