http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54071

             Bug #: 54071
           Summary: out data in object file is correct only for -s0
                    optimize flag
    Classification: Unclassified
           Product: gcc
           Version: 4.3.3
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: arkadiusz.krysiak.wroc...@gmail.com


Created attachment 27857
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=27857
object file with bad optymalisation

ut block command is made by part of source functions.
some functionss have no prolog and epilog.
out data in object file is correct only for -s0 optimize flag


I have in big source code for atmega644p functions:


//==============================================================================
void console_process(console_st *base)
{
   do
   {
      base->temp=(uint16_t)cgetc((&base->com_port) );
      base->char_in=(uint8_t)base->temp;
      if (EOF==(int)base->temp) 
      {
         base->char_in=0;
      }
      if (0x00!=base->char_in)
      {
      if (base->status.console_enable)
      {
         if (sizeof(console_lock_string)>base->status.locker_match)
         {
            if(pgm_read_byte
                 ((&console_lock_string[0])+base->status.locker_match)
                  ==
                  base->char_in
               )
            {   /*char in is in accord to unlock string char from
base->locker_match position*/
               base->status.locker_match++;
               if ((sizeof(console_lock_string)-1)==base->status.locker_match)
               {
                  base->status.console_enable=false;
                  base->status.locker_match=0;
               }
            }
            else
            {
               base->status.locker_match=0;
            }
         }
            if (0x00!=base->char_in)
            {
               base->time_out_ticks=base->timeout; 
               if   (user_log_in_test(base)){console_embedded_cmd_run(base);}
                  console_ansi_process(base);   
                     if  (
                        (!(base->status.esc))
                        &&
                        (C_ESC!=base->char_in)
                        &&
                        (base->status.passwd!=true)
                     )
                  {
                     console_process_to_lowercase(base);   
                     console_auto_fill_cmd(base); 
                     console_fn_key_select(base);
                  }
            }
            base->status.hold_char=0;/*false*/
      }
      else
      {
         if   (sizeof(console_unlock_string)>base->status.locker_match)
         {
            if   (
                  pgm_read_byte
                              (
                                 (&console_unlock_string[0])
                                 +
                                 base->status.locker_match
                              )
                  ==
                  base->char_in
               ) 
            {
               base->status.locker_match++;
               if   (
                     (sizeof(console_unlock_string)-1)
                     ==
                     base->status.locker_match
                  )
               {
                  base->status.console_enable=true;
                  base->status.locker_match=0; 
               }
            }
            else
            {
               base->status.locker_match=0;
            }
         }
      }
   }
   }while(  (EOF) != (int)(base->temp) );
}







void set_new_passwd(console_st *base)
{
    //zapisz haslo
    switch (base->priviledge)
    {
        case 0x80 :{base->temp=6; break;}
        case 0x40 :{base->temp=5; break;}
        case 0x20 :{base->temp=4; break;}
        case 0x10 :{base->temp=3; break;}
        case 0x08 :{base->temp=2; break;}
        case 0x04 :{base->temp=1; break;}
        case 0x02 :{base->temp=0; break;}
        default :{base->temp=255; break;}
    }
            if (base->temp<255)
            {
                pass_tab[base->temp].hash=base->temp_val;
            }
            if (base->temp<255)
            {
                cfseek( /*ustaw w odpowiednim miejscu w pliku*/
                        EEFILE,
                        (uint8_t
*)(&ee_pass_tab[0])+(base->temp*sizeof(user_st)),
                        0
                    );
                cfputc(*((uint8_t *)(&base->temp_val)+0),EEFILE);
                cfputc(*((uint8_t *)(&base->temp_val)+1),EEFILE);
                cfputc(*((uint8_t *)(&base->temp_val)+2),EEFILE);
                cfputc(*((uint8_t *)(&base->temp_val)+3),EEFILE);
            }
}



