summaryrefslogtreecommitdiff
path: root/gcc/genmodes.c
diff options
context:
space:
mode:
authormeyering <meyering@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-20 15:38:35 +0000
committermeyering <meyering@138bc75d-0d04-0410-961f-82ee72b054a4>2012-04-20 15:38:35 +0000
commitcdf7d2997d5d524e49f16d1d81a3f6717ecf6b4c (patch)
tree636b970315112fb6f1950a72514b9db2f0724360 /gcc/genmodes.c
parent484a0b1bfd56e9fc5e269b185720b99624ab8060 (diff)
downloadgcc-cdf7d2997d5d524e49f16d1d81a3f6717ecf6b4c.tar.gz
genmodes: don't truncate a mode name of length >= 7
* genmodes.c (make_complex_modes): Don't truncate a mode name of length 7 or more when prepending a "C". Suggested by Richard Guenther. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@186628 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/genmodes.c')
-rw-r--r--gcc/genmodes.c32
1 files changed, 13 insertions, 19 deletions
diff --git a/gcc/genmodes.c b/gcc/genmodes.c
index 6bbeb6faef1..84517b9f3dc 100644
--- a/gcc/genmodes.c
+++ b/gcc/genmodes.c
@@ -427,7 +427,6 @@ make_complex_modes (enum mode_class cl,
{
struct mode_data *m;
struct mode_data *c;
- char buf[8];
enum mode_class cclass = complex_class (cl);
if (cclass == MODE_RANDOM)
@@ -435,6 +434,7 @@ make_complex_modes (enum mode_class cl,
for (m = modes[cl]; m; m = m->next)
{
+ char *p, *buf;
size_t m_len;
/* Skip BImode. FIXME: BImode probably shouldn't be MODE_INT. */
@@ -442,40 +442,34 @@ make_complex_modes (enum mode_class cl,
continue;
m_len = strlen (m->name);
- if (m_len >= sizeof buf)
- {
- error ("%s:%d:mode name \"%s\" is too long",
- m->file, m->line, m->name);
- continue;
- }
+ /* The leading "1 +" is in case we prepend a "C" below. */
+ buf = (char *) xmalloc (1 + m_len + 1);
/* Float complex modes are named SCmode, etc.
Int complex modes are named CSImode, etc.
This inconsistency should be eliminated. */
+ p = 0;
if (cl == MODE_FLOAT)
{
- char *p, *q = 0;
- /* We verified above that m->name+NUL fits in buf. */
memcpy (buf, m->name, m_len + 1);
p = strchr (buf, 'F');
- if (p == 0)
- q = strchr (buf, 'D');
- if (p == 0 && q == 0)
+ if (p == 0 && strchr (buf, 'D') == 0)
{
error ("%s:%d: float mode \"%s\" has no 'F' or 'D'",
m->file, m->line, m->name);
+ free (buf);
continue;
}
-
- if (p != 0)
- *p = 'C';
- else
- snprintf (buf, sizeof buf, "C%s", m->name);
}
+ if (p != 0)
+ *p = 'C';
else
- snprintf (buf, sizeof buf, "C%s", m->name);
+ {
+ buf[0] = 'C';
+ memcpy (buf + 1, m->name, m_len + 1);
+ }
- c = new_mode (cclass, xstrdup (buf), file, line);
+ c = new_mode (cclass, buf, file, line);
c->component = m;
}
}