From bbbd9518e88c8c9d74d2b0f29f0d19b3b22338a1 Mon Sep 17 00:00:00 2001 From: Michael McLoughlin Date: Tue, 18 Dec 2018 01:36:47 -0800 Subject: [PATCH] go/analysis/passes/asmdecl: fix array offsets Array offsets in recursive structures do not include the accumulated offset. This diff fixes the mistake and adds a test. Fixes golang/go#29318 Change-Id: Iaa2a2f9404e4ed0e38b87e5e041709c1a8e25809 Reviewed-on: https://go-review.googlesource.com/c/154665 Reviewed-by: Josh Bleecher Snyder Run-TryBot: Josh Bleecher Snyder --- go/analysis/passes/asmdecl/asmdecl.go | 2 +- go/analysis/passes/asmdecl/testdata/src/a/asm.go | 1 + go/analysis/passes/asmdecl/testdata/src/a/asm1.s | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/go/analysis/passes/asmdecl/asmdecl.go b/go/analysis/passes/asmdecl/asmdecl.go index 53117efd..dce1ef7b 100644 --- a/go/analysis/passes/asmdecl/asmdecl.go +++ b/go/analysis/passes/asmdecl/asmdecl.go @@ -490,7 +490,7 @@ func appendComponentsRecursive(arch *asmArch, t types.Type, cc []component, suff offsets := arch.sizes.Offsetsof(fields) elemoff := int(offsets[1]) for i := 0; i < int(tu.Len()); i++ { - cc = appendComponentsRecursive(arch, elem, cc, suffix+"_"+strconv.Itoa(i), i*elemoff) + cc = appendComponentsRecursive(arch, elem, cc, suffix+"_"+strconv.Itoa(i), off+i*elemoff) } } diff --git a/go/analysis/passes/asmdecl/testdata/src/a/asm.go b/go/analysis/passes/asmdecl/testdata/src/a/asm.go index 661e1a9f..ebe5d33c 100644 --- a/go/analysis/passes/asmdecl/testdata/src/a/asm.go +++ b/go/analysis/passes/asmdecl/testdata/src/a/asm.go @@ -41,6 +41,7 @@ func wrapper(x int) func f15271() (x uint32) func f17584(x float32, y complex64) +func f29318(x [2][2]uint64) func noframe1(x int32) func noframe2(x int32) diff --git a/go/analysis/passes/asmdecl/testdata/src/a/asm1.s b/go/analysis/passes/asmdecl/testdata/src/a/asm1.s index 60538e5c..4fa31a26 100644 --- a/go/analysis/passes/asmdecl/testdata/src/a/asm1.s +++ b/go/analysis/passes/asmdecl/testdata/src/a/asm1.s @@ -312,3 +312,9 @@ TEXT ·f17584(SB), NOSPLIT, $12 MOVSS y_real+4(FP), X0 MOVSS y_imag+8(FP), X0 RET + +// issue 29318 +TEXT ·f29318(SB), NOSPLIT, $32 + MOVQ x_0_1+8(FP), AX + MOVQ x_1_1+24(FP), CX + RET