1 /* Test that the ms_hook_prologue attribute generates the correct code.  */
2 
3 /* { dg-do run } */
4 /* { dg-require-effective-target ms_hook_prologue } */
5 /* { dg-options "-O2 -fomit-frame-pointer" } */
6 
foo()7 int __attribute__ ((__ms_hook_prologue__)) foo ()
8 {
9   unsigned char *ptr = (unsigned char *) foo;
10 
11   /* The NOP mov must not be optimized away by optimizations.
12      The push %ebp, mov %esp, %ebp must not be removed by
13      -fomit-frame-pointer */
14 #ifndef __x86_64__
15   /* movl.s %edi, %edi */
16   if(*ptr++ != 0x8b) return 1;
17   if(*ptr++ != 0xff) return 1;
18   /* push %ebp */
19   if(*ptr++ != 0x55) return 1;
20   /* movl.s %esp, %ebp */
21   if(*ptr++ != 0x8b) return 1;
22   if(*ptr++ != 0xec) return 1;
23 #else
24   /* leaq 0(%rsp), %rsp */
25   if (*ptr++ != 0x48) return 1;
26   if (*ptr++ != 0x8d) return 1;
27   if (*ptr++ != 0xa4) return 1;
28   if (*ptr++ != 0x24) return 1;
29   if (ptr[0] != 0 || ptr[1] != 0 || ptr[2] != 0 || ptr[3] != 0)
30     return 1;
31 #endif
32   return 0;
33 }
34 
main()35 int main ()
36 {
37   return foo();
38 }
39