Dear Oleg:
Accept my apologies, but I think you should check this. If I am wrong, please
excuse me.
struct x{ /* struct of type x defined */
int a,b,c,d;
};
struct x *v[2]; /* array of 2 pointers to structures of type x - somewhere
initialized, OK ?*/
/* swap pointers, this means after call to swap(), v[0] holds the pointer to
v[1] and viceversa */
void swap(void) {
struct x tmp; /* this declaraction should be struct x *tmp , and not the
variable tmp of type struct x !!! */
tmp=*v[0]; /* tmp should be a pointer in order to hold pointers
properly */
*v[0]=*v[1];
*v[1]=tmp;
}
Kind regards,
Roberto G. Berner
[email protected]
[email protected]
4308 3500 tel
4308 3700 fax
15 5122 6095 cel
----- Original Message -----
From: Oleg Skydan
To: [email protected]
Sent: Wednesday, January 22, 2003 4:27 PM
Subject: Re: [Mspgcc-users] Struct assignment BUG...
Dear Roberto,
The swap function exchanges the contents of the two structs,
pointed by elements of the array v, so there a significant BUG.
I have omitted the initialization section for simplicity (I have found this
BUG in
a real program, which is very large).
Anyway the stack pointer should point to the same location at the function
exit and entry (unless it is explicitly changed, using asm statement for
example).
Thanks,
Oleg.
----- Original Message -----
From: Roberto G. Berner
To: [email protected]
Sent: Wednesday, January 22, 2003 6:25 PM
Subject: RE: [Mspgcc-users] Struct assignment BUG...
Dear Oleg:
I think that there is no bug. Should I suggest trying ...
struct x *tmp;
Kind regards,
Roberto G. Berner
[email protected]
[email protected]
4308 3500 tel
4308 3700 fax
15 5122 6095 cel
----- Original Message -----
From: Oleg Skydan
To: MSP430 GCC
Sent: Wednesday, January 22, 2003 12:12 PM
Subject: [Mspgcc-users] Struct assignment BUG...
Hello, All !
I found a significant BUG when using struct assignment.
Here is the sample:
struct x{
int a,b,c,d;
};
struct x *v[2];
void swap(void)
{
struct x tmp;
tmp=*v[0];
*v[0]=*v[1];
*v[1]=tmp;
}
And here is GCC's listing (with -O option):
/***********************
* Function `swap'
***********************/
swap:
/* prologue: frame size = 8 */
.L__FrameSize_swap=0x8
.L__FrameOffset_swap=0x8
sub #8, r1 ; 8, fpn 0
/* prologue end (size=1) */
mov &v, r15
mov @r15+, @r1
mov @r15+, 2(r1)
mov @r15+, 4(r1)
mov @r15+, 6(r1)
mov &v+2, r14
mov @r14+, 0(r15)
mov @r14+, 2(r15)
mov @r14+, 4(r15)
mov @r14+, 6(r15)
mov &v+2, r15
mov @r1+, 0(r15) ;We should not change the stack pointer here !
mov @r1+, 2(r15)
mov @r1+, 4(r15)
mov @r1+, 6(r15)
/* epilogue: frame size=8 */
add #8, r1 ;After this command the stack pointer
points to the illegal location !
ret
/* epilogue end (size=2) */
/* function swap size 33 (30) */
I use win32 version (from 10.12.2002).
Thanks, Oleg.