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