This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/50081] New: Wrong code (wrong order) generated with -O2 or -Os while function return a struct
- From: "lingyouzeng at arimacomm-hz dot cn" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 15 Aug 2011 06:50:56 +0000
- Subject: [Bug c/50081] New: Wrong code (wrong order) generated with -O2 or -Os while function return a struct
- Auto-submitted: auto-generated
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50081
Bug #: 50081
Summary: Wrong code (wrong order) generated with -O2 or -Os
while function return a struct
Classification: Unclassified
Product: gcc
Version: 4.4.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: lingyouzeng@arimacomm-hz.cn
The code like:
typedef struct {
struct umdb_list_head_st *list_head;
struct umdb_list_node_st *current;
} umdb_util_it_t;
typedef umdb_util_it_t umdb_dbms_hl_oper_list_iterator_t;
umdb_dbms_hl_oper_list_iterator_t
umdb_dbms_oper_list_find_element (umdb_dbms_hl_oper_list_handle_t *list,
MSF_UINT8 src_mod_id,
MSF_UINT16 transaction_id)
{
umdb_dbms_hl_oper_list_iterator_t it;
umdb_dbms_oper_list_elem_t *elem;
it = umdb_dbms_oper_list_get_iterator (list);
while (!umdb_dbms_oper_list_equals_end (&it)) {
elem = (umdb_dbms_oper_list_elem_t*)it.current;
if (elem->ml_transaction_id == transaction_id &&
elem->src_mod_id == src_mod_id) {
break;
}
umdb_dbms_oper_list_iterator_next (&it);
}
return it;
}
The asm code like:
00000000 <umdb_dbms_oper_list_find_element>:
0: b5f0 push {r4, r5, r6, r7, lr}
2: b087 sub sp, #28
4: ac02 add r4, sp, #8
6: 1c05 adds r5, r0, #0
8: ae04 add r6, sp, #16
a: 1c20 adds r0, r4, #0
c: 1c17 adds r7, r2, #0
e: 9301 str r3, [sp, #4]
10: f7ff fffe bl 0 <umdb_dbms_oper_list_find_element>
14: cc03 ldmia r4!, {r0, r1}
16: c603 stmia r6!, {r0, r1}
18: e00a b.n 30 <umdb_dbms_oper_list_find_element+0x30>
1a: 6863 ldr r3, [r4, #4]
1c: 9801 ldr r0, [sp, #4]
1e: 8a1a ldrh r2, [r3, #16]
20: 4282 cmp r2, r0
22: d102 bne.n 2a <umdb_dbms_oper_list_find_element+0x2a>
24: 7a1b ldrb r3, [r3, #8]
26: 42bb cmp r3, r7
28: d008 beq.n 3c <umdb_dbms_oper_list_find_element+0x3c>
2a: a804 add r0, sp, #16
2c: f7ff fffe bl 0 <umdb_dbms_oper_list_find_element>
30: ac04 add r4, sp, #16
32: 1c20 adds r0, r4, #0
34: f7ff fffe bl 0 <umdb_dbms_oper_list_find_element>
38: 2800 cmp r0, #0
3a: d0ee beq.n 1a <umdb_dbms_oper_list_find_element+0x1a>
3c: 1c2a adds r2, r5, #0
3e: ab04 add r3, sp, #16
40: b007 add sp, #28
42: cb03 ldmia r3!, {r0, r1}
44: c203 stmia r2!, {r0, r1}
46: 1c28 adds r0, r5, #0
48: bdf0 pop {r4, r5, r6, r7, pc}
4a: 46c0 nop ; (mov r8, r8)
It show the return struct is not safe here, it still use the stack after
sp+0x28.
40: b007 add sp, #28
42: cb03 ldmia r3!, {r0, r1}
44: c203 stmia r2!, {r0, r1}