internal/bytealg: specify argmaps for exported functions

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>
This commit is contained in:
Keith Randall 2018-07-09 11:09:42 -07:00 committed by Keith Randall
parent deefcb2623
commit be9c994609
30 changed files with 90 additions and 0 deletions

View file

@ -14,6 +14,7 @@ TEXT ·Compare(SB),NOSPLIT,$0-28
JMP cmpbody<>(SB) JMP cmpbody<>(SB)
TEXT bytes·Compare(SB),NOSPLIT,$0-28 TEXT bytes·Compare(SB),NOSPLIT,$0-28
FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVL a_base+0(FP), SI MOVL a_base+0(FP), SI
MOVL a_len+4(FP), BX MOVL a_len+4(FP), BX
MOVL b_base+12(FP), DI MOVL b_base+12(FP), DI

View file

@ -14,6 +14,7 @@ TEXT ·Compare(SB),NOSPLIT,$0-56
JMP cmpbody<>(SB) JMP cmpbody<>(SB)
TEXT bytes·Compare(SB),NOSPLIT,$0-56 TEXT bytes·Compare(SB),NOSPLIT,$0-56
FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVQ a_base+0(FP), SI MOVQ a_base+0(FP), SI
MOVQ a_len+8(FP), BX MOVQ a_len+8(FP), BX
MOVQ b_base+24(FP), DI MOVQ b_base+24(FP), DI

View file

@ -15,6 +15,7 @@ TEXT ·Compare(SB),NOSPLIT,$0-28
RET RET
TEXT bytes·Compare(SB),NOSPLIT,$0-28 TEXT bytes·Compare(SB),NOSPLIT,$0-28
FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVL a_base+0(FP), SI MOVL a_base+0(FP), SI
MOVL a_len+4(FP), BX MOVL a_len+4(FP), BX
MOVL b_base+12(FP), DI MOVL b_base+12(FP), DI

View file

@ -14,6 +14,7 @@ TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-28
B cmpbody<>(SB) B cmpbody<>(SB)
TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-28 TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-28
FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVW a_base+0(FP), R2 MOVW a_base+0(FP), R2
MOVW a_len+4(FP), R0 MOVW a_len+4(FP), R0
MOVW b_base+12(FP), R3 MOVW b_base+12(FP), R3

View file

@ -14,6 +14,7 @@ TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-56
B cmpbody<>(SB) B cmpbody<>(SB)
TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56 TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56
FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVD a_base+0(FP), R2 MOVD a_base+0(FP), R2
MOVD a_len+8(FP), R0 MOVD a_len+8(FP), R0
MOVD b_base+24(FP), R3 MOVD b_base+24(FP), R3

View file

@ -40,6 +40,7 @@ cmp_ret:
RET RET
TEXT bytes·Compare(SB),NOSPLIT,$0-28 TEXT bytes·Compare(SB),NOSPLIT,$0-28
FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVW a_base+0(FP), R3 MOVW a_base+0(FP), R3
MOVW b_base+12(FP), R4 MOVW b_base+12(FP), R4
MOVW a_len+4(FP), R1 MOVW a_len+4(FP), R1

View file

@ -38,6 +38,7 @@ done:
RET RET
TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56 TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56
FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVD a_base+0(FP), R5 MOVD a_base+0(FP), R5
MOVD b_base+24(FP), R6 MOVD b_base+24(FP), R6
MOVD a_len+8(FP), R3 MOVD a_len+8(FP), R3

View file

@ -14,6 +14,7 @@ TEXT ·Compare(SB),NOSPLIT|NOFRAME,$0-56
BR cmpbody<>(SB) BR cmpbody<>(SB)
TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56 TEXT bytes·Compare(SB),NOSPLIT|NOFRAME,$0-56
FUNCDATA $0, ·Compare·args_stackmap(SB)
MOVD a_base+0(FP), R3 MOVD a_base+0(FP), R3
MOVD a_len+8(FP), R4 MOVD a_len+8(FP), R4
MOVD b_base+24(FP), R5 MOVD b_base+24(FP), R5

View file

@ -16,6 +16,7 @@ TEXT ·Compare(SB), NOSPLIT, $0-56
RET RET
TEXT bytes·Compare(SB), NOSPLIT, $0-56 TEXT bytes·Compare(SB), NOSPLIT, $0-56
FUNCDATA $0, ·Compare·args_stackmap(SB)
Get SP Get SP
I64Load a_base+0(FP) I64Load a_base+0(FP)
I64Load a_len+8(FP) I64Load a_len+8(FP)

