aboutsummaryrefslogtreecommitdiff
path: root/gcc/common
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2018-10-31 15:46:17 +0100
committerMartin Liska <marxin@gcc.gnu.org>2018-10-31 14:46:17 +0000
commitc788734738f1afd93b5b78c0e22e013e9c9720eb (patch)
treef8dde731c2ee6e256337d534c545f2fa7823bb00 /gcc/common
parentff65e98035f39bbd577fd50ccafa7743d4ac42a5 (diff)
downloadgcc-c788734738f1afd93b5b78c0e22e013e9c9720eb.zip
gcc-c788734738f1afd93b5b78c0e22e013e9c9720eb.tar.gz
gcc-c788734738f1afd93b5b78c0e22e013e9c9720eb.tar.bz2
Provide extension hint for aarch64 target (PR driver/83193).
2018-10-31 Martin Liska <mliska@suse.cz> PR driver/83193 * common/config/aarch64/aarch64-common.c (aarch64_parse_extension): Add new argument invalid_extension. (aarch64_get_all_extension_candidates): New function. (aarch64_rewrite_selected_cpu): Add NULL to function call. * config/aarch64/aarch64-protos.h (aarch64_parse_extension): Add new argument. (aarch64_get_all_extension_candidates): New function. * config/aarch64/aarch64.c (aarch64_parse_arch): Add new argument invalid_extension. (aarch64_parse_cpu): Likewise. (aarch64_print_hint_for_extensions): New function. (aarch64_validate_mcpu): Provide hint about invalid extension. (aarch64_validate_march): Likewise. (aarch64_handle_attr_arch): Pass new argument. (aarch64_handle_attr_cpu): Provide hint about invalid extension. (aarch64_handle_attr_isa_flags): Likewise. 2018-10-31 Martin Liska <mliska@suse.cz> PR driver/83193 * gcc.target/aarch64/spellcheck_7.c: New test. * gcc.target/aarch64/spellcheck_8.c: New test. * gcc.target/aarch64/spellcheck_9.c: New test. From-SVN: r265686
Diffstat (limited to 'gcc/common')
-rw-r--r--gcc/common/config/aarch64/aarch64-common.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/gcc/common/config/aarch64/aarch64-common.c b/gcc/common/config/aarch64/aarch64-common.c
index ffddc4d..dd7d426 100644
--- a/gcc/common/config/aarch64/aarch64-common.c
+++ b/gcc/common/config/aarch64/aarch64-common.c
@@ -220,10 +220,13 @@ static const struct arch_to_arch_name all_architectures[] =
/* Parse the architecture extension string STR and update ISA_FLAGS
with the architecture features turned on or off. Return a
- aarch64_parse_opt_result describing the result. */
+ aarch64_parse_opt_result describing the result.
+ When the STR string contains an invalid extension,
+ a copy of the string is created and stored to INVALID_EXTENSION. */
enum aarch64_parse_opt_result
-aarch64_parse_extension (const char *str, unsigned long *isa_flags)
+aarch64_parse_extension (const char *str, unsigned long *isa_flags,
+ std::string *invalid_extension)
{
/* The extension string is parsed left to right. */
const struct aarch64_option_extension *opt = NULL;
@@ -274,6 +277,8 @@ aarch64_parse_extension (const char *str, unsigned long *isa_flags)
if (opt->name == NULL)
{
/* Extension not found in list. */
+ if (invalid_extension)
+ *invalid_extension = std::string (str, len);
return AARCH64_PARSE_INVALID_FEATURE;
}
@@ -283,6 +288,16 @@ aarch64_parse_extension (const char *str, unsigned long *isa_flags)
return AARCH64_PARSE_OK;
}
+/* Append all architecture extension candidates to the CANDIDATES vector. */
+
+void
+aarch64_get_all_extension_candidates (auto_vec<const char *> *candidates)
+{
+ const struct aarch64_option_extension *opt;
+ for (opt = all_extensions; opt->name != NULL; opt++)
+ candidates->safe_push (opt->name);
+}
+
/* Return a string representation of ISA_FLAGS. DEFAULT_ARCH_FLAGS
gives the default set of flags which are implied by whatever -march
we'd put out. Our job is to figure out the minimal set of "+" and
@@ -370,7 +385,7 @@ aarch64_rewrite_selected_cpu (const char *name)
fatal_error (input_location, "unknown value %qs for -mcpu", name);
unsigned long extensions = p_to_a->flags;
- aarch64_parse_extension (extension_str.c_str (), &extensions);
+ aarch64_parse_extension (extension_str.c_str (), &extensions, NULL);
std::string outstr = a_to_an->arch_name
+ aarch64_get_extension_string_for_isa_flags (extensions,