[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-gcc-list] avr-gcc 3.4.3 confused about function pointers
From: |
John Regehr |
Subject: |
Re: [avr-gcc-list] avr-gcc 3.4.3 confused about function pointers |
Date: |
Sun, 16 Apr 2006 18:47:49 -0600 |
User-agent: |
Thunderbird 1.5 (X11/20060111) |
> You'll have to come up with a test program that's cleverer than that.
You're right. The attached program displays the same bug when compiled
by avr-gcc 4.0.3 with:
avr-gcc -mmcu=atmega128 -Os
I didn't go to as much trouble minimizing the program size this time.
The problematic object code is in OS_BackendM_xx_StdControl_xx_init.
I haven't tried gcc 4.1.0 since it doesn't compile for me.
John Regehr
typedef unsigned char uint8_t___0;
typedef unsigned long uint32_t;
typedef uint8_t___0 result_t;
typedef struct user_event user_event;
struct meta_fseqp_void
{
void *_e;
};
struct fseqp_void
{
void *_p;
struct meta_fseqp_void _ms;
};
typedef struct fseqp_void fseqp_void;
result_t UntrustedTimerM_xx_Timer_xx_start (uint8_t___0 id, char type,
uint32_t interval);
uint8_t___0 UntrustedTimerM_xx_proc_id;
struct fseqp_void OS_WrapperM_xx_OS_Calls_sf[32];
struct fseqp_void OS_BackendM_xx_OS_Calls_sf[32];
int OS_BackendM_xx_num_user_procs = 0;
fseqp_void
OS_WrapperM_xx_OS_Wrapper_xx_get_OS_call_f (int call_id)
{
void *__retres;
void *__cil_tmp3;
fseqp_void __cil_tmp4;
{
__cil_tmp3 = OS_WrapperM_xx_OS_Calls_sf[call_id]._p;
__retres = __cil_tmp3;
__cil_tmp4._p = __retres;
return (__cil_tmp4);
}
}
struct fseqp_void
UntrustedLedsC_xx_OS_Wrapper_xx_get_OS_call_f (int arg_0x404385c0)
{
void *result;
void *__retres;
fseqp_void __cil_tmp4;
void *__cil_tmp5;
void *__cil_tmp6;
struct fseqp_void __cil_tmp7;
{
__cil_tmp4 = OS_WrapperM_xx_OS_Wrapper_xx_get_OS_call_f (arg_0x404385c0);
__cil_tmp5 = __cil_tmp4._p;
result = __cil_tmp5;
__cil_tmp6 = result;
__retres = __cil_tmp6;
__cil_tmp7._p = __retres;
return (__cil_tmp7);
}
}
result_t
OS_BackendM_xx_TIMER_start (uint8_t___0 proc_id, uint8_t___0 identifier,
char type, uint32_t interval)
{
return 0;
}
result_t
OS_BackendM_xx_StdControl_xx_init (void)
{
void *__cil_tmp19;
void *__cil_tmp19_e53;
{
__cil_tmp19 = (void *) (&OS_BackendM_xx_TIMER_start);
__cil_tmp19_e53 = (void *) (&OS_BackendM_xx_TIMER_start + 1);
OS_BackendM_xx_OS_Calls_sf[14]._ms._e = __cil_tmp19_e53;
OS_BackendM_xx_OS_Calls_sf[14]._p = __cil_tmp19;
}
return 0;
}
result_t
RealMain_xx_StdControl_xx_init (void)
{
result_t __cil_tmp9;
{
__cil_tmp9 = OS_BackendM_xx_StdControl_xx_init ();
}
return 0;
}
result_t
BlinkGreenM_xx_Timer_xx_start (char arg_0x40413c18, uint32_t arg_0x40413da0)
{
result_t __cil_tmp5;
{
__cil_tmp5 =
UntrustedTimerM_xx_Timer_xx_start ((unsigned char) 1, arg_0x40413c18,
arg_0x40413da0);
}
return 0;
}
result_t
BlinkGreenM_xx_StdControl_xx_start (void)
{
result_t __cil_tmp3;
{
__cil_tmp3 = BlinkGreenM_xx_Timer_xx_start ((char) 0, 1000UL);
}
return 0;
}
result_t
OS_BackendM_xx_OS_Backend_xx_table_init_qfq (struct fseqp_void *os_calls,
void *os_calls_b,
void *os_calls_e,
user_event * events_user,
void *events_user_b,
void *events_user_e)
{
uint8_t___0 i = 0;
void *__cil_tmp5;
{
if (OS_BackendM_xx_num_user_procs < 3)
{
while ((int) i < 32)
{
__cil_tmp5 = OS_BackendM_xx_OS_Calls_sf[i]._p;
(os_calls + (int) i)->_p = __cil_tmp5;
i = (unsigned char) ((int) i + 1);
}
}
}
return 0;
}
result_t
OS_WrapperM_xx_OS_Backend_xx_table_init_qfq (struct fseqp_void
*arg_0x4037db00,
void *arg_0x4037db00_b,
void *arg_0x4037db00_e,
user_event * arg_0x4037dcb8,
void *arg_0x4037dcb8_b,
void *arg_0x4037dcb8_e)
{
struct fseqp_void *__cil_tmp5;
user_event *__cil_tmp6 = 0;
result_t __cil_tmp7;
void *__cil_tmp5_b16 = 0;
void *__cil_tmp5_e17 = 0;
void *__cil_tmp6_b18 = 0;
void *__cil_tmp6_e19 = 0;
{
__cil_tmp5 = arg_0x4037db00;
__cil_tmp7 =
OS_BackendM_xx_OS_Backend_xx_table_init_qfq (__cil_tmp5, __cil_tmp5_b16,
__cil_tmp5_e17, __cil_tmp6,
__cil_tmp6_b18,
__cil_tmp6_e19);
}
return 0;
}
result_t
OS_WrapperM_xx_StdControl_xx_start (void)
{
struct fseqp_void *__cil_tmp3;
user_event *__cil_tmp4 = 0;
result_t __cil_tmp5;
void *__cil_tmp3_b8 = 0;
void *__cil_tmp3_e9 = 0;
void *__cil_tmp4_b10 = 0;
void *__cil_tmp4_e11 = 0;
{
__cil_tmp3 = OS_WrapperM_xx_OS_Calls_sf;
__cil_tmp5 =
OS_WrapperM_xx_OS_Backend_xx_table_init_qfq (__cil_tmp3, __cil_tmp3_b8,
__cil_tmp3_e9, __cil_tmp4,
__cil_tmp4_b10,
__cil_tmp4_e11);
}
return 0;
}
result_t
RealMain_xx_StdControl_xx_start (void)
{
result_t __cil_tmp13;
result_t __cil_tmp17;
{
__cil_tmp13 = OS_WrapperM_xx_StdControl_xx_start ();
__cil_tmp17 = BlinkGreenM_xx_StdControl_xx_start ();
}
return 0;
}
int
main (void)
{
{
RealMain_xx_StdControl_xx_init ();
RealMain_xx_StdControl_xx_start ();
}
return 0;
}
result_t
UntrustedTimerM_xx_Timer_xx_start (uint8_t___0 id, char type,
uint32_t interval)
{
result_t (*start) (uint8_t___0, uint8_t___0, char, uint32_t);
struct fseqp_void __cil_tmp8;
result_t (*__cil_tmp9) (uint8_t___0, uint8_t___0, char, uint32_t);
result_t __cil_tmp10;
{
__cil_tmp8 = UntrustedLedsC_xx_OS_Wrapper_xx_get_OS_call_f (14);
__cil_tmp9 =
(result_t (*)(uint8_t___0, uint8_t___0, char, uint32_t)) __cil_tmp8._p;
start = __cil_tmp9;
if ((int) start)
{
__cil_tmp10 =
((*start)) (UntrustedTimerM_xx_proc_id, id, type, interval);
}
}
return 0;
}