diff options
Diffstat (limited to 'src/runtime/panic32.go')
-rw-r--r-- | src/runtime/panic32.go | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/runtime/panic32.go b/src/runtime/panic32.go new file mode 100644 index 0000000..aea8401 --- /dev/null +++ b/src/runtime/panic32.go @@ -0,0 +1,105 @@ +// 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. + +// +build 386 arm mips mipsle + +package runtime + +// Additional index/slice error paths for 32-bit platforms. +// Used when the high word of a 64-bit index is not zero. + +// failures in the comparisons for s[x], 0 <= x < y (y == len(s)) +func goPanicExtendIndex(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "index out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsIndex}) +} +func goPanicExtendIndexU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "index out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsIndex}) +} + +// failures in the comparisons for s[:x], 0 <= x <= y (y == len(s) or cap(s)) +func goPanicExtendSliceAlen(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSliceAlen}) +} +func goPanicExtendSliceAlenU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSliceAlen}) +} +func goPanicExtendSliceAcap(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSliceAcap}) +} +func goPanicExtendSliceAcapU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSliceAcap}) +} + +// failures in the comparisons for s[x:y], 0 <= x <= y +func goPanicExtendSliceB(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSliceB}) +} +func goPanicExtendSliceBU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSliceB}) +} + +// failures in the comparisons for s[::x], 0 <= x <= y (y == len(s) or cap(s)) +func goPanicExtendSlice3Alen(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSlice3Alen}) +} +func goPanicExtendSlice3AlenU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSlice3Alen}) +} +func goPanicExtendSlice3Acap(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSlice3Acap}) +} +func goPanicExtendSlice3AcapU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSlice3Acap}) +} + +// failures in the comparisons for s[:x:y], 0 <= x <= y +func goPanicExtendSlice3B(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSlice3B}) +} +func goPanicExtendSlice3BU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSlice3B}) +} + +// failures in the comparisons for s[x:y:], 0 <= x <= y +func goPanicExtendSlice3C(hi int, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: true, y: y, code: boundsSlice3C}) +} +func goPanicExtendSlice3CU(hi uint, lo uint, y int) { + panicCheck1(getcallerpc(), "slice bounds out of range") + panic(boundsError{x: int64(hi)<<32 + int64(lo), signed: false, y: y, code: boundsSlice3C}) +} + +// Implemented in assembly, as they take arguments in registers. +// Declared here to mark them as ABIInternal. +func panicExtendIndex(hi int, lo uint, y int) +func panicExtendIndexU(hi uint, lo uint, y int) +func panicExtendSliceAlen(hi int, lo uint, y int) +func panicExtendSliceAlenU(hi uint, lo uint, y int) +func panicExtendSliceAcap(hi int, lo uint, y int) +func panicExtendSliceAcapU(hi uint, lo uint, y int) +func panicExtendSliceB(hi int, lo uint, y int) +func panicExtendSliceBU(hi uint, lo uint, y int) +func panicExtendSlice3Alen(hi int, lo uint, y int) +func panicExtendSlice3AlenU(hi uint, lo uint, y int) +func panicExtendSlice3Acap(hi int, lo uint, y int) +func panicExtendSlice3AcapU(hi uint, lo uint, y int) +func panicExtendSlice3B(hi int, lo uint, y int) +func panicExtendSlice3BU(hi uint, lo uint, y int) +func panicExtendSlice3C(hi int, lo uint, y int) +func panicExtendSlice3CU(hi uint, lo uint, y int) |