1 /* Expand builtin functions.
2 Copyright (C) 1988-2018 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* Legacy warning! Please add no further builtin simplifications here
21 (apart from pure constant folding) - builtin simplifications should go
22 to match.pd or gimple-fold.c instead. */
26 #include "coretypes.h"
35 #include "stringpool.h"
37 #include "tree-ssanames.h"
42 #include "diagnostic-core.h"
44 #include "fold-const.h"
45 #include "fold-const-call.h"
46 #include "gimple-ssa-warn-restrict.h"
47 #include "stor-layout.h"
50 #include "tree-object-size.h"
60 #include "typeclass.h"
61 #include "langhooks.h"
62 #include "value-prof.h"
64 #include "stringpool.h"
67 #include "internal-fn.h"
68 #include "case-cfn-macros.h"
69 #include "gimple-fold.h"
71 #include "file-prefix-map.h" /* remap_macro_filename() */
72 #include "gomp-constants.h"
73 #include "omp-general.h"
75 struct target_builtins default_target_builtins
;
77 struct target_builtins
*this_target_builtins
= &default_target_builtins
;
80 /* Define the names of the builtin function types and codes. */
81 const char *const built_in_class_names
[BUILT_IN_LAST
]
82 = {"NOT_BUILT_IN", "BUILT_IN_FRONTEND", "BUILT_IN_MD", "BUILT_IN_NORMAL"};
84 #define DEF_BUILTIN(X, N, C, T, LT, B, F, NA, AT, IM, COND) #X,
85 const char * built_in_names
[(int) END_BUILTINS
] =
87 #include "builtins.def"
90 /* Setup an array of builtin_info_type, make sure each element decl is
91 initialized to NULL_TREE. */
92 builtin_info_type builtin_info
[(int)END_BUILTINS
];
94 /* Non-zero if __builtin_constant_p should be folded right away. */
95 bool force_folding_builtin_constant_p
;
97 static rtx
c_readstr (const char *, scalar_int_mode
);
98 static int target_char_cast (tree
, char *);
99 static rtx
get_memory_rtx (tree
, tree
);
100 static int apply_args_size (void);
101 static int apply_result_size (void);
102 static rtx
result_vector (int, rtx
);
103 static void expand_builtin_prefetch (tree
);
104 static rtx
expand_builtin_apply_args (void);
105 static rtx
expand_builtin_apply_args_1 (void);
106 static rtx
expand_builtin_apply (rtx
, rtx
, rtx
);
107 static void expand_builtin_return (rtx
);
108 static enum type_class
type_to_class (tree
);
109 static rtx
expand_builtin_classify_type (tree
);
110 static rtx
expand_builtin_mathfn_3 (tree
, rtx
, rtx
);
111 static rtx
expand_builtin_mathfn_ternary (tree
, rtx
, rtx
);
112 static rtx
expand_builtin_interclass_mathfn (tree
, rtx
);
113 static rtx
expand_builtin_sincos (tree
);
114 static rtx
expand_builtin_cexpi (tree
, rtx
);
115 static rtx
expand_builtin_int_roundingfn (tree
, rtx
);
116 static rtx
expand_builtin_int_roundingfn_2 (tree
, rtx
);
117 static rtx
expand_builtin_next_arg (void);
118 static rtx
expand_builtin_va_start (tree
);
119 static rtx
expand_builtin_va_end (tree
);
120 static rtx
expand_builtin_va_copy (tree
);
121 static rtx
expand_builtin_strcmp (tree
, rtx
);
122 static rtx
expand_builtin_strncmp (tree
, rtx
, machine_mode
);
123 static rtx
builtin_memcpy_read_str (void *, HOST_WIDE_INT
, scalar_int_mode
);
124 static rtx
expand_builtin_memchr (tree
, rtx
);
125 static rtx
expand_builtin_memcpy (tree
, rtx
);
126 static rtx
expand_builtin_memory_copy_args (tree dest
, tree src
, tree len
,
127 rtx target
, tree exp
, int endp
);
128 static rtx
expand_builtin_memmove (tree
, rtx
);
129 static rtx
expand_builtin_mempcpy (tree
, rtx
);
130 static rtx
expand_builtin_mempcpy_args (tree
, tree
, tree
, rtx
, tree
, int);
131 static rtx
expand_builtin_strcat (tree
, rtx
);
132 static rtx
expand_builtin_strcpy (tree
, rtx
);
133 static rtx
expand_builtin_strcpy_args (tree
, tree
, rtx
);
134 static rtx
expand_builtin_stpcpy (tree
, rtx
, machine_mode
);
135 static rtx
expand_builtin_stpncpy (tree
, rtx
);
136 static rtx
expand_builtin_strncat (tree
, rtx
);
137 static rtx
expand_builtin_strncpy (tree
, rtx
);
138 static rtx
builtin_memset_gen_str (void *, HOST_WIDE_INT
, scalar_int_mode
);
139 static rtx
expand_builtin_memset (tree
, rtx
, machine_mode
);
140 static rtx
expand_builtin_memset_args (tree
, tree
, tree
, rtx
, machine_mode
, tree
);
141 static rtx
expand_builtin_bzero (tree
);
142 static rtx
expand_builtin_strlen (tree
, rtx
, machine_mode
);
143 static rtx
expand_builtin_alloca (tree
);
144 static rtx
expand_builtin_unop (machine_mode
, tree
, rtx
, rtx
, optab
);
145 static rtx
expand_builtin_frame_address (tree
, tree
);
146 static tree
stabilize_va_list_loc (location_t
, tree
, int);
147 static rtx
expand_builtin_expect (tree
, rtx
);
148 static tree
fold_builtin_constant_p (tree
);
149 static tree
fold_builtin_classify_type (tree
);
150 static tree
fold_builtin_strlen (location_t
, tree
, tree
);
151 static tree
fold_builtin_inf (location_t
, tree
, int);
152 static tree
rewrite_call_expr (location_t
, tree
, int, tree
, int, ...);
153 static bool validate_arg (const_tree
, enum tree_code code
);
154 static rtx
expand_builtin_fabs (tree
, rtx
, rtx
);
155 static rtx
expand_builtin_signbit (tree
, rtx
);
156 static tree
fold_builtin_memcmp (location_t
, tree
, tree
, tree
);
157 static tree
fold_builtin_isascii (location_t
, tree
);
158 static tree
fold_builtin_toascii (location_t
, tree
);
159 static tree
fold_builtin_isdigit (location_t
, tree
);
160 static tree
fold_builtin_fabs (location_t
, tree
, tree
);
161 static tree
fold_builtin_abs (location_t
, tree
, tree
);
162 static tree
fold_builtin_unordered_cmp (location_t
, tree
, tree
, tree
, enum tree_code
,
164 static tree
fold_builtin_0 (location_t
, tree
);
165 static tree
fold_builtin_1 (location_t
, tree
, tree
);
166 static tree
fold_builtin_2 (location_t
, tree
, tree
, tree
);
167 static tree
fold_builtin_3 (location_t
, tree
, tree
, tree
, tree
);
168 static tree
fold_builtin_varargs (location_t
, tree
, tree
*, int);
170 static tree
fold_builtin_strpbrk (location_t
, tree
, tree
, tree
);
171 static tree
fold_builtin_strspn (location_t
, tree
, tree
);
172 static tree
fold_builtin_strcspn (location_t
, tree
, tree
);
174 static rtx
expand_builtin_object_size (tree
);
175 static rtx
expand_builtin_memory_chk (tree
, rtx
, machine_mode
,
176 enum built_in_function
);
177 static void maybe_emit_chk_warning (tree
, enum built_in_function
);
178 static void maybe_emit_sprintf_chk_warning (tree
, enum built_in_function
);
179 static void maybe_emit_free_warning (tree
);
180 static tree
fold_builtin_object_size (tree
, tree
);
182 unsigned HOST_WIDE_INT target_newline
;
183 unsigned HOST_WIDE_INT target_percent
;
184 static unsigned HOST_WIDE_INT target_c
;
185 static unsigned HOST_WIDE_INT target_s
;
186 char target_percent_c
[3];
187 char target_percent_s
[3];
188 char target_percent_s_newline
[4];
189 static tree
do_mpfr_remquo (tree
, tree
, tree
);
190 static tree
do_mpfr_lgamma_r (tree
, tree
, tree
);
191 static void expand_builtin_sync_synchronize (void);
193 /* Return true if NAME starts with __builtin_ or __sync_. */
196 is_builtin_name (const char *name
)
198 if (strncmp (name
, "__builtin_", 10) == 0)
200 if (strncmp (name
, "__sync_", 7) == 0)
202 if (strncmp (name
, "__atomic_", 9) == 0)
208 /* Return true if DECL is a function symbol representing a built-in. */
211 is_builtin_fn (tree decl
)
213 return TREE_CODE (decl
) == FUNCTION_DECL
&& DECL_BUILT_IN (decl
);
216 /* Return true if NODE should be considered for inline expansion regardless
217 of the optimization level. This means whenever a function is invoked with
218 its "internal" name, which normally contains the prefix "__builtin". */
221 called_as_built_in (tree node
)
223 /* Note that we must use DECL_NAME, not DECL_ASSEMBLER_NAME_SET_P since
224 we want the name used to call the function, not the name it
226 const char *name
= IDENTIFIER_POINTER (DECL_NAME (node
));
227 return is_builtin_name (name
);
230 /* Compute values M and N such that M divides (address of EXP - N) and such
231 that N < M. If these numbers can be determined, store M in alignp and N in
232 *BITPOSP and return true. Otherwise return false and store BITS_PER_UNIT to
233 *alignp and any bit-offset to *bitposp.
235 Note that the address (and thus the alignment) computed here is based
236 on the address to which a symbol resolves, whereas DECL_ALIGN is based
237 on the address at which an object is actually located. These two
238 addresses are not always the same. For example, on ARM targets,
239 the address &foo of a Thumb function foo() has the lowest bit set,
240 whereas foo() itself starts on an even address.
242 If ADDR_P is true we are taking the address of the memory reference EXP
243 and thus cannot rely on the access taking place. */
246 get_object_alignment_2 (tree exp
, unsigned int *alignp
,
247 unsigned HOST_WIDE_INT
*bitposp
, bool addr_p
)
249 poly_int64 bitsize
, bitpos
;
252 int unsignedp
, reversep
, volatilep
;
253 unsigned int align
= BITS_PER_UNIT
;
254 bool known_alignment
= false;
256 /* Get the innermost object and the constant (bitpos) and possibly
257 variable (offset) offset of the access. */
258 exp
= get_inner_reference (exp
, &bitsize
, &bitpos
, &offset
, &mode
,
259 &unsignedp
, &reversep
, &volatilep
);
261 /* Extract alignment information from the innermost object and
262 possibly adjust bitpos and offset. */
263 if (TREE_CODE (exp
) == FUNCTION_DECL
)
265 /* Function addresses can encode extra information besides their
266 alignment. However, if TARGET_PTRMEMFUNC_VBIT_LOCATION
267 allows the low bit to be used as a virtual bit, we know
268 that the address itself must be at least 2-byte aligned. */
269 if (TARGET_PTRMEMFUNC_VBIT_LOCATION
== ptrmemfunc_vbit_in_pfn
)
270 align
= 2 * BITS_PER_UNIT
;
272 else if (TREE_CODE (exp
) == LABEL_DECL
)
274 else if (TREE_CODE (exp
) == CONST_DECL
)
276 /* The alignment of a CONST_DECL is determined by its initializer. */
277 exp
= DECL_INITIAL (exp
);
278 align
= TYPE_ALIGN (TREE_TYPE (exp
));
279 if (CONSTANT_CLASS_P (exp
))
280 align
= targetm
.constant_alignment (exp
, align
);
282 known_alignment
= true;
284 else if (DECL_P (exp
))
286 align
= DECL_ALIGN (exp
);
287 known_alignment
= true;
289 else if (TREE_CODE (exp
) == INDIRECT_REF
290 || TREE_CODE (exp
) == MEM_REF
291 || TREE_CODE (exp
) == TARGET_MEM_REF
)
293 tree addr
= TREE_OPERAND (exp
, 0);
295 unsigned HOST_WIDE_INT ptr_bitpos
;
296 unsigned HOST_WIDE_INT ptr_bitmask
= ~0;
298 /* If the address is explicitely aligned, handle that. */
299 if (TREE_CODE (addr
) == BIT_AND_EXPR
300 && TREE_CODE (TREE_OPERAND (addr
, 1)) == INTEGER_CST
)
302 ptr_bitmask
= TREE_INT_CST_LOW (TREE_OPERAND (addr
, 1));
303 ptr_bitmask
*= BITS_PER_UNIT
;
304 align
= least_bit_hwi (ptr_bitmask
);
305 addr
= TREE_OPERAND (addr
, 0);
309 = get_pointer_alignment_1 (addr
, &ptr_align
, &ptr_bitpos
);
310 align
= MAX (ptr_align
, align
);
312 /* Re-apply explicit alignment to the bitpos. */
313 ptr_bitpos
&= ptr_bitmask
;
315 /* The alignment of the pointer operand in a TARGET_MEM_REF
316 has to take the variable offset parts into account. */
317 if (TREE_CODE (exp
) == TARGET_MEM_REF
)
321 unsigned HOST_WIDE_INT step
= 1;
323 step
= TREE_INT_CST_LOW (TMR_STEP (exp
));
324 align
= MIN (align
, least_bit_hwi (step
) * BITS_PER_UNIT
);
326 if (TMR_INDEX2 (exp
))
327 align
= BITS_PER_UNIT
;
328 known_alignment
= false;
331 /* When EXP is an actual memory reference then we can use
332 TYPE_ALIGN of a pointer indirection to derive alignment.
333 Do so only if get_pointer_alignment_1 did not reveal absolute
334 alignment knowledge and if using that alignment would
335 improve the situation. */
337 if (!addr_p
&& !known_alignment
338 && (talign
= min_align_of_type (TREE_TYPE (exp
)) * BITS_PER_UNIT
)
343 /* Else adjust bitpos accordingly. */
344 bitpos
+= ptr_bitpos
;
345 if (TREE_CODE (exp
) == MEM_REF
346 || TREE_CODE (exp
) == TARGET_MEM_REF
)
347 bitpos
+= mem_ref_offset (exp
).force_shwi () * BITS_PER_UNIT
;
350 else if (TREE_CODE (exp
) == STRING_CST
)
352 /* STRING_CST are the only constant objects we allow to be not
353 wrapped inside a CONST_DECL. */
354 align
= TYPE_ALIGN (TREE_TYPE (exp
));
355 if (CONSTANT_CLASS_P (exp
))
356 align
= targetm
.constant_alignment (exp
, align
);
358 known_alignment
= true;
361 /* If there is a non-constant offset part extract the maximum
362 alignment that can prevail. */
365 unsigned int trailing_zeros
= tree_ctz (offset
);
366 if (trailing_zeros
< HOST_BITS_PER_INT
)
368 unsigned int inner
= (1U << trailing_zeros
) * BITS_PER_UNIT
;
370 align
= MIN (align
, inner
);
374 /* Account for the alignment of runtime coefficients, so that the constant
375 bitpos is guaranteed to be accurate. */
376 unsigned int alt_align
= ::known_alignment (bitpos
- bitpos
.coeffs
[0]);
377 if (alt_align
!= 0 && alt_align
< align
)
380 known_alignment
= false;
384 *bitposp
= bitpos
.coeffs
[0] & (align
- 1);
385 return known_alignment
;
388 /* For a memory reference expression EXP compute values M and N such that M
389 divides (&EXP - N) and such that N < M. If these numbers can be determined,
390 store M in alignp and N in *BITPOSP and return true. Otherwise return false
391 and store BITS_PER_UNIT to *alignp and any bit-offset to *bitposp. */
394 get_object_alignment_1 (tree exp
, unsigned int *alignp
,
395 unsigned HOST_WIDE_INT
*bitposp
)
397 return get_object_alignment_2 (exp
, alignp
, bitposp
, false);
400 /* Return the alignment in bits of EXP, an object. */
403 get_object_alignment (tree exp
)
405 unsigned HOST_WIDE_INT bitpos
= 0;
408 get_object_alignment_1 (exp
, &align
, &bitpos
);
410 /* align and bitpos now specify known low bits of the pointer.
411 ptr & (align - 1) == bitpos. */
414 align
= least_bit_hwi (bitpos
);
418 /* For a pointer valued expression EXP compute values M and N such that M
419 divides (EXP - N) and such that N < M. If these numbers can be determined,
420 store M in alignp and N in *BITPOSP and return true. Return false if
421 the results are just a conservative approximation.
423 If EXP is not a pointer, false is returned too. */
426 get_pointer_alignment_1 (tree exp
, unsigned int *alignp
,
427 unsigned HOST_WIDE_INT
*bitposp
)
431 if (TREE_CODE (exp
) == ADDR_EXPR
)
432 return get_object_alignment_2 (TREE_OPERAND (exp
, 0),
433 alignp
, bitposp
, true);
434 else if (TREE_CODE (exp
) == POINTER_PLUS_EXPR
)
437 unsigned HOST_WIDE_INT bitpos
;
438 bool res
= get_pointer_alignment_1 (TREE_OPERAND (exp
, 0),
440 if (TREE_CODE (TREE_OPERAND (exp
, 1)) == INTEGER_CST
)
441 bitpos
+= TREE_INT_CST_LOW (TREE_OPERAND (exp
, 1)) * BITS_PER_UNIT
;
444 unsigned int trailing_zeros
= tree_ctz (TREE_OPERAND (exp
, 1));
445 if (trailing_zeros
< HOST_BITS_PER_INT
)
447 unsigned int inner
= (1U << trailing_zeros
) * BITS_PER_UNIT
;
449 align
= MIN (align
, inner
);
453 *bitposp
= bitpos
& (align
- 1);
456 else if (TREE_CODE (exp
) == SSA_NAME
457 && POINTER_TYPE_P (TREE_TYPE (exp
)))
459 unsigned int ptr_align
, ptr_misalign
;
460 struct ptr_info_def
*pi
= SSA_NAME_PTR_INFO (exp
);
462 if (pi
&& get_ptr_info_alignment (pi
, &ptr_align
, &ptr_misalign
))
464 *bitposp
= ptr_misalign
* BITS_PER_UNIT
;
465 *alignp
= ptr_align
* BITS_PER_UNIT
;
466 /* Make sure to return a sensible alignment when the multiplication
467 by BITS_PER_UNIT overflowed. */
469 *alignp
= 1u << (HOST_BITS_PER_INT
- 1);
470 /* We cannot really tell whether this result is an approximation. */
476 *alignp
= BITS_PER_UNIT
;
480 else if (TREE_CODE (exp
) == INTEGER_CST
)
482 *alignp
= BIGGEST_ALIGNMENT
;
483 *bitposp
= ((TREE_INT_CST_LOW (exp
) * BITS_PER_UNIT
)
484 & (BIGGEST_ALIGNMENT
- 1));
489 *alignp
= BITS_PER_UNIT
;
493 /* Return the alignment in bits of EXP, a pointer valued expression.
494 The alignment returned is, by default, the alignment of the thing that
495 EXP points to. If it is not a POINTER_TYPE, 0 is returned.
497 Otherwise, look at the expression to see if we can do better, i.e., if the
498 expression is actually pointing at an object whose alignment is tighter. */
501 get_pointer_alignment (tree exp
)
503 unsigned HOST_WIDE_INT bitpos
= 0;
506 get_pointer_alignment_1 (exp
, &align
, &bitpos
);
508 /* align and bitpos now specify known low bits of the pointer.
509 ptr & (align - 1) == bitpos. */
512 align
= least_bit_hwi (bitpos
);
517 /* Return the number of non-zero elements in the sequence
518 [ PTR, PTR + MAXELTS ) where each element's size is ELTSIZE bytes.
519 ELTSIZE must be a power of 2 less than 8. Used by c_strlen. */
522 string_length (const void *ptr
, unsigned eltsize
, unsigned maxelts
)
524 gcc_checking_assert (eltsize
== 1 || eltsize
== 2 || eltsize
== 4);
530 /* Optimize the common case of plain char. */
531 for (n
= 0; n
< maxelts
; n
++)
533 const char *elt
= (const char*) ptr
+ n
;
540 for (n
= 0; n
< maxelts
; n
++)
542 const char *elt
= (const char*) ptr
+ n
* eltsize
;
543 if (!memcmp (elt
, "\0\0\0\0", eltsize
))
550 /* Compute the length of a null-terminated character string or wide
551 character string handling character sizes of 1, 2, and 4 bytes.
552 TREE_STRING_LENGTH is not the right way because it evaluates to
553 the size of the character array in bytes (as opposed to characters)
554 and because it can contain a zero byte in the middle.
556 ONLY_VALUE should be nonzero if the result is not going to be emitted
557 into the instruction stream and zero if it is going to be expanded.
558 E.g. with i++ ? "foo" : "bar", if ONLY_VALUE is nonzero, constant 3
559 is returned, otherwise NULL, since
560 len = c_strlen (src, 1); if (len) expand_expr (len, ...); would not
561 evaluate the side-effects.
563 If ONLY_VALUE is two then we do not emit warnings about out-of-bound
564 accesses. Note that this implies the result is not going to be emitted
565 into the instruction stream.
567 The value returned is of type `ssizetype'.
569 Unfortunately, string_constant can't access the values of const char
570 arrays with initializers, so neither can we do so here. */
573 c_strlen (tree src
, int only_value
)
576 if (TREE_CODE (src
) == COND_EXPR
577 && (only_value
|| !TREE_SIDE_EFFECTS (TREE_OPERAND (src
, 0))))
581 len1
= c_strlen (TREE_OPERAND (src
, 1), only_value
);
582 len2
= c_strlen (TREE_OPERAND (src
, 2), only_value
);
583 if (tree_int_cst_equal (len1
, len2
))
587 if (TREE_CODE (src
) == COMPOUND_EXPR
588 && (only_value
|| !TREE_SIDE_EFFECTS (TREE_OPERAND (src
, 0))))
589 return c_strlen (TREE_OPERAND (src
, 1), only_value
);
591 location_t loc
= EXPR_LOC_OR_LOC (src
, input_location
);
593 /* Offset from the beginning of the string in bytes. */
595 src
= string_constant (src
, &byteoff
);
599 /* Determine the size of the string element. */
601 = tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (src
))));
603 /* Set MAXELTS to sizeof (SRC) / sizeof (*SRC) - 1, the maximum possible
605 unsigned maxelts
= TREE_STRING_LENGTH (src
) / eltsize
- 1;
607 /* PTR can point to the byte representation of any string type, including
608 char* and wchar_t*. */
609 const char *ptr
= TREE_STRING_POINTER (src
);
611 if (byteoff
&& TREE_CODE (byteoff
) != INTEGER_CST
)
613 /* If the string has an internal zero byte (e.g., "foo\0bar"), we can't
614 compute the offset to the following null if we don't know where to
615 start searching for it. */
616 if (string_length (ptr
, eltsize
, maxelts
) < maxelts
)
618 /* Return when an embedded null character is found. */
623 return ssize_int (0);
625 /* We don't know the starting offset, but we do know that the string
626 has no internal zero bytes. We can assume that the offset falls
627 within the bounds of the string; otherwise, the programmer deserves
628 what he gets. Subtract the offset from the length of the string,
629 and return that. This would perhaps not be valid if we were dealing
630 with named arrays in addition to literal string constants. */
632 return size_diffop_loc (loc
, size_int (maxelts
* eltsize
), byteoff
);
635 /* Offset from the beginning of the string in elements. */
636 HOST_WIDE_INT eltoff
;
638 /* We have a known offset into the string. Start searching there for
639 a null character if we can represent it as a single HOST_WIDE_INT. */
642 else if (! tree_fits_shwi_p (byteoff
))
645 eltoff
= tree_to_shwi (byteoff
) / eltsize
;
647 /* If the offset is known to be out of bounds, warn, and call strlen at
649 if (eltoff
< 0 || eltoff
> maxelts
)
651 /* Suppress multiple warnings for propagated constant strings. */
653 && !TREE_NO_WARNING (src
))
655 warning_at (loc
, OPT_Warray_bounds
,
656 "offset %qwi outside bounds of constant string",
658 TREE_NO_WARNING (src
) = 1;
663 /* Use strlen to search for the first zero byte. Since any strings
664 constructed with build_string will have nulls appended, we win even
665 if we get handed something like (char[4])"abcd".
667 Since ELTOFF is our starting index into the string, no further
668 calculation is needed. */
669 unsigned len
= string_length (ptr
+ eltoff
* eltsize
, eltsize
,
672 return ssize_int (len
);
675 /* Return a constant integer corresponding to target reading
676 GET_MODE_BITSIZE (MODE) bits from string constant STR. */
679 c_readstr (const char *str
, scalar_int_mode mode
)
683 HOST_WIDE_INT tmp
[MAX_BITSIZE_MODE_ANY_INT
/ HOST_BITS_PER_WIDE_INT
];
685 gcc_assert (GET_MODE_CLASS (mode
) == MODE_INT
);
686 unsigned int len
= (GET_MODE_PRECISION (mode
) + HOST_BITS_PER_WIDE_INT
- 1)
687 / HOST_BITS_PER_WIDE_INT
;
689 gcc_assert (len
<= MAX_BITSIZE_MODE_ANY_INT
/ HOST_BITS_PER_WIDE_INT
);
690 for (i
= 0; i
< len
; i
++)
694 for (i
= 0; i
< GET_MODE_SIZE (mode
); i
++)
697 if (WORDS_BIG_ENDIAN
)
698 j
= GET_MODE_SIZE (mode
) - i
- 1;
699 if (BYTES_BIG_ENDIAN
!= WORDS_BIG_ENDIAN
700 && GET_MODE_SIZE (mode
) >= UNITS_PER_WORD
)
701 j
= j
+ UNITS_PER_WORD
- 2 * (j
% UNITS_PER_WORD
) - 1;
705 ch
= (unsigned char) str
[i
];
706 tmp
[j
/ HOST_BITS_PER_WIDE_INT
] |= ch
<< (j
% HOST_BITS_PER_WIDE_INT
);
709 wide_int c
= wide_int::from_array (tmp
, len
, GET_MODE_PRECISION (mode
));
710 return immed_wide_int_const (c
, mode
);
713 /* Cast a target constant CST to target CHAR and if that value fits into
714 host char type, return zero and put that value into variable pointed to by
718 target_char_cast (tree cst
, char *p
)
720 unsigned HOST_WIDE_INT val
, hostval
;
722 if (TREE_CODE (cst
) != INTEGER_CST
723 || CHAR_TYPE_SIZE
> HOST_BITS_PER_WIDE_INT
)
726 /* Do not care if it fits or not right here. */
727 val
= TREE_INT_CST_LOW (cst
);
729 if (CHAR_TYPE_SIZE
< HOST_BITS_PER_WIDE_INT
)
730 val
&= (HOST_WIDE_INT_1U
<< CHAR_TYPE_SIZE
) - 1;
733 if (HOST_BITS_PER_CHAR
< HOST_BITS_PER_WIDE_INT
)
734 hostval
&= (HOST_WIDE_INT_1U
<< HOST_BITS_PER_CHAR
) - 1;
743 /* Similar to save_expr, but assumes that arbitrary code is not executed
744 in between the multiple evaluations. In particular, we assume that a
745 non-addressable local variable will not be modified. */
748 builtin_save_expr (tree exp
)
750 if (TREE_CODE (exp
) == SSA_NAME
751 || (TREE_ADDRESSABLE (exp
) == 0
752 && (TREE_CODE (exp
) == PARM_DECL
753 || (VAR_P (exp
) && !TREE_STATIC (exp
)))))
756 return save_expr (exp
);
759 /* Given TEM, a pointer to a stack frame, follow the dynamic chain COUNT
760 times to get the address of either a higher stack frame, or a return
761 address located within it (depending on FNDECL_CODE). */
764 expand_builtin_return_addr (enum built_in_function fndecl_code
, int count
)
767 rtx tem
= INITIAL_FRAME_ADDRESS_RTX
;
770 /* For a zero count with __builtin_return_address, we don't care what
771 frame address we return, because target-specific definitions will
772 override us. Therefore frame pointer elimination is OK, and using
773 the soft frame pointer is OK.
775 For a nonzero count, or a zero count with __builtin_frame_address,
776 we require a stable offset from the current frame pointer to the
777 previous one, so we must use the hard frame pointer, and
778 we must disable frame pointer elimination. */
779 if (count
== 0 && fndecl_code
== BUILT_IN_RETURN_ADDRESS
)
780 tem
= frame_pointer_rtx
;
783 tem
= hard_frame_pointer_rtx
;
785 /* Tell reload not to eliminate the frame pointer. */
786 crtl
->accesses_prior_frames
= 1;
791 SETUP_FRAME_ADDRESSES ();
793 /* On the SPARC, the return address is not in the frame, it is in a
794 register. There is no way to access it off of the current frame
795 pointer, but it can be accessed off the previous frame pointer by
796 reading the value from the register window save area. */
797 if (RETURN_ADDR_IN_PREVIOUS_FRAME
&& fndecl_code
== BUILT_IN_RETURN_ADDRESS
)
800 /* Scan back COUNT frames to the specified frame. */
801 for (i
= 0; i
< count
; i
++)
803 /* Assume the dynamic chain pointer is in the word that the
804 frame address points to, unless otherwise specified. */
805 tem
= DYNAMIC_CHAIN_ADDRESS (tem
);
806 tem
= memory_address (Pmode
, tem
);
807 tem
= gen_frame_mem (Pmode
, tem
);
808 tem
= copy_to_reg (tem
);
811 /* For __builtin_frame_address, return what we've got. But, on
812 the SPARC for example, we may have to add a bias. */
813 if (fndecl_code
== BUILT_IN_FRAME_ADDRESS
)
814 return FRAME_ADDR_RTX (tem
);
816 /* For __builtin_return_address, get the return address from that frame. */
817 #ifdef RETURN_ADDR_RTX
818 tem
= RETURN_ADDR_RTX (count
, tem
);
820 tem
= memory_address (Pmode
,
821 plus_constant (Pmode
, tem
, GET_MODE_SIZE (Pmode
)));
822 tem
= gen_frame_mem (Pmode
, tem
);
827 /* Alias set used for setjmp buffer. */
828 static alias_set_type setjmp_alias_set
= -1;
830 /* Construct the leading half of a __builtin_setjmp call. Control will
831 return to RECEIVER_LABEL. This is also called directly by the SJLJ
832 exception handling code. */
835 expand_builtin_setjmp_setup (rtx buf_addr
, rtx receiver_label
)
837 machine_mode sa_mode
= STACK_SAVEAREA_MODE (SAVE_NONLOCAL
);
841 if (setjmp_alias_set
== -1)
842 setjmp_alias_set
= new_alias_set ();
844 buf_addr
= convert_memory_address (Pmode
, buf_addr
);
846 buf_addr
= force_reg (Pmode
, force_operand (buf_addr
, NULL_RTX
));
848 /* We store the frame pointer and the address of receiver_label in
849 the buffer and use the rest of it for the stack save area, which
850 is machine-dependent. */
852 mem
= gen_rtx_MEM (Pmode
, buf_addr
);
853 set_mem_alias_set (mem
, setjmp_alias_set
);
854 emit_move_insn (mem
, targetm
.builtin_setjmp_frame_value ());
856 mem
= gen_rtx_MEM (Pmode
, plus_constant (Pmode
, buf_addr
,
857 GET_MODE_SIZE (Pmode
))),
858 set_mem_alias_set (mem
, setjmp_alias_set
);
860 emit_move_insn (validize_mem (mem
),
861 force_reg (Pmode
, gen_rtx_LABEL_REF (Pmode
, receiver_label
)));
863 stack_save
= gen_rtx_MEM (sa_mode
,
864 plus_constant (Pmode
, buf_addr
,
865 2 * GET_MODE_SIZE (Pmode
)));
866 set_mem_alias_set (stack_save
, setjmp_alias_set
);
867 emit_stack_save (SAVE_NONLOCAL
, &stack_save
);
869 /* If there is further processing to do, do it. */
870 if (targetm
.have_builtin_setjmp_setup ())
871 emit_insn (targetm
.gen_builtin_setjmp_setup (buf_addr
));
873 /* We have a nonlocal label. */
874 cfun
->has_nonlocal_label
= 1;
877 /* Construct the trailing part of a __builtin_setjmp call. This is
878 also called directly by the SJLJ exception handling code.
879 If RECEIVER_LABEL is NULL, instead contruct a nonlocal goto handler. */
882 expand_builtin_setjmp_receiver (rtx receiver_label
)
886 /* Mark the FP as used when we get here, so we have to make sure it's
887 marked as used by this function. */
888 emit_use (hard_frame_pointer_rtx
);
890 /* Mark the static chain as clobbered here so life information
891 doesn't get messed up for it. */
892 chain
= rtx_for_static_chain (current_function_decl
, true);
893 if (chain
&& REG_P (chain
))
894 emit_clobber (chain
);
896 /* Now put in the code to restore the frame pointer, and argument
897 pointer, if needed. */
898 if (! targetm
.have_nonlocal_goto ())
900 /* First adjust our frame pointer to its actual value. It was
901 previously set to the start of the virtual area corresponding to
902 the stacked variables when we branched here and now needs to be
903 adjusted to the actual hardware fp value.
905 Assignments to virtual registers are converted by
906 instantiate_virtual_regs into the corresponding assignment
907 to the underlying register (fp in this case) that makes
908 the original assignment true.
909 So the following insn will actually be decrementing fp by
910 TARGET_STARTING_FRAME_OFFSET. */
911 emit_move_insn (virtual_stack_vars_rtx
, hard_frame_pointer_rtx
);
913 /* Restoring the frame pointer also modifies the hard frame pointer.
914 Mark it used (so that the previous assignment remains live once
915 the frame pointer is eliminated) and clobbered (to represent the
916 implicit update from the assignment). */
917 emit_use (hard_frame_pointer_rtx
);
918 emit_clobber (hard_frame_pointer_rtx
);
921 if (!HARD_FRAME_POINTER_IS_ARG_POINTER
&& fixed_regs
[ARG_POINTER_REGNUM
])
923 /* If the argument pointer can be eliminated in favor of the
924 frame pointer, we don't need to restore it. We assume here
925 that if such an elimination is present, it can always be used.
926 This is the case on all known machines; if we don't make this
927 assumption, we do unnecessary saving on many machines. */
929 static const struct elims
{const int from
, to
;} elim_regs
[] = ELIMINABLE_REGS
;
931 for (i
= 0; i
< ARRAY_SIZE (elim_regs
); i
++)
932 if (elim_regs
[i
].from
== ARG_POINTER_REGNUM
933 && elim_regs
[i
].to
== HARD_FRAME_POINTER_REGNUM
)
936 if (i
== ARRAY_SIZE (elim_regs
))
938 /* Now restore our arg pointer from the address at which it
939 was saved in our stack frame. */
940 emit_move_insn (crtl
->args
.internal_arg_pointer
,
941 copy_to_reg (get_arg_pointer_save_area ()));
945 if (receiver_label
!= NULL
&& targetm
.have_builtin_setjmp_receiver ())
946 emit_insn (targetm
.gen_builtin_setjmp_receiver (receiver_label
));
947 else if (targetm
.have_nonlocal_goto_receiver ())
948 emit_insn (targetm
.gen_nonlocal_goto_receiver ());
952 /* We must not allow the code we just generated to be reordered by
953 scheduling. Specifically, the update of the frame pointer must
954 happen immediately, not later. */
955 emit_insn (gen_blockage ());
958 /* __builtin_longjmp is passed a pointer to an array of five words (not
959 all will be used on all machines). It operates similarly to the C
960 library function of the same name, but is more efficient. Much of
961 the code below is copied from the handling of non-local gotos. */
964 expand_builtin_longjmp (rtx buf_addr
, rtx value
)
967 rtx_insn
*insn
, *last
;
968 machine_mode sa_mode
= STACK_SAVEAREA_MODE (SAVE_NONLOCAL
);
970 /* DRAP is needed for stack realign if longjmp is expanded to current
972 if (SUPPORTS_STACK_ALIGNMENT
)
973 crtl
->need_drap
= true;
975 if (setjmp_alias_set
== -1)
976 setjmp_alias_set
= new_alias_set ();
978 buf_addr
= convert_memory_address (Pmode
, buf_addr
);
980 buf_addr
= force_reg (Pmode
, buf_addr
);
982 /* We require that the user must pass a second argument of 1, because
983 that is what builtin_setjmp will return. */
984 gcc_assert (value
== const1_rtx
);
986 last
= get_last_insn ();
987 if (targetm
.have_builtin_longjmp ())
988 emit_insn (targetm
.gen_builtin_longjmp (buf_addr
));
991 fp
= gen_rtx_MEM (Pmode
, buf_addr
);
992 lab
= gen_rtx_MEM (Pmode
, plus_constant (Pmode
, buf_addr
,
993 GET_MODE_SIZE (Pmode
)));
995 stack
= gen_rtx_MEM (sa_mode
, plus_constant (Pmode
, buf_addr
,
996 2 * GET_MODE_SIZE (Pmode
)));
997 set_mem_alias_set (fp
, setjmp_alias_set
);
998 set_mem_alias_set (lab
, setjmp_alias_set
);
999 set_mem_alias_set (stack
, setjmp_alias_set
);
1001 /* Pick up FP, label, and SP from the block and jump. This code is
1002 from expand_goto in stmt.c; see there for detailed comments. */
1003 if (targetm
.have_nonlocal_goto ())
1004 /* We have to pass a value to the nonlocal_goto pattern that will
1005 get copied into the static_chain pointer, but it does not matter
1006 what that value is, because builtin_setjmp does not use it. */
1007 emit_insn (targetm
.gen_nonlocal_goto (value
, lab
, stack
, fp
));
1010 lab
= copy_to_reg (lab
);
1012 emit_clobber (gen_rtx_MEM (BLKmode
, gen_rtx_SCRATCH (VOIDmode
)));
1013 emit_clobber (gen_rtx_MEM (BLKmode
, hard_frame_pointer_rtx
));
1015 emit_move_insn (hard_frame_pointer_rtx
, fp
);
1016 emit_stack_restore (SAVE_NONLOCAL
, stack
);
1018 emit_use (hard_frame_pointer_rtx
);
1019 emit_use (stack_pointer_rtx
);
1020 emit_indirect_jump (lab
);
1024 /* Search backwards and mark the jump insn as a non-local goto.
1025 Note that this precludes the use of __builtin_longjmp to a
1026 __builtin_setjmp target in the same function. However, we've
1027 already cautioned the user that these functions are for
1028 internal exception handling use only. */
1029 for (insn
= get_last_insn (); insn
; insn
= PREV_INSN (insn
))
1031 gcc_assert (insn
!= last
);
1035 add_reg_note (insn
, REG_NON_LOCAL_GOTO
, const0_rtx
);
1038 else if (CALL_P (insn
))
1044 more_const_call_expr_args_p (const const_call_expr_arg_iterator
*iter
)
1046 return (iter
->i
< iter
->n
);
1049 /* This function validates the types of a function call argument list
1050 against a specified list of tree_codes. If the last specifier is a 0,
1051 that represents an ellipsis, otherwise the last specifier must be a
1055 validate_arglist (const_tree callexpr
, ...)
1057 enum tree_code code
;
1060 const_call_expr_arg_iterator iter
;
1063 va_start (ap
, callexpr
);
1064 init_const_call_expr_arg_iterator (callexpr
, &iter
);
1066 /* Get a bitmap of pointer argument numbers declared attribute nonnull. */
1067 tree fn
= CALL_EXPR_FN (callexpr
);
1068 bitmap argmap
= get_nonnull_args (TREE_TYPE (TREE_TYPE (fn
)));
1070 for (unsigned argno
= 1; ; ++argno
)
1072 code
= (enum tree_code
) va_arg (ap
, int);
1077 /* This signifies an ellipses, any further arguments are all ok. */
1081 /* This signifies an endlink, if no arguments remain, return
1082 true, otherwise return false. */
1083 res
= !more_const_call_expr_args_p (&iter
);
1086 /* The actual argument must be nonnull when either the whole
1087 called function has been declared nonnull, or when the formal
1088 argument corresponding to the actual argument has been. */
1090 && (bitmap_empty_p (argmap
) || bitmap_bit_p (argmap
, argno
)))
1092 arg
= next_const_call_expr_arg (&iter
);
1093 if (!validate_arg (arg
, code
) || integer_zerop (arg
))
1099 /* If no parameters remain or the parameter's code does not
1100 match the specified code, return false. Otherwise continue
1101 checking any remaining arguments. */
1102 arg
= next_const_call_expr_arg (&iter
);
1103 if (!validate_arg (arg
, code
))
1109 /* We need gotos here since we can only have one VA_CLOSE in a
1114 BITMAP_FREE (argmap
);
1119 /* Expand a call to __builtin_nonlocal_goto. We're passed the target label
1120 and the address of the save area. */
1123 expand_builtin_nonlocal_goto (tree exp
)
1125 tree t_label
, t_save_area
;
1126 rtx r_label
, r_save_area
, r_fp
, r_sp
;
1129 if (!validate_arglist (exp
, POINTER_TYPE
, POINTER_TYPE
, VOID_TYPE
))
1132 t_label
= CALL_EXPR_ARG (exp
, 0);
1133 t_save_area
= CALL_EXPR_ARG (exp
, 1);
1135 r_label
= expand_normal (t_label
);
1136 r_label
= convert_memory_address (Pmode
, r_label
);
1137 r_save_area
= expand_normal (t_save_area
);
1138 r_save_area
= convert_memory_address (Pmode
, r_save_area
);
1139 /* Copy the address of the save location to a register just in case it was
1140 based on the frame pointer. */
1141 r_save_area
= copy_to_reg (r_save_area
);
1142 r_fp
= gen_rtx_MEM (Pmode
, r_save_area
);
1143 r_sp
= gen_rtx_MEM (STACK_SAVEAREA_MODE (SAVE_NONLOCAL
),
1144 plus_constant (Pmode
, r_save_area
,
1145 GET_MODE_SIZE (Pmode
)));
1147 crtl
->has_nonlocal_goto
= 1;
1149 /* ??? We no longer need to pass the static chain value, afaik. */
1150 if (targetm
.have_nonlocal_goto ())
1151 emit_insn (targetm
.gen_nonlocal_goto (const0_rtx
, r_label
, r_sp
, r_fp
));
1154 r_label
= copy_to_reg (r_label
);
1156 emit_clobber (gen_rtx_MEM (BLKmode
, gen_rtx_SCRATCH (VOIDmode
)));
1157 emit_clobber (gen_rtx_MEM (BLKmode
, hard_frame_pointer_rtx
));
1159 /* Restore frame pointer for containing function. */
1160 emit_move_insn (hard_frame_pointer_rtx
, r_fp
);
1161 emit_stack_restore (SAVE_NONLOCAL
, r_sp
);
1163 /* USE of hard_frame_pointer_rtx added for consistency;
1164 not clear if really needed. */
1165 emit_use (hard_frame_pointer_rtx
);
1166 emit_use (stack_pointer_rtx
);
1168 /* If the architecture is using a GP register, we must
1169 conservatively assume that the target function makes use of it.
1170 The prologue of functions with nonlocal gotos must therefore
1171 initialize the GP register to the appropriate value, and we
1172 must then make sure that this value is live at the point
1173 of the jump. (Note that this doesn't necessarily apply
1174 to targets with a nonlocal_goto pattern; they are free
1175 to implement it in their own way. Note also that this is
1176 a no-op if the GP register is a global invariant.) */
1177 unsigned regnum
= PIC_OFFSET_TABLE_REGNUM
;
1178 if (regnum
!= INVALID_REGNUM
&& fixed_regs
[regnum
])
1179 emit_use (pic_offset_table_rtx
);
1181 emit_indirect_jump (r_label
);
1184 /* Search backwards to the jump insn and mark it as a
1186 for (insn
= get_last_insn (); insn
; insn
= PREV_INSN (insn
))
1190 add_reg_note (insn
, REG_NON_LOCAL_GOTO
, const0_rtx
);
1193 else if (CALL_P (insn
))
1200 /* __builtin_update_setjmp_buf is passed a pointer to an array of five words
1201 (not all will be used on all machines) that was passed to __builtin_setjmp.
1202 It updates the stack pointer in that block to the current value. This is
1203 also called directly by the SJLJ exception handling code. */
1206 expand_builtin_update_setjmp_buf (rtx buf_addr
)
1208 machine_mode sa_mode
= STACK_SAVEAREA_MODE (SAVE_NONLOCAL
);
1209 buf_addr
= convert_memory_address (Pmode
, buf_addr
);
1211 = gen_rtx_MEM (sa_mode
,
1214 plus_constant (Pmode
, buf_addr
,
1215 2 * GET_MODE_SIZE (Pmode
))));
1217 emit_stack_save (SAVE_NONLOCAL
, &stack_save
);
1220 /* Expand a call to __builtin_prefetch. For a target that does not support
1221 data prefetch, evaluate the memory address argument in case it has side
1225 expand_builtin_prefetch (tree exp
)
1227 tree arg0
, arg1
, arg2
;
1231 if (!validate_arglist (exp
, POINTER_TYPE
, 0))
1234 arg0
= CALL_EXPR_ARG (exp
, 0);
1236 /* Arguments 1 and 2 are optional; argument 1 (read/write) defaults to
1237 zero (read) and argument 2 (locality) defaults to 3 (high degree of
1239 nargs
= call_expr_nargs (exp
);
1241 arg1
= CALL_EXPR_ARG (exp
, 1);
1243 arg1
= integer_zero_node
;
1245 arg2
= CALL_EXPR_ARG (exp
, 2);
1247 arg2
= integer_three_node
;
1249 /* Argument 0 is an address. */
1250 op0
= expand_expr (arg0
, NULL_RTX
, Pmode
, EXPAND_NORMAL
);
1252 /* Argument 1 (read/write flag) must be a compile-time constant int. */
1253 if (TREE_CODE (arg1
) != INTEGER_CST
)
1255 error ("second argument to %<__builtin_prefetch%> must be a constant");
1256 arg1
= integer_zero_node
;
1258 op1
= expand_normal (arg1
);
1259 /* Argument 1 must be either zero or one. */
1260 if (INTVAL (op1
) != 0 && INTVAL (op1
) != 1)
1262 warning (0, "invalid second argument to %<__builtin_prefetch%>;"
1267 /* Argument 2 (locality) must be a compile-time constant int. */
1268 if (TREE_CODE (arg2
) != INTEGER_CST
)
1270 error ("third argument to %<__builtin_prefetch%> must be a constant");
1271 arg2
= integer_zero_node
;
1273 op2
= expand_normal (arg2
);
1274 /* Argument 2 must be 0, 1, 2, or 3. */
1275 if (INTVAL (op2
) < 0 || INTVAL (op2
) > 3)
1277 warning (0, "invalid third argument to %<__builtin_prefetch%>; using zero");
1281 if (targetm
.have_prefetch ())
1283 struct expand_operand ops
[3];
1285 create_address_operand (&ops
[0], op0
);
1286 create_integer_operand (&ops
[1], INTVAL (op1
));
1287 create_integer_operand (&ops
[2], INTVAL (op2
));
1288 if (maybe_expand_insn (targetm
.code_for_prefetch
, 3, ops
))
1292 /* Don't do anything with direct references to volatile memory, but
1293 generate code to handle other side effects. */
1294 if (!MEM_P (op0
) && side_effects_p (op0
))
1298 /* Get a MEM rtx for expression EXP which is the address of an operand
1299 to be used in a string instruction (cmpstrsi, movmemsi, ..). LEN is
1300 the maximum length of the block of memory that might be accessed or
1304 get_memory_rtx (tree exp
, tree len
)
1306 tree orig_exp
= exp
;
1309 /* When EXP is not resolved SAVE_EXPR, MEM_ATTRS can be still derived
1310 from its expression, for expr->a.b only <variable>.a.b is recorded. */
1311 if (TREE_CODE (exp
) == SAVE_EXPR
&& !SAVE_EXPR_RESOLVED_P (exp
))
1312 exp
= TREE_OPERAND (exp
, 0);
1314 addr
= expand_expr (orig_exp
, NULL_RTX
, ptr_mode
, EXPAND_NORMAL
);
1315 mem
= gen_rtx_MEM (BLKmode
, memory_address (BLKmode
, addr
));
1317 /* Get an expression we can use to find the attributes to assign to MEM.
1318 First remove any nops. */
1319 while (CONVERT_EXPR_P (exp
)
1320 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (exp
, 0))))
1321 exp
= TREE_OPERAND (exp
, 0);
1323 /* Build a MEM_REF representing the whole accessed area as a byte blob,
1324 (as builtin stringops may alias with anything). */
1325 exp
= fold_build2 (MEM_REF
,
1326 build_array_type (char_type_node
,
1327 build_range_type (sizetype
,
1328 size_one_node
, len
)),
1329 exp
, build_int_cst (ptr_type_node
, 0));
1331 /* If the MEM_REF has no acceptable address, try to get the base object
1332 from the original address we got, and build an all-aliasing
1333 unknown-sized access to that one. */
1334 if (is_gimple_mem_ref_addr (TREE_OPERAND (exp
, 0)))
1335 set_mem_attributes (mem
, exp
, 0);
1336 else if (TREE_CODE (TREE_OPERAND (exp
, 0)) == ADDR_EXPR
1337 && (exp
= get_base_address (TREE_OPERAND (TREE_OPERAND (exp
, 0),
1340 exp
= build_fold_addr_expr (exp
);
1341 exp
= fold_build2 (MEM_REF
,
1342 build_array_type (char_type_node
,
1343 build_range_type (sizetype
,
1346 exp
, build_int_cst (ptr_type_node
, 0));
1347 set_mem_attributes (mem
, exp
, 0);
1349 set_mem_alias_set (mem
, 0);
1353 /* Built-in functions to perform an untyped call and return. */
1355 #define apply_args_mode \
1356 (this_target_builtins->x_apply_args_mode)
1357 #define apply_result_mode \
1358 (this_target_builtins->x_apply_result_mode)
1360 /* Return the size required for the block returned by __builtin_apply_args,
1361 and initialize apply_args_mode. */
1364 apply_args_size (void)
1366 static int size
= -1;
1370 /* The values computed by this function never change. */
1373 /* The first value is the incoming arg-pointer. */
1374 size
= GET_MODE_SIZE (Pmode
);
1376 /* The second value is the structure value address unless this is
1377 passed as an "invisible" first argument. */
1378 if (targetm
.calls
.struct_value_rtx (cfun
? TREE_TYPE (cfun
->decl
) : 0, 0))
1379 size
+= GET_MODE_SIZE (Pmode
);
1381 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
1382 if (FUNCTION_ARG_REGNO_P (regno
))
1384 fixed_size_mode mode
= targetm
.calls
.get_raw_arg_mode (regno
);
1386 gcc_assert (mode
!= VOIDmode
);
1388 align
= GET_MODE_ALIGNMENT (mode
) / BITS_PER_UNIT
;
1389 if (size
% align
!= 0)
1390 size
= CEIL (size
, align
) * align
;
1391 size
+= GET_MODE_SIZE (mode
);
1392 apply_args_mode
[regno
] = mode
;
1396 apply_args_mode
[regno
] = as_a
<fixed_size_mode
> (VOIDmode
);
1402 /* Return the size required for the block returned by __builtin_apply,
1403 and initialize apply_result_mode. */
1406 apply_result_size (void)
1408 static int size
= -1;
1411 /* The values computed by this function never change. */
1416 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
1417 if (targetm
.calls
.function_value_regno_p (regno
))
1419 fixed_size_mode mode
= targetm
.calls
.get_raw_result_mode (regno
);
1421 gcc_assert (mode
!= VOIDmode
);
1423 align
= GET_MODE_ALIGNMENT (mode
) / BITS_PER_UNIT
;
1424 if (size
% align
!= 0)
1425 size
= CEIL (size
, align
) * align
;
1426 size
+= GET_MODE_SIZE (mode
);
1427 apply_result_mode
[regno
] = mode
;
1430 apply_result_mode
[regno
] = as_a
<fixed_size_mode
> (VOIDmode
);
1432 /* Allow targets that use untyped_call and untyped_return to override
1433 the size so that machine-specific information can be stored here. */
1434 #ifdef APPLY_RESULT_SIZE
1435 size
= APPLY_RESULT_SIZE
;
1441 /* Create a vector describing the result block RESULT. If SAVEP is true,
1442 the result block is used to save the values; otherwise it is used to
1443 restore the values. */
1446 result_vector (int savep
, rtx result
)
1448 int regno
, size
, align
, nelts
;
1449 fixed_size_mode mode
;
1451 rtx
*savevec
= XALLOCAVEC (rtx
, FIRST_PSEUDO_REGISTER
);
1454 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
1455 if ((mode
= apply_result_mode
[regno
]) != VOIDmode
)
1457 align
= GET_MODE_ALIGNMENT (mode
) / BITS_PER_UNIT
;
1458 if (size
% align
!= 0)
1459 size
= CEIL (size
, align
) * align
;
1460 reg
= gen_rtx_REG (mode
, savep
? regno
: INCOMING_REGNO (regno
));
1461 mem
= adjust_address (result
, mode
, size
);
1462 savevec
[nelts
++] = (savep
1463 ? gen_rtx_SET (mem
, reg
)
1464 : gen_rtx_SET (reg
, mem
));
1465 size
+= GET_MODE_SIZE (mode
);
1467 return gen_rtx_PARALLEL (VOIDmode
, gen_rtvec_v (nelts
, savevec
));
1470 /* Save the state required to perform an untyped call with the same
1471 arguments as were passed to the current function. */
1474 expand_builtin_apply_args_1 (void)
1477 int size
, align
, regno
;
1478 fixed_size_mode mode
;
1479 rtx struct_incoming_value
= targetm
.calls
.struct_value_rtx (cfun
? TREE_TYPE (cfun
->decl
) : 0, 1);
1481 /* Create a block where the arg-pointer, structure value address,
1482 and argument registers can be saved. */
1483 registers
= assign_stack_local (BLKmode
, apply_args_size (), -1);
1485 /* Walk past the arg-pointer and structure value address. */
1486 size
= GET_MODE_SIZE (Pmode
);
1487 if (targetm
.calls
.struct_value_rtx (cfun
? TREE_TYPE (cfun
->decl
) : 0, 0))
1488 size
+= GET_MODE_SIZE (Pmode
);
1490 /* Save each register used in calling a function to the block. */
1491 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
1492 if ((mode
= apply_args_mode
[regno
]) != VOIDmode
)
1494 align
= GET_MODE_ALIGNMENT (mode
) / BITS_PER_UNIT
;
1495 if (size
% align
!= 0)
1496 size
= CEIL (size
, align
) * align
;
1498 tem
= gen_rtx_REG (mode
, INCOMING_REGNO (regno
));
1500 emit_move_insn (adjust_address (registers
, mode
, size
), tem
);
1501 size
+= GET_MODE_SIZE (mode
);
1504 /* Save the arg pointer to the block. */
1505 tem
= copy_to_reg (crtl
->args
.internal_arg_pointer
);
1506 /* We need the pointer as the caller actually passed them to us, not
1507 as we might have pretended they were passed. Make sure it's a valid
1508 operand, as emit_move_insn isn't expected to handle a PLUS. */
1509 if (STACK_GROWS_DOWNWARD
)
1511 = force_operand (plus_constant (Pmode
, tem
,
1512 crtl
->args
.pretend_args_size
),
1514 emit_move_insn (adjust_address (registers
, Pmode
, 0), tem
);
1516 size
= GET_MODE_SIZE (Pmode
);
1518 /* Save the structure value address unless this is passed as an
1519 "invisible" first argument. */
1520 if (struct_incoming_value
)
1522 emit_move_insn (adjust_address (registers
, Pmode
, size
),
1523 copy_to_reg (struct_incoming_value
));
1524 size
+= GET_MODE_SIZE (Pmode
);
1527 /* Return the address of the block. */
1528 return copy_addr_to_reg (XEXP (registers
, 0));
1531 /* __builtin_apply_args returns block of memory allocated on
1532 the stack into which is stored the arg pointer, structure
1533 value address, static chain, and all the registers that might
1534 possibly be used in performing a function call. The code is
1535 moved to the start of the function so the incoming values are
1539 expand_builtin_apply_args (void)
1541 /* Don't do __builtin_apply_args more than once in a function.
1542 Save the result of the first call and reuse it. */
1543 if (apply_args_value
!= 0)
1544 return apply_args_value
;
1546 /* When this function is called, it means that registers must be
1547 saved on entry to this function. So we migrate the
1548 call to the first insn of this function. */
1552 temp
= expand_builtin_apply_args_1 ();
1553 rtx_insn
*seq
= get_insns ();
1556 apply_args_value
= temp
;
1558 /* Put the insns after the NOTE that starts the function.
1559 If this is inside a start_sequence, make the outer-level insn
1560 chain current, so the code is placed at the start of the
1561 function. If internal_arg_pointer is a non-virtual pseudo,
1562 it needs to be placed after the function that initializes
1564 push_topmost_sequence ();
1565 if (REG_P (crtl
->args
.internal_arg_pointer
)
1566 && REGNO (crtl
->args
.internal_arg_pointer
) > LAST_VIRTUAL_REGISTER
)
1567 emit_insn_before (seq
, parm_birth_insn
);
1569 emit_insn_before (seq
, NEXT_INSN (entry_of_function ()));
1570 pop_topmost_sequence ();
1575 /* Perform an untyped call and save the state required to perform an
1576 untyped return of whatever value was returned by the given function. */
1579 expand_builtin_apply (rtx function
, rtx arguments
, rtx argsize
)
1581 int size
, align
, regno
;
1582 fixed_size_mode mode
;
1583 rtx incoming_args
, result
, reg
, dest
, src
;
1584 rtx_call_insn
*call_insn
;
1585 rtx old_stack_level
= 0;
1586 rtx call_fusage
= 0;
1587 rtx struct_value
= targetm
.calls
.struct_value_rtx (cfun
? TREE_TYPE (cfun
->decl
) : 0, 0);
1589 arguments
= convert_memory_address (Pmode
, arguments
);
1591 /* Create a block where the return registers can be saved. */
1592 result
= assign_stack_local (BLKmode
, apply_result_size (), -1);
1594 /* Fetch the arg pointer from the ARGUMENTS block. */
1595 incoming_args
= gen_reg_rtx (Pmode
);
1596 emit_move_insn (incoming_args
, gen_rtx_MEM (Pmode
, arguments
));
1597 if (!STACK_GROWS_DOWNWARD
)
1598 incoming_args
= expand_simple_binop (Pmode
, MINUS
, incoming_args
, argsize
,
1599 incoming_args
, 0, OPTAB_LIB_WIDEN
);
1601 /* Push a new argument block and copy the arguments. Do not allow
1602 the (potential) memcpy call below to interfere with our stack
1604 do_pending_stack_adjust ();
1607 /* Save the stack with nonlocal if available. */
1608 if (targetm
.have_save_stack_nonlocal ())
1609 emit_stack_save (SAVE_NONLOCAL
, &old_stack_level
);
1611 emit_stack_save (SAVE_BLOCK
, &old_stack_level
);
1613 /* Allocate a block of memory onto the stack and copy the memory
1614 arguments to the outgoing arguments address. We can pass TRUE
1615 as the 4th argument because we just saved the stack pointer
1616 and will restore it right after the call. */
1617 allocate_dynamic_stack_space (argsize
, 0, BIGGEST_ALIGNMENT
, -1, true);
1619 /* Set DRAP flag to true, even though allocate_dynamic_stack_space
1620 may have already set current_function_calls_alloca to true.
1621 current_function_calls_alloca won't be set if argsize is zero,
1622 so we have to guarantee need_drap is true here. */
1623 if (SUPPORTS_STACK_ALIGNMENT
)
1624 crtl
->need_drap
= true;
1626 dest
= virtual_outgoing_args_rtx
;
1627 if (!STACK_GROWS_DOWNWARD
)
1629 if (CONST_INT_P (argsize
))
1630 dest
= plus_constant (Pmode
, dest
, -INTVAL (argsize
));
1632 dest
= gen_rtx_PLUS (Pmode
, dest
, negate_rtx (Pmode
, argsize
));
1634 dest
= gen_rtx_MEM (BLKmode
, dest
);
1635 set_mem_align (dest
, PARM_BOUNDARY
);
1636 src
= gen_rtx_MEM (BLKmode
, incoming_args
);
1637 set_mem_align (src
, PARM_BOUNDARY
);
1638 emit_block_move (dest
, src
, argsize
, BLOCK_OP_NORMAL
);
1640 /* Refer to the argument block. */
1642 arguments
= gen_rtx_MEM (BLKmode
, arguments
);
1643 set_mem_align (arguments
, PARM_BOUNDARY
);
1645 /* Walk past the arg-pointer and structure value address. */
1646 size
= GET_MODE_SIZE (Pmode
);
1648 size
+= GET_MODE_SIZE (Pmode
);
1650 /* Restore each of the registers previously saved. Make USE insns
1651 for each of these registers for use in making the call. */
1652 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
1653 if ((mode
= apply_args_mode
[regno
]) != VOIDmode
)
1655 align
= GET_MODE_ALIGNMENT (mode
) / BITS_PER_UNIT
;
1656 if (size
% align
!= 0)
1657 size
= CEIL (size
, align
) * align
;
1658 reg
= gen_rtx_REG (mode
, regno
);
1659 emit_move_insn (reg
, adjust_address (arguments
, mode
, size
));
1660 use_reg (&call_fusage
, reg
);
1661 size
+= GET_MODE_SIZE (mode
);
1664 /* Restore the structure value address unless this is passed as an
1665 "invisible" first argument. */
1666 size
= GET_MODE_SIZE (Pmode
);
1669 rtx value
= gen_reg_rtx (Pmode
);
1670 emit_move_insn (value
, adjust_address (arguments
, Pmode
, size
));
1671 emit_move_insn (struct_value
, value
);
1672 if (REG_P (struct_value
))
1673 use_reg (&call_fusage
, struct_value
);
1674 size
+= GET_MODE_SIZE (Pmode
);
1677 /* All arguments and registers used for the call are set up by now! */
1678 function
= prepare_call_address (NULL
, function
, NULL
, &call_fusage
, 0, 0);
1680 /* Ensure address is valid. SYMBOL_REF is already valid, so no need,
1681 and we don't want to load it into a register as an optimization,
1682 because prepare_call_address already did it if it should be done. */
1683 if (GET_CODE (function
) != SYMBOL_REF
)
1684 function
= memory_address (FUNCTION_MODE
, function
);
1686 /* Generate the actual call instruction and save the return value. */
1687 if (targetm
.have_untyped_call ())
1689 rtx mem
= gen_rtx_MEM (FUNCTION_MODE
, function
);
1690 emit_call_insn (targetm
.gen_untyped_call (mem
, result
,
1691 result_vector (1, result
)));
1693 else if (targetm
.have_call_value ())
1697 /* Locate the unique return register. It is not possible to
1698 express a call that sets more than one return register using
1699 call_value; use untyped_call for that. In fact, untyped_call
1700 only needs to save the return registers in the given block. */
1701 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
1702 if ((mode
= apply_result_mode
[regno
]) != VOIDmode
)
1704 gcc_assert (!valreg
); /* have_untyped_call required. */
1706 valreg
= gen_rtx_REG (mode
, regno
);
1709 emit_insn (targetm
.gen_call_value (valreg
,
1710 gen_rtx_MEM (FUNCTION_MODE
, function
),
1711 const0_rtx
, NULL_RTX
, const0_rtx
));
1713 emit_move_insn (adjust_address (result
, GET_MODE (valreg
), 0), valreg
);
1718 /* Find the CALL insn we just emitted, and attach the register usage
1720 call_insn
= last_call_insn ();
1721 add_function_usage_to (call_insn
, call_fusage
);
1723 /* Restore the stack. */
1724 if (targetm
.have_save_stack_nonlocal ())
1725 emit_stack_restore (SAVE_NONLOCAL
, old_stack_level
);
1727 emit_stack_restore (SAVE_BLOCK
, old_stack_level
);
1728 fixup_args_size_notes (call_insn
, get_last_insn (), 0);
1732 /* Return the address of the result block. */
1733 result
= copy_addr_to_reg (XEXP (result
, 0));
1734 return convert_memory_address (ptr_mode
, result
);
1737 /* Perform an untyped return. */
1740 expand_builtin_return (rtx result
)
1742 int size
, align
, regno
;
1743 fixed_size_mode mode
;
1745 rtx_insn
*call_fusage
= 0;
1747 result
= convert_memory_address (Pmode
, result
);
1749 apply_result_size ();
1750 result
= gen_rtx_MEM (BLKmode
, result
);
1752 if (targetm
.have_untyped_return ())
1754 rtx vector
= result_vector (0, result
);
1755 emit_jump_insn (targetm
.gen_untyped_return (result
, vector
));
1760 /* Restore the return value and note that each value is used. */
1762 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
1763 if ((mode
= apply_result_mode
[regno
]) != VOIDmode
)
1765 align
= GET_MODE_ALIGNMENT (mode
) / BITS_PER_UNIT
;
1766 if (size
% align
!= 0)
1767 size
= CEIL (size
, align
) * align
;
1768 reg
= gen_rtx_REG (mode
, INCOMING_REGNO (regno
));
1769 emit_move_insn (reg
, adjust_address (result
, mode
, size
));
1771 push_to_sequence (call_fusage
);
1773 call_fusage
= get_insns ();
1775 size
+= GET_MODE_SIZE (mode
);
1778 /* Put the USE insns before the return. */
1779 emit_insn (call_fusage
);
1781 /* Return whatever values was restored by jumping directly to the end
1783 expand_naked_return ();
1786 /* Used by expand_builtin_classify_type and fold_builtin_classify_type. */
1788 static enum type_class
1789 type_to_class (tree type
)
1791 switch (TREE_CODE (type
))
1793 case VOID_TYPE
: return void_type_class
;
1794 case INTEGER_TYPE
: return integer_type_class
;
1795 case ENUMERAL_TYPE
: return enumeral_type_class
;
1796 case BOOLEAN_TYPE
: return boolean_type_class
;
1797 case POINTER_TYPE
: return pointer_type_class
;
1798 case REFERENCE_TYPE
: return reference_type_class
;
1799 case OFFSET_TYPE
: return offset_type_class
;
1800 case REAL_TYPE
: return real_type_class
;
1801 case COMPLEX_TYPE
: return complex_type_class
;
1802 case FUNCTION_TYPE
: return function_type_class
;
1803 case METHOD_TYPE
: return method_type_class
;
1804 case RECORD_TYPE
: return record_type_class
;
1806 case QUAL_UNION_TYPE
: return union_type_class
;
1807 case ARRAY_TYPE
: return (TYPE_STRING_FLAG (type
)
1808 ? string_type_class
: array_type_class
);
1809 case LANG_TYPE
: return lang_type_class
;
1810 default: return no_type_class
;
1814 /* Expand a call EXP to __builtin_classify_type. */
1817 expand_builtin_classify_type (tree exp
)
1819 if (call_expr_nargs (exp
))
1820 return GEN_INT (type_to_class (TREE_TYPE (CALL_EXPR_ARG (exp
, 0))));
1821 return GEN_INT (no_type_class
);
1824 /* This helper macro, meant to be used in mathfn_built_in below, determines
1825 which among a set of builtin math functions is appropriate for a given type
1826 mode. The `F' (float) and `L' (long double) are automatically generated
1827 from the 'double' case. If a function supports the _Float<N> and _Float<N>X
1828 types, there are additional types that are considered with 'F32', 'F64',
1829 'F128', etc. suffixes. */
1830 #define CASE_MATHFN(MATHFN) \
1831 CASE_CFN_##MATHFN: \
1832 fcode = BUILT_IN_##MATHFN; fcodef = BUILT_IN_##MATHFN##F ; \
1833 fcodel = BUILT_IN_##MATHFN##L ; break;
1834 /* Similar to the above, but also add support for the _Float<N> and _Float<N>X
1836 #define CASE_MATHFN_FLOATN(MATHFN) \
1837 CASE_CFN_##MATHFN: \
1838 fcode = BUILT_IN_##MATHFN; fcodef = BUILT_IN_##MATHFN##F ; \
1839 fcodel = BUILT_IN_##MATHFN##L ; fcodef16 = BUILT_IN_##MATHFN##F16 ; \
1840 fcodef32 = BUILT_IN_##MATHFN##F32; fcodef64 = BUILT_IN_##MATHFN##F64 ; \
1841 fcodef128 = BUILT_IN_##MATHFN##F128 ; fcodef32x = BUILT_IN_##MATHFN##F32X ; \
1842 fcodef64x = BUILT_IN_##MATHFN##F64X ; fcodef128x = BUILT_IN_##MATHFN##F128X ;\
1844 /* Similar to above, but appends _R after any F/L suffix. */
1845 #define CASE_MATHFN_REENT(MATHFN) \
1846 case CFN_BUILT_IN_##MATHFN##_R: \
1847 case CFN_BUILT_IN_##MATHFN##F_R: \
1848 case CFN_BUILT_IN_##MATHFN##L_R: \
1849 fcode = BUILT_IN_##MATHFN##_R; fcodef = BUILT_IN_##MATHFN##F_R ; \
1850 fcodel = BUILT_IN_##MATHFN##L_R ; break;
1852 /* Return a function equivalent to FN but operating on floating-point
1853 values of type TYPE, or END_BUILTINS if no such function exists.
1854 This is purely an operation on function codes; it does not guarantee
1855 that the target actually has an implementation of the function. */
1857 static built_in_function
1858 mathfn_built_in_2 (tree type
, combined_fn fn
)
1861 built_in_function fcode
, fcodef
, fcodel
;
1862 built_in_function fcodef16
= END_BUILTINS
;
1863 built_in_function fcodef32
= END_BUILTINS
;
1864 built_in_function fcodef64
= END_BUILTINS
;
1865 built_in_function fcodef128
= END_BUILTINS
;
1866 built_in_function fcodef32x
= END_BUILTINS
;
1867 built_in_function fcodef64x
= END_BUILTINS
;
1868 built_in_function fcodef128x
= END_BUILTINS
;
1880 CASE_MATHFN_FLOATN (CEIL
)
1882 CASE_MATHFN_FLOATN (COPYSIGN
)
1894 CASE_MATHFN_FLOATN (FLOOR
)
1895 CASE_MATHFN_FLOATN (FMA
)
1896 CASE_MATHFN_FLOATN (FMAX
)
1897 CASE_MATHFN_FLOATN (FMIN
)
1901 CASE_MATHFN_REENT (GAMMA
) /* GAMMA_R */
1902 CASE_MATHFN (HUGE_VAL
)
1906 CASE_MATHFN (IFLOOR
)
1909 CASE_MATHFN (IROUND
)
1916 CASE_MATHFN (LFLOOR
)
1917 CASE_MATHFN (LGAMMA
)
1918 CASE_MATHFN_REENT (LGAMMA
) /* LGAMMA_R */
1919 CASE_MATHFN (LLCEIL
)
1920 CASE_MATHFN (LLFLOOR
)
1921 CASE_MATHFN (LLRINT
)
1922 CASE_MATHFN (LLROUND
)
1929 CASE_MATHFN (LROUND
)
1933 CASE_MATHFN_FLOATN (NEARBYINT
)
1934 CASE_MATHFN (NEXTAFTER
)
1935 CASE_MATHFN (NEXTTOWARD
)
1939 CASE_MATHFN (REMAINDER
)
1940 CASE_MATHFN (REMQUO
)
1941 CASE_MATHFN_FLOATN (RINT
)
1942 CASE_MATHFN_FLOATN (ROUND
)
1944 CASE_MATHFN (SCALBLN
)
1945 CASE_MATHFN (SCALBN
)
1946 CASE_MATHFN (SIGNBIT
)
1947 CASE_MATHFN (SIGNIFICAND
)
1949 CASE_MATHFN (SINCOS
)
1951 CASE_MATHFN_FLOATN (SQRT
)
1954 CASE_MATHFN (TGAMMA
)
1955 CASE_MATHFN_FLOATN (TRUNC
)
1961 return END_BUILTINS
;
1964 mtype
= TYPE_MAIN_VARIANT (type
);
1965 if (mtype
== double_type_node
)
1967 else if (mtype
== float_type_node
)
1969 else if (mtype
== long_double_type_node
)
1971 else if (mtype
== float16_type_node
)
1973 else if (mtype
== float32_type_node
)
1975 else if (mtype
== float64_type_node
)
1977 else if (mtype
== float128_type_node
)
1979 else if (mtype
== float32x_type_node
)
1981 else if (mtype
== float64x_type_node
)
1983 else if (mtype
== float128x_type_node
)
1986 return END_BUILTINS
;
1989 /* Return mathematic function equivalent to FN but operating directly on TYPE,
1990 if available. If IMPLICIT_P is true use the implicit builtin declaration,
1991 otherwise use the explicit declaration. If we can't do the conversion,
1995 mathfn_built_in_1 (tree type
, combined_fn fn
, bool implicit_p
)
1997 built_in_function fcode2
= mathfn_built_in_2 (type
, fn
);
1998 if (fcode2
== END_BUILTINS
)
2001 if (implicit_p
&& !builtin_decl_implicit_p (fcode2
))
2004 return builtin_decl_explicit (fcode2
);
2007 /* Like mathfn_built_in_1, but always use the implicit array. */
2010 mathfn_built_in (tree type
, combined_fn fn
)
2012 return mathfn_built_in_1 (type
, fn
, /*implicit=*/ 1);
2015 /* Like mathfn_built_in_1, but take a built_in_function and
2016 always use the implicit array. */
2019 mathfn_built_in (tree type
, enum built_in_function fn
)
2021 return mathfn_built_in_1 (type
, as_combined_fn (fn
), /*implicit=*/ 1);
2024 /* If BUILT_IN_NORMAL function FNDECL has an associated internal function,
2025 return its code, otherwise return IFN_LAST. Note that this function
2026 only tests whether the function is defined in internals.def, not whether
2027 it is actually available on the target. */
2030 associated_internal_fn (tree fndecl
)
2032 gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl
) == BUILT_IN_NORMAL
);
2033 tree return_type
= TREE_TYPE (TREE_TYPE (fndecl
));
2034 switch (DECL_FUNCTION_CODE (fndecl
))
2036 #define DEF_INTERNAL_FLT_FN(NAME, FLAGS, OPTAB, TYPE) \
2037 CASE_FLT_FN (BUILT_IN_##NAME): return IFN_##NAME;
2038 #define DEF_INTERNAL_FLT_FLOATN_FN(NAME, FLAGS, OPTAB, TYPE) \
2039 CASE_FLT_FN (BUILT_IN_##NAME): return IFN_##NAME; \
2040 CASE_FLT_FN_FLOATN_NX (BUILT_IN_##NAME): return IFN_##NAME;
2041 #define DEF_INTERNAL_INT_FN(NAME, FLAGS, OPTAB, TYPE) \
2042 CASE_INT_FN (BUILT_IN_##NAME): return IFN_##NAME;
2043 #include "internal-fn.def"
2045 CASE_FLT_FN (BUILT_IN_POW10
):
2048 CASE_FLT_FN (BUILT_IN_DREM
):
2049 return IFN_REMAINDER
;
2051 CASE_FLT_FN (BUILT_IN_SCALBN
):
2052 CASE_FLT_FN (BUILT_IN_SCALBLN
):
2053 if (REAL_MODE_FORMAT (TYPE_MODE (return_type
))->b
== 2)
2062 /* If CALL is a call to a BUILT_IN_NORMAL function that could be replaced
2063 on the current target by a call to an internal function, return the
2064 code of that internal function, otherwise return IFN_LAST. The caller
2065 is responsible for ensuring that any side-effects of the built-in
2066 call are dealt with correctly. E.g. if CALL sets errno, the caller
2067 must decide that the errno result isn't needed or make it available
2068 in some other way. */
2071 replacement_internal_fn (gcall
*call
)
2073 if (gimple_call_builtin_p (call
, BUILT_IN_NORMAL
))
2075 internal_fn ifn
= associated_internal_fn (gimple_call_fndecl (call
));
2076 if (ifn
!= IFN_LAST
)
2078 tree_pair types
= direct_internal_fn_types (ifn
, call
);
2079 optimization_type opt_type
= bb_optimization_type (gimple_bb (call
));
2080 if (direct_internal_fn_supported_p (ifn
, types
, opt_type
))
2087 /* Expand a call to the builtin trinary math functions (fma).
2088 Return NULL_RTX if a normal call should be emitted rather than expanding the
2089 function in-line. EXP is the expression that is a call to the builtin
2090 function; if convenient, the result should be placed in TARGET.
2091 SUBTARGET may be used as the target for computing one of EXP's
2095 expand_builtin_mathfn_ternary (tree exp
, rtx target
, rtx subtarget
)
2097 optab builtin_optab
;
2098 rtx op0
, op1
, op2
, result
;
2100 tree fndecl
= get_callee_fndecl (exp
);
2101 tree arg0
, arg1
, arg2
;
2104 if (!validate_arglist (exp
, REAL_TYPE
, REAL_TYPE
, REAL_TYPE
, VOID_TYPE
))
2107 arg0
= CALL_EXPR_ARG (exp
, 0);
2108 arg1
= CALL_EXPR_ARG (exp
, 1);
2109 arg2
= CALL_EXPR_ARG (exp
, 2);
2111 switch (DECL_FUNCTION_CODE (fndecl
))
2113 CASE_FLT_FN (BUILT_IN_FMA
):
2114 CASE_FLT_FN_FLOATN_NX (BUILT_IN_FMA
):
2115 builtin_optab
= fma_optab
; break;
2120 /* Make a suitable register to place result in. */
2121 mode
= TYPE_MODE (TREE_TYPE (exp
));
2123 /* Before working hard, check whether the instruction is available. */
2124 if (optab_handler (builtin_optab
, mode
) == CODE_FOR_nothing
)
2127 result
= gen_reg_rtx (mode
);
2129 /* Always stabilize the argument list. */
2130 CALL_EXPR_ARG (exp
, 0) = arg0
= builtin_save_expr (arg0
);
2131 CALL_EXPR_ARG (exp
, 1) = arg1
= builtin_save_expr (arg1
);
2132 CALL_EXPR_ARG (exp
, 2) = arg2
= builtin_save_expr (arg2
);
2134 op0
= expand_expr (arg0
, subtarget
, VOIDmode
, EXPAND_NORMAL
);
2135 op1
= expand_normal (arg1
);
2136 op2
= expand_normal (arg2
);
2140 /* Compute into RESULT.
2141 Set RESULT to wherever the result comes back. */
2142 result
= expand_ternary_op (mode
, builtin_optab
, op0
, op1
, op2
,
2145 /* If we were unable to expand via the builtin, stop the sequence
2146 (without outputting the insns) and call to the library function
2147 with the stabilized argument list. */
2151 return expand_call (exp
, target
, target
== const0_rtx
);
2154 /* Output the entire sequence. */
2155 insns
= get_insns ();
2162 /* Expand a call to the builtin sin and cos math functions.
2163 Return NULL_RTX if a normal call should be emitted rather than expanding the
2164 function in-line. EXP is the expression that is a call to the builtin
2165 function; if convenient, the result should be placed in TARGET.
2166 SUBTARGET may be used as the target for computing one of EXP's
2170 expand_builtin_mathfn_3 (tree exp
, rtx target
, rtx subtarget
)
2172 optab builtin_optab
;
2175 tree fndecl
= get_callee_fndecl (exp
);
2179 if (!validate_arglist (exp
, REAL_TYPE
, VOID_TYPE
))
2182 arg
= CALL_EXPR_ARG (exp
, 0);
2184 switch (DECL_FUNCTION_CODE (fndecl
))
2186 CASE_FLT_FN (BUILT_IN_SIN
):
2187 CASE_FLT_FN (BUILT_IN_COS
):
2188 builtin_optab
= sincos_optab
; break;
2193 /* Make a suitable register to place result in. */
2194 mode
= TYPE_MODE (TREE_TYPE (exp
));
2196 /* Check if sincos insn is available, otherwise fallback
2197 to sin or cos insn. */
2198 if (optab_handler (builtin_optab
, mode
) == CODE_FOR_nothing
)
2199 switch (DECL_FUNCTION_CODE (fndecl
))
2201 CASE_FLT_FN (BUILT_IN_SIN
):
2202 builtin_optab
= sin_optab
; break;
2203 CASE_FLT_FN (BUILT_IN_COS
):
2204 builtin_optab
= cos_optab
; break;
2209 /* Before working hard, check whether the instruction is available. */
2210 if (optab_handler (builtin_optab
, mode
) != CODE_FOR_nothing
)
2212 rtx result
= gen_reg_rtx (mode
);
2214 /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2215 need to expand the argument again. This way, we will not perform
2216 side-effects more the once. */
2217 CALL_EXPR_ARG (exp
, 0) = arg
= builtin_save_expr (arg
);
2219 op0
= expand_expr (arg
, subtarget
, VOIDmode
, EXPAND_NORMAL
);
2223 /* Compute into RESULT.
2224 Set RESULT to wherever the result comes back. */
2225 if (builtin_optab
== sincos_optab
)
2229 switch (DECL_FUNCTION_CODE (fndecl
))
2231 CASE_FLT_FN (BUILT_IN_SIN
):
2232 ok
= expand_twoval_unop (builtin_optab
, op0
, 0, result
, 0);
2234 CASE_FLT_FN (BUILT_IN_COS
):
2235 ok
= expand_twoval_unop (builtin_optab
, op0
, result
, 0, 0);
2243 result
= expand_unop (mode
, builtin_optab
, op0
, result
, 0);
2247 /* Output the entire sequence. */
2248 insns
= get_insns ();
2254 /* If we were unable to expand via the builtin, stop the sequence
2255 (without outputting the insns) and call to the library function
2256 with the stabilized argument list. */
2260 return expand_call (exp
, target
, target
== const0_rtx
);
2263 /* Given an interclass math builtin decl FNDECL and it's argument ARG
2264 return an RTL instruction code that implements the functionality.
2265 If that isn't possible or available return CODE_FOR_nothing. */
2267 static enum insn_code
2268 interclass_mathfn_icode (tree arg
, tree fndecl
)
2270 bool errno_set
= false;
2271 optab builtin_optab
= unknown_optab
;
2274 switch (DECL_FUNCTION_CODE (fndecl
))
2276 CASE_FLT_FN (BUILT_IN_ILOGB
):
2277 errno_set
= true; builtin_optab
= ilogb_optab
; break;
2278 CASE_FLT_FN (BUILT_IN_ISINF
):
2279 builtin_optab
= isinf_optab
; break;
2280 case BUILT_IN_ISNORMAL
:
2281 case BUILT_IN_ISFINITE
:
2282 CASE_FLT_FN (BUILT_IN_FINITE
):
2283 case BUILT_IN_FINITED32
:
2284 case BUILT_IN_FINITED64
:
2285 case BUILT_IN_FINITED128
:
2286 case BUILT_IN_ISINFD32
:
2287 case BUILT_IN_ISINFD64
:
2288 case BUILT_IN_ISINFD128
:
2289 /* These builtins have no optabs (yet). */
2295 /* There's no easy way to detect the case we need to set EDOM. */
2296 if (flag_errno_math
&& errno_set
)
2297 return CODE_FOR_nothing
;
2299 /* Optab mode depends on the mode of the input argument. */
2300 mode
= TYPE_MODE (TREE_TYPE (arg
));
2303 return optab_handler (builtin_optab
, mode
);
2304 return CODE_FOR_nothing
;
2307 /* Expand a call to one of the builtin math functions that operate on
2308 floating point argument and output an integer result (ilogb, isinf,
2310 Return 0 if a normal call should be emitted rather than expanding the
2311 function in-line. EXP is the expression that is a call to the builtin
2312 function; if convenient, the result should be placed in TARGET. */
2315 expand_builtin_interclass_mathfn (tree exp
, rtx target
)
2317 enum insn_code icode
= CODE_FOR_nothing
;
2319 tree fndecl
= get_callee_fndecl (exp
);
2323 if (!validate_arglist (exp
, REAL_TYPE
, VOID_TYPE
))
2326 arg
= CALL_EXPR_ARG (exp
, 0);
2327 icode
= interclass_mathfn_icode (arg
, fndecl
);
2328 mode
= TYPE_MODE (TREE_TYPE (arg
));
2330 if (icode
!= CODE_FOR_nothing
)
2332 struct expand_operand ops
[1];
2333 rtx_insn
*last
= get_last_insn ();
2334 tree orig_arg
= arg
;
2336 /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2337 need to expand the argument again. This way, we will not perform
2338 side-effects more the once. */
2339 CALL_EXPR_ARG (exp
, 0) = arg
= builtin_save_expr (arg
);
2341 op0
= expand_expr (arg
, NULL_RTX
, VOIDmode
, EXPAND_NORMAL
);
2343 if (mode
!= GET_MODE (op0
))
2344 op0
= convert_to_mode (mode
, op0
, 0);
2346 create_output_operand (&ops
[0], target
, TYPE_MODE (TREE_TYPE (exp
)));
2347 if (maybe_legitimize_operands (icode
, 0, 1, ops
)
2348 && maybe_emit_unop_insn (icode
, ops
[0].value
, op0
, UNKNOWN
))
2349 return ops
[0].value
;
2351 delete_insns_since (last
);
2352 CALL_EXPR_ARG (exp
, 0) = orig_arg
;
2358 /* Expand a call to the builtin sincos math function.
2359 Return NULL_RTX if a normal call should be emitted rather than expanding the
2360 function in-line. EXP is the expression that is a call to the builtin
2364 expand_builtin_sincos (tree exp
)
2366 rtx op0
, op1
, op2
, target1
, target2
;
2368 tree arg
, sinp
, cosp
;
2370 location_t loc
= EXPR_LOCATION (exp
);
2371 tree alias_type
, alias_off
;
2373 if (!validate_arglist (exp
, REAL_TYPE
,
2374 POINTER_TYPE
, POINTER_TYPE
, VOID_TYPE
))
2377 arg
= CALL_EXPR_ARG (exp
, 0);
2378 sinp
= CALL_EXPR_ARG (exp
, 1);
2379 cosp
= CALL_EXPR_ARG (exp
, 2);
2381 /* Make a suitable register to place result in. */
2382 mode
= TYPE_MODE (TREE_TYPE (arg
));
2384 /* Check if sincos insn is available, otherwise emit the call. */
2385 if (optab_handler (sincos_optab
, mode
) == CODE_FOR_nothing
)
2388 target1
= gen_reg_rtx (mode
);
2389 target2
= gen_reg_rtx (mode
);
2391 op0
= expand_normal (arg
);
2392 alias_type
= build_pointer_type_for_mode (TREE_TYPE (arg
), ptr_mode
, true);
2393 alias_off
= build_int_cst (alias_type
, 0);
2394 op1
= expand_normal (fold_build2_loc (loc
, MEM_REF
, TREE_TYPE (arg
),
2396 op2
= expand_normal (fold_build2_loc (loc
, MEM_REF
, TREE_TYPE (arg
),
2399 /* Compute into target1 and target2.
2400 Set TARGET to wherever the result comes back. */
2401 result
= expand_twoval_unop (sincos_optab
, op0
, target2
, target1
, 0);
2402 gcc_assert (result
);
2404 /* Move target1 and target2 to the memory locations indicated
2406 emit_move_insn (op1
, target1
);
2407 emit_move_insn (op2
, target2
);
2412 /* Expand a call to the internal cexpi builtin to the sincos math function.
2413 EXP is the expression that is a call to the builtin function; if convenient,
2414 the result should be placed in TARGET. */
2417 expand_builtin_cexpi (tree exp
, rtx target
)
2419 tree fndecl
= get_callee_fndecl (exp
);
2423 location_t loc
= EXPR_LOCATION (exp
);
2425 if (!validate_arglist (exp
, REAL_TYPE
, VOID_TYPE
))
2428 arg
= CALL_EXPR_ARG (exp
, 0);
2429 type
= TREE_TYPE (arg
);
2430 mode
= TYPE_MODE (TREE_TYPE (arg
));
2432 /* Try expanding via a sincos optab, fall back to emitting a libcall
2433 to sincos or cexp. We are sure we have sincos or cexp because cexpi
2434 is only generated from sincos, cexp or if we have either of them. */
2435 if (optab_handler (sincos_optab
, mode
) != CODE_FOR_nothing
)
2437 op1
= gen_reg_rtx (mode
);
2438 op2
= gen_reg_rtx (mode
);
2440 op0
= expand_expr (arg
, NULL_RTX
, VOIDmode
, EXPAND_NORMAL
);
2442 /* Compute into op1 and op2. */
2443 expand_twoval_unop (sincos_optab
, op0
, op2
, op1
, 0);
2445 else if (targetm
.libc_has_function (function_sincos
))
2447 tree call
, fn
= NULL_TREE
;
2451 if (DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_CEXPIF
)
2452 fn
= builtin_decl_explicit (BUILT_IN_SINCOSF
);
2453 else if (DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_CEXPI
)
2454 fn
= builtin_decl_explicit (BUILT_IN_SINCOS
);
2455 else if (DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_CEXPIL
)
2456 fn
= builtin_decl_explicit (BUILT_IN_SINCOSL
);
2460 op1
= assign_temp (TREE_TYPE (arg
), 1, 1);
2461 op2
= assign_temp (TREE_TYPE (arg
), 1, 1);
2462 op1a
= copy_addr_to_reg (XEXP (op1
, 0));
2463 op2a
= copy_addr_to_reg (XEXP (op2
, 0));
2464 top1
= make_tree (build_pointer_type (TREE_TYPE (arg
)), op1a
);
2465 top2
= make_tree (build_pointer_type (TREE_TYPE (arg
)), op2a
);
2467 /* Make sure not to fold the sincos call again. */
2468 call
= build1 (ADDR_EXPR
, build_pointer_type (TREE_TYPE (fn
)), fn
);
2469 expand_normal (build_call_nary (TREE_TYPE (TREE_TYPE (fn
)),
2470 call
, 3, arg
, top1
, top2
));
2474 tree call
, fn
= NULL_TREE
, narg
;
2475 tree ctype
= build_complex_type (type
);
2477 if (DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_CEXPIF
)
2478 fn
= builtin_decl_explicit (BUILT_IN_CEXPF
);
2479 else if (DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_CEXPI
)
2480 fn
= builtin_decl_explicit (BUILT_IN_CEXP
);
2481 else if (DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_CEXPIL
)
2482 fn
= builtin_decl_explicit (BUILT_IN_CEXPL
);
2486 /* If we don't have a decl for cexp create one. This is the
2487 friendliest fallback if the user calls __builtin_cexpi
2488 without full target C99 function support. */
2489 if (fn
== NULL_TREE
)
2492 const char *name
= NULL
;
2494 if (DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_CEXPIF
)
2496 else if (DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_CEXPI
)
2498 else if (DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_CEXPIL
)
2501 fntype
= build_function_type_list (ctype
, ctype
, NULL_TREE
);
2502 fn
= build_fn_decl (name
, fntype
);
2505 narg
= fold_build2_loc (loc
, COMPLEX_EXPR
, ctype
,
2506 build_real (type
, dconst0
), arg
);
2508 /* Make sure not to fold the cexp call again. */
2509 call
= build1 (ADDR_EXPR
, build_pointer_type (TREE_TYPE (fn
)), fn
);
2510 return expand_expr (build_call_nary (ctype
, call
, 1, narg
),
2511 target
, VOIDmode
, EXPAND_NORMAL
);
2514 /* Now build the proper return type. */
2515 return expand_expr (build2 (COMPLEX_EXPR
, build_complex_type (type
),
2516 make_tree (TREE_TYPE (arg
), op2
),
2517 make_tree (TREE_TYPE (arg
), op1
)),
2518 target
, VOIDmode
, EXPAND_NORMAL
);
2521 /* Conveniently construct a function call expression. FNDECL names the
2522 function to be called, N is the number of arguments, and the "..."
2523 parameters are the argument expressions. Unlike build_call_exr
2524 this doesn't fold the call, hence it will always return a CALL_EXPR. */
2527 build_call_nofold_loc (location_t loc
, tree fndecl
, int n
, ...)
2530 tree fntype
= TREE_TYPE (fndecl
);
2531 tree fn
= build1 (ADDR_EXPR
, build_pointer_type (fntype
), fndecl
);
2534 fn
= build_call_valist (TREE_TYPE (fntype
), fn
, n
, ap
);
2536 SET_EXPR_LOCATION (fn
, loc
);
2540 /* Expand a call to one of the builtin rounding functions gcc defines
2541 as an extension (lfloor and lceil). As these are gcc extensions we
2542 do not need to worry about setting errno to EDOM.
2543 If expanding via optab fails, lower expression to (int)(floor(x)).
2544 EXP is the expression that is a call to the builtin function;
2545 if convenient, the result should be placed in TARGET. */
2548 expand_builtin_int_roundingfn (tree exp
, rtx target
)
2550 convert_optab builtin_optab
;
2553 tree fndecl
= get_callee_fndecl (exp
);
2554 enum built_in_function fallback_fn
;
2555 tree fallback_fndecl
;
2559 if (!validate_arglist (exp
, REAL_TYPE
, VOID_TYPE
))
2562 arg
= CALL_EXPR_ARG (exp
, 0);
2564 switch (DECL_FUNCTION_CODE (fndecl
))
2566 CASE_FLT_FN (BUILT_IN_ICEIL
):
2567 CASE_FLT_FN (BUILT_IN_LCEIL
):
2568 CASE_FLT_FN (BUILT_IN_LLCEIL
):
2569 builtin_optab
= lceil_optab
;
2570 fallback_fn
= BUILT_IN_CEIL
;
2573 CASE_FLT_FN (BUILT_IN_IFLOOR
):
2574 CASE_FLT_FN (BUILT_IN_LFLOOR
):
2575 CASE_FLT_FN (BUILT_IN_LLFLOOR
):
2576 builtin_optab
= lfloor_optab
;
2577 fallback_fn
= BUILT_IN_FLOOR
;
2584 /* Make a suitable register to place result in. */
2585 mode
= TYPE_MODE (TREE_TYPE (exp
));
2587 target
= gen_reg_rtx (mode
);
2589 /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2590 need to expand the argument again. This way, we will not perform
2591 side-effects more the once. */
2592 CALL_EXPR_ARG (exp
, 0) = arg
= builtin_save_expr (arg
);
2594 op0
= expand_expr (arg
, NULL
, VOIDmode
, EXPAND_NORMAL
);
2598 /* Compute into TARGET. */
2599 if (expand_sfix_optab (target
, op0
, builtin_optab
))
2601 /* Output the entire sequence. */
2602 insns
= get_insns ();
2608 /* If we were unable to expand via the builtin, stop the sequence
2609 (without outputting the insns). */
2612 /* Fall back to floating point rounding optab. */
2613 fallback_fndecl
= mathfn_built_in (TREE_TYPE (arg
), fallback_fn
);
2615 /* For non-C99 targets we may end up without a fallback fndecl here
2616 if the user called __builtin_lfloor directly. In this case emit
2617 a call to the floor/ceil variants nevertheless. This should result
2618 in the best user experience for not full C99 targets. */
2619 if (fallback_fndecl
== NULL_TREE
)
2622 const char *name
= NULL
;
2624 switch (DECL_FUNCTION_CODE (fndecl
))
2626 case BUILT_IN_ICEIL
:
2627 case BUILT_IN_LCEIL
:
2628 case BUILT_IN_LLCEIL
:
2631 case BUILT_IN_ICEILF
:
2632 case BUILT_IN_LCEILF
:
2633 case BUILT_IN_LLCEILF
:
2636 case BUILT_IN_ICEILL
:
2637 case BUILT_IN_LCEILL
:
2638 case BUILT_IN_LLCEILL
:
2641 case BUILT_IN_IFLOOR
:
2642 case BUILT_IN_LFLOOR
:
2643 case BUILT_IN_LLFLOOR
:
2646 case BUILT_IN_IFLOORF
:
2647 case BUILT_IN_LFLOORF
:
2648 case BUILT_IN_LLFLOORF
:
2651 case BUILT_IN_IFLOORL
:
2652 case BUILT_IN_LFLOORL
:
2653 case BUILT_IN_LLFLOORL
:
2660 fntype
= build_function_type_list (TREE_TYPE (arg
),
2661 TREE_TYPE (arg
), NULL_TREE
);
2662 fallback_fndecl
= build_fn_decl (name
, fntype
);
2665 exp
= build_call_nofold_loc (EXPR_LOCATION (exp
), fallback_fndecl
, 1, arg
);
2667 tmp
= expand_normal (exp
);
2668 tmp
= maybe_emit_group_store (tmp
, TREE_TYPE (exp
));
2670 /* Truncate the result of floating point optab to integer
2671 via expand_fix (). */
2672 target
= gen_reg_rtx (mode
);
2673 expand_fix (target
, tmp
, 0);
2678 /* Expand a call to one of the builtin math functions doing integer
2680 Return 0 if a normal call should be emitted rather than expanding the
2681 function in-line. EXP is the expression that is a call to the builtin
2682 function; if convenient, the result should be placed in TARGET. */
2685 expand_builtin_int_roundingfn_2 (tree exp
, rtx target
)
2687 convert_optab builtin_optab
;
2690 tree fndecl
= get_callee_fndecl (exp
);
2693 enum built_in_function fallback_fn
= BUILT_IN_NONE
;
2695 if (!validate_arglist (exp
, REAL_TYPE
, VOID_TYPE
))
2698 arg
= CALL_EXPR_ARG (exp
, 0);
2700 switch (DECL_FUNCTION_CODE (fndecl
))
2702 CASE_FLT_FN (BUILT_IN_IRINT
):
2703 fallback_fn
= BUILT_IN_LRINT
;
2705 CASE_FLT_FN (BUILT_IN_LRINT
):
2706 CASE_FLT_FN (BUILT_IN_LLRINT
):
2707 builtin_optab
= lrint_optab
;
2710 CASE_FLT_FN (BUILT_IN_IROUND
):
2711 fallback_fn
= BUILT_IN_LROUND
;
2713 CASE_FLT_FN (BUILT_IN_LROUND
):
2714 CASE_FLT_FN (BUILT_IN_LLROUND
):
2715 builtin_optab
= lround_optab
;
2722 /* There's no easy way to detect the case we need to set EDOM. */
2723 if (flag_errno_math
&& fallback_fn
== BUILT_IN_NONE
)
2726 /* Make a suitable register to place result in. */
2727 mode
= TYPE_MODE (TREE_TYPE (exp
));
2729 /* There's no easy way to detect the case we need to set EDOM. */
2730 if (!flag_errno_math
)
2732 rtx result
= gen_reg_rtx (mode
);
2734 /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2735 need to expand the argument again. This way, we will not perform
2736 side-effects more the once. */
2737 CALL_EXPR_ARG (exp
, 0) = arg
= builtin_save_expr (arg
);
2739 op0
= expand_expr (arg
, NULL
, VOIDmode
, EXPAND_NORMAL
);
2743 if (expand_sfix_optab (result
, op0
, builtin_optab
))
2745 /* Output the entire sequence. */
2746 insns
= get_insns ();
2752 /* If we were unable to expand via the builtin, stop the sequence
2753 (without outputting the insns) and call to the library function
2754 with the stabilized argument list. */
2758 if (fallback_fn
!= BUILT_IN_NONE
)
2760 /* Fall back to rounding to long int. Use implicit_p 0 - for non-C99
2761 targets, (int) round (x) should never be transformed into
2762 BUILT_IN_IROUND and if __builtin_iround is called directly, emit
2763 a call to lround in the hope that the target provides at least some
2764 C99 functions. This should result in the best user experience for
2765 not full C99 targets. */
2766 tree fallback_fndecl
= mathfn_built_in_1
2767 (TREE_TYPE (arg
), as_combined_fn (fallback_fn
), 0);
2769 exp
= build_call_nofold_loc (EXPR_LOCATION (exp
),
2770 fallback_fndecl
, 1, arg
);
2772 target
= expand_call (exp
, NULL_RTX
, target
== const0_rtx
);
2773 target
= maybe_emit_group_store (target
, TREE_TYPE (exp
));
2774 return convert_to_mode (mode
, target
, 0);
2777 return expand_call (exp
, target
, target
== const0_rtx
);
2780 /* Expand a call to the powi built-in mathematical function. Return NULL_RTX if
2781 a normal call should be emitted rather than expanding the function
2782 in-line. EXP is the expression that is a call to the builtin
2783 function; if convenient, the result should be placed in TARGET. */
2786 expand_builtin_powi (tree exp
, rtx target
)
2793 if (! validate_arglist (exp
, REAL_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
2796 arg0
= CALL_EXPR_ARG (exp
, 0);
2797 arg1
= CALL_EXPR_ARG (exp
, 1);
2798 mode
= TYPE_MODE (TREE_TYPE (exp
));
2800 /* Emit a libcall to libgcc. */
2802 /* Mode of the 2nd argument must match that of an int. */
2803 mode2
= int_mode_for_size (INT_TYPE_SIZE
, 0).require ();
2805 if (target
== NULL_RTX
)
2806 target
= gen_reg_rtx (mode
);
2808 op0
= expand_expr (arg0
, NULL_RTX
, mode
, EXPAND_NORMAL
);
2809 if (GET_MODE (op0
) != mode
)
2810 op0
= convert_to_mode (mode
, op0
, 0);
2811 op1
= expand_expr (arg1
, NULL_RTX
, mode2
, EXPAND_NORMAL
);
2812 if (GET_MODE (op1
) != mode2
)
2813 op1
= convert_to_mode (mode2
, op1
, 0);
2815 target
= emit_library_call_value (optab_libfunc (powi_optab
, mode
),
2816 target
, LCT_CONST
, mode
,
2817 op0
, mode
, op1
, mode2
);
2822 /* Expand expression EXP which is a call to the strlen builtin. Return
2823 NULL_RTX if we failed the caller should emit a normal call, otherwise
2824 try to get the result in TARGET, if convenient. */
2827 expand_builtin_strlen (tree exp
, rtx target
,
2828 machine_mode target_mode
)
2830 if (!validate_arglist (exp
, POINTER_TYPE
, VOID_TYPE
))
2833 struct expand_operand ops
[4];
2836 tree src
= CALL_EXPR_ARG (exp
, 0);
2838 rtx_insn
*before_strlen
;
2839 machine_mode insn_mode
;
2840 enum insn_code icode
= CODE_FOR_nothing
;
2843 /* If the length can be computed at compile-time, return it. */
2844 len
= c_strlen (src
, 0);
2846 return expand_expr (len
, target
, target_mode
, EXPAND_NORMAL
);
2848 /* If the length can be computed at compile-time and is constant
2849 integer, but there are side-effects in src, evaluate
2850 src for side-effects, then return len.
2851 E.g. x = strlen (i++ ? "xfoo" + 1 : "bar");
2852 can be optimized into: i++; x = 3; */
2853 len
= c_strlen (src
, 1);
2854 if (len
&& TREE_CODE (len
) == INTEGER_CST
)
2856 expand_expr (src
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
2857 return expand_expr (len
, target
, target_mode
, EXPAND_NORMAL
);
2860 align
= get_pointer_alignment (src
) / BITS_PER_UNIT
;
2862 /* If SRC is not a pointer type, don't do this operation inline. */
2866 /* Bail out if we can't compute strlen in the right mode. */
2867 FOR_EACH_MODE_FROM (insn_mode
, target_mode
)
2869 icode
= optab_handler (strlen_optab
, insn_mode
);
2870 if (icode
!= CODE_FOR_nothing
)
2873 if (insn_mode
== VOIDmode
)
2876 /* Make a place to hold the source address. We will not expand
2877 the actual source until we are sure that the expansion will
2878 not fail -- there are trees that cannot be expanded twice. */
2879 src_reg
= gen_reg_rtx (Pmode
);
2881 /* Mark the beginning of the strlen sequence so we can emit the
2882 source operand later. */
2883 before_strlen
= get_last_insn ();
2885 create_output_operand (&ops
[0], target
, insn_mode
);
2886 create_fixed_operand (&ops
[1], gen_rtx_MEM (BLKmode
, src_reg
));
2887 create_integer_operand (&ops
[2], 0);
2888 create_integer_operand (&ops
[3], align
);
2889 if (!maybe_expand_insn (icode
, 4, ops
))
2892 /* Check to see if the argument was declared attribute nonstring
2893 and if so, issue a warning since at this point it's not known
2894 to be nul-terminated. */
2895 maybe_warn_nonstring_arg (get_callee_fndecl (exp
), exp
);
2897 /* Now that we are assured of success, expand the source. */
2899 pat
= expand_expr (src
, src_reg
, Pmode
, EXPAND_NORMAL
);
2902 #ifdef POINTERS_EXTEND_UNSIGNED
2903 if (GET_MODE (pat
) != Pmode
)
2904 pat
= convert_to_mode (Pmode
, pat
,
2905 POINTERS_EXTEND_UNSIGNED
);
2907 emit_move_insn (src_reg
, pat
);
2913 emit_insn_after (pat
, before_strlen
);
2915 emit_insn_before (pat
, get_insns ());
2917 /* Return the value in the proper mode for this function. */
2918 if (GET_MODE (ops
[0].value
) == target_mode
)
2919 target
= ops
[0].value
;
2920 else if (target
!= 0)
2921 convert_move (target
, ops
[0].value
, 0);
2923 target
= convert_to_mode (target_mode
, ops
[0].value
, 0);
2928 /* Callback routine for store_by_pieces. Read GET_MODE_BITSIZE (MODE)
2929 bytes from constant string DATA + OFFSET and return it as target
2933 builtin_memcpy_read_str (void *data
, HOST_WIDE_INT offset
,
2934 scalar_int_mode mode
)
2936 const char *str
= (const char *) data
;
2938 gcc_assert (offset
>= 0
2939 && ((unsigned HOST_WIDE_INT
) offset
+ GET_MODE_SIZE (mode
)
2940 <= strlen (str
) + 1));
2942 return c_readstr (str
+ offset
, mode
);
2945 /* LEN specify length of the block of memcpy/memset operation.
2946 Figure out its range and put it into MIN_SIZE/MAX_SIZE.
2947 In some cases we can make very likely guess on max size, then we
2948 set it into PROBABLE_MAX_SIZE. */
2951 determine_block_size (tree len
, rtx len_rtx
,
2952 unsigned HOST_WIDE_INT
*min_size
,
2953 unsigned HOST_WIDE_INT
*max_size
,
2954 unsigned HOST_WIDE_INT
*probable_max_size
)
2956 if (CONST_INT_P (len_rtx
))
2958 *min_size
= *max_size
= *probable_max_size
= UINTVAL (len_rtx
);
2964 enum value_range_type range_type
= VR_UNDEFINED
;
2966 /* Determine bounds from the type. */
2967 if (tree_fits_uhwi_p (TYPE_MIN_VALUE (TREE_TYPE (len
))))
2968 *min_size
= tree_to_uhwi (TYPE_MIN_VALUE (TREE_TYPE (len
)));
2971 if (tree_fits_uhwi_p (TYPE_MAX_VALUE (TREE_TYPE (len
))))
2972 *probable_max_size
= *max_size
2973 = tree_to_uhwi (TYPE_MAX_VALUE (TREE_TYPE (len
)));
2975 *probable_max_size
= *max_size
= GET_MODE_MASK (GET_MODE (len_rtx
));
2977 if (TREE_CODE (len
) == SSA_NAME
)
2978 range_type
= get_range_info (len
, &min
, &max
);
2979 if (range_type
== VR_RANGE
)
2981 if (wi::fits_uhwi_p (min
) && *min_size
< min
.to_uhwi ())
2982 *min_size
= min
.to_uhwi ();
2983 if (wi::fits_uhwi_p (max
) && *max_size
> max
.to_uhwi ())
2984 *probable_max_size
= *max_size
= max
.to_uhwi ();
2986 else if (range_type
== VR_ANTI_RANGE
)
2988 /* Anti range 0...N lets us to determine minimal size to N+1. */
2991 if (wi::fits_uhwi_p (max
) && max
.to_uhwi () + 1 != 0)
2992 *min_size
= max
.to_uhwi () + 1;
3000 Produce anti range allowing negative values of N. We still
3001 can use the information and make a guess that N is not negative.
3003 else if (!wi::leu_p (max
, 1 << 30) && wi::fits_uhwi_p (min
))
3004 *probable_max_size
= min
.to_uhwi () - 1;
3007 gcc_checking_assert (*max_size
<=
3008 (unsigned HOST_WIDE_INT
)
3009 GET_MODE_MASK (GET_MODE (len_rtx
)));
3012 /* Try to verify that the sizes and lengths of the arguments to a string
3013 manipulation function given by EXP are within valid bounds and that
3014 the operation does not lead to buffer overflow or read past the end.
3015 Arguments other than EXP may be null. When non-null, the arguments
3016 have the following meaning:
3017 DST is the destination of a copy call or NULL otherwise.
3018 SRC is the source of a copy call or NULL otherwise.
3019 DSTWRITE is the number of bytes written into the destination obtained
3020 from the user-supplied size argument to the function (such as in
3021 memcpy(DST, SRCs, DSTWRITE) or strncpy(DST, DRC, DSTWRITE).
3022 MAXREAD is the user-supplied bound on the length of the source sequence
3023 (such as in strncat(d, s, N). It specifies the upper limit on the number
3024 of bytes to write. If NULL, it's taken to be the same as DSTWRITE.
3025 SRCSTR is the source string (such as in strcpy(DST, SRC)) when the
3026 expression EXP is a string function call (as opposed to a memory call
3027 like memcpy). As an exception, SRCSTR can also be an integer denoting
3028 the precomputed size of the source string or object (for functions like
3030 DSTSIZE is the size of the destination object specified by the last
3031 argument to the _chk builtins, typically resulting from the expansion
3032 of __builtin_object_size (such as in __builtin___strcpy_chk(DST, SRC,
3035 When DSTWRITE is null LEN is checked to verify that it doesn't exceed
3038 If the call is successfully verified as safe return true, otherwise
3042 check_access (tree exp
, tree
, tree
, tree dstwrite
,
3043 tree maxread
, tree srcstr
, tree dstsize
)
3045 int opt
= OPT_Wstringop_overflow_
;
3047 /* The size of the largest object is half the address space, or
3048 PTRDIFF_MAX. (This is way too permissive.) */
3049 tree maxobjsize
= max_object_size ();
3051 /* Either the length of the source string for string functions or
3052 the size of the source object for raw memory functions. */
3053 tree slen
= NULL_TREE
;
3055 tree range
[2] = { NULL_TREE
, NULL_TREE
};
3057 /* Set to true when the exact number of bytes written by a string
3058 function like strcpy is not known and the only thing that is
3059 known is that it must be at least one (for the terminating nul). */
3060 bool at_least_one
= false;
3063 /* SRCSTR is normally a pointer to string but as a special case
3064 it can be an integer denoting the length of a string. */
3065 if (POINTER_TYPE_P (TREE_TYPE (srcstr
)))
3067 /* Try to determine the range of lengths the source string
3068 refers to. If it can be determined and is less than
3069 the upper bound given by MAXREAD add one to it for
3070 the terminating nul. Otherwise, set it to one for
3071 the same reason, or to MAXREAD as appropriate. */
3072 get_range_strlen (srcstr
, range
);
3073 if (range
[0] && (!maxread
|| TREE_CODE (maxread
) == INTEGER_CST
))
3075 if (maxread
&& tree_int_cst_le (maxread
, range
[0]))
3076 range
[0] = range
[1] = maxread
;
3078 range
[0] = fold_build2 (PLUS_EXPR
, size_type_node
,
3079 range
[0], size_one_node
);
3081 if (maxread
&& tree_int_cst_le (maxread
, range
[1]))
3083 else if (!integer_all_onesp (range
[1]))
3084 range
[1] = fold_build2 (PLUS_EXPR
, size_type_node
,
3085 range
[1], size_one_node
);
3091 at_least_one
= true;
3092 slen
= size_one_node
;
3099 if (!dstwrite
&& !maxread
)
3101 /* When the only available piece of data is the object size
3102 there is nothing to do. */
3106 /* Otherwise, when the length of the source sequence is known
3107 (as with strlen), set DSTWRITE to it. */
3113 dstsize
= maxobjsize
;
3116 get_size_range (dstwrite
, range
);
3118 tree func
= get_callee_fndecl (exp
);
3120 /* First check the number of bytes to be written against the maximum
3122 if (range
[0] && tree_int_cst_lt (maxobjsize
, range
[0]))
3124 location_t loc
= tree_nonartificial_location (exp
);
3125 loc
= expansion_point_location_if_in_system_header (loc
);
3127 if (range
[0] == range
[1])
3128 warning_at (loc
, opt
,
3129 "%K%qD specified size %E "
3130 "exceeds maximum object size %E",
3131 exp
, func
, range
[0], maxobjsize
);
3133 warning_at (loc
, opt
,
3134 "%K%qD specified size between %E and %E "
3135 "exceeds maximum object size %E",
3137 range
[0], range
[1], maxobjsize
);
3141 /* The number of bytes to write is "exact" if DSTWRITE is non-null,
3142 constant, and in range of unsigned HOST_WIDE_INT. */
3143 bool exactwrite
= dstwrite
&& tree_fits_uhwi_p (dstwrite
);
3145 /* Next check the number of bytes to be written against the destination
3147 if (range
[0] || !exactwrite
|| integer_all_onesp (dstwrite
))
3150 && ((tree_fits_uhwi_p (dstsize
)
3151 && tree_int_cst_lt (dstsize
, range
[0]))
3152 || (tree_fits_uhwi_p (dstwrite
)
3153 && tree_int_cst_lt (dstwrite
, range
[0]))))
3155 if (TREE_NO_WARNING (exp
))
3158 location_t loc
= tree_nonartificial_location (exp
);
3159 loc
= expansion_point_location_if_in_system_header (loc
);
3161 if (dstwrite
== slen
&& at_least_one
)
3163 /* This is a call to strcpy with a destination of 0 size
3164 and a source of unknown length. The call will write
3165 at least one byte past the end of the destination. */
3166 warning_at (loc
, opt
,
3167 "%K%qD writing %E or more bytes into a region "
3168 "of size %E overflows the destination",
3169 exp
, func
, range
[0], dstsize
);
3171 else if (tree_int_cst_equal (range
[0], range
[1]))
3172 warning_n (loc
, opt
, tree_to_uhwi (range
[0]),
3173 "%K%qD writing %E byte into a region "
3174 "of size %E overflows the destination",
3175 "%K%qD writing %E bytes into a region "
3176 "of size %E overflows the destination",
3177 exp
, func
, range
[0], dstsize
);
3178 else if (tree_int_cst_sign_bit (range
[1]))
3180 /* Avoid printing the upper bound if it's invalid. */
3181 warning_at (loc
, opt
,
3182 "%K%qD writing %E or more bytes into a region "
3183 "of size %E overflows the destination",
3184 exp
, func
, range
[0], dstsize
);
3187 warning_at (loc
, opt
,
3188 "%K%qD writing between %E and %E bytes into "
3189 "a region of size %E overflows the destination",
3190 exp
, func
, range
[0], range
[1],
3193 /* Return error when an overflow has been detected. */
3198 /* Check the maximum length of the source sequence against the size
3199 of the destination object if known, or against the maximum size
3203 get_size_range (maxread
, range
);
3205 /* Use the lower end for MAXREAD from now on. */
3209 if (range
[0] && dstsize
&& tree_fits_uhwi_p (dstsize
))
3211 location_t loc
= tree_nonartificial_location (exp
);
3212 loc
= expansion_point_location_if_in_system_header (loc
);
3214 if (tree_int_cst_lt (maxobjsize
, range
[0]))
3216 if (TREE_NO_WARNING (exp
))
3219 /* Warn about crazy big sizes first since that's more
3220 likely to be meaningful than saying that the bound
3221 is greater than the object size if both are big. */
3222 if (range
[0] == range
[1])
3223 warning_at (loc
, opt
,
3224 "%K%qD specified bound %E "
3225 "exceeds maximum object size %E",
3227 range
[0], maxobjsize
);
3229 warning_at (loc
, opt
,
3230 "%K%qD specified bound between %E and %E "
3231 "exceeds maximum object size %E",
3233 range
[0], range
[1], maxobjsize
);
3238 if (dstsize
!= maxobjsize
&& tree_int_cst_lt (dstsize
, range
[0]))
3240 if (TREE_NO_WARNING (exp
))
3243 if (tree_int_cst_equal (range
[0], range
[1]))
3244 warning_at (loc
, opt
,
3245 "%K%qD specified bound %E "
3246 "exceeds destination size %E",
3250 warning_at (loc
, opt
,
3251 "%K%qD specified bound between %E and %E "
3252 "exceeds destination size %E",
3254 range
[0], range
[1], dstsize
);
3260 /* Check for reading past the end of SRC. */
3263 && dstwrite
&& range
[0]
3264 && tree_int_cst_lt (slen
, range
[0]))
3266 if (TREE_NO_WARNING (exp
))
3269 location_t loc
= tree_nonartificial_location (exp
);
3271 if (tree_int_cst_equal (range
[0], range
[1]))
3272 warning_n (loc
, opt
, tree_to_uhwi (range
[0]),
3273 "%K%qD reading %E byte from a region of size %E",
3274 "%K%qD reading %E bytes from a region of size %E",
3275 exp
, func
, range
[0], slen
);
3276 else if (tree_int_cst_sign_bit (range
[1]))
3278 /* Avoid printing the upper bound if it's invalid. */
3279 warning_at (loc
, opt
,
3280 "%K%qD reading %E or more bytes from a region "
3282 exp
, func
, range
[0], slen
);
3285 warning_at (loc
, opt
,
3286 "%K%qD reading between %E and %E bytes from a region "
3288 exp
, func
, range
[0], range
[1], slen
);
3295 /* Helper to compute the size of the object referenced by the DEST
3296 expression which must have pointer type, using Object Size type
3297 OSTYPE (only the least significant 2 bits are used). Return
3298 an estimate of the size of the object if successful or NULL when
3299 the size cannot be determined. When the referenced object involves
3300 a non-constant offset in some range the returned value represents
3301 the largest size given the smallest non-negative offset in the
3302 range. The function is intended for diagnostics and should not
3303 be used to influence code generation or optimization. */
3306 compute_objsize (tree dest
, int ostype
)
3308 unsigned HOST_WIDE_INT size
;
3310 /* Only the two least significant bits are meaningful. */
3313 if (compute_builtin_object_size (dest
, ostype
, &size
))
3314 return build_int_cst (sizetype
, size
);
3316 if (TREE_CODE (dest
) == SSA_NAME
)
3318 gimple
*stmt
= SSA_NAME_DEF_STMT (dest
);
3319 if (!is_gimple_assign (stmt
))
3322 dest
= gimple_assign_rhs1 (stmt
);
3324 tree_code code
= gimple_assign_rhs_code (stmt
);
3325 if (code
== POINTER_PLUS_EXPR
)
3327 /* compute_builtin_object_size fails for addresses with
3328 non-constant offsets. Try to determine the range of
3329 such an offset here and use it to adjus the constant
3331 tree off
= gimple_assign_rhs2 (stmt
);
3332 if (TREE_CODE (off
) == SSA_NAME
3333 && INTEGRAL_TYPE_P (TREE_TYPE (off
)))
3336 enum value_range_type rng
= get_range_info (off
, &min
, &max
);
3338 if (rng
== VR_RANGE
)
3340 if (tree size
= compute_objsize (dest
, ostype
))
3342 wide_int wisiz
= wi::to_wide (size
);
3344 /* Ignore negative offsets for now. For others,
3345 use the lower bound as the most optimistic
3346 estimate of the (remaining)size. */
3347 if (wi::sign_mask (min
))
3349 else if (wi::ltu_p (min
, wisiz
))
3350 return wide_int_to_tree (TREE_TYPE (size
),
3351 wi::sub (wisiz
, min
));
3353 return size_zero_node
;
3358 else if (code
!= ADDR_EXPR
)
3362 /* Unless computing the largest size (for memcpy and other raw memory
3363 functions), try to determine the size of the object from its type. */
3367 if (TREE_CODE (dest
) != ADDR_EXPR
)
3370 tree type
= TREE_TYPE (dest
);
3371 if (TREE_CODE (type
) == POINTER_TYPE
)
3372 type
= TREE_TYPE (type
);
3374 type
= TYPE_MAIN_VARIANT (type
);
3376 if (TREE_CODE (type
) == ARRAY_TYPE
3377 && !array_at_struct_end_p (TREE_OPERAND (dest
, 0)))
3379 /* Return the constant size unless it's zero (that's a zero-length
3380 array likely at the end of a struct). */
3381 tree size
= TYPE_SIZE_UNIT (type
);
3382 if (size
&& TREE_CODE (size
) == INTEGER_CST
3383 && !integer_zerop (size
))
3390 /* Helper to determine and check the sizes of the source and the destination
3391 of calls to __builtin_{bzero,memcpy,mempcpy,memset} calls. EXP is the
3392 call expression, DEST is the destination argument, SRC is the source
3393 argument or null, and LEN is the number of bytes. Use Object Size type-0
3394 regardless of the OPT_Wstringop_overflow_ setting. Return true on success
3395 (no overflow or invalid sizes), false otherwise. */
3398 check_memop_access (tree exp
, tree dest
, tree src
, tree size
)
3400 /* For functions like memset and memcpy that operate on raw memory
3401 try to determine the size of the largest source and destination
3402 object using type-0 Object Size regardless of the object size
3403 type specified by the option. */
3404 tree srcsize
= src
? compute_objsize (src
, 0) : NULL_TREE
;
3405 tree dstsize
= compute_objsize (dest
, 0);
3407 return check_access (exp
, dest
, src
, size
, /*maxread=*/NULL_TREE
,
3411 /* Validate memchr arguments without performing any expansion.
3415 expand_builtin_memchr (tree exp
, rtx
)
3417 if (!validate_arglist (exp
,
3418 POINTER_TYPE
, INTEGER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
3421 tree arg1
= CALL_EXPR_ARG (exp
, 0);
3422 tree len
= CALL_EXPR_ARG (exp
, 2);
3424 /* Diagnose calls where the specified length exceeds the size
3426 if (warn_stringop_overflow
)
3428 tree size
= compute_objsize (arg1
, 0);
3429 check_access (exp
, /*dst=*/NULL_TREE
, /*src=*/NULL_TREE
, len
,
3430 /*maxread=*/NULL_TREE
, size
, /*objsize=*/NULL_TREE
);
3436 /* Expand a call EXP to the memcpy builtin.
3437 Return NULL_RTX if we failed, the caller should emit a normal call,
3438 otherwise try to get the result in TARGET, if convenient (and in
3439 mode MODE if that's convenient). */
3442 expand_builtin_memcpy (tree exp
, rtx target
)
3444 if (!validate_arglist (exp
,
3445 POINTER_TYPE
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
3448 tree dest
= CALL_EXPR_ARG (exp
, 0);
3449 tree src
= CALL_EXPR_ARG (exp
, 1);
3450 tree len
= CALL_EXPR_ARG (exp
, 2);
3452 check_memop_access (exp
, dest
, src
, len
);
3454 return expand_builtin_memory_copy_args (dest
, src
, len
, target
, exp
,
3458 /* Check a call EXP to the memmove built-in for validity.
3459 Return NULL_RTX on both success and failure. */
3462 expand_builtin_memmove (tree exp
, rtx
)
3464 if (!validate_arglist (exp
,
3465 POINTER_TYPE
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
3468 tree dest
= CALL_EXPR_ARG (exp
, 0);
3469 tree src
= CALL_EXPR_ARG (exp
, 1);
3470 tree len
= CALL_EXPR_ARG (exp
, 2);
3472 check_memop_access (exp
, dest
, src
, len
);
3477 /* Expand a call EXP to the mempcpy builtin.
3478 Return NULL_RTX if we failed; the caller should emit a normal call,
3479 otherwise try to get the result in TARGET, if convenient (and in
3480 mode MODE if that's convenient). If ENDP is 0 return the
3481 destination pointer, if ENDP is 1 return the end pointer ala
3482 mempcpy, and if ENDP is 2 return the end pointer minus one ala
3486 expand_builtin_mempcpy (tree exp
, rtx target
)
3488 if (!validate_arglist (exp
,
3489 POINTER_TYPE
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
3492 tree dest
= CALL_EXPR_ARG (exp
, 0);
3493 tree src
= CALL_EXPR_ARG (exp
, 1);
3494 tree len
= CALL_EXPR_ARG (exp
, 2);
3496 /* Policy does not generally allow using compute_objsize (which
3497 is used internally by check_memop_size) to change code generation
3498 or drive optimization decisions.
3500 In this instance it is safe because the code we generate has
3501 the same semantics regardless of the return value of
3502 check_memop_sizes. Exactly the same amount of data is copied
3503 and the return value is exactly the same in both cases.
3505 Furthermore, check_memop_size always uses mode 0 for the call to
3506 compute_objsize, so the imprecise nature of compute_objsize is
3509 /* Avoid expanding mempcpy into memcpy when the call is determined
3510 to overflow the buffer. This also prevents the same overflow
3511 from being diagnosed again when expanding memcpy. */
3512 if (!check_memop_access (exp
, dest
, src
, len
))
3515 return expand_builtin_mempcpy_args (dest
, src
, len
,
3516 target
, exp
, /*endp=*/ 1);
3519 /* Helper function to do the actual work for expand of memory copy family
3520 functions (memcpy, mempcpy, stpcpy). Expansing should assign LEN bytes
3521 of memory from SRC to DEST and assign to TARGET if convenient.
3522 If ENDP is 0 return the
3523 destination pointer, if ENDP is 1 return the end pointer ala
3524 mempcpy, and if ENDP is 2 return the end pointer minus one ala
3528 expand_builtin_memory_copy_args (tree dest
, tree src
, tree len
,
3529 rtx target
, tree exp
, int endp
)
3531 const char *src_str
;
3532 unsigned int src_align
= get_pointer_alignment (src
);
3533 unsigned int dest_align
= get_pointer_alignment (dest
);
3534 rtx dest_mem
, src_mem
, dest_addr
, len_rtx
;
3535 HOST_WIDE_INT expected_size
= -1;
3536 unsigned int expected_align
= 0;
3537 unsigned HOST_WIDE_INT min_size
;
3538 unsigned HOST_WIDE_INT max_size
;
3539 unsigned HOST_WIDE_INT probable_max_size
;
3541 /* If DEST is not a pointer type, call the normal function. */
3542 if (dest_align
== 0)
3545 /* If either SRC is not a pointer type, don't do this
3546 operation in-line. */
3550 if (currently_expanding_gimple_stmt
)
3551 stringop_block_profile (currently_expanding_gimple_stmt
,
3552 &expected_align
, &expected_size
);
3554 if (expected_align
< dest_align
)
3555 expected_align
= dest_align
;
3556 dest_mem
= get_memory_rtx (dest
, len
);
3557 set_mem_align (dest_mem
, dest_align
);
3558 len_rtx
= expand_normal (len
);
3559 determine_block_size (len
, len_rtx
, &min_size
, &max_size
,
3560 &probable_max_size
);
3561 src_str
= c_getstr (src
);
3563 /* If SRC is a string constant and block move would be done
3564 by pieces, we can avoid loading the string from memory
3565 and only stored the computed constants. */
3567 && CONST_INT_P (len_rtx
)
3568 && (unsigned HOST_WIDE_INT
) INTVAL (len_rtx
) <= strlen (src_str
) + 1
3569 && can_store_by_pieces (INTVAL (len_rtx
), builtin_memcpy_read_str
,
3570 CONST_CAST (char *, src_str
),
3573 dest_mem
= store_by_pieces (dest_mem
, INTVAL (len_rtx
),
3574 builtin_memcpy_read_str
,
3575 CONST_CAST (char *, src_str
),
3576 dest_align
, false, endp
);
3577 dest_mem
= force_operand (XEXP (dest_mem
, 0), target
);
3578 dest_mem
= convert_memory_address (ptr_mode
, dest_mem
);
3582 src_mem
= get_memory_rtx (src
, len
);
3583 set_mem_align (src_mem
, src_align
);
3585 /* Copy word part most expediently. */
3586 enum block_op_methods method
= BLOCK_OP_NORMAL
;
3587 if (CALL_EXPR_TAILCALL (exp
) && (endp
== 0 || target
== const0_rtx
))
3588 method
= BLOCK_OP_TAILCALL
;
3589 if (endp
== 1 && target
!= const0_rtx
)
3590 method
= BLOCK_OP_NO_LIBCALL_RET
;
3591 dest_addr
= emit_block_move_hints (dest_mem
, src_mem
, len_rtx
, method
,
3592 expected_align
, expected_size
,
3593 min_size
, max_size
, probable_max_size
);
3594 if (dest_addr
== pc_rtx
)
3599 dest_addr
= force_operand (XEXP (dest_mem
, 0), target
);
3600 dest_addr
= convert_memory_address (ptr_mode
, dest_addr
);
3603 if (endp
&& target
!= const0_rtx
)
3605 dest_addr
= gen_rtx_PLUS (ptr_mode
, dest_addr
, len_rtx
);
3606 /* stpcpy pointer to last byte. */
3608 dest_addr
= gen_rtx_MINUS (ptr_mode
, dest_addr
, const1_rtx
);
3615 expand_builtin_mempcpy_args (tree dest
, tree src
, tree len
,
3616 rtx target
, tree orig_exp
, int endp
)
3618 return expand_builtin_memory_copy_args (dest
, src
, len
, target
, orig_exp
,
3622 /* Expand into a movstr instruction, if one is available. Return NULL_RTX if
3623 we failed, the caller should emit a normal call, otherwise try to
3624 get the result in TARGET, if convenient. If ENDP is 0 return the
3625 destination pointer, if ENDP is 1 return the end pointer ala
3626 mempcpy, and if ENDP is 2 return the end pointer minus one ala
3630 expand_movstr (tree dest
, tree src
, rtx target
, int endp
)
3632 struct expand_operand ops
[3];
3636 if (!targetm
.have_movstr ())
3639 dest_mem
= get_memory_rtx (dest
, NULL
);
3640 src_mem
= get_memory_rtx (src
, NULL
);
3643 target
= force_reg (Pmode
, XEXP (dest_mem
, 0));
3644 dest_mem
= replace_equiv_address (dest_mem
, target
);
3647 create_output_operand (&ops
[0], endp
? target
: NULL_RTX
, Pmode
);
3648 create_fixed_operand (&ops
[1], dest_mem
);
3649 create_fixed_operand (&ops
[2], src_mem
);
3650 if (!maybe_expand_insn (targetm
.code_for_movstr
, 3, ops
))
3653 if (endp
&& target
!= const0_rtx
)
3655 target
= ops
[0].value
;
3656 /* movstr is supposed to set end to the address of the NUL
3657 terminator. If the caller requested a mempcpy-like return value,
3661 rtx tem
= plus_constant (GET_MODE (target
),
3662 gen_lowpart (GET_MODE (target
), target
), 1);
3663 emit_move_insn (target
, force_operand (tem
, NULL_RTX
));
3669 /* Do some very basic size validation of a call to the strcpy builtin
3670 given by EXP. Return NULL_RTX to have the built-in expand to a call
3671 to the library function. */
3674 expand_builtin_strcat (tree exp
, rtx
)
3676 if (!validate_arglist (exp
, POINTER_TYPE
, POINTER_TYPE
, VOID_TYPE
)
3677 || !warn_stringop_overflow
)
3680 tree dest
= CALL_EXPR_ARG (exp
, 0);
3681 tree src
= CALL_EXPR_ARG (exp
, 1);
3683 /* There is no way here to determine the length of the string in
3684 the destination to which the SRC string is being appended so
3685 just diagnose cases when the souce string is longer than
3686 the destination object. */
3688 tree destsize
= compute_objsize (dest
, warn_stringop_overflow
- 1);
3690 check_access (exp
, dest
, src
, /*size=*/NULL_TREE
, /*maxread=*/NULL_TREE
, src
,
3696 /* Expand expression EXP, which is a call to the strcpy builtin. Return
3697 NULL_RTX if we failed the caller should emit a normal call, otherwise
3698 try to get the result in TARGET, if convenient (and in mode MODE if that's
3702 expand_builtin_strcpy (tree exp
, rtx target
)
3704 if (!validate_arglist (exp
, POINTER_TYPE
, POINTER_TYPE
, VOID_TYPE
))
3707 tree dest
= CALL_EXPR_ARG (exp
, 0);
3708 tree src
= CALL_EXPR_ARG (exp
, 1);
3710 if (warn_stringop_overflow
)
3712 tree destsize
= compute_objsize (dest
, warn_stringop_overflow
- 1);
3713 check_access (exp
, dest
, src
, /*size=*/NULL_TREE
, /*maxread=*/NULL_TREE
,
3717 if (rtx ret
= expand_builtin_strcpy_args (dest
, src
, target
))
3719 /* Check to see if the argument was declared attribute nonstring
3720 and if so, issue a warning since at this point it's not known
3721 to be nul-terminated. */
3722 tree fndecl
= get_callee_fndecl (exp
);
3723 maybe_warn_nonstring_arg (fndecl
, exp
);
3730 /* Helper function to do the actual work for expand_builtin_strcpy. The
3731 arguments to the builtin_strcpy call DEST and SRC are broken out
3732 so that this can also be called without constructing an actual CALL_EXPR.
3733 The other arguments and return value are the same as for
3734 expand_builtin_strcpy. */
3737 expand_builtin_strcpy_args (tree dest
, tree src
, rtx target
)
3739 return expand_movstr (dest
, src
, target
, /*endp=*/0);
3742 /* Expand a call EXP to the stpcpy builtin.
3743 Return NULL_RTX if we failed the caller should emit a normal call,
3744 otherwise try to get the result in TARGET, if convenient (and in
3745 mode MODE if that's convenient). */
3748 expand_builtin_stpcpy_1 (tree exp
, rtx target
, machine_mode mode
)
3751 location_t loc
= EXPR_LOCATION (exp
);
3753 if (!validate_arglist (exp
, POINTER_TYPE
, POINTER_TYPE
, VOID_TYPE
))
3756 dst
= CALL_EXPR_ARG (exp
, 0);
3757 src
= CALL_EXPR_ARG (exp
, 1);
3759 if (warn_stringop_overflow
)
3761 tree destsize
= compute_objsize (dst
, warn_stringop_overflow
- 1);
3762 check_access (exp
, dst
, src
, /*size=*/NULL_TREE
, /*maxread=*/NULL_TREE
,
3766 /* If return value is ignored, transform stpcpy into strcpy. */
3767 if (target
== const0_rtx
&& builtin_decl_implicit (BUILT_IN_STRCPY
))
3769 tree fn
= builtin_decl_implicit (BUILT_IN_STRCPY
);
3770 tree result
= build_call_nofold_loc (loc
, fn
, 2, dst
, src
);
3771 return expand_expr (result
, target
, mode
, EXPAND_NORMAL
);
3778 /* Ensure we get an actual string whose length can be evaluated at
3779 compile-time, not an expression containing a string. This is
3780 because the latter will potentially produce pessimized code
3781 when used to produce the return value. */
3782 if (! c_getstr (src
) || ! (len
= c_strlen (src
, 0)))
3783 return expand_movstr (dst
, src
, target
, /*endp=*/2);
3785 lenp1
= size_binop_loc (loc
, PLUS_EXPR
, len
, ssize_int (1));
3786 ret
= expand_builtin_mempcpy_args (dst
, src
, lenp1
,
3787 target
, exp
, /*endp=*/2);
3792 if (TREE_CODE (len
) == INTEGER_CST
)
3794 rtx len_rtx
= expand_normal (len
);
3796 if (CONST_INT_P (len_rtx
))
3798 ret
= expand_builtin_strcpy_args (dst
, src
, target
);
3804 if (mode
!= VOIDmode
)
3805 target
= gen_reg_rtx (mode
);
3807 target
= gen_reg_rtx (GET_MODE (ret
));
3809 if (GET_MODE (target
) != GET_MODE (ret
))
3810 ret
= gen_lowpart (GET_MODE (target
), ret
);
3812 ret
= plus_constant (GET_MODE (ret
), ret
, INTVAL (len_rtx
));
3813 ret
= emit_move_insn (target
, force_operand (ret
, NULL_RTX
));
3821 return expand_movstr (dst
, src
, target
, /*endp=*/2);
3825 /* Expand a call EXP to the stpcpy builtin and diagnose uses of nonstring
3826 arguments while being careful to avoid duplicate warnings (which could
3827 be issued if the expander were to expand the call, resulting in it
3828 being emitted in expand_call(). */
3831 expand_builtin_stpcpy (tree exp
, rtx target
, machine_mode mode
)
3833 if (rtx ret
= expand_builtin_stpcpy_1 (exp
, target
, mode
))
3835 /* The call has been successfully expanded. Check for nonstring
3836 arguments and issue warnings as appropriate. */
3837 maybe_warn_nonstring_arg (get_callee_fndecl (exp
), exp
);
3844 /* Check a call EXP to the stpncpy built-in for validity.
3845 Return NULL_RTX on both success and failure. */
3848 expand_builtin_stpncpy (tree exp
, rtx
)
3850 if (!validate_arglist (exp
,
3851 POINTER_TYPE
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
)
3852 || !warn_stringop_overflow
)
3855 /* The source and destination of the call. */
3856 tree dest
= CALL_EXPR_ARG (exp
, 0);
3857 tree src
= CALL_EXPR_ARG (exp
, 1);
3859 /* The exact number of bytes to write (not the maximum). */
3860 tree len
= CALL_EXPR_ARG (exp
, 2);
3862 /* The size of the destination object. */
3863 tree destsize
= compute_objsize (dest
, warn_stringop_overflow
- 1);
3865 check_access (exp
, dest
, src
, len
, /*maxread=*/NULL_TREE
, src
, destsize
);
3870 /* Callback routine for store_by_pieces. Read GET_MODE_BITSIZE (MODE)
3871 bytes from constant string DATA + OFFSET and return it as target
3875 builtin_strncpy_read_str (void *data
, HOST_WIDE_INT offset
,
3876 scalar_int_mode mode
)
3878 const char *str
= (const char *) data
;
3880 if ((unsigned HOST_WIDE_INT
) offset
> strlen (str
))
3883 return c_readstr (str
+ offset
, mode
);
3886 /* Helper to check the sizes of sequences and the destination of calls
3887 to __builtin_strncat and __builtin___strncat_chk. Returns true on
3888 success (no overflow or invalid sizes), false otherwise. */
3891 check_strncat_sizes (tree exp
, tree objsize
)
3893 tree dest
= CALL_EXPR_ARG (exp
, 0);
3894 tree src
= CALL_EXPR_ARG (exp
, 1);
3895 tree maxread
= CALL_EXPR_ARG (exp
, 2);
3897 /* Try to determine the range of lengths that the source expression
3900 get_range_strlen (src
, lenrange
);
3902 /* Try to verify that the destination is big enough for the shortest
3905 if (!objsize
&& warn_stringop_overflow
)
3907 /* If it hasn't been provided by __strncat_chk, try to determine
3908 the size of the destination object into which the source is
3910 objsize
= compute_objsize (dest
, warn_stringop_overflow
- 1);
3913 /* Add one for the terminating nul. */
3914 tree srclen
= (lenrange
[0]
3915 ? fold_build2 (PLUS_EXPR
, size_type_node
, lenrange
[0],
3919 /* The strncat function copies at most MAXREAD bytes and always appends
3920 the terminating nul so the specified upper bound should never be equal
3921 to (or greater than) the size of the destination. */
3922 if (tree_fits_uhwi_p (maxread
) && tree_fits_uhwi_p (objsize
)
3923 && tree_int_cst_equal (objsize
, maxread
))
3925 location_t loc
= tree_nonartificial_location (exp
);
3926 loc
= expansion_point_location_if_in_system_header (loc
);
3928 warning_at (loc
, OPT_Wstringop_overflow_
,
3929 "%K%qD specified bound %E equals destination size",
3930 exp
, get_callee_fndecl (exp
), maxread
);
3936 || (maxread
&& tree_fits_uhwi_p (maxread
)
3937 && tree_fits_uhwi_p (srclen
)
3938 && tree_int_cst_lt (maxread
, srclen
)))
3941 /* The number of bytes to write is LEN but check_access will also
3942 check SRCLEN if LEN's value isn't known. */
3943 return check_access (exp
, dest
, src
, /*size=*/NULL_TREE
, maxread
, srclen
,
3947 /* Similar to expand_builtin_strcat, do some very basic size validation
3948 of a call to the strcpy builtin given by EXP. Return NULL_RTX to have
3949 the built-in expand to a call to the library function. */
3952 expand_builtin_strncat (tree exp
, rtx
)
3954 if (!validate_arglist (exp
,
3955 POINTER_TYPE
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
)
3956 || !warn_stringop_overflow
)
3959 tree dest
= CALL_EXPR_ARG (exp
, 0);
3960 tree src
= CALL_EXPR_ARG (exp
, 1);
3961 /* The upper bound on the number of bytes to write. */
3962 tree maxread
= CALL_EXPR_ARG (exp
, 2);
3963 /* The length of the source sequence. */
3964 tree slen
= c_strlen (src
, 1);
3966 /* Try to determine the range of lengths that the source expression
3970 lenrange
[0] = lenrange
[1] = slen
;
3972 get_range_strlen (src
, lenrange
);
3974 /* Try to verify that the destination is big enough for the shortest
3975 string. First try to determine the size of the destination object
3976 into which the source is being copied. */
3977 tree destsize
= compute_objsize (dest
, warn_stringop_overflow
- 1);
3979 /* Add one for the terminating nul. */
3980 tree srclen
= (lenrange
[0]
3981 ? fold_build2 (PLUS_EXPR
, size_type_node
, lenrange
[0],
3985 /* The strncat function copies at most MAXREAD bytes and always appends
3986 the terminating nul so the specified upper bound should never be equal
3987 to (or greater than) the size of the destination. */
3988 if (tree_fits_uhwi_p (maxread
) && tree_fits_uhwi_p (destsize
)
3989 && tree_int_cst_equal (destsize
, maxread
))
3991 location_t loc
= tree_nonartificial_location (exp
);
3992 loc
= expansion_point_location_if_in_system_header (loc
);
3994 warning_at (loc
, OPT_Wstringop_overflow_
,
3995 "%K%qD specified bound %E equals destination size",
3996 exp
, get_callee_fndecl (exp
), maxread
);
4002 || (maxread
&& tree_fits_uhwi_p (maxread
)
4003 && tree_fits_uhwi_p (srclen
)
4004 && tree_int_cst_lt (maxread
, srclen
)))
4007 /* The number of bytes to write is SRCLEN. */
4008 check_access (exp
, dest
, src
, NULL_TREE
, maxread
, srclen
, destsize
);
4013 /* Expand expression EXP, which is a call to the strncpy builtin. Return
4014 NULL_RTX if we failed the caller should emit a normal call. */
4017 expand_builtin_strncpy (tree exp
, rtx target
)
4019 location_t loc
= EXPR_LOCATION (exp
);
4021 if (validate_arglist (exp
,
4022 POINTER_TYPE
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
4024 tree dest
= CALL_EXPR_ARG (exp
, 0);
4025 tree src
= CALL_EXPR_ARG (exp
, 1);
4026 /* The number of bytes to write (not the maximum). */
4027 tree len
= CALL_EXPR_ARG (exp
, 2);
4028 /* The length of the source sequence. */
4029 tree slen
= c_strlen (src
, 1);
4031 if (warn_stringop_overflow
)
4033 tree destsize
= compute_objsize (dest
,
4034 warn_stringop_overflow
- 1);
4036 /* The number of bytes to write is LEN but check_access will also
4037 check SLEN if LEN's value isn't known. */
4038 check_access (exp
, dest
, src
, len
, /*maxread=*/NULL_TREE
, src
,
4042 /* We must be passed a constant len and src parameter. */
4043 if (!tree_fits_uhwi_p (len
) || !slen
|| !tree_fits_uhwi_p (slen
))
4046 slen
= size_binop_loc (loc
, PLUS_EXPR
, slen
, ssize_int (1));
4048 /* We're required to pad with trailing zeros if the requested
4049 len is greater than strlen(s2)+1. In that case try to
4050 use store_by_pieces, if it fails, punt. */
4051 if (tree_int_cst_lt (slen
, len
))
4053 unsigned int dest_align
= get_pointer_alignment (dest
);
4054 const char *p
= c_getstr (src
);
4057 if (!p
|| dest_align
== 0 || !tree_fits_uhwi_p (len
)
4058 || !can_store_by_pieces (tree_to_uhwi (len
),
4059 builtin_strncpy_read_str
,
4060 CONST_CAST (char *, p
),
4064 dest_mem
= get_memory_rtx (dest
, len
);
4065 store_by_pieces (dest_mem
, tree_to_uhwi (len
),
4066 builtin_strncpy_read_str
,
4067 CONST_CAST (char *, p
), dest_align
, false, 0);
4068 dest_mem
= force_operand (XEXP (dest_mem
, 0), target
);
4069 dest_mem
= convert_memory_address (ptr_mode
, dest_mem
);
4076 /* Callback routine for store_by_pieces. Read GET_MODE_BITSIZE (MODE)
4077 bytes from constant string DATA + OFFSET and return it as target
4081 builtin_memset_read_str (void *data
, HOST_WIDE_INT offset ATTRIBUTE_UNUSED
,
4082 scalar_int_mode mode
)
4084 const char *c
= (const char *) data
;
4085 char *p
= XALLOCAVEC (char, GET_MODE_SIZE (mode
));
4087 memset (p
, *c
, GET_MODE_SIZE (mode
));
4089 return c_readstr (p
, mode
);
4092 /* Callback routine for store_by_pieces. Return the RTL of a register
4093 containing GET_MODE_SIZE (MODE) consecutive copies of the unsigned
4094 char value given in the RTL register data. For example, if mode is
4095 4 bytes wide, return the RTL for 0x01010101*data. */
4098 builtin_memset_gen_str (void *data
, HOST_WIDE_INT offset ATTRIBUTE_UNUSED
,
4099 scalar_int_mode mode
)
4105 size
= GET_MODE_SIZE (mode
);
4109 p
= XALLOCAVEC (char, size
);
4110 memset (p
, 1, size
);
4111 coeff
= c_readstr (p
, mode
);
4113 target
= convert_to_mode (mode
, (rtx
) data
, 1);
4114 target
= expand_mult (mode
, target
, coeff
, NULL_RTX
, 1);
4115 return force_reg (mode
, target
);
4118 /* Expand expression EXP, which is a call to the memset builtin. Return
4119 NULL_RTX if we failed the caller should emit a normal call, otherwise
4120 try to get the result in TARGET, if convenient (and in mode MODE if that's
4124 expand_builtin_memset (tree exp
, rtx target
, machine_mode mode
)
4126 if (!validate_arglist (exp
,
4127 POINTER_TYPE
, INTEGER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
4130 tree dest
= CALL_EXPR_ARG (exp
, 0);
4131 tree val
= CALL_EXPR_ARG (exp
, 1);
4132 tree len
= CALL_EXPR_ARG (exp
, 2);
4134 check_memop_access (exp
, dest
, NULL_TREE
, len
);
4136 return expand_builtin_memset_args (dest
, val
, len
, target
, mode
, exp
);
4139 /* Helper function to do the actual work for expand_builtin_memset. The
4140 arguments to the builtin_memset call DEST, VAL, and LEN are broken out
4141 so that this can also be called without constructing an actual CALL_EXPR.
4142 The other arguments and return value are the same as for
4143 expand_builtin_memset. */
4146 expand_builtin_memset_args (tree dest
, tree val
, tree len
,
4147 rtx target
, machine_mode mode
, tree orig_exp
)
4150 enum built_in_function fcode
;
4151 machine_mode val_mode
;
4153 unsigned int dest_align
;
4154 rtx dest_mem
, dest_addr
, len_rtx
;
4155 HOST_WIDE_INT expected_size
= -1;
4156 unsigned int expected_align
= 0;
4157 unsigned HOST_WIDE_INT min_size
;
4158 unsigned HOST_WIDE_INT max_size
;
4159 unsigned HOST_WIDE_INT probable_max_size
;
4161 dest_align
= get_pointer_alignment (dest
);
4163 /* If DEST is not a pointer type, don't do this operation in-line. */
4164 if (dest_align
== 0)
4167 if (currently_expanding_gimple_stmt
)
4168 stringop_block_profile (currently_expanding_gimple_stmt
,
4169 &expected_align
, &expected_size
);
4171 if (expected_align
< dest_align
)
4172 expected_align
= dest_align
;
4174 /* If the LEN parameter is zero, return DEST. */
4175 if (integer_zerop (len
))
4177 /* Evaluate and ignore VAL in case it has side-effects. */
4178 expand_expr (val
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
4179 return expand_expr (dest
, target
, mode
, EXPAND_NORMAL
);
4182 /* Stabilize the arguments in case we fail. */
4183 dest
= builtin_save_expr (dest
);
4184 val
= builtin_save_expr (val
);
4185 len
= builtin_save_expr (len
);
4187 len_rtx
= expand_normal (len
);
4188 determine_block_size (len
, len_rtx
, &min_size
, &max_size
,
4189 &probable_max_size
);
4190 dest_mem
= get_memory_rtx (dest
, len
);
4191 val_mode
= TYPE_MODE (unsigned_char_type_node
);
4193 if (TREE_CODE (val
) != INTEGER_CST
)
4197 val_rtx
= expand_normal (val
);
4198 val_rtx
= convert_to_mode (val_mode
, val_rtx
, 0);
4200 /* Assume that we can memset by pieces if we can store
4201 * the coefficients by pieces (in the required modes).
4202 * We can't pass builtin_memset_gen_str as that emits RTL. */
4204 if (tree_fits_uhwi_p (len
)
4205 && can_store_by_pieces (tree_to_uhwi (len
),
4206 builtin_memset_read_str
, &c
, dest_align
,
4209 val_rtx
= force_reg (val_mode
, val_rtx
);
4210 store_by_pieces (dest_mem
, tree_to_uhwi (len
),
4211 builtin_memset_gen_str
, val_rtx
, dest_align
,
4214 else if (!set_storage_via_setmem (dest_mem
, len_rtx
, val_rtx
,
4215 dest_align
, expected_align
,
4216 expected_size
, min_size
, max_size
,
4220 dest_mem
= force_operand (XEXP (dest_mem
, 0), NULL_RTX
);
4221 dest_mem
= convert_memory_address (ptr_mode
, dest_mem
);
4225 if (target_char_cast (val
, &c
))
4230 if (tree_fits_uhwi_p (len
)
4231 && can_store_by_pieces (tree_to_uhwi (len
),
4232 builtin_memset_read_str
, &c
, dest_align
,
4234 store_by_pieces (dest_mem
, tree_to_uhwi (len
),
4235 builtin_memset_read_str
, &c
, dest_align
, true, 0);
4236 else if (!set_storage_via_setmem (dest_mem
, len_rtx
,
4237 gen_int_mode (c
, val_mode
),
4238 dest_align
, expected_align
,
4239 expected_size
, min_size
, max_size
,
4243 dest_mem
= force_operand (XEXP (dest_mem
, 0), NULL_RTX
);
4244 dest_mem
= convert_memory_address (ptr_mode
, dest_mem
);
4248 set_mem_align (dest_mem
, dest_align
);
4249 dest_addr
= clear_storage_hints (dest_mem
, len_rtx
,
4250 CALL_EXPR_TAILCALL (orig_exp
)
4251 ? BLOCK_OP_TAILCALL
: BLOCK_OP_NORMAL
,
4252 expected_align
, expected_size
,
4258 dest_addr
= force_operand (XEXP (dest_mem
, 0), NULL_RTX
);
4259 dest_addr
= convert_memory_address (ptr_mode
, dest_addr
);
4265 fndecl
= get_callee_fndecl (orig_exp
);
4266 fcode
= DECL_FUNCTION_CODE (fndecl
);
4267 if (fcode
== BUILT_IN_MEMSET
)
4268 fn
= build_call_nofold_loc (EXPR_LOCATION (orig_exp
), fndecl
, 3,
4270 else if (fcode
== BUILT_IN_BZERO
)
4271 fn
= build_call_nofold_loc (EXPR_LOCATION (orig_exp
), fndecl
, 2,
4275 gcc_assert (TREE_CODE (fn
) == CALL_EXPR
);
4276 CALL_EXPR_TAILCALL (fn
) = CALL_EXPR_TAILCALL (orig_exp
);
4277 return expand_call (fn
, target
, target
== const0_rtx
);
4280 /* Expand expression EXP, which is a call to the bzero builtin. Return
4281 NULL_RTX if we failed the caller should emit a normal call. */
4284 expand_builtin_bzero (tree exp
)
4286 if (!validate_arglist (exp
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
4289 tree dest
= CALL_EXPR_ARG (exp
, 0);
4290 tree size
= CALL_EXPR_ARG (exp
, 1);
4292 check_memop_access (exp
, dest
, NULL_TREE
, size
);
4294 /* New argument list transforming bzero(ptr x, int y) to
4295 memset(ptr x, int 0, size_t y). This is done this way
4296 so that if it isn't expanded inline, we fallback to
4297 calling bzero instead of memset. */
4299 location_t loc
= EXPR_LOCATION (exp
);
4301 return expand_builtin_memset_args (dest
, integer_zero_node
,
4302 fold_convert_loc (loc
,
4303 size_type_node
, size
),
4304 const0_rtx
, VOIDmode
, exp
);
4307 /* Try to expand cmpstr operation ICODE with the given operands.
4308 Return the result rtx on success, otherwise return null. */
4311 expand_cmpstr (insn_code icode
, rtx target
, rtx arg1_rtx
, rtx arg2_rtx
,
4312 HOST_WIDE_INT align
)
4314 machine_mode insn_mode
= insn_data
[icode
].operand
[0].mode
;
4316 if (target
&& (!REG_P (target
) || HARD_REGISTER_P (target
)))
4319 struct expand_operand ops
[4];
4320 create_output_operand (&ops
[0], target
, insn_mode
);
4321 create_fixed_operand (&ops
[1], arg1_rtx
);
4322 create_fixed_operand (&ops
[2], arg2_rtx
);
4323 create_integer_operand (&ops
[3], align
);
4324 if (maybe_expand_insn (icode
, 4, ops
))
4325 return ops
[0].value
;
4329 /* Expand expression EXP, which is a call to the memcmp built-in function.
4330 Return NULL_RTX if we failed and the caller should emit a normal call,
4331 otherwise try to get the result in TARGET, if convenient.
4332 RESULT_EQ is true if we can relax the returned value to be either zero
4333 or nonzero, without caring about the sign. */
4336 expand_builtin_memcmp (tree exp
, rtx target
, bool result_eq
)
4338 if (!validate_arglist (exp
,
4339 POINTER_TYPE
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
4342 tree arg1
= CALL_EXPR_ARG (exp
, 0);
4343 tree arg2
= CALL_EXPR_ARG (exp
, 1);
4344 tree len
= CALL_EXPR_ARG (exp
, 2);
4346 /* Diagnose calls where the specified length exceeds the size of either
4348 if (warn_stringop_overflow
)
4350 tree size
= compute_objsize (arg1
, 0);
4351 if (check_access (exp
, /*dst=*/NULL_TREE
, /*src=*/NULL_TREE
, len
,
4352 /*maxread=*/NULL_TREE
, size
, /*objsize=*/NULL_TREE
))
4354 size
= compute_objsize (arg2
, 0);
4355 check_access (exp
, /*dst=*/NULL_TREE
, /*src=*/NULL_TREE
, len
,
4356 /*maxread=*/NULL_TREE
, size
, /*objsize=*/NULL_TREE
);
4360 machine_mode mode
= TYPE_MODE (TREE_TYPE (exp
));
4361 location_t loc
= EXPR_LOCATION (exp
);
4363 unsigned int arg1_align
= get_pointer_alignment (arg1
) / BITS_PER_UNIT
;
4364 unsigned int arg2_align
= get_pointer_alignment (arg2
) / BITS_PER_UNIT
;
4366 /* If we don't have POINTER_TYPE, call the function. */
4367 if (arg1_align
== 0 || arg2_align
== 0)
4370 rtx arg1_rtx
= get_memory_rtx (arg1
, len
);
4371 rtx arg2_rtx
= get_memory_rtx (arg2
, len
);
4372 rtx len_rtx
= expand_normal (fold_convert_loc (loc
, sizetype
, len
));
4374 /* Set MEM_SIZE as appropriate. */
4375 if (CONST_INT_P (len_rtx
))
4377 set_mem_size (arg1_rtx
, INTVAL (len_rtx
));
4378 set_mem_size (arg2_rtx
, INTVAL (len_rtx
));
4381 by_pieces_constfn constfn
= NULL
;
4383 const char *src_str
= c_getstr (arg2
);
4384 if (result_eq
&& src_str
== NULL
)
4386 src_str
= c_getstr (arg1
);
4387 if (src_str
!= NULL
)
4388 std::swap (arg1_rtx
, arg2_rtx
);
4391 /* If SRC is a string constant and block move would be done
4392 by pieces, we can avoid loading the string from memory
4393 and only stored the computed constants. */
4395 && CONST_INT_P (len_rtx
)
4396 && (unsigned HOST_WIDE_INT
) INTVAL (len_rtx
) <= strlen (src_str
) + 1)
4397 constfn
= builtin_memcpy_read_str
;
4399 rtx result
= emit_block_cmp_hints (arg1_rtx
, arg2_rtx
, len_rtx
,
4400 TREE_TYPE (len
), target
,
4402 CONST_CAST (char *, src_str
));
4406 /* Return the value in the proper mode for this function. */
4407 if (GET_MODE (result
) == mode
)
4412 convert_move (target
, result
, 0);
4416 return convert_to_mode (mode
, result
, 0);
4422 /* Expand expression EXP, which is a call to the strcmp builtin. Return NULL_RTX
4423 if we failed the caller should emit a normal call, otherwise try to get
4424 the result in TARGET, if convenient. */
4427 expand_builtin_strcmp (tree exp
, ATTRIBUTE_UNUSED rtx target
)
4429 if (!validate_arglist (exp
, POINTER_TYPE
, POINTER_TYPE
, VOID_TYPE
))
4432 insn_code cmpstr_icode
= direct_optab_handler (cmpstr_optab
, SImode
);
4433 insn_code cmpstrn_icode
= direct_optab_handler (cmpstrn_optab
, SImode
);
4434 if (cmpstr_icode
== CODE_FOR_nothing
&& cmpstrn_icode
== CODE_FOR_nothing
)
4437 tree arg1
= CALL_EXPR_ARG (exp
, 0);
4438 tree arg2
= CALL_EXPR_ARG (exp
, 1);
4440 unsigned int arg1_align
= get_pointer_alignment (arg1
) / BITS_PER_UNIT
;
4441 unsigned int arg2_align
= get_pointer_alignment (arg2
) / BITS_PER_UNIT
;
4443 /* If we don't have POINTER_TYPE, call the function. */
4444 if (arg1_align
== 0 || arg2_align
== 0)
4447 /* Stabilize the arguments in case gen_cmpstr(n)si fail. */
4448 arg1
= builtin_save_expr (arg1
);
4449 arg2
= builtin_save_expr (arg2
);
4451 rtx arg1_rtx
= get_memory_rtx (arg1
, NULL
);
4452 rtx arg2_rtx
= get_memory_rtx (arg2
, NULL
);
4454 rtx result
= NULL_RTX
;
4455 /* Try to call cmpstrsi. */
4456 if (cmpstr_icode
!= CODE_FOR_nothing
)
4457 result
= expand_cmpstr (cmpstr_icode
, target
, arg1_rtx
, arg2_rtx
,
4458 MIN (arg1_align
, arg2_align
));
4460 /* Try to determine at least one length and call cmpstrnsi. */
4461 if (!result
&& cmpstrn_icode
!= CODE_FOR_nothing
)
4466 tree len1
= c_strlen (arg1
, 1);
4467 tree len2
= c_strlen (arg2
, 1);
4470 len1
= size_binop (PLUS_EXPR
, ssize_int (1), len1
);
4472 len2
= size_binop (PLUS_EXPR
, ssize_int (1), len2
);
4474 /* If we don't have a constant length for the first, use the length
4475 of the second, if we know it. We don't require a constant for
4476 this case; some cost analysis could be done if both are available
4477 but neither is constant. For now, assume they're equally cheap,
4478 unless one has side effects. If both strings have constant lengths,
4485 else if (TREE_SIDE_EFFECTS (len1
))
4487 else if (TREE_SIDE_EFFECTS (len2
))
4489 else if (TREE_CODE (len1
) != INTEGER_CST
)
4491 else if (TREE_CODE (len2
) != INTEGER_CST
)
4493 else if (tree_int_cst_lt (len1
, len2
))
4498 /* If both arguments have side effects, we cannot optimize. */
4499 if (len
&& !TREE_SIDE_EFFECTS (len
))
4501 arg3_rtx
= expand_normal (len
);
4502 result
= expand_cmpstrn_or_cmpmem
4503 (cmpstrn_icode
, target
, arg1_rtx
, arg2_rtx
, TREE_TYPE (len
),
4504 arg3_rtx
, MIN (arg1_align
, arg2_align
));
4508 tree fndecl
= get_callee_fndecl (exp
);
4511 /* Check to see if the argument was declared attribute nonstring
4512 and if so, issue a warning since at this point it's not known
4513 to be nul-terminated. */
4514 maybe_warn_nonstring_arg (fndecl
, exp
);
4516 /* Return the value in the proper mode for this function. */
4517 machine_mode mode
= TYPE_MODE (TREE_TYPE (exp
));
4518 if (GET_MODE (result
) == mode
)
4521 return convert_to_mode (mode
, result
, 0);
4522 convert_move (target
, result
, 0);
4526 /* Expand the library call ourselves using a stabilized argument
4527 list to avoid re-evaluating the function's arguments twice. */
4528 tree fn
= build_call_nofold_loc (EXPR_LOCATION (exp
), fndecl
, 2, arg1
, arg2
);
4529 gcc_assert (TREE_CODE (fn
) == CALL_EXPR
);
4530 CALL_EXPR_TAILCALL (fn
) = CALL_EXPR_TAILCALL (exp
);
4531 return expand_call (fn
, target
, target
== const0_rtx
);
4534 /* Expand expression EXP, which is a call to the strncmp builtin. Return
4535 NULL_RTX if we failed the caller should emit a normal call, otherwise try to get
4536 the result in TARGET, if convenient. */
4539 expand_builtin_strncmp (tree exp
, ATTRIBUTE_UNUSED rtx target
,
4540 ATTRIBUTE_UNUSED machine_mode mode
)
4542 if (!validate_arglist (exp
,
4543 POINTER_TYPE
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
4546 /* If c_strlen can determine an expression for one of the string
4547 lengths, and it doesn't have side effects, then emit cmpstrnsi
4548 using length MIN(strlen(string)+1, arg3). */
4549 insn_code cmpstrn_icode
= direct_optab_handler (cmpstrn_optab
, SImode
);
4550 if (cmpstrn_icode
== CODE_FOR_nothing
)
4555 tree arg1
= CALL_EXPR_ARG (exp
, 0);
4556 tree arg2
= CALL_EXPR_ARG (exp
, 1);
4557 tree arg3
= CALL_EXPR_ARG (exp
, 2);
4559 unsigned int arg1_align
= get_pointer_alignment (arg1
) / BITS_PER_UNIT
;
4560 unsigned int arg2_align
= get_pointer_alignment (arg2
) / BITS_PER_UNIT
;
4562 tree len1
= c_strlen (arg1
, 1);
4563 tree len2
= c_strlen (arg2
, 1);
4565 location_t loc
= EXPR_LOCATION (exp
);
4568 len1
= size_binop_loc (loc
, PLUS_EXPR
, ssize_int (1), len1
);
4570 len2
= size_binop_loc (loc
, PLUS_EXPR
, ssize_int (1), len2
);
4572 tree len3
= fold_convert_loc (loc
, sizetype
, arg3
);
4574 /* If we don't have a constant length for the first, use the length
4575 of the second, if we know it. If neither string is constant length,
4576 use the given length argument. We don't require a constant for
4577 this case; some cost analysis could be done if both are available
4578 but neither is constant. For now, assume they're equally cheap,
4579 unless one has side effects. If both strings have constant lengths,
4588 else if (TREE_SIDE_EFFECTS (len1
))
4590 else if (TREE_SIDE_EFFECTS (len2
))
4592 else if (TREE_CODE (len1
) != INTEGER_CST
)
4594 else if (TREE_CODE (len2
) != INTEGER_CST
)
4596 else if (tree_int_cst_lt (len1
, len2
))
4601 /* If we are not using the given length, we must incorporate it here.
4602 The actual new length parameter will be MIN(len,arg3) in this case. */
4604 len
= fold_build2_loc (loc
, MIN_EXPR
, TREE_TYPE (len
), len
, len3
);
4605 rtx arg1_rtx
= get_memory_rtx (arg1
, len
);
4606 rtx arg2_rtx
= get_memory_rtx (arg2
, len
);
4607 rtx arg3_rtx
= expand_normal (len
);
4608 rtx result
= expand_cmpstrn_or_cmpmem (cmpstrn_icode
, target
, arg1_rtx
,
4609 arg2_rtx
, TREE_TYPE (len
), arg3_rtx
,
4610 MIN (arg1_align
, arg2_align
));
4612 tree fndecl
= get_callee_fndecl (exp
);
4615 /* Check to see if the argument was declared attribute nonstring
4616 and if so, issue a warning since at this point it's not known
4617 to be nul-terminated. */
4618 maybe_warn_nonstring_arg (fndecl
, exp
);
4620 /* Return the value in the proper mode for this function. */
4621 mode
= TYPE_MODE (TREE_TYPE (exp
));
4622 if (GET_MODE (result
) == mode
)
4625 return convert_to_mode (mode
, result
, 0);
4626 convert_move (target
, result
, 0);
4630 /* Expand the library call ourselves using a stabilized argument
4631 list to avoid re-evaluating the function's arguments twice. */
4632 tree fn
= build_call_nofold_loc (loc
, fndecl
, 3, arg1
, arg2
, len
);
4633 gcc_assert (TREE_CODE (fn
) == CALL_EXPR
);
4634 CALL_EXPR_TAILCALL (fn
) = CALL_EXPR_TAILCALL (exp
);
4635 return expand_call (fn
, target
, target
== const0_rtx
);
4638 /* Expand a call to __builtin_saveregs, generating the result in TARGET,
4639 if that's convenient. */
4642 expand_builtin_saveregs (void)
4647 /* Don't do __builtin_saveregs more than once in a function.
4648 Save the result of the first call and reuse it. */
4649 if (saveregs_value
!= 0)
4650 return saveregs_value
;
4652 /* When this function is called, it means that registers must be
4653 saved on entry to this function. So we migrate the call to the
4654 first insn of this function. */
4658 /* Do whatever the machine needs done in this case. */
4659 val
= targetm
.calls
.expand_builtin_saveregs ();
4664 saveregs_value
= val
;
4666 /* Put the insns after the NOTE that starts the function. If this
4667 is inside a start_sequence, make the outer-level insn chain current, so
4668 the code is placed at the start of the function. */
4669 push_topmost_sequence ();
4670 emit_insn_after (seq
, entry_of_function ());
4671 pop_topmost_sequence ();
4676 /* Expand a call to __builtin_next_arg. */
4679 expand_builtin_next_arg (void)
4681 /* Checking arguments is already done in fold_builtin_next_arg
4682 that must be called before this function. */
4683 return expand_binop (ptr_mode
, add_optab
,
4684 crtl
->args
.internal_arg_pointer
,
4685 crtl
->args
.arg_offset_rtx
,
4686 NULL_RTX
, 0, OPTAB_LIB_WIDEN
);
4689 /* Make it easier for the backends by protecting the valist argument
4690 from multiple evaluations. */
4693 stabilize_va_list_loc (location_t loc
, tree valist
, int needs_lvalue
)
4695 tree vatype
= targetm
.canonical_va_list_type (TREE_TYPE (valist
));
4697 /* The current way of determining the type of valist is completely
4698 bogus. We should have the information on the va builtin instead. */
4700 vatype
= targetm
.fn_abi_va_list (cfun
->decl
);
4702 if (TREE_CODE (vatype
) == ARRAY_TYPE
)
4704 if (TREE_SIDE_EFFECTS (valist
))
4705 valist
= save_expr (valist
);
4707 /* For this case, the backends will be expecting a pointer to
4708 vatype, but it's possible we've actually been given an array
4709 (an actual TARGET_CANONICAL_VA_LIST_TYPE (valist)).
4711 if (TREE_CODE (TREE_TYPE (valist
)) == ARRAY_TYPE
)
4713 tree p1
= build_pointer_type (TREE_TYPE (vatype
));
4714 valist
= build_fold_addr_expr_with_type_loc (loc
, valist
, p1
);
4719 tree pt
= build_pointer_type (vatype
);
4723 if (! TREE_SIDE_EFFECTS (valist
))
4726 valist
= fold_build1_loc (loc
, ADDR_EXPR
, pt
, valist
);
4727 TREE_SIDE_EFFECTS (valist
) = 1;
4730 if (TREE_SIDE_EFFECTS (valist
))
4731 valist
= save_expr (valist
);
4732 valist
= fold_build2_loc (loc
, MEM_REF
,
4733 vatype
, valist
, build_int_cst (pt
, 0));
4739 /* The "standard" definition of va_list is void*. */
4742 std_build_builtin_va_list (void)
4744 return ptr_type_node
;
4747 /* The "standard" abi va_list is va_list_type_node. */
4750 std_fn_abi_va_list (tree fndecl ATTRIBUTE_UNUSED
)
4752 return va_list_type_node
;
4755 /* The "standard" type of va_list is va_list_type_node. */
4758 std_canonical_va_list_type (tree type
)
4762 wtype
= va_list_type_node
;
4765 if (TREE_CODE (wtype
) == ARRAY_TYPE
)
4767 /* If va_list is an array type, the argument may have decayed
4768 to a pointer type, e.g. by being passed to another function.
4769 In that case, unwrap both types so that we can compare the
4770 underlying records. */
4771 if (TREE_CODE (htype
) == ARRAY_TYPE
4772 || POINTER_TYPE_P (htype
))
4774 wtype
= TREE_TYPE (wtype
);
4775 htype
= TREE_TYPE (htype
);
4778 if (TYPE_MAIN_VARIANT (wtype
) == TYPE_MAIN_VARIANT (htype
))
4779 return va_list_type_node
;
4784 /* The "standard" implementation of va_start: just assign `nextarg' to
4788 std_expand_builtin_va_start (tree valist
, rtx nextarg
)
4790 rtx va_r
= expand_expr (valist
, NULL_RTX
, VOIDmode
, EXPAND_WRITE
);
4791 convert_move (va_r
, nextarg
, 0);
4794 /* Expand EXP, a call to __builtin_va_start. */
4797 expand_builtin_va_start (tree exp
)
4801 location_t loc
= EXPR_LOCATION (exp
);
4803 if (call_expr_nargs (exp
) < 2)
4805 error_at (loc
, "too few arguments to function %<va_start%>");
4809 if (fold_builtin_next_arg (exp
, true))
4812 nextarg
= expand_builtin_next_arg ();
4813 valist
= stabilize_va_list_loc (loc
, CALL_EXPR_ARG (exp
, 0), 1);
4815 if (targetm
.expand_builtin_va_start
)
4816 targetm
.expand_builtin_va_start (valist
, nextarg
);
4818 std_expand_builtin_va_start (valist
, nextarg
);
4823 /* Expand EXP, a call to __builtin_va_end. */
4826 expand_builtin_va_end (tree exp
)
4828 tree valist
= CALL_EXPR_ARG (exp
, 0);
4830 /* Evaluate for side effects, if needed. I hate macros that don't
4832 if (TREE_SIDE_EFFECTS (valist
))
4833 expand_expr (valist
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
4838 /* Expand EXP, a call to __builtin_va_copy. We do this as a
4839 builtin rather than just as an assignment in stdarg.h because of the
4840 nastiness of array-type va_list types. */
4843 expand_builtin_va_copy (tree exp
)
4846 location_t loc
= EXPR_LOCATION (exp
);
4848 dst
= CALL_EXPR_ARG (exp
, 0);
4849 src
= CALL_EXPR_ARG (exp
, 1);
4851 dst
= stabilize_va_list_loc (loc
, dst
, 1);
4852 src
= stabilize_va_list_loc (loc
, src
, 0);
4854 gcc_assert (cfun
!= NULL
&& cfun
->decl
!= NULL_TREE
);
4856 if (TREE_CODE (targetm
.fn_abi_va_list (cfun
->decl
)) != ARRAY_TYPE
)
4858 t
= build2 (MODIFY_EXPR
, targetm
.fn_abi_va_list (cfun
->decl
), dst
, src
);
4859 TREE_SIDE_EFFECTS (t
) = 1;
4860 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
4864 rtx dstb
, srcb
, size
;
4866 /* Evaluate to pointers. */
4867 dstb
= expand_expr (dst
, NULL_RTX
, Pmode
, EXPAND_NORMAL
);
4868 srcb
= expand_expr (src
, NULL_RTX
, Pmode
, EXPAND_NORMAL
);
4869 size
= expand_expr (TYPE_SIZE_UNIT (targetm
.fn_abi_va_list (cfun
->decl
)),
4870 NULL_RTX
, VOIDmode
, EXPAND_NORMAL
);
4872 dstb
= convert_memory_address (Pmode
, dstb
);
4873 srcb
= convert_memory_address (Pmode
, srcb
);
4875 /* "Dereference" to BLKmode memories. */
4876 dstb
= gen_rtx_MEM (BLKmode
, dstb
);
4877 set_mem_alias_set (dstb
, get_alias_set (TREE_TYPE (TREE_TYPE (dst
))));
4878 set_mem_align (dstb
, TYPE_ALIGN (targetm
.fn_abi_va_list (cfun
->decl
)));
4879 srcb
= gen_rtx_MEM (BLKmode
, srcb
);
4880 set_mem_alias_set (srcb
, get_alias_set (TREE_TYPE (TREE_TYPE (src
))));
4881 set_mem_align (srcb
, TYPE_ALIGN (targetm
.fn_abi_va_list (cfun
->decl
)));
4884 emit_block_move (dstb
, srcb
, size
, BLOCK_OP_NORMAL
);
4890 /* Expand a call to one of the builtin functions __builtin_frame_address or
4891 __builtin_return_address. */
4894 expand_builtin_frame_address (tree fndecl
, tree exp
)
4896 /* The argument must be a nonnegative integer constant.
4897 It counts the number of frames to scan up the stack.
4898 The value is either the frame pointer value or the return
4899 address saved in that frame. */
4900 if (call_expr_nargs (exp
) == 0)
4901 /* Warning about missing arg was already issued. */
4903 else if (! tree_fits_uhwi_p (CALL_EXPR_ARG (exp
, 0)))
4905 error ("invalid argument to %qD", fndecl
);
4910 /* Number of frames to scan up the stack. */
4911 unsigned HOST_WIDE_INT count
= tree_to_uhwi (CALL_EXPR_ARG (exp
, 0));
4913 rtx tem
= expand_builtin_return_addr (DECL_FUNCTION_CODE (fndecl
), count
);
4915 /* Some ports cannot access arbitrary stack frames. */
4918 warning (0, "unsupported argument to %qD", fndecl
);
4924 /* Warn since no effort is made to ensure that any frame
4925 beyond the current one exists or can be safely reached. */
4926 warning (OPT_Wframe_address
, "calling %qD with "
4927 "a nonzero argument is unsafe", fndecl
);
4930 /* For __builtin_frame_address, return what we've got. */
4931 if (DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_FRAME_ADDRESS
)
4935 && ! CONSTANT_P (tem
))
4936 tem
= copy_addr_to_reg (tem
);
4941 /* Expand EXP, a call to the alloca builtin. Return NULL_RTX if we
4942 failed and the caller should emit a normal call. */
4945 expand_builtin_alloca (tree exp
)
4950 tree fndecl
= get_callee_fndecl (exp
);
4951 HOST_WIDE_INT max_size
;
4952 enum built_in_function fcode
= DECL_FUNCTION_CODE (fndecl
);
4953 bool alloca_for_var
= CALL_ALLOCA_FOR_VAR_P (exp
);
4955 = (fcode
== BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX
4956 ? validate_arglist (exp
, INTEGER_TYPE
, INTEGER_TYPE
, INTEGER_TYPE
,
4958 : fcode
== BUILT_IN_ALLOCA_WITH_ALIGN
4959 ? validate_arglist (exp
, INTEGER_TYPE
, INTEGER_TYPE
, VOID_TYPE
)
4960 : validate_arglist (exp
, INTEGER_TYPE
, VOID_TYPE
));
4965 if ((alloca_for_var
&& !warn_vla_limit
)
4966 || (!alloca_for_var
&& !warn_alloca_limit
))
4968 /* -Walloca-larger-than and -Wvla-larger-than settings override
4969 the more general -Walloc-size-larger-than so unless either of
4970 the former options is specified check the alloca arguments for
4972 tree args
[] = { CALL_EXPR_ARG (exp
, 0), NULL_TREE
};
4973 int idx
[] = { 0, -1 };
4974 maybe_warn_alloc_args_overflow (fndecl
, exp
, args
, idx
);
4977 /* Compute the argument. */
4978 op0
= expand_normal (CALL_EXPR_ARG (exp
, 0));
4980 /* Compute the alignment. */
4981 align
= (fcode
== BUILT_IN_ALLOCA
4983 : TREE_INT_CST_LOW (CALL_EXPR_ARG (exp
, 1)));
4985 /* Compute the maximum size. */
4986 max_size
= (fcode
== BUILT_IN_ALLOCA_WITH_ALIGN_AND_MAX
4987 ? TREE_INT_CST_LOW (CALL_EXPR_ARG (exp
, 2))
4990 /* Allocate the desired space. If the allocation stems from the declaration
4991 of a variable-sized object, it cannot accumulate. */
4993 = allocate_dynamic_stack_space (op0
, 0, align
, max_size
, alloca_for_var
);
4994 result
= convert_memory_address (ptr_mode
, result
);
4999 /* Emit a call to __asan_allocas_unpoison call in EXP. Add to second argument
5000 of the call virtual_stack_dynamic_rtx - stack_pointer_rtx, which is the
5001 STACK_DYNAMIC_OFFSET value. See motivation for this in comment to
5002 handle_builtin_stack_restore function. */
5005 expand_asan_emit_allocas_unpoison (tree exp
)
5007 tree arg0
= CALL_EXPR_ARG (exp
, 0);
5008 tree arg1
= CALL_EXPR_ARG (exp
, 1);
5009 rtx top
= expand_expr (arg0
, NULL_RTX
, ptr_mode
, EXPAND_NORMAL
);
5010 rtx bot
= expand_expr (arg1
, NULL_RTX
, ptr_mode
, EXPAND_NORMAL
);
5011 rtx off
= expand_simple_binop (Pmode
, MINUS
, virtual_stack_dynamic_rtx
,
5012 stack_pointer_rtx
, NULL_RTX
, 0,
5014 off
= convert_modes (ptr_mode
, Pmode
, off
, 0);
5015 bot
= expand_simple_binop (ptr_mode
, PLUS
, bot
, off
, NULL_RTX
, 0,
5017 rtx ret
= init_one_libfunc ("__asan_allocas_unpoison");
5018 ret
= emit_library_call_value (ret
, NULL_RTX
, LCT_NORMAL
, ptr_mode
,
5019 top
, ptr_mode
, bot
, ptr_mode
);
5023 /* Expand a call to bswap builtin in EXP.
5024 Return NULL_RTX if a normal call should be emitted rather than expanding the
5025 function in-line. If convenient, the result should be placed in TARGET.
5026 SUBTARGET may be used as the target for computing one of EXP's operands. */
5029 expand_builtin_bswap (machine_mode target_mode
, tree exp
, rtx target
,
5035 if (!validate_arglist (exp
, INTEGER_TYPE
, VOID_TYPE
))
5038 arg
= CALL_EXPR_ARG (exp
, 0);
5039 op0
= expand_expr (arg
,
5040 subtarget
&& GET_MODE (subtarget
) == target_mode
5041 ? subtarget
: NULL_RTX
,
5042 target_mode
, EXPAND_NORMAL
);
5043 if (GET_MODE (op0
) != target_mode
)
5044 op0
= convert_to_mode (target_mode
, op0
, 1);
5046 target
= expand_unop (target_mode
, bswap_optab
, op0
, target
, 1);
5048 gcc_assert (target
);
5050 return convert_to_mode (target_mode
, target
, 1);
5053 /* Expand a call to a unary builtin in EXP.
5054 Return NULL_RTX if a normal call should be emitted rather than expanding the
5055 function in-line. If convenient, the result should be placed in TARGET.
5056 SUBTARGET may be used as the target for computing one of EXP's operands. */
5059 expand_builtin_unop (machine_mode target_mode
, tree exp
, rtx target
,
5060 rtx subtarget
, optab op_optab
)
5064 if (!validate_arglist (exp
, INTEGER_TYPE
, VOID_TYPE
))
5067 /* Compute the argument. */
5068 op0
= expand_expr (CALL_EXPR_ARG (exp
, 0),
5070 && (TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp
, 0)))
5071 == GET_MODE (subtarget
))) ? subtarget
: NULL_RTX
,
5072 VOIDmode
, EXPAND_NORMAL
);
5073 /* Compute op, into TARGET if possible.
5074 Set TARGET to wherever the result comes back. */
5075 target
= expand_unop (TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp
, 0))),
5076 op_optab
, op0
, target
, op_optab
!= clrsb_optab
);
5077 gcc_assert (target
);
5079 return convert_to_mode (target_mode
, target
, 0);
5082 /* Expand a call to __builtin_expect. We just return our argument
5083 as the builtin_expect semantic should've been already executed by
5084 tree branch prediction pass. */
5087 expand_builtin_expect (tree exp
, rtx target
)
5091 if (call_expr_nargs (exp
) < 2)
5093 arg
= CALL_EXPR_ARG (exp
, 0);
5095 target
= expand_expr (arg
, target
, VOIDmode
, EXPAND_NORMAL
);
5096 /* When guessing was done, the hints should be already stripped away. */
5097 gcc_assert (!flag_guess_branch_prob
5098 || optimize
== 0 || seen_error ());
5102 /* Expand a call to __builtin_assume_aligned. We just return our first
5103 argument as the builtin_assume_aligned semantic should've been already
5107 expand_builtin_assume_aligned (tree exp
, rtx target
)
5109 if (call_expr_nargs (exp
) < 2)
5111 target
= expand_expr (CALL_EXPR_ARG (exp
, 0), target
, VOIDmode
,
5113 gcc_assert (!TREE_SIDE_EFFECTS (CALL_EXPR_ARG (exp
, 1))
5114 && (call_expr_nargs (exp
) < 3
5115 || !TREE_SIDE_EFFECTS (CALL_EXPR_ARG (exp
, 2))));
5120 expand_builtin_trap (void)
5122 if (targetm
.have_trap ())
5124 rtx_insn
*insn
= emit_insn (targetm
.gen_trap ());
5125 /* For trap insns when not accumulating outgoing args force
5126 REG_ARGS_SIZE note to prevent crossjumping of calls with
5127 different args sizes. */
5128 if (!ACCUMULATE_OUTGOING_ARGS
)
5129 add_args_size_note (insn
, stack_pointer_delta
);
5133 tree fn
= builtin_decl_implicit (BUILT_IN_ABORT
);
5134 tree call_expr
= build_call_expr (fn
, 0);
5135 expand_call (call_expr
, NULL_RTX
, false);
5141 /* Expand a call to __builtin_unreachable. We do nothing except emit
5142 a barrier saying that control flow will not pass here.
5144 It is the responsibility of the program being compiled to ensure
5145 that control flow does never reach __builtin_unreachable. */
5147 expand_builtin_unreachable (void)
5152 /* Expand EXP, a call to fabs, fabsf or fabsl.
5153 Return NULL_RTX if a normal call should be emitted rather than expanding
5154 the function inline. If convenient, the result should be placed
5155 in TARGET. SUBTARGET may be used as the target for computing
5159 expand_builtin_fabs (tree exp
, rtx target
, rtx subtarget
)
5165 if (!validate_arglist (exp
, REAL_TYPE
, VOID_TYPE
))
5168 arg
= CALL_EXPR_ARG (exp
, 0);
5169 CALL_EXPR_ARG (exp
, 0) = arg
= builtin_save_expr (arg
);
5170 mode
= TYPE_MODE (TREE_TYPE (arg
));
5171 op0
= expand_expr (arg
, subtarget
, VOIDmode
, EXPAND_NORMAL
);
5172 return expand_abs (mode
, op0
, target
, 0, safe_from_p (target
, arg
, 1));
5175 /* Expand EXP, a call to copysign, copysignf, or copysignl.
5176 Return NULL is a normal call should be emitted rather than expanding the
5177 function inline. If convenient, the result should be placed in TARGET.
5178 SUBTARGET may be used as the target for computing the operand. */
5181 expand_builtin_copysign (tree exp
, rtx target
, rtx subtarget
)
5186 if (!validate_arglist (exp
, REAL_TYPE
, REAL_TYPE
, VOID_TYPE
))
5189 arg
= CALL_EXPR_ARG (exp
, 0);
5190 op0
= expand_expr (arg
, subtarget
, VOIDmode
, EXPAND_NORMAL
);
5192 arg
= CALL_EXPR_ARG (exp
, 1);
5193 op1
= expand_normal (arg
);
5195 return expand_copysign (op0
, op1
, target
);
5198 /* Expand a call to __builtin___clear_cache. */
5201 expand_builtin___clear_cache (tree exp
)
5203 if (!targetm
.code_for_clear_cache
)
5205 #ifdef CLEAR_INSN_CACHE
5206 /* There is no "clear_cache" insn, and __clear_cache() in libgcc
5207 does something. Just do the default expansion to a call to
5211 /* There is no "clear_cache" insn, and __clear_cache() in libgcc
5212 does nothing. There is no need to call it. Do nothing. */
5214 #endif /* CLEAR_INSN_CACHE */
5217 /* We have a "clear_cache" insn, and it will handle everything. */
5219 rtx begin_rtx
, end_rtx
;
5221 /* We must not expand to a library call. If we did, any
5222 fallback library function in libgcc that might contain a call to
5223 __builtin___clear_cache() would recurse infinitely. */
5224 if (!validate_arglist (exp
, POINTER_TYPE
, POINTER_TYPE
, VOID_TYPE
))
5226 error ("both arguments to %<__builtin___clear_cache%> must be pointers");
5230 if (targetm
.have_clear_cache ())
5232 struct expand_operand ops
[2];
5234 begin
= CALL_EXPR_ARG (exp
, 0);
5235 begin_rtx
= expand_expr (begin
, NULL_RTX
, Pmode
, EXPAND_NORMAL
);
5237 end
= CALL_EXPR_ARG (exp
, 1);
5238 end_rtx
= expand_expr (end
, NULL_RTX
, Pmode
, EXPAND_NORMAL
);
5240 create_address_operand (&ops
[0], begin_rtx
);
5241 create_address_operand (&ops
[1], end_rtx
);
5242 if (maybe_expand_insn (targetm
.code_for_clear_cache
, 2, ops
))
5248 /* Given a trampoline address, make sure it satisfies TRAMPOLINE_ALIGNMENT. */
5251 round_trampoline_addr (rtx tramp
)
5253 rtx temp
, addend
, mask
;
5255 /* If we don't need too much alignment, we'll have been guaranteed
5256 proper alignment by get_trampoline_type. */
5257 if (TRAMPOLINE_ALIGNMENT
<= STACK_BOUNDARY
)
5260 /* Round address up to desired boundary. */
5261 temp
= gen_reg_rtx (Pmode
);
5262 addend
= gen_int_mode (TRAMPOLINE_ALIGNMENT
/ BITS_PER_UNIT
- 1, Pmode
);
5263 mask
= gen_int_mode (-TRAMPOLINE_ALIGNMENT
/ BITS_PER_UNIT
, Pmode
);
5265 temp
= expand_simple_binop (Pmode
, PLUS
, tramp
, addend
,
5266 temp
, 0, OPTAB_LIB_WIDEN
);
5267 tramp
= expand_simple_binop (Pmode
, AND
, temp
, mask
,
5268 temp
, 0, OPTAB_LIB_WIDEN
);
5274 expand_builtin_init_trampoline (tree exp
, bool onstack
)
5276 tree t_tramp
, t_func
, t_chain
;
5277 rtx m_tramp
, r_tramp
, r_chain
, tmp
;
5279 if (!validate_arglist (exp
, POINTER_TYPE
, POINTER_TYPE
,
5280 POINTER_TYPE
, VOID_TYPE
))
5283 t_tramp
= CALL_EXPR_ARG (exp
, 0);
5284 t_func
= CALL_EXPR_ARG (exp
, 1);
5285 t_chain
= CALL_EXPR_ARG (exp
, 2);
5287 r_tramp
= expand_normal (t_tramp
);
5288 m_tramp
= gen_rtx_MEM (BLKmode
, r_tramp
);
5289 MEM_NOTRAP_P (m_tramp
) = 1;
5291 /* If ONSTACK, the TRAMP argument should be the address of a field
5292 within the local function's FRAME decl. Either way, let's see if
5293 we can fill in the MEM_ATTRs for this memory. */
5294 if (TREE_CODE (t_tramp
) == ADDR_EXPR
)
5295 set_mem_attributes (m_tramp
, TREE_OPERAND (t_tramp
, 0), true);
5297 /* Creator of a heap trampoline is responsible for making sure the
5298 address is aligned to at least STACK_BOUNDARY. Normally malloc
5299 will ensure this anyhow. */
5300 tmp
= round_trampoline_addr (r_tramp
);
5303 m_tramp
= change_address (m_tramp
, BLKmode
, tmp
);
5304 set_mem_align (m_tramp
, TRAMPOLINE_ALIGNMENT
);
5305 set_mem_size (m_tramp
, TRAMPOLINE_SIZE
);
5308 /* The FUNC argument should be the address of the nested function.
5309 Extract the actual function decl to pass to the hook. */
5310 gcc_assert (TREE_CODE (t_func
) == ADDR_EXPR
);
5311 t_func
= TREE_OPERAND (t_func
, 0);
5312 gcc_assert (TREE_CODE (t_func
) == FUNCTION_DECL
);
5314 r_chain
= expand_normal (t_chain
);
5316 /* Generate insns to initialize the trampoline. */
5317 targetm
.calls
.trampoline_init (m_tramp
, t_func
, r_chain
);
5321 trampolines_created
= 1;
5323 if (targetm
.calls
.custom_function_descriptors
!= 0)
5324 warning_at (DECL_SOURCE_LOCATION (t_func
), OPT_Wtrampolines
,
5325 "trampoline generated for nested function %qD", t_func
);
5332 expand_builtin_adjust_trampoline (tree exp
)
5336 if (!validate_arglist (exp
, POINTER_TYPE
, VOID_TYPE
))
5339 tramp
= expand_normal (CALL_EXPR_ARG (exp
, 0));
5340 tramp
= round_trampoline_addr (tramp
);
5341 if (targetm
.calls
.trampoline_adjust_address
)
5342 tramp
= targetm
.calls
.trampoline_adjust_address (tramp
);
5347 /* Expand a call to the builtin descriptor initialization routine.
5348 A descriptor is made up of a couple of pointers to the static
5349 chain and the code entry in this order. */
5352 expand_builtin_init_descriptor (tree exp
)
5354 tree t_descr
, t_func
, t_chain
;
5355 rtx m_descr
, r_descr
, r_func
, r_chain
;
5357 if (!validate_arglist (exp
, POINTER_TYPE
, POINTER_TYPE
, POINTER_TYPE
,
5361 t_descr
= CALL_EXPR_ARG (exp
, 0);
5362 t_func
= CALL_EXPR_ARG (exp
, 1);
5363 t_chain
= CALL_EXPR_ARG (exp
, 2);
5365 r_descr
= expand_normal (t_descr
);
5366 m_descr
= gen_rtx_MEM (BLKmode
, r_descr
);
5367 MEM_NOTRAP_P (m_descr
) = 1;
5369 r_func
= expand_normal (t_func
);
5370 r_chain
= expand_normal (t_chain
);
5372 /* Generate insns to initialize the descriptor. */
5373 emit_move_insn (adjust_address_nv (m_descr
, ptr_mode
, 0), r_chain
);
5374 emit_move_insn (adjust_address_nv (m_descr
, ptr_mode
,
5375 POINTER_SIZE
/ BITS_PER_UNIT
), r_func
);
5380 /* Expand a call to the builtin descriptor adjustment routine. */
5383 expand_builtin_adjust_descriptor (tree exp
)
5387 if (!validate_arglist (exp
, POINTER_TYPE
, VOID_TYPE
))
5390 tramp
= expand_normal (CALL_EXPR_ARG (exp
, 0));
5392 /* Unalign the descriptor to allow runtime identification. */
5393 tramp
= plus_constant (ptr_mode
, tramp
,
5394 targetm
.calls
.custom_function_descriptors
);
5396 return force_operand (tramp
, NULL_RTX
);
5399 /* Expand the call EXP to the built-in signbit, signbitf or signbitl
5400 function. The function first checks whether the back end provides
5401 an insn to implement signbit for the respective mode. If not, it
5402 checks whether the floating point format of the value is such that
5403 the sign bit can be extracted. If that is not the case, error out.
5404 EXP is the expression that is a call to the builtin function; if
5405 convenient, the result should be placed in TARGET. */
5407 expand_builtin_signbit (tree exp
, rtx target
)
5409 const struct real_format
*fmt
;
5410 scalar_float_mode fmode
;
5411 scalar_int_mode rmode
, imode
;
5414 enum insn_code icode
;
5416 location_t loc
= EXPR_LOCATION (exp
);
5418 if (!validate_arglist (exp
, REAL_TYPE
, VOID_TYPE
))
5421 arg
= CALL_EXPR_ARG (exp
, 0);
5422 fmode
= SCALAR_FLOAT_TYPE_MODE (TREE_TYPE (arg
));
5423 rmode
= SCALAR_INT_TYPE_MODE (TREE_TYPE (exp
));
5424 fmt
= REAL_MODE_FORMAT (fmode
);
5426 arg
= builtin_save_expr (arg
);
5428 /* Expand the argument yielding a RTX expression. */
5429 temp
= expand_normal (arg
);
5431 /* Check if the back end provides an insn that handles signbit for the
5433 icode
= optab_handler (signbit_optab
, fmode
);
5434 if (icode
!= CODE_FOR_nothing
)
5436 rtx_insn
*last
= get_last_insn ();
5437 target
= gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp
)));
5438 if (maybe_emit_unop_insn (icode
, target
, temp
, UNKNOWN
))
5440 delete_insns_since (last
);
5443 /* For floating point formats without a sign bit, implement signbit
5445 bitpos
= fmt
->signbit_ro
;
5448 /* But we can't do this if the format supports signed zero. */
5449 gcc_assert (!fmt
->has_signed_zero
|| !HONOR_SIGNED_ZEROS (fmode
));
5451 arg
= fold_build2_loc (loc
, LT_EXPR
, TREE_TYPE (exp
), arg
,
5452 build_real (TREE_TYPE (arg
), dconst0
));
5453 return expand_expr (arg
, target
, VOIDmode
, EXPAND_NORMAL
);
5456 if (GET_MODE_SIZE (fmode
) <= UNITS_PER_WORD
)
5458 imode
= int_mode_for_mode (fmode
).require ();
5459 temp
= gen_lowpart (imode
, temp
);
5464 /* Handle targets with different FP word orders. */
5465 if (FLOAT_WORDS_BIG_ENDIAN
)
5466 word
= (GET_MODE_BITSIZE (fmode
) - bitpos
) / BITS_PER_WORD
;
5468 word
= bitpos
/ BITS_PER_WORD
;
5469 temp
= operand_subword_force (temp
, word
, fmode
);
5470 bitpos
= bitpos
% BITS_PER_WORD
;
5473 /* Force the intermediate word_mode (or narrower) result into a
5474 register. This avoids attempting to create paradoxical SUBREGs
5475 of floating point modes below. */
5476 temp
= force_reg (imode
, temp
);
5478 /* If the bitpos is within the "result mode" lowpart, the operation
5479 can be implement with a single bitwise AND. Otherwise, we need
5480 a right shift and an AND. */
5482 if (bitpos
< GET_MODE_BITSIZE (rmode
))
5484 wide_int mask
= wi::set_bit_in_zero (bitpos
, GET_MODE_PRECISION (rmode
));
5486 if (GET_MODE_SIZE (imode
) > GET_MODE_SIZE (rmode
))
5487 temp
= gen_lowpart (rmode
, temp
);
5488 temp
= expand_binop (rmode
, and_optab
, temp
,
5489 immed_wide_int_const (mask
, rmode
),
5490 NULL_RTX
, 1, OPTAB_LIB_WIDEN
);
5494 /* Perform a logical right shift to place the signbit in the least
5495 significant bit, then truncate the result to the desired mode
5496 and mask just this bit. */
5497 temp
= expand_shift (RSHIFT_EXPR
, imode
, temp
, bitpos
, NULL_RTX
, 1);
5498 temp
= gen_lowpart (rmode
, temp
);
5499 temp
= expand_binop (rmode
, and_optab
, temp
, const1_rtx
,
5500 NULL_RTX
, 1, OPTAB_LIB_WIDEN
);
5506 /* Expand fork or exec calls. TARGET is the desired target of the
5507 call. EXP is the call. FN is the
5508 identificator of the actual function. IGNORE is nonzero if the
5509 value is to be ignored. */
5512 expand_builtin_fork_or_exec (tree fn
, tree exp
, rtx target
, int ignore
)
5517 /* If we are not profiling, just call the function. */
5518 if (!profile_arc_flag
)
5521 /* Otherwise call the wrapper. This should be equivalent for the rest of
5522 compiler, so the code does not diverge, and the wrapper may run the
5523 code necessary for keeping the profiling sane. */
5525 switch (DECL_FUNCTION_CODE (fn
))
5528 id
= get_identifier ("__gcov_fork");
5531 case BUILT_IN_EXECL
:
5532 id
= get_identifier ("__gcov_execl");
5535 case BUILT_IN_EXECV
:
5536 id
= get_identifier ("__gcov_execv");
5539 case BUILT_IN_EXECLP
:
5540 id
= get_identifier ("__gcov_execlp");
5543 case BUILT_IN_EXECLE
:
5544 id
= get_identifier ("__gcov_execle");
5547 case BUILT_IN_EXECVP
:
5548 id
= get_identifier ("__gcov_execvp");
5551 case BUILT_IN_EXECVE
:
5552 id
= get_identifier ("__gcov_execve");
5559 decl
= build_decl (DECL_SOURCE_LOCATION (fn
),
5560 FUNCTION_DECL
, id
, TREE_TYPE (fn
));
5561 DECL_EXTERNAL (decl
) = 1;
5562 TREE_PUBLIC (decl
) = 1;
5563 DECL_ARTIFICIAL (decl
) = 1;
5564 TREE_NOTHROW (decl
) = 1;
5565 DECL_VISIBILITY (decl
) = VISIBILITY_DEFAULT
;
5566 DECL_VISIBILITY_SPECIFIED (decl
) = 1;
5567 call
= rewrite_call_expr (EXPR_LOCATION (exp
), exp
, 0, decl
, 0);
5568 return expand_call (call
, target
, ignore
);
5573 /* Reconstitute a mode for a __sync intrinsic operation. Since the type of
5574 the pointer in these functions is void*, the tree optimizers may remove
5575 casts. The mode computed in expand_builtin isn't reliable either, due
5576 to __sync_bool_compare_and_swap.
5578 FCODE_DIFF should be fcode - base, where base is the FOO_1 code for the
5579 group of builtins. This gives us log2 of the mode size. */
5581 static inline machine_mode
5582 get_builtin_sync_mode (int fcode_diff
)
5584 /* The size is not negotiable, so ask not to get BLKmode in return
5585 if the target indicates that a smaller size would be better. */
5586 return int_mode_for_size (BITS_PER_UNIT
<< fcode_diff
, 0).require ();
5589 /* Expand the memory expression LOC and return the appropriate memory operand
5590 for the builtin_sync operations. */
5593 get_builtin_sync_mem (tree loc
, machine_mode mode
)
5597 addr
= expand_expr (loc
, NULL_RTX
, ptr_mode
, EXPAND_SUM
);
5598 addr
= convert_memory_address (Pmode
, addr
);
5600 /* Note that we explicitly do not want any alias information for this
5601 memory, so that we kill all other live memories. Otherwise we don't
5602 satisfy the full barrier semantics of the intrinsic. */
5603 mem
= validize_mem (gen_rtx_MEM (mode
, addr
));
5605 /* The alignment needs to be at least according to that of the mode. */
5606 set_mem_align (mem
, MAX (GET_MODE_ALIGNMENT (mode
),
5607 get_pointer_alignment (loc
)));
5608 set_mem_alias_set (mem
, ALIAS_SET_MEMORY_BARRIER
);
5609 MEM_VOLATILE_P (mem
) = 1;
5614 /* Make sure an argument is in the right mode.
5615 EXP is the tree argument.
5616 MODE is the mode it should be in. */
5619 expand_expr_force_mode (tree exp
, machine_mode mode
)
5622 machine_mode old_mode
;
5624 val
= expand_expr (exp
, NULL_RTX
, mode
, EXPAND_NORMAL
);
5625 /* If VAL is promoted to a wider mode, convert it back to MODE. Take care
5626 of CONST_INTs, where we know the old_mode only from the call argument. */
5628 old_mode
= GET_MODE (val
);
5629 if (old_mode
== VOIDmode
)
5630 old_mode
= TYPE_MODE (TREE_TYPE (exp
));
5631 val
= convert_modes (mode
, old_mode
, val
, 1);
5636 /* Expand the __sync_xxx_and_fetch and __sync_fetch_and_xxx intrinsics.
5637 EXP is the CALL_EXPR. CODE is the rtx code
5638 that corresponds to the arithmetic or logical operation from the name;
5639 an exception here is that NOT actually means NAND. TARGET is an optional
5640 place for us to store the results; AFTER is true if this is the
5641 fetch_and_xxx form. */
5644 expand_builtin_sync_operation (machine_mode mode
, tree exp
,
5645 enum rtx_code code
, bool after
,
5649 location_t loc
= EXPR_LOCATION (exp
);
5651 if (code
== NOT
&& warn_sync_nand
)
5653 tree fndecl
= get_callee_fndecl (exp
);
5654 enum built_in_function fcode
= DECL_FUNCTION_CODE (fndecl
);
5656 static bool warned_f_a_n
, warned_n_a_f
;
5660 case BUILT_IN_SYNC_FETCH_AND_NAND_1
:
5661 case BUILT_IN_SYNC_FETCH_AND_NAND_2
:
5662 case BUILT_IN_SYNC_FETCH_AND_NAND_4
:
5663 case BUILT_IN_SYNC_FETCH_AND_NAND_8
:
5664 case BUILT_IN_SYNC_FETCH_AND_NAND_16
:
5668 fndecl
= builtin_decl_implicit (BUILT_IN_SYNC_FETCH_AND_NAND_N
);
5669 inform (loc
, "%qD changed semantics in GCC 4.4", fndecl
);
5670 warned_f_a_n
= true;
5673 case BUILT_IN_SYNC_NAND_AND_FETCH_1
:
5674 case BUILT_IN_SYNC_NAND_AND_FETCH_2
:
5675 case BUILT_IN_SYNC_NAND_AND_FETCH_4
:
5676 case BUILT_IN_SYNC_NAND_AND_FETCH_8
:
5677 case BUILT_IN_SYNC_NAND_AND_FETCH_16
:
5681 fndecl
= builtin_decl_implicit (BUILT_IN_SYNC_NAND_AND_FETCH_N
);
5682 inform (loc
, "%qD changed semantics in GCC 4.4", fndecl
);
5683 warned_n_a_f
= true;
5691 /* Expand the operands. */
5692 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
5693 val
= expand_expr_force_mode (CALL_EXPR_ARG (exp
, 1), mode
);
5695 return expand_atomic_fetch_op (target
, mem
, val
, code
, MEMMODEL_SYNC_SEQ_CST
,
5699 /* Expand the __sync_val_compare_and_swap and __sync_bool_compare_and_swap
5700 intrinsics. EXP is the CALL_EXPR. IS_BOOL is
5701 true if this is the boolean form. TARGET is a place for us to store the
5702 results; this is NOT optional if IS_BOOL is true. */
5705 expand_builtin_compare_and_swap (machine_mode mode
, tree exp
,
5706 bool is_bool
, rtx target
)
5708 rtx old_val
, new_val
, mem
;
5711 /* Expand the operands. */
5712 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
5713 old_val
= expand_expr_force_mode (CALL_EXPR_ARG (exp
, 1), mode
);
5714 new_val
= expand_expr_force_mode (CALL_EXPR_ARG (exp
, 2), mode
);
5716 pbool
= poval
= NULL
;
5717 if (target
!= const0_rtx
)
5724 if (!expand_atomic_compare_and_swap (pbool
, poval
, mem
, old_val
, new_val
,
5725 false, MEMMODEL_SYNC_SEQ_CST
,
5726 MEMMODEL_SYNC_SEQ_CST
))
5732 /* Expand the __sync_lock_test_and_set intrinsic. Note that the most
5733 general form is actually an atomic exchange, and some targets only
5734 support a reduced form with the second argument being a constant 1.
5735 EXP is the CALL_EXPR; TARGET is an optional place for us to store
5739 expand_builtin_sync_lock_test_and_set (machine_mode mode
, tree exp
,
5744 /* Expand the operands. */
5745 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
5746 val
= expand_expr_force_mode (CALL_EXPR_ARG (exp
, 1), mode
);
5748 return expand_sync_lock_test_and_set (target
, mem
, val
);
5751 /* Expand the __sync_lock_release intrinsic. EXP is the CALL_EXPR. */
5754 expand_builtin_sync_lock_release (machine_mode mode
, tree exp
)
5758 /* Expand the operands. */
5759 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
5761 expand_atomic_store (mem
, const0_rtx
, MEMMODEL_SYNC_RELEASE
, true);
5764 /* Given an integer representing an ``enum memmodel'', verify its
5765 correctness and return the memory model enum. */
5767 static enum memmodel
5768 get_memmodel (tree exp
)
5771 unsigned HOST_WIDE_INT val
;
5773 = expansion_point_location_if_in_system_header (input_location
);
5775 /* If the parameter is not a constant, it's a run time value so we'll just
5776 convert it to MEMMODEL_SEQ_CST to avoid annoying runtime checking. */
5777 if (TREE_CODE (exp
) != INTEGER_CST
)
5778 return MEMMODEL_SEQ_CST
;
5780 op
= expand_normal (exp
);
5783 if (targetm
.memmodel_check
)
5784 val
= targetm
.memmodel_check (val
);
5785 else if (val
& ~MEMMODEL_MASK
)
5787 warning_at (loc
, OPT_Winvalid_memory_model
,
5788 "unknown architecture specifier in memory model to builtin");
5789 return MEMMODEL_SEQ_CST
;
5792 /* Should never see a user explicit SYNC memodel model, so >= LAST works. */
5793 if (memmodel_base (val
) >= MEMMODEL_LAST
)
5795 warning_at (loc
, OPT_Winvalid_memory_model
,
5796 "invalid memory model argument to builtin");
5797 return MEMMODEL_SEQ_CST
;
5800 /* Workaround for Bugzilla 59448. GCC doesn't track consume properly, so
5801 be conservative and promote consume to acquire. */
5802 if (val
== MEMMODEL_CONSUME
)
5803 val
= MEMMODEL_ACQUIRE
;
5805 return (enum memmodel
) val
;
5808 /* Expand the __atomic_exchange intrinsic:
5809 TYPE __atomic_exchange (TYPE *object, TYPE desired, enum memmodel)
5810 EXP is the CALL_EXPR.
5811 TARGET is an optional place for us to store the results. */
5814 expand_builtin_atomic_exchange (machine_mode mode
, tree exp
, rtx target
)
5817 enum memmodel model
;
5819 model
= get_memmodel (CALL_EXPR_ARG (exp
, 2));
5821 if (!flag_inline_atomics
)
5824 /* Expand the operands. */
5825 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
5826 val
= expand_expr_force_mode (CALL_EXPR_ARG (exp
, 1), mode
);
5828 return expand_atomic_exchange (target
, mem
, val
, model
);
5831 /* Expand the __atomic_compare_exchange intrinsic:
5832 bool __atomic_compare_exchange (TYPE *object, TYPE *expect,
5833 TYPE desired, BOOL weak,
5834 enum memmodel success,
5835 enum memmodel failure)
5836 EXP is the CALL_EXPR.
5837 TARGET is an optional place for us to store the results. */
5840 expand_builtin_atomic_compare_exchange (machine_mode mode
, tree exp
,
5843 rtx expect
, desired
, mem
, oldval
;
5844 rtx_code_label
*label
;
5845 enum memmodel success
, failure
;
5849 = expansion_point_location_if_in_system_header (input_location
);
5851 success
= get_memmodel (CALL_EXPR_ARG (exp
, 4));
5852 failure
= get_memmodel (CALL_EXPR_ARG (exp
, 5));
5854 if (failure
> success
)
5856 warning_at (loc
, OPT_Winvalid_memory_model
,
5857 "failure memory model cannot be stronger than success "
5858 "memory model for %<__atomic_compare_exchange%>");
5859 success
= MEMMODEL_SEQ_CST
;
5862 if (is_mm_release (failure
) || is_mm_acq_rel (failure
))
5864 warning_at (loc
, OPT_Winvalid_memory_model
,
5865 "invalid failure memory model for "
5866 "%<__atomic_compare_exchange%>");
5867 failure
= MEMMODEL_SEQ_CST
;
5868 success
= MEMMODEL_SEQ_CST
;
5872 if (!flag_inline_atomics
)
5875 /* Expand the operands. */
5876 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
5878 expect
= expand_normal (CALL_EXPR_ARG (exp
, 1));
5879 expect
= convert_memory_address (Pmode
, expect
);
5880 expect
= gen_rtx_MEM (mode
, expect
);
5881 desired
= expand_expr_force_mode (CALL_EXPR_ARG (exp
, 2), mode
);
5883 weak
= CALL_EXPR_ARG (exp
, 3);
5885 if (tree_fits_shwi_p (weak
) && tree_to_shwi (weak
) != 0)
5888 if (target
== const0_rtx
)
5891 /* Lest the rtl backend create a race condition with an imporoper store
5892 to memory, always create a new pseudo for OLDVAL. */
5895 if (!expand_atomic_compare_and_swap (&target
, &oldval
, mem
, expect
, desired
,
5896 is_weak
, success
, failure
))
5899 /* Conditionally store back to EXPECT, lest we create a race condition
5900 with an improper store to memory. */
5901 /* ??? With a rearrangement of atomics at the gimple level, we can handle
5902 the normal case where EXPECT is totally private, i.e. a register. At
5903 which point the store can be unconditional. */
5904 label
= gen_label_rtx ();
5905 emit_cmp_and_jump_insns (target
, const0_rtx
, NE
, NULL
,
5906 GET_MODE (target
), 1, label
);
5907 emit_move_insn (expect
, oldval
);
5913 /* Helper function for expand_ifn_atomic_compare_exchange - expand
5914 internal ATOMIC_COMPARE_EXCHANGE call into __atomic_compare_exchange_N
5915 call. The weak parameter must be dropped to match the expected parameter
5916 list and the expected argument changed from value to pointer to memory
5920 expand_ifn_atomic_compare_exchange_into_call (gcall
*call
, machine_mode mode
)
5923 vec
<tree
, va_gc
> *vec
;
5926 vec
->quick_push (gimple_call_arg (call
, 0));
5927 tree expected
= gimple_call_arg (call
, 1);
5928 rtx x
= assign_stack_temp_for_type (mode
, GET_MODE_SIZE (mode
),
5929 TREE_TYPE (expected
));
5930 rtx expd
= expand_expr (expected
, x
, mode
, EXPAND_NORMAL
);
5932 emit_move_insn (x
, expd
);
5933 tree v
= make_tree (TREE_TYPE (expected
), x
);
5934 vec
->quick_push (build1 (ADDR_EXPR
,
5935 build_pointer_type (TREE_TYPE (expected
)), v
));
5936 vec
->quick_push (gimple_call_arg (call
, 2));
5937 /* Skip the boolean weak parameter. */
5938 for (z
= 4; z
< 6; z
++)
5939 vec
->quick_push (gimple_call_arg (call
, z
));
5940 /* At present we only have BUILT_IN_ATOMIC_COMPARE_EXCHANGE_{1,2,4,8,16}. */
5941 unsigned int bytes_log2
= exact_log2 (GET_MODE_SIZE (mode
).to_constant ());
5942 gcc_assert (bytes_log2
< 5);
5943 built_in_function fncode
5944 = (built_in_function
) ((int) BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1
5946 tree fndecl
= builtin_decl_explicit (fncode
);
5947 tree fn
= build1 (ADDR_EXPR
, build_pointer_type (TREE_TYPE (fndecl
)),
5949 tree exp
= build_call_vec (boolean_type_node
, fn
, vec
);
5950 tree lhs
= gimple_call_lhs (call
);
5951 rtx boolret
= expand_call (exp
, NULL_RTX
, lhs
== NULL_TREE
);
5954 rtx target
= expand_expr (lhs
, NULL_RTX
, VOIDmode
, EXPAND_WRITE
);
5955 if (GET_MODE (boolret
) != mode
)
5956 boolret
= convert_modes (mode
, GET_MODE (boolret
), boolret
, 1);
5957 x
= force_reg (mode
, x
);
5958 write_complex_part (target
, boolret
, true);
5959 write_complex_part (target
, x
, false);
5963 /* Expand IFN_ATOMIC_COMPARE_EXCHANGE internal function. */
5966 expand_ifn_atomic_compare_exchange (gcall
*call
)
5968 int size
= tree_to_shwi (gimple_call_arg (call
, 3)) & 255;
5969 gcc_assert (size
== 1 || size
== 2 || size
== 4 || size
== 8 || size
== 16);
5970 machine_mode mode
= int_mode_for_size (BITS_PER_UNIT
* size
, 0).require ();
5971 rtx expect
, desired
, mem
, oldval
, boolret
;
5972 enum memmodel success
, failure
;
5976 = expansion_point_location_if_in_system_header (gimple_location (call
));
5978 success
= get_memmodel (gimple_call_arg (call
, 4));
5979 failure
= get_memmodel (gimple_call_arg (call
, 5));
5981 if (failure
> success
)
5983 warning_at (loc
, OPT_Winvalid_memory_model
,
5984 "failure memory model cannot be stronger than success "
5985 "memory model for %<__atomic_compare_exchange%>");
5986 success
= MEMMODEL_SEQ_CST
;
5989 if (is_mm_release (failure
) || is_mm_acq_rel (failure
))
5991 warning_at (loc
, OPT_Winvalid_memory_model
,
5992 "invalid failure memory model for "
5993 "%<__atomic_compare_exchange%>");
5994 failure
= MEMMODEL_SEQ_CST
;
5995 success
= MEMMODEL_SEQ_CST
;
5998 if (!flag_inline_atomics
)
6000 expand_ifn_atomic_compare_exchange_into_call (call
, mode
);
6004 /* Expand the operands. */
6005 mem
= get_builtin_sync_mem (gimple_call_arg (call
, 0), mode
);
6007 expect
= expand_expr_force_mode (gimple_call_arg (call
, 1), mode
);
6008 desired
= expand_expr_force_mode (gimple_call_arg (call
, 2), mode
);
6010 is_weak
= (tree_to_shwi (gimple_call_arg (call
, 3)) & 256) != 0;
6015 if (!expand_atomic_compare_and_swap (&boolret
, &oldval
, mem
, expect
, desired
,
6016 is_weak
, success
, failure
))
6018 expand_ifn_atomic_compare_exchange_into_call (call
, mode
);
6022 lhs
= gimple_call_lhs (call
);
6025 rtx target
= expand_expr (lhs
, NULL_RTX
, VOIDmode
, EXPAND_WRITE
);
6026 if (GET_MODE (boolret
) != mode
)
6027 boolret
= convert_modes (mode
, GET_MODE (boolret
), boolret
, 1);
6028 write_complex_part (target
, boolret
, true);
6029 write_complex_part (target
, oldval
, false);
6033 /* Expand the __atomic_load intrinsic:
6034 TYPE __atomic_load (TYPE *object, enum memmodel)
6035 EXP is the CALL_EXPR.
6036 TARGET is an optional place for us to store the results. */
6039 expand_builtin_atomic_load (machine_mode mode
, tree exp
, rtx target
)
6042 enum memmodel model
;
6044 model
= get_memmodel (CALL_EXPR_ARG (exp
, 1));
6045 if (is_mm_release (model
) || is_mm_acq_rel (model
))
6048 = expansion_point_location_if_in_system_header (input_location
);
6049 warning_at (loc
, OPT_Winvalid_memory_model
,
6050 "invalid memory model for %<__atomic_load%>");
6051 model
= MEMMODEL_SEQ_CST
;
6054 if (!flag_inline_atomics
)
6057 /* Expand the operand. */
6058 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
6060 return expand_atomic_load (target
, mem
, model
);
6064 /* Expand the __atomic_store intrinsic:
6065 void __atomic_store (TYPE *object, TYPE desired, enum memmodel)
6066 EXP is the CALL_EXPR.
6067 TARGET is an optional place for us to store the results. */
6070 expand_builtin_atomic_store (machine_mode mode
, tree exp
)
6073 enum memmodel model
;
6075 model
= get_memmodel (CALL_EXPR_ARG (exp
, 2));
6076 if (!(is_mm_relaxed (model
) || is_mm_seq_cst (model
)
6077 || is_mm_release (model
)))
6080 = expansion_point_location_if_in_system_header (input_location
);
6081 warning_at (loc
, OPT_Winvalid_memory_model
,
6082 "invalid memory model for %<__atomic_store%>");
6083 model
= MEMMODEL_SEQ_CST
;
6086 if (!flag_inline_atomics
)
6089 /* Expand the operands. */
6090 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
6091 val
= expand_expr_force_mode (CALL_EXPR_ARG (exp
, 1), mode
);
6093 return expand_atomic_store (mem
, val
, model
, false);
6096 /* Expand the __atomic_fetch_XXX intrinsic:
6097 TYPE __atomic_fetch_XXX (TYPE *object, TYPE val, enum memmodel)
6098 EXP is the CALL_EXPR.
6099 TARGET is an optional place for us to store the results.
6100 CODE is the operation, PLUS, MINUS, ADD, XOR, or IOR.
6101 FETCH_AFTER is true if returning the result of the operation.
6102 FETCH_AFTER is false if returning the value before the operation.
6103 IGNORE is true if the result is not used.
6104 EXT_CALL is the correct builtin for an external call if this cannot be
6105 resolved to an instruction sequence. */
6108 expand_builtin_atomic_fetch_op (machine_mode mode
, tree exp
, rtx target
,
6109 enum rtx_code code
, bool fetch_after
,
6110 bool ignore
, enum built_in_function ext_call
)
6113 enum memmodel model
;
6117 model
= get_memmodel (CALL_EXPR_ARG (exp
, 2));
6119 /* Expand the operands. */
6120 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
6121 val
= expand_expr_force_mode (CALL_EXPR_ARG (exp
, 1), mode
);
6123 /* Only try generating instructions if inlining is turned on. */
6124 if (flag_inline_atomics
)
6126 ret
= expand_atomic_fetch_op (target
, mem
, val
, code
, model
, fetch_after
);
6131 /* Return if a different routine isn't needed for the library call. */
6132 if (ext_call
== BUILT_IN_NONE
)
6135 /* Change the call to the specified function. */
6136 fndecl
= get_callee_fndecl (exp
);
6137 addr
= CALL_EXPR_FN (exp
);
6140 gcc_assert (TREE_OPERAND (addr
, 0) == fndecl
);
6141 TREE_OPERAND (addr
, 0) = builtin_decl_explicit (ext_call
);
6143 /* If we will emit code after the call, the call can not be a tail call.
6144 If it is emitted as a tail call, a barrier is emitted after it, and
6145 then all trailing code is removed. */
6147 CALL_EXPR_TAILCALL (exp
) = 0;
6149 /* Expand the call here so we can emit trailing code. */
6150 ret
= expand_call (exp
, target
, ignore
);
6152 /* Replace the original function just in case it matters. */
6153 TREE_OPERAND (addr
, 0) = fndecl
;
6155 /* Then issue the arithmetic correction to return the right result. */
6160 ret
= expand_simple_binop (mode
, AND
, ret
, val
, NULL_RTX
, true,
6162 ret
= expand_simple_unop (mode
, NOT
, ret
, target
, true);
6165 ret
= expand_simple_binop (mode
, code
, ret
, val
, target
, true,
6171 /* Expand IFN_ATOMIC_BIT_TEST_AND_* internal function. */
6174 expand_ifn_atomic_bit_test_and (gcall
*call
)
6176 tree ptr
= gimple_call_arg (call
, 0);
6177 tree bit
= gimple_call_arg (call
, 1);
6178 tree flag
= gimple_call_arg (call
, 2);
6179 tree lhs
= gimple_call_lhs (call
);
6180 enum memmodel model
= MEMMODEL_SYNC_SEQ_CST
;
6181 machine_mode mode
= TYPE_MODE (TREE_TYPE (flag
));
6184 struct expand_operand ops
[5];
6186 gcc_assert (flag_inline_atomics
);
6188 if (gimple_call_num_args (call
) == 4)
6189 model
= get_memmodel (gimple_call_arg (call
, 3));
6191 rtx mem
= get_builtin_sync_mem (ptr
, mode
);
6192 rtx val
= expand_expr_force_mode (bit
, mode
);
6194 switch (gimple_call_internal_fn (call
))
6196 case IFN_ATOMIC_BIT_TEST_AND_SET
:
6198 optab
= atomic_bit_test_and_set_optab
;
6200 case IFN_ATOMIC_BIT_TEST_AND_COMPLEMENT
:
6202 optab
= atomic_bit_test_and_complement_optab
;
6204 case IFN_ATOMIC_BIT_TEST_AND_RESET
:
6206 optab
= atomic_bit_test_and_reset_optab
;
6212 if (lhs
== NULL_TREE
)
6214 val
= expand_simple_binop (mode
, ASHIFT
, const1_rtx
,
6215 val
, NULL_RTX
, true, OPTAB_DIRECT
);
6217 val
= expand_simple_unop (mode
, NOT
, val
, NULL_RTX
, true);
6218 expand_atomic_fetch_op (const0_rtx
, mem
, val
, code
, model
, false);
6222 rtx target
= expand_expr (lhs
, NULL_RTX
, VOIDmode
, EXPAND_WRITE
);
6223 enum insn_code icode
= direct_optab_handler (optab
, mode
);
6224 gcc_assert (icode
!= CODE_FOR_nothing
);
6225 create_output_operand (&ops
[0], target
, mode
);
6226 create_fixed_operand (&ops
[1], mem
);
6227 create_convert_operand_to (&ops
[2], val
, mode
, true);
6228 create_integer_operand (&ops
[3], model
);
6229 create_integer_operand (&ops
[4], integer_onep (flag
));
6230 if (maybe_expand_insn (icode
, 5, ops
))
6234 val
= expand_simple_binop (mode
, ASHIFT
, const1_rtx
,
6235 val
, NULL_RTX
, true, OPTAB_DIRECT
);
6238 val
= expand_simple_unop (mode
, NOT
, val
, NULL_RTX
, true);
6239 rtx result
= expand_atomic_fetch_op (gen_reg_rtx (mode
), mem
, val
,
6240 code
, model
, false);
6241 if (integer_onep (flag
))
6243 result
= expand_simple_binop (mode
, ASHIFTRT
, result
, bitval
,
6244 NULL_RTX
, true, OPTAB_DIRECT
);
6245 result
= expand_simple_binop (mode
, AND
, result
, const1_rtx
, target
,
6246 true, OPTAB_DIRECT
);
6249 result
= expand_simple_binop (mode
, AND
, result
, maskval
, target
, true,
6251 if (result
!= target
)
6252 emit_move_insn (target
, result
);
6255 /* Expand an atomic clear operation.
6256 void _atomic_clear (BOOL *obj, enum memmodel)
6257 EXP is the call expression. */
6260 expand_builtin_atomic_clear (tree exp
)
6264 enum memmodel model
;
6266 mode
= int_mode_for_size (BOOL_TYPE_SIZE
, 0).require ();
6267 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
6268 model
= get_memmodel (CALL_EXPR_ARG (exp
, 1));
6270 if (is_mm_consume (model
) || is_mm_acquire (model
) || is_mm_acq_rel (model
))
6273 = expansion_point_location_if_in_system_header (input_location
);
6274 warning_at (loc
, OPT_Winvalid_memory_model
,
6275 "invalid memory model for %<__atomic_store%>");
6276 model
= MEMMODEL_SEQ_CST
;
6279 /* Try issuing an __atomic_store, and allow fallback to __sync_lock_release.
6280 Failing that, a store is issued by __atomic_store. The only way this can
6281 fail is if the bool type is larger than a word size. Unlikely, but
6282 handle it anyway for completeness. Assume a single threaded model since
6283 there is no atomic support in this case, and no barriers are required. */
6284 ret
= expand_atomic_store (mem
, const0_rtx
, model
, true);
6286 emit_move_insn (mem
, const0_rtx
);
6290 /* Expand an atomic test_and_set operation.
6291 bool _atomic_test_and_set (BOOL *obj, enum memmodel)
6292 EXP is the call expression. */
6295 expand_builtin_atomic_test_and_set (tree exp
, rtx target
)
6298 enum memmodel model
;
6301 mode
= int_mode_for_size (BOOL_TYPE_SIZE
, 0).require ();
6302 mem
= get_builtin_sync_mem (CALL_EXPR_ARG (exp
, 0), mode
);
6303 model
= get_memmodel (CALL_EXPR_ARG (exp
, 1));
6305 return expand_atomic_test_and_set (target
, mem
, model
);
6309 /* Return true if (optional) argument ARG1 of size ARG0 is always lock free on
6310 this architecture. If ARG1 is NULL, use typical alignment for size ARG0. */
6313 fold_builtin_atomic_always_lock_free (tree arg0
, tree arg1
)
6317 unsigned int mode_align
, type_align
;
6319 if (TREE_CODE (arg0
) != INTEGER_CST
)
6322 /* We need a corresponding integer mode for the access to be lock-free. */
6323 size
= INTVAL (expand_normal (arg0
)) * BITS_PER_UNIT
;
6324 if (!int_mode_for_size (size
, 0).exists (&mode
))
6325 return boolean_false_node
;
6327 mode_align
= GET_MODE_ALIGNMENT (mode
);
6329 if (TREE_CODE (arg1
) == INTEGER_CST
)
6331 unsigned HOST_WIDE_INT val
= UINTVAL (expand_normal (arg1
));
6333 /* Either this argument is null, or it's a fake pointer encoding
6334 the alignment of the object. */
6335 val
= least_bit_hwi (val
);
6336 val
*= BITS_PER_UNIT
;
6338 if (val
== 0 || mode_align
< val
)
6339 type_align
= mode_align
;
6345 tree ttype
= TREE_TYPE (arg1
);
6347 /* This function is usually invoked and folded immediately by the front
6348 end before anything else has a chance to look at it. The pointer
6349 parameter at this point is usually cast to a void *, so check for that
6350 and look past the cast. */
6351 if (CONVERT_EXPR_P (arg1
)
6352 && POINTER_TYPE_P (ttype
)
6353 && VOID_TYPE_P (TREE_TYPE (ttype
))
6354 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg1
, 0))))
6355 arg1
= TREE_OPERAND (arg1
, 0);
6357 ttype
= TREE_TYPE (arg1
);
6358 gcc_assert (POINTER_TYPE_P (ttype
));
6360 /* Get the underlying type of the object. */
6361 ttype
= TREE_TYPE (ttype
);
6362 type_align
= TYPE_ALIGN (ttype
);
6365 /* If the object has smaller alignment, the lock free routines cannot
6367 if (type_align
< mode_align
)
6368 return boolean_false_node
;
6370 /* Check if a compare_and_swap pattern exists for the mode which represents
6371 the required size. The pattern is not allowed to fail, so the existence
6372 of the pattern indicates support is present. Also require that an
6373 atomic load exists for the required size. */
6374 if (can_compare_and_swap_p (mode
, true) && can_atomic_load_p (mode
))
6375 return boolean_true_node
;
6377 return boolean_false_node
;
6380 /* Return true if the parameters to call EXP represent an object which will
6381 always generate lock free instructions. The first argument represents the
6382 size of the object, and the second parameter is a pointer to the object
6383 itself. If NULL is passed for the object, then the result is based on
6384 typical alignment for an object of the specified size. Otherwise return
6388 expand_builtin_atomic_always_lock_free (tree exp
)
6391 tree arg0
= CALL_EXPR_ARG (exp
, 0);
6392 tree arg1
= CALL_EXPR_ARG (exp
, 1);
6394 if (TREE_CODE (arg0
) != INTEGER_CST
)
6396 error ("non-constant argument 1 to __atomic_always_lock_free");
6400 size
= fold_builtin_atomic_always_lock_free (arg0
, arg1
);
6401 if (size
== boolean_true_node
)
6406 /* Return a one or zero if it can be determined that object ARG1 of size ARG
6407 is lock free on this architecture. */
6410 fold_builtin_atomic_is_lock_free (tree arg0
, tree arg1
)
6412 if (!flag_inline_atomics
)
6415 /* If it isn't always lock free, don't generate a result. */
6416 if (fold_builtin_atomic_always_lock_free (arg0
, arg1
) == boolean_true_node
)
6417 return boolean_true_node
;
6422 /* Return true if the parameters to call EXP represent an object which will
6423 always generate lock free instructions. The first argument represents the
6424 size of the object, and the second parameter is a pointer to the object
6425 itself. If NULL is passed for the object, then the result is based on
6426 typical alignment for an object of the specified size. Otherwise return
6430 expand_builtin_atomic_is_lock_free (tree exp
)
6433 tree arg0
= CALL_EXPR_ARG (exp
, 0);
6434 tree arg1
= CALL_EXPR_ARG (exp
, 1);
6436 if (!INTEGRAL_TYPE_P (TREE_TYPE (arg0
)))
6438 error ("non-integer argument 1 to __atomic_is_lock_free");
6442 if (!flag_inline_atomics
)
6445 /* If the value is known at compile time, return the RTX for it. */
6446 size
= fold_builtin_atomic_is_lock_free (arg0
, arg1
);
6447 if (size
== boolean_true_node
)
6453 /* Expand the __atomic_thread_fence intrinsic:
6454 void __atomic_thread_fence (enum memmodel)
6455 EXP is the CALL_EXPR. */
6458 expand_builtin_atomic_thread_fence (tree exp
)
6460 enum memmodel model
= get_memmodel (CALL_EXPR_ARG (exp
, 0));
6461 expand_mem_thread_fence (model
);
6464 /* Expand the __atomic_signal_fence intrinsic:
6465 void __atomic_signal_fence (enum memmodel)
6466 EXP is the CALL_EXPR. */
6469 expand_builtin_atomic_signal_fence (tree exp
)
6471 enum memmodel model
= get_memmodel (CALL_EXPR_ARG (exp
, 0));
6472 expand_mem_signal_fence (model
);
6475 /* Expand the __sync_synchronize intrinsic. */
6478 expand_builtin_sync_synchronize (void)
6480 expand_mem_thread_fence (MEMMODEL_SYNC_SEQ_CST
);
6484 expand_builtin_thread_pointer (tree exp
, rtx target
)
6486 enum insn_code icode
;
6487 if (!validate_arglist (exp
, VOID_TYPE
))
6489 icode
= direct_optab_handler (get_thread_pointer_optab
, Pmode
);
6490 if (icode
!= CODE_FOR_nothing
)
6492 struct expand_operand op
;
6493 /* If the target is not sutitable then create a new target. */
6494 if (target
== NULL_RTX
6496 || GET_MODE (target
) != Pmode
)
6497 target
= gen_reg_rtx (Pmode
);
6498 create_output_operand (&op
, target
, Pmode
);
6499 expand_insn (icode
, 1, &op
);
6502 error ("__builtin_thread_pointer is not supported on this target");
6507 expand_builtin_set_thread_pointer (tree exp
)
6509 enum insn_code icode
;
6510 if (!validate_arglist (exp
, POINTER_TYPE
, VOID_TYPE
))
6512 icode
= direct_optab_handler (set_thread_pointer_optab
, Pmode
);
6513 if (icode
!= CODE_FOR_nothing
)
6515 struct expand_operand op
;
6516 rtx val
= expand_expr (CALL_EXPR_ARG (exp
, 0), NULL_RTX
,
6517 Pmode
, EXPAND_NORMAL
);
6518 create_input_operand (&op
, val
, Pmode
);
6519 expand_insn (icode
, 1, &op
);
6522 error ("__builtin_set_thread_pointer is not supported on this target");
6526 /* Emit code to restore the current value of stack. */
6529 expand_stack_restore (tree var
)
6532 rtx sa
= expand_normal (var
);
6534 sa
= convert_memory_address (Pmode
, sa
);
6536 prev
= get_last_insn ();
6537 emit_stack_restore (SAVE_BLOCK
, sa
);
6539 record_new_stack_level ();
6541 fixup_args_size_notes (prev
, get_last_insn (), 0);
6544 /* Emit code to save the current value of stack. */
6547 expand_stack_save (void)
6551 emit_stack_save (SAVE_BLOCK
, &ret
);
6555 /* Emit code to get the openacc gang, worker or vector id or size. */
6558 expand_builtin_goacc_parlevel_id_size (tree exp
, rtx target
, int ignore
)
6561 rtx fallback_retval
;
6562 rtx_insn
*(*gen_fn
) (rtx
, rtx
);
6563 switch (DECL_FUNCTION_CODE (get_callee_fndecl (exp
)))
6565 case BUILT_IN_GOACC_PARLEVEL_ID
:
6566 name
= "__builtin_goacc_parlevel_id";
6567 fallback_retval
= const0_rtx
;
6568 gen_fn
= targetm
.gen_oacc_dim_pos
;
6570 case BUILT_IN_GOACC_PARLEVEL_SIZE
:
6571 name
= "__builtin_goacc_parlevel_size";
6572 fallback_retval
= const1_rtx
;
6573 gen_fn
= targetm
.gen_oacc_dim_size
;
6579 if (oacc_get_fn_attrib (current_function_decl
) == NULL_TREE
)
6581 error ("%qs only supported in OpenACC code", name
);
6585 tree arg
= CALL_EXPR_ARG (exp
, 0);
6586 if (TREE_CODE (arg
) != INTEGER_CST
)
6588 error ("non-constant argument 0 to %qs", name
);
6592 int dim
= TREE_INT_CST_LOW (arg
);
6596 case GOMP_DIM_WORKER
:
6597 case GOMP_DIM_VECTOR
:
6600 error ("illegal argument 0 to %qs", name
);
6607 if (target
== NULL_RTX
)
6608 target
= gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp
)));
6610 if (!targetm
.have_oacc_dim_size ())
6612 emit_move_insn (target
, fallback_retval
);
6616 rtx reg
= MEM_P (target
) ? gen_reg_rtx (GET_MODE (target
)) : target
;
6617 emit_insn (gen_fn (reg
, GEN_INT (dim
)));
6619 emit_move_insn (target
, reg
);
6624 /* Expand an expression EXP that calls a built-in function,
6625 with result going to TARGET if that's convenient
6626 (and in mode MODE if that's convenient).
6627 SUBTARGET may be used as the target for computing one of EXP's operands.
6628 IGNORE is nonzero if the value is to be ignored. */
6631 expand_builtin (tree exp
, rtx target
, rtx subtarget
, machine_mode mode
,
6634 tree fndecl
= get_callee_fndecl (exp
);
6635 enum built_in_function fcode
= DECL_FUNCTION_CODE (fndecl
);
6636 machine_mode target_mode
= TYPE_MODE (TREE_TYPE (exp
));
6639 if (DECL_BUILT_IN_CLASS (fndecl
) == BUILT_IN_MD
)
6640 return targetm
.expand_builtin (exp
, target
, subtarget
, mode
, ignore
);
6642 /* When ASan is enabled, we don't want to expand some memory/string
6643 builtins and rely on libsanitizer's hooks. This allows us to avoid
6644 redundant checks and be sure, that possible overflow will be detected
6647 if ((flag_sanitize
& SANITIZE_ADDRESS
) && asan_intercepted_p (fcode
))
6648 return expand_call (exp
, target
, ignore
);
6650 /* When not optimizing, generate calls to library functions for a certain
6653 && !called_as_built_in (fndecl
)
6654 && fcode
!= BUILT_IN_FORK
6655 && fcode
!= BUILT_IN_EXECL
6656 && fcode
!= BUILT_IN_EXECV
6657 && fcode
!= BUILT_IN_EXECLP
6658 && fcode
!= BUILT_IN_EXECLE
6659 && fcode
!= BUILT_IN_EXECVP
6660 && fcode
!= BUILT_IN_EXECVE
6661 && !ALLOCA_FUNCTION_CODE_P (fcode
)
6662 && fcode
!= BUILT_IN_FREE
)
6663 return expand_call (exp
, target
, ignore
);
6665 /* The built-in function expanders test for target == const0_rtx
6666 to determine whether the function's result will be ignored. */
6668 target
= const0_rtx
;
6670 /* If the result of a pure or const built-in function is ignored, and
6671 none of its arguments are volatile, we can avoid expanding the
6672 built-in call and just evaluate the arguments for side-effects. */
6673 if (target
== const0_rtx
6674 && ((flags
= flags_from_decl_or_type (fndecl
)) & (ECF_CONST
| ECF_PURE
))
6675 && !(flags
& ECF_LOOPING_CONST_OR_PURE
))
6677 bool volatilep
= false;
6679 call_expr_arg_iterator iter
;
6681 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, exp
)
6682 if (TREE_THIS_VOLATILE (arg
))
6690 FOR_EACH_CALL_EXPR_ARG (arg
, iter
, exp
)
6691 expand_expr (arg
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
6698 CASE_FLT_FN (BUILT_IN_FABS
):
6699 CASE_FLT_FN_FLOATN_NX (BUILT_IN_FABS
):
6700 case BUILT_IN_FABSD32
:
6701 case BUILT_IN_FABSD64
:
6702 case BUILT_IN_FABSD128
:
6703 target
= expand_builtin_fabs (exp
, target
, subtarget
);
6708 CASE_FLT_FN (BUILT_IN_COPYSIGN
):
6709 CASE_FLT_FN_FLOATN_NX (BUILT_IN_COPYSIGN
):
6710 target
= expand_builtin_copysign (exp
, target
, subtarget
);
6715 /* Just do a normal library call if we were unable to fold
6717 CASE_FLT_FN (BUILT_IN_CABS
):
6720 CASE_FLT_FN (BUILT_IN_FMA
):
6721 CASE_FLT_FN_FLOATN_NX (BUILT_IN_FMA
):
6722 target
= expand_builtin_mathfn_ternary (exp
, target
, subtarget
);
6727 CASE_FLT_FN (BUILT_IN_ILOGB
):
6728 if (! flag_unsafe_math_optimizations
)
6731 CASE_FLT_FN (BUILT_IN_ISINF
):
6732 CASE_FLT_FN (BUILT_IN_FINITE
):
6733 case BUILT_IN_ISFINITE
:
6734 case BUILT_IN_ISNORMAL
:
6735 target
= expand_builtin_interclass_mathfn (exp
, target
);
6740 CASE_FLT_FN (BUILT_IN_ICEIL
):
6741 CASE_FLT_FN (BUILT_IN_LCEIL
):
6742 CASE_FLT_FN (BUILT_IN_LLCEIL
):
6743 CASE_FLT_FN (BUILT_IN_LFLOOR
):
6744 CASE_FLT_FN (BUILT_IN_IFLOOR
):
6745 CASE_FLT_FN (BUILT_IN_LLFLOOR
):
6746 target
= expand_builtin_int_roundingfn (exp
, target
);
6751 CASE_FLT_FN (BUILT_IN_IRINT
):
6752 CASE_FLT_FN (BUILT_IN_LRINT
):
6753 CASE_FLT_FN (BUILT_IN_LLRINT
):
6754 CASE_FLT_FN (BUILT_IN_IROUND
):
6755 CASE_FLT_FN (BUILT_IN_LROUND
):
6756 CASE_FLT_FN (BUILT_IN_LLROUND
):
6757 target
= expand_builtin_int_roundingfn_2 (exp
, target
);
6762 CASE_FLT_FN (BUILT_IN_POWI
):
6763 target
= expand_builtin_powi (exp
, target
);
6768 CASE_FLT_FN (BUILT_IN_CEXPI
):
6769 target
= expand_builtin_cexpi (exp
, target
);
6770 gcc_assert (target
);
6773 CASE_FLT_FN (BUILT_IN_SIN
):
6774 CASE_FLT_FN (BUILT_IN_COS
):
6775 if (! flag_unsafe_math_optimizations
)
6777 target
= expand_builtin_mathfn_3 (exp
, target
, subtarget
);
6782 CASE_FLT_FN (BUILT_IN_SINCOS
):
6783 if (! flag_unsafe_math_optimizations
)
6785 target
= expand_builtin_sincos (exp
);
6790 case BUILT_IN_APPLY_ARGS
:
6791 return expand_builtin_apply_args ();
6793 /* __builtin_apply (FUNCTION, ARGUMENTS, ARGSIZE) invokes
6794 FUNCTION with a copy of the parameters described by
6795 ARGUMENTS, and ARGSIZE. It returns a block of memory
6796 allocated on the stack into which is stored all the registers
6797 that might possibly be used for returning the result of a
6798 function. ARGUMENTS is the value returned by
6799 __builtin_apply_args. ARGSIZE is the number of bytes of
6800 arguments that must be copied. ??? How should this value be
6801 computed? We'll also need a safe worst case value for varargs
6803 case BUILT_IN_APPLY
:
6804 if (!validate_arglist (exp
, POINTER_TYPE
,
6805 POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
)
6806 && !validate_arglist (exp
, REFERENCE_TYPE
,
6807 POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
6813 ops
[0] = expand_normal (CALL_EXPR_ARG (exp
, 0));
6814 ops
[1] = expand_normal (CALL_EXPR_ARG (exp
, 1));
6815 ops
[2] = expand_normal (CALL_EXPR_ARG (exp
, 2));
6817 return expand_builtin_apply (ops
[0], ops
[1], ops
[2]);
6820 /* __builtin_return (RESULT) causes the function to return the
6821 value described by RESULT. RESULT is address of the block of
6822 memory returned by __builtin_apply. */
6823 case BUILT_IN_RETURN
:
6824 if (validate_arglist (exp
, POINTER_TYPE
, VOID_TYPE
))
6825 expand_builtin_return (expand_normal (CALL_EXPR_ARG (exp
, 0)));
6828 case BUILT_IN_SAVEREGS
:
6829 return expand_builtin_saveregs ();
6831 case BUILT_IN_VA_ARG_PACK
:
6832 /* All valid uses of __builtin_va_arg_pack () are removed during
6834 error ("%Kinvalid use of %<__builtin_va_arg_pack ()%>", exp
);
6837 case BUILT_IN_VA_ARG_PACK_LEN
:
6838 /* All valid uses of __builtin_va_arg_pack_len () are removed during
6840 error ("%Kinvalid use of %<__builtin_va_arg_pack_len ()%>", exp
);
6843 /* Return the address of the first anonymous stack arg. */
6844 case BUILT_IN_NEXT_ARG
:
6845 if (fold_builtin_next_arg (exp
, false))
6847 return expand_builtin_next_arg ();
6849 case BUILT_IN_CLEAR_CACHE
:
6850 target
= expand_builtin___clear_cache (exp
);
6855 case BUILT_IN_CLASSIFY_TYPE
:
6856 return expand_builtin_classify_type (exp
);
6858 case BUILT_IN_CONSTANT_P
:
6861 case BUILT_IN_FRAME_ADDRESS
:
6862 case BUILT_IN_RETURN_ADDRESS
:
6863 return expand_builtin_frame_address (fndecl
, exp
);
6865 /* Returns the address of the area where the structure is returned.
6867 case BUILT_IN_AGGREGATE_INCOMING_ADDRESS
:
6868 if (call_expr_nargs (exp
) != 0
6869 || ! AGGREGATE_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl
)))
6870 || !MEM_P (DECL_RTL (DECL_RESULT (current_function_decl
))))
6873 return XEXP (DECL_RTL (DECL_RESULT (current_function_decl
)), 0);
6875 CASE_BUILT_IN_ALLOCA
:
6876 target
= expand_builtin_alloca (exp
);
6881 case BUILT_IN_ASAN_ALLOCAS_UNPOISON
:
6882 return expand_asan_emit_allocas_unpoison (exp
);
6884 case BUILT_IN_STACK_SAVE
:
6885 return expand_stack_save ();
6887 case BUILT_IN_STACK_RESTORE
:
6888 expand_stack_restore (CALL_EXPR_ARG (exp
, 0));
6891 case BUILT_IN_BSWAP16
:
6892 case BUILT_IN_BSWAP32
:
6893 case BUILT_IN_BSWAP64
:
6894 target
= expand_builtin_bswap (target_mode
, exp
, target
, subtarget
);
6899 CASE_INT_FN (BUILT_IN_FFS
):
6900 target
= expand_builtin_unop (target_mode
, exp
, target
,
6901 subtarget
, ffs_optab
);
6906 CASE_INT_FN (BUILT_IN_CLZ
):
6907 target
= expand_builtin_unop (target_mode
, exp
, target
,
6908 subtarget
, clz_optab
);
6913 CASE_INT_FN (BUILT_IN_CTZ
):
6914 target
= expand_builtin_unop (target_mode
, exp
, target
,
6915 subtarget
, ctz_optab
);
6920 CASE_INT_FN (BUILT_IN_CLRSB
):
6921 target
= expand_builtin_unop (target_mode
, exp
, target
,
6922 subtarget
, clrsb_optab
);
6927 CASE_INT_FN (BUILT_IN_POPCOUNT
):
6928 target
= expand_builtin_unop (target_mode
, exp
, target
,
6929 subtarget
, popcount_optab
);
6934 CASE_INT_FN (BUILT_IN_PARITY
):
6935 target
= expand_builtin_unop (target_mode
, exp
, target
,
6936 subtarget
, parity_optab
);
6941 case BUILT_IN_STRLEN
:
6942 target
= expand_builtin_strlen (exp
, target
, target_mode
);
6947 case BUILT_IN_STRCAT
:
6948 target
= expand_builtin_strcat (exp
, target
);
6953 case BUILT_IN_STRCPY
:
6954 target
= expand_builtin_strcpy (exp
, target
);
6959 case BUILT_IN_STRNCAT
:
6960 target
= expand_builtin_strncat (exp
, target
);
6965 case BUILT_IN_STRNCPY
:
6966 target
= expand_builtin_strncpy (exp
, target
);
6971 case BUILT_IN_STPCPY
:
6972 target
= expand_builtin_stpcpy (exp
, target
, mode
);
6977 case BUILT_IN_STPNCPY
:
6978 target
= expand_builtin_stpncpy (exp
, target
);
6983 case BUILT_IN_MEMCHR
:
6984 target
= expand_builtin_memchr (exp
, target
);
6989 case BUILT_IN_MEMCPY
:
6990 target
= expand_builtin_memcpy (exp
, target
);
6995 case BUILT_IN_MEMMOVE
:
6996 target
= expand_builtin_memmove (exp
, target
);
7001 case BUILT_IN_MEMPCPY
:
7002 target
= expand_builtin_mempcpy (exp
, target
);
7007 case BUILT_IN_MEMSET
:
7008 target
= expand_builtin_memset (exp
, target
, mode
);
7013 case BUILT_IN_BZERO
:
7014 target
= expand_builtin_bzero (exp
);
7019 /* Expand it as BUILT_IN_MEMCMP_EQ first. If not successful, change it
7020 back to a BUILT_IN_STRCMP. Remember to delete the 3rd paramater
7021 when changing it to a strcmp call. */
7022 case BUILT_IN_STRCMP_EQ
:
7023 target
= expand_builtin_memcmp (exp
, target
, true);
7027 /* Change this call back to a BUILT_IN_STRCMP. */
7028 TREE_OPERAND (exp
, 1)
7029 = build_fold_addr_expr (builtin_decl_explicit (BUILT_IN_STRCMP
));
7031 /* Delete the last parameter. */
7033 vec
<tree
, va_gc
> *arg_vec
;
7034 vec_alloc (arg_vec
, 2);
7035 for (i
= 0; i
< 2; i
++)
7036 arg_vec
->quick_push (CALL_EXPR_ARG (exp
, i
));
7037 exp
= build_call_vec (TREE_TYPE (exp
), CALL_EXPR_FN (exp
), arg_vec
);
7040 case BUILT_IN_STRCMP
:
7041 target
= expand_builtin_strcmp (exp
, target
);
7046 /* Expand it as BUILT_IN_MEMCMP_EQ first. If not successful, change it
7047 back to a BUILT_IN_STRNCMP. */
7048 case BUILT_IN_STRNCMP_EQ
:
7049 target
= expand_builtin_memcmp (exp
, target
, true);
7053 /* Change it back to a BUILT_IN_STRNCMP. */
7054 TREE_OPERAND (exp
, 1)
7055 = build_fold_addr_expr (builtin_decl_explicit (BUILT_IN_STRNCMP
));
7058 case BUILT_IN_STRNCMP
:
7059 target
= expand_builtin_strncmp (exp
, target
, mode
);
7065 case BUILT_IN_MEMCMP
:
7066 case BUILT_IN_MEMCMP_EQ
:
7067 target
= expand_builtin_memcmp (exp
, target
, fcode
== BUILT_IN_MEMCMP_EQ
);
7070 if (fcode
== BUILT_IN_MEMCMP_EQ
)
7072 tree newdecl
= builtin_decl_explicit (BUILT_IN_MEMCMP
);
7073 TREE_OPERAND (exp
, 1) = build_fold_addr_expr (newdecl
);
7077 case BUILT_IN_SETJMP
:
7078 /* This should have been lowered to the builtins below. */
7081 case BUILT_IN_SETJMP_SETUP
:
7082 /* __builtin_setjmp_setup is passed a pointer to an array of five words
7083 and the receiver label. */
7084 if (validate_arglist (exp
, POINTER_TYPE
, POINTER_TYPE
, VOID_TYPE
))
7086 rtx buf_addr
= expand_expr (CALL_EXPR_ARG (exp
, 0), subtarget
,
7087 VOIDmode
, EXPAND_NORMAL
);
7088 tree label
= TREE_OPERAND (CALL_EXPR_ARG (exp
, 1), 0);
7089 rtx_insn
*label_r
= label_rtx (label
);
7091 /* This is copied from the handling of non-local gotos. */
7092 expand_builtin_setjmp_setup (buf_addr
, label_r
);
7093 nonlocal_goto_handler_labels
7094 = gen_rtx_INSN_LIST (VOIDmode
, label_r
,
7095 nonlocal_goto_handler_labels
);
7096 /* ??? Do not let expand_label treat us as such since we would
7097 not want to be both on the list of non-local labels and on
7098 the list of forced labels. */
7099 FORCED_LABEL (label
) = 0;
7104 case BUILT_IN_SETJMP_RECEIVER
:
7105 /* __builtin_setjmp_receiver is passed the receiver label. */
7106 if (validate_arglist (exp
, POINTER_TYPE
, VOID_TYPE
))
7108 tree label
= TREE_OPERAND (CALL_EXPR_ARG (exp
, 0), 0);
7109 rtx_insn
*label_r
= label_rtx (label
);
7111 expand_builtin_setjmp_receiver (label_r
);
7116 /* __builtin_longjmp is passed a pointer to an array of five words.
7117 It's similar to the C library longjmp function but works with
7118 __builtin_setjmp above. */
7119 case BUILT_IN_LONGJMP
:
7120 if (validate_arglist (exp
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
7122 rtx buf_addr
= expand_expr (CALL_EXPR_ARG (exp
, 0), subtarget
,
7123 VOIDmode
, EXPAND_NORMAL
);
7124 rtx value
= expand_normal (CALL_EXPR_ARG (exp
, 1));
7126 if (value
!= const1_rtx
)
7128 error ("%<__builtin_longjmp%> second argument must be 1");
7132 expand_builtin_longjmp (buf_addr
, value
);
7137 case BUILT_IN_NONLOCAL_GOTO
:
7138 target
= expand_builtin_nonlocal_goto (exp
);
7143 /* This updates the setjmp buffer that is its argument with the value
7144 of the current stack pointer. */
7145 case BUILT_IN_UPDATE_SETJMP_BUF
:
7146 if (validate_arglist (exp
, POINTER_TYPE
, VOID_TYPE
))
7149 = expand_normal (CALL_EXPR_ARG (exp
, 0));
7151 expand_builtin_update_setjmp_buf (buf_addr
);
7157 expand_builtin_trap ();
7160 case BUILT_IN_UNREACHABLE
:
7161 expand_builtin_unreachable ();
7164 CASE_FLT_FN (BUILT_IN_SIGNBIT
):
7165 case BUILT_IN_SIGNBITD32
:
7166 case BUILT_IN_SIGNBITD64
:
7167 case BUILT_IN_SIGNBITD128
:
7168 target
= expand_builtin_signbit (exp
, target
);
7173 /* Various hooks for the DWARF 2 __throw routine. */
7174 case BUILT_IN_UNWIND_INIT
:
7175 expand_builtin_unwind_init ();
7177 case BUILT_IN_DWARF_CFA
:
7178 return virtual_cfa_rtx
;
7179 #ifdef DWARF2_UNWIND_INFO
7180 case BUILT_IN_DWARF_SP_COLUMN
:
7181 return expand_builtin_dwarf_sp_column ();
7182 case BUILT_IN_INIT_DWARF_REG_SIZES
:
7183 expand_builtin_init_dwarf_reg_sizes (CALL_EXPR_ARG (exp
, 0));
7186 case BUILT_IN_FROB_RETURN_ADDR
:
7187 return expand_builtin_frob_return_addr (CALL_EXPR_ARG (exp
, 0));
7188 case BUILT_IN_EXTRACT_RETURN_ADDR
:
7189 return expand_builtin_extract_return_addr (CALL_EXPR_ARG (exp
, 0));
7190 case BUILT_IN_EH_RETURN
:
7191 expand_builtin_eh_return (CALL_EXPR_ARG (exp
, 0),
7192 CALL_EXPR_ARG (exp
, 1));
7194 case BUILT_IN_EH_RETURN_DATA_REGNO
:
7195 return expand_builtin_eh_return_data_regno (exp
);
7196 case BUILT_IN_EXTEND_POINTER
:
7197 return expand_builtin_extend_pointer (CALL_EXPR_ARG (exp
, 0));
7198 case BUILT_IN_EH_POINTER
:
7199 return expand_builtin_eh_pointer (exp
);
7200 case BUILT_IN_EH_FILTER
:
7201 return expand_builtin_eh_filter (exp
);
7202 case BUILT_IN_EH_COPY_VALUES
:
7203 return expand_builtin_eh_copy_values (exp
);
7205 case BUILT_IN_VA_START
:
7206 return expand_builtin_va_start (exp
);
7207 case BUILT_IN_VA_END
:
7208 return expand_builtin_va_end (exp
);
7209 case BUILT_IN_VA_COPY
:
7210 return expand_builtin_va_copy (exp
);
7211 case BUILT_IN_EXPECT
:
7212 return expand_builtin_expect (exp
, target
);
7213 case BUILT_IN_ASSUME_ALIGNED
:
7214 return expand_builtin_assume_aligned (exp
, target
);
7215 case BUILT_IN_PREFETCH
:
7216 expand_builtin_prefetch (exp
);
7219 case BUILT_IN_INIT_TRAMPOLINE
:
7220 return expand_builtin_init_trampoline (exp
, true);
7221 case BUILT_IN_INIT_HEAP_TRAMPOLINE
:
7222 return expand_builtin_init_trampoline (exp
, false);
7223 case BUILT_IN_ADJUST_TRAMPOLINE
:
7224 return expand_builtin_adjust_trampoline (exp
);
7226 case BUILT_IN_INIT_DESCRIPTOR
:
7227 return expand_builtin_init_descriptor (exp
);
7228 case BUILT_IN_ADJUST_DESCRIPTOR
:
7229 return expand_builtin_adjust_descriptor (exp
);
7232 case BUILT_IN_EXECL
:
7233 case BUILT_IN_EXECV
:
7234 case BUILT_IN_EXECLP
:
7235 case BUILT_IN_EXECLE
:
7236 case BUILT_IN_EXECVP
:
7237 case BUILT_IN_EXECVE
:
7238 target
= expand_builtin_fork_or_exec (fndecl
, exp
, target
, ignore
);
7243 case BUILT_IN_SYNC_FETCH_AND_ADD_1
:
7244 case BUILT_IN_SYNC_FETCH_AND_ADD_2
:
7245 case BUILT_IN_SYNC_FETCH_AND_ADD_4
:
7246 case BUILT_IN_SYNC_FETCH_AND_ADD_8
:
7247 case BUILT_IN_SYNC_FETCH_AND_ADD_16
:
7248 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_FETCH_AND_ADD_1
);
7249 target
= expand_builtin_sync_operation (mode
, exp
, PLUS
, false, target
);
7254 case BUILT_IN_SYNC_FETCH_AND_SUB_1
:
7255 case BUILT_IN_SYNC_FETCH_AND_SUB_2
:
7256 case BUILT_IN_SYNC_FETCH_AND_SUB_4
:
7257 case BUILT_IN_SYNC_FETCH_AND_SUB_8
:
7258 case BUILT_IN_SYNC_FETCH_AND_SUB_16
:
7259 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_FETCH_AND_SUB_1
);
7260 target
= expand_builtin_sync_operation (mode
, exp
, MINUS
, false, target
);
7265 case BUILT_IN_SYNC_FETCH_AND_OR_1
:
7266 case BUILT_IN_SYNC_FETCH_AND_OR_2
:
7267 case BUILT_IN_SYNC_FETCH_AND_OR_4
:
7268 case BUILT_IN_SYNC_FETCH_AND_OR_8
:
7269 case BUILT_IN_SYNC_FETCH_AND_OR_16
:
7270 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_FETCH_AND_OR_1
);
7271 target
= expand_builtin_sync_operation (mode
, exp
, IOR
, false, target
);
7276 case BUILT_IN_SYNC_FETCH_AND_AND_1
:
7277 case BUILT_IN_SYNC_FETCH_AND_AND_2
:
7278 case BUILT_IN_SYNC_FETCH_AND_AND_4
:
7279 case BUILT_IN_SYNC_FETCH_AND_AND_8
:
7280 case BUILT_IN_SYNC_FETCH_AND_AND_16
:
7281 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_FETCH_AND_AND_1
);
7282 target
= expand_builtin_sync_operation (mode
, exp
, AND
, false, target
);
7287 case BUILT_IN_SYNC_FETCH_AND_XOR_1
:
7288 case BUILT_IN_SYNC_FETCH_AND_XOR_2
:
7289 case BUILT_IN_SYNC_FETCH_AND_XOR_4
:
7290 case BUILT_IN_SYNC_FETCH_AND_XOR_8
:
7291 case BUILT_IN_SYNC_FETCH_AND_XOR_16
:
7292 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_FETCH_AND_XOR_1
);
7293 target
= expand_builtin_sync_operation (mode
, exp
, XOR
, false, target
);
7298 case BUILT_IN_SYNC_FETCH_AND_NAND_1
:
7299 case BUILT_IN_SYNC_FETCH_AND_NAND_2
:
7300 case BUILT_IN_SYNC_FETCH_AND_NAND_4
:
7301 case BUILT_IN_SYNC_FETCH_AND_NAND_8
:
7302 case BUILT_IN_SYNC_FETCH_AND_NAND_16
:
7303 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_FETCH_AND_NAND_1
);
7304 target
= expand_builtin_sync_operation (mode
, exp
, NOT
, false, target
);
7309 case BUILT_IN_SYNC_ADD_AND_FETCH_1
:
7310 case BUILT_IN_SYNC_ADD_AND_FETCH_2
:
7311 case BUILT_IN_SYNC_ADD_AND_FETCH_4
:
7312 case BUILT_IN_SYNC_ADD_AND_FETCH_8
:
7313 case BUILT_IN_SYNC_ADD_AND_FETCH_16
:
7314 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_ADD_AND_FETCH_1
);
7315 target
= expand_builtin_sync_operation (mode
, exp
, PLUS
, true, target
);
7320 case BUILT_IN_SYNC_SUB_AND_FETCH_1
:
7321 case BUILT_IN_SYNC_SUB_AND_FETCH_2
:
7322 case BUILT_IN_SYNC_SUB_AND_FETCH_4
:
7323 case BUILT_IN_SYNC_SUB_AND_FETCH_8
:
7324 case BUILT_IN_SYNC_SUB_AND_FETCH_16
:
7325 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_SUB_AND_FETCH_1
);
7326 target
= expand_builtin_sync_operation (mode
, exp
, MINUS
, true, target
);
7331 case BUILT_IN_SYNC_OR_AND_FETCH_1
:
7332 case BUILT_IN_SYNC_OR_AND_FETCH_2
:
7333 case BUILT_IN_SYNC_OR_AND_FETCH_4
:
7334 case BUILT_IN_SYNC_OR_AND_FETCH_8
:
7335 case BUILT_IN_SYNC_OR_AND_FETCH_16
:
7336 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_OR_AND_FETCH_1
);
7337 target
= expand_builtin_sync_operation (mode
, exp
, IOR
, true, target
);
7342 case BUILT_IN_SYNC_AND_AND_FETCH_1
:
7343 case BUILT_IN_SYNC_AND_AND_FETCH_2
:
7344 case BUILT_IN_SYNC_AND_AND_FETCH_4
:
7345 case BUILT_IN_SYNC_AND_AND_FETCH_8
:
7346 case BUILT_IN_SYNC_AND_AND_FETCH_16
:
7347 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_AND_AND_FETCH_1
);
7348 target
= expand_builtin_sync_operation (mode
, exp
, AND
, true, target
);
7353 case BUILT_IN_SYNC_XOR_AND_FETCH_1
:
7354 case BUILT_IN_SYNC_XOR_AND_FETCH_2
:
7355 case BUILT_IN_SYNC_XOR_AND_FETCH_4
:
7356 case BUILT_IN_SYNC_XOR_AND_FETCH_8
:
7357 case BUILT_IN_SYNC_XOR_AND_FETCH_16
:
7358 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_XOR_AND_FETCH_1
);
7359 target
= expand_builtin_sync_operation (mode
, exp
, XOR
, true, target
);
7364 case BUILT_IN_SYNC_NAND_AND_FETCH_1
:
7365 case BUILT_IN_SYNC_NAND_AND_FETCH_2
:
7366 case BUILT_IN_SYNC_NAND_AND_FETCH_4
:
7367 case BUILT_IN_SYNC_NAND_AND_FETCH_8
:
7368 case BUILT_IN_SYNC_NAND_AND_FETCH_16
:
7369 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_NAND_AND_FETCH_1
);
7370 target
= expand_builtin_sync_operation (mode
, exp
, NOT
, true, target
);
7375 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1
:
7376 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_2
:
7377 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_4
:
7378 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_8
:
7379 case BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_16
:
7380 if (mode
== VOIDmode
)
7381 mode
= TYPE_MODE (boolean_type_node
);
7382 if (!target
|| !register_operand (target
, mode
))
7383 target
= gen_reg_rtx (mode
);
7385 mode
= get_builtin_sync_mode
7386 (fcode
- BUILT_IN_SYNC_BOOL_COMPARE_AND_SWAP_1
);
7387 target
= expand_builtin_compare_and_swap (mode
, exp
, true, target
);
7392 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_1
:
7393 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_2
:
7394 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_4
:
7395 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_8
:
7396 case BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_16
:
7397 mode
= get_builtin_sync_mode
7398 (fcode
- BUILT_IN_SYNC_VAL_COMPARE_AND_SWAP_1
);
7399 target
= expand_builtin_compare_and_swap (mode
, exp
, false, target
);
7404 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_1
:
7405 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_2
:
7406 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_4
:
7407 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_8
:
7408 case BUILT_IN_SYNC_LOCK_TEST_AND_SET_16
:
7409 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_LOCK_TEST_AND_SET_1
);
7410 target
= expand_builtin_sync_lock_test_and_set (mode
, exp
, target
);
7415 case BUILT_IN_SYNC_LOCK_RELEASE_1
:
7416 case BUILT_IN_SYNC_LOCK_RELEASE_2
:
7417 case BUILT_IN_SYNC_LOCK_RELEASE_4
:
7418 case BUILT_IN_SYNC_LOCK_RELEASE_8
:
7419 case BUILT_IN_SYNC_LOCK_RELEASE_16
:
7420 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_SYNC_LOCK_RELEASE_1
);
7421 expand_builtin_sync_lock_release (mode
, exp
);
7424 case BUILT_IN_SYNC_SYNCHRONIZE
:
7425 expand_builtin_sync_synchronize ();
7428 case BUILT_IN_ATOMIC_EXCHANGE_1
:
7429 case BUILT_IN_ATOMIC_EXCHANGE_2
:
7430 case BUILT_IN_ATOMIC_EXCHANGE_4
:
7431 case BUILT_IN_ATOMIC_EXCHANGE_8
:
7432 case BUILT_IN_ATOMIC_EXCHANGE_16
:
7433 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_EXCHANGE_1
);
7434 target
= expand_builtin_atomic_exchange (mode
, exp
, target
);
7439 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1
:
7440 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_2
:
7441 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_4
:
7442 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_8
:
7443 case BUILT_IN_ATOMIC_COMPARE_EXCHANGE_16
:
7445 unsigned int nargs
, z
;
7446 vec
<tree
, va_gc
> *vec
;
7449 get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_COMPARE_EXCHANGE_1
);
7450 target
= expand_builtin_atomic_compare_exchange (mode
, exp
, target
);
7454 /* If this is turned into an external library call, the weak parameter
7455 must be dropped to match the expected parameter list. */
7456 nargs
= call_expr_nargs (exp
);
7457 vec_alloc (vec
, nargs
- 1);
7458 for (z
= 0; z
< 3; z
++)
7459 vec
->quick_push (CALL_EXPR_ARG (exp
, z
));
7460 /* Skip the boolean weak parameter. */
7461 for (z
= 4; z
< 6; z
++)
7462 vec
->quick_push (CALL_EXPR_ARG (exp
, z
));
7463 exp
= build_call_vec (TREE_TYPE (exp
), CALL_EXPR_FN (exp
), vec
);
7467 case BUILT_IN_ATOMIC_LOAD_1
:
7468 case BUILT_IN_ATOMIC_LOAD_2
:
7469 case BUILT_IN_ATOMIC_LOAD_4
:
7470 case BUILT_IN_ATOMIC_LOAD_8
:
7471 case BUILT_IN_ATOMIC_LOAD_16
:
7472 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_LOAD_1
);
7473 target
= expand_builtin_atomic_load (mode
, exp
, target
);
7478 case BUILT_IN_ATOMIC_STORE_1
:
7479 case BUILT_IN_ATOMIC_STORE_2
:
7480 case BUILT_IN_ATOMIC_STORE_4
:
7481 case BUILT_IN_ATOMIC_STORE_8
:
7482 case BUILT_IN_ATOMIC_STORE_16
:
7483 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_STORE_1
);
7484 target
= expand_builtin_atomic_store (mode
, exp
);
7489 case BUILT_IN_ATOMIC_ADD_FETCH_1
:
7490 case BUILT_IN_ATOMIC_ADD_FETCH_2
:
7491 case BUILT_IN_ATOMIC_ADD_FETCH_4
:
7492 case BUILT_IN_ATOMIC_ADD_FETCH_8
:
7493 case BUILT_IN_ATOMIC_ADD_FETCH_16
:
7495 enum built_in_function lib
;
7496 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_ADD_FETCH_1
);
7497 lib
= (enum built_in_function
)((int)BUILT_IN_ATOMIC_FETCH_ADD_1
+
7498 (fcode
- BUILT_IN_ATOMIC_ADD_FETCH_1
));
7499 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, PLUS
, true,
7505 case BUILT_IN_ATOMIC_SUB_FETCH_1
:
7506 case BUILT_IN_ATOMIC_SUB_FETCH_2
:
7507 case BUILT_IN_ATOMIC_SUB_FETCH_4
:
7508 case BUILT_IN_ATOMIC_SUB_FETCH_8
:
7509 case BUILT_IN_ATOMIC_SUB_FETCH_16
:
7511 enum built_in_function lib
;
7512 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_SUB_FETCH_1
);
7513 lib
= (enum built_in_function
)((int)BUILT_IN_ATOMIC_FETCH_SUB_1
+
7514 (fcode
- BUILT_IN_ATOMIC_SUB_FETCH_1
));
7515 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, MINUS
, true,
7521 case BUILT_IN_ATOMIC_AND_FETCH_1
:
7522 case BUILT_IN_ATOMIC_AND_FETCH_2
:
7523 case BUILT_IN_ATOMIC_AND_FETCH_4
:
7524 case BUILT_IN_ATOMIC_AND_FETCH_8
:
7525 case BUILT_IN_ATOMIC_AND_FETCH_16
:
7527 enum built_in_function lib
;
7528 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_AND_FETCH_1
);
7529 lib
= (enum built_in_function
)((int)BUILT_IN_ATOMIC_FETCH_AND_1
+
7530 (fcode
- BUILT_IN_ATOMIC_AND_FETCH_1
));
7531 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, AND
, true,
7537 case BUILT_IN_ATOMIC_NAND_FETCH_1
:
7538 case BUILT_IN_ATOMIC_NAND_FETCH_2
:
7539 case BUILT_IN_ATOMIC_NAND_FETCH_4
:
7540 case BUILT_IN_ATOMIC_NAND_FETCH_8
:
7541 case BUILT_IN_ATOMIC_NAND_FETCH_16
:
7543 enum built_in_function lib
;
7544 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_NAND_FETCH_1
);
7545 lib
= (enum built_in_function
)((int)BUILT_IN_ATOMIC_FETCH_NAND_1
+
7546 (fcode
- BUILT_IN_ATOMIC_NAND_FETCH_1
));
7547 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, NOT
, true,
7553 case BUILT_IN_ATOMIC_XOR_FETCH_1
:
7554 case BUILT_IN_ATOMIC_XOR_FETCH_2
:
7555 case BUILT_IN_ATOMIC_XOR_FETCH_4
:
7556 case BUILT_IN_ATOMIC_XOR_FETCH_8
:
7557 case BUILT_IN_ATOMIC_XOR_FETCH_16
:
7559 enum built_in_function lib
;
7560 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_XOR_FETCH_1
);
7561 lib
= (enum built_in_function
)((int)BUILT_IN_ATOMIC_FETCH_XOR_1
+
7562 (fcode
- BUILT_IN_ATOMIC_XOR_FETCH_1
));
7563 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, XOR
, true,
7569 case BUILT_IN_ATOMIC_OR_FETCH_1
:
7570 case BUILT_IN_ATOMIC_OR_FETCH_2
:
7571 case BUILT_IN_ATOMIC_OR_FETCH_4
:
7572 case BUILT_IN_ATOMIC_OR_FETCH_8
:
7573 case BUILT_IN_ATOMIC_OR_FETCH_16
:
7575 enum built_in_function lib
;
7576 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_OR_FETCH_1
);
7577 lib
= (enum built_in_function
)((int)BUILT_IN_ATOMIC_FETCH_OR_1
+
7578 (fcode
- BUILT_IN_ATOMIC_OR_FETCH_1
));
7579 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, IOR
, true,
7585 case BUILT_IN_ATOMIC_FETCH_ADD_1
:
7586 case BUILT_IN_ATOMIC_FETCH_ADD_2
:
7587 case BUILT_IN_ATOMIC_FETCH_ADD_4
:
7588 case BUILT_IN_ATOMIC_FETCH_ADD_8
:
7589 case BUILT_IN_ATOMIC_FETCH_ADD_16
:
7590 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_FETCH_ADD_1
);
7591 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, PLUS
, false,
7592 ignore
, BUILT_IN_NONE
);
7597 case BUILT_IN_ATOMIC_FETCH_SUB_1
:
7598 case BUILT_IN_ATOMIC_FETCH_SUB_2
:
7599 case BUILT_IN_ATOMIC_FETCH_SUB_4
:
7600 case BUILT_IN_ATOMIC_FETCH_SUB_8
:
7601 case BUILT_IN_ATOMIC_FETCH_SUB_16
:
7602 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_FETCH_SUB_1
);
7603 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, MINUS
, false,
7604 ignore
, BUILT_IN_NONE
);
7609 case BUILT_IN_ATOMIC_FETCH_AND_1
:
7610 case BUILT_IN_ATOMIC_FETCH_AND_2
:
7611 case BUILT_IN_ATOMIC_FETCH_AND_4
:
7612 case BUILT_IN_ATOMIC_FETCH_AND_8
:
7613 case BUILT_IN_ATOMIC_FETCH_AND_16
:
7614 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_FETCH_AND_1
);
7615 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, AND
, false,
7616 ignore
, BUILT_IN_NONE
);
7621 case BUILT_IN_ATOMIC_FETCH_NAND_1
:
7622 case BUILT_IN_ATOMIC_FETCH_NAND_2
:
7623 case BUILT_IN_ATOMIC_FETCH_NAND_4
:
7624 case BUILT_IN_ATOMIC_FETCH_NAND_8
:
7625 case BUILT_IN_ATOMIC_FETCH_NAND_16
:
7626 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_FETCH_NAND_1
);
7627 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, NOT
, false,
7628 ignore
, BUILT_IN_NONE
);
7633 case BUILT_IN_ATOMIC_FETCH_XOR_1
:
7634 case BUILT_IN_ATOMIC_FETCH_XOR_2
:
7635 case BUILT_IN_ATOMIC_FETCH_XOR_4
:
7636 case BUILT_IN_ATOMIC_FETCH_XOR_8
:
7637 case BUILT_IN_ATOMIC_FETCH_XOR_16
:
7638 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_FETCH_XOR_1
);
7639 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, XOR
, false,
7640 ignore
, BUILT_IN_NONE
);
7645 case BUILT_IN_ATOMIC_FETCH_OR_1
:
7646 case BUILT_IN_ATOMIC_FETCH_OR_2
:
7647 case BUILT_IN_ATOMIC_FETCH_OR_4
:
7648 case BUILT_IN_ATOMIC_FETCH_OR_8
:
7649 case BUILT_IN_ATOMIC_FETCH_OR_16
:
7650 mode
= get_builtin_sync_mode (fcode
- BUILT_IN_ATOMIC_FETCH_OR_1
);
7651 target
= expand_builtin_atomic_fetch_op (mode
, exp
, target
, IOR
, false,
7652 ignore
, BUILT_IN_NONE
);
7657 case BUILT_IN_ATOMIC_TEST_AND_SET
:
7658 return expand_builtin_atomic_test_and_set (exp
, target
);
7660 case BUILT_IN_ATOMIC_CLEAR
:
7661 return expand_builtin_atomic_clear (exp
);
7663 case BUILT_IN_ATOMIC_ALWAYS_LOCK_FREE
:
7664 return expand_builtin_atomic_always_lock_free (exp
);
7666 case BUILT_IN_ATOMIC_IS_LOCK_FREE
:
7667 target
= expand_builtin_atomic_is_lock_free (exp
);
7672 case BUILT_IN_ATOMIC_THREAD_FENCE
:
7673 expand_builtin_atomic_thread_fence (exp
);
7676 case BUILT_IN_ATOMIC_SIGNAL_FENCE
:
7677 expand_builtin_atomic_signal_fence (exp
);
7680 case BUILT_IN_OBJECT_SIZE
:
7681 return expand_builtin_object_size (exp
);
7683 case BUILT_IN_MEMCPY_CHK
:
7684 case BUILT_IN_MEMPCPY_CHK
:
7685 case BUILT_IN_MEMMOVE_CHK
:
7686 case BUILT_IN_MEMSET_CHK
:
7687 target
= expand_builtin_memory_chk (exp
, target
, mode
, fcode
);
7692 case BUILT_IN_STRCPY_CHK
:
7693 case BUILT_IN_STPCPY_CHK
:
7694 case BUILT_IN_STRNCPY_CHK
:
7695 case BUILT_IN_STPNCPY_CHK
:
7696 case BUILT_IN_STRCAT_CHK
:
7697 case BUILT_IN_STRNCAT_CHK
:
7698 case BUILT_IN_SNPRINTF_CHK
:
7699 case BUILT_IN_VSNPRINTF_CHK
:
7700 maybe_emit_chk_warning (exp
, fcode
);
7703 case BUILT_IN_SPRINTF_CHK
:
7704 case BUILT_IN_VSPRINTF_CHK
:
7705 maybe_emit_sprintf_chk_warning (exp
, fcode
);
7709 if (warn_free_nonheap_object
)
7710 maybe_emit_free_warning (exp
);
7713 case BUILT_IN_THREAD_POINTER
:
7714 return expand_builtin_thread_pointer (exp
, target
);
7716 case BUILT_IN_SET_THREAD_POINTER
:
7717 expand_builtin_set_thread_pointer (exp
);
7720 case BUILT_IN_ACC_ON_DEVICE
:
7721 /* Do library call, if we failed to expand the builtin when
7725 case BUILT_IN_GOACC_PARLEVEL_ID
:
7726 case BUILT_IN_GOACC_PARLEVEL_SIZE
:
7727 return expand_builtin_goacc_parlevel_id_size (exp
, target
, ignore
);
7729 default: /* just do library call, if unknown builtin */
7733 /* The switch statement above can drop through to cause the function
7734 to be called normally. */
7735 return expand_call (exp
, target
, ignore
);
7738 /* Determine whether a tree node represents a call to a built-in
7739 function. If the tree T is a call to a built-in function with
7740 the right number of arguments of the appropriate types, return
7741 the DECL_FUNCTION_CODE of the call, e.g. BUILT_IN_SQRT.
7742 Otherwise the return value is END_BUILTINS. */
7744 enum built_in_function
7745 builtin_mathfn_code (const_tree t
)
7747 const_tree fndecl
, arg
, parmlist
;
7748 const_tree argtype
, parmtype
;
7749 const_call_expr_arg_iterator iter
;
7751 if (TREE_CODE (t
) != CALL_EXPR
)
7752 return END_BUILTINS
;
7754 fndecl
= get_callee_fndecl (t
);
7755 if (fndecl
== NULL_TREE
7756 || TREE_CODE (fndecl
) != FUNCTION_DECL
7757 || ! DECL_BUILT_IN (fndecl
)
7758 || DECL_BUILT_IN_CLASS (fndecl
) == BUILT_IN_MD
)
7759 return END_BUILTINS
;
7761 parmlist
= TYPE_ARG_TYPES (TREE_TYPE (fndecl
));
7762 init_const_call_expr_arg_iterator (t
, &iter
);
7763 for (; parmlist
; parmlist
= TREE_CHAIN (parmlist
))
7765 /* If a function doesn't take a variable number of arguments,
7766 the last element in the list will have type `void'. */
7767 parmtype
= TREE_VALUE (parmlist
);
7768 if (VOID_TYPE_P (parmtype
))
7770 if (more_const_call_expr_args_p (&iter
))
7771 return END_BUILTINS
;
7772 return DECL_FUNCTION_CODE (fndecl
);
7775 if (! more_const_call_expr_args_p (&iter
))
7776 return END_BUILTINS
;
7778 arg
= next_const_call_expr_arg (&iter
);
7779 argtype
= TREE_TYPE (arg
);
7781 if (SCALAR_FLOAT_TYPE_P (parmtype
))
7783 if (! SCALAR_FLOAT_TYPE_P (argtype
))
7784 return END_BUILTINS
;
7786 else if (COMPLEX_FLOAT_TYPE_P (parmtype
))
7788 if (! COMPLEX_FLOAT_TYPE_P (argtype
))
7789 return END_BUILTINS
;
7791 else if (POINTER_TYPE_P (parmtype
))
7793 if (! POINTER_TYPE_P (argtype
))
7794 return END_BUILTINS
;
7796 else if (INTEGRAL_TYPE_P (parmtype
))
7798 if (! INTEGRAL_TYPE_P (argtype
))
7799 return END_BUILTINS
;
7802 return END_BUILTINS
;
7805 /* Variable-length argument list. */
7806 return DECL_FUNCTION_CODE (fndecl
);
7809 /* Fold a call to __builtin_constant_p, if we know its argument ARG will
7810 evaluate to a constant. */
7813 fold_builtin_constant_p (tree arg
)
7815 /* We return 1 for a numeric type that's known to be a constant
7816 value at compile-time or for an aggregate type that's a
7817 literal constant. */
7820 /* If we know this is a constant, emit the constant of one. */
7821 if (CONSTANT_CLASS_P (arg
)
7822 || (TREE_CODE (arg
) == CONSTRUCTOR
7823 && TREE_CONSTANT (arg
)))
7824 return integer_one_node
;
7825 if (TREE_CODE (arg
) == ADDR_EXPR
)
7827 tree op
= TREE_OPERAND (arg
, 0);
7828 if (TREE_CODE (op
) == STRING_CST
7829 || (TREE_CODE (op
) == ARRAY_REF
7830 && integer_zerop (TREE_OPERAND (op
, 1))
7831 && TREE_CODE (TREE_OPERAND (op
, 0)) == STRING_CST
))
7832 return integer_one_node
;
7835 /* If this expression has side effects, show we don't know it to be a
7836 constant. Likewise if it's a pointer or aggregate type since in
7837 those case we only want literals, since those are only optimized
7838 when generating RTL, not later.
7839 And finally, if we are compiling an initializer, not code, we
7840 need to return a definite result now; there's not going to be any
7841 more optimization done. */
7842 if (TREE_SIDE_EFFECTS (arg
)
7843 || AGGREGATE_TYPE_P (TREE_TYPE (arg
))
7844 || POINTER_TYPE_P (TREE_TYPE (arg
))
7846 || folding_initializer
7847 || force_folding_builtin_constant_p
)
7848 return integer_zero_node
;
7853 /* Create builtin_expect with PRED and EXPECTED as its arguments and
7854 return it as a truthvalue. */
7857 build_builtin_expect_predicate (location_t loc
, tree pred
, tree expected
,
7860 tree fn
, arg_types
, pred_type
, expected_type
, call_expr
, ret_type
;
7862 fn
= builtin_decl_explicit (BUILT_IN_EXPECT
);
7863 arg_types
= TYPE_ARG_TYPES (TREE_TYPE (fn
));
7864 ret_type
= TREE_TYPE (TREE_TYPE (fn
));
7865 pred_type
= TREE_VALUE (arg_types
);
7866 expected_type
= TREE_VALUE (TREE_CHAIN (arg_types
));
7868 pred
= fold_convert_loc (loc
, pred_type
, pred
);
7869 expected
= fold_convert_loc (loc
, expected_type
, expected
);
7870 call_expr
= build_call_expr_loc (loc
, fn
, predictor
? 3 : 2, pred
, expected
,
7873 return build2 (NE_EXPR
, TREE_TYPE (pred
), call_expr
,
7874 build_int_cst (ret_type
, 0));
7877 /* Fold a call to builtin_expect with arguments ARG0 and ARG1. Return
7878 NULL_TREE if no simplification is possible. */
7881 fold_builtin_expect (location_t loc
, tree arg0
, tree arg1
, tree arg2
)
7883 tree inner
, fndecl
, inner_arg0
;
7884 enum tree_code code
;
7886 /* Distribute the expected value over short-circuiting operators.
7887 See through the cast from truthvalue_type_node to long. */
7889 while (CONVERT_EXPR_P (inner_arg0
)
7890 && INTEGRAL_TYPE_P (TREE_TYPE (inner_arg0
))
7891 && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (inner_arg0
, 0))))
7892 inner_arg0
= TREE_OPERAND (inner_arg0
, 0);
7894 /* If this is a builtin_expect within a builtin_expect keep the
7895 inner one. See through a comparison against a constant. It
7896 might have been added to create a thruthvalue. */
7899 if (COMPARISON_CLASS_P (inner
)
7900 && TREE_CODE (TREE_OPERAND (inner
, 1)) == INTEGER_CST
)
7901 inner
= TREE_OPERAND (inner
, 0);
7903 if (TREE_CODE (inner
) == CALL_EXPR
7904 && (fndecl
= get_callee_fndecl (inner
))
7905 && DECL_BUILT_IN_CLASS (fndecl
) == BUILT_IN_NORMAL
7906 && DECL_FUNCTION_CODE (fndecl
) == BUILT_IN_EXPECT
)
7910 code
= TREE_CODE (inner
);
7911 if (code
== TRUTH_ANDIF_EXPR
|| code
== TRUTH_ORIF_EXPR
)
7913 tree op0
= TREE_OPERAND (inner
, 0);
7914 tree op1
= TREE_OPERAND (inner
, 1);
7915 arg1
= save_expr (arg1
);
7917 op0
= build_builtin_expect_predicate (loc
, op0
, arg1
, arg2
);
7918 op1
= build_builtin_expect_predicate (loc
, op1
, arg1
, arg2
);
7919 inner
= build2 (code
, TREE_TYPE (inner
), op0
, op1
);
7921 return fold_convert_loc (loc
, TREE_TYPE (arg0
), inner
);
7924 /* If the argument isn't invariant then there's nothing else we can do. */
7925 if (!TREE_CONSTANT (inner_arg0
))
7928 /* If we expect that a comparison against the argument will fold to
7929 a constant return the constant. In practice, this means a true
7930 constant or the address of a non-weak symbol. */
7933 if (TREE_CODE (inner
) == ADDR_EXPR
)
7937 inner
= TREE_OPERAND (inner
, 0);
7939 while (TREE_CODE (inner
) == COMPONENT_REF
7940 || TREE_CODE (inner
) == ARRAY_REF
);
7941 if (VAR_OR_FUNCTION_DECL_P (inner
) && DECL_WEAK (inner
))
7945 /* Otherwise, ARG0 already has the proper type for the return value. */
7949 /* Fold a call to __builtin_classify_type with argument ARG. */
7952 fold_builtin_classify_type (tree arg
)
7955 return build_int_cst (integer_type_node
, no_type_class
);
7957 return build_int_cst (integer_type_node
, type_to_class (TREE_TYPE (arg
)));
7960 /* Fold a call to __builtin_strlen with argument ARG. */
7963 fold_builtin_strlen (location_t loc
, tree type
, tree arg
)
7965 if (!validate_arg (arg
, POINTER_TYPE
))
7969 tree len
= c_strlen (arg
, 0);
7972 return fold_convert_loc (loc
, type
, len
);
7978 /* Fold a call to __builtin_inf or __builtin_huge_val. */
7981 fold_builtin_inf (location_t loc
, tree type
, int warn
)
7983 REAL_VALUE_TYPE real
;
7985 /* __builtin_inff is intended to be usable to define INFINITY on all
7986 targets. If an infinity is not available, INFINITY expands "to a
7987 positive constant of type float that overflows at translation
7988 time", footnote "In this case, using INFINITY will violate the
7989 constraint in 6.4.4 and thus require a diagnostic." (C99 7.12#4).
7990 Thus we pedwarn to ensure this constraint violation is
7992 if (!MODE_HAS_INFINITIES (TYPE_MODE (type
)) && warn
)
7993 pedwarn (loc
, 0, "target format does not support infinity");
7996 return build_real (type
, real
);
7999 /* Fold function call to builtin sincos, sincosf, or sincosl. Return
8000 NULL_TREE if no simplification can be made. */
8003 fold_builtin_sincos (location_t loc
,
8004 tree arg0
, tree arg1
, tree arg2
)
8007 tree fndecl
, call
= NULL_TREE
;
8009 if (!validate_arg (arg0
, REAL_TYPE
)
8010 || !validate_arg (arg1
, POINTER_TYPE
)
8011 || !validate_arg (arg2
, POINTER_TYPE
))
8014 type
= TREE_TYPE (arg0
);
8016 /* Calculate the result when the argument is a constant. */
8017 built_in_function fn
= mathfn_built_in_2 (type
, CFN_BUILT_IN_CEXPI
);
8018 if (fn
== END_BUILTINS
)
8021 /* Canonicalize sincos to cexpi. */
8022 if (TREE_CODE (arg0
) == REAL_CST
)
8024 tree complex_type
= build_complex_type (type
);
8025 call
= fold_const_call (as_combined_fn (fn
), complex_type
, arg0
);
8029 if (!targetm
.libc_has_function (function_c99_math_complex
)
8030 || !builtin_decl_implicit_p (fn
))
8032 fndecl
= builtin_decl_explicit (fn
);
8033 call
= build_call_expr_loc (loc
, fndecl
, 1, arg0
);
8034 call
= builtin_save_expr (call
);
8037 tree ptype
= build_pointer_type (type
);
8038 arg1
= fold_convert (ptype
, arg1
);
8039 arg2
= fold_convert (ptype
, arg2
);
8040 return build2 (COMPOUND_EXPR
, void_type_node
,
8041 build2 (MODIFY_EXPR
, void_type_node
,
8042 build_fold_indirect_ref_loc (loc
, arg1
),
8043 fold_build1_loc (loc
, IMAGPART_EXPR
, type
, call
)),
8044 build2 (MODIFY_EXPR
, void_type_node
,
8045 build_fold_indirect_ref_loc (loc
, arg2
),
8046 fold_build1_loc (loc
, REALPART_EXPR
, type
, call
)));
8049 /* Fold function call to builtin memcmp with arguments ARG1 and ARG2.
8050 Return NULL_TREE if no simplification can be made. */
8053 fold_builtin_memcmp (location_t loc
, tree arg1
, tree arg2
, tree len
)
8055 if (!validate_arg (arg1
, POINTER_TYPE
)
8056 || !validate_arg (arg2
, POINTER_TYPE
)
8057 || !validate_arg (len
, INTEGER_TYPE
))
8060 /* If the LEN parameter is zero, return zero. */
8061 if (integer_zerop (len
))
8062 return omit_two_operands_loc (loc
, integer_type_node
, integer_zero_node
,
8065 /* If ARG1 and ARG2 are the same (and not volatile), return zero. */
8066 if (operand_equal_p (arg1
, arg2
, 0))
8067 return omit_one_operand_loc (loc
, integer_type_node
, integer_zero_node
, len
);
8069 /* If len parameter is one, return an expression corresponding to
8070 (*(const unsigned char*)arg1 - (const unsigned char*)arg2). */
8071 if (tree_fits_uhwi_p (len
) && tree_to_uhwi (len
) == 1)
8073 tree cst_uchar_node
= build_type_variant (unsigned_char_type_node
, 1, 0);
8074 tree cst_uchar_ptr_node
8075 = build_pointer_type_for_mode (cst_uchar_node
, ptr_mode
, true);
8078 = fold_convert_loc (loc
, integer_type_node
,
8079 build1 (INDIRECT_REF
, cst_uchar_node
,
8080 fold_convert_loc (loc
,
8084 = fold_convert_loc (loc
, integer_type_node
,
8085 build1 (INDIRECT_REF
, cst_uchar_node
,
8086 fold_convert_loc (loc
,
8089 return fold_build2_loc (loc
, MINUS_EXPR
, integer_type_node
, ind1
, ind2
);
8095 /* Fold a call to builtin isascii with argument ARG. */
8098 fold_builtin_isascii (location_t loc
, tree arg
)
8100 if (!validate_arg (arg
, INTEGER_TYPE
))
8104 /* Transform isascii(c) -> ((c & ~0x7f) == 0). */
8105 arg
= fold_build2 (BIT_AND_EXPR
, integer_type_node
, arg
,
8106 build_int_cst (integer_type_node
,
8107 ~ (unsigned HOST_WIDE_INT
) 0x7f));
8108 return fold_build2_loc (loc
, EQ_EXPR
, integer_type_node
,
8109 arg
, integer_zero_node
);
8113 /* Fold a call to builtin toascii with argument ARG. */
8116 fold_builtin_toascii (location_t loc
, tree arg
)
8118 if (!validate_arg (arg
, INTEGER_TYPE
))
8121 /* Transform toascii(c) -> (c & 0x7f). */
8122 return fold_build2_loc (loc
, BIT_AND_EXPR
, integer_type_node
, arg
,
8123 build_int_cst (integer_type_node
, 0x7f));
8126 /* Fold a call to builtin isdigit with argument ARG. */
8129 fold_builtin_isdigit (location_t loc
, tree arg
)
8131 if (!validate_arg (arg
, INTEGER_TYPE
))
8135 /* Transform isdigit(c) -> (unsigned)(c) - '0' <= 9. */
8136 /* According to the C standard, isdigit is unaffected by locale.
8137 However, it definitely is affected by the target character set. */
8138 unsigned HOST_WIDE_INT target_digit0
8139 = lang_hooks
.to_target_charset ('0');
8141 if (target_digit0
== 0)
8144 arg
= fold_convert_loc (loc
, unsigned_type_node
, arg
);
8145 arg
= fold_build2 (MINUS_EXPR
, unsigned_type_node
, arg
,
8146 build_int_cst (unsigned_type_node
, target_digit0
));
8147 return fold_build2_loc (loc
, LE_EXPR
, integer_type_node
, arg
,
8148 build_int_cst (unsigned_type_node
, 9));
8152 /* Fold a call to fabs, fabsf or fabsl with argument ARG. */
8155 fold_builtin_fabs (location_t loc
, tree arg
, tree type
)
8157 if (!validate_arg (arg
, REAL_TYPE
))
8160 arg
= fold_convert_loc (loc
, type
, arg
);
8161 return fold_build1_loc (loc
, ABS_EXPR
, type
, arg
);
8164 /* Fold a call to abs, labs, llabs or imaxabs with argument ARG. */
8167 fold_builtin_abs (location_t loc
, tree arg
, tree type
)
8169 if (!validate_arg (arg
, INTEGER_TYPE
))
8172 arg
= fold_convert_loc (loc
, type
, arg
);
8173 return fold_build1_loc (loc
, ABS_EXPR
, type
, arg
);
8176 /* Fold a call to builtin carg(a+bi) -> atan2(b,a). */
8179 fold_builtin_carg (location_t loc
, tree arg
, tree type
)
8181 if (validate_arg (arg
, COMPLEX_TYPE
)
8182 && TREE_CODE (TREE_TYPE (TREE_TYPE (arg
))) == REAL_TYPE
)
8184 tree atan2_fn
= mathfn_built_in (type
, BUILT_IN_ATAN2
);
8188 tree new_arg
= builtin_save_expr (arg
);
8189 tree r_arg
= fold_build1_loc (loc
, REALPART_EXPR
, type
, new_arg
);
8190 tree i_arg
= fold_build1_loc (loc
, IMAGPART_EXPR
, type
, new_arg
);
8191 return build_call_expr_loc (loc
, atan2_fn
, 2, i_arg
, r_arg
);
8198 /* Fold a call to builtin frexp, we can assume the base is 2. */
8201 fold_builtin_frexp (location_t loc
, tree arg0
, tree arg1
, tree rettype
)
8203 if (! validate_arg (arg0
, REAL_TYPE
) || ! validate_arg (arg1
, POINTER_TYPE
))
8208 if (!(TREE_CODE (arg0
) == REAL_CST
&& ! TREE_OVERFLOW (arg0
)))
8211 arg1
= build_fold_indirect_ref_loc (loc
, arg1
);
8213 /* Proceed if a valid pointer type was passed in. */
8214 if (TYPE_MAIN_VARIANT (TREE_TYPE (arg1
)) == integer_type_node
)
8216 const REAL_VALUE_TYPE
*const value
= TREE_REAL_CST_PTR (arg0
);
8222 /* For +-0, return (*exp = 0, +-0). */
8223 exp
= integer_zero_node
;
8228 /* For +-NaN or +-Inf, *exp is unspecified, return arg0. */
8229 return omit_one_operand_loc (loc
, rettype
, arg0
, arg1
);
8232 /* Since the frexp function always expects base 2, and in
8233 GCC normalized significands are already in the range
8234 [0.5, 1.0), we have exactly what frexp wants. */
8235 REAL_VALUE_TYPE frac_rvt
= *value
;
8236 SET_REAL_EXP (&frac_rvt
, 0);
8237 frac
= build_real (rettype
, frac_rvt
);
8238 exp
= build_int_cst (integer_type_node
, REAL_EXP (value
));
8245 /* Create the COMPOUND_EXPR (*arg1 = trunc, frac). */
8246 arg1
= fold_build2_loc (loc
, MODIFY_EXPR
, rettype
, arg1
, exp
);
8247 TREE_SIDE_EFFECTS (arg1
) = 1;
8248 return fold_build2_loc (loc
, COMPOUND_EXPR
, rettype
, arg1
, frac
);
8254 /* Fold a call to builtin modf. */
8257 fold_builtin_modf (location_t loc
, tree arg0
, tree arg1
, tree rettype
)
8259 if (! validate_arg (arg0
, REAL_TYPE
) || ! validate_arg (arg1
, POINTER_TYPE
))
8264 if (!(TREE_CODE (arg0
) == REAL_CST
&& ! TREE_OVERFLOW (arg0
)))
8267 arg1
= build_fold_indirect_ref_loc (loc
, arg1
);
8269 /* Proceed if a valid pointer type was passed in. */
8270 if (TYPE_MAIN_VARIANT (TREE_TYPE (arg1
)) == TYPE_MAIN_VARIANT (rettype
))
8272 const REAL_VALUE_TYPE
*const value
= TREE_REAL_CST_PTR (arg0
);
8273 REAL_VALUE_TYPE trunc
, frac
;
8279 /* For +-NaN or +-0, return (*arg1 = arg0, arg0). */
8280 trunc
= frac
= *value
;
8283 /* For +-Inf, return (*arg1 = arg0, +-0). */
8285 frac
.sign
= value
->sign
;
8289 /* Return (*arg1 = trunc(arg0), arg0-trunc(arg0)). */
8290 real_trunc (&trunc
, VOIDmode
, value
);
8291 real_arithmetic (&frac
, MINUS_EXPR
, value
, &trunc
);
8292 /* If the original number was negative and already
8293 integral, then the fractional part is -0.0. */
8294 if (value
->sign
&& frac
.cl
== rvc_zero
)
8295 frac
.sign
= value
->sign
;
8299 /* Create the COMPOUND_EXPR (*arg1 = trunc, frac). */
8300 arg1
= fold_build2_loc (loc
, MODIFY_EXPR
, rettype
, arg1
,
8301 build_real (rettype
, trunc
));
8302 TREE_SIDE_EFFECTS (arg1
) = 1;
8303 return fold_build2_loc (loc
, COMPOUND_EXPR
, rettype
, arg1
,
8304 build_real (rettype
, frac
));
8310 /* Given a location LOC, an interclass builtin function decl FNDECL
8311 and its single argument ARG, return an folded expression computing
8312 the same, or NULL_TREE if we either couldn't or didn't want to fold
8313 (the latter happen if there's an RTL instruction available). */
8316 fold_builtin_interclass_mathfn (location_t loc
, tree fndecl
, tree arg
)
8320 if (!validate_arg (arg
, REAL_TYPE
))
8323 if (interclass_mathfn_icode (arg
, fndecl
) != CODE_FOR_nothing
)
8326 mode
= TYPE_MODE (TREE_TYPE (arg
));
8328 bool is_ibm_extended
= MODE_COMPOSITE_P (mode
);
8330 /* If there is no optab, try generic code. */
8331 switch (DECL_FUNCTION_CODE (fndecl
))
8335 CASE_FLT_FN (BUILT_IN_ISINF
):
8337 /* isinf(x) -> isgreater(fabs(x),DBL_MAX). */
8338 tree
const isgr_fn
= builtin_decl_explicit (BUILT_IN_ISGREATER
);
8339 tree type
= TREE_TYPE (arg
);
8343 if (is_ibm_extended
)
8345 /* NaN and Inf are encoded in the high-order double value
8346 only. The low-order value is not significant. */
8347 type
= double_type_node
;
8349 arg
= fold_build1_loc (loc
, NOP_EXPR
, type
, arg
);
8351 get_max_float (REAL_MODE_FORMAT (mode
), buf
, sizeof (buf
));
8352 real_from_string (&r
, buf
);
8353 result
= build_call_expr (isgr_fn
, 2,
8354 fold_build1_loc (loc
, ABS_EXPR
, type
, arg
),
8355 build_real (type
, r
));
8358 CASE_FLT_FN (BUILT_IN_FINITE
):
8359 case BUILT_IN_ISFINITE
:
8361 /* isfinite(x) -> islessequal(fabs(x),DBL_MAX). */
8362 tree
const isle_fn
= builtin_decl_explicit (BUILT_IN_ISLESSEQUAL
);
8363 tree type
= TREE_TYPE (arg
);
8367 if (is_ibm_extended
)
8369 /* NaN and Inf are encoded in the high-order double value
8370 only. The low-order value is not significant. */
8371 type
= double_type_node
;
8373 arg
= fold_build1_loc (loc
, NOP_EXPR
, type
, arg
);
8375 get_max_float (REAL_MODE_FORMAT (mode
), buf
, sizeof (buf
));
8376 real_from_string (&r
, buf
);
8377 result
= build_call_expr (isle_fn
, 2,
8378 fold_build1_loc (loc
, ABS_EXPR
, type
, arg
),
8379 build_real (type
, r
));
8380 /*result = fold_build2_loc (loc, UNGT_EXPR,
8381 TREE_TYPE (TREE_TYPE (fndecl)),
8382 fold_build1_loc (loc, ABS_EXPR, type, arg),
8383 build_real (type, r));
8384 result = fold_build1_loc (loc, TRUTH_NOT_EXPR,
8385 TREE_TYPE (TREE_TYPE (fndecl)),
8389 case BUILT_IN_ISNORMAL
:
8391 /* isnormal(x) -> isgreaterequal(fabs(x),DBL_MIN) &
8392 islessequal(fabs(x),DBL_MAX). */
8393 tree
const isle_fn
= builtin_decl_explicit (BUILT_IN_ISLESSEQUAL
);
8394 tree type
= TREE_TYPE (arg
);
8395 tree orig_arg
, max_exp
, min_exp
;
8396 machine_mode orig_mode
= mode
;
8397 REAL_VALUE_TYPE rmax
, rmin
;
8400 orig_arg
= arg
= builtin_save_expr (arg
);
8401 if (is_ibm_extended
)
8403 /* Use double to test the normal range of IBM extended
8404 precision. Emin for IBM extended precision is
8405 different to emin for IEEE double, being 53 higher
8406 since the low double exponent is at least 53 lower
8407 than the high double exponent. */
8408 type
= double_type_node
;
8410 arg
= fold_build1_loc (loc
, NOP_EXPR
, type
, arg
);
8412 arg
= fold_build1_loc (loc
, ABS_EXPR
, type
, arg
);
8414 get_max_float (REAL_MODE_FORMAT (mode
), buf
, sizeof (buf
));
8415 real_from_string (&rmax
, buf
);
8416 sprintf (buf
, "0x1p%d", REAL_MODE_FORMAT (orig_mode
)->emin
- 1);
8417 real_from_string (&rmin
, buf
);
8418 max_exp
= build_real (type
, rmax
);
8419 min_exp
= build_real (type
, rmin
);
8421 max_exp
= build_call_expr (isle_fn
, 2, arg
, max_exp
);
8422 if (is_ibm_extended
)
8424 /* Testing the high end of the range is done just using
8425 the high double, using the same test as isfinite().
8426 For the subnormal end of the range we first test the
8427 high double, then if its magnitude is equal to the
8428 limit of 0x1p-969, we test whether the low double is
8429 non-zero and opposite sign to the high double. */
8430 tree
const islt_fn
= builtin_decl_explicit (BUILT_IN_ISLESS
);
8431 tree
const isgt_fn
= builtin_decl_explicit (BUILT_IN_ISGREATER
);
8432 tree gt_min
= build_call_expr (isgt_fn
, 2, arg
, min_exp
);
8433 tree eq_min
= fold_build2 (EQ_EXPR
, integer_type_node
,
8435 tree as_complex
= build1 (VIEW_CONVERT_EXPR
,
8436 complex_double_type_node
, orig_arg
);
8437 tree hi_dbl
= build1 (REALPART_EXPR
, type
, as_complex
);
8438 tree lo_dbl
= build1 (IMAGPART_EXPR
, type
, as_complex
);
8439 tree zero
= build_real (type
, dconst0
);
8440 tree hilt
= build_call_expr (islt_fn
, 2, hi_dbl
, zero
);
8441 tree lolt
= build_call_expr (islt_fn
, 2, lo_dbl
, zero
);
8442 tree logt
= build_call_expr (isgt_fn
, 2, lo_dbl
, zero
);
8443 tree ok_lo
= fold_build1 (TRUTH_NOT_EXPR
, integer_type_node
,
8444 fold_build3 (COND_EXPR
,
8447 eq_min
= fold_build2 (TRUTH_ANDIF_EXPR
, integer_type_node
,
8449 min_exp
= fold_build2 (TRUTH_ORIF_EXPR
, integer_type_node
,
8455 = builtin_decl_explicit (BUILT_IN_ISGREATEREQUAL
);
8456 min_exp
= build_call_expr (isge_fn
, 2, arg
, min_exp
);
8458 result
= fold_build2 (BIT_AND_EXPR
, integer_type_node
,
8469 /* Fold a call to __builtin_isnan(), __builtin_isinf, __builtin_finite.
8470 ARG is the argument for the call. */
8473 fold_builtin_classify (location_t loc
, tree fndecl
, tree arg
, int builtin_index
)
8475 tree type
= TREE_TYPE (TREE_TYPE (fndecl
));
8477 if (!validate_arg (arg
, REAL_TYPE
))
8480 switch (builtin_index
)
8482 case BUILT_IN_ISINF
:
8483 if (!HONOR_INFINITIES (arg
))
8484 return omit_one_operand_loc (loc
, type
, integer_zero_node
, arg
);
8488 case BUILT_IN_ISINF_SIGN
:
8490 /* isinf_sign(x) -> isinf(x) ? (signbit(x) ? -1 : 1) : 0 */
8491 /* In a boolean context, GCC will fold the inner COND_EXPR to
8492 1. So e.g. "if (isinf_sign(x))" would be folded to just
8493 "if (isinf(x) ? 1 : 0)" which becomes "if (isinf(x))". */
8494 tree signbit_fn
= builtin_decl_explicit (BUILT_IN_SIGNBIT
);
8495 tree isinf_fn
= builtin_decl_explicit (BUILT_IN_ISINF
);
8496 tree tmp
= NULL_TREE
;
8498 arg
= builtin_save_expr (arg
);
8500 if (signbit_fn
&& isinf_fn
)
8502 tree signbit_call
= build_call_expr_loc (loc
, signbit_fn
, 1, arg
);
8503 tree isinf_call
= build_call_expr_loc (loc
, isinf_fn
, 1, arg
);
8505 signbit_call
= fold_build2_loc (loc
, NE_EXPR
, integer_type_node
,
8506 signbit_call
, integer_zero_node
);
8507 isinf_call
= fold_build2_loc (loc
, NE_EXPR
, integer_type_node
,
8508 isinf_call
, integer_zero_node
);
8510 tmp
= fold_build3_loc (loc
, COND_EXPR
, integer_type_node
, signbit_call
,
8511 integer_minus_one_node
, integer_one_node
);
8512 tmp
= fold_build3_loc (loc
, COND_EXPR
, integer_type_node
,
8520 case BUILT_IN_ISFINITE
:
8521 if (!HONOR_NANS (arg
)
8522 && !HONOR_INFINITIES (arg
))
8523 return omit_one_operand_loc (loc
, type
, integer_one_node
, arg
);
8527 case BUILT_IN_ISNAN
:
8528 if (!HONOR_NANS (arg
))
8529 return omit_one_operand_loc (loc
, type
, integer_zero_node
, arg
);
8532 bool is_ibm_extended
= MODE_COMPOSITE_P (TYPE_MODE (TREE_TYPE (arg
)));
8533 if (is_ibm_extended
)
8535 /* NaN and Inf are encoded in the high-order double value
8536 only. The low-order value is not significant. */
8537 arg
= fold_build1_loc (loc
, NOP_EXPR
, double_type_node
, arg
);
8540 arg
= builtin_save_expr (arg
);
8541 return fold_build2_loc (loc
, UNORDERED_EXPR
, type
, arg
, arg
);
8548 /* Fold a call to __builtin_fpclassify(int, int, int, int, int, ...).
8549 This builtin will generate code to return the appropriate floating
8550 point classification depending on the value of the floating point
8551 number passed in. The possible return values must be supplied as
8552 int arguments to the call in the following order: FP_NAN, FP_INFINITE,
8553 FP_NORMAL, FP_SUBNORMAL and FP_ZERO. The ellipses is for exactly
8554 one floating point argument which is "type generic". */
8557 fold_builtin_fpclassify (location_t loc
, tree
*args
, int nargs
)
8559 tree fp_nan
, fp_infinite
, fp_normal
, fp_subnormal
, fp_zero
,
8560 arg
, type
, res
, tmp
;
8565 /* Verify the required arguments in the original call. */
8567 || !validate_arg (args
[0], INTEGER_TYPE
)
8568 || !validate_arg (args
[1], INTEGER_TYPE
)
8569 || !validate_arg (args
[2], INTEGER_TYPE
)
8570 || !validate_arg (args
[3], INTEGER_TYPE
)
8571 || !validate_arg (args
[4], INTEGER_TYPE
)
8572 || !validate_arg (args
[5], REAL_TYPE
))
8576 fp_infinite
= args
[1];
8577 fp_normal
= args
[2];
8578 fp_subnormal
= args
[3];
8581 type
= TREE_TYPE (arg
);
8582 mode
= TYPE_MODE (type
);
8583 arg
= builtin_save_expr (fold_build1_loc (loc
, ABS_EXPR
, type
, arg
));
8587 (fabs(x) == Inf ? FP_INFINITE :
8588 (fabs(x) >= DBL_MIN ? FP_NORMAL :
8589 (x == 0 ? FP_ZERO : FP_SUBNORMAL))). */
8591 tmp
= fold_build2_loc (loc
, EQ_EXPR
, integer_type_node
, arg
,
8592 build_real (type
, dconst0
));
8593 res
= fold_build3_loc (loc
, COND_EXPR
, integer_type_node
,
8594 tmp
, fp_zero
, fp_subnormal
);
8596 sprintf (buf
, "0x1p%d", REAL_MODE_FORMAT (mode
)->emin
- 1);
8597 real_from_string (&r
, buf
);
8598 tmp
= fold_build2_loc (loc
, GE_EXPR
, integer_type_node
,
8599 arg
, build_real (type
, r
));
8600 res
= fold_build3_loc (loc
, COND_EXPR
, integer_type_node
, tmp
, fp_normal
, res
);
8602 if (HONOR_INFINITIES (mode
))
8605 tmp
= fold_build2_loc (loc
, EQ_EXPR
, integer_type_node
, arg
,
8606 build_real (type
, r
));
8607 res
= fold_build3_loc (loc
, COND_EXPR
, integer_type_node
, tmp
,
8611 if (HONOR_NANS (mode
))
8613 tmp
= fold_build2_loc (loc
, ORDERED_EXPR
, integer_type_node
, arg
, arg
);
8614 res
= fold_build3_loc (loc
, COND_EXPR
, integer_type_node
, tmp
, res
, fp_nan
);
8620 /* Fold a call to an unordered comparison function such as
8621 __builtin_isgreater(). FNDECL is the FUNCTION_DECL for the function
8622 being called and ARG0 and ARG1 are the arguments for the call.
8623 UNORDERED_CODE and ORDERED_CODE are comparison codes that give
8624 the opposite of the desired result. UNORDERED_CODE is used
8625 for modes that can hold NaNs and ORDERED_CODE is used for
8629 fold_builtin_unordered_cmp (location_t loc
, tree fndecl
, tree arg0
, tree arg1
,
8630 enum tree_code unordered_code
,
8631 enum tree_code ordered_code
)
8633 tree type
= TREE_TYPE (TREE_TYPE (fndecl
));
8634 enum tree_code code
;
8636 enum tree_code code0
, code1
;
8637 tree cmp_type
= NULL_TREE
;
8639 type0
= TREE_TYPE (arg0
);
8640 type1
= TREE_TYPE (arg1
);
8642 code0
= TREE_CODE (type0
);
8643 code1
= TREE_CODE (type1
);
8645 if (code0
== REAL_TYPE
&& code1
== REAL_TYPE
)
8646 /* Choose the wider of two real types. */
8647 cmp_type
= TYPE_PRECISION (type0
) >= TYPE_PRECISION (type1
)
8649 else if (code0
== REAL_TYPE
&& code1
== INTEGER_TYPE
)
8651 else if (code0
== INTEGER_TYPE
&& code1
== REAL_TYPE
)
8654 arg0
= fold_convert_loc (loc
, cmp_type
, arg0
);
8655 arg1
= fold_convert_loc (loc
, cmp_type
, arg1
);
8657 if (unordered_code
== UNORDERED_EXPR
)
8659 if (!HONOR_NANS (arg0
))
8660 return omit_two_operands_loc (loc
, type
, integer_zero_node
, arg0
, arg1
);
8661 return fold_build2_loc (loc
, UNORDERED_EXPR
, type
, arg0
, arg1
);
8664 code
= HONOR_NANS (arg0
) ? unordered_code
: ordered_code
;
8665 return fold_build1_loc (loc
, TRUTH_NOT_EXPR
, type
,
8666 fold_build2_loc (loc
, code
, type
, arg0
, arg1
));
8669 /* Fold __builtin_{,s,u}{add,sub,mul}{,l,ll}_overflow, either into normal
8670 arithmetics if it can never overflow, or into internal functions that
8671 return both result of arithmetics and overflowed boolean flag in
8672 a complex integer result, or some other check for overflow.
8673 Similarly fold __builtin_{add,sub,mul}_overflow_p to just the overflow
8674 checking part of that. */
8677 fold_builtin_arith_overflow (location_t loc
, enum built_in_function fcode
,
8678 tree arg0
, tree arg1
, tree arg2
)
8680 enum internal_fn ifn
= IFN_LAST
;
8681 /* The code of the expression corresponding to the type-generic
8682 built-in, or ERROR_MARK for the type-specific ones. */
8683 enum tree_code opcode
= ERROR_MARK
;
8684 bool ovf_only
= false;
8688 case BUILT_IN_ADD_OVERFLOW_P
:
8691 case BUILT_IN_ADD_OVERFLOW
:
8694 case BUILT_IN_SADD_OVERFLOW
:
8695 case BUILT_IN_SADDL_OVERFLOW
:
8696 case BUILT_IN_SADDLL_OVERFLOW
:
8697 case BUILT_IN_UADD_OVERFLOW
:
8698 case BUILT_IN_UADDL_OVERFLOW
:
8699 case BUILT_IN_UADDLL_OVERFLOW
:
8700 ifn
= IFN_ADD_OVERFLOW
;
8702 case BUILT_IN_SUB_OVERFLOW_P
:
8705 case BUILT_IN_SUB_OVERFLOW
:
8706 opcode
= MINUS_EXPR
;
8708 case BUILT_IN_SSUB_OVERFLOW
:
8709 case BUILT_IN_SSUBL_OVERFLOW
:
8710 case BUILT_IN_SSUBLL_OVERFLOW
:
8711 case BUILT_IN_USUB_OVERFLOW
:
8712 case BUILT_IN_USUBL_OVERFLOW
:
8713 case BUILT_IN_USUBLL_OVERFLOW
:
8714 ifn
= IFN_SUB_OVERFLOW
;
8716 case BUILT_IN_MUL_OVERFLOW_P
:
8719 case BUILT_IN_MUL_OVERFLOW
:
8722 case BUILT_IN_SMUL_OVERFLOW
:
8723 case BUILT_IN_SMULL_OVERFLOW
:
8724 case BUILT_IN_SMULLL_OVERFLOW
:
8725 case BUILT_IN_UMUL_OVERFLOW
:
8726 case BUILT_IN_UMULL_OVERFLOW
:
8727 case BUILT_IN_UMULLL_OVERFLOW
:
8728 ifn
= IFN_MUL_OVERFLOW
;
8734 /* For the "generic" overloads, the first two arguments can have different
8735 types and the last argument determines the target type to use to check
8736 for overflow. The arguments of the other overloads all have the same
8738 tree type
= ovf_only
? TREE_TYPE (arg2
) : TREE_TYPE (TREE_TYPE (arg2
));
8740 /* For the __builtin_{add,sub,mul}_overflow_p builtins, when the first two
8741 arguments are constant, attempt to fold the built-in call into a constant
8742 expression indicating whether or not it detected an overflow. */
8744 && TREE_CODE (arg0
) == INTEGER_CST
8745 && TREE_CODE (arg1
) == INTEGER_CST
)
8746 /* Perform the computation in the target type and check for overflow. */
8747 return omit_one_operand_loc (loc
, boolean_type_node
,
8748 arith_overflowed_p (opcode
, type
, arg0
, arg1
)
8749 ? boolean_true_node
: boolean_false_node
,
8752 tree ctype
= build_complex_type (type
);
8753 tree call
= build_call_expr_internal_loc (loc
, ifn
, ctype
,
8755 tree tgt
= save_expr (call
);
8756 tree intres
= build1_loc (loc
, REALPART_EXPR
, type
, tgt
);
8757 tree ovfres
= build1_loc (loc
, IMAGPART_EXPR
, type
, tgt
);
8758 ovfres
= fold_convert_loc (loc
, boolean_type_node
, ovfres
);
8761 return omit_one_operand_loc (loc
, boolean_type_node
, ovfres
, arg2
);
8763 tree mem_arg2
= build_fold_indirect_ref_loc (loc
, arg2
);
8765 = fold_build2_loc (loc
, MODIFY_EXPR
, void_type_node
, mem_arg2
, intres
);
8766 return build2_loc (loc
, COMPOUND_EXPR
, boolean_type_node
, store
, ovfres
);
8769 /* Fold a call to __builtin_FILE to a constant string. */
8772 fold_builtin_FILE (location_t loc
)
8774 if (const char *fname
= LOCATION_FILE (loc
))
8776 /* The documentation says this builtin is equivalent to the preprocessor
8777 __FILE__ macro so it appears appropriate to use the same file prefix
8779 fname
= remap_macro_filename (fname
);
8780 return build_string_literal (strlen (fname
) + 1, fname
);
8783 return build_string_literal (1, "");
8786 /* Fold a call to __builtin_FUNCTION to a constant string. */
8789 fold_builtin_FUNCTION ()
8791 const char *name
= "";
8793 if (current_function_decl
)
8794 name
= lang_hooks
.decl_printable_name (current_function_decl
, 0);
8796 return build_string_literal (strlen (name
) + 1, name
);
8799 /* Fold a call to __builtin_LINE to an integer constant. */
8802 fold_builtin_LINE (location_t loc
, tree type
)
8804 return build_int_cst (type
, LOCATION_LINE (loc
));
8807 /* Fold a call to built-in function FNDECL with 0 arguments.
8808 This function returns NULL_TREE if no simplification was possible. */
8811 fold_builtin_0 (location_t loc
, tree fndecl
)
8813 tree type
= TREE_TYPE (TREE_TYPE (fndecl
));
8814 enum built_in_function fcode
= DECL_FUNCTION_CODE (fndecl
);
8818 return fold_builtin_FILE (loc
);
8820 case BUILT_IN_FUNCTION
:
8821 return fold_builtin_FUNCTION ();
8824 return fold_builtin_LINE (loc
, type
);
8826 CASE_FLT_FN (BUILT_IN_INF
):
8827 CASE_FLT_FN_FLOATN_NX (BUILT_IN_INF
):
8828 case BUILT_IN_INFD32
:
8829 case BUILT_IN_INFD64
:
8830 case BUILT_IN_INFD128
:
8831 return fold_builtin_inf (loc
, type
, true);
8833 CASE_FLT_FN (BUILT_IN_HUGE_VAL
):
8834 CASE_FLT_FN_FLOATN_NX (BUILT_IN_HUGE_VAL
):
8835 return fold_builtin_inf (loc
, type
, false);
8837 case BUILT_IN_CLASSIFY_TYPE
:
8838 return fold_builtin_classify_type (NULL_TREE
);
8846 /* Fold a call to built-in function FNDECL with 1 argument, ARG0.
8847 This function returns NULL_TREE if no simplification was possible. */
8850 fold_builtin_1 (location_t loc
, tree fndecl
, tree arg0
)
8852 tree type
= TREE_TYPE (TREE_TYPE (fndecl
));
8853 enum built_in_function fcode
= DECL_FUNCTION_CODE (fndecl
);
8855 if (TREE_CODE (arg0
) == ERROR_MARK
)
8858 if (tree ret
= fold_const_call (as_combined_fn (fcode
), type
, arg0
))
8863 case BUILT_IN_CONSTANT_P
:
8865 tree val
= fold_builtin_constant_p (arg0
);
8867 /* Gimplification will pull the CALL_EXPR for the builtin out of
8868 an if condition. When not optimizing, we'll not CSE it back.
8869 To avoid link error types of regressions, return false now. */
8870 if (!val
&& !optimize
)
8871 val
= integer_zero_node
;
8876 case BUILT_IN_CLASSIFY_TYPE
:
8877 return fold_builtin_classify_type (arg0
);
8879 case BUILT_IN_STRLEN
:
8880 return fold_builtin_strlen (loc
, type
, arg0
);
8882 CASE_FLT_FN (BUILT_IN_FABS
):
8883 CASE_FLT_FN_FLOATN_NX (BUILT_IN_FABS
):
8884 case BUILT_IN_FABSD32
:
8885 case BUILT_IN_FABSD64
:
8886 case BUILT_IN_FABSD128
:
8887 return fold_builtin_fabs (loc
, arg0
, type
);
8891 case BUILT_IN_LLABS
:
8892 case BUILT_IN_IMAXABS
:
8893 return fold_builtin_abs (loc
, arg0
, type
);
8895 CASE_FLT_FN (BUILT_IN_CONJ
):
8896 if (validate_arg (arg0
, COMPLEX_TYPE
)
8897 && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0
))) == REAL_TYPE
)
8898 return fold_build1_loc (loc
, CONJ_EXPR
, type
, arg0
);
8901 CASE_FLT_FN (BUILT_IN_CREAL
):
8902 if (validate_arg (arg0
, COMPLEX_TYPE
)
8903 && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0
))) == REAL_TYPE
)
8904 return non_lvalue_loc (loc
, fold_build1_loc (loc
, REALPART_EXPR
, type
, arg0
));
8907 CASE_FLT_FN (BUILT_IN_CIMAG
):
8908 if (validate_arg (arg0
, COMPLEX_TYPE
)
8909 && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0
))) == REAL_TYPE
)
8910 return non_lvalue_loc (loc
, fold_build1_loc (loc
, IMAGPART_EXPR
, type
, arg0
));
8913 CASE_FLT_FN (BUILT_IN_CARG
):
8914 return fold_builtin_carg (loc
, arg0
, type
);
8916 case BUILT_IN_ISASCII
:
8917 return fold_builtin_isascii (loc
, arg0
);
8919 case BUILT_IN_TOASCII
:
8920 return fold_builtin_toascii (loc
, arg0
);
8922 case BUILT_IN_ISDIGIT
:
8923 return fold_builtin_isdigit (loc
, arg0
);
8925 CASE_FLT_FN (BUILT_IN_FINITE
):
8926 case BUILT_IN_FINITED32
:
8927 case BUILT_IN_FINITED64
:
8928 case BUILT_IN_FINITED128
:
8929 case BUILT_IN_ISFINITE
:
8931 tree ret
= fold_builtin_classify (loc
, fndecl
, arg0
, BUILT_IN_ISFINITE
);
8934 return fold_builtin_interclass_mathfn (loc
, fndecl
, arg0
);
8937 CASE_FLT_FN (BUILT_IN_ISINF
):
8938 case BUILT_IN_ISINFD32
:
8939 case BUILT_IN_ISINFD64
:
8940 case BUILT_IN_ISINFD128
:
8942 tree ret
= fold_builtin_classify (loc
, fndecl
, arg0
, BUILT_IN_ISINF
);
8945 return fold_builtin_interclass_mathfn (loc
, fndecl
, arg0
);
8948 case BUILT_IN_ISNORMAL
:
8949 return fold_builtin_interclass_mathfn (loc
, fndecl
, arg0
);
8951 case BUILT_IN_ISINF_SIGN
:
8952 return fold_builtin_classify (loc
, fndecl
, arg0
, BUILT_IN_ISINF_SIGN
);
8954 CASE_FLT_FN (BUILT_IN_ISNAN
):
8955 case BUILT_IN_ISNAND32
:
8956 case BUILT_IN_ISNAND64
:
8957 case BUILT_IN_ISNAND128
:
8958 return fold_builtin_classify (loc
, fndecl
, arg0
, BUILT_IN_ISNAN
);
8961 if (integer_zerop (arg0
))
8962 return build_empty_stmt (loc
);
8973 /* Fold a call to built-in function FNDECL with 2 arguments, ARG0 and ARG1.
8974 This function returns NULL_TREE if no simplification was possible. */
8977 fold_builtin_2 (location_t loc
, tree fndecl
, tree arg0
, tree arg1
)
8979 tree type
= TREE_TYPE (TREE_TYPE (fndecl
));
8980 enum built_in_function fcode
= DECL_FUNCTION_CODE (fndecl
);
8982 if (TREE_CODE (arg0
) == ERROR_MARK
8983 || TREE_CODE (arg1
) == ERROR_MARK
)
8986 if (tree ret
= fold_const_call (as_combined_fn (fcode
), type
, arg0
, arg1
))
8991 CASE_FLT_FN_REENT (BUILT_IN_GAMMA
): /* GAMMA_R */
8992 CASE_FLT_FN_REENT (BUILT_IN_LGAMMA
): /* LGAMMA_R */
8993 if (validate_arg (arg0
, REAL_TYPE
)
8994 && validate_arg (arg1
, POINTER_TYPE
))
8995 return do_mpfr_lgamma_r (arg0
, arg1
, type
);
8998 CASE_FLT_FN (BUILT_IN_FREXP
):
8999 return fold_builtin_frexp (loc
, arg0
, arg1
, type
);
9001 CASE_FLT_FN (BUILT_IN_MODF
):
9002 return fold_builtin_modf (loc
, arg0
, arg1
, type
);
9004 case BUILT_IN_STRSPN
:
9005 return fold_builtin_strspn (loc
, arg0
, arg1
);
9007 case BUILT_IN_STRCSPN
:
9008 return fold_builtin_strcspn (loc
, arg0
, arg1
);
9010 case BUILT_IN_STRPBRK
:
9011 return fold_builtin_strpbrk (loc
, arg0
, arg1
, type
);
9013 case BUILT_IN_EXPECT
:
9014 return fold_builtin_expect (loc
, arg0
, arg1
, NULL_TREE
);
9016 case BUILT_IN_ISGREATER
:
9017 return fold_builtin_unordered_cmp (loc
, fndecl
,
9018 arg0
, arg1
, UNLE_EXPR
, LE_EXPR
);
9019 case BUILT_IN_ISGREATEREQUAL
:
9020 return fold_builtin_unordered_cmp (loc
, fndecl
,
9021 arg0
, arg1
, UNLT_EXPR
, LT_EXPR
);
9022 case BUILT_IN_ISLESS
:
9023 return fold_builtin_unordered_cmp (loc
, fndecl
,
9024 arg0
, arg1
, UNGE_EXPR
, GE_EXPR
);
9025 case BUILT_IN_ISLESSEQUAL
:
9026 return fold_builtin_unordered_cmp (loc
, fndecl
,
9027 arg0
, arg1
, UNGT_EXPR
, GT_EXPR
);
9028 case BUILT_IN_ISLESSGREATER
:
9029 return fold_builtin_unordered_cmp (loc
, fndecl
,
9030 arg0
, arg1
, UNEQ_EXPR
, EQ_EXPR
);
9031 case BUILT_IN_ISUNORDERED
:
9032 return fold_builtin_unordered_cmp (loc
, fndecl
,
9033 arg0
, arg1
, UNORDERED_EXPR
,
9036 /* We do the folding for va_start in the expander. */
9037 case BUILT_IN_VA_START
:
9040 case BUILT_IN_OBJECT_SIZE
:
9041 return fold_builtin_object_size (arg0
, arg1
);
9043 case BUILT_IN_ATOMIC_ALWAYS_LOCK_FREE
:
9044 return fold_builtin_atomic_always_lock_free (arg0
, arg1
);
9046 case BUILT_IN_ATOMIC_IS_LOCK_FREE
:
9047 return fold_builtin_atomic_is_lock_free (arg0
, arg1
);
9055 /* Fold a call to built-in function FNDECL with 3 arguments, ARG0, ARG1,
9057 This function returns NULL_TREE if no simplification was possible. */
9060 fold_builtin_3 (location_t loc
, tree fndecl
,
9061 tree arg0
, tree arg1
, tree arg2
)
9063 tree type
= TREE_TYPE (TREE_TYPE (fndecl
));
9064 enum built_in_function fcode
= DECL_FUNCTION_CODE (fndecl
);
9066 if (TREE_CODE (arg0
) == ERROR_MARK
9067 || TREE_CODE (arg1
) == ERROR_MARK
9068 || TREE_CODE (arg2
) == ERROR_MARK
)
9071 if (tree ret
= fold_const_call (as_combined_fn (fcode
), type
,
9078 CASE_FLT_FN (BUILT_IN_SINCOS
):
9079 return fold_builtin_sincos (loc
, arg0
, arg1
, arg2
);
9081 CASE_FLT_FN (BUILT_IN_REMQUO
):
9082 if (validate_arg (arg0
, REAL_TYPE
)
9083 && validate_arg (arg1
, REAL_TYPE
)
9084 && validate_arg (arg2
, POINTER_TYPE
))
9085 return do_mpfr_remquo (arg0
, arg1
, arg2
);
9088 case BUILT_IN_MEMCMP
:
9089 return fold_builtin_memcmp (loc
, arg0
, arg1
, arg2
);
9091 case BUILT_IN_EXPECT
:
9092 return fold_builtin_expect (loc
, arg0
, arg1
, arg2
);
9094 case BUILT_IN_ADD_OVERFLOW
:
9095 case BUILT_IN_SUB_OVERFLOW
:
9096 case BUILT_IN_MUL_OVERFLOW
:
9097 case BUILT_IN_ADD_OVERFLOW_P
:
9098 case BUILT_IN_SUB_OVERFLOW_P
:
9099 case BUILT_IN_MUL_OVERFLOW_P
:
9100 case BUILT_IN_SADD_OVERFLOW
:
9101 case BUILT_IN_SADDL_OVERFLOW
:
9102 case BUILT_IN_SADDLL_OVERFLOW
:
9103 case BUILT_IN_SSUB_OVERFLOW
:
9104 case BUILT_IN_SSUBL_OVERFLOW
:
9105 case BUILT_IN_SSUBLL_OVERFLOW
:
9106 case BUILT_IN_SMUL_OVERFLOW
:
9107 case BUILT_IN_SMULL_OVERFLOW
:
9108 case BUILT_IN_SMULLL_OVERFLOW
:
9109 case BUILT_IN_UADD_OVERFLOW
:
9110 case BUILT_IN_UADDL_OVERFLOW
:
9111 case BUILT_IN_UADDLL_OVERFLOW
:
9112 case BUILT_IN_USUB_OVERFLOW
:
9113 case BUILT_IN_USUBL_OVERFLOW
:
9114 case BUILT_IN_USUBLL_OVERFLOW
:
9115 case BUILT_IN_UMUL_OVERFLOW
:
9116 case BUILT_IN_UMULL_OVERFLOW
:
9117 case BUILT_IN_UMULLL_OVERFLOW
:
9118 return fold_builtin_arith_overflow (loc
, fcode
, arg0
, arg1
, arg2
);
9126 /* Fold a call to built-in function FNDECL. ARGS is an array of NARGS
9127 arguments. IGNORE is true if the result of the
9128 function call is ignored. This function returns NULL_TREE if no
9129 simplification was possible. */
9132 fold_builtin_n (location_t loc
, tree fndecl
, tree
*args
, int nargs
, bool)
9134 tree ret
= NULL_TREE
;
9139 ret
= fold_builtin_0 (loc
, fndecl
);
9142 ret
= fold_builtin_1 (loc
, fndecl
, args
[0]);
9145 ret
= fold_builtin_2 (loc
, fndecl
, args
[0], args
[1]);
9148 ret
= fold_builtin_3 (loc
, fndecl
, args
[0], args
[1], args
[2]);
9151 ret
= fold_builtin_varargs (loc
, fndecl
, args
, nargs
);
9156 ret
= build1 (NOP_EXPR
, TREE_TYPE (ret
), ret
);
9157 SET_EXPR_LOCATION (ret
, loc
);
9158 TREE_NO_WARNING (ret
) = 1;
9164 /* Construct a new CALL_EXPR to FNDECL using the tail of the argument
9165 list ARGS along with N new arguments in NEWARGS. SKIP is the number
9166 of arguments in ARGS to be omitted. OLDNARGS is the number of
9167 elements in ARGS. */
9170 rewrite_call_expr_valist (location_t loc
, int oldnargs
, tree
*args
,
9171 int skip
, tree fndecl
, int n
, va_list newargs
)
9173 int nargs
= oldnargs
- skip
+ n
;
9180 buffer
= XALLOCAVEC (tree
, nargs
);
9181 for (i
= 0; i
< n
; i
++)
9182 buffer
[i
] = va_arg (newargs
, tree
);
9183 for (j
= skip
; j
< oldnargs
; j
++, i
++)
9184 buffer
[i
] = args
[j
];
9187 buffer
= args
+ skip
;
9189 return build_call_expr_loc_array (loc
, fndecl
, nargs
, buffer
);
9192 /* Return true if FNDECL shouldn't be folded right now.
9193 If a built-in function has an inline attribute always_inline
9194 wrapper, defer folding it after always_inline functions have
9195 been inlined, otherwise e.g. -D_FORTIFY_SOURCE checking
9196 might not be performed. */
9199 avoid_folding_inline_builtin (tree fndecl
)
9201 return (DECL_DECLARED_INLINE_P (fndecl
)
9202 && DECL_DISREGARD_INLINE_LIMITS (fndecl
)
9204 && !cfun
->always_inline_functions_inlined
9205 && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fndecl
)));
9208 /* A wrapper function for builtin folding that prevents warnings for
9209 "statement without effect" and the like, caused by removing the
9210 call node earlier than the warning is generated. */
9213 fold_call_expr (location_t loc
, tree exp
, bool ignore
)
9215 tree ret
= NULL_TREE
;
9216 tree fndecl
= get_callee_fndecl (exp
);
9218 && TREE_CODE (fndecl
) == FUNCTION_DECL
9219 && DECL_BUILT_IN (fndecl
)
9220 /* If CALL_EXPR_VA_ARG_PACK is set, the arguments aren't finalized
9221 yet. Defer folding until we see all the arguments
9222 (after inlining). */
9223 && !CALL_EXPR_VA_ARG_PACK (exp
))
9225 int nargs
= call_expr_nargs (exp
);
9227 /* Before gimplification CALL_EXPR_VA_ARG_PACK is not set, but
9228 instead last argument is __builtin_va_arg_pack (). Defer folding
9229 even in that case, until arguments are finalized. */
9230 if (nargs
&& TREE_CODE (CALL_EXPR_ARG (exp
, nargs
- 1)) == CALL_EXPR
)
9232 tree fndecl2
= get_callee_fndecl (CALL_EXPR_ARG (exp
, nargs
- 1));
9234 && TREE_CODE (fndecl2
) == FUNCTION_DECL
9235 && DECL_BUILT_IN_CLASS (fndecl2
) == BUILT_IN_NORMAL
9236 && DECL_FUNCTION_CODE (fndecl2
) == BUILT_IN_VA_ARG_PACK
)
9240 if (avoid_folding_inline_builtin (fndecl
))
9243 if (DECL_BUILT_IN_CLASS (fndecl
) == BUILT_IN_MD
)
9244 return targetm
.fold_builtin (fndecl
, call_expr_nargs (exp
),
9245 CALL_EXPR_ARGP (exp
), ignore
);
9248 tree
*args
= CALL_EXPR_ARGP (exp
);
9249 ret
= fold_builtin_n (loc
, fndecl
, args
, nargs
, ignore
);
9257 /* Fold a CALL_EXPR with type TYPE with FN as the function expression.
9258 N arguments are passed in the array ARGARRAY. Return a folded
9259 expression or NULL_TREE if no simplification was possible. */
9262 fold_builtin_call_array (location_t loc
, tree
,
9267 if (TREE_CODE (fn
) != ADDR_EXPR
)
9270 tree fndecl
= TREE_OPERAND (fn
, 0);
9271 if (TREE_CODE (fndecl
) == FUNCTION_DECL
9272 && DECL_BUILT_IN (fndecl
))
9274 /* If last argument is __builtin_va_arg_pack (), arguments to this
9275 function are not finalized yet. Defer folding until they are. */
9276 if (n
&& TREE_CODE (argarray
[n
- 1]) == CALL_EXPR
)
9278 tree fndecl2
= get_callee_fndecl (argarray
[n
- 1]);
9280 && TREE_CODE (fndecl2
) == FUNCTION_DECL
9281 && DECL_BUILT_IN_CLASS (fndecl2
) == BUILT_IN_NORMAL
9282 && DECL_FUNCTION_CODE (fndecl2
) == BUILT_IN_VA_ARG_PACK
)
9285 if (avoid_folding_inline_builtin (fndecl
))
9287 if (DECL_BUILT_IN_CLASS (fndecl
) == BUILT_IN_MD
)
9288 return targetm
.fold_builtin (fndecl
, n
, argarray
, false);
9290 return fold_builtin_n (loc
, fndecl
, argarray
, n
, false);
9296 /* Construct a new CALL_EXPR using the tail of the argument list of EXP
9297 along with N new arguments specified as the "..." parameters. SKIP
9298 is the number of arguments in EXP to be omitted. This function is used
9299 to do varargs-to-varargs transformations. */
9302 rewrite_call_expr (location_t loc
, tree exp
, int skip
, tree fndecl
, int n
, ...)
9308 t
= rewrite_call_expr_valist (loc
, call_expr_nargs (exp
),
9309 CALL_EXPR_ARGP (exp
), skip
, fndecl
, n
, ap
);
9315 /* Validate a single argument ARG against a tree code CODE representing
9316 a type. Return true when argument is valid. */
9319 validate_arg (const_tree arg
, enum tree_code code
)
9323 else if (code
== POINTER_TYPE
)
9324 return POINTER_TYPE_P (TREE_TYPE (arg
));
9325 else if (code
== INTEGER_TYPE
)
9326 return INTEGRAL_TYPE_P (TREE_TYPE (arg
));
9327 return code
== TREE_CODE (TREE_TYPE (arg
));
9330 /* This function validates the types of a function call argument list
9331 against a specified list of tree_codes. If the last specifier is a 0,
9332 that represents an ellipses, otherwise the last specifier must be a
9335 This is the GIMPLE version of validate_arglist. Eventually we want to
9336 completely convert builtins.c to work from GIMPLEs and the tree based
9337 validate_arglist will then be removed. */
9340 validate_gimple_arglist (const gcall
*call
, ...)
9342 enum tree_code code
;
9348 va_start (ap
, call
);
9353 code
= (enum tree_code
) va_arg (ap
, int);
9357 /* This signifies an ellipses, any further arguments are all ok. */
9361 /* This signifies an endlink, if no arguments remain, return
9362 true, otherwise return false. */
9363 res
= (i
== gimple_call_num_args (call
));
9366 /* If no parameters remain or the parameter's code does not
9367 match the specified code, return false. Otherwise continue
9368 checking any remaining arguments. */
9369 arg
= gimple_call_arg (call
, i
++);
9370 if (!validate_arg (arg
, code
))
9377 /* We need gotos here since we can only have one VA_CLOSE in a
9385 /* Default target-specific builtin expander that does nothing. */
9388 default_expand_builtin (tree exp ATTRIBUTE_UNUSED
,
9389 rtx target ATTRIBUTE_UNUSED
,
9390 rtx subtarget ATTRIBUTE_UNUSED
,
9391 machine_mode mode ATTRIBUTE_UNUSED
,
9392 int ignore ATTRIBUTE_UNUSED
)
9397 /* Returns true is EXP represents data that would potentially reside
9398 in a readonly section. */
9401 readonly_data_expr (tree exp
)
9405 if (TREE_CODE (exp
) != ADDR_EXPR
)
9408 exp
= get_base_address (TREE_OPERAND (exp
, 0));
9412 /* Make sure we call decl_readonly_section only for trees it
9413 can handle (since it returns true for everything it doesn't
9415 if (TREE_CODE (exp
) == STRING_CST
9416 || TREE_CODE (exp
) == CONSTRUCTOR
9417 || (VAR_P (exp
) && TREE_STATIC (exp
)))
9418 return decl_readonly_section (exp
, 0);
9423 /* Simplify a call to the strpbrk builtin. S1 and S2 are the arguments
9424 to the call, and TYPE is its return type.
9426 Return NULL_TREE if no simplification was possible, otherwise return the
9427 simplified form of the call as a tree.
9429 The simplified form may be a constant or other expression which
9430 computes the same value, but in a more efficient manner (including
9431 calls to other builtin functions).
9433 The call may contain arguments which need to be evaluated, but
9434 which are not useful to determine the result of the call. In
9435 this case we return a chain of COMPOUND_EXPRs. The LHS of each
9436 COMPOUND_EXPR will be an argument which must be evaluated.
9437 COMPOUND_EXPRs are chained through their RHS. The RHS of the last
9438 COMPOUND_EXPR in the chain will contain the tree for the simplified
9439 form of the builtin function call. */
9442 fold_builtin_strpbrk (location_t loc
, tree s1
, tree s2
, tree type
)
9444 if (!validate_arg (s1
, POINTER_TYPE
)
9445 || !validate_arg (s2
, POINTER_TYPE
))
9450 const char *p1
, *p2
;
9459 const char *r
= strpbrk (p1
, p2
);
9463 return build_int_cst (TREE_TYPE (s1
), 0);
9465 /* Return an offset into the constant string argument. */
9466 tem
= fold_build_pointer_plus_hwi_loc (loc
, s1
, r
- p1
);
9467 return fold_convert_loc (loc
, type
, tem
);
9471 /* strpbrk(x, "") == NULL.
9472 Evaluate and ignore s1 in case it had side-effects. */
9473 return omit_one_operand_loc (loc
, type
, integer_zero_node
, s1
);
9476 return NULL_TREE
; /* Really call strpbrk. */
9478 fn
= builtin_decl_implicit (BUILT_IN_STRCHR
);
9482 /* New argument list transforming strpbrk(s1, s2) to
9483 strchr(s1, s2[0]). */
9484 return build_call_expr_loc (loc
, fn
, 2, s1
,
9485 build_int_cst (integer_type_node
, p2
[0]));
9489 /* Simplify a call to the strspn builtin. S1 and S2 are the arguments
9492 Return NULL_TREE if no simplification was possible, otherwise return the
9493 simplified form of the call as a tree.
9495 The simplified form may be a constant or other expression which
9496 computes the same value, but in a more efficient manner (including
9497 calls to other builtin functions).
9499 The call may contain arguments which need to be evaluated, but
9500 which are not useful to determine the result of the call. In
9501 this case we return a chain of COMPOUND_EXPRs. The LHS of each
9502 COMPOUND_EXPR will be an argument which must be evaluated.
9503 COMPOUND_EXPRs are chained through their RHS. The RHS of the last
9504 COMPOUND_EXPR in the chain will contain the tree for the simplified
9505 form of the builtin function call. */
9508 fold_builtin_strspn (location_t loc
, tree s1
, tree s2
)
9510 if (!validate_arg (s1
, POINTER_TYPE
)
9511 || !validate_arg (s2
, POINTER_TYPE
))
9515 const char *p1
= c_getstr (s1
), *p2
= c_getstr (s2
);
9517 /* If either argument is "", return NULL_TREE. */
9518 if ((p1
&& *p1
== '\0') || (p2
&& *p2
== '\0'))
9519 /* Evaluate and ignore both arguments in case either one has
9521 return omit_two_operands_loc (loc
, size_type_node
, size_zero_node
,
9527 /* Simplify a call to the strcspn builtin. S1 and S2 are the arguments
9530 Return NULL_TREE if no simplification was possible, otherwise return the
9531 simplified form of the call as a tree.
9533 The simplified form may be a constant or other expression which
9534 computes the same value, but in a more efficient manner (including
9535 calls to other builtin functions).
9537 The call may contain arguments which need to be evaluated, but
9538 which are not useful to determine the result of the call. In
9539 this case we return a chain of COMPOUND_EXPRs. The LHS of each
9540 COMPOUND_EXPR will be an argument which must be evaluated.
9541 COMPOUND_EXPRs are chained through their RHS. The RHS of the last
9542 COMPOUND_EXPR in the chain will contain the tree for the simplified
9543 form of the builtin function call. */
9546 fold_builtin_strcspn (location_t loc
, tree s1
, tree s2
)
9548 if (!validate_arg (s1
, POINTER_TYPE
)
9549 || !validate_arg (s2
, POINTER_TYPE
))
9553 /* If the first argument is "", return NULL_TREE. */
9554 const char *p1
= c_getstr (s1
);
9555 if (p1
&& *p1
== '\0')
9557 /* Evaluate and ignore argument s2 in case it has
9559 return omit_one_operand_loc (loc
, size_type_node
,
9560 size_zero_node
, s2
);
9563 /* If the second argument is "", return __builtin_strlen(s1). */
9564 const char *p2
= c_getstr (s2
);
9565 if (p2
&& *p2
== '\0')
9567 tree fn
= builtin_decl_implicit (BUILT_IN_STRLEN
);
9569 /* If the replacement _DECL isn't initialized, don't do the
9574 return build_call_expr_loc (loc
, fn
, 1, s1
);
9580 /* Fold the next_arg or va_start call EXP. Returns true if there was an error
9581 produced. False otherwise. This is done so that we don't output the error
9582 or warning twice or three times. */
9585 fold_builtin_next_arg (tree exp
, bool va_start_p
)
9587 tree fntype
= TREE_TYPE (current_function_decl
);
9588 int nargs
= call_expr_nargs (exp
);
9590 /* There is good chance the current input_location points inside the
9591 definition of the va_start macro (perhaps on the token for
9592 builtin) in a system header, so warnings will not be emitted.
9593 Use the location in real source code. */
9594 source_location current_location
=
9595 linemap_unwind_to_first_non_reserved_loc (line_table
, input_location
,
9598 if (!stdarg_p (fntype
))
9600 error ("%<va_start%> used in function with fixed args");
9606 if (va_start_p
&& (nargs
!= 2))
9608 error ("wrong number of arguments to function %<va_start%>");
9611 arg
= CALL_EXPR_ARG (exp
, 1);
9613 /* We use __builtin_va_start (ap, 0, 0) or __builtin_next_arg (0, 0)
9614 when we checked the arguments and if needed issued a warning. */
9619 /* Evidently an out of date version of <stdarg.h>; can't validate
9620 va_start's second argument, but can still work as intended. */
9621 warning_at (current_location
,
9623 "%<__builtin_next_arg%> called without an argument");
9628 error ("wrong number of arguments to function %<__builtin_next_arg%>");
9631 arg
= CALL_EXPR_ARG (exp
, 0);
9634 if (TREE_CODE (arg
) == SSA_NAME
)
9635 arg
= SSA_NAME_VAR (arg
);
9637 /* We destructively modify the call to be __builtin_va_start (ap, 0)
9638 or __builtin_next_arg (0) the first time we see it, after checking
9639 the arguments and if needed issuing a warning. */
9640 if (!integer_zerop (arg
))
9642 tree last_parm
= tree_last (DECL_ARGUMENTS (current_function_decl
));
9644 /* Strip off all nops for the sake of the comparison. This
9645 is not quite the same as STRIP_NOPS. It does more.
9646 We must also strip off INDIRECT_EXPR for C++ reference
9648 while (CONVERT_EXPR_P (arg
)
9649 || TREE_CODE (arg
) == INDIRECT_REF
)
9650 arg
= TREE_OPERAND (arg
, 0);
9651 if (arg
!= last_parm
)
9653 /* FIXME: Sometimes with the tree optimizers we can get the
9654 not the last argument even though the user used the last
9655 argument. We just warn and set the arg to be the last
9656 argument so that we will get wrong-code because of
9658 warning_at (current_location
,
9660 "second parameter of %<va_start%> not last named argument");
9663 /* Undefined by C99 7.15.1.4p4 (va_start):
9664 "If the parameter parmN is declared with the register storage
9665 class, with a function or array type, or with a type that is
9666 not compatible with the type that results after application of
9667 the default argument promotions, the behavior is undefined."
9669 else if (DECL_REGISTER (arg
))
9671 warning_at (current_location
,
9673 "undefined behavior when second parameter of "
9674 "%<va_start%> is declared with %<register%> storage");
9677 /* We want to verify the second parameter just once before the tree
9678 optimizers are run and then avoid keeping it in the tree,
9679 as otherwise we could warn even for correct code like:
9680 void foo (int i, ...)
9681 { va_list ap; i++; va_start (ap, i); va_end (ap); } */
9683 CALL_EXPR_ARG (exp
, 1) = integer_zero_node
;
9685 CALL_EXPR_ARG (exp
, 0) = integer_zero_node
;
9691 /* Expand a call EXP to __builtin_object_size. */
9694 expand_builtin_object_size (tree exp
)
9697 int object_size_type
;
9698 tree fndecl
= get_callee_fndecl (exp
);
9700 if (!validate_arglist (exp
, POINTER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
9702 error ("%Kfirst argument of %qD must be a pointer, second integer constant",
9704 expand_builtin_trap ();
9708 ost
= CALL_EXPR_ARG (exp
, 1);
9711 if (TREE_CODE (ost
) != INTEGER_CST
9712 || tree_int_cst_sgn (ost
) < 0
9713 || compare_tree_int (ost
, 3) > 0)
9715 error ("%Klast argument of %qD is not integer constant between 0 and 3",
9717 expand_builtin_trap ();
9721 object_size_type
= tree_to_shwi (ost
);
9723 return object_size_type
< 2 ? constm1_rtx
: const0_rtx
;
9726 /* Expand EXP, a call to the __mem{cpy,pcpy,move,set}_chk builtin.
9727 FCODE is the BUILT_IN_* to use.
9728 Return NULL_RTX if we failed; the caller should emit a normal call,
9729 otherwise try to get the result in TARGET, if convenient (and in
9730 mode MODE if that's convenient). */
9733 expand_builtin_memory_chk (tree exp
, rtx target
, machine_mode mode
,
9734 enum built_in_function fcode
)
9736 if (!validate_arglist (exp
,
9738 fcode
== BUILT_IN_MEMSET_CHK
9739 ? INTEGER_TYPE
: POINTER_TYPE
,
9740 INTEGER_TYPE
, INTEGER_TYPE
, VOID_TYPE
))
9743 tree dest
= CALL_EXPR_ARG (exp
, 0);
9744 tree src
= CALL_EXPR_ARG (exp
, 1);
9745 tree len
= CALL_EXPR_ARG (exp
, 2);
9746 tree size
= CALL_EXPR_ARG (exp
, 3);
9748 bool sizes_ok
= check_access (exp
, dest
, src
, len
, /*maxread=*/NULL_TREE
,
9749 /*str=*/NULL_TREE
, size
);
9751 if (!tree_fits_uhwi_p (size
))
9754 if (tree_fits_uhwi_p (len
) || integer_all_onesp (size
))
9756 /* Avoid transforming the checking call to an ordinary one when
9757 an overflow has been detected or when the call couldn't be
9758 validated because the size is not constant. */
9759 if (!sizes_ok
&& !integer_all_onesp (size
) && tree_int_cst_lt (size
, len
))
9762 tree fn
= NULL_TREE
;
9763 /* If __builtin_mem{cpy,pcpy,move,set}_chk is used, assume
9764 mem{cpy,pcpy,move,set} is available. */
9767 case BUILT_IN_MEMCPY_CHK
:
9768 fn
= builtin_decl_explicit (BUILT_IN_MEMCPY
);
9770 case BUILT_IN_MEMPCPY_CHK
:
9771 fn
= builtin_decl_explicit (BUILT_IN_MEMPCPY
);
9773 case BUILT_IN_MEMMOVE_CHK
:
9774 fn
= builtin_decl_explicit (BUILT_IN_MEMMOVE
);
9776 case BUILT_IN_MEMSET_CHK
:
9777 fn
= builtin_decl_explicit (BUILT_IN_MEMSET
);
9786 fn
= build_call_nofold_loc (EXPR_LOCATION (exp
), fn
, 3, dest
, src
, len
);
9787 gcc_assert (TREE_CODE (fn
) == CALL_EXPR
);
9788 CALL_EXPR_TAILCALL (fn
) = CALL_EXPR_TAILCALL (exp
);
9789 return expand_expr (fn
, target
, mode
, EXPAND_NORMAL
);
9791 else if (fcode
== BUILT_IN_MEMSET_CHK
)
9795 unsigned int dest_align
= get_pointer_alignment (dest
);
9797 /* If DEST is not a pointer type, call the normal function. */
9798 if (dest_align
== 0)
9801 /* If SRC and DEST are the same (and not volatile), do nothing. */
9802 if (operand_equal_p (src
, dest
, 0))
9806 if (fcode
!= BUILT_IN_MEMPCPY_CHK
)
9808 /* Evaluate and ignore LEN in case it has side-effects. */
9809 expand_expr (len
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
9810 return expand_expr (dest
, target
, mode
, EXPAND_NORMAL
);
9813 expr
= fold_build_pointer_plus (dest
, len
);
9814 return expand_expr (expr
, target
, mode
, EXPAND_NORMAL
);
9817 /* __memmove_chk special case. */
9818 if (fcode
== BUILT_IN_MEMMOVE_CHK
)
9820 unsigned int src_align
= get_pointer_alignment (src
);
9825 /* If src is categorized for a readonly section we can use
9826 normal __memcpy_chk. */
9827 if (readonly_data_expr (src
))
9829 tree fn
= builtin_decl_explicit (BUILT_IN_MEMCPY_CHK
);
9832 fn
= build_call_nofold_loc (EXPR_LOCATION (exp
), fn
, 4,
9833 dest
, src
, len
, size
);
9834 gcc_assert (TREE_CODE (fn
) == CALL_EXPR
);
9835 CALL_EXPR_TAILCALL (fn
) = CALL_EXPR_TAILCALL (exp
);
9836 return expand_expr (fn
, target
, mode
, EXPAND_NORMAL
);
9843 /* Emit warning if a buffer overflow is detected at compile time. */
9846 maybe_emit_chk_warning (tree exp
, enum built_in_function fcode
)
9848 /* The source string. */
9849 tree srcstr
= NULL_TREE
;
9850 /* The size of the destination object. */
9851 tree objsize
= NULL_TREE
;
9852 /* The string that is being concatenated with (as in __strcat_chk)
9853 or null if it isn't. */
9854 tree catstr
= NULL_TREE
;
9855 /* The maximum length of the source sequence in a bounded operation
9856 (such as __strncat_chk) or null if the operation isn't bounded
9857 (such as __strcat_chk). */
9858 tree maxread
= NULL_TREE
;
9859 /* The exact size of the access (such as in __strncpy_chk). */
9860 tree size
= NULL_TREE
;
9864 case BUILT_IN_STRCPY_CHK
:
9865 case BUILT_IN_STPCPY_CHK
:
9866 srcstr
= CALL_EXPR_ARG (exp
, 1);
9867 objsize
= CALL_EXPR_ARG (exp
, 2);
9870 case BUILT_IN_STRCAT_CHK
:
9871 /* For __strcat_chk the warning will be emitted only if overflowing
9872 by at least strlen (dest) + 1 bytes. */
9873 catstr
= CALL_EXPR_ARG (exp
, 0);
9874 srcstr
= CALL_EXPR_ARG (exp
, 1);
9875 objsize
= CALL_EXPR_ARG (exp
, 2);
9878 case BUILT_IN_STRNCAT_CHK
:
9879 catstr
= CALL_EXPR_ARG (exp
, 0);
9880 srcstr
= CALL_EXPR_ARG (exp
, 1);
9881 maxread
= CALL_EXPR_ARG (exp
, 2);
9882 objsize
= CALL_EXPR_ARG (exp
, 3);
9885 case BUILT_IN_STRNCPY_CHK
:
9886 case BUILT_IN_STPNCPY_CHK
:
9887 srcstr
= CALL_EXPR_ARG (exp
, 1);
9888 size
= CALL_EXPR_ARG (exp
, 2);
9889 objsize
= CALL_EXPR_ARG (exp
, 3);
9892 case BUILT_IN_SNPRINTF_CHK
:
9893 case BUILT_IN_VSNPRINTF_CHK
:
9894 maxread
= CALL_EXPR_ARG (exp
, 1);
9895 objsize
= CALL_EXPR_ARG (exp
, 3);
9901 if (catstr
&& maxread
)
9903 /* Check __strncat_chk. There is no way to determine the length
9904 of the string to which the source string is being appended so
9905 just warn when the length of the source string is not known. */
9906 check_strncat_sizes (exp
, objsize
);
9910 /* The destination argument is the first one for all built-ins above. */
9911 tree dst
= CALL_EXPR_ARG (exp
, 0);
9913 check_access (exp
, dst
, srcstr
, size
, maxread
, srcstr
, objsize
);
9916 /* Emit warning if a buffer overflow is detected at compile time
9917 in __sprintf_chk/__vsprintf_chk calls. */
9920 maybe_emit_sprintf_chk_warning (tree exp
, enum built_in_function fcode
)
9922 tree size
, len
, fmt
;
9923 const char *fmt_str
;
9924 int nargs
= call_expr_nargs (exp
);
9926 /* Verify the required arguments in the original call. */
9930 size
= CALL_EXPR_ARG (exp
, 2);
9931 fmt
= CALL_EXPR_ARG (exp
, 3);
9933 if (! tree_fits_uhwi_p (size
) || integer_all_onesp (size
))
9936 /* Check whether the format is a literal string constant. */
9937 fmt_str
= c_getstr (fmt
);
9938 if (fmt_str
== NULL
)
9941 if (!init_target_chars ())
9944 /* If the format doesn't contain % args or %%, we know its size. */
9945 if (strchr (fmt_str
, target_percent
) == 0)
9946 len
= build_int_cstu (size_type_node
, strlen (fmt_str
));
9947 /* If the format is "%s" and first ... argument is a string literal,
9949 else if (fcode
== BUILT_IN_SPRINTF_CHK
9950 && strcmp (fmt_str
, target_percent_s
) == 0)
9956 arg
= CALL_EXPR_ARG (exp
, 4);
9957 if (! POINTER_TYPE_P (TREE_TYPE (arg
)))
9960 len
= c_strlen (arg
, 1);
9961 if (!len
|| ! tree_fits_uhwi_p (len
))
9967 /* Add one for the terminating nul. */
9968 len
= fold_build2 (PLUS_EXPR
, TREE_TYPE (len
), len
, size_one_node
);
9970 check_access (exp
, /*dst=*/NULL_TREE
, /*src=*/NULL_TREE
, /*size=*/NULL_TREE
,
9971 /*maxread=*/NULL_TREE
, len
, size
);
9974 /* Emit warning if a free is called with address of a variable. */
9977 maybe_emit_free_warning (tree exp
)
9979 tree arg
= CALL_EXPR_ARG (exp
, 0);
9982 if (TREE_CODE (arg
) != ADDR_EXPR
)
9985 arg
= get_base_address (TREE_OPERAND (arg
, 0));
9986 if (arg
== NULL
|| INDIRECT_REF_P (arg
) || TREE_CODE (arg
) == MEM_REF
)
9989 if (SSA_VAR_P (arg
))
9990 warning_at (tree_nonartificial_location (exp
), OPT_Wfree_nonheap_object
,
9991 "%Kattempt to free a non-heap object %qD", exp
, arg
);
9993 warning_at (tree_nonartificial_location (exp
), OPT_Wfree_nonheap_object
,
9994 "%Kattempt to free a non-heap object", exp
);
9997 /* Fold a call to __builtin_object_size with arguments PTR and OST,
10001 fold_builtin_object_size (tree ptr
, tree ost
)
10003 unsigned HOST_WIDE_INT bytes
;
10004 int object_size_type
;
10006 if (!validate_arg (ptr
, POINTER_TYPE
)
10007 || !validate_arg (ost
, INTEGER_TYPE
))
10012 if (TREE_CODE (ost
) != INTEGER_CST
10013 || tree_int_cst_sgn (ost
) < 0
10014 || compare_tree_int (ost
, 3) > 0)
10017 object_size_type
= tree_to_shwi (ost
);
10019 /* __builtin_object_size doesn't evaluate side-effects in its arguments;
10020 if there are any side-effects, it returns (size_t) -1 for types 0 and 1
10021 and (size_t) 0 for types 2 and 3. */
10022 if (TREE_SIDE_EFFECTS (ptr
))
10023 return build_int_cst_type (size_type_node
, object_size_type
< 2 ? -1 : 0);
10025 if (TREE_CODE (ptr
) == ADDR_EXPR
)
10027 compute_builtin_object_size (ptr
, object_size_type
, &bytes
);
10028 if (wi::fits_to_tree_p (bytes
, size_type_node
))
10029 return build_int_cstu (size_type_node
, bytes
);
10031 else if (TREE_CODE (ptr
) == SSA_NAME
)
10033 /* If object size is not known yet, delay folding until
10034 later. Maybe subsequent passes will help determining
10036 if (compute_builtin_object_size (ptr
, object_size_type
, &bytes
)
10037 && wi::fits_to_tree_p (bytes
, size_type_node
))
10038 return build_int_cstu (size_type_node
, bytes
);
10044 /* Builtins with folding operations that operate on "..." arguments
10045 need special handling; we need to store the arguments in a convenient
10046 data structure before attempting any folding. Fortunately there are
10047 only a few builtins that fall into this category. FNDECL is the
10048 function, EXP is the CALL_EXPR for the call. */
10051 fold_builtin_varargs (location_t loc
, tree fndecl
, tree
*args
, int nargs
)
10053 enum built_in_function fcode
= DECL_FUNCTION_CODE (fndecl
);
10054 tree ret
= NULL_TREE
;
10058 case BUILT_IN_FPCLASSIFY
:
10059 ret
= fold_builtin_fpclassify (loc
, args
, nargs
);
10067 ret
= build1 (NOP_EXPR
, TREE_TYPE (ret
), ret
);
10068 SET_EXPR_LOCATION (ret
, loc
);
10069 TREE_NO_WARNING (ret
) = 1;
10075 /* Initialize format string characters in the target charset. */
10078 init_target_chars (void)
10083 target_newline
= lang_hooks
.to_target_charset ('\n');
10084 target_percent
= lang_hooks
.to_target_charset ('%');
10085 target_c
= lang_hooks
.to_target_charset ('c');
10086 target_s
= lang_hooks
.to_target_charset ('s');
10087 if (target_newline
== 0 || target_percent
== 0 || target_c
== 0
10091 target_percent_c
[0] = target_percent
;
10092 target_percent_c
[1] = target_c
;
10093 target_percent_c
[2] = '\0';
10095 target_percent_s
[0] = target_percent
;
10096 target_percent_s
[1] = target_s
;
10097 target_percent_s
[2] = '\0';
10099 target_percent_s_newline
[0] = target_percent
;
10100 target_percent_s_newline
[1] = target_s
;
10101 target_percent_s_newline
[2] = target_newline
;
10102 target_percent_s_newline
[3] = '\0';
10109 /* Helper function for do_mpfr_arg*(). Ensure M is a normal number
10110 and no overflow/underflow occurred. INEXACT is true if M was not
10111 exactly calculated. TYPE is the tree type for the result. This
10112 function assumes that you cleared the MPFR flags and then
10113 calculated M to see if anything subsequently set a flag prior to
10114 entering this function. Return NULL_TREE if any checks fail. */
10117 do_mpfr_ckconv (mpfr_srcptr m
, tree type
, int inexact
)
10119 /* Proceed iff we get a normal number, i.e. not NaN or Inf and no
10120 overflow/underflow occurred. If -frounding-math, proceed iff the
10121 result of calling FUNC was exact. */
10122 if (mpfr_number_p (m
) && !mpfr_overflow_p () && !mpfr_underflow_p ()
10123 && (!flag_rounding_math
|| !inexact
))
10125 REAL_VALUE_TYPE rr
;
10127 real_from_mpfr (&rr
, m
, type
, GMP_RNDN
);
10128 /* Proceed iff GCC's REAL_VALUE_TYPE can hold the MPFR value,
10129 check for overflow/underflow. If the REAL_VALUE_TYPE is zero
10130 but the mpft_t is not, then we underflowed in the
10132 if (real_isfinite (&rr
)
10133 && (rr
.cl
== rvc_zero
) == (mpfr_zero_p (m
) != 0))
10135 REAL_VALUE_TYPE rmode
;
10137 real_convert (&rmode
, TYPE_MODE (type
), &rr
);
10138 /* Proceed iff the specified mode can hold the value. */
10139 if (real_identical (&rmode
, &rr
))
10140 return build_real (type
, rmode
);
10146 /* Helper function for do_mpc_arg*(). Ensure M is a normal complex
10147 number and no overflow/underflow occurred. INEXACT is true if M
10148 was not exactly calculated. TYPE is the tree type for the result.
10149 This function assumes that you cleared the MPFR flags and then
10150 calculated M to see if anything subsequently set a flag prior to
10151 entering this function. Return NULL_TREE if any checks fail, if
10152 FORCE_CONVERT is true, then bypass the checks. */
10155 do_mpc_ckconv (mpc_srcptr m
, tree type
, int inexact
, int force_convert
)
10157 /* Proceed iff we get a normal number, i.e. not NaN or Inf and no
10158 overflow/underflow occurred. If -frounding-math, proceed iff the
10159 result of calling FUNC was exact. */
10161 || (mpfr_number_p (mpc_realref (m
)) && mpfr_number_p (mpc_imagref (m
))
10162 && !mpfr_overflow_p () && !mpfr_underflow_p ()
10163 && (!flag_rounding_math
|| !inexact
)))
10165 REAL_VALUE_TYPE re
, im
;
10167 real_from_mpfr (&re
, mpc_realref (m
), TREE_TYPE (type
), GMP_RNDN
);
10168 real_from_mpfr (&im
, mpc_imagref (m
), TREE_TYPE (type
), GMP_RNDN
);
10169 /* Proceed iff GCC's REAL_VALUE_TYPE can hold the MPFR values,
10170 check for overflow/underflow. If the REAL_VALUE_TYPE is zero
10171 but the mpft_t is not, then we underflowed in the
10174 || (real_isfinite (&re
) && real_isfinite (&im
)
10175 && (re
.cl
== rvc_zero
) == (mpfr_zero_p (mpc_realref (m
)) != 0)
10176 && (im
.cl
== rvc_zero
) == (mpfr_zero_p (mpc_imagref (m
)) != 0)))
10178 REAL_VALUE_TYPE re_mode
, im_mode
;
10180 real_convert (&re_mode
, TYPE_MODE (TREE_TYPE (type
)), &re
);
10181 real_convert (&im_mode
, TYPE_MODE (TREE_TYPE (type
)), &im
);
10182 /* Proceed iff the specified mode can hold the value. */
10184 || (real_identical (&re_mode
, &re
)
10185 && real_identical (&im_mode
, &im
)))
10186 return build_complex (type
, build_real (TREE_TYPE (type
), re_mode
),
10187 build_real (TREE_TYPE (type
), im_mode
));
10193 /* If arguments ARG0 and ARG1 are REAL_CSTs, call mpfr_remquo() to set
10194 the pointer *(ARG_QUO) and return the result. The type is taken
10195 from the type of ARG0 and is used for setting the precision of the
10196 calculation and results. */
10199 do_mpfr_remquo (tree arg0
, tree arg1
, tree arg_quo
)
10201 tree
const type
= TREE_TYPE (arg0
);
10202 tree result
= NULL_TREE
;
10207 /* To proceed, MPFR must exactly represent the target floating point
10208 format, which only happens when the target base equals two. */
10209 if (REAL_MODE_FORMAT (TYPE_MODE (type
))->b
== 2
10210 && TREE_CODE (arg0
) == REAL_CST
&& !TREE_OVERFLOW (arg0
)
10211 && TREE_CODE (arg1
) == REAL_CST
&& !TREE_OVERFLOW (arg1
))
10213 const REAL_VALUE_TYPE
*const ra0
= TREE_REAL_CST_PTR (arg0
);
10214 const REAL_VALUE_TYPE
*const ra1
= TREE_REAL_CST_PTR (arg1
);
10216 if (real_isfinite (ra0
) && real_isfinite (ra1
))
10218 const struct real_format
*fmt
= REAL_MODE_FORMAT (TYPE_MODE (type
));
10219 const int prec
= fmt
->p
;
10220 const mp_rnd_t rnd
= fmt
->round_towards_zero
? GMP_RNDZ
: GMP_RNDN
;
10225 mpfr_inits2 (prec
, m0
, m1
, NULL
);
10226 mpfr_from_real (m0
, ra0
, GMP_RNDN
);
10227 mpfr_from_real (m1
, ra1
, GMP_RNDN
);
10228 mpfr_clear_flags ();
10229 mpfr_remquo (m0
, &integer_quo
, m0
, m1
, rnd
);
10230 /* Remquo is independent of the rounding mode, so pass
10231 inexact=0 to do_mpfr_ckconv(). */
10232 result_rem
= do_mpfr_ckconv (m0
, type
, /*inexact=*/ 0);
10233 mpfr_clears (m0
, m1
, NULL
);
10236 /* MPFR calculates quo in the host's long so it may
10237 return more bits in quo than the target int can hold
10238 if sizeof(host long) > sizeof(target int). This can
10239 happen even for native compilers in LP64 mode. In
10240 these cases, modulo the quo value with the largest
10241 number that the target int can hold while leaving one
10242 bit for the sign. */
10243 if (sizeof (integer_quo
) * CHAR_BIT
> INT_TYPE_SIZE
)
10244 integer_quo
%= (long)(1UL << (INT_TYPE_SIZE
- 1));
10246 /* Dereference the quo pointer argument. */
10247 arg_quo
= build_fold_indirect_ref (arg_quo
);
10248 /* Proceed iff a valid pointer type was passed in. */
10249 if (TYPE_MAIN_VARIANT (TREE_TYPE (arg_quo
)) == integer_type_node
)
10251 /* Set the value. */
10253 = fold_build2 (MODIFY_EXPR
, TREE_TYPE (arg_quo
), arg_quo
,
10254 build_int_cst (TREE_TYPE (arg_quo
),
10256 TREE_SIDE_EFFECTS (result_quo
) = 1;
10257 /* Combine the quo assignment with the rem. */
10258 result
= non_lvalue (fold_build2 (COMPOUND_EXPR
, type
,
10259 result_quo
, result_rem
));
10267 /* If ARG is a REAL_CST, call mpfr_lgamma() on it and return the
10268 resulting value as a tree with type TYPE. The mpfr precision is
10269 set to the precision of TYPE. We assume that this mpfr function
10270 returns zero if the result could be calculated exactly within the
10271 requested precision. In addition, the integer pointer represented
10272 by ARG_SG will be dereferenced and set to the appropriate signgam
10276 do_mpfr_lgamma_r (tree arg
, tree arg_sg
, tree type
)
10278 tree result
= NULL_TREE
;
10282 /* To proceed, MPFR must exactly represent the target floating point
10283 format, which only happens when the target base equals two. Also
10284 verify ARG is a constant and that ARG_SG is an int pointer. */
10285 if (REAL_MODE_FORMAT (TYPE_MODE (type
))->b
== 2
10286 && TREE_CODE (arg
) == REAL_CST
&& !TREE_OVERFLOW (arg
)
10287 && TREE_CODE (TREE_TYPE (arg_sg
)) == POINTER_TYPE
10288 && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (arg_sg
))) == integer_type_node
)
10290 const REAL_VALUE_TYPE
*const ra
= TREE_REAL_CST_PTR (arg
);
10292 /* In addition to NaN and Inf, the argument cannot be zero or a
10293 negative integer. */
10294 if (real_isfinite (ra
)
10295 && ra
->cl
!= rvc_zero
10296 && !(real_isneg (ra
) && real_isinteger (ra
, TYPE_MODE (type
))))
10298 const struct real_format
*fmt
= REAL_MODE_FORMAT (TYPE_MODE (type
));
10299 const int prec
= fmt
->p
;
10300 const mp_rnd_t rnd
= fmt
->round_towards_zero
? GMP_RNDZ
: GMP_RNDN
;
10305 mpfr_init2 (m
, prec
);
10306 mpfr_from_real (m
, ra
, GMP_RNDN
);
10307 mpfr_clear_flags ();
10308 inexact
= mpfr_lgamma (m
, &sg
, m
, rnd
);
10309 result_lg
= do_mpfr_ckconv (m
, type
, inexact
);
10315 /* Dereference the arg_sg pointer argument. */
10316 arg_sg
= build_fold_indirect_ref (arg_sg
);
10317 /* Assign the signgam value into *arg_sg. */
10318 result_sg
= fold_build2 (MODIFY_EXPR
,
10319 TREE_TYPE (arg_sg
), arg_sg
,
10320 build_int_cst (TREE_TYPE (arg_sg
), sg
));
10321 TREE_SIDE_EFFECTS (result_sg
) = 1;
10322 /* Combine the signgam assignment with the lgamma result. */
10323 result
= non_lvalue (fold_build2 (COMPOUND_EXPR
, type
,
10324 result_sg
, result_lg
));
10332 /* If arguments ARG0 and ARG1 are a COMPLEX_CST, call the two-argument
10333 mpc function FUNC on it and return the resulting value as a tree
10334 with type TYPE. The mpfr precision is set to the precision of
10335 TYPE. We assume that function FUNC returns zero if the result
10336 could be calculated exactly within the requested precision. If
10337 DO_NONFINITE is true, then fold expressions containing Inf or NaN
10338 in the arguments and/or results. */
10341 do_mpc_arg2 (tree arg0
, tree arg1
, tree type
, int do_nonfinite
,
10342 int (*func
)(mpc_ptr
, mpc_srcptr
, mpc_srcptr
, mpc_rnd_t
))
10344 tree result
= NULL_TREE
;
10349 /* To proceed, MPFR must exactly represent the target floating point
10350 format, which only happens when the target base equals two. */
10351 if (TREE_CODE (arg0
) == COMPLEX_CST
&& !TREE_OVERFLOW (arg0
)
10352 && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0
))) == REAL_TYPE
10353 && TREE_CODE (arg1
) == COMPLEX_CST
&& !TREE_OVERFLOW (arg1
)
10354 && TREE_CODE (TREE_TYPE (TREE_TYPE (arg1
))) == REAL_TYPE
10355 && REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0
))))->b
== 2)
10357 const REAL_VALUE_TYPE
*const re0
= TREE_REAL_CST_PTR (TREE_REALPART (arg0
));
10358 const REAL_VALUE_TYPE
*const im0
= TREE_REAL_CST_PTR (TREE_IMAGPART (arg0
));
10359 const REAL_VALUE_TYPE
*const re1
= TREE_REAL_CST_PTR (TREE_REALPART (arg1
));
10360 const REAL_VALUE_TYPE
*const im1
= TREE_REAL_CST_PTR (TREE_IMAGPART (arg1
));
10363 || (real_isfinite (re0
) && real_isfinite (im0
)
10364 && real_isfinite (re1
) && real_isfinite (im1
)))
10366 const struct real_format
*const fmt
=
10367 REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (type
)));
10368 const int prec
= fmt
->p
;
10369 const mp_rnd_t rnd
= fmt
->round_towards_zero
? GMP_RNDZ
: GMP_RNDN
;
10370 const mpc_rnd_t crnd
= fmt
->round_towards_zero
? MPC_RNDZZ
: MPC_RNDNN
;
10374 mpc_init2 (m0
, prec
);
10375 mpc_init2 (m1
, prec
);
10376 mpfr_from_real (mpc_realref (m0
), re0
, rnd
);
10377 mpfr_from_real (mpc_imagref (m0
), im0
, rnd
);
10378 mpfr_from_real (mpc_realref (m1
), re1
, rnd
);
10379 mpfr_from_real (mpc_imagref (m1
), im1
, rnd
);
10380 mpfr_clear_flags ();
10381 inexact
= func (m0
, m0
, m1
, crnd
);
10382 result
= do_mpc_ckconv (m0
, type
, inexact
, do_nonfinite
);
10391 /* A wrapper function for builtin folding that prevents warnings for
10392 "statement without effect" and the like, caused by removing the
10393 call node earlier than the warning is generated. */
10396 fold_call_stmt (gcall
*stmt
, bool ignore
)
10398 tree ret
= NULL_TREE
;
10399 tree fndecl
= gimple_call_fndecl (stmt
);
10400 location_t loc
= gimple_location (stmt
);
10402 && TREE_CODE (fndecl
) == FUNCTION_DECL
10403 && DECL_BUILT_IN (fndecl
)
10404 && !gimple_call_va_arg_pack_p (stmt
))
10406 int nargs
= gimple_call_num_args (stmt
);
10407 tree
*args
= (nargs
> 0
10408 ? gimple_call_arg_ptr (stmt
, 0)
10409 : &error_mark_node
);
10411 if (avoid_folding_inline_builtin (fndecl
))
10413 if (DECL_BUILT_IN_CLASS (fndecl
) == BUILT_IN_MD
)
10415 return targetm
.fold_builtin (fndecl
, nargs
, args
, ignore
);
10419 ret
= fold_builtin_n (loc
, fndecl
, args
, nargs
, ignore
);
10422 /* Propagate location information from original call to
10423 expansion of builtin. Otherwise things like
10424 maybe_emit_chk_warning, that operate on the expansion
10425 of a builtin, will use the wrong location information. */
10426 if (gimple_has_location (stmt
))
10428 tree realret
= ret
;
10429 if (TREE_CODE (ret
) == NOP_EXPR
)
10430 realret
= TREE_OPERAND (ret
, 0);
10431 if (CAN_HAVE_LOCATION_P (realret
)
10432 && !EXPR_HAS_LOCATION (realret
))
10433 SET_EXPR_LOCATION (realret
, loc
);
10443 /* Look up the function in builtin_decl that corresponds to DECL
10444 and set ASMSPEC as its user assembler name. DECL must be a
10445 function decl that declares a builtin. */
10448 set_builtin_user_assembler_name (tree decl
, const char *asmspec
)
10450 gcc_assert (TREE_CODE (decl
) == FUNCTION_DECL
10451 && DECL_BUILT_IN_CLASS (decl
) == BUILT_IN_NORMAL
10454 tree builtin
= builtin_decl_explicit (DECL_FUNCTION_CODE (decl
));
10455 set_user_assembler_name (builtin
, asmspec
);
10457 if (DECL_FUNCTION_CODE (decl
) == BUILT_IN_FFS
10458 && INT_TYPE_SIZE
< BITS_PER_WORD
)
10460 scalar_int_mode mode
= int_mode_for_size (INT_TYPE_SIZE
, 0).require ();
10461 set_user_assembler_libfunc ("ffs", asmspec
);
10462 set_optab_libfunc (ffs_optab
, mode
, "ffs");
10466 /* Return true if DECL is a builtin that expands to a constant or similarly
10469 is_simple_builtin (tree decl
)
10471 if (decl
&& DECL_BUILT_IN_CLASS (decl
) == BUILT_IN_NORMAL
)
10472 switch (DECL_FUNCTION_CODE (decl
))
10474 /* Builtins that expand to constants. */
10475 case BUILT_IN_CONSTANT_P
:
10476 case BUILT_IN_EXPECT
:
10477 case BUILT_IN_OBJECT_SIZE
:
10478 case BUILT_IN_UNREACHABLE
:
10479 /* Simple register moves or loads from stack. */
10480 case BUILT_IN_ASSUME_ALIGNED
:
10481 case BUILT_IN_RETURN_ADDRESS
:
10482 case BUILT_IN_EXTRACT_RETURN_ADDR
:
10483 case BUILT_IN_FROB_RETURN_ADDR
:
10484 case BUILT_IN_RETURN
:
10485 case BUILT_IN_AGGREGATE_INCOMING_ADDRESS
:
10486 case BUILT_IN_FRAME_ADDRESS
:
10487 case BUILT_IN_VA_END
:
10488 case BUILT_IN_STACK_SAVE
:
10489 case BUILT_IN_STACK_RESTORE
:
10490 /* Exception state returns or moves registers around. */
10491 case BUILT_IN_EH_FILTER
:
10492 case BUILT_IN_EH_POINTER
:
10493 case BUILT_IN_EH_COPY_VALUES
:
10503 /* Return true if DECL is a builtin that is not expensive, i.e., they are
10504 most probably expanded inline into reasonably simple code. This is a
10505 superset of is_simple_builtin. */
10507 is_inexpensive_builtin (tree decl
)
10511 else if (DECL_BUILT_IN_CLASS (decl
) == BUILT_IN_MD
)
10513 else if (DECL_BUILT_IN_CLASS (decl
) == BUILT_IN_NORMAL
)
10514 switch (DECL_FUNCTION_CODE (decl
))
10517 CASE_BUILT_IN_ALLOCA
:
10518 case BUILT_IN_BSWAP16
:
10519 case BUILT_IN_BSWAP32
:
10520 case BUILT_IN_BSWAP64
:
10522 case BUILT_IN_CLZIMAX
:
10523 case BUILT_IN_CLZL
:
10524 case BUILT_IN_CLZLL
:
10526 case BUILT_IN_CTZIMAX
:
10527 case BUILT_IN_CTZL
:
10528 case BUILT_IN_CTZLL
:
10530 case BUILT_IN_FFSIMAX
:
10531 case BUILT_IN_FFSL
:
10532 case BUILT_IN_FFSLL
:
10533 case BUILT_IN_IMAXABS
:
10534 case BUILT_IN_FINITE
:
10535 case BUILT_IN_FINITEF
:
10536 case BUILT_IN_FINITEL
:
10537 case BUILT_IN_FINITED32
:
10538 case BUILT_IN_FINITED64
:
10539 case BUILT_IN_FINITED128
:
10540 case BUILT_IN_FPCLASSIFY
:
10541 case BUILT_IN_ISFINITE
:
10542 case BUILT_IN_ISINF_SIGN
:
10543 case BUILT_IN_ISINF
:
10544 case BUILT_IN_ISINFF
:
10545 case BUILT_IN_ISINFL
:
10546 case BUILT_IN_ISINFD32
:
10547 case BUILT_IN_ISINFD64
:
10548 case BUILT_IN_ISINFD128
:
10549 case BUILT_IN_ISNAN
:
10550 case BUILT_IN_ISNANF
:
10551 case BUILT_IN_ISNANL
:
10552 case BUILT_IN_ISNAND32
:
10553 case BUILT_IN_ISNAND64
:
10554 case BUILT_IN_ISNAND128
:
10555 case BUILT_IN_ISNORMAL
:
10556 case BUILT_IN_ISGREATER
:
10557 case BUILT_IN_ISGREATEREQUAL
:
10558 case BUILT_IN_ISLESS
:
10559 case BUILT_IN_ISLESSEQUAL
:
10560 case BUILT_IN_ISLESSGREATER
:
10561 case BUILT_IN_ISUNORDERED
:
10562 case BUILT_IN_VA_ARG_PACK
:
10563 case BUILT_IN_VA_ARG_PACK_LEN
:
10564 case BUILT_IN_VA_COPY
:
10565 case BUILT_IN_TRAP
:
10566 case BUILT_IN_SAVEREGS
:
10567 case BUILT_IN_POPCOUNTL
:
10568 case BUILT_IN_POPCOUNTLL
:
10569 case BUILT_IN_POPCOUNTIMAX
:
10570 case BUILT_IN_POPCOUNT
:
10571 case BUILT_IN_PARITYL
:
10572 case BUILT_IN_PARITYLL
:
10573 case BUILT_IN_PARITYIMAX
:
10574 case BUILT_IN_PARITY
:
10575 case BUILT_IN_LABS
:
10576 case BUILT_IN_LLABS
:
10577 case BUILT_IN_PREFETCH
:
10578 case BUILT_IN_ACC_ON_DEVICE
:
10582 return is_simple_builtin (decl
);
10588 /* Return true if T is a constant and the value cast to a target char
10589 can be represented by a host char.
10590 Store the casted char constant in *P if so. */
10593 target_char_cst_p (tree t
, char *p
)
10595 if (!tree_fits_uhwi_p (t
) || CHAR_TYPE_SIZE
!= HOST_BITS_PER_CHAR
)
10598 *p
= (char)tree_to_uhwi (t
);
10602 /* Return the maximum object size. */
10605 max_object_size (void)
10607 /* To do: Make this a configurable parameter. */
10608 return TYPE_MAX_VALUE (ptrdiff_type_node
);