This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Some more built-in function attributes


Some more opportunities for cleaning up the code following the
recent attributes for built-in functions patches.  It turns out
that both __builtin_return and __builtin_eh_return builtins were
being manually marked as noreturn (via TREE_THIS_VOLATILE) in
both the C and C++ front-ends.  This special case processing is
no longer necessary if the noreturn attribute is mentioned in
builtins.def.

This patch modifies the DEF_GCC_BUILTIN macro in builtins.def
to allow attributes to be specified per function for GCC's
builtins.  Most entries pass ATTR_NULL preserving the original
behaviour, but __builtin_return, __builtin_eh_return and
__builtin_longjmp are marked noreturn, and the ISO C99 unordered
comparisons (__builtin_isgreater and friends) are marked const.


This patch has been tested by a complete "make bootstrap", all
languages except Ada and treelang, and "make -k check" in the gcc
subdirectory on i686-pc-linux-gnu with no new regressions.

Ok for mainline?


2002-07-20  Roger Sayle  <roger@eyesopen.com>

	* builtins.def [DEF_GCC_BUILTIN]: Require an explicit ATTRS
	argument.  Mark BUILT_IN_RETURN, BUILT_IN_EH_RETURN and
	BUILT_IN_LONGJMP as noreturn, the ISO C99 floating point
	unordered comparisons (e.g. __builtin_isgreater) as const,
	and leave the remaining GCC_BUILTINs unchanged.

	* c-decl.c (builtin_function): No need to explicitly mark
	BUILT_IN_RETURN and BUILT_IN_EH_RETURN as noreturn.

	* cp/decl.c (builtin_function_1): No need to explicitly mark
	BUILT_IN_RETURN and BUILT_IN_EH_RETURN as noreturn.


Index: builtins.def
===================================================================
RCS file: /cvs/gcc/gcc/gcc/builtins.def,v
retrieving revision 1.32
diff -c -3 -p -r1.32 builtins.def
*** builtins.def	16 Jul 2002 02:16:31 -0000	1.32
--- builtins.def	20 Jul 2002 22:41:02 -0000
*************** Software Foundation, 59 Temple Place - S
*** 59,67 ****
     compiler, but does not correspond to a function in the standard
     library.  */
  #undef DEF_GCC_BUILTIN
! #define DEF_GCC_BUILTIN(ENUM, NAME, TYPE)			\
    DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, BT_LAST,	\
!                false, false, false, ATTR_NULL)


  /* A fallback builtin is a builtin (like __builtin_puts) that falls
--- 59,67 ----
     compiler, but does not correspond to a function in the standard
     library.  */
  #undef DEF_GCC_BUILTIN
! #define DEF_GCC_BUILTIN(ENUM, NAME, TYPE, ATTRS)		\
    DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, TYPE, BT_LAST,	\
