annotate gcc/common/config/arm/arm-common.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Common hooks for ARM.
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 Copyright (C) 1991-2018 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++)
kono
parents:
diff changeset
312 candidates.safe_push (list->common.name);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
313
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
314 #ifdef HAVE_LOCAL_CPU_DETECT
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
315 /* Add also "native" as possible value. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
316 candidates.safe_push ("native");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
317 #endif
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
318
111
kono
parents:
diff changeset
319 char *s;
kono
parents:
diff changeset
320 const char *hint = candidates_list_and_hint (target, s, candidates);
kono
parents:
diff changeset
321 if (hint)
kono
parents:
diff changeset
322 inform (input_location, "valid arguments are: %s; did you mean %qs?",
kono
parents:
diff changeset
323 s, hint);
kono
parents:
diff changeset
324 else
kono
parents:
diff changeset
325 inform (input_location, "valid arguments are: %s", s);
kono
parents:
diff changeset
326
kono
parents:
diff changeset
327 XDELETEVEC (s);
kono
parents:
diff changeset
328 }
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 /* Parse the base component of a CPU selection in LIST. Return a
kono
parents:
diff changeset
331 pointer to the entry in the architecture table. OPTNAME is the
kono
parents:
diff changeset
332 name of the option we are parsing and can be used if a diagnostic
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
333 is needed. If COMPLAIN is true (the default) emit error
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
334 messages and hints on invalid input. */
111
kono
parents:
diff changeset
335 const cpu_option *
kono
parents:
diff changeset
336 arm_parse_cpu_option_name (const cpu_option *list, const char *optname,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
337 const char *target, bool complain)
111
kono
parents:
diff changeset
338 {
kono
parents:
diff changeset
339 const cpu_option *entry;
kono
parents:
diff changeset
340 const char *end = strchr (target, '+');
kono
parents:
diff changeset
341 size_t len = end ? end - target : strlen (target);
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 for (entry = list; entry->common.name != NULL; entry++)
kono
parents:
diff changeset
344 {
kono
parents:
diff changeset
345 if (strncmp (entry->common.name, target, len) == 0
kono
parents:
diff changeset
346 && entry->common.name[len] == '\0')
kono
parents:
diff changeset
347 return entry;
kono
parents:
diff changeset
348 }
kono
parents:
diff changeset
349
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
350 if (complain)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
351 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
352 error_at (input_location, "unrecognized %s target: %s", optname, target);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
353 arm_print_hint_for_cpu_option (target, list);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
354 }
111
kono
parents:
diff changeset
355 return NULL;
kono
parents:
diff changeset
356 }
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 /* List the permitted architecture option names. If TARGET is a near
kono
parents:
diff changeset
359 miss for an entry, print out the suggested alternative. */
kono
parents:
diff changeset
360 static void
kono
parents:
diff changeset
361 arm_print_hint_for_arch_option (const char *target,
kono
parents:
diff changeset
362 const arch_option *list)
kono
parents:
diff changeset
363 {
kono
parents:
diff changeset
364 auto_vec<const char*> candidates;
kono
parents:
diff changeset
365 for (; list->common.name != NULL; list++)
kono
parents:
diff changeset
366 candidates.safe_push (list->common.name);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
367
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
368 #ifdef HAVE_LOCAL_CPU_DETECT
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
369 /* Add also "native" as possible value. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
370 candidates.safe_push ("native");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
371 #endif
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
372
111
kono
parents:
diff changeset
373 char *s;
kono
parents:
diff changeset
374 const char *hint = candidates_list_and_hint (target, s, candidates);
kono
parents:
diff changeset
375 if (hint)
kono
parents:
diff changeset
376 inform (input_location, "valid arguments are: %s; did you mean %qs?",
kono
parents:
diff changeset
377 s, hint);
kono
parents:
diff changeset
378 else
kono
parents:
diff changeset
379 inform (input_location, "valid arguments are: %s", s);
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 XDELETEVEC (s);
kono
parents:
diff changeset
382 }
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 /* Parse the base component of a CPU or architecture selection in
kono
parents:
diff changeset
385 LIST. Return a pointer to the entry in the architecture table.
kono
parents:
diff changeset
386 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
387 a diagnostic is needed. If COMPLAIN is true (the default) emit error
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
388 messages and hints on invalid input. */
111
kono
parents:
diff changeset
389 const arch_option *
kono
parents:
diff changeset
390 arm_parse_arch_option_name (const arch_option *list, const char *optname,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
391 const char *target, bool complain)
111
kono
parents:
diff changeset
392 {
kono
parents:
diff changeset
393 const arch_option *entry;
kono
parents:
diff changeset
394 const char *end = strchr (target, '+');
kono
parents:
diff changeset
395 size_t len = end ? end - target : strlen (target);
kono
parents:
diff changeset
396
kono
parents:
diff changeset
397 for (entry = list; entry->common.name != NULL; entry++)
kono
parents:
diff changeset
398 {
kono
parents:
diff changeset
399 if (strncmp (entry->common.name, target, len) == 0
kono
parents:
diff changeset
400 && entry->common.name[len] == '\0')
kono
parents:
diff changeset
401 return entry;
kono
parents:
diff changeset
402 }
kono
parents:
diff changeset
403
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
404 if (complain)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
405 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
406 error_at (input_location, "unrecognized %s target: %s", optname, target);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
407 arm_print_hint_for_arch_option (target, list);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
408 }
111
kono
parents:
diff changeset
409 return NULL;
kono
parents:
diff changeset
410 }
kono
parents:
diff changeset
411
kono
parents:
diff changeset
412 /* List the permitted architecture option names. If TARGET is a near
kono
parents:
diff changeset
413 miss for an entry, print out the suggested alternative. */
kono
parents:
diff changeset
414 static void
kono
parents:
diff changeset
415 arm_print_hint_for_fpu_option (const char *target)
kono
parents:
diff changeset
416 {
kono
parents:
diff changeset
417 auto_vec<const char*> candidates;
kono
parents:
diff changeset
418 for (int i = 0; i < TARGET_FPU_auto; i++)
kono
parents:
diff changeset
419 candidates.safe_push (all_fpus[i].name);
kono
parents:
diff changeset
420 char *s;
kono
parents:
diff changeset
421 const char *hint = candidates_list_and_hint (target, s, candidates);
kono
parents:
diff changeset
422 if (hint)
kono
parents:
diff changeset
423 inform (input_location, "valid arguments are: %s; did you mean %qs?",
kono
parents:
diff changeset
424 s, hint);
kono
parents:
diff changeset
425 else
kono
parents:
diff changeset
426 inform (input_location, "valid arguments are: %s", s);
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 XDELETEVEC (s);
kono
parents:
diff changeset
429 }
kono
parents:
diff changeset
430
kono
parents:
diff changeset
431 static const arm_fpu_desc *
kono
parents:
diff changeset
432 arm_parse_fpu_option (const char *opt)
kono
parents:
diff changeset
433 {
kono
parents:
diff changeset
434 int i;
kono
parents:
diff changeset
435
kono
parents:
diff changeset
436 for (i = 0; i < TARGET_FPU_auto; i++)
kono
parents:
diff changeset
437 {
kono
parents:
diff changeset
438 if (strcmp (all_fpus[i].name, opt) == 0)
kono
parents:
diff changeset
439 return all_fpus + i;
kono
parents:
diff changeset
440 }
kono
parents:
diff changeset
441
kono
parents:
diff changeset
442 error_at (input_location, "unrecognized -mfpu target: %s", opt);
kono
parents:
diff changeset
443 arm_print_hint_for_fpu_option (opt);
kono
parents:
diff changeset
444 return NULL;
kono
parents:
diff changeset
445 }
kono
parents:
diff changeset
446
kono
parents:
diff changeset
447 /* Convert a static initializer array of feature bits to sbitmap
kono
parents:
diff changeset
448 representation. */
kono
parents:
diff changeset
449 void
kono
parents:
diff changeset
450 arm_initialize_isa (sbitmap isa, const enum isa_feature *isa_bits)
kono
parents:
diff changeset
451 {
kono
parents:
diff changeset
452 bitmap_clear (isa);
kono
parents:
diff changeset
453 while (*isa_bits != isa_nobit)
kono
parents:
diff changeset
454 bitmap_set_bit (isa, *(isa_bits++));
kono
parents:
diff changeset
455 }
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 /* OPT isn't a recognized feature. Print a suitable error message and
kono
parents:
diff changeset
458 suggest a possible value. Always print the list of permitted
kono
parents:
diff changeset
459 values. */
kono
parents:
diff changeset
460 static void
kono
parents:
diff changeset
461 arm_unrecognized_feature (const char *opt, size_t len,
kono
parents:
diff changeset
462 const cpu_arch_option *target)
kono
parents:
diff changeset
463 {
kono
parents:
diff changeset
464 char *this_opt = XALLOCAVEC (char, len+1);
kono
parents:
diff changeset
465 auto_vec<const char*> candidates;
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 strncpy (this_opt, opt, len);
kono
parents:
diff changeset
468 this_opt[len] = 0;
kono
parents:
diff changeset
469
kono
parents:
diff changeset
470 error_at (input_location, "%qs does not support feature %qs", target->name,
kono
parents:
diff changeset
471 this_opt);
kono
parents:
diff changeset
472 for (const cpu_arch_extension *list = target->extensions;
kono
parents:
diff changeset
473 list->name != NULL;
kono
parents:
diff changeset
474 list++)
kono
parents:
diff changeset
475 candidates.safe_push (list->name);
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 char *s;
kono
parents:
diff changeset
478 const char *hint = candidates_list_and_hint (this_opt, s, candidates);
kono
parents:
diff changeset
479
kono
parents:
diff changeset
480 if (hint)
kono
parents:
diff changeset
481 inform (input_location, "valid feature names are: %s; did you mean %qs?",
kono
parents:
diff changeset
482 s, hint);
kono
parents:
diff changeset
483 else
kono
parents:
diff changeset
484 inform (input_location, "valid feature names are: %s", s);
kono
parents:
diff changeset
485
kono
parents:
diff changeset
486 XDELETEVEC (s);
kono
parents:
diff changeset
487 }
kono
parents:
diff changeset
488
kono
parents:
diff changeset
489 /* Parse any feature extensions to add to (or remove from) the
kono
parents:
diff changeset
490 permitted ISA selection. */
kono
parents:
diff changeset
491 void
kono
parents:
diff changeset
492 arm_parse_option_features (sbitmap isa, const cpu_arch_option *target,
kono
parents:
diff changeset
493 const char *opts_in)
kono
parents:
diff changeset
494 {
kono
parents:
diff changeset
495 const char *opts = opts_in;
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 if (!opts)
kono
parents:
diff changeset
498 return;
kono
parents:
diff changeset
499
kono
parents:
diff changeset
500 if (!target->extensions)
kono
parents:
diff changeset
501 {
kono
parents:
diff changeset
502 error_at (input_location, "%s does not take any feature options",
kono
parents:
diff changeset
503 target->name);
kono
parents:
diff changeset
504 return;
kono
parents:
diff changeset
505 }
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 while (opts)
kono
parents:
diff changeset
508 {
kono
parents:
diff changeset
509 gcc_assert (*opts == '+');
kono
parents:
diff changeset
510 const struct cpu_arch_extension *entry;
kono
parents:
diff changeset
511 const char *end = strchr (++opts, '+');
kono
parents:
diff changeset
512 size_t len = end ? end - opts : strlen (opts);
kono
parents:
diff changeset
513 bool matched = false;
kono
parents:
diff changeset
514
kono
parents:
diff changeset
515 for (entry = target->extensions;
kono
parents:
diff changeset
516 !matched && entry->name != NULL;
kono
parents:
diff changeset
517 entry++)
kono
parents:
diff changeset
518 {
kono
parents:
diff changeset
519 if (strncmp (entry->name, opts, len) == 0
kono
parents:
diff changeset
520 && entry->name[len] == '\0')
kono
parents:
diff changeset
521 {
kono
parents:
diff changeset
522 if (isa)
kono
parents:
diff changeset
523 {
kono
parents:
diff changeset
524 const enum isa_feature *f = entry->isa_bits;
kono
parents:
diff changeset
525 if (entry->remove)
kono
parents:
diff changeset
526 {
kono
parents:
diff changeset
527 while (*f != isa_nobit)
kono
parents:
diff changeset
528 bitmap_clear_bit (isa, *(f++));
kono
parents:
diff changeset
529 }
kono
parents:
diff changeset
530 else
kono
parents:
diff changeset
531 {
kono
parents:
diff changeset
532 while (*f != isa_nobit)
kono
parents:
diff changeset
533 bitmap_set_bit (isa, *(f++));
kono
parents:
diff changeset
534 }
kono
parents:
diff changeset
535 }
kono
parents:
diff changeset
536 matched = true;
kono
parents:
diff changeset
537 }
kono
parents:
diff changeset
538 }
kono
parents:
diff changeset
539
kono
parents:
diff changeset
540 if (!matched)
kono
parents:
diff changeset
541 arm_unrecognized_feature (opts, len, target);
kono
parents:
diff changeset
542
kono
parents:
diff changeset
543 opts = end;
kono
parents:
diff changeset
544 }
kono
parents:
diff changeset
545 }
kono
parents:
diff changeset
546
kono
parents:
diff changeset
547 class candidate_extension
kono
parents:
diff changeset
548 {
kono
parents:
diff changeset
549 public:
kono
parents:
diff changeset
550 const cpu_arch_extension *extension;
kono
parents:
diff changeset
551 sbitmap isa_bits;
kono
parents:
diff changeset
552 bool required;
kono
parents:
diff changeset
553
kono
parents:
diff changeset
554 candidate_extension (const cpu_arch_extension *ext, sbitmap bits)
kono
parents:
diff changeset
555 : extension (ext), isa_bits (bits), required (true)
kono
parents:
diff changeset
556 {}
kono
parents:
diff changeset
557 ~candidate_extension ()
kono
parents:
diff changeset
558 {
kono
parents:
diff changeset
559 sbitmap_free (isa_bits);
kono
parents:
diff changeset
560 }
kono
parents:
diff changeset
561 };
kono
parents:
diff changeset
562
kono
parents:
diff changeset
563 /* Generate a canonical representation of the -march option from the
kono
parents:
diff changeset
564 current -march string (if given) and other options on the command
kono
parents:
diff changeset
565 line that might affect the architecture. This aids multilib selection
kono
parents:
diff changeset
566 by ensuring that:
kono
parents:
diff changeset
567 a) the option is always present
kono
parents:
diff changeset
568 b) only the minimal set of options are used
kono
parents:
diff changeset
569 c) when there are multiple extensions, they are in a consistent order.
kono
parents:
diff changeset
570
kono
parents:
diff changeset
571 The options array consists of couplets of information where the
kono
parents:
diff changeset
572 first item in each couplet is the string describing which option
kono
parents:
diff changeset
573 name was selected (arch, cpu, fpu) and the second is the value
kono
parents:
diff changeset
574 passed for that option. */
kono
parents:
diff changeset
575 const char *
kono
parents:
diff changeset
576 arm_canon_arch_option (int argc, const char **argv)
kono
parents:
diff changeset
577 {
kono
parents:
diff changeset
578 const char *arch = NULL;
kono
parents:
diff changeset
579 const char *cpu = NULL;
kono
parents:
diff changeset
580 const char *fpu = NULL;
kono
parents:
diff changeset
581 const char *abi = NULL;
kono
parents:
diff changeset
582 static char *canonical_arch = NULL;
kono
parents:
diff changeset
583
kono
parents:
diff changeset
584 /* Just in case we're called more than once. */
kono
parents:
diff changeset
585 if (canonical_arch)
kono
parents:
diff changeset
586 {
kono
parents:
diff changeset
587 free (canonical_arch);
kono
parents:
diff changeset
588 canonical_arch = NULL;
kono
parents:
diff changeset
589 }
kono
parents:
diff changeset
590
kono
parents:
diff changeset
591 if (argc & 1)
kono
parents:
diff changeset
592 fatal_error (input_location,
kono
parents:
diff changeset
593 "%%:canon_for_mlib takes 1 or more pairs of parameters");
kono
parents:
diff changeset
594
kono
parents:
diff changeset
595 while (argc)
kono
parents:
diff changeset
596 {
kono
parents:
diff changeset
597 if (strcmp (argv[0], "arch") == 0)
kono
parents:
diff changeset
598 arch = argv[1];
kono
parents:
diff changeset
599 else if (strcmp (argv[0], "cpu") == 0)
kono
parents:
diff changeset
600 cpu = argv[1];
kono
parents:
diff changeset
601 else if (strcmp (argv[0], "fpu") == 0)
kono
parents:
diff changeset
602 fpu = argv[1];
kono
parents:
diff changeset
603 else if (strcmp (argv[0], "abi") == 0)
kono
parents:
diff changeset
604 abi = argv[1];
kono
parents:
diff changeset
605 else
kono
parents:
diff changeset
606 fatal_error (input_location,
kono
parents:
diff changeset
607 "unrecognized operand to %%:canon_for_mlib");
kono
parents:
diff changeset
608
kono
parents:
diff changeset
609 argc -= 2;
kono
parents:
diff changeset
610 argv += 2;
kono
parents:
diff changeset
611 }
kono
parents:
diff changeset
612
kono
parents:
diff changeset
613 auto_sbitmap target_isa (isa_num_bits);
kono
parents:
diff changeset
614 auto_sbitmap base_isa (isa_num_bits);
kono
parents:
diff changeset
615 auto_sbitmap fpu_isa (isa_num_bits);
kono
parents:
diff changeset
616
kono
parents:
diff changeset
617 bitmap_clear (fpu_isa);
kono
parents:
diff changeset
618
kono
parents:
diff changeset
619 const arch_option *selected_arch = NULL;
kono
parents:
diff changeset
620
kono
parents:
diff changeset
621 /* At least one of these must be defined by either the specs or the
kono
parents:
diff changeset
622 user. */
kono
parents:
diff changeset
623 gcc_assert (cpu || arch);
kono
parents:
diff changeset
624
kono
parents:
diff changeset
625 if (!fpu)
kono
parents:
diff changeset
626 fpu = FPUTYPE_AUTO;
kono
parents:
diff changeset
627
kono
parents:
diff changeset
628 if (!abi)
kono
parents:
diff changeset
629 {
kono
parents:
diff changeset
630 if (TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_SOFT)
kono
parents:
diff changeset
631 abi = "soft";
kono
parents:
diff changeset
632 else if (TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_SOFTFP)
kono
parents:
diff changeset
633 abi = "softfp";
kono
parents:
diff changeset
634 else if (TARGET_DEFAULT_FLOAT_ABI == ARM_FLOAT_ABI_HARD)
kono
parents:
diff changeset
635 abi = "hard";
kono
parents:
diff changeset
636 }
kono
parents:
diff changeset
637
kono
parents:
diff changeset
638 /* First build up a bitmap describing the target architecture. */
kono
parents:
diff changeset
639 if (arch)
kono
parents:
diff changeset
640 {
kono
parents:
diff changeset
641 selected_arch = arm_parse_arch_option_name (all_architectures,
kono
parents:
diff changeset
642 "-march", arch);
kono
parents:
diff changeset
643
kono
parents:
diff changeset
644 if (selected_arch == NULL)
kono
parents:
diff changeset
645 return "";
kono
parents:
diff changeset
646
kono
parents:
diff changeset
647 arm_initialize_isa (target_isa, selected_arch->common.isa_bits);
kono
parents:
diff changeset
648 arm_parse_option_features (target_isa, &selected_arch->common,
kono
parents:
diff changeset
649 strchr (arch, '+'));
kono
parents:
diff changeset
650 if (fpu && strcmp (fpu, "auto") != 0)
kono
parents:
diff changeset
651 {
kono
parents:
diff changeset
652 /* We assume that architectures do not have any FPU bits
kono
parents:
diff changeset
653 enabled by default. If they did, we would need to strip
kono
parents:
diff changeset
654 these out first. */
kono
parents:
diff changeset
655 const arm_fpu_desc *target_fpu = arm_parse_fpu_option (fpu);
kono
parents:
diff changeset
656 if (target_fpu == NULL)
kono
parents:
diff changeset
657 return "";
kono
parents:
diff changeset
658
kono
parents:
diff changeset
659 arm_initialize_isa (fpu_isa, target_fpu->isa_bits);
kono
parents:
diff changeset
660 bitmap_ior (target_isa, target_isa, fpu_isa);
kono
parents:
diff changeset
661 }
kono
parents:
diff changeset
662 }
kono
parents:
diff changeset
663 else if (cpu)
kono
parents:
diff changeset
664 {
kono
parents:
diff changeset
665 const cpu_option *selected_cpu
kono
parents:
diff changeset
666 = arm_parse_cpu_option_name (all_cores, "-mcpu", cpu);
kono
parents:
diff changeset
667
kono
parents:
diff changeset
668 if (selected_cpu == NULL)
kono
parents:
diff changeset
669 return "";
kono
parents:
diff changeset
670
kono
parents:
diff changeset
671 arm_initialize_isa (target_isa, selected_cpu->common.isa_bits);
kono
parents:
diff changeset
672 arm_parse_option_features (target_isa, &selected_cpu->common,
kono
parents:
diff changeset
673 strchr (cpu, '+'));
kono
parents:
diff changeset
674 if (fpu && strcmp (fpu, "auto") != 0)
kono
parents:
diff changeset
675 {
kono
parents:
diff changeset
676 /* The easiest and safest way to remove the default fpu
kono
parents:
diff changeset
677 capabilities is to look for a '+no..' option that removes
kono
parents:
diff changeset
678 the base FPU bit (isa_bit_vfpv2). If that doesn't exist
kono
parents:
diff changeset
679 then the best we can do is strip out all the bits that
kono
parents:
diff changeset
680 might be part of the most capable FPU we know about,
kono
parents:
diff changeset
681 which is "crypto-neon-fp-armv8". */
kono
parents:
diff changeset
682 bool default_fpu_found = false;
kono
parents:
diff changeset
683 if (selected_cpu->common.extensions)
kono
parents:
diff changeset
684 {
kono
parents:
diff changeset
685 const cpu_arch_extension *ext;
kono
parents:
diff changeset
686 for (ext = selected_cpu->common.extensions; ext->name != NULL;
kono
parents:
diff changeset
687 ++ext)
kono
parents:
diff changeset
688 {
kono
parents:
diff changeset
689 if (ext->remove
kono
parents:
diff changeset
690 && check_isa_bits_for (ext->isa_bits, isa_bit_vfpv2))
kono
parents:
diff changeset
691 {
kono
parents:
diff changeset
692 arm_initialize_isa (fpu_isa, ext->isa_bits);
kono
parents:
diff changeset
693 bitmap_and_compl (target_isa, target_isa, fpu_isa);
kono
parents:
diff changeset
694 default_fpu_found = true;
kono
parents:
diff changeset
695 }
kono
parents:
diff changeset
696 }
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 }
kono
parents:
diff changeset
699
kono
parents:
diff changeset
700 if (!default_fpu_found)
kono
parents:
diff changeset
701 {
kono
parents:
diff changeset
702 arm_initialize_isa
kono
parents:
diff changeset
703 (fpu_isa,
kono
parents:
diff changeset
704 all_fpus[TARGET_FPU_crypto_neon_fp_armv8].isa_bits);
kono
parents:
diff changeset
705 bitmap_and_compl (target_isa, target_isa, fpu_isa);
kono
parents:
diff changeset
706 }
kono
parents:
diff changeset
707
kono
parents:
diff changeset
708 const arm_fpu_desc *target_fpu = arm_parse_fpu_option (fpu);
kono
parents:
diff changeset
709 if (target_fpu == NULL)
kono
parents:
diff changeset
710 return "";
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712 arm_initialize_isa (fpu_isa, target_fpu->isa_bits);
kono
parents:
diff changeset
713 bitmap_ior (target_isa, target_isa, fpu_isa);
kono
parents:
diff changeset
714 }
kono
parents:
diff changeset
715
kono
parents:
diff changeset
716 selected_arch = all_architectures + selected_cpu->arch;
kono
parents:
diff changeset
717 }
kono
parents:
diff changeset
718
kono
parents:
diff changeset
719 /* If we have a soft-float ABI, disable the FPU. */
kono
parents:
diff changeset
720 if (abi && strcmp (abi, "soft") == 0)
kono
parents:
diff changeset
721 {
kono
parents:
diff changeset
722 /* Clearing the VFPv2 bit is sufficient to stop any extention that
kono
parents:
diff changeset
723 builds on the FPU from matching. */
kono
parents:
diff changeset
724 bitmap_clear_bit (target_isa, isa_bit_vfpv2);
kono
parents:
diff changeset
725 }
kono
parents:
diff changeset
726
kono
parents:
diff changeset
727 /* If we don't have a selected architecture by now, something's
kono
parents:
diff changeset
728 badly wrong. */
kono
parents:
diff changeset
729 gcc_assert (selected_arch);
kono
parents:
diff changeset
730
kono
parents:
diff changeset
731 arm_initialize_isa (base_isa, selected_arch->common.isa_bits);
kono
parents:
diff changeset
732
kono
parents:
diff changeset
733 /* Architecture has no extension options, so just return the canonical
kono
parents:
diff changeset
734 architecture name. */
kono
parents:
diff changeset
735 if (selected_arch->common.extensions == NULL)
kono
parents:
diff changeset
736 return selected_arch->common.name;
kono
parents:
diff changeset
737
kono
parents:
diff changeset
738 /* We're only interested in extension bits. */
kono
parents:
diff changeset
739 bitmap_and_compl (target_isa, target_isa, base_isa);
kono
parents:
diff changeset
740
kono
parents:
diff changeset
741 /* There are no extensions needed. Just return the canonical architecture
kono
parents:
diff changeset
742 name. */
kono
parents:
diff changeset
743 if (bitmap_empty_p (target_isa))
kono
parents:
diff changeset
744 return selected_arch->common.name;
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 /* What is left is the architecture that the compiler will target. We
kono
parents:
diff changeset
747 now need to map that back into a suitable option+features list.
kono
parents:
diff changeset
748
kono
parents:
diff changeset
749 The list is built in two passes. First we scan every additive
kono
parents:
diff changeset
750 option feature supported by the architecture. If the option
kono
parents:
diff changeset
751 provides a subset of the features we need we add it to the list
kono
parents:
diff changeset
752 of candidates. We then scan backwards over the list of
kono
parents:
diff changeset
753 candidates and if we find a feature that adds nothing to one that
kono
parents:
diff changeset
754 was later in the list we mark it as redundant. The result is a
kono
parents:
diff changeset
755 minimal list of required features for the target
kono
parents:
diff changeset
756 architecture. */
kono
parents:
diff changeset
757
kono
parents:
diff changeset
758 std::list<candidate_extension *> extensions;
kono
parents:
diff changeset
759
kono
parents:
diff changeset
760 auto_sbitmap target_isa_unsatisfied (isa_num_bits);
kono
parents:
diff changeset
761 bitmap_copy (target_isa_unsatisfied, target_isa);
kono
parents:
diff changeset
762
kono
parents:
diff changeset
763 sbitmap isa_bits = NULL;
kono
parents:
diff changeset
764 for (const cpu_arch_extension *cand = selected_arch->common.extensions;
kono
parents:
diff changeset
765 cand->name != NULL;
kono
parents:
diff changeset
766 cand++)
kono
parents:
diff changeset
767 {
kono
parents:
diff changeset
768 if (cand->remove || cand->alias)
kono
parents:
diff changeset
769 continue;
kono
parents:
diff changeset
770
kono
parents:
diff changeset
771 if (isa_bits == NULL)
kono
parents:
diff changeset
772 isa_bits = sbitmap_alloc (isa_num_bits);
kono
parents:
diff changeset
773
kono
parents:
diff changeset
774 arm_initialize_isa (isa_bits, cand->isa_bits);
kono
parents:
diff changeset
775 if (bitmap_subset_p (isa_bits, target_isa))
kono
parents:
diff changeset
776 {
kono
parents:
diff changeset
777 extensions.push_back (new candidate_extension (cand, isa_bits));
kono
parents:
diff changeset
778 bitmap_and_compl (target_isa_unsatisfied, target_isa_unsatisfied,
kono
parents:
diff changeset
779 isa_bits);
kono
parents:
diff changeset
780 isa_bits = NULL;
kono
parents:
diff changeset
781 }
kono
parents:
diff changeset
782 }
kono
parents:
diff changeset
783
kono
parents:
diff changeset
784 /* There's one extra case to consider, which is that the user has
kono
parents:
diff changeset
785 specified an FPU that is less capable than this architecture
kono
parents:
diff changeset
786 supports. In that case the code above will fail to find a
kono
parents:
diff changeset
787 suitable feature. We handle this by scanning the list of options
kono
parents:
diff changeset
788 again, matching the first option that provides an FPU that is
kono
parents:
diff changeset
789 more capable than the selected FPU.
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 Note that the other case (user specified a more capable FPU than
kono
parents:
diff changeset
792 this architecture supports) should end up selecting the most
kono
parents:
diff changeset
793 capable FPU variant that we do support. This is sufficient for
kono
parents:
diff changeset
794 multilib selection. */
kono
parents:
diff changeset
795
kono
parents:
diff changeset
796 if (bitmap_bit_p (target_isa_unsatisfied, isa_bit_vfpv2)
kono
parents:
diff changeset
797 && bitmap_bit_p (fpu_isa, isa_bit_vfpv2))
kono
parents:
diff changeset
798 {
kono
parents:
diff changeset
799 std::list<candidate_extension *>::iterator ipoint = extensions.begin ();
kono
parents:
diff changeset
800
kono
parents:
diff changeset
801 for (const cpu_arch_extension *cand = selected_arch->common.extensions;
kono
parents:
diff changeset
802 cand->name != NULL;
kono
parents:
diff changeset
803 cand++)
kono
parents:
diff changeset
804 {
kono
parents:
diff changeset
805 if (cand->remove || cand->alias)
kono
parents:
diff changeset
806 continue;
kono
parents:
diff changeset
807
kono
parents:
diff changeset
808 if (isa_bits == NULL)
kono
parents:
diff changeset
809 isa_bits = sbitmap_alloc (isa_num_bits);
kono
parents:
diff changeset
810
kono
parents:
diff changeset
811 /* We need to keep the features in canonical order, so move the
kono
parents:
diff changeset
812 insertion point if this feature is a candidate. */
kono
parents:
diff changeset
813 if (ipoint != extensions.end ()
kono
parents:
diff changeset
814 && (*ipoint)->extension == cand)
kono
parents:
diff changeset
815 ++ipoint;
kono
parents:
diff changeset
816
kono
parents:
diff changeset
817 arm_initialize_isa (isa_bits, cand->isa_bits);
kono
parents:
diff changeset
818 if (bitmap_subset_p (fpu_isa, isa_bits))
kono
parents:
diff changeset
819 {
kono
parents:
diff changeset
820 extensions.insert (ipoint,
kono
parents:
diff changeset
821 new candidate_extension (cand, isa_bits));
kono
parents:
diff changeset
822 isa_bits = NULL;
kono
parents:
diff changeset
823 break;
kono
parents:
diff changeset
824 }
kono
parents:
diff changeset
825 }
kono
parents:
diff changeset
826 }
kono
parents:
diff changeset
827
kono
parents:
diff changeset
828 if (isa_bits)
kono
parents:
diff changeset
829 sbitmap_free (isa_bits);
kono
parents:
diff changeset
830
kono
parents:
diff changeset
831 bitmap_clear (target_isa);
kono
parents:
diff changeset
832 size_t len = 1;
kono
parents:
diff changeset
833 for (std::list<candidate_extension *>::reverse_iterator riter
kono
parents:
diff changeset
834 = extensions.rbegin ();
kono
parents:
diff changeset
835 riter != extensions.rend (); ++riter)
kono
parents:
diff changeset
836 {
kono
parents:
diff changeset
837 if (bitmap_subset_p ((*riter)->isa_bits, target_isa))
kono
parents:
diff changeset
838 (*riter)->required = false;
kono
parents:
diff changeset
839 else
kono
parents:
diff changeset
840 {
kono
parents:
diff changeset
841 bitmap_ior (target_isa, target_isa, (*riter)->isa_bits);
kono
parents:
diff changeset
842 len += strlen ((*riter)->extension->name) + 1;
kono
parents:
diff changeset
843 }
kono
parents:
diff changeset
844 }
kono
parents:
diff changeset
845
kono
parents:
diff changeset
846 canonical_arch
kono
parents:
diff changeset
847 = (char *) xmalloc (len + strlen (selected_arch->common.name));
kono
parents:
diff changeset
848
kono
parents:
diff changeset
849 strcpy (canonical_arch, selected_arch->common.name);
kono
parents:
diff changeset
850
kono
parents:
diff changeset
851 for (std::list<candidate_extension *>::iterator iter = extensions.begin ();
kono
parents:
diff changeset
852 iter != extensions.end (); ++iter)
kono
parents:
diff changeset
853 {
kono
parents:
diff changeset
854 if ((*iter)->required)
kono
parents:
diff changeset
855 {
kono
parents:
diff changeset
856 strcat (canonical_arch, "+");
kono
parents:
diff changeset
857 strcat (canonical_arch, (*iter)->extension->name);
kono
parents:
diff changeset
858 }
kono
parents:
diff changeset
859 delete (*iter);
kono
parents:
diff changeset
860 }
kono
parents:
diff changeset
861
kono
parents:
diff changeset
862 return canonical_arch;
kono
parents:
diff changeset
863 }
kono
parents:
diff changeset
864
kono
parents:
diff changeset
865 /* If building big-endian on a BE8 target generate a --be8 option for
kono
parents:
diff changeset
866 the linker. Takes four types of option: "little" - little-endian;
kono
parents:
diff changeset
867 "big" - big-endian; "be8" - force be8 iff big-endian; and "arch"
kono
parents:
diff changeset
868 "<arch-name>" (two arguments) - the target architecture. The
kono
parents:
diff changeset
869 parameter names are generated by the driver from the command-line
kono
parents:
diff changeset
870 options. */
kono
parents:
diff changeset
871 const char *
kono
parents:
diff changeset
872 arm_be8_option (int argc, const char **argv)
kono
parents:
diff changeset
873 {
kono
parents:
diff changeset
874 int endian = TARGET_ENDIAN_DEFAULT;
kono
parents:
diff changeset
875 const char *arch = NULL;
kono
parents:
diff changeset
876 int arg;
kono
parents:
diff changeset
877 bool force = false;
kono
parents:
diff changeset
878
kono
parents:
diff changeset
879 for (arg = 0; arg < argc; arg++)
kono
parents:
diff changeset
880 {
kono
parents:
diff changeset
881 if (strcmp (argv[arg], "little") == 0)
kono
parents:
diff changeset
882 endian = 0;
kono
parents:
diff changeset
883 else if (strcmp (argv[arg], "big") == 0)
kono
parents:
diff changeset
884 endian = 1;
kono
parents:
diff changeset
885 else if (strcmp (argv[arg], "be8") == 0)
kono
parents:
diff changeset
886 force = true;
kono
parents:
diff changeset
887 else if (strcmp (argv[arg], "arch") == 0)
kono
parents:
diff changeset
888 {
kono
parents:
diff changeset
889 arg++;
kono
parents:
diff changeset
890 gcc_assert (arg < argc);
kono
parents:
diff changeset
891 arch = argv[arg];
kono
parents:
diff changeset
892 }
kono
parents:
diff changeset
893 else
kono
parents:
diff changeset
894 gcc_unreachable ();
kono
parents:
diff changeset
895 }
kono
parents:
diff changeset
896
kono
parents:
diff changeset
897 /* Little endian - no be8 option. */
kono
parents:
diff changeset
898 if (!endian)
kono
parents:
diff changeset
899 return "";
kono
parents:
diff changeset
900
kono
parents:
diff changeset
901 if (force)
kono
parents:
diff changeset
902 return "--be8";
kono
parents:
diff changeset
903
kono
parents:
diff changeset
904 /* Arch might not be set iff arm_canon_arch (above) detected an
kono
parents:
diff changeset
905 error. Do nothing in that case. */
kono
parents:
diff changeset
906 if (!arch)
kono
parents:
diff changeset
907 return "";
kono
parents:
diff changeset
908
kono
parents:
diff changeset
909 const arch_option *selected_arch
kono
parents:
diff changeset
910 = arm_parse_arch_option_name (all_architectures, "-march", arch);
kono
parents:
diff changeset
911
kono
parents:
diff changeset
912 /* Similarly if the given arch option was itself invalid. */
kono
parents:
diff changeset
913 if (!selected_arch)
kono
parents:
diff changeset
914 return "";
kono
parents:
diff changeset
915
kono
parents:
diff changeset
916 if (check_isa_bits_for (selected_arch->common.isa_bits, isa_bit_be8))
kono
parents:
diff changeset
917 return "--be8";
kono
parents:
diff changeset
918
kono
parents:
diff changeset
919 return "";
kono
parents:
diff changeset
920 }
kono
parents:
diff changeset
921
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
922 /* Generate a -mfpu= option for passing to the assembler. This is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
923 only called when -mfpu was set (possibly defaulted) to auto and is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
924 needed to ensure that the assembler knows the correct FPU to use.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
925 It wouldn't really be needed except that the compiler can be used
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
926 to invoke the assembler directly on hand-written files that lack
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
927 the necessary internal .fpu directives. We assume that the architecture
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
928 canonicalization calls have already been made so that we have a final
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
929 -march= option to derive the fpu from. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
930 const char*
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
931 arm_asm_auto_mfpu (int argc, const char **argv)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
932 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
933 static char *auto_fpu = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
934 const char *arch = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
935 static const enum isa_feature fpu_bitlist[]
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
936 = { ISA_ALL_FPU_INTERNAL, isa_nobit };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
937 const arch_option *selected_arch;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
938 static const char* fpuname = "softvfp";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
939
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
940 /* Handle multiple calls to this routine. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
941 if (auto_fpu)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
942 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
943 free (auto_fpu);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
944 auto_fpu = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
945 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
946
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
947 while (argc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
948 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
949 if (strcmp (argv[0], "arch") == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
950 arch = argv[1];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
951 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
952 fatal_error (input_location,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
953 "unrecognized operand to %%:asm_auto_mfpu");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
954 argc -= 2;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
955 argv += 2;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
956 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
957
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
958 auto_sbitmap target_isa (isa_num_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
959 auto_sbitmap fpubits (isa_num_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
960
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
961 gcc_assert (arch != NULL);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
962 selected_arch = arm_parse_arch_option_name (all_architectures,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
963 "-march", arch);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
964 if (selected_arch == NULL)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
965 return "";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
966
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
967 arm_initialize_isa (target_isa, selected_arch->common.isa_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
968 arm_parse_option_features (target_isa, &selected_arch->common,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
969 strchr (arch, '+'));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
970 arm_initialize_isa (fpubits, fpu_bitlist);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
971
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
972 bitmap_and (fpubits, fpubits, target_isa);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
973
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
974 /* The logic below is essentially identical to that in
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
975 arm.c:arm_identify_fpu_from_isa(), but that only works in the main
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
976 part of the compiler. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
977
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
978 /* If there are no FPU capability bits, we just pass -mfpu=softvfp. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
979 if (!bitmap_empty_p (fpubits))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
980 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
981 unsigned int i;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
982 auto_sbitmap cand_fpubits (isa_num_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
983 for (i = 0; i < TARGET_FPU_auto; i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
984 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
985 arm_initialize_isa (cand_fpubits, all_fpus[i].isa_bits);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
986 if (bitmap_equal_p (fpubits, cand_fpubits))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
987 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
988 fpuname = all_fpus[i].name;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
989 break;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
990 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
991 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
992
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
993 gcc_assert (i != TARGET_FPU_auto);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
994 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
995
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
996 auto_fpu = (char *) xmalloc (strlen (fpuname) + sizeof ("-mfpu="));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
997 strcpy (auto_fpu, "-mfpu=");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
998 strcat (auto_fpu, fpuname);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
999 return auto_fpu;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1000 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1001
111
kono
parents:
diff changeset
1002 #undef ARM_CPU_NAME_LENGTH
kono
parents:
diff changeset
1003
kono
parents:
diff changeset
1004
kono
parents:
diff changeset
1005 #undef TARGET_DEFAULT_TARGET_FLAGS
kono
parents:
diff changeset
1006 #define TARGET_DEFAULT_TARGET_FLAGS (TARGET_DEFAULT | MASK_SCHED_PROLOG)
kono
parents:
diff changeset
1007
kono
parents:
diff changeset
1008 #undef TARGET_OPTION_OPTIMIZATION_TABLE
kono
parents:
diff changeset
1009 #define TARGET_OPTION_OPTIMIZATION_TABLE arm_option_optimization_table
kono
parents:
diff changeset
1010
kono
parents:
diff changeset
1011 #undef TARGET_EXCEPT_UNWIND_INFO
kono
parents:
diff changeset
1012 #define TARGET_EXCEPT_UNWIND_INFO arm_except_unwind_info
kono
parents:
diff changeset
1013
kono
parents:
diff changeset
1014 struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER;