6g: stack value zeroed before being written

100 views
Skip to first unread message

Dave Cheney

unread,
Nov 9, 2012, 8:19:59 PM11/9/12
to golang-dev
Consider the following program

http://play.golang.org/p/UN30W1GUC7

Both val and val2 appear to store 0 onto the stack, then overwrite
that value with the result

--- prog list "val" ---
0006 (/Users/dfc/devel/src/inl.go:9) TEXT val+0(SB),$8-8
0007 (/Users/dfc/devel/src/inl.go:10) MOVQ $1,BX
0008 (/Users/dfc/devel/src/inl.go:11) MOVQ $7,AX
0009 (/Users/dfc/devel/src/inl.go:11) MOVQ $0,.anon2+-8(SP)
0010 (/Users/dfc/devel/src/inl.go:11) ADDQ AX,BX
0011 (/Users/dfc/devel/src/inl.go:11) MOVQ BX,.anon2+-8(SP)
0012 (/Users/dfc/devel/src/inl.go:11) MOVQ .anon2+-8(SP),AX
0013 (/Users/dfc/devel/src/inl.go:12) MOVQ AX,.noname+0(FP)
0014 (/Users/dfc/devel/src/inl.go:12) RET ,

--- prog list "val2" ---
0015 (/Users/dfc/devel/src/inl.go:15) TEXT val2+0(SB),$8-8
0016 (/Users/dfc/devel/src/inl.go:16) MOVQ $1,BX
0017 (/Users/dfc/devel/src/inl.go:16) MOVQ $7,AX
0018 (/Users/dfc/devel/src/inl.go:16) MOVQ $0,.anon2+-8(SP)
0019 (/Users/dfc/devel/src/inl.go:16) ADDQ AX,BX
0020 (/Users/dfc/devel/src/inl.go:16) MOVQ BX,.anon2+-8(SP)
0021 (/Users/dfc/devel/src/inl.go:16) MOVQ .anon2+-8(SP),AX
0022 (/Users/dfc/devel/src/inl.go:17) MOVQ AX,.noname+0(FP)
0023 (/Users/dfc/devel/src/inl.go:17) RET ,

Am I missing something? Is there a reason for this ?

Cheers

Dave

Brad Fitzpatrick

unread,
Nov 9, 2012, 9:35:00 PM11/9/12
to Dave Cheney, golang-dev
Probably because the spec guarantees that all (named) result parameters are zero-initialized and the optimization to not zero them when all return parameter(s) are unnamed was just never implemented?

Dave Cheney

unread,
Nov 9, 2012, 10:42:16 PM11/9/12
to Brad Fitzpatrick, golang-dev
HI Brad,

I think you may be right about named parameters, using unnamed ones
generates different results, but still includes a zeroing operation.

http://play.golang.org/p/pbsvHG3tqK

--- prog list "named" ---
0006 (/Users/dfc/devel/src/inl.go:9) TEXT named+0(SB),$8-8
0007 (/Users/dfc/devel/src/inl.go:10) MOVQ $1,BX
0008 (/Users/dfc/devel/src/inl.go:11) MOVQ $7,AX
0009 (/Users/dfc/devel/src/inl.go:11) MOVQ $0,.anon2+-8(SP)
0010 (/Users/dfc/devel/src/inl.go:11) ADDQ AX,BX
0011 (/Users/dfc/devel/src/inl.go:11) MOVQ BX,.anon2+-8(SP)
0012 (/Users/dfc/devel/src/inl.go:11) MOVQ .anon2+-8(SP),AX
0013 (/Users/dfc/devel/src/inl.go:12) MOVQ AX,.noname+0(FP)
0014 (/Users/dfc/devel/src/inl.go:12) RET ,

--- prog list "unnamed" ---
0015 (/Users/dfc/devel/src/inl.go:15) TEXT unnamed+0(SB),$8-8
0016 (/Users/dfc/devel/src/inl.go:16) MOVQ $1,BX
0017 (/Users/dfc/devel/src/inl.go:17) MOVQ $7,AX
0018 (/Users/dfc/devel/src/inl.go:17) MOVQ $0,.anon2+-8(SP)
0019 (/Users/dfc/devel/src/inl.go:17) ADDQ AX,BX
0020 (/Users/dfc/devel/src/inl.go:17) MOVQ BX,AX
0021 (/Users/dfc/devel/src/inl.go:17) MOVQ BX,.anon2+-8(SP)
0022 (/Users/dfc/devel/src/inl.go:17) MOVQ .anon2+-8(SP),BX
0023 (/Users/dfc/devel/src/inl.go:17) MOVQ BX,.noname+0(FP)
0024 (/Users/dfc/devel/src/inl.go:17) RET ,