View file

@ -24,6 +24,7 @@ eq:
RET RET
TEXT bytes·Equal(SB),NOSPLIT,$0-25 TEXT bytes·Equal(SB),NOSPLIT,$0-25
FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVL a_len+4(FP), BX MOVL a_len+4(FP), BX
MOVL b_len+16(FP), CX MOVL b_len+16(FP), CX
CMPL BX, CX CMPL BX, CX

View file

@ -24,6 +24,7 @@ eq:
RET RET
TEXT bytes·Equal(SB),NOSPLIT,$0-49 TEXT bytes·Equal(SB),NOSPLIT,$0-49
FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVQ a_len+8(FP), BX MOVQ a_len+8(FP), BX
MOVQ b_len+32(FP), CX MOVQ b_len+32(FP), CX
CMPQ BX, CX CMPQ BX, CX

View file

@ -25,6 +25,7 @@ eq:
RET RET
TEXT bytes·Equal(SB),NOSPLIT,$0-25 TEXT bytes·Equal(SB),NOSPLIT,$0-25
FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVL a_len+4(FP), BX MOVL a_len+4(FP), BX
MOVL b_len+16(FP), CX MOVL b_len+16(FP), CX
CMPL BX, CX CMPL BX, CX

View file

@ -36,6 +36,7 @@ equal:
RET RET
TEXT bytes·Equal(SB),NOSPLIT,$0-25 TEXT bytes·Equal(SB),NOSPLIT,$0-25
FUNCDATA $0, ·Equal·args_stackmap(SB)
JMP ·Equal(SB) JMP ·Equal(SB)
// memequal(a, b unsafe.Pointer, size uintptr) bool // memequal(a, b unsafe.Pointer, size uintptr) bool

View file

@ -26,6 +26,7 @@ not_equal:
RET RET
TEXT bytes·Equal(SB),NOSPLIT,$0-49 TEXT bytes·Equal(SB),NOSPLIT,$0-49
FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVD a_len+8(FP), R1 MOVD a_len+8(FP), R1
MOVD b_len+32(FP), R3 MOVD b_len+32(FP), R3
CMP R1, R3 CMP R1, R3

View file

@ -36,6 +36,7 @@ equal:
RET RET
TEXT bytes·Equal(SB),NOSPLIT,$0-49 TEXT bytes·Equal(SB),NOSPLIT,$0-49
FUNCDATA $0, ·Equal·args_stackmap(SB)
JMP ·Equal(SB) JMP ·Equal(SB)
// memequal(a, b unsafe.Pointer, size uintptr) bool // memequal(a, b unsafe.Pointer, size uintptr) bool

View file

@ -36,6 +36,7 @@ equal:
RET RET
TEXT bytes·Equal(SB),NOSPLIT,$0-25 TEXT bytes·Equal(SB),NOSPLIT,$0-25
FUNCDATA $0, ·Equal·args_stackmap(SB)
JMP ·Equal(SB) JMP ·Equal(SB)
// memequal(a, b unsafe.Pointer, size uintptr) bool // memequal(a, b unsafe.Pointer, size uintptr) bool

View file

@ -29,6 +29,7 @@ equal:
RET RET
TEXT bytes·Equal(SB),NOSPLIT,$0-49 TEXT bytes·Equal(SB),NOSPLIT,$0-49
FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVD a_len+8(FP), R4 MOVD a_len+8(FP), R4
MOVD b_len+32(FP), R5 MOVD b_len+32(FP), R5
CMP R5, R4 // unequal lengths are not equal CMP R5, R4 // unequal lengths are not equal

View file

@ -18,6 +18,7 @@ notequal:
RET RET
TEXT bytes·Equal(SB),NOSPLIT|NOFRAME,$0-49 TEXT bytes·Equal(SB),NOSPLIT|NOFRAME,$0-49
FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVD a_len+8(FP), R2 MOVD a_len+8(FP), R2
MOVD b_len+32(FP), R6 MOVD b_len+32(FP), R6
MOVD a_base+0(FP), R3 MOVD a_base+0(FP), R3

View file

@ -26,6 +26,7 @@ TEXT ·Equal(SB), NOSPLIT, $0-49
RET RET
TEXT bytes·Equal(SB), NOSPLIT, $0-49 TEXT bytes·Equal(SB), NOSPLIT, $0-49
FUNCDATA $0, ·Equal·args_stackmap(SB)
MOVD a_len+8(FP), R0 MOVD a_len+8(FP), R0
MOVD b_len+32(FP), R1 MOVD b_len+32(FP), R1
Get R0 Get R0

