Hi, all

We post this message for someone who might be put in a great
quandary like us.

Please look at the sample codes:

============================================================
#define NR_TEST_FUNCS 2
typedef code struct test_funcs {
 void (*non)(void);
} test_funcs_c;

test_funcs_c * data test_funcs[NR_TEST_FUNCS];
uint8_t nr_test_funcs = 0;

void register_test_func(test_funcs_c *funcs)
{
 if (nr_test_funcs < NR_TEST_FUNCS-1) {
  test_funcs[nr_test_funcs] = funcs;
  nr_test_funcs++;
 }
}

void test_non(void)
{
 dbg_dump(1);
}

test_funcs_c funcs1 = {
 test_non,
};

test_funcs_c funcs2 = {
 test_non,
};

static void test_funcs_ptr(void)
{
 uint8_t i;
 test_funcs_c *p;

 register_test_func(&funcs1);
 register_test_func(&funcs2);

 for (i = 0; i < nr_test_funcs; i++) {
  /* the way can work */
  p = test_funcs[i];
  (p->non)();

#if 0
  /* the way cannot work */
  (test_funcs[i]->non)();
#endif
 }
}
============================================================

It seems a compiler bug, compiler cannot generate correct
codes for structure member location in the latter one.
Please look at the generated codes for the differences:

============================================================
;       p = test_funcs[i];
        mov     a,r2
        add     a,r2
        add     a,#_test_funcs
        mov     r0,a
        mov     ar3,@r0
        inc     r0
        mov     ar4,@r0
        dec     r0
        mov     dpl,r3
        mov     dph,r4
;       (p->non)();
        clr     a
        movc    a,@a+dptr
        mov     r3,a
        inc     dptr
        clr     a
        movc    a,@a+dptr
        mov     r4,a
        push    ar2
        push    ar3
        push    ar4
        mov     dpl,r3
        mov     dph,r4
        lcall   __sdcc_call_dptr
        pop     ar4
        pop     ar3
        pop     ar2
============================================================
;       (test_funcs[i]->non)();
        mov     a,r2
        add     a,r2
        add     a,#_test_funcs
        mov     r0,a
        mov     ar0,@r0
        mov     ar3,@r0
        inc     r0
        mov     ar4,@r0
        dec     r0
        push    ar2
        push    ar3
        push    ar4
        mov     dpl,r3
        mov     dph,r4
        lcall   __sdcc_call_dptr
        pop     ar4
        pop     ar3
        pop     ar2
============================================================

Best regards/Lv Zheng


------------------------------------------------------------------------------
Enter the BlackBerry Developer Challenge  
This is your chance to win up to $100,000 in prizes! For a limited time, 
vendors submitting new applications to BlackBerry App World(TM) will have
the opportunity to enter the BlackBerry Developer Challenge. See full prize  
details at: http://p.sf.net/sfu/Challenge
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to