This may be optimized by some modern smart compilers inliner, but since strlen
can be an external source, this can produce slightly more unoptimized code.

ChangeLog:
libiberty/
        * d-demangle.c (string_appendc): Add function to append single chars.
        * d-demangle.c: Rewrite usage of string_append and string_appendn for
                        single chars to use string_appendc function.

Signed-off-by: Luís Ferreira <cont...@lsferreira.net>
---
 libiberty/d-demangle.c | 60 ++++++++++++++++++++++++------------------
 1 file changed, 34 insertions(+), 26 deletions(-)

diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c
index 3adf7b562d1..9b12c8158bb 100644
--- a/libiberty/d-demangle.c
+++ b/libiberty/d-demangle.c
@@ -144,6 +144,14 @@ string_appendn (string *p, const char *s, size_t n)
     }
 }
 
+static void
+string_appendc (string *p, char c)
+{
+  string_need (p, 1);
+  *p->p = c;
+  p->p++;
+}
+
 static void
 string_prependn (string *p, const char *s, size_t n)
 {
@@ -664,7 +672,7 @@ dlang_function_type (string *decl, const char *mangled, 
struct dlang_info *info)
   /* Append to decl in order. */
   string_appendn (decl, type.b, string_length (&type));
   string_appendn (decl, args.b, string_length (&args));
-  string_append (decl, " ");
+  string_appendc (decl, ' ');
   string_appendn (decl, attr.b, string_length (&attr));
 
   string_delete (&attr);
@@ -816,9 +824,9 @@ dlang_type (string *decl, const char *mangled, struct 
dlang_info *info)
          mangled++;
        }
       mangled = dlang_type (decl, mangled, info);
-      string_append (decl, "[");
+      string_appendc (decl, '[');
       string_appendn (decl, numptr, num);
-      string_append (decl, "]");
+      string_appendc (decl, ']');
       return mangled;
     }
     case 'H': /* associative array (T[T]) */
@@ -832,9 +840,9 @@ dlang_type (string *decl, const char *mangled, struct 
dlang_info *info)
       sztype = string_length (&type);
 
       mangled = dlang_type (decl, mangled, info);
-      string_append (decl, "[");
+      string_appendc (decl, '[');
       string_appendn (decl, type.b, sztype);
-      string_append (decl, "]");
+      string_appendc (decl, ']');
 
       string_delete (&type);
       return mangled;
@@ -844,7 +852,7 @@ dlang_type (string *decl, const char *mangled, struct 
dlang_info *info)
       if (!dlang_call_convention_p (mangled))
        {
          mangled = dlang_type (decl, mangled, info);
-         string_append (decl, "*");
+         string_appendc (decl, '*');
          return mangled;
        }
       /* Fall through */
