aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLynn Boger <laboger@linux.vnet.ibm.com>2021-08-20 07:01:50 -0500
committerLynn Boger <laboger@linux.vnet.ibm.com>2021-08-23 15:27:42 +0000
commitf1d8ea1da3ef814ea57b545fc967865640a868ab (patch)
treed03d0e27a197d8c0504a57c2bc1f1f1a0c1f0591
parent4fbb5c8666eef0267704dd074763442efb2f7c4a (diff)
downloadgo-f1d8ea1da3ef814ea57b545fc967865640a868ab.tar.gz
go-f1d8ea1da3ef814ea57b545fc967865640a868ab.zip
reflect: fix memmove for big endian cases with new ABI
Some memmoves in reflect/value.go for copying arguments related to the new ABI were using the address of the target or source instead of using IntArgRegAddr or FloatArgRegAddr to adjust the address for big endian. This was found when testing patches for ppc64 and fixes the failures that were found. Change-Id: I119aa090a2a8eb859020ff1a1736107a6d0b76f1 Reviewed-on: https://go-review.googlesource.com/c/go/+/343869 Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com> Trust: Michael Knyszek <mknyszek@google.com> Trust: Lynn Boger <laboger@linux.vnet.ibm.com>
-rw-r--r--src/reflect/value.go16
1 files changed, 8 insertions, 8 deletions
diff --git a/src/reflect/value.go b/src/reflect/value.go
index e641a7957c..de01f13825 100644
--- a/src/reflect/value.go
+++ b/src/reflect/value.go
@@ -508,7 +508,7 @@ func (v Value) call(op string, in []Value) []Value {
// Copy values to "integer registers."
if v.flag&flagIndir != 0 {
offset := add(v.ptr, st.offset, "precomputed value offset")
- memmove(unsafe.Pointer(&regArgs.Ints[st.ireg]), offset, st.size)
+ memmove(regArgs.IntRegArgAddr(st.ireg, st.size), offset, st.size)
} else {
if st.kind == abiStepPointer {
// Duplicate this pointer in the pointer area of the
@@ -524,7 +524,7 @@ func (v Value) call(op string, in []Value) []Value {
panic("attempted to copy pointer to FP register")
}
offset := add(v.ptr, st.offset, "precomputed value offset")
- memmove(unsafe.Pointer(&regArgs.Floats[st.freg]), offset, st.size)
+ memmove(regArgs.FloatRegArgAddr(st.freg, st.size), offset, st.size)
default:
panic("unknown ABI part kind")
}
@@ -610,13 +610,13 @@ func (v Value) call(op string, in []Value) []Value {
switch st.kind {
case abiStepIntReg:
offset := add(s, st.offset, "precomputed value offset")
- memmove(offset, unsafe.Pointer(&regArgs.Ints[st.ireg]), st.size)
+ memmove(offset, regArgs.IntRegArgAddr(st.ireg, st.size), st.size)
case abiStepPointer:
s := add(s, st.offset, "precomputed value offset")
*((*unsafe.Pointer)(s)) = regArgs.Ptrs[st.ireg]
case abiStepFloatReg:
offset := add(s, st.offset, "precomputed value offset")
- memmove(offset, unsafe.Pointer(&regArgs.Floats[st.freg]), st.size)
+ memmove(offset, regArgs.FloatRegArgAddr(st.freg, st.size), st.size)
case abiStepStack:
panic("register-based return value has stack component")
default:
@@ -698,13 +698,13 @@ func callReflect(ctxt *makeFuncImpl, frame unsafe.Pointer, retValid *bool, regs
switch st.kind {
case abiStepIntReg:
offset := add(v.ptr, st.offset, "precomputed value offset")
- memmove(offset, unsafe.Pointer(&regs.Ints[st.ireg]), st.size)
+ memmove(offset, regs.IntRegArgAddr(st.ireg, st.size), st.size)
case abiStepPointer:
s := add(v.ptr, st.offset, "precomputed value offset")
*((*unsafe.Pointer)(s)) = regs.Ptrs[st.ireg]
case abiStepFloatReg:
offset := add(v.ptr, st.offset, "precomputed value offset")
- memmove(offset, unsafe.Pointer(&regs.Floats[st.freg]), st.size)
+ memmove(offset, regs.FloatRegArgAddr(st.freg, st.size), st.size)
case abiStepStack:
panic("register-based return value has stack component")
default:
@@ -784,7 +784,7 @@ func callReflect(ctxt *makeFuncImpl, frame unsafe.Pointer, retValid *bool, regs
// Copy values to "integer registers."
if v.flag&flagIndir != 0 {
offset := add(v.ptr, st.offset, "precomputed value offset")
- memmove(unsafe.Pointer(&regs.Ints[st.ireg]), offset, st.size)
+ memmove(regs.IntRegArgAddr(st.ireg, st.size), offset, st.size)
} else {
// Only populate the Ints space on the return path.
// This is safe because out is kept alive until the
@@ -799,7 +799,7 @@ func callReflect(ctxt *makeFuncImpl, frame unsafe.Pointer, retValid *bool, regs
panic("attempted to copy pointer to FP register")
}
offset := add(v.ptr, st.offset, "precomputed value offset")
- memmove(unsafe.Pointer(&regs.Floats[st.freg]), offset, st.size)
+ memmove(regs.FloatRegArgAddr(st.freg, st.size), offset, st.size)
default:
panic("unknown ABI part kind")
}