void console_ansi_process(console_st *base)
{
    if     (
            (C_ESC==base->char_in)
            &&
            (true!=base->status.passwd)
            &&
            (true!=base->status.passwd_ask)
            &&
            (true!=base->status.log_in)
        )
    {
        base->status.esc=true;
        base->status.hold_char=1; 
        return;
    }
    else
    {
        if (base->status.esc)
        {
            if ('['==base->char_in)
            {
                base->status.sqrt_bracket=true;
                base->status.hold_char=1;
            }
            else
            {
                if (base->status.sqrt_bracket)
                {
                    switch (base->char_in)
                    {
                        case C_UP :
                        {
                            history_back(&base->history,&base->buffer_we[0]);
                            history_show(base);
                            esc_erase_from_cursor_to_eop(&(base->com_port));
                            break;
                        }
                        case C_DN :
                        {
                           
history_forward(&base->history,&base->buffer_we[0]);
                            buffer_pointer_to_first_null(base); 
                            history_show(base);
                            break;
                        }
                        case C_LEFT :
                        {
                            console_char_back(base);
                            base->status.hold_char=1;
                            break;
                        }
                        case C_RIGHT :
                        {
                            console_char_forward(base);
                            base->status.hold_char=1;
                            break;
                        }
                        default :
                        {
                            base->status.esc=false;
                            base->status.hold_char=0;
                            base->status.sqrt_bracket=false;
                        }
                    }
                    base->status.esc=false;
                    base->status.sqrt_bracket=false;
                }
                else
                {
                    base->status.esc=false;
                    base->status.hold_char=0;
                }
            }
        }
    }
}


//================================================================================
//================================================================================
//================================================================================
That functions avr-gcc translate to asm paced in object files:




