diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2013-10-24 19:02:44 +0000 |
---|---|---|
committer | Andrew Macleod <amacleod@gcc.gnu.org> | 2013-10-24 19:02:44 +0000 |
commit | 4a7cb16f83d70f77b4ba3a022486cedb3679394a (patch) | |
tree | 8e5d786c4996eaadcbdecf7ae75cd2cf03575a95 /gcc/builtins.c | |
parent | f258df2d19bfd37f1458d71e32cf206fe6b34bb0 (diff) | |
download | gcc-4a7cb16f83d70f77b4ba3a022486cedb3679394a.zip gcc-4a7cb16f83d70f77b4ba3a022486cedb3679394a.tar.gz gcc-4a7cb16f83d70f77b4ba3a022486cedb3679394a.tar.bz2 |
builtins.c (dummy_object, [...]): Move to gimplify.c.
* builtins.c (dummy_object, gimplify_va_arg_expr): Move to gimplify.c.
* gimplify.c (build_va_arg_indirect_ref, std_gimplify_va_arg_expr):
Move to targhooks.c.
(dummy_object, gimplify_va_arg_expr): Relocate from builtins.c.
* targhooks.c (build_va_arg_indirect_ref, std_gimplify_va_arg_expr):
Relocate from gimplify.c.
* targhooks.h: Add 2 prototypes.
* tree.h. Delete 2 prototypes.
From-SVN: r204032
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 104 |
1 files changed, 0 insertions, 104 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index df6f4af..b380c2c 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -4234,110 +4234,6 @@ expand_builtin_va_start (tree exp) return const0_rtx; } - -/* Return a dummy expression of type TYPE in order to keep going after an - error. */ - -static tree -dummy_object (tree type) -{ - tree t = build_int_cst (build_pointer_type (type), 0); - return build2 (MEM_REF, type, t, t); -} - -/* Gimplify __builtin_va_arg, aka VA_ARG_EXPR, which is not really a - builtin function, but a very special sort of operator. */ - -enum gimplify_status -gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) -{ - tree promoted_type, have_va_type; - tree valist = TREE_OPERAND (*expr_p, 0); - tree type = TREE_TYPE (*expr_p); - tree t; - location_t loc = EXPR_LOCATION (*expr_p); - - /* Verify that valist is of the proper type. */ - have_va_type = TREE_TYPE (valist); - if (have_va_type == error_mark_node) - return GS_ERROR; - have_va_type = targetm.canonical_va_list_type (have_va_type); - - if (have_va_type == NULL_TREE) - { - error_at (loc, "first argument to %<va_arg%> not of type %<va_list%>"); - return GS_ERROR; - } - - /* Generate a diagnostic for requesting data of a type that cannot - be passed through `...' due to type promotion at the call site. */ - if ((promoted_type = lang_hooks.types.type_promotes_to (type)) - != type) - { - static bool gave_help; - bool warned; - - /* Unfortunately, this is merely undefined, rather than a constraint - violation, so we cannot make this an error. If this call is never - executed, the program is still strictly conforming. */ - warned = warning_at (loc, 0, - "%qT is promoted to %qT when passed through %<...%>", - type, promoted_type); - if (!gave_help && warned) - { - gave_help = true; - inform (loc, "(so you should pass %qT not %qT to %<va_arg%>)", - promoted_type, type); - } - - /* We can, however, treat "undefined" any way we please. - Call abort to encourage the user to fix the program. */ - if (warned) - inform (loc, "if this code is reached, the program will abort"); - /* Before the abort, allow the evaluation of the va_list - expression to exit or longjmp. */ - gimplify_and_add (valist, pre_p); - t = build_call_expr_loc (loc, - builtin_decl_implicit (BUILT_IN_TRAP), 0); - gimplify_and_add (t, pre_p); - - /* This is dead code, but go ahead and finish so that the - mode of the result comes out right. */ - *expr_p = dummy_object (type); - return GS_ALL_DONE; - } - else - { - /* Make it easier for the backends by protecting the valist argument - from multiple evaluations. */ - if (TREE_CODE (have_va_type) == ARRAY_TYPE) - { - /* For this case, the backends will be expecting a pointer to - TREE_TYPE (abi), but it's possible we've - actually been given an array (an actual TARGET_FN_ABI_VA_LIST). - So fix it. */ - if (TREE_CODE (TREE_TYPE (valist)) == ARRAY_TYPE) - { - tree p1 = build_pointer_type (TREE_TYPE (have_va_type)); - valist = fold_convert_loc (loc, p1, - build_fold_addr_expr_loc (loc, valist)); - } - - gimplify_expr (&valist, pre_p, post_p, is_gimple_val, fb_rvalue); - } - else - gimplify_expr (&valist, pre_p, post_p, is_gimple_min_lval, fb_lvalue); - - if (!targetm.gimplify_va_arg_expr) - /* FIXME: Once most targets are converted we should merely - assert this is non-null. */ - return GS_ALL_DONE; - - *expr_p = targetm.gimplify_va_arg_expr (valist, type, pre_p, post_p); - return GS_OK; - } -} - /* Expand EXP, a call to __builtin_va_end. */ static rtx |