]> Cypherpunks repositories - gostls13.git/commitdiff
internal/bytealg: specify argmaps for exported functions
authorKeith Randall <khr@google.com>
Mon, 9 Jul 2018 18:09:42 +0000 (11:09 -0700)
committerKeith Randall <khr@golang.org>
Tue, 10 Jul 2018 17:13:53 +0000 (17:13 +0000)
Functions exported on behalf of other packages need to have their
argument stack maps specified explicitly.  They don't get an implicit
map because they are not in the local package, and if they get defer'd
they need argument maps.

Fixes #24419

Change-Id: I35b7d8b4a03d4770ba88699e1007cb3fcb5397a9
Reviewed-on: https://go-review.googlesource.com/122676
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
30 files changed:
src/internal/bytealg/compare_386.s
src/internal/bytealg/compare_amd64.s
src/internal/bytealg/compare_amd64p32.s
src/internal/bytealg/compare_arm.s
src/internal/bytealg/compare_arm64.s
src/internal/bytealg/compare_mipsx.s
src/internal/bytealg/compare_ppc64x.s
src/internal/bytealg/compare_s390x.s
src/internal/bytealg/compare_wasm.s
src/internal/bytealg/equal_386.s
src/internal/bytealg/equal_amd64.s
src/internal/bytealg/equal_amd64p32.s
src/internal/bytealg/equal_arm.s
src/internal/bytealg/equal_arm64.s
src/internal/bytealg/equal_mips64x.s
src/internal/bytealg/equal_mipsx.s
src/internal/bytealg/equal_ppc64x.s
src/internal/bytealg/equal_s390x.s
src/internal/bytealg/equal_wasm.s
src/internal/bytealg/indexbyte_386.s
src/internal/bytealg/indexbyte_amd64.s
src/internal/bytealg/indexbyte_amd64p32.s
src/internal/bytealg/indexbyte_arm.s
src/internal/bytealg/indexbyte_arm64.s
src/internal/bytealg/indexbyte_mips64x.s
src/internal/bytealg/indexbyte_mipsx.s
src/internal/bytealg/indexbyte_ppc64x.s
src/internal/bytealg/indexbyte_s390x.s
src/internal/bytealg/indexbyte_wasm.s
test/fixedbugs/issue24419.go [new file with mode: 0644]

index f2a7fcce24a1898ee7d2c7370234af5395cf7e96..89296e16905e4442e54616c0f910f147fb60022f 100644 (file)
@@ -14,6 +14,7 @@ TEXT ·Compare(SB),NOSPLIT,$0-28
        JMP     cmpbody<>(SB)
 
 TEXT bytes·Compare(SB),NOSPLIT,$0-28
+       FUNCDATA $0, ·Compare·args_stackmap(SB)
        MOVL    a_base+0(FP), SI
        MOVL    a_len+4(FP), BX
        MOVL    b_base+12(FP), DI
index 7d950286e3a6035c7edd8087ee93f6767a9df4ab..277d77c545ada408b76f80de05b9a2413bae0172 100644 (file)
@@ -14,6 +14,7 @@ TEXT ·Compare(SB),NOSPLIT,$0-56
        JMP     cmpbody<>(SB)
 
 TEXT bytes·Compare(SB),NOSPLIT,$0-56
+       FUNCDATA $0, ·Compare·args_stackmap(SB)
        MOVQ    a_base+0(FP), SI
        MOVQ    a_len+8(FP), BX
        MOVQ    b_base+24(FP), DI
index 0f23147338535a9b813b801aa8b22bbf518e0bad..85ba6fa9ac766e87a12c24083370cd1d917ca331 100644 (file)
@@ -15,6 +15,7 @@ TEXT ·Compare(SB),NOSPLIT,$0-28
        RET
 
 TEXT bytes·Compare(SB),NOSPLIT,$0-28
+       FUNCDATA $0, ·Compare·args_stackmap(SB)
        MOVL    a_base+0(FP), SI
        MOVL    a_len+4(FP), BX
        MOVL    b_base+12(FP), DI
index 72cae3309cda90d9696fec97bf327d7e8780cc24..d58345223f061f89affd37def1af973861f577e3 100644 (file)
@@ -14,6 +14,7 @@ TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-28
        B       cmpbody<>(SB)
 
 TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-28
