On Tue, Apr 6, 2010 at 7:37 AM, Anthony Asterisk <[email protected]
> wrote:

>  Hello SDCC-users,
>
>   While working on the contiki OS, I found a strange behavior in SDCC.  I
> noticed when a variable was cast as (void *) the generated code differed
> than if cast as (u8_t*).
>
> Here is the example demonstrating the issue:
>
>
>
> memset((*void **)(&nd6_opt_llao->addr) + UIP_LLADDR_LEN, 0,
> UIP_ND6_OPT_LLAO_LEN - 2 - UIP_LLADDR_LEN);
>
> vs
>
> memset((*u8_t **)(&nd6_opt_llao->addr) + UIP_LLADDR_LEN, 0,
> UIP_ND6_OPT_LLAO_LEN - 2 - UIP_LLADDR_LEN);
>
>
>
>
>
>                            1600 ;       ../../core/net/uip-nd6-io.c:344:
> memset((void *)(&nd6_opt_llao->addr) + UIP_LLADDR_LEN, 0,
> UIP_ND6_OPT_LLAO_LEN - 2 - UIP_LLADDR_LEN);
>
> The problem/differences comes at 1610 when indexing into nd6_opt_llao to
> reach addr.  In the (void *) version 0x02 is added, ignoring the addition of
> UIP_LLADDR_LEN.
>
>
Yes, I think it's a right behavior. Because the (void *) point is meant
nothing(compiler won't know what does it point to) so sizeof((void *
ptr)[0]) will be 0. As ptr + n actually  means ptr + n*sizeof(ptr[0]), the
code generated by SDCC is reasonable. void * pointer only make sense after
you convert it into concrete types.

In my memory, SDCC will give a warning on that. (in the asm file?)


>    05A9 90s00r01           1601         mov     dptr,#_nd6_opt_llao
>    05AC E0                 1602         movx    a,@dptr
>    05AD FA                 1603         mov     r2,a
>    05AE A3                 1604         inc     dptr
>    05AF E0                 1605         movx    a,@dptr
>    05B0 FB                 1606         mov     r3,a
>    05B1 A3                 1607         inc     dptr
>    05B2 E0                 1608         movx    a,@dptr
>    05B3 FC                 1609         mov     r4,a
>    05B4 74 02              1610         mov     a,#0x02
>    05B6 2A                 1611         add     a,r2
>    05B7 FA                 1612         mov     r2,a
>    05B8 E4                 1613         clr     a
>    05B9 3B                 1614         addc    a,r3
>    05BA FB                 1615         mov     r3,a
>    05BB 74 06              1616         mov     a,#0x06
>    05BD C0 E0              1617         push    acc
>    05BF E4                 1618         clr     a
>    05C0 C0 E0              1619         push    acc
>    05C2 E4                 1620         clr     a
>    05C3 C0 E0              1621         push    acc
>    05C5 8A 82              1622         mov     dpl,r2
>    05C7 8B 83              1623         mov     dph,r3
>    05C9 8C F0              1624         mov     b,r4
>    05CB 12s00r00           1625         lcall   _memset
>
> In the (u8_t *) version the correct offset for addr of 10 is used:
>
>                            1600 ;       ../../core/net/uip-nd6-io.c:344:
> memset((void *)(&nd6_opt_llao->addr) + UIP_LLADDR_LEN, 0,
> UIP_ND6_OPT_LLAO_LEN - 2 - UIP_LLADDR_LEN);
>    05A9 90s00r01           1601         mov     dptr,#_nd6_opt_llao
>    05AC E0                 1602         movx    a,@dptr
>    05AD FA                 1603         mov     r2,a
>    05AE A3                 1604         inc     dptr
>    05AF E0                 1605         movx    a,@dptr
>    05B0 FB                 1606         mov     r3,a
>    05B1 A3                 1607         inc     dptr
>    05B2 E0                 1608         movx    a,@dptr
>    05B3 FC                 1609         mov     r4,a
>    05B4 74 0A              1610         mov     a,#0x0A
>    05B6 2A                 1611         add     a,r2
>    05B7 FA                 1612         mov     r2,a
>    05B8 E4                 1613         clr     a
>    05B9 3B                 1614         addc    a,r3
>    05BA FB                 1615         mov     r3,a
>    05BB 74 06              1616         mov     a,#0x06
>    05BD C0 E0              1617         push    acc
>    05BF E4                 1618         clr     a
>    05C0 C0 E0              1619         push    acc
>    05C2 E4                 1620         clr     a
>    05C3 C0 E0              1621         push    acc
>    05C5 8A 82              1622         mov     dpl,r2
>    05C7 8B 83              1623         mov     dph,r3
>    05C9 8C F0              1624         mov     b,r4
>    05CB 12s00r00           1625         lcall   _memset
>
>
>
> I submitted a bug tracker report with the following example program:
>
> #include <string.h>
> #define UIP_LLADDR_LEN 8
>
> struct uip_802154_longaddr {
>   unsigned char addr[8];
> };
> typedef struct uip_802154_longaddr uip_lladdr_t;
>
> struct uip_nd6_opt_llao {
>   unsigned char type;
>   unsigned char len;
>   uip_lladdr_t addr;
> };
>
> static struct uip_nd6_opt_llao *nd6_opt_llao;
>
>
> void main (void)
> {
>   unsigned char buf[300];
>   nd6_opt_llao = (struct uip_nd6_opt_llao *)buf;
>   memset((unsigned char *)(&nd6_opt_llao->addr) + UIP_LLADDR_LEN, 0, 6);
> }
>
>
>
> ------------------------------------------------------------------------------
> Download Intel&#174; Parallel Studio Eval
> Try the new software tools for yourself. Speed compiling, find bugs
> proactively, and fine-tune applications for parallel performance.
> See why Intel Parallel Studio got high marks during beta.
> http://p.sf.net/sfu/intel-sw-dev
> _______________________________________________
> Sdcc-user mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/sdcc-user
>
>


-- 
Cheers,
Grissiom
------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
Sdcc-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to