View file

@ -34,7 +34,9 @@ TEXT ·IndexByteString(SB),NOSPLIT,$0-16
RET RET
TEXT bytes·IndexByte(SB),NOSPLIT,$0-20 TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
FUNCDATA $0, ·IndexByte·args_stackmap(SB)
JMP ·IndexByte(SB) JMP ·IndexByte(SB)
TEXT strings·IndexByte(SB),NOSPLIT,$0-16 TEXT strings·IndexByte(SB),NOSPLIT,$0-16
FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
JMP ·IndexByteString(SB) JMP ·IndexByteString(SB)

View file

@ -28,6 +28,7 @@ TEXT ·IndexByteString(SB), NOSPLIT, $0-32
// but involves no call overhead. // but involves no call overhead.
// TODO: remove this hack when midstack inlining is enabled? // TODO: remove this hack when midstack inlining is enabled?
TEXT bytes·IndexByte(SB), NOSPLIT, $0-40 TEXT bytes·IndexByte(SB), NOSPLIT, $0-40
FUNCDATA $0, ·IndexByte·args_stackmap(SB)
MOVQ b_base+0(FP), SI MOVQ b_base+0(FP), SI
MOVQ b_len+8(FP), BX MOVQ b_len+8(FP), BX
MOVB c+24(FP), AL MOVB c+24(FP), AL
@ -35,6 +36,7 @@ TEXT bytes·IndexByte(SB), NOSPLIT, $0-40
JMP indexbytebody<>(SB) JMP indexbytebody<>(SB)
TEXT strings·IndexByte(SB), NOSPLIT, $0-32 TEXT strings·IndexByte(SB), NOSPLIT, $0-32
FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
MOVQ s_base+0(FP), SI MOVQ s_base+0(FP), SI
MOVQ s_len+8(FP), BX MOVQ s_len+8(FP), BX
MOVB c+16(FP), AL MOVB c+16(FP), AL

View file

@ -22,6 +22,7 @@ TEXT ·IndexByteString(SB),NOSPLIT,$0-20
RET RET
TEXT bytes·IndexByte(SB),NOSPLIT,$0-20 TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
FUNCDATA $0, ·IndexByte·args_stackmap(SB)
MOVL b_base+0(FP), SI MOVL b_base+0(FP), SI
MOVL b_len+4(FP), BX MOVL b_len+4(FP), BX
MOVB c+12(FP), AL MOVB c+12(FP), AL
@ -30,6 +31,7 @@ TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
RET RET
TEXT strings·IndexByte(SB),NOSPLIT,$0-20 TEXT strings·IndexByte(SB),NOSPLIT,$0-20
FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
MOVL s_base+0(FP), SI MOVL s_base+0(FP), SI
MOVL s_len+4(FP), BX MOVL s_len+4(FP), BX
MOVB c+8(FP), AL MOVB c+8(FP), AL

View file

@ -54,7 +54,9 @@ _sib_notfound:
RET RET
TEXT bytes·IndexByte(SB),NOSPLIT,$0-20 TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
FUNCDATA $0, ·IndexByte·args_stackmap(SB)
JMP ·IndexByte(SB) JMP ·IndexByte(SB)
TEXT strings·IndexByte(SB),NOSPLIT,$0-16 TEXT strings·IndexByte(SB),NOSPLIT,$0-16
FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
JMP ·IndexByteString(SB) JMP ·IndexByteString(SB)

View file

@ -19,6 +19,7 @@ TEXT ·IndexByteString(SB),NOSPLIT,$0-32
B indexbytebody<>(SB) B indexbytebody<>(SB)
TEXT bytes·IndexByte(SB),NOSPLIT,$0-40 TEXT bytes·IndexByte(SB),NOSPLIT,$0-40
FUNCDATA $0, ·IndexByte·args_stackmap(SB)
MOVD b_base+0(FP), R0 MOVD b_base+0(FP), R0
MOVD b_len+8(FP), R2 MOVD b_len+8(FP), R2
MOVBU c+24(FP), R1 MOVBU c+24(FP), R1
@ -26,6 +27,7 @@ TEXT bytes·IndexByte(SB),NOSPLIT,$0-40
B indexbytebody<>(SB) B indexbytebody<>(SB)
TEXT strings·IndexByte(SB),NOSPLIT,$0-32 TEXT strings·IndexByte(SB),NOSPLIT,$0-32
FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
MOVD s_base+0(FP), R0 MOVD s_base+0(FP), R0
MOVD s_len+8(FP), R2 MOVD s_len+8(FP), R2
MOVBU c+16(FP), R1 MOVBU c+16(FP), R1

