4 #define ASMNAME(cname) ASMNAME2 (__USER_LABEL_PREFIX__, cname)
5 #define ASMNAME2(prefix, cname) STRING (prefix) cname
9 extern "C" void abort (void);
11 extern void abort (void);
14 extern void foo(void);
20 /* Set DI/SI/BX to wrong value
21 Use following template so that RA will save/restore callee
22 save registers in prologue/epilogue */
23 #define ALTER_REGS() \
26 __asm__ __volatile__ (\
27 "movl %1, %0" : "=D" (dummy) : "i" (-INIT_EDI)\
29 __asm__ __volatile__ (\
30 "movl %1, %0" : "=S" (dummy) : "i" (-INIT_ESI)\
32 __asm__ __volatile__ (\
33 "movl %1, %0" : "=b" (dummy) : "i" (-INIT_EBX)\
37 #if defined __PIC__ || defined __USING_SJLJ_EXCEPTIONS__
44 void __attribute__ ((noinline
))
45 copy (char *p
, int size
)
47 __builtin_strncpy (p
, "good", size
);
50 int g_edi
__attribute__((externally_visible
)) =INIT_EDI
;
51 int g_esi
__attribute__((externally_visible
)) =INIT_ESI
;
52 int g_ebx
__attribute__((externally_visible
)) = INIT_EBX
;
53 int g_ebp
__attribute__((externally_visible
));
54 int g_esp
__attribute__((externally_visible
));
55 int g_ebp_save
__attribute__((externally_visible
));
56 int g_esp_save
__attribute__((externally_visible
));
63 // Init registers to correct value.
64 // Use following template so that RA will save/restore callee
65 // save registers in prologue/epilogue
66 __asm__
__volatile__ (
71 __asm__
__volatile__ (
76 __asm__
__volatile__ (
81 __asm__
__volatile__ (
82 "movl %ebp," ASMNAME("g_ebp_save")"\n\t"
83 "movl %esp," ASMNAME("g_esp_save")"\n\t"
92 // Get DI/SI/BX register value after exception caught
93 __asm__
__volatile__ (
94 "movl %edi," ASMNAME("g_edi")"\n\t"
95 "movl %esi," ASMNAME("g_esi")"\n\t"
96 "movl %ebx," ASMNAME("g_ebx")"\n\t"
97 "movl %ebp," ASMNAME("g_ebp")"\n\t"
98 "movl %esp," ASMNAME("g_esp")"\n\t"
101 // Check if DI/SI/BX register value are the same as before calling
103 if (g_edi
!= INIT_EDI
)
107 printf("edi=%d, correct value:%d\n", g_edi
, INIT_EDI
);
110 if (g_esi
!= INIT_ESI
)
114 printf("esi=%d, correct value:%d\n", g_esi
, INIT_ESI
);
117 if (g_ebx
!= INIT_EBX
)
121 printf("ebx=%d, correct value:%d\n", g_ebx
, INIT_EBX
);
124 if (g_ebp
!= g_ebp_save
)
128 printf("ebp=0x%x, correct value:0x%x\n", g_ebp
, g_ebp_save
);
131 if (g_esp
!= g_esp_save
)
135 printf("esp=0x%x, correct value:0x%x\n", g_esp
, g_esp_save
);