]> git.lizzy.rs Git - plan9front.git/commit
8c: fix double compiling FNX complex lvalue in cgen64()
authorcinap_lenrek <cinap_lenrek@felloff.net>
Sun, 30 Oct 2016 22:30:13 +0000 (23:30 +0100)
committercinap_lenrek <cinap_lenrek@felloff.net>
Sun, 30 Oct 2016 22:30:13 +0000 (23:30 +0100)
commit95609d520e31f3f2262764b14b8016ca940af01d
tree7944431a996af63b5320f181ad75e35e45f1ad4c
parent62d310864669b0277e9ab506f0cf217c0a16b0dd
8c: fix double compiling FNX complex lvalue in cgen64()

sugen() calls cgen64() speculatively so that when cgen64() returns
zero, it will fall back and compile 64-bit copy.

the bug was that cgen64() compiled the left hand side and then recursively
called cgen64() again, which didnt handle the memory copy so it returned
zero and sugen() would compile the left hand side again resulting in two
function calls being emited.

some code that reproduced the issue:

#include <u.h>
#include <libc.h>

typedef struct
{
char x[10];
vlong a;
} X;

X a;
X *f(void) { return &a; }

void
main(int argc, char *argv[])
{
f()->a = a.a;
}

producing:

TEXT f+0(SB),0,$0
MOVL $a+0(SB),AX
RET ,
RET ,
TEXT main+0(SB),0,$0
CALL ,f+0(SB)
CALL ,f+0(SB) <- bug
MOVL AX,CX
LEAL a+12(SB),DX
MOVL (DX),AX
MOVL AX,12(CX)
MOVL 4(DX),AX
MOVL AX,16(CX)
RET ,
GLOBL a+0(SB),$20
END ,
sys/src/cmd/8c/cgen64.c