@@ -1181,7 +1189,7 @@ dlang_parse_integer (string *decl, const char *mangled, 
char type)
        {
          /* Represent as a character literal.  */
          char c = (char) val;
-         string_appendn (decl, &c, 1);
+         string_appendc (decl, c);
        }
       else
        {
@@ -1297,7 +1305,7 @@ dlang_parse_real (string *decl, const char *mangled)
   /* Hexadecimal prefix and leading bit.  */
   if (*mangled == 'N')
     {
-      string_append (decl, "-");
+      string_appendc (decl, '-');
       mangled++;
     }
 
@@ -1305,14 +1313,14 @@ dlang_parse_real (string *decl, const char *mangled)
     return NULL;
 
   string_append (decl, "0x");
-  string_appendn (decl, mangled, 1);
-  string_append (decl, ".");
+  string_appendc (decl, *mangled);
+  string_appendc (decl, '.');
   mangled++;
 
   /* Significand.  */
   while (ISXDIGIT (*mangled))
     {
-      string_appendn (decl, mangled, 1);
+      string_appendc (decl, *mangled);
       mangled++;
     }
 
@@ -1325,7 +1333,7 @@ dlang_parse_real (string *decl, const char *mangled)
 
   if (*mangled == 'N')
     {
-      string_append (decl, "-");
+      string_appendc (decl, '-');
       mangled++;
     }
 
@@ -1352,7 +1360,7 @@ dlang_parse_string (string *decl, const char *mangled)
     return NULL;
 
   mangled++;
-  string_append (decl, "\"");
+  string_appendc (decl, '\"');
   while (len--)
     {
       char val;
@@ -1365,7 +1373,7 @@ dlang_parse_string (string *decl, const char *mangled)
       switch (val)
        {
        case ' ':
-         string_append (decl, " ");
+         string_appendc (decl, ' ');
          break;
        case '\t':
          string_append (decl, "\\t");
@@ -1415,7 +1423,7 @@ dlang_parse_arrayliteral (string *decl, const char 
*mangled,
   if (mangled == NULL)
     return NULL;
 
-  string_append (decl, "[");
+  string_appendc (decl, '[');
   while (elements--)
     {
       mangled = dlang_value (decl, mangled, NULL, '\0', info);
@@ -1426,7 +1434,7 @@ dlang_parse_arrayliteral (string *decl, const char 
*mangled,
        string_append (decl, ", ");
     }
 
-  string_append (decl, "]");
+  string_appendc (decl, ']');
   return mangled;
 }
 
@@ -1442,14 +1450,14 @@ dlang_parse_assocarray (string *decl, const char 
*mangled,
   if (mangled == NULL)
     return NULL;
 
-  string_append (decl, "[");
+  string_appendc (decl, '[');
   while (elements--)
     {
       mangled = dlang_value (decl, mangled, NULL, '\0', info);
       if (mangled == NULL)
        return NULL;
 
-      string_append (decl, ":");
+      string_appendc (decl, ':');
       mangled = dlang_value (decl, mangled, NULL, '\0', info);
       if (mangled == NULL)
        return NULL;
@@ -1458,7 +1466,7 @@ dlang_parse_assocarray (string *decl, const char *mangled,
        string_append (decl, ", ");
     }
 
-  string_append (decl, "]");
+  string_appendc (decl, ']');
   return mangled;
 }
 
@@ -1477,7 +1485,7 @@ dlang_parse_structlit (string *decl, const char *mangled, 
const char *name,
   if (name != NULL)
     string_append (decl, name);
 
-  string_append (decl, "(");
+  string_appendc (decl, '(');
   while (args--)
     {
       mangled = dlang_value (decl, mangled, NULL, '\0', info);
@@ -1488,7 +1496,7 @@ dlang_parse_structlit (string *decl, const char *mangled, 
const char *name,
        string_append (decl, ", ");
     }
 
-  string_append (decl, ")");
+  string_appendc (decl, ')');
   return mangled;
 }
 
@@ -1512,7 +1520,7 @@ dlang_value (string *decl, const char *mangled, const 
char *name, char type,
       /* Integral values.  */
     case 'N':
       mangled++;
-      string_append (decl, "-");
+      string_appendc (decl, '-');
       mangled = dlang_parse_integer (decl, mangled, type);
       break;
 
@@ -1538,12 +1546,12 @@ dlang_value (string *decl, const char *mangled, const 
char *name, char type,
     case 'c':
       mangled++;
       mangled = dlang_parse_real (decl, mangled);
-      string_append (decl, "+");
+      string_appendc (decl, '+');
       if (mangled == NULL || *mangled != 'c')
        return NULL;
       mangled++;
       mangled = dlang_parse_real (decl, mangled);
-      string_append (decl, "i");
+      string_appendc (decl, 'i');
       break;
 
       /* String values.  */
@@ -1651,7 +1659,7 @@ dlang_parse_qualified (string *decl, const char *mangled,
   do
     {
       if (n++)
-       string_append (decl, ".");
+       string_appendc (decl, '.');
 
       /* Skip over anonymous symbols.  */
       while (*mangled == '0')
@@ -1723,7 +1731,7 @@ dlang_parse_tuple (string *decl, const char *mangled, 
struct dlang_info *info)
        string_append (decl, ", ");
     }
 
-  string_append (decl, ")");
+  string_appendc (decl, ')');
   return mangled;
 }
 
-- 
2.33.0

Reply via email to