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 <dmitshur@golang.org>
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Russ Cox 2022-08-03 23:01:08 -04:00 committed by Gopher Robot
parent 44ff9bff0c
commit fb1bfd4d37
14 changed files with 41 additions and 199 deletions

View file

@ -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())
}

View file

@ -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)
}

View file

@ -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)
}

View file

@ -8,12 +8,11 @@ import (
"os" "os"
"runtime" "runtime"
"runtime/pprof" "runtime/pprof"
tracepkg "runtime/trace"
"cmd/compile/internal/base" "cmd/compile/internal/base"
) )
var traceHandler func(string)
func startProfile() { func startProfile() {
if base.Flag.CPUProfile != "" { if base.Flag.CPUProfile != "" {
f, err := os.Create(base.Flag.CPUProfile) f, err := os.Create(base.Flag.CPUProfile)
@ -64,13 +63,20 @@ func startProfile() {
if err != nil { if err != nil {
base.Fatalf("%v", err) base.Fatalf("%v", err)
} }
startMutexProfiling() runtime.SetMutexProfileFraction(1)
base.AtExit(func() { base.AtExit(func() {
pprof.Lookup("mutex").WriteTo(f, 0) pprof.Lookup("mutex").WriteTo(f, 0)
f.Close() f.Close()
}) })
} }
if base.Flag.TraceProfile != "" && traceHandler != nil { if base.Flag.TraceProfile != "" {
traceHandler(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)
} }
} }

View file

@ -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)
}

View file

@ -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.")
}

View file

@ -376,7 +376,7 @@ func writerForLSP(subdirpath, file string) io.WriteCloser {
if lastdot != -1 { if lastdot != -1 {
basename = basename[:lastdot] basename = basename[:lastdot]
} }
basename = pathEscape(basename) basename = url.PathEscape(basename)
// Assume a directory, make a file // Assume a directory, make a file
p := filepath.Join(subdirpath, basename+".json") p := filepath.Join(subdirpath, basename+".json")
@ -428,7 +428,7 @@ func FlushLoggedOpts(ctxt *obj.Link, slashPkgPath string) {
if slashPkgPath == "" { if slashPkgPath == "" {
slashPkgPath = "\000" slashPkgPath = "\000"
} }
subdirpath := filepath.Join(dest, pathEscape(slashPkgPath)) subdirpath := filepath.Join(dest, url.PathEscape(slashPkgPath))
err := os.MkdirAll(subdirpath, 0755) err := os.MkdirAll(subdirpath, 0755)
if err != nil { if err != nil {
log.Fatalf("Could not create directory %s for logging optimizer actions, %v", subdirpath, err) log.Fatalf("Could not create directory %s for logging optimizer actions, %v", subdirpath, err)

View file

@ -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())
}
}

View file

@ -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
}
}
}

View file

@ -6,6 +6,7 @@ package pkgbits
import ( import (
"fmt" "fmt"
"runtime"
"strings" "strings"
) )
@ -34,6 +35,24 @@ func fmtFrames(pcs ...uintptr) []string {
type frameVisitor func(file string, line int, name string, offset uintptr) 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 // SyncMarker is an enum type that represents markers that may be
// written to export data to ensure the reader and writer stay // written to export data to ensure the reader and writer stay
// synchronized. // synchronized.

View file

@ -4,7 +4,10 @@
package sort package sort
import "math/bits" import (
"internal/reflectlite"
"math/bits"
)
// Slice sorts the slice x given the provided less function. // Slice sorts the slice x given the provided less function.
// It panics if x is not a slice. // 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 less function must satisfy the same requirements as
// the Interface type's Less method. // the Interface type's Less method.
func Slice(x any, less func(i, j int) bool) { func Slice(x any, less func(i, j int) bool) {
rv := reflectValueOf(x) rv := reflectlite.ValueOf(x)
swap := reflectSwapper(x) swap := reflectlite.Swapper(x)
length := rv.Len() length := rv.Len()
limit := bits.Len(uint(length)) limit := bits.Len(uint(length))
pdqsort_func(lessSwap{less, swap}, 0, length, limit) 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 less function must satisfy the same requirements as
// the Interface type's Less method. // the Interface type's Less method.
func SliceStable(x any, less func(i, j int) bool) { func SliceStable(x any, less func(i, j int) bool) {
rv := reflectValueOf(x) rv := reflectlite.ValueOf(x)
swap := reflectSwapper(x) swap := reflectlite.Swapper(x)
stable_func(lessSwap{less, swap}, rv.Len()) stable_func(lessSwap{less, swap}, rv.Len())
} }
// SliceIsSorted reports whether the slice x is sorted according to the provided less function. // SliceIsSorted reports whether the slice x is sorted according to the provided less function.
// It panics if x is not a slice. // It panics if x is not a slice.
func SliceIsSorted(x any, less func(i, j int) bool) bool { func SliceIsSorted(x any, less func(i, j int) bool) bool {
rv := reflectValueOf(x) rv := reflectlite.ValueOf(x)
n := rv.Len() n := rv.Len()
for i := n - 1; i > 0; i-- { for i := n - 1; i > 0; i-- {
if less(i, i-1) { if less(i, i-1) {

View file

@ -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

View file

@ -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)
}
}

View file

@ -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