+       FUNCDATA $0, ·Compare·args_stackmap(SB)
        MOVW    a_base+0(FP), R2
        MOVW    a_len+4(FP), R0
        MOVW    b_base+12(FP), R3
index 2bd38064c30b4e7bc0d2eb3894d0da40d4ef8192..db614b6afe3fde54f5f746603a4e151f7eec5361 100644 (file)
@@ -14,6 +14,7 @@ TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-56
        B       cmpbody<>(SB)
 
 TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56
+       FUNCDATA $0, ·Compare·args_stackmap(SB)
        MOVD    a_base+0(FP), R2
        MOVD    a_len+8(FP), R0
        MOVD    b_base+24(FP), R3
index b8e225ea85bcff318b5cd68ba2f1a7cf6513f33c..85ba1a9455e0f1bd9b188bffd9a3f3604ee4ec75 100644 (file)
@@ -40,6 +40,7 @@ cmp_ret:
        RET
 
 TEXT bytes·Compare(SB),NOSPLIT,$0-28
+       FUNCDATA $0, ·Compare·args_stackmap(SB)
        MOVW    a_base+0(FP), R3
        MOVW    b_base+12(FP), R4
        MOVW    a_len+4(FP), R1
index 9b13c9a14d6c2749a010eda62d3e14e3b07712ad..67bfcd11163eeca9f305f8849f5fcd3dc0437df8 100644 (file)
@@ -38,6 +38,7 @@ done:
        RET
 
 TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56
+       FUNCDATA $0, ·Compare·args_stackmap(SB)
        MOVD    a_base+0(FP), R5
        MOVD    b_base+24(FP), R6
        MOVD    a_len+8(FP), R3
index d0d76166aafd5727b3a786d8bb74db1e80d5cafe..4bc4624906690cdbf5762dc408b1a85eb8f18a97 100644 (file)
@@ -14,6 +14,7 @@ TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-56
        BR      cmpbody<>(SB)
 
 TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56
+       FUNCDATA $0, ·Compare·args_stackmap(SB)
        MOVD    a_base+0(FP), R3
        MOVD    a_len+8(FP), R4
        MOVD    b_base+24(FP), R5
index b412649e04bcc0befc1f57ee4d0ad3fb5aed0584..1eb63c70dae89472d717523dd8ecf4811f5e48de 100644 (file)
@@ -16,6 +16,7 @@ TEXT ·Compare(SB), NOSPLIT, $0-56
        RET
 
 TEXT bytes·Compare(SB), NOSPLIT, $0-56
+       FUNCDATA $0, ·Compare·args_stackmap(SB)
        Get SP
        I64Load a_base+0(FP)
        I64Load a_len+8(FP)
index e6e103e6677c2097bbfd931038519ece47db9689..c048b6cebc87c8a631bc4496ed370968cbbed777 100644 (file)
@@ -24,6 +24,7 @@ eq:
        RET
 
 TEXT bytes·Equal(SB),NOSPLIT,$0-25
+       FUNCDATA $0, ·Equal·args_stackmap(SB)
        MOVL    a_len+4(FP), BX
        MOVL    b_len+16(FP), CX
        CMPL    BX, CX
index 73aaacf0644a7b790cdb67b5333cd86d3bae37d7..cbc62dc1d8f3da6cab0d4dadd09e4ae036240ebb 100644 (file)
@@ -24,6 +24,7 @@ eq:
        RET
 
 TEXT bytes·Equal(SB),NOSPLIT,$0-49
+       FUNCDATA $0, ·Equal·args_stackmap(SB)
        MOVQ    a_len+8(FP), BX
        MOVQ    b_len+32(FP), CX
        CMPQ    BX, CX
index d64ccbb0d1ac5dff239ce37854d480875c7c9895..c841f98b2f2a594588f0d8f03b83590b50bb1847 100644 (file)
@@ -25,6 +25,7 @@ eq:
        RET
 
 TEXT bytes·Equal(SB),NOSPLIT,$0-25
+       FUNCDATA $0, ·Equal·args_stackmap(SB)
        MOVL    a_len+4(FP), BX
        MOVL    b_len+16(FP), CX
        CMPL    BX, CX