void console_process(console_st *base)
{
    a228:    2f 92           push    r2
    a22a:    3f 92           push    r3
    a22c:    4f 92           push    r4
    a22e:    5f 92           push    r5
    a230:    6f 92           push    r6
    a232:    7f 92           push    r7
    a234:    8f 92           push    r8
    a236:    9f 92           push    r9
    a238:    af 92           push    r10
    a23a:    bf 92           push    r11
    a23c:    cf 92           push    r12
    a23e:    df 92           push    r13
    a240:    ef 92           push    r14
    a242:    ff 92           push    r15
    a244:    0f 93           push    r16
    a246:    1f 93           push    r17
    a248:    df 93           push    r29
    a24a:    cf 93           push    r28
    a24c:    cd b7           in    r28, 0x3d    ; 61
    a24e:    de b7           in    r29, 0x3e    ; 62
    a250:    a6 97           sbiw    r28, 0x26    ; 38
    a252:    0f b6           in    r0, 0x3f    ; 63
    a254:    f8 94           cli
    a256:    de bf           out    0x3e, r29    ; 62
    a258:    0f be           out    0x3f, r0    ; 63
    a25a:    cd bf           out    0x3d, r28    ; 61
    a25c:    9e a3           std    Y+38, r25    ; 0x26
    a25e:    8d a3           std    Y+37, r24    ; 0x25
    do
    {
        /*====================================================*/

        base->temp=(uint16_t)cgetc((&base->com_port) ); /* czytanie znaku */
    a260:    89 8b           std    Y+17, r24    ; 0x11
    a262:    9a 8b           std    Y+18, r25    ; 0x12
                cfseek( /*ustaw w odpowiednim miejscu w pliku*/
                        EEFILE,
                        (uint8_t
*)(&ee_pass_tab[0])+(base->temp*sizeof(user_st)),
                        0
                    );




/*!!!!!!!!!!!!!!!!!!!!!!!!  PART of NEXT FUNCTION !!!!!!!!!!!!!!!!!!!!!!!*/




                cfputc(*((uint8_t *)(&base->temp_val)+0),EEFILE);
    a264:    9c 01           movw    r18, r24
    a266:    26 58           subi    r18, 0x86    ; 134
    a268:    3e 4f           sbci    r19, 0xFE    ; 254
    a26a:    3a 87           std    Y+10, r19    ; 0x0a
    a26c:    29 87           std    Y+9, r18    ; 0x09
                cfputc(*((uint8_t *)(&base->temp_val)+1),EEFILE);
    a26e:    2f 5f           subi    r18, 0xFF    ; 255
    a270:    3f 4f           sbci    r19, 0xFF    ; 255
    a272:    3c 87           std    Y+12, r19    ; 0x0c
    a274:    2b 87           std    Y+11, r18    ; 0x0b
                cfputc(*((uint8_t *)(&base->temp_val)+2),EEFILE);
    a276:    49 85           ldd    r20, Y+9    ; 0x09
    a278:    5a 85           ldd    r21, Y+10    ; 0x0a
    a27a:    4e 5f           subi    r20, 0xFE    ; 254
    a27c:    5f 4f           sbci    r21, 0xFF    ; 255
    a27e:    5e 87           std    Y+14, r21    ; 0x0e
    a280:    4d 87           std    Y+13, r20    ; 0x0d
                cfputc(*((uint8_t *)(&base->temp_val)+3),EEFILE);
    a282:    89 85           ldd    r24, Y+9    ; 0x09
    a284:    9a 85           ldd    r25, Y+10    ; 0x0a
    a286:    03 96           adiw    r24, 0x03    ; 3
    a288:    98 8b           std    Y+16, r25    ; 0x10
    a28a:    8f 87           std    Y+15, r24    ; 0x0f





/*!!!!!!!!!!!!!!!!!!!!!!!!  PART of NEXT FUNCTION !!!!!!!!!!!!!!!!!!!!!!!*/




                    switch (base->char_in)
                    {
                        case C_UP :
                        {
                            history_back(&base->history,&base->buffer_we[0]);
    a28c:    ad a1           ldd    r26, Y+37    ; 0x25
    a28e:    be a1           ldd    r27, Y+38    ; 0x26
    a290:    aa 5a           subi    r26, 0xAA    ; 170
    a292:    bf 4f           sbci    r27, 0xFF    ; 255
    a294:    be 83           std    Y+6, r27    ; 0x06
    a296:    ad 83           std    Y+5, r26    ; 0x05
    a298:    ed a1           ldd    r30, Y+37    ; 0x25
    a29a:    fe a1           ldd    r31, Y+38    ; 0x26
    a29c:    71 96           adiw    r30, 0x11    ; 17
    a29e:    f8 87           std    Y+8, r31    ; 0x08
    a2a0:    ef 83           std    Y+7, r30    ; 0x07
            (F_CHILD_VIS==base->command.flags)
            ||
            (F_CHILD_UNVIS==base->command.flags)
        )
    { 
       
forward_char_index_to_white_char(&base->buffer_we[base->parse_pos],&base->parse_pos);
    a2a2:    2d a1           ldd    r18, Y+37    ; 0x25
    a2a4:    3e a1           ldd    r19, Y+38    ; 0x26
    a2a6:    2e 58           subi    r18, 0x8E    ; 142
    a2a8:    3e 4f           sbci    r19, 0xFE    ; 254
    a2aa:    3c 83           std    Y+4, r19    ; 0x04
    a2ac:    2b 83           std    Y+3, r18    ; 0x03
                    base->temp=4+base->temp1 - strlenp(base->command.descript); 
                }
                while (base->temp--)    cfputc(C_SPC,&base->com_port);
               
forward_pointer_p_by_null((uint8_t**)(&base->command.descript));
    a2ae:    4d a1           ldd    r20, Y+37    ; 0x25
    a2b0:    5e a1           ldd    r21, Y+38    ; 0x26
    a2b2:    49 56           subi    r20, 0x69    ; 105
    a2b4:    5e 4f           sbci    r21, 0xFE    ; 254
    a2b6:    5a 83           std    Y+2, r21    ; 0x02
    a2b8:    49 83           std    Y+1, r20    ; 0x01
{
    do
    {
        /*====================================================*/

        base->temp=(uint16_t)cgetc((&base->com_port) ); 
    a2ba:    66 e8           ldi    r22, 0x86    ; 134
    a2bc:    c6 2e           mov    r12, r22
    a2be:    61 e0           ldi    r22, 0x01    ; 1
    a2c0:    d6 2e           mov    r13, r22
    a2c2:    8d a1           ldd    r24, Y+37    ; 0x25
    a2c4:    9e a1           ldd    r25, Y+38    ; 0x26
    a2c6:    c8 0e           add    r12, r24
    a2c8:    d9 1e           adc    r13, r25
        base->char_in=(uint8_t)base->temp;
    a2ca:    89 58           subi    r24, 0x89    ; 137
    a2cc:    9e 4f           sbci    r25, 0xFE    ; 254
    a2ce:    9c 8b           std    Y+20, r25    ; 0x14
    a2d0:    8b 8b           std    Y+19, r24    ; 0x13
        /*check lock/unlock sequence*/
        if (0x00!=base->char_in)
        {

        if (base->status.console_enable)
    a2d2:    53 e5           ldi    r21, 0x53    ; 83
    a2d4:    65 2e           mov    r6, r21
    a2d6:    71 2c           mov    r7, r1
    a2d8:    ad a1           ldd    r26, Y+37    ; 0x25
    a2da:    be a1           ldd    r27, Y+38    ; 0x26
    a2dc:    6a 0e           add    r6, r26
    a2de:    7b 1e           adc    r7, r27
                            console_process_to_lowercase(base);
                            console_auto_fill_cmd(base);
                            console_fn_key_select(base);
                        }
                }
                base->status.hold_char=0;
    a2e0:    41 e5           ldi    r20, 0x51    ; 81
    a2e2:    e4 2e           mov    r14, r20
    a2e4:    f1 2c           mov    r15, r1
    a2e6:    ea 0e           add    r14, r26
    a2e8:    fb 1e           adc    r15, r27
                        console_embedded_cmd_run(base);
                        }
                        console_ansi_process(base);
                            if  (
    a2ea:    32 e5           ldi    r19, 0x52    ; 82
    a2ec:    a3 2e           mov    r10, r19
    a2ee:    b1 2c           mov    r11, r1
    a2f0:    aa 0e           add    r10, r26
    a2f2:    bb 1e           adc    r11, r27







/*!!!!!!!!!!!!!!!!!!!!!!!!  NO EPILOG !!!!!!!!!!!!!!!!!!!!!!!*/






 * \callgraph
 * \callergraph
*//*==========================================================================*/
void console_process_to_lowercase(console_st *base)
{





/*!!!!!!!!!!!!!!!!!!!!!!!!  NO PROLOG !!!!!!!!!!!!!!!!!!!!!!!*/





    if (base->config.lowercase)
    a2f4:    ac 5a           subi    r26, 0xAC    ; 172
    a2f6:    bf 4f           sbci    r27, 0xFF    ; 255
    a2f8:    be 8b           std    Y+22, r27    ; 0x16
    a2fa:    ad 8b           std    Y+21, r26    ; 0x15





/*!!!!!!!!!!!!!!!!!!!!!!!!  NO BODY !!!!!!!!!!!!!!!!!!!!!!!*/






/*!!!!!!!!!!!!!!!!!!!!!!!!  NO EPILOG !!!!!!!!!!!!!!!!!!!!!!!*/
etc... 





 * \callgraph
 * \callergraph
*//*==========================================================================*/
void console_execute(console_st *base)
{
    if     (base->line_pos_console) /*jesli jest jakis znak w buforze*/
    a2fc:    ed a1           ldd    r30, Y+37    ; 0x25
    a2fe:    fe a1           ldd    r31, Y+38    ; 0x26
    a300:    eb 58           subi    r30, 0x8B    ; 139
    a302:    fe 4f           sbci    r31, 0xFE    ; 254
    a304:    f8 8f           std    Y+24, r31    ; 0x18
    a306:    ef 8b           std    Y+23, r30    ; 0x17
            {
                /* wstawienie linii do historii polecen */
                history_add(&base->history,&base->buffer_we[0]);
                menu_databuffer_move(base); /*przesun wprowadzona linie komend
na koniec bufora.*/
            }
            base->min=base->parse_pos;
    a308:    2d a1           ldd    r18, Y+37    ; 0x25
    a30a:    3e a1           ldd    r19, Y+38    ; 0x26
    a30c:    2e 57           subi    r18, 0x7E    ; 126
    a30e:    3e 4f           sbci    r19, 0xFE    ; 254
    a310:    3a 8f           std    Y+26, r19    ; 0x1a
    a312:    29 8f           std    Y+25, r18    ; 0x19
    a314:    2b 80           ldd    r2, Y+3    ; 0x03
    a316:    3c 80           ldd    r3, Y+4    ; 0x04
            base->parse_pos=base->error_corect;
    a318:    4d a1           ldd    r20, Y+37    ; 0x25
    a31a:    5e a1           ldd    r21, Y+38    ; 0x26
    a31c:    47 58           subi    r20, 0x87    ; 135
    a31e:    5e 4f           sbci    r21, 0xFE    ; 254
    a320:    5c 8f           std    Y+28, r21    ; 0x1c
    a322:    4b 8f           std    Y+27, r20    ; 0x1b
            console_command_match(base);/*dopasowanie wzorca zwraca indeks w
tablicy+1*/
            if(1==base->command_index)base->command_index=0;
    a324:    24 e9           ldi    r18, 0x94    ; 148
    a326:    42 2e           mov    r4, r18
    a328:    21 e0           ldi    r18, 0x01    ; 1
    a32a:    52 2e           mov    r5, r18
    a32c:    8d a1           ldd    r24, Y+37    ; 0x25
    a32e:    9e a1           ldd    r25, Y+38    ; 0x26
    a330:    48 0e           add    r4, r24
    a332:    59 1e           adc    r5, r25
*//*==========================================================================*/
void console_command_with_priviledge(console_st *base)
{
    //console_get_flags(base,base->command_index);
    if    (
            (F_CHILD_VIS==base->command.flags)
    a334:    8b 56           subi    r24, 0x6B    ; 107
    a336:    9e 4f           sbci    r25, 0xFE    ; 254
    a338:    9e 8f           std    Y+30, r25    ; 0x1e
    a33a:    8d 8f           std    Y+29, r24    ; 0x1d
                console_del_char(base);
                break;
            };
            default :

Reply via email to