!                false, false, false, ATTRS)


  /* A fallback builtin is a builtin (like __builtin_puts) that falls
*************** DEF_UNUSED_BUILTIN(BUILT_IN_GETMAN)
*** 364,412 ****

  DEF_GCC_BUILTIN(BUILT_IN_SAVEREGS,
  		"__builtin_saveregs",
! 		BT_FN_PTR_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_CLASSIFY_TYPE,
  		"__builtin_classify_type",
! 		BT_FN_INT_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_NEXT_ARG,
  		"__builtin_next_arg",
! 		BT_FN_PTR_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_ARGS_INFO,
  		"__builtin_args_info",
! 		BT_FN_INT_INT)
  DEF_GCC_BUILTIN(BUILT_IN_CONSTANT_P,
  		"__builtin_constant_p",
! 		BT_FN_INT_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_FRAME_ADDRESS,
  		"__builtin_frame_address",
! 		BT_FN_PTR_UNSIGNED)
  DEF_GCC_BUILTIN(BUILT_IN_RETURN_ADDRESS,
  		"__builtin_return_address",
! 		BT_FN_PTR_UNSIGNED)
  DEF_GCC_BUILTIN(BUILT_IN_AGGREGATE_INCOMING_ADDRESS,
  		"__builtin_aggregate_incoming_address",
! 		BT_FN_PTR_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_APPLY_ARGS,
  		"__builtin_apply_args",
! 		BT_FN_PTR_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_APPLY,
  		"__builtin_apply",
! 		BT_FN_PTR_PTR_FN_VOID_VAR_PTR_SIZE)
  DEF_GCC_BUILTIN(BUILT_IN_RETURN,
  		"__builtin_return",
! 		BT_FN_VOID_PTR)
  DEF_GCC_BUILTIN(BUILT_IN_SETJMP,
  		"__builtin_setjmp",
! 		BT_FN_INT_PTR)
  DEF_GCC_BUILTIN(BUILT_IN_LONGJMP,
  		"__builtin_longjmp",
! 		BT_FN_VOID_PTR_INT)
  DEF_GCC_BUILTIN(BUILT_IN_TRAP,
  		"__builtin_trap",
! 		BT_FN_VOID)
  DEF_GCC_BUILTIN(BUILT_IN_PREFETCH,
  		"__builtin_prefetch",
! 		BT_FN_VOID_CONST_PTR_VAR)

  /* Stdio builtins.  */
  DEF_FALLBACK_BUILTIN(BUILT_IN_PUTCHAR,
--- 364,427 ----

  DEF_GCC_BUILTIN(BUILT_IN_SAVEREGS,
  		"__builtin_saveregs",
! 		BT_FN_PTR_VAR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_CLASSIFY_TYPE,
  		"__builtin_classify_type",
! 		BT_FN_INT_VAR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_NEXT_ARG,
  		"__builtin_next_arg",
! 		BT_FN_PTR_VAR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_ARGS_INFO,
  		"__builtin_args_info",
! 		BT_FN_INT_INT,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_CONSTANT_P,
  		"__builtin_constant_p",
! 		BT_FN_INT_VAR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_FRAME_ADDRESS,
  		"__builtin_frame_address",
! 		BT_FN_PTR_UNSIGNED,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_RETURN_ADDRESS,
  		"__builtin_return_address",
! 		BT_FN_PTR_UNSIGNED,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_AGGREGATE_INCOMING_ADDRESS,
  		"__builtin_aggregate_incoming_address",
! 		BT_FN_PTR_VAR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_APPLY_ARGS,
  		"__builtin_apply_args",
! 		BT_FN_PTR_VAR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_APPLY,
  		"__builtin_apply",
! 		BT_FN_PTR_PTR_FN_VOID_VAR_PTR_SIZE,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_RETURN,
  		"__builtin_return",
! 		BT_FN_VOID_PTR,
! 		ATTR_NORETURN_NOTHROW_LIST)
  DEF_GCC_BUILTIN(BUILT_IN_SETJMP,
  		"__builtin_setjmp",
! 		BT_FN_INT_PTR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_LONGJMP,
  		"__builtin_longjmp",
! 		BT_FN_VOID_PTR_INT,
! 		ATTR_NORETURN_NOTHROW_LIST)
  DEF_GCC_BUILTIN(BUILT_IN_TRAP,
  		"__builtin_trap",
! 		BT_FN_VOID,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_PREFETCH,
  		"__builtin_prefetch",
! 		BT_FN_VOID_CONST_PTR_VAR,
! 		ATTR_NULL)

  /* Stdio builtins.  */
  DEF_FALLBACK_BUILTIN(BUILT_IN_PUTCHAR,
*************** DEF_EXT_FRONT_END_LIB_BUILTIN(BUILT_IN_F
*** 480,545 ****
    /* ISO C99 floating point unordered comparisons.  */
  DEF_GCC_BUILTIN(BUILT_IN_ISGREATER,
  		"__builtin_isgreater",
! 		BT_FN_INT_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_ISGREATEREQUAL,
  		"__builtin_isgreaterequal",
! 		BT_FN_INT_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_ISLESS,
  		"__builtin_isless",
! 		BT_FN_INT_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_ISLESSEQUAL,
  		"__builtin_islessequal",
! 		BT_FN_INT_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_ISLESSGREATER,
  		"__builtin_islessgreater",
! 		BT_FN_INT_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_ISUNORDERED,
  		"__builtin_isunordered",
! 		BT_FN_INT_VAR)

  /* Various hooks for the DWARF 2 __throw routine.  */
  DEF_GCC_BUILTIN(BUILT_IN_UNWIND_INIT,
  		"__builtin_unwind_init",
! 		BT_FN_VOID)
  DEF_GCC_BUILTIN(BUILT_IN_DWARF_CFA,
  		"__builtin_dwarf_cfa",
! 		BT_FN_PTR)
  DEF_GCC_BUILTIN(BUILT_IN_DWARF_FP_REGNUM,
  		"__builtin_dwarf_fp_regnum",
! 		BT_FN_UNSIGNED)
  DEF_GCC_BUILTIN(BUILT_IN_INIT_DWARF_REG_SIZES,
  		"__builtin_init_dwarf_reg_size_table",
! 		BT_FN_VOID_PTR)
  DEF_GCC_BUILTIN(BUILT_IN_FROB_RETURN_ADDR,
  		"__builtin_frob_return_addr",
! 		BT_FN_PTR_PTR)
  DEF_GCC_BUILTIN(BUILT_IN_EXTRACT_RETURN_ADDR,
  		"__builtin_extract_return_addr",
! 		BT_FN_PTR_PTR)
  DEF_GCC_BUILTIN(BUILT_IN_EH_RETURN,
  		"__builtin_eh_return",
! 		BT_FN_VOID_PTRMODE_PTR)
  DEF_GCC_BUILTIN(BUILT_IN_EH_RETURN_DATA_REGNO,
  		"__builtin_eh_return_data_regno",
! 		BT_FN_INT_INT)

  /* Variable argument list (stdarg.h) support */
  DEF_GCC_BUILTIN(BUILT_IN_VA_START,
  		"__builtin_va_start",
! 		BT_FN_VOID_VALIST_REF_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_STDARG_START,		/* backward compat */
  		"__builtin_stdarg_start",
! 		BT_FN_VOID_VALIST_REF_VAR)
  DEF_GCC_BUILTIN(BUILT_IN_VA_END,
  		"__builtin_va_end",
! 		BT_FN_VOID_VALIST_REF)
  DEF_GCC_BUILTIN(BUILT_IN_VA_COPY,
  		"__builtin_va_copy",
! 		BT_FN_VOID_VALIST_REF_VALIST_ARG)

  DEF_GCC_BUILTIN(BUILT_IN_EXPECT,
  		"__builtin_expect",
! 		BT_FN_LONG_LONG_LONG)

  /* C++ extensions */
  DEF_UNUSED_BUILTIN(BUILT_IN_NEW)
--- 495,579 ----
    /* ISO C99 floating point unordered comparisons.  */
  DEF_GCC_BUILTIN(BUILT_IN_ISGREATER,
  		"__builtin_isgreater",
! 		BT_FN_INT_VAR,
! 		ATTR_CONST_NOTHROW_LIST)
  DEF_GCC_BUILTIN(BUILT_IN_ISGREATEREQUAL,
  		"__builtin_isgreaterequal",
! 		BT_FN_INT_VAR,
! 		ATTR_CONST_NOTHROW_LIST)
  DEF_GCC_BUILTIN(BUILT_IN_ISLESS,
  		"__builtin_isless",
! 		BT_FN_INT_VAR,
! 		ATTR_CONST_NOTHROW_LIST)
  DEF_GCC_BUILTIN(BUILT_IN_ISLESSEQUAL,
  		"__builtin_islessequal",
! 		BT_FN_INT_VAR,
! 		ATTR_CONST_NOTHROW_LIST)
  DEF_GCC_BUILTIN(BUILT_IN_ISLESSGREATER,
  		"__builtin_islessgreater",
! 		BT_FN_INT_VAR,
! 		ATTR_CONST_NOTHROW_LIST)
  DEF_GCC_BUILTIN(BUILT_IN_ISUNORDERED,
  		"__builtin_isunordered",
! 		BT_FN_INT_VAR,
! 		ATTR_CONST_NOTHROW_LIST)

  /* Various hooks for the DWARF 2 __throw routine.  */
  DEF_GCC_BUILTIN(BUILT_IN_UNWIND_INIT,
  		"__builtin_unwind_init",
! 		BT_FN_VOID,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_DWARF_CFA,
  		"__builtin_dwarf_cfa",
! 		BT_FN_PTR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_DWARF_FP_REGNUM,
  		"__builtin_dwarf_fp_regnum",
! 		BT_FN_UNSIGNED,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_INIT_DWARF_REG_SIZES,
  		"__builtin_init_dwarf_reg_size_table",
! 		BT_FN_VOID_PTR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_FROB_RETURN_ADDR,
  		"__builtin_frob_return_addr",
! 		BT_FN_PTR_PTR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_EXTRACT_RETURN_ADDR,
  		"__builtin_extract_return_addr",
! 		BT_FN_PTR_PTR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_EH_RETURN,
  		"__builtin_eh_return",
! 		BT_FN_VOID_PTRMODE_PTR,
! 		ATTR_NORETURN_NOTHROW_LIST)
  DEF_GCC_BUILTIN(BUILT_IN_EH_RETURN_DATA_REGNO,
  		"__builtin_eh_return_data_regno",
! 		BT_FN_INT_INT,
! 		ATTR_NULL)

  /* Variable argument list (stdarg.h) support */
  DEF_GCC_BUILTIN(BUILT_IN_VA_START,
  		"__builtin_va_start",
! 		BT_FN_VOID_VALIST_REF_VAR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_STDARG_START,		/* backward compat */
  		"__builtin_stdarg_start",
! 		BT_FN_VOID_VALIST_REF_VAR,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_VA_END,
  		"__builtin_va_end",
! 		BT_FN_VOID_VALIST_REF,
! 		ATTR_NULL)
  DEF_GCC_BUILTIN(BUILT_IN_VA_COPY,
  		"__builtin_va_copy",
! 		BT_FN_VOID_VALIST_REF_VALIST_ARG,
! 		ATTR_NULL)

  DEF_GCC_BUILTIN(BUILT_IN_EXPECT,
  		"__builtin_expect",
! 		BT_FN_LONG_LONG_LONG,
! 		ATTR_NULL)

  /* C++ extensions */
  DEF_UNUSED_BUILTIN(BUILT_IN_NEW)
Index: c-decl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-decl.c,v
retrieving revision 1.338
diff -c -3 -p -r1.338 c-decl.c
*** c-decl.c	16 Jul 2002 02:16:31 -0000	1.338
--- c-decl.c	20 Jul 2002 22:41:03 -0000
*************** builtin_function (name, type, function_c
*** 2973,2982 ****
    DECL_BUILT_IN_CLASS (decl) = class;
    DECL_FUNCTION_CODE (decl) = function_code;

-   /* The return builtins leave the current function.  */
-   if (function_code == BUILT_IN_RETURN || function_code == BUILT_IN_EH_RETURN)
-     TREE_THIS_VOLATILE (decl) = 1;
-
    /* Warn if a function in the namespace for users
       is used without an occasion to consider it declared.  */
    if (name[0] != '_' || name[1] != '_')
--- 2973,2978 ----
Index: cp/decl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/decl.c,v
retrieving revision 1.921
diff -c -3 -p -r1.921 decl.c
*** cp/decl.c	17 Jul 2002 14:07:42 -0000	1.921
--- cp/decl.c	20 Jul 2002 22:41:05 -0000
*************** builtin_function_1 (name, type, context,
*** 6749,6758 ****
    DECL_FUNCTION_CODE (decl) = code;
    DECL_CONTEXT (decl) = context;

-   /* The return builtins leave the current function.  */
-   if (code == BUILT_IN_RETURN || code == BUILT_IN_EH_RETURN)
-     TREE_THIS_VOLATILE (decl) = 1;
-
    pushdecl (decl);

    /* Since `pushdecl' relies on DECL_ASSEMBLER_NAME instead of DECL_NAME,
--- 6749,6754 ----

Roger
--
Roger Sayle,                         E-mail: roger@eyesopen.com
OpenEye Scientific Software,         WWW: http://www.eyesopen.com/
Suite 1107, 3600 Cerrillos Road,     Tel: (+1) 505-473-7385
Santa Fe, New Mexico, 87507.         Fax: (+1) 505-473-0833


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]