index 5a1bd3169e45d274bedc968db1c06797477ec418..6b0d7deed93368bf71afa3f3c75b8bfe9408c60b 100644 (file)
@@ -36,6 +36,7 @@ equal:
        RET
 
 TEXT bytes·Equal(SB),NOSPLIT,$0-25
+       FUNCDATA $0, ·Equal·args_stackmap(SB)
        JMP     ·Equal(SB)
 
 // memequal(a, b unsafe.Pointer, size uintptr) bool
index c2ebc8d47413dabc4bd2de95760d2fd58d05f8a4..30abd980c5166c9523b2cab7eb92948b9507638d 100644 (file)
@@ -26,6 +26,7 @@ not_equal:
        RET
 
 TEXT bytes·Equal(SB),NOSPLIT,$0-49
+       FUNCDATA $0, ·Equal·args_stackmap(SB)
        MOVD    a_len+8(FP), R1
        MOVD    b_len+32(FP), R3
        CMP     R1, R3
index cf63f3fbbaa21d7ed7b6138cabf1cefcf993e1b7..a005864483512295a7f81f3f4ba13ae87de9b5fc 100644 (file)
@@ -36,6 +36,7 @@ equal:
        RET
 
 TEXT bytes·Equal(SB),NOSPLIT,$0-49
+       FUNCDATA $0, ·Equal·args_stackmap(SB)
        JMP     ·Equal(SB)
 
 // memequal(a, b unsafe.Pointer, size uintptr) bool
index 86b038987de2dfd5b899bf89879c3efe1ffd29f4..22ab450e66fd6bc222b4fe87fa28c1294466bf6f 100644 (file)
@@ -36,6 +36,7 @@ equal:
        RET
 
 TEXT bytes·Equal(SB),NOSPLIT,$0-25
+       FUNCDATA $0, ·Equal·args_stackmap(SB)
        JMP     ·Equal(SB)
 
 // memequal(a, b unsafe.Pointer, size uintptr) bool
index c04915f8979ccb4ef09b12a43ef4550cc7452d7a..9c9cf77588ad1991dfd8be5f14117f270f12e726 100644 (file)
@@ -29,6 +29,7 @@ equal:
        RET
 
 TEXT bytes·Equal(SB),NOSPLIT,$0-49
+       FUNCDATA $0, ·Equal·args_stackmap(SB)
        MOVD    a_len+8(FP), R4
        MOVD    b_len+32(FP), R5
        CMP     R5, R4          // unequal lengths are not equal
index ed6464936a9ec1b3a0b4bcf2454b32d70eeac705..84dbdbfe187d6569249ba6fb5d153a2702108c41 100644 (file)
@@ -18,6 +18,7 @@ notequal:
        RET
 
 TEXT bytes·Equal(SB),NOSPLIT|NOFRAME,$0-49
+       FUNCDATA $0, ·Equal·args_stackmap(SB)
        MOVD    a_len+8(FP), R2
        MOVD    b_len+32(FP), R6
        MOVD    a_base+0(FP), R3
index f0199ab7eec3db3572e86c0eebeda89ef00cdaee..cb85a934c736e9652f1f589c6cdba129e782e825 100644 (file)
@@ -26,6 +26,7 @@ TEXT ·Equal(SB), NOSPLIT, $0-49
        RET
 
 TEXT bytes·Equal(SB), NOSPLIT, $0-49
+       FUNCDATA $0, ·Equal·args_stackmap(SB)
        MOVD a_len+8(FP), R0
        MOVD b_len+32(FP), R1
        Get R0
index fa7e73e5cbc55ab71b93c7798cc3df9a4c2c5a12..ce7645e771ad3a472bc41d045768f9557b16b857 100644 (file)
@@ -34,7 +34,9 @@ TEXT ·IndexByteString(SB),NOSPLIT,$0-16
        RET
 
 TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
+       FUNCDATA $0, ·IndexByte·args_stackmap(SB)
        JMP ·IndexByte(SB)
 
 TEXT strings·IndexByte(SB),NOSPLIT,$0-16
+       FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
        JMP ·IndexByteString(SB)
