From 554fd8c5195424bdbcabf5de30fdc183aba391bd Mon Sep 17 00:00:00 2001 From: upstream source tree Date: Sun, 15 Mar 2015 20:14:05 -0400 Subject: obtained gcc-4.6.4.tar.bz2 from upstream website; verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository. --- gcc/testsuite/gcc.target/i386/cleanup-2.c | 206 ++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/cleanup-2.c (limited to 'gcc/testsuite/gcc.target/i386/cleanup-2.c') diff --git a/gcc/testsuite/gcc.target/i386/cleanup-2.c b/gcc/testsuite/gcc.target/i386/cleanup-2.c new file mode 100644 index 000000000..2bd18025f --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/cleanup-2.c @@ -0,0 +1,206 @@ +/* { dg-do run { target *-*-linux* } } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-fexceptions -fnon-call-exceptions -fasynchronous-unwind-tables -O2" } */ +/* Test complex CFA value expressions. */ + +#include +#include +#include +#include +#include + +static _Unwind_Reason_Code +force_unwind_stop (int version, _Unwind_Action actions, + _Unwind_Exception_Class exc_class, + struct _Unwind_Exception *exc_obj, + struct _Unwind_Context *context, + void *stop_parameter) +{ + if (actions & _UA_END_OF_STACK) + abort (); + return _URC_NO_REASON; +} + +static void +force_unwind () +{ + struct _Unwind_Exception *exc = malloc (sizeof (*exc)); + memset (&exc->exception_class, 0, sizeof (exc->exception_class)); + exc->exception_cleanup = 0; + + _Unwind_ForcedUnwind (exc, force_unwind_stop, 0); + abort (); +} + +int count; + +static void +counter (void *p __attribute__((unused))) +{ + ++count; +} + +static void +handler (void *p __attribute__((unused))) +{ + if (count != 2) + abort (); + _exit (0); +} + +static int __attribute__((noinline)) +fn5 (void) +{ + char dummy __attribute__((cleanup (counter))); + force_unwind (); + return 0; +} + +void +bar (void) +{ + char dummy __attribute__((cleanup (counter))); + fn5 (); +} + +void __attribute__((noinline)) +foo (int x) +{ + char buf[256]; +#ifdef __x86_64__ + __asm ( + "testl %0, %0\n\t" + "jnz 1f\n\t" + ".subsection 1\n\t" + ".type _L_mutex_lock_%=, @function\n" +"_L_mutex_lock_%=:\n" +"1:\t" "leaq %1, %%rdi\n" +"2:\t" "subq $128, %%rsp\n" +"3:\t" "call bar\n" +"4:\t" "addq $128, %%rsp\n" +"5:\t" "jmp 21f\n" +"6:\t" ".size _L_mutex_lock_%=, .-_L_mutex_lock_%=\n\t" + ".previous\n\t" + ".section .eh_frame,\"a\",@progbits\n" +"7:\t" ".long 9f-8f # Length of Common Information Entry\n" +"8:\t" ".long 0x0 # CIE Identifier Tag\n\t" + ".byte 0x1 # CIE Version\n\t" + ".ascii \"zR\\0\" # CIE Augmentation\n\t" + ".uleb128 0x1 # CIE Code Alignment Factor\n\t" + ".sleb128 -8 # CIE Data Alignment Factor\n\t" + ".byte 0x10 # CIE RA Column\n\t" + ".uleb128 0x1 # Augmentation size\n\t" + ".byte 0x1b # FDE Encoding (pcrel sdata4)\n\t" + ".byte 0xc # DW_CFA_def_cfa\n\t" + ".uleb128 0x7\n\t" + ".uleb128 0x0\n\t" + ".align 8\n" +"9:\t" ".long 20f-10f # FDE Length\n" +"10:\t" ".long 10b-7b # FDE CIE offset\n\t" + ".long 1b-. # FDE initial location\n\t" + ".long 6b-1b # FDE address range\n\t" + ".uleb128 0x0 # Augmentation size\n\t" + /* This CFA expression computes the address right + past the jnz instruction above, from %rip somewhere + within the _L_mutex_lock_%= subsection. */ + ".byte 0x16 # DW_CFA_val_expression\n\t" + ".uleb128 0x10\n\t" + ".uleb128 19f-11f\n" +"11:\t" ".byte 0x80 # DW_OP_breg16\n\t" + ".sleb128 0\n" +"12:\t" ".byte 0x12 # DW_OP_dup\n\t" + ".byte 0x94 # DW_OP_deref_size\n\t" + ".byte 1\n\t" + ".byte 0x12 # DW_OP_dup\n\t" + ".byte 0x08 # DW_OP_const1u\n\t" + ".byte 0x48\n\t" + ".byte 0x2e # DW_OP_ne\n\t" + ".byte 0x28 # DW_OP_bra\n\t" + ".2byte 16f-13f\n" +"13:\t" ".byte 0x13 # DW_OP_drop\n\t" + ".byte 0x23 # DW_OP_plus_uconst\n\t" + ".uleb128 1\n\t" + ".byte 0x12 # DW_OP_dup\n\t" + ".byte 0x94 # DW_OP_deref_size\n\t" + ".byte 1\n\t" + ".byte 0x08 # DW_OP_const1u\n\t" + ".byte 0x81\n\t" + ".byte 0x2e # DW_OP_ne\n\t" + ".byte 0x28 # DW_OP_bra\n\t" + ".2byte 15f-14f\n" +"14:\t" ".byte 0x23 # DW_OP_plus_uconst\n\t" + ".uleb128 3b-2b-1\n\t" + ".byte 0x2f # DW_OP_skip\n\t" + ".2byte 12b-15f\n" +"15:\t" ".byte 0x23 # DW_OP_plus_uconst\n\t" + ".uleb128 2b-1b-1\n\t" + ".byte 0x2f # DW_OP_skip\n\t" + ".2byte 12b-16f\n" +"16:\t" ".byte 0x08 # DW_OP_const1u\n\t" + ".byte 0xe8\n\t" + ".byte 0x2e # DW_OP_ne\n\t" + ".byte 0x28 # DW_OP_bra\n\t" + ".2byte 18f-17f\n" +"17:\t" ".byte 0x23 # DW_OP_plus_uconst\n\t" + ".uleb128 4b-3b\n\t" + ".byte 0x2f # DW_OP_skip\n\t" + ".2byte 12b-18f\n" +"18:\t" ".byte 0x23 # DW_OP_plus_uconst\n\t" + ".uleb128 1\n\t" + ".byte 0x12 # DW_OP_dup\n\t" + ".byte 0x94 # DW_OP_deref_size\n\t" + ".byte 4\n\t" + ".byte 0x08 # DW_OP_const1u\n\t" + ".byte 72 - (6b-5b) * 8 # (6b-5b) == 5 ? 32 : 56\n\t" + ".byte 0x24 # DW_OP_shl\n\t" + ".byte 0x08 # DW_OP_const1u\n\t" + ".byte 72 - (6b-5b) * 8 # (6b-5b) == 5 ? 32 : 56\n\t" + ".byte 0x26 # DW_OP_shra\n\t" + ".byte 0x22 # DW_OP_plus\n\t" + ".byte 0x23 # DW_OP_plus_uconst\n\t" + ".uleb128 6b-5b-1\n" +"19:\t" ".byte 0x40 + (3b-1b) # DW_CFA_advance_loc\n\t" + ".byte 0xe # DW_CFA_def_cfa_offset\n\t" + ".uleb128 128\n\t" + ".byte 0x40 + (5b-3b) # DW_CFA_advance_loc\n\t" + ".byte 0xe # DW_CFA_def_cfa_offset\n\t" + ".uleb128 0\n\t" + ".align 8\n" +"20:\t" ".previous\n" +"21:" + : : "r" (x), "m" (x), "r" (buf) + : "memory", "rax", "rdx", "rcx", "rsi", "rdi", + "r8", "r9", "r10", "r11"); +#else +# error Unsupported test architecture +#endif +} + +static int __attribute__((noinline)) +fn2 (void) +{ + foo (3); + return 0; +} + +static int __attribute__((noinline)) +fn1 (void) +{ + fn2 (); + return 0; +} + +static void * +fn0 (void) +{ + char dummy __attribute__((cleanup (handler))); + fn1 (); + return 0; +} + +int +main (void) +{ + fn0 (); + return 0; +} -- cgit v1.2.3