avr-gcc-list
[Top][All Lists]
Advanced

[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;
}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]