This may be optimized by some modern smart compilers inliner, but since strlen can be an external source, this can produce unoptimized code. Signed-off-by: Luís Ferreira --- 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; }