1 #include <stdio.h>
2 #include "header.h"
3
foo(union u * ptr,int flag)4 void foo(union u *ptr, int flag)
5 {
6 union u local;
7 local.i = ptr->i;
8
9 printf("Calling printf to trash r0..r3\n");
10 /*
11 * Clang 3.1 generates the following instructions to store flag into
12 * local.s.x. Because str is paired with ldrh, the high half-word in r0 is
13 * uninitialized and the corresponding positions in local.s.i will be
14 * clobbered.
15 *
16 * 1a: f8bd 0004 ldrh.w r0, [sp, #4]
17 * 1e: f005 0101 and.w r1, r5, #1
18 * 22: f020 0001 bic.w r0, r0, #1
19 * 26: 4308 orrs r0, r1
20 * 28: 9001 str r0, [sp, #4]
21 */
22 local.s.x = flag;
23 ptr->i = local.i;
24 }
25