index e4768bb9125fabe619a90b66d8d9ad4ba2b3dd7e..359f38904b1d3d4fa5a90332d7dc9affdeabbf6a 100644 (file)
@@ -28,6 +28,7 @@ TEXT  ·IndexByteString(SB), NOSPLIT, $0-32
        // but involves no call overhead.
        // TODO: remove this hack when midstack inlining is enabled?
 TEXT   bytes·IndexByte(SB), NOSPLIT, $0-40
+       FUNCDATA $0, ·IndexByte·args_stackmap(SB)
        MOVQ b_base+0(FP), SI
        MOVQ b_len+8(FP), BX
        MOVB c+24(FP), AL
@@ -35,6 +36,7 @@ TEXT  bytes·IndexByte(SB), NOSPLIT, $0-40
        JMP  indexbytebody<>(SB)
 
 TEXT   strings·IndexByte(SB), NOSPLIT, $0-32
+       FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
        MOVQ s_base+0(FP), SI
        MOVQ s_len+8(FP), BX
        MOVB c+16(FP), AL
index 7cf6b1791e7c7363ccf885849304b272ba3e8d9e..a791c7396a8d927d8fc1e2c02c5d9e2df37ff143 100644 (file)
@@ -22,6 +22,7 @@ TEXT ·IndexByteString(SB),NOSPLIT,$0-20
        RET
 
 TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
+       FUNCDATA $0, ·IndexByte·args_stackmap(SB)
        MOVL b_base+0(FP), SI
        MOVL b_len+4(FP), BX
        MOVB c+12(FP), AL
@@ -30,6 +31,7 @@ TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
        RET
 
 TEXT strings·IndexByte(SB),NOSPLIT,$0-20
+       FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
        MOVL s_base+0(FP), SI
        MOVL s_len+4(FP), BX
        MOVB c+8(FP), AL
index 3883c2f448287898c96099dc649f3b3245d07746..6c746c6869092f4a3b6508a9c7a1f83a92519d90 100644 (file)
@@ -54,7 +54,9 @@ _sib_notfound:
        RET
 
 TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
+       FUNCDATA $0, ·IndexByte·args_stackmap(SB)
        JMP ·IndexByte(SB)
 
 TEXT strings·IndexByte(SB),NOSPLIT,$0-16
+       FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
        JMP ·IndexByteString(SB)
index 9e5aa1e9209aece193b0748abf4955deb939829a..6991ccec15cd319e03ef87c89e05502f9260bec0 100644 (file)
@@ -19,6 +19,7 @@ TEXT ·IndexByteString(SB),NOSPLIT,$0-32
        B       indexbytebody<>(SB)
 
 TEXT bytes·IndexByte(SB),NOSPLIT,$0-40
+       FUNCDATA $0, ·IndexByte·args_stackmap(SB)
        MOVD    b_base+0(FP), R0
        MOVD    b_len+8(FP), R2
        MOVBU   c+24(FP), R1
@@ -26,6 +27,7 @@ TEXT bytes·IndexByte(SB),NOSPLIT,$0-40
        B       indexbytebody<>(SB)
 
 TEXT strings·IndexByte(SB),NOSPLIT,$0-32
+       FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
        MOVD    s_base+0(FP), R0
        MOVD    s_len+8(FP), R2
        MOVBU   c+16(FP), R1
index 2dc736df4d2ab99e7b69339b2a4f2f47a1fcbd9a..9c421174b95778a6c0e66c72c0f14ab205b9b187 100644 (file)
@@ -54,7 +54,9 @@ notfound:
        RET
 
 TEXT bytes·IndexByte(SB),NOSPLIT,$0-40
+       FUNCDATA $0, ·IndexByte·args_stackmap(SB)
        JMP ·IndexByte(SB)
 
 TEXT strings·IndexByte(SB),NOSPLIT,$0-32
+       FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
        JMP ·IndexByteString(SB)
index 1544572b4ab11c34bb1e83ed5fe4f46c1cb96a31..bc7258f1d1fe88de3afa25b20f7d34b761a2bd74 100644 (file)
@@ -52,7 +52,9 @@ notfound:
        RET
 
 TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
+       FUNCDATA $0, ·IndexByte·args_stackmap(SB)
        JMP ·IndexByte(SB)
 
 TEXT strings·IndexByte(SB),NOSPLIT,$0-16
