cleanup-1.c

来自「用于进行gcc测试」· C语言 代码 · 共 241 行

C
241
字号
/* { dg-do run { target *-*-linux* } } *//* { dg-options "-fexceptions -fnon-call-exceptions -fasynchronous-unwind-tables -O2" } *//* Test complex CFA value expressions.  */#include <unwind.h>#include <stdlib.h>#include <string.h>#include <stdio.h>#include <unistd.h>static _Unwind_Reason_Codeforce_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 voidforce_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 voidcounter (void *p __attribute__((unused))){  ++count;}static voidhandler (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;}voidbar (void){  char dummy __attribute__((cleanup (counter)));  fn5 ();}void __attribute__((noinline))foo (int x){  char buf[256];#ifdef __i386__  __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"	"leal	%1, %%ecx\n""2:\t"	"call	bar\n""3:\t"	"jmp	18f\n""4:\t"	".size _L_mutex_lock_%=, .-_L_mutex_lock_%=\n\t"	".previous\n\t"	".section	.eh_frame,\"a\",@progbits\n""5:\t"	".long	7f-6f	# Length of Common Information Entry\n""6:\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 -4	# CIE Data Alignment Factor\n\t"	".byte	0x8	# 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 0x4\n\t"	".uleb128 0x0\n\t"	".align 4\n""7:\t"	".long	17f-8f	# FDE Length\n""8:\t"	".long	8b-5b	# FDE CIE offset\n\t"	".long	1b-.	# FDE initial location\n\t"	".long	4b-1b	# FDE address range\n\t"	".uleb128 0x0	# Augmentation size\n\t"	".byte	0x16	# DW_CFA_val_expression\n\t"	".uleb128 0x8\n\t"	".uleb128 10f-9f\n""9:\t"	".byte	0x78	# DW_OP_breg8\n\t"	".sleb128 3b-1b\n""10:\t"	".byte	0x40 + (2b-1b) # DW_CFA_advance_loc\n\t"	".byte	0x16	# DW_CFA_val_expression\n\t"	".uleb128 0x8\n\t"	".uleb128 12f-11f\n""11:\t"	".byte	0x78	# DW_OP_breg8\n\t"	".sleb128 3b-2b\n""12:\t"	".byte	0x40 + (3b-2b-1) # DW_CFA_advance_loc\n\t"	".byte	0x16	# DW_CFA_val_expression\n\t"	".uleb128 0x8\n\t"	".uleb128 16f-13f\n""13:\t"	".byte	0x78	# DW_OP_breg8\n\t"	".sleb128 15f-14f\n\t"	".byte	0x0d	# DW_OP_const4s\n""14:\t"	".4byte	3b-.\n\t"	".byte	0x1c	# DW_OP_minus\n\t"	".byte	0x0d	# DW_OP_const4s\n""15:\t"	".4byte	18f-.\n\t"	".byte	0x22	# DW_OP_plus\n""16:\t"	".align 4\n""17:\t"	".previous\n""18:"	: : "r" (x), "m" (x), "r" (buf)	: "memory", "eax", "edx", "ecx");#elif defined __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	24f\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	0x12	# DW_CFA_def_cfa_sf\n\t"	".uleb128 0x7\n\t"	".sleb128 16\n\t"	".align 8\n""9:\t"	".long	23f-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"	".byte	0x16	# DW_CFA_val_expression\n\t"	".uleb128 0x10\n\t"	".uleb128 12f-11f\n""11:\t"	".byte	0x80	# DW_OP_breg16\n\t"	".sleb128 4b-1b\n""12:\t"	".byte	0x40 + (2b-1b) # DW_CFA_advance_loc\n\t"	".byte	0x16	# DW_CFA_val_expression\n\t"	".uleb128 0x10\n\t"	".uleb128 14f-13f\n""13:\t"	".byte	0x80	# DW_OP_breg16\n\t"	".sleb128 4b-2b\n""14:\t"	".byte	0x40 + (3b-2b) # DW_CFA_advance_loc\n\t"	".byte	0x0e	# DW_CFA_def_cfa_offset\n\t"	".uleb128 0\n\t"	".byte	0x16	# DW_CFA_val_expression\n\t"	".uleb128 0x10\n\t"	".uleb128 16f-15f\n""15:\t"	".byte	0x80	# DW_OP_breg16\n\t"	".sleb128 4b-3b\n""16:\t"	".byte	0x40 + (4b-3b-1) # DW_CFA_advance_loc\n\t"	".byte	0x0e	# DW_CFA_def_cfa_offset\n\t"	".uleb128 128\n\t"	".byte	0x16	# DW_CFA_val_expression\n\t"	".uleb128 0x10\n\t"	".uleb128 20f-17f\n""17:\t"	".byte	0x80	# DW_OP_breg16\n\t"	".sleb128 19f-18f\n\t"	".byte	0x0d	# DW_OP_const4s\n""18:\t"	".4byte	4b-.\n\t"	".byte	0x1c	# DW_OP_minus\n\t"	".byte	0x0d	# DW_OP_const4s\n""19:\t"	".4byte	24f-.\n\t"	".byte	0x22	# DW_OP_plus\n""20:\t"	".byte	0x40 + (5b-4b+1) # DW_CFA_advance_loc\n\t"	".byte	0x13	# DW_CFA_def_cfa_offset_sf\n\t"	".sleb128 16\n\t"	".byte	0x16	# DW_CFA_val_expression\n\t"	".uleb128 0x10\n\t"	".uleb128 22f-21f\n""21:\t"	".byte	0x80	# DW_OP_breg16\n\t"	".sleb128 4b-5b\n""22:\t"	".align 8\n""23:\t"	".previous\n""24:"	: : "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;}intmain (void){  fn0 ();  return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?