View file

@ -54,7 +54,9 @@ notfound:
RET RET
TEXT bytes·IndexByte(SB),NOSPLIT,$0-40 TEXT bytes·IndexByte(SB),NOSPLIT,$0-40
FUNCDATA $0, ·IndexByte·args_stackmap(SB)
JMP ·IndexByte(SB) JMP ·IndexByte(SB)
TEXT strings·IndexByte(SB),NOSPLIT,$0-32 TEXT strings·IndexByte(SB),NOSPLIT,$0-32
FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
JMP ·IndexByteString(SB) JMP ·IndexByteString(SB)

View file

@ -52,7 +52,9 @@ notfound:
RET RET
TEXT bytes·IndexByte(SB),NOSPLIT,$0-20 TEXT bytes·IndexByte(SB),NOSPLIT,$0-20
FUNCDATA $0, ·IndexByte·args_stackmap(SB)
JMP ·IndexByte(SB) JMP ·IndexByte(SB)
TEXT strings·IndexByte(SB),NOSPLIT,$0-16 TEXT strings·IndexByte(SB),NOSPLIT,$0-16
FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
JMP ·IndexByteString(SB) JMP ·IndexByteString(SB)

View file

@ -22,6 +22,7 @@ TEXT ·IndexByteString(SB),NOSPLIT|NOFRAME,$0-32
BR indexbytebody<>(SB) BR indexbytebody<>(SB)
TEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40 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_base+0(FP), R3 // R3 = byte array pointer
MOVD b_len+8(FP), R4 // R4 = length MOVD b_len+8(FP), R4 // R4 = length
MOVBZ c+24(FP), R5 // R5 = byte MOVBZ c+24(FP), R5 // R5 = byte
@ -29,6 +30,7 @@ TEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40
BR indexbytebody<>(SB) BR indexbytebody<>(SB)
TEXT strings·IndexByte(SB),NOSPLIT|NOFRAME,$0-32 TEXT strings·IndexByte(SB),NOSPLIT|NOFRAME,$0-32
FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
MOVD s_base+0(FP), R3 // R3 = string MOVD s_base+0(FP), R3 // R3 = string
MOVD s_len+8(FP), R4 // R4 = length MOVD s_len+8(FP), R4 // R4 = length
MOVBZ c+16(FP), R5 // R5 = byte MOVBZ c+16(FP), R5 // R5 = byte

View file

@ -20,6 +20,7 @@ TEXT ·IndexByteString(SB),NOSPLIT|NOFRAME,$0-32
BR indexbytebody<>(SB) BR indexbytebody<>(SB)
TEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40 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_base+0(FP), R3// b_base => R3
MOVD b_len+8(FP), R4 // b_len => R4 MOVD b_len+8(FP), R4 // b_len => R4
MOVBZ c+24(FP), R5 // c => R5 MOVBZ c+24(FP), R5 // c => R5
@ -27,6 +28,7 @@ TEXT bytes·IndexByte(SB),NOSPLIT|NOFRAME,$0-40
BR indexbytebody<>(SB) BR indexbytebody<>(SB)
TEXT strings·IndexByte(SB),NOSPLIT|NOFRAME,$0-32 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_base+0(FP), R3// s_base => R3
MOVD s_len+8(FP), R4 // s_len => R4 MOVD s_len+8(FP), R4 // s_len => R4
MOVBZ c+16(FP), R5 // c => R5 MOVBZ c+16(FP), R5 // c => R5

View file

@ -50,6 +50,7 @@ TEXT ·IndexByteString(SB), NOSPLIT, $0-32
RET RET
TEXT bytes·IndexByte(SB), NOSPLIT, $0-40 TEXT bytes·IndexByte(SB), NOSPLIT, $0-40
FUNCDATA $0, ·IndexByte·args_stackmap(SB)
Get SP Get SP
I64Load b_base+0(FP) I64Load b_base+0(FP)
I32WrapI64 I32WrapI64
@ -72,6 +73,7 @@ TEXT bytes·IndexByte(SB), NOSPLIT, $0-40
RET RET
TEXT strings·IndexByte(SB), NOSPLIT, $0-32 TEXT strings·IndexByte(SB), NOSPLIT, $0-32
FUNCDATA $0, ·IndexByteString·args_stackmap(SB)
Get SP Get SP
I64Load s_base+0(FP) I64Load s_base+0(FP)
I32WrapI64 I32WrapI64

View file

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