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 :