]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
genmodes: don't truncate a mode name of length >= 7
authorJim Meyering <meyering@redhat.com>
Fri, 20 Apr 2012 15:38:35 +0000 (15:38 +0000)
committerJim Meyering <meyering@gcc.gnu.org>
Fri, 20 Apr 2012 15:38:35 +0000 (15:38 +0000)
* genmodes.c (make_complex_modes): Don't truncate a mode name of
length 7 or more when prepending a "C".  Suggested by Richard Guenther.

From-SVN: r186628

gcc/ChangeLog
gcc/genmodes.c

index 0a3eda63c1acef8f721f45af2f9a58ceaaee19cd..0d5457d6501f1cb506255b59e1bd6c32c3d0b036 100644 (file)
@@ -1,3 +1,8 @@
+2012-04-20  Jim Meyering  <meyering@redhat.com>
+
+       * genmodes.c (make_complex_modes): Don't truncate a mode name of
+       length 7 or more when prepending a "C".  Suggested by Richard Guenther.
+
 2012-04-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        PR rtl-optimization/44214
index 6bbeb6faef15aab9331fe168c2d4a7a805f5c09b..84517b9f3dcfc78fd0cb2304bb4a2954d734a35d 100644 (file)
@@ -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;
     }
 }