diff options
author | Kyrylo Tkachov <kyrylo.tkachov@arm.com> | 2015-04-21 08:14:22 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2015-04-21 08:14:22 +0000 |
commit | efb25f54436e07d430f55fd3a17eae4578fb18fc (patch) | |
tree | b9fa16ccb51179b7c8beffc6016f3fd2dd8e311b /gcc/common/config/aarch64 | |
parent | d60dbb52fc8cd3a709b24e611a73ebdc13ff4e58 (diff) | |
download | gcc-efb25f54436e07d430f55fd3a17eae4578fb18fc.zip gcc-efb25f54436e07d430f55fd3a17eae4578fb18fc.tar.gz gcc-efb25f54436e07d430f55fd3a17eae4578fb18fc.tar.bz2 |
[AArch64] Increase static buffer size in aarch64_rewrite_selected_cpu
* common/config/aarch64/aarch64-common.c (AARCH64_CPU_NAME_LENGTH):
Increase to 128.
(aarch64_rewrite_selected_cpu): Do not chop off extensions starting
at '.'. Assert that there's enough space for everything.
From-SVN: r222258
Diffstat (limited to 'gcc/common/config/aarch64')
-rw-r--r-- | gcc/common/config/aarch64/aarch64-common.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/gcc/common/config/aarch64/aarch64-common.c b/gcc/common/config/aarch64/aarch64-common.c index 308f19c..b3fd9dc 100644 --- a/gcc/common/config/aarch64/aarch64-common.c +++ b/gcc/common/config/aarch64/aarch64-common.c @@ -27,6 +27,7 @@ #include "common/common-target-def.h" #include "opts.h" #include "flags.h" +#include "errors.h" #ifdef TARGET_BIG_ENDIAN_DEFAULT #undef TARGET_DEFAULT_TARGET_FLAGS @@ -89,23 +90,34 @@ aarch64_handle_option (struct gcc_options *opts, struct gcc_targetm_common targetm_common = TARGETM_COMMON_INITIALIZER; -#define AARCH64_CPU_NAME_LENGTH 20 +#define AARCH64_CPU_NAME_LENGTH 128 -/* Truncate NAME at the first '.' character seen, or return - NAME unmodified. */ +/* Truncate NAME at the first '.' character seen up to the first '+' + or return NAME unmodified. */ const char * aarch64_rewrite_selected_cpu (const char *name) { static char output_buf[AARCH64_CPU_NAME_LENGTH + 1] = {0}; - char *arg_pos; + const char *bL_sep; + const char *feats; + size_t pref_size; + size_t feat_size; - strncpy (output_buf, name, AARCH64_CPU_NAME_LENGTH); - arg_pos = strchr (output_buf, '.'); + bL_sep = strchr (name, '.'); + if (!bL_sep) + return name; - /* If we found a '.' truncate the entry at that point. */ - if (arg_pos) - *arg_pos = '\0'; + feats = strchr (name, '+'); + feat_size = feats ? strnlen (feats, AARCH64_CPU_NAME_LENGTH) : 0; + pref_size = bL_sep - name; + + if ((feat_size + pref_size) > AARCH64_CPU_NAME_LENGTH) + internal_error ("-mcpu string too large"); + + strncpy (output_buf, name, pref_size); + if (feats) + strncpy (output_buf + pref_size, feats, feat_size); return output_buf; } |