Commit a4017ff7 by Kyrylo Tkachov Committed by Kyrylo Tkachov

[arm] PR target/83193: Do not print arch/cpu hints twice on invalid -march/-mcpu

Currently when handling an invalid -march or -mcpu option on a toolchain without an explicit --with-mode configuration
and compiling without an explicit -mthumb or -marm the arm specs end up calling arm_target_thumb_only to determine
the "thumbness" of the target, which involves parsing the architecture or cpu name. But the functions doing that
parsing also emit error messages and hints on invalid arguments. Later when we parse the architecture or cpu string to
as part of the canonicalisation process (arm_canon_arch_option) we end up emitting the errors again.

The solution in this patch is to silence the errors during the arm_target_thumb_only processing so that they are not emitted
twice. arm_canon_arch_option is guaranteed to run as well, so it can emit the errors and hints that it needs.

Bootstrapped and tested on arm-none-linux-gnueabihf.

Checked that we emit the arch/cpu hints for invalid -march/-mcpu options only once when no "thumbness" options were specified
during configuration or invocation.

	PR target/83193
	* common/config/arm/arm-common.c (arm_parse_arch_option_name):
	Accept complain bool parameter.  Only emit errors if it is true.
	(arm_parse_cpu_option_name): Likewise.
	(arm_target_thumb_only): Adjust callers of the above.
	* config/arm/arm-protos.h (arm_parse_cpu_option_name): Adjust
	prototype to take a default true bool parameter.
	(arm_parse_arch_option_name): Likewise.

From-SVN: r258389
parent deb3da39
2018-03-09 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/83193
* common/config/arm/arm-common.c (arm_parse_arch_option_name):
Accept complain bool parameter. Only emit errors if it is true.
(arm_parse_cpu_option_name): Likewise.
(arm_target_thumb_only): Adjust callers of the above.
* config/arm/arm-protos.h (arm_parse_cpu_option_name): Adjust
prototype to take a default true bool parameter.
(arm_parse_arch_option_name): Likewise.
2018-03-09 David Malcolm <dmalcolm@redhat.com> 2018-03-09 David Malcolm <dmalcolm@redhat.com>
Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
......
...@@ -279,7 +279,8 @@ arm_target_thumb_only (int argc, const char **argv) ...@@ -279,7 +279,8 @@ arm_target_thumb_only (int argc, const char **argv)
if (arch) if (arch)
{ {
const arch_option *arch_opt const arch_option *arch_opt
= arm_parse_arch_option_name (all_architectures, "-march", arch); = arm_parse_arch_option_name (all_architectures, "-march", arch,
false);
if (arch_opt && !check_isa_bits_for (arch_opt->common.isa_bits, if (arch_opt && !check_isa_bits_for (arch_opt->common.isa_bits,
isa_bit_notm)) isa_bit_notm))
...@@ -288,7 +289,7 @@ arm_target_thumb_only (int argc, const char **argv) ...@@ -288,7 +289,7 @@ arm_target_thumb_only (int argc, const char **argv)
else if (cpu) else if (cpu)
{ {
const cpu_option *cpu_opt const cpu_option *cpu_opt
= arm_parse_cpu_option_name (all_cores, "-mcpu", cpu); = arm_parse_cpu_option_name (all_cores, "-mcpu", cpu, false);
if (cpu_opt && !check_isa_bits_for (cpu_opt->common.isa_bits, if (cpu_opt && !check_isa_bits_for (cpu_opt->common.isa_bits,
isa_bit_notm)) isa_bit_notm))
...@@ -329,10 +330,11 @@ arm_print_hint_for_cpu_option (const char *target, ...@@ -329,10 +330,11 @@ arm_print_hint_for_cpu_option (const char *target,
/* Parse the base component of a CPU selection in LIST. Return a /* Parse the base component of a CPU selection in LIST. Return a
pointer to the entry in the architecture table. OPTNAME is the pointer to the entry in the architecture table. OPTNAME is the
name of the option we are parsing and can be used if a diagnostic name of the option we are parsing and can be used if a diagnostic
is needed. */ is needed. If COMPLAIN is true (the default) emit error
messages and hints on invalid input. */
const cpu_option * const cpu_option *
arm_parse_cpu_option_name (const cpu_option *list, const char *optname, arm_parse_cpu_option_name (const cpu_option *list, const char *optname,
const char *target) const char *target, bool complain)
{ {
const cpu_option *entry; const cpu_option *entry;
const char *end = strchr (target, '+'); const char *end = strchr (target, '+');
...@@ -345,8 +347,11 @@ arm_parse_cpu_option_name (const cpu_option *list, const char *optname, ...@@ -345,8 +347,11 @@ arm_parse_cpu_option_name (const cpu_option *list, const char *optname,
return entry; return entry;
} }
error_at (input_location, "unrecognized %s target: %s", optname, target); if (complain)
arm_print_hint_for_cpu_option (target, list); {
error_at (input_location, "unrecognized %s target: %s", optname, target);
arm_print_hint_for_cpu_option (target, list);
}
return NULL; return NULL;
} }
...@@ -379,10 +384,11 @@ arm_print_hint_for_arch_option (const char *target, ...@@ -379,10 +384,11 @@ arm_print_hint_for_arch_option (const char *target,
/* Parse the base component of a CPU or architecture selection in /* Parse the base component of a CPU or architecture selection in
LIST. Return a pointer to the entry in the architecture table. LIST. Return a pointer to the entry in the architecture table.
OPTNAME is the name of the option we are parsing and can be used if OPTNAME is the name of the option we are parsing and can be used if
a diagnostic is needed. */ a diagnostic is needed. If COMPLAIN is true (the default) emit error
messages and hints on invalid input. */
const arch_option * const arch_option *
arm_parse_arch_option_name (const arch_option *list, const char *optname, arm_parse_arch_option_name (const arch_option *list, const char *optname,
const char *target) const char *target, bool complain)
{ {
const arch_option *entry; const arch_option *entry;
const char *end = strchr (target, '+'); const char *end = strchr (target, '+');
...@@ -395,8 +401,11 @@ arm_parse_arch_option_name (const arch_option *list, const char *optname, ...@@ -395,8 +401,11 @@ arm_parse_arch_option_name (const arch_option *list, const char *optname,
return entry; return entry;
} }
error_at (input_location, "unrecognized %s target: %s", optname, target); if (complain)
arm_print_hint_for_arch_option (target, list); {
error_at (input_location, "unrecognized %s target: %s", optname, target);
arm_print_hint_for_arch_option (target, list);
}
return NULL; return NULL;
} }
......
...@@ -545,9 +545,9 @@ extern const arch_option all_architectures[]; ...@@ -545,9 +545,9 @@ extern const arch_option all_architectures[];
extern const cpu_option all_cores[]; extern const cpu_option all_cores[];
const cpu_option *arm_parse_cpu_option_name (const cpu_option *, const char *, const cpu_option *arm_parse_cpu_option_name (const cpu_option *, const char *,
const char *); const char *, bool = true);
const arch_option *arm_parse_arch_option_name (const arch_option *, const arch_option *arm_parse_arch_option_name (const arch_option *,
const char *, const char *); const char *, const char *, bool = true);
void arm_parse_option_features (sbitmap, const cpu_arch_option *, void arm_parse_option_features (sbitmap, const cpu_arch_option *,
const char *); const char *);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment