1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
|
From ba32885874fc6caa90f6ae5e264bc3d51f64a26e Mon Sep 17 00:00:00 2001
From: Wilco Dijkstra <wilco.dijkstra@arm.com>
Date: Wed, 1 Jun 2022 16:46:36 +0100
Subject: [PATCH 006/157] [Backport][SME] AArch64: Cleanup option processing
code
Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=ae54c1b09963779c5c3914782324ff48af32e2f1
Further cleanup option processing. Remove the duplication of global
variables for CPU and tune settings so that CPU option processing is
simplified even further. Move global variables that need save and
restore due to target option processing into aarch64.opt. This removes
the need for explicit saving/restoring and unnecessary reparsing of
options.
gcc/
* config/aarch64/aarch64.opt (explicit_tune_core): Rename to
selected_tune.
(explicit_arch): Rename to selected_arch.
(x_aarch64_override_tune_string): Remove.
(aarch64_ra_sign_key): Add as TargetVariable so it gets saved/restored.
(aarch64_override_tune_string): Add Save so it gets saved/restored.
* config/aarch64/aarch64.h (aarch64_architecture_version): Remove.
* config/aarch64/aarch64.cc (aarch64_architecture_version): Remove.
(processor): Remove archtecture_version field.
(selected_arch): Remove global.
(selected_cpu): Remove global.
(selected_tune): Remove global.
(aarch64_ra_sign_key): Move global to aarch64.opt so it is saved.
(aarch64_override_options_internal): Use aarch64_get_tune_cpu.
(aarch64_override_options): Further simplify code to only set
selected_arch and selected_tune globals.
(aarch64_option_save): Remove now that target options are saved.
(aarch64_option_restore): Remove redundant target option restores.
* config/aarch64/aarch64-c.cc (aarch64_update_cpp_builtins): Use
AARCH64_ISA_V9.
* config/aarch64/aarch64-opts.h (aarch64_key_type): Add, moved from...
* config/aarch64/aarch64-protos.h (aarch64_key_type): Remove.
(aarch64_ra_sign_key): Remove.
---
gcc/config/aarch64/aarch64-c.cc | 2 +-
gcc/config/aarch64/aarch64-opts.h | 6 +
gcc/config/aarch64/aarch64-protos.h | 8 --
gcc/config/aarch64/aarch64.cc | 183 ++++++++++------------------
gcc/config/aarch64/aarch64.h | 3 -
gcc/config/aarch64/aarch64.opt | 12 +-
6 files changed, 76 insertions(+), 138 deletions(-)
diff --git a/gcc/config/aarch64/aarch64-c.cc b/gcc/config/aarch64/aarch64-c.cc
index a4c407724..90d45e45d 100644
--- a/gcc/config/aarch64/aarch64-c.cc
+++ b/gcc/config/aarch64/aarch64-c.cc
@@ -82,7 +82,7 @@ aarch64_update_cpp_builtins (cpp_reader *pfile)
{
aarch64_def_or_undef (flag_unsafe_math_optimizations, "__ARM_FP_FAST", pfile);
- builtin_define_with_int_value ("__ARM_ARCH", aarch64_architecture_version);
+ builtin_define_with_int_value ("__ARM_ARCH", AARCH64_ISA_V9 ? 9 : 8);
builtin_define_with_int_value ("__ARM_SIZEOF_MINIMAL_ENUM",
flag_short_enums ? 1 : 4);
diff --git a/gcc/config/aarch64/aarch64-opts.h b/gcc/config/aarch64/aarch64-opts.h
index 93572fe83..421648a15 100644
--- a/gcc/config/aarch64/aarch64-opts.h
+++ b/gcc/config/aarch64/aarch64-opts.h
@@ -98,4 +98,10 @@ enum stack_protector_guard {
SSP_GLOBAL /* global canary */
};
+/* The key type that -msign-return-address should use. */
+enum aarch64_key_type {
+ AARCH64_KEY_A,
+ AARCH64_KEY_B
+};
+
#endif
diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h
index 475d174dd..e60ce3c36 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -672,14 +672,6 @@ enum simd_immediate_check {
AARCH64_CHECK_MOV = AARCH64_CHECK_ORR | AARCH64_CHECK_BIC
};
-/* The key type that -msign-return-address should use. */
-enum aarch64_key_type {
- AARCH64_KEY_A,
- AARCH64_KEY_B
-};
-
-extern enum aarch64_key_type aarch64_ra_sign_key;
-
extern struct tune_params aarch64_tune_params;
/* The available SVE predicate patterns, known in the ACLE as "svpattern". */
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index ba888beb0..254ecfaa2 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -306,9 +306,6 @@ static bool aarch64_print_address_internal (FILE*, machine_mode, rtx,
aarch64_addr_query_type);
static HOST_WIDE_INT aarch64_clamp_to_uimm12_shift (HOST_WIDE_INT val);
-/* Major revision number of the ARM Architecture implemented by the target. */
-unsigned aarch64_architecture_version;
-
/* The processor for which instructions should be scheduled. */
enum aarch64_processor aarch64_tune = cortexa53;
@@ -2931,7 +2928,6 @@ struct processor
enum aarch64_processor ident;
enum aarch64_processor sched_core;
enum aarch64_arch arch;
- unsigned architecture_version;
const uint64_t flags;
const struct tune_params *const tune;
};
@@ -2940,9 +2936,9 @@ struct processor
static const struct processor all_architectures[] =
{
#define AARCH64_ARCH(NAME, CORE, ARCH_IDENT, ARCH_REV, FLAGS) \
- {NAME, CORE, CORE, AARCH64_ARCH_##ARCH_IDENT, ARCH_REV, FLAGS, NULL},
+ {NAME, CORE, CORE, AARCH64_ARCH_##ARCH_IDENT, FLAGS, NULL},
#include "aarch64-arches.def"
- {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, 0, NULL}
+ {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, NULL}
};
/* Processor cores implementing AArch64. */
@@ -2950,23 +2946,13 @@ static const struct processor all_cores[] =
{
#define AARCH64_CORE(NAME, IDENT, SCHED, ARCH, FLAGS, COSTS, IMP, PART, VARIANT) \
{NAME, IDENT, SCHED, AARCH64_ARCH_##ARCH, \
- all_architectures[AARCH64_ARCH_##ARCH].architecture_version, \
FLAGS, &COSTS##_tunings},
#include "aarch64-cores.def"
- {"generic", generic, cortexa53, AARCH64_ARCH_8A, 8,
+ {"generic", generic, cortexa53, AARCH64_ARCH_8A,
AARCH64_FL_FOR_ARCH8, &generic_tunings},
- {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, 0, NULL}
+ {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, NULL}
};
-
-/* Target specification. These are populated by the -march, -mtune, -mcpu
- handling code or by target attributes. */
-static const struct processor *selected_arch;
-static const struct processor *selected_cpu;
-static const struct processor *selected_tune;
-
-enum aarch64_key_type aarch64_ra_sign_key = AARCH64_KEY_A;
-
/* The current tuning set. */
struct tune_params aarch64_tune_params = generic_tunings;
@@ -10633,8 +10619,8 @@ aarch64_case_values_threshold (void)
/* Use the specified limit for the number of cases before using jump
tables at higher optimization levels. */
if (optimize > 2
- && selected_cpu->tune->max_case_values != 0)
- return selected_cpu->tune->max_case_values;
+ && aarch64_tune_params.max_case_values != 0)
+ return aarch64_tune_params.max_case_values;
else
return optimize_size ? 8 : 11;
}
@@ -17769,6 +17755,26 @@ initialize_aarch64_tls_size (struct gcc_options *opts)
return;
}
+/* Return the CPU corresponding to the enum CPU. */
+
+static const struct processor *
+aarch64_get_tune_cpu (enum aarch64_processor cpu)
+{
+ gcc_assert (cpu != aarch64_none);
+
+ return &all_cores[cpu];
+}
+
+/* Return the architecture corresponding to the enum ARCH. */
+
+static const struct processor *
+aarch64_get_arch (enum aarch64_arch arch)
+{
+ gcc_assert (arch != aarch64_no_arch);
+
+ return &all_architectures[arch];
+}
+
/* Parse STRING looking for options in the format:
string :: option:string
option :: name=substring
@@ -17879,18 +17885,18 @@ aarch64_override_options_after_change_1 (struct gcc_options *opts)
void
aarch64_override_options_internal (struct gcc_options *opts)
{
- aarch64_tune_flags = selected_tune->flags;
- aarch64_tune = selected_tune->sched_core;
+ const struct processor *tune = aarch64_get_tune_cpu (opts->x_selected_tune);
+ aarch64_tune_flags = tune->flags;
+ aarch64_tune = tune->sched_core;
/* Make a copy of the tuning parameters attached to the core, which
we may later overwrite. */
- aarch64_tune_params = *(selected_tune->tune);
- aarch64_architecture_version = selected_arch->architecture_version;
- if (selected_tune->tune == &generic_tunings)
+ aarch64_tune_params = *(tune->tune);
+ if (tune->tune == &generic_tunings)
aarch64_adjust_generic_arch_tuning (aarch64_tune_params);
if (opts->x_aarch64_override_tune_string)
aarch64_parse_override_string (opts->x_aarch64_override_tune_string,
- &aarch64_tune_params);
+ &aarch64_tune_params);
/* This target defaults to strict volatile bitfields. */
if (opts->x_flag_strict_volatile_bitfields < 0 && abi_version_at_least (2))
@@ -18051,13 +18057,6 @@ aarch64_override_options_internal (struct gcc_options *opts)
&& opts->x_optimize >= aarch64_tune_params.prefetch->default_opt_level)
opts->x_flag_prefetch_loop_arrays = 1;
- if (opts->x_aarch64_arch_string == NULL)
- opts->x_aarch64_arch_string = selected_arch->name;
- if (opts->x_aarch64_cpu_string == NULL)
- opts->x_aarch64_cpu_string = selected_cpu->name;
- if (opts->x_aarch64_tune_string == NULL)
- opts->x_aarch64_tune_string = selected_tune->name;
-
aarch64_override_options_after_change_1 (opts);
}
@@ -18409,26 +18408,6 @@ aarch64_validate_mtune (const char *str, const struct processor **res)
return false;
}
-/* Return the CPU corresponding to the enum CPU. */
-
-static const struct processor *
-aarch64_get_tune_cpu (enum aarch64_processor cpu)
-{
- gcc_assert (cpu != aarch64_none);
-
- return &all_cores[cpu];
-}
-
-/* Return the architecture corresponding to the enum ARCH. */
-
-static const struct processor *
-aarch64_get_arch (enum aarch64_arch arch)
-{
- gcc_assert (arch != aarch64_no_arch);
-
- return &all_architectures[arch];
-}
-
/* Return the VG value associated with -msve-vector-bits= value VALUE. */
static poly_uint16
@@ -18464,9 +18443,9 @@ aarch64_override_options (void)
uint64_t arch_isa = 0;
aarch64_isa_flags = 0;
- selected_cpu = NULL;
- selected_arch = NULL;
- selected_tune = NULL;
+ const struct processor *cpu = NULL;
+ const struct processor *arch = NULL;
+ const struct processor *tune = NULL;
if (aarch64_harden_sls_string)
aarch64_validate_sls_mitigation (aarch64_harden_sls_string);
@@ -18478,56 +18457,52 @@ aarch64_override_options (void)
If either of -march or -mtune is given, they override their
respective component of -mcpu. */
if (aarch64_cpu_string)
- aarch64_validate_mcpu (aarch64_cpu_string, &selected_cpu, &cpu_isa);
+ aarch64_validate_mcpu (aarch64_cpu_string, &cpu, &cpu_isa);
if (aarch64_arch_string)
- aarch64_validate_march (aarch64_arch_string, &selected_arch, &arch_isa);
+ aarch64_validate_march (aarch64_arch_string, &arch, &arch_isa);
if (aarch64_tune_string)
- aarch64_validate_mtune (aarch64_tune_string, &selected_tune);
+ aarch64_validate_mtune (aarch64_tune_string, &tune);
#ifdef SUBTARGET_OVERRIDE_OPTIONS
SUBTARGET_OVERRIDE_OPTIONS;
#endif
- if (selected_cpu && selected_arch)
+ if (cpu && arch)
{
/* If both -mcpu and -march are specified, warn if they are not
architecturally compatible and prefer the -march ISA flags. */
- if (selected_arch->arch != selected_cpu->arch)
+ if (arch->arch != cpu->arch)
{
warning (0, "switch %<-mcpu=%s%> conflicts with %<-march=%s%> switch",
aarch64_cpu_string,
aarch64_arch_string);
}
+ selected_arch = arch->arch;
aarch64_isa_flags = arch_isa;
}
- else if (selected_cpu)
+ else if (cpu)
{
- selected_arch = &all_architectures[selected_cpu->arch];
+ selected_arch = cpu->arch;
aarch64_isa_flags = cpu_isa;
}
- else if (selected_arch)
+ else if (arch)
{
- selected_cpu = &all_cores[selected_arch->ident];
+ cpu = &all_cores[arch->ident];
+ selected_arch = arch->arch;
aarch64_isa_flags = arch_isa;
}
else
{
/* No -mcpu or -march specified, so use the default CPU. */
- selected_cpu = &all_cores[TARGET_CPU_DEFAULT];
- selected_arch = &all_architectures[selected_cpu->arch];
- aarch64_isa_flags = selected_cpu->flags;
+ cpu = &all_cores[TARGET_CPU_DEFAULT];
+ selected_arch = cpu->arch;
+ aarch64_isa_flags = cpu->flags;
}
- explicit_arch = selected_arch->arch;
- if (!selected_tune)
- selected_tune = selected_cpu;
- explicit_tune_core = selected_tune->ident;
-
- gcc_assert (explicit_tune_core != aarch64_none);
- gcc_assert (explicit_arch != aarch64_no_arch);
+ selected_tune = tune ? tune->ident : cpu->ident;
if (aarch64_enable_bti == 2)
{
@@ -18646,38 +18621,14 @@ initialize_aarch64_code_model (struct gcc_options *opts)
}
}
-/* Implement TARGET_OPTION_SAVE. */
-
-static void
-aarch64_option_save (struct cl_target_option *ptr, struct gcc_options *opts,
- struct gcc_options */* opts_set */)
-{
- ptr->x_aarch64_override_tune_string = opts->x_aarch64_override_tune_string;
- ptr->x_aarch64_branch_protection_string
- = opts->x_aarch64_branch_protection_string;
-}
-
/* Implements TARGET_OPTION_RESTORE. Restore the backend codegen decisions
using the information saved in PTR. */
static void
aarch64_option_restore (struct gcc_options *opts,
- struct gcc_options */* opts_set */,
- struct cl_target_option *ptr)
+ struct gcc_options * /* opts_set */,
+ struct cl_target_option * /* ptr */)
{
- opts->x_explicit_arch = ptr->x_explicit_arch;
- selected_arch = aarch64_get_arch (ptr->x_explicit_arch);
- opts->x_explicit_tune_core = ptr->x_explicit_tune_core;
- selected_tune = aarch64_get_tune_cpu (ptr->x_explicit_tune_core);
- opts->x_aarch64_override_tune_string = ptr->x_aarch64_override_tune_string;
- opts->x_aarch64_branch_protection_string
- = ptr->x_aarch64_branch_protection_string;
- if (opts->x_aarch64_branch_protection_string)
- {
- aarch64_parse_branch_protection (opts->x_aarch64_branch_protection_string,
- NULL);
- }
-
aarch64_override_options_internal (opts);
}
@@ -18687,11 +18638,11 @@ static void
aarch64_option_print (FILE *file, int indent, struct cl_target_option *ptr)
{
const struct processor *cpu
- = aarch64_get_tune_cpu (ptr->x_explicit_tune_core);
- uint64_t isa_flags = ptr->x_aarch64_isa_flags;
- const struct processor *arch = aarch64_get_arch (ptr->x_explicit_arch);
+ = aarch64_get_tune_cpu (ptr->x_selected_tune);
+ const struct processor *arch = aarch64_get_arch (ptr->x_selected_arch);
std::string extension
- = aarch64_get_extension_string_for_isa_flags (isa_flags, arch->flags);
+ = aarch64_get_extension_string_for_isa_flags (ptr->x_aarch64_isa_flags,
+ arch->flags);
fprintf (file, "%*sselected tune = %s\n", indent, "", cpu->name);
fprintf (file, "%*sselected arch = %s%s\n", indent, "",
@@ -18804,8 +18755,7 @@ aarch64_handle_attr_arch (const char *str)
if (parse_res == AARCH64_PARSE_OK)
{
gcc_assert (tmp_arch);
- selected_arch = tmp_arch;
- explicit_arch = selected_arch->arch;
+ selected_arch = tmp_arch->arch;
return true;
}
@@ -18843,11 +18793,8 @@ aarch64_handle_attr_cpu (const char *str)
if (parse_res == AARCH64_PARSE_OK)
{
gcc_assert (tmp_cpu);
- selected_tune = tmp_cpu;
- explicit_tune_core = selected_tune->ident;
-
- selected_arch = &all_architectures[tmp_cpu->arch];
- explicit_arch = selected_arch->arch;
+ selected_tune = tmp_cpu->ident;
+ selected_arch = tmp_cpu->arch;
return true;
}
@@ -18915,8 +18862,7 @@ aarch64_handle_attr_tune (const char *str)
if (parse_res == AARCH64_PARSE_OK)
{
gcc_assert (tmp_tune);
- selected_tune = tmp_tune;
- explicit_tune_core = selected_tune->ident;
+ selected_tune = tmp_tune->ident;
return true;
}
@@ -22821,7 +22767,7 @@ aarch64_declare_function_name (FILE *stream, const char* name,
gcc_assert (targ_options);
const struct processor *this_arch
- = aarch64_get_arch (targ_options->x_explicit_arch);
+ = aarch64_get_arch (targ_options->x_selected_arch);
uint64_t isa_flags = targ_options->x_aarch64_isa_flags;
std::string extension
@@ -22840,7 +22786,7 @@ aarch64_declare_function_name (FILE *stream, const char* name,
useful to readers of the generated asm. Do it only when it changes
from function to function and verbose assembly is requested. */
const struct processor *this_tune
- = aarch64_get_tune_cpu (targ_options->x_explicit_tune_core);
+ = aarch64_get_tune_cpu (targ_options->x_selected_tune);
if (flag_debug_asm && aarch64_last_printed_tune_string != this_tune->name)
{
@@ -22952,7 +22898,7 @@ aarch64_start_file (void)
= TREE_TARGET_OPTION (target_option_default_node);
const struct processor *default_arch
- = aarch64_get_arch (default_options->x_explicit_arch);
+ = aarch64_get_arch (default_options->x_selected_arch);
uint64_t default_isa_flags = default_options->x_aarch64_isa_flags;
std::string extension
= aarch64_get_extension_string_for_isa_flags (default_isa_flags,
@@ -27950,9 +27896,6 @@ aarch64_libgcc_floating_mode_supported_p
#undef TARGET_OFFLOAD_OPTIONS
#define TARGET_OFFLOAD_OPTIONS aarch64_offload_options
-#undef TARGET_OPTION_SAVE
-#define TARGET_OPTION_SAVE aarch64_option_save
-
#undef TARGET_OPTION_RESTORE
#define TARGET_OPTION_RESTORE aarch64_option_restore
diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
index 14e2af054..7d73689e4 100644
--- a/gcc/config/aarch64/aarch64.h
+++ b/gcc/config/aarch64/aarch64.h
@@ -144,9 +144,6 @@
#define PCC_BITFIELD_TYPE_MATTERS 1
-/* Major revision number of the ARM Architecture implemented by the target. */
-extern unsigned aarch64_architecture_version;
-
/* Instruction tuning/selection flags. */
/* Bit values used to identify processor capabilities. */
diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
index 101664c7c..836a3c784 100644
--- a/gcc/config/aarch64/aarch64.opt
+++ b/gcc/config/aarch64/aarch64.opt
@@ -22,13 +22,10 @@ HeaderInclude
config/aarch64/aarch64-opts.h
TargetVariable
-enum aarch64_processor explicit_tune_core = aarch64_none
+enum aarch64_processor selected_tune = aarch64_none
TargetVariable
-enum aarch64_arch explicit_arch = aarch64_no_arch
-
-TargetSave
-const char *x_aarch64_override_tune_string
+enum aarch64_arch selected_arch = aarch64_no_arch
TargetVariable
uint64_t aarch64_isa_flags = 0
@@ -36,6 +33,9 @@ uint64_t aarch64_isa_flags = 0
TargetVariable
unsigned aarch64_enable_bti = 2
+TargetVariable
+enum aarch64_key_type aarch64_ra_sign_key = AARCH64_KEY_A
+
; The TLS dialect names to use with -mtls-dialect.
Enum
@@ -139,7 +139,7 @@ Target RejectNegative Joined Enum(aarch64_abi) Var(aarch64_abi) Init(AARCH64_ABI
Generate code that conforms to the specified ABI.
moverride=
-Target RejectNegative ToLower Joined Var(aarch64_override_tune_string)
+Target RejectNegative ToLower Joined Var(aarch64_override_tune_string) Save
-moverride=<string> Power users only! Override CPU optimization parameters.
Enum
--
2.33.0
|