]>
Commit | Line | Data |
---|---|---|
fa19795e | 1 | /* Expand builtin functions. |
8d9254fc | 2 | Copyright (C) 1988-2020 Free Software Foundation, Inc. |
fa19795e RS |
3 | |
4 | This file is part of GCC. | |
5 | ||
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 | |
9 | version. | |
10 | ||
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 | |
14 | for more details. | |
15 | ||
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/>. */ | |
19 | ||
20 | #ifndef GCC_BUILTINS_H | |
21 | #define GCC_BUILTINS_H | |
22 | ||
9b2b7279 AM |
23 | #include <mpc.h> |
24 | ||
fa19795e RS |
25 | /* Target-dependent globals. */ |
26 | struct target_builtins { | |
27 | /* For each register that may be used for calling a function, this | |
28 | gives a mode used to copy the register's value. VOIDmode indicates | |
29 | the register is not used for calling a function. If the machine | |
30 | has register windows, this gives only the outbound registers. | |
31 | INCOMING_REGNO gives the corresponding inbound register. */ | |
b660eccf | 32 | fixed_size_mode_pod x_apply_args_mode[FIRST_PSEUDO_REGISTER]; |
fa19795e RS |
33 | |
34 | /* For each register that may be used for returning values, this gives | |
35 | a mode used to copy the register's value. VOIDmode indicates the | |
36 | register is not used for returning values. If the machine has | |
37 | register windows, this gives only the outbound registers. | |
38 | INCOMING_REGNO gives the corresponding inbound register. */ | |
b660eccf | 39 | fixed_size_mode_pod x_apply_result_mode[FIRST_PSEUDO_REGISTER]; |
fa19795e RS |
40 | }; |
41 | ||
1942d1a9 | 42 | extern struct target_builtins default_target_builtins; |
fa19795e RS |
43 | #if SWITCHABLE_TARGET |
44 | extern struct target_builtins *this_target_builtins; | |
45 | #else | |
46 | #define this_target_builtins (&default_target_builtins) | |
47 | #endif | |
48 | ||
9b2b7279 AM |
49 | /* Non-zero if __builtin_constant_p should be folded right away. */ |
50 | extern bool force_folding_builtin_constant_p; | |
51 | ||
4cfe7a6c | 52 | extern bool called_as_built_in (tree); |
9b2b7279 AM |
53 | extern bool get_object_alignment_1 (tree, unsigned int *, |
54 | unsigned HOST_WIDE_INT *); | |
55 | extern unsigned int get_object_alignment (tree); | |
56 | extern bool get_pointer_alignment_1 (tree, unsigned int *, | |
57 | unsigned HOST_WIDE_INT *); | |
58 | extern unsigned int get_pointer_alignment (tree); | |
bfb9bd47 | 59 | extern unsigned string_length (const void*, unsigned, unsigned); |
b71bbbe2 | 60 | |
7d583f42 JL |
61 | struct c_strlen_data |
62 | { | |
b71bbbe2 MS |
63 | /* [MINLEN, MAXBOUND, MAXLEN] is a range describing the length of |
64 | one or more strings of possibly unknown length. For a single | |
65 | string of known length the range is a constant where | |
66 | MINLEN == MAXBOUND == MAXLEN holds. | |
67 | For other strings, MINLEN is the length of the shortest known | |
68 | string. MAXBOUND is the length of a string that could be stored | |
69 | in the largest array referenced by the expression. MAXLEN is | |
70 | the length of the longest sequence of non-zero bytes | |
71 | in an object referenced by the expression. For such strings, | |
72 | MINLEN <= MAXBOUND <= MAXLEN holds. For example, given: | |
73 | struct A { char a[7], b[]; }; | |
74 | extern struct A *p; | |
75 | n = strlen (p->a); | |
76 | the computed range will be [0, 6, ALL_ONES]. | |
77 | However, for a conditional expression involving a string | |
78 | of known length and an array of unknown bound such as | |
79 | n = strlen (i ? p->b : "123"); | |
80 | the range will be [3, 3, ALL_ONES]. | |
81 | MINLEN != 0 && MAXLEN == ALL_ONES indicates that MINLEN is | |
82 | the length of the shortest known string and implies that | |
83 | the shortest possible string referenced by the expression may | |
84 | actually be the empty string. This distinction is useful for | |
85 | diagnostics. get_range_strlen() return value distinguishes | |
86 | between these two cases. | |
87 | As the tighter (and more optimistic) bound, MAXBOUND is suitable | |
88 | for diagnostics but not for optimization. | |
89 | As the more conservative bound, MAXLEN is intended to be used | |
90 | for optimization. */ | |
91 | tree minlen; | |
92 | tree maxlen; | |
93 | tree maxbound; | |
b5338fb3 | 94 | /* When non-null, DECL refers to the declaration known to store |
b71bbbe2 MS |
95 | an unterminated constant character array, as in: |
96 | const char s[] = { 'a', 'b', 'c' }; | |
97 | It is used to diagnose uses of such arrays in functions such as | |
98 | strlen() that expect a nul-terminated string as an argument. */ | |
7d583f42 | 99 | tree decl; |
b71bbbe2 MS |
100 | /* Non-constant offset from the beginning of a string not accounted |
101 | for in the length range. Used to improve diagnostics. */ | |
7d583f42 JL |
102 | tree off; |
103 | }; | |
104 | ||
105 | extern tree c_strlen (tree, int, c_strlen_data * = NULL, unsigned = 1); | |
3140b2ed | 106 | extern rtx c_readstr (const char *, scalar_int_mode, bool = true); |
9b2b7279 AM |
107 | extern void expand_builtin_setjmp_setup (rtx, rtx); |
108 | extern void expand_builtin_setjmp_receiver (rtx); | |
d33606c3 | 109 | extern void expand_builtin_update_setjmp_buf (rtx); |
9b2b7279 | 110 | extern tree mathfn_built_in (tree, enum built_in_function fn); |
b03ff92e | 111 | extern tree mathfn_built_in (tree, combined_fn); |
095a2d76 RS |
112 | extern rtx builtin_strncpy_read_str (void *, HOST_WIDE_INT, scalar_int_mode); |
113 | extern rtx builtin_memset_read_str (void *, HOST_WIDE_INT, scalar_int_mode); | |
9b2b7279 AM |
114 | extern rtx expand_builtin_saveregs (void); |
115 | extern tree std_build_builtin_va_list (void); | |
116 | extern tree std_fn_abi_va_list (tree); | |
117 | extern tree std_canonical_va_list_type (tree); | |
118 | extern void std_expand_builtin_va_start (tree, rtx); | |
119 | extern void expand_builtin_trap (void); | |
adedd5c1 | 120 | extern void expand_ifn_atomic_bit_test_and (gcall *); |
849a76a5 | 121 | extern void expand_ifn_atomic_compare_exchange (gcall *); |
ef4bddc2 | 122 | extern rtx expand_builtin (tree, rtx, rtx, machine_mode, int); |
9b2b7279 | 123 | extern enum built_in_function builtin_mathfn_code (const_tree); |
1e9168b2 | 124 | extern tree fold_builtin_expect (location_t, tree, tree, tree, tree); |
9b2b7279 AM |
125 | extern bool avoid_folding_inline_builtin (tree); |
126 | extern tree fold_call_expr (location_t, tree, bool); | |
127 | extern tree fold_builtin_call_array (location_t, tree, tree, int, tree *); | |
538dd0b7 | 128 | extern bool validate_gimple_arglist (const gcall *, ...); |
ef4bddc2 | 129 | extern rtx default_expand_builtin (tree, rtx, rtx, machine_mode, int); |
9b2b7279 | 130 | extern bool fold_builtin_next_arg (tree, bool); |
9b2b7279 | 131 | extern tree do_mpc_arg2 (tree, tree, tree, int, int (*)(mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t)); |
538dd0b7 | 132 | extern tree fold_call_stmt (gcall *, bool); |
9b2b7279 AM |
133 | extern void set_builtin_user_assembler_name (tree decl, const char *asmspec); |
134 | extern bool is_simple_builtin (tree); | |
135 | extern bool is_inexpensive_builtin (tree); | |
ef29b12c MS |
136 | |
137 | class vr_values; | |
138 | tree gimple_call_alloc_size (gimple *, wide_int[2] = NULL, | |
139 | const vr_values * = NULL); | |
140 | extern tree compute_objsize (tree, int, tree * = NULL, tree * = NULL, | |
141 | const vr_values * = NULL); | |
1fe37220 | 142 | |
fef5a0d9 | 143 | extern bool readonly_data_expr (tree exp); |
fef5a0d9 | 144 | extern bool init_target_chars (void); |
ad03a744 | 145 | extern unsigned HOST_WIDE_INT target_newline; |
fef5a0d9 RB |
146 | extern unsigned HOST_WIDE_INT target_percent; |
147 | extern char target_percent_s[3]; | |
edd7ae68 | 148 | extern char target_percent_c[3]; |
ad03a744 | 149 | extern char target_percent_s_newline[4]; |
488c6247 | 150 | extern bool target_char_cst_p (tree t, char *p); |
fef5a0d9 | 151 | |
686ee971 RS |
152 | extern internal_fn associated_internal_fn (tree); |
153 | extern internal_fn replacement_internal_fn (gcall *); | |
154 | ||
a2c2cee9 | 155 | extern bool check_nul_terminated_array (tree, tree, tree = NULL_TREE); |
6ab24ea8 | 156 | extern void warn_string_no_nul (location_t, const char *, tree, tree); |
6c4aa5f6 | 157 | extern tree unterminated_array (tree, tree * = NULL, bool * = NULL); |
5747e0c0 | 158 | extern bool builtin_with_linkage_p (tree); |
54aa6b58 | 159 | |
a2c2cee9 MS |
160 | /* Describes a reference to an object used in an access. */ |
161 | struct access_ref | |
162 | { | |
163 | access_ref (): ref () | |
164 | { | |
165 | /* Set to valid. */ | |
166 | offrng[0] = offrng[1] = 0; | |
167 | /* Invalidate. */ | |
168 | sizrng[0] = sizrng[1] = -1; | |
169 | } | |
170 | ||
171 | /* Reference to the object. */ | |
172 | tree ref; | |
173 | ||
174 | /* Range of offsets into and sizes of the object(s). */ | |
175 | offset_int offrng[2]; | |
176 | offset_int sizrng[2]; | |
177 | }; | |
178 | ||
179 | /* Describes a pair of references used in an access by built-in | |
180 | functions like memcpy. */ | |
181 | struct access_data | |
182 | { | |
183 | /* Destination and source of the access. */ | |
184 | access_ref dst, src; | |
185 | }; | |
186 | ||
187 | extern bool check_access (tree, tree, tree, tree, tree, tree, tree, | |
188 | bool = true, const access_data * = NULL); | |
cc8bea0a MS |
189 | |
190 | #endif /* GCC_BUILTINS_H */ |