My program is broken because mspgcc 3.2.3 is generating
unaligned word accesses.  I'm calling memset() and memcpy()
fill in the fields in a packed struct.  Since I've requested a
2-byte copy/set mspgcc is optimizing some of those memset() and
memcpy() calls into mov.w instructions, but the destination
address isn't word aligned, so the generated code is not
correct.

Here's a sample program that demonstrates the memset() bug.


  $ msp430-gcc --version
  msp430-gcc (GCC) 3.2.3
  Copyright (C) 2002 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions. There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


------------------------------bug.c------------------------------
struct foo
  {
    unsigned char b1;
    unsigned      u;
    unsigned char b2;
  } __attribute__((__packed__));

struct foo foo;


void bar(void)
{
  memset(&foo.u, 0x55, 2);
}
  
------------------------------bug.c------------------------------

  $ msp430-gcc -mmcu=msp430x148 -c -O3 -S bug.c

------------------------------bug.s------------------------------
        .file   "bug.c"
        .arch msp430x148
[...]

bar:
/* prologue: frame size = 0 */
.L__FrameSize_bar=0x0
.L__FrameOffset_bar=0x0
/* prologue end (size=0) */
        mov     #llo(21845), &foo+1 
        ret
/* epilogue: not required */
/* function bar size 4 (3) */
.Lfe1:
        .size   bar,.Lfe1-bar
/********* End of function ******/

        .comm foo,4,2
[...]
------------------------------bug.s------------------------------

Has this been fixed in newer versions?

-- 
Grant Edwards                   grante             Yow!  A dwarf is passing
                                  at               out somewhere in Detroit!
                               visi.com            


Reply via email to