From fb1bfd4d37d40cd5e4969ac631cf979d7b08f1a2 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 3 Aug 2022 23:01:08 -0400 Subject: [PATCH] all: remove pre-Go 1.17 workarounds The Go bootstrap toolchain requirement is now Go 1.17. We can finally delete all these pre-Go 1.17 workarounds. For #44505. Change-Id: I59d4dff1cde23da022892b5b6a116eb3dbad9ce4 Reviewed-on: https://go-review.googlesource.com/c/go/+/420903 Auto-Submit: Dmitri Shuralyov Run-TryBot: Russ Cox Reviewed-by: Austin Clements TryBot-Result: Gopher Robot --- src/cmd/compile/internal/gc/bootstrap.go | 17 ----------- src/cmd/compile/internal/gc/pprof.go | 14 --------- src/cmd/compile/internal/gc/trace.go | 30 ------------------- src/cmd/compile/internal/gc/util.go | 16 ++++++---- src/cmd/compile/internal/logopt/escape.go | 14 --------- .../internal/logopt/escape_bootstrap.go | 13 -------- src/cmd/compile/internal/logopt/log_opts.go | 4 +-- src/internal/pkgbits/frames_go1.go | 21 ------------- src/internal/pkgbits/frames_go17.go | 28 ----------------- src/internal/pkgbits/sync.go | 19 ++++++++++++ src/sort/slice.go | 15 ++++++---- src/sort/slice_go113.go | 13 -------- src/sort/slice_go14.go | 23 -------------- src/sort/slice_go18.go | 13 -------- 14 files changed, 41 insertions(+), 199 deletions(-) delete mode 100644 src/cmd/compile/internal/gc/bootstrap.go delete mode 100644 src/cmd/compile/internal/gc/pprof.go delete mode 100644 src/cmd/compile/internal/gc/trace.go delete mode 100644 src/cmd/compile/internal/logopt/escape.go delete mode 100644 src/cmd/compile/internal/logopt/escape_bootstrap.go delete mode 100644 src/internal/pkgbits/frames_go1.go delete mode 100644 src/internal/pkgbits/frames_go17.go delete mode 100644 src/sort/slice_go113.go delete mode 100644 src/sort/slice_go14.go delete mode 100644 src/sort/slice_go18.go diff --git a/src/cmd/compile/internal/gc/bootstrap.go b/src/cmd/compile/internal/gc/bootstrap.go deleted file mode 100644 index 37b0d59ede..0000000000 --- a/src/cmd/compile/internal/gc/bootstrap.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017 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. - -//go:build !go1.8 -// +build !go1.8 - -package gc - -import ( - "cmd/compile/internal/base" - "runtime" -) - -func startMutexProfiling() { - base.Fatalf("mutex profiling unavailable in version %v", runtime.Version()) -} diff --git a/src/cmd/compile/internal/gc/pprof.go b/src/cmd/compile/internal/gc/pprof.go deleted file mode 100644 index 5f9b030621..0000000000 --- a/src/cmd/compile/internal/gc/pprof.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2017 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. - -//go:build go1.8 -// +build go1.8 - -package gc - -import "runtime" - -func startMutexProfiling() { - runtime.SetMutexProfileFraction(1) -} diff --git a/src/cmd/compile/internal/gc/trace.go b/src/cmd/compile/internal/gc/trace.go deleted file mode 100644 index 8cdbd4b0f3..0000000000 --- a/src/cmd/compile/internal/gc/trace.go +++ /dev/null @@ -1,30 +0,0 @@ -// 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. - -//go:build go1.7 -// +build go1.7 - -package gc - -import ( - "os" - tracepkg "runtime/trace" - - "cmd/compile/internal/base" -) - -func init() { - traceHandler = traceHandlerGo17 -} - -func traceHandlerGo17(traceprofile string) { - f, err := os.Create(traceprofile) - if err != nil { - base.Fatalf("%v", err) - } - if err := tracepkg.Start(f); err != nil { - base.Fatalf("%v", err) - } - base.AtExit(tracepkg.Stop) -} diff --git a/src/cmd/compile/internal/gc/util.go b/src/cmd/compile/internal/gc/util.go index 56fd137de2..dcac0ce79a 100644 --- a/src/cmd/compile/internal/gc/util.go +++ b/src/cmd/compile/internal/gc/util.go @@ -8,12 +8,11 @@ import ( "os" "runtime" "runtime/pprof" + tracepkg "runtime/trace" "cmd/compile/internal/base" ) -var traceHandler func(string) - func startProfile() { if base.Flag.CPUProfile != "" { f, err := os.Create(base.Flag.CPUProfile) @@ -64,13 +63,20 @@ func startProfile() { if err != nil { base.Fatalf("%v", err) } - startMutexProfiling() + runtime.SetMutexProfileFraction(1) base.AtExit(func() { pprof.Lookup("mutex").WriteTo(f, 0) f.Close() }) } - if base.Flag.TraceProfile != "" && traceHandler != nil { - traceHandler(base.Flag.TraceProfile) + if base.Flag.TraceProfile != "" { + f, err := os.Create(base.Flag.TraceProfile) + if err != nil { + base.Fatalf("%v", err) + } + if err := tracepkg.Start(f); err != nil { + base.Fatalf("%v", err) + } + base.AtExit(tracepkg.Stop) } } diff --git a/src/cmd/compile/internal/logopt/escape.go b/src/cmd/compile/internal/logopt/escape.go deleted file mode 100644 index 9660e938b4..0000000000 --- a/src/cmd/compile/internal/logopt/escape.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2019 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. - -//go:build go1.8 -// +build go1.8 - -package logopt - -import "net/url" - -func pathEscape(s string) string { - return url.PathEscape(s) -} diff --git a/src/cmd/compile/internal/logopt/escape_bootstrap.go b/src/cmd/compile/internal/logopt/escape_bootstrap.go deleted file mode 100644 index cc04eaadfd..0000000000 --- a/src/cmd/compile/internal/logopt/escape_bootstrap.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2019 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. - -//go:build !go1.8 -// +build !go1.8 - -package logopt - -// For bootstrapping with an early version of Go -func pathEscape(s string) string { - panic("This should never be called; the compiler is not fully bootstrapped if it is.") -} diff --git a/src/cmd/compile/internal/logopt/log_opts.go b/src/cmd/compile/internal/logopt/log_opts.go index 9fee83426f..09825e8278 100644 --- a/src/cmd/compile/internal/logopt/log_opts.go +++ b/src/cmd/compile/internal/logopt/log_opts.go @@ -376,7 +376,7 @@ func writerForLSP(subdirpath, file string) io.WriteCloser { if lastdot != -1 { basename = basename[:lastdot] } - basename = pathEscape(basename) + basename = url.PathEscape(basename) // Assume a directory, make a file p := filepath.Join(subdirpath, basename+".json") @@ -428,7 +428,7 @@ func FlushLoggedOpts(ctxt *obj.Link, slashPkgPath string) { if slashPkgPath == "" { slashPkgPath = "\000" } - subdirpath := filepath.Join(dest, pathEscape(slashPkgPath)) + subdirpath := filepath.Join(dest, url.PathEscape(slashPkgPath)) err := os.MkdirAll(subdirpath, 0755) if err != nil { log.Fatalf("Could not create directory %s for logging optimizer actions, %v", subdirpath, err) diff --git a/src/internal/pkgbits/frames_go1.go b/src/internal/pkgbits/frames_go1.go deleted file mode 100644 index 5294f6a63e..0000000000 --- a/src/internal/pkgbits/frames_go1.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2021 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. - -//go:build !go1.7 -// +build !go1.7 - -// TODO(mdempsky): Remove after #44505 is resolved - -package pkgbits - -import "runtime" - -func walkFrames(pcs []uintptr, visit frameVisitor) { - for _, pc := range pcs { - fn := runtime.FuncForPC(pc) - file, line := fn.FileLine(pc) - - visit(file, line, fn.Name(), pc-fn.Entry()) - } -} diff --git a/src/internal/pkgbits/frames_go17.go b/src/internal/pkgbits/frames_go17.go deleted file mode 100644 index 2324ae7adf..0000000000 --- a/src/internal/pkgbits/frames_go17.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2021 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. - -//go:build go1.7 -// +build go1.7 - -package pkgbits - -import "runtime" - -// walkFrames calls visit for each call frame represented by pcs. -// -// pcs should be a slice of PCs, as returned by runtime.Callers. -func walkFrames(pcs []uintptr, visit frameVisitor) { - if len(pcs) == 0 { - return - } - - frames := runtime.CallersFrames(pcs) - for { - frame, more := frames.Next() - visit(frame.File, frame.Line, frame.Function, frame.PC-frame.Entry) - if !more { - return - } - } -} diff --git a/src/internal/pkgbits/sync.go b/src/internal/pkgbits/sync.go index 4b9ea4863f..72f776af05 100644 --- a/src/internal/pkgbits/sync.go +++ b/src/internal/pkgbits/sync.go @@ -6,6 +6,7 @@ package pkgbits import ( "fmt" + "runtime" "strings" ) @@ -34,6 +35,24 @@ func fmtFrames(pcs ...uintptr) []string { type frameVisitor func(file string, line int, name string, offset uintptr) +// walkFrames calls visit for each call frame represented by pcs. +// +// pcs should be a slice of PCs, as returned by runtime.Callers. +func walkFrames(pcs []uintptr, visit frameVisitor) { + if len(pcs) == 0 { + return + } + + frames := runtime.CallersFrames(pcs) + for { + frame, more := frames.Next() + visit(frame.File, frame.Line, frame.Function, frame.PC-frame.Entry) + if !more { + return + } + } +} + // SyncMarker is an enum type that represents markers that may be // written to export data to ensure the reader and writer stay // synchronized. diff --git a/src/sort/slice.go b/src/sort/slice.go index 443182b42e..d0b2102013 100644 --- a/src/sort/slice.go +++ b/src/sort/slice.go @@ -4,7 +4,10 @@ package sort -import "math/bits" +import ( + "internal/reflectlite" + "math/bits" +) // Slice sorts the slice x given the provided less function. // It panics if x is not a slice. @@ -16,8 +19,8 @@ import "math/bits" // The less function must satisfy the same requirements as // the Interface type's Less method. func Slice(x any, less func(i, j int) bool) { - rv := reflectValueOf(x) - swap := reflectSwapper(x) + rv := reflectlite.ValueOf(x) + swap := reflectlite.Swapper(x) length := rv.Len() limit := bits.Len(uint(length)) pdqsort_func(lessSwap{less, swap}, 0, length, limit) @@ -30,15 +33,15 @@ func Slice(x any, less func(i, j int) bool) { // The less function must satisfy the same requirements as // the Interface type's Less method. func SliceStable(x any, less func(i, j int) bool) { - rv := reflectValueOf(x) - swap := reflectSwapper(x) + rv := reflectlite.ValueOf(x) + swap := reflectlite.Swapper(x) stable_func(lessSwap{less, swap}, rv.Len()) } // SliceIsSorted reports whether the slice x is sorted according to the provided less function. // It panics if x is not a slice. func SliceIsSorted(x any, less func(i, j int) bool) bool { - rv := reflectValueOf(x) + rv := reflectlite.ValueOf(x) n := rv.Len() for i := n - 1; i > 0; i-- { if less(i, i-1) { diff --git a/src/sort/slice_go113.go b/src/sort/slice_go113.go deleted file mode 100644 index 53542dbd1a..0000000000 --- a/src/sort/slice_go113.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 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. - -//go:build go1.13 -// +build go1.13 - -package sort - -import "internal/reflectlite" - -var reflectValueOf = reflectlite.ValueOf -var reflectSwapper = reflectlite.Swapper diff --git a/src/sort/slice_go14.go b/src/sort/slice_go14.go deleted file mode 100644 index e477367618..0000000000 --- a/src/sort/slice_go14.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2017 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. - -//go:build !go1.8 -// +build !go1.8 - -package sort - -import "reflect" - -var reflectValueOf = reflect.ValueOf - -func reflectSwapper(x any) func(int, int) { - v := reflectValueOf(x) - tmp := reflect.New(v.Type().Elem()).Elem() - return func(i, j int) { - a, b := v.Index(i), v.Index(j) - tmp.Set(a) - a.Set(b) - b.Set(tmp) - } -} diff --git a/src/sort/slice_go18.go b/src/sort/slice_go18.go deleted file mode 100644 index 1538477bc5..0000000000 --- a/src/sort/slice_go18.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 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. - -//go:build go1.8 && !go1.13 -// +build go1.8,!go1.13 - -package sort - -import "reflect" - -var reflectValueOf = reflect.ValueOf -var reflectSwapper = reflect.Swapper