[Bug c/54071] New: out data in object file is correct only for -s0 optimize flag
arkadiusz.krysiak.wroclaw at gmail dot com
gcc-bugzilla@gcc.gnu.org
Mon Jul 23 10:37:00 GMT 2012
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: unassigned@gcc.gnu.org
ReportedBy: arkadiusz.krysiak.wroclaw@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 :
More information about the Gcc-bugs
mailing list