annotate gcc/common/config/arm/arm-common.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Common hooks for ARM.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 1991-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of GCC.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
7 under the terms of the GNU General Public License as published
kono
parents:
diff changeset
8 by the Free Software Foundation; either version 3, or (at your
kono
parents:
diff changeset
9 option) any later version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT
kono
parents:
diff changeset
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
kono
parents:
diff changeset
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
kono
parents:
diff changeset
14 License for more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #define INCLUDE_LIST
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
21 #define INCLUDE_VECTOR
111
kono
parents:
diff changeset
22 #include "config.h"
kono
parents:
diff changeset
23 #include "system.h"
kono
parents:
diff changeset
24 #include "coretypes.h"
kono
parents:
diff changeset
25 #include "tm.h"
kono
parents:
diff changeset
26 #include "memmodel.h"
kono
parents:
diff changeset
27 #include "tm_p.h"
kono
parents:
diff changeset
28 #include "common/common-target.h"
kono
parents:
diff changeset
29 #include "common/common-target-def.h"
kono
parents:
diff changeset
30 #include "opts.h"
kono
parents:
diff changeset
31 #include "flags.h"
kono
parents:
diff changeset
32 #include "sbitmap.h"
kono
parents:
diff changeset
33 #include "diagnostic.h"
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
34 #include <algorithm>
111
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 /* Set default optimization options. */
kono
parents:
diff changeset
37 static const struct default_options arm_option_optimization_table[] =
kono
parents:
diff changeset
38 {
kono
parents:
diff changeset
39 /* Enable section anchors by default at -O1 or higher. */
kono
parents:
diff changeset
40 { OPT_LEVELS_1_PLUS, OPT_fsection_anchors, NULL, 1 },
kono
parents:
diff changeset
41 { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
kono
parents:
diff changeset
42 { OPT_LEVELS_NONE, 0, NULL, 0 }
kono
parents:
diff changeset
43 };
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 /* Implement TARGET_EXCEPT_UNWIND_INFO. */
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 enum unwind_info_type
kono
parents:
diff changeset
48 arm_except_unwind_info (struct gcc_options *opts)
kono
parents:
diff changeset
49 {
kono
parents:
diff changeset
50 /* Honor the --enable-sjlj-exceptions configure switch. */
kono
parents:
diff changeset
51 #ifdef CONFIG_SJLJ_EXCEPTIONS
kono
parents:
diff changeset
52 if (CONFIG_SJLJ_EXCEPTIONS)
kono
parents:
diff changeset
53 return UI_SJLJ;
kono
parents:
diff changeset
54 #endif
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 /* If not using ARM EABI unwind tables... */
kono
parents:
diff changeset
57 if (ARM_UNWIND_INFO)
kono
parents:
diff changeset
58 {
kono
parents:
diff changeset
59 /* For simplicity elsewhere in this file, indicate that all unwind
kono
parents:
diff changeset
60 info is disabled if we're not emitting unwind tables. */
kono
parents:
diff changeset
61 if (!opts->x_flag_exceptions && !opts->x_flag_unwind_tables)
kono
parents:
diff changeset
62 return UI_NONE;
kono
parents:
diff changeset
63 else
kono
parents:
diff changeset
64 return UI_TARGET;
kono
parents:
diff changeset
65 }
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 /* ... honor target configurations requesting DWARF2 EH... */
kono
parents:
diff changeset
68 #ifdef DWARF2_UNWIND_INFO
kono
parents:
diff changeset
69 if (DWARF2_UNWIND_INFO)
kono
parents:
diff changeset
70 return UI_DWARF2;
kono
parents:
diff changeset
71 #endif
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 /* ... or fallback to sjlj exceptions for backwards compatibility. */
kono
parents:
diff changeset
74 return UI_SJLJ;
kono
parents:
diff changeset
75 }
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 #define ARM_CPU_NAME_LENGTH 20
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 /* Truncate NAME at the first '.' or '+' character seen, or return
kono
parents:
diff changeset
80 NAME unmodified. */
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 const char *
kono
parents:
diff changeset
83 arm_rewrite_selected_cpu (const char *name)
kono
parents:
diff changeset
84 {
kono
parents:
diff changeset
85 static char output_buf[ARM_CPU_NAME_LENGTH + 1] = {0};
kono
parents:
diff changeset
86 char *arg_pos;
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 strncpy (output_buf, name, ARM_CPU_NAME_LENGTH);
kono
parents:
diff changeset
89 output_buf[ARM_CPU_NAME_LENGTH] = 0;
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 arg_pos = strchr (output_buf, '.');
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 /* If we found a '.' truncate the entry at that point. */
kono
parents:
diff changeset
94 if (arg_pos)
kono
parents:
diff changeset
95 *arg_pos = '\0';
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 arg_pos = strchr (output_buf, '+');
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 /* If we found a '+' truncate the entry at that point. */
kono
parents:
diff changeset
100 if (arg_pos)
kono
parents:
diff changeset
101 *arg_pos = '\0';
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 return output_buf;
kono
parents:
diff changeset
104 }
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 /* Called by the driver to rewrite a name passed to the -mcpu
kono
parents:
diff changeset
107 argument in preparation to be passed to the assembler. The
kono
parents:
diff changeset
108 names passed from the command line will be in ARGV, we want
kono
parents:
diff changeset
109 to use the right-most argument, which should be in
kono
parents:
diff changeset
110 ARGV[ARGC - 1]. ARGC should always be greater than 0. */
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 const char *
kono
parents:
diff changeset
113 arm_rewrite_mcpu (int argc, const char **argv)
kono
parents:
diff changeset
114 {
kono
parents:
diff changeset
115 gcc_assert (argc);
kono
parents:
diff changeset
116 return arm_rewrite_selected_cpu (argv[argc - 1]);
kono
parents:
diff changeset
117 }
kono
parents:
diff changeset
118
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 /* Comparator for arm_rewrite_selected_arch. Compare the two arch extension
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
120 strings FIRST and SECOND and return TRUE if FIRST is less than SECOND
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
121 alphabetically. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
122
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
123 static bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
124 compare_opt_names (const char *first, const char *second)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
125 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
126 return strcmp (first, second) <= 0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
127 }
111
kono
parents:
diff changeset
128
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129 /* Rewrite the architecture string for passing to the assembler.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
130 Although the syntax is similar we cannot assume that it supports
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
131 the newer FP related options. So strip any option that only
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
132 defines features in the standard -mfpu options out. We'll generate
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
133 a suitable -mfpu option elsewhere to carry that information. NAME
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
134 should already have been canonicalized, so we do not expect to
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
135 encounter +no.. options that remove features. A final problem is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
136 that the assembler expects the feature extensions to be listed
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
137 alphabetically, so we build a list of required options and then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
138 sort them into canonical order in the resulting string. */
111
kono
parents:
diff changeset
139 const char *
kono
parents:
diff changeset
140 arm_rewrite_selected_arch (const char *name)
kono
parents:
diff changeset
141 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
142 /* The result we return needs to be semi persistent, so handle being
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
143 re-invoked. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
144 static char *asm_arch = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
145
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
146 if (asm_arch)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
147 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
148 free (asm_arch);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
149 asm_arch = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
150 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
151
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
152 const char *arg_pos = strchr (name, '+');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
153
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
154 /* No extension options? just return the original string. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
155 if (arg_pos == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
156 return name;
111
kono
parents:
diff changeset
157
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
158 const arch_option *arch_opt
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
159 = arm_parse_arch_option_name (all_architectures, "-march", name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
160
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
161 auto_sbitmap fpu_bits (isa_num_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
162 static const enum isa_feature fpu_bitlist[]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
163 = { ISA_ALL_FPU_INTERNAL, isa_nobit };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
164
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
165 arm_initialize_isa (fpu_bits, fpu_bitlist);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
166
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
167 auto_sbitmap opt_bits (isa_num_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
168
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
169 /* Ensure that the resulting string is large enough for the result. We
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
170 never add options, so using strdup here will ensure that. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
171 asm_arch = xstrdup (name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
172 asm_arch[arg_pos - name] = '\0';
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
173
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
174 std::vector<const char *>optlist;
111
kono
parents:
diff changeset
175
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
176 while (arg_pos)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
177 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
178 const char *end = strchr (arg_pos + 1, '+');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
179 size_t len = end ? end - arg_pos : strlen (arg_pos);
111
kono
parents:
diff changeset
180
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
181 for (const cpu_arch_extension *entry = arch_opt->common.extensions;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
182 entry->name != NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
183 entry++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
184 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
185 if (strncmp (entry->name, arg_pos + 1, len - 1) == 0
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
186 && entry->name[len - 1] == '\0')
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
187 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
188 /* Don't expect removal options. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
189 gcc_assert (!entry->remove);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
190 arm_initialize_isa (opt_bits, entry->isa_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
191 if (!bitmap_subset_p (opt_bits, fpu_bits))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
192 optlist.push_back (entry->name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
193 bitmap_clear (opt_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
194 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
195 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
196 }
111
kono
parents:
diff changeset
197
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
198 arg_pos = end;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
199 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
200
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
201 std::sort (optlist.begin (), optlist.end (), compare_opt_names);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
202
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
203 for (std::vector<const char *>::iterator opt_iter = optlist.begin ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
204 opt_iter != optlist.end ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
205 ++opt_iter)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
206 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
207 strcat (asm_arch, "+");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
208 strcat (asm_arch, (*opt_iter));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
209 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
210
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
211 return asm_arch;
111
kono
parents:
diff changeset
212 }
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 /* Called by the driver to rewrite a name passed to the -march
kono
parents:
diff changeset
215 argument in preparation to be passed to the assembler. The
kono
parents:
diff changeset
216 names passed from the command line will be in ARGV, we want
kono
parents:
diff changeset
217 to use the right-most argument, which should be in
kono
parents:
diff changeset
218 ARGV[ARGC - 1]. ARGC should always be greater than 0. */
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 const char *
kono
parents:
diff changeset
221 arm_rewrite_march (int argc, const char **argv)
kono
parents:
diff changeset
222 {
kono
parents:
diff changeset
223 gcc_assert (argc);
kono
parents:
diff changeset
224 return arm_rewrite_selected_arch (argv[argc - 1]);
kono
parents:
diff changeset
225 }
kono
parents:
diff changeset
226
kono
parents:
diff changeset
227 #include "arm-cpu-cdata.h"
kono
parents:
diff changeset
228
kono
parents:
diff changeset
229 /* Scan over a raw feature array BITS checking for BIT being present.
kono
parents:
diff changeset
230 This is slower than the normal bitmask checks, but we would spend longer
kono
parents:
diff changeset
231 initializing that than doing the check this way. Returns true iff
kono
parents:
diff changeset
232 BIT is found. */
kono
parents:
diff changeset
233 static bool
kono
parents:
diff changeset
234 check_isa_bits_for (const enum isa_feature* bits, enum isa_feature bit)
kono
parents:
diff changeset
235 {
kono
parents:
diff changeset
236 while (*bits != isa_nobit)
kono
parents:
diff changeset
237 if (*bits++ == bit)
kono
parents:
diff changeset
238 return true;
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 return false;
kono
parents:
diff changeset
241 }
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 /* Called by the driver to check whether the target denoted by current
kono
parents:
diff changeset
244 command line options is a Thumb-only target. ARGV is an array of
kono
parents:
diff changeset
245 tupples (normally only one) where the first element of the tupple
kono
parents:
diff changeset
246 is 'cpu' or 'arch' and the second is the option passed to the
kono
parents:
diff changeset
247 compiler for that. An architecture tupple is always taken in
kono
parents:
diff changeset
248 preference to a cpu tupple and the last of each type always
kono
parents:
diff changeset
249 overrides any earlier setting. */
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 const char *
kono
parents:
diff changeset
252 arm_target_thumb_only (int argc, const char **argv)
kono
parents:
diff changeset
253 {
kono
parents:
diff changeset
254 const char *arch = NULL;
kono
parents:
diff changeset
255 const char *cpu = NULL;
kono
parents:
diff changeset
256
kono
parents:
diff changeset
257 if (argc % 2 != 0)
kono
parents:
diff changeset
258 fatal_error (input_location,
kono
parents:
diff changeset
259 "%%:target_mode_check takes an even number of parameters");
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 while (argc)
kono
parents:
diff changeset
262 {
kono
parents:
diff changeset
263 if (strcmp (argv[0], "arch") == 0)
kono
parents:
diff changeset
264 arch = argv[1];
kono
parents:
diff changeset
265 else if (strcmp (argv[0], "cpu") == 0)
kono
parents:
diff changeset
266 cpu = argv[1];
kono
parents:
diff changeset
267 else
kono
parents:
diff changeset
268 fatal_error (input_location,
kono
parents:
diff changeset
269 "unrecognized option passed to %%:target_mode_check");
kono
parents:
diff changeset
270 argc -= 2;
kono
parents:
diff changeset
271 argv += 2;
kono
parents:
diff changeset
272 }
kono
parents:
diff changeset
273
kono
parents:
diff changeset
274 /* No architecture, or CPU, has option extensions that change
kono
parents:
diff changeset
275 whether or not we have a Thumb-only device, so there is no need
kono
parents:
diff changeset
276 to scan any option extensions specified. */
kono
parents:
diff changeset
277
kono
parents:
diff changeset
278 /* If the architecture is specified, that overrides any CPU setting. */
kono
parents:
diff changeset
279 if (arch)
kono
parents:
diff changeset
280 {
kono
parents:
diff changeset
281 const arch_option *arch_opt
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
282 = arm_parse_arch_option_name (all_architectures, "-march", arch,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
283 false);
111
kono
parents:
diff changeset
284
kono
parents:
diff changeset
285 if (arch_opt && !check_isa_bits_for (arch_opt->common.isa_bits,
kono
parents:
diff changeset
286 isa_bit_notm))
kono
parents:
diff changeset
287 return "-mthumb";
kono
parents:
diff changeset
288 }
kono
parents:
diff changeset
289 else if (cpu)
kono
parents:
diff changeset
290 {
kono
parents:
diff changeset
291 const cpu_option *cpu_opt
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
292 = arm_parse_cpu_option_name (all_cores, "-mcpu", cpu, false);
111
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 if (cpu_opt && !check_isa_bits_for (cpu_opt->common.isa_bits,
kono
parents:
diff changeset
295 isa_bit_notm))
kono
parents:
diff changeset
296 return "-mthumb";
kono
parents:
diff changeset
297 }
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 /* Compiler hasn't been configured with a default, and the CPU
kono
parents:
diff changeset
300 doesn't require Thumb, so default to ARM. */
kono
parents:
diff changeset
301 return "-marm";
kono
parents:
diff changeset
302 }
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 /* List the permitted CPU option names. If TARGET is a near miss for an
kono
parents:
diff changeset
305 entry, print out the suggested alternative. */
kono
parents:
diff changeset
306 static void
kono
parents:
diff changeset
307 arm_print_hint_for_cpu_option (const char *target,
kono
parents:
diff changeset
308 const cpu_option *list)
kono
parents:
diff changeset
309 {
kono
parents:
diff changeset
310 auto_vec<const char*> candidates;
kono
parents:
diff changeset
311 for (; list->common.name != NULL; list++)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
312 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
313 candidates.safe_push (list->common.name);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
314 if (list->aliases)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
315 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
316 for (const cpu_alias *alias = list->aliases; alias->name != NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
317 alias++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
318 if (alias->visible)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
319 candidates.safe_push (alias->name);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
320 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
321 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
322
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
323 #ifdef HAVE_LOCAL_CPU_DETECT
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
324 /* Add also "native" as possible value. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
325 candidates.safe_push ("native");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
326 #endif
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
327
111
kono
parents:
diff changeset
328 char *s;
kono
parents:
diff changeset
329 const char *hint = candidates_list_and_hint (target, s, candidates);
kono
parents:
diff changeset
330 if (hint)
kono
parents:
diff changeset
331 inform (input_location, "valid arguments are: %s; did you mean %qs?",
kono
parents:
diff changeset
332 s, hint);
kono
parents:
diff changeset
333 else
kono
parents:
diff changeset
334 inform (input_location, "valid arguments are: %s", s);
kono
parents:
diff changeset
335
kono
parents:
diff changeset
336 XDELETEVEC (s);
kono
parents:
diff changeset
337 }
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 /* Parse the base component of a CPU selection in LIST. Return a
kono
parents:
diff changeset
340 pointer to the entry in the architecture table. OPTNAME is the
kono
parents:
diff changeset
341 name of the option we are parsing and can be used if a diagnostic
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
342 is needed. If COMPLAIN is true (the default) emit error
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
343 messages and hints on invalid input. */
111
kono
parents:
diff changeset
344 const cpu_option *
kono
parents:
diff changeset
345 arm_parse_cpu_option_name (const cpu_option *list, const char *optname,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
346 const char *target, bool complain)
111
kono
parents:
diff changeset
347 {
kono
parents:
diff changeset
348 const cpu_option *entry;
kono
parents:
diff changeset
349 const char *end = strchr (target, '+');
kono
parents:
diff changeset
350 size_t len = end ? end - target : strlen (target);
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 for (entry = list; entry->common.name != NULL; entry++)
kono
parents:
diff changeset
353 {
kono
parents:
diff changeset
354 if (strncmp (entry->common.name, target, len) == 0
kono
parents:
diff changeset
355 && entry->common.name[len] == '\0')
kono
parents:
diff changeset
356 return entry;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
357
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
358 /* Match against any legal alias for this CPU candidate. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
359 if (entry->aliases)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
360 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
361 for (const cpu_alias *alias = entry->aliases; alias->name != NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
362 alias++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
363 if (strncmp (alias->name, target, len) == 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
364 && alias->name[len] == '\0')
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
365 return entry;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
366 }
111
kono
parents:
diff changeset
367 }
kono
parents:
diff changeset
368
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
369 if (complain)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
370 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
371 error_at (input_location, "unrecognized %s target: %s", optname, target);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
372 arm_print_hint_for_cpu_option (target, list);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
373 }
111
kono
parents:
diff changeset
374 return NULL;
kono
parents:
diff changeset
375 }
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 /* List the permitted architecture option names. If TARGET is a near
kono
parents:
diff changeset
378 miss for an entry, print out the suggested alternative. */
kono
parents:
diff changeset
379 static void
kono
parents:
diff changeset
380 arm_print_hint_for_arch_option (const char *target,
kono
parents:
diff changeset
381 const arch_option *list)
kono
parents:
diff changeset
382 {
kono
parents:
diff changeset
383 auto_vec<const char*> candidates;
kono
parents:
diff changeset
384 for (; list->common.name != NULL; list++)
kono
parents:
diff changeset
385 candidates.safe_push (list->common.name);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
386
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
387 #ifdef HAVE_LOCAL_CPU_DETECT
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
388 /* Add also "native" as possible value. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
389 candidates.safe_push ("native");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
390 #endif
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
391
111
kono
parents:
diff changeset
392 char *s;
kono
parents:
diff changeset
393 const char *hint = candidates_list_and_hint (target, s, candidates);
kono
parents:
diff changeset
394 if (hint)
kono
parents:
diff changeset
395 inform (input_location, "valid arguments are: %s; did you mean %qs?",
kono
parents:
diff changeset
396 s, hint);
kono
parents:
diff changeset
397 else
kono
parents:
diff changeset
398 inform (input_location, "valid arguments are: %s", s);
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 XDELETEVEC (s);
kono
parents:
diff changeset
401 }
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 /* Parse the base component of a CPU or architecture selection in
kono
parents:
diff changeset
404 LIST. Return a pointer to the entry in the architecture table.
kono
parents:
diff changeset
405 OPTNAME is the name of the option we are parsing and can be used if
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
406 a diagnostic is needed. If COMPLAIN is true (the default) emit error
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
407 messages and hints on invalid input. */
111
kono
parents:
diff changeset
408 const arch_option *
kono
parents:
diff changeset
409 arm_parse_arch_option_name (const arch_option *list, const char *optname,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
410 const char *target, bool complain)
111
kono
parents:
diff changeset
411 {
kono
parents:
diff changeset
412 const arch_option *entry;
kono
parents:
diff changeset
413 const char *end = strchr (target, '+');
kono
parents:
diff changeset
414 size_t len = end ? end - target : strlen (target);
kono
parents:
diff changeset
415
kono
parents:
diff changeset
416 for (entry = list; entry->common.name != NULL; entry++)
kono
parents:
diff changeset
417 {
kono
parents:
diff changeset
418 if (strncmp (entry->common.name, target, len) == 0
kono
parents:
diff changeset
419 && entry->common.name[len] == '\0')
kono
parents:
diff changeset
420 return entry;
kono
parents:
diff changeset
421 }
kono
parents:
diff changeset
422
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
423 if (complain)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
424 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
425 error_at (input_location, "unrecognized %s target: %s", optname, target);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
426 arm_print_hint_for_arch_option (target, list);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
427 }
111
kono
parents:
diff changeset
428 return NULL;
kono
parents:
diff changeset
429 }
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 /* List the permitted architecture option names. If TARGET is a near
kono
parents:
diff changeset
432 miss for an entry, print out the suggested alternative. */
kono
parents:
diff changeset
433 static void
kono
parents:
diff changeset
434 arm_print_hint_for_fpu_option (const char *target)
kono
parents:
diff changeset
435 {
kono
parents:
diff changeset
436 auto_vec<const char*> candidates;
kono
parents:
diff changeset
437 for (int i = 0; i < TARGET_FPU_auto; i++)
kono
parents:
diff changeset
438 candidates.safe_push (all_fpus[i].name);
kono
parents:
diff changeset
439 char *s;
kono
parents:
diff changeset
440 const char *hint = candidates_list_and_hint (target, s, candidates);
kono
parents:
diff changeset
441 if (hint)
kono
parents:
diff changeset
442 inform (input_location, "valid arguments are: %s; did you mean %qs?",
kono
parents:
diff changeset
443 s, hint);
kono
parents:
diff changeset
444 else
kono
parents:
diff changeset
445 inform (input_location, "valid arguments are: %s", s);
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 XDELETEVEC (s);
kono
parents:
diff changeset
448 }
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 static const arm_fpu_desc *
kono
parents:
diff changeset
451 arm_parse_fpu_option (const char *opt)
kono
parents:
diff changeset
452 {
kono
parents:
diff changeset
453 int i;
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 for (i = 0; i < TARGET_FPU_auto; i++)
kono
parents:
diff changeset
456 {
kono
parents:
diff changeset
457 if (strcmp (all_fpus[i].name, opt) == 0)
kono
parents:
diff changeset
458 return all_fpus + i;
kono
parents:
diff changeset
459 }
kono
parents:
diff changeset
460
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
461 error_at (input_location, "unrecognized %<-mfpu%> target: %s", opt);
111
kono
parents:
diff changeset
462 arm_print_hint_for_fpu_option (opt);
kono
parents:
diff changeset
463 return NULL;
kono
parents:
diff changeset
464 }
kono
parents:
diff changeset
465
kono
parents:
diff changeset
466 /* Convert a static initializer array of feature bits to sbitmap
kono
parents:
diff changeset
467 representation. */
kono
parents:
diff changeset
468 void
kono
parents:
diff changeset
469 arm_initialize_isa (sbitmap isa, const enum isa_feature *isa_bits)
kono
parents:
diff changeset
470 {
kono
parents:
diff changeset
471 bitmap_clear (isa);
kono
parents:
diff changeset
472 while (*isa_bits != isa_nobit)
kono
parents:
diff changeset
473 bitmap_set_bit (isa, *(isa_bits++));
kono
parents:
diff changeset
474 }
kono
parents:
diff changeset
475
kono
parents:
diff changeset
476 /* OPT isn't a recognized feature. Print a suitable error message and
kono
parents:
diff changeset
477 suggest a possible value. Always print the list of permitted
kono
parents:
diff changeset
478 values. */
kono
parents:
diff changeset
479 static void
kono
parents:
diff changeset
480 arm_unrecognized_feature (const char *opt, size_t len,
kono
parents:
diff changeset
481 const cpu_arch_option *target)
kono
parents:
diff changeset
482 {
kono
parents:
diff changeset
483 char *this_opt = XALLOCAVEC (char, len+1);
kono
parents:
diff changeset
484 auto_vec<const char*> candidates;
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 strncpy (this_opt, opt, len);
kono
parents:
diff changeset
487 this_opt[len] = 0;
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 error_at (input_location, "%qs does not support feature %qs", target->name,
kono
parents:
diff changeset
490 this_opt);
kono
parents:
diff changeset
491 for (const cpu_arch_extension *list = target->extensions;
kono
parents:
diff changeset
492 list->name != NULL;
kono
parents:
diff changeset
493 list++)
kono
parents:
diff changeset
494 candidates.safe_push (list->name);
kono
parents:
diff changeset
495
kono
parents:
diff changeset
496 char *s;
kono
parents:
diff changeset
497 const char *hint = candidates_list_and_hint (this_opt, s, candidates);
kono
parents:
diff changeset
498
kono
parents:
diff changeset
499 if (hint)
kono
parents:
diff changeset
500 inform (input_location, "valid feature names are: %s; did you mean %qs?",
kono
parents:
diff changeset
501 s, hint);
kono
parents:
diff changeset
502 else
kono
parents:
diff changeset
503 inform (input_location, "valid feature names are: %s", s);
kono
parents:
diff changeset
504
kono
parents:
diff changeset
505 XDELETEVEC (s);
kono
parents:
diff changeset
506 }
kono
parents:
diff changeset
507
kono
parents:
diff changeset
508 /* Parse any feature extensions to add to (or remove from) the
kono
parents:
diff changeset
509 permitted ISA selection. */
kono
parents:
diff changeset
510 void
kono
parents:
diff changeset
511 arm_parse_option_features (sbitmap isa, const cpu_arch_option *target,
kono
parents:
diff changeset
512 const char *opts_in)
kono
parents:
diff changeset
513 {
kono
parents:
diff changeset
514 const char *opts = opts_in;
kono
parents:
diff changeset
515
kono
parents:
diff changeset
516 if (!opts)
kono
parents:
diff changeset
517 return;
kono
parents:
diff changeset
518
kono
parents:
diff changeset
519 if (!target->extensions)
kono
parents:
diff changeset
520 {
kono
parents:
diff changeset
521 error_at (input_location, "%s does not take any feature options",
kono
parents:
diff changeset
522 target->name);
kono
parents:
diff changeset
523 return;
kono
parents:
diff changeset
524 }
kono
parents:
diff changeset
525
kono
parents:
diff changeset
526 while (opts)
kono
parents:
diff changeset
527 {
kono
parents:
diff changeset
528 gcc_assert (*opts == '+');
kono
parents:
diff changeset
529 const struct cpu_arch_extension *entry;
kono
parents:
diff changeset
530 const char *end = strchr (++opts, '+');
kono
parents:
diff changeset
531 size_t len = end ? end - opts : strlen (opts);
kono
parents:
diff changeset
532 bool matched = false;
kono
parents:
diff changeset
533
kono
parents:
diff changeset
534 for (entry = target->extensions;
kono
parents:
diff changeset
535 !matched && entry->name != NULL;
kono
parents:
diff changeset
536 entry++)
kono
parents:
diff changeset
537 {
kono
parents:
diff changeset
538 if (strncmp (entry->name, opts, len) == 0
kono
parents:
diff changeset
539 && entry->name[len] == '\0')
kono
parents:
diff changeset
540 {
kono
parents:
diff changeset
541 if (isa)
kono
parents:
diff changeset
542 {
kono
parents:
diff changeset
543 const enum isa_feature *f = entry->isa_bits;
kono
parents:
diff changeset
544 if (entry->remove)
kono
parents:
diff changeset
545 {
kono
parents:
diff changeset
546 while (*f != isa_nobit)
kono
parents:
diff changeset
547 bitmap_clear_bit (isa, *(f++));
kono
parents:
diff changeset
548 }
kono
parents:
diff changeset
549 else
kono
parents:
diff changeset
550 {
kono
parents:
diff changeset
551 while (*f != isa_nobit)
kono
parents:
diff changeset
552 bitmap_set_bit (isa, *(f++));
kono
parents:
diff changeset
553 }
kono
parents:
diff changeset
554 }
kono
parents:
diff changeset
555 matched = true;
kono
parents:
diff changeset
556 }
kono
parents:
diff changeset
557 }
kono
parents:
diff changeset
558
kono
parents:
diff changeset
559 if (!matched)
kono
parents:
diff changeset
560 arm_unrecognized_feature (opts, len, target);
kono
parents:
diff changeset
561
kono
parents:
diff changeset
562 opts = end;
kono
parents:
diff changeset
563 }
kono
parents:
diff changeset
564 }
kono
parents:
diff changeset
565
kono
parents:
diff changeset
566 class candidate_extension
kono
parents:
diff changeset
567 {
kono
parents:
diff changeset
568 public:
kono
parents:
diff changeset
569 const cpu_arch_extension *extension;
kono
parents:
diff changeset
570 sbitmap isa_bits;
kono
parents:
diff changeset
571 bool required;
kono
parents:
diff changeset
572
kono
parents:
diff changeset
573 candidate_extension (const cpu_arch_extension *ext, sbitmap bits)
kono
parents:
diff changeset
574 : extension (ext), isa_bits (bits), required (true)
kono
parents:
diff changeset
575 {}
kono
parents:
diff changeset
576 ~candidate_extension ()
kono
parents:
diff changeset
577 {
kono
parents:
diff changeset
578 sbitmap_free (isa_bits);
kono
parents:
diff changeset
579 }
kono
parents:
diff changeset
580 };
kono
parents:
diff changeset
581
kono
parents:
diff changeset
582 /* Generate a canonical representation of the -march option from the
kono
parents:
diff changeset
583 current -march string (if given) and other options on the command
kono
parents:
diff changeset
584 line that might affect the architecture. This aids multilib selection
kono
parents:
diff changeset
585 by ensuring that:
kono
parents:
diff changeset
586 a) the option is always present
kono
parents:
diff changeset
587 b) only the minimal set of options are used
kono
parents:
diff changeset
588 c) when there are multiple extensions, they are in a consistent order.
kono
parents:
diff changeset
589
kono
parents:
diff changeset
590 The options array consists of couplets of information where the
kono
parents:
diff changeset
591 first item in each couplet is the string describing which option
kono
parents:
diff changeset
592 name was selected (arch, cpu, fpu) and the second is the value
kono
parents:
diff changeset
593 passed for that option. */
kono
parents:
diff changeset
594 const char *
kono
parents:
diff changeset
595 arm_canon_arch_option (int argc, const char **argv)
kono
parents:
diff changeset
596 {
kono
parents:
diff changeset
597 const char *arch = NULL;
kono
parents:
diff changeset
598 const char *cpu = NULL;
kono
parents:
diff changeset
599 const char *fpu = NULL;
kono
parents:
diff changeset
600 const char *abi = NULL;
kono
parents:
diff changeset
601 static char *canonical_arch = NULL;
kono
parents:
diff changeset
602
kono
parents:
diff changeset
603 /* Just in case we're called more than once. */
kono
parents:
diff changeset
604 if (canonical_arch)
kono
parents:
diff changeset
605 {
kono
parents:
diff changeset
606 free (canonical_arch);
kono
parents:
diff changeset
607 canonical_arch = NULL;
kono
parents:
diff changeset
608 }
kono
parents:
diff changeset
609
kono
parents:
diff changeset
610 if (argc & 1)
kono
parents:
diff changeset
611 fatal_error (input_location,
kono
parents:
diff changeset
612 "%%:canon_for_mlib takes 1 or more pairs of parameters");
kono
parents:
diff changeset
613
kono
parents:
diff changeset
614 while (argc)
kono
parents:
diff changeset
615 {
kono
parents:
diff changeset
616 if (strcmp (argv[0], "arch") == 0)
kono
parents:
diff changeset
617 arch = argv[1];
kono
parents:
diff changeset
618 else if (strcmp (argv[0], "cpu") == 0)
kono
parents:
diff changeset
619 cpu = argv[1];
kono
parents:
diff changeset
620 else if (strcmp (argv[0], "fpu") == 0)
kono
parents:
diff changeset
621 fpu = argv[1];
kono
parents:
diff changeset
622 else if (strcmp (argv[0], "abi") == 0)
kono
parents:
diff changeset
623 abi = argv[1];
kono
parents:
diff changeset
624 else
kono
parents:
diff changeset
625 fatal_error (input_location,
kono
parents:
diff changeset
626 "unrecognized operand to %%:canon_for_mlib");
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 argc -= 2;
kono
parents:
diff changeset
629 argv += 2;
kono
parents:
diff changeset
630 }
kono
parents:
diff changeset
631
kono
parents:
diff changeset
632 auto_sbitmap target_isa (isa_num_bits);
kono
parents:
diff changeset
633 auto_sbitmap base_isa (isa_num_bits);
kono
parents:
diff changeset
634 auto_sbitmap fpu_isa (isa_num_bits);
kono
parents:
diff changeset
635
kono
parents:
diff changeset
636 bitmap_clear (fpu_isa);
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 const arch_option *selected_arch = NULL;
kono
parents:
diff changeset
639
kono
parents:
diff changeset
640 /* At least one of these must be defined by either the specs or the
kono
parents:
diff changeset
641 user. */
kono
parents:
diff changeset
642 gcc_assert (cpu || arch);
kono
parents:
diff changeset
643
kono
parents:
diff changeset
644 if (!fpu)
kono
parents:
diff changeset
645 fpu = FPUTYPE_AUTO;
kono
parents:
diff changeset
646
kono
parents:
diff changeset
647 if (!abi)
kono
parents:
diff changeset
648 {
kono
parents:
diff changeset
649 if (TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_SOFT)
kono
parents:
diff changeset
650 abi = "soft";
kono
parents:
diff changeset
651 else if (TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_SOFTFP)
kono
parents:
diff changeset
652 abi = "softfp";
kono
parents:
diff changeset
653 else if (TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_HARD)
kono
parents:
diff changeset
654 abi = "hard";
kono
parents:
diff changeset
655 }
kono
parents:
diff changeset
656
kono
parents:
diff changeset
657 /* First build up a bitmap describing the target architecture. */
kono
parents:
diff changeset
658 if (arch)
kono
parents:
diff changeset
659 {
kono
parents:
diff changeset
660 selected_arch = arm_parse_arch_option_name (all_architectures,
kono
parents:
diff changeset
661 "-march", arch);
kono
parents:
diff changeset
662
kono
parents:
diff changeset
663 if (selected_arch == NULL)
kono
parents:
diff changeset
664 return "";
kono
parents:
diff changeset
665
kono
parents:
diff changeset
666 arm_initialize_isa (target_isa, selected_arch->common.isa_bits);
kono
parents:
diff changeset
667 arm_parse_option_features (target_isa, &selected_arch->common,
kono
parents:
diff changeset
668 strchr (arch, '+'));
kono
parents:
diff changeset
669 if (fpu && strcmp (fpu, "auto") != 0)
kono
parents:
diff changeset
670 {
kono
parents:
diff changeset
671 /* We assume that architectures do not have any FPU bits
kono
parents:
diff changeset
672 enabled by default. If they did, we would need to strip
kono
parents:
diff changeset
673 these out first. */
kono
parents:
diff changeset
674 const arm_fpu_desc *target_fpu = arm_parse_fpu_option (fpu);
kono
parents:
diff changeset
675 if (target_fpu == NULL)
kono
parents:
diff changeset
676 return "";
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678 arm_initialize_isa (fpu_isa, target_fpu->isa_bits);
kono
parents:
diff changeset
679 bitmap_ior (target_isa, target_isa, fpu_isa);
kono
parents:
diff changeset
680 }
kono
parents:
diff changeset
681 }
kono
parents:
diff changeset
682 else if (cpu)
kono
parents:
diff changeset
683 {
kono
parents:
diff changeset
684 const cpu_option *selected_cpu
kono
parents:
diff changeset
685 = arm_parse_cpu_option_name (all_cores, "-mcpu", cpu);
kono
parents:
diff changeset
686
kono
parents:
diff changeset
687 if (selected_cpu == NULL)
kono
parents:
diff changeset
688 return "";
kono
parents:
diff changeset
689
kono
parents:
diff changeset
690 arm_initialize_isa (target_isa, selected_cpu->common.isa_bits);
kono
parents:
diff changeset
691 arm_parse_option_features (target_isa, &selected_cpu->common,
kono
parents:
diff changeset
692 strchr (cpu, '+'));
kono
parents:
diff changeset
693 if (fpu && strcmp (fpu, "auto") != 0)
kono
parents:
diff changeset
694 {
kono
parents:
diff changeset
695 /* The easiest and safest way to remove the default fpu
kono
parents:
diff changeset
696 capabilities is to look for a '+no..' option that removes
kono
parents:
diff changeset
697 the base FPU bit (isa_bit_vfpv2). If that doesn't exist
kono
parents:
diff changeset
698 then the best we can do is strip out all the bits that
kono
parents:
diff changeset
699 might be part of the most capable FPU we know about,
kono
parents:
diff changeset
700 which is "crypto-neon-fp-armv8". */
kono
parents:
diff changeset
701 bool default_fpu_found = false;
kono
parents:
diff changeset
702 if (selected_cpu->common.extensions)
kono
parents:
diff changeset
703 {
kono
parents:
diff changeset
704 const cpu_arch_extension *ext;
kono
parents:
diff changeset
705 for (ext = selected_cpu->common.extensions; ext->name != NULL;
kono
parents:
diff changeset
706 ++ext)
kono
parents:
diff changeset
707 {
kono
parents:
diff changeset
708 if (ext->remove
kono
parents:
diff changeset
709 && check_isa_bits_for (ext->isa_bits, isa_bit_vfpv2))
kono
parents:
diff changeset
710 {
kono
parents:
diff changeset
711 arm_initialize_isa (fpu_isa, ext->isa_bits);
kono
parents:
diff changeset
712 bitmap_and_compl (target_isa, target_isa, fpu_isa);
kono
parents:
diff changeset
713 default_fpu_found = true;
kono
parents:
diff changeset
714 }
kono
parents:
diff changeset
715 }
kono
parents:
diff changeset
716
kono
parents:
diff changeset
717 }
kono
parents:
diff changeset
718
kono
parents:
diff changeset
719 if (!default_fpu_found)
kono
parents:
diff changeset
720 {
kono
parents:
diff changeset
721 arm_initialize_isa
kono
parents:
diff changeset
722 (fpu_isa,
kono
parents:
diff changeset
723 all_fpus[TARGET_FPU_crypto_neon_fp_armv8].isa_bits);
kono
parents:
diff changeset
724 bitmap_and_compl (target_isa, target_isa, fpu_isa);
kono
parents:
diff changeset
725 }
kono
parents:
diff changeset
726
kono
parents:
diff changeset
727 const arm_fpu_desc *target_fpu = arm_parse_fpu_option (fpu);
kono
parents:
diff changeset
728 if (target_fpu == NULL)
kono
parents:
diff changeset
729 return "";
kono
parents:
diff changeset
730
kono
parents:
diff changeset
731 arm_initialize_isa (fpu_isa, target_fpu->isa_bits);
kono
parents:
diff changeset
732 bitmap_ior (target_isa, target_isa, fpu_isa);
kono
parents:
diff changeset
733 }
kono
parents:
diff changeset
734
kono
parents:
diff changeset
735 selected_arch = all_architectures + selected_cpu->arch;
kono
parents:
diff changeset
736 }
kono
parents:
diff changeset
737
kono
parents:
diff changeset
738 /* If we have a soft-float ABI, disable the FPU. */
kono
parents:
diff changeset
739 if (abi && strcmp (abi, "soft") == 0)
kono
parents:
diff changeset
740 {
kono
parents:
diff changeset
741 /* Clearing the VFPv2 bit is sufficient to stop any extention that
kono
parents:
diff changeset
742 builds on the FPU from matching. */
kono
parents:
diff changeset
743 bitmap_clear_bit (target_isa, isa_bit_vfpv2);
kono
parents:
diff changeset
744 }
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 /* If we don't have a selected architecture by now, something's
kono
parents:
diff changeset
747 badly wrong. */
kono
parents:
diff changeset
748 gcc_assert (selected_arch);
kono
parents:
diff changeset
749
kono
parents:
diff changeset
750 arm_initialize_isa (base_isa, selected_arch->common.isa_bits);
kono
parents:
diff changeset
751
kono
parents:
diff changeset
752 /* Architecture has no extension options, so just return the canonical
kono
parents:
diff changeset
753 architecture name. */
kono
parents:
diff changeset
754 if (selected_arch->common.extensions == NULL)
kono
parents:
diff changeset
755 return selected_arch->common.name;
kono
parents:
diff changeset
756
kono
parents:
diff changeset
757 /* We're only interested in extension bits. */
kono
parents:
diff changeset
758 bitmap_and_compl (target_isa, target_isa, base_isa);
kono
parents:
diff changeset
759
kono
parents:
diff changeset
760 /* There are no extensions needed. Just return the canonical architecture
kono
parents:
diff changeset
761 name. */
kono
parents:
diff changeset
762 if (bitmap_empty_p (target_isa))
kono
parents:
diff changeset
763 return selected_arch->common.name;
kono
parents:
diff changeset
764
kono
parents:
diff changeset
765 /* What is left is the architecture that the compiler will target. We
kono
parents:
diff changeset
766 now need to map that back into a suitable option+features list.
kono
parents:
diff changeset
767
kono
parents:
diff changeset
768 The list is built in two passes. First we scan every additive
kono
parents:
diff changeset
769 option feature supported by the architecture. If the option
kono
parents:
diff changeset
770 provides a subset of the features we need we add it to the list
kono
parents:
diff changeset
771 of candidates. We then scan backwards over the list of
kono
parents:
diff changeset
772 candidates and if we find a feature that adds nothing to one that
kono
parents:
diff changeset
773 was later in the list we mark it as redundant. The result is a
kono
parents:
diff changeset
774 minimal list of required features for the target
kono
parents:
diff changeset
775 architecture. */
kono
parents:
diff changeset
776
kono
parents:
diff changeset
777 std::list<candidate_extension *> extensions;
kono
parents:
diff changeset
778
kono
parents:
diff changeset
779 auto_sbitmap target_isa_unsatisfied (isa_num_bits);
kono
parents:
diff changeset
780 bitmap_copy (target_isa_unsatisfied, target_isa);
kono
parents:
diff changeset
781
kono
parents:
diff changeset
782 sbitmap isa_bits = NULL;
kono
parents:
diff changeset
783 for (const cpu_arch_extension *cand = selected_arch->common.extensions;
kono
parents:
diff changeset
784 cand->name != NULL;
kono
parents:
diff changeset
785 cand++)
kono
parents:
diff changeset
786 {
kono
parents:
diff changeset
787 if (cand->remove || cand->alias)
kono
parents:
diff changeset
788 continue;
kono
parents:
diff changeset
789
kono
parents:
diff changeset
790 if (isa_bits == NULL)
kono
parents:
diff changeset
791 isa_bits = sbitmap_alloc (isa_num_bits);
kono
parents:
diff changeset
792
kono
parents:
diff changeset
793 arm_initialize_isa (isa_bits, cand->isa_bits);
kono
parents:
diff changeset
794 if (bitmap_subset_p (isa_bits, target_isa))
kono
parents:
diff changeset
795 {
kono
parents:
diff changeset
796 extensions.push_back (new candidate_extension (cand, isa_bits));
kono
parents:
diff changeset
797 bitmap_and_compl (target_isa_unsatisfied, target_isa_unsatisfied,
kono
parents:
diff changeset
798 isa_bits);
kono
parents:
diff changeset
799 isa_bits = NULL;
kono
parents:
diff changeset
800 }
kono
parents:
diff changeset
801 }
kono
parents:
diff changeset
802
kono
parents:
diff changeset
803 /* There's one extra case to consider, which is that the user has
kono
parents:
diff changeset
804 specified an FPU that is less capable than this architecture
kono
parents:
diff changeset
805 supports. In that case the code above will fail to find a
kono
parents:
diff changeset
806 suitable feature. We handle this by scanning the list of options
kono
parents:
diff changeset
807 again, matching the first option that provides an FPU that is
kono
parents:
diff changeset
808 more capable than the selected FPU.
kono
parents:
diff changeset
809
kono
parents:
diff changeset
810 Note that the other case (user specified a more capable FPU than
kono
parents:
diff changeset
811 this architecture supports) should end up selecting the most
kono
parents:
diff changeset
812 capable FPU variant that we do support. This is sufficient for
kono
parents:
diff changeset
813 multilib selection. */
kono
parents:
diff changeset
814
kono
parents:
diff changeset
815 if (bitmap_bit_p (target_isa_unsatisfied, isa_bit_vfpv2)
kono
parents:
diff changeset
816 && bitmap_bit_p (fpu_isa, isa_bit_vfpv2))
kono
parents:
diff changeset
817 {
kono
parents:
diff changeset
818 std::list<candidate_extension *>::iterator ipoint = extensions.begin ();
kono
parents:
diff changeset
819
kono
parents:
diff changeset
820 for (const cpu_arch_extension *cand = selected_arch->common.extensions;
kono
parents:
diff changeset
821 cand->name != NULL;
kono
parents:
diff changeset
822 cand++)
kono
parents:
diff changeset
823 {
kono
parents:
diff changeset
824 if (cand->remove || cand->alias)
kono
parents:
diff changeset
825 continue;
kono
parents:
diff changeset
826
kono
parents:
diff changeset
827 if (isa_bits == NULL)
kono
parents:
diff changeset
828 isa_bits = sbitmap_alloc (isa_num_bits);
kono
parents:
diff changeset
829
kono
parents:
diff changeset
830 /* We need to keep the features in canonical order, so move the
kono
parents:
diff changeset
831 insertion point if this feature is a candidate. */
kono
parents:
diff changeset
832 if (ipoint != extensions.end ()
kono
parents:
diff changeset
833 && (*ipoint)->extension == cand)
kono
parents:
diff changeset
834 ++ipoint;
kono
parents:
diff changeset
835
kono
parents:
diff changeset
836 arm_initialize_isa (isa_bits, cand->isa_bits);
kono
parents:
diff changeset
837 if (bitmap_subset_p (fpu_isa, isa_bits))
kono
parents:
diff changeset
838 {
kono
parents:
diff changeset
839 extensions.insert (ipoint,
kono
parents:
diff changeset
840 new candidate_extension (cand, isa_bits));
kono
parents:
diff changeset
841 isa_bits = NULL;
kono
parents:
diff changeset
842 break;
kono
parents:
diff changeset
843 }
kono
parents:
diff changeset
844 }
kono
parents:
diff changeset
845 }
kono
parents:
diff changeset
846
kono
parents:
diff changeset
847 if (isa_bits)
kono
parents:
diff changeset
848 sbitmap_free (isa_bits);
kono
parents:
diff changeset
849
kono
parents:
diff changeset
850 bitmap_clear (target_isa);
kono
parents:
diff changeset
851 size_t len = 1;
kono
parents:
diff changeset
852 for (std::list<candidate_extension *>::reverse_iterator riter
kono
parents:
diff changeset
853 = extensions.rbegin ();
kono
parents:
diff changeset
854 riter != extensions.rend (); ++riter)
kono
parents:
diff changeset
855 {
kono
parents:
diff changeset
856 if (bitmap_subset_p ((*riter)->isa_bits, target_isa))
kono
parents:
diff changeset
857 (*riter)->required = false;
kono
parents:
diff changeset
858 else
kono
parents:
diff changeset
859 {
kono
parents:
diff changeset
860 bitmap_ior (target_isa, target_isa, (*riter)->isa_bits);
kono
parents:
diff changeset
861 len += strlen ((*riter)->extension->name) + 1;
kono
parents:
diff changeset
862 }
kono
parents:
diff changeset
863 }
kono
parents:
diff changeset
864
kono
parents:
diff changeset
865 canonical_arch
kono
parents:
diff changeset
866 = (char *) xmalloc (len + strlen (selected_arch->common.name));
kono
parents:
diff changeset
867
kono
parents:
diff changeset
868 strcpy (canonical_arch, selected_arch->common.name);
kono
parents:
diff changeset
869
kono
parents:
diff changeset
870 for (std::list<candidate_extension *>::iterator iter = extensions.begin ();
kono
parents:
diff changeset
871 iter != extensions.end (); ++iter)
kono
parents:
diff changeset
872 {
kono
parents:
diff changeset
873 if ((*iter)->required)
kono
parents:
diff changeset
874 {
kono
parents:
diff changeset
875 strcat (canonical_arch, "+");
kono
parents:
diff changeset
876 strcat (canonical_arch, (*iter)->extension->name);
kono
parents:
diff changeset
877 }
kono
parents:
diff changeset
878 delete (*iter);
kono
parents:
diff changeset
879 }
kono
parents:
diff changeset
880
kono
parents:
diff changeset
881 return canonical_arch;
kono
parents:
diff changeset
882 }
kono
parents:
diff changeset
883
kono
parents:
diff changeset
884 /* If building big-endian on a BE8 target generate a --be8 option for
kono
parents:
diff changeset
885 the linker. Takes four types of option: "little" - little-endian;
kono
parents:
diff changeset
886 "big" - big-endian; "be8" - force be8 iff big-endian; and "arch"
kono
parents:
diff changeset
887 "<arch-name>" (two arguments) - the target architecture. The
kono
parents:
diff changeset
888 parameter names are generated by the driver from the command-line
kono
parents:
diff changeset
889 options. */
kono
parents:
diff changeset
890 const char *
kono
parents:
diff changeset
891 arm_be8_option (int argc, const char **argv)
kono
parents:
diff changeset
892 {
kono
parents:
diff changeset
893 int endian = TARGET_ENDIAN_DEFAULT;
kono
parents:
diff changeset
894 const char *arch = NULL;
kono
parents:
diff changeset
895 int arg;
kono
parents:
diff changeset
896 bool force = false;
kono
parents:
diff changeset
897
kono
parents:
diff changeset
898 for (arg = 0; arg < argc; arg++)
kono
parents:
diff changeset
899 {
kono
parents:
diff changeset
900 if (strcmp (argv[arg], "little") == 0)
kono
parents:
diff changeset
901 endian = 0;
kono
parents:
diff changeset
902 else if (strcmp (argv[arg], "big") == 0)
kono
parents:
diff changeset
903 endian = 1;
kono
parents:
diff changeset
904 else if (strcmp (argv[arg], "be8") == 0)
kono
parents:
diff changeset
905 force = true;
kono
parents:
diff changeset
906 else if (strcmp (argv[arg], "arch") == 0)
kono
parents:
diff changeset
907 {
kono
parents:
diff changeset
908 arg++;
kono
parents:
diff changeset
909 gcc_assert (arg < argc);
kono
parents:
diff changeset
910 arch = argv[arg];
kono
parents:
diff changeset
911 }
kono
parents:
diff changeset
912 else
kono
parents:
diff changeset
913 gcc_unreachable ();
kono
parents:
diff changeset
914 }
kono
parents:
diff changeset
915
kono
parents:
diff changeset
916 /* Little endian - no be8 option. */
kono
parents:
diff changeset
917 if (!endian)
kono
parents:
diff changeset
918 return "";
kono
parents:
diff changeset
919
kono
parents:
diff changeset
920 if (force)
kono
parents:
diff changeset
921 return "--be8";
kono
parents:
diff changeset
922
kono
parents:
diff changeset
923 /* Arch might not be set iff arm_canon_arch (above) detected an
kono
parents:
diff changeset
924 error. Do nothing in that case. */
kono
parents:
diff changeset
925 if (!arch)
kono
parents:
diff changeset
926 return "";
kono
parents:
diff changeset
927
kono
parents:
diff changeset
928 const arch_option *selected_arch
kono
parents:
diff changeset
929 = arm_parse_arch_option_name (all_architectures, "-march", arch);
kono
parents:
diff changeset
930
kono
parents:
diff changeset
931 /* Similarly if the given arch option was itself invalid. */
kono
parents:
diff changeset
932 if (!selected_arch)
kono
parents:
diff changeset
933 return "";
kono
parents:
diff changeset
934
kono
parents:
diff changeset
935 if (check_isa_bits_for (selected_arch->common.isa_bits, isa_bit_be8))
kono
parents:
diff changeset
936 return "--be8";
kono
parents:
diff changeset
937
kono
parents:
diff changeset
938 return "";
kono
parents:
diff changeset
939 }
kono
parents:
diff changeset
940
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
941 /* Generate a -mfpu= option for passing to the assembler. This is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
942 only called when -mfpu was set (possibly defaulted) to auto and is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
943 needed to ensure that the assembler knows the correct FPU to use.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
944 It wouldn't really be needed except that the compiler can be used
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
945 to invoke the assembler directly on hand-written files that lack
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
946 the necessary internal .fpu directives. We assume that the architecture
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
947 canonicalization calls have already been made so that we have a final
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
948 -march= option to derive the fpu from. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
949 const char*
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
950 arm_asm_auto_mfpu (int argc, const char **argv)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
951 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
952 static char *auto_fpu = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
953 const char *arch = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
954 static const enum isa_feature fpu_bitlist[]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
955 = { ISA_ALL_FPU_INTERNAL, isa_nobit };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
956 const arch_option *selected_arch;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
957 static const char* fpuname = "softvfp";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
958
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
959 /* Handle multiple calls to this routine. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
960 if (auto_fpu)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
961 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
962 free (auto_fpu);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
963 auto_fpu = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
964 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
965
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
966 while (argc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
967 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
968 if (strcmp (argv[0], "arch") == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
969 arch = argv[1];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
970 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
971 fatal_error (input_location,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
972 "unrecognized operand to %%:asm_auto_mfpu");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
973 argc -= 2;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
974 argv += 2;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
975 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
976
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
977 auto_sbitmap target_isa (isa_num_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
978 auto_sbitmap fpubits (isa_num_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
979
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
980 gcc_assert (arch != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
981 selected_arch = arm_parse_arch_option_name (all_architectures,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
982 "-march", arch);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
983 if (selected_arch == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
984 return "";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
985
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
986 arm_initialize_isa (target_isa, selected_arch->common.isa_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
987 arm_parse_option_features (target_isa, &selected_arch->common,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
988 strchr (arch, '+'));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
989 arm_initialize_isa (fpubits, fpu_bitlist);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
990
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
991 bitmap_and (fpubits, fpubits, target_isa);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
992
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
993 /* The logic below is essentially identical to that in
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
994 arm.c:arm_identify_fpu_from_isa(), but that only works in the main
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
995 part of the compiler. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
996
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
997 /* If there are no FPU capability bits, we just pass -mfpu=softvfp. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
998 if (!bitmap_empty_p (fpubits))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
999 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1000 unsigned int i;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1001 auto_sbitmap cand_fpubits (isa_num_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1002 for (i = 0; i < TARGET_FPU_auto; i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1003 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1004 arm_initialize_isa (cand_fpubits, all_fpus[i].isa_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1005 if (bitmap_equal_p (fpubits, cand_fpubits))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1006 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1007 fpuname = all_fpus[i].name;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1008 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1009 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1010 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1011
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1012 gcc_assert (i != TARGET_FPU_auto);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1013 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1014
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1015 auto_fpu = (char *) xmalloc (strlen (fpuname) + sizeof ("-mfpu="));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1016 strcpy (auto_fpu, "-mfpu=");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1017 strcat (auto_fpu, fpuname);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1018 return auto_fpu;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1019 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1020
111
kono
parents:
diff changeset
1021 #undef ARM_CPU_NAME_LENGTH
kono
parents:
diff changeset
1022
kono
parents:
diff changeset
1023
kono
parents:
diff changeset
1024 #undef TARGET_DEFAULT_TARGET_FLAGS
kono
parents:
diff changeset
1025 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | MASK_SCHED_PROLOG)
kono
parents:
diff changeset
1026
kono
parents:
diff changeset
1027 #undef TARGET_OPTION_OPTIMIZATION_TABLE
kono
parents:
diff changeset
1028 #define TARGET_OPTION_OPTIMIZATION_TABLE arm_option_optimization_table
kono
parents:
diff changeset
1029
kono
parents:
diff changeset
1030 #undef TARGET_EXCEPT_UNWIND_INFO
kono
parents:
diff changeset
1031 #define TARGET_EXCEPT_UNWIND_INFO arm_except_unwind_info
kono
parents:
diff changeset
1032
kono
parents:
diff changeset
1033 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;