+       FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
        JMP ·IndexByteString(SB)
index d522f8a9d6b5c9c1be232385b053ffd883d97ff2..ccf897d99c4513aac9bbfeaef6c68791340bbf0c 100644 (file)
@@ -22,6 +22,7 @@ TEXT ·IndexByteString(SB),NOSPLIT|NOFRAME,$0-32
        BR      indexbytebody<>(SB)
 
 TEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40
+       FUNCDATA $0, ·IndexByte·args_stackmap(SB)
        MOVD    b_base+0(FP), R3        // R3 = byte array pointer
        MOVD    b_len+8(FP), R4         // R4 = length
        MOVBZ   c+24(FP), R5            // R5 = byte
@@ -29,6 +30,7 @@ TEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40
        BR      indexbytebody<>(SB)
 
 TEXT strings·IndexByte(SB),NOSPLIT|NOFRAME,$0-32
+       FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
        MOVD    s_base+0(FP), R3  // R3 = string
        MOVD    s_len+8(FP), R4   // R4 = length
        MOVBZ   c+16(FP), R5      // R5 = byte
index 6565c783e61c18997b7a3bbc847d0a98f42678b2..15fd2935b4a9e9bba16ed55d914486b573011463 100644 (file)
@@ -20,6 +20,7 @@ TEXT ·IndexByteString(SB),NOSPLIT|NOFRAME,$0-32
        BR      indexbytebody<>(SB)
 
 TEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40
+       FUNCDATA $0, ·IndexByte·args_stackmap(SB)
        MOVD    b_base+0(FP), R3// b_base => R3
        MOVD    b_len+8(FP), R4 // b_len => R4
        MOVBZ   c+24(FP), R5    // c => R5
@@ -27,6 +28,7 @@ TEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40
        BR      indexbytebody<>(SB)
 
 TEXT strings·IndexByte(SB),NOSPLIT|NOFRAME,$0-32
+       FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
        MOVD    s_base+0(FP), R3// s_base => R3
        MOVD    s_len+8(FP), R4 // s_len => R4
        MOVBZ   c+16(FP), R5    // c => R5
index f9f8e65002bb8c93ea66e8a253f3970a6ca220fb..5e64aa031ac4cf5df1448e8c309043add6283ac5 100644 (file)
@@ -50,6 +50,7 @@ TEXT ·IndexByteString(SB), NOSPLIT, $0-32
        RET
 
 TEXT bytes·IndexByte(SB), NOSPLIT, $0-40
+       FUNCDATA $0, ·IndexByte·args_stackmap(SB)
        Get SP
        I64Load b_base+0(FP)
        I32WrapI64
@@ -72,6 +73,7 @@ TEXT bytes·IndexByte(SB), NOSPLIT, $0-40
        RET
 
 TEXT strings·IndexByte(SB), NOSPLIT, $0-32
+       FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
        Get SP
        I64Load s_base+0(FP)
        I32WrapI64
diff --git a/test/fixedbugs/issue24419.go b/test/fixedbugs/issue24419.go
new file mode 100644 (file)
index 0000000..73b7783
--- /dev/null
@@ -0,0 +1,51 @@
+// run
+
+// Copyright 2018 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 main
+
+import (
+       "bytes"
+       "strings"
+)
+
+func growstack(n int) {
+       if n > 0 {
+               growstack(n - 1)
+       }
+}
+
+func main() {
+       c := make(chan struct{})
+       go compare(c)
+       go equal(c)
+       go indexByte(c)
+       go indexByteString(c)
+       <-c
+       <-c
+       <-c
+       <-c
+}
+
+func compare(c chan struct{}) {
+       defer bytes.Compare(nil, nil)
+       growstack(10000)
+       c <- struct{}{}
+}
+func equal(c chan struct{}) {
+       defer bytes.Equal(nil, nil)
+       growstack(10000)
+       c <- struct{}{}
+}
+func indexByte(c chan struct{}) {
+       defer bytes.IndexByte(nil, 0)
+       growstack(10000)
+       c <- struct{}{}
+}
+func indexByteString(c chan struct{}) {
+       defer strings.IndexByte("", 0)
+       growstack(10000)
+       c <- struct{}{}
+}