summaryrefslogtreecommitdiff
path: root/gcc/common
diff options
context:
space:
mode:
authorktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4>2015-04-21 08:14:22 +0000
committerktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4>2015-04-21 08:14:22 +0000
commite06408d0f4e4606598b7f52d9e7b1f39c806e2d0 (patch)
treeb9fa16ccb51179b7c8beffc6016f3fd2dd8e311b /gcc/common
parent9c8e84c114e2130aafed9f2cc6caf8be16aae852 (diff)
downloadgcc-e06408d0f4e4606598b7f52d9e7b1f39c806e2d0.tar.gz
[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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222258 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/common')
-rw-r--r--gcc/common/config/aarch64/aarch64-common.c30
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 308f19c6409..b3fd9dc5460 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;
}