Hi,

 

I think Oleg has identified a real problem.

Lets leave the question of "is this the best way to do it" aside and
realise that "this is the best way to reproduce the problem"!

 

The swap() function is not swapping pointers it is swapping the contents
of structures.

This is a valid operation and it produces some interesting code! 

Clearly the code attached is wrong.

 

Regards

Luke

 

 

-----Original Message-----
From: Roberto G. Berner [mailto:[email protected]] 
Sent: Thursday, 23 January 2003 4:36 AM
To: [email protected]
Subject: RE: [Mspgcc-users] Struct assignment BUG...

 

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 <mailto:[email protected]>  

        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
<mailto:[email protected]>  

                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 <mailto:[email protected]>


                        To: MSP430 GCC
<mailto:[email protected]>  

                        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.

                         

                         


____
This communication contains information which is confidential and the copyright 
of Nautronix. 

If you are not the intended recipient of this communication please delete and 
destroy all copies and advise Nautronix immediately. If you are the intended 
recipient of this communication you should not copy, disclose or distribute 
this communication without the prior authority of Nautronix. Any views 
expressed in this Communication are those of the individual sender, except 
where the sender specifically states them to be the views of Nautronix.

Except as required at law, Nautronix does not represent, warrant and/or 
guarantee that the integrity of this communication has been maintained nor that 
the communication is free of errors, virus, interception or interference.

Reply via email to