Cheers

Dave

Brad Fitzpatrick

unread,
Nov 9, 2012, 10:51:23 PM11/9/12
to Dave Cheney, golang-dev
I was actually talking about the function's result parameters.  Compare:

func add(a, b int) int {
return a + b
}

func add2(a, b int) (z int) {
return a + b
}

--- prog list "add" ---
0000 (named.go:3) TEXT    add+0(SB),$0-24
0001 (named.go:4) MOVQ    a+0(FP),BX
0002 (named.go:4) MOVQ    b+8(FP),BP
0003 (named.go:4) ADDQ    BP,BX
0004 (named.go:4) MOVQ    BX,.noname+16(FP)
0005 (named.go:4) RET     ,

--- prog list "add2" ---
0006 (named.go:7) TEXT    add2+0(SB),$0-24
0007 (named.go:8) MOVQ    a+0(FP),BX
0008 (named.go:8) MOVQ    b+8(FP),BP
0009 (named.go:7) MOVQ    $0,AX
0010 (named.go:8) ADDQ    BP,BX
0011 (named.go:8) MOVQ    BX,z+16(FP)
0012 (named.go:8) RET     ,

Dave Cheney

unread,
Nov 10, 2012, 1:04:03 AM11/10/12
to Brad Fitzpatrick, golang-dev

minux

unread,
Nov 10, 2012, 11:09:59 AM11/10/12
to Brad Fitzpatrick, Dave Cheney, golang-dev
On Sat, Nov 10, 2012 at 11:51 AM, Brad Fitzpatrick <brad...@golang.org> wrote:
I was actually talking about the function's result parameters.  Compare:

func add(a, b int) int {
return a + b
}

func add2(a, b int) (z int) {
return a + b
}

--- prog list "add" ---
0000 (named.go:3) TEXT    add+0(SB),$0-24
0001 (named.go:4) MOVQ    a+0(FP),BX
0002 (named.go:4) MOVQ    b+8(FP),BP
0003 (named.go:4) ADDQ    BP,BX
0004 (named.go:4) MOVQ    BX,.noname+16(FP)
0005 (named.go:4) RET     ,

--- prog list "add2" ---
0006 (named.go:7) TEXT    add2+0(SB),$0-24
0007 (named.go:8) MOVQ    a+0(FP),BX
0008 (named.go:8) MOVQ    b+8(FP),BP
0009 (named.go:7) MOVQ    $0,AX
why move $0 to AX here? 

Russ Cox

unread,
Nov 10, 2012, 4:36:37 PM11/10/12
to Brad Fitzpatrick, Dave Cheney, golang-dev
On Fri, Nov 9, 2012 at 9:35 PM, Brad Fitzpatrick <brad...@golang.org> wrote:
> Probably because the spec guarantees that all (named) result parameters are
> zero-initialized and the optimization to not zero them when all return
> parameter(s) are unnamed was just never implemented?

What Brad said - named results have to be zeroed. If they were unnamed
they wouldn't be zeroed, but we just named them all (.anon1 etc) to
make either inlining or escape analysis work better. Feel free to file
an issue.

Russ

Dave Cheney

unread,
Nov 10, 2012, 4:48:31 PM11/10/12
to Russ Cox, Brad Fitzpatrick, golang-dev
Thanks for your reply Russ. I reverted back to 68b7e3a03f39, which I
believe was before the local var annotation change and it has not
changed the output.

Was https://code.google.com/p/go/source/detail?r=25dcee3d220cbbf9a025bbb2e57983ba5caeeeea
the change you were referring too ?

Cheers

Dave

Luuk van Dijk

unread,
Nov 10, 2012, 5:11:13 PM11/10/12
to Dave Cheney, Russ Cox, Brad Fitzpatrick, golang-dev
Reply all
Reply to author
Forward
0 new messages