]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/genconditions.c
PR testsuite/92016 - Excess errors in Wstringop-overflow-17.c
[thirdparty/gcc.git] / gcc / genconditions.c
CommitLineData
b70bd542 1/* Process machine description and calculate constant conditions.
fbd26352 2 Copyright (C) 2001-2019 Free Software Foundation, Inc.
b70bd542 3
5a8b6e6a 4 This file is part of GCC.
b70bd542 5
5a8b6e6a 6 GCC is free software; you can redistribute it and/or modify
b70bd542 7 it under the terms of the GNU General Public License as published by
8c4c00c1 8 the Free Software Foundation; either version 3, or (at your option)
b70bd542 9 any later version.
10
5a8b6e6a 11 GCC is distributed in the hope that it will be useful,
b70bd542 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
8c4c00c1 17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
b70bd542 19
20/* In a machine description, all of the insn patterns - define_insn,
21 define_expand, define_split, define_peephole, define_peephole2 -
22 contain an optional C expression which makes the final decision
23 about whether or not this pattern is usable. That expression may
24 turn out to be always false when the compiler is built. If it is,
25 most of the programs that generate code from the machine
26 description can simply ignore the entire pattern. */
27
805e22b2 28#include "bconfig.h"
b70bd542 29#include "system.h"
805e22b2 30#include "coretypes.h"
31#include "tm.h"
b70bd542 32#include "rtl.h"
33#include "errors.h"
960ebfe7 34#include "read-md.h"
b70bd542 35#include "gensupport.h"
36
21dda4ee 37/* so we can include except.h in the generated file. */
b70bd542 38static int saw_eh_return;
39
1a97be37 40static void write_header (void);
41static void write_conditions (void);
42static int write_one_condition (void **, void *);
b70bd542 43
b70bd542 44/* Generate the header for insn-conditions.c. */
45
46static void
1a97be37 47write_header (void)
b70bd542 48{
49 puts ("\
50/* Generated automatically by the program `genconditions' from the target\n\
51 machine description file. */\n\
52\n\
785790dc 53#define IN_TARGET_CODE 1\n\
805e22b2 54#include \"bconfig.h\"\n\
e1b9f860 55#define INCLUDE_STRING\n\
1d752508 56#include \"system.h\"\n\
57\n\
32dea8e6 58/* It is necessary, but not entirely safe, to include the headers below\n\
59 in a generator program. As a defensive measure, don't do so when the\n\
60 table isn't going to have anything in it. */\n\
61#if GCC_VERSION >= 3001\n\
62\n\
b70bd542 63/* Do not allow checking to confuse the issue. */\n\
e138bdcb 64#undef CHECKING_P\n\
65#define CHECKING_P 0\n\
b70bd542 66#undef ENABLE_TREE_CHECKING\n\
67#undef ENABLE_RTL_CHECKING\n\
68#undef ENABLE_RTL_FLAG_CHECKING\n\
69#undef ENABLE_GC_CHECKING\n\
1d752508 70#undef ENABLE_GC_ALWAYS_COLLECT\n\
fb398229 71#define USE_ENUM_MODES\n\
1d752508 72\n\
805e22b2 73#include \"coretypes.h\"\n\
74#include \"tm.h\"\n\
32dea8e6 75#include \"insn-constants.h\"\n\
b70bd542 76#include \"rtl.h\"\n\
ad7b10a2 77#include \"memmodel.h\"\n\
b70bd542 78#include \"tm_p.h\"\n\
a3020f2f 79#include \"hard-reg-set.h\"\n\
1d752508 80#include \"function.h\"\n\
73bde8df 81#include \"emit-rtl.h\"\n\
1d752508 82\n\
b70bd542 83/* Fake - insn-config.h doesn't exist yet. */\n\
84#define MAX_RECOG_OPERANDS 10\n\
85#define MAX_DUP_OPERANDS 10\n\
1d752508 86#define MAX_INSNS_PER_SPLIT 5\n\
87\n\
b70bd542 88#include \"regs.h\"\n\
89#include \"recog.h\"\n\
b70bd542 90#include \"output.h\"\n\
91#include \"flags.h\"\n\
92#include \"hard-reg-set.h\"\n\
94ea8568 93#include \"predict.h\"\n\
94#include \"basic-block.h\"\n\
9ef16211 95#include \"bitmap.h\"\n\
96#include \"df.h\"\n\
b70bd542 97#include \"resource.h\"\n\
c18cb818 98#include \"diagnostic-core.h\"\n\
966eae04 99#include \"reload.h\"\n\
100#include \"tm-constrs.h\"\n");
b70bd542 101
102 if (saw_eh_return)
103 puts ("#define HAVE_eh_return 1");
104 puts ("#include \"except.h\"\n");
105
106 puts ("\
107/* Dummy external declarations. */\n\
bf59a32d 108extern rtx_insn *insn;\n\
b70bd542 109extern rtx ins1;\n\
32dea8e6 110extern rtx operands[];\n\
111\n\
112#endif /* gcc >= 3.0.1 */\n");
b70bd542 113}
114
115/* Write out one entry in the conditions table, using the data pointed
116 to by SLOT. Each entry looks like this:
9e959634 117
118 { "! optimize_size && ! TARGET_READ_MODIFY_WRITE",
119 __builtin_constant_p (! optimize_size && ! TARGET_READ_MODIFY_WRITE)
120 ? (int) (! optimize_size && ! TARGET_READ_MODIFY_WRITE)
121 : -1) }, */
b70bd542 122
123static int
9a03a746 124write_one_condition (void **slot, void * ARG_UNUSED (dummy))
b70bd542 125{
126 const struct c_test *test = * (const struct c_test **) slot;
127 const char *p;
128
e1e9159b 129 rtx_reader_ptr->print_md_ptr_loc (test->expr);
b70bd542 130 fputs (" { \"", stdout);
131 for (p = test->expr; *p; p++)
132 {
32dea8e6 133 switch (*p)
134 {
135 case '\n': fputs ("\\n\\", stdout); break;
136 case '\\':
137 case '\"': putchar ('\\'); break;
138 default: break;
139 }
140 putchar (*p);
b70bd542 141 }
142
1d752508 143 fputs ("\",\n __builtin_constant_p ", stdout);
e1e9159b 144 rtx_reader_ptr->print_c_condition (test->expr);
1d752508 145 fputs ("\n ? (int) ", stdout);
e1e9159b 146 rtx_reader_ptr->print_c_condition (test->expr);
1d752508 147 fputs ("\n : -1 },\n", stdout);
b70bd542 148 return 1;
149}
150
151/* Write out the complete conditions table, its size, and a flag
152 indicating that gensupport.c can now do insn elision. */
153static void
1a97be37 154write_conditions (void)
b70bd542 155{
32dea8e6 156 puts ("\
157/* Structure definition duplicated from gensupport.h rather than\n\
158 drag in that file and its dependencies. */\n\
159struct c_test\n\
160{\n\
161 const char *expr;\n\
162 int value;\n\
1d752508 163};\n\
164\n\
b70bd542 165/* This table lists each condition found in the machine description.\n\
166 Each condition is mapped to its truth value (0 or 1), or -1 if that\n\
32dea8e6 167 cannot be calculated at compile time.\n\
168 If we don't have __builtin_constant_p, or it's not acceptable in array\n\
af908c02 169 initializers, fall back to assuming that all conditions potentially\n\
170 vary at run time. It works in 3.0.1 and later; 3.0 only when not\n\
171 optimizing. */\n\
32dea8e6 172\n\
1c1a6437 173#if GCC_VERSION >= 3001\n\
174static const struct c_test insn_conditions[] = {\n");
b70bd542 175
af908c02 176 traverse_c_tests (write_one_condition, 0);
b70bd542 177
1c1a6437 178 puts ("\n};\n#endif /* gcc >= 3.0.1 */\n");
af908c02 179}
b70bd542 180
af908c02 181/* Emit code which will convert the C-format table to a
182 (define_conditions) form, which the MD reader can understand.
183 The result will be added to the set of files scanned by
184 'downstream' generators. */
185static void
186write_writer (void)
187{
32dea8e6 188 puts ("int\n"
189 "main(void)\n"
190 "{\n"
191 " unsigned int i;\n"
192 " const char *p;\n"
193 " puts (\"(define_conditions [\");\n"
1c1a6437 194 "#if GCC_VERSION >= 3001\n"
32dea8e6 195 " for (i = 0; i < ARRAY_SIZE (insn_conditions); i++)\n"
196 " {\n"
197 " printf (\" (%d \\\"\", insn_conditions[i].value);\n"
198 " for (p = insn_conditions[i].expr; *p; p++)\n"
199 " {\n"
200 " switch (*p)\n"
201 " {\n"
202 " case '\\\\':\n"
203 " case '\\\"': putchar ('\\\\'); break;\n"
204 " default: break;\n"
205 " }\n"
206 " putchar (*p);\n"
207 " }\n"
208 " puts (\"\\\")\");\n"
1d752508 209 " }\n"
1c1a6437 210 "#endif /* gcc >= 3.0.1 */\n"
1d752508 211 " puts (\"])\");\n"
32dea8e6 212 " fflush (stdout);\n"
213 "return ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE;\n"
214 "}");
b70bd542 215}
216
217int
16570c04 218main (int argc, const char **argv)
b70bd542 219{
b70bd542 220 progname = "genconditions";
221
77ba95d0 222 if (!init_rtx_reader_args (argc, argv))
b70bd542 223 return (FATAL_EXIT_CODE);
224
b70bd542 225 /* Read the machine description. */
c04601c1 226 md_rtx_info info;
227 while (read_md_rtx (&info))
b70bd542 228 {
c04601c1 229 rtx def = info.def;
7c1b1064 230 add_c_test (get_c_test (def), -1);
c04601c1 231 switch (GET_CODE (def))
b70bd542 232 {
b70bd542 233 case DEFINE_INSN:
234 case DEFINE_EXPAND:
b70bd542 235 /* except.h needs to know whether there is an eh_return
236 pattern in the machine description. */
c04601c1 237 if (!strcmp (XSTR (def, 0), "eh_return"))
b70bd542 238 saw_eh_return = 1;
239 break;
240
c04601c1 241 default:
b70bd542 242 break;
243 }
244 }
245
246 write_header ();
247 write_conditions ();
af908c02 248 write_writer ();
b70bd542 249
250 fflush (stdout